X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libsrc%2Fmouse%2Fmouse-kernel.s;h=b8d1db185eecf6f20f686281e8d5948579c2b142;hb=9c177602277c9fdf515a29931089738cc70700ee;hp=85acdfbf8b01c78a51e7ffc98cab9ca7cc253407;hpb=f0250724a1c38c997c595cec3d3c3be02bfb5b54;p=cc65 diff --git a/libsrc/mouse/mouse-kernel.s b/libsrc/mouse/mouse-kernel.s index 85acdfbf8..b8d1db185 100644 --- a/libsrc/mouse/mouse-kernel.s +++ b/libsrc/mouse/mouse-kernel.s @@ -1,12 +1,12 @@ ; -; Ullrich von Bassewitz, 2003-12-28 +; Ullrich von Bassewitz, 2003-12-28, 2009-09-26 ; ; Common functions of the mouse driver API. ; - .import return0 - .importzp ptr1 - .condes mouse_irq, 2 ; Export as IRQ handler + .import return0, popsreg, incsp2 + .importzp sreg, ptr1, tmp1, tmp2 + .interruptor mouse_irq ; Export as IRQ handler .include "mouse-kernel.inc" @@ -28,29 +28,31 @@ mouse_install: jmp return0 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 (void* driver); +; unsigned char __fastcall__ mouse_install (const struct mouse_callbacks* c, +; void* driver); ; /* Install an already loaded driver. Returns an error code. */ - - _mouse_install: sta _mouse_drv sta ptr1 - stx _mouse_drv+1 + stx _mouse_drv+1 stx ptr1+1 ; Check the driver signature @@ -72,45 +74,108 @@ _mouse_install: ldy #MOUSE_HDR::JUMPTAB ldx #0 @L1: inx ; Skip the JMP opcode - jsr copy ; Copy one byte - jsr copy ; Copy one byte + jsr copyjv ; Copy one byte + jsr copyjv ; Copy one byte cpy #(MOUSE_HDR::JUMPTAB + .sizeof(MOUSE_HDR::JUMPTAB)) bne @L1 - jsr mouse_install ; Call driver install routine +; 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 #(MOUSE_HDR::CALLBACKS + .sizeof(MOUSE_HDR::CALLBACKS) - 1) + sty tmp2 + ldy #.sizeof(MOUSE_CALLBACKS)-1 + sty tmp1 + +@L2: jsr copycb + ldy tmp1 + jsr copycb + dec tmp2 ; Skip opcode byte + ldy tmp1 + bpl @L2 + +; 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 + +; Call driver install routine and check for errors + +@L3: jsr mouse_install + tay ; Test error code + bne uninstall_irq ; Jump on error + +; 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. - ldy mouse_irq+2 ; Check high byte of IRQ vector - beq @L2 ; Jump if vector invalid - ldy #$4C ; Jump opcode + 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 -@L2: rts +Exit: rts -; Driver signature invalid +; 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 inv_drv: lda #MOUSE_ERR_INV_DRIVER ldx #0 - rts + jmp incsp2 ; Copy one byte from the jump vectors -copy: lda (ptr1),y +copyjv: lda (ptr1),y sta mouse_vectors,x iny inx rts +; Copy one byte from the callback vectors + +copycb: lda (sreg),y + dec tmp1 + ldy tmp2 + sta (ptr1),y + dec tmp2 + rts + ;---------------------------------------------------------------------------- ; unsigned char __fastcall__ mouse_uninstall (void); ; /* Uninstall the currently loaded driver. Returns an error code. */ _mouse_uninstall: - jsr mouse_uninstall ; Call driver routine - lda #$60 ; RTS opcode - sta mouse_irq ; Disable IRQ entry point +; 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 @@ -118,3 +183,4 @@ mouse_clear_ptr: ; External entry point tax rts ; Return zero +