aboutsummaryrefslogtreecommitdiff
path: root/main.info
blob: 153763938c48d06ae77088462b45733ae0ad3818 (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

# 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 "level07_letters"; addr $AF58; comment "called at end of Spellbound, adds up letter bonus"; };
label { name "l07_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 level07, spellbound (not ASCII or screencodes though)"; };

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 "data_8406"; start $8406; end $840c; type bytetable; };
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_collisions_1"; addr $8F73; size 1; comment "did any missile hit a player, or did players 2 or 3 hit a player..."; };
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 "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 "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 level00)"; };
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; };
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"; };
range { name "data_9afc"; 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; };
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 level11"; };
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 "level02_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 "l00_map"; start $A300; end $a365; type bytetable; comment "level map data starts here"; };

range { name "l00_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 "l00_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 "l00_bombs_term"; start $a3a3; end $a3a3; type bytetable; comment "terminator for l00_bombs"; };
range { name "l00_map_changes"; start $A3A4; end $a3ad; type addrtable; comment "0000 = no change"; };
range { name "l00_map_change_0"; start $A3AE; end $a3d5; type bytetable; };
label { name "l00_map_change_1"; addr $a3b8; };
label { name "l00_map_change_2"; addr $a3c2; };
label { name "l00_map_change_3"; addr $a3cc; };
range { name "zero_filler_a3d6"; start $a3d6; end $a3df; type bytetable; comment "probably just filler"; };

range { name "l01_map"; start $A3e0; end $a497; type bytetable; comment "level map data starts here"; };

range { name "sfx_electrocution"; start $A52D; end $A53C; type bytetable; };
range { name "data_a542"; start $A542; end $A68B; type bytetable; comment "dunno, referenced by electrocution_bomb_pickup"; };
range { name "dumbwaiter_player"; start $a782; end $A826; type bytetable; comment "the dumbwaiters from level02. stored upside-down."; };
label { name "dw_platform_player"; addr $A685; comment "horizontally moving platforms from level02"; };
range { name "data_table_a8fd"; start $a8fd; end $A9C5; type bytetable; comment "dunno, referenced by routine at $A8D4"; };
range { name "map_aa90"; start $aa90; end $aabb; type bytetable; comment "dunno what this is for yet"; };
range { name "map_aac8"; start $aac8; end $AD67; type bytetable; comment "dunno what this is for yet"; };
label { name "map_aaa6"; addr $aaa6; comment "referenced by routine at $AA82"; };
range { name "data_table_adc7"; start $adc7; end $AE9A; type bytetable; comment "dunno, referenced by routines at $AD9E and $ADB5"; };
range { name "data_table_aea4"; start $aea4; end $af0f; type bytetable; comment "dunno"; };
range { name "sfx_letter_bonus"; start $AFCB; end $b0c3; type bytetable; comment "played once per correct letter at end of level07 (spellbound)"; };
label { name "cue_letter_sfx"; addr $AFB9; comment "play sfx_letter_bonus"; };
label { name "map_b000"; addr $b000; comment "referenced by routine at $B0C4"; };
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_initial_vectors_minus_one"; addr $85d3; comment "1-indexed"; };
label { name "page6_vectors_minus_one"; addr $05ff; 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 what this is yet"; };
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 what this is yet"; };
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_b319"; start $b319; end $B44B; type bytetable; comment "referenced by routine at $B2FD"; };
range { name "data_table_b1df"; start $b1df; end $B27d; type bytetable; comment "dunno what this is for yet"; };
range { name "data_table_b2a8"; start $b2a8; end $B2df; type bytetable; comment "dunno what this is for yet"; };
range { name "data_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"; 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_bounce_2"; start $8a97; end $8abf; type bytetable; comment "used when jumpman is falling?"; };
label { name "sfx_death"; addr $8a60; comment "jumpman hit by bullet or started falling"; };
label { name "play_sfx_bounce_2"; 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 "xxx_level_something"; addr $8600; comment "gets called after the level is drawn & the intro music stops, and also during the level (?)"; };
label { name "xxx_level_something_jv"; addr $8009; comment "gets called after the level is drawn & the intro music stops, and also during the level (?)"; };
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 (level00_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