-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcounter.asm
More file actions
399 lines (394 loc) · 8.29 KB
/
counter.asm
File metadata and controls
399 lines (394 loc) · 8.29 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
processor 6502
org $400
; Starting new memory block at $400
StartBlock400
.byte $0, $0E, $08, $0A, $00, $9E, $20, $28
.byte $31,$30,$34,$30
.byte $29, $00, $00, $00
; Ending memory block
EndBlock400
org $410
; Starting new memory block at $410
StartBlock410
counterz
jsr initsine_calculate
; LineNumber: 7
jmp block1
; LineNumber: 4
x dc.b $00
; LineNumber: 4
y dc.b $00
; LineNumber: 4
time dc.b $00
; LineNumber: 4
time2 dc.b $00
; LineNumber: 4
i dc.b $00
; LineNumber: 5
ti = $8f
; LineNumber: 6
oldti dc.b 0
; NodeProcedureDecl -1
; *********** Defining procedure : init16x8div
; Procedure type : Built-in function
; Requires initialization : no
initdiv16x8_divisor = $4c ;$59 used for hi-byte
initdiv16x8_dividend = $4e ;$fc used for hi-byte
initdiv16x8_remainder = $50 ;$fe used for hi-byte
initdiv16x8_result = $4e ;save memory by reusing divident to store the result
divide16x8 lda #0 ;preset remainder to 0
sta initdiv16x8_remainder
sta initdiv16x8_remainder+1
ldx #16 ;repeat for each bit: ...
divloop16 asl initdiv16x8_dividend ;dividend lb & hb*2, msb -> Carry
rol initdiv16x8_dividend+1
rol initdiv16x8_remainder ;remainder lb & hb * 2 + msb from carry
rol initdiv16x8_remainder+1
lda initdiv16x8_remainder
sec
sbc initdiv16x8_divisor ;substract divisor to see if it fits in
tay ;lb result -> Y, for we may need it later
lda initdiv16x8_remainder+1
sbc initdiv16x8_divisor+1
bcc skip16 ;if carry=0 then divisor didn't fit in yet
sta initdiv16x8_remainder+1 ;else save substraction result as new remainder,
sty initdiv16x8_remainder
inc initdiv16x8_result ;and INCrement result cause divisor fit in 1 times
skip16 dex
bne divloop16
rts
; NodeProcedureDecl -1
; *********** Defining procedure : init8x8div
; Procedure type : Built-in function
; Requires initialization : no
div8x8_c = $4c
div8x8_d = $4e
div8x8_e = $50
; Normal 8x8 bin div
div8x8_procedure
lda #$00
ldx #$07
clc
div8x8_loop1 rol div8x8_d
rol
cmp div8x8_c
bcc div8x8_loop2
sbc div8x8_c
div8x8_loop2 dex
bpl div8x8_loop1
rol div8x8_d
lda div8x8_d
div8x8_def_end
rts
; NodeProcedureDecl -1
; *********** Defining procedure : initmoveto
; Procedure type : Built-in function
; Requires initialization : no
jmp initmoveto_moveto2
screenmemory = $fe
colormemory = $fc
screen_x = $4c
screen_y = $4e
SetScreenPosition
sta screenmemory+1
lda #0
sta screenmemory
ldy screen_y
beq sydone
syloop
clc
adc #80
bcc sskip
inc screenmemory+1
sskip
dey
bne syloop
sydone
ldx screen_x
beq sxdone
clc
adc screen_x
bcc sxdone
inc screenmemory+1
sxdone
sta screenmemory
rts
initmoveto_moveto2
rts
; NodeProcedureDecl -1
; *********** Defining procedure : initprintstring
; Procedure type : User-defined procedure
print_text = $4c
print_number_text .dc " ",0
printstring
ldy #0
printstringloop
lda (print_text),y
cmp #0 ;keep
beq printstring_done
cmp #64
bcc printstring_skip
sec
sbc #64
printstring_skip
sta (screenmemory),y
iny
dex
cpx #0
beq printstring_done
jmp printstringloop
printstring_done
rts
; NodeProcedureDecl -1
; *********** Defining procedure : initsinetable
; Procedure type : Built-in function
; Requires initialization : no
sine .byte 0
org sine +#255
value .word 0
delta .word 0
initsine_calculate
ldy #$3f
ldx #$00
initsin_a
lda value
clc
adc delta
sta value
lda value+1
adc delta+1
sta value+1
sta sine+$c0,x
sta sine+$80,y
eor #$ff
sta sine+$40,x
sta sine+$00,y
lda delta
adc #$10 ; this value adds up to the proper amplitude
sta delta
bcc initsin_b
inc delta+1
initsin_b
inx
dey
bpl initsin_a
rts
block1
; LineNumber: 8
; MoveTo optimization
lda #$00
sta screenmemory
lda #>$8000
clc
adc #$00
sta screenmemory+1
; LineNumber: 10
; // infinite loop
; Clear screen with offset
lda #$20
ldx #$fa
MainProgram_clearloop3
dex
sta $0000+$8000,x
sta $00fa+$8000,x
sta $01f4+$8000,x
sta $02ee+$8000,x
sta $03e8+$8000,x
sta $04e2+$8000,x
sta $05dc+$8000,x
sta $06d6+$8000,x
bne MainProgram_clearloop3
; LineNumber: 12
MainProgram_while4
; Binary clause Simplified: NOTEQUALS
lda #$1
; Compare with pure num / var optimization
cmp #$0;keep
beq MainProgram_localfailed36
jmp MainProgram_ConditionalTrueBlock5
MainProgram_localfailed36
jmp MainProgram_elsedoneblock7
MainProgram_ConditionalTrueBlock5: ;Main true block ;keep
; LineNumber: 13
; LineNumber: 15
; Assigning single variable : time2
inc time2
; LineNumber: 17
MainProgram_while38
; Binary clause Simplified: EQUALS
lda ti
; Compare with pure num / var optimization
cmp oldti;keep
bne MainProgram_elsedoneblock41
MainProgram_ConditionalTrueBlock39: ;Main true block ;keep
; LineNumber: 16
; LineNumber: 17
jmp MainProgram_while38
MainProgram_elsedoneblock41
; LineNumber: 18
; Assigning single variable : oldti
lda ti
; Calling storevariable
sta oldti
; LineNumber: 20
MainProgram_printstring_call44
clc
lda #<MainProgram_printstring_text45
adc #$0
ldy #>MainProgram_printstring_text45
sta print_text+0
sty print_text+1
ldx #$28 ; optimized, look out for bugs
jsr printstring
; LineNumber: 23
; // Calculate x,y some sine values(making a circle)
; // if sine[x] then sine[x+64] is equal to cosine
; Assigning single variable : x
; 8 bit binop
; Add/sub where right value is constant number
; Right is PURE NUMERIC : Is word =0
; 8 bit div
; Load Unknown type array
ldx time
lda sine,x
sta div8x8_d
; Load right hand side
lda #$6
sta div8x8_c
jsr div8x8_procedure
clc
adc #$c
; end add / sub var with constant
; Calling storevariable
sta x
; LineNumber: 24
; Assigning single variable : y
; 8 bit binop
; Add/sub where right value is constant number
; Right is PURE NUMERIC : Is word =0
; 8 bit mul of power 2
; Load Unknown type array
; 8 bit binop
; Add/sub where right value is constant number
lda time
clc
adc #$40
; end add / sub var with constant
tax
lda sine,x
lsr
lsr
lsr
lsr
clc
adc #$4
; end add / sub var with constant
; Calling storevariable
sta y
; LineNumber: 26
; // move "screenmemory" cursor to x,y at screen memory $0400
lda x
sta screen_x
lda y
sta screen_y
lda #>$8000
jsr SetScreenPosition
; LineNumber: 27
; Assigning single variable : i
; 8 bit binop
; Add/sub where right value is constant number
lda time
lsr
lsr
lsr
lsr
lsr
lsr
and #$3
; end add / sub var with constant
; Calling storevariable
sta i
; LineNumber: 29
cmp #$0 ;keep
bne MainProgram_casenext49
; LineNumber: 29
; // i will now have values between 0 and 3(since time is between 0 and 255)
; // Print some random string
MainProgram_printstring_call51
clc
lda #<MainProgram_printstring_text52
adc #$0
ldy #>MainProgram_printstring_text52
sta print_text+0
sty print_text+1
ldx #$28 ; optimized, look out for bugs
jsr printstring
jmp MainProgram_caseend48
MainProgram_casenext49
lda i
cmp #$1 ;keep
bne MainProgram_casenext53
; LineNumber: 30
MainProgram_printstring_call55
clc
lda #<MainProgram_printstring_text56
adc #$0
ldy #>MainProgram_printstring_text56
sta print_text+0
sty print_text+1
ldx #$28 ; optimized, look out for bugs
jsr printstring
jmp MainProgram_caseend48
MainProgram_casenext53
lda i
cmp #$2 ;keep
bne MainProgram_casenext57
; LineNumber: 31
MainProgram_printstring_call59
clc
lda #<MainProgram_printstring_text60
adc #$0
ldy #>MainProgram_printstring_text60
sta print_text+0
sty print_text+1
ldx #$28 ; optimized, look out for bugs
jsr printstring
jmp MainProgram_caseend48
MainProgram_casenext57
lda i
cmp #$3 ;keep
bne MainProgram_casenext61
; LineNumber: 32
MainProgram_printstring_call63
clc
lda #<MainProgram_printstring_text64
adc #$0
ldy #>MainProgram_printstring_text64
sta print_text+0
sty print_text+1
ldx #$28 ; optimized, look out for bugs
jsr printstring
jmp MainProgram_caseend48
MainProgram_casenext61
MainProgram_caseend48
; LineNumber: 36
; // Increase the timer
; Assigning single variable : time
inc time
; LineNumber: 38
jmp MainProgram_while4
MainProgram_elsedoneblock7
; LineNumber: 39
; End of program
; Ending memory block
EndBlock410
MainProgram_printstring_text45 dc.b " "
dc.b 0
MainProgram_printstring_text52 dc.b "I AM FISH"
dc.b 0
MainProgram_printstring_text56 dc.b "ARE YOU FISH"
dc.b 0
MainProgram_printstring_text60 dc.b "ME AM CAT"
dc.b 0
MainProgram_printstring_text64 dc.b "OM NOM NOM"
dc.b 0