.include "zeropage.inc"
.include "mouse-kernel.inc"
+ .include "apple2.inc"
; ------------------------------------------------------------------------
.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
+ sei
sta slot
; Convert to and patch I/O register index
asl
asl
sta yparam+1
-
- ; Apple II Mouse TechNote #1, Interrupt Environment with the Mouse:
- ; "Disable interrupts when calling any mouse routine."
- sei
+
+ ; The AppleMouse II Card needs the ROM switched in
+ ; to be able to detect an Apple //e and use RDVBL
+ bit $C082
; Reset mouse hardware
ldx #INITMOUSE
jsr firmware
+
+ ; Switch in LC bank 2 for R/O
+ bit $C080
; Turn mouse on
lda #%00000001
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
; was handled, otherwise with carry clear.
IRQ:
+ ; Check for installed mouse
+ lda slot
+ beq done
+
; Check for mouse interrupt
ldx #SERVEMOUSE
jsr firmware
bcc :+
clc ; Interrupt not handled
- rts
+done: rts
: ldx #READMOUSE
jsr firmware
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