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:
parent
d1aad57b98
commit
5f18ddbec9
@ -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
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user