;
-; Ullrich von Bassewitz, 2003-12-28
+; Ullrich von Bassewitz, 2003-12-28, 2009-09-26
;
; Common functions of the mouse driver API.
;
mouse_uninstall:jmp return0
mouse_hide: jmp return0
mouse_show: jmp return0
-mouse_box: jmp return0
+mouse_setbox: jmp return0
+mouse_getbox: jmp return0
mouse_move: jmp return0
mouse_buttons: jmp return0
mouse_pos: jmp return0
mouse_info: jmp return0
mouse_ioctl: jmp return0
mouse_irq: .byte $60, $00, $00 ; RTS plus two dummy bytes
+mouse_flags: .byte $00
; Driver header signature
.rodata
mouse_sig: .byte $6d, $6f, $75, MOUSE_API_VERSION ; "mou", version
+.code
;----------------------------------------------------------------------------
; unsigned char __fastcall__ mouse_install (const struct mouse_callbacks* c,
; void* driver);
cpy #(MOUSE_HDR::JUMPTAB + .sizeof(MOUSE_HDR::JUMPTAB))
bne @L1
+; Copy the flags byte. It is located directly behind the jump vectors, so Y
+; is already correct when we come here. To save code, we use copyjv - crude
+; but effective.
+
+ jsr copyjv
+
; Copy the callback vectors into the driver space
jsr popsreg
ldy tmp1
bpl @L2
-; Call driver install routine
+; Install the IRQ vector if the driver needs it
+
+ bit mouse_flags ; Test MOUSE_FLAG_EARLY_IRQ
+ bvc @L3 ; Jump if no interrupts at this time
+ jsr install_irq ; Activate IRQ routine
- jsr mouse_install
+; Call driver install routine and check for errors
-; Install the IRQ vector if the driver needs it. A/X contains the error code
-; from mouse_install, so don't use it.
+@L3: jsr mouse_install
+ tay ; Test error code
+ bne uninstall_irq ; Jump on error
- ldy mouse_irq+2 ; Check high byte of IRQ vector
- beq @L3 ; Jump if vector invalid
- ldy #$4C ; Jump opcode
+; No errors on INSTALL. If the driver needs late IRQs, enable them now. Be
+; careful not to use A/X since these registers contain the error code from
+; INSTALL.
+
+ bit mouse_flags ; Test MOUSE_FLAG_LATE_IRQ
+ bpl Exit ; Jump if vector not needed
+install_irq:
+ ldy #$4C ; Jump opcode
sty mouse_irq ; Activate IRQ routine
-@L3: rts
+Exit: rts
+
+; Uninstall IRQ vector if install routine had errors. A/X may contain the
+; error code from mouse_install, so don't use it.
+
+uninstall_irq:
+ ldy #$60 ; RTS opcode
+ sty mouse_irq ; Disable IRQ entry point
+ rts
; Driver signature invalid. One word is still on the stack
; /* Uninstall the currently loaded driver. Returns an error code. */
_mouse_uninstall:
- lda #$60 ; RTS opcode
- sta mouse_irq ; Disable IRQ entry point
- jsr mouse_uninstall ; Call driver routine
+; Depending on the late/early IRQ flag, we will disable IRQs before or after
+; calling the driver mouse_uninstall routine.
+
+ bit mouse_flags ; Test MOUSE_FLAG_LATE_IRQ
+ bpl @L1 ; Don't disable interrupts now
+ jsr uninstall_irq ; Disable driver interrupts
+@L1: jsr mouse_uninstall ; Call driver routine
+
+; We don't check the flag a second time here, since disabling IRQs twice,
+; or disabling them if they weren't enabled will do no harm, and the missing
+; check will save a few bytes.
-mouse_clear_ptr: ; External entry point
+ jsr uninstall_irq ; Disable driver interrupts
+
+_mouse_clear_ptr: ; External entry point
lda #0
sta _mouse_drv
sta _mouse_drv+1 ; Clear the driver pointer
tax
rts ; Return zero
+