1
0
mirror of https://github.com/cc65/cc65.git synced 2025-01-14 00:32:08 +00:00

Patches by Greg King to avoid crosstalk between mouse and keyboard.

git-svn-id: svn://svn.cc65.org/cc65/trunk@4589 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
uz 2010-02-15 17:52:41 +00:00
parent d1aad57b98
commit 5f18ddbec9
2 changed files with 47 additions and 30 deletions

View File

@ -2,7 +2,8 @@
; Driver for the 1351 proportional mouse. Parts of the code are from ; Driver for the 1351 proportional mouse. Parts of the code are from
; the Commodore 1351 mouse users guide. ; the Commodore 1351 mouse users guide.
; ;
; Ullrich von Bassewitz, 2003-12-29, 2009-09-26 ; 2009-09-26, Ullrich von Bassewitz
; 2010-02-06, Greg King
; ;
.include "zeropage.inc" .include "zeropage.inc"
@ -53,8 +54,8 @@ CMOVEY: jmp $0000 ; Move the cursor to Y coord
;---------------------------------------------------------------------------- ;----------------------------------------------------------------------------
; Constants ; Constants
SCREEN_HEIGHT = 200 SCREEN_HEIGHT = YSIZE * 8 - 1 ; (origin is zero)
SCREEN_WIDTH = 320 SCREEN_WIDTH = XSIZE * 8 - 1
;---------------------------------------------------------------------------- ;----------------------------------------------------------------------------
; Global variables. The bounding box values are sorted so that they can be ; Global variables. The bounding box values are sorted so that they can be
@ -67,12 +68,13 @@ Vars:
OldPotX: .res 1 ; Old hw counter values OldPotX: .res 1 ; Old hw counter values
OldPotY: .res 1 OldPotY: .res 1
YPos: .res 2 ; Current mouse position, Y
XPos: .res 2 ; Current mouse position, X XPos: .res 2 ; Current mouse position, X
YPos: .res 2 ; Current mouse position, Y
XMin: .res 2 ; X1 value of bounding box XMin: .res 2 ; X1 value of bounding box
YMin: .res 2 ; Y1 value of bounding box YMin: .res 2 ; Y1 value of bounding box
XMax: .res 2 ; X2 value of bounding box XMax: .res 2 ; X2 value of bounding box
YMax: .res 2 ; Y2 value of bounding box YMax: .res 2 ; Y2 value of bounding box
Buttons: .res 1 ; button status bits
OldValue: .res 1 ; Temp for MoveCheck routine OldValue: .res 1 ; Temp for MoveCheck routine
NewValue: .res 1 ; Temp for MoveCheck routine NewValue: .res 1 ; Temp for MoveCheck routine
@ -81,14 +83,17 @@ NewValue: .res 1 ; Temp for MoveCheck routine
.rodata .rodata
; (We use ".proc" because we want to define both a label and a scope.)
.proc DefVars .proc DefVars
.byte 0, 0 ; OldPotX/OldPotY .byte 0, 0 ; OldPotX/OldPotY
.word SCREEN_HEIGHT/2 ; YPos
.word SCREEN_WIDTH/2 ; XPos .word SCREEN_WIDTH/2 ; XPos
.word SCREEN_HEIGHT/2 ; YPos
.word 0 ; XMin .word 0 ; XMin
.word 0 ; YMin .word 0 ; YMin
.word SCREEN_WIDTH ; XMax .word SCREEN_WIDTH ; XMax
.word SCREEN_HEIGHT ; YMax .word SCREEN_HEIGHT ; YMax
.byte %00000000 ; Buttons
.endproc .endproc
.code .code
@ -126,7 +131,7 @@ INSTALL:
ldx #$00 ldx #$00
txa txa
rts ; Run into UNINSTALL instead rts
;---------------------------------------------------------------------------- ;----------------------------------------------------------------------------
; UNINSTALL routine. Is called before the driver is removed from memory. ; UNINSTALL routine. Is called before the driver is removed from memory.
@ -187,14 +192,10 @@ GETBOX: sta ptr1
stx ptr1+1 ; Save data pointer stx ptr1+1 ; Save data pointer
ldy #.sizeof (MOUSE_BOX)-1 ldy #.sizeof (MOUSE_BOX)-1
sei
@L1: lda XMin,y @L1: lda XMin,y
sta (ptr1),y sta (ptr1),y
dey dey
bpl @L1 bpl @L1
cli
rts rts
;---------------------------------------------------------------------------- ;----------------------------------------------------------------------------
@ -228,14 +229,9 @@ 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
sta CIA1_PRA
lda CIA1_PRB ; Read joystick #0
cli
ldx #0 ldx #0
and #$1F and #$1F
eor #$1F
rts rts
;---------------------------------------------------------------------------- ;----------------------------------------------------------------------------
@ -297,14 +293,30 @@ IOCTL: lda #<MOUSE_ERR_INV_IOCTL ; We don't support ioclts for now
; MUST return carry clear. ; MUST return carry clear.
; ;
IRQ: lda SID_ADConv1 ; Get mouse X movement IRQ:
; Record the state of the buttons.
; Avoid crosstalk between the keyboard and the mouse.
ldy #%00000000 ; Set ports A and B to input
sty CIA1_DDRB
sty CIA1_DDRA ; Keyboard won't look like mouse
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
beq @L0 ;(bze)
dec CIA1_DDRB ; Mouse won't look like keyboard
sty CIA1_PRB ; Set "all keys pushed"
@L0: lda SID_ADConv1 ; Get mouse X movement
ldy OldPotX ldy OldPotX
jsr MoveCheck ; Calculate movement vector jsr MoveCheck ; Calculate movement vector
sty OldPotX
; Skip processing if nothing has changed ; Skip processing if nothing has changed
bcc @SkipX bcc @SkipX
sty OldPotX
; Calculate the new X coordinate (--> a/y) ; Calculate the new X coordinate (--> a/y)
@ -342,11 +354,11 @@ IRQ: lda SID_ADConv1 ; Get mouse X movement
@SkipX: lda SID_ADConv2 ; Get mouse Y movement @SkipX: lda SID_ADConv2 ; Get mouse Y movement
ldy OldPotY ldy OldPotY
jsr MoveCheck ; Calculate movement jsr MoveCheck ; Calculate movement
sty OldPotY
; Skip processing if nothing has changed ; Skip processing if nothing has changed
bcc @SkipY bcc @SkipY
sty OldPotY
; Calculate the new Y coordinate (--> a/y) ; Calculate the new Y coordinate (--> a/y)
@ -377,14 +389,14 @@ IRQ: lda SID_ADConv1 ; Get mouse X movement
@L4: sty YPos @L4: sty YPos
stx YPos+1 stx YPos+1
; Move the mouse pointer to the new X pos ; Move the mouse pointer to the new Y pos
tya tya
jsr CMOVEY jsr CMOVEY
; Done ; Done
clc ; Interrupt not handled clc ; Interrupt not "handled"
@SkipY: rts @SkipY: rts
; -------------------------------------------------------------------------- ; --------------------------------------------------------------------------
@ -412,7 +424,7 @@ MoveCheck:
sec sec
rts ; return rts ; return
@L1: ora #%11000000 ; else or in high order bits @L1: ora #%11000000 ; else, "or" in high-order bits
cmp #$FF ; if (a != -1) cmp #$FF ; if (a != -1)
beq @L2 beq @L2
sec sec

View File

@ -2,6 +2,7 @@
; Driver for a "joystick mouse". ; Driver for a "joystick mouse".
; ;
; Ullrich von Bassewitz, 2004-03-29, 2009-09-26 ; Ullrich von Bassewitz, 2004-03-29, 2009-09-26
; 2010-02-08, Greg King
; ;
.include "zeropage.inc" .include "zeropage.inc"
@ -193,14 +194,12 @@ GETBOX: sta ptr1
stx ptr1+1 ; Save data pointer stx ptr1+1 ; Save data pointer
ldy #.sizeof (MOUSE_BOX)-1 ldy #.sizeof (MOUSE_BOX)-1
sei
@L1: lda XMin,y @L1: lda XMin,y
sta (ptr1),y sta (ptr1),y
dey dey
bpl @L1 bpl @L1
cli
rts rts
;---------------------------------------------------------------------------- ;----------------------------------------------------------------------------
@ -297,12 +296,18 @@ IOCTL: lda #<MOUSE_ERR_INV_IOCTL ; We don't support ioclts for now
; MUST return carry clear. ; MUST return carry clear.
; ;
IRQ: lda #$7F ; Avoid crosstalk between the keyboard and a joystick.
sta CIA1_PRA
lda CIA1_PRB ; Read joystick #0 IRQ: ldy #%00000000 ; Set ports A and B to input
and #$1F sty CIA1_DDRB
eor #$1F ; Make all bits active high sty CIA1_DDRA ; Keyboard won't look like joystick
sta Temp lda CIA1_PRB ; Read Control-Port 1
dec CIA1_DDRA ; Set port A back to output
eor #%11111111 ; Bit goes up when switch goes down
beq @Save ;(bze)
dec CIA1_DDRB ; Joystick won't look like keyboard
sty CIA1_PRB ; Set "all keys pushed"
@Save: sta Temp
; Check for a pressed button and place the result into Buttons ; Check for a pressed button and place the result into Buttons