]> git.sur5r.net Git - cc65/commitdiff
Changed the mouse API: Introduced a new flag byte that contains information
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sun, 21 May 2006 11:25:31 +0000 (11:25 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sun, 21 May 2006 11:25:31 +0000 (11:25 +0000)
about the driver, the mouse kernel needs to know. Current supported: Two flags
to enable interrupts before or after calling the driver INSTALL routine.

git-svn-id: svn://svn.cc65.org/cc65/trunk@3741 b7a2c559-68d2-44c3-8de9-860c34a00d81

asminc/mouse-kernel.inc
libsrc/apple2/apple2-stdmou.s
libsrc/c128/c128-1351.s
libsrc/c128/c128-joymouse.s
libsrc/c64/c64-1351.s
libsrc/c64/c64-joymouse.s
libsrc/mouse/mouse-kernel.s

index b367ac4b4733f7b8e30575c84793267352160666..a736b0101876b479a240f95b2998379822806f3b 100644 (file)
@@ -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
 ;------------------------------------------------------------------------------
 ; 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
index f8a04c9e19c2063ae93f8b0745fa14429d58391e..e07246fec014bc298d171c6ae4399279aec6eb59 100644 (file)
@@ -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
        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
@@ -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
index ae8f01f040b693f7068a17b6b7bcde06c1df3313..1efbf7a01307e6a56be1044c449f6a6b563ff3fe 100644 (file)
@@ -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
index 9fad2cf6faab5605e2eb1834ed575392a35a3fdf..e1263ec77dd34576c00dede887d7101c2c1d1257 100644 (file)
@@ -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
index bc849acab8837e90511d0c893a383e50c507ecc9..132b69f9f3a3225c38aa996fcf289bccb720e1cf 100644 (file)
@@ -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
 
index fe8bfe24923dc21a1a25966496b182d48fac0f7a..44844fe6c6e2c1e3874f8f4d0d3fc37d92e29362 100644 (file)
@@ -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
index d568984a89be4d3250428e1e10dc4052e2211151..9a1fdf1f191e22e256c14fcbdfca551a3e9cf154 100644 (file)
@@ -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
+
+; 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.
 
-; Uninstall IRQ vector if install routine had errors. A/X contains the error
-; code from mouse_install, so don't use it.
+        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