-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathjetpac.asm
9465 lines (8098 loc) · 446 KB
/
jetpac.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
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
; dasmfw: Disassembler Framework V0.34
; Loaded: binary file "bin_orig/jetpac_2000-3fff.bin"
; Loaded: Info file "dasmfw\nfo_include.nfo"
; --------------------------------------------------------------------------------------------
; JET PAC for the Commodore VIC-20 + 8K Memory Expansion
; Copyright 1982 ULTIMATE PLAY THE GAME / Ashby Computers & Graphics Ltd.
; --------------------------------------------------------------------------------------------
; Disassembly and reverse engineering by Phillip Eaton 2022-2023.
; https://github.com/phillipeaton/JETPAC_VIC-20_disassembly
; --------------------------------------------------------------------------------------------
;****************************************************
; Used Labels
;****************************************************
ZP_Obj_List_Ptr_Lo equ $0000
ZP00_Hi_Score_Addr equ $0000
ZP_Obj_List_Ptr_Hi equ $0001
ZP02 equ $0002
ZP02_Collision_Status equ $0002
ZP02_Colour_Random_0_or_1 equ $0002
ZP02_Laser_Param_Countdown equ $0002
ZP02_Num_Aliens_Countdown equ $0002
ZP02_Num_Bytes_To_Display equ $0002
ZP02_Num_Lasers_Countdown equ $0002
ZP02_Num_Of_Bytes_To_Fill_Lo equ $0002
ZP02_Object_Old_Height_Index equ $0002
ZP02_Ship_Parts_Count equ $0002
ZP02_Score_Byte_Hi equ $0002
ZP03 equ $0003
ZP03_Num_Of_Bytes_To_Fill_Hi equ $0003
ZP03_Object_Height_Pixels equ $0003
ZP03_Object_Old_Height equ $0003
ZP03_Platform_Data_Table_Index equ $0003
ZP03_Score_Byte_Lo equ $0003
ZP04 equ $0004
ZP04_Addr_To_Fill_Lo equ $0004
ZP04_Colour_Tile_Position_X equ $0004
ZP04_Laser_Position_X equ $0004
ZP04_Laser_UDG_RAM_Addr_Lo equ $0004
ZP04_Object_Old_UDG_RAM_Lo equ $0004
ZP04_Object_Position_X equ $0004
ZP04_Object_UDG_RAM_Addr_Lo equ $0004
ZP04_Platform_Position_X equ $0004
ZP04_Position_X equ $0004
ZP04_UDG_RAM_Addr_Lo equ $0004
ZP05 equ $0005
ZP05_Addr_To_Fill_Hi equ $0005
ZP05_Colour_Tile_Position_Y equ $0005
ZP05_Laser_Position_Y equ $0005
ZP05_Laser_UDG_RAM_Addr_Hi equ $0005
ZP05_Object_Old_UDG_RAM_Hi equ $0005
ZP05_Object_Position_Y equ $0005
ZP05_Object_UDG_RAM_Addr_Hi equ $0005
ZP05_Platform_Position_Y equ $0005
ZP05_Position_Y equ $0005
ZP05_UDG_RAM_Addr_Hi equ $0005
ZP06 equ $0006
ZP06_Char_ROM_Data_Addr_Lo equ $0006
ZP06_Character_To_Copy equ $0006
ZP06_Character_To_Display equ $0006
ZP06_Fill_Data_Byte equ $0006
ZP06_Laser_New_State_Lo equ $0006
ZP06_Laser_Old_State_Lo equ $0006
ZP06_Laser_Position_X equ $0006
ZP06_Object_Old_UDG_Data_Lo equ $0006
ZP06_Object_Position_Y equ $0006
ZP06_Object_UDG_Data_Addr_Lo equ $0006
ZP06_Platform_UDG_Data_Addr_Lo equ $0006
ZP06_Player_Score_Addr equ $0006
ZP07 equ $0007
ZP07_Char_ROM_Data_Addr_Hi equ $0007
ZP07_Laser_Length_Columns equ $0007
ZP07_Laser_Old_State_Hi equ $0007
ZP07_Object_Old_UDG_Data_Hi equ $0007
ZP07_Object_Position_X equ $0007
ZP07_Object_UDG_Data_Addr_Hi equ $0007
ZP07_Platform_UDG_Data_Addr_Hi equ $0007
ZP07_Score_Data_Addr_Hi equ $0007
ZP08 equ $0008
ZP08_Laser_Position_X_Start equ $0008
ZP08_Object_Laser_Addr_Lo equ $0008
ZP08_Object_Old_Y_Index equ $0008
ZP08_Platfm_Data_Tbl_Addr_Lo equ $0008
ZP08_Player_Score_Addr equ $0008
ZP08_Row_Offset_Table_Index equ $0008
ZP08_Subroutine_Addr_Lo equ $0008
ZP09 equ $0009
ZP09_Object_Laser_Addr_Hi equ $0009
ZP09_Object_New_Y_Index equ $0009
ZP09_Platfm_Data_Tbl_Addr_Hi equ $0009
ZP09_Subroutine_Addr_Hi equ $0009
ZP0A equ $000A
ZP0A_Colour_RAM_Tiles_X equ $000A
ZP0A_Object_New_Height_Index equ $000A
ZP0A_Platform_Quantity equ $000A
ZP0B equ $000B
ZP0B_Colour_RAM_Tiles_Y equ $000B
ZP0B_Object_Height_Pixels equ $000B
ZP0B_Object_New_Height equ $000B
ZP0B_Platform_Object_Distance equ $000B
ZP0B_Platform_Width_Chars equ $000B
ZP0C equ $000C
ZP0C_Colour_RAM_Addr_Lo equ $000C
ZP0C_Colour_RAM_Tile_Addr_Lo equ $000C
ZP0C_Object_New_UDG_RAM_Lo equ $000C
ZP0C_Object_UDG_RAM_Addr_Lo equ $000C
ZP0D equ $000D
ZP0D_Colour_RAM_Addr_Hi equ $000D
ZP0D_Colour_RAM_Tile_Addr_Lo equ $000D
ZP0D_Object_New_UDG_RAM_Hi equ $000D
ZP0D_Object_UDG_RAM_Addr_Hi equ $000D
ZP0E equ $000E
ZP0E_Object_New_UDG_Data_Lo equ $000E
ZP0E_Object_Position_X equ $000E
ZP0E_Object_UDG_Data_Addr_Lo equ $000E
ZP0E_Score_Data_Addr_Lo equ $000E
ZP0E_String_Addr_Lo equ $000E
ZP0F equ $000F
ZP0F_Object_New_UDG_Data_Hi equ $000F
ZP0F_Object_Position_Y equ $000F
ZP0F_Object_UDG_Data_Addr_Hi equ $000F
ZP0F_String_Addr_Hi equ $000F
ZP10 equ $0010
ZP10_Object_Position_X equ $0010
ZP11 equ $0011
ZP11_Object_Old_Position_Y equ $0011
ZP11_Object_Position_Y equ $0011
ZP11_Object_Ship_Position_Y equ $0011
ZP12 equ $0012
ZP12_Object_Type equ $0012
ZP13 equ $0013
ZP13_Laser_Position_Y equ $0013
ZP13_Obj_Landed_Posn_Y_Offset equ $0013
ZP13_Object_Lines_To_Erase equ $0013
ZP13_Ship_Fuel_Level_Half equ $0013
ZP13_Temp equ $0013
ZP13_Keyboard_Data equ $0013
ZP14 equ $0014
ZP14_Laser_Decay_Patten_Data_0 equ $0014
ZP14_Object_Old_Width_Bytes equ $0014
ZP14_Object_Width_Bytes equ $0014
ZP15 equ $0015
ZP15_Laser_Decay_Patten_Data_1 equ $0015
ZP15_Object_New_Width_Bytes equ $0015
ZP15_Object_Width_Bytes equ $0015
ZP16 equ $0016
ZP16_Laser_Decay_Patten_Data_2 equ $0016
ZP16_Object_Size_X_Columns equ $0016
ZP16_Object_Width_Bytes equ $0016
ZP17 equ $0017
ZP17_Laser_Decay_Patten_Data_3 equ $0017
ZP17_Object_Height_Pixels equ $0017
ZP17_Object_Size_Y_Pixels equ $0017
ZP18 equ $0018
ZP18_Object_Flame_Position_X equ $0018
ZP18_Object_Position_X equ $0018
ZP19 equ $0019
ZP19_Object_Landed_Position_Y equ $0019
ZP19_Object_Flame_Position_Y equ $0019
ZP19_Object_New_Position_Y equ $0019
ZP19_Object_Position_Y equ $0019
ZP1A equ $001A
ZP1A_Object_Type equ $001A
ZP1B equ $001B
ZP1B_Laser_Colour equ $001B
ZP1B_Object_Colour equ $001B
ZP_Jetman_Action equ $001C
ZP_Ship_UDG_Addr_Offset equ $001E
ZP_Ship_Parts_Counter equ $001F
ZP_IRQ_Occurred equ $0020
ZP_Alien_Spawn_Counter equ $0021
ZP_Obj_List_Ptr_Save_IRQ_Lo equ $0022
ZP_Obj_List_Ptr_Save_IRQ_Hi equ $0023
ZP_Obj_List_Ptr_Save_Lo equ $0024
ZP_Obj_List_Ptr_Save_Hi equ $0025
ZP_Ship_Flame_State equ $0026
ZP_Ship_Flame_UDG_Toggle equ $0027
ZP_Obj_Ship_Saved equ $0028
ZP_Param_Addr_Lo equ $0040
ZP_Param_Addr_Hi equ $0041
ZP_Game_Select_F1_Flash equ $0045
ZP_IRQ_Counter_Lo equ $004A
ZP_IRQ_Counter_Hi equ $004B
ZP_IRQ_Random equ $004C
ZP_Score_Player_1 equ $0051
ZP_Score_Player_2 equ $0054
ZP_Reverse_And_Colour_Data equ $0057
ZP_Flash_Countup equ $0058
ZP_Wave_Active_Player equ $0059
ZP_Num_Lives_Active_Player equ $005A
ZP_Wave_Inactive_Player equ $005B
ZP_Num_Lives_Inactive_Player equ $005C
ZP_Flash_Score_Countdown equ $005D
ZP_Active_Player equ $005E
ZP_Subroutine_Addr_Lo equ $005F
ZP_Subroutine_Addr_Hi equ $0060
Screen_RAM equ $0200
IRQ_Interrupt_Vector_Lo equ $0314
IRQ_Interrupt_Vector_Hi equ $0315
NMI_Interrupt_Vector_Lo equ $0318
NMI_Interrupt_Vector_Hi equ $0319
Obj_Jetman_State equ $0380
Obj_Jetman_Position_X equ $0381
Obj_Jetman_Position_Y equ $0383
Obj_Laser_0 equ $0388
Obj_Sound equ $03A8
Obj_Sound_Collision equ $03A9
Obj_Sound_Collision_Timer equ $03AA
Obj_Sound_Noise equ $03AB
Obj_Sound_Noise_Timer equ $03AC
Obj_Sound_Laser equ $03AD
Obj_Sound_Laser_Timer equ $03AE
Obj_Ship_Base equ $03B0
Obj_Ship_Base_X equ $03B1
Obj_Ship_Base_Fuel_Level equ $03B2
Obj_Ship_Base_Y equ $03B3
Obj_Ship_Base_Parts_Counter equ $03B4
Obj_Ship_Top_Or_Fuel_Type equ $03B8
Obj_Ship_Top_Or_Fuel_X equ $03B9
Obj_Ship_Top_Or_Fuel_Status equ $03BC
Obj_Ship_Mid_Or_Valuable_Typ equ $03C0
Obj_Ship_Mid_Or_Valuable_X equ $03C1
Obj_Ship_Mid_Or_Valu_Status equ $03C4
Obj_Ship_Mid_Or_Valu_UDG_Idx equ $03C6
Obj_Alien_0_0 equ $03C8
UDG_RAM equ $1000
Player_1_Score_UDG_RAM_Addr equ $1008
Player_1_Lives_UDG_RAM_Addr equ $1420
Hi_Score_UDG_RAM_Addr equ $1588
Player_2_Lives_UDG_RAM_Addr equ $19A0
Player_2_Score_UDG_RAM_Addr equ $1B08
Score_Hi equ $1FD0
Game_Settings equ $1FD3
VIC_R0_H_Ctr equ $9000
VIC_R4_TV_Raster equ $9004
VIC_RA_Frq_Osc1 equ $900A
VIC_RB_Frq_Osc2 equ $900B
VIC_RC_Frq_Osc3 equ $900C
VIC_RE_Vol_Colour equ $900E
VIA1_Port_B equ $9110
VIA1_Port_A equ $9111
VIA1_DDR_A equ $9113
VIA1_Int_Enable equ $911E
VIA2_Port_B equ $9120
VIA2_Port_A equ $9121
VIA2_DDR_B equ $9122
VIA2_DDR_A equ $9123
VIA2_T1_Cnt_Lo equ $9124
VIA2_T1_Cnt_Hi equ $9125
VIA2_Int_Enable equ $912E
Colour_RAM equ $9600
;****************************************************
; Used Definitions
;****************************************************
SCREEN_WIDTH_COLUMNS equ $17
COLOUR_GREEN equ $05
UDG_DATA_BITMAP_OFFSET equ $03
UDG_DATA_WIDTH_BYTES_OFFSET equ $FE
UDG_DATA_HEIGHT_PIXELS_OFFSET equ $FF
SCREEN_WIDTH_PIXELS equ $B8
UDG_RAM_NUM_BYTES_HI equ $0F
UDG_RAM_NUM_BYTES_LO equ $D0
UDG_RAM_END_ADDR_MINUS_FE_HI equ $1E
UDG_RAM_END_ADDR_MINUS_FE_LO equ $D1
SCREEN_HEIGHT_PIXELS equ $B0
OBJECT_COLOUR_PARAM equ $05
OBJECT_POSITION_Y_PARAM equ $03
OBJECT_TYPE_PARAM equ $00
CHARACTER_ROM_START_HI_BYTE equ $80
COLOUR_RAM_START_HI_BYTE equ $96
PETSCII_OFFSET equ $70
NUM_PIXEL_OF_LINES_TO_REVERSE equ $0F
NUM_OF_COLUMNS_TO_REVERSE equ $06
JETMAN_STATE_PARAM equ $00
JETMAN_POSITION_Y_PARAM equ $03
JETMAN_DIRECTION_Y_PARAM equ $04
JETMAN_DIRECTION_X_PARAM equ $02
_100_MINUS_SCREEN_WIDTH_PIXELS equ $48
SCREEN_TOP equ $28
SCREEN_BOTTOM equ $AF
JETMAN_POSITION_X_PARAM equ $01
PLATFORM_HEIGHT_PIXELS_TOTAL equ $0A
PLATFORM_HEIGHT_PIXELS equ $09
PLATFORM_UDG_DATA_ADDR_HI equ $3E
PLATFORM_UDG_DATA_ADDR_LO equ $15
PLATFORM_QUANTITY equ $03
PLATFORM_DATA_TABLE_ADDR_HI equ $31
PLATFORM_DATA_TABLE_ADDR_LO equ $B6
SCREEN_BOTTOM_1UP equ $AE
OBJECT_POSITION_X_PARAM equ $01
THREE_DIGITS_COUNTDOWN equ $02
OBJECT_PICKUP_DROPPED_STATE equ $04
OBJECT_OVER_SHIP_HITBOX_X equ $06
OBJECT_STATUS_PICKED_UP equ %00000010
OBJECT_STATUS_PARAM equ $04
OBJECT_UDG_DATA_INDEX_PARAM equ $06
FUEL_POSITION_Y_WHEN_LANDED equ $A8
OBJECT_UDG_DATA_OFFSET equ $06
COLUMN_INDEX equ $00
OBJECT_SHIP_POSITION_Y_PARAM equ $03
OBJECT_SHIP_POSITION_X_PARAM equ $01
COLOUR_WHITE equ $01
COLOUR_PURPLE equ $04
OBJECT_SHIP_FUEL_LEVEL equ $02
OBJ_SHIP_PARTS_COUNTER_PARAM equ $04
SHIP_ASCENDING equ $0A
FUELLED_UP equ $06
OBJECT_SHIP_LANDED equ $09
SHIP_BASE_POSITION_Y equ $AF
SHIP_BASE_POSITION_Y_PARAM equ $03
OBJECT_SHIP_DESCEND equ $0B
SHIP_BASE_AT_SCREEN_TOP equ $30
OBJECT_TYPE_VALUABLE equ $0E
HITBOX_Y_ABOVE equ $12
COLLISION equ $80
HITBOX_Y_BELOW equ $0C
COLLISION_HITBOX_X equ $0C
NO_COLLISION equ $00
JETMAN_STANDING equ $02
JETMAN_FLYING equ $01
COLOUR_RED equ $02
COLOUR_YELLOW equ $07
COLOUR_BLUE equ $06
COLOUR_CYAN equ $03
WAVE_1_CROSS_ equ $06
WAVE_2_SPHERE_ equ $07
WAVE_3_SAUCER_ equ $08
WAVE_0_FUZZBALL_ equ $05
OBJECT_STRUCTURE_SIZE equ $08
NUM_ALIENS_MAX equ $06
OBJECT_ALIEN_0_HI equ $03
OBJECT_ALIEN_0_LO equ $C8
OBJECT_DIRECTION_Y_PARAM equ $04
OBJECT_DIRECTION_X_PARAM equ $02
LASER_POSITION_X_PARAM equ $02
MAX_LASERS equ $04
OBJECT_LASER_0_HI equ $03
OBJECT_LASER_0_LO equ $88
OBJECT_VALUABLE_TYPE_PARAM equ $06
NUM_OBJECT_PARAMS equ $07
NOT_FLYING_AND_NOT_STANDING equ $03
SHIP_BUILT_AND_FUELLED_UP equ $06
OBJECT_DIRECTION_Y equ $04
OBJECT_DIRECTION_X equ $02
DIRECTION_Y_DOWN_MAX equ $04
DIRECTION_X_RIGHT_MAX equ $04
DIRECTION_Y_UP_MAX equ $FC
DIRECTION_X_LEFT_MAX equ $FC
DIRECTION_X_LEFT equ $F8
DIRECTION_Y_UP equ $F8
DIRECTION_Y_DOWN equ $08
DIRECTION_X_RIGHT equ $08
OBJECT_DIR_Y_COUNTDOWN_PARAM equ $06
OBJECT_JETMAN_DIRECTION_PARAM equ $02
OBJECT_TYPE_PARAM_SAVED equ $06
EXPLOSION_ANIMATION_FRAMES equ $07
EXPLOSION_ANIMATION_FRAME equ $04
OBJECT_TYPE_EXPLOSION equ $03
COLOUR_BLACK equ $00
FLAME_SPACE_AVAILABLE equ $AF
OBJECT_TYPE_SHIP_ASCEND equ $0A
WORD_SIZE equ $02
OBJECT_SHIP_ADDRESS equ $B0
OPTION_TEXT_ROWS equ $05
TEXT_POSITION_X equ $18
LIVES_INITIAL_PLAYER_2 equ $05
LIVES_INITIAL_PLAYER_1 equ $04
PLAYER_1 equ $00
CHARACTER_SPACE equ $60
CHARACTER_ZERO equ $70
LASER_TYPE_PARAM equ $00
LASER_POSITION_X equ $02
LASER_LENGTH_PARAM equ $06
LASER_POSITION_Y equ $01
LASER_POSITION_X_PARAMS equ $03
LASER_GUN_HEIGHT_OFFSET equ $0D
SCREEN_ROWS equ $0B
SCREEN_COLUMNS equ $17
IRQ_INTERRUPT_HANDLER_ADDR_HI equ $25
IRQ_INTERRUPT_HANDLER_ADDR_LO equ $E0
NMI_INTERRUPT_HANDLER_ADDR_HI equ $20
NMI_INTERRUPT_HANDLER_ADDR_LO equ $1C
;****************************************************
; Program's Code Areas
;****************************************************
org $2000
; Probably unused data leftover from the start-up code relocation, $201D is program start point
fdb $201D,$201D ; 2000: 1D 20 1D 20
; Initial value table for VIC setup 16 bytes, see "Mapping the VIC 1984 COMPUTE" book
; Screen Map RAM Location
; -----------------------
; VIC_R2_Num_Cols Bit 7 (A=1) and VIC_R5_CM_Start Bits 7654 (BBBB=1000=$8) form part of a
; a 14-bit address that signifies the start of the Screen Map RAM: BB_BBA0_0000_0000
; Using the values in the Init Table: 10_0010_0000_0000 NOTE: R5 bit 7 is inverted by the VIC
; Thus Screen Map RAM starts at $0200
; Colour Map RAM Location
; -----------------------
; VIC_R2_Num_Cols Bit 7 (A=1) signifies Colour Map RAM starts at $9600
; Character Map RAM Location
; --------------------------
; VIC_R5_CM_Start Bits 4321 (CCCC = 1100 = $C) signifies Character Map RAM starts at $1000
; Screen Size Rows x Columns
; --------------------------
; VIC_R2_Num_Cols Bits 6543210 set number of columns = _001_0111 = $17 = 23 decimal
; VIC_R3_Num_Rows Bits 654321 set number of rows = _001_011_ = $0B = 11 decimal
; NOTE: VIC_R3_Num_Rows Bit 0=1 sets character matrices to 8x16 pixels
VIC_Init_Table
fcb $0B ; 2004: 0B VIC_R0_H_Ctr Left edge of TV picture and interlace switch.Left edge of TV picture and interlace switch.
fcb $26 ; 2005: 26 VIC_R1_V_Ctr Vertical TV picture origin.
fcb $97 ; 2006: 97 VIC_R2_Num_Cols Number of columns displayed, part of screen map address.
fcb $17 ; 2007: 17 VIC_R3_Num_Rows Number of character lines displayed, part of raster location.
fcb $00 ; 2008: 00 VIC_R4_TV_Raster Raster beam location bits 8-1.
fcb $8C ; 2009: 8C VIC_R5_CM_Start Screen map and character map addresses.
fcb $00 ; 200A: 00 VIC_R6_H_LightP Light pen horizontal screen location.
fcb $00 ; 200B: 00 VIC_R7_V_LightP Light pen vertical screen location.
fcb $00 ; 200C: 00 VIC_R8_Paddle_X Potentiometer X/Paddle X value.
fcb $00 ; 200D: 00 VIC_R9_Paddle_Y Potentiometer Y/Paddle Y value.
fcb $00 ; 200E: 00 VIC_RA_Frq_Osc1 Relative frequency of sound oscillator 1 (bass).
fcb $00 ; 200F: 00 VIC_RB_Frq_Osc2 Relative frequency of sound oscillator 2 (alto).
fcb $00 ; 2010: 00 VIC_RC_Frq_Osc3 Relative frequency of sound oscillator 3 (soprano).
fcb $00 ; 2011: 00 VIC_RD_Frq_Noise Relative frequency of sound oscillator 4 (noise).
fcb $00 ; 2012: 00 VIC_RE_Vol_Color Sound volume and auxiliary color.
fcb $08 ; 2013: 08 VIC_RF_BckBdrCol Background color, border color, inverse color switch.
; Quick mask lookup for BIT instruction
MASK_00000001
fcb %00000001 ; 2014: 01
MASK_00000010
fcb %00000010 ; 2015: 02
MASK_00000100
fcb %00000100 ; 2016: 04
MASK_00001000
fcb %00001000 ; 2017: 08
MASK_00010000
fcb %00010000 ; 2018: 10
MASK_00100000
fcb %00100000 ; 2019: 20
MASK_01000000
fcb %01000000 ; 201A: 40
MASK_10000000
fcb %10000000 ; 201B: 80
; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
; Empty NMI Interrupt Handler, simply returns from interrupt
NMI_Interrupt_Hardler
rti ; 201C: 40
; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
; 88""Yb 88""Yb dP"Yb dP""b8 88""Yb db 8b d8
; 88__dP 88__dP dP Yb dP `" 88__dP dPYb 88b d88
; 88""" 88"Yb Yb dP Yb "88 88"Yb dP__Yb 88YbdP88
; 88 88 Yb YbodP YboodP 88 Yb dP""""Yb 88 YY 88
; .dP"Y8 888888 db 88""Yb 888888
; `Ybo." 88 dPYb 88__dP 88
; o.`Y8b 88 dP__Yb 88"Yb 88
; 8bodP' 88 dP""""Yb 88 Yb 88
; Disable Interrupts, reset stack address pointer, clear Decimal flag
sei ; 201D: 78
ldx #$FF ; 201E: A2 FF
txs ; 2020: 9A
cld ; 2021: D8
; Setup NMI interrupt vector to service routine at $201C
lda #NMI_INTERRUPT_HANDLER_ADDR_LO ; 2022: A9 1C
sta NMI_Interrupt_Vector_Lo ; 2024: 8D 18 03
lda #NMI_INTERRUPT_HANDLER_ADDR_HI ; 2027: A9 20
sta NMI_Interrupt_Vector_Hi ; 2029: 8D 19 03
jsr Erase_Hi_Score_Game_Settings ; 202C: 20 6F 27
jsr Erase_ZP_RAM ; 202F: 20 5B 27
; Setup I/O data direction and interrupt enables
lda #%00000000 ; 2032: A9 00
sta VIA1_DDR_A ; 2034: 8D 13 91
lda #%10000000 ; 2037: A9 80
sta VIA1_Int_Enable ; 2039: 8D 1E 91
lda #%11000000 ; 203C: A9 C0
sta VIA2_Int_Enable ; 203E: 8D 2E 91
jsr Reset_VIA2_Timer ; 2041: 20 5E 26
; Set VIA outputs for keyboard scan
lda #%01000000 ; 2044: A9 40
sta VIA1_Port_B ; 2046: 8D 10 91 Data I/O register (User port & RS-232) i.e. not used
sta VIA2_Port_B ; 2049: 8D 20 91 Data I/O register (Keybd col scan, Cassette, Joystick)
; Setup IRQ interrupt vector to service routine at $25E0
lda #IRQ_INTERRUPT_HANDLER_ADDR_LO ; 204C: A9 E0
sta IRQ_Interrupt_Vector_Lo ; 204E: 8D 14 03
lda #IRQ_INTERRUPT_HANDLER_ADDR_HI ; 2051: A9 25
sta IRQ_Interrupt_Vector_Hi ; 2053: 8D 15 03
; Reset the VIC registers
ldx #$0F ; 2056: A2 0F 16 registers
; L_BRS_($2058)_($205F) OK
Reset_VIC
lda VIC_Init_Table,x ; 2058: BD 04 20
sta VIC_R0_H_Ctr,x ; 205B: 9D 00 90
dex ; 205E: CA
bpl Reset_VIC ; 205F: 10 F7
; Initialize Screen RAM i.e. map screen tiles to User-Defined Graphics RAM
; Each character is a 16x8 tile i.e. double height, thus play area
; is decimal 11 Rows x 23 Columns
; 0200 00 0B 16 21 2C 37 42 4D 58 63 6E 79 84 8F 9A A5 B0 BB C6 D1 DC E7 F2
; 0217 01 0C 17 22 2D 38 43 4E 59 64 6F 7A 85 90 9B A6 B1 BC C7 D2 DD E8 F3
; 022E 02 0D 18 23 2E 39 44 4F 5A 65 70 7B 86 91 9C A7 B2 BD C8 D3 DE E9 F4
; 0245 03 0E 19 24 2F 3A 45 50 5B 66 71 7C 87 92 9D A8 B3 BE C9 D4 DF EA F5
; 025C 04 0F 1A 25 30 3B 46 51 5C 67 72 7D 88 93 9E A9 B4 BF CA D5 E0 EB F6
; 0273 05 10 1B 26 31 3C 47 52 5D 68 73 7E 89 94 9F AA B5 C0 CB D6 E1 EC F7
; 028A 06 11 1C 27 32 3D 48 53 5E 69 74 7F 8A 95 A0 AB B6 C1 CC D7 E2 ED F8
; 02A1 07 12 1D 28 33 3E 49 54 5F 6A 75 80 8B 96 A1 AC B7 C2 CD D8 E3 EE F9
; 02B8 08 13 1E 29 34 3F 4A 55 60 6B 76 81 8C 97 A2 AD B8 C3 CE D9 E4 EF FA
; 02CF 09 14 1F 2A 35 40 4B 56 61 6C 77 82 8D 98 A3 AE B9 C4 CF DA E5 F0 FB
; 02E6 0A 15 20 2B 36 41 4C 57 62 6D 78 83 8E 99 A4 AF BA C5 D0 DB E6 F1 FC
ldx #$00 ; 2061: A2 00
txa ; 2063: 8A
; Initialise Screen RAM outer loop
; L_BRS_($2064)_($2077) OK
ISR_Columns
ldy #SCREEN_COLUMNS ; 2064: A0 17
pha ; 2066: 48
; Initialise Screen RAM inner loop
; L_BRS_($2067)_($206F) OK
ISR_Rows
sta Screen_RAM,x ; 2067: 9D 00 02
clc ; 206A: 18
adc #SCREEN_ROWS ; 206B: 69 0B
inx ; 206D: E8
dey ; 206E: 88
bne ISR_Rows ; 206F: D0 F6
pla ; 2071: 68
clc ; 2072: 18
adc #$01 ; 2073: 69 01
cmp #SCREEN_ROWS ; 2075: C9 0B
bne ISR_Columns ; 2077: D0 EB
; L_JMP_($2079)_($2994) OK
; L_JMP_($2079)_($299A) OK
Reset_Game_Select
jsr Reset_Screen_Display_Scores ; 2079: 20 16 24
; Reset game selection flashing highlights
lda #$01 ; 207C: A9 01
ldx #$05 ; 207E: A2 05
; L_BRS_($2080)_($2083) OK
Loop_Init_Option_Text
sta ZP_Game_Select_F1_Flash,x ; 2080: 95 45
dex ; 2082: CA
bpl Loop_Init_Option_Text ; 2083: 10 FB
; Setup volume and colour
lda #$0F ; 2085: A9 0F
sta VIC_RE_Vol_Colour ; 2087: 8D 0E 90
; Disable sound object
lda #$00 ; 208A: A9 00
sta Obj_Sound ; 208C: 8D A8 03
; dP""b8 db 8b d8 888888 .dP"Y8 888888 88 888888 dP""b8 888888
; dP `" dPYb 88b d88 88__ `Ybo." 88__ 88 88__ dP `" 88
; Yb "88 dP__Yb 88YbdP88 88"" o.`Y8b 88"" 88 .o 88"" Yb 88
; YboodP dP""""Yb 88 YY 88 888888 8bodP' 888888 88ood8 888888 YboodP 88
; L_BRS_($208F)_($20E1) OK
Game_Select
inc ZP_Flash_Countup ; 208F: E6 58
lda #%00000000 ; 2091: A9 00
sta VIA2_DDR_B ; 2093: 8D 22 91 Set Port B all bits to input
lda #%11111111 ; 2096: A9 FF
sta VIA2_DDR_A ; 2098: 8D 23 91 Set Port A all bits to output
lda #%01111111 ; 209B: A9 7F Select keyboard column to read
sta VIA2_Port_A ; 209D: 8D 21 91 (F7/F5/F3/F1/CDown/CRight/Rtn/Del)
ldx Game_Settings ; 20A0: AE D3 1F Whilst giving keyboard data time to settle?
lda VIA2_Port_B ; 20A3: AD 20 91 Read keyboard column
sta ZP13_Keyboard_Data ; 20A6: 85 13 Store keyboard data
; Test F-Keys pressed or Space to start game
lda #%00010000 ; 20A8: A9 10
bit ZP13_Keyboard_Data ; 20AA: 24 13 F1 pressed? (1 Player)
bne Test_F3 ; 20AC: D0 04 No, skip
txa ; 20AE: 8A
and #%00000010 ; 20AF: 29 02 Reset Bit 0 = 1 Player
tax ; 20B1: AA
; L_BRS_($20B2)_($20AC) OK
Test_F3
lda #%00100000 ; 20B2: A9 20
bit ZP13_Keyboard_Data ; 20B4: 24 13 F3 pressed? (2 Player)
bne Test_F5 ; 20B6: D0 04 No, skip
txa ; 20B8: 8A
ora #%00000001 ; 20B9: 09 01 Set Bit 0 = 2 Player
tax ; 20BB: AA
; L_BRS_($20BC)_($20B6) OK
Test_F5
lda #%01000000 ; 20BC: A9 40
bit ZP13_Keyboard_Data ; 20BE: 24 13 F5 pressed? (Keyboard)
bne Test_F7 ; 20C0: D0 04 No, skip
txa ; 20C2: 8A
and #%00000001 ; 20C3: 29 01 Reset Bit 1 = Keyboard controls
tax ; 20C5: AA
; L_BRS_($20C6)_($20C0) OK
Test_F7
lda #%10000000 ; 20C6: A9 80
bit ZP13_Keyboard_Data ; 20C8: 24 13 F7 pressed? (Joystick)
bne Test_Space ; 20CA: D0 04 No, skip
txa ; 20CC: 8A
ora #%00000010 ; 20CD: 09 02 Set Bit 1 = Joystick controls
tax ; 20CF: AA
; Store options, update display and test for game start
; L_BRS_($20D0)_($20CA) OK
Test_Space
txa ; 20D0: 8A Save game settings
sta Game_Settings ; 20D1: 8D D3 1F 0=1P+Kbd, 1=2P+Kbd, 2=1P+Jsk, 3=2P+Jsk
jsr Display_Game_Select ; 20D4: 20 B9 24
lda #%11111110 ; 20D7: A9 FE Select keyboard column to read
sta VIA2_Port_A ; 20D9: 8D 21 91 (2/Q/CBM/Space/Stop/Ctrl/Left/1)
lda VIA2_Port_B ; 20DC: AD 20 91 Read keyboard column
and #%00010000 ; 20DF: 29 10 Space Pressed?
bne Game_Select ; 20E1: D0 AC No, check for settings again
; Space was pressed, now start the game
jsr Reset_Screen_Display_Scores ; 20E3: 20 16 24
jmp Game_Start ; 20E6: 4C D1 25
; ------------------------------------------
; 88 88b 88 88 888888 88 db .dP"Y8 888888 88""Yb
; 88 88Yb88 88 88 88 dPYb `Ybo." 88__ 88__dP
; 88 88 Y88 88 88 88 .o dP__Yb o.`Y8b 88"" 88"Yb
; 88 88 Y8 88 88 88ood8 dP""""Yb 8bodP' 888888 88 Yb
; dP"Yb 88""Yb 88888 888888 dP""b8 888888 .dP"Y8
; dP Yb 88__dP 88 88__ dP `" 88 `Ybo."
; Yb dP 88""Yb o. 88 88"" Yb 88 o.`Y8b
; YbodP 88oodP "bodP' 888888 YboodP 88 8bodP'
; Initialise laser objects once every four calls based on IRQ counter if fire pressed
; L_JSR_($20E9)_($3306) OK
Init_Laser_Objects
lda ZP_IRQ_Counter_Lo ; 20E9: A5 4A
and #$03 ; 20EB: 29 03
beq Do_Init_Laser_Objects ; 20ED: F0 01
rts ; 20EF: 60
; ==========================================
; L_BRS_($20F0)_($20ED) OK
Do_Init_Laser_Objects
jsr Load_ZP_Parameters ; 20F0: 20 9D 25
fcb $06 ; 20F3: 06 ZP06/07
fdb Obj_Laser_0 ; 20F4: 88 03
fcb $FF ; 20F6: FF
; Loop through the four possible Laser shots, branch if any are zero, i.e. first shot setup
ldx #MAX_LASERS ; 20F7: A2 04
ldy #LASER_TYPE_PARAM ; 20F9: A0 00
; L_BRS_($20FB)_($210D) OK
Loop_Update_Laser_Objects
lda (ZP06_Laser_Old_State_Lo),y ; 20FB: B1 06
beq Init_Laser_Object ; 20FD: F0 11
; Move 16-bit address pointer to next laser shot object i.e. 8 bytes ahead
lda ZP06_Laser_Old_State_Lo ; 20FF: A5 06
clc ; 2101: 18
adc #$08 ; 2102: 69 08
sta ZP06_Laser_Old_State_Lo ; 2104: 85 06
lda ZP07_Laser_Old_State_Hi ; 2106: A5 07
adc #$00 ; 2108: 69 00
sta ZP07_Laser_Old_State_Hi ; 210A: 85 07
; Test if all Laser objects updated, if yes, return, else loop back
dex ; 210C: CA
bne Loop_Update_Laser_Objects ; 210D: D0 EC
rts ; 210F: 60
; ==========================================
; Get Jetman state attrib i.e. fly/no-fly and facing left/right
; L_BRS_($2110)_($20FD) OK
Init_Laser_Object
lda (ZP_Obj_List_Ptr_Lo),y ; 2110: B1 00
tax ; 2112: AA
; Mask for Jetman facing left/right bit 7, set bit 4 and store to variable
and #%10000000 ; 2113: 29 80
ora #%00010000 ; 2115: 09 10
sta (ZP06_Laser_New_State_Lo),y ; 2117: 91 06
; Get Jetman Position X, manipulate bottom 3 bits and store to variable
iny ; 2119: C8
lda (ZP_Obj_List_Ptr_Lo),y ; 211A: B1 00
and #%11111000 ; 211C: 29 F8
ora #%00000101 ; 211E: 09 05
sta ZP08_Laser_Position_X_Start ; 2120: 85 08
; Test again Jetman facing left/right bit 7
txa ; 2122: 8A
and #%10000000 ; 2123: 29 80
beq Jetman_Facing_Right ; 2125: F0 4C
; Jetman facing left
lda ZP08_Laser_Position_X_Start ; 2127: A5 08
sec ; 2129: 38
sbc #$08 ; 212A: E9 08
jsr Laser_Wrap ; 212C: 20 98 22
; L_JMP_($212F)_($2184) OK
; L_JMP_($212F)_($218A) OK
Init_Laser_Object_Params
sta ZP08_Laser_Position_X_Start ; 212F: 85 08
; Get Jetman Position Y, subtract some pixels to get gun nozzle height and store to laser object
iny ; 2131: C8
iny ; 2132: C8
lda (ZP_Obj_List_Ptr_Lo),y ; 2133: B1 00
sec ; 2135: 38
sbc #LASER_GUN_HEIGHT_OFFSET ; 2136: E9 0D
dey ; 2138: 88
dey ; 2139: 88
sta (ZP06_Laser_New_State_Lo),y ; 213A: 91 06
; Fill Laser object parameters 2-5 with copies of X start position, but with bit 2 ANDed out
ldx #LASER_POSITION_X_PARAMS ; 213C: A2 03
iny ; 213E: C8
lda ZP08_Laser_Position_X_Start ; 213F: A5 08
sta (ZP06_Laser_New_State_Lo),y ; 2141: 91 06
and #%11111011 ; 2143: 29 FB
; L_BRS_($2145)_($2149) OK
Loop_Init_Laser
iny ; 2145: C8
sta (ZP06_Laser_New_State_Lo),y ; 2146: 91 06
dex ; 2148: CA
bne Loop_Init_Laser ; 2149: D0 FA
; Set laser shot beam length parameter 6 randomly using IRQ counter,
; range 0100_0000 to 0111_1000 i.e. $40-$78
iny ; 214B: C8
lda ZP_IRQ_Random ; 214C: A5 4C
and #%00111000 ; 214E: 29 38
clc ; 2150: 18
adc #%01000000 ; 2151: 69 40
sta (ZP06_Laser_New_State_Lo),y ; 2153: 91 06
; Load a random laser colour value 0-7 using IRQ counter
iny ; 2155: C8
lda ZP_IRQ_Random ; 2156: A5 4C
and #%00000111 ; 2158: 29 07
tax ; 215A: AA
lda Laser_Colour_Table,x ; 215B: BD 6B 21
sta (ZP06_Laser_New_State_Lo),y ; 215E: 91 06
; Trigger laser sound by setting parameters in sound object
lda #$03 ; 2160: A9 03
sta Obj_Sound_Laser ; 2162: 8D AD 03
lda #$10 ; 2165: A9 10
sta Obj_Sound_Laser_Timer ; 2167: 8D AE 03
rts ; 216A: 60
; ==========================================
; Green not used, it's used for the platforms only
Laser_Colour_Table
fcb COLOUR_WHITE,COLOUR_RED ; 216B: 01 02
fcb COLOUR_CYAN,COLOUR_PURPLE ; 216D: 03 04
fcb COLOUR_BLUE,COLOUR_YELLOW ; 216F: 06 07
fcb COLOUR_CYAN,COLOUR_YELLOW ; 2171: 03 07
; Test if Jetman Position X is facing right at the start of a tile
; L_BRS_($2173)_($2125) OK
Jetman_Facing_Right
lda (ZP_Obj_List_Ptr_Lo),y ; 2173: B1 00
and #%00000111 ; 2175: 29 07
beq Add_To_Laser_Start_Position_X ; 2177: F0 14
; Add to the laser start Position X $18 pixels to avoid drawing laser over Jetman on screen
lda ZP08_Laser_Position_X_Start ; 2179: A5 08
clc ; 217B: 18
adc #$18 ; 217C: 69 18
; Test for X coordinate screen wraparound
; L_JMP_($217E)_($2192) OK
Laser_Jetman_Facing_Right_Wrap
and #%11111110 ; 217E: 29 FE
cmp #SCREEN_WIDTH_PIXELS ; 2180: C9 B8
bcs Wrap_Laser_Shot_Position_X ; 2182: B0 03
jmp Init_Laser_Object_Params ; 2184: 4C 2F 21
; ------------------------------------------
; Wrap the laser by subtracting the width of the screen in pixels from the X position
; L_BRS_($2187)_($2182) OK
Wrap_Laser_Shot_Position_X
sec ; 2187: 38
sbc #SCREEN_WIDTH_PIXELS ; 2188: E9 B8
jmp Init_Laser_Object_Params ; 218A: 4C 2F 21
; ------------------------------------------
; Add to the laser start Position X $10 pixels to avoid drawing laser over Jetman on screen
; L_BRS_($218D)_($2177) OK
Add_To_Laser_Start_Position_X
lda ZP08_Laser_Position_X_Start ; 218D: A5 08
clc ; 218F: 18
adc #$10 ; 2190: 69 10
jmp Laser_Jetman_Facing_Right_Wrap ; 2192: 4C 7E 21
; ------------------------------------------
; ############################################################################################
; 8888b. 88 .dP"Y8 88""Yb 88 db Yb dP
; 8I Yb 88 `Ybo." 88__dP 88 dPYb YbdP
; 8I dY 88 o.`Y8b 88""" 88 .o dP__Yb 8P
; 8888Y" 88 8bodP' 88 88ood8 dP""""Yb dP
; 88 db .dP"Y8 888888 88""Yb .dP"Y8
; 88 dPYb `Ybo." 88__ 88__dP `Ybo."
; 88 .o dP__Yb o.`Y8b 88"" 88"Yb o.`Y8b
; 88ood8 dP""""Yb 8bodP' 888888 88 Yb 8bodP'
; ############################################################################################
; L_BRS_($2195)_($21C7) OK
Add_08_Handle_Wrap_Get_Y_Coord
adc #$08 ; 2195: 69 08
jmp Handle_Wrap_Get_Y_Cooord ; 2197: 4C CB 21
; ------------------------------------------
DISPLAY_LASERS
ldy #LASER_LENGTH_PARAM ; 219A: A0 06
lda (ZP_Obj_List_Ptr_Lo),y ; 219C: B1 00
sta ZP07_Laser_Length_Columns ; 219E: 85 07
; Y becomes $07 i.e. Laser Colour parameter
iny ; 21A0: C8 Y=$07, laser colour addr
lda (ZP_Obj_List_Ptr_Lo),y ; 21A1: B1 00 Fetch laser colour
sta ZP1B_Laser_Colour ; 21A3: 85 1B Store to ZP variable
; Get laser X and Y-coord and store to temp vars
ldy #LASER_POSITION_X ; 21A5: A0 02
lda (ZP_Obj_List_Ptr_Lo),y ; 21A7: B1 00
sta ZP06_Laser_Position_X ; 21A9: 85 06
sta ZP04_Laser_Position_X ; 21AB: 85 04
; Y becomes $01 i.e. Laser Position Y
dey ; 21AD: 88
lda (ZP_Obj_List_Ptr_Lo),y ; 21AE: B1 00
sta ZP05_Laser_Position_Y ; 21B0: 85 05
sta ZP13_Laser_Position_Y ; 21B2: 85 13
; Test if full length of laser has now been reached, branch if yes
lda ZP06_Laser_Position_X ; 21B4: A5 06
bit MASK_00000100 ; 21B6: 2C 16 20
beq Setup_Laser_Decay_Patterns ; 21B9: F0 47
jsr Setup_Colour_RAM_Address ; 21BB: 20 F7 34
jsr Convert_XY_to_UDG_RAM_Address ; 21BE: 20 1D 35
; Test if firing left or right
lda ZP06_Laser_Position_X ; 21C1: A5 06
bit MASK_00000001 ; 21C3: 2C 14 20
clc ; 21C6: 18
; Add 8 if firing left or -8 if firing right ($F8 is -8)
beq Add_08_Handle_Wrap_Get_Y_Coord ; 21C7: F0 CC
adc #$F8 ; 21C9: 69 F8
; L_JMP_($21CB)_($2197) OK
Handle_Wrap_Get_Y_Cooord
jsr Laser_Wrap ; 21CB: 20 98 22
tax ; 21CE: AA Save A
ldy #LASER_POSITION_Y ; 21CF: A0 01
lda (ZP_Obj_List_Ptr_Lo),y ; 21D1: B1 00
; Register Y becomes $00 i.e. Laser Type/Direction Facing parameter
dey ; 21D3: 88
; Laser Position Y in accumulator, test if laser shot positions near bottom of screen
; i.e. at or below height of fully-built ship, branch if it is near the bottom
cmp #%10000000 ; 21D4: C9 80
bcs Save_Laser_Position_X ; 21D6: B0 04
; Test if laser address in UDG RAM is empty, jump if not empty
; This stops you firing through objects when laser is above the top of the fully-built ship
lda (ZP04_Laser_UDG_RAM_Addr_Lo),y ; 21D8: B1 04
bne UDG_RAM_Zero_Bit_2 ; 21DA: D0 20
; L_BRS_($21DC)_($21D6) OK
Save_Laser_Position_X
txa ; 21DC: 8A Restore A
sta ZP06_Laser_Position_X ; 21DD: 85 06
; Reverse the displayed 8-bit byte on-screen
lda (ZP04_Laser_UDG_RAM_Addr_Lo),y ; 21DF: B1 04
eor #%11111111 ; 21E1: 49 FF
sta (ZP04_Laser_UDG_RAM_Addr_Lo),y ; 21E3: 91 04
; Load current tile colour, check it's not green, jump if it is
lda (ZP0C_Colour_RAM_Tile_Addr_Lo),y; 21E5: B1 0C
and #%00001111 ; 21E7: 29 0F
cmp #COLOUR_GREEN ; 21E9: C9 05
beq Reduce_Laser_Length_Countdown ; 21EB: F0 04
; Update laser tile colour
lda ZP1B_Laser_Colour ; 21ED: A5 1B
sta (ZP0C_Colour_RAM_Tile_Addr_Lo),y; 21EF: 91 0C
; L_BRS_($21F1)_($21EB) OK
Reduce_Laser_Length_Countdown
lda ZP07_Laser_Length_Columns ; 21F1: A5 07
sec ; 21F3: 38
sbc #$08 ; 21F4: E9 08
sta ZP07_Laser_Length_Columns ; 21F6: 85 07
; Test if laser length is > 7, if yes branch
and #%11111000 ; 21F8: 29 F8
bne Setup_Laser_Decay_Patterns ; 21FA: D0 06
; Probably turns of further display of laser beam
; L_BRS_($21FC)_($21DA) OK
UDG_RAM_Zero_Bit_2
lda ZP06_Laser_Position_X ; 21FC: A5 06
and #%11111011 ; 21FE: 29 FB
sta ZP06_Laser_Position_X ; 2200: 85 06
; Loads ZP 14/15/16/17 with laser decay pattern, initial laser is a line of $FF's then $03
; subtracted leaving $FC, then $1C subtracted leaving $E0, the subtracting $E0 leaves $00
; L_BRS_($2202)_($21B9) OK
; L_BRS_($2202)_($21FA) OK
Setup_Laser_Decay_Patterns
jsr Load_ZP_Parameters ; 2202: 20 9D 25
fcb $14 ; 2205: 14 ZP14/15
fcb %00000000,%00000011 ; 2206: 00 03 Laser decay pattern
fcb $16 ; 2208: 16 ZP16/17
fcb %00011100,%11100000 ; 2209: 1C E0 Laser decay pattern
fcb $02 ; 220B: 02 ZP02/03
fdb $0003 ; 220C: 03 00 Countdown for laser params
fcb $FF ; 220E: FF
; Iterate through each of the laser shots that could be active for display
ldy #$02 ; 220F: A0 02
; L_BRS_($2211)_($221F) OK
; L_BRS_($2211)_($2280) OK
Iterate_Laser_Params_2_3_4_5
iny ; 2211: C8
lda (ZP_Obj_List_Ptr_Lo),y ; 2212: B1 00
eor ZP06_Laser_Position_X ; 2214: 45 06
and #%11111000 ; 2216: 29 F8
bne Process_Laser_Shot ; 2218: D0 0F
; Test if all possible laser parameters processed
jsr Cascade_Laser_Pattern_Data ; 221A: 20 8B 22
dec ZP02_Laser_Param_Countdown ; 221D: C6 02
bne Iterate_Laser_Params_2_3_4_5 ; 221F: D0 F0
; All laser shots ended, set laser shots object type to zero i.e. no laser shot
lda #LASER_TYPE_PARAM ; 2221: A9 00
tay ; 2223: A8
sta (ZP_Obj_List_Ptr_Lo),y ; 2224: 91 00
jmp GOTO_NEXT_OBJECT ; 2226: 4C 1A 26
; ------------------------------------------