]> git.sur5r.net Git - cc65/commitdiff
Migrated the phantom-key exorcism code to the other C128 mouse drivers.
authorGreg King <gregdk@users.sf.net>
Mon, 5 May 2014 09:30:31 +0000 (05:30 -0400)
committerGreg King <gregdk@users.sf.net>
Mon, 5 May 2014 09:30:31 +0000 (05:30 -0400)
asminc/c128.inc
libsrc/c128/irq.s
libsrc/c128/mou/c128-inkwell.s
libsrc/c128/mou/c128-pot.s

index aac8678bfd9e369aaf62bca74ab9c103c5eb3e0c..6e3078297e082cd2f3157d7c2b2c50e79a1f7294 100644 (file)
@@ -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
index aed1f3a2595085dbaaaf2eabe117c7ab24e5b29c..79aa8faaa1721997553312d580ae8e8ed4eba356 100644 (file)
@@ -7,8 +7,6 @@
 
         .include        "c128.inc"
 
-IRQInd  = $2FD          ; JMP $0000 - used as indirect IRQ vector
-
 ; ------------------------------------------------------------------------
 
 .segment        "INIT"
index e74cacfc3e3fa1b9d7a3245dd4b4557b58913a3e..1e2f198445c098438463424d7f733f4af66af1be 100644 (file)
@@ -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               ; Function will set this variable
         ldx     #>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     #<MOUSE_ERR_INV_IOCTL     ; We don't support ioctls, for now
 ;
 
 IRQ:    jsr     CPREP
+        lda     KEY_COUNT
+        sta     old_key_count
 
 ; Record the state of the buttons.
 ; Try to avoid crosstalk between the keyboard and the lightpen.
@@ -353,18 +410,16 @@ IRQ:    jsr     CPREP
         ldy     #%00000000              ; Set ports A and B to input
         sty     CIA1_DDRB
         sty     CIA1_DDRA               ; Keyboard won't look like buttons
-        lda     CIA1_PRB                ; Read Control-Port 1
+        ;lda     #%01111111
+        ;sta     CIA1_PRA
+        lda     CIA1_PRB                ; Read Control Port 1
         dec     CIA1_DDRA               ; Set port A back to output
         eor     #%11111111              ; Bit goes up when button goes down
         sta     Buttons
-        bze     @L0
-        lda     #%11101111              ; (Don't change bit that feeds VIC-II)
-        sta     CIA1_DDRB               ; Buttons won't look like keyboard
-        sty     CIA1_PRB                ; Set "all keys pushed"
 
 ; Read the VIC-II lightpen registers.
 
-@L0:    lda     VIC_LPEN_Y
+        lda     VIC_LPEN_Y
         cmp     OldPenY
 
 ; Skip processing if nothing has changed.
@@ -458,3 +513,6 @@ MoveY:  sta     YPos
 MoveX:  sta     XPos
         stx     XPos+1
         jmp     CMOVEX
+
+.define OLD_BUTTONS Buttons             ; Tells callback.inc where the old port status is stored
+.include        "callback.inc"
index f760d6b6274e31e95e999d836ff4bbcaf4f1653f..0a3ed605161c641ef1bde136cb6848c148c737db 100644 (file)
@@ -3,6 +3,7 @@
 ;
 ; 2006-08-20, Stefan Haubenthal
 ; 2009-09-26, Ullrich von Bassewitz
+; 2014-04-26, Christian Groessler
 ; 2014-05-05, Greg King
 ;
 
@@ -26,7 +27,7 @@ HEADER:
 
 ; Library reference
 
-        .addr   $0000
+libref: .addr   $0000
 
 ; Jump table
 
@@ -89,9 +90,13 @@ Buttons:        .res    1               ; Button mask
 
 INIT_save:      .res    1
 
-; Temporary value used in the int handler
+; Keyboard buffer fill level at start of interrupt
 
-Temp:           .res    1
+old_key_count:  .res    1
+
+; Original IRQ vector
+
+old_irq:        .res    2
 
 .rodata
 
@@ -145,6 +150,47 @@ INSTALL:
         lda     YPos
         ldx     YPos+1
         jsr     CMOVEY
+
+; 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
+        stx     ptr3+1
+
+        ; Set the 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 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
 
 ; 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     ; We don't support ioclts for now
+IOCTL:  lda     #<MOUSE_ERR_INV_IOCTL     ; We don't support ioctls for now
         ldx     #>MOUSE_ERR_INV_IOCTL
         rts
 
@@ -319,22 +381,17 @@ IOCTL:  lda     #<MOUSE_ERR_INV_IOCTL     ; We don't support ioclts for now
 ;
 
 IRQ:    jsr     CPREP
+        lda     KEY_COUNT
+        sta     old_key_count
         lda     #$7F
         sta     CIA1_PRA
         lda     CIA1_PRB                ; Read port #1
-        and     #%00001100
-        eor     #%00001100              ; Make all bits active high
-        asl
-        sta     Buttons
-        lsr
-        lsr
-        lsr
-        and     #%00000001
-        ora     Buttons
+        eor     #%11111111              ; Make all bits active high
         sta     Buttons
-        ldx     #%01000000
+
+        ldx     #%01000000              ; Read port 1 paddles
         stx     CIA1_PRA
-        ldy     #0
+        ldy     #<256
 :       dey
         bne     :-
         ldx     SID_ADConv1
@@ -418,3 +475,6 @@ IRQ:    jsr     CPREP
         jsr     CDRAW
         clc                             ; Interrupt not "handled"
         rts
+
+.define OLD_BUTTONS Buttons             ; Tells callback.inc where the old port status is stored
+.include        "callback.inc"