-
Notifications
You must be signed in to change notification settings - Fork 0
/
prac5.lst
4254 lines (3674 loc) · 165 KB
/
prac5.lst
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
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
ARM Macro Assembler Page 1
1 00000000 AREA datos,DATA
2 00000000 ; variables y constantes
3 00000000 FFFFF000
VICBaseEnabl
EQU 0xFFFFF000 ;base para activar
IRQ
4 00000000 00000010
IntEnableOffset
EQU 0x10 ;selecciona activar
IRQ4
5 00000000 00000004
IRQ_Timer0
EQU 4 ;Nº de IRQ4 del Tim
er 0
6 00000000 00000007
IRQ_UART
EQU 7 ;Nº de IRQ7 del UAR
T
7 00000000
8 00000000 FFFFF010
VICIntEnable
EQU 0xFFFFF010
9 00000000 FFFFF014
VICIntEnClr
EQU 0xFFFFF014 ;desactivar IRQs (s
olo bits 1)
10 00000000
11 00000000 FFFFF100
VICVectAddr0
EQU 0xFFFFF100
12 00000000 ;Registro con la @ de la 1ª instr de la RSI_IRQ0 vectori
zada
13 00000000 FFFFF030
VICVectAddr
EQU 0xFFFFF030 ;Registro @VI
14 00000000 E0004000
T0_IR EQU 0xE0004000
15 00000000 E0010000
UART_IR EQU 0xE0010000
16 00000000 00000080
I_Bit EQU 0x80 ;bit7 de la CPSR, s
i a 1 inhibe
17 00000000
18 00000000 ;Globales
19 00000000
20 00000000 00000000
reloj DCD 0 ;contador de centes
imas de segundo
21 00000004 00 fin DCB 0 ;indicador fin de p
rograma (si vale 1)
22 00000005 00000020
MINUS EQU 'a' - 'A'
23 00000005 00 00 00 ALIGN 4
24 00000008 00000000
ASCII DCD 0 ;caracter pulsado
25 0000000C
26 0000000C ;vuestras variables y constantes
27 0000000C 40007E00
ARM Macro Assembler Page 2
DIR_SCREEN
EQU 0x40007E00 ;direción de la pan
talla
28 0000000C 00000010
SCREEN_R
EQU 16 ;filas de la pantal
la
29 0000000C 00000020
SCREEN_C
EQU 32 ;columnas de la pan
talla
30 0000000C 00000200
SCREEN_PX
EQU SCREEN_R*SCREEN_C ;numero de pi
xeles (@s) de la pa
ntalla
31 0000000C 20 20 20
20 20 20
20 5F 5F
5F 20 20
5F 5F 20
20 20 20
20 20 20
20 20 5F
5F 5F 20
20 20 20
20 20 20
20 20 20
20 20 7C
20 20 20
20 7C 20
20 7C 20
7C 5C 20
2F 7C 20
7C 20 20
20 20 20
20 20 20
20 20 20
20 20 20
20 7C 20
5F 5F 20
7C 5F 5F
7C 20 7C
20 56 20
7C 20 7C
5F 20 20
20 20 20
20 20 20
20 20 20
20 20 20
7C 20 20
7C 20 7C
20 20 7C
20 7C 20
20 20 7C
20 7C 20
20 20 20
20 20 20
20 20 20
ARM Macro Assembler Page 3
20 20 20
20 20 7C
5F 5F 7C
20 7C 20
20 7C 20
7C 20 20
20 7C 20
7C 5F 5F
5F 20 20
20 20 20
20 20 20
20 20 20
20 20 5F
5F 20 20
20 20 20
20 20 20
20 5F 5F
5F 20 20
5F 5F 20
20 20 20
20 20 20
20 20 20
20 20 20
7C 20 20
7C 20 7C
20 20 20
7C 20 7C
20 20 20
20 7C 20
20 5C 20
20 20 20
20 20 20
20 20 20
20 20 7C
20 20 7C
20 7C 20
20 20 7C
20 7C 5F
20 20 20
7C 5F 5F
7C 20 20
20 20 20
20 20 20
20 20 20
20 7C 20
20 7C 20
20 5C 20
2F 20 20
7C 20 20
20 20 7C
20 5C 20
20 20 20
20 20 20
20 20 20
20 20 20
7C 5F 5F
7C 20 20
20 56 20
20 20 7C
ARM Macro Assembler Page 4
5F 5F 5F
20 7C 20
20 5C 20
20 20 20
20 20 SCREEN_GAMEOVER
DCB 0x20,0x20,0x20,0x20,0x20,0x20,0
x20,0x5F,0x5F,0x5F,0x20,0x20,0x5F,0x5F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x5F,0x5F,0x5F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20
,0x7C,0x20,0x20,0x20,0x20,0x7C,0x20,0x20,0x7C,0x20,0x7C,0x5C,0x20,0x2F,0x7C,0x2
0,0x7C,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x
20,0x7C,0x20,0x5F,0x5F,0x20,0x7C,0x5F,0x5F,0x7C,0x20,0x7C,0x20,0x56,0x20,0x7C,0
x20,0x7C,0x5F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x7C,0x20,0x20,0x7C,0x20,0x7C,0x20,0x20,0x7C,0x20,0x7C,0x20,0x20,0x20,0x7C
,0x20,0x7C,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2
0,0x20,0x7C,0x5F,0x5F,0x7C,0x20,0x7C,0x20,0x20,0x7C,0x20,0x7C,0x20,0x20,0x20,0x
7C,0x20,0x7C,0x5F,0x5F,0x5F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0
x20,0x20,0x20,0x5F,0x5F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5F,0x5F,
0x5F,0x20,0x20,0x5F,0x5F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20
,0x20,0x20,0x7C,0x20,0x20,0x7C,0x20,0x7C,0x20,0x20,0x20,0x7C,0x20,0x7C,0x20,0x2
0,0x20,0x20,0x7C,0x20,0x20,0x5C,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x
20,0x20,0x20,0x7C,0x20,0x20,0x7C,0x20,0x7C,0x20,0x20,0x20,0x7C,0x20,0x7C,0x5F,0
x20,0x20,0x20,0x7C,0x5F,0x5F,0x7C,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x7C,0x20,0x20,0x7C,0x20,0x20,0x5C,0x20,0x2F,0x20,0x20,0x7C,0x20
,0x20,0x20,0x20,0x7C,0x20,0x5C,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2
0,0x20,0x20,0x20,0x7C,0x5F,0x5F,0x7C,0x20,0x20,0x20,0x56,0x20,0x20,0x20,0x7C,0x
5F,0x5F,0x5F,0x20,0x7C,0x20,0x20,0x5C,0x20,0x20,0x20,0x20,0x20,0x20
32 0000014C 0A SCREEN_GAMEOVER_END
DCB '\n'
33 0000014D 20 20 20
20 20 20
20 20 20
20 20 20
20 20 20
5F 5F 20
20 20 20
20 20 20
20 20 20
20 20 20
20 20 20
20 20 20
20 20 20
20 5C 20
20 20 2F
20 7C 20
20 7C 20
7C 20 20
7C 20 20
20 20 20
20 20 20
20 20 20
20 20 20
20 20 20
20 5C 20
2F 20 20
7C 20 20
7C 20 7C
20 20 7C
20 20 20
20 20 20
ARM Macro Assembler Page 5
20 20 20
20 20 20
20 20 20
20 20 20
20 7C 20
20 20 7C
20 20 7C
20 7C 20
20 7C 20
20 20 20
20 20 20
20 20 20
20 20 20
20 20 20
20 20 20
7C 20 20
20 7C 5F
5F 7C 20
7C 5F 5F
7C 20 20
20 20 20
20 20 20
20 20 20
20 20 20
20 20 20
20 20 20
20 20 20
5F 5F 5F
20 20 20
20 20 20
20 20 20
20 20 20
20 20 20
20 20 20
20 20 20
7C 20 20
20 20 20
7C 20 20
7C 20 20
7C 5C 20
20 20 7C
20 7C 20
20 20 20
20 20 20
20 20 20
20 20 7C
20 20 7C
20 20 7C
20 20 7C
20 20 7C
20 5C 20
20 7C 20
7C 20 20
20 20 20
20 20 20
20 20 20
20 7C 20
20 7C 20
20 7C 20
ARM Macro Assembler Page 6
20 7C 20
20 7C 20
20 5C 20
7C 20 7C
20 20 20
20 20 20
20 20 20
20 20 20
20 5C 2F
20 5C 2F
20 20 5F
7C 5F 20
7C 20 20
20 5C 7C
20 4F 20
20 20 20
20 20 SCREEN_WIN
DCB ' ',' ',' ',' ',' ',' ',' ',' '
,' ',' ',' ',' ',' ',' ',' ','_','_',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','
',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','\\',' ',' ',' ','/',' ','|',
' ',' ','|',' ','|',' ',' ','|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '
,' ',' ',' ',' ',' ',' ','\\',' ','/',' ',' ','|',' ',' ','|',' ','|',' ',' ','
|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
'|',' ',' ',' ','|',' ',' ','|',' ','|',' ',' ','|',' ',' ',' ',' ',' ',' ',' '
,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',' ',' ',' ','|','_','_','|
',' ','|','_','_','|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','
',' ',' ',' ',' ',' ',' ',' ',' ','_','_','_',' ',' ',' ',' ',' ',' ',' ',' ',
' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|',' ',' ',' ',' ',' ','|'
,' ',' ','|',' ',' ','|','\\',' ',' ',' ','|',' ','|',' ',' ',' ',' ',' ',' ','
',' ',' ',' ',' ',' ','|',' ',' ','|',' ',' ','|',' ',' ','|',' ',' ','|',' ',
'\\',' ',' ','|',' ','|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|','
',' ','|',' ',' ','|',' ',' ','|',' ',' ','|',' ',' ','\\',' ','|',' ','|',' ',
' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','\\','/',' ','\\','/',' ',' ','
_','|','_',' ','|',' ',' ',' ','\\','|',' ','O',' ',' ',' ',' ',' ',' '
34 0000028D 0A SCREEN_WIN_END
DCB '\n'
35 0000028E 20 20 20
20 20 20
20 20 20
20 50 52
45 53 53
20 53 50
41 43 45
20 20 20
20 20 20
20 20 20
20 20 20
20 20 20
20 20 20
20 20 20
20 54 4F
20 53 54
41 52 54
20 20 20
20 20 20
20 20 20
20 20 20 SCREEN_START
DCB ' ',' ',' ',' ',' ',' ',' ',' '
,' ',' ','P','R','E','S','S',' ','S','P','A','C','E',' ',' ',' ',' ',' ',' ','
ARM Macro Assembler Page 7
',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','T','O',' ','S','
T','A','R','T',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '
36 000002CD 0A SCREEN_START_END
DCB '\n'
37 000002CE 50 41 55
53 45 44 SCREEN_PAUSE
DCB 'P','A','U','S','E','D'
38 000002D4 0A SCREEN_PAUSE_END
DCB '\n'
39 000002D5
40 000002D5 00 00 00 ALIGN 4
41 000002D8
42 000002D8 00000020
CHAR_CLEAR
EQU ' ' ;caracter de borrad
o de pantalla
43 000002D8
44 000002D8 00000023
CHAR_CANYON
EQU '#' ;caracter de respre
sentación del cañón
45 000002D8 0000004B
CHAR_CANYON_L
EQU 'K' ;cañon hancia la iz
quierda
46 000002D8 0000004C
CHAR_CANYON_R
EQU 'L' ;cañon hacia la der
echa
47 000002D8 00000010
CANYON_CENTER
EQU SCREEN_C/2 ;centro del cañón e
n el instante incia
l
48 000002D8
49 000002D8 0000002A
CHAR_BULLET
EQU '*' ;caracter de repres
entación bala de ca
ñon
50 000002D8 00000020
CHAR_BULLET_SHOOT
EQU 0x20
51 000002D8 0000002B
CHAR_BULLET_F
EQU '+' ;duplica velocidad
balas
52 000002D8 0000002D
CHAR_BULLET_S
EQU '-' ;reduce velodidad b
alas
53 000002D8 00000001
BULLET_QUICK
EQU 1 ;centesimas de segu
ndo entre movimeint
os a máxima velocid
ad
54 000002D8 00000080
ARM Macro Assembler Page 8
BULLET_SLOW
EQU 128 ;centesimas de segu
ndo entre movimeint
os a minima velocid
ad
55 000002D8 00000010
BULLET_SPEED
DCD 16 ;promedio centesima
s de segundo entre
movimeintos
56 000002DC 10 bullet_timer
DCB 16
57 000002DD
58 000002DD 00 00 00 ALIGN 4
59 000002E0 0000000A
bullet_count
DCD 10 ;cantidad inicial d
e valas (MAX: 9999)
60 000002E4 00000000
bullets_over
DCD 0 ;contador para acab
ar el programa cuan
do ya no quedan bal
as
61 000002E8 ;ALIGN 4
62 000002E8 30 bullet_count_d1
DCB '0'
63 000002E9 30 bullet_count_d2
DCB '0'
64 000002EA 31 bullet_count_d3
DCB '1'
65 000002EB 30 bullet_count_d4
DCB '0'
66 000002EC
67 000002EC 00000000
score DCD 0 ;puntuación acumula
da
68 000002F0 ;ALIGN 4
69 000002F0 30 score_d1
DCB '0'
70 000002F1 30 score_d2
DCB '0'
71 000002F2 30 score_d3
DCB '0'
72 000002F3 30 score_d4
DCB '0'
73 000002F4
74 000002F4 0000003C
CHAR_ENEMY_L
EQU '<' ;caracter de repres
entación de enemigo
75 000002F4 0000003E
CHAR_ENEMY_R
EQU '>' ;caracter de repres
entación de enemigo
76 000002F4 00000041
ARM Macro Assembler Page 9
CHAR_ENEMY_F
EQU 'A' ;duplica velocidad
de enemigos
77 000002F4 0000005A
CHAR_ENEMY_S
EQU 'Z' ;reduce velodidad d
e enemigos
78 000002F4 00000002
ENEMY_MIN
EQU 2 ;minima longitud en
emigo
79 000002F4 0000000A
ENEMY_MAX
EQU 10 ;maxima longitud en
emigo
80 000002F4 00000001
ENEMY_QUICK
EQU 1 ;centesimas de segu
ndo entre movimeint
os a máxima velocid
ad
81 000002F4 00000080
ENEMY_SLOW
EQU 128 ;centesimas de segu
ndo entre movimeint
os a minima velocid
ad
82 000002F4 00000010
ENEMY_SPEED
DCD ENEMY_SLOW/8 ;promedio centesim
as de segundo entre
movimeintos
83 000002F8 00000000
enemy_timer
DCD 0 ;velocidad del enem
igo
84 000002FC
85 000002FC ;struct ENEMIGO{long (0 ó MIN/2 - MAX/2), posx (0 - C),
dirx(1(r) ó -1(l)), speedx (SLOW - QUICK), timer}
86 000002FC 00000008
ENEMY_REG_FIELD
EQU 8 ;5 campos de regist
ro (4x byte + 1x in
t)
87 000002FC 00000009
ENEMY_REG_DIM
EQU 9 ;espacio para 9 ene
migos
88 000002FC 00000048
ENEMY_REG_SIZE
EQU ENEMY_REG_FIELD*ENEMY_REG_DIM
89 000002FC ;ALIGN 4
90 000002FC 00 00 00
00 00 00
00 00 00
00 00 00
00 00 00
00 00 00
00 00 00
ARM Macro Assembler Page 10
00 00 00
00 00 00
00 00 00
00 00 00
00 00 00
00 00 00
00 00 00
00 00 00
00 00 00
00 00 00
00 00 00
00 00 00
00 00 00
00 00 00
00 00 00
00 00 00
00 00 00 ENEMY_REG
SPACE ENEMY_REG_SIZE
91 00000344
92 00000344 ;ALIGN 4
93 00000344 00000003
enemy_count
DCD 3 ;cantidad de enemig
os restantes para c
ompletar el juego
94 00000348
95 00000348 00000050
CHAR_PAUSE
EQU 'P' ;pausar
96 00000348 00000051
CHAR_QUIT
EQU 'Q' ;salir del juego
97 00000348
98 00000348 AREA codigo,CODE
99 00000000 EXPORT inicio ; forma de enlazar
con el startup.s
100 00000000 IMPORT srand ; para poder invoca
r SBR srand
101 00000000 IMPORT rand ; para poder invoca
r SBR srand
102 00000000 inicio ; se recomienda pon
er punto de parada
(breakpoint) en la
primera
103 00000000 ; instruccion de código para poder ejecutar todo el Star
tup de golpe
104 00000000 ;Habilitar interrupcion en VIC
105 00000000 E59F0B98 ldr r0, =VICVectAddr0
106 00000004 ;programar @IRQ4 -> RSI_reloj
107 00000004 E59F1B98 ldr r1, =RSI_reloj
108 00000008 E3A02004 ldr r2, =IRQ_Timer0
109 0000000C
110 0000000C E7801102 str r1, [r0, r2, LSL#2]
111 00000010
112 00000010 ;programar @IRQ7 -> RSI_teclado
113 00000010 E59F1B90 ldr r1, =RSI_teclado
114 00000014 E3A02007 ldr r2, =IRQ_UART
115 00000018
116 00000018 E7801102 str r1, [r0, r2, LSL#2]
ARM Macro Assembler Page 11
117 0000001C
118 0000001C ;activar IRQ4,IRQ7
119 0000001C E59F0B88 ldr r0, =VICIntEnable
120 00000020 E5901000 ldr r1, [r0]
121 00000024 E3811010 orr r1, r1, #1<<IRQ_Timer0
122 00000028 E3811080 orr r1, r1, #1<<IRQ_UART
123 0000002C E5801000 str r1, [r0]
124 00000030
125 00000030 ;dibujar pantalla inicial
126 00000030 ;limpiar toda la pantalla
127 00000030 E59F8B78 LDR r8, =DIR_SCREEN ;r8 = DIRECCIÓN
DE INICIO DE PANTA
LLA
128 00000034 E3A00C02 LDR r0, =SCREEN_PX ;r0 <-- pixeles
totales en pantalla
129 00000038 E52D0004 PUSH {r0} ;r0 (pixeles) --> #
12 @param
130 0000003C E52D8004 PUSH {r8} ;r8 (screen) --> #8
@param
131 00000040 EB000167 bl SBR_limpiar_pantalla
132 00000044 E28DD008 add sp, sp, #8
133 00000048
134 00000048 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 15/05/2017 (BEGIN) ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
135 00000048
136 00000048 ;START
137 00000048 E59F8B60 LDR r8, =DIR_SCREEN ;r8 = DIRECCIÓN
DE INICIO DE PANTA
LLA
138 0000004C E3A00020 LDR r0, =SCREEN_C
;r0 <-- #SCREEN_C
139 00000050 E3A01005 mov r1, #5 ;r1 <-- 4 (linea)
140 00000054 E0000091 mul r0, r1, r0 ;r0 <-- offset hast
a linea 4
141 00000058 E59F1B54 LDR r1, =SCREEN_START
; r1 <-- @START
142 0000005C E59F2B54 LDR r2, =SCREEN_START_END
;r2 <-- @GO_END
143 00000060 bc_start
144 00000060 E1510002 cmp r1, r2 ;if(r0 != r2)
145 00000064 0A000003 beq bc_start_end ; else
146 00000068 E4D13001 ldrb r3, [r1], #1 ;r3 <-- nuevo cara
cter
147 0000006C E7C83000 strb r3, [r8, r0] ;r3 --> @pixel
148 00000070 E2800001 add r0, r0, #1 ;r0++ (siguiente px
)
149 00000074 EAFFFFF9 b bc_start
150 00000078 bc_start_end
151 00000078
152 00000078 ;establecer semilla de números aleatorios
153 00000078 E59F0B3C LDR r0, =ASCII ;r0 <-- @ASCII
154 0000007C E0222002 eor r2, r2, r2 ;r2 <--
155 00000080 bc_rand
156 00000080 E5901000 ldr r1, [r0] ;r1 <-- ASCII
157 00000084 E2822001 add r2, r2, #1 ;r2++
158 00000088 E3510000 cmp r1, #0 ;if(r1 != 0)
159 0000008C 0AFFFFFB beq bc_rand
ARM Macro Assembler Page 12
160 00000090 E52D2004 PUSH {r2} ;r0 (semilla) --> #
8 @param
161 00000094 EBFFFFFE bl srand
162 00000098 E0211001 eor r1, r1, r1 ;r1 <-- 0
163 0000009C E5801000 str r1, [r0] ;r1 (0) --> @ASCII
164 000000A0 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 15/05/2017 (END) ;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
165 000000A0
166 000000A0 ;dibujar pantalla inicial
167 000000A0 ;limpiar toda la pantalla
168 000000A0 E59F8B08 LDR r8, =DIR_SCREEN ;r8 = DIRECCIÓN
DE INICIO DE PANTA
LLA
169 000000A4 E3A00C02 LDR r0, =SCREEN_PX ;r0 <-- pixeles
totales en pantalla
170 000000A8 E52D0004 PUSH {r0} ;r0 (pixeles) --> #
12 @param
171 000000AC E52D8004 PUSH {r8} ;r8 (screen) --> #8
@param
172 000000B0 EB00014B bl SBR_limpiar_pantalla
173 000000B4 E28DD008 add sp, sp, #8
174 000000B8
175 000000B8 ;mostrar cañon
176 000000B8 E0880000 add r0, r8, r0 ;r0 <-- ultimo pixe
l de la pantalla +
1
177 000000BC E2400020 sub r0, r0, #SCREEN_C ;r0 <-- prime
r pixel de la últim
a fila
178 000000C0 E3A07010 LDR r7, =CANYON_CENTER ;r7 = POSICI
ON CENTRO DEL CAÑÓN
179 000000C4 E0809007 add r9, r0, r7 ;r9 = @PIXEL CENTRA
L CAÑÓN
180 000000C8 E3A00023 LDR r0, =CHAR_CANYON ;r0 <-- caract
er de representació
n del cañón
181 000000CC E5490001 strb r0, [r9, #-1] ;mostrar cañon de
tamaño 3
182 000000D0 E5C90000 strb r0, [r9]
183 000000D4 E5C90001 strb r0, [r9, #1]
184 000000D8
185 000000D8 ;mostrar puntuación
186 000000D8 E2880001 add r0, r8, #1 ;r0 <-- @incio del
contador de puntuac
ión
187 000000DC E59F1ADC LDR r1, =score_d1 ;r1 <-- @bullet_c
ount
188 000000E0 E92D0003 PUSH {r0, r1} ;r0 (contador) -->
#8 @param
189 000000E4 ;r1 (numero) --> #12 @param
190 000000E4 EB00014B bl SBR_actualizar_contador
191 000000E8 E28DD008 add sp, sp, #8
192 000000EC
193 000000EC ;mostrar balas retantes
194 000000EC E288001B add r0, r8, #(SCREEN_C - 5) ;r0 <--
direcceción de ini
cio del contador de
ARM Macro Assembler Page 13
balas
195 000000F0 E59F1ACC LDR r1, =bullet_count_d1 ;r1 <-- @b
ullet_count
196 000000F4 E92D0003 PUSH {r0, r1} ;r0 (contador) -->
#8 @param
197 000000F8 ;r1 (numero) --> #12 @param
198 000000F8 EB000146 bl SBR_actualizar_contador
199 000000FC E28DD008 add sp, sp, #8
200 00000100
201 00000100
202 00000100 ;inicializar juego
203 00000100 ;inicializar vector de registro de enemigos
204 00000100 E59F6AC0 LDR r6, =ENEMY_REG ;r6 = @REGISTRO
DE ENEMIGOS
205 00000104 E3A00009 LDR r0, =ENEMY_REG_DIM ;r0 <-- nume
ro máximo de enemig
os
206 00000108 E3500000 cmp r0, #0 ;while (r0 > 0) ==
for (r0 = ENEMY_REG
_DIM; r0 > 0; r0--)
207 0000010C DA000004 ble bc_02_end ; else (r0 <= 0) --
> skip
208 00000110 E0211001 eor r1, r1, r1 ;r1 <-- 0
209 00000114 E1A02006 mov r2, r6 ;r2 <-- @reg enemig
os
210 00000118 E4C21008
bc_02 strb r1, [r2], #ENEMY_REG_FIELD ;@r2
<-- 0 (en_pantalla
= false)
211 0000011C E2500001 subs r0, r0, #1 ;r0--
212 00000120 1AFFFFFC bne bc_02 ;continue <-- (r0 !
= 0)
213 00000124 bc_02_end
214 00000124
215 00000124 bucle ;comprobar si se ha
pulsado nueva tecl
a
216 00000124 E59F0A90 LDR r0, =ASCII
217 00000128 E5900000 ldr r0, [r0]
218 0000012C E3500000 cmp r0, #0
219 00000130 1B00007D blne SBR_teclado
220 00000134
221 00000134 ;comprobar si hay que introducir a un nuevo enemigo
222 00000134 E59F0A90 LDR r0, =enemy_timer ;r0 <-- @timer
de nuevo enemigo
223 00000138 E5901000 ldr r1, [r0] ;r1 <-- timer de nu
evo enemigo
224 0000013C E59F2A8C LDR r2, =reloj ;r2 <-- @reloj
225 00000140 E5922000 ldr r2, [r2] ;r2 <-- reloj
226 00000144 E1520001 cmp r2, r1 ;if (reloj >= timer
) --> introduir ene
migo
227 00000148 ; else (timer < reloj) --> skip
228 00000148 AB000141 blge SBR_intro_enemigo
229 0000014C
230 0000014C ;para cada elemento movil
231 0000014C ;;;;;; ENEMIGOS ;;;;;;;
232 0000014C E1A00006 mov r0, r6 ;r0 <-- @enemigo0
ARM Macro Assembler Page 14
233 00000150 E3A03009 LDR r3, =ENEMY_REG_DIM ;r3 <-- dime
nsión del vector
234 00000154 E3530000 cmp r3, #0 ;while(r3 > 0) == f
or(r3 = #ENEMY_REG_
DIM; r3 > 0; r3--)
235 00000158 0A00000F beq bc_03_end ; else (r3 <= 0) --
> skip
236 0000015C E5D01000
bc_03 ldrb r1, [r0] ;r1 <-- enemigo.lon
g
237 00000160 E3510000 cmp r1, #0 ;if(r1 == 0) --> sk
ip (no existe enemi
go)
238 00000164 0A000009 beq skip01
239 00000168 E5901004 ldr r1, [r0, #4] ;r1 <-- enemigo.ti
mer
240 0000016C E59F2A5C LDR r2, =reloj
241 00000170 E5922000 ldr r2, [r2] ;r2 <-- reloj
242 00000174 ; si toca mover elemento
243 00000174 E1520001 cmp r2, r1 ;if (reloj >= timer
) --> mover enemigo
244 00000178 BA000004 blt skip01 ; else (timer < rel
oj) --> skip
245 0000017C E3A04009 LDR r4, =ENEMY_REG_DIM ;r4 <-- dime
nsión del vector
246 00000180 E0444003 sub r4, r4, r3 ;r4 <-- fila del en
emigo a mover (inic
ia en 0)
247 00000184 E92D0011 PUSH {r0,r4} ;r0 (enemigo) --> #
8 @param
248 00000188 ;r4 (fila) --> #12 @param
249 00000188 EB000181 bl SBR_mover_enemigo
250 0000018C E28DD008 add sp, sp, #8
251 00000190
252 00000190 E2800008
skip01 add r0, r0, #ENEMY_REG_FIELD
;@enemigo++
253 00000194 E2533001 subs r3, r3, #1 ;r3--
254 00000198 1AFFFFEF bne bc_03
255 0000019C bc_03_end
256 0000019C ; finsi
257 0000019C
258 0000019C ;;;;;; BALAS ;;;;;;;
259 0000019C E59F1A30 LDR r1, =bullet_timer ;r0 <-- @bull
et_timer
260 000001A0 E5911000 ldr r1, [r1] ;r1 <-- bullet_time
r
261 000001A4 E59F0A24 LDR r0, =reloj
262 000001A8 E5900000 ldr r0, [r0] ;r0 <-- reloj
263 000001AC ; si toca mover elemento
264 000001AC E1500001 cmp r0, r1 ;if (reloj >= timer
) --> mover balas
265 000001B0 BA000005 blt finsi
266 000001B4 EB0001CA bl SBR_mover_balas
267 000001B8 ;;;;;; 2017/05/13
268 000001B8 E59F0A18 LDR r0, =BULLET_SPEED ;r0 <-- @BULL
ET_SPEED
269 000001BC E5900000 ldr r0, [r0] ;r0 <-- BULLET_SPEE
ARM Macro Assembler Page 15
D
270 000001C0 E0800001 add r0, r0, r1 ;r0 <-- next timer
271 000001C4 E59F1A08 LDR r1, =bullet_timer ;r1 <-- @bull
et_timer
272 000001C8 E5810000 str r0, [r1] ;r0 (next_timer) --
> @bullet_timer
273 000001CC ;;;;;;
274 000001CC finsi
275 000001CC
276 000001CC ;si fin=0 salto a bucle
277 000001CC E59F0A08 LDR r0, =fin ;r0 <-- @fin
278 000001D0 E5900000 ldr r0, [r0] ;r0 <-- (@fin)
279 000001D4 E3500000 cmp r0, #0 ;if(r0 = 0) --> con
tinue
280 000001D8 0AFFFFD1 beq bucle
281 000001DC
282 000001DC ;desactivar IRQ4,IRQ7
283 000001DC ;Desprogramar VIC
284 000001DC ;Inhabilitar interrupciones en el VIC
285 000001DC E59F09FC ldr r0, =VICIntEnClr
286 000001E0 E0211001 eor r1, r1, r1
287 000001E4 E5901000 ldr r1, [r0] ;haria falta?
288 000001E8 ;desactivar RSI_reloj
289 000001E8 E3811010 orr r1, r1, #1<<IRQ_Timer0
290 000001EC ;desactivar RSI_teclado
291 000001EC E3811080 orr r1, r1, #1<<IRQ_UART
292 000001F0
293 000001F0 E5801000 str r1, [r0]
294 000001F4
295 000001F4 ;Limpiar pantalla
296 000001F4 E3A00D07 LDR r0, =(SCREEN_PX-2*SCREEN_C) ;r0
<-- pixeles totale
s en pantalla - 2 l
ineas
297 000001F8 E52D0004 PUSH {r0} ;r0 (pixeles) --> #
12 @param
298 000001FC E2888020 add r8, r8, #SCREEN_C ;r8 <-- @inic
io segiunda fila pa
ntalla
299 00000200 E52D8004 PUSH {r8} ;r8 (screen) --> #8
@param
300 00000204 EB0000F6 bl SBR_limpiar_pantalla
301 00000208 E28DD008 add sp, sp, #8
302 0000020C
303 0000020C E59F09D0 LDR r0, =enemy_count ;r0 <-- @enemy
304 00000210 E5900000 ldr r0, [r0] ;r0 <-- enemy
305 00000214 E3500000 cmp r0, #0 ;if(r0 == 0) --> TO
DOS LOS ENEMIGOS DE
RROTADOS
306 00000218 0A00000A beq win
307 0000021C
308 0000021C ;GAMEOVER
309 0000021C E3A00020
go LDR r0, =SCREEN_C
;r0 <-- #SCREEN_C
310 00000220 E3A01002 mov r1, #2 ;r1 <-- 4 (linea)
311 00000224 E0000091 mul r0, r1, r0 ;r0 <-- offset hast
ARM Macro Assembler Page 16
a linea 4
312 00000228 E59F19B8 LDR r1, =SCREEN_GAMEOVER
;r1 <-- @GO
313 0000022C E59F29B8 LDR r2, =SCREEN_GAMEOVER_END
;r2 <-- @GO_END
314 00000230 E1510002
bc_go cmp r1, r2 ;if(r0 != r2)
315 00000234 0A00000E beq bfin ; else
316 00000238 E4D13001 ldrb r3, [r1], #1 ;r3 <-- nuevo cara
cter
317 0000023C E7C83000 strb r3, [r8, r0] ;r3 --> @pixel
318 00000240 E2800001 add r0, r0, #1 ;r0++ (siguiente px
)
319 00000244 EAFFFFF9 b bc_go
320 00000248
321 00000248 ;WIN
322 00000248 E3A00020
win LDR r0, =SCREEN_C
;r0 <-- #SCREEN_C