]> git.sur5r.net Git - cc65/commitdiff
Harmonized interface between mouse drivers and callbacks.
authorOliver Schmidt <ol.sc@web.de>
Wed, 15 Jan 2014 21:47:59 +0000 (22:47 +0100)
committerOliver Schmidt <ol.sc@web.de>
Wed, 15 Jan 2014 21:47:59 +0000 (22:47 +0100)
The Apple2 doesn't have sprites so the Apple2 mouse callbacks place a special character on the text screen to indicate the mouse position. In order to support the necessary character removing and redrawing the Apple2 mouse driver called the Apple2 mouse callbacks in an "unusual way". So far so (sort of) good.

However the upcoming Atari mouse driver aims to support both "sprite-type" mouse callbacks as well as "text-char-type" mouse callbacks. Therefore the interface between mouse drivers and callbacks needs to be extended to allow the mouse callbacks to hide their different types from the mouse driver.

The nature of this change can be seen best by looking at the Apple2 file modifications. The CBM drivers and callbacks (at least the current ones) don't benefit from this change.

16 files changed:
asminc/mouse-kernel.inc
libsrc/apple2/mcbdefault.s
libsrc/apple2/mou/a2.stdmou.s
libsrc/c128/mcbdefault.s
libsrc/c128/mou/c128-1351.s
libsrc/c128/mou/c128-inkwell.s
libsrc/c128/mou/c128-joy.s
libsrc/c128/mou/c128-pot.s
libsrc/c64/mcbdefault.s
libsrc/c64/mou/c64-1351.s
libsrc/c64/mou/c64-inkwell.s
libsrc/c64/mou/c64-joy.s
libsrc/c64/mou/c64-pot.s
libsrc/cbm510/mcbdefault.s
libsrc/cbm510/mou/cbm510-inkwl.s
libsrc/cbm510/mou/cbm510-joy.s

index d3ec9b30fecdf15cc76fa530ebb1a7fcc295b5ad..4ad9a733e0b9c8394699ef032e78c2a664e767cd 100644 (file)
                         .byte
             CSHOW       .addr
                         .byte
+            CDRAW       .addr
+                        .byte
+            CMOVE       .addr
+                        .byte
             CMOVEX      .addr
                         .byte
             CMOVEY      .addr
 .struct MOUSE_CALLBACKS
         HIDE    .addr                   ; Hide the mouse cursor
         SHOW    .addr                   ; Show the mouse cursor
-        MOVEX   .addr                   ; Move the mouse cursor
-        MOVEY   .addr                   ; Dito for Y
+        DRAW    .addr                   ; Draw the mouse cursor
+        MOVE    .addr                   ; Prepare to move the mouse cursor
+        MOVEX   .addr                   ; Move the mouse cursor to X coord
+        MOVEY   .addr                   ; Move the mouse cursor to Y coord
 .endstruct
 
 ;------------------------------------------------------------------------------
 ; The mouse API version, stored in MOUSE_HDR::VERSION
 
-MOUSE_API_VERSION       = $04
+MOUSE_API_VERSION       = $05
 
 ;------------------------------------------------------------------------------
 ; Bitmapped mouse driver flags, stored in MOUSE_HDR::FLAGS.
@@ -169,12 +175,10 @@ MOUSE_BTN_RIGHT         = $01
         .global mouse_uninstall
         .global mouse_hide
         .global mouse_show
-        .global mouse_setbox                     
+        .global mouse_setbox
         .global mouse_getbox
         .global mouse_move
         .global mouse_buttons
         .global mouse_pos
         .global mouse_info
         .global mouse_ioctl
-
-
index 2ade00aefdc90066f7b7dbcf3a8dd1d699e2dba9..892e387e03bd919c5a53cb18bf6edaf7dba0da8f 100644 (file)
@@ -16,6 +16,7 @@
         .bss
         
 backup: .res    1
+visible:.res    1
 
 ; ------------------------------------------------------------------------
 
@@ -25,6 +26,8 @@ backup: .res    1
 _mouse_def_callbacks:
         .addr   hide
         .addr   show
+        .addr   draw
+        .addr   move
         .addr   movex
         .addr   movey
 
@@ -65,10 +68,15 @@ done:
         .ifdef  __APPLE2ENH__
         bit     LOWSCR          ; Doesn't hurt in 40 column mode
         .endif
-        rts
+return: rts
 
 ; Hide the mouse cursor.
 hide:
+        dec     visible
+        ; Fall through
+
+; Prepare to move the mouse cursor.
+move:
         jsr     getcursor       ; Cursor visible at current position?
         bne     done            ; No, we're done
         lda     backup          ; Get character at cursor position
@@ -76,6 +84,13 @@ hide:
 
 ; Show the mouse cursor.
 show:
+        inc     visible
+        ; Fall through
+
+; Draw the mouse cursor.
+draw:
+        lda     visible
+        beq     return
         jsr     getcursor       ; Cursor visible at current position?
         beq     done            ; Yes, we're done
         sta     backup          ; Save character at cursor position
index 8414cde36aeba2882484accad8d29e763b6f6300..ecfb7da58e88b6689ca851dec3eac465a2f06f4b 100644 (file)
@@ -57,6 +57,8 @@ status          := $0778
         ; Callback table, set by the kernel before INSTALL is called
 CHIDE:  jmp     $0000                   ; Hide the cursor
 CSHOW:  jmp     $0000                   ; Show the cursor
+CDRAW:  jmp     $0000                   ; Draw the cursor
+CMOVE:  jmp     $0000                   ; Prepare to move the cursor
 CMOVEX: jmp     $0000                   ; Move the cursor to X coord
 CMOVEY: jmp     $0000                   ; Move the cursor to Y coord
 
@@ -67,7 +69,6 @@ CMOVEY: jmp     $0000                   ; Move the cursor to Y coord
 box:    .tag    MOUSE_BOX
 info:   .tag    MOUSE_INFO
 slot:   .res    1
-visible:.res    1
 
 ; ------------------------------------------------------------------------
 
@@ -321,7 +322,6 @@ MOVE:
 ; no special action is required besides hiding the mouse cursor.
 ; No return code required.
 HIDE:
-        dec     visible
         sei
         jsr     CHIDE
         cli
@@ -333,7 +333,9 @@ HIDE:
 ; no special action is required besides enabling the mouse cursor.
 ; No return code required.
 SHOW:
-        inc     visible
+        sei
+        jsr     CSHOW
+        cli
         rts
 
 ; BUTTONS: Return the button mask in A/X.
@@ -409,7 +411,7 @@ done:   rts
         beq     :+
 
         ; Remove the cursor at the old position
-update: jsr     CHIDE
+update: jsr     CMOVE
 
         ; Get and set the new X position
         ldy     slot
@@ -427,11 +429,7 @@ update: jsr     CHIDE
         stx     info + MOUSE_POS::YCOORD+1
         jsr     CMOVEY
 
-        ; Check for visibility
-:       lda     visible
-        beq     :+
-
         ; Draw the cursor at the new position
-        jsr     CSHOW
-:       sec                     ; Interrupt handled
+:       jsr     CDRAW
+        sec                     ; Interrupt handled
         rts
index cdedf49049fbbec1fdbb0638316d5dd8a6e7efcb..fcf742d14cb4dc044d816ef4bf57e8312c950216 100644 (file)
@@ -1,5 +1,5 @@
 ;
-; Default mouse callbacks for the C64
+; Default mouse callbacks for the C128
 ;
 ; Ullrich von Bassewitz, 2004-03-20
 ;
@@ -48,6 +48,24 @@ VIC_SPR_Y       = (VIC_SPR0_Y + 2*MOUSE_SPR)    ; Sprite Y register
 
 .endproc
 
+; --------------------------------------------------------------------------
+; Draw the mouse pointer. Always called with interrupts disabled.
+
+.proc   draw
+
+        rts
+
+.endproc
+
+; --------------------------------------------------------------------------
+; Prepare to move the mouse pointer. Always called with interrupts disabled.
+
+.proc   move
+
+        rts
+
+.endproc
+
 ; --------------------------------------------------------------------------
 ; Move the mouse pointer X position to the value in a/x. Always called with
 ; interrupts disabled.
@@ -103,7 +121,7 @@ VIC_SPR_Y       = (VIC_SPR0_Y + 2*MOUSE_SPR)    ; Sprite Y register
 _mouse_def_callbacks:
         .addr   hide
         .addr   show
+        .addr   draw
+        .addr   move
         .addr   movex
         .addr   movey
-
-
index ca165f5c30f6a493ec9349e9945c1eb59ee9df38..881605d2dd9a1e980f7a52c5bfb1510da4a4da42 100644 (file)
@@ -50,6 +50,8 @@ HEADER:
 
 CHIDE:  jmp     $0000                   ; Hide the cursor
 CSHOW:  jmp     $0000                   ; Show the cursor
+CDRAW:  jmp     $0000                   ; Draw the cursor
+CMOVE:  jmp     $0000                   ; Prepare to move the cursor
 CMOVEX: jmp     $0000                   ; Move the cursor to X coord
 CMOVEY: jmp     $0000                   ; Move the cursor to Y coord
 
@@ -302,7 +304,8 @@ IOCTL:  lda     #<MOUSE_ERR_INV_IOCTL     ; We don't support ioclts for now
 ; MUST return carry clear.
 ;
 
-IRQ:    lda     SID_ADConv1             ; Get mouse X movement
+IRQ:    jsr     CMOVE
+        lda     SID_ADConv1             ; Get mouse X movement
         ldy     OldPotX
         jsr     MoveCheck               ; Calculate movement vector
         sty     OldPotX
@@ -389,8 +392,9 @@ IRQ:    lda     SID_ADConv1             ; Get mouse X movement
 
 ; Done
 
-        clc                     ; Interrupt not "handled"
-@SkipY: rts
+@SkipY: jsr     CDRAW
+        clc                             ; Interrupt not "handled"
+        rts
 
 ; --------------------------------------------------------------------------
 ;
index dc3469aac08e8f43a01f339feadacf9910adbfe6..bed490d662c2666b9e1c6b7c3a65060ff086b71c 100644 (file)
@@ -49,6 +49,8 @@ LIBREF: .addr   $0000
 
 CHIDE:  jmp     $0000                   ; Hide the cursor
 CSHOW:  jmp     $0000                   ; Show the cursor
+CDRAW:  jmp     $0000                   ; Draw the cursor
+CMOVE:  jmp     $0000                   ; Prepare to move the cursor
 CMOVEX: jmp     $0000                   ; Move the cursor to X co-ord.
 CMOVEY: jmp     $0000                   ; Move the cursor to Y co-ord.
 
@@ -343,7 +345,7 @@ IOCTL:  lda     #<MOUSE_ERR_INV_IOCTL     ; We don't support ioctls, for now
 ; MUST return carry clear.
 ;
 
-IRQ:
+IRQ:    jsr     CMOVE
 
 ; Record the state of the buttons.
 ; Try to avoid crosstalk between the keyboard and the lightpen.
@@ -441,7 +443,8 @@ IRQ:
 
 ; Done
 
-@SkipX: clc                             ; Interrupt not "handled"
+@SkipX: jsr     CDRAW
+        clc                             ; Interrupt not "handled"
         rts
 
 ; Move the lightpen pointer to the new Y pos.
index 8845dd3579b777550a1300c831e82df837486c0f..bc5f812cdb35614836af0c79ad7f09eb5197a7c1 100644 (file)
@@ -49,6 +49,8 @@ HEADER:
 
 CHIDE:  jmp     $0000                   ; Hide the cursor
 CSHOW:  jmp     $0000                   ; Show the cursor
+CDRAW:  jmp     $0000                   ; Draw the cursor
+CMOVE:  jmp     $0000                   ; Prepare to move the cursor
 CMOVEX: jmp     $0000                   ; Move the cursor to X coord
 CMOVEY: jmp     $0000                   ; Move the cursor to Y coord
 
@@ -302,7 +304,8 @@ IOCTL:  lda     #<MOUSE_ERR_INV_IOCTL     ; We don't support ioclts for now
 ; MUST return carry clear.
 ;
 
-IRQ:    lda     #$7F
+IRQ:    jsr     CMOVE
+        lda     #$7F
         sta     CIA1_PRA
         lda     CIA1_PRB                ; Read joystick #0
         and     #$1F
@@ -415,6 +418,6 @@ IRQ:    lda     #$7F
 
 ; Done
 
-@SkipY: clc                             ; Interrupt not "handled"
+@SkipY: jsr     CDRAW
+        clc                             ; Interrupt not "handled"
         rts
-
index 595e33ac994b118b02fb4e61fe0bb7f6bde4fc45..48562e96d9aeebbd45038acfe42197d4e7f96f80 100644 (file)
@@ -46,6 +46,8 @@ HEADER:
 
 CHIDE:  jmp     $0000                   ; Hide the cursor
 CSHOW:  jmp     $0000                   ; Show the cursor
+CDRAW:  jmp     $0000                   ; Draw the cursor
+CMOVE:  jmp     $0000                   ; Prepare to move the cursor
 CMOVEX: jmp     $0000                   ; Move the cursor to X coord
 CMOVEY: jmp     $0000                   ; Move the cursor to Y coord
 
@@ -297,7 +299,8 @@ IOCTL:  lda     #<MOUSE_ERR_INV_IOCTL     ; We don't support ioclts for now
 ; (so be careful).
 ;
 
-IRQ:    lda     #$7F
+IRQ:    jsr     CMOVE
+        lda     #$7F
         sta     CIA1_PRA
         lda     CIA1_PRB                ; Read port #1
         and     #%00001100
@@ -392,4 +395,7 @@ IRQ:    lda     #$7F
 ; Move the mouse pointer to the new X pos
 
         tya
-        jmp     CMOVEY
+        jsr     CMOVEY
+        jsr     CDRAW
+        clc                             ; Interrupt not "handled"
+        rts
index 96c7c9ef44d0f6e579a5a3516084fa024b343c71..ae61330d9af48b8ee94c8f074d62fa1b066b3dad 100644 (file)
@@ -48,6 +48,24 @@ VIC_SPR_Y       = (VIC_SPR0_Y + 2*MOUSE_SPR)    ; Sprite Y register
 
 .endproc
 
+; --------------------------------------------------------------------------
+; Draw the mouse pointer. Always called with interrupts disabled.
+
+.proc   draw
+
+        rts
+
+.endproc
+
+; --------------------------------------------------------------------------
+; Prepare to move the mouse pointer. Always called with interrupts disabled.
+
+.proc   move
+
+        rts
+
+.endproc
+
 ; --------------------------------------------------------------------------
 ; Move the mouse pointer X position to the value in a/x. Always called with
 ; interrupts disabled.
@@ -96,7 +114,7 @@ VIC_SPR_Y       = (VIC_SPR0_Y + 2*MOUSE_SPR)    ; Sprite Y register
 _mouse_def_callbacks:
         .addr   hide
         .addr   show
+        .addr   draw
+        .addr   move
         .addr   movex
         .addr   movey
-
-
index 0211ee20f9474c8f8742b4ef0c7a8e03464fc476..dbe8cc4d3e4b6becae975a250eb4b68a7c116a21 100644 (file)
@@ -69,6 +69,8 @@ HEADER:
 
 CHIDE:  jmp     $0000                   ; Hide the cursor
 CSHOW:  jmp     $0000                   ; Show the cursor
+CDRAW:  jmp     $0000                   ; Draw the cursor
+CMOVE:  jmp     $0000                   ; Prepare to move the cursor
 CMOVEX: jmp     $0000                   ; Move the cursor to X coord
 CMOVEY: jmp     $0000                   ; Move the cursor to Y coord
 
@@ -314,7 +316,7 @@ IOCTL:  lda     #<MOUSE_ERR_INV_IOCTL     ; We don't support ioclts for now
 ; MUST return carry clear.
 ;
 
-IRQ:
+IRQ:    jsr     CMOVE
 
 ; Record the state of the buttons.
 ; Avoid crosstalk between the keyboard and the mouse.
@@ -417,8 +419,9 @@ IRQ:
 
 ; Done
 
+@SkipY: jsr     CDRAW
         clc                             ; Interrupt not "handled"
-@SkipY: rts
+        rts
 
 ; --------------------------------------------------------------------------
 ;
index 070d8f10893c9a8a11356f528f6f741fb102cb17..a0c1182c9ef7098fa98aa14ee3b4fc73bef6fc52 100644 (file)
@@ -49,6 +49,8 @@ LIBREF: .addr   $0000
 
 CHIDE:  jmp     $0000                   ; Hide the cursor
 CSHOW:  jmp     $0000                   ; Show the cursor
+CDRAW:  jmp     $0000                   ; Draw the cursor
+CMOVE:  jmp     $0000                   ; Prepare to move the cursor
 CMOVEX: jmp     $0000                   ; Move the cursor to X co-ord.
 CMOVEY: jmp     $0000                   ; Move the cursor to Y co-ord.
 
@@ -324,7 +326,7 @@ IOCTL:  lda     #<MOUSE_ERR_INV_IOCTL     ; We don't support ioctls, for now
 ; MUST return carry clear.
 ;
 
-IRQ:
+IRQ:    jsr     CMOVE
 
 ; Record the state of the buttons.
 ; Try to avoid crosstalk between the keyboard and the lightpen.
@@ -422,7 +424,8 @@ IRQ:
 
 ; Done
 
-@SkipX: clc                             ; Interrupt not "handled"
+@SkipX: jsr     CDRAW
+        clc                             ; Interrupt not "handled"
         rts
 
 ; Move the lightpen pointer to the new Y pos.
index 08dad7b3c13a3ef36580a9bbfe3b7bd78ff5dfb6..ba22a0c95ee84fd70fafd3ae1e7d9acb2648186f 100644 (file)
@@ -68,6 +68,8 @@ HEADER:
 
 CHIDE:  jmp     $0000                   ; Hide the cursor
 CSHOW:  jmp     $0000                   ; Show the cursor
+CDRAW:  jmp     $0000                   ; Draw the cursor
+CMOVE:  jmp     $0000                   ; Prepare to move the cursor
 CMOVEX: jmp     $0000                   ; Move the cursor to X coord
 CMOVEY: jmp     $0000                   ; Move the cursor to Y coord
 
@@ -319,9 +321,11 @@ IOCTL:  lda     #<MOUSE_ERR_INV_IOCTL     ; We don't support ioclts for now
 ; MUST return carry clear.
 ;
 
+IRQ:    jsr     CMOVE
+
 ; Avoid crosstalk between the keyboard and a joystick.
 
-IRQ:    ldy     #%00000000              ; Set ports A and B to input
+        ldy     #%00000000              ; Set ports A and B to input
         sty     CIA1_DDRB
         sty     CIA1_DDRA               ; Keyboard won't look like joystick
         lda     CIA1_PRB                ; Read Control-Port 1
@@ -438,6 +442,7 @@ IRQ:    ldy     #%00000000              ; Set ports A and B to input
 
 ; Done
 
-@SkipY: clc                             ; Interrupt not handled
+@SkipY: jsr     CDRAW
+        clc                             ; Interrupt not "handled"
         rts
 
index 3be0f4f3d15bc6fa78e0301158d15bb0a63b5958..e7990b1174f8a17720ddc4fe92afa2c60708a98a 100644 (file)
@@ -46,6 +46,8 @@ HEADER:
 
 CHIDE:  jmp     $0000                   ; Hide the cursor
 CSHOW:  jmp     $0000                   ; Show the cursor
+CDRAW:  jmp     $0000                   ; Draw the cursor
+CMOVE:  jmp     $0000                   ; Prepare to move the cursor
 CMOVEX: jmp     $0000                   ; Move the cursor to X coord
 CMOVEY: jmp     $0000                   ; Move the cursor to Y coord
 
@@ -297,7 +299,8 @@ IOCTL:  lda     #<MOUSE_ERR_INV_IOCTL     ; We don't support ioclts for now
 ; (so be careful).
 ;
 
-IRQ:    lda     #$7F
+IRQ:    jsr     CMOVE
+        lda     #$7F
         sta     CIA1_PRA
         lda     CIA1_PRB                ; Read port #1
         and     #%00001100
@@ -392,4 +395,7 @@ IRQ:    lda     #$7F
 ; Move the mouse pointer to the new X pos
 
         tya
-        jmp     CMOVEY
+        jsr     CMOVEY
+        jsr     CDRAW
+        clc                             ; Interrupt not "handled"
+        rts
index a6504ae3014cc0fbeae412812a80bbb6c678f499..b156fdf2f359c6a7efc53906b979c0203ec998a8 100644 (file)
@@ -62,6 +62,24 @@ VIC_SPR_Y       = (VIC_SPR0_Y + 2*MOUSE_SPR)    ; Sprite Y register
 
 .endproc
 
+; --------------------------------------------------------------------------
+; Draw the mouse pointer. Always called with interrupts disabled.
+
+.proc   draw
+
+        rts
+
+.endproc
+
+; --------------------------------------------------------------------------
+; Prepare to move the mouse pointer. Always called with interrupts disabled.
+
+.proc   move
+
+        rts
+
+.endproc
+
 ; --------------------------------------------------------------------------
 ; Move the mouse pointer x position to the value in .XA. Always called with
 ; interrupts disabled.
@@ -125,7 +143,7 @@ VIC_SPR_Y       = (VIC_SPR0_Y + 2*MOUSE_SPR)    ; Sprite Y register
 _mouse_def_callbacks:
         .addr   hide
         .addr   show
+        .addr   draw
+        .addr   move
         .addr   movex
         .addr   movey
-
-
index 8502a70341dbec575ddb332acfbb60acb27fb51a..3885dcba92cc7ac0b69fe32d2320ea98d46e764b 100644 (file)
@@ -53,6 +53,8 @@ LIBREF: .addr   $0000
 
 CHIDE:  jmp     $0000                   ; Hide the cursor
 CSHOW:  jmp     $0000                   ; Show the cursor
+CDRAW:  jmp     $0000                   ; Draw the cursor
+CMOVE:  jmp     $0000                   ; Prepare to move the cursor
 CMOVEX: jmp     $0000                   ; Move the cursor to X co-ord.
 CMOVEY: jmp     $0000                   ; Move the cursor to Y co-ord.
 
@@ -336,7 +338,8 @@ IOCTL:  lda     #<MOUSE_ERR_INV_IOCTL     ; We don't support ioctls, for now
 ; MUST return carry clear.
 ;
 
-IRQ:    ldx     #15                     ; To system bank
+IRQ:    jsr     CMOVE
+        ldx     #15                     ; To system bank
         stx     IndReg
 
 ; Read the VIC-II lightpen registers.
@@ -428,7 +431,8 @@ IRQ:    ldx     #15                     ; To system bank
 
 ; Done
 
-@SkipX: clc                             ; Interrupt not "handled"
+@SkipX: jsr     CDRAW
+        clc                             ; Interrupt not "handled"
         rts
 
 ; Move the lightpen pointer to the new Y pos.
index 43bd722f377bc91d33a2be43e9152a5b2eac63c0..51bf6f42ce1e41761e1e11753a9d63173fbf03ad 100644 (file)
@@ -52,6 +52,8 @@ HEADER:
 
 CHIDE:  jmp     $0000                   ; Hide the cursor
 CSHOW:  jmp     $0000                   ; Show the cursor
+CDRAW:  jmp     $0000                   ; Draw the cursor
+CMOVE:  jmp     $0000                   ; Prepare to move the cursor
 CMOVEX: jmp     $0000                   ; Move the cursor to x co-ord.
 CMOVEY: jmp     $0000                   ; Move the cursor to y co-ord.
 
@@ -323,7 +325,8 @@ IOCTL:  lda     #<MOUSE_ERR_INV_IOCTL   ; We don't support ioctls, for now
 ; Reads joystick 2.
 ;
 
-IRQ:    ldy     #15                     ; Switch to the system bank
+IRQ:    jsr     CMOVE
+        ldy     #15                     ; Switch to the system bank
         sty     IndReg
 
 ; Get the direction bits.
@@ -430,7 +433,8 @@ IRQ:    ldy     #15                     ; Switch to the system bank
 
 ; Done
 
-@SkipY: clc                             ; Interrupt not handled
+@SkipY: jsr     CDRAW
+        clc                             ; Interrupt not "handled"
         rts
 
 ; Move the mouse pointer to the new x pos.