From: Greg King Date: Mon, 5 May 2014 09:30:31 +0000 (-0400) Subject: Migrated the phantom-key exorcism code to the other C128 mouse drivers. X-Git-Tag: V2.15~66^2~2 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=667f8229c02ceaaf94c2c2b169079e0eddea3ef0;p=cc65 Migrated the phantom-key exorcism code to the other C128 mouse drivers. --- diff --git a/asminc/c128.inc b/asminc/c128.inc index aac8678bf..6e3078297 100644 --- a/asminc/c128.inc +++ b/asminc/c128.inc @@ -32,6 +32,7 @@ FETCH := $2A2 ; Fetch subroutine in RAM FETVEC := $2AA ; Vector patch location for FETCH STASH := $2AF ; Stash routine in RAM STAVEC := $2B9 ; Vector patch location for STASH +IRQInd := $2FD ; JMP $0000 -- used as indirect IRQ vector PALFLAG := $A03 ; $FF=PAL, $00=NTSC INIT_STATUS := $A04 ; Flags: Reset/Restore initiation status FKEY_LEN := $1000 ; Function key lengths diff --git a/libsrc/c128/irq.s b/libsrc/c128/irq.s index aed1f3a25..79aa8faaa 100644 --- a/libsrc/c128/irq.s +++ b/libsrc/c128/irq.s @@ -7,8 +7,6 @@ .include "c128.inc" -IRQInd = $2FD ; JMP $0000 - used as indirect IRQ vector - ; ------------------------------------------------------------------------ .segment "INIT" diff --git a/libsrc/c128/mou/c128-inkwell.s b/libsrc/c128/mou/c128-inkwell.s index e74cacfc3..1e2f19844 100644 --- a/libsrc/c128/mou/c128-inkwell.s +++ b/libsrc/c128/mou/c128-inkwell.s @@ -1,7 +1,8 @@ ; ; Driver for the Inkwell Systems 170-C and 184-C lightpens. ; -; 2013-07-01, Greg King +; 2014-04-26, Christian Groessler +; 2014-05-01, Greg King ; .include "zeropage.inc" @@ -24,7 +25,7 @@ HEADER: ; Library reference -LIBREF: .addr $0000 +libref: .addr $0000 ; Jump table @@ -102,6 +103,14 @@ OldPenY: .res 1 INIT_save: .res 1 +; Keyboard buffer fill level at start of interrupt + +old_key_count: .res 1 + +; Original IRQ vector + +old_irq: .res 2 + .data ; Default Inkwell calibration. @@ -131,7 +140,7 @@ INSTALL: lda #%11000000 sta INIT_STATUS -; Initiate variables. Just copy the default stuff over. +; Initiate some variables. Just copy the default stuff over. ldx #.sizeof (DefVars) - 1 @L0: lda DefVars,x @@ -144,18 +153,57 @@ INSTALL: stx OldPenX sty OldPenY +; Initiate our IRQ magic. + + ; Remember the ROM IRQ continuation address. + ldx IRQInd+2 + lda IRQInd+1 + stx old_irq+1 + sta old_irq + + lda libref + ldx libref+1 + sta ptr3 ; Point to mouse_adjuster + stx ptr3+1 + + ; Set the ROM IRQ continuation address to point to the provided routine. + ldy #2 + lda (ptr3),y + iny + sei + sta IRQInd+1 + lda (ptr3),y + sta IRQInd+2 + + ; Set the address of our IRQ callback routine. + ; Because it's called via "rts", we must use "address-1". + iny + lda #<(callback-1) + sta (ptr3),y + iny + lda #>(callback-1) + sta (ptr3),y + + ; Set the ROM entry-point vector. + ; Because it's called via "rts", we must decrement it by one. + iny + lda old_irq + sub #<1 + sta (ptr3),y + iny + lda old_irq+1 + sbc #>1 + sta (ptr3),y + cli + ; Call a calibration function through the library-reference. - lda LIBREF - ldx LIBREF+1 - sta ptr1 ; Point to mouse_adjuster - stx ptr1+1 ldy #1 - lda (ptr1),y + lda (ptr3),y bze @L1 ; Don't call pointer if it's NULL sta Calibrate+2 ; Point to function dey - lda (ptr1),y + lda (ptr3),y sta Calibrate+1 lda #XOffset @@ -187,6 +235,13 @@ INSTALL: ; No return code required (the driver is removed from memory on return). UNINSTALL: + lda old_irq + ldx old_irq+1 + sei + sta IRQInd+1 + stx IRQInd+2 + ;cli + jsr HIDE ; Hide cursor on exit lda INIT_save sta INIT_STATUS @@ -346,6 +401,8 @@ IOCTL: lda #(callback-1) + sta (ptr3),y + + ; Set the ROM entry-point vector. + ; Because it's called via "rts", we must decrement it by one. + iny + lda old_irq + sub #<1 + sta (ptr3),y + iny + lda old_irq+1 + sbc #>1 + sta (ptr3),y cli ; Done, return zero (= MOUSE_ERR_OK) @@ -158,6 +204,13 @@ INSTALL: ; No return code required (the driver is removed from memory on return). UNINSTALL: + lda old_irq + ldx old_irq+1 + sei + sta IRQInd+1 + stx IRQInd+2 + ;cli + jsr HIDE ; Hide cursor on exit lda INIT_save sta INIT_STATUS @@ -259,6 +312,15 @@ MOVE: sei ; No interrupts BUTTONS: lda Buttons ldx #$00 + +; Make the buttons look like a 1351 mouse. + + and #JOY::LEFT | JOY::RIGHT + lsr a + lsr a + ;clc + adc #%00001110 + and #MOUSE_BTN_LEFT | MOUSE_BTN_RIGHT rts ;---------------------------------------------------------------------------- @@ -297,7 +359,7 @@ INFO: jsr POS ; Fill in the button state - lda Buttons + jsr BUTTONS ldy #MOUSE_INFO::BUTTONS sta (ptr1),y @@ -309,7 +371,7 @@ INFO: jsr POS ; Must return an error code in a/x. ; -IOCTL: lda #MOUSE_ERR_INV_IOCTL rts @@ -319,22 +381,17 @@ IOCTL: lda #