1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
|
;
; Default mouse callbacks for the CBM510 (P128)
;
; 2004-03-20, Ullrich von Bassewitz2
; 2013-06-25, Greg King
;
; All functions in this module should be interrupt-safe because they might
; 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"
.include "cbm510.inc"
.macpack generic
; 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 "ONCE"
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
ldy #VIC_SPR_ENA
lda (vic),y
and #MOUSE_SPR_NMASK
sta (vic),y
ldy ExecReg
sty IndReg
rts
; --------------------------------------------------------------------------
; Show the mouse pointer. Always called with interrupts disabled.
show:
ldy #15
sty IndReg
ldy #VIC_SPR_ENA
lda (vic),y
ora #MOUSE_SPR_MASK
sta (vic),y
ldy ExecReg
sty IndReg
; Fall through
; --------------------------------------------------------------------------
; Prepare to move the mouse pointer. Always called with interrupts disabled.
prep:
; Fall through
; --------------------------------------------------------------------------
; Draw the mouse pointer. Always called with interrupts disabled.
draw:
rts
; --------------------------------------------------------------------------
; Move the mouse pointer x position to the value in .XA. Always called with
; interrupts disabled.
movex:
ldy #15
sty IndReg
; Add the x correction; and, set the low byte. That frees .A.
add #<24 ; x correction
ldy #VIC_SPR_X
sta (vic),y
; Set the high byte
ldy #VIC_SPR_HI_X
txa
adc #>24
bnz @L1 ; Branch if high byte not zero
lda (vic),y ; Get high x bits of all sprites
and #MOUSE_SPR_NMASK ; Clear high bit for sprite
sta (vic),y
@L0: ldy ExecReg
sty IndReg
rts
@L1: lda (vic),y ; Get high x bits of all sprites
ora #MOUSE_SPR_MASK ; Set high bit for sprite
sta (vic),y
bnz @L0 ; Branch always
; --------------------------------------------------------------------------
; Move the mouse pointer y position to the value in .XA. Always called with
; interrupts disabled.
movey:
ldy #15
sty IndReg
add #50 ; y correction (first visible line)
ldy #VIC_SPR_Y
sta (vic),y ; Set y position
ldy ExecReg
sty IndReg
rts
; --------------------------------------------------------------------------
; Callback structure
.rodata
_mouse_def_callbacks:
.addr hide
.addr show
.addr prep
.addr draw
.addr movex
.addr movey
|