From 608dbc2cec5e9cc7e9e9b96c139d838837c7df3b Mon Sep 17 00:00:00 2001 From: Christian Groessler Date: Tue, 22 Apr 2014 15:48:49 +0200 Subject: [PATCH] Workaround for "phantom" key presses in the C128 "joystick" mouse driver. --- libsrc/c128/mou/c128-joy.s | 79 ++++++++++++++++++++++++++++++++++++++ libsrc/c128/mouseref.s | 69 +++++++++++++++++++++++++++++++++ 2 files changed, 148 insertions(+) diff --git a/libsrc/c128/mou/c128-joy.s b/libsrc/c128/mou/c128-joy.s index be0cf227b..fb087c8fc 100644 --- a/libsrc/c128/mou/c128-joy.s +++ b/libsrc/c128/mou/c128-joy.s @@ -11,6 +11,8 @@ .macpack generic +IRQInd = $2FD + ; ------------------------------------------------------------------------ ; Header. Includes jump table @@ -25,6 +27,7 @@ HEADER: ; Library reference +libref: .addr $0000 ; Jump table @@ -70,6 +73,15 @@ SCREEN_WIDTH = 320 FIRE = $10 .endenum +;---------------------------------------------------------------------------- +; data segment + +.data + +chainIRQ: + .byte $4c ; JMP opcode + .word 0 ; pointer to ROM IRQ handler (will be set at runtime) + ;---------------------------------------------------------------------------- ; Global variables. The bounding box values are sorted so that they can be ; written with the least effort in the SETBOX and GETBOX routines, so don't @@ -92,6 +104,10 @@ INIT_save: .res 1 Temp: .res 1 +; Keyboard buffer fill level at start of interrupt + +old_key_count: .res 1 + .rodata ; Default values for above variables @@ -146,6 +162,35 @@ INSTALL: jsr CMOVEY cli +; Initialize our IRQ magic + + lda IRQInd+1 + sta chainIRQ+1 + lda IRQInd+2 + sta chainIRQ+2 + lda libref + sta ptr3 + lda libref+1 + sta ptr3+1 + ldy #2 + lda (ptr3),y + sta IRQInd+1 + iny + lda (ptr3),y + sta IRQInd+2 + iny + lda #<(callback-1) + sta (ptr3),y + iny + lda #>(callback-1) + sta (ptr3),y + iny + lda #<(chainIRQ-1) + sta (ptr3),y + iny + lda #>(chainIRQ-1) + sta (ptr3),y + ; Done, return zero (= MOUSE_ERR_OK) ldx #$00 @@ -157,6 +202,12 @@ INSTALL: ; No return code required (the driver is removed from memory on return). UNINSTALL: + + lda chainIRQ+1 + sta IRQInd+1 + lda chainIRQ+2 + sta IRQInd+2 + jsr HIDE ; Hide cursor on exit lda INIT_save sta INIT_STATUS @@ -320,6 +371,8 @@ IOCTL: lda #@IRQCont + pha + lda #<@IRQCont + pha + php + + ; mimic the contents saved on the stack by the ROM IRQ entry handler + pha ; A + pha ; X + pha ; Y + lda #MMU_CFG_CC65 ; MMU configuration which will be active after the ROM handler returns + pha + + ; push address of ROM handler on stack and jump to it + lda jmp_rom_hdlr+1 + pha + lda jmp_rom_hdlr + pha + rts ; jump to ROM handler + + ; our MMU configuration byte we pushed on the stack before (MMU_CFG_CC65) is now active + +@IRQCont: + + ; call mouse driver callback routine + lda #>(@IRQCont2-1) + pha + lda #<(@IRQCont2-1) + pha + lda callback+1 + pha + lda callback + pha + rts ; jump to callback routine + +@IRQCont2: + + ; return from interrupt + ; We could just jump to $FF33, but since I don't know whether this address is valid in all + ; ROM versions, duplicate that code here. + + pla + sta MMU_CR ; MMU configuration register + pla + tay + pla + tax + pla + rti