diff --git a/libsrc/c128/mou/c128-1351.s b/libsrc/c128/mou/c128-1351.s index c81ad04d0..e55c1d01b 100644 --- a/libsrc/c128/mou/c128-1351.s +++ b/libsrc/c128/mou/c128-1351.s @@ -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 diff --git a/libsrc/c128/mou/c128-joy.s b/libsrc/c128/mou/c128-joy.s index 83255b64e..c1dc2e019 100644 --- a/libsrc/c128/mou/c128-joy.s +++ b/libsrc/c128/mou/c128-joy.s @@ -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 diff --git a/libsrc/c128/mouseref.s b/libsrc/c128/mouseref.s index 290303075..630ff573f 100644 --- a/libsrc/c128/mouseref.s +++ b/libsrc/c128/mouseref.s @@ -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