-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathclock1_screen.s
More file actions
417 lines (345 loc) · 10.6 KB
/
clock1_screen.s
File metadata and controls
417 lines (345 loc) · 10.6 KB
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
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
#-------------------------------------------------------------------------------
# MUSIC RELEASE 'timeCS' ('CLOCK SCREEN 1') 6-channel (2AY) music only!
# BY VLADIMIR 'KUVO' KUTYAKOV/CSI
#
# CONVERSION FOR Elektronika MS0511 (UKNC)
# BY ABERRANTHACKER
#
# SOUND DEVICE: Aberrant Sound Module
# PLATFORM: Elektronika MS0511
# COMPILER: GNU Assembler
#-------------------------------------------------------------------------------
.nolist
.include "hwdefs.s"
.include "macros.s"
.include "defs.s"
.include "clock_defs.s"
.global start
.org ClockScreenStart
.equiv NUMBERS_COUNTER_INCREMENT, 0x0004 # 0x0020
.equiv DIGITS2_COUNTER_INCREMENT, 0x0480 # 0x2000
.equiv INDICATORS_COUNTER_INCREMENT, 0x4000 # 0x4000
start:
START_CLOCK:
MOV $CLOCK_GFX, R5
.equiv first_run_flag, .+2
TST $0
BNZ 2$
INC first_run_flag
.ppudo_ensure $PPU.SetPalette, $mainscr_palette
MOV $FB0, R0
MOV R5, R1
ADD (R5), R1
MOV $CLOCK_SCR_HEIGHT, R2
10$:
MOV $CLOCK_SCR_WIDTH_WORDS, R3
1$:
MOV (R1)+, (R0)+
SOB R3, 1$
ADD $LINE_WIDTHB - CLOCK_SCR_WIDTH_BYTES, R0
SOB R2, 10$
2$:
CALL NEXT_CLOCK_OPER
RETURN
NEXT_CLOCK_OPER:
NUMBERS_OPERS:
ADD $NUMBERS_COUNTER_INCREMENT, $0
BCC DIGITS2_OPERS
.equiv NUMBERS_IDX, .+2
MOV $0, R1
ADD $0140, R1
CMP R1, $0140 * 4
BLO 10$
CLR R1
10$:MOV R1, NUMBERS_IDX
ADD 6(R5), R1
ADD R5, R1
MOV $016, R2
MOV $3, R3 # MOV $6, R3
MOV $FB0 + (96 >> 2) + (124*LINE_WIDTHB), R0
CALL DISPLAY_GFX
DIGITS2_OPERS:
ADD $DIGITS2_COUNTER_INCREMENT, $0
BCS 10$
RETURN
10$:MOV $FB0 + (96 >> 2) + (96*LINE_WIDTHB), R0
MOV $DIGITS2_1_IDX, R1
CALL DIGITS2_CALC
TST (R1)
BNE 1$
CALL DISPLAY_DIGITS2
MOV $FB0 + (84 >> 2) + (99*LINE_WIDTHB), R0
MOV $DIGITS2_2_IDX, R1
CALL DIGITS2_CALC
BR 2$
1$: CALL DISPLAY_DIGITS2
BR DIGITS1_OPERS
2$: CALL DISPLAY_DIGITS2_SHIFTED
DIGITS1_OPERS:
TST DIGITS2_1_IDX
BNZ LEFT_INDICATOR_OPERS
TST DIGITS2_2_IDX
BNZ LEFT_INDICATOR_OPERS
MOV $FB0 + (136 >> 2) + (42*LINE_WIDTHB), R0
MOV $DIGITS1_1_IDX, R1
CALL DIGITS1_9_CALC
TST (R1)
BNZ 1$
CALL DISPLAY_DIGITS1
MOV $FB0 + (100 >> 2) + (52*LINE_WIDTHB), R0
MOV $DIGITS1_2_IDX, R1
CALL DIGITS1_5_CALC
TST (R1)
BNZ 2$
CALL DISPLAY_DIGITS1_SHIFTED
MOV $FB0 + (64 >> 2) + (62*LINE_WIDTHB), R0
MOV $DIGITS1_3_IDX, R1
CALL DIGITS1_3_CALC
TST (R1)
BNZ 1$
CALL DISPLAY_DIGITS1
MOV $FB0 + (28 >> 2) + (73*LINE_WIDTHB), R0
MOV $DIGITS1_4_IDX, R1
CALL DIGITS1_2_CALC
BR 2$
1$: CALL DISPLAY_DIGITS1
BR LEFT_INDICATOR_OPERS
2$: CALL DISPLAY_DIGITS1_SHIFTED
LEFT_INDICATOR_OPERS:
ADD $INDICATORS_COUNTER_INCREMENT, $0
BCS 10$
RETURN
10$:COM $0
BNZ RIGHT_INDICATOR_OPERS
MOV $LEFT_INDICATOR_BUFFER, R1
CALL FILL_INDICATOR_BUFFER # defines how many segments to on/off
MOV $LEFT_INDICATOR_BUFFER, R3
MOV $LEFT_INDICATOR_BAR_LOCATION, INDICATOR_BAR_LOCATION
MOV $030, GFX_ON_INDICATOR_OFFSET
CALL DISPLAY_INDICATOR
1234$: RETURN
RIGHT_INDICATOR_OPERS:
MOV $RIGHT_INDICATOR_BUFFER, R1
CALL FILL_INDICATOR_BUFFER
MOV $RIGHT_INDICATOR_BUFFER, R3
MOV $RIGHT_INDICATOR_BAR_LOCATION, INDICATOR_BAR_LOCATION
MOV $070, GFX_ON_INDICATOR_OFFSET
CALL DISPLAY_INDICATOR
RETURN
DISPLAY_INDICATOR:
CLR R2
MOV $010, R4
10$:PUSH R4
MOV R2, R1
ASL R1
ASL R1
ASL R1 # segment number * 8
ADD INDICATOR_BAR_LOCATION, R1 # calc segment number params address
MOV R2, R0
ASL R0
ADD GFX_ON_INDICATOR_OFFSET, R0
TSTB (R3)+
BZE 1$
SUB $16, R0
1$: MOV CLOCK_GFX(R0), R0
ADD R5, R0
PUSH R2
PUSH R3
PUSH R5
MOV (R1)+, R2 # element width bytes
MOV (R1)+, R3 # element height
MOV (R1)+, R5 # mask address
MOV (R1)+, R1 # dst address
3$:
PUSH R1
PUSH R5
MOV R2, R4
4$:
BIC (R5)+, (R1)
BIS (R0)+, (R1)+
SOB R4, 4$
POP R5
POP R1
ADD $LINE_WIDTHB, R1
SOB R3, 3$
POP R5
POP R3
POP R2
INC R2
POP R4
SOB R4, 10$
RETURN
FILL_INDICATOR_BUFFER:
# IN: R1 = [LEFT|RIGHT]_INDICATOR_BUFFER
.equiv RND, .+2
MOV $0150000, R0
MOVB (R0)+, R2
BIC $020000, R0
BIS $010000, R0
MOV R0, RND
ADD R0, R2
BIC $0177770, R2
INC R2
MOV $010, R3
SUB R3, R2
NEG R2
BEQ 1$
SUB R2, R3
10$:
CLRB (R1)+
SOB R2, 10$
1$:
INCB (R1)+
SOB R3, 1$
RETURN
INDICATOR_BAR_LOCATION: .word 0
GFX_ON_INDICATOR_OFFSET: .word 0
GFX_OFF_INDICATOR_OFFSET_FROM_ON: .word 0
west_12_16: .word 0xFFFF, 0x0F0F # 2 12->16 east
east_12_16: .word 0xF0F0, 0xFFFF # 4 12->16 west
east_4_8: .word 0xF0F0 # 6 4-> 8 west
center_8_8: .word 0xFFFF
LEFT_INDICATOR_BUFFER: .space 8 # .BLKB 8
.set line, LINE_WIDTHB * 112
LEFT_INDICATOR_BAR_LOCATION:
.word 1, 10, center_8_8, FB0 + line + (28 >> 2) + (LINE_WIDTHB * 44) + (28 >> 2) # 8
.word 2, 12, east_12_16, FB0 + line + (32 >> 2) + (LINE_WIDTHB * 33) + (28 >> 2) # 12 sh
.word 2, 13, east_12_16, FB0 + line + (32 >> 2) + (LINE_WIDTHB * 19) + (28 >> 2) # 12 sh
.word 2, 13, west_12_16, FB0 + line + (28 >> 2) + (LINE_WIDTHB * 7) + (28 >> 2) # 12
.word 2, 12, west_12_16, FB0 + line + (20 >> 2) + (LINE_WIDTHB * 0) + (28 >> 2) # 12
.word 1, 8, center_8_8, FB0 + line + (12 >> 2) + (LINE_WIDTHB * 1) + (28 >> 2) # 8
.word 1, 10, center_8_8, FB0 + line + ( 4 >> 2) + (LINE_WIDTHB * 4) + (28 >> 2) # 8
.word 1, 12, east_4_8, FB0 + line + ( 0 >> 2) + (LINE_WIDTHB * 12) + (28 >> 2) # 4 sh
RIGHT_INDICATOR_BUFFER: .space 8 # .BLKB 8
.set line, LINE_WIDTHB * 84
RIGHT_INDICATOR_BAR_LOCATION:
.word 1, 9, center_8_8, FB0 + line + (16 >> 2) + (LINE_WIDTHB * 48) + (128 >> 2) # 8
.word 2, 12, east_12_16, FB0 + line + ( 4 >> 2) + (LINE_WIDTHB * 40) + (128 >> 2) # 12 sh
.word 2, 12, west_12_16, FB0 + line + ( 0 >> 2) + (LINE_WIDTHB * 28) + (128 >> 2) # 12
.word 2, 12, west_12_16, FB0 + line + ( 0 >> 2) + (LINE_WIDTHB * 16) + (128 >> 2) # 12
.word 2, 12, east_12_16, FB0 + line + ( 4 >> 2) + (LINE_WIDTHB * 4) + (128 >> 2) # 12 sh
.word 1, 7, center_8_8, FB0 + line + (16 >> 2) + (LINE_WIDTHB * 1) + (128 >> 2) # 8
.word 1, 7, center_8_8, FB0 + line + (24 >> 2) + (LINE_WIDTHB * 3) + (128 >> 2) # 8
.word 1, 6, center_8_8, FB0 + line + (32 >> 2) + (LINE_WIDTHB * 8) + (128 >> 2) # 8
DIGITS2_1_IDX: .word 0
DIGITS2_2_IDX: .word 0
.equiv DIGIT1_WIDTH, 24
.equiv DIGIT1_HEIGHT, 30
.equiv DIGIT1_SIZE, DIGIT1_WIDTH >> 2 * DIGIT1_HEIGHT
DIGITS1_1_IDX: .word 3 * DIGIT1_SIZE # 150
DIGITS1_2_IDX: .word 0
DIGITS1_3_IDX: .word 2 * DIGIT1_SIZE # 150
DIGITS1_4_IDX: .word 1 * DIGIT1_SIZE # 150
DIGITS1_9_CALC:
MOV $DIGIT1_SIZE *10, R2 # MOV $150*10, R2
BR DIGITS1_CALC
DIGITS1_5_CALC:
MOV $DIGIT1_SIZE * 6, R2 # MOV $150*6, R2
BR DIGITS1_CALC
DIGITS1_3_CALC:
MOV $DIGIT1_SIZE * 4, R2 # MOV $150*4, R2
BR DIGITS1_CALC
DIGITS1_2_CALC:
MOV $DIGIT1_SIZE * 3, R2 # MOV $150*3, R2
DIGITS1_CALC:
ADD $DIGIT1_SIZE, (R1) # ADD $150, (R1)
CMP (R1), R2
BLO 1237$
CLR (R1)
1237$: RETURN
DIGITS2_CALC:
ADD $24, (R1)
CMP (R1), $240
BLO 1237$
CLR (R1)
1237$: RETURN
DISPLAY_DIGITS1:
MOV (R1), R1
ADD 2(R5), R1
ADD R5, R1
MOV $DIGIT1_HEIGHT, R2
MOV $DIGIT1_WIDTH>>3, R3 # MOV $5, R3
BR DISPLAY_DIGIT1_GFX
DISPLAY_DIGITS1_SHIFTED:
MOV (R1), R1
ADD 0110(R5), R1
ADD R5, R1
MOV $DIGIT1_HEIGHT, R2
MOV $DIGIT1_WIDTH>>3, R3 # MOV $5, R3
BR DISPLAY_DIGIT1_GFX_SHIFTED
DISPLAY_DIGITS2:
MOV (R1), R1
ADD 4(R5), R1
ADD R5, R1
MOV $12, R2
MOV $1, R3 # MOV $2, R3
DISPLAY_GFX:
PUSH R4
10$:
PUSH R0
MOV R3, R4
1$:
MOV (R1)+, (R0)+ # MOVB (R1)+, (R0)+ #
SOB R4, 1$
POP R0
ADD $LINE_WIDTHB, R0
SOB R2, 10$
POP R4
RETURN
DISPLAY_DIGITS2_SHIFTED:
MOV (R1), R1
ASL R1
ADD 0112(R5), R1
ADD R5, R1
MOV $12, R2
PUSH R4
MOV $0xF0F0,R3
MOV $0x0F0F,R4
10$:
PUSH R0
BIC R3,(R0)
BIS (R1)+, (R0)+ # MOVB (R1)+, (R0)+ #
BIC R4,(R0)
BIS (R1)+, (R0)+ # MOVB (R1)+, (R0)+ #
POP R0
ADD $LINE_WIDTHB, R0
SOB R2, 10$
POP R4
RETURN
DISPLAY_DIGIT1_GFX:
PUSH R4
MOV $0xFFFF,R3
MOV $0x0F0F,R4
10$:
PUSH R0
BIC R3,(R0)
BIS (R1)+, (R0)+ # MOVB (R1)+, (R0)+ #
BIC R3,(R0)
BIS (R1)+, (R0)+ # MOVB (R1)+, (R0)+ #
BIC R4,(R0)
BIS (R1)+, (R0)+ # MOVB (R1)+, (R0)+ #
POP R0
ADD $LINE_WIDTHB, R0
SOB R2, 10$
POP R4
RETURN
DISPLAY_DIGIT1_GFX_SHIFTED:
PUSH R4
MOV $0xF0F0,R3
MOV $0xFFFF,R4
10$:
PUSH R0
BIC R3,(R0)
BIS (R1)+, (R0)+ # MOVB (R1)+, (R0)+ #
BIC R4,(R0)
BIS (R1)+, (R0)+ # MOVB (R1)+, (R0)+ #
BIC R4,(R0)
BIS (R1)+, (R0)+ # MOVB (R1)+, (R0)+ #
POP R0
ADD $LINE_WIDTHB, R0
SOB R2, 10$
POP R4
RETURN
CLOCK_GFX:
.incbin "build/clock1_gfx.bin"
.even