mirror of
https://github.com/cc65/cc65.git
synced 2024-12-28 22:30:12 +00:00
Harmonized interface between mouse drivers and callbacks.
The Apple2 doesn't have sprites so the Apple2 mouse callbacks place a special character on the text screen to indicate the mouse position. In order to support the necessary character removing and redrawing the Apple2 mouse driver called the Apple2 mouse callbacks in an "unusual way". So far so (sort of) good. However the upcoming Atari mouse driver aims to support both "sprite-type" mouse callbacks as well as "text-char-type" mouse callbacks. Therefore the interface between mouse drivers and callbacks needs to be extended to allow the mouse callbacks to hide their different types from the mouse driver. The nature of this change can be seen best by looking at the Apple2 file modifications. The CBM drivers and callbacks (at least the current ones) don't benefit from this change.
This commit is contained in:
parent
b1c8f8e714
commit
4065cb1983
@ -78,6 +78,10 @@
|
||||
.byte
|
||||
CSHOW .addr
|
||||
.byte
|
||||
CDRAW .addr
|
||||
.byte
|
||||
CMOVE .addr
|
||||
.byte
|
||||
CMOVEX .addr
|
||||
.byte
|
||||
CMOVEY .addr
|
||||
@ -90,14 +94,16 @@
|
||||
.struct MOUSE_CALLBACKS
|
||||
HIDE .addr ; Hide the mouse cursor
|
||||
SHOW .addr ; Show the mouse cursor
|
||||
MOVEX .addr ; Move the mouse cursor
|
||||
MOVEY .addr ; Dito for Y
|
||||
DRAW .addr ; Draw the mouse cursor
|
||||
MOVE .addr ; Prepare to move the mouse cursor
|
||||
MOVEX .addr ; Move the mouse cursor to X coord
|
||||
MOVEY .addr ; Move the mouse cursor to Y coord
|
||||
.endstruct
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
; The mouse API version, stored in MOUSE_HDR::VERSION
|
||||
|
||||
MOUSE_API_VERSION = $04
|
||||
MOUSE_API_VERSION = $05
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
; Bitmapped mouse driver flags, stored in MOUSE_HDR::FLAGS.
|
||||
@ -169,12 +175,10 @@ MOUSE_BTN_RIGHT = $01
|
||||
.global mouse_uninstall
|
||||
.global mouse_hide
|
||||
.global mouse_show
|
||||
.global mouse_setbox
|
||||
.global mouse_setbox
|
||||
.global mouse_getbox
|
||||
.global mouse_move
|
||||
.global mouse_buttons
|
||||
.global mouse_pos
|
||||
.global mouse_info
|
||||
.global mouse_ioctl
|
||||
|
||||
|
||||
|
@ -16,6 +16,7 @@
|
||||
.bss
|
||||
|
||||
backup: .res 1
|
||||
visible:.res 1
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
|
||||
@ -25,6 +26,8 @@ backup: .res 1
|
||||
_mouse_def_callbacks:
|
||||
.addr hide
|
||||
.addr show
|
||||
.addr draw
|
||||
.addr move
|
||||
.addr movex
|
||||
.addr movey
|
||||
|
||||
@ -65,10 +68,15 @@ done:
|
||||
.ifdef __APPLE2ENH__
|
||||
bit LOWSCR ; Doesn't hurt in 40 column mode
|
||||
.endif
|
||||
rts
|
||||
return: rts
|
||||
|
||||
; Hide the mouse cursor.
|
||||
hide:
|
||||
dec visible
|
||||
; Fall through
|
||||
|
||||
; Prepare to move the mouse cursor.
|
||||
move:
|
||||
jsr getcursor ; Cursor visible at current position?
|
||||
bne done ; No, we're done
|
||||
lda backup ; Get character at cursor position
|
||||
@ -76,6 +84,13 @@ hide:
|
||||
|
||||
; Show the mouse cursor.
|
||||
show:
|
||||
inc visible
|
||||
; Fall through
|
||||
|
||||
; Draw the mouse cursor.
|
||||
draw:
|
||||
lda visible
|
||||
beq return
|
||||
jsr getcursor ; Cursor visible at current position?
|
||||
beq done ; Yes, we're done
|
||||
sta backup ; Save character at cursor position
|
||||
|
@ -57,6 +57,8 @@ status := $0778
|
||||
; Callback table, set by the kernel before INSTALL is called
|
||||
CHIDE: jmp $0000 ; Hide the cursor
|
||||
CSHOW: jmp $0000 ; Show the cursor
|
||||
CDRAW: jmp $0000 ; Draw the cursor
|
||||
CMOVE: jmp $0000 ; Prepare to move the cursor
|
||||
CMOVEX: jmp $0000 ; Move the cursor to X coord
|
||||
CMOVEY: jmp $0000 ; Move the cursor to Y coord
|
||||
|
||||
@ -67,7 +69,6 @@ CMOVEY: jmp $0000 ; Move the cursor to Y coord
|
||||
box: .tag MOUSE_BOX
|
||||
info: .tag MOUSE_INFO
|
||||
slot: .res 1
|
||||
visible:.res 1
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
|
||||
@ -321,7 +322,6 @@ MOVE:
|
||||
; no special action is required besides hiding the mouse cursor.
|
||||
; No return code required.
|
||||
HIDE:
|
||||
dec visible
|
||||
sei
|
||||
jsr CHIDE
|
||||
cli
|
||||
@ -333,7 +333,9 @@ HIDE:
|
||||
; no special action is required besides enabling the mouse cursor.
|
||||
; No return code required.
|
||||
SHOW:
|
||||
inc visible
|
||||
sei
|
||||
jsr CSHOW
|
||||
cli
|
||||
rts
|
||||
|
||||
; BUTTONS: Return the button mask in A/X.
|
||||
@ -409,7 +411,7 @@ done: rts
|
||||
beq :+
|
||||
|
||||
; Remove the cursor at the old position
|
||||
update: jsr CHIDE
|
||||
update: jsr CMOVE
|
||||
|
||||
; Get and set the new X position
|
||||
ldy slot
|
||||
@ -427,11 +429,7 @@ update: jsr CHIDE
|
||||
stx info + MOUSE_POS::YCOORD+1
|
||||
jsr CMOVEY
|
||||
|
||||
; Check for visibility
|
||||
: lda visible
|
||||
beq :+
|
||||
|
||||
; Draw the cursor at the new position
|
||||
jsr CSHOW
|
||||
: sec ; Interrupt handled
|
||||
: jsr CDRAW
|
||||
sec ; Interrupt handled
|
||||
rts
|
||||
|
@ -1,5 +1,5 @@
|
||||
;
|
||||
; Default mouse callbacks for the C64
|
||||
; Default mouse callbacks for the C128
|
||||
;
|
||||
; Ullrich von Bassewitz, 2004-03-20
|
||||
;
|
||||
@ -48,6 +48,24 @@ VIC_SPR_Y = (VIC_SPR0_Y + 2*MOUSE_SPR) ; Sprite Y register
|
||||
|
||||
.endproc
|
||||
|
||||
; --------------------------------------------------------------------------
|
||||
; Draw the mouse pointer. Always called with interrupts disabled.
|
||||
|
||||
.proc draw
|
||||
|
||||
rts
|
||||
|
||||
.endproc
|
||||
|
||||
; --------------------------------------------------------------------------
|
||||
; Prepare to move the mouse pointer. Always called with interrupts disabled.
|
||||
|
||||
.proc move
|
||||
|
||||
rts
|
||||
|
||||
.endproc
|
||||
|
||||
; --------------------------------------------------------------------------
|
||||
; Move the mouse pointer X position to the value in a/x. Always called with
|
||||
; interrupts disabled.
|
||||
@ -103,7 +121,7 @@ VIC_SPR_Y = (VIC_SPR0_Y + 2*MOUSE_SPR) ; Sprite Y register
|
||||
_mouse_def_callbacks:
|
||||
.addr hide
|
||||
.addr show
|
||||
.addr draw
|
||||
.addr move
|
||||
.addr movex
|
||||
.addr movey
|
||||
|
||||
|
||||
|
@ -50,6 +50,8 @@ HEADER:
|
||||
|
||||
CHIDE: jmp $0000 ; Hide the cursor
|
||||
CSHOW: jmp $0000 ; Show the cursor
|
||||
CDRAW: jmp $0000 ; Draw the cursor
|
||||
CMOVE: jmp $0000 ; Prepare to move the cursor
|
||||
CMOVEX: jmp $0000 ; Move the cursor to X coord
|
||||
CMOVEY: jmp $0000 ; Move the cursor to Y coord
|
||||
|
||||
@ -302,7 +304,8 @@ IOCTL: lda #<MOUSE_ERR_INV_IOCTL ; We don't support ioclts for now
|
||||
; MUST return carry clear.
|
||||
;
|
||||
|
||||
IRQ: lda SID_ADConv1 ; Get mouse X movement
|
||||
IRQ: jsr CMOVE
|
||||
lda SID_ADConv1 ; Get mouse X movement
|
||||
ldy OldPotX
|
||||
jsr MoveCheck ; Calculate movement vector
|
||||
sty OldPotX
|
||||
@ -389,8 +392,9 @@ IRQ: lda SID_ADConv1 ; Get mouse X movement
|
||||
|
||||
; Done
|
||||
|
||||
clc ; Interrupt not "handled"
|
||||
@SkipY: rts
|
||||
@SkipY: jsr CDRAW
|
||||
clc ; Interrupt not "handled"
|
||||
rts
|
||||
|
||||
; --------------------------------------------------------------------------
|
||||
;
|
||||
|
@ -49,6 +49,8 @@ LIBREF: .addr $0000
|
||||
|
||||
CHIDE: jmp $0000 ; Hide the cursor
|
||||
CSHOW: jmp $0000 ; Show the cursor
|
||||
CDRAW: jmp $0000 ; Draw the cursor
|
||||
CMOVE: jmp $0000 ; Prepare to move the cursor
|
||||
CMOVEX: jmp $0000 ; Move the cursor to X co-ord.
|
||||
CMOVEY: jmp $0000 ; Move the cursor to Y co-ord.
|
||||
|
||||
@ -343,7 +345,7 @@ IOCTL: lda #<MOUSE_ERR_INV_IOCTL ; We don't support ioctls, for now
|
||||
; MUST return carry clear.
|
||||
;
|
||||
|
||||
IRQ:
|
||||
IRQ: jsr CMOVE
|
||||
|
||||
; Record the state of the buttons.
|
||||
; Try to avoid crosstalk between the keyboard and the lightpen.
|
||||
@ -441,7 +443,8 @@ IRQ:
|
||||
|
||||
; Done
|
||||
|
||||
@SkipX: clc ; Interrupt not "handled"
|
||||
@SkipX: jsr CDRAW
|
||||
clc ; Interrupt not "handled"
|
||||
rts
|
||||
|
||||
; Move the lightpen pointer to the new Y pos.
|
||||
|
@ -49,6 +49,8 @@ HEADER:
|
||||
|
||||
CHIDE: jmp $0000 ; Hide the cursor
|
||||
CSHOW: jmp $0000 ; Show the cursor
|
||||
CDRAW: jmp $0000 ; Draw the cursor
|
||||
CMOVE: jmp $0000 ; Prepare to move the cursor
|
||||
CMOVEX: jmp $0000 ; Move the cursor to X coord
|
||||
CMOVEY: jmp $0000 ; Move the cursor to Y coord
|
||||
|
||||
@ -302,7 +304,8 @@ IOCTL: lda #<MOUSE_ERR_INV_IOCTL ; We don't support ioclts for now
|
||||
; MUST return carry clear.
|
||||
;
|
||||
|
||||
IRQ: lda #$7F
|
||||
IRQ: jsr CMOVE
|
||||
lda #$7F
|
||||
sta CIA1_PRA
|
||||
lda CIA1_PRB ; Read joystick #0
|
||||
and #$1F
|
||||
@ -415,6 +418,6 @@ IRQ: lda #$7F
|
||||
|
||||
; Done
|
||||
|
||||
@SkipY: clc ; Interrupt not "handled"
|
||||
@SkipY: jsr CDRAW
|
||||
clc ; Interrupt not "handled"
|
||||
rts
|
||||
|
||||
|
@ -46,6 +46,8 @@ HEADER:
|
||||
|
||||
CHIDE: jmp $0000 ; Hide the cursor
|
||||
CSHOW: jmp $0000 ; Show the cursor
|
||||
CDRAW: jmp $0000 ; Draw the cursor
|
||||
CMOVE: jmp $0000 ; Prepare to move the cursor
|
||||
CMOVEX: jmp $0000 ; Move the cursor to X coord
|
||||
CMOVEY: jmp $0000 ; Move the cursor to Y coord
|
||||
|
||||
@ -297,7 +299,8 @@ IOCTL: lda #<MOUSE_ERR_INV_IOCTL ; We don't support ioclts for now
|
||||
; (so be careful).
|
||||
;
|
||||
|
||||
IRQ: lda #$7F
|
||||
IRQ: jsr CMOVE
|
||||
lda #$7F
|
||||
sta CIA1_PRA
|
||||
lda CIA1_PRB ; Read port #1
|
||||
and #%00001100
|
||||
@ -392,4 +395,7 @@ IRQ: lda #$7F
|
||||
; Move the mouse pointer to the new X pos
|
||||
|
||||
tya
|
||||
jmp CMOVEY
|
||||
jsr CMOVEY
|
||||
jsr CDRAW
|
||||
clc ; Interrupt not "handled"
|
||||
rts
|
||||
|
@ -48,6 +48,24 @@ VIC_SPR_Y = (VIC_SPR0_Y + 2*MOUSE_SPR) ; Sprite Y register
|
||||
|
||||
.endproc
|
||||
|
||||
; --------------------------------------------------------------------------
|
||||
; Draw the mouse pointer. Always called with interrupts disabled.
|
||||
|
||||
.proc draw
|
||||
|
||||
rts
|
||||
|
||||
.endproc
|
||||
|
||||
; --------------------------------------------------------------------------
|
||||
; Prepare to move the mouse pointer. Always called with interrupts disabled.
|
||||
|
||||
.proc move
|
||||
|
||||
rts
|
||||
|
||||
.endproc
|
||||
|
||||
; --------------------------------------------------------------------------
|
||||
; Move the mouse pointer X position to the value in a/x. Always called with
|
||||
; interrupts disabled.
|
||||
@ -96,7 +114,7 @@ VIC_SPR_Y = (VIC_SPR0_Y + 2*MOUSE_SPR) ; Sprite Y register
|
||||
_mouse_def_callbacks:
|
||||
.addr hide
|
||||
.addr show
|
||||
.addr draw
|
||||
.addr move
|
||||
.addr movex
|
||||
.addr movey
|
||||
|
||||
|
||||
|
@ -69,6 +69,8 @@ HEADER:
|
||||
|
||||
CHIDE: jmp $0000 ; Hide the cursor
|
||||
CSHOW: jmp $0000 ; Show the cursor
|
||||
CDRAW: jmp $0000 ; Draw the cursor
|
||||
CMOVE: jmp $0000 ; Prepare to move the cursor
|
||||
CMOVEX: jmp $0000 ; Move the cursor to X coord
|
||||
CMOVEY: jmp $0000 ; Move the cursor to Y coord
|
||||
|
||||
@ -314,7 +316,7 @@ IOCTL: lda #<MOUSE_ERR_INV_IOCTL ; We don't support ioclts for now
|
||||
; MUST return carry clear.
|
||||
;
|
||||
|
||||
IRQ:
|
||||
IRQ: jsr CMOVE
|
||||
|
||||
; Record the state of the buttons.
|
||||
; Avoid crosstalk between the keyboard and the mouse.
|
||||
@ -417,8 +419,9 @@ IRQ:
|
||||
|
||||
; Done
|
||||
|
||||
@SkipY: jsr CDRAW
|
||||
clc ; Interrupt not "handled"
|
||||
@SkipY: rts
|
||||
rts
|
||||
|
||||
; --------------------------------------------------------------------------
|
||||
;
|
||||
|
@ -49,6 +49,8 @@ LIBREF: .addr $0000
|
||||
|
||||
CHIDE: jmp $0000 ; Hide the cursor
|
||||
CSHOW: jmp $0000 ; Show the cursor
|
||||
CDRAW: jmp $0000 ; Draw the cursor
|
||||
CMOVE: jmp $0000 ; Prepare to move the cursor
|
||||
CMOVEX: jmp $0000 ; Move the cursor to X co-ord.
|
||||
CMOVEY: jmp $0000 ; Move the cursor to Y co-ord.
|
||||
|
||||
@ -324,7 +326,7 @@ IOCTL: lda #<MOUSE_ERR_INV_IOCTL ; We don't support ioctls, for now
|
||||
; MUST return carry clear.
|
||||
;
|
||||
|
||||
IRQ:
|
||||
IRQ: jsr CMOVE
|
||||
|
||||
; Record the state of the buttons.
|
||||
; Try to avoid crosstalk between the keyboard and the lightpen.
|
||||
@ -422,7 +424,8 @@ IRQ:
|
||||
|
||||
; Done
|
||||
|
||||
@SkipX: clc ; Interrupt not "handled"
|
||||
@SkipX: jsr CDRAW
|
||||
clc ; Interrupt not "handled"
|
||||
rts
|
||||
|
||||
; Move the lightpen pointer to the new Y pos.
|
||||
|
@ -68,6 +68,8 @@ HEADER:
|
||||
|
||||
CHIDE: jmp $0000 ; Hide the cursor
|
||||
CSHOW: jmp $0000 ; Show the cursor
|
||||
CDRAW: jmp $0000 ; Draw the cursor
|
||||
CMOVE: jmp $0000 ; Prepare to move the cursor
|
||||
CMOVEX: jmp $0000 ; Move the cursor to X coord
|
||||
CMOVEY: jmp $0000 ; Move the cursor to Y coord
|
||||
|
||||
@ -319,9 +321,11 @@ IOCTL: lda #<MOUSE_ERR_INV_IOCTL ; We don't support ioclts for now
|
||||
; MUST return carry clear.
|
||||
;
|
||||
|
||||
IRQ: jsr CMOVE
|
||||
|
||||
; Avoid crosstalk between the keyboard and a joystick.
|
||||
|
||||
IRQ: ldy #%00000000 ; Set ports A and B to input
|
||||
ldy #%00000000 ; Set ports A and B to input
|
||||
sty CIA1_DDRB
|
||||
sty CIA1_DDRA ; Keyboard won't look like joystick
|
||||
lda CIA1_PRB ; Read Control-Port 1
|
||||
@ -438,6 +442,7 @@ IRQ: ldy #%00000000 ; Set ports A and B to input
|
||||
|
||||
; Done
|
||||
|
||||
@SkipY: clc ; Interrupt not handled
|
||||
@SkipY: jsr CDRAW
|
||||
clc ; Interrupt not "handled"
|
||||
rts
|
||||
|
||||
|
@ -46,6 +46,8 @@ HEADER:
|
||||
|
||||
CHIDE: jmp $0000 ; Hide the cursor
|
||||
CSHOW: jmp $0000 ; Show the cursor
|
||||
CDRAW: jmp $0000 ; Draw the cursor
|
||||
CMOVE: jmp $0000 ; Prepare to move the cursor
|
||||
CMOVEX: jmp $0000 ; Move the cursor to X coord
|
||||
CMOVEY: jmp $0000 ; Move the cursor to Y coord
|
||||
|
||||
@ -297,7 +299,8 @@ IOCTL: lda #<MOUSE_ERR_INV_IOCTL ; We don't support ioclts for now
|
||||
; (so be careful).
|
||||
;
|
||||
|
||||
IRQ: lda #$7F
|
||||
IRQ: jsr CMOVE
|
||||
lda #$7F
|
||||
sta CIA1_PRA
|
||||
lda CIA1_PRB ; Read port #1
|
||||
and #%00001100
|
||||
@ -392,4 +395,7 @@ IRQ: lda #$7F
|
||||
; Move the mouse pointer to the new X pos
|
||||
|
||||
tya
|
||||
jmp CMOVEY
|
||||
jsr CMOVEY
|
||||
jsr CDRAW
|
||||
clc ; Interrupt not "handled"
|
||||
rts
|
||||
|
@ -62,6 +62,24 @@ VIC_SPR_Y = (VIC_SPR0_Y + 2*MOUSE_SPR) ; Sprite Y register
|
||||
|
||||
.endproc
|
||||
|
||||
; --------------------------------------------------------------------------
|
||||
; Draw the mouse pointer. Always called with interrupts disabled.
|
||||
|
||||
.proc draw
|
||||
|
||||
rts
|
||||
|
||||
.endproc
|
||||
|
||||
; --------------------------------------------------------------------------
|
||||
; Prepare to move the mouse pointer. Always called with interrupts disabled.
|
||||
|
||||
.proc move
|
||||
|
||||
rts
|
||||
|
||||
.endproc
|
||||
|
||||
; --------------------------------------------------------------------------
|
||||
; Move the mouse pointer x position to the value in .XA. Always called with
|
||||
; interrupts disabled.
|
||||
@ -125,7 +143,7 @@ VIC_SPR_Y = (VIC_SPR0_Y + 2*MOUSE_SPR) ; Sprite Y register
|
||||
_mouse_def_callbacks:
|
||||
.addr hide
|
||||
.addr show
|
||||
.addr draw
|
||||
.addr move
|
||||
.addr movex
|
||||
.addr movey
|
||||
|
||||
|
||||
|
@ -53,6 +53,8 @@ LIBREF: .addr $0000
|
||||
|
||||
CHIDE: jmp $0000 ; Hide the cursor
|
||||
CSHOW: jmp $0000 ; Show the cursor
|
||||
CDRAW: jmp $0000 ; Draw the cursor
|
||||
CMOVE: jmp $0000 ; Prepare to move the cursor
|
||||
CMOVEX: jmp $0000 ; Move the cursor to X co-ord.
|
||||
CMOVEY: jmp $0000 ; Move the cursor to Y co-ord.
|
||||
|
||||
@ -336,7 +338,8 @@ IOCTL: lda #<MOUSE_ERR_INV_IOCTL ; We don't support ioctls, for now
|
||||
; MUST return carry clear.
|
||||
;
|
||||
|
||||
IRQ: ldx #15 ; To system bank
|
||||
IRQ: jsr CMOVE
|
||||
ldx #15 ; To system bank
|
||||
stx IndReg
|
||||
|
||||
; Read the VIC-II lightpen registers.
|
||||
@ -428,7 +431,8 @@ IRQ: ldx #15 ; To system bank
|
||||
|
||||
; Done
|
||||
|
||||
@SkipX: clc ; Interrupt not "handled"
|
||||
@SkipX: jsr CDRAW
|
||||
clc ; Interrupt not "handled"
|
||||
rts
|
||||
|
||||
; Move the lightpen pointer to the new Y pos.
|
||||
|
@ -52,6 +52,8 @@ HEADER:
|
||||
|
||||
CHIDE: jmp $0000 ; Hide the cursor
|
||||
CSHOW: jmp $0000 ; Show the cursor
|
||||
CDRAW: jmp $0000 ; Draw the cursor
|
||||
CMOVE: jmp $0000 ; Prepare to move the cursor
|
||||
CMOVEX: jmp $0000 ; Move the cursor to x co-ord.
|
||||
CMOVEY: jmp $0000 ; Move the cursor to y co-ord.
|
||||
|
||||
@ -323,7 +325,8 @@ IOCTL: lda #<MOUSE_ERR_INV_IOCTL ; We don't support ioctls, for now
|
||||
; Reads joystick 2.
|
||||
;
|
||||
|
||||
IRQ: ldy #15 ; Switch to the system bank
|
||||
IRQ: jsr CMOVE
|
||||
ldy #15 ; Switch to the system bank
|
||||
sty IndReg
|
||||
|
||||
; Get the direction bits.
|
||||
@ -430,7 +433,8 @@ IRQ: ldy #15 ; Switch to the system bank
|
||||
|
||||
; Done
|
||||
|
||||
@SkipY: clc ; Interrupt not handled
|
||||
@SkipY: jsr CDRAW
|
||||
clc ; Interrupt not "handled"
|
||||
rts
|
||||
|
||||
; Move the mouse pointer to the new x pos.
|
||||
|
Loading…
Reference in New Issue
Block a user