1
0
mirror of https://github.com/cc65/cc65.git synced 2024-10-01 15:54:59 +00:00

Merge pull request #114 from greg-king5/phantom

Added the phantom-key exorcism code to the other C128 mouse drivers.
This commit is contained in:
Oliver Schmidt 2014-05-09 19:30:51 +02:00
commit 63b5f75a7f
9 changed files with 183 additions and 69 deletions

View File

@ -32,6 +32,7 @@ FETCH := $2A2 ; Fetch subroutine in RAM
FETVEC := $2AA ; Vector patch location for FETCH FETVEC := $2AA ; Vector patch location for FETCH
STASH := $2AF ; Stash routine in RAM STASH := $2AF ; Stash routine in RAM
STAVEC := $2B9 ; Vector patch location for STASH STAVEC := $2B9 ; Vector patch location for STASH
IRQInd := $2FD ; JMP $0000 -- used as indirect IRQ vector
PALFLAG := $A03 ; $FF=PAL, $00=NTSC PALFLAG := $A03 ; $FF=PAL, $00=NTSC
INIT_STATUS := $A04 ; Flags: Reset/Restore initiation status INIT_STATUS := $A04 ; Flags: Reset/Restore initiation status
FKEY_LEN := $1000 ; Function key lengths FKEY_LEN := $1000 ; Function key lengths

View File

@ -7,8 +7,6 @@
.include "c128.inc" .include "c128.inc"
IRQInd = $2FD ; JMP $0000 - used as indirect IRQ vector
; ------------------------------------------------------------------------ ; ------------------------------------------------------------------------
.segment "INIT" .segment "INIT"

View File

@ -3,7 +3,8 @@
; the Commodore 1351 mouse users guide. ; the Commodore 1351 mouse users guide.
; ;
; 2009-09-26, Ullrich von Bassewitz ; 2009-09-26, Ullrich von Bassewitz
; 2014-03-17, Greg King ; 2014-04-26, Christian Groessler
; 2014-04-30, Greg King
; ;
.include "zeropage.inc" .include "zeropage.inc"
@ -12,8 +13,6 @@
.macpack generic .macpack generic
IRQInd = $2FD
; ------------------------------------------------------------------------ ; ------------------------------------------------------------------------
; Header. Includes jump table ; Header. Includes jump table
@ -28,8 +27,7 @@ HEADER:
; Library reference ; Library reference
libref: libref: .addr $0000
.addr $0000
; Jump table ; Jump table
@ -210,7 +208,7 @@ UNINSTALL:
sta IRQInd+1 sta IRQInd+1
lda old_irq+1 lda old_irq+1
sta IRQInd+2 sta IRQInd+2
cli ;cli ; This will be done at end of HIDE
jsr HIDE ; Hide cursor on exit jsr HIDE ; Hide cursor on exit
lda INIT_save lda INIT_save
@ -351,7 +349,7 @@ INFO: jsr POS
; Fill in the button state ; Fill in the button state
jsr BUTTONS ; Will not touch ptr1 lda Buttons
ldy #MOUSE_INFO::BUTTONS ldy #MOUSE_INFO::BUTTONS
sta (ptr1),y sta (ptr1),y
@ -363,7 +361,7 @@ INFO: jsr POS
; Must return an error code in a/x. ; 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 ldx #>MOUSE_ERR_INV_IOCTL
rts rts

View File

@ -1,7 +1,8 @@
; ;
; Driver for the Inkwell Systems 170-C and 184-C lightpens. ; 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" .include "zeropage.inc"
@ -24,7 +25,7 @@ HEADER:
; Library reference ; Library reference
LIBREF: .addr $0000 libref: .addr $0000
; Jump table ; Jump table
@ -102,6 +103,14 @@ OldPenY: .res 1
INIT_save: .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 .data
; Default Inkwell calibration. ; Default Inkwell calibration.
@ -131,7 +140,7 @@ INSTALL:
lda #%11000000 lda #%11000000
sta INIT_STATUS sta INIT_STATUS
; Initiate variables. Just copy the default stuff over. ; Initiate some variables. Just copy the default stuff over.
ldx #.sizeof (DefVars) - 1 ldx #.sizeof (DefVars) - 1
@L0: lda DefVars,x @L0: lda DefVars,x
@ -144,18 +153,57 @@ INSTALL:
stx OldPenX stx OldPenX
sty OldPenY 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. ; Call a calibration function through the library-reference.
lda LIBREF
ldx LIBREF+1
sta ptr1 ; Point to mouse_adjuster
stx ptr1+1
ldy #1 ldy #1
lda (ptr1),y lda (ptr3),y
bze @L1 ; Don't call pointer if it's NULL bze @L1 ; Don't call pointer if it's NULL
sta Calibrate+2 ; Point to function sta Calibrate+2 ; Point to function
dey dey
lda (ptr1),y lda (ptr3),y
sta Calibrate+1 sta Calibrate+1
lda #<XOffset ; Function will set this variable lda #<XOffset ; Function will set this variable
ldx #>XOffset ldx #>XOffset
@ -187,6 +235,13 @@ INSTALL:
; No return code required (the driver is removed from memory on return). ; No return code required (the driver is removed from memory on return).
UNINSTALL: UNINSTALL:
lda old_irq
ldx old_irq+1
sei
sta IRQInd+1
stx IRQInd+2
;cli ; This will be done at end of HIDE
jsr HIDE ; Hide cursor on exit jsr HIDE ; Hide cursor on exit
lda INIT_save lda INIT_save
sta INIT_STATUS sta INIT_STATUS
@ -346,6 +401,8 @@ IOCTL: lda #<MOUSE_ERR_INV_IOCTL ; We don't support ioctls, for now
; ;
IRQ: jsr CPREP IRQ: jsr CPREP
lda KEY_COUNT
sta old_key_count
; Record the state of the buttons. ; Record the state of the buttons.
; Try to avoid crosstalk between the keyboard and the lightpen. ; 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 ldy #%00000000 ; Set ports A and B to input
sty CIA1_DDRB sty CIA1_DDRB
sty CIA1_DDRA ; Keyboard won't look like buttons sty CIA1_DDRA ; Keyboard won't look like buttons
lda CIA1_PRB ; Read Control-Port 1 ;lda #%01111111 ; (Keyboard scan leaves this in port A)
;sta CIA1_PRA
lda CIA1_PRB ; Read Control Port 1
dec CIA1_DDRA ; Set port A back to output dec CIA1_DDRA ; Set port A back to output
eor #%11111111 ; Bit goes up when button goes down eor #%11111111 ; Bit goes up when button goes down
sta Buttons 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. ; Read the VIC-II lightpen registers.
@L0: lda VIC_LPEN_Y lda VIC_LPEN_Y
cmp OldPenY cmp OldPenY
; Skip processing if nothing has changed. ; Skip processing if nothing has changed.
@ -458,3 +513,6 @@ MoveY: sta YPos
MoveX: sta XPos MoveX: sta XPos
stx XPos+1 stx XPos+1
jmp CMOVEX jmp CMOVEX
.define OLD_BUTTONS Buttons ; Tells callback.inc where the old port status is stored
.include "callback.inc"

View File

@ -2,7 +2,8 @@
; Driver for a "joystick mouse". ; Driver for a "joystick mouse".
; ;
; 2009-09-26, Ullrich von Bassewitz ; 2009-09-26, Ullrich von Bassewitz
; 2014-03-17, Greg King ; 2014-04-26, Christian Groessler
; 2014-05-01, Greg King
; ;
.include "zeropage.inc" .include "zeropage.inc"
@ -11,8 +12,6 @@
.macpack generic .macpack generic
IRQInd = $2FD
; ------------------------------------------------------------------------ ; ------------------------------------------------------------------------
; Header. Includes jump table ; Header. Includes jump table
@ -27,8 +26,7 @@ HEADER:
; Library reference ; Library reference
libref: libref: .addr $0000
.addr $0000
; Jump table ; Jump table
@ -91,10 +89,6 @@ Buttons: .res 1 ; Button mask
INIT_save: .res 1 INIT_save: .res 1
; Temporary value used in the int handler
Temp: .res 1
; Keyboard buffer fill level at start of interrupt ; Keyboard buffer fill level at start of interrupt
old_key_count: .res 1 old_key_count: .res 1
@ -215,7 +209,7 @@ UNINSTALL:
sta IRQInd+1 sta IRQInd+1
lda old_irq+1 lda old_irq+1
sta IRQInd+2 sta IRQInd+2
cli ;cli ; This will be done at end of HIDE
jsr HIDE ; Hide cursor on exit jsr HIDE ; Hide cursor on exit
lda INIT_save lda INIT_save
@ -318,6 +312,7 @@ MOVE: sei ; No interrupts
BUTTONS: BUTTONS:
lda Buttons lda Buttons
ldx #$00 ldx #$00
and #MOUSE_BTN_LEFT ; Left button -- same as JOY::FIRE
rts rts
;---------------------------------------------------------------------------- ;----------------------------------------------------------------------------
@ -356,7 +351,7 @@ INFO: jsr POS
; Fill in the button state ; Fill in the button state
lda Buttons jsr BUTTONS
ldy #MOUSE_INFO::BUTTONS ldy #MOUSE_INFO::BUTTONS
sta (ptr1),y sta (ptr1),y
@ -368,7 +363,7 @@ INFO: jsr POS
; Must return an error code in a/x. ; 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 ldx #>MOUSE_ERR_INV_IOCTL
rts rts
@ -387,19 +382,10 @@ IRQ: jsr CPREP
lda CIA1_PRB ; Read joystick #0 lda CIA1_PRB ; Read joystick #0
and #$1F and #$1F
eor #$1F ; Make all bits active high eor #$1F ; Make all bits active high
sta Temp sta Buttons
; Check for a pressed button and place the result into Buttons
ldx #$00 ; Assume no button pressed
and #JOY::FIRE ; Check fire button
beq @L0 ; Jump if not pressed
ldx #MOUSE_BTN_LEFT ; Left (only) button is pressed
@L0: stx Buttons
; Check left/right ; Check left/right
lda Temp ; Read joystick #0
and #(JOY::LEFT | JOY::RIGHT) and #(JOY::LEFT | JOY::RIGHT)
beq @SkipX ; beq @SkipX ;
@ -447,7 +433,7 @@ IRQ: jsr CPREP
; Calculate the Y movement vector ; Calculate the Y movement vector
@SkipX: lda Temp ; Read joystick #0 @SkipX: lda Buttons ; Read joystick #0
and #(JOY::UP | JOY::DOWN) ; Check up/down and #(JOY::UP | JOY::DOWN) ; Check up/down
beq @SkipY ; beq @SkipY ;
@ -499,5 +485,5 @@ IRQ: jsr CPREP
clc ; Interrupt not "handled" clc ; Interrupt not "handled"
rts rts
.define OLD_BUTTONS Temp ; tells callback.inc where the old port status is stored .define OLD_BUTTONS Buttons ; tells callback.inc where the old port status is stored
.include "callback.inc" .include "callback.inc"

View File

@ -3,7 +3,8 @@
; ;
; 2006-08-20, Stefan Haubenthal ; 2006-08-20, Stefan Haubenthal
; 2009-09-26, Ullrich von Bassewitz ; 2009-09-26, Ullrich von Bassewitz
; 2014-03-17, Greg King ; 2014-04-26, Christian Groessler
; 2014-05-05, Greg King
; ;
.include "zeropage.inc" .include "zeropage.inc"
@ -26,7 +27,7 @@ HEADER:
; Library reference ; Library reference
.addr $0000 libref: .addr $0000
; Jump table ; Jump table
@ -43,6 +44,10 @@ HEADER:
.addr IOCTL .addr IOCTL
.addr IRQ .addr IRQ
; Mouse driver flags
.byte MOUSE_FLAG_LATE_IRQ
; Callback table, set by the kernel before INSTALL is called ; Callback table, set by the kernel before INSTALL is called
CHIDE: jmp $0000 ; Hide the cursor CHIDE: jmp $0000 ; Hide the cursor
@ -85,9 +90,13 @@ Buttons: .res 1 ; Button mask
INIT_save: .res 1 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 .rodata
@ -141,6 +150,47 @@ INSTALL:
lda YPos lda YPos
ldx YPos+1 ldx YPos+1
jsr CMOVEY 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 cli
; Done, return zero (= MOUSE_ERR_OK) ; Done, return zero (= MOUSE_ERR_OK)
@ -154,6 +204,13 @@ INSTALL:
; No return code required (the driver is removed from memory on return). ; No return code required (the driver is removed from memory on return).
UNINSTALL: UNINSTALL:
lda old_irq
ldx old_irq+1
sei
sta IRQInd+1
stx IRQInd+2
;cli ; This will be done at end of HIDE
jsr HIDE ; Hide cursor on exit jsr HIDE ; Hide cursor on exit
lda INIT_save lda INIT_save
sta INIT_STATUS sta INIT_STATUS
@ -255,6 +312,15 @@ MOVE: sei ; No interrupts
BUTTONS: BUTTONS:
lda Buttons lda Buttons
ldx #$00 ldx #$00
; Make the buttons look like a 1351 mouse.
and #JOY::LEFT | JOY::RIGHT
lsr a
lsr a
;clc ; ("lsr" shifted zero into carry flag)
adc #%00001110 ; Shift bit 1 over to bit 4
and #MOUSE_BTN_LEFT | MOUSE_BTN_RIGHT
rts rts
;---------------------------------------------------------------------------- ;----------------------------------------------------------------------------
@ -293,7 +359,7 @@ INFO: jsr POS
; Fill in the button state ; Fill in the button state
lda Buttons jsr BUTTONS
ldy #MOUSE_INFO::BUTTONS ldy #MOUSE_INFO::BUTTONS
sta (ptr1),y sta (ptr1),y
@ -305,7 +371,7 @@ INFO: jsr POS
; Must return an error code in a/x. ; 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 ldx #>MOUSE_ERR_INV_IOCTL
rts rts
@ -315,22 +381,17 @@ IOCTL: lda #<MOUSE_ERR_INV_IOCTL ; We don't support ioclts for now
; ;
IRQ: jsr CPREP IRQ: jsr CPREP
lda KEY_COUNT
sta old_key_count
lda #$7F lda #$7F
sta CIA1_PRA sta CIA1_PRA
lda CIA1_PRB ; Read port #1 lda CIA1_PRB ; Read port #1
and #%00001100 eor #%11111111 ; Make all bits active high
eor #%00001100 ; Make all bits active high
asl
sta Buttons sta Buttons
lsr
lsr ldx #%01000000 ; Read port 1 paddles
lsr
and #%00000001
ora Buttons
sta Buttons
ldx #%01000000
stx CIA1_PRA stx CIA1_PRA
ldy #0 ldy #<256
: dey : dey
bne :- bne :-
ldx SID_ADConv1 ldx SID_ADConv1
@ -414,3 +475,6 @@ IRQ: jsr CPREP
jsr CDRAW jsr CDRAW
clc ; Interrupt not "handled" clc ; Interrupt not "handled"
rts rts
.define OLD_BUTTONS Buttons ; Tells callback.inc where the old port status is stored
.include "callback.inc"

View File

@ -4,7 +4,7 @@
; ;
; Christian Groessler, 24.04.2014 ; Christian Groessler, 24.04.2014
; ;
; Check if there was joystick activity before and/or after the ROM handler. ; Check if there was button/joystick activity before and/or after the ROM handler.
; If there was activity, discard the key presses since they are most ; If there was activity, discard the key presses since they are most
; probably "phantom" key presses. ; probably "phantom" key presses.

View File

@ -1,7 +1,11 @@
; ;
; Pointer for library references by device drivers. ; Pointer for library references by device drivers.
; ;
; Helper-routines for the interrupt handler that rejects bogus keypresses
; that are caused by mouse-like devices.
;
; 2013-07-25, Greg King ; 2013-07-25, Greg King
; 2014-04-26, Christian Groessler
; ;
.include "c128.inc" .include "c128.inc"
@ -23,6 +27,7 @@ mouse_libref: ; generic label for mouse-kernel
; ;
_pen_adjuster: _pen_adjuster:
.addr $0000 .addr $0000
.addr IRQStub2 .addr IRQStub2
callback: ; callback into mouse driver after ROM IRQ handler has been run callback: ; callback into mouse driver after ROM IRQ handler has been run
.addr $0000 ; (filled in by mouse driver) .addr $0000 ; (filled in by mouse driver)
@ -83,7 +88,7 @@ IRQStub2:
rts ; jump to callback routine rts ; jump to callback routine
@IRQCont2: @IRQCont2:
; return from interrupt ; return from interrupt
; We could just jump to $FF33, but since I don't know whether this address is valid in all ; 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. ; ROM versions, duplicate that code here.

View File

@ -3,7 +3,7 @@
; ;
; 2006-08-20, Stefan Haubenthal ; 2006-08-20, Stefan Haubenthal
; 2009-09-26, Ullrich von Bassewitz ; 2009-09-26, Ullrich von Bassewitz
; 2014-03-17, Greg King ; 2014-05-05, Greg King
; ;
.include "zeropage.inc" .include "zeropage.inc"
@ -43,6 +43,10 @@ HEADER:
.addr IOCTL .addr IOCTL
.addr IRQ .addr IRQ
; Mouse driver flags
.byte MOUSE_FLAG_LATE_IRQ
; Callback table, set by the kernel before INSTALL is called ; Callback table, set by the kernel before INSTALL is called
CHIDE: jmp $0000 ; Hide the cursor CHIDE: jmp $0000 ; Hide the cursor