mirror of
https://github.com/cc65/cc65.git
synced 2024-12-24 11:31:31 +00:00
a0d986faf8
ca65's logical (Boolean) NOT operator was used where bitwise NOT should be used. The effect was that all sprites were shifted to the left side of a screen when the mouse sprite was put on the left side.
171 lines
4.5 KiB
ArmAsm
171 lines
4.5 KiB
ArmAsm
;
|
|
; 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(.bitnot 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
|