1
0
mirror of https://github.com/cc65/cc65.git synced 2025-08-12 17:25:11 +00:00

Merge pull request #109 from groessler/something_to_pull2

Proposal: workaround for "phantom" key presses in the C128 "joystick" mouse driver...
This commit is contained in:
Oliver Schmidt
2014-04-28 22:18:11 +02:00
4 changed files with 243 additions and 8 deletions

View File

@@ -12,6 +12,8 @@
.macpack generic .macpack generic
IRQInd = $2FD
; ------------------------------------------------------------------------ ; ------------------------------------------------------------------------
; Header. Includes jump table ; Header. Includes jump table
@@ -26,6 +28,7 @@ HEADER:
; Library reference ; Library reference
libref:
.addr $0000 .addr $0000
; Jump table ; Jump table
@@ -85,6 +88,15 @@ OldValue: .res 1 ; Temp for MoveCheck routine
NewValue: .res 1 ; Temp for MoveCheck routine NewValue: .res 1 ; Temp for MoveCheck routine
INIT_save: .res 1 INIT_save: .res 1
Buttons: .res 1 ; Button mask
; Keyboard buffer fill level at start of interrupt
old_key_count: .res 1
; original IRQ vector
old_irq: .res 2
.rodata .rodata
@@ -138,6 +150,48 @@ INSTALL:
lda YPos lda YPos
ldx YPos+1 ldx YPos+1
jsr CMOVEY jsr CMOVEY
; Initialize our IRQ magic
; remember ROM IRQ continuation address
lda IRQInd+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
iny
lda #>(callback-1)
sta (ptr3),y
iny
; 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 old_irq+1
sbc #0
sta (ptr3),y
cli cli
; Done, return zero (= MOUSE_ERR_OK) ; Done, return zero (= MOUSE_ERR_OK)
@@ -151,6 +205,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
sei
sta IRQInd+1
lda old_irq+1
sta IRQInd+2
cli
jsr HIDE ; Hide cursor on exit jsr HIDE ; Hide cursor on exit
lda INIT_save lda INIT_save
sta INIT_STATUS sta INIT_STATUS
@@ -250,14 +311,8 @@ MOVE: sei ; No interrupts
; BUTTONS: Return the button mask in a/x. ; BUTTONS: Return the button mask in a/x.
BUTTONS: BUTTONS:
lda #$7F lda Buttons
sei ldx #$00
sta CIA1_PRA
lda CIA1_PRB ; Read joystick #0
cli
ldx #0
and #$1F
eor #$1F
rts rts
;---------------------------------------------------------------------------- ;----------------------------------------------------------------------------
@@ -320,6 +375,15 @@ 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
sta CIA1_PRA
lda CIA1_PRB ; Read joystick #0
and #$1F
eor #$1F ; Make all bits active high
sta Buttons
lda SID_ADConv1 ; Get mouse X movement lda SID_ADConv1 ; Get mouse X movement
ldy OldPotX ldy OldPotX
jsr MoveCheck ; Calculate movement vector jsr MoveCheck ; Calculate movement vector
@@ -450,3 +514,5 @@ MoveCheck:
clc clc
rts rts
.define OLD_BUTTONS Buttons ; tells callback.inc where the old port status is stored
.include "callback.inc"

View File

@@ -11,6 +11,8 @@
.macpack generic .macpack generic
IRQInd = $2FD
; ------------------------------------------------------------------------ ; ------------------------------------------------------------------------
; Header. Includes jump table ; Header. Includes jump table
@@ -25,6 +27,7 @@ HEADER:
; Library reference ; Library reference
libref:
.addr $0000 .addr $0000
; Jump table ; Jump table
@@ -92,6 +95,14 @@ INIT_save: .res 1
Temp: .res 1 Temp: .res 1
; Keyboard buffer fill level at start of interrupt
old_key_count: .res 1
; original IRQ vector
old_irq: .res 2
.rodata .rodata
; Default values for above variables ; Default values for above variables
@@ -144,6 +155,48 @@ INSTALL:
lda YPos lda YPos
ldx YPos+1 ldx YPos+1
jsr CMOVEY jsr CMOVEY
; Initialize our IRQ magic
; remember ROM IRQ continuation address
lda IRQInd+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
iny
lda #>(callback-1)
sta (ptr3),y
iny
; 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 old_irq+1
sbc #0
sta (ptr3),y
cli cli
; Done, return zero (= MOUSE_ERR_OK) ; Done, return zero (= MOUSE_ERR_OK)
@@ -157,6 +210,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
sei
sta IRQInd+1
lda old_irq+1
sta IRQInd+2
cli
jsr HIDE ; Hide cursor on exit jsr HIDE ; Hide cursor on exit
lda INIT_save lda INIT_save
sta INIT_STATUS sta INIT_STATUS
@@ -320,6 +380,8 @@ 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 joystick #0 lda CIA1_PRB ; Read joystick #0
@@ -436,3 +498,6 @@ IRQ: jsr CPREP
@SkipY: jsr CDRAW @SkipY: jsr CDRAW
clc ; Interrupt not "handled" clc ; Interrupt not "handled"
rts rts
.define OLD_BUTTONS Temp ; tells callback.inc where the old port status is stored
.include "callback.inc"

View File

@@ -0,0 +1,29 @@
;
; Callback routine called from the IRQ handler after the ROM IRQ handler
; had been run.
;
; Christian Groessler, 24.04.2014
;
; Check if there was joystick activity before and/or after the ROM handler.
; If there was activity, discard the key presses since they are most
; probably "phantom" key presses.
callback:
ldx old_key_count
cpx KEY_COUNT
beq @nokey
lda OLD_BUTTONS ; keypress before?
bne @discard_key ; yes, discard key
lda #$7F
sta CIA1_PRA
lda CIA1_PRB ; Read joystick #0
and #$1F
eor #$1F ; keypress after
beq @nokey ; no, probably a real key press
@discard_key:
stx KEY_COUNT ; set old keyboard buffer fill level
@nokey: rts

View File

@@ -4,6 +4,8 @@
; 2013-07-25, Greg King ; 2013-07-25, Greg King
; ;
.include "c128.inc"
.export mouse_libref, _pen_adjuster .export mouse_libref, _pen_adjuster
.data .data
@@ -21,3 +23,76 @@ mouse_libref: ; generic label for mouse-kernel
; ;
_pen_adjuster: _pen_adjuster:
.addr $0000 .addr $0000
.addr IRQStub2
callback: ; callback into mouse driver after ROM IRQ handler has been run
.addr $0000 ; (filled in by mouse driver)
jmp_rom_hdlr: ; original ROM indirect IRQ handler address
.addr $0000 ; (filled in by mouse driver)
.segment "LOWCODE"
; Called from irq.s when it thinks it chains to the original handler.
; ROM is banked in again. In order to call the callback we have to
; bank it out one more time.
IRQStub2:
; Call ROM handler and prepare stack so that it will return to us.
; setup fake IRQ stack frame which will return to "IRQCont"
lda #>@IRQCont
pha
lda #<@IRQCont
pha
php
; mimic the contents saved on the stack by the ROM IRQ entry handler
pha ; A
pha ; X
pha ; Y
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
@IRQCont:
; call mouse driver callback routine
lda #>(@IRQCont2-1)
pha
lda #<(@IRQCont2-1)
pha
lda callback+1
pha
lda callback
pha
rts ; jump to callback routine
@IRQCont2:
; return from interrupt
; 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.
pla
sta MMU_CR ; MMU configuration register
pla
tay
pla
tax
pla
rti