]> git.sur5r.net Git - cc65/commitdiff
Correctly map out ROM when needed in the "phantom keys" workaround. 109/head
authorChristian Groessler <chris@groessler.org>
Sat, 26 Apr 2014 09:55:24 +0000 (11:55 +0200)
committerChristian Groessler <chris@groessler.org>
Sat, 26 Apr 2014 09:58:13 +0000 (11:58 +0200)
libsrc/c128/mou/c128-1351.s
libsrc/c128/mou/c128-joy.s
libsrc/c128/mouseref.s

index c81ad04d0d0f169926ef7e30e2adb1fdb408f32f..e55c1d01b8d77254d4c794aa27f727e88a20cec4 100644 (file)
@@ -66,15 +66,6 @@ CMOVEY: jmp     $0000                   ; Move the cursor to Y coord
 SCREEN_HEIGHT   = 200
 SCREEN_WIDTH    = 320
 
-;----------------------------------------------------------------------------
-; 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
@@ -103,6 +94,10 @@ Buttons:        .res    1               ; Button mask
 
 old_key_count:  .res    1
 
+; original IRQ vector
+
+old_irq:        .res    2
+
 .rodata
 
 ; Default values for above variables
@@ -158,20 +153,27 @@ INSTALL:
 
 ; Initialize our IRQ magic
 
-        lda     IRQInd+1
-        sta     chainIRQ+1
+        ; remember ROM IRQ continuation address
         lda     IRQInd+2
-        sta     chainIRQ+2
+        sta     old_irq+1
+        lda     IRQInd+1
+        sta     old_irq
+
         lda     libref
         sta     ptr3
         lda     libref+1
         sta     ptr3+1
+
+        ; set ROM IRQ continuation address to point to the provided routine
         ldy     #2
         lda     (ptr3),y
         sta     IRQInd+1
         iny
         lda     (ptr3),y
         sta     IRQInd+2
+
+        ; set address of our IRQ callback routine
+        ; since it's called via "rts" we have to use "address-1"
         iny
         lda     #<(callback-1)
         sta     (ptr3),y
@@ -179,10 +181,16 @@ INSTALL:
         lda     #>(callback-1)
         sta     (ptr3),y
         iny
-        lda     #<(chainIRQ-1)
+
+        ; set ROM entry point vector
+        ; since it's called via "rts" we have to decrement it by one
+        lda     old_irq
+        sec
+        sbc     #1
         sta     (ptr3),y
         iny
-        lda     #>(chainIRQ-1)
+        lda     old_irq+1
+        sbc     #0
         sta     (ptr3),y
         cli
 
@@ -197,10 +205,10 @@ INSTALL:
 ; No return code required (the driver is removed from memory on return).
 
 UNINSTALL:
-        lda     chainIRQ+1
+        lda     old_irq
         sei
         sta     IRQInd+1
-        lda     chainIRQ+2
+        lda     old_irq+1
         sta     IRQInd+2
         cli
 
index 83255b64ef8014a074d9fb1b711b6066c2bbfd63..c1dc2e0193e82b9d303134280e4a8c1c6bd37206 100644 (file)
@@ -73,15 +73,6 @@ 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
@@ -108,6 +99,10 @@ Temp:           .res    1
 
 old_key_count:  .res    1
 
+; original IRQ vector
+
+old_irq:        .res    2
+
 .rodata
 
 ; Default values for above variables
@@ -163,20 +158,27 @@ INSTALL:
 
 ; Initialize our IRQ magic
 
-        lda     IRQInd+1
-        sta     chainIRQ+1
+        ; remember ROM IRQ continuation address
         lda     IRQInd+2
-        sta     chainIRQ+2
+        sta     old_irq+1
+        lda     IRQInd+1
+        sta     old_irq
+
         lda     libref
         sta     ptr3
         lda     libref+1
         sta     ptr3+1
+
+        ; set ROM IRQ continuation address to point to the provided routine
         ldy     #2
         lda     (ptr3),y
         sta     IRQInd+1
         iny
         lda     (ptr3),y
         sta     IRQInd+2
+
+        ; set address of our IRQ callback routine
+        ; since it's called via "rts" we have to use "address-1"
         iny
         lda     #<(callback-1)
         sta     (ptr3),y
@@ -184,10 +186,16 @@ INSTALL:
         lda     #>(callback-1)
         sta     (ptr3),y
         iny
-        lda     #<(chainIRQ-1)
+
+        ; set ROM entry point vector
+        ; since it's called via "rts" we have to decrement it by one
+        lda     old_irq
+        sec
+        sbc     #1
         sta     (ptr3),y
         iny
-        lda     #>(chainIRQ-1)
+        lda     old_irq+1
+        sbc     #0
         sta     (ptr3),y
         cli
 
@@ -202,10 +210,10 @@ INSTALL:
 ; No return code required (the driver is removed from memory on return).
 
 UNINSTALL:
-        lda     chainIRQ+1
+        lda     old_irq
         sei
         sta     IRQInd+1
-        lda     chainIRQ+2
+        lda     old_irq+1
         sta     IRQInd+2
         cli
 
index 29030307573972a7ed566941ff3eb09f5142ed8b..630ff573ff81405430411f884c714c5a6274b70f 100644 (file)
@@ -26,7 +26,7 @@ _pen_adjuster:
         .addr   IRQStub2
 callback:                       ; callback into mouse driver after ROM IRQ handler has been run
         .addr   $0000           ; (filled in by mouse driver)
-jmp_rom_hdlr:                   ; "trampoline" to jump to ROM IRQ handler
+jmp_rom_hdlr:                   ; original ROM indirect IRQ handler address
         .addr   $0000           ; (filled in by mouse driver)
 
 
@@ -54,11 +54,17 @@ IRQStub2:
         lda     #MMU_CFG_CC65   ; MMU configuration which will be active after the ROM handler returns
         pha
 
+        ; map out ROM
+        ldy     MMU_CR
+        sta     MMU_CR
+
         ; push address of ROM handler on stack and jump to it
         lda     jmp_rom_hdlr+1
         pha
         lda     jmp_rom_hdlr
         pha
+
+        sty     MMU_CR          ; map in ROM
         rts                     ; jump to ROM handler
 
         ; our MMU configuration byte we pushed on the stack before (MMU_CFG_CC65) is now active