From 575f859a030262b60fce9a0a136c54f4b198ca89 Mon Sep 17 00:00:00 2001
From: Oliver Schmidt
Date: Fri, 9 Oct 2015 18:33:35 +0200
Subject: [PATCH] Keep low level VIC sprite stuff out of user code.
---
include/mouse.h | 13 ++++++--
libsrc/c128/mcbdefault.s | 34 ++++++++++++++++++++-
libsrc/c64/mcbdefault.s | 32 ++++++++++++++++++++
libsrc/cbm/mcbpointercolor.s | 10 +++++++
libsrc/cbm/mcbpointershape.s | 30 +++++++++++++++++++
libsrc/cbm510/mcbdefault.s | 39 ++++++++++++++++++++++++
samples/mousetest.c | 58 ++----------------------------------
7 files changed, 157 insertions(+), 59 deletions(-)
create mode 100644 libsrc/cbm/mcbpointercolor.s
create mode 100644 libsrc/cbm/mcbpointershape.s
diff --git a/include/mouse.h b/include/mouse.h
index ac75956c0..8bd9a00ff 100644
--- a/include/mouse.h
+++ b/include/mouse.h
@@ -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
-
-
-
diff --git a/libsrc/c128/mcbdefault.s b/libsrc/c128/mcbdefault.s
index 01c54efca..1951129a6 100644
--- a/libsrc/c128/mcbdefault.s
+++ b/libsrc/c128/mcbdefault.s
@@ -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"
@@ -15,16 +18,45 @@
.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
diff --git a/libsrc/c64/mcbdefault.s b/libsrc/c64/mcbdefault.s
index ffeed45b3..c4feddfea 100644
--- a/libsrc/c64/mcbdefault.s
+++ b/libsrc/c64/mcbdefault.s
@@ -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"
@@ -17,14 +20,43 @@
; 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
index 000000000..c9cb6330e
--- /dev/null
+++ b/libsrc/cbm/mcbpointercolor.s
@@ -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
index 000000000..7364201b1
--- /dev/null
+++ b/libsrc/cbm/mcbpointershape.s
@@ -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
diff --git a/libsrc/cbm510/mcbdefault.s b/libsrc/cbm510/mcbdefault.s
index 028fb4ec1..7542d776d 100644
--- a/libsrc/cbm510/mcbdefault.s
+++ b/libsrc/cbm510/mcbdefault.s
@@ -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"
@@ -19,14 +22,50 @@
; 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
diff --git a/samples/mousetest.c b/samples/mousetest.c
index 7d9409659..4a849cb98 100644
--- a/samples/mousetest.c
+++ b/samples/mousetest.c
@@ -40,44 +40,11 @@
-#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.
--
2.39.5