aboutsummaryrefslogtreecommitdiff
path: root/jumpmanjr.info
blob: 0589e618e39fcf8c30d51c943e1a4d4eda093706 (plain)
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
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
### GENERATED FILE, do not edit, edit main.info and mklevelinfo.pl instead


# da65 info file for jumpman junior ROM.

GLOBAL {
	OUTPUTNAME "jumpmanjr.dasm";
	INPUTNAME  "jumpmanjr.rom";
	STARTADDR  $8000;
	CPU        "6502";
	COMMENTS   4;
};

#SEGMENT { START $8000; END $BFFF; NAME "jumpmanjr"; };

ASMINC { FILE "jumpmanjr.inc"; };

# RANGE { START $whatever; END $whatever; TYPE Code|ByteTable|AddrTable|RtsTable; }

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_level_desc_2"; addr $9677; comment "copy level descriptor to $0780"; };
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 $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 "update_score_display"; addr $8CBC; comment "also adds extra life every 7500 points"; };
label { name "update_score_display_jv"; addr $800C; comment "also 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 "epyx_jumpman"; addr $AEAF; comment "letters for level08, spellbound (not ASCII or screencodes though)"; };

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 "zero_filler_9a48"; addr $9a48; };
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 "FR1"; addr $00e0; size 6; };
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 "missiles_mask_table_minus_one"; addr $82df; };
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_mask_table"; start $82e0; end $82E7; type bytetable; };
range { name "missiles_done"; start $82DD; end $82df; type code; };
range { name "position_missiles"; start $8293; end $82DA; type code; };
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 "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_player"; 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 "data_8dfa"; start $8DFA; end $8DFF; type bytetable; };
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 4; 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"; 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_len_or_tempo"; 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_len_or_tempo"; 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_len_or_tempo"; 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_len_or_tempo"; 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_len_or_tempo"; 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_len_or_tempo"; 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_len_or_tempo"; 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_len_or_tempo"; 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_len_or_tempo"; 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_len_or_tempo"; 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_len_or_tempo"; 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_len_or_tempo"; 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 "sfx_tempo_tmp"; addr $0661; comment "??"; };
label { name "sfx_slot_curpos"; addr $064E; size 2; comment "address we've got to so far, playing this sfx"; };
label { name "sfx_slot_tempo"; addr $063E; size 1; comment "tempo of this sfx"; };
label { name "sfx_lock"; addr $062F; size 1; comment "lets other code know cue_sfx is still running? not 100% sure"; };
label { name "inc_sfx_pos"; addr $8231; size 1; comment "point to next byte in current sfx slot indexed by X"; };
label { name "sfx_finished"; addr $8226; size 1; comment "done playing this sfx, free up the slot, X-indexed"; };
label { name "sfx_next_note"; addr $817D; size 1; };
label { name "sfx_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_sfx_slot"; addr $815F; size 1; };
label { name "sfx_exit"; addr $815E; size 1; };
label { name "is_slot_active"; addr $8163; size 1; comment "skip it, if slot is inactive"; };
label { name "sfx_slot_timer"; addr $063F; size 1; };
label { name "sfx_slot_duration"; addr $0646; size 1; };
label { name "sfx_play_note"; addr $8206; size 1; comment "y==0, a>=4 on entry"; };
label { name "sfx_play_rest"; addr $819E; size 1; comment "y==0 on entry"; };
label { name "sfx_change_tempo"; addr $81AE; size 1; comment "y==0 on entry"; };
label { name "sfx_jump_opcode"; addr $81C8; size 1; comment "I *think* this jumps to a different sfx address..."; };
label { name "sfx_slot_freq"; 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 $BFF9; type bytetable; comment "funeral march bass"; };
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 "title_screen_color_snd"; addr $913c; comment "rotate colors and play the descending tone as the letters appear on the title screen"; };
label { name "ts_setup_sub0"; addr $905f; comment "set work_level_sub0 to title_screen_color_snd"; };
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_player_dead"; addr $9AD2; };
label { name "check_lives"; addr $9AE5; comment "if player hasn't been eliminated, but is out of lives, eliminate him"; };
label { name "player_alive"; addr $9AF5; comment "found the next player that isn't dead"; };
label { name "load_struct_player"; addr $9A9B; };
label { name "lsp_loop"; addr $9A9D; };
label { name "ssp_loop"; addr $9A8E; };
label { name "look_for_alive"; addr $9ACB; };
label { name "next_player_num"; addr $9AB8; comment "wraparound to 1 if > total players"; };
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_player_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 "numplayer_screen_data_minus_one"; addr $959a; comment "1-indexed loop copies from here+1"; };
range { name "numplayer_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 "data_table_86da"; start $86da; end $8713; type bytetable; };
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 "zero_filler_b8bf"; start $b8bf; end $b96a; type bytetable; };
range { name "zero_filler_b7f1"; start $B7F1; end $B7FF; type bytetable; };
range { name "zero_filler_9bcc"; start $9bcc; end $9bcf; type bytetable; };
range { name "zero_filler_baab"; start $baab; end $babb; type bytetable; };
range { name "zero_filler_97f0"; start $97F0; end $97FF; type bytetable; };
range { name "zero_filler_8d97"; start $8D97; end $8D9F; type bytetable; };
range { name "zero_filler_8cb4"; start $8cb4; end $8cbb; type bytetable; };
range { name "zero_filler_8b00"; start $8b00; end $8b22; type bytetable; };
range { name "zero_filler_8aee"; start $8aee; end $8afd; type bytetable; };
range { name "zero_filler_88f9"; start $88F9; end $88FF; type bytetable; };
range { name "zero_filler_88be"; start $88BE; end $88C7; type bytetable; };
range { name "zero_filler_9bff"; start $9bff; end $9bff; type bytetable; };
range { name "zero_filler_8e67"; start $8e67; end $8e68; type bytetable; };
range { name "zero_filler_8dcd"; start $8dcd; end $8dcd; type bytetable; };
range { name "code_bccd"; start $bccd; end $bcd8; type code; comment "dunno, but referenced by code at $BC6A (part of well_done_screen)"; };
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)"; };
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 "zero_filler_8588"; start $B588; end $B58f; type bytetable; };
#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 "zero_filler_a3d6"; start $a3d6; end $a3df; type bytetable; comment "probably just filler"; };

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 "data_a542"; start $A542; end $A5EF; type bytetable; comment "dunno, 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_player"; 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_player"; 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 "data_table_a8fd"; start $a8fd; end $a91f; type bytetable; comment "dunno, referenced 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 "data_table_adc7"; start $adc7; end $addf; type bytetable; comment "dunno, referenced by routines at $AD9E and $ADB5"; };
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; };
label { name "blackout_init"; addr $B0C4; };
label { name "blackout_sub0"; addr $B140; };

label { name "herethere_sub0"; addr $B27E; };
label { name "herethere_sub3"; addr $B2E0; };
range { name "zero_filler_b1df"; start $b1df; end $b1df; type bytetable; };
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 "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"; };
label { name "walls_up_rope"; addr $aaa6; comment "map data for center up-rope, referenced walls_bomb_sub"; };
range { name "data_table_aea4"; start $aea4; end $af0f; type bytetable; comment "dunno"; };
range { name "sfx_letter_bonus"; start $AFCB; end $afff; type bytetable; comment "played once per correct letter at end of level08 (spellbound)"; };
label { name "cue_letter_sfx"; addr $AFB9; comment "play sfx_letter_bonus"; };
label { name "stub"; addr $8405; comment "just an RTS"; };
range { name "data_table_85b6"; start $85b6; end $85bd; type bytetable; comment "used in vblank_imm_isr, not sure for what yet"; };
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 "zero_filler_85f6"; start $85f6; end $85ff; type bytetable; comment "probably just filler"; };
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; };
range { name "color0_table_minus_one"; start $9727; end $9727; type bytetable; };
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_blank_4x4"; addr $9C49; };
label { name "sh_ladder"; addr $9C5F; };
label { name "sh_9c89"; addr $9c89; comment "dunno, solid black shape"; };
label { name "sh_bomb"; addr $9cb3; };
label { name "sh_up_rope"; addr $9cc9; };
label { name "sh_down_rope"; addr $9cda; };
label { name "sh_9ceb"; addr $9ceb; comment "dunno, solid black shape"; };
range { name "sprite_table"; start $9d00; end $9dff; type bytetable; comment "jumpman's animation frames and other sprites, seem to be 10 bytes per sprite"; };
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 number"; };
label { name "continue_loop"; addr $8BD5; };
label { name "check_alive"; addr $8BE9; comment "player 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 "falling_flag"; addr $0621; comment "1 = falling, reset to 0 when jumpman hits the 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 "bonus_jiffy_timer"; addr $0626; comment "gets incremented every frame when playing a level, bonus-=100 when this reaches 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, tempo (?) A"; };
label { name "cue_sfx_lowprior"; addr $8240; comment "if cue_sfx not already in progress, setup to play sfx at (sfx_slot_tempo, sfx_lock) tempo (?) A"; };
label { name "cue_sfx_lowprior_jv"; addr $8003; comment "if cue_sfx not already in progress, setup to play sfx at (sfx_slot_tempo, sfx_lock) tempo (?) A"; };
label { name "sfx_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-player struct?"; };
label { name "struct_player_lives_offsets_minus_one"; addr $8C88; };
label { name "struct_player_lives_offsets"; addr $8C89; comment "lookup table, offset from $713 to lives for indexed player"; };
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_until_9c_is_0e"; addr $906E; comment "some ISR is writing to $9c..."; };
label { name "funky_init_loop"; addr $90C8; comment "lot going on here, not understood yet"; };
label { name "player_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 "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 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 "number_of_players"; addr $06f4; size 1; comment "0 for single-player game, otherwise range 1-3 (2 to 4 players)"; };
label { name "score_minus_one"; addr $06ff; size 1; };
label { name "score"; addr $0700; size 3; };
label { name "level"; addr $06f6; size 1; };
label { name "lives"; addr $070a; size 1; };
label { name "current_player"; addr $06fe; size 1; comment "*think* this ranges 1-4, not 0-3"; };
label { name "player_speed"; addr $0624; size 1; };
label { name "initial_speed"; addr $0625; size 1; };
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 "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;"; };
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 "wait_1_sec_2"; addr $B970; size 1; comment "actually 64 jiffies, 1.067S ntsc, 1.28s pal"; };
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 "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"; };
range { name "map_b11a"; start $B11A; end $b120; type bytetable; comment "dunno what this is for yet"; };
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"; };
label { name "code_bd52"; addr $BD52; comment "referenced by code at $BC83"; };
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 "init_page_7"; addr $9A5C; };
label { name "init_page_7_jv"; addr $8024; };
range { name "data_9a71"; start $9A71; end $9a7b; type bytetable; comment "used by code above"; };
range { name "data_af10"; start $AF10; end $AF1B; type bytetable; comment "looks almost like code but it's bogus"; };
range { name "l_equals"; start $8CFD; end $8CFF; type bytetable; comment "L= (for lives display)"; };
label { name "add_extra_life"; addr $8CE4; comment "plays sfx_extra_life"; };
label { name "show_l_equals"; addr $8CCE; comment "L= (for lives display)"; };
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"; };
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 "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; };
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 "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; };

# end of main.info, everything below here is generated by mklevelinfo.pl
label { name "work_level_desc"; addr $0780; size 2; comment "first 2 bytes are level number in screencodes"; };
label { name "work_level_sub0"; addr $0782; size 2; comment "a subroutine"; };
label { name "work_level_sub1"; addr $0784; size 2; comment "a subroutine"; };
label { name "work_level_sub2"; addr $0786; size 2; comment "a subroutine"; };
label { name "work_level_sub3"; addr $0788; size 2; comment "a subroutine"; };
label { name "work_level_num_bombs"; addr $078a; size 1; comment "number of bombs to pick up on this level"; };
label { name "work_level_bullet_max"; addr $078b; size 1; comment "0 = no bullets, range 0-4."; };
label { name "work_level_y_start"; addr $078c; size 1; comment "jumpman starting Y position"; };
label { name "work_level_x_start"; addr $078d; size 1; comment "jumpman starting X position"; };
label { name "work_level_fudge_x"; addr $078e; size 1; comment "fudge factor for bomb locations, always $00"; };
label { name "work_level_fudge_y"; addr $078f; size 1; comment "fudge factor for bomb locations, always $06"; };
label { name "work_level_points_per_bomb"; addr $0790; size 1; comment "points awarded per bomb pickup (always $64 aka 100)"; };
label { name "work_level_time_bonus"; addr $0791; size 2; comment "amount of time bonus at start of level"; };
label { name "work_level_offs_19"; addr $0793; size 1; comment "always $00"; };
label { name "work_level_unkn_table0"; addr $0794; size 2; comment "pointer to ROM table or $06xx"; };
label { name "work_level_map"; addr $0796; size 2; comment "used to draw the level initially (see also map_changes)"; };
label { name "work_level_map_bombs"; addr $0798; size 2; comment "start of bombs in map data (which must come last!)"; };
label { name "work_level_bomblist"; addr $079a; size 2; comment "addr of list of bombs, indexed by player position on coarse 8x8 grid. 2 bytes each, 1st is coarse-grid position, 2nd is: hi 4 bits = change_map index, lo 4 = indirect sub (unused). terminated by $FF."; };
label { name "work_level_map_changes"; addr $079c; size 2; comment "address of list of addresses of map data, used for changing the map when certain bombs are picked up"; };
label { name "work_level_indirect_subs"; addr $079e; size 2; comment "pointer to list of indirect subs, always $0000 in this game"; };
label { name "work_level_sub_bomb"; addr $07a0; size 2; comment "called when a bomb is picked up. $06E6 for most levels (just an RTS), or else a ROM subroutine"; };
label { name "work_level_init"; addr $07a2; size 2; comment "called at start of level, $06E6 for some levels, or else a ROM subroutine"; };
label { name "work_level_sub6"; addr $07a4; size 2; comment "always $9740 aka game_main_loop"; };
label { name "work_level_sub_eol"; addr $07a6; size 2; comment "called at end of level (all bombs picked up). $06E6 for all but level08"; };
label { name "work_level_offs_40"; addr $07a8; size 6; comment "all zeroes"; };
label { name "work_level_colpf3"; addr $07ae; size 1; comment "color (not sure what gets drawn in this color yet)"; };
label { name "work_level_colpf0"; addr $07af; size 1; comment "color for girders and up-ropes"; };
label { name "work_level_colpf1"; addr $07b0; size 1; comment "color for ladders and down-ropes"; };
label { name "work_level_colpf2"; addr $07b1; size 1; comment "color for bombs"; };
label { name "work_level_offs_50"; addr $07b2; size 5; comment "unknown"; };
label { name "work_level_offs_55"; addr $07b7; size 3; comment "unknown, always $00 $00 $00"; };
label { name "work_level_offs_58"; addr $07ba; size 2; comment "unknown, not a ROM address"; };
label { name "work_level_offs_60"; addr $07bc; size 4; comment "unknown, level06 (walls) has $ff $ff $ff $ff, all others $00 $00 $00 $00"; };

label { name "cur_level_desc"; addr $07c0; size 2; comment "first 2 bytes are level number in screencodes"; };
label { name "cur_level_sub0"; addr $07c2; size 2; comment "a subroutine"; };
label { name "cur_level_sub1"; addr $07c4; size 2; comment "a subroutine"; };
label { name "cur_level_sub2"; addr $07c6; size 2; comment "a subroutine"; };
label { name "cur_level_sub3"; addr $07c8; size 2; comment "a subroutine"; };
label { name "cur_level_num_bombs"; addr $07ca; size 1; comment "number of bombs to pick up on this level"; };
label { name "cur_level_bullet_max"; addr $07cb; size 1; comment "0 = no bullets, range 0-4."; };
label { name "cur_level_y_start"; addr $07cc; size 1; comment "jumpman starting Y position"; };
label { name "cur_level_x_start"; addr $07cd; size 1; comment "jumpman starting X position"; };
label { name "cur_level_fudge_x"; addr $07ce; size 1; comment "fudge factor for bomb locations, always $00"; };
label { name "cur_level_fudge_y"; addr $07cf; size 1; comment "fudge factor for bomb locations, always $06"; };
label { name "cur_level_points_per_bomb"; addr $07d0; size 1; comment "points awarded per bomb pickup (always $64 aka 100)"; };
label { name "cur_level_time_bonus"; addr $07d1; size 2; comment "amount of time bonus at start of level"; };
label { name "cur_level_offs_19"; addr $07d3; size 1; comment "always $00"; };
label { name "cur_level_unkn_table0"; addr $07d4; size 2; comment "pointer to ROM table or $06xx"; };
label { name "cur_level_map"; addr $07d6; size 2; comment "used to draw the level initially (see also map_changes)"; };
label { name "cur_level_map_bombs"; addr $07d8; size 2; comment "start of bombs in map data (which must come last!)"; };
label { name "cur_level_bomblist"; addr $07da; size 2; comment "addr of list of bombs, indexed by player position on coarse 8x8 grid. 2 bytes each, 1st is coarse-grid position, 2nd is: hi 4 bits = change_map index, lo 4 = indirect sub (unused). terminated by $FF."; };
label { name "cur_level_map_changes"; addr $07dc; size 2; comment "address of list of addresses of map data, used for changing the map when certain bombs are picked up"; };
label { name "cur_level_indirect_subs"; addr $07de; size 2; comment "pointer to list of indirect subs, always $0000 in this game"; };
label { name "cur_level_sub_bomb"; addr $07e0; size 2; comment "called when a bomb is picked up. $06E6 for most levels (just an RTS), or else a ROM subroutine"; };
label { name "cur_level_init"; addr $07e2; size 2; comment "called at start of level, $06E6 for some levels, or else a ROM subroutine"; };
label { name "cur_level_sub6"; addr $07e4; size 2; comment "always $9740 aka game_main_loop"; };
label { name "cur_level_sub_eol"; addr $07e6; size 2; comment "called at end of level (all bombs picked up). $06E6 for all but level08"; };
label { name "cur_level_offs_40"; addr $07e8; size 6; comment "all zeroes"; };
label { name "cur_level_colpf3"; addr $07ee; size 1; comment "color (not sure what gets drawn in this color yet)"; };
label { name "cur_level_colpf0"; addr $07ef; size 1; comment "color for girders and up-ropes"; };
label { name "cur_level_colpf1"; addr $07f0; size 1; comment "color for ladders and down-ropes"; };
label { name "cur_level_colpf2"; addr $07f1; size 1; comment "color for bombs"; };
label { name "cur_level_offs_50"; addr $07f2; size 5; comment "unknown"; };
label { name "cur_level_offs_55"; addr $07f7; size 3; comment "unknown, always $00 $00 $00"; };
label { name "cur_level_offs_58"; addr $07fa; size 2; comment "unknown, not a ROM address"; };
label { name "cur_level_offs_60"; addr $07fc; size 4; comment "unknown, level06 (walls) has $ff $ff $ff $ff, all others $00 $00 $00 $00"; };

range { name "level01_desc"; start $a000; end $a001; type bytetable; comment "64-byte level descriptors, 12 of them (1 per level). Descriptor for Nothing To It. first 2 bytes are level number in screencodes"; };
range { name "level01_sub0"; start $a002; end $a003; type addrtable; comment "a subroutine"; };
range { name "level01_sub1"; start $a004; end $a005; type addrtable; comment "a subroutine"; };
range { name "level01_sub2"; start $a006; end $a007; type addrtable; comment "a subroutine"; };
range { name "level01_sub3"; start $a008; end $a009; type addrtable; comment "a subroutine"; };
range { name "level01_num_bombs"; start $a00a; end $a00a; type bytetable; comment "number of bombs to pick up on this level"; };
range { name "level01_bullet_max"; start $a00b; end $a00b; type bytetable; comment "0 = no bullets, range 0-4."; };
range { name "level01_y_start"; start $a00c; end $a00c; type bytetable; comment "jumpman starting Y position"; };
range { name "level01_x_start"; start $a00d; end $a00d; type bytetable; comment "jumpman starting X position"; };
range { name "level01_fudge_x"; start $a00e; end $a00e; type bytetable; comment "fudge factor for bomb locations, always $00"; };
range { name "level01_fudge_y"; start $a00f; end $a00f; type bytetable; comment "fudge factor for bomb locations, always $06"; };
range { name "level01_points_per_bomb"; start $a010; end $a010; type bytetable; comment "points awarded per bomb pickup (always $64 aka 100)"; };
range { name "level01_time_bonus"; start $a011; end $a012; type wordtable; comment "amount of time bonus at start of level"; };
range { name "level01_offs_19"; start $a013; end $a013; type bytetable; comment "always $00"; };
range { name "level01_unkn_table0"; start $a014; end $a015; type addrtable; comment "pointer to ROM table or $06xx"; };
range { name "level01_map"; start $a016; end $a017; type addrtable; comment "used to draw the level initially (see also map_changes)"; };
range { name "level01_map_bombs"; start $a018; end $a019; type addrtable; comment "start of bombs in map data (which must come last!)"; };
range { name "level01_bomblist"; start $a01a; end $a01b; type addrtable; comment "addr of list of bombs, indexed by player position on coarse 8x8 grid. 2 bytes each, 1st is coarse-grid position, 2nd is: hi 4 bits = change_map index, lo 4 = indirect sub (unused). terminated by $FF."; };
range { name "level01_map_changes"; start $a01c; end $a01d; type addrtable; comment "address of list of addresses of map data, used for changing the map when certain bombs are picked up"; };
range { name "level01_indirect_subs"; start $a01e; end $a01f; type bytetable; comment "pointer to list of indirect subs, always $0000 in this game"; };
range { name "level01_sub_bomb"; start $a020; end $a021; type addrtable; comment "called when a bomb is picked up. $06E6 for most levels (just an RTS), or else a ROM subroutine"; };
range { name "level01_init"; start $a022; end $a023; type addrtable; comment "called at start of level, $06E6 for some levels, or else a ROM subroutine"; };
range { name "level01_sub6"; start $a024; end $a025; type addrtable; comment "always $9740 aka game_main_loop"; };
range { name "level01_sub_eol"; start $a026; end $a027; type addrtable; comment "called at end of level (all bombs picked up). $06E6 for all but level08"; };
range { name "level01_offs_40"; start $a028; end $a02d; type bytetable; comment "all zeroes"; };
range { name "level01_colpf3"; start $a02e; end $a02e; type bytetable; comment "color (not sure what gets drawn in this color yet)"; };
range { name "level01_colpf0"; start $a02f; end $a02f; type bytetable; comment "color for girders and up-ropes"; };
range { name "level01_colpf1"; start $a030; end $a030; type bytetable; comment "color for ladders and down-ropes"; };
range { name "level01_colpf2"; start $a031; end $a031; type bytetable; comment "color for bombs"; };
range { name "level01_offs_50"; start $a032; end $a036; type bytetable; comment "unknown"; };
range { name "level01_offs_55"; start $a037; end $a039; type bytetable; comment "unknown, always $00 $00 $00"; };
range { name "level01_offs_58"; start $a03a; end $a03b; type bytetable; comment "unknown, not a ROM address"; };
range { name "level01_offs_60"; start $a03c; end $a03f; type bytetable; comment "unknown, level06 (walls) has $ff $ff $ff $ff, all others $00 $00 $00 $00"; };

range { name "level02_desc"; start $a040; end $a041; type bytetable; comment "Descriptor for Electrocution. first 2 bytes are level number in screencodes"; };
range { name "level02_sub0"; start $a042; end $a043; type addrtable; comment "a subroutine"; };
range { name "level02_sub1"; start $a044; end $a045; type addrtable; comment "a subroutine"; };
range { name "level02_sub2"; start $a046; end $a047; type addrtable; comment "a subroutine"; };
range { name "level02_sub3"; start $a048; end $a049; type addrtable; comment "a subroutine"; };
range { name "level02_num_bombs"; start $a04a; end $a04a; type bytetable; comment "number of bombs to pick up on this level"; };
range { name "level02_bullet_max"; start $a04b; end $a04b; type bytetable; comment "0 = no bullets, range 0-4."; };
range { name "level02_y_start"; start $a04c; end $a04c; type bytetable; comment "jumpman starting Y position"; };
range { name "level02_x_start"; start $a04d; end $a04d; type bytetable; comment "jumpman starting X position"; };
range { name "level02_fudge_x"; start $a04e; end $a04e; type bytetable; comment "fudge factor for bomb locations, always $00"; };
range { name "level02_fudge_y"; start $a04f; end $a04f; type bytetable; comment "fudge factor for bomb locations, always $06"; };
range { name "level02_points_per_bomb"; start $a050; end $a050; type bytetable; comment "points awarded per bomb pickup (always $64 aka 100)"; };
range { name "level02_time_bonus"; start $a051; end $a052; type wordtable; comment "amount of time bonus at start of level"; };
range { name "level02_offs_19"; start $a053; end $a053; type bytetable; comment "always $00"; };
range { name "level02_unkn_table0"; start $a054; end $a055; type addrtable; comment "pointer to ROM table or $06xx"; };
range { name "level02_map"; start $a056; end $a057; type addrtable; comment "used to draw the level initially (see also map_changes)"; };
range { name "level02_map_bombs"; start $a058; end $a059; type addrtable; comment "start of bombs in map data (which must come last!)"; };
range { name "level02_bomblist"; start $a05a; end $a05b; type addrtable; comment "addr of list of bombs, indexed by player position on coarse 8x8 grid. 2 bytes each, 1st is coarse-grid position, 2nd is: hi 4 bits = change_map index, lo 4 = indirect sub (unused). terminated by $FF."; };
range { name "level02_map_changes"; start $a05c; end $a05d; type addrtable; comment "address of list of addresses of map data, used for changing the map when certain bombs are picked up"; };
range { name "level02_indirect_subs"; start $a05e; end $a05f; type bytetable; comment "pointer to list of indirect subs, always $0000 in this game"; };
range { name "level02_sub_bomb"; start $a060; end $a061; type addrtable; comment "called when a bomb is picked up. $06E6 for most levels (just an RTS), or else a ROM subroutine"; };
range { name "level02_init"; start $a062; end $a063; type addrtable; comment "called at start of level, $06E6 for some levels, or else a ROM subroutine"; };
range { name "level02_sub6"; start $a064; end $a065; type addrtable; comment "always $9740 aka game_main_loop"; };
range { name "level02_sub_eol"; start $a066; end $a067; type addrtable; comment "called at end of level (all bombs picked up). $06E6 for all but level08"; };
range { name "level02_offs_40"; start $a068; end $a06d; type bytetable; comment "all zeroes"; };
range { name "level02_colpf3"; start $a06e; end $a06e; type bytetable; comment "color (not sure what gets drawn in this color yet)"; };
range { name "level02_colpf0"; start $a06f; end $a06f; type bytetable; comment "color for girders and up-ropes"; };
range { name "level02_colpf1"; start $a070; end $a070; type bytetable; comment "color for ladders and down-ropes"; };
range { name "level02_colpf2"; start $a071; end $a071; type bytetable; comment "color for bombs"; };
range { name "level02_offs_50"; start $a072; end $a076; type bytetable; comment "unknown"; };
range { name "level02_offs_55"; start $a077; end $a079; type bytetable; comment "unknown, always $00 $00 $00"; };
range { name "level02_offs_58"; start $a07a; end $a07b; type bytetable; comment "unknown, not a ROM address"; };
range { name "level02_offs_60"; start $a07c; end $a07f; type bytetable; comment "unknown, level06 (walls) has $ff $ff $ff $ff, all others $00 $00 $00 $00"; };

range { name "level03_desc"; start $a080; end $a081; type bytetable; comment "Descriptor for Dumbwaiter. first 2 bytes are level number in screencodes"; };
range { name "level03_sub0"; start $a082; end $a083; type addrtable; comment "a subroutine"; };
range { name "level03_sub1"; start $a084; end $a085; type addrtable; comment "a subroutine"; };
range { name "level03_sub2"; start $a086; end $a087; type addrtable; comment "a subroutine"; };
range { name "level03_sub3"; start $a088; end $a089; type addrtable; comment "a subroutine"; };
range { name "level03_num_bombs"; start $a08a; end $a08a; type bytetable; comment "number of bombs to pick up on this level"; };
range { name "level03_bullet_max"; start $a08b; end $a08b; type bytetable; comment "0 = no bullets, range 0-4."; };
range { name "level03_y_start"; start $a08c; end $a08c; type bytetable; comment "jumpman starting Y position"; };
range { name "level03_x_start"; start $a08d; end $a08d; type bytetable; comment "jumpman starting X position"; };
range { name "level03_fudge_x"; start $a08e; end $a08e; type bytetable; comment "fudge factor for bomb locations, always $00"; };
range { name "level03_fudge_y"; start $a08f; end $a08f; type bytetable; comment "fudge factor for bomb locations, always $06"; };
range { name "level03_points_per_bomb"; start $a090; end $a090; type bytetable; comment "points awarded per bomb pickup (always $64 aka 100)"; };
range { name "level03_time_bonus"; start $a091; end $a092; type wordtable; comment "amount of time bonus at start of level"; };
range { name "level03_offs_19"; start $a093; end $a093; type bytetable; comment "always $00"; };
range { name "level03_unkn_table0"; start $a094; end $a095; type addrtable; comment "pointer to ROM table or $06xx"; };
range { name "level03_map"; start $a096; end $a097; type addrtable; comment "used to draw the level initially (see also map_changes)"; };
range { name "level03_map_bombs"; start $a098; end $a099; type addrtable; comment "start of bombs in map data (which must come last!)"; };
range { name "level03_bomblist"; start $a09a; end $a09b; type addrtable; comment "addr of list of bombs, indexed by player position on coarse 8x8 grid. 2 bytes each, 1st is coarse-grid position, 2nd is: hi 4 bits = change_map index, lo 4 = indirect sub (unused). terminated by $FF."; };
range { name "level03_map_changes"; start $a09c; end $a09d; type addrtable; comment "address of list of addresses of map data, used for changing the map when certain bombs are picked up"; };
range { name "level03_indirect_subs"; start $a09e; end $a09f; type bytetable; comment "pointer to list of indirect subs, always $0000 in this game"; };
range { name "level03_sub_bomb"; start $a0a0; end $a0a1; type addrtable; comment "called when a bomb is picked up. $06E6 for most levels (just an RTS), or else a ROM subroutine"; };
range { name "level03_init"; start $a0a2; end $a0a3; type addrtable; comment "called at start of level, $06E6 for some levels, or else a ROM subroutine"; };
range { name "level03_sub6"; start $a0a4; end $a0a5; type addrtable; comment "always $9740 aka game_main_loop"; };
range { name "level03_sub_eol"; start $a0a6; end $a0a7; type addrtable; comment "called at end of level (all bombs picked up). $06E6 for all but level08"; };
range { name "level03_offs_40"; start $a0a8; end $a0ad; type bytetable; comment "all zeroes"; };
range { name "level03_colpf3"; start $a0ae; end $a0ae; type bytetable; comment "color (not sure what gets drawn in this color yet)"; };
range { name "level03_colpf0"; start $a0af; end $a0af; type bytetable; comment "color for girders and up-ropes"; };
range { name "level03_colpf1"; start $a0b0; end $a0b0; type bytetable; comment "color for ladders and down-ropes"; };
range { name "level03_colpf2"; start $a0b1; end $a0b1; type bytetable; comment "color for bombs"; };
range { name "level03_offs_50"; start $a0b2; end $a0b6; type bytetable; comment "unknown"; };
range { name "level03_offs_55"; start $a0b7; end $a0b9; type bytetable; comment "unknown, always $00 $00 $00"; };
range { name "level03_offs_58"; start $a0ba; end $a0bb; type bytetable; comment "unknown, not a ROM address"; };
range { name "level03_offs_60"; start $a0bc; end $a0bf; type bytetable; comment "unknown, level06 (walls) has $ff $ff $ff $ff, all others $00 $00 $00 $00"; };

range { name "level04_desc"; start $a0c0; end $a0c1; type bytetable; comment "Descriptor for Hellstones. first 2 bytes are level number in screencodes"; };
range { name "level04_sub0"; start $a0c2; end $a0c3; type addrtable; comment "a subroutine"; };
range { name "level04_sub1"; start $a0c4; end $a0c5; type addrtable; comment "a subroutine"; };
range { name "level04_sub2"; start $a0c6; end $a0c7; type addrtable; comment "a subroutine"; };
range { name "level04_sub3"; start $a0c8; end $a0c9; type addrtable; comment "a subroutine"; };
range { name "level04_num_bombs"; start $a0ca; end $a0ca; type bytetable; comment "number of bombs to pick up on this level"; };
range { name "level04_bullet_max"; start $a0cb; end $a0cb; type bytetable; comment "0 = no bullets, range 0-4."; };
range { name "level04_y_start"; start $a0cc; end $a0cc; type bytetable; comment "jumpman starting Y position"; };
range { name "level04_x_start"; start $a0cd; end $a0cd; type bytetable; comment "jumpman starting X position"; };
range { name "level04_fudge_x"; start $a0ce; end $a0ce; type bytetable; comment "fudge factor for bomb locations, always $00"; };
range { name "level04_fudge_y"; start $a0cf; end $a0cf; type bytetable; comment "fudge factor for bomb locations, always $06"; };
range { name "level04_points_per_bomb"; start $a0d0; end $a0d0; type bytetable; comment "points awarded per bomb pickup (always $64 aka 100)"; };
range { name "level04_time_bonus"; start $a0d1; end $a0d2; type wordtable; comment "amount of time bonus at start of level"; };
range { name "level04_offs_19"; start $a0d3; end $a0d3; type bytetable; comment "always $00"; };
range { name "level04_unkn_table0"; start $a0d4; end $a0d5; type addrtable; comment "pointer to ROM table or $06xx"; };
range { name "level04_map"; start $a0d6; end $a0d7; type addrtable; comment "used to draw the level initially (see also map_changes)"; };
range { name "level04_map_bombs"; start $a0d8; end $a0d9; type addrtable; comment "start of bombs in map data (which must come last!)"; };
range { name "level04_bomblist"; start $a0da; end $a0db; type addrtable; comment "addr of list of bombs, indexed by player position on coarse 8x8 grid. 2 bytes each, 1st is coarse-grid position, 2nd is: hi 4 bits = change_map index, lo 4 = indirect sub (unused). terminated by $FF."; };
range { name "level04_map_changes"; start $a0dc; end $a0dd; type addrtable; comment "address of list of addresses of map data, used for changing the map when certain bombs are picked up"; };
range { name "level04_indirect_subs"; start $a0de; end $a0df; type bytetable; comment "pointer to list of indirect subs, always $0000 in this game"; };
range { name "level04_sub_bomb"; start $a0e0; end $a0e1; type addrtable; comment "called when a bomb is picked up. $06E6 for most levels (just an RTS), or else a ROM subroutine"; };
range { name "level04_init"; start $a0e2; end $a0e3; type addrtable; comment "called at start of level, $06E6 for some levels, or else a ROM subroutine"; };
range { name "level04_sub6"; start $a0e4; end $a0e5; type addrtable; comment "always $9740 aka game_main_loop"; };
range { name "level04_sub_eol"; start $a0e6; end $a0e7; type addrtable; comment "called at end of level (all bombs picked up). $06E6 for all but level08"; };
range { name "level04_offs_40"; start $a0e8; end $a0ed; type bytetable; comment "all zeroes"; };
range { name "level04_colpf3"; start $a0ee; end $a0ee; type bytetable; comment "color (not sure what gets drawn in this color yet)"; };
range { name "level04_colpf0"; start $a0ef; end $a0ef; type bytetable; comment "color for girders and up-ropes"; };
range { name "level04_colpf1"; start $a0f0; end $a0f0; type bytetable; comment "color for ladders and down-ropes"; };
range { name "level04_colpf2"; start $a0f1; end $a0f1; type bytetable; comment "color for bombs"; };
range { name "level04_offs_50"; start $a0f2; end $a0f6; type bytetable; comment "unknown"; };
range { name "level04_offs_55"; start $a0f7; end $a0f9; type bytetable; comment "unknown, always $00 $00 $00"; };
range { name "level04_offs_58"; start $a0fa; end $a0fb; type bytetable; comment "unknown, not a ROM address"; };
range { name "level04_offs_60"; start $a0fc; end $a0ff; type bytetable; comment "unknown, level06 (walls) has $ff $ff $ff $ff, all others $00 $00 $00 $00"; };

range { name "level05_desc"; start $a100; end $a101; type bytetable; comment "Descriptor for Figurits Revenge. first 2 bytes are level number in screencodes"; };
range { name "level05_sub0"; start $a102; end $a103; type addrtable; comment "a subroutine"; };
range { name "level05_sub1"; start $a104; end $a105; type addrtable; comment "a subroutine"; };
range { name "level05_sub2"; start $a106; end $a107; type addrtable; comment "a subroutine"; };
range { name "level05_sub3"; start $a108; end $a109; type addrtable; comment "a subroutine"; };
range { name "level05_num_bombs"; start $a10a; end $a10a; type bytetable; comment "number of bombs to pick up on this level"; };
range { name "level05_bullet_max"; start $a10b; end $a10b; type bytetable; comment "0 = no bullets, range 0-4."; };
range { name "level05_y_start"; start $a10c; end $a10c; type bytetable; comment "jumpman starting Y position"; };
range { name "level05_x_start"; start $a10d; end $a10d; type bytetable; comment "jumpman starting X position"; };
range { name "level05_fudge_x"; start $a10e; end $a10e; type bytetable; comment "fudge factor for bomb locations, always $00"; };
range { name "level05_fudge_y"; start $a10f; end $a10f; type bytetable; comment "fudge factor for bomb locations, always $06"; };
range { name "level05_points_per_bomb"; start $a110; end $a110; type bytetable; comment "points awarded per bomb pickup (always $64 aka 100)"; };
range { name "level05_time_bonus"; start $a111; end $a112; type wordtable; comment "amount of time bonus at start of level"; };
range { name "level05_offs_19"; start $a113; end $a113; type bytetable; comment "always $00"; };
range { name "level05_unkn_table0"; start $a114; end $a115; type addrtable; comment "pointer to ROM table or $06xx"; };
range { name "level05_map"; start $a116; end $a117; type addrtable; comment "used to draw the level initially (see also map_changes)"; };
range { name "level05_map_bombs"; start $a118; end $a119; type addrtable; comment "start of bombs in map data (which must come last!)"; };
range { name "level05_bomblist"; start $a11a; end $a11b; type addrtable; comment "addr of list of bombs, indexed by player position on coarse 8x8 grid. 2 bytes each, 1st is coarse-grid position, 2nd is: hi 4 bits = change_map index, lo 4 = indirect sub (unused). terminated by $FF."; };
range { name "level05_map_changes"; start $a11c; end $a11d; type addrtable; comment "address of list of addresses of map data, used for changing the map when certain bombs are picked up"; };
range { name "level05_indirect_subs"; start $a11e; end $a11f; type bytetable; comment "pointer to list of indirect subs, always $0000 in this game"; };
range { name "level05_sub_bomb"; start $a120; end $a121; type addrtable; comment "called when a bomb is picked up. $06E6 for most levels (just an RTS), or else a ROM subroutine"; };
range { name "level05_init"; start $a122; end $a123; type addrtable; comment "called at start of level, $06E6 for some levels, or else a ROM subroutine"; };
range { name "level05_sub6"; start $a124; end $a125; type addrtable; comment "always $9740 aka game_main_loop"; };
range { name "level05_sub_eol"; start $a126; end $a127; type addrtable; comment "called at end of level (all bombs picked up). $06E6 for all but level08"; };
range { name "level05_offs_40"; start $a128; end $a12d; type bytetable; comment "all zeroes"; };
range { name "level05_colpf3"; start $a12e; end $a12e; type bytetable; comment "color (not sure what gets drawn in this color yet)"; };
range { name "level05_colpf0"; start $a12f; end $a12f; type bytetable; comment "color for girders and up-ropes"; };
range { name "level05_colpf1"; start $a130; end $a130; type bytetable; comment "color for ladders and down-ropes"; };
range { name "level05_colpf2"; start $a131; end $a131; type bytetable; comment "color for bombs"; };
range { name "level05_offs_50"; start $a132; end $a136; type bytetable; comment "unknown"; };
range { name "level05_offs_55"; start $a137; end $a139; type bytetable; comment "unknown, always $00 $00 $00"; };
range { name "level05_offs_58"; start $a13a; end $a13b; type bytetable; comment "unknown, not a ROM address"; };
range { name "level05_offs_60"; start $a13c; end $a13f; type bytetable; comment "unknown, level06 (walls) has $ff $ff $ff $ff, all others $00 $00 $00 $00"; };

range { name "level06_desc"; start $a140; end $a141; type bytetable; comment "Descriptor for Walls. first 2 bytes are level number in screencodes"; };
range { name "level06_sub0"; start $a142; end $a143; type addrtable; comment "a subroutine"; };
range { name "level06_sub1"; start $a144; end $a145; type addrtable; comment "a subroutine"; };
range { name "level06_sub2"; start $a146; end $a147; type addrtable; comment "a subroutine"; };
range { name "level06_sub3"; start $a148; end $a149; type addrtable; comment "a subroutine"; };
range { name "level06_num_bombs"; start $a14a; end $a14a; type bytetable; comment "number of bombs to pick up on this level"; };
range { name "level06_bullet_max"; start $a14b; end $a14b; type bytetable; comment "0 = no bullets, range 0-4."; };
range { name "level06_y_start"; start $a14c; end $a14c; type bytetable; comment "jumpman starting Y position"; };
range { name "level06_x_start"; start $a14d; end $a14d; type bytetable; comment "jumpman starting X position"; };
range { name "level06_fudge_x"; start $a14e; end $a14e; type bytetable; comment "fudge factor for bomb locations, always $00"; };
range { name "level06_fudge_y"; start $a14f; end $a14f; type bytetable; comment "fudge factor for bomb locations, always $06"; };
range { name "level06_points_per_bomb"; start $a150; end $a150; type bytetable; comment "points awarded per bomb pickup (always $64 aka 100)"; };
range { name "level06_time_bonus"; start $a151; end $a152; type wordtable; comment "amount of time bonus at start of level"; };
range { name "level06_offs_19"; start $a153; end $a153; type bytetable; comment "always $00"; };
range { name "level06_unkn_table0"; start $a154; end $a155; type addrtable; comment "pointer to ROM table or $06xx"; };
range { name "level06_map"; start $a156; end $a157; type addrtable; comment "used to draw the level initially (see also map_changes)"; };
range { name "level06_map_bombs"; start $a158; end $a159; type addrtable; comment "start of bombs in map data (which must come last!)"; };
range { name "level06_bomblist"; start $a15a; end $a15b; type addrtable; comment "addr of list of bombs, indexed by player position on coarse 8x8 grid. 2 bytes each, 1st is coarse-grid position, 2nd is: hi 4 bits = change_map index, lo 4 = indirect sub (unused). terminated by $FF."; };
range { name "level06_map_changes"; start $a15c; end $a15d; type addrtable; comment "address of list of addresses of map data, used for changing the map when certain bombs are picked up"; };
range { name "level06_indirect_subs"; start $a15e; end $a15f; type bytetable; comment "pointer to list of indirect subs, always $0000 in this game"; };
range { name "level06_sub_bomb"; start $a160; end $a161; type addrtable; comment "called when a bomb is picked up. $06E6 for most levels (just an RTS), or else a ROM subroutine"; };
range { name "level06_init"; start $a162; end $a163; type addrtable; comment "called at start of level, $06E6 for some levels, or else a ROM subroutine"; };
range { name "level06_sub6"; start $a164; end $a165; type addrtable; comment "always $9740 aka game_main_loop"; };
range { name "level06_sub_eol"; start $a166; end $a167; type addrtable; comment "called at end of level (all bombs picked up). $06E6 for all but level08"; };
range { name "level06_offs_40"; start $a168; end $a16d; type bytetable; comment "all zeroes"; };
range { name "level06_colpf3"; start $a16e; end $a16e; type bytetable; comment "color (not sure what gets drawn in this color yet)"; };
range { name "level06_colpf0"; start $a16f; end $a16f; type bytetable; comment "color for girders and up-ropes"; };
range { name "level06_colpf1"; start $a170; end $a170; type bytetable; comment "color for ladders and down-ropes"; };
range { name "level06_colpf2"; start $a171; end $a171; type bytetable; comment "color for bombs"; };
range { name "level06_offs_50"; start $a172; end $a176; type bytetable; comment "unknown"; };
range { name "level06_offs_55"; start $a177; end $a179; type bytetable; comment "unknown, always $00 $00 $00"; };
range { name "level06_offs_58"; start $a17a; end $a17b; type bytetable; comment "unknown, not a ROM address"; };
range { name "level06_offs_60"; start $a17c; end $a17f; type bytetable; comment "unknown, level06 (walls) has $ff $ff $ff $ff, all others $00 $00 $00 $00"; };

range { name "level07_desc"; start $a180; end $a181; type bytetable; comment "Descriptor for Zig-Zag. first 2 bytes are level number in screencodes"; };
range { name "level07_sub0"; start $a182; end $a183; type addrtable; comment "a subroutine"; };
range { name "level07_sub1"; start $a184; end $a185; type addrtable; comment "a subroutine"; };
range { name "level07_sub2"; start $a186; end $a187; type addrtable; comment "a subroutine"; };
range { name "level07_sub3"; start $a188; end $a189; type addrtable; comment "a subroutine"; };
range { name "level07_num_bombs"; start $a18a; end $a18a; type bytetable; comment "number of bombs to pick up on this level"; };
range { name "level07_bullet_max"; start $a18b; end $a18b; type bytetable; comment "0 = no bullets, range 0-4."; };
range { name "level07_y_start"; start $a18c; end $a18c; type bytetable; comment "jumpman starting Y position"; };
range { name "level07_x_start"; start $a18d; end $a18d; type bytetable; comment "jumpman starting X position"; };
range { name "level07_fudge_x"; start $a18e; end $a18e; type bytetable; comment "fudge factor for bomb locations, always $00"; };
range { name "level07_fudge_y"; start $a18f; end $a18f; type bytetable; comment "fudge factor for bomb locations, always $06"; };
range { name "level07_points_per_bomb"; start $a190; end $a190; type bytetable; comment "points awarded per bomb pickup (always $64 aka 100)"; };
range { name "level07_time_bonus"; start $a191; end $a192; type wordtable; comment "amount of time bonus at start of level"; };
range { name "level07_offs_19"; start $a193; end $a193; type bytetable; comment "always $00"; };
range { name "level07_unkn_table0"; start $a194; end $a195; type addrtable; comment "pointer to ROM table or $06xx"; };
range { name "level07_map"; start $a196; end $a197; type addrtable; comment "used to draw the level initially (see also map_changes)"; };
range { name "level07_map_bombs"; start $a198; end $a199; type addrtable; comment "start of bombs in map data (which must come last!)"; };
range { name "level07_bomblist"; start $a19a; end $a19b; type addrtable; comment "addr of list of bombs, indexed by player position on coarse 8x8 grid. 2 bytes each, 1st is coarse-grid position, 2nd is: hi 4 bits = change_map index, lo 4 = indirect sub (unused). terminated by $FF."; };
range { name "level07_map_changes"; start $a19c; end $a19d; type addrtable; comment "address of list of addresses of map data, used for changing the map when certain bombs are picked up"; };
range { name "level07_indirect_subs"; start $a19e; end $a19f; type bytetable; comment "pointer to list of indirect subs, always $0000 in this game"; };
range { name "level07_sub_bomb"; start $a1a0; end $a1a1; type addrtable; comment "called when a bomb is picked up. $06E6 for most levels (just an RTS), or else a ROM subroutine"; };
range { name "level07_init"; start $a1a2; end $a1a3; type addrtable; comment "called at start of level, $06E6 for some levels, or else a ROM subroutine"; };
range { name "level07_sub6"; start $a1a4; end $a1a5; type addrtable; comment "always $9740 aka game_main_loop"; };
range { name "level07_sub_eol"; start $a1a6; end $a1a7; type addrtable; comment "called at end of level (all bombs picked up). $06E6 for all but level08"; };
range { name "level07_offs_40"; start $a1a8; end $a1ad; type bytetable; comment "all zeroes"; };
range { name "level07_colpf3"; start $a1ae; end $a1ae; type bytetable; comment "color (not sure what gets drawn in this color yet)"; };
range { name "level07_colpf0"; start $a1af; end $a1af; type bytetable; comment "color for girders and up-ropes"; };
range { name "level07_colpf1"; start $a1b0; end $a1b0; type bytetable; comment "color for ladders and down-ropes"; };
range { name "level07_colpf2"; start $a1b1; end $a1b1; type bytetable; comment "color for bombs"; };
range { name "level07_offs_50"; start $a1b2; end $a1b6; type bytetable; comment "unknown"; };
range { name "level07_offs_55"; start $a1b7; end $a1b9; type bytetable; comment "unknown, always $00 $00 $00"; };
range { name "level07_offs_58"; start $a1ba; end $a1bb; type bytetable; comment "unknown, not a ROM address"; };
range { name "level07_offs_60"; start $a1bc; end $a1bf; type bytetable; comment "unknown, level06 (walls) has $ff $ff $ff $ff, all others $00 $00 $00 $00"; };

range { name "level08_desc"; start $a1c0; end $a1c1; type bytetable; comment "Descriptor for Spellbound. first 2 bytes are level number in screencodes"; };
range { name "level08_sub0"; start $a1c2; end $a1c3; type addrtable; comment "a subroutine"; };
range { name "level08_sub1"; start $a1c4; end $a1c5; type addrtable; comment "a subroutine"; };
range { name "level08_sub2"; start $a1c6; end $a1c7; type addrtable; comment "a subroutine"; };
range { name "level08_sub3"; start $a1c8; end $a1c9; type addrtable; comment "a subroutine"; };
range { name "level08_num_bombs"; start $a1ca; end $a1ca; type bytetable; comment "number of bombs to pick up on this level"; };
range { name "level08_bullet_max"; start $a1cb; end $a1cb; type bytetable; comment "0 = no bullets, range 0-4."; };
range { name "level08_y_start"; start $a1cc; end $a1cc; type bytetable; comment "jumpman starting Y position"; };
range { name "level08_x_start"; start $a1cd; end $a1cd; type bytetable; comment "jumpman starting X position"; };
range { name "level08_fudge_x"; start $a1ce; end $a1ce; type bytetable; comment "fudge factor for bomb locations, always $00"; };
range { name "level08_fudge_y"; start $a1cf; end $a1cf; type bytetable; comment "fudge factor for bomb locations, always $06"; };
range { name "level08_points_per_bomb"; start $a1d0; end $a1d0; type bytetable; comment "points awarded per bomb pickup (always $64 aka 100)"; };
range { name "level08_time_bonus"; start $a1d1; end $a1d2; type wordtable; comment "amount of time bonus at start of level"; };
range { name "level08_offs_19"; start $a1d3; end $a1d3; type bytetable; comment "always $00"; };
range { name "level08_unkn_table0"; start $a1d4; end $a1d5; type addrtable; comment "pointer to ROM table or $06xx"; };
range { name "level08_map"; start $a1d6; end $a1d7; type addrtable; comment "used to draw the level initially (see also map_changes)"; };
range { name "level08_map_bombs"; start $a1d8; end $a1d9; type addrtable; comment "start of bombs in map data (which must come last!)"; };
range { name "level08_bomblist"; start $a1da; end $a1db; type addrtable; comment "addr of list of bombs, indexed by player position on coarse 8x8 grid. 2 bytes each, 1st is coarse-grid position, 2nd is: hi 4 bits = change_map index, lo 4 = indirect sub (unused). terminated by $FF."; };
range { name "level08_map_changes"; start $a1dc; end $a1dd; type addrtable; comment "address of list of addresses of map data, used for changing the map when certain bombs are picked up"; };
range { name "level08_indirect_subs"; start $a1de; end $a1df; type bytetable; comment "pointer to list of indirect subs, always $0000 in this game"; };
range { name "level08_sub_bomb"; start $a1e0; end $a1e1; type addrtable; comment "called when a bomb is picked up. $06E6 for most levels (just an RTS), or else a ROM subroutine"; };
range { name "level08_init"; start $a1e2; end $a1e3; type addrtable; comment "called at start of level, $06E6 for some levels, or else a ROM subroutine"; };
range { name "level08_sub6"; start $a1e4; end $a1e5; type addrtable; comment "always $9740 aka game_main_loop"; };
range { name "level08_sub_eol"; start $a1e6; end $a1e7; type addrtable; comment "called at end of level (all bombs picked up). $06E6 for all but level08"; };
range { name "level08_offs_40"; start $a1e8; end $a1ed; type bytetable; comment "all zeroes"; };
range { name "level08_colpf3"; start $a1ee; end $a1ee; type bytetable; comment "color (not sure what gets drawn in this color yet)"; };
range { name "level08_colpf0"; start $a1ef; end $a1ef; type bytetable; comment "color for girders and up-ropes"; };
range { name "level08_colpf1"; start $a1f0; end $a1f0; type bytetable; comment "color for ladders and down-ropes"; };
range { name "level08_colpf2"; start $a1f1; end $a1f1; type bytetable; comment "color for bombs"; };
range { name "level08_offs_50"; start $a1f2; end $a1f6; type bytetable; comment "unknown"; };
range { name "level08_offs_55"; start $a1f7; end $a1f9; type bytetable; comment "unknown, always $00 $00 $00"; };
range { name "level08_offs_58"; start $a1fa; end $a1fb; type bytetable; comment "unknown, not a ROM address"; };
range { name "level08_offs_60"; start $a1fc; end $a1ff; type bytetable; comment "unknown, level06 (walls) has $ff $ff $ff $ff, all others $00 $00 $00 $00"; };

range { name "level09_desc"; start $a200; end $a201; type bytetable; comment "Descriptor for Blackout. first 2 bytes are level number in screencodes"; };
range { name "level09_sub0"; start $a202; end $a203; type addrtable; comment "a subroutine"; };
range { name "level09_sub1"; start $a204; end $a205; type addrtable; comment "a subroutine"; };
range { name "level09_sub2"; start $a206; end $a207; type addrtable; comment "a subroutine"; };
range { name "level09_sub3"; start $a208; end $a209; type addrtable; comment "a subroutine"; };
range { name "level09_num_bombs"; start $a20a; end $a20a; type bytetable; comment "number of bombs to pick up on this level"; };
range { name "level09_bullet_max"; start $a20b; end $a20b; type bytetable; comment "0 = no bullets, range 0-4."; };
range { name "level09_y_start"; start $a20c; end $a20c; type bytetable; comment "jumpman starting Y position"; };
range { name "level09_x_start"; start $a20d; end $a20d; type bytetable; comment "jumpman starting X position"; };
range { name "level09_fudge_x"; start $a20e; end $a20e; type bytetable; comment "fudge factor for bomb locations, always $00"; };
range { name "level09_fudge_y"; start $a20f; end $a20f; type bytetable; comment "fudge factor for bomb locations, always $06"; };
range { name "level09_points_per_bomb"; start $a210; end $a210; type bytetable; comment "points awarded per bomb pickup (always $64 aka 100)"; };
range { name "level09_time_bonus"; start $a211; end $a212; type wordtable; comment "amount of time bonus at start of level"; };
range { name "level09_offs_19"; start $a213; end $a213; type bytetable; comment "always $00"; };
range { name "level09_unkn_table0"; start $a214; end $a215; type addrtable; comment "pointer to ROM table or $06xx"; };
range { name "level09_map"; start $a216; end $a217; type addrtable; comment "used to draw the level initially (see also map_changes)"; };
range { name "level09_map_bombs"; start $a218; end $a219; type addrtable; comment "start of bombs in map data (which must come last!)"; };
range { name "level09_bomblist"; start $a21a; end $a21b; type addrtable; comment "addr of list of bombs, indexed by player position on coarse 8x8 grid. 2 bytes each, 1st is coarse-grid position, 2nd is: hi 4 bits = change_map index, lo 4 = indirect sub (unused). terminated by $FF."; };
range { name "level09_map_changes"; start $a21c; end $a21d; type addrtable; comment "address of list of addresses of map data, used for changing the map when certain bombs are picked up"; };
range { name "level09_indirect_subs"; start $a21e; end $a21f; type bytetable; comment "pointer to list of indirect subs, always $0000 in this game"; };
range { name "level09_sub_bomb"; start $a220; end $a221; type addrtable; comment "called when a bomb is picked up. $06E6 for most levels (just an RTS), or else a ROM subroutine"; };
range { name "level09_init"; start $a222; end $a223; type addrtable; comment "called at start of level, $06E6 for some levels, or else a ROM subroutine"; };
range { name "level09_sub6"; start $a224; end $a225; type addrtable; comment "always $9740 aka game_main_loop"; };
range { name "level09_sub_eol"; start $a226; end $a227; type addrtable; comment "called at end of level (all bombs picked up). $06E6 for all but level08"; };
range { name "level09_offs_40"; start $a228; end $a22d; type bytetable; comment "all zeroes"; };
range { name "level09_colpf3"; start $a22e; end $a22e; type bytetable; comment "color (not sure what gets drawn in this color yet)"; };
range { name "level09_colpf0"; start $a22f; end $a22f; type bytetable; comment "color for girders and up-ropes"; };
range { name "level09_colpf1"; start $a230; end $a230; type bytetable; comment "color for ladders and down-ropes"; };
range { name "level09_colpf2"; start $a231; end $a231; type bytetable; comment "color for bombs"; };
range { name "level09_offs_50"; start $a232; end $a236; type bytetable; comment "unknown"; };
range { name "level09_offs_55"; start $a237; end $a239; type bytetable; comment "unknown, always $00 $00 $00"; };
range { name "level09_offs_58"; start $a23a; end $a23b; type bytetable; comment "unknown, not a ROM address"; };
range { name "level09_offs_60"; start $a23c; end $a23f; type bytetable; comment "unknown, level06 (walls) has $ff $ff $ff $ff, all others $00 $00 $00 $00"; };

range { name "level10_desc"; start $a240; end $a241; type bytetable; comment "Descriptor for HereThereEverywhere. first 2 bytes are level number in screencodes"; };
range { name "level10_sub0"; start $a242; end $a243; type addrtable; comment "a subroutine"; };
range { name "level10_sub1"; start $a244; end $a245; type addrtable; comment "a subroutine"; };
range { name "level10_sub2"; start $a246; end $a247; type addrtable; comment "a subroutine"; };
range { name "level10_sub3"; start $a248; end $a249; type addrtable; comment "a subroutine"; };
range { name "level10_num_bombs"; start $a24a; end $a24a; type bytetable; comment "number of bombs to pick up on this level"; };
range { name "level10_bullet_max"; start $a24b; end $a24b; type bytetable; comment "0 = no bullets, range 0-4."; };
range { name "level10_y_start"; start $a24c; end $a24c; type bytetable; comment "jumpman starting Y position"; };
range { name "level10_x_start"; start $a24d; end $a24d; type bytetable; comment "jumpman starting X position"; };
range { name "level10_fudge_x"; start $a24e; end $a24e; type bytetable; comment "fudge factor for bomb locations, always $00"; };
range { name "level10_fudge_y"; start $a24f; end $a24f; type bytetable; comment "fudge factor for bomb locations, always $06"; };
range { name "level10_points_per_bomb"; start $a250; end $a250; type bytetable; comment "points awarded per bomb pickup (always $64 aka 100)"; };
range { name "level10_time_bonus"; start $a251; end $a252; type wordtable; comment "amount of time bonus at start of level"; };
range { name "level10_offs_19"; start $a253; end $a253; type bytetable; comment "always $00"; };
range { name "level10_unkn_table0"; start $a254; end $a255; type addrtable; comment "pointer to ROM table or $06xx"; };
range { name "level10_map"; start $a256; end $a257; type addrtable; comment "used to draw the level initially (see also map_changes)"; };
range { name "level10_map_bombs"; start $a258; end $a259; type addrtable; comment "start of bombs in map data (which must come last!)"; };
range { name "level10_bomblist"; start $a25a; end $a25b; type addrtable; comment "addr of list of bombs, indexed by player position on coarse 8x8 grid. 2 bytes each, 1st is coarse-grid position, 2nd is: hi 4 bits = change_map index, lo 4 = indirect sub (unused). terminated by $FF."; };
range { name "level10_map_changes"; start $a25c; end $a25d; type addrtable; comment "address of list of addresses of map data, used for changing the map when certain bombs are picked up"; };
range { name "level10_indirect_subs"; start $a25e; end $a25f; type bytetable; comment "pointer to list of indirect subs, always $0000 in this game"; };
range { name "level10_sub_bomb"; start $a260; end $a261; type addrtable; comment "called when a bomb is picked up. $06E6 for most levels (just an RTS), or else a ROM subroutine"; };
range { name "level10_init"; start $a262; end $a263; type addrtable; comment "called at start of level, $06E6 for some levels, or else a ROM subroutine"; };
range { name "level10_sub6"; start $a264; end $a265; type addrtable; comment "always $9740 aka game_main_loop"; };
range { name "level10_sub_eol"; start $a266; end $a267; type addrtable; comment "called at end of level (all bombs picked up). $06E6 for all but level08"; };
range { name "level10_offs_40"; start $a268; end $a26d; type bytetable; comment "all zeroes"; };
range { name "level10_colpf3"; start $a26e; end $a26e; type bytetable; comment "color (not sure what gets drawn in this color yet)"; };
range { name "level10_colpf0"; start $a26f; end $a26f; type bytetable; comment "color for girders and up-ropes"; };
range { name "level10_colpf1"; start $a270; end $a270; type bytetable; comment "color for ladders and down-ropes"; };
range { name "level10_colpf2"; start $a271; end $a271; type bytetable; comment "color for bombs"; };
range { name "level10_offs_50"; start $a272; end $a276; type bytetable; comment "unknown"; };
range { name "level10_offs_55"; start $a277; end $a279; type bytetable; comment "unknown, always $00 $00 $00"; };
range { name "level10_offs_58"; start $a27a; end $a27b; type bytetable; comment "unknown, not a ROM address"; };
range { name "level10_offs_60"; start $a27c; end $a27f; type bytetable; comment "unknown, level06 (walls) has $ff $ff $ff $ff, all others $00 $00 $00 $00"; };

range { name "level11_desc"; start $a280; end $a281; type bytetable; comment "Descriptor for Hatchlings. first 2 bytes are level number in screencodes"; };
range { name "level11_sub0"; start $a282; end $a283; type addrtable; comment "a subroutine"; };
range { name "level11_sub1"; start $a284; end $a285; type addrtable; comment "a subroutine"; };
range { name "level11_sub2"; start $a286; end $a287; type addrtable; comment "a subroutine"; };
range { name "level11_sub3"; start $a288; end $a289; type addrtable; comment "a subroutine"; };
range { name "level11_num_bombs"; start $a28a; end $a28a; type bytetable; comment "number of bombs to pick up on this level"; };
range { name "level11_bullet_max"; start $a28b; end $a28b; type bytetable; comment "0 = no bullets, range 0-4."; };
range { name "level11_y_start"; start $a28c; end $a28c; type bytetable; comment "jumpman starting Y position"; };
range { name "level11_x_start"; start $a28d; end $a28d; type bytetable; comment "jumpman starting X position"; };
range { name "level11_fudge_x"; start $a28e; end $a28e; type bytetable; comment "fudge factor for bomb locations, always $00"; };
range { name "level11_fudge_y"; start $a28f; end $a28f; type bytetable; comment "fudge factor for bomb locations, always $06"; };
range { name "level11_points_per_bomb"; start $a290; end $a290; type bytetable; comment "points awarded per bomb pickup (always $64 aka 100)"; };
range { name "level11_time_bonus"; start $a291; end $a292; type wordtable; comment "amount of time bonus at start of level"; };
range { name "level11_offs_19"; start $a293; end $a293; type bytetable; comment "always $00"; };
range { name "level11_unkn_table0"; start $a294; end $a295; type addrtable; comment "pointer to ROM table or $06xx"; };
range { name "level11_map"; start $a296; end $a297; type addrtable; comment "used to draw the level initially (see also map_changes)"; };
range { name "level11_map_bombs"; start $a298; end $a299; type addrtable; comment "start of bombs in map data (which must come last!)"; };
range { name "level11_bomblist"; start $a29a; end $a29b; type addrtable; comment "addr of list of bombs, indexed by player position on coarse 8x8 grid. 2 bytes each, 1st is coarse-grid position, 2nd is: hi 4 bits = change_map index, lo 4 = indirect sub (unused). terminated by $FF."; };
range { name "level11_map_changes"; start $a29c; end $a29d; type addrtable; comment "address of list of addresses of map data, used for changing the map when certain bombs are picked up"; };
range { name "level11_indirect_subs"; start $a29e; end $a29f; type bytetable; comment "pointer to list of indirect subs, always $0000 in this game"; };
range { name "level11_sub_bomb"; start $a2a0; end $a2a1; type addrtable; comment "called when a bomb is picked up. $06E6 for most levels (just an RTS), or else a ROM subroutine"; };
range { name "level11_init"; start $a2a2; end $a2a3; type addrtable; comment "called at start of level, $06E6 for some levels, or else a ROM subroutine"; };
range { name "level11_sub6"; start $a2a4; end $a2a5; type addrtable; comment "always $9740 aka game_main_loop"; };
range { name "level11_sub_eol"; start $a2a6; end $a2a7; type addrtable; comment "called at end of level (all bombs picked up). $06E6 for all but level08"; };
range { name "level11_offs_40"; start $a2a8; end $a2ad; type bytetable; comment "all zeroes"; };
range { name "level11_colpf3"; start $a2ae; end $a2ae; type bytetable; comment "color (not sure what gets drawn in this color yet)"; };
range { name "level11_colpf0"; start $a2af; end $a2af; type bytetable; comment "color for girders and up-ropes"; };
range { name "level11_colpf1"; start $a2b0; end $a2b0; type bytetable; comment "color for ladders and down-ropes"; };
range { name "level11_colpf2"; start $a2b1; end $a2b1; type bytetable; comment "color for bombs"; };
range { name "level11_offs_50"; start $a2b2; end $a2b6; type bytetable; comment "unknown"; };
range { name "level11_offs_55"; start $a2b7; end $a2b9; type bytetable; comment "unknown, always $00 $00 $00"; };
range { name "level11_offs_58"; start $a2ba; end $a2bb; type bytetable; comment "unknown, not a ROM address"; };
range { name "level11_offs_60"; start $a2bc; end $a2bf; type bytetable; comment "unknown, level06 (walls) has $ff $ff $ff $ff, all others $00 $00 $00 $00"; };

range { name "level12_desc"; start $a2c0; end $a2c1; type bytetable; comment "Descriptor for Hurricane. first 2 bytes are level number in screencodes"; };
range { name "level12_sub0"; start $a2c2; end $a2c3; type addrtable; comment "a subroutine"; };
range { name "level12_sub1"; start $a2c4; end $a2c5; type addrtable; comment "a subroutine"; };
range { name "level12_sub2"; start $a2c6; end $a2c7; type addrtable; comment "a subroutine"; };
range { name "level12_sub3"; start $a2c8; end $a2c9; type addrtable; comment "a subroutine"; };
range { name "level12_num_bombs"; start $a2ca; end $a2ca; type bytetable; comment "number of bombs to pick up on this level"; };
range { name "level12_bullet_max"; start $a2cb; end $a2cb; type bytetable; comment "0 = no bullets, range 0-4."; };
range { name "level12_y_start"; start $a2cc; end $a2cc; type bytetable; comment "jumpman starting Y position"; };
range { name "level12_x_start"; start $a2cd; end $a2cd; type bytetable; comment "jumpman starting X position"; };
range { name "level12_fudge_x"; start $a2ce; end $a2ce; type bytetable; comment "fudge factor for bomb locations, always $00"; };
range { name "level12_fudge_y"; start $a2cf; end $a2cf; type bytetable; comment "fudge factor for bomb locations, always $06"; };
range { name "level12_points_per_bomb"; start $a2d0; end $a2d0; type bytetable; comment "points awarded per bomb pickup (always $64 aka 100)"; };
range { name "level12_time_bonus"; start $a2d1; end $a2d2; type wordtable; comment "amount of time bonus at start of level"; };
range { name "level12_offs_19"; start $a2d3; end $a2d3; type bytetable; comment "always $00"; };
range { name "level12_unkn_table0"; start $a2d4; end $a2d5; type addrtable; comment "pointer to ROM table or $06xx"; };
range { name "level12_map"; start $a2d6; end $a2d7; type addrtable; comment "used to draw the level initially (see also map_changes)"; };
range { name "level12_map_bombs"; start $a2d8; end $a2d9; type addrtable; comment "start of bombs in map data (which must come last!)"; };
range { name "level12_bomblist"; start $a2da; end $a2db; type addrtable; comment "addr of list of bombs, indexed by player position on coarse 8x8 grid. 2 bytes each, 1st is coarse-grid position, 2nd is: hi 4 bits = change_map index, lo 4 = indirect sub (unused). terminated by $FF."; };
range { name "level12_map_changes"; start $a2dc; end $a2dd; type addrtable; comment "address of list of addresses of map data, used for changing the map when certain bombs are picked up"; };
range { name "level12_indirect_subs"; start $a2de; end $a2df; type bytetable; comment "pointer to list of indirect subs, always $0000 in this game"; };
range { name "level12_sub_bomb"; start $a2e0; end $a2e1; type addrtable; comment "called when a bomb is picked up. $06E6 for most levels (just an RTS), or else a ROM subroutine"; };
range { name "level12_init"; start $a2e2; end $a2e3; type addrtable; comment "called at start of level, $06E6 for some levels, or else a ROM subroutine"; };
range { name "level12_sub6"; start $a2e4; end $a2e5; type addrtable; comment "always $9740 aka game_main_loop"; };
range { name "level12_sub_eol"; start $a2e6; end $a2e7; type addrtable; comment "called at end of level (all bombs picked up). $06E6 for all but level08"; };
range { name "level12_offs_40"; start $a2e8; end $a2ed; type bytetable; comment "all zeroes"; };
range { name "level12_colpf3"; start $a2ee; end $a2ee; type bytetable; comment "color (not sure what gets drawn in this color yet)"; };
range { name "level12_colpf0"; start $a2ef; end $a2ef; type bytetable; comment "color for girders and up-ropes"; };
range { name "level12_colpf1"; start $a2f0; end $a2f0; type bytetable; comment "color for ladders and down-ropes"; };
range { name "level12_colpf2"; start $a2f1; end $a2f1; type bytetable; comment "color for bombs"; };
range { name "level12_offs_50"; start $a2f2; end $a2f6; type bytetable; comment "unknown"; };
range { name "level12_offs_55"; start $a2f7; end $a2f9; type bytetable; comment "unknown, always $00 $00 $00"; };
range { name "level12_offs_58"; start $a2fa; end $a2fb; type bytetable; comment "unknown, not a ROM address"; };
range { name "level12_offs_60"; start $a2fc; end $a2ff; type bytetable; comment "unknown, level06 (walls) has $ff $ff $ff $ff, all others $00 $00 $00 $00"; };