/
Robotron (Apple).asm
8499 lines (8028 loc) · 508 KB
/
Robotron (Apple).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
; 6502bench SourceGen v1.6.0
ASCII_ESCAPE .eq $1b {const}
STACK_PTR .eq $3f {const}
ASCII2_RETURN .eq $8d {const}
ASCII2_ESCAPE .eq $9b {const}
ASCII2_SPACE .eq $a0 {const}
NOP .eq $ea {const}
MON_WNDLEFT .eq $20 ;left column of scroll window
MON_WNDWDTH .eq $21 ;width of scroll window
MON_BASL .eq $28 ;base address for text output (lo)
MON_BASH .eq $29 ;base address for text output (hi)
MON_H2 .eq $2c ;right end of horizontal line drawn by HLINE
MON_V2 .eq $2d ;bottom of vertical line drawn by VLINE
MON_RNDL .eq $4e ;low byte of KEYIN "random" value
MON_RNDH .eq $4f ;high byte of KEYIN "random" value
Level .eq $1407 ;might be 0-based
ShootingDir .eq $1416 {addr/1} ;00-0F, centre/right/left/down/down right/down left/up/up right/up left
ControllerType .eq $1417
MovementDir .eq $1506 {addr/1}
UsedPaddle? .eq $1508
Lives .eq $1509
Score0 .eq $150a
Score1 .eq $150b
Score2 .eq $150c
KBD .eq $c000 ;R last key pressed + 128
KBDSTRB .eq $c010 ;RW keyboard strobe
SPKR .eq $c030 ;RW toggle speaker
TXTCLR .eq $c050 ;RW display graphics
MIXCLR .eq $c052 ;RW display full screen
TXTPAGE1 .eq $c054 ;RW display page 1
HIRES .eq $c057 ;RW display hi-res graphics
BUTN0 .eq $c061 ;R switch input 0 / open-apple
BUTN1 .eq $c062 ;R switch input 1 / closed-apple
MON_PREAD .eq $fb1e ;read paddle specifed by X-reg, return in Y-reg
MON_WAIT .eq $fca8 ;delay for (26 + 27*Acc + 5*(Acc*Acc))/2 cycles
.org $2dfd
+000000 2dfd: 4c 00 40 jmp mainEntryPoint
.org $0800
+000003 0800: 00 00 10 20+ L0800 .bulk 00001020ffff304050601020ffff3040
+000013 0810: ff ff ff ff+ .bulk ffffffffffffffff50601020ffff3040
+000023 0820: 7a 7a 7a 7a+ L0820 .bulk 7a7a7a7affff7a7a7a7a7a7affff7a7a
+000033 0830: ff ff ff ff+ .bulk ffffffffffffffff7a7a7a7affff7a7a
+000043 0840: d0 d0 e0 f0+ L0840 .bulk d0d0e0f0ffff00102030e0f0ffff0010
+000053 0850: ff ff ff ff+ .bulk ffffffffff00ffff2030e0f0ffff0010
+000063 0860: 7b 7b 7b 7b+ L0860 .bulk 7b7b7b7bffff7c7c7c7c7b7bffff7c7c
+000073 0870: ff ff ff ff+ .bulk ffffffffffffffff7c7c7b7bffff7c7c
+000083 0880: 70 80 ff ff L0880 .bulk 7080ffff
+000087 0884: 7a 7a ff ff L0884 .bulk 7a7affff
+00008b 0888: 40 50 ff ff L0888 .bulk 4050ffff
+00008f 088c: 7c 7c ff ff L088C .bulk 7c7cffff
+000093 0890: e0 d0 00 f0+ L0890 .bulk e0d000f020102010
+00009b 0898: 7a 7a 7b 7a+ L0898 .bulk 7a7a7b7a7b7b7b7b
+0000a3 08a0: 10 20 30 40+ L08A0 .bulk 1020304090a0b0c0708090a0ffffffff
+0000b3 08b0: 7a 7a 7a 7a+ L08B0 .bulk 7a7a7a7a7a7a7a7a7d7d7d7dffffffff
+0000c3 08c0: 60 50 40 30+ L08C0 .bulk 60504030ffffffff
+0000cb 08c8: 7c 7b 7b 7b+ L08C8 .bulk 7c7b7b7bffffffff
+0000d3 08d0: 60 ff ff ff L08D0 .bulk 60ffffff
+0000d7 08d4: 7b ff ff ff L08D4 .bulk 7bffffff
+0000db 08d8: 70 80 ff ff L08D8 .bulk 7080ffff
+0000df 08dc: 7b 7b ff ff L08DC .bulk 7b7bffff
+0000e3 08e0: 90 a0 b0 c0+ L08E0 .bulk 90a0b0c0ffffffff
+0000eb 08e8: 7b 7b 7b 7b+ L08E8 .bulk 7b7b7b7bffffffff
+0000f3 08f0: 70 80 90 90+ L08F0 .bulk 70809090a0b0c0c0b0c0d0d0ffffffff
+000103 0900: 7c 7c 7c 7c+ L0900 .bulk 7c7c7c7c7c7c7c7c7d7d7d7dffffffff
+000113 0910: 40 30 20 10+ L0910 .bulk 40302010ffffffff
+00011b 0918: 7d 7d 7d 7d+ L0918 .bulk 7d7d7d7dffffffff
+000123 0920: d0 e0 f0 00+ L0920 .bulk d0e0f000ffffffff
+00012b 0928: 7c 7c 7c 7d+ L0928 .bulk 7c7c7c7dffffffff
+000133 0930: 50 60 ff ff L0930 .bulk 5060ffff
+000137 0934: 7d 7d ff ff+ L0934 .bulk 7d7dffffffffffffffffffff
+000143 0940: 00 10 20 30+ L0940 .bulk 001020304090a0ff
+00014b 0948: 7f 7f 7f 7f+ L0948 .bulk 7f7f7f7f7f7f7fff
+000153 0950: 80 70 60 50+ L0950 .bulk 80706050ffffffff
+00015b 0958: 7f 7f 7f 7f+ L0958 .bulk 7f7f7f7fffffffff
+000163 0960: f0 e0 ff ff L0960 .bulk f0e0ffff
+000167 0964: 7f 7f ff ff+ L0964 .bulk 7f7fffffffffffffffffffffffffffff
+000177 0974: ff ff ff ff+ .bulk ffffffffffffffffffffffffffffffff
+000187 0984: ff ff ff ff+ .bulk ffffffffffffffffffffffffffffffff
+000197 0994: ff ff ff ff+ .bulk ffffffffffffffffffffffffffffffff
+0001a7 09a4: ff ff ff ff+ .bulk ffffffffffffffffffffffffffffffff
+0001b7 09b4: ff ff ff ff+ .bulk ffffffffffffffffffffffffffffffff
+0001c7 09c4: ff ff ff ff+ .bulk ffffffffffffffffffffffffffffffff
+0001d7 09d4: ff ff ff ff+ .bulk ffffffffffffffffffffffffffffffff
+0001e7 09e4: ff ff ff ff+ .bulk ffffffffffffffffffffffffffffffff
+0001f7 09f4: ff ff ff ff+ .bulk ffffffffffffffffffffffff
; NW: map keyboard controls to movement direction
+000203 0a00: ff ff ff ff+ kbdMovementDir .bulk ffffffffffffffffffffffffffffffff
+000213 0a10: ff ff ff ff+ .bulk ffffffffffffffffffffffffffffffff
+000223 0a20: 00 ff ff ff+ .bulk 00ffffffffffffffffffffffffffffff
+000233 0a30: ff ff ff ff+ .bulk ffffffffffffffffffffffffffffffff
+000243 0a40: ff 03 ff 05+ .bulk ff03ff05010dffffffffffffffffffff
+000253 0a50: ff 0f ff 00+ .bulk ff0fff00ffffff0c04ff07ffffffffff
+000263 0a60: ff ff ff ff+ .bulk ffffffffffffffffffffffffffffffff
+000273 0a70: ff ff ff ff+ .bulk ffffffffffffffffffffffffffffffff
; NW: map keyboard controls to shooting direction
+000283 0a80: ff ff ff ff+ kbdShootingDir .bulk ffffffffffffffffffffffffffffffff
+000293 0a90: ff ff ff ff+ .bulk ffffffffffffffffffffffffffffffff
+0002a3 0aa0: 00 ff ff ff+ .bulk 00ffffffffffffffffffffff07ff0405
+0002b3 0ab0: ff ff ff ff+ .bulk ffffffffffffffffffffff01ffffffff
+0002c3 0ac0: ff ff ff ff+ .bulk ffffffffffffffffff0fff0300ffff0c
+0002d3 0ad0: 0d ff ff ff+ .bulk 0dffffffffffffffffffffffffffffff
+0002e3 0ae0: ff ff ff ff+ .bulk ffffffffffffffffffffffffffffffff
+0002f3 0af0: ff ff ff ff+ .bulk ffffffffffffffffffffffffffffffff
; NW: map whole keyboard shooting controls to shooting direction
+000303 0b00: 00 00 00 00+ kbd2ShootingDir .bulk 00000000000000000000000000000000
+000313 0b10: 00 00 00 00+ .bulk 00000000000000000000000000000000
+000323 0b20: 04 00 00 00+ .bulk 04000000000000000000000005000505
+000333 0b30: 0d 0f 0f 0f+ .bulk 0d0f0f0f0f0c0c0c0d0d0d0500000000
+000343 0b40: 00 07 07 07+ .bulk 00070707070307070501050505050501
+000353 0b50: 01 03 03 07+ .bulk 01030307030107030701070000000000
+000363 0b60: 00 00 00 00+ .bulk 00000000000000000000000000000000
+000373 0b70: 00 00 00 00+ .bulk 00000000000000000000000000000000
; maybe unused
+000383 0b80: ff ff ff ff+ .bulk ffffffffffffffffffffffffffffffff
+000393 0b90: ff ff ff ff+ .bulk ffffffffffffffffffffffffffffffff
+0003a3 0ba0: ff ff ff ff+ .bulk ffffffffffffffffffffffffffffffff
+0003b3 0bb0: ff ff ff ff+ .bulk ffffffffffffffffffffffffffffffff
+0003c3 0bc0: ff ff ff ff+ .bulk ffffffffffffffffffffffffffffffff
+0003d3 0bd0: ff ff ff ff+ .bulk ffffffffffffffffffffffffffffffff
+0003e3 0be0: ff ff ff ff+ .bulk ffffffffffffffffffffffffffffffff
+0003f3 0bf0: ff ff ff ff+ .bulk ffffffffffffffffffffffffffffffff
; NW: static constants
+000403 0c00: 08 L0C00 .dd1 $08
+000404 0c01: 78 L0C01 .dd1 $78
+000405 0c02: 10 L0C02 .dd1 $10
+000406 0c03: 20 L0C03 .dd1 $20
+000407 0c04: 30 L0C04 .dd1 $30
+000408 0c05: 04 L0C05 .dd1 $04
+000409 0c06: 04 L0C06 .dd1 $04
+00040a 0c07: 08 L0C07 .dd1 $08
+00040b 0c08: 05 L0C08 .dd1 $05
+00040c 0c09: 04 L0C09 .dd1 $04
+00040d 0c0a: 18 L0C0A .dd1 $18
+00040e 0c0b: 08 L0C0B .dd1 $08
+00040f 0c0c: 18 L0C0C .dd1 $18
+000410 0c0d: 06 L0C0D .dd1 $06
+000411 0c0e: 20 L0C0E .dd1 $20
+000412 0c0f: 0d L0C0F .dd1 $0d
+000413 0c10: a8 L0C10 .dd1 $a8
+000414 0c11: 61 L0C11 .dd1 $61
+000415 0c12: 00 L0C12 .dd1 $00
+000416 0c13: 03 L0C13 .dd1 $03
+000417 0c14: 28 L0C14 .dd1 $28
+000418 0c15: 0c L0C15 .dd1 $0c
+000419 0c16: 1c L0C16 .dd1 $1c
+00041a 0c17: 0a L0C17 .dd1 $0a
+00041b 0c18: 01 L0C18 .dd1 $01
+00041c 0c19: 01 L0C19 .dd1 $01
+00041d 0c1a: 01 L0C1A .dd1 $01
+00041e 0c1b: 10 L0C1B .dd1 $10
+00041f 0c1c: 07 L0C1C .dd1 $07
+000420 0c1d: ff L0C1D .dd1 $ff
+000421 0c1e: 08 L0C1E .dd1 $08
+000422 0c1f: 10 .dd1 $10
+000423 0c20: f0 L0C20 .dd1 $f0
+000424 0c21: 60 L0C21 .dd1 $60
+000425 0c22: 08 L0C22 .dd1 $08
+000426 0c23: 20 L0C23 .dd1 $20
+000427 0c24: 04 L0C24 .dd1 $04
+000428 0c25: 04 L0C25 .dd1 $04
+000429 0c26: 2c L0C26 .dd1 $2c
+00042a 0c27: a0 L0C27 .dd1 $a0
+00042b 0c28: 30 L0C28 .dd1 $30
+00042c 0c29: 30 L0C29 .dd1 $30
+00042d 0c2a: 06 L0C2A .dd1 $06
+00042e 0c2b: 18 L0C2B .dd1 $18
+00042f 0c2c: 20 L0C2C .dd1 $20
+000430 0c2d: 04 L0C2D .dd1 $04
+000431 0c2e: 07 L0C2E .dd1 $07
+000432 0c2f: a0 L0C2F .dd1 $a0
+000433 0c30: 18 L0C30 .dd1 $18
+000434 0c31: ff L0C31 .dd1 $ff
+000435 0c32: 02 L0C32 .dd1 $02
+000436 0c33: ff .dd1 $ff
+000437 0c34: 60 L0C34 .dd1 $60
+000438 0c35: 06 L0C35 .dd1 $06
+000439 0c36: 06 L0C36 .dd1 $06
+00043a 0c37: 60 L0C37 .dd1 $60
+00043b 0c38: 02 L0C38 .dd1 $02
+00043c 0c39: 20 L0C39 .dd1 $20
+00043d 0c3a: d0 L0C3A .dd1 $d0
+00043e 0c3b: f0 L0C3B .dd1 $f0
+00043f 0c3c: ff .dd1 $ff
+000440 0c3d: ff L0C3D .dd1 $ff
+000441 0c3e: 00 L0C3E .dd1 $00
+000442 0c3f: 60 L0C3F .dd1 $60
+000443 0c40: 01 .dd1 $01
+000444 0c41: 00 L0C41 .dd1 $00
+000445 0c42: ff .dd1 $ff
+000446 0c43: 08 L0C43 .dd1 $08
+000447 0c44: 04 L0C44 .dd1 $04
+000448 0c45: 0d L0C45 .dd1 $0d
+000449 0c46: 40 L0C46 .dd1 $40
+00044a 0c47: 03 L0C47 .dd1 $03
+00044b 0c48: 10 L0C48 .dd1 $10
+00044c 0c49: 40 L0C49 .dd1 $40
+00044d 0c4a: 10 L0C4A .dd1 $10
+00044e 0c4b: 18 L0C4B .dd1 $18
+00044f 0c4c: 28 L0C4C .dd1 $28
+000450 0c4d: 02 L0C4D .dd1 $02
+000451 0c4e: 02 L0C4E .dd1 $02
+000452 0c4f: 01 L0C4F .dd1 $01
+000453 0c50: 30 L0C50 .dd1 $30
+000454 0c51: 06 L0C51 .dd1 $06
+000455 0c52: 08 L0C52 .dd1 $08
+000456 0c53: 01 L0C53 .dd1 $01
+000457 0c54: 20 L0C54 .dd1 $20
+000458 0c55: 80 L0C55 .dd1 $80
+000459 0c56: e0 L0C56 .dd1 $e0
+00045a 0c57: 03 L0C57 .dd1 $03
+00045b 0c58: 10 L0C58 .dd1 $10
+00045c 0c59: 1c L0C59 .dd1 $1c
+00045d 0c5a: 04 L0C5A .dd1 $04
+00045e 0c5b: 30 L0C5B .dd1 $30
+00045f 0c5c: f8 .dd1 $f8
+000460 0c5d: 08 .dd1 $08
+000461 0c5e: 06 L0C5E .dd1 $06
+000462 0c5f: 02 L0C5F .dd1 $02
+000463 0c60: 03 L0C60 .dd1 $03
+000464 0c61: 0b L0C61 .dd1 $0b
+000465 0c62: 00 .dd1 $00
+000466 0c63: 03 L0C63 .dd1 $03
+000467 0c64: 90 L0C64 .dd1 $90
+000468 0c65: 0a L0C65 .dd1 $0a
+000469 0c66: 60 L0C66 .dd1 $60
+00046a 0c67: 80 L0C67 .dd1 $80
+00046b 0c68: c0 L0C68 .dd1 $c0
+00046c 0c69: 17 L0C69 .dd1 $17
+00046d 0c6a: 05 L0C6A .dd1 $05
+00046e 0c6b: 0c ff ff ff+ L0C6B .bulk 0cffffffffffffffffffffffffffffff
+00047e 0c7b: ff ff ff ff+ .bulk ffffffffff
+000483 0c80: 12 01 08 0a+ L0C80 .bulk 1201080a0614041e022800ff1301080a
+000493 0c90: 06 14 04 1e+ .bulk 0614041e022800ff1401401030202030
+0004a3 0ca0: 18 ff ff ff+ .bulk 18ffffffffffffffffffffffffffffff
+0004b3 0cb0: ff ff ff ff+ .bulk ffffffffffffffffffffffffffffffff
+0004c3 0cc0: ff ff ff ff+ .bulk ffffffffffffffffffffffffffffffff
+0004d3 0cd0: ff ff ff ff+ .bulk ffffffffffffffffffffffffffffffff
+0004e3 0ce0: ff ff ff ff+ .bulk ffffffffffffffffffffffffffffffff
+0004f3 0cf0: ff ff ff ff+ .bulk ffffffffffffffffffffffffffffffff
+000503 0d00: 00 02 12 fe L0D00 .bulk 000212fe
+000507 0d04: 03 fd 07 f9+ L0D04 .bulk 03fd07f90cf410f0
+00050f 0d0c: ff ff be be+ L0D0C .bulk ffffbebe9c9c8c8c
+000517 0d14: 04 fc 00 00 L0D14 .bulk 04fc0000
+00051b 0d18: 00 00 04 fc L0D18 .bulk 000004fc
+00051f 0d1c: 02 fe L0D1C .bulk 02fe
; NW: direction of fire table
+000521 0d1e: 0c 0d 01 05+ fireDirection .bulk 0c0d01050407030f
+000529 0d26: 7f 3f 3e 1e+ L0D26 .bulk 7f3f3e1e1c0c7f3f3e1e1c0c
+000535 0d32: 02 04 06 08+ L0D32 .bulk 020406080a0cfefcfaf8f6f4
+000541 0d3e: 06 fa 00 00 L0D3E .bulk 06fa0000
+000545 0d42: 00 00 06 fa L0D42 .bulk 000006fa
+000549 0d46: ff ff ff ff+ L0D46 .bulk ffffffffffffffffd8d8d800ffffffd8
+000559 0d56: d8 b4 b4 80+ .bulk d8b4b48080800000
; NW: direction of fire rotation table
+000561 0d5e: ea 02 ea 06+ fireRotation .bulk ea02ea060403ea05eaeaeaea0001ea07
+000571 0d6e: ff ff ff ff+ .bulk ffffffffffffffffffffffffffffffff
+000581 0d7e: ff ff ff ff+ .bulk ffffffffffffffffffffffffffffffff
+000591 0d8e: ff ff ff ff+ .bulk ffffffffffffffffffffffffffffffff
+0005a1 0d9e: ff ff ff ff+ .bulk ffffffffffffffffffffffffffffffff
+0005b1 0dae: ff ff ff ff+ .bulk ffffffffffffffffffffffffffffffff
+0005c1 0dbe: ff ff ff ff+ .bulk ffffffffffffffffffffffffffffffff
+0005d1 0dce: ff ff ff ff+ .bulk ffffffffffffffffffffffffffffffff
+0005e1 0dde: ff ff ff ff+ .bulk ffffffffffffffffffffffffffffffff
+0005f1 0dee: ff ff ff ff+ .bulk ffffffffffffffffffffffffffffffff
+000601 0dfe: ff ff .bulk ffff
+000603 0e00: 0b 12 15 19+ L0E00 .bulk 0b1215190c1500151e0f190019191119
+000613 0e10: 00 1a 24 11+ .bulk 001a24111900191d1219001928131d00
+000623 0e20: 20 1d 14 1d+ .bulk 201d141d00202b140101010101010101
+000633 0e30: 28 00 01 00+ .bulk 28000100000000000000000000000000
+000643 0e40: 00 00 10 01+ .bulk 00001001000000800009000000002800
+000653 0e50: 00 00 01 01+ .bulk 00000101000100002800000000000014
+000663 0e60: 00 10 80 01+ .bulk 00108001000000000000000000000000
+000673 0e70: 00 00 00 00+ .bulk 00000000000000000000000000000000
+000683 0e80: 00 04 05 05+ L0E80 .bulk 00040505000608060200070907100007
+000693 0e90: 0a 08 02 00+ .bulk 0a080200070a070703090a020904070b
+0006a3 0ea0: 07 10 04 09+ .bulk 07100409030909040101011001010100
+0006b3 0eb0: 00 00 10 00+ .bulk 00001000000000000000000000000100
+0006c3 0ec0: 00 00 00 00+ .bulk 00000000000000001000100000000000
+0006d3 0ed0: 00 00 00 10+ .bulk 00000010010000000000000000100000
+0006e3 0ee0: 10 02 10 00+ .bulk 10021000000000000000000000000000
+0006f3 0ef0: 00 00 00 00+ .bulk 00000000000000000000000000000000
+000703 0f00: 01 03 03 03+ L0F00 .bulk 0103030300030504020e050505070006
+000713 0f10: 07 03 06 05+ .bulk 070306050607060600060306070f0705
+000723 0f20: 07 06 00 03+ .bulk 07060003050707060101010101010105
+000733 0f30: 05 00 00 10+ .bulk 05000010000000000001001000000101
+000743 0f40: 00 05 00 00+ .bulk 00050000000010000000000001010000
+000753 0f50: 00 00 00 05+ .bulk 00000005100000090001000001000000
+000763 0f60: 00 00 05 01+ .bulk 00000501000000000000000000000000
+000773 0f70: 00 00 00 00+ .bulk 00000000000000000000000000000000
+000783 0f80: 01 02 03 03+ L0F80 .bulk 010203030c0505040200040504060005
+000793 0f90: 06 02 05 06+ .bulk 06020506060706060f06030607000605
+0007a3 0fa0: 06 08 01 03+ .bulk 0608010305070706010101010e010105
+0007b3 0fb0: 05 00 00 00+ .bulk 05000000100000000000010001000100
+0007c3 0fc0: 10 05 05 00+ .bulk 10050500101000000000000001010000
+0007d3 0fd0: 00 00 00 05+ .bulk 00000005000000000000010001060000
+0007e3 0fe0: 00 00 05 01+ .bulk 00000501000000000000000000000000
+0007f3 0ff0: 00 00 00 00+ .bulk 00000000000000000000000000000000
+000803 1000: 00 01 02 02+ L1000 .bulk 00010202010202020000020202021002
+000813 1010: 02 01 02 05+ .bulk 02010205020202020102010202000202
+000823 1020: 02 02 0f 01+ .bulk 02020f01020202040101010101010106
+000833 1030: 06 00 00 00+ .bulk 06000000001000000000000000100500
+000843 1040: 00 06 00 00+ .bulk 000600000000000000001010000e000e
+000853 1050: 00 00 00 06+ .bulk 00000006000000000000000101000000
+000863 1060: 00 00 06 01+ .bulk 00000601000000000000000000000000
+000873 1070: 00 00 00 00+ .bulk 00000000000000000000000000000000
+000883 1080: 00 03 06 09+ L1080 .bulk 00030609030900090906090009060609
+000893 1090: 00 09 0a 07+ .bulk 00090a0709000c0c0709070c0b0c0c00
+0008a3 10a0: 0c 0c 0c 0c+ .bulk 0c0c0c0c0a0f0b0f0101010101010100
+0008b3 10b0: 00 00 00 00+ .bulk 00000000000050000005050000000500
+0008c3 10c0: 00 00 00 00+ .bulk 000000000100000000000000000a0000
+0008d3 10d0: 00 01 00 00+ .bulk 00010000000000000000000000000000
+0008e3 10e0: 00 00 50 00+ .bulk 00005000000000000000000000000000
+0008f3 10f0: 00 00 00 00+ .bulk 00000000000000000000000000000000
+000903 1100: 00 00 00 00+ L1100 .bulk 000000000a000000000b000000000c00
+000913 1110: 00 00 00 0c+ .bulk 0000000c000000000d000000000e0000
+000923 1120: 00 00 0e 00+ .bulk 00000e000000000e0101010110010100
+000933 1130: 00 10 00 01+ .bulk 00100001010100100000000110000000
+000943 1140: 00 00 00 00+ .bulk 0000000000010000000010000000000a
+000953 1150: 00 00 00 00+ .bulk 00000000010000010001010100001000
+000963 1160: 00 00 10 00+ .bulk 00001000000000000000000000000000
+000973 1170: 00 00 00 00+ .bulk 00000000000000000000000000000000
+000983 1180: 00 00 00 00+ L1180 .bulk 00000000000006000000000700000000
+000993 1190: 08 00 00 00+ .bulk 08000000000900000000050101000009
+0009a3 11a0: 01 00 00 01+ .bulk 01000001070202010106010101010700
+0009b3 11b0: 00 00 00 00+ .bulk 00000000000000001000000000010110
+0009c3 11c0: 01 00 04 00+ .bulk 01000400000001000800000001010004
+0009d3 11d0: 01 00 00 00+ .bulk 01000000010003010000000010011000
+0009e3 11e0: 10 01 10 00+ .bulk 10011000000000000000000000000000
+0009f3 11f0: 00 00 00 00+ .bulk 00000000000000000000000000000000
; NW: hires lookup table (low bytes)
+000a03 1200: 00 00 00 00+ hiresLookupL .bulk 00000000000000008080808080808080
+000a13 1210: 00 00 00 00+ .bulk 00000000000000008080808080808080
+000a23 1220: 00 00 00 00+ .bulk 00000000000000008080808080808080
+000a33 1230: 00 00 00 00+ .bulk 00000000000000008080808080808080
+000a43 1240: 28 28 28 28+ .bulk 2828282828282828a8a8a8a8a8a8a8a8
+000a53 1250: 28 28 28 28+ .bulk 2828282828282828a8a8a8a8a8a8a8a8
+000a63 1260: 28 28 28 28+ .bulk 2828282828282828a8a8a8a8a8a8a8a8
+000a73 1270: 28 28 28 28+ .bulk 2828282828282828a8a8a8a8a8a8a8a8
+000a83 1280: 50 50 50 50+ .bulk 5050505050505050d0d0d0d0d0d0d0d0
+000a93 1290: 50 50 50 50+ .bulk 5050505050505050d0d0d0d0d0d0d0d0
+000aa3 12a0: 50 50 50 50+ .bulk 5050505050505050d0d0d0d0d0d0d0d0
+000ab3 12b0: 50 50 50 50+ .bulk 5050505050505050d0d0d0d0d0d0d0d0
+000ac3 12c0: d0 d0 d0 d0+ .bulk d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0
+000ad3 12d0: d0 d0 d0 d0+ .bulk d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0
+000ae3 12e0: d0 d0 d0 d0+ .bulk d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0
+000af3 12f0: d0 d0 d0 d0+ .bulk d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0
; NW: hires lookup table (high bytes)
+000b03 1300: 20 24 28 2c+ hiresLookupH .bulk 2024282c3034383c2024282c3034383c
+000b13 1310: 21 25 29 2d+ .bulk 2125292d3135393d2125292d3135393d
+000b23 1320: 22 26 2a 2e+ .bulk 22262a2e32363a3e22262a2e32363a3e
+000b33 1330: 23 27 2b 2f+ .bulk 23272b2f33373b3f23272b2f33373b3f
+000b43 1340: 20 24 28 2c+ .bulk 2024282c3034383c2024282c3034383c
+000b53 1350: 21 25 29 2d+ .bulk 2125292d3135393d2125292d3135393d
+000b63 1360: 22 26 2a 2e+ .bulk 22262a2e32363a3e22262a2e32363a3e
+000b73 1370: 23 27 2b 2f+ .bulk 23272b2f33373b3f23272b2f33373b3f
+000b83 1380: 20 24 28 2c+ .bulk 2024282c3034383c2024282c3034383c
+000b93 1390: 21 25 29 2d+ .bulk 2125292d3135393d2125292d3135393d
+000ba3 13a0: 22 26 2a 2e+ .bulk 22262a2e32363a3e22262a2e32363a3e
+000bb3 13b0: 23 27 2b 2f+ .bulk 23272b2f33373b3f23272b2f33373b3f
+000bc3 13c0: 1f 1f 1f 1f+ .bulk 1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f
+000bd3 13d0: 1f 1f 1f 1f+ .bulk 1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f
+000be3 13e0: 1f 1f 1f 1f+ .bulk 1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f
+000bf3 13f0: 1f 1f 1f 1f+ .bulk 1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f
.org $0100
; stack page begins here
+000c03 0100: 00 00 00 00+ .fill 64,$00
********************************************************************************
* *
* story exposition + tutorial *
* *
********************************************************************************
+000c43 0140: 4c 58 01 storyPart1_jmp jmp storyPart1
+000c46 0143: 4c 4f 03 storyPart3_jmp jmp storyPart3
+000c49 0146: 4c 8e 02 storyPart2_jmp jmp storyPart2
+000c4c 0149: 4c b4 03 storyPart4_jmp jmp storyPart4
+000c4f 014c: 4c fe 03 storyPart5_jmp jmp storyPart5
+000c52 014f: 4c 74 04 storyPart6_jmp jmp storyPart6
+000c55 0152: 4c e9 04 S0152 jmp L04E9
+000c58 0155: 4c 4a 05 doShowWilliams jmp showWilliams
+000c5b 0158: 20 d3 04 storyPart1 jsr printStoryPart
+000c5e 015b: 0d .dd1 $0d
+000c5f 015c: 03 .dd1 3
+000c60 015d: 18 .dd1 24
+000c61 015e: 49 4e 53 50+ .str “INSPIRED BY HIS NEVER-ENDING QUEST”
+000c83 0180: 0d .dd1 $0d
+000c84 0181: 03 .dd1 3
+000c85 0182: 28 .dd1 40
+000c86 0183: 46 4f 52 20+ .str “FOR PROGRESS, IN 2084 MAN PERFECTS”
+000ca8 01a5: 0d .dd1 $0d
+000ca9 01a6: 03 .dd1 3
+000caa 01a7: 38 .dd1 56
+000cab 01a8: 54 48 45 20+ .str “THE ROBOTRONS:”
+000cb9 01b6: 02 .dd1 $02
+000cba 01b7: 08 .dd1 $08
+000cbb 01b8: 0d .dd1 $0d
+000cbc 01b9: 03 .dd1 3
+000cbd 01ba: 50 .dd1 80
+000cbe 01bb: 41 20 52 4f+ .str “A ROBOT SPECIES SO ADVANCED THAT MAN”
+000ce2 01df: 0d .dd1 $0d
+000ce3 01e0: 03 .dd1 3
+000ce4 01e1: 60 .dd1 96
+000ce5 01e2: 49 53 20 49+ .str “IS INFERIOR TO HIS OWN CREATION.”
+000d05 0202: 02 .dd1 $02
+000d06 0203: 08 .dd1 $08
+000d07 0204: 0d .dd1 $0d
+000d08 0205: 03 .dd1 3
+000d09 0206: 78 .dd1 120
+000d0a 0207: 47 55 49 44+ .str “GUIDED BY THEIR INFALLIBLE LOGIC,”
+000d2b 0228: 0d .dd1 $0d
+000d2c 0229: 03 .dd1 3
+000d2d 022a: 88 .dd1 136
+000d2e 022b: 54 48 45 20+ .str “THE ROBOTRONS CONCLUDE:”
+000d45 0242: 02 .dd1 $02
+000d46 0243: 08 .dd1 $08
+000d47 0244: 0d .dd1 $0d
+000d48 0245: 03 .dd1 3
+000d49 0246: a0 .dd1 160
+000d4a 0247: 54 48 45 20+ .str “THE HUMAN RACE IS INEFFICIENT, AND”
+000d6c 0269: 0d .dd1 $0d
+000d6d 026a: 03 .dd1 3
+000d6e 026b: b0 .dd1 176
+000d6f 026c: 54 48 45 52+ .str “THEREFORE MUST BE DESTROYED.”
+000d8b 0288: 02 .dd1 $02
+000d8c 0289: 60 .dd1 $60
+000d8d 028a: 02 .dd1 $02
+000d8e 028b: 01 .dd1 $01
+000d8f 028c: 00 .dd1 $00
+000d90 028d: 60 rts
+000d91 028e: 20 d3 04 storyPart2 jsr printStoryPart
+000d94 0291: 0d .dd1 $0d
+000d95 0292: 03 .dd1 3
+000d96 0293: 18 .dd1 24
+000d97 0294: 59 4f 55 20+ .str “YOU ARE THE LAST HOPE OF MANKIND.”
+000db8 02b5: 02 .dd1 $02
+000db9 02b6: 08 .dd1 $08 ;ascii bell?
+000dba 02b7: 0d .dd1 $0d
+000dbb 02b8: 03 .dd1 3
+000dbc 02b9: 30 .dd1 48
+000dbd 02ba: 44 55 45 20+ .str “DUE TO A GENETIC ENGINEERING ERROR,”
+000de0 02dd: 0d .dd1 $0d
+000de1 02de: 03 .dd1 3
+000de2 02df: 40 .dd1 64
+000de3 02e0: 59 4f 55 20+ .str “YOU POSSESS SUPERHUMAN POWERS.”
+000e01 02fe: 02 .dd1 $02
+000e02 02ff: 08 .dd1 $08
+000e03 0300: 0d .dd1 $0d
+000e04 0301: 03 .dd1 3
+000e05 0302: 58 .dd1 88
+000e06 0303: 59 4f 55 52+ .str “YOUR MISSION IS TO STOP THE”
+000e21 031e: 0d .dd1 $0d
+000e22 031f: 03 .dd1 3
+000e23 0320: 68 .dd1 104
+000e24 0321: 52 4f 42 4f+ .str “ROBOTRONS, AND SAVE THE LAST”
+000e40 033d: 0d .dd1 $0d
+000e41 033e: 03 .dd1 3
+000e42 033f: 78 .dd1 120
+000e43 0340: 48 55 4d 41+ .str “HUMAN FAMILY.”
+000e50 034d: 00 .dd1 $00
+000e51 034e: 60 rts
+000e52 034f: 20 d3 04 storyPart3 jsr printStoryPart
+000e55 0352: 0d .dd1 $0d
+000e56 0353: 03 .dd1 3
+000e57 0354: 28 .dd1 40
+000e58 0355: 54 48 45 20+ .str “THE FORCE OF GROUND ROVING UNIT”
+000e77 0374: 0d .dd1 $0d
+000e78 0375: 03 .dd1 3
+000e79 0376: 38 .dd1 56
+000e7a 0377: 4e 45 54 57+ .str “NETWORK TERMINATOR (GRUNT)”
+000e94 0391: 0d .dd1 $0d
+000e95 0392: 03 .dd1 3
+000e96 0393: 48 .dd1 72
+000e97 0394: 52 4f 42 4f+ .str “ROBOTRONS SEEK TO DESTROY YOU.”
+000eb5 03b2: 00 .dd1 $00
+000eb6 03b3: 60 rts
+000eb7 03b4: 20 d3 04 storyPart4 jsr printStoryPart
+000eba 03b7: 0d .dd1 $0d
+000ebb 03b8: 03 .dd1 3
+000ebc 03b9: 38 .dd1 56
+000ebd 03ba: 54 48 45 20+ .str “THE HULK ROBOTRONS SEEK OUT AND”
+000edc 03d9: 0d .dd1 $0d
+000edd 03da: 03 .dd1 3
+000ede 03db: 48 .dd1 72
+000edf 03dc: 45 4c 49 4d+ .str “ELIMINATE THE LAST HUMAN FAMILY.”
+000eff 03fc: 00 .dd1 $00
+000f00 03fd: 60 rts
+000f01 03fe: 20 d3 04 storyPart5 jsr printStoryPart
+000f04 0401: 0d .dd1 $0d
+000f05 0402: 03 .dd1 3
+000f06 0403: 28 .dd1 40
+000f07 0404: 42 45 57 41+ .str “BEWARE OF THE INGENIOUS”
+000f1e 041b: 0d .dd1 $0d
+000f1f 041c: 03 .dd1 3
+000f20 041d: 38 .dd1 56
+000f21 041e: 42 52 41 49+ .str “BRAIN ROBOTRONS, THAT POSSESS”
+000f3e 043b: 0d .dd1 $0d
+000f3f 043c: 03 .dd1 3
+000f40 043d: 48 .dd1 72
+000f41 043e: 54 48 45 20+ .str “THE POWER TO REPROGRAM HUMANS”
+000f5e 045b: 0d .dd1 $0d
+000f5f 045c: 03 .dd1 3
+000f60 045d: 58 .dd1 88
+000f61 045e: 49 4e 54 4f+ .str “INTO SINISTER PROGS.”
+000f75 0472: 00 .dd1 $00
+000f76 0473: 60 rts
+000f77 0474: 20 d3 04 storyPart6 jsr printStoryPart
+000f7a 0477: 0d .dd1 $0d
+000f7b 0478: 03 .dd1 3
+000f7c 0479: 38 .dd1 56
+000f7d 047a: 54 48 45 20+ .str “THE SPHEROIDS AND QUARKS”
+000f95 0492: 0d .dd1 $0d
+000f96 0493: 03 .dd1 3
+000f97 0494: 48 .dd1 72
+000f98 0495: 41 52 45 20+ .str “ARE PROGRAMMED TO MANUFACTURE”
+000fb5 04b2: 0d .dd1 $0d
+000fb6 04b3: 03 .dd1 3
+000fb7 04b4: 58 .dd1 88
+000fb8 04b5: 45 4e 46 4f+ .str “ENFORCER AND TANK ROBOTRONS.”
+000fd4 04d1: 00 .dd1 $00
+000fd5 04d2: 60 rts
; NW: print text following JSR and animate attract mode intro screens
+000fd6 04d3: 68 printStoryPart pla
+000fd7 04d4: 85 28 sta MON_BASL
+000fd9 04d6: 68 pla
+000fda 04d7: 85 29 sta MON_BASH
+000fdc 04d9: a9 00 lda #$00
+000fde 04db: 85 2a sta $2a
+000fe0 04dd: a9 ff lda #$ff
+000fe2 04df: 85 2b sta $2b
+000fe4 04e1: 85 2c sta MON_H2
+000fe6 04e3: a2 01 ldx #$01
+000fe8 04e5: 20 40 05 jsr @check7
+000feb 04e8: 60 rts
+000fec 04e9: a0 00 L04E9 ldy #$00
+000fee 04eb: b1 28 lda (MON_BASL),y
+000ff0 04ed: d0 01 bne @check1
+000ff2 04ef: 60 rts
+000ff3 04f0: a6 2a @check1 ldx $2a
+000ff5 04f2: f0 03 beq @check2
+000ff7 04f4: c6 2a dec $2a
+000ff9 04f6: 60 rts
+000ffa 04f7: c9 01 @check2 cmp #$01
+000ffc 04f9: d0 0a bne @check3
+000ffe 04fb: c8 iny
+000fff 04fc: b1 28 lda (MON_BASL),y
+001001 04fe: 85 2b sta $2b
+001003 0500: a2 02 ldx #$02
+001005 0502: 4c 40 05 jmp @check7
+001008 0505: c9 02 @check3 cmp #$02
+00100a 0507: d0 0a bne @check4
+00100c 0509: c8 iny
+00100d 050a: b1 28 lda (MON_BASL),y
+00100f 050c: 85 2a sta $2a
+001011 050e: a2 02 ldx #$02
+001013 0510: 4c 40 05 jmp @check7
+001016 0513: c9 0d @check4 cmp #$0d
+001018 0515: d0 0f bne @check5
+00101a 0517: c8 iny
+00101b 0518: b1 28 lda (MON_BASL),y
+00101d 051a: 85 2d sta MON_V2
+00101f 051c: c8 iny
+001020 051d: b1 28 lda (MON_BASL),y
+001022 051f: 85 2e sta $2e
+001024 0521: a2 03 ldx #$03
+001026 0523: 4c 40 05 jmp @check7
+001029 0526: a6 2d @check5 ldx MON_V2
+00102b 0528: a4 2e ldy $2e
+00102d 052a: 48 pha
+00102e 052b: 20 08 51 jsr printChar
+001031 052e: 68 pla
+001032 052f: c9 20 cmp #$20
+001034 0531: f0 09 beq @check6
+001036 0533: a5 2f lda $2f
+001038 0535: c9 60 cmp #$60
+00103a 0537: f0 03 beq @check6
+00103c 0539: ad 30 c0 lda SPKR ;SPKR in story is simple clicking
+00103f 053c: e6 2d @check6 inc MON_V2
+001041 053e: a2 01 ldx #$01
+001043 0540: e6 28 @check7 inc MON_BASL
+001045 0542: d0 02 bne @check8
+001047 0544: e6 29 inc MON_BASH
+001049 0546: ca @check8 dex
+00104a 0547: d0 f7 bne @check7
+00104c 0549: 60 rts
+00104d 054a: 20 b8 51 showWilliams jsr showText ;NW: copyright notice
+001050 054d: 0d .dd1 $0d
+001051 054e: 03 .dd1 3
+001052 054f: a0 .dd1 160
+001053 0550: 24 20 31 39+ .str “$ 1982 WILLIAMS ELECTRONICS, INC.”
+001074 0571: 0d .dd1 $0d
+001075 0572: 0a .dd1 10
+001076 0573: ab .dd1 171
+001077 0574: 24 20 31 39+ .str “$ 1983 ATARI, INC.”
+001089 0586: 00 .dd1 $00
+00108a 0587: 60 rts
+00108b 0588: 00 00 00 00+ .bulk 00000000000000000000000000000000
+00109b 0598: 00 00 00 00+ .bulk 00000000000000000000000000000000
+0010ab 05a8: 00 00 00 00+ .bulk 00000000000000000000000000000000
+0010bb 05b8: 00 00 00 00+ .bulk 0000000000000000808080cc81808080
+0010cb 05c8: 80 80 80 ce+ .bulk 808080ce83808080808080cb86808080
+0010db 05d8: 80 80 c0 c9+ .bulk 8080c0c98c8080808080e0c898808080
+0010eb 05e8: 80 80 b0 c8+ .bulk 8080b0c8b0808080808098c8e0808080
+0010fb 05f8: 80 80 8c c8+ .bulk 80808cc8c4818080808086c98c838080
+00110b 0608: 80 80 c3 c9+ .bulk 8080c3c99c8680808080e1c9b4848080
+00111b 0618: fe 9f b1 c9+ .bulk fe9fb1c9e484c087829099c9c484c084
+00112b 0628: 82 90 89 c9+ .bulk 829089c9c484c084e29f89c9c484c084
+00113b 0638: c6 81 89 c9+ .bulk c68189c9c484c0848c8389c9c484c084
+00114b 0648: 98 86 89 c9+ .bulk 988689c9c4e4ff84b08c89c9fca48084
+00115b 0658: e0 98 89 c9+ .bulk e09889c980a48084c09189c980a4fe84
+00116b 0668: 80 93 89 c9+ .bulk 809389c9fca4c2849e9289c9c4a4c284
+00117b 0678: a2 91 89 c9+ .bulk a29189c9c4a4c284e29189c9c4a4c284
+00118b 0688: 86 98 89 c9+ .bulk 869889c9c4a4c2848c8c89c9c4a4c284
+00119b 0698: 98 86 89 c9+ .bulk 988689c9c4a4c284b08399c9e4a4c284
+0011ab 06a8: e0 81 b1 c9+ .bulk e081b1c9b4e4c3878080e3c99c868080
+0011bb 06b8: 80 80 c6 c9+ .bulk 8080c6c98c83808080808cc9c4818080
+0011cb 06c8: 80 80 98 c8+ .bulk 808098c8e08080808080b0c8b0808080
+0011db 06d8: 80 80 e0 c8+ .bulk 8080e0c8988080808080c0c98c808080
+0011eb 06e8: 80 80 80 cb+ .bulk 808080cb86808080808080ce83808080
+0011fb 06f8: 80 80 80 cc+ .bulk 808080cc81808080
.org $4000
+001203 4000: a2 3f mainEntryPoint ldx #STACK_PTR ;force stack pointer
+001205 4002: 9a txs
+001206 4003: a9 2e lda #$2e
+001208 4005: a2 0c ldx #$0c
+00120a 4007: a0 08 ldy #$08
+00120c 4009: 20 9d 44 jsr copyPagesAtoY ;copy #$0c pages from $2e00 to $0800
+00120f 400c: a9 3a lda #$3a
+001211 400e: a2 06 ldx #$06
+001213 4010: a0 01 ldy #$01
+001215 4012: 20 9d 44 jsr copyPagesAtoY ;copy 6 pages from $3a00 to $0100 (overwrites stack!)
+001218 4015: a2 3f ldx #STACK_PTR ;needs to re-force stack pointer (why?)
+00121a 4017: 9a txs
+00121b 4018: 20 2f 51 jsr init01_GenerateShapeTables
; overwrite entry, because we don't want to relocate multiple times
+00121e 401b: a9 ea lda #NOP
+001220 401d: a2 14 ldx #$14
+001222 401f: 9d 00 40 @loop sta mainEntryPoint,x
+001225 4022: ca dex
+001226 4023: 10 fa bpl @loop
; initialize something
; probably hires pointers
; $1200 in $fc, $1300 in $fe
PixelLine .var $06 {addr/2}
Sprite .var $08 {addr/2}
PixelLineBaseL .var $fc {addr/2}
PixelLineBaseH .var $fe {addr/2}
+001228 4025: a9 12 lda #$12
+00122a 4027: 85 fd sta PixelLineBaseL+1
+00122c 4029: a9 13 lda #$13
+00122e 402b: 85 ff sta PixelLineBaseH+1
; initialize hires
+001230 402d: ad 50 c0 lda TXTCLR
+001233 4030: ad 52 c0 lda MIXCLR
+001236 4033: ad 54 c0 lda TXTPAGE1
+001239 4036: ad 57 c0 lda HIRES
; initialize other stuff
+00123c 4039: a9 00 lda #$00
+00123e 403b: 8d 07 14 sta Level
+001241 403e: 8d 0c 15 sta Score2
+001244 4041: 8d 32 14 sta $1432
+001247 4044: 8d 33 14 sta $1433
+00124a 4047: 8d 34 14 sta $1434
+00124d 404a: ad 10 0c lda L0C10 ;$0c10
+001250 404d: 8d 0a 15 sta Score0
+001253 4050: ad 11 0c lda L0C11 ;$0c11
+001256 4053: 8d 0b 15 sta Score1
+001259 4056: a9 01 lda #$01 ;default controller is keyboard
+00125b 4058: 8d 17 14 sta ControllerType
+00125e 405b: a9 06 lda #$06 ;NW: will be overwritten later
+001260 405d: 8d 09 15 sta Lives
********************************************************************************
* *
* startScreen *
* * show "Atari presents:" *
* * show right stats *
* * show Robotron noise *
* (and probably (c) as well) *
* *
* We jump here if no valid ControllerType selected *
* *
* NW: attract mode/game mode outer loop *
* *
********************************************************************************
+001263 4060: a2 3f startScreen ldx #STACK_PTR
+001265 4062: 9a txs
+001266 4063: 20 04 45 jsr startAttractMode ;NW: attract mode
+001269 4066: 20 67 4b jsr chooseControls ;NW: print select controls screen
+00126c 4069: ad 6a 0c lda L0C6A ;NW: (5), start w/ 5 lives
+00126f 406c: 8d 09 15 sta Lives
+001272 406f: a9 00 lda #$00
+001274 4071: 8d 07 14 sta Level
+001277 4074: 8d 0a 15 sta Score0
+00127a 4077: 8d 0b 15 sta Score1
+00127d 407a: 8d 0c 15 sta Score2
+001280 407d: ae 10 0c ldx L0C10
+001283 4080: ca dex
+001284 4081: 8e 0d 15 stx $150d
+001287 4084: ae 11 0c ldx L0C11
+00128a 4087: 8e 0e 15 stx $150e
; main outer game loop
+00128d 408a: 20 2a 44 levelEntryPoint1 jsr B442A
+001290 408d: 20 c0 43 LevelEntryPoint2 jsr S43C0
; main inner game loop
+001293 4090: a2 3f LevelEntryPoint3 ldx #STACK_PTR ;entry point after last level completed
+001295 4092: 9a txs ;ASSUMPTION: resetting STACK_PTR cancels all dangling JSRs
+001296 4093: 20 6b 42 jsr checkLevelCompleted ;indicates still in level with CLC
+001299 4096: 90 14 bcc @stillInLevel
+00129b 4098: 20 4a 4d jsr L4D4A ;no, done with level
+00129e 409b: ee 07 14 inc Level ;determine next level
+0012a1 409e: ad 07 14 lda Level
+0012a4 40a1: c9 64 cmp #$64 ;NW: Level 100
+0012a6 40a3: 90 e5 bcc levelEntryPoint1 ;level < #$64?
+0012a8 40a5: a9 00 lda #$00 ;no, start over with level 0
+0012aa 40a7: 8d 07 14 sta Level
+0012ad 40aa: f0 de beq levelEntryPoint1 ;always branch
NOTE: ideas: "box jsr stretch"
* here: the consecutive JSRs until (and not including) the bcc
* assumption (from the disassembler tracing): the JSRs are executed
consecutively
=> box should check this, probably by
** tracking the SP ("don't rts to outside the box")
** checking for reentry inside the box ("don't jump into the box")
* memory layout, as text, or in Excel
* mark code areas which are executed together (using label crossings)
+0012af 40ac: 20 0e 43 @stillInLevel jsr S430E
+0012b2 40af: 20 10 41 jsr checkKbdAndBtn
+0012b5 40b2: 20 5b 42 jsr speaker_1411?
+0012b8 40b5: 20 10 41 jsr checkKbdAndBtn
+0012bb 40b8: 20 71 41 jsr checkJoystAndPdl
+0012be 40bb: 20 09 52 jsr L5209
+0012c1 40be: 20 1b 5a jsr L5A1B
+0012c4 40c1: 20 06 52 jsr L5206
+0012c7 40c4: 20 03 52 jsr L5203
+0012ca 40c7: 90 0e bcc @levelCompleted
+0012cc 40c9: 20 f1 4e jsr xorScreen7x ;we died, but maybe more lives left
+0012cf 40cc: ce 09 15 dec Lives ;one live less
+0012d2 40cf: d0 bc bne LevelEntryPoint2 ;more lives left?
+0012d4 40d1: 20 15 62 jsr PreRestart ;no, NW: go back to attract mode
+0012d7 40d4: 4c 60 40 jmp startScreen
+0012da 40d7: 20 1e 5a @levelCompleted jsr L5A1E
+0012dd 40da: 20 10 41 jsr checkKbdAndBtn
+0012e0 40dd: 20 09 5a jsr L5A09
+0012e3 40e0: 20 0c 5a jsr L5A0C
+0012e6 40e3: 20 0f 5a jsr L5A0F
+0012e9 40e6: 20 10 41 jsr checkKbdAndBtn
+0012ec 40e9: 20 03 62 jsr L6203
+0012ef 40ec: 20 06 62 jsr L6206
+0012f2 40ef: 20 09 62 jsr L6209
+0012f5 40f2: 20 10 41 jsr checkKbdAndBtn
+0012f8 40f5: 20 03 70 jsr L7003
+0012fb 40f8: 20 06 70 jsr L7006
+0012fe 40fb: 20 09 70 jsr L7009
+001301 40fe: 20 09 70 jsr L7009
+001304 4101: 20 10 41 jsr checkKbdAndBtn
+001307 4104: 20 03 69 jsr L6903
+00130a 4107: 20 06 69 jsr L6906
+00130d 410a: 20 09 69 jsr L6909
+001310 410d: 4c 90 40 jmp LevelEntryPoint3
; check keyboard and button controls
+001313 4110: ad 17 14 checkKbdAndBtn lda ControllerType ;NW: keyboard controls?
+001316 4113: c9 01 cmp #$01
+001318 4115: d0 14 bne @notKeyboard
+00131a 4117: 20 e3 41 jsr readKbd ;Controller is keyboard, NW: yes, get key or return if none pressed
+00131d 411a: b9 00 0a lda kbdMovementDir,y ;NW: map key to movement direction
+001320 411d: 30 03 bmi B4122
+001322 411f: 8d 06 15 sta MovementDir
+001325 4122: b9 80 0a B4122 lda kbdShootingDir,y ;NW: map key to shooting direction
+001328 4125: 30 03 bmi @rts
+00132a 4127: 8d 16 14 sta ShootingDir
+00132d 412a: 60 @rts rts
+00132e 412b: aa @notKeyboard tax ;NW: no, joystick controls?
+00132f 412c: d0 40 bne @rts
+001331 412e: ad 62 c0 lda BUTN1 ;NW: yes, button 1 pressed?
+001334 4131: 10 1d bpl B4150
+001336 4133: ad 35 14 lda $1435 ;NW: yes, rotate shooting direction [warum $1435?]
+001339 4136: 18 clc
+00133a 4137: 6d 6b 0c adc L0C6B ;NW: =$0C
+00133d 413a: 8d 35 14 sta $1435
+001340 413d: 90 11 bcc B4150
+001342 413f: ae 36 14 ldx $1436
+001345 4142: bd 5e 0d lda fireRotation,x ;NW: get next direction
+001348 4145: 69 00 adc #$00
+00134a 4147: 29 07 and #$07
+00134c 4149: aa tax
+00134d 414a: bd 1e 0d lda fireDirection,x ;NW: translate to direction of shooting
+001350 414d: 8d 36 14 sta $1436
+001353 4150: a9 00 B4150 lda #$00
+001355 4152: ac 61 c0 ldy BUTN0 ;NW: button 0 pressed?
+001358 4155: 10 11 bpl B4168
+00135a 4157: ad 36 14 lda $1436 ;NW: yes,
+00135d 415a: ae 31 14 ldx $1431
+001360 415d: 30 09 bmi B4168
+001362 415f: ae 06 15 ldx MovementDir
+001365 4162: f0 04 beq B4168
+001367 4164: 8e 36 14 stx $1436
+00136a 4167: 8a txa
+00136b 4168: 8d 16 14 B4168 sta ShootingDir
+00136e 416b: 8c 31 14 sty $1431
+001371 416e: 4c 6e 4c @rts jmp doSpeaker ;speaker tail call, NW: click the speaker if needed and return
; check joystick and paddle controls
+001374 4171: ad 17 14 checkJoystAndPdl lda ControllerType ;NW: controls selectoin
+001377 4174: c9 03 cmp #$03 ;NW: joystick and keyboard controls?
+001379 4176: d0 3c bne @notJoyAndKbd
+00137b 4178: 20 85 41 jsr joystickControls ;Controller is joystick & keyboard, NW: yes, check joystick
+00137e 417b: 20 e3 41 jsr readKbd ;NW: get key or return if none pressed
+001381 417e: b9 00 0b lda kbd2ShootingDir,y ;NW: map key to shooting direction
+001384 4181: 8d 16 14 sta ShootingDir
+001387 4184: 60 rts
; joystick controls (one paddle)
+001388 4185: a9 03 joystickControls lda #$03 ;NW: 1 paddle
+00138a 4187: ae 08 15 ldx UsedPaddle? ;NW: current paddle (alternates 0/1)
+00138d 418a: d0 02 bne B418E
+00138f 418c: 49 0f eor #$0f
+001391 418e: 2d 06 15 B418E and MovementDir
+001394 4191: 8d 06 15 sta MovementDir
+001397 4194: 20 1e fb jsr MON_PREAD ;NW: read paddle X
+00139a 4197: a2 00 ldx #$00
+00139c 4199: c0 c0 cpy #$c0
+00139e 419b: 90 01 bcc B419E
+0013a0 419d: e8 inx
+0013a1 419e: c0 40 B419E cpy #$40
+0013a3 41a0: b0 01 bcs B41A3
+0013a5 41a2: ca dex
+0013a6 41a3: 8a B41A3 txa
+0013a7 41a4: 29 03 and #$03
+0013a9 41a6: ae 08 15 ldx UsedPaddle? ;"NW: current paddle (alternates 0/1)" - - TODO: comment übertragen
+0013ac 41a9: f0 02 beq B41AD
+0013ae 41ab: 0a asl A
+0013af 41ac: 0a asl A
+0013b0 41ad: 0d 06 15 B41AD ora MovementDir
+0013b3 41b0: 8d 06 15 sta MovementDir
+0013b6 41b3: 60 rts
; paddle controls (one paddle)
+0013b7 41b4: c9 02 @notJoyAndKbd cmp #$02 ;NW: paddle controls? (one paddle)
+0013b9 41b6: d0 21 bne @notPaddles
+0013bb 41b8: ae 08 15 ldx UsedPaddle? ;Controller is paddles, NW: yes, paddles; current paddle (alternates 0/1)
+0013be 41bb: 20 1e fb jsr MON_PREAD ;read paddle X (0-3) into Y, NW: read paddle X
+0013c1 41be: 98 tya
+0013c2 41bf: 4a lsr A ;distinguish between left and right?
+0013c3 41c0: 4a lsr A
+0013c4 41c1: 4a lsr A
+0013c5 41c2: 4a lsr A
+0013c6 41c3: 4a lsr A
+0013c7 41c4: a8 tay
+0013c8 41c5: b9 1e 0d lda fireDirection,y ;NW: translate to direction of fire
+0013cb 41c8: ae 08 15 ldx UsedPaddle?
+0013ce 41cb: d0 05 bne B41D2 ;NW: paddle 0?
+0013d0 41cd: 8d 06 15 sta MovementDir ;NW: yes, update movement direction
+0013d3 41d0: f0 03 beq B41D5
+0013d5 41d2: 8d 16 14 B41D2 sta ShootingDir ;NW: no, paddle 1, so update shooting direction
+0013d8 41d5: 20 e3 41 B41D5 jsr readKbd ;NW: get key or return if none pressed <- TODO:
+0013db 41d8: 60 rts
; joystick controls?
+0013dc 41d9: aa @notPaddles tax ;joystick controls?
+0013dd 41da: d0 06 bne @rts
+0013df 41dc: 20 85 41 jsr joystickControls ;NW: yes, check joystick controls
+0013e2 41df: 20 e3 41 jsr readKbd
+0013e5 41e2: 60 @rts rts
; readKbd
+0013e6 41e3: ad 00 c0 readKbd lda KBD
+0013e9 41e6: 30 03 bmi B41EB ;key pressed?
+0013eb 41e8: 68 @plaPlaRts pla ;NW: no, return from parent subroutine
+0013ec 41e9: 68 pla
+0013ed 41ea: 60 rts
+0013ee 41eb: 20 42 42 B41EB jsr waitForKey ;yes, key was pressed => waitForKey doesn't have to wait, will return immediately, NW: yes, get key with high bit cleared
+0013f1 41ee: c0 1b cpy #ASCII_ESCAPE
+0013f3 41f0: d0 07 bne @notEscape
; escape? (pause)
+0013f5 41f2: ad 00 c0 @peekKBD lda KBD ;ESC in the game freezes the screen until any key is pressed
+0013f8 41f5: 10 fb bpl @peekKBD ;NW: loop till key pressed
+0013fa 41f7: 30 ef bmi @plaPlaRts ;NW: then return from parent subroutine
; Ctrl-S? (toggle sound)
+0013fc 41f9: c0 13 @notEscape cpy #$13 ;key #$13 = Ctrl-S
+0013fe 41fb: d0 0a bne @notCtrlS
+001400 41fd: ad 6e 4c lda doSpeaker ;yes, toggle sound
+001403 4200: 49 c5 eor #$c5
+001405 4202: 8d 6e 4c sta doSpeaker
+001408 4205: d0 e1 bne @plaPlaRts
; Ctrl-R? (select level)
+00140a 4207: c0 12 @notCtrlS cpy #$12 ;keys #$12 = Ctrl-R
+00140c 4209: d0 2b bne @notCtrlR
+00140e 420b: 20 4e 42 jsr waitForKey2 ;NW: yes, wait for first keypress
+001411 420e: b0 d8 bcs @plaPlaRts ;NW: digit?
+001413 4210: 85 07 sta PixelLine+1 ;NW: yes,
+001415 4212: a2 0a ldx #$0a
+001417 4214: 20 4f 4c jsr multiplyAX
+00141a 4217: 86 06 stx PixelLine
+00141c 4219: 20 4e 42 jsr waitForKey2 ;NW: wait for second keypress
+00141f 421c: d0 04 bne B4222
+001421 421e: a5 07 lda PixelLine+1
+001423 4220: 10 05 bpl B4227
+001425 4222: b0 c4 B4222 bcs @plaPlaRts
+001427 4224: 18 clc
+001428 4225: 65 06 adc PixelLine
+00142a 4227: 38 B4227 sec
+00142b 4228: e9 01 sbc #$01
+00142d 422a: 90 bc bcc @plaPlaRts
+00142f 422c: 8d 07 14 sta Level
+001432 422f: 68 pla
+001433 4230: 68 pla
+001434 4231: 68 pla
+001435 4232: 68 pla
+001436 4233: 4c 8a 40 jmp levelEntryPoint1 ;levelEntryPoint1 resets pointer, so why 4x PLA?
; Ctrl-Q? (quit game)
+001439 4236: c9 11 @notCtrlR cmp #$11 ;; key #$11 = Ctrl-Q
+00143b 4238: d0 07 bne @rts
+00143d 423a: 68 pla ;NW: yes, quit game, go to attract mode
+00143e 423b: 68 pla
+00143f 423c: 68 pla
+001440 423d: 68 pla
+001441 423e: 4c 60 40 jmp startScreen ;startScreen resets pointer, so why 4x PLA?
+001444 4241: 60 @rts rts
; NW: wait for keypress and return it (with high bit off)
+001445 4242: ad 00 c0 waitForKey lda KBD ;$C000 is tested repeatedly until presence of the sign
+001448 4245: 10 fb bpl waitForKey
+00144a 4247: 8d 10 c0 sta KBDSTRB ;remove info that key was pressed
+00144d 424a: 29 7f and #$7f ;Apple II ASCII has high bit set, remove it
+00144f 424c: a8 tay ;return key in Y
+001450 424d: 60 rts
; NW: wait for keypress, check for digits
+001451 424e: 20 42 42 waitForKey2 jsr waitForKey
+001454 4251: c9 0d cmp #$0d ;return?
+001456 4253: f0 05 beq @rts
+001458 4255: 38 sec ;NW: no, subtract #$30
+001459 4256: e9 30 sbc #$30
+00145b 4258: c9 0a cmp #$0a ;NW: C is clear if [TODO: ?]
+00145d 425a: 60 @rts rts
NOTE: This is a nice test routine to check speaker action.
install guard on $1411 (assumption: #0)
check how the speaker changes pith if we change the #$40
+00145e 425b: ae 11 14 speaker_1411? ldx $1411 ;assumption: $1411 = #0
+001461 425e: e8 inx
+001462 425f: a0 40 @loopOuter ldy #$40
+001464 4261: 88 @loopInner dey
+001465 4262: d0 fd bne @loopInner
+001467 4264: 20 6e 4c jsr doSpeaker
+00146a 4267: ca dex
+00146b 4268: d0 f5 bne @loopOuter
+00146d 426a: 60 rts
+00146e 426b: ce 04 14 checkLevelCompleted dec $1404
+001471 426e: 30 02 bmi B4272
+001473 4270: 18 clc ;CLC signals still in level
+001474 4271: 60 rts
+001475 4272: a9 0a B4272 lda #$0a
+001477 4274: 8d 04 14 sta $1404
+00147a 4277: ad 02 14 lda $1402