-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathpollmouse.asm
231 lines (167 loc) · 3.61 KB
/
pollmouse.asm
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
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
;----[ pollmouse.a ]--------------------
;Copyright (C) 2019 Gregory Nacu
;1351 Mouse Driver
; - Fully Commented
; - Screen Edge Bounded
; - Accelerated
; - Two Sprites
; - 16-bit Overflow Prevention
irqvec = $0314
vic = $d000
sid = $d400
*= $c000
ldx irqvec
ldy irqvec+1
stx sysirq+1
sty sysirq+2
ldx #<mouseirq
ldy #>mouseirq
php
sei
stx irqvec
sty irqvec+1
plp
lda #%00000011
sta vic+$15 ;Enable Sprites
rts
;---------------------------------------
mouseirq cld
jsr scanmovs
jsr boundmus
sysirq jmp $ffff
;---------------------------------------
potx = sid+$19
poty = sid+$1a
xpos = vic+$00
ypos = vic+$01
xpos2 = vic+$02
ypos2 = vic+$03
xposmsb = vic+$10
maxx = 319 ;Screen Width
maxy = 199 ;Screen Height
offsetx = 24 ;Sprite left border edge
offsety = 50 ;Sprite top border edge
musposx .word 320/2
musposy .word 200/2
boundmus
ldx musposx+1
bmi zerox
beq chky
ldx #maxx-256
cpx musposx
bcs chky
stx musposx
bcc chky
zerox ldx #0
stx musposx
stx musposx+1
chky ldy musposy+1
bmi zeroy
beq loychk
dey musposy+1
ldy #maxy
sty musposy
bne movemus
loychk ldy #maxy
cpy musposy
bcs movemus
sty musposy
bcc movemus
zeroy ldy #0
sty musposy
sty musposy+1
movemus clc
lda musposx
adc #offsetx
sta xpos
sta xpos2
lda musposx+1
adc #0
beq clearxhi
;set x sprite pos high
lda xposmsb
ora #%00000011
bne *+7
clearxhi ;set x sprite pos low
lda xposmsb
and #%11111100
sta xposmsb
clc
lda musposy
adc #offsety
sta ypos
sta ypos2
rts
;---------------------------------------
scanmovs
;--- X Axis ---
lda potx
oldpotx ldy #0
jsr movechk
beq noxmove
sty oldpotx+1
clc
adc musposx
sta musposx
txa ;upper 8-bits
adc musposx+1
sta musposx+1
noxmove
;--- Y Axis ---
lda poty
oldpoty ldy #0
jsr movechk
beq noymov
sty oldpoty+1
clc
eor #$ff ;Reverse Sign
adc #1
clc
adc musposy
sta musposy
txa ;Upper 8-bits
eor #$ff ;Reverse Sign
adc musposy+1
sta musposy+1
noymov
rts
movechk ;Y -> Old Pot Value
;A -> New Pot Value
sty oldvalue+1
tay
sec
oldvalue sbc #$ff
and #%01111111
cmp #%01000000
bcs neg
lsr a ;remove noise bit
beq nomove
cmp #10 ;Acceleration Speed
bcc *+3
asl a ;X2
ldx #0
cmp #0
;A > 0
;X = 0 (sign extension)
;Y = newvalue
;Z = 0
rts
neg ora #%10000000
cmp #$ff
beq nomove
sec ;Keep hi negative bit
ror a ;remove noise bit
cmp #256-10 ;Acceleration Speed
bcs *+3
asl a ;X2
ldx #$ff
;A < 0
;X = $ff (sign extension)
;Y = newvalue
;Z = 0
rts
nomove ;A = -
;X = -
;Y = -
;Z = 1
rts