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
|
# da65 info file for jumpman junior ROM.
GLOBAL {
OUTPUTNAME "jumpmanjr.dasm";
INPUTNAME "jumpmanjr.rom";
STARTADDR $8000;
CPU "6502";
COMMENTS 4;
};
label { name "VKEYBD"; addr $0208; comment "=== page 2 OS equates"; };
label { name "VKEYBD_hi"; addr $0209; };
label { name "SDMCTL"; addr $022f; };
label { name "GPRIOR"; addr $026f; };
label { name "PCOLR0"; addr $02c0; };
label { name "PCOLR1"; addr $02c1; };
label { name "PCOLR2"; addr $02c2; };
label { name "PCOLR3"; addr $02c3; };
label { name "COLOR0"; addr $02c4; };
label { name "COLOR1"; addr $02c5; };
label { name "COLOR2"; addr $02c6; };
label { name "COLOR3"; addr $02c7; };
label { name "COLOR4"; addr $02c8; };
label { name "CHBAS"; addr $02f4; };
label { name "HPOSP3"; addr $d003; comment "=== GTIA equates"; };
label { name "HPOSM0"; addr $d004; };
label { name "HPOSM1"; addr $d005; };
label { name "HPOSM2"; addr $d006; };
label { name "HPOSM3"; addr $d007; };
label { name "SIZEP2"; addr $d00a; };
label { name "SIZEP3"; addr $d00b; };
label { name "SIZEM"; addr $d00c; };
label { name "TRIG0"; addr $d010; };
label { name "GRAFM"; addr $d011; };
label { name "COLPM0"; addr $d012; };
label { name "COLPM1"; addr $d013; };
label { name "COLPF0"; addr $d016; };
label { name "COLPF1"; addr $d017; };
label { name "COLPF2"; addr $d018; };
label { name "COLPF3"; addr $d019; };
label { name "COLBK"; addr $d01a; };
label { name "PRIOR"; addr $d01b; };
label { name "GRACTL"; addr $d01d; };
label { name "HITCLR"; addr $d01e; };
label { name "CONSOL"; addr $d01f; };
label { name "AUDF1_minus_two"; addr $d1fe; comment "AUDF/AUDC regs are indexed from here"; };
label { name "AUDC1_minus_two"; addr $d1ff; };
label { name "AUDF1"; addr $d200; comment "=== POKEY equates"; };
label { name "AUDC1"; addr $d201; };
label { name "AUDF2"; addr $d202; };
label { name "AUDC2"; addr $d203; };
label { name "AUDF3"; addr $d204; };
label { name "AUDC3"; addr $d205; };
label { name "AUDF4"; addr $d206; };
label { name "AUDC4"; addr $d207; };
label { name "AUDCTL"; addr $d208; };
label { name "KBCODE"; addr $d209; };
label { name "RANDOM"; addr $d20a; };
label { name "IRQEN"; addr $d20e; };
label { name "SKCTL"; addr $d20f; };
label { name "PORTA"; addr $d300; };
label { name "DMACTL"; addr $d400; comment "=== ANTIC equates"; };
label { name "DLISTL"; addr $d402; };
label { name "DLISTH"; addr $d403; };
label { name "HSCROL"; addr $d404; };
label { name "PMBASE"; addr $d407; };
label { name "CHBASE"; addr $d409; };
label { name "WSYNC"; addr $d40a; };
label { name "NMIEN"; addr $d40e; };
label { name "SETVBV"; addr $e45c; };
label { name "XITVBV"; addr $e462; };
label { name "zero_filler_9a48"; addr $9a48; };
range { name "zero_filler_8588"; start $B588; end $B58f; type bytetable; };
range { name "zero_filler_85f6"; start $85f6; end $85ff; type bytetable; };
range { name "zero_filler_88be"; start $88BE; end $88C7; type bytetable; };
range { name "zero_filler_88f9"; start $88F9; end $88FF; type bytetable; };
range { name "zero_filler_8aee"; start $8aee; end $8afd; type bytetable; };
range { name "zero_filler_8b00"; start $8b00; end $8b22; type bytetable; };
range { name "zero_filler_8cb4"; start $8cb4; end $8cbb; type bytetable; };
range { name "zero_filler_8d97"; start $8D97; end $8D9F; type bytetable; };
range { name "zero_filler_8dcd"; start $8dcd; end $8dcd; type bytetable; };
range { name "zero_filler_8e67"; start $8e67; end $8e68; type bytetable; };
range { name "zero_filler_97f0"; start $97F0; end $97FF; type bytetable; };
range { name "zero_filler_9bcc"; start $9bcc; end $9bcf; type bytetable; };
range { name "zero_filler_9bff"; start $9bff; end $9bff; type bytetable; };
range { name "zero_filler_a3d6"; start $a3d6; end $a3df; type bytetable; };
range { name "zero_filler_b1df"; start $b1df; end $b1df; type bytetable; };
range { name "zero_filler_b7f1"; start $B7F1; end $B7FF; type bytetable; };
range { name "zero_filler_b8bf"; start $b8bf; end $b96a; type bytetable; };
range { name "zero_filler_baab"; start $baab; end $babb; type bytetable; };
label { name "cart_start_stub"; addr $8AFE; };
label { name "cart_entry_point"; addr $8ac0; };
label { name "check_keycode"; addr $9C07; };
label { name "store_speed_value"; addr $9C13; };
label { name "keyboard_isr_exit"; addr $9C0F; };
label { name "check_consol"; addr $88C8; };
label { name "ask_num_players"; addr $9400; };
label { name "sl_loop"; addr $96D8; };
label { name "materialize_jumpman"; addr $977B; };
label { name "mj_clear_loop"; addr $9782; };
label { name "mj_set_freq_and_color"; addr $97BB; };
label { name "mj_delay"; addr $97CD; };
label { name "mj_done"; addr $97DB; };
label { name "game_main_loop"; addr $9740; };
range { name "random_9b"; start $9BC6; end $9BC6; type bytetable; comment "filler, or leftover after a binary patch?"; };
label { name "copy_work_level_desc"; addr $9677; comment "copy cur_level_desc to work_level_desc. done in between players, in a multiplayer game (so each player starts out with a fresh level)"; };
label { name "randomize_level"; addr $9BED; comment "only after beating levels 1-12 in order"; };
label { name "enter_level"; addr $96BA; comment "maybe this should be check_level or init_level?"; };
label { name "copy_level_desc"; addr $96CE; comment "copy level descriptor from levelXX_desc at $A000+(level*$40) to cur_level_desc at $07c0-$07ff"; };
label { name "randomizer_mode"; addr $06F3; comment "only after beating levels 1-12 in order"; };
label { name "init_loop"; addr $8ac4; comment "clear pages 6 and 7"; };
label { name "set_vkeybd"; addr $83ED; comment "VKEYBD now points to $9c00 aka keyboard_isr"; };
label { name "set_vvblki"; addr $8401; comment "VVBLKI now points to $840d aka vblank_imm_isr"; };
label { name "vblank_imm_isr"; addr $840d; comment "service immediate vblank interrupt"; };
label { name "dli_chained_1"; addr $9B72; comment "changes DLI vector to point to dli_chained_2"; };
label { name "dli_chained_2"; addr $9B87; comment "changes DLI vector to point to dli_chained_3"; };
label { name "dli_chained_3"; addr $9BB1; comment "changes DLI vector to point to dli_chained_1"; };
label { name "update_color_regs"; addr $840F; comment "update color regs from shadow regs (X ranges 1 to 9, GRAFM+1 is COLPM0, $2bf+1 is PCOLR0)"; };
label { name "save_flags"; addr $8CDB; comment "we have to preserve the carry flag!"; };
label { name "check_extra_life"; addr $8CBC; comment "should be called every time the score is updated, adds extra life every 7500 points. notice the score and threshold are both 3 bytes, and we compare from high byte to low."; };
label { name "check_extra_life_jv"; addr $800C; comment "should be called every time the score is updated, adds extra life every 7500 points"; };
label { name "score_mod_1m"; addr $B7C0; comment "roll over the score if it's >= 1 million"; };
label { name "score_below_1m"; addr $B7EE; };
label { name "spellbound_letters"; addr $AF58; comment "called at end of Spellbound, adds up letter bonus"; };
label { name "spellbound_got_all"; addr $AF5E; comment "got all the bombs"; };
label { name "bonus_250_pts"; addr $AF96; comment "per letter"; };
label { name "b250_hi_ok"; addr $AFB4; };
label { name "ltr_loop"; addr $AF6D; };
label { name "ltr_delay"; addr $AF86; comment "wait approx 1/3 second so user can see what happened"; };
label { name "ltr_wait"; addr $AF8B; };
label { name "ltr_skip"; addr $AF92; };
label { name "init_level"; addr $9682; comment "call start subroutine for current level"; };
label { name "set_level_colors"; addr $9691; comment "set color regs from level descriptor (COLOR4 always $00, black)"; };
label { name "jump_frame"; addr $06EB; comment "0 if not jumping, or frames since start of jump (range 1 to 21)"; };
range { name "code_99f7"; start $99F7; end $9A1B; type code; };
range { name "map_draw_1_blank"; start $8406; end $840c; type bytetable; comment "copied to $06d9 by code at copy_blank_1_map, possibly so it can be modified"; };
label { name "copy_blank_1_map"; addr $83F0; comment "stub => map_draw_1_blank-1"; };
range { name "jump_delta_x_table"; start $9a1c; end $9A5B; type bytetable; comment "used by continue_jump, the amount of X movement per frame of jumping (for either direction, left or right)"; };
label { name "jump_delta_y_table"; addr $9A32; comment "used by continue_jump, amount of Y movement per frame ($FE is -2, or 2 scanlines up, $02 is 2 scanlines down)"; };
label { name "jump_delta_x_table_minus_one"; addr $9A1B; comment "1-indexed..."; };
label { name "jump_delta_y_table_minus_one"; addr $9A31; comment "1-indexed..."; };
label { name "is_jump_done"; addr $99AE; comment "$15 aka 21 frames?"; };
range { name "gameboard_dlist_data"; start $9B62; end $9b71; type bytetable; comment "this isn't used as-is for a display list, see setup_gameboard_dlist"; };
RANGE { NAME "cartstart_left"; START $BFFA; END $BFFB ; TYPE AddrTable; comment "main entry point, note cartstart_left and cartstart_right point to the same address"; };
RANGE { NAME "cartstart_right"; START $9FFA; END $9FFB ; TYPE AddrTable; comment "main entry point, note cartstart_left and cartstart_right point to the same address"; };
RANGE { NAME "cartinit_left"; START $BFFE; END $BFFF ; TYPE AddrTable; comment "points to a CLC/RTS do-nothing routine (same as cartinit_right)"; };
RANGE { NAME "cartinit_right"; START $9FFE; END $9FFF ; TYPE AddrTable; comment "points to a CLC/RTS do-nothing routine (same as cartinit_left)"; };
range { name "cartpresent_left"; start $bffc; end $bffc; type bytetable; comment "0 here means 'cartridge present'"; };
range { name "cartpresent_right"; start $9ffc; end $9ffc; type bytetable; comment "0 here means 'cartridge present'"; };
range { name "cartoptions_left"; start $bffd; end $bffd; type bytetable; comment "4 here means init & start the cart, no disk boot, non-diagnostic"; };
range { name "cartoptions_right"; start $9ffd; end $9ffd; type bytetable; comment "4 here means init & start the cart, no disk boot, non-diagnostic"; };
label { name "VDSLST"; addr $0200; size 2; };
label { name "demo_map_ptr"; addr $00e0; size 2; comment "points to level_desc of each map in turn, during the 'show all levels' demo"; };
label { name "demo_name_offset"; addr $00e2; size 1; comment "offset from level_names to the name of each level in turn, during the 'show all levels' demo"; };
label { name "player_x_speed"; addr $95C5; size 20; comment "' PLAYER # SPEED? ' in PF2 color"; };
label { name "num_name_hscrol_table"; addr $95D9; size 4; comment "used for centering ONE TWO THREE FOUR, see option_key_handler"; };
label { name "number_names_0"; addr $95dd; size 4; comment "space space T space (names ONE TWO THREE FOUR)"; };
label { name "number_names_1"; addr $95e1; size 4; comment "O T H F"; };
label { name "number_names_2"; addr $95e5; size 4; comment "N W R O"; };
label { name "number_names_3"; addr $95e9; size 4; comment "E O E U"; };
label { name "number_names_4"; addr $95ed; size 4; comment "space space E R"; };
label { name "sfx_select_key"; addr $95f1; comment "played when select key pressed, 4 notes, descending"; };
label { name "unknown_95fd"; addr $95fd; comment "not sure what (if anything) reads this, it might be filler. it isn't valid 6502 code."; };
label { name "set_dma_ctl"; addr $838F; comment "std playfield, enable players + missiles, single-line p/m res, DMA enabled"; };
range { name "level_names"; start $BB00; end $bbef; type bytetable; };
range { name "pm_memory"; start $2800; end $2fff; type bytetable; };
range { name "missiles_and_masks"; start $82e0; end $82E7; type bytetable; };
label { name "missiles_and_masks_minus_one"; addr $82df; };
label { name "missiles_or_masks"; addr $82e4; };
label { name "missiles_or_masks_minus_one"; addr $82e3; };
range { name "missiles_done"; start $82DD; end $82df; type code; };
range { name "position_missiles"; start $8293; end $82DA; type code; };
label { name "pm_next"; addr $8295; };
label { name "skip_pos"; addr $82A6; };
label { name "next_plr"; addr $82F3; };
label { name "skip_vert"; addr $8338; };
label { name "cb1_loop"; addr $83F2; };
label { name "check_speed_timer"; addr $846E; };
label { name "check_time_bonus"; addr $847E; };
label { name "copy_level_vecs"; addr $84D9; comment "copy work_level vectors to page 6"; };
label { name "next_vec"; addr $84DB; };
label { name "skip_vec"; addr $84EE; };
label { name "skip_dli"; addr $853B; };
label { name "no_consol_pressed"; addr $858D; comment "this probably is what rotates the PLAYER SPEED prompt colors. not sure what it's doing with the page 6 vectors."; };
range { name "charset"; start $9e00; end $9ff9; type bytetable; comment "GR.1/2 font, 512 bytes"; };
range { name "game_display_list"; start $0881; end $08e3; type bytetable; comment "display list for game board"; };
range { name "title_display_list"; start $91B3; end $91ce; type bytetable; comment "display list for title screen"; };
range { name "numplayer_display_list"; start $955f; end $9577; type bytetable; comment "display list for 'number of players' screen"; };
label { name "setup_numplayer_dlist"; addr $9444; comment "set dlist shadow to point to numplayer_display_list"; };
label { name "setup_numplayer_dli_sr"; addr $944e; comment "set dli vector to point to num_player_dli_service"; };
label { name "anp_loop_done"; addr $9421; comment "X is now 0"; };
label { name "anp_clear_loop"; addr $940D; comment "clear area where NUMBER OF PLAYERS? will be displayed"; };
label { name "anp_copy_loop"; addr $9418; comment "copy NUMBER OF PLAYERS to screen RAM"; };
label { name "save_collisions"; addr $8503; comment "save contents of GTIA collision regs (X ranges 1 to $10, dli_vec_shadow_hi should read collision_save-1)"; };
label { name "check_pl_coll"; addr $8F73; size 1; comment "did any missile hit a player, or did players 2 or 3 hit a player..."; };
label { name "check_pl_coll_no_p2"; addr $8F76; size 1; comment "skip player 2 to player collisions, called with A=0, used by level 11"; };
label { name "check_pl_coll_no_pl"; addr $8F79; size 1; comment "skip player 2 and 3 to player collisions, called with A=0, used by levels 3 and 10"; };
label { name "check_collisions_2"; addr $981A; size 1; comment "did player 0 or 1 hit the playfield..."; };
label { name "check_collisions_3"; addr $9832; size 1; comment "movement/jumping only allowed if player's touching the playfield"; };
label { name "special_init"; addr $8B23; comment "various levels use this as their init, or use an init that calls this"; };
label { name "special_init_jv"; addr $8036; comment "various levels use this as their init, or use an init that calls this"; };
label { name "si_clear"; addr $8B27; comment "clear memory from $0760 to $077f"; };
label { name "si_done"; addr $8B7A; };
label { name "si_loop"; addr $8B39; };
label { name "special_init_2"; addr $8B2D; comment "special_init that doesn't clear memory. does anything use this entry point?"; };
label { name "special_init_2_jv"; addr $8039; comment "special_init that doesn't clear memory. unused vector?"; };
label { name "next_player"; addr $9AAA; comment "used in multiplayer games, also called in single player (?)"; };
label { name "next_player_jv"; addr $8027; comment "used in multiplayer games, also called in single player (?)"; };
label { name "mul_player_11"; addr $9A7C; comment "multiply current player number by 11, return result in Y"; };
label { name "add_11"; addr $9A82; };
label { name "return_y"; addr $9A8A; };
label { name "save_struct_user"; addr $9A8C; };
label { name "setup_blank_dlist"; addr $8AE0; comment "show blank screen with empty display list"; };
label { name "setup_blank_dlist_jv"; addr $803C; comment "show blank screen with empty display list"; };
label { name "draw_level"; addr $BA00; comment "calls draw_map, plays level intro music, shows level name"; };
label { name "draw_level_jv"; addr $802A; comment "calls draw_map, plays level intro music, shows level name"; };
label { name "mid_jump"; addr $99A8; size 1; comment "check & see if we're done jumping"; };
label { name "continue_jump"; addr $99BD; size 1; comment "we're in mid-jump and didn't hit anything, keep going"; };
label { name "end_jump"; addr $99B2; size 1; comment "we hit a girder/rope/ladder in mid-jump, or else the jump finished without hitting anything(?). this does not (?) include the bottom of the level"; };
#label { name "collision_save"; addr $06B0; size 16; comment "save_collisions copies GTIA collision regs $D000-$d00f here"; };
label { name "sav_m0pf"; addr $06b0; comment "Missile 0 to playfield collision."; };
label { name "sav_m1pf"; addr $06b1; comment "Missile 1 to playfield collision."; };
label { name "sav_m2pf"; addr $06b2; comment "Missile 2 to playfield collision."; };
label { name "sav_m3pf"; addr $06b3; comment "Missile 3 to playfield collision."; };
label { name "sav_p0pf"; addr $06b4; comment "Player 0 to playfield collision."; };
label { name "sav_p1pf"; addr $06b5; comment "Player 1 to playfield collision."; };
label { name "sav_p2pf"; addr $06b6; comment "Player 2 to playfield collision."; };
label { name "sav_p3pf"; addr $06b7; comment "Player 3 to playfield collision."; };
label { name "sav_m0pl"; addr $06b8; comment "Missile 0 to player collision."; };
label { name "sav_m1pl"; addr $06b9; comment "Missile 1 to player collision."; };
label { name "sav_m2pl"; addr $06ba; comment "Missile 2 to player collision."; };
label { name "sav_m3pl"; addr $06bb; comment "Missile 3 to player collision."; };
label { name "sav_p0pl"; addr $06bc; comment "Player 0 to player collision."; };
label { name "sav_p1pl"; addr $06bd; comment "Player 1 to player collision."; };
label { name "sav_p2pl"; addr $06be; comment "Player 2 to player collision."; };
label { name "sav_p3pl"; addr $06bf; comment "Player 3 to player collision."; };
label { name "init_next_level"; addr $9BE8; size 1; comment "..."; };
label { name "show_get_ready_prompt"; addr $9624; size 1; comment "only in multiplayer games"; };
label { name "check_bomb_coll"; addr $87A0; size 1; comment "check whether Jumpman just touched a bomb (RTS if not)"; };
label { name "check_bomb_coll_jv"; addr $8033; size 1; comment "check whether Jumpman just touched a bomb (RTS if not)"; };
label { name "bomb_pickup"; addr $87A8; size 1; comment "Jumpman just touched a bomb, award points, play sfx_bomb_pickup, make the bomb disappear, etc."; };
label { name "coarse_grid"; addr $87C4; size 1; comment "screen X range approx $32 to $C6, Y $18 to $C0, meaning the coarse grid visible screen range is X 1-6, Y 0-6"; };
label { name "erase_bomb"; addr $8879; size 1; comment "make the bomb disappear by drawing sh_blank in its location"; };
label { name "wait_bomb"; addr $888A; size 1; comment "wait for bomb to really disappear"; };
label { name "bomb_add_points"; addr $8865; size 1; comment "add points to score for picking up bomb (theoretically different on every level, but really $64 aka 100 for all of them)"; };
label { name "call_bomb_sub"; addr $8856; size 1; comment "call bomb pickup subroutine for this level (which might just do an RTS if there's no special action)"; };
label { name "call_bomb_indirect_sub"; addr $883E; size 1; comment "this would call a subroutine via pointer-to-pointer, but I'm almost 100% certain it's never used (maybe a holdover from original Jumpman?)"; };
label { name "search_bomblist"; addr $87D0; size 1; comment "set Y to the index of the current bomb (or rts if we can't find it)"; };
label { name "bl_ok"; addr $87D7; size 1; };
label { name "bomb_found"; addr $87E0; size 1; };
label { name "bombloc"; addr $B6; size 1; comment "bomb_pickup: position of the bomb Jumpman just touched, on 8x8 coarse grid"; };
label { name "mul_y"; addr $87EA; size 1; comment "multiply Y by 1.5 (only works because Y will always be even at this point)"; };
label { name "store_bomb_coords"; addr $87F2; size 1; comment "store actual bomb coordinates (not the coarse ones) for bomb subs to use"; };
label { name "change_map"; addr $881B; size 1; comment "some bombs redraw parts of the level (e.g. disappearing platforms on level01)"; };
label { name "check_ind_sub"; addr $8831; size 1; comment "see if this bomb calls an indirect sub (none of them do in this game, this is useless code)"; };
label { name "blistptr"; addr $B4; size 2; comment "bomb_pickup: points to current level's bomblist"; };
range { name "gr7_or_masks"; start $8143; end $8152; type bytetable; };
range { name "gr7_and_masks"; start $8153; end $8156; type bytetable; };
range { name "sfx_bomb_pickup"; start $8892; end $88A7; type bytetable; comment "played when a bomb is picked up"; };
range { name "sfx_bonus_tick"; start $8DFA; end $8DFF; type bytetable; comment "played when bonus timer is decremented"; };
range { name "bullet_table"; start $8F43; end $8f72; type bytetable; comment "used by bullet_logic"; };
label { name "sfx_bullet"; addr $8f59; size 1; comment "bang!"; };
label { name "play_sfx_bullet"; addr $8EFB; size 1; comment "let player hear report"; };
label { name "set_bullet_dir"; addr $8EA7; size 1; comment "initial direction (before it fires)"; };
label { name "fire_bullet"; addr $8EEF; size 1; comment "fire! Y reg indexes table of directions"; };
label { name "player_y_pos"; addr $0683; size 1; comment "$C6 is the bottom of the level (where you end up when you die)"; };
label { name "player_x_pos"; addr $067E; size 1; comment "stored in HPOSP0"; };
label { name "bullet_x_pos"; addr $069B; size 1; comment "4 bytes, meaning we can never have >4 bullets on screen at once (makes sense, GTIA only has 4 missiles)"; };
label { name "bullet_y_pos_minus_one"; addr $069E; };
label { name "bullet_y_pos"; addr $069F; size 4; comment "another 4 bytes"; };
label { name "bullet_flags"; addr $0756; size 4; comment "4 bytes, 0 = bullet slot not in use, non-0 = bullet active"; };
label { name "bullet_x_delta"; addr $075A; size 4; comment "4 bytes"; };
label { name "bullet_y_delta"; addr $075E; size 4; comment "4 bytes"; };
label { name "fire_when_ready"; addr $8EB9; size 1; comment "fire at player if lined up with him, otherwise don't. either way we end up at move_bullet"; };
label { name "sbc3"; addr $8EC1; size 1; comment "aim at center of body mass!"; };
label { name "move_bullet"; addr $8F11; size 1; };
label { name "aim_bullet_y"; addr $8ED6; size 1; comment "take aim!"; };
label { name "aim_bullet_x"; addr $8EE4; size 1; comment "take aim!"; };
range { name "mus00_addr1"; start $8fc3; end $8fc4; type addrtable; comment "aka mus_struct_table, 5 bytes per entry"; };
range { name "mus00_addr2"; start $8fc5; end $8fc6; type addrtable; };
range { name "mus00_priority"; start $8fc7; end $8fc7; type bytetable; };
range { name "mus01_addr1"; start $8fc8; end $8fc9; type addrtable; };
range { name "mus01_addr2"; start $8fca; end $8fcb; type addrtable; };
range { name "mus01_priority"; start $8fcc; end $8fcc; type bytetable; };
range { name "mus02_addr1"; start $8fcd; end $8fce; type addrtable; comment "end of game tune"; };
range { name "mus02_addr2"; start $8fcf; end $8fd0; type addrtable; };
range { name "mus02_priority"; start $8fd1; end $8fd1; type bytetable; };
range { name "mus03_addr1"; start $8fd2; end $8fd3; type addrtable; };
range { name "mus03_addr2"; start $8fd4; end $8fd5; type addrtable; };
range { name "mus03_priority"; start $8fd6; end $8fd6; type bytetable; };
range { name "mus04_addr1"; start $8fd7; end $8fd8; type addrtable; };
range { name "mus04_addr2"; start $8fd9; end $8fda; type addrtable; };
range { name "mus04_priority"; start $8fdb; end $8fdb; type bytetable; };
range { name "mus05_addr1"; start $8fdc; end $8fdd; type addrtable; };
range { name "mus05_addr2"; start $8fde; end $8fdf; type addrtable; };
range { name "mus05_priority"; start $8fe0; end $8fe0; type bytetable; };
range { name "mus06_addr1"; start $8fe1; end $8fe2; type addrtable; };
range { name "mus06_addr2"; start $8fe3; end $8fe4; type addrtable; };
range { name "mus06_priority"; start $8fe5; end $8fe5; type bytetable; };
range { name "mus07_addr1"; start $8fe6; end $8fe7; type addrtable; };
range { name "mus07_addr2"; start $8fe8; end $8fe9; type addrtable; };
range { name "mus07_priority"; start $8fea; end $8fea; type bytetable; };
range { name "mus08_addr1"; start $8feb; end $8fec; type addrtable; comment "tune that plays while level is being drawn"; };
range { name "mus08_addr2"; start $8fed; end $8fee; type addrtable; };
range { name "mus08_priority"; start $8fef; end $8fef; type bytetable; };
range { name "mus09_addr1"; start $8ff0; end $8ff1; type addrtable; };
range { name "mus09_addr2"; start $8ff2; end $8ff3; type addrtable; };
range { name "mus09_priority"; start $8ff4; end $8ff4; type bytetable; };
range { name "mus10_addr1"; start $8ff5; end $8ff6; type addrtable; };
range { name "mus10_addr2"; start $8ff7; end $8ff8; type addrtable; };
range { name "mus10_priority"; start $8ff9; end $8ff9; type bytetable; };
range { name "mus11_addr1"; start $8ffa; end $8ffb; type addrtable; };
range { name "mus11_addr2"; start $8ffc; end $8ffd; type addrtable; };
range { name "mus11_priority"; start $8ffe; end $8ffe; type bytetable; };
range { name "empty_music_entry"; start $8fff; end $8fff; type bytetable; comment "empty music table entries point here"; };
label { name "snd_priority_tmp"; addr $0661; comment "??"; };
label { name "snd_slot_curpos"; addr $064E; size 2; comment "address we've got to so far, playing this sfx"; };
label { name "snd_slot_priority"; addr $063E; size 1; comment "priority of this sfx"; };
label { name "snd_lock"; addr $062F; size 1; comment "lets other code know cue_sfx is still running? not 100% sure"; };
label { name "inc_snd_pos"; addr $8231; size 1; comment "point to next byte in current sfx slot indexed by X"; };
label { name "snd_finished"; addr $8226; size 1; comment "done playing this sfx, free up the slot, X-indexed"; };
label { name "snd_next_note"; addr $817D; size 1; };
label { name "snd_player_entry"; addr $8157; size 1; comment "we have 4 slots (because POKEY has 4 voices), X counts down by 2 from 10 to 2 (at 0, the loop exits)"; };
label { name "next_snd_slot"; addr $815F; size 1; };
label { name "snd_exit"; addr $815E; size 1; };
label { name "is_slot_active"; addr $8168; size 1; comment "skip it, if slot is inactive"; };
label { name "cpos_hi_ok"; addr $8223; };
label { name "lp_ok"; addr $8248; comment "copy to sfx_ptr, fall thru to cue_sfx"; };
label { name "next_slot"; addr $825D; };
label { name "load_slot"; addr $8266; comment "found a free slot, use it"; };
label { name "bump_slot"; addr $8281; comment "couldn't find a free slot, look for a used slot with lower priority than this sfx has"; };
label { name "bump_try_next"; addr $8283; comment "until we find one, or ran out of slots to look at"; };
label { name "bump_fail"; addr $8285; comment "branch to cue_done (give up) if all slots are in use with higher priority than this sfx (which means it won't be heard)"; };
label { name "snd_slot_timer"; addr $063F; size 1; };
label { name "snd_slot_duration"; addr $0646; size 1; };
label { name "snd_play_note"; addr $8206; size 1; comment "y==0, a>=4 on entry"; };
label { name "snd_play_rest"; addr $819E; size 1; comment "y==0 on entry"; };
label { name "snd_set_audc"; addr $81AE; size 1; comment "y==0 on entry"; };
label { name "snd_jump_opcode"; addr $81C8; size 1; comment "I *think* this jumps to a different sfx address..."; };
label { name "snd_slot_audc"; addr $0647; size 1; };
range { name "sfx00"; start $BDF2; end $BE24; type bytetable; };
range { name "sfx01"; start $BE25; end $BE78; type bytetable; };
label { name "sfx_walk"; addr $be73; comment "horizontal movement"; };
label { name "play_sfx_walk"; addr $98C1; comment "horizontal movement"; };
range { name "sfx_extra_life"; start $BE79; end $BE8C; type bytetable; };
range { name "sfx02"; start $BE8D; end $BEAE; type bytetable; comment "end of game tune, melody"; };
range { name "sfx03"; start $BEAF; end $BED4; type bytetable; comment "end of game tune, bass"; };
range { name "sfx04"; start $BED5; end $BEEC; type bytetable; comment "end level tune #1, bass"; };
range { name "sfx05"; start $BEED; end $BF13; type bytetable; comment "end level tune #1, melody"; };
range { name "sfx06"; start $BF14; end $BF2F; type bytetable; comment "end level tune #2, melody"; };
range { name "sfx07"; start $BF30; end $BF49; type bytetable; comment "end level tune #2, bass"; };
range { name "sfx08"; start $BF4A; end $BF5F; type bytetable; comment "end level tune #3, bass"; };
range { name "sfx09"; start $BF60; end $BF83; type bytetable; comment "end level tune #3, melody"; };
range { name "sfx10"; start $BF84; end $BFA5; type bytetable; comment "end level tune #4, melody"; };
range { name "sfx11"; start $BFA6; end $BFBD; type bytetable; comment "end level tune #4, bass"; };
range { name "sfx_jump"; start $BFBE; end $BFCF; type bytetable; comment "jumping sound"; };
range { name "sfx13"; start $BFD0; end $BFE9; type bytetable; comment "funeral march melody"; };
range { name "sfx14"; start $BFEA; end $BFF3; type bytetable; comment "funeral march bass"; };
range { name "data_bff4"; start $BFF4; end $BFF9; type bytetable; comment "dunno yet (not code, don't look like audio)"; };
range { name "sfx15"; start $BABC; end $BAE9; type bytetable; comment "level intro music, melody"; };
range { name "sfx16"; start $BAEA; end $BAFF; type bytetable; comment "level intro music, bass"; };
range { name "code_8f38"; start $8F38; end $8F42; type code; };
range { name "try_to_write_rom_again"; start $9126; end $9133; type code; comment "see comment at try_to_write_rom. this writes something else to the block character in the font, which causes the graphics corruption on cracked disk versions. it doesn't seem to actually hurt anything though."; };
range { name "code_adb5"; start $ADB5; end $adc0; type code; };
range { name "code_adc1"; start $adc1; end $adc3; type code; };
label { name "replacement_block_char_minus_one"; addr $9133; comment "1-indexed..."; };
range { name "replacement_block_char"; start $9134; end $913b; type bytetable; };
label { name "fade_in_letters"; addr $913c; comment "rotate colors and play the descending tone as each letter appears on the title screen. called once per frame, uses $9c to keep track of letter. caller stops this routine being called when $9c holds $0e (meaning the last letter is done)."; };
label { name "ts_setup_sub0"; addr $905f; comment "set work_level_sub0 to fade_in_letters"; };
label { name "ts_clear_sub0"; addr $9114; comment "set work_level_sub0 to $06e6 (just an RTS)"; };
label { name "demo_mode"; addr $B96B; comment "display all the levels, happens if left idle at the title screen"; };
label { name "show_letter"; addr $9160; comment "$3000 is screen memory, at this point"; };
label { name "title_letters"; addr $928F; comment "JUMPMAN JUNIOR in screen codes with high bit set"; };
label { name "is_user_dead"; addr $9AD2; };
label { name "check_lives"; addr $9AE5; comment "if user hasn't been eliminated, but is out of lives, eliminate him"; };
label { name "user_alive"; addr $9AF5; comment "found the next user that isn't dead"; };
label { name "load_struct_user"; addr $9A9B; };
label { name "lsp_loop"; addr $9A9D; };
label { name "ssp_loop"; addr $9A8E; };
label { name "look_for_alive"; addr $9ACB; };
label { name "next_user_num"; addr $9AB8; comment "wraparound to 1 if > total users"; };
label { name "mul_11_table_minus_one"; addr $9afb; comment "1-indexed"; };
range { name "mul_11_table"; start $9AFC; end $9aff; type bytetable; };
range { name "num_players_dli_service"; start $9578; end $959a; type code; comment "DLI service routine, changes COLPF2, address gets stored in $6ae/$6af by code at $944e"; };
range { name "dli_service_2"; start $bdc7; end $bdd1; type code; comment "DLI service routine, changes COLBK, address gets stored in $6ae/$6af by code at $bc3c"; };
label { name "numplayers_screen_data_minus_one"; addr $959a; comment "1-indexed loop copies from here+1"; };
range { name "numplayers_screen_data"; start $959b; end $95ff; type bytetable; comment "'number of players?', gets copied to $3800, see option_key_handler"; };
range { name "sfx_add_life_bonus"; start $b896; end $b8a6; type bytetable; comment "played when adding bonus per life at end of level"; };
range { name "mul_25_table"; start $b8a7; end $b8be; type wordtable; comment "multiply by 25"; };
range { name "falling_table_1"; start $8a39; end $8a7f; type bytetable; };
label { name "falling_table_2"; addr $8A42; };
label { name "play_sfx_death"; addr $8936; };
range { name "status_window_contents"; start $86da; end $8713; type bytetable; comment "40 bytes, or 2 GR.1 lines of screen codes"; };
label { name "pnum_subtractors"; addr $8702; size 18; comment "3 bytes per table entry"; };
range { name "level_name_hscrol_table"; start $BBF0; end $BBff; type bytetable; comment "used for centering level name on gameboard"; };
range { name "well_done_map"; start $bcd9; end $bd51; type bytetable; comment "level map used for the WELL DONE screen, when you beat level 12"; };
label { name "well_done_scores"; addr $8D52; comment "well_done_screen jumps here via work_level_sub1"; };
label { name "wd_wait_scores"; addr $BC92; comment "wait for score screen to finish (I think, anyway)"; };
label { name "wd_xxx"; addr $BCB6; comment "display current user's score, number_of_users should be score-1 here."; };
label { name "wd_wait_dli"; addr $BC51; comment "wait until the dli has been set up (by vblank)"; };
label { name "wd_wait_32j"; addr $BC5E; comment "wait 32 jiffies (approx 1/2 sec)"; };
label { name "wd_wait_music"; addr $BCC1; comment "wait until music is done playing (not 100% sure though)"; };
label { name "print_total_score_msg"; addr $BCA3; comment "wait 32 jiffies (approx 1/2 sec)"; };
range { name "well_done_shape"; start $bda0; end $bdc6; type bytetable; comment "used to draw the large WELL DONE banner"; };
label { name "total_score_msg_minus_one"; addr $bdd1; comment "1-indexed"; };
label { name "dumbwaiter_sub0"; addr $A6BD; comment "gets called every frame"; };
label { name "dumbwaiter_sub3"; addr $A724; comment "gets called every frame"; };
label { name "dumbwaiter_setup"; addr $A68C; comment "gets called at start of level"; };
label { name "hellstones_sub0"; addr $A836; };
label { name "hellstones_sub3"; addr $A827; };
label { name "play_hellstone_sfx"; addr $A88D; };
label { name "sfx_hellstone"; addr $a90d; };
range { name "total_score_msg"; start $bdd2; end $bdf1; type bytetable; comment "screen codes, displayed by well_done_screen"; };
#range { name "data_b590"; start $B590; end $B690; type bytetable; };
range { name "wind_table_1"; start $B76B; end $b7bf; type bytetable; comment "used in level12"; };
label { name "wind_table_2"; addr $b771; };
label { name "electrocution_bomb_pickup"; addr $A498; comment "not sure what this actually does"; };
label { name "electrocution_done"; addr $A4DD; comment "turn off electrocution effect (?)"; };
label { name "electrocute"; addr $A509; comment "electrocution effect"; };
label { name "level03_collisions"; addr $A53D; comment "skip a couple of the collision regs, so we don't register a collision when Jumpman is being electrocuted"; };
label { name "start_jump"; addr $99A0; comment "start jumping, play sfx_jump"; };
range { name "l01_map"; start $A300; end $a365; type bytetable; comment "level map data starts here"; };
range { name "l01_map_bombs"; start $A366; end $A38A; type bytetable; comment "gfx_draw instructions for bombs, used by bomb_pickup to get bomb coords. $ff terminated"; };
range { name "l01_bombs"; start $A38B; end $a3a2; type bytetable; comment "2 bytes per entry, terminated by $FF. 1st byte is coarse grid coords (top nybble = X, bottom = Y), 2nd byte is index into map_changes"; };
range { name "l01_bombs_term"; start $a3a3; end $a3a3; type bytetable; comment "terminator for l01_bombs"; };
range { name "l01_map_changes"; start $A3A4; end $a3ad; type addrtable; comment "0000 = no change"; };
range { name "l01_map_change_0"; start $A3AE; end $a3d5; type bytetable; };
label { name "l01_map_change_1"; addr $a3b8; };
label { name "l01_map_change_2"; addr $a3c2; };
label { name "l01_map_change_3"; addr $a3cc; };
range { name "l02_map"; start $A3e0; end $a445; type bytetable; comment "level map data starts here"; };
range { name "l02_map_bombs"; start $A446; end $a476; type bytetable; };
range { name "l02_bombs"; start $A477; end $a496; type bytetable; };
range { name "l02_bombs_term"; start $A497; end $a497; type bytetable; };
range { name "elec_bomb_table"; start $A542; end $A5EF; type bytetable; comment "dunno exactly how it's used yet, referenced by electrocution_bomb_pickup"; };
range { name "l03_map"; start $A5F0; end $a62e; type bytetable; comment "level map data starts here"; };
range { name "l03_map_bombs"; start $a62f; end $a653; type bytetable; };
range { name "l03_bombs"; start $a654; end $a66b; type bytetable; };
range { name "l03_bombs_term"; start $a66c; end $a66c; type bytetable; };
range { name "l03_unkn"; start $a66d; end $a684; type bytetable; };
range { name "sfx_electrocution"; start $A52D; end $A53C; type bytetable; };
range { name "dumbwaiter_sprite"; start $a782; end $a78f; type bytetable; comment "the dumbwaiters from level03. stored upside-down. trailing 00's might just be filler."; };
range { name "dw_platform_sprite"; start $A685; end $a68b; type bytetable; comment "horizontally moving platforms from level03"; };
range { name "l04_map"; start $a790; end $a7d4; type bytetable; comment "level map data starts here"; };
range { name "l04_map_bombs"; start $a7d5; end $a805; type bytetable; };
range { name "l04_bombs"; start $a806; end $a825; type bytetable; };
range { name "l04_bombs_term"; start $a826; end $a826; type bytetable; };
range { name "l05_map"; start $aad0; end $ab41; type bytetable; comment "level map data starts here"; };
range { name "l05_map_bombs"; start $ab42; end $ab6c; type bytetable; };
range { name "l05_bombs"; start $ab6d; end $ab88; type bytetable; };
range { name "l05_bombs_term"; start $ab89; end $ab89; type bytetable; };
range { name "l05_map_changes"; start $ab8a; end $ac5f; type bytetable; };
range { name "hellstone_deltas_1"; start $a8fd; end $a91f; type bytetable; comment "dunno, look like movement deltas, referenced by hellstones_sub0"; };
label { name "hellstone_deltas_2"; addr $a905; size 8; comment "dunno, look like movement deltas, referenced by hellstones_sub0"; };
range { name "l06_map"; start $a920; end $a973; type bytetable; };
range { name "l06_map_bombs"; start $a974; end $a9a4; type bytetable; };
range { name "l06_bombs"; start $a9a5; end $a9c4; type bytetable; };
range { name "l06_bombs_term"; start $a9c5; end $a9c5; type bytetable; };
label { name "walls_bomb_sub"; addr $AA73; comment "toggles the center rope between up and down ropes"; };
label { name "walls_init"; addr $A9C6; };
label { name "walls_sub0"; addr $AA3A; };
label { name "walls_sub1"; addr $AA35; };
label { name "walls_sub2"; addr $AA55; };
label { name "walls_sub3"; addr $AABC; };
range { name "l07_map"; start $ac60; end $acb9; type bytetable; };
range { name "l07_map_bombs"; start $acba; end $ace4; type bytetable; };
range { name "l07_bombs"; start $ace5; end $ad00; type bytetable; };
range { name "l07_bombs_term"; start $ad01; end $ad01; type bytetable; };
range { name "l07_map_changes"; start $ad02; end $ad67; type bytetable; };
range { name "zigzag_deltas"; start $adc7; end $addf; type bytetable; comment "kind of a sine wave shape. used for either X or Y delta, depending on the direction the bullet is moving"; };
range { name "l08_map"; start $ade0; end $ae4b; type bytetable; };
range { name "l08_map_bombs"; start $ae4c; end $ae70; type bytetable; };
range { name "l08_bombs"; start $ae71; end $ae88; type bytetable; };
range { name "l08_bombs_term"; start $ae89; end $ae89; type bytetable; };
range { name "l08_unkn0"; start $ae8a; end $ae9a; type bytetable; };
label { name "spellbound_bomb_sub"; addr $AF23; };
label { name "spellbound_init"; addr $AE9B; };
range { name "l09_real_map"; start $b000; end $b0a2; type bytetable; comment "blackout doesn't draw the map initially"; };
#range { name "l09_map"; start $b0a2; end $b0a2; type bytetable; comment "blackout doesn't draw the map initially"; };
#range { name "l09_map_bombs"; start $b072; end $b0a2; type bytetable; };
label { name "l09_map_bombs"; addr $b072; size $21; };
range { name "l09_bombs"; start $b0a3; end $b0c2; type bytetable; };
range { name "l09_bombs_term"; start $b0c3; end $b0c3; type bytetable; };
label { name "l09_map"; addr $b0a2; comment "blackout doesn't draw the map initially"; };
label { name "blackout_bomb_sub"; addr $B121; comment "make sure the user sees the bomb he's just picked up (?). at least 1 pixel of it already has to be visible, for collision detection to work."; };
label { name "blackout_init"; addr $B0C4; comment "sets screen memory to $1000 and draws l09_real_map there. bombs are handled specially as they're blanks in the map."; };
label { name "blackout_sub0"; addr $B140; comment "copies pixels from rendered real map at $1000 to visible screen memory at $3000, centered around jumpman's location"; };
label { name "herethere_sub0"; addr $B27E; };
label { name "herethere_sub3"; addr $B2E0; };
range { name "l10_map"; start $B1E0; end $b236; type bytetable; };
range { name "l10_map_bombs"; start $b237; end $b25b; type bytetable; };
range { name "l10_bombs"; start $b25c; end $b273; type bytetable; };
range { name "l10_bombs_term"; start $b274; end $b274; type bytetable; };
range { name "l10_unkn0"; start $b275; end $b27d; type bytetable; };
label { name "herethere_bomb_sub"; addr $B2FD; };
label { name "hatch_sub0"; addr $B457; };
label { name "hatch_sub1"; addr $B581; };
label { name "hatch_sub3"; addr $B57C; };
range { name "l11_map"; start $B320; end $b38e; type bytetable; };
range { name "l11_map_bombs"; start $B38F; end $B3BC; type bytetable; };
range { name "l11_bombs"; start $B3BD; end $b3da; type bytetable; };
range { name "l11_bombs_term"; start $b3db; end $b3db; type bytetable; };
range { name "l11_map_changes"; start $B3DC; end $b44b; type bytetable; };
label { name "hatch_bomb_sub"; addr $B44C; };
label { name "hurr_sub0"; addr $b691; };
label { name "falling_wind"; addr $B697; comment "wind blows jumpman to the right when he's dying"; };
label { name "hurr_done"; addr $B69A; };
label { name "hurr_sub1"; addr $b69b; };
label { name "hurr_sub2"; addr $B709; };
range { name "l12_map"; start $b590; end $b5d1; type bytetable; };
range { name "l12_map_bombs"; start $b5d2; end $b5fc; type bytetable; };
range { name "l12_bombs"; start $b5fd; end $b618; type bytetable; };
range { name "l12_bombs_term"; start $b619; end $b619; type bytetable; };
range { name "l12_map_changes"; start $b61a; end $b657; type bytetable; };
range { name "l12_unkn0"; start $b658; end $b690; type bytetable; };
range { name "walls_down_rope"; start $aa90; end $aabb; type bytetable; comment "map data for center down-rope, referenced by walls_bomb_sub"; };
range { name "data_aac8"; start $aac8; end $aacf; type bytetable; comment "non-map data, dunno what for. grouped with the level 5 stuff, but doesn't seem to be used by level 5 (as in, playing thru level 5 in the emu with breakpoint 'read>=aac8 read<=aacf' never causes a break!)"; };
label { name "walls_up_rope"; addr $aaa6; comment "map data for center up-rope, referenced walls_bomb_sub"; };
range { name "spellbound_table"; start $aea4; end $af0b; type bytetable; comment "used by spellbound, dunno exactly how yet"; };
label { name "epyx_jumpman"; addr $AEAF; comment "letters for level08, spellbound (not ASCII or screencodes though)"; };
label { name "letter_bitmap"; addr $AEBC; comment "player graphics for letters. each letter is 8x8 (8 bytes, 8px/byte), takes up the whole 8x8 cell (no blanks at edges like a normal font would have). no duplicate letters, so this spells 'JUMPANEYX ' (space at the end)"; };
range { name "bonus_250"; start $AF0C; end $AF1B; type bytetable; comment "the little 250 that gets displayed at end of level, for each letter"; };
range { name "sfx_letter_bonus"; start $AFCB; end $afff; type bytetable; comment "played once per correct letter at end of level08 (spellbound). trailing 00's are filler."; };
label { name "cue_letter_sfx"; addr $AFB9; comment "play sfx_letter_bonus"; };
label { name "stub"; addr $8405; comment "just an RTS"; };
range { name "rotating_colors"; start $85b6; end $85bd; type bytetable; comment "used for color-shifting objects like electrocution, walls, and the bonus counter. every frame, the next one of these is stored in rot_color."; };
label { name "rot_color"; addr $062A; comment "see comment at rotating_colors"; };
label { name "page6_vectors_minus_one"; addr $05ff; comment "1-indexed"; };
label { name "page6_initial_vectors_minus_one"; addr $85dd; comment "1-indexed"; };
range { name "page6_initial_vectors"; start $85de; end $85f5; type addrtable; comment "copied into page 6 by init_hardware"; };
label { name "page6_vectors"; addr $0600; size 24; comment "initialized with page6_initial_vectors"; };
label { name "zigzag_sub0"; addr $AD68; comment "move bullets in ways that defy the laws of physics and common sense"; };
label { name "no_bullet"; addr $8E75; };
label { name "want_bullet"; addr $8E76; comment "create a bullet unless there are already max_bullets of them"; };
label { name "next_bullet_slot"; addr $8E78; };
range { name "movement_direction_table"; start $85be; end $85dd; type wordtable; comment "X/Y movement, indexed by joystick_state << 1, each entry is XXYY, $FF is -1"; };
range { name "get_ready_msg"; start $9714; end $9726; type bytetable; comment "PLAYER GET READY"; };
range { name "pcolor0_table"; start $8B7B; end $8b7f; type bytetable; };
range { name "color0_table"; start $9728; end $972b; type bytetable; comment "background colors for GET READY screen (different for each player)"; };
range { name "color0_table_minus_one"; start $9727; end $9727; type bytetable; comment "1-indexed"; };
range { name "level_gfx"; start $9C21; end $9cff; type bytetable; comment "definitions for level graphics objects aka shapes. (girder segment, ladder, rope, etc)"; };
label { name "sh_girder"; addr $9C33; comment "3 rows of pixels. 1st: 04 = 4 pixels wide, 00 00 = no X/Y offset, 01 01 01 01 = actual pixel data (4 color0 pixels). see level_maps.txt"; };
label { name "sh_black_4x3"; addr $9C49; comment "all the bombs on blackout are drawn as this"; };
label { name "sh_ladder"; addr $9C5F; };
label { name "sh_black_ladder"; addr $9c89; comment "ladder in black pixels, used for erasing ladders"; };
label { name "sh_bomb"; addr $9cb3; };
label { name "sh_up_rope"; addr $9cc9; };
label { name "sh_down_rope"; addr $9cda; };
label { name "sh_black_2x4"; addr $9ceb; comment "not sure where this is used, probably for erasing ropes"; };
range { name "sprite_table"; start $9d00; end $9de5; type bytetable; comment "jumpman's animation frames, 10 bytes per sprite"; };
range { name "feet_table"; start $9de6; end $9dff; type bytetable; comment "jumpman's 'invisible shadow', extends below his feet, in black. Not sure all these bytes are used for this purpose though."; };
range { name "sxf_teleport"; start $b319; end $b31f; type bytetable; comment "referenced by herethere_bomb_sub"; };
range { name "herethere_sprite0"; start $b2a8; end $B2b1; type bytetable; comment "portal animation frames"; };
range { name "herethere_sprite1"; start $b2b2; end $b2bb; type bytetable; };
range { name "herethere_sprite2"; start $b2bc; end $b2c5; type bytetable; };
range { name "herethere_sprite3"; start $b2c6; end $B2cf; type bytetable; };
range { name "portal_x"; start $B2D0; end $B2d7; type bytetable; comment "herethere portal X positions"; };
range { name "portal_y"; start $B2D8; end $B2df; type bytetable; comment "herethere portal Y positions"; };
range { name "hatch_table_b50b"; start $b50b; end $B57b; type bytetable; comment "dunno what this is for yet"; };
range { name "scores_screen_dlist"; start $8C52; end $8C67; type bytetable; comment "a GR.2-ish DL, with DLIs, screen mem at $3000, for player scores screen"; };
label { name "reyalp_msg_minus_one"; addr $8c67; };
label { name "show_reyalp_msg"; addr $8BC0; comment "shows PLAYER (backwards loop)"; };
label { name "reyalp_msg_loop"; addr $8BC2; };
label { name "check_10th"; addr $8BC8; comment "replace 10th char with the ASCII player (user) number"; };
label { name "continue_loop"; addr $8BD5; };
label { name "check_alive"; addr $8BE9; comment "user still has lives left?"; };
label { name "no_cross"; addr $8BEF; };
label { name "what_are_we_waiting_for"; addr $8C39; comment "I *think* we're waiting for the music to finish playing..."; };
label { name "check_falling_1"; addr $9800; comment "called via vector in page 6"; };
label { name "check_falling_2"; addr $8900; comment "called via vector in page 6"; };
label { name "bullet_logic"; addr $8E69; comment "not sure what $0622, $0623 are for yet"; };
label { name "rand_1_to_3"; addr $8E86; comment "A = rand() % 3 + 1; // bullets only come from left, right, or top (never bottom)"; };
label { name "bullet_table_minus_one"; addr $8F42; comment "1-indexed"; };
label { name "start_falling_flag"; addr $0621; comment "reset to 0 every frame, set to 1 when starting to fall"; };
label { name "check_ground"; addr $980E; comment "we're falling, have we hit the ground yet?"; };
label { name "cf_done"; addr $9805; };
label { name "falling_flag"; addr $0623; comment "0 = ok, 1 = falling, 2 = on ground."; };
label { name "jiffy_timer_1"; addr $061A; comment "gets incremented every frame"; };
label { name "jiffy_timer_2"; addr $061B; comment "gets incremented every frame"; };
label { name "jiffy_timer_3_lo"; addr $0619; comment "gets incremented every frame"; };
label { name "jiffy_timer_3_hi"; addr $A2; comment "gets incremented every time 3_lo wraps around to zero"; };
label { name "no_wrap"; addr $841F; };
label { name "sfx_title_v0"; addr $9300; comment "title screen music. only use of 4-part harmony in the game, this and _v1 _v2 _v3."; };
label { name "sfx_title_v1"; addr $9351; };
label { name "sfx_title_v2"; addr $939C; };
label { name "sfx_title_v3"; addr $93D7; };
label { name "skip_space"; addr $9144; comment "don't 'fade-in' the space in the title (offset 7)"; };
label { name "rotate_hue"; addr $9154; comment "the luminance stays the same"; };
label { name "turn_letter_white"; addr $9164; comment "clear the high 2 bits on the letter, in screen memory"; };
label { name "title_dancing"; addr $9172; comment "make jumpmen dance on title screen, called once/frame"; };
label { name "start_dancing"; addr $90BC; comment "set _sub0 to title_dancing"; };
label { name "odd_frame_flag"; addr $061C; comment "a 1-bit frame counter (toggles every frame). possibly unused."; };
label { name "bonus_jiffy_timer"; addr $0626; comment "gets incremented every frame when playing a level, bonus-=100 when this wraps around to 0"; };
label { name "speed_jiffy_timer"; addr $061E; comment "counts 0..initial_speed"; };
label { name "playing_level"; addr $0627; comment "0 = not playing, non-0 = playing"; };
label { name "no_dec_bonus"; addr $848B; };
label { name "add_time_bonus"; addr $8E0F; comment "score += time_bonus;"; };
label { name "lt_64k"; addr $8E27; };
label { name "wait_32_jiffies"; addr $8E3A; comment "533ms ntsc, 640ms pal"; };
label { name "pick_random_music"; addr $8E41; comment "pick random sound effect between 4 and 7"; };
label { name "cue_music"; addr $8F92; comment "setup to play whichever music is in A reg, using 5-byte sfx stuct (a music is a pair of sfx played simultaneously)"; };
label { name "cue_music_jv"; addr $8018; comment "setup to play whichever music is in A reg, using 5-byte sfx stuct"; };
label { name "cue_sfx_jv"; addr $8006; comment "setup to play sfx"; };
label { name "cue_sfx"; addr $8255; comment "setup to play sfx at *sfx_ptr, priority in A"; };
label { name "cue_sfx_lowprior"; addr $8240; comment "if cue_sfx not already in progress, setup to play sfx at (sfx_slot_priority, sfx_lock), priority A"; };
label { name "cue_sfx_lowprior_jv"; addr $8003; comment "if cue_sfx not already in progress, setup to play sfx at (sfx_slot_priority, sfx_lock), priority A"; };
label { name "snd_ptr"; addr $063C; size 2; };
label { name "cue_ok"; addr $8244; size 1; };
label { name "cue_done"; addr $8278; size 1; };
label { name "inc_done"; addr $823F; size 1; };
label { name "wait_3_sec"; addr $8C4A; comment "wait 192 jiffies: 3.2 sec (ntsc), 3.84 sec (pal)"; };
label { name "not_alive"; addr $8BEB; comment "no, show a cross instead of a space"; };
label { name "store_space"; addr $8BE2; comment "$AF is the character to show after the score (space for alive, cross for dead)"; };
range { name "reyalp_msg"; start $8C68; end $8C7a; type bytetable; comment "PLAYER spelled backwards: ' 0 # REYALP '"; };
range { name "scores_msg"; start $8C7b; end $8C81; type bytetable; comment "' SCORES' in color 3"; };
range { name "blank_dlist_8add"; start $8ADD; end $8adf; type bytetable; comment "yet another jump-to-itself empty display list"; };
range { name "blank_dlist_8aeb"; start $8AEB; end $8aed; type bytetable; comment "another jump-to-itself empty display list"; };
range { name "blank_dlist_8c82"; start $8C82; end $8C84; type bytetable; comment "looks like an empty jump-to-itself dlist"; };
label { name "init_game"; addr $9000; comment "called from cart_entry_point routine"; };
label { name "reinit_game"; addr $900C; comment "this entry point doesn't disable start/option keys"; };
label { name "try_to_write_rom"; addr $9022; comment "seems to try to write $FF bytes to ROM that already contains $FF's (it's the solid block character in the font). possibly left over from early development before conversion to cartridge."; };
label { name "setup_select_key_vec"; addr $901b; comment "set select key vector to ask_num_players at $9400, enable select key"; };
label { name "setup_select_key_vec_again"; addr $9517; comment "set select key vector to ask_num_players at $9400, enable select key"; };
label { name "disable_start_opt"; addr $94EC; comment "disable start and option keys"; };
label { name "init_speed"; addr $952a; comment "initialize speed to -1"; };
label { name "wait_for_speed"; addr $952F; comment "wait for keyboard IRQ handler to set a speed <= 8"; };
label { name "speed_to_ascii"; addr $9540; comment "convert to ASCII digit"; };
label { name "add_11_to_x"; addr $953B; comment "11-byte per-user struct?"; };
label { name "struct_user_lives_offsets_minus_one"; addr $8C88; };
label { name "struct_user_lives_offsets"; addr $8C89; comment "lookup table, offset from $713 to lives for indexed user"; };
label { name "show_scores_screen"; addr $8C22; comment "set dlist shadow to scores_screen_dlist"; };
label { name "display_speed"; addr $9542; comment "show it to the user"; };
label { name "speed_value"; addr $06F9; comment "decoded speed (1-8)"; };
label { name "show_player_speed_prompt"; addr $94F9; comment "copy PLAYER #n SPEED? to screen RAM"; };
label { name "psprompt_loop"; addr $94fb; };
range { name "get_ready_dlist"; start $972c; end $973f; type bytetable; comment "112 blank scanlines, then one GR.2 line, loaded from $0742"; };
range { name "score_offsets"; start $8C85; end $8c8c; type bytetable; comment "offsets into screen memory, column 12, rows 2 3 4 5, used by code at $8BEF, loaded in $d3, hi byte in $d4 is $30"; };
label { name "score_screen_dli_sr"; addr $8C8D; comment "used by score screen"; };
label { name "set_score_screen_dli"; addr $8C31; comment "dli = score_screen_dli_sr"; };
range { name "title_screen_data"; start $91cf; end $93ff; type bytetable; comment "title screen data"; };
label { name "title_screen_data_minus_one"; addr $91ce; };
label { name "copy_title_screen"; addr $902A; };
label { name "wait_letters_done"; addr $906E; comment "fade_in_letters increments $9c after every letter, $0e means they're all done (since there are 14 of them and we start counting at zero)"; };
label { name "funky_init_loop"; addr $90C8; comment "lot going on here, not understood yet"; };
label { name "scores_screen"; addr $8B80; comment "show scores, called at end of game, also called after beating level 12 (after WELL DONE). $40 in NMIEN = disable DLI, enable VBI"; };
label { name "ss_loop"; addr $8BA8; comment "number_of_users should be score-1 here."; };
label { name "smsg_loop"; addr $8B91; };
label { name "read_joystick"; addr $84AC; comment "always joystick #1 (all players use the same joystick and pass it around)"; };
label { name "check_joystick_enabled"; addr $84A4; comment "read the joystick if not disabled"; };
label { name "fake_read_trigger"; addr $84CD; comment "??"; };
label { name "read_trigger"; addr $84D3; comment "always joystick #1"; };
label { name "store_joystick_state"; addr $84B1; comment "store bottom 4 bits of PORTA, or 0 if joystick_disabled"; };
label { name "clear_collisions"; addr $850D; };
label { name "update_dlist"; addr $8510; comment "update display list, if there's a new one in the shadow reg"; };
label { name "update_dli_vector"; addr $8523; comment "update DLI vector, if there's a new one in the shadow reg"; };
label { name "setup_get_ready_dl"; addr $964A; comment "06ac/06ad gets address of get_ready_dlist (why not SDLSTL/H?)"; };
label { name "end_of_level_bonus"; addr $B800; };
label { name "keycode_table_minus_one"; addr $9c18; };
range { name "keyboard_isr"; start $9C00; end $9c18; type code; comment "only use of keyboard is to enter player speed(s) before starting game"; };
range { name "keycode_table"; start $9C19; end $9c20; type bytetable; };
#label { name "mul_25_table"; addr $B8A7; size 2; };
label { name "init_hardware"; addr $837c; };
label { name "init_page6_loop"; addr $837e; };
# these are so far only for player 1
label { name "users_still_alive"; addr $06f4; size 1; comment "I *think* that's what this is for."; };
label { name "number_of_users"; addr $06ff; size 1; comment "number of players selected at start of game. also this is score-1, if you see it being 1-indexed with X reg"; };
label { name "level"; addr $06f6; size 1; };
# this stuff is also going to be called work_user (an 11-byte struct)
label { name "score"; addr $0700; size 3; comment "aka work_user, 11 bytes"; };
label { name "next_extra_life"; addr $0703; size 3; comment "initialized to $4c,$1d (aka 7500), 7500 is added whenever an extra life is given"; };
label { name "lives"; addr $070a; size 1; };
label { name "struct_user_1"; addr $070b; comment "11 bytes"; };
label { name "struct_user_2"; addr $0716; comment "11 bytes"; };
label { name "struct_user_3"; addr $0721; comment "11 bytes"; };
label { name "struct_user_4"; addr $072c; comment "11 bytes"; };
label { name "current_user"; addr $06fe; size 1; comment "this ranges 1-4, not 0-3"; };
label { name "current_speed"; addr $0624; size 1; comment "can be modified, e.g. set to $08 when being electrocuted"; };
label { name "initial_speed"; addr $0625; size 1; comment "current user's chosen speed, set at game start"; };
label { name "setup_dli_2"; addr $bc3f; size 1; comment "load dli_service_2 address into dli shadow"; };
label { name "silence_audio"; addr $875B; size 1; comment "set all AUDFx to 0"; };
label { name "sa_loop"; addr $875F; size 1; };
label { name "store_audc"; addr $8DC6; size 1; comment "store A to AUDCx (and its ?shadow?)"; };
label { name "set_prior"; addr $8798; size 1; comment "priority $11: pl0-3, pf0-3, bak (and enable 5th player from the missiles) [redundant? init_set_prior sets this, nothing appears to change it]"; };
label { name "SAVMSC"; addr $58; size 2; comment "OS's idea of the start of screen memory [redundant to set here?]"; };
label { name "set_char_base"; addr $83BB; size 1; comment "use character set at $9e00 aka charset"; };
label { name "set_savmsc"; addr $83E9; size 1; comment "tell OS that screen memory starts at $3000"; };
label { name "position_player_5"; addr $8310; size 1; comment "position the 4 missiles side-by-side"; };
label { name "init_set_prior"; addr $8399; size 1; comment "priority $11: pl0-3, pf0-3, bak (and enable 5th player from the missiles)"; };
label { name "joystick_disabled"; addr $0632; size 1; comment "nonzero = jumpman can't move (title screen or materialization, etc)"; };
label { name "joystick_state"; addr $0633; size 1; comment "last PORTA read (bottom 4 bits), or 0 if joystick_disabled"; };
label { name "trigger_disabled"; addr $0634; size 1; comment "nonzero = jumpman can't jump (he's already jumping, or title screen or materialization, etc)"; };
label { name "trigger_state"; addr $0635; size 1; comment "last TRIG0 read (0 = pressed)"; };
label { name "check_trigger_state"; addr $984D; size 1; comment "did user press the trigger?"; };
label { name "trig_jmp"; addr $9852; size 1; comment "yes, jump to handler"; };
label { name "check_up_down"; addr $9855; size 1; comment "did user move joystick up/down?"; };
label { name "check_up_down_2"; addr $993B; size 1; comment "did user move joystick up/down?"; };
label { name "trigger_handler"; addr $9985; size 1; comment "handle trigger presses, maybe start a jump, if player is moving up, left, or right"; };
label { name "cud_jmp"; addr $9860; size 1; comment "no, jump over handler"; };
label { name "player_delta_x"; addr $0630; size 1; comment "amount to move jumpman this frame (1 or $FF aka -1)"; };
label { name "player_delta_y"; addr $0631; size 1; comment "amount to move jumpman this frame (1 or $FF aka -1)"; };
label { name "dli_vec_shadow_hi"; addr $06AF; size 1; comment "stored in VDSLST if nonzero"; };
label { name "dli_vec_shadow_lo"; addr $06ae; size 1; comment "stored in VDSLST if dli_vec_shadow_hi nonzero"; };
label { name "dlist_shadow_hi"; addr $06AD; size 1; comment "stored in DLISTH if nonzero"; };
label { name "dlist_shadow_lo"; addr $06ac; size 1; comment "stored in DLISTL if dlist_shadow_hi nonzero"; };
label { name "clear_dlist_shadow"; addr $851E; size 1; comment "clear the shadow now that we've updated the HW"; };
label { name "clear_dli_shadow"; addr $8531; size 1; comment "clear the shadow now that we've updated the HW"; };
label { name "enable_dli"; addr $8536; size 1; comment "enable DLI now that we've set up the vector"; };
label { name "enable_keyboard_irq"; addr $8554; size 1; comment "$C0 = regular keypress, break keypress"; };
label { name "silence_console_speaker"; addr $855A; size 1; comment "8 = silent (0 would be a click)"; };
label { name "check_start_key"; addr $8561; size 1; comment "carry set = not pressed, clear = pressed"; };
label { name "check_select_key"; addr $8573; size 1; comment "carry set = not pressed, clear = pressed"; };
label { name "check_option_key"; addr $8580; size 1; comment "carry set = not pressed, clear = pressed"; };
label { name "setup_start_key_vec"; addr $9465; size 1; comment "we'll jump to $94de aka get_player_speeds when start key is pressed"; };
label { name "get_player_speeds"; addr $94de; size 1; comment "loop up to 4 times, ask PLAYER #n SPEED? and wait for number key press"; };
label { name "setup_option_key_vec"; addr $9458; size 1; comment "we'll jump to $9489 aka option_key_handler when option key is pressed"; };
label { name "start_key_vec"; addr $06c4; size 2; comment "vblank_imm_isr jumps thru here if start key pressed"; };
label { name "select_key_vec"; addr $06c2; size 2; comment "vblank_imm_isr jumps thru here if select key pressed"; };
label { name "option_key_vec"; addr $06c0; size 2; comment "vblank_imm_isr jumps thru here if option key pressed"; };
label { name "start_key_enabled"; addr $06C8; size 1; comment "non-zero = jump through start_key_vec if start key pressed (checked by vblank_imm_isr)"; };
label { name "select_key_enabled"; addr $06C7; size 1; comment "non-zero = jump through start_key_vec if start key pressed (checked by vblank_imm_isr)"; };
label { name "option_key_enabled"; addr $06C6; size 1; comment "non-zero = jump through start_key_vec if start key pressed (checked by vblank_imm_isr)"; };
label { name "zp_temp1"; addr $cb; size 2; comment "used for (zp,y) addressing, also for checking console keys in vblank_imm_isr"; };
label { name "zp_temp2"; addr $ae; size 2; comment "used for (zp,y) addressing, also 2 temps for scores_screen"; };
label { name "zp_temp3"; addr $B7; size 1; };
label { name "zp_temp4"; addr $B8; size 1; comment "number of players, used by ask_num_players and option_key_handler. used as a temp elsewhere."; };
label { name "zp_temp5"; addr $B9; size 1; comment "among other things, used for jumpman's dance on title screen"; };
label { name "zp_temp6"; addr $BA; size 1; comment "used for audio freq counter in materialize_jumpman. also used when setting number of players and player speeds."; };
label { name "hang_main_thread"; addr $9486; size 1; comment "initialization done, everything's done in interrupts from here on out"; };
label { name "option_key_handler"; addr $9489; size 1; comment "called via option_key_vec when someone presses option"; };
label { name "level_finished"; addr $8E00; size 1; };
label { name "level_finished_jv"; addr $802D; size 1; };
label { name "decrement_time_bonus"; addr $8DCE; size 1; comment "bonus -= 100, play sfx_bonus_tick"; };
label { name "decrement_time_bonus_jv"; addr $8021; size 1; comment "bonus -= 100;"; };
label { name "check_bonus_0"; addr $8DD7; size 1; comment "don't decrement if bonus == 0"; };
label { name "dec_done"; addr $8DF9; size 1; };
label { name "bonus_lt_256"; addr $8DE7; size 1; };
label { name "set_y"; addr $8F9B; size 1; comment "y = a * 5; // offset into mus_struct_table"; };
label { name "show_level_name"; addr $BA5D; size 1; comment "copy level name into screen RAM"; };
label { name "sync_to_music"; addr $BA71; size 1; comment "level is already drawn with all color regs set to black. for each color reg, wait 1 sec before turning it visible. this syncs up with the music because the music was written to sync with this actually"; };
label { name "wait_1_sec"; addr $BA9E; size 1; comment "actually 64 jiffies, 1.067S ntsc, 1.28s pal"; };
label { name "demo_wait"; addr $B970; size 1; comment "96 jiffies, 1.6s ntsc, 1.92s pal"; };
label { name "demo_show_map"; addr $B99D; size 1; comment "initially, demo_map_ptr points to $A000 (start of level descriptions), Y is $16, or offset to _map0 within level desc."; };
label { name "demo_show_name"; addr $B9AC; };
label { name "demo_next_map"; addr $B9DE; };
label { name "demo_set_colors"; addr $B9EC; comment "demo_map_ptr points to levelXX_desc"; };
label { name "demo_wait_1"; addr $B9C6; comment "approx 2/3 sec"; };
label { name "keep_waiting"; addr $BAA3; size 1; };
label { name "enable_joystick"; addr $8775; size 1; comment "called after level-intro music is finished playing"; };
label { name "enable_joystick_jv"; addr $801B; size 1; comment "called after level-intro music is finished playing"; };
label { name "ej_loop"; addr $8777; size 1; };
label { name "hide_player"; addr $8DB8; size 1; comment "move player selected by X reg minus one off the left edge of the screen"; };
label { name "play_select_key_sfx"; addr $946F; size 1; comment "play sfx_select_key at $95f1"; };
label { name "wait_sfx"; addr $947C; size 1; comment "wait for sound to finish playing"; };
label { name "play_life_bonus_sfx"; addr $B868; size 1; comment "play once per life"; };
label { name "el_hi_ok"; addr $B851; };
label { name "el_wait_sfx"; addr $B875; comment "wait for sfx to finish"; };
label { name "el_delay"; addr $B884; comment "wait approx 1/2 sec"; };
label { name "el_done"; addr $B893; };
label { name "add_life_bonus"; addr $B83B; size 1; };
label { name "sfx_option_pressed"; addr $8ab0; size 1; };
label { name "play_opt_key_sfx"; addr $94BC; size 1; };
label { name "wait_opt_key_sfx"; addr $94CE; size 1; comment "wait until it's done playing"; };
label { name "map_one_bomb_minus_one"; addr $b119; comment "1-indexed"; };
range { name "map_one_bomb"; start $B11A; end $b120; type bytetable; comment "used by blackout, copied to RAM and modified ($00's replaced with actual X and Y coords of bomb)"; };
label { name "block_char_minus_one"; addr $9e0f; size 1; comment "couple of places in the code try to write here"; };
label { name "position_players"; addr $82E9; size 1; comment "X counts down 5..1 (starts at 6, immediately decremented, and loop is done with 0). zp_temp1 is ZP pointer to the current player or missile being written to ($2f00..$2b00, or p3/p2/p1/p0/missiles)."; };
label { name "HPOSP0_minus_two"; addr $CFFE; size 1; };
label { name "position_pm_vert"; addr $8322; size 1; };
label { name "clear_pm"; addr $8342; size 1; comment "write zeroes to unused portion of this player/missile"; };
label { name "position_done"; addr $82E8; size 1; };
label { name "clear_pm_mem"; addr $88A8; size 1; comment "clear P/M memory, called from enable_joystick"; };
label { name "clr_loop"; addr $88AB; size 1; };
label { name "prepare_level"; addr $872A; size 1; comment "misc stuff, called from enable_joystick"; };
label { name "clear_screen_mem"; addr $8714; size 1; comment "clear the gameboard screen memory (called before drawing a level, natch)"; };
label { name "clear_screen_mem_jv"; addr $801E; size 1; comment "clear the gameboard screen memory (called before drawing a level, natch)"; };
label { name "csm_loop"; addr $871F; size 1; };
label { name "dm_obj_to_screen"; addr $80BD; size 1; comment "actually write the object's pixels to screen memory. quite hairy."; };
label { name "unused_vecs"; addr $803F; size 1; comment "3 unused jump vectors, all pointed to the same RTS"; };
label { name "unused_vec_rts"; addr $8048; size 1; comment "unused jump vectors point here"; };
label { name "sfx_bounce_1"; addr $8A4B; size 1; comment "used when jumpman is falling?"; };
range { name "sfx_climb"; start $8a97; end $8abf; type bytetable; comment "climbing up/down a ladder (not ropes)"; };
label { name "sfx_death"; addr $8a60; comment "jumpman hit by bullet or started falling"; };
label { name "play_sfx_climb"; addr $8A80; };
label { name "play_sfx_bounce_1"; addr $899A; };
label { name "falling_bounce"; addr $8983; comment "this looks like it hurts..."; };
label { name "afterlife"; addr $9600; comment "multiple code paths jump here. replay level, load next level, or go back to ask_num_players"; };
range { name "well_done_sub0"; start $bccd; end $bcd8; type code; comment "used in work_level_sub0 slot during well_doneused in work_level_sub1 slot during well_done"; };
label { name "well_done_sub1"; addr $BD52; comment "used in work_level_sub1 slot during well_doneused in work_level_sub1 slot during well_done"; };
label { name "wds1_cont"; addr $BD58; comment "we seem to be setting/clearing bit 7 in the display list, moving the line(s) where DLI(s) occur."; };
label { name "wds1_finish"; addr $BD81; comment "set things up for the next level?"; };
label { name "crumble_gameboard"; addr $8D00; comment "just lost your last life"; };
label { name "crumble_gameboard_jv"; addr $8030; comment "just lost your last life"; };
label { name "cgb_audc"; addr $8D05; comment "$86 = distortion 8, volume 6"; };
label { name "shake_screen"; addr $8D08; comment "store random N-blank-lines instruction at head of display list"; };
label { name "crumble_sound"; addr $8D16; comment "random frequency"; };
label { name "rand_0c"; addr $8D19; comment "get random number 0 to 12"; };
label { name "init_struct_users"; addr $9A5C; comment "work_user and struct_user_{1..4}, 11 * 5 (55 aka $37) bytes"; };
label { name "init_struct_users_jv"; addr $8024; };
label { name "isu_next_su"; addr $9A5E; };
label { name "isu_next_byte"; addr $9A60; };
range { name "struct_users_init_contents"; start $9A71; end $9a7b; type bytetable; comment "work_user and struct_user_1 to _4 are initialized to this"; };
range { name "extra_life_points"; start $8CFD; end $8CFF; type bytetable; comment "3 bytes, value 7500 decimal, give an extra life after this many points. not copied to RAM, meaning no level can change this."; };
label { name "chk_next_byte"; addr $8CBE; comment "number_of_users should be score-1 here. score+2 should be next_extra_life-1 also."; };
label { name "chk_done"; addr $8CFA; };
label { name "add_extra_life"; addr $8CCE; comment "first, calculate & store the next 7500-point target"; };
label { name "add_next_byte"; addr $8CD1; };
label { name "score_byte_ge"; addr $8CCB; comment "if it's greater or equal and X!=0, keep looping"; };
label { name "inc_lives"; addr $8CE4; comment "add 1 life, play sfx_extra_life"; };
label { name "show_lives_icons"; addr $86BB; comment "up to 6 jumpmen, and a + if lives > 6. char $C1 = jumpman icon, $CB = plus sign"; };
label { name "show_current_player"; addr $86A7; comment "1 to 4"; };
label { name "update_status_window"; addr $8694; comment "bottom 2 GR.1 lines on the game board"; };
label { name "update_status_window_jv"; addr $8012; comment "bottom 2 GR.1 lines on the game board"; };
label { name "setup_gameboard_dlist"; addr $9B00; comment "for some reason there are 2 copies of the display list, at $0800 and $0881"; };
label { name "setup_gameboard_dlist_jv"; addr $8015; comment "for some reason there are 2 copies of the display list, at $0800 and $0881"; };
label { name "print_number"; addr $8600; comment "convert the 3-byte integer stored at num_in to screen codes, store into memory pointed to by num_out. num_in is modified."; };
label { name "print_number_jv"; addr $8009; comment "convert the 3-byte integer stored at num_in to screen codes, store into memory pointed to by num_out"; };
label { name "num_tmp"; addr $0665; size 1; comment "temp used by print_number"; };
label { name "num_in"; addr $D0; size 3; comment "print_number input. 3-byte number (LSB first as usual) to be printed"; };
label { name "num_out"; addr $D3; size 2; comment "area of (screen) memory where print_number stores its output"; };
label { name "num_color"; addr $D5; size 1; comment "print_number adds this to numeric screencode output. normally 0, set to $80 on the end-of-game screen."; };
label { name "bomb_idx"; addr $B2; size 1; comment "bomb that was just picked up (times 2, suitable for index into a table of words)"; };
label { name "print_bonus"; addr $867E; comment "print remaining bonus time; work_level_points_per_bomb should read work_level_time_bonus-1"; };
label { name "print_bonus_jv"; addr $800F; comment "print remaining bonus time"; };
label { name "pnum_done"; addr $8667; };
label { name "next_digit"; addr $8607; comment "starts at 0, gets added to"; };
label { name "print_score"; addr $8668; };
label { name "ps_loop"; addr $8672; comment "number_of_users should be score-1 here."; };
label { name "pb_loop"; addr $8688; };
label { name "draw_map"; addr $8049; comment "the entry point for parsing the level map and drawing graphics from it. see level_maps.txt. caller must set $C0/$C1 to the address of the map data. modders beware: bogus map data can & will cause infinite loops."; };
label { name "draw_map_jv"; addr $8000; comment "the entry point for parsing the level map and drawing graphics from it. see level_maps.txt."; };
label { name "dm_get_opcode"; addr $804B; comment "$C0/$C1 points to $A300 (level01_desc) on the first call"; };
label { name "dm_switch_opcode"; addr $804D; comment "map opcodes: $FC = jump, $FF = end, $FD = set drawing direction, $FE = select graphics object"; };
label { name "dm_draw_gfx"; addr $8090; comment "handle gfx_draw opcode"; };
label { name "dm_jump"; addr $805C; comment "handle gfx_jump opcode"; };
label { name "dm_delta"; addr $806B; comment "handle gfx_delta opcode"; };
label { name "dm_obj"; addr $8083; comment "handle gfx_object opcode"; };
label { name "dm_fallthru"; addr $805B; comment "handle gfx_end opcode"; };
label { name "dm_next_opcode"; addr $8075; comment "all the other opcode handlers jump here"; };
label { name "dm_progctr"; addr $C0; size 2; comment "see draw_map and level_maps.txt"; };
label { name "dm_delta_x"; addr $C9; size 1; comment "see draw_map and level_maps.txt"; };
label { name "dm_delta_y"; addr $CA; size 1; comment "see draw_map and level_maps.txt"; };
label { name "dm_objptr"; addr $C2; size 2; comment "see draw_map and level_maps.txt"; };
label { name "dm_xpos"; addr $55; size 1; comment "see draw_map and level_maps.txt"; };
label { name "dm_ypos"; addr $54; size 1; comment "see draw_map and level_maps.txt"; };
label { name "dm_length"; addr $BF; size 1; comment "see draw_map and level_maps.txt"; };
label { name "dm_draw_loop"; addr $809C; size 1; comment "loop 'dm_length' times"; };
label { name "dm_draw_obj"; addr $80B4; size 1; comment "draw current object at current x/y position"; };
label { name "dm_draw_obj_loop"; addr $80B6; size 1; comment "object definition ends with $FF"; };
label { name "dm_count"; addr $BE; size 1; comment "graphics object definition is this long"; };
label { name "dm_x_with_offset"; addr $C6; size 1; comment "graphics object X offset, plus dm_xpos"; };
label { name "dm_y_with_offset"; addr $C7; size 1; comment "graphics object Y offset, plus dm_xpos"; };
label { name "dm_screen_addr"; addr $C4; size 2; comment "points to byte to write gfx data to"; };
label { name "calc_screen_addr"; addr $80D0; size 1; comment "calculate 40 * dm_y_with_offset + dm_x_with_offset + screen mem address, store in dm_screen_addr"; };
label { name "sa_hi_ok_1"; addr $80FD; size 1; };
label { name "mul40_loop"; addr $80DA; size 1; };
label { name "mul40_no_add"; addr $80E1; size 1; };
label { name "calc_pixels"; addr $8107; size 1; };
label { name "sa_hi_ok_2"; addr $813C; size 1; };
label { name "sa_tmp_1"; addr $BD; size 1; comment "used by calc_screen_addr"; };
label { name "sa_tmp_2"; addr $C8; size 1; comment "used by calc_screen_addr"; };
label { name "store_rts"; addr $83B6; comment "store an RTS at $06E6, which will get JSR'ed to by unused level subroutines"; };
label { name "well_done_screen"; addr $BC00; comment "the WELL DONE screen, when you beat all the levels. after this, the game plays random levels."; };
label { name "cue_woop_sound"; addr $B4D3; };
label { name "sfx_woop"; addr $B564; };
label { name "got_all_bombs"; addr $9766; };
label { name "call_eol_sub"; addr $976C; };
label { name "player_new_x"; addr $067C; comment "HPOSxx, 1-indexed, $067d thru $0681 are p5, p3..p0"; };
label { name "player_x"; addr $068B; comment "HPOSxx, $068c thru $06c0"; };
label { name "player_new_y"; addr $0686; comment "$0687 thru $069b"; };
label { name "player_y"; addr $0695; comment "vertical positions, actually $0696 thru $069a"; };
label { name "player_height"; addr $0677; comment "actually $0677 thru $067b"; };
label { name "player_enabled"; addr $0668; comment "1 = draw this player, 0 = no. actually $0669 thru $066e"; };
label { name "tmp_sprite"; addr $CD; size 2; comment "ZP pointer to player/missile data (e.g. jumpman's 10-byte animation frames)"; };
label { name "tmp_sprite_height"; addr $CF; size 1; comment "length of data pointed to by tmp_sprite"; };
label { name "copy_pm_data"; addr $8370; comment "write to P/M memory"; };
label { name "adj_ptr"; addr $835F; comment "adjust pointer if Y wraps around"; };
# end of main.info, everything below here is generated by mklevelinfo.pl
|