diff --git a/asminc/mouse-kernel.inc b/asminc/mouse-kernel.inc index b367ac4b4..a736b0101 100644 --- a/asminc/mouse-kernel.inc +++ b/asminc/mouse-kernel.inc @@ -2,11 +2,11 @@ ;/* */ ;/* mouse-kernel.inc */ ;/* */ -;/* Mouse API */ +;/* Mouse API */ ;/* */ ;/* */ ;/* */ -;/* (C) 2003-2004 Ullrich von Bassewitz */ +;/* (C) 2003-2006 Ullrich von Bassewitz */ ;/* Römerstraße 52 */ ;/* D-70794 Filderstadt */ ;/* EMail: uz@cc65.org */ @@ -69,6 +69,7 @@ IOCTL .addr IRQ .addr .endstruct + FLAGS .byte ; Mouse driver flags CALLBACKS .struct ; Jump instructions .byte ; JMP opcode CHIDE .addr ; Jump address @@ -94,7 +95,16 @@ ;------------------------------------------------------------------------------ ; The mouse API version, stored in MOUSE_HDR::VERSION -MOUSE_API_VERSION = $00 +MOUSE_API_VERSION = $01 + +;------------------------------------------------------------------------------ +; Bitmapped mouse driver flags, stored in MOUSE_HDR::FLAGS. +; Note: If neither of MOUSE_FLAG_XXX_IRQ is set, no interrupts are supplied +; to the driver. If one of the bits is set, the interrupt vector MUST be +; valid. + +MOUSE_FLAG_EARLY_IRQ = $40 ; Enable IRQ *before* calling INSTALL +MOUSE_FLAG_LATE_IRQ = $80 ; Enable IRQ *after* calling INSTALL ;------------------------------------------------------------------------------ ; Mouse button definitions diff --git a/libsrc/apple2/apple2-stdmou.s b/libsrc/apple2/apple2-stdmou.s index f8a04c9e1..e07246fec 100644 --- a/libsrc/apple2/apple2-stdmou.s +++ b/libsrc/apple2/apple2-stdmou.s @@ -46,6 +46,9 @@ status := $0778 .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 @@ -55,10 +58,10 @@ CMOVEY: jmp $0000 ; Move the cursor to Y coord ; ------------------------------------------------------------------------ .bss - + slot: .res 1 visible:.res 1 - + ; ------------------------------------------------------------------------ .rodata @@ -78,7 +81,7 @@ size = * - values ; ------------------------------------------------------------------------ .data - + info: .word 279 / 2 ; MOUSE_INFO::MOUSE_POS::XCOORD .word 191 / 2 ; MOUSE_INFO::MOUSE_POS::YCOORD .byte %00000000 ; MOUSE_INFO::BUTTONS @@ -95,7 +98,7 @@ xparam: ldx #$FF ; Patched at runtime yparam: ldy #$FF ; Patched at runtime jump: jmp $FFFF ; Patched at runtime - + ; ------------------------------------------------------------------------ .code @@ -127,13 +130,13 @@ next: inc ptr1+1 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 @@ -158,7 +161,7 @@ next: inc ptr1+1 ldx #SETMOUSE jsr firmware - ; Set initial mouse clamps + ; Set initial mouse clamps lda #<279 ldx #>279 sta pos2_lo @@ -206,7 +209,7 @@ UNINSTALL: ; Hide cursor sei jsr CHIDE - + ; Turn mouse off lda #%00000000 ldx #SETMOUSE @@ -252,7 +255,7 @@ BOX: 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 @@ -307,7 +310,7 @@ MOVE: ; Update cursor jsr update - + ldx #POSMOUSE bne common ; Branch always @@ -345,7 +348,7 @@ IOCTL: lda #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 @@ -365,7 +368,7 @@ IRQ: 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 @@ -376,7 +379,7 @@ IRQ: : 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 @@ -384,7 +387,7 @@ IRQ: ; Remove the cursor at the old position update: jsr CHIDE - + ; Get and set the new X position ldy slot lda pos1_lo,y @@ -392,7 +395,7 @@ update: jsr CHIDE 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 diff --git a/libsrc/c128/c128-1351.s b/libsrc/c128/c128-1351.s index ae8f01f04..1efbf7a01 100644 --- a/libsrc/c128/c128-1351.s +++ b/libsrc/c128/c128-1351.s @@ -37,6 +37,10 @@ HEADER: .addr IOCTL .addr IRQ +; Mouse driver flags + + .byte MOUSE_FLAG_LATE_IRQ + ; Callback table, set by the kernel before INSTALL is called CHIDE: jmp $0000 ; Hide the cursor diff --git a/libsrc/c128/c128-joymouse.s b/libsrc/c128/c128-joymouse.s index 9fad2cf6f..e1263ec77 100644 --- a/libsrc/c128/c128-joymouse.s +++ b/libsrc/c128/c128-joymouse.s @@ -36,6 +36,10 @@ HEADER: .addr IOCTL .addr IRQ +; Mouse driver flags + + .byte MOUSE_FLAG_LATE_IRQ + ; Callback table, set by the kernel before INSTALL is called CHIDE: jmp $0000 ; Hide the cursor diff --git a/libsrc/c64/c64-1351.s b/libsrc/c64/c64-1351.s index bc849acab..132b69f9f 100644 --- a/libsrc/c64/c64-1351.s +++ b/libsrc/c64/c64-1351.s @@ -37,6 +37,10 @@ HEADER: .addr IOCTL .addr IRQ +; Mouse driver flags + + .byte MOUSE_FLAG_LATE_IRQ + ; Callback table, set by the kernel before INSTALL is called CHIDE: jmp $0000 ; Hide the cursor @@ -357,7 +361,7 @@ IRQ: lda SID_ADConv1 ; Get mouse X movement ; Move the mouse pointer to the new X pos tya - jsr CMOVEY + jsr CMOVEY ; Done diff --git a/libsrc/c64/c64-joymouse.s b/libsrc/c64/c64-joymouse.s index fe8bfe249..44844fe6c 100644 --- a/libsrc/c64/c64-joymouse.s +++ b/libsrc/c64/c64-joymouse.s @@ -36,6 +36,10 @@ HEADER: .addr IOCTL .addr IRQ +; Mouse driver flags + + .byte MOUSE_FLAG_LATE_IRQ + ; Callback table, set by the kernel before INSTALL is called CHIDE: jmp $0000 ; Hide the cursor diff --git a/libsrc/mouse/mouse-kernel.s b/libsrc/mouse/mouse-kernel.s index d568984a8..9a1fdf1f1 100644 --- a/libsrc/mouse/mouse-kernel.s +++ b/libsrc/mouse/mouse-kernel.s @@ -35,6 +35,7 @@ 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 @@ -77,6 +78,12 @@ _mouse_install: 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 @@ -94,23 +101,34 @@ _mouse_install: ; Install the IRQ vector if the driver needs it - lda mouse_irq+2 ; Check high byte of IRQ vector - beq @L3 ; Jump if vector invalid - lda #$4C ; Jump opcode - sta mouse_irq ; Activate IRQ routine + bit mouse_flags ; Test MOUSE_FLAG_EARLY_IRQ + bvc @L3 ; Jump if no interrupts at this time + jsr install_irq ; Activate IRQ routine ; Call driver install routine and check for errors @L3: jsr mouse_install tay ; Test error code - beq @L4 ; Jump if no error + bne uninstall_irq ; Jump on error -; Uninstall IRQ vector if install routine had errors. A/X contains the error -; code from mouse_install, so don't use it. +; 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 +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 -@L4: rts + rts ; Driver signature invalid. One word is still on the stack @@ -141,9 +159,7 @@ copycb: lda (sreg),y ; /* Uninstall the currently loaded driver. Returns an error code. */ _mouse_uninstall: - lda #$60 ; RTS opcode - sta mouse_irq ; Disable IRQ entry point - + jsr uninstall_irq ; Disable driver interrupts jsr mouse_uninstall ; Call driver routine mouse_clear_ptr: ; External entry point