-
-
Notifications
You must be signed in to change notification settings - Fork 4
/
utils.asm
334 lines (274 loc) · 4.55 KB
/
utils.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
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
; asmsyntax=ca65
CLEAR_ATTR_ID = $00
; Was a button pressed this frame?
ButtonPressedP1:
sta btnPressedMask
lda IgnoreInput
beq :+
dec IgnoreInput
lda #0
rts
:
lda btnPressedMask
and controller1
sta controllerTmp
lda controller1_Old
and btnPressedMask
cmp controllerTmp
bne btnPress_stb
; no button change
rts
ButtonPressedP2:
sta btnPressedMask
lda IgnoreInput
beq :+
dec IgnoreInput
lda #0
rts
:
lda btnPressedMask
and controller2
sta controllerTmp
lda controller2_Old
and btnPressedMask
cmp controllerTmp
bne btnPress_stb
; no button change
rts
btnPress_stb:
; button released
lda controllerTmp
bne btnPress_stc
rts
btnPress_stc:
; button pressed
lda #1
rts
; Player input
ReadControllers:
lda controller1
sta controller1_Old
lda controller2
sta controller2_Old
; Freeze input
lda #1
sta $4016
lda #0
sta $4016
LDX #$08
@player1:
lda $4016
lsr A ; Bit0 -> Carry
rol controller1 ; Bit0 <- Carry
dex
bne @player1
ldx #$08
@player2:
lda $4017
lsr A ; Bit0 -> Carry
rol controller2 ; Bit0 <- Carry
dex
bne @player2
rts
; Load a single four-byte palette into RAM. Palette address
; is expected in TmpAddr.
LoadPaletteBG0:
ldx #31
jmp loadSinglePalLoop
LoadPaletteBG1:
ldx #27
jmp loadSinglePalLoop
LoadPaletteBG2:
ldx #23
jmp loadSinglePalLoop
LoadPaletteBG3:
ldx #19
jmp loadSinglePalLoop
LoadPaletteSP0:
ldx #15
jmp loadSinglePalLoop
LoadPaletteSP1:
ldx #11
jmp loadSinglePalLoop
LoadPaletteSP2:
ldx #7
jmp loadSinglePalLoop
LoadPaletteSP3:
ldx #3
;jmp loadSinglePalLoop ; jmp not really needed.
loadSinglePalLoop:
ldy #0
:
lda (TmpAddr), y
sta PaletteRAM, x
dex
iny
cpy #4
bne :-
rts
; Load a full set of eight palettes into RAM. Palette address is
; expected in PaletteAddr.
; TODO: Change this to use TmpAddr
LoadPalettes:
ldx #31
ldy #0
@loop:
lda (PaletteAddr), y
sta PaletteRAM, x
dex
iny
cpy #32
bne @loop
rts
ClearSprites:
ldx #$00
lda #$00
@loop:
.repeat 4
sta $0200, x
inx
.endrepeat
bne @loop
rts
FillNametable0:
sta clear_nt_tile
bit $2002
lda #$20
sta $2006
jmp utils_ClearNametable
FillNametable1:
sta clear_nt_tile
bit $2002
lda #$24
sta $2006
jmp utils_ClearNametable
FillNametable2:
sta clear_nt_tile
bit $2002
lda #$28
sta $2006
jmp utils_ClearNametable
FillNametable3:
sta clear_nt_tile
bit $2002
lda #$2C
sta $2006
jmp utils_ClearNametable
ClearNametable0:
lda #CLEAR_TILE_ID
sta clear_nt_tile
bit $2002
lda #$20
sta $2006
jmp utils_ClearNametable
ClearNametable1:
lda #CLEAR_TILE_ID
sta clear_nt_tile
bit $2002
lda #$24
sta $2006
jmp utils_ClearNametable
ClearNametable2:
lda #CLEAR_TILE_ID
sta clear_nt_tile
bit $2002
lda #$28
sta $2006
jmp utils_ClearNametable
ClearNametable3:
lda #CLEAR_TILE_ID
sta clear_nt_tile
bit $2002
lda #$2C
sta $2006
jmp utils_ClearNametable
utils_ClearNametable:
lda #00
sta $2006
ldx #30
lda clear_nt_tile
@loop2:
.repeat 32
sta $2007
.endrepeat
dex
bne @loop2
rts
ClearAttrTable0:
bit $2002
lda #$23
sta $2006
jmp utils_ClearAttrTable
ClearAttrTable1:
bit $2002
lda #$27
sta $2006
jmp utils_ClearAttrTable
ClearAttrTable2:
bit $2002
lda #$2B
sta $2006
jmp utils_ClearAttrTable
ClearAttrTable3:
bit $2002
lda #$2F
sta $2006
jmp utils_ClearAttrTable
utils_ClearAttrTable:
lda #$C0
sta $2006
ldx #8
lda #$00
@loop:
.repeat 8
sta $2007
.endrepeat
dex
bne @loop
rts
; Binary value in A, ASCII Hex values output in TmpX and TmpY
BinToHex:
; TmpX "rng_result"
; TmpY "rng_text"
;lda rng_seed
sta TmpX
lda #0
sta TmpY
@tens:
lda TmpX
cmp #$10
bcs @addtens
jmp @ones
@addtens:
inc TmpY
sec
sbc #$10
sta TmpX
jmp @tens
@ones:
lda TmpY
clc
adc #$30
cmp #$3A
bcc @ynoletter
adc #$06
@ynoletter:
sta TmpY
lda TmpX
clc
adc #$30
cmp #$3A
bcc @xnoletter
adc #$06
@xnoletter:
sta TmpX
rts
; Draw a number of tiles.
; Start value is in X
; Length in Y
DrawSequential:
stx $2007
inx
dey
bne DrawSequential
rts