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:
@@ -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"
|
||||||
|
@@ -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"
|
||||||
|
29
libsrc/c128/mou/callback.inc
Normal file
29
libsrc/c128/mou/callback.inc
Normal 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
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user