]> git.sur5r.net Git - cc65/commitdiff
Keep low level VIC sprite stuff out of user code.
authorOliver Schmidt <ol.sc@web.de>
Fri, 9 Oct 2015 16:33:35 +0000 (18:33 +0200)
committerOliver Schmidt <ol.sc@web.de>
Fri, 9 Oct 2015 16:33:35 +0000 (18:33 +0200)
include/mouse.h
libsrc/c128/mcbdefault.s
libsrc/c64/mcbdefault.s
libsrc/cbm/mcbpointercolor.s [new file with mode: 0644]
libsrc/cbm/mcbpointershape.s [new file with mode: 0644]
libsrc/cbm510/mcbdefault.s
samples/mousetest.c

index ac75956c06263765538c8539eb483e720d49c7a8..8bd9a00ff012787f19df9f9cae0772bd65c99910 100644 (file)
@@ -122,6 +122,16 @@ struct mouse_callbacks {
 /* The default mouse callbacks */
 extern const struct mouse_callbacks mouse_def_callbacks;
 
+#if defined(__CBM__)
+
+/* The default mouse pointer shape used by the default mouse callbacks */
+extern const unsigned char mouse_def_pointershape[63];
+
+/* The default mouse pointer color used by the default mouse callbacks */
+extern const unsigned char mouse_def_pointercolor;
+
+#endif
+
 /* The name of the standard mouse driver for a platform */
 extern const char mouse_stddrv[];
 
@@ -208,6 +218,3 @@ unsigned char __fastcall__ mouse_ioctl (unsigned char code, void* data);
 
 /* End of mouse.h */
 #endif
-
-
-
index 01c54efcab2ec98c2daa467e067cc5100db2da70..1951129a6335f3051fdd2e3d3f6b3cda85c8ef96 100644 (file)
@@ -7,7 +7,10 @@
 ; be called from an interrupt handler
 ;
 
+        .constructor    initmcb
         .export         _mouse_def_callbacks
+        .import         _mouse_def_pointershape
+        .import         _mouse_def_pointercolor
 
         .include        "mouse-kernel.inc"
         .include        "c128.inc"
         .macpack        generic
 
 ; Sprite definitions. The first value can be changed to adjust the number
-; of the sprite used for the mouse.
+; of the sprite used for the mouse. All others depend on this value.
 MOUSE_SPR       = 0                             ; Sprite used for the mouse
+MOUSE_SPR_MEM   = $0E00                         ; Memory location
 MOUSE_SPR_MASK  = $01 .shl MOUSE_SPR            ; Positive mask
 MOUSE_SPR_NMASK = .lobyte(.not MOUSE_SPR_MASK)  ; Negative mask
 VIC_SPR_X       = (VIC_SPR0_X + 2*MOUSE_SPR)    ; Sprite X register
 VIC_SPR_Y       = (VIC_SPR0_Y + 2*MOUSE_SPR)    ; Sprite Y register
 
+; --------------------------------------------------------------------------
+; Initialize the mouse sprite.
+
+.segment        "INIT"
+
+initmcb:
+
+; Copy the mouse sprite data
+
+        ldx     #64 - 1
+@L0:    lda     _mouse_def_pointershape,x
+        sta     MOUSE_SPR_MEM,x
+        dex
+        bpl     @L0
+
+; Set the mouse sprite pointer
+
+        lda     #<(MOUSE_SPR_MEM / 64)
+        sta     $07F8 + MOUSE_SPR
+
+; Set the mouse sprite color
+
+        lda     _mouse_def_pointercolor
+        sta     VIC_SPR0_COLOR + MOUSE_SPR
+        rts
+
 ; --------------------------------------------------------------------------
 ; Hide the mouse pointer. Always called with interrupts disabled.
 
+.code
+
 hide:
         lda     #MOUSE_SPR_NMASK
         and     VIC_SPR_ENA
index ffeed45b349b086137119297556bfbcae2bb1370..c4feddfeaa682b2e4ecee499cd20d0586138e6ac 100644 (file)
@@ -7,7 +7,10 @@
 ; be called from an interrupt handler
 ;
 
+        .constructor    initmcb
         .export         _mouse_def_callbacks
+        .import         _mouse_def_pointershape
+        .import         _mouse_def_pointercolor
 
         .include        "mouse-kernel.inc"
         .include        "c64.inc"
 ; Sprite definitions. The first value can be changed to adjust the number
 ; of the sprite used for the mouse. All others depend on this value.
 MOUSE_SPR       = 0                             ; Sprite used for the mouse
+MOUSE_SPR_MEM   = $0340                         ; Memory location
 MOUSE_SPR_MASK  = $01 .shl MOUSE_SPR            ; Positive mask
 MOUSE_SPR_NMASK = .lobyte(.not MOUSE_SPR_MASK)  ; Negative mask
 VIC_SPR_X       = (VIC_SPR0_X + 2*MOUSE_SPR)    ; Sprite X register
 VIC_SPR_Y       = (VIC_SPR0_Y + 2*MOUSE_SPR)    ; Sprite Y register
 
+; --------------------------------------------------------------------------
+; Initialize the mouse sprite.
+
+.segment        "INIT"
+
+initmcb:
+
+; Copy the mouse sprite data
+
+        ldx     #64 - 1
+@L0:    lda     _mouse_def_pointershape,x
+        sta     MOUSE_SPR_MEM,x
+        dex
+        bpl     @L0
+
+; Set the mouse sprite pointer
+
+        lda     #<(MOUSE_SPR_MEM / 64)
+        sta     $07F8 + MOUSE_SPR
+
+; Set the mouse sprite color
+
+        lda     _mouse_def_pointercolor
+        sta     VIC_SPR0_COLOR + MOUSE_SPR
+        rts
+
 ; --------------------------------------------------------------------------
 ; Hide the mouse pointer. Always called with interrupts disabled.
 
+.code
+
 hide:
         lda     #MOUSE_SPR_NMASK
         and     VIC_SPR_ENA
diff --git a/libsrc/cbm/mcbpointercolor.s b/libsrc/cbm/mcbpointercolor.s
new file mode 100644 (file)
index 0000000..c9cb633
--- /dev/null
@@ -0,0 +1,10 @@
+; VIC sprite color for the mouse pointer
+
+        .export         _mouse_def_pointercolor
+
+
+.segment        "INIT"
+
+_mouse_def_pointercolor:
+
+        .byte       $01         ; White
diff --git a/libsrc/cbm/mcbpointershape.s b/libsrc/cbm/mcbpointershape.s
new file mode 100644 (file)
index 0000000..7364201
--- /dev/null
@@ -0,0 +1,30 @@
+; VIC sprite data for the mouse pointer (an arrow)
+
+        .export         _mouse_def_pointershape
+
+
+.segment        "INIT"
+
+_mouse_def_pointershape:
+
+        .byte       %11111110, %00000000, %00000000
+        .byte       %11111100, %00000000, %00000000
+        .byte       %11111000, %00000000, %00000000
+        .byte       %11111100, %00000000, %00000000
+        .byte       %11011110, %00000000, %00000000
+        .byte       %10001111, %00000000, %00000000
+        .byte       %00000111, %10000000, %00000000
+        .byte       %00000011, %11000000, %00000000
+        .byte       %00000001, %11100000, %00000000
+        .byte       %00000000, %11110000, %00000000
+        .byte       %00000000, %01111000, %00000000
+        .byte       %00000000, %00111000, %00000000
+        .byte       %00000000, %00000000, %00000000
+        .byte       %00000000, %00000000, %00000000
+        .byte       %00000000, %00000000, %00000000
+        .byte       %00000000, %00000000, %00000000
+        .byte       %00000000, %00000000, %00000000
+        .byte       %00000000, %00000000, %00000000
+        .byte       %00000000, %00000000, %00000000
+        .byte       %00000000, %00000000, %00000000
+        .byte       %00000000, %00000000, %00000000
index 028fb4ec19a701ccb594e99bf0fda6852ed293ca..7542d776ddcf8f0a0de5680a89fcc2bacc5bfb20 100644 (file)
@@ -8,7 +8,10 @@
 ; be called from an interrupt handler.
 ;
 
+        .constructor    initmcb
         .export         _mouse_def_callbacks
+        .import         _mouse_def_pointershape
+        .import         _mouse_def_pointercolor
         .import         vic:zp
 
         .include        "mouse-kernel.inc"
 ; Sprite definitions. The first value can be changed to adjust the number
 ; of the sprite used for the mouse. All others depend on that value.
 MOUSE_SPR       = 0                             ; Sprite used for the mouse
+MOUSE_SPR_MEM   = $F400                         ; Memory location
 MOUSE_SPR_MASK  = $01 .shl MOUSE_SPR            ; Positive mask
 MOUSE_SPR_NMASK = .lobyte(.not MOUSE_SPR_MASK)  ; Negative mask
 VIC_SPR_X       = (VIC_SPR0_X + 2*MOUSE_SPR)    ; Sprite X register
 VIC_SPR_Y       = (VIC_SPR0_Y + 2*MOUSE_SPR)    ; Sprite Y register
 
+; --------------------------------------------------------------------------
+; Initialize the mouse sprite.
+
+.segment        "INIT"
+
+initmcb:
+
+; Copy the mouse sprite data
+
+        ldx     #64 - 1
+@L0:    lda     _mouse_def_pointershape,x
+        sta     MOUSE_SPR_MEM,x
+        dex
+        bpl     @L0
+
+; Set the mouse sprite pointer
+
+        lda     #<(MOUSE_SPR_MEM / 64)
+        sta     $F3F8 + MOUSE_SPR
+
+; Set the mouse sprite color
+
+        ldx     IndReg
+        lda     #15
+        sta     IndReg
+
+        lda     _mouse_def_pointercolor
+        ldy     VIC_SPR0_COLOR + MOUSE_SPR
+        sta     (vic),y
+
+        stx     IndReg
+        rts
+
 ; --------------------------------------------------------------------------
 ; Hide the mouse pointer. Always called with interrupts disabled.
 
+.code
+
 hide:
         ldy     #15
         sty     IndReg
index 7d94096596018f69b1a1db5f19c447769355950c..4a849cb989b7c96395cfa11942446c5599c33909 100644 (file)
 
 
 
-#if defined(__C64__) || defined(__C128__) || defined(__CBM510__)
+#ifdef __CBM__
 
-/* Addresses of data for sprite 0 */
-#if defined(__C64__)
-#  define SPRITE0_DATA  ((unsigned char[64])0x0340)
-#  define SPRITE0_PTR   ((unsigned char *)0x07F8)
-#elif defined(__C128__)
-#  define SPRITE0_DATA  ((unsigned char[64])0x0E00)
-#  define SPRITE0_PTR   ((unsigned char *)0x07F8)
-#elif defined(__CBM510__)
-#  define SPRITE0_DATA  ((unsigned char[64])0xF400)
-#  define SPRITE0_PTR   ((unsigned char *)0xF3F8)
-#endif
+/* Set dark-on-light colors. */
+const unsigned char mouse_def_pointercolor = COLOR_BLACK;
 
-/* The mouse sprite (an arrow) */
-static const unsigned char MouseSprite[64] = {
-    0xFE, 0x00, 0x00,
-    0xFC, 0x00, 0x00,
-    0xF8, 0x00, 0x00,
-    0xFC, 0x00, 0x00,
-    0xDE, 0x00, 0x00,
-    0x8F, 0x00, 0x00,
-    0x07, 0x80, 0x00,
-    0x03, 0xC0, 0x00,
-    0x01, 0xE0, 0x00,
-    0x00, 0xF0, 0x00,
-    0x00, 0x78, 0x00,
-    0x00, 0x38, 0x00,
-    0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00
-};
 #endif
 
 
@@ -159,25 +126,6 @@ int main (void)
     cursor (0);
     clrscr ();
 
-    /* The pointer should be created before the driver is installed,
-    ** in case a lightpen driver needs it during calibration.
-    */
-
-#if defined(__C64__) || defined(__C128__) || defined(__CBM510__)
-    /* Copy the sprite data */
-    memcpy ((void*) SPRITE0_DATA, MouseSprite, sizeof (MouseSprite));
-
-    /* Set the VIC-II sprite pointer. */
-    *SPRITE0_PTR = ((unsigned) SPRITE0_DATA & 0x3FFF) / sizeof SPRITE0_DATA;
-
-    /* Set the color of sprite 0 */
-#  ifdef __CBM510__
-    pokebsys ((unsigned) &VIC.spr0_color, COLOR_BLACK);
-#  else
-    VIC.spr0_color = COLOR_BLACK;
-#  endif
-#endif
-
     /* If a lightpen driver is installed, then it can get a calibration value
     ** from this file (if it exists).  Or, the user can adjust the pen; and,
     ** the value will be put into this file, for the next time.