-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathseawolf_dz80.asm
2474 lines (2197 loc) · 77.3 KB
/
seawolf_dz80.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
;; out 01 = Explosion matrix
;; out 02 = Torpedo display
;; out 03 = Shifter data
;; out 04 = Shifter count
;; out 05 = Sound triggers
;; out 06 = watchdog (add this)
;; 2000-2001 = ??
;; 2002 = Down counter (when $200e == 0) (Game time?)
;; 2003 = Down counter ($1E to $00)
;; 2005 = Credits
;; 2006 = High score byte
;; 2007 = Last IN1
;; 2008 = Last IN0
;; 2010 = Down counter (when $2003 == 0)
;; 2011 = Down counter
;; 2014-2015 = Sprite loc to update (0 in attract)
;; 2016-2017 =
;; 2018-2019 = Pointer to ship 0 data
;; 201a-201b = Pointer to ship 1 data
;; 201c = Next sprite?
;; 201e = ??
;; 201f = ??
;; 2020 = Mask for subs to call at 04ce (when [[$2000]] == 00)
;; D7 = $2002, D6 = $2010, D5 = $2011, D4 = $2021
;; D3 = $2022, D2 = $2023, D1 = $2024, D0 = $2025
;; 2021 = Down counter (non-zero inhibits fire)
;; 2022 = Down counter
;; 2023 = Down counter ($19 for small ship)
;; 2024 = Down counter
;; 2025 = Audio timer (down counter)
;; 2026 = Down counter ($0f for small ship)
;; 2027-2028 = Wave state
;; 2029 = Next ship type
;; 202b = Player score
;; 202c = ??
;; 202d = Torpedo status
;; 202e = 1 if extended time passed
;; 2030 = Current sprite shift
;; 2058-2064 = Ship data 0 (Attract?)
;; Byte 0 = X flags?
;; Byte 1 = Delta X
;; Byte 2 = X Pos ((loc-$2400) & $1f)<<3 | (shift & $07)
;; Byte 3 = Y flags
;; Byte 4 = Delta Y
;; Byte 5 = Y Pos (loc-$2400)>>5
;; Byte 6 = ??
;; Byte 7-8 = Sprite tbl LSB,MSB
;; Byte 9-A = (address -> de -> hl)
;; Byte C = (read into b)
;; Byte D = (read into c)
;; 2065-2071 = Ship data 1
;; 2072-207e = Ship data 2
;; 207f-208b = Ship data 3
;; 208c-2098 = Ship data 4
;; 2099-20a5 = Ship data 5
;; 20a6-20b2 = Ship data 6
;; 20b3-20bf = Ship data 7
;; 20c0-20cc = Ship data 8
;; 20cd-20d9 = Ship data 9
;; 20da-20e6 = Ship data a
;; Torpedo control?
;; 20c9-20e6 = $1e data block
;; 20e7-2104 = $1e data block
;; 2105-2122 = $1e data block
;; 2123-2140 = $1e data block
;; 215f-21a3 = $44 data block, cleared at $0088
;; 215f
;; 2181
;; 21f0-21f1 = Address for $0A3F clear if non-zero
;; 21f2-21f3 = Address for $0A3F clear if non-zero
;; 21f4-21f5 = Address for $0A3F clear if non-zero
;; 21f4-21f5 = Address for $0A3F clear if non-zero
;; RST $00 ($C7)
0000: 00 nop
0001: 00 nop
0002: 31 00 24 ld sp,$2400 ; Stack pointer
0005: C3 3A 04 jp $043A ; Startup jump
;; rst $08 ($cf interrupt vector)
0008: E5 push hl
0009: D5 push de
000A: C5 push bc
000B: F5 push af
000C: C3 7E 00 jp $007E
000F: 00 nop
;; rst $10 ($d7 interrupt vector)
0010: E5 push hl
0011: D5 push de
0012: C5 push bc
0013: F5 push af
0014: 3A 1F 20 ld a,($201F)
0017: A7 and a
0018: C2 3E 00 jp nz,$003E
001B: CD BC 03 call $03BC ; Update wave
001E: CD 2E 01 call $012E ; Update a sprite
0021: 2A 16 20 ld hl,($2016) ; Sprite pointer
0024: 7E ld a,(hl)
0025: A7 and a
0026: F2 36 00 jp p,$0036 ; Jump if not active
0029: E6 20 and $20
002B: CA 36 00 jp z,$0036 ; Jump if ??
002E: CD 5B 03 call $035B ; Load de, bc from ship data
0031: 0D dec c
0032: EB ex de,hl
0033: CD 2A 0A call $0A2A ; Draw b x c block from de at hl
0036: 3E FF ld a,$FF
0038: 32 1F 20 ld ($201F),a
003B: C3 69 00 jp $0069 ; End of interrupt routine
003E: 2A 16 20 ld hl,($2016) ; Sprite pointer
0041: 7E ld a,(hl)
0042: A7 and a
0043: F2 62 00 jp p,$0062 ; Jump if not active
0046: E6 40 and $40
0048: C2 50 00 jp nz,$0050 ; Jump if not set to clear
004B: 36 00 ld (hl),$00 ; Clear sprite
004D: C3 62 00 jp $0062
0050: 7E ld a,(hl) ; Set bit 5
0051: F6 20 or $20
0053: 77 ld (hl),a
0054: CD 65 01 call $0165 ; Update sprite
0057: 78 ld a,b
0058: E5 push hl
0059: 2A 1C 20 ld hl,($201C)
005C: 44 ld b,h
005D: 4D ld c,l
005E: E1 pop hl
005F: CD 16 0A call $0A16
0062: CD 68 03 call $0368
0065: AF xor a
0066: 32 1F 20 ld ($201F),a
;; End of interrupt routine
0069: DB 02 in a,($02) ; IN1
006B: 47 ld b,a
006C: DB 02 in a,($02) ; IN1
006E: 21 07 20 ld hl,$2007 ; Last IN1?
0071: 11 CA 09 ld de,$09CA
0074: B8 cp b ; Bits changed?
0075: CC 05 0B call z,$0B05
0078: F1 pop af
0079: C1 pop bc
007A: D1 pop de
007B: E1 pop hl
007C: FB ei
007D: C9 ret
;; Interrupt vector continues...
007E: 3A 1F 20 ld a,($201F)
0081: A7 and a
0082: C2 19 01 jp nz,$0119
0085: CD BC 03 call $03BC ; Update wave
;; Clear $215f-$21a3
0088: 21 5F 21 ld hl,$215F
008B: 06 44 ld b,$44
008D: AF xor a
008E: 77 ld (hl),a
008F: 23 inc hl
0090: 05 dec b
0091: C2 8E 00 jp nz,$008E
0094: 2A 18 20 ld hl,($2018) ; Sprite pointer 0
0097: 3E 03 ld a,$03 ; Loop counter
0099: F5 push af
009A: 7D ld a,l
009B: FE 58 cp $58 ; hl==$2058?
009D: C2 A3 00 jp nz,$00A3
00A0: 21 31 20 ld hl,$2031 ; Resets to $2031
00A3: B4 or h
00A4: CA A0 00 jp z,$00A0
00A7: E5 push hl
00A8: CD DE 01 call $01DE
00AB: E1 pop hl
00AC: D2 B2 00 jp nc,$00B2
00AF: 22 18 20 ld ($2018),hl ; Sprite pointer 0
00B2: 11 0D 00 ld de,$000D
00B5: 19 add hl,de
00B6: F1 pop af
00B7: 3D dec a
00B8: C2 99 00 jp nz,$0099 ; Loop back
00BB: 2A 18 20 ld hl,($2018) ; Sprite pointer 0
00BE: CD 0C 03 call $030C
00C1: 2A 1A 20 ld hl,($201A) ; Sprite pointer 1
00C4: 3E 03 ld a,$03 ; Loop counter
00C6: F5 push af
00C7: 7D ld a,l
00C8: FE 7F cp $7F ; hl==$207F?
00CA: C2 D0 00 jp nz,$00D0
00CD: 21 58 20 ld hl,$2058 ; Reset to $2058
00D0: B4 or h
00D1: CA CD 00 jp z,$00CD
00D4: E5 push hl
00D5: CD DE 01 call $01DE
00D8: E1 pop hl
00D9: D2 DF 00 jp nc,$00DF
00DC: 22 1A 20 ld ($201A),hl ; Sprite pointer 1
00DF: 11 0D 00 ld de,$000D
00E2: 19 add hl,de
00E3: F1 pop af
00E4: 3D dec a
00E5: C2 C6 00 jp nz,$00C6 ; Loop back
00E8: AF xor a
00E9: 32 30 20 ld ($2030),a ; Clear sprite shift
00EC: 2A 16 20 ld hl,($2016) ; Pointer?
00EF: 3E 04 ld a,$04 ; Loop counter
00F1: F5 push af
00F2: 7D ld a,l
00F3: FE 5F cp $5F
00F5: C2 FB 00 jp nz,$00FB
00F8: 21 E7 20 ld hl,$20E7 ; Reset to $20E7
00FB: B4 or h
00FC: CA F8 00 jp z,$00F8
00FF: E5 push hl
0100: CD 50 02 call $0250
0103: E1 pop hl
0104: D2 0A 01 jp nc,$010A
0107: 22 16 20 ld ($2016),hl ; Pointer?
010A: 11 1E 00 ld de,$001E
010D: 19 add hl,de
010E: F1 pop af
010F: 3D dec a
0110: C2 F1 00 jp nz,$00F1 ; Loop back
0113: CD 31 03 call $0331
0116: C3 69 00 jp $0069 ; End of interrupt routine
0119: 2A 1A 20 ld hl,($201A) ; Ship 1 pointer
011C: CD 0C 03 call $030C
011F: 2A 1A 20 ld hl,($201A) ; Ship 1 pointer
0122: CD 3A 01 call $013A
0125: 2A 18 20 ld hl,($2018) ; Ship 0 pointer
0128: CD 3A 01 call $013A
012B: C3 69 00 jp $0069 ; End of interrupt routine
;; Called from rst $10
012E: 2A 14 20 ld hl,($2014)
0131: 7E ld a,(hl)
0132: A7 and a
0133: F0 ret p ; No sprite to update?
0134: CD 65 01 call $0165 ; Update sprite
0137: C3 92 01 jp $0192
;; Handle 2018/201a entries (read into hl)
013A: 7E ld a,(hl)
013B: A7 and a
013C: F0 ret p ; Return if b7 clear
013D: E6 40 and $40 ; Check bit 6
013F: C2 45 01 jp nz,$0145 ; Jump if set
0142: 36 00 ld (hl),$00 ; Clear entry
0144: C9 ret
;; Bits 7 set, bit 6 clear
0145: 7E ld a,(hl)
0146: F6 20 or $20
0148: 77 ld (hl),a ; Set bit 5
0149: F5 push af
014A: CD 65 01 call $0165 ; Update sprite
;; hl = screen loc, c= shift on return
014D: F1 pop af
014E: E6 10 and $10 ; Check bit 4
0150: CA 92 01 jp z,$0192 ; Initial sprite draw
0153: 79 ld a,c
0154: 85 add a,l
0155: 6F ld l,a
0156: E5 push hl
0157: 21 30 20 ld hl,$2030
015A: 7E ld a,(hl)
015B: 2F cpl
015C: E6 07 and $07
015E: 77 ld (hl),a
015F: E1 pop hl
0160: D3 04 out ($04),a ; Update shift count
0162: C3 B8 01 jp $01B8
;; Update/redraw sprite
0165: 23 inc hl
0166: 23 inc hl
0167: 5E ld e,(hl) ; LSB of loc + shift
0168: 23 inc hl
0169: 23 inc hl
016A: 23 inc hl
016B: 56 ld d,(hl) ; MSB of loc
016C: 23 inc hl
016D: 23 inc hl
016E: CD 00 0A call $0A00 ; de >> 3, e&3 -> c
0171: 79 ld a,c ; (shift)
0172: 32 30 20 ld ($2030),a
0175: D3 04 out ($04),a ; Shifter count
0177: D5 push de ; Store screen loc
0178: 5E ld e,(hl) ; Read rom loc
0179: 23 inc hl
017A: 56 ld d,(hl)
017B: 23 inc hl
017C: EB ex de,hl ; rom loc -> hl
017D: 4E ld c,(hl) ; Read bc (row/cols)
017E: 23 inc hl
017F: 46 ld b,(hl)
0180: 23 inc hl
0181: E3 ex (sp),hl ; swap screen loc
0182: EB ex de,hl ; Back to ram table
0183: 73 ld (hl),e
0184: 23 inc hl
0185: 72 ld (hl),d
0186: 23 inc hl
0187: 71 ld (hl),c
0188: 34 inc (hl) ; +1 wide for shifting?
0189: 23 inc hl
018A: 70 ld (hl),b
018B: 23 inc hl
018C: 22 1C 20 ld ($201C),hl
018F: EB ex de,hl ; hl = screen loc
0190: D1 pop de ; de = sprite data in ROM
0191: C9 ret ; bc = bytes wide, pix high
;; Initial sprite draw
0192: C5 push bc ; bc = bytes wide, pix high
0193: E5 push hl ; hl = screen loc
0194: 1A ld a,(de) ; Sprite byte
0195: 13 inc de
0196: D3 03 out ($03),a ; MB12421 data write
0198: DB 03 in a,($03) ; MB12421 data read
019A: 77 ld (hl),a ; Write to RAM
019B: 23 inc hl
019C: 0D dec c
019D: C2 94 01 jp nz,$0194 ; Loop for width
01A0: AF xor a
01A1: D3 03 out ($03),a ; MB12421 data write
01A3: DB 03 in a,($03) ; MB12421 data read
01A5: 77 ld (hl),a ; Final write
01A6: 01 20 00 ld bc,$0020 ; Row increment
01A9: E1 pop hl
01AA: 09 add hl,bc ; Next row
01AB: C1 pop bc
01AC: 7D ld a,l
01AD: E6 E0 and $E0
01AF: C2 92 01 jp nz,$0192 ; Not bottom of screen
01B2: 7C ld a,h
01B3: 1F rra
01B4: DA 92 01 jp c,$0192 ; Not end of screen
01B7: C9 ret
;; Finish sprite draw
01B8: C5 push bc
01B9: E5 push hl
01BA: 1A ld a,(de)
01BB: 13 inc de
01BC: D3 03 out ($03),a ; Shifter input
01BE: DB 00 in a,($00) ; Shifter output
01C0: 77 ld (hl),a ; Write to screen
01C1: 2B dec hl
01C2: 0D dec c
01C3: C2 BA 01 jp nz,$01BA ; Loop for row
01C6: AF xor a
01C7: D3 03 out ($03),a ; Shifter input
01C9: DB 00 in a,($00) ; Shifter output
01CB: 77 ld (hl),a ; Write to screen
01CC: 01 20 00 ld bc,$0020 ; Next line
01CF: E1 pop hl
01D0: 09 add hl,bc
01D1: C1 pop bc
01D2: 7D ld a,l
01D3: E6 E0 and $E0
01D5: C2 B8 01 jp nz,$01B8 ; Loop
01D8: 7C ld a,h
01D9: 1F rra
01DA: DA B8 01 jp c,$01B8 ; Loop
01DD: C9 ret
;;
01DE: 7E ld a,(hl)
01DF: A7 and a
01E0: F0 ret p ; High bit clear = inactive
01E1: E5 push hl ; hl now delta X
01E2: 23 inc hl
01E3: E6 07 and $07 ; Mask low 3 bits
01E5: C2 ED 01 jp nz,$01ED ; (is a ship)
01E8: 23 inc hl
01E9: 23 inc hl
01EA: C3 37 02 jp $0237
01ED: 7E ld a,(hl) ; Delta X
01EE: 11 5F 21 ld de,$215F ; Table for +
01F1: A7 and a
01F2: F2 F8 01 jp p,$01F8
01F5: 11 81 21 ld de,$2181 ; Table for -
01F8: 47 ld b,a ; b = delta x
01F9: 23 inc hl ; (hl) = X
01FA: 86 add a,(hl) ; a = x + dx
01FB: 77 ld (hl),a ; store x
01FC: 78 ld a,b ; a = delta X
01FD: A7 and a
01FE: 7E ld a,(hl) ; a = X
01FF: F2 10 02 jp p,$0210 ; (left to right)
0202: FE 01 cp $01
0204: D2 16 02 jp nc,$0216
0207: E3 ex (sp),hl
0208: 7E ld a,(hl)
0209: E6 BF and $BF ; Clear bit 5
020B: 77 ld (hl),a
020C: E3 ex (sp),hl
020D: C3 16 02 jp $0216
0210: 23 inc hl
0211: BE cp (hl) ; End X
0212: 2B dec hl
0213: D2 07 02 jp nc,$0207
0216: 7E ld a,(hl)
0217: 0F rrca
0218: 0F rrca
0219: 0F rrca
021A: E6 1F and $1F
021C: 83 add a,e
021D: 5F ld e,a
021E: E3 ex (sp),hl
021F: 7E ld a,(hl)
0220: E3 ex (sp),hl
0221: E6 07 and $07
0223: 47 ld b,a
0224: 23 inc hl
0225: 7E ld a,(hl)
0226: 2F cpl
0227: 3C inc a
0228: 0F rrca
0229: 0F rrca
022A: 0F rrca
022B: E6 07 and $07
022D: C6 03 add a,$03
022F: EB ex de,hl
0230: 70 ld (hl),b
0231: 23 inc hl
0232: 3D dec a
0233: C2 30 02 jp nz,$0230
0236: EB ex de,hl
0237: 11 2F 20 ld de,$202F
023A: 1A ld a,(de)
023B: 2F cpl
023C: 12 ld (de),a
023D: C2 47 02 jp nz,$0247
0240: 23 inc hl
0241: 7E ld a,(hl)
0242: 23 inc hl
0243: 86 add a,(hl)
0244: 77 ld (hl),a
0245: 23 inc hl
0246: BE cp (hl)
0247: E1 pop hl
0248: 37 scf
0249: C0 ret nz
024A: 7E ld a,(hl)
024B: E6 BF and $BF
024D: 77 ld (hl),a
024E: 37 scf
024F: C9 ret
0250: 7E ld a,(hl)
0251: A7 and a
0252: F0 ret p
0253: E5 push hl
0254: 23 inc hl
0255: 23 inc hl
0256: 4E ld c,(hl)
0257: 23 inc hl
0258: 23 inc hl
0259: 7E ld a,(hl)
025A: 23 inc hl
025B: 46 ld b,(hl)
025C: 80 add a,b
025D: 77 ld (hl),a
025E: 78 ld a,b
025F: FE C0 cp $C0
0261: D2 09 03 jp nc,$0309
0264: FE 30 cp $30
0266: D2 75 02 jp nc,$0275
0269: 3A 24 20 ld a,($2024)
026C: A7 and a
026D: CA 75 02 jp z,$0275
0270: 3C inc a
0271: 3C inc a
0272: 32 24 20 ld ($2024),a
0275: 7E ld a,(hl)
0276: 23 inc hl
0277: BE cp (hl)
0278: D2 9C 02 jp nc,$029C
027B: 3E C0 ld a,$C0
027D: 86 add a,(hl)
027E: 77 ld (hl),a
027F: 2B dec hl
0280: 2B dec hl
0281: 34 inc (hl)
0282: 34 inc (hl)
0283: 7E ld a,(hl)
0284: 23 inc hl
0285: 23 inc hl
0286: 23 inc hl
0287: CA 96 02 jp z,$0296
028A: 36 88 ld (hl),$88
028C: FE FC cp $FC
028E: CA 9C 02 jp z,$029C
0291: 36 98 ld (hl),$98
0293: C3 9C 02 jp $029C
0296: E3 ex (sp),hl
0297: 7E ld a,(hl)
0298: E6 BF and $BF
029A: 77 ld (hl),a
029B: E3 ex (sp),hl
029C: 11 30 20 ld de,$2030
029F: 1A ld a,(de)
02A0: A7 and a
02A1: C2 09 03 jp nz,$0309
02A4: 3C inc a
02A5: 12 ld (de),a
02A6: 78 ld a,b
02A7: E6 10 and $10
02A9: CA 09 03 jp z,$0309
02AC: 11 07 00 ld de,$0007
02AF: 19 add hl,de
02B0: 7E ld a,(hl)
02B1: A7 and a
02B2: C2 C3 02 jp nz,$02C3
02B5: 19 add hl,de
02B6: 78 ld a,b
02B7: 83 add a,e
02B8: 47 ld b,a
02B9: E6 10 and $10
02BB: CA 09 03 jp z,$0309
02BE: 7E ld a,(hl)
02BF: A7 and a
02C0: CA 09 03 jp z,$0309
02C3: E3 ex (sp),hl
02C4: 7E ld a,(hl)
02C5: E6 BF and $BF
02C7: 77 ld (hl),a
02C8: E3 ex (sp),hl
02C9: 78 ld a,b
02CA: D6 40 sub $40
02CC: 47 ld b,a
02CD: DA E0 02 jp c,$02E0
02D0: 21 A1 21 ld hl,$21A1
02D3: 23 inc hl
02D4: 23 inc hl
02D5: 7E ld a,(hl)
02D6: A7 and a
02D7: C2 D3 02 jp nz,$02D3
02DA: 70 ld (hl),b
02DB: 23 inc hl
02DC: 71 ld (hl),c
02DD: C3 09 03 jp $0309
02E0: 21 BE 21 ld hl,$21BE
02E3: 23 inc hl
02E4: 23 inc hl
02E5: 23 inc hl
02E6: 7E ld a,(hl)
02E7: A7 and a
02E8: C2 E3 02 jp nz,$02E3
02EB: 78 ld a,b
02EC: C6 20 add a,$20
02EE: 11 60 21 ld de,$2160
02F1: FA F7 02 jp m,$02F7
02F4: 11 82 21 ld de,$2182
02F7: 79 ld a,c
02F8: 0F rrca
02F9: 0F rrca
02FA: 0F rrca
02FB: E6 1F and $1F
02FD: 83 add a,e
02FE: 5F ld e,a
02FF: 1A ld a,(de)
0300: A7 and a
0301: CA 09 03 jp z,$0309
0304: 77 ld (hl),a
0305: 23 inc hl
0306: 71 ld (hl),c
0307: 23 inc hl
0308: 70 ld (hl),b
0309: 37 scf
030A: E1 pop hl
030B: C9 ret
;; hl = Ship pointer
030C: 7E ld a,(hl) ; X flags?
030D: A7 and a
030E: F0 ret p ; Return if high bit not set
030F: E6 20 and $20
0311: C8 ret z ; Bit 5 clear = not active
0312: CD 5B 03 call $035B ; Get de, bc from bytes 9-d
0315: EB ex de,hl ; hl = read de
0316: 41 ld b,c
0317: AF xor a
0318: E5 push hl ; Store loc
;; Clear c bytes
0319: 77 ld (hl),a
031A: 23 inc hl
031B: 0D dec c
031C: C2 19 03 jp nz,$0319
031F: 11 20 00 ld de,$0020
0322: E1 pop hl ; Get loc
0323: 19 add hl,de ; Next line
0324: 48 ld c,b
0325: 7D ld a,l
0326: E6 E0 and $E0
0328: C2 17 03 jp nz,$0317 ; Loop
032B: 7C ld a,h
032C: 1F rra
032D: DA 17 03 jp c,$0317 ; Loop
0330: C9 ret
0331: 2A 14 20 ld hl,($2014)
0334: 06 0A ld b,$0A ; Loop counter
0336: 7D ld a,l
0337: B4 or h
0338: C2 3E 03 jp nz,$033E
033B: 21 72 20 ld hl,$2072 ; Reset to $2072
033E: 11 0D 00 ld de,$000D
0341: 19 add hl,de
0342: 05 dec b
0343: C8 ret z ; End of loop
0344: 7D ld a,l
0345: FE E7 cp $E7 ; hl == $20E7?
0347: C2 4D 03 jp nz,$034D
034A: 21 7F 20 ld hl,$207F ; Reset to $207F
034D: 7E ld a,(hl) ; X flags
034E: A7 and a
034F: F2 41 03 jp p,$0341 ; MSB clear?
0352: 22 14 20 ld ($2014),hl
0355: 23 inc hl
0356: 7E ld a,(hl) ; Delta X
0357: 23 inc hl
0358: 86 add a,(hl) ; Add to X
0359: 77 ld (hl),a ; Store X
035A: C9 ret
;; Load de, bc from ship data
035B: 11 09 00 ld de,$0009
035E: 19 add hl,de
035F: 5E ld e,(hl)
0360: 23 inc hl
0361: 56 ld d,(hl)
0362: 23 inc hl
0363: 4E ld c,(hl)
0364: 23 inc hl
0365: 46 ld b,(hl)
0366: 23 inc hl
0367: C9 ret
;; Called from ISR
0368: 3A 20 20 ld a,($2020)
036B: A7 and a
036C: C0 ret nz
036D: 47 ld b,a
036E: 21 03 20 ld hl,$2003 ; Counter address
0371: 35 dec (hl) ; Decrement counter
0372: C2 8E 03 jp nz,$038E
;; Counter zero
0375: 36 1E ld (hl),$1E ; Reset counter
0377: 21 02 20 ld hl,$2002 ; Game timer
037A: 7E ld a,(hl)
037B: A7 and a
037C: CA 88 03 jp z,$0388 ; Game over
037F: C6 99 add a,$99
0381: 27 daa
0382: 77 ld (hl),a ; Decrement game timer
0383: C2 88 03 jp nz,$0388
0386: 06 01 ld b,$01 ; --> d7
0388: 21 10 20 ld hl,$2010
038B: CD AE 03 call $03AE ; Handle $2010 timer d6
;; Counter non-zero
038E: 21 11 20 ld hl,$2011
0391: CD AE 03 call $03AE ; Handle $2011 timer d5
0394: 21 21 20 ld hl,$2021
0397: CD AE 03 call $03AE ; Handle $2021 timer d4
039A: 23 inc hl
039B: CD AE 03 call $03AE ; Handle $2022 timer d3
039E: 23 inc hl
039F: CD AE 03 call $03AE ; Handle $2023 timer d2
03A2: 23 inc hl
03A3: CD AE 03 call $03AE ; Handle $2024 timer d1
03A6: 23 inc hl
03A7: CD AE 03 call $03AE ; Handle $2025 timer d0
03AA: 32 20 20 ld ($2020),a
03AD: C9 ret
;; Decrement timer, set bit if 0
03AE: 7E ld a,(hl)
03AF: A7 and a
03B0: CA B8 03 jp z,$03B8
03B3: 35 dec (hl)
03B4: C2 B8 03 jp nz,$03B8
03B7: 37 scf ; Set carry
;; Shift 0 into b unless carry set above
03B8: 78 ld a,b
03B9: 17 rla
03BA: 47 ld b,a
03BB: C9 ret
;; Called from both interrupt routines
;; Updates and redraw "wave"
03BC: 01 27 20 ld bc,$2027
03BF: 0A ld a,(bc)
03C0: C6 0A add a,$0A ; $00 -> $0A -> $14 -> $1E = $00
03C2: FE 1E cp $1E
03C4: C2 C8 03 jp nz,$03C8
03C7: AF xor a
03C8: 02 ld (bc),a ; Store state
03C9: 03 inc bc ; $2028
03CA: 5F ld e,a
03CB: 16 00 ld d,$00
03CD: 21 F3 0B ld hl,$0BF3 ; Start of waves
03D0: 19 add hl,de
03D1: EB ex de,hl ; de = wave table entry
03D2: 0A ld a,(bc)
03D3: 3C inc a
03D4: E6 1F and $1F ; Loops $00 to $1F
03D6: 02 ld (bc),a
;; Screen location
03D7: 21 E0 27 ld hl,$27E0
03DA: 85 add a,l
03DB: 6F ld l,a
03DC: 01 20 00 ld bc,$0020 ; Next char
03DF: 1A ld a,(de) ; Get byte
03E0: 13 inc de
03E1: 77 ld (hl),a ; Write byte
03E2: 09 add hl,bc ; Next char
03E3: 7D ld a,l
03E4: E6 E0 and $E0
03E6: FE 60 cp $60
03E8: C2 DF 03 jp nz,$03DF ; Loop
03EB: C9 ret
;; Test mode
03EC: 21 00 00 ld hl,$0000 ; Start address
03EF: 11 00 00 ld de,$0000 ; Offset 0
03F2: 0E 02 ld c,$02 ; Until $200
03F4: AF xor a
03F5: 86 add a,(hl)
03F6: 23 inc hl
03F7: 47 ld b,a
03F8: 79 ld a,c
03F9: BC cp h
03FA: 78 ld a,b
03FB: C2 F5 03 jp nz,$03F5 ; Loop
03FE: E5 push hl ; Push address
03FF: 21 29 04 ld hl,$0429 ; Checksum table
0402: 19 add hl,de
0403: BE cp (hl) ; Compare checksum
0404: 3E 40 ld a,$40 ; _
0406: CA 0E 04 jp z,$040E
0409: 21 32 04 ld hl,$0432
040C: 19 add hl,de
040D: 7E ld a,(hl)
040E: 21 E9 21 ld hl,$21E9 ; Base screen loc
0411: 19 add hl,de
0412: 77 ld (hl),a ; Store char
0413: E1 pop hl ; Get address back
0414: 13 inc de ; Next rom
0415: 0C inc c ; $2 more pages
0416: 0C inc c
0417: 3E 12 ld a,$12
0419: B9 cp c
041A: C2 F4 03 jp nz,$03F4 ; Loop if not done
041D: 21 E9 21 ld hl,$21E9
0420: 11 08 30 ld de,$3008
0423: 3E 08 ld a,$08
0425: CD 30 0B call $0B30 ; Draw string hl @ de, length a
0428: 76 halt ; Stop!
;; $200 block checksums
0429: 8D 79 00 1F 58 6D EA C5 ; DATA Checksum
0431: 2A ; DATA Patch byte for $400 checksum
;; Error locations
0432: 48 48 47 47 46 46 45 45 ; DATA HHGGFFEE
;; Initial jump
043A: CD A2 08 call $08A2 ; (End of game routine)
043D: DB 02 in a,($02) ; IN2
043F: E6 E0 and $E0 ; Test mode bits
0441: FE E0 cp $E0
0443: CC EC 03 call z,$03EC ; Go to test mode
;; Clear $2002-$200a
0446: 21 02 20 ld hl,$2002
0449: 3E 09 ld a,$09
044B: 06 00 ld b,$00
044D: 70 ld (hl),b
044E: 23 inc hl
044F: 3D dec a
0450: C2 4D 04 jp nz,$044D
0453: 21 29 09 ld hl,$0929
0456: 22 00 20 ld ($2000),hl
0459: FB ei ; Enable interrupts
045A: 21 59 04 ld hl,$0459 ; Return address
045D: E5 push hl
045E: 2A 00 20 ld hl,($2000)
0461: 7E ld a,(hl)
0462: A7 and a
0463: C2 7D 04 jp nz,$047D
;; a=(($2000)) == 0
0466: CD A4 06 call $06A4
0469: CD CE 04 call $04CE
046C: CD BF 04 call $04BF
046F: 3A 02 20 ld a,($2002) ; Game timer
0472: A7 and a
0473: C8 ret z ; Skip rest if game over
0474: CD 4C 07 call $074C
0477: CD B8 08 call $08B8
047A: C3 8C 04 jp $048C
;; a=(($2000)) != 0
047D: 23 inc hl
047E: EB ex de,hl ; ($2000+1) --> de
047F: 21 E8 09 ld hl,$09E8 ; Jump table
0482: 07 rlca ; a = ($2000)<<1
0483: 4F ld c,a ; c = ($2000)<<1
0484: 06 00 ld b,$00
0486: 09 add hl,bc ; hl = $09e8 + ($2000)<<1
0487: 7E ld a,(hl)
0488: 23 inc hl
0489: 66 ld h,(hl)
048A: 6F ld l,a
048B: E9 jp (hl)
048C: 3A 03 20 ld a,($2003)
048F: FE 1D cp $1D
0491: F8 ret m
0492: 01 02 20 ld bc,$2002
0495: 11 E9 21 ld de,$21E9
0498: CD 82 0A call $0A82
049B: EB ex de,hl
049C: CD 7A 0A call $0A7A
049F: 23 inc hl
04A0: 36 2C ld (hl),$2C
04A2: 23 inc hl
04A3: EB ex de,hl
04A4: 01 2B 20 ld bc,$202B ; Player score
04A7: CD 82 0A call $0A82 ; Draw score digits
04AA: EB ex de,hl
04AB: CD 7A 0A call $0A7A
04AE: 23 inc hl
04AF: 36 30 ld (hl),$30
04B1: 23 inc hl
04B2: 36 30 ld (hl),$30
04B4: 21 E9 21 ld hl,$21E9
04B7: 11 2F 3E ld de,$3E2F
04BA: 3E 06 ld a,$06
04BC: C3 30 0B jp $0B30 ; Draw string hl @ de, length a
04BF: 21 2A 20 ld hl,$202A
04C2: 7E ld a,(hl)
04C3: A7 and a
04C4: C8 ret z
04C5: 36 00 ld (hl),$00
04C7: 21 A6 09 ld hl,$09A6
04CA: 22 00 20 ld ($2000),hl
04CD: C9 ret
;; Choose subroutine based on $2020 bits
04CE: 21 20 20 ld hl,$2020
04D1: 7E ld a,(hl)
04D2: A7 and a
04D3: C8 ret z ; Nothing to do
04D4: 36 00 ld (hl),$00 ; Clear all bits
04D6: 1F rra
04D7: DC 01 06 call c,$0601 ; Bit 0 set = Clear explosion lights
04DA: 1F rra
04DB: DC 0E 06 call c,$060E ; Bit 1 set = Clear explosion on screen
04DE: 1F rra
04DF: DC F7 04 call c,$04F7 ; Bit 2 set = Trigger bit 2 sound
04E2: 1F rra
04E3: DC 34 06 call c,$0634 ; Bit 3 set = Launch new ship
04E6: 1F rra
04E7: DC E9 05 call c,$05E9 ; Bit 4 set = Reload torpedos
04EA: 1F rra
04EB: DC 73 05 call c,$0573 ; Bit 5 set = Increment $2000 counter
04EE: 1F rra
04EF: DC 6C 05 call c,$056C ; Bit 6 set = Initialize $2000 counter
04F2: 1F rra
04F3: DC 11 05 call c,$0511 ; Bit 7 set = Game time over
04F6: C9 ret
;; Bit 2 set on $2020
;; Trigger bit 2 sound and set timers
04F7: F5 push af
04F8: 21 26 20 ld hl,$2026
04FB: 7E ld a,(hl)
04FC: A7 and a
04FD: CA 0F 05 jp z,$050F ; Do nothing
0500: 35 dec (hl)
0501: 3E 04 ld a,$04
0503: D3 05 out ($05),a ; Audio outputs
0505: 3E 19 ld a,$19
0507: 32 23 20 ld ($2023),a ; Set timer
050A: 3E 0F ld a,$0F
050C: 32 25 20 ld ($2025),a ; Set timer
050F: F1 pop af
0510: C9 ret
;; Bit 7 set on $2020
0511: 21 2E 20 ld hl,$202E
0514: 7E ld a,(hl)
0515: A7 and a
0516: C2 3D 05 jp nz,$053D ; Jump if already extended time
0519: 36 01 ld (hl),$01 ; Only 1 extend
051B: 3A 07 20 ld a,($2007) ; Last IN1
051E: 0F rrca
051F: E6 70 and $70 ; Base score for extended time (00 = none)
0521: CA 3D 05 jp z,$053D ; Jump if no extended time
0524: C6 09 add a,$09 ; $20 dip = $19(00) score
0526: 21 2B 20 ld hl,$202B ; Player score
0529: BE cp (hl)
052A: D2 3D 05 jp nc,$053D ; Jump if score lower than metric
052D: 3E 20 ld a,$20
052F: 32 02 20 ld ($2002),a ; Set game time
0532: 21 33 0F ld hl,$0F33 ; EXTENDED_TIME
0535: 11 03 3C ld de,$3C03
0538: 3E 0C ld a,$0C
053A: C3 30 0B jp $0B30 ; Draw string hl @ de, length a
053D: 21 C9 20 ld hl,$20C9
0540: 01 1E 00 ld bc,$001E
0543: 09 add hl,bc
0544: 7D ld a,l
0545: FE 5F cp $5F
0547: CA 5C 05 jp z,$055C
054A: 7E ld a,(hl)
054B: A7 and a
054C: F2 43 05 jp p,$0543
054F: AF xor a
0550: 32 21 20 ld ($2021),a
0553: 32 2D 20 ld ($202D),a ; Torpedo status
0556: 3E 01 ld a,$01