File: mcbdefault.s

package info (click to toggle)
cc65 2.19-2
  • links: PTS
  • area: main
  • in suites: forky, sid, trixie
  • size: 20,268 kB
  • sloc: ansic: 117,151; asm: 66,339; pascal: 4,248; makefile: 1,009; perl: 607
file content (170 lines) | stat: -rw-r--r-- 4,554 bytes parent folder | download | duplicates (3)
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