-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathflappyBird.asm
More file actions
456 lines (372 loc) · 6.65 KB
/
flappyBird.asm
File metadata and controls
456 lines (372 loc) · 6.65 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
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
ORG 00H
; MEMORY STRUCTURE:
; 60H TO 67H: MAP & OBSTACLES
; 68H: BIRD POSITION (ONE-HOT ROW MASK FOR FIRST COLUMN)
; 69H: COUNTER FOR DELAY1
; 6AH: COUNTER FOR DELAY1
; 70H: RESERVED FOR LCD DELAYS
; 71H: STORES SCORE TO DISPLAY ON LCD (LSB)
; 72H: STORES SCORE TO DISPLAY ON LCD (MSB)
;THIS PROGRAM USES NONBLOCKING DELAYS
;NONBLOCKING DELAYS WORKING:
; CLR A
; ACALL DELAY
; IF SUFFICIENT TIME HAS PASSED, A = #0FFH; ELSE A = #000H
;THIS WAY, PROGRAM DOES NOT STAY INSIDE A DELAY PROGRAM FOR THE ENTIRE DURATION OF THE DELAY
MOV 60H, #000H
MOV 61H, #000H
MOV 62H, #000H
MOV 63H, #07EH
MOV 64H, #03CH
MOV 65H, #018H
MOV 66H, #000H
MOV 67H, #000H
MOV R7, #60H;
SETB P3.7
ACALL LCDINITIALIZATION
REP5:
ACALL UPDATEDISPLAY
JB P3.7, REP5
MOV 60H, #000H
MOV 61H, #000H
MOV 62H, #000H
MOV 63H, #000H
MOV 64H, #000H
MOV 65H, #000H
MOV 66H, #000H
MOV 67H, #000H
MOV 68H, #001H
MOV 70H, #001H
MOV 71H, #000H
MOV 72H, #000H
MOV R7, #60H; 60H WILL BE THE STARTING BYTE OF MEMORY THAT WILL BE PRINTED ON LED MATRIX
ACALL STARTRANDOMIZER
ACALL PRINTSCORE
REPEAT:
JNB TF0, SKIP3
CLR TR0
CLR TF0
SETB TR0
SKIP3:
ACALL CREATEOBSTACLE
MOV A, #00H
ACALL DELAY1
CJNE A, #0FFH, SKIP2
ACALL UPDATEBIRD
ACALL CHECKCOLLISION
ACALL SHIFTDISPLAYLEFT
ACALL PRINTSCORE
ACALL SCORECOUNTER
SKIP2:
ACALL UPDATEDISPLAY
SJMP REPEAT
;---------------------------------------------------------------------------------------------------------------
UPDATEDISPLAY:
MOV R0, #00H; COUNTER TO COUNT FROM 0 TO 8
MOV B, #01H ; ACTS AS COLUMN SELECTOR
REP1:
MOV A, R0
ADD A, R7 ; 60H TO 67H WILL STORE THE DATA THATS DISPLAYED ON LED MATRIX
MOV R1, A
MOV A, @R1
CJNE R0, #00H, SKIPBIRD
ORL A, 68H
SKIPBIRD:
MOV P0, B ; P0 IS USED TO SELECT COLUMN
MOV P2, A ; P2 IS USED TO DISPLAY COLUMN DATA FROM MEMORY
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
INC R0
MOV A, B ; SHIFTING SO THAT NEXT COLUMN CAN BE PRINTED
RL A
MOV B, A
CJNE R0, #08H, REP1
RET
;---------------------------------------------------------------------------------------------------------------
SHIFTDISPLAYLEFT:
MOV R0, #01H; COUNTER TO COUNT FROM 0 TO 8
REP2:
MOV A, R0
ADD A, R7 ; 60H TO 67H STORES THE DATA THATS DISPLAYED ON LED MATRIX
MOV R1, A
MOV A, @R1
DEC R1 ; HERE DATA FROM iTH COLUMN IS SHIFTED TO i-1TH COLUMN TO SHIFT WHOLE DISPLAY TO THE LEFT
MOV @R1, A
INC R0
CJNE R0, #08H, REP2
MOV 67H, #00H
RET
;---------------------------------------------------------------------------------------------------------------
UPDATEBIRD:
; P3.7 IS USED AS THE FLAP BUTTON. ADDING PULL UP REGISTER AND BUTTON TO GROUD
;ACTIVE LOW.
JNB P3.7, BIRDUP
BIRDDOWN:
MOV A, 68H
CJNE A, #80H, BIRDDOWNSTEP
RET
BIRDDOWNSTEP:
RL A
MOV 68H, A
RET
BIRDUP:
MOV A, 68H
CJNE A, #01H, BIRDUPSTEP
RET
BIRDUPSTEP:
RR A
MOV 68H, A
RET
;---------------------------------------------------------------------------------------------------------------
CHECKCOLLISION:
MOV A, 60H
ANL A, 68H
JZ NOCOLLISION
SJMP GAMEOVER
NOCOLLISION:
RET
GAMEOVER:
MOV A, #0C0H;
ACALL CMD
NOP
MOV R6, #00H
MOV DPTR, #ENDMSG
REP7:
MOV A, R6
MOVC A, @A + DPTR
CJNE A, #00H, SKIP13
SJMP REP6
SKIP13:
ACALL DAT
NOP
INC R6
SJMP REP7
REP6:
SJMP REP6
;---------------------------------------------------------------------------------------------------------------
STARTRANDOMIZER:
MOV TMOD, #06H; -> SETTING TIMER0 AS COUNTER, MODE 0
MOV TL0, #0FAH
MOV TH0, #0FAH
SETB P3.4
CLR TF0
SETB TR0
RET
;---------------------------------------------------------------------------------------------------------------
RUNRANDOMIZER:
MOV B, #00H
MOV A, TL0
CJNE A, #0FAH, NEXT1
MOV B, #11111000B
NEXT1:
CJNE A, #0FBH, NEXT2
MOV B, #11110001B
NEXT2:
CJNE A, #0FCH, NEXT3
MOV B, #11100011B
NEXT3:
CJNE A, #0FDH, NEXT4
MOV B, #11000111B
NEXT4:
CJNE A, #0FEH, NEXT5
MOV B, #10001111B
NEXT5:
CJNE A, #0FFH, NEXT6
MOV B, #00011111B
NEXT6:
MOV A, B
RET
;---------------------------------------------------------------------------------------------------------------
CREATEOBSTACLE:
MOV A, 64H
CJNE A, #00H, SKIP1
MOV A, 65H
CJNE A, #00H, SKIP1
MOV A, 66H
CJNE A, #00H, SKIP1
MOV A, 67H
CJNE A, #00H, SKIP1
ACALL RUNRANDOMIZER
MOV 67H, A
SKIP1:
RET
;---------------------------------------------------------------------------------------------------------------
DELAY1:
MOV A, 69H
MOV B, #01H
ADD A, B
MOV 69H, A
JNC NOCARRY
MOV A, 6AH
ADD A, B
MOV 6AH, A
CJNE A, #05H, NOCARRY
MOV 69H, #00H
MOV 6AH, #00H
MOV A, #0FFH
RET
NOCARRY:
MOV A, #000H
RET
;---------------------------------------------------------------------------------------------------------------
SCORECOUNTER:
MOV A, 60H
CJNE A, #00H, SKIP4
RET
SKIP4:
MOV A, 71H
MOV B, #00FH
ANL A, B
CJNE A, #09H, SKIP5
MOV A, 71H
MOV B, #0F0H
ANL A, B
CJNE A, #90H, SKIP6
MOV A, 72H
MOV B, #00FH
ANL A, B
CJNE A, #09H, SKIP7
MOV A, 72H
MOV B, #0F0H
ANL A, B
CJNE A, #90H, SKIP8
MOV 71H, #00H
MOV 72H, #00H
SKIP5:
MOV A, 71H
INC A
MOV 71H, A
RET
SKIP6:
MOV A, 71H
MOV B, #0F0H
ANL A, B
MOV B, #10H
ADD A, B
MOV 71H, A
RET
SKIP7:
MOV 71H, #00H
MOV A, 72H
INC A
MOV 72H, A
RET
SKIP8:
MOV 71H, #00H
MOV A, 72H
MOV B, #0F0H
ANL A, B
MOV B, #10H
ADD A, B
MOV 72H, A
RET
;---------------------------------------------------------------------------------------------------------------
CMD:
CLR P3.2
MOV P1, A
ACALL EXECUTELCD
RET
DAT:
SETB P3.2
MOV P1, A
ACALL EXECUTELCD
RET
;---------------------------------------------------------------------------------------------------------------
LCDINITIALIZATION:
MOV A, #38H; 2 line 8 bit mode
ACALL CMD
NOP
MOV A, #0EH; display on cursor blink
ACALL CMD
NOP
MOV R6, #00H
MOV DPTR, #MSG
REP4:
MOV A, R6
MOVC A, @A + DPTR
CJNE A, #00H, SKIP11
RET
SKIP11:
CJNE R6, #10H, SKIP12
MOV B, A
MOV A, #0C0H
ACALL CMD
NOP
MOV A, B
SKIP12:
ACALL DAT
NOP
INC R6
SJMP REP4
RET
;---------------------------------------------------------------------------------------------------------------
PRINTSCORE:
MOV B, #30H
MOV A, #01H; clear screen
ACALL CMD
MOV A, #80H; cursor set to first line beginning
ACALL CMD
MOV A, #' '
ACALL DAT
MOV A, #'S'
ACALL DAT
MOV A, #'C'
ACALL DAT
MOV A, #'O'
ACALL DAT
MOV A, #'R'
ACALL DAT
MOV A, #'E'
ACALL DAT
MOV A, #':'
ACALL DAT
MOV A, #' '
ACALL DAT
MOV A, 72H
RL A
RL A
RL A
RL A
ANL A, #0FH
ADD A, B
ACALL DAT
MOV A, 72H
ANL A, #0FH
ADD A, B
ACALL DAT
MOV A, 71H
RL A
RL A
RL A
RL A
ANL A, #0FH
ADD A, B
ACALL DAT
MOV A, 71H
ANL A, #0FH
ADD A, B
ACALL DAT
RET
;---------------------------------------------------------------------------------------------------------------
EXECUTELCD:
SETB P3.3
REP3:
MOV A, 70H
INC A
MOV 70H, A
CJNE A, #0FH, REP3
MOV 70H, #00H
CLR P3.3
RET
;---------------------------------------------------------------------------------------------------------------
MSG:
DB "PRESS BUTTON TO START", 0
ENDMSG:
DB " GAME OVER", 0
END