.addr IOCTL
.addr IRQ
+ ; Mouse driver flags
+ .byte MOUSE_FLAG_EARLY_IRQ
+
; Callback table, set by the kernel before INSTALL is called
CHIDE: jmp $0000 ; Hide the cursor
CSHOW: jmp $0000 ; Show the cursor
; ------------------------------------------------------------------------
.bss
-
+
+info: .tag MOUSE_INFO
slot: .res 1
visible:.res 1
-
+
; ------------------------------------------------------------------------
.rodata
; ------------------------------------------------------------------------
.data
-
-info: .word 279 / 2 ; MOUSE_INFO::MOUSE_POS::XCOORD
- .word 191 / 2 ; MOUSE_INFO::MOUSE_POS::YCOORD
- .byte %00000000 ; MOUSE_INFO::BUTTONS
firmware:
; Lookup and patch firmware address lobyte
yparam: ldy #$FF ; Patched at runtime
jump: jmp $FFFF ; Patched at runtime
-
+
; ------------------------------------------------------------------------
.code
bne next
dex
bpl :-
-
+
; Get and patch firmware address hibyte
lda ptr1+1
sta lookup+2
sta xparam+1
sta jump+2
-
+
; Convert to and save slot number
and #$0F
sta slot
ldx #SETMOUSE
jsr firmware
- ; Set initial mouse clamps
+ ; Set initial mouse clamps
lda #<279
ldx #>279
sta pos2_lo
ldx #POSMOUSE
jsr firmware
+ ; Update cursor
+ jsr update
+
; Turn VBL interrupt on
lda #%00001001
ldx #SETMOUSE
; Hide cursor
sei
jsr CHIDE
-
+
; Turn mouse off
lda #%00000000
ldx #SETMOUSE
ldx #$01 ; Set y clamps
ldy #$00 ; Start at top of stack
jsr :+
-
+
ldx #$00 ; Set x clamps
ldy #$00 ; Start at top of stack
; Update cursor
jsr update
-
+
ldx #POSMOUSE
bne common ; Branch always
lda #<MOUSE_ERR_INV_IOCTL
ldx #>MOUSE_ERR_INV_IOCTL
rts
-
+
; IRQ: Called from the builtin runtime IRQ handler as a subroutine. All
; registers are already saved, no parameters are passed, but the carry flag
; is clear on entry. The routine must return with carry set if the interrupt
ldy slot
lda status,y
tax ; Save status
-
+
; Extract button down values
asl ; C = Button 0 is currently down
and #%00100000 ; !Z = Button 1 is currently down
: bcc :+
ora #MOUSE_BTN_LEFT
: sta info + MOUSE_INFO::BUTTONS
-
+
; Check for mouse movement
txa ; Restore status
and #%00100000 ; X or Y changed since last READMOUSE
; Remove the cursor at the old position
update: jsr CHIDE
-
+
; Get and set the new X position
ldy slot
lda pos1_lo,y
sta info + MOUSE_POS::XCOORD
stx info + MOUSE_POS::XCOORD+1
jsr CMOVEX
-
+
; Get and set the new Y position
ldy slot
lda pos2_lo,y