********************************************************************************
* Phantoms Five for the Apple II, by Nasir Gabelli *
* Copyright 1980 Sirius Software *
********************************************************************************
* This is a modified version of a cracked copy. *
********************************************************************************
* Disassembly by Andy McFadden, using 6502bench SourceGen v1.7.2. *
* Last updated 2020/08/23 *
* *
* Note the entry point is at $3000, not the start of the file. *
********************************************************************************
* The first 8 lines of the screen display the status, usually score/lives but *
* sometimes a flashing message. During the bombing phase, the rest of the *
* screen shows scrolling terrain on the odd lines, and the player's plane on *
* the even lines. The quick flak pops and bomb explosions are drawn on top of *
* the terrain, while the damaging flak bursts are drawn on the even lines. *
********************************************************************************
O_EXPL_STATE .eq $00 {const} ;animation frame counter, initially 1
O_EXPL_VIGOR .eq $01 {const} ;explosion size, 4/8/14
O_EXPL_ROW .eq $02 {const} ;screen row
start_row .eq $04 ;bitmap copy: start row (0-191)
end_row .eq $05 ;bitmap copy: end row (0-191)
start_col .eq $06 ;bitmap copy: start col (0-39)
end_col .eq $07 ;bitmap copy: end col (0-39)
player_row .eq $0c ;row where top of plane/sight drawn
player_col .eq $0d ;player horiz byte position (0-34 by two)
player_col_shift .eq $0e ;player horiz pixel position (0-6)
player_desired_xc .eq $10 ;desired horiziontal coord (0-60)
player_cur_xc .eq $11 ;current horizontal coord (0-60)
player_slide_ctr .eq $12 ;controls player up/down slide
frame_counter .eq $20 ;counts down frames until events
plyr_crash_ctr .eq $21 ;show player crash until counter expires
dogfight_upd_ctr .eq $22 ;controls pace of dogfight
restart_vec .eq $4e {addr/2} ;reboot vector, set by title program
score .eq $50 {addr/6} ;score, as 6 individual digits
player_level .eq $56 ;difficulty level (1-5)
targets_hit .eq $57 {addr/3} ;number of targets hit, as 3 digits
planes_hit .eq $5a {addr/3} ;number of planes hit, as 3 digits
player_lives .eq $5d ;number of planes remaining
terrain_src_ptr .eq $60 {addr/2} ;points to top line in terrain data
wronly_62? .eq $62 ;written, never read
air_attack_msg_flag .eq $63 ;bool 00/01: showing "air attack" msg?
bombrun_timer_lo .eq $64 ;low part of bomb run phase timer
frames_until_dogfight .eq $65 ;show "air attack" msg for this long
dogfight_remain .eq $66 ;# of planes remaining to destroy
bombrun_timer_hi .eq $67 ;high part of bomb run phase timer
eplane_suppress_fire .eq $68 ;bool 00/01: enemy gunfire suppressed?
gun_fire_count .eq $6a ;counts down bullets fired per button press
enemy_plane_sec_timer .eq $6b ;paces secondary plane updates
enemy_plane_state1 .eq $70 {addr/8} ;swap with primary state at $a0-a7
bullet_rows .eq $90 {addr/7} ;used to erase bullets
bullet_cols .eq $97 {addr/7} ;used to erase bullets
bullet_draw_index .eq $9e ;cycles through 0-6
bullet_erase_index .eq $9f ;used to erase bullets (0-6)
eplane_state .eq $a0 ;0=inactive, <$80=alive, >$80=exploding
eplane_row .eq $a1 ;enemy plane: top row
eplane_col .eq $a2 ;enemy plane: leftmost column
eplane_float_dir .eq $a3 ;$00=up, $ff=down
eplane_veer_dir .eq $a4 ;$01=climb, $02=left, $03=right
eplane_float_time .eq $a5 ;duration of float in given direction
eplane_float_ctr .eq $a6 ;counts down to float dir change
eplane_frame_hold_ctr .eq $a7 ;how long to hold each animation frame
gun_sound_ctr .eq $af ;controls gun-firing sound
bullet_flying_flag .eq $b0 ;bool 00/01: is a bullet in flight?
bullet_row .eq $b1 ;bullet's current row (8-191)
bullet_col_byte .eq $b2 ;bullet horizontal byte posn (0-39)
bullet_col_pixel .eq $b3 ;bullet horizontal pixel posn (0-6)
bullet_horiz_count .eq $b4 ;used to reset counter; |$80 for leftward
bullet_horiz_ctr .eq $b5 ;counts down to horizontal move
bullet_vert_count .eq $b6 ;used to reset counter
bullet_vert_ctr .eq $b7 ;counts down to vertical move
flak_burst_ctr .eq $c0 ;countdown to next flak burst
burst_pending_state .eq $c1 ;0=not, 1=draw, 2=erase, 3=wait
burst_delay_ctr .eq $c3 ;counts delay between pop and burst
flak_burst_pop_row .eq $c4 ;current row of pre-burst pop
flak_burst_pop_col .eq $c5 ;current column of pre-burst pop
flak_burst_state .eq $d0 ;animation frame; 0 if inactive
flak_burst_row .eq $d1 ;current row of flak burst
flak_burst_col .eq $d2 ;current column of flak burst
bomb_explosion0 .eq $e0 {addr/4} ;bomb explosion state (slot 0)
bomb_explosion1 .eq $e4 {addr/4} ;bomb explosion state (slot 1)
bomb_explosion2 .eq $e8 {addr/4} ;bomb explosion state (slot 2)
bomb_explosion3 .eq $ec {addr/4} ;bomb explosion state (slot 3)
bomb_state .eq $f0 ;0=not falling, 1-8=falling, 9=impact
bomb_vert_posn .eq $f1 ;current row of falling bomb
bomb_horiz_posn .eq $f2 ;current column of falling bomb
bomb_exp_slot .eq $f3 ;cycles through bomb slots (0-4)
bomb_explosion4 .eq $f4 {addr/4} ;bomb explosion state (slot 4)
player_crash_state .eq $f8 ;0=alive, 1+ = crash animation frame
plyr_crash_row .eq $f9 ;current row of crashing player plane
plyr_crash_col .eq $fa ;current column of crashing player plane
plyr_crash_flags .eq $fb ;bit flags: $01=on right, $02=very low
player_as_plane .eq $fd ;bool 00/01: draw player as plane?
flak0_state .eq $0300 ;0=inactive, 1=need draw, 2=need erase
flak0_row .eq $0303 ;row where flak appears
flak0_col .eq $0304 ;column where flak appears
flak1_state .eq $0308 ;0=inactive, 1=need draw, 2=need erase
flak1_row .eq $030a ;row where flak appears
flak1_col .eq $030b ;column where flak appears
flak_delay_ctr .eq $030c ;time between flakkings
HIRES_PAGE1 .eq $2000 {addr/8192} ;hi-res screen, page 1
KBD .eq $c000 ;R last key pressed + 128
KBDSTRB .eq $c010 ;RW keyboard strobe
SPKR .eq $c030 ;RW toggle speaker
BUTN0 .eq $c061 ;R switch input 0 / open-apple
PADDL0 .eq $c064 ;R analog input 0
PTRIG .eq $c070 ;RW analog input reset
ROMIN_RO .eq $c082 ;RW read ROM, no write
LCBANK2 .eq $c083 ;RWx2 read/write RAM bank 2
MON_WAIT .eq $fca8 ;delay for (26 + 27*Acc + 5*(Acc*Acc))/2 cycles
RESET_VECTOR .eq $fffc {addr/2} ;6502 reset vector
.org $0400
;
; Scrolls the terrain on the hi-res screen, copying odd lines down two lines,
; and adding one new line from the terrain data. This does not include the top
; 8 lines, which hold the status text.
;
; The code is on text page 1, so it has to step around the screen holes.
;
0400: a0 00 ScrollTerrain ldy #$00
0402: b9 d0 37 :ScrollLoop lda HIRES_PAGE1+$17d0,y ;read line 189
0405: 99 d0 3f sta HIRES_PAGE1+$1fd0,y ;write line 191
0408: b9 d0 2f lda HIRES_PAGE1+$fd0,y ;read line 187
040b: 99 d0 37 sta HIRES_PAGE1+$17d0,y ;write line 189
040e: b9 d0 27 lda HIRES_PAGE1+$7d0,y ; ...
0411: 99 d0 2f sta HIRES_PAGE1+$fd0,y
0414: b9 50 3f lda HIRES_PAGE1+$1f50,y
0417: 99 d0 27 sta HIRES_PAGE1+$7d0,y
041a: b9 50 37 lda HIRES_PAGE1+$1750,y
041d: 99 50 3f sta HIRES_PAGE1+$1f50,y
0420: b9 50 2f lda HIRES_PAGE1+$f50,y
0423: 99 50 37 sta HIRES_PAGE1+$1750,y
0426: b9 50 27 lda HIRES_PAGE1+$750,y
0429: 99 50 2f sta HIRES_PAGE1+$f50,y
042c: b9 d0 3e lda HIRES_PAGE1+$1ed0,y
042f: 99 50 27 sta HIRES_PAGE1+$750,y
0432: b9 d0 36 lda HIRES_PAGE1+$16d0,y
0435: 99 d0 3e sta HIRES_PAGE1+$1ed0,y
0438: b9 d0 2e lda HIRES_PAGE1+$ed0,y
043b: 99 d0 36 sta HIRES_PAGE1+$16d0,y
043e: b9 d0 26 lda HIRES_PAGE1+$6d0,y
0441: 99 d0 2e sta HIRES_PAGE1+$ed0,y
0444: b9 50 3e lda HIRES_PAGE1+$1e50,y
0447: 99 d0 26 sta HIRES_PAGE1+$6d0,y
044a: b9 50 36 lda HIRES_PAGE1+$1650,y
044d: 99 50 3e sta HIRES_PAGE1+$1e50,y
0450: b9 50 2e lda HIRES_PAGE1+$e50,y
0453: 99 50 36 sta HIRES_PAGE1+$1650,y
0456: b9 50 26 lda HIRES_PAGE1+$650,y
0459: 99 50 2e sta HIRES_PAGE1+$e50,y
045c: b9 d0 3d lda HIRES_PAGE1+$1dd0,y
045f: 99 50 26 sta HIRES_PAGE1+$650,y
0462: b9 d0 35 lda HIRES_PAGE1+$15d0,y
0465: 99 d0 3d sta HIRES_PAGE1+$1dd0,y
0468: b9 d0 2d lda HIRES_PAGE1+$dd0,y
046b: 99 d0 35 sta HIRES_PAGE1+$15d0,y
046e: b9 d0 25 lda HIRES_PAGE1+$5d0,y
0471: 99 d0 2d sta HIRES_PAGE1+$dd0,y
0474: 4c 80 04 jmp :Cont480
0477: 00 06 04 04+ .junk 9 ;screen hole $478-47f
0480: b9 50 3d :Cont480 lda HIRES_PAGE1+$1d50,y
0483: 99 d0 25 sta HIRES_PAGE1+$5d0,y
0486: b9 50 35 lda HIRES_PAGE1+$1550,y
0489: 99 50 3d sta HIRES_PAGE1+$1d50,y
048c: b9 50 2d lda HIRES_PAGE1+$d50,y
048f: 99 50 35 sta HIRES_PAGE1+$1550,y
0492: b9 50 25 lda HIRES_PAGE1+$550,y
0495: 99 50 2d sta HIRES_PAGE1+$d50,y
0498: b9 d0 3c lda HIRES_PAGE1+$1cd0,y
049b: 99 50 25 sta HIRES_PAGE1+$550,y
049e: b9 d0 34 lda HIRES_PAGE1+$14d0,y
04a1: 99 d0 3c sta HIRES_PAGE1+$1cd0,y
04a4: b9 d0 2c lda HIRES_PAGE1+$cd0,y
04a7: 99 d0 34 sta HIRES_PAGE1+$14d0,y
04aa: b9 d0 24 lda HIRES_PAGE1+$4d0,y
04ad: 99 d0 2c sta HIRES_PAGE1+$cd0,y
04b0: b9 50 3c lda HIRES_PAGE1+$1c50,y
04b3: 99 d0 24 sta HIRES_PAGE1+$4d0,y
04b6: b9 50 34 lda HIRES_PAGE1+$1450,y
04b9: 99 50 3c sta HIRES_PAGE1+$1c50,y
04bc: b9 50 2c lda HIRES_PAGE1+$c50,y
04bf: 99 50 34 sta HIRES_PAGE1+$1450,y
04c2: b9 50 24 lda HIRES_PAGE1+$450,y
04c5: 99 50 2c sta HIRES_PAGE1+$c50,y
04c8: b9 a8 3f lda HIRES_PAGE1+$1fa8,y
04cb: 99 50 24 sta HIRES_PAGE1+$450,y
04ce: b9 a8 37 lda HIRES_PAGE1+$17a8,y
04d1: 99 a8 3f sta HIRES_PAGE1+$1fa8,y
04d4: b9 a8 2f lda HIRES_PAGE1+$fa8,y
04d7: 99 a8 37 sta HIRES_PAGE1+$17a8,y
04da: b9 a8 27 lda HIRES_PAGE1+$7a8,y
04dd: 99 a8 2f sta HIRES_PAGE1+$fa8,y
04e0: b9 28 3f lda HIRES_PAGE1+$1f28,y
04e3: 99 a8 27 sta HIRES_PAGE1+$7a8,y
04e6: b9 28 37 lda HIRES_PAGE1+$1728,y
04e9: 99 28 3f sta HIRES_PAGE1+$1f28,y
04ec: b9 28 2f lda HIRES_PAGE1+$f28,y
04ef: 99 28 37 sta HIRES_PAGE1+$1728,y
04f2: b9 28 27 lda HIRES_PAGE1+$728,y
04f5: 4c 00 05 jmp :Cont500
04f8: 04 00 00 00+ .junk 8 ;screen hole
0500: 99 28 2f :Cont500 sta HIRES_PAGE1+$f28,y
0503: b9 a8 3e lda HIRES_PAGE1+$1ea8,y
0506: 99 28 27 sta HIRES_PAGE1+$728,y
0509: b9 a8 36 lda HIRES_PAGE1+$16a8,y
050c: 99 a8 3e sta HIRES_PAGE1+$1ea8,y
050f: b9 a8 2e lda HIRES_PAGE1+$ea8,y
0512: 99 a8 36 sta HIRES_PAGE1+$16a8,y
0515: b9 a8 26 lda HIRES_PAGE1+$6a8,y
0518: 99 a8 2e sta HIRES_PAGE1+$ea8,y
051b: b9 28 3e lda HIRES_PAGE1+$1e28,y
051e: 99 a8 26 sta HIRES_PAGE1+$6a8,y
0521: b9 28 36 lda HIRES_PAGE1+$1628,y
0524: 99 28 3e sta HIRES_PAGE1+$1e28,y
0527: b9 28 2e lda HIRES_PAGE1+$e28,y
052a: 99 28 36 sta HIRES_PAGE1+$1628,y
052d: b9 28 26 lda HIRES_PAGE1+$628,y
0530: 99 28 2e sta HIRES_PAGE1+$e28,y
0533: b9 a8 3d lda HIRES_PAGE1+$1da8,y
0536: 99 28 26 sta HIRES_PAGE1+$628,y
0539: b9 a8 35 lda HIRES_PAGE1+$15a8,y
053c: 99 a8 3d sta HIRES_PAGE1+$1da8,y
053f: b9 a8 2d lda HIRES_PAGE1+$da8,y
0542: 99 a8 35 sta HIRES_PAGE1+$15a8,y
0545: b9 a8 25 lda HIRES_PAGE1+$5a8,y
0548: 99 a8 2d sta HIRES_PAGE1+$da8,y
054b: b9 28 3d lda HIRES_PAGE1+$1d28,y
054e: 99 a8 25 sta HIRES_PAGE1+$5a8,y
0551: b9 28 35 lda HIRES_PAGE1+$1528,y
0554: 99 28 3d sta HIRES_PAGE1+$1d28,y
0557: b9 28 2d lda HIRES_PAGE1+$d28,y
055a: 99 28 35 sta HIRES_PAGE1+$1528,y
055d: b9 28 25 lda HIRES_PAGE1+$528,y
0560: 99 28 2d sta HIRES_PAGE1+$d28,y
0563: b9 a8 3c lda HIRES_PAGE1+$1ca8,y
0566: 99 28 25 sta HIRES_PAGE1+$528,y
0569: b9 a8 34 lda HIRES_PAGE1+$14a8,y
056c: 99 a8 3c sta HIRES_PAGE1+$1ca8,y
056f: b9 a8 2c lda HIRES_PAGE1+$ca8,y
0572: 99 a8 34 sta HIRES_PAGE1+$14a8,y
0575: 4c 80 05 jmp :Cont580
0578: 24 00 00 00+ .junk 8 ;screen hole
0580: b9 a8 24 :Cont580 lda HIRES_PAGE1+$4a8,y
0583: 99 a8 2c sta HIRES_PAGE1+$ca8,y
0586: b9 28 3c lda HIRES_PAGE1+$1c28,y
0589: 99 a8 24 sta HIRES_PAGE1+$4a8,y
058c: b9 28 34 lda HIRES_PAGE1+$1428,y
058f: 99 28 3c sta HIRES_PAGE1+$1c28,y
0592: b9 28 2c lda HIRES_PAGE1+$c28,y
0595: 99 28 34 sta HIRES_PAGE1+$1428,y
0598: b9 28 24 lda HIRES_PAGE1+$428,y
059b: 99 28 2c sta HIRES_PAGE1+$c28,y
059e: b9 80 3f lda HIRES_PAGE1+$1f80,y
05a1: 99 28 24 sta HIRES_PAGE1+$428,y
05a4: b9 80 37 lda HIRES_PAGE1+$1780,y
05a7: 99 80 3f sta HIRES_PAGE1+$1f80,y
05aa: b9 80 2f lda HIRES_PAGE1+$f80,y
05ad: 99 80 37 sta HIRES_PAGE1+$1780,y
05b0: b9 80 27 lda HIRES_PAGE1+$780,y
05b3: 99 80 2f sta HIRES_PAGE1+$f80,y
05b6: b9 00 3f lda HIRES_PAGE1+$1f00,y
05b9: 99 80 27 sta HIRES_PAGE1+$780,y
05bc: b9 00 37 lda HIRES_PAGE1+$1700,y
05bf: 99 00 3f sta HIRES_PAGE1+$1f00,y
05c2: b9 00 2f lda HIRES_PAGE1+$f00,y
05c5: 99 00 37 sta HIRES_PAGE1+$1700,y
05c8: b9 00 27 lda HIRES_PAGE1+$700,y
05cb: 99 00 2f sta HIRES_PAGE1+$f00,y
05ce: b9 80 3e lda HIRES_PAGE1+$1e80,y
05d1: 99 00 27 sta HIRES_PAGE1+$700,y
05d4: b9 80 36 lda HIRES_PAGE1+$1680,y
05d7: 99 80 3e sta HIRES_PAGE1+$1e80,y
05da: b9 80 2e lda HIRES_PAGE1+$e80,y
05dd: 99 80 36 sta HIRES_PAGE1+$1680,y
05e0: b9 80 26 lda HIRES_PAGE1+$680,y
05e3: 99 80 2e sta HIRES_PAGE1+$e80,y
05e6: b9 00 3e lda HIRES_PAGE1+$1e00,y
05e9: 99 80 26 sta HIRES_PAGE1+$680,y
05ec: b9 00 36 lda HIRES_PAGE1+$1600,y
05ef: 99 00 3e sta HIRES_PAGE1+$1e00,y
05f2: b9 00 2e lda HIRES_PAGE1+$e00,y
05f5: 4c 00 06 jmp :Cont600
05f8: 60 00 00 00+ .junk 8 ;screen hole
0600: 99 00 36 :Cont600 sta HIRES_PAGE1+$1600,y
0603: b9 00 26 lda HIRES_PAGE1+$600,y
0606: 99 00 2e sta HIRES_PAGE1+$e00,y
0609: b9 80 3d lda HIRES_PAGE1+$1d80,y
060c: 99 00 26 sta HIRES_PAGE1+$600,y
060f: b9 80 35 lda HIRES_PAGE1+$1580,y
0612: 99 80 3d sta HIRES_PAGE1+$1d80,y
0615: b9 80 2d lda HIRES_PAGE1+$d80,y
0618: 99 80 35 sta HIRES_PAGE1+$1580,y
061b: b9 80 25 lda HIRES_PAGE1+$580,y
061e: 99 80 2d sta HIRES_PAGE1+$d80,y
0621: b9 00 3d lda HIRES_PAGE1+$1d00,y
0624: 99 80 25 sta HIRES_PAGE1+$580,y
0627: b9 00 35 lda HIRES_PAGE1+$1500,y
062a: 99 00 3d sta HIRES_PAGE1+$1d00,y
062d: b9 00 2d lda HIRES_PAGE1+$d00,y
0630: 99 00 35 sta HIRES_PAGE1+$1500,y
0633: b9 00 25 lda HIRES_PAGE1+$500,y
0636: 99 00 2d sta HIRES_PAGE1+$d00,y
0639: b9 80 3c lda HIRES_PAGE1+$1c80,y
063c: 99 00 25 sta HIRES_PAGE1+$500,y
063f: b9 80 34 lda HIRES_PAGE1+$1480,y
0642: 99 80 3c sta HIRES_PAGE1+$1c80,y
0645: b9 80 2c lda HIRES_PAGE1+$c80,y
0648: 99 80 34 sta HIRES_PAGE1+$1480,y
064b: b9 80 24 lda HIRES_PAGE1+$480,y ;read line 9
064e: 99 80 2c sta HIRES_PAGE1+$c80,y ;write line 11
0651: c8 iny
0652: c0 28 cpy #40 ;reached end of line?
0654: f0 03 beq :TopLine ;yes, bail
0656: 4c 02 04 jmp :ScrollLoop
; Draw the top line of the screen from the terrain data.
0659: 20 00 1c :TopLine jsr DecrTerrPtrAndDfC ;back up a line in the terrain data
065c: a0 00 ldy #$00
065e: b1 60 :LineLoop lda (terrain_src_ptr),y
0660: 99 80 24 sta HIRES_PAGE1+$480,y ;line 9
0663: c8 iny
0664: c0 28 cpy #40 ;done with line?
0666: 90 f6 bcc :LineLoop ;not yet
0668: 60 rts
0669: 00 00 00 00+ .align $0100 (151 bytes)
;
; Clears the screen to a specific color. Called when starting a bombing run
; (black), starting a dogfight (blue), or when the game is over (black).
;
; On entry:
; A-reg: color pattern (even bytes)
;
0700: a0 00 ClearScreen ldy #$00
0702: 99 00 20 :Loop sta HIRES_PAGE1,y
0705: 99 00 21 sta HIRES_PAGE1+$100,y
0708: 99 00 22 sta HIRES_PAGE1+$200,y
070b: 99 00 23 sta HIRES_PAGE1+$300,y
070e: 99 00 24 sta HIRES_PAGE1+$400,y
0711: 99 00 25 sta HIRES_PAGE1+$500,y
0714: 99 00 26 sta HIRES_PAGE1+$600,y
0717: 99 00 27 sta HIRES_PAGE1+$700,y
071a: 99 00 28 sta HIRES_PAGE1+$800,y
071d: 99 00 29 sta HIRES_PAGE1+$900,y
0720: 99 00 2a sta HIRES_PAGE1+$a00,y
0723: 99 00 2b sta HIRES_PAGE1+$b00,y
0726: 99 00 2c sta HIRES_PAGE1+$c00,y
0729: 99 00 2d sta HIRES_PAGE1+$d00,y
072c: 99 00 2e sta HIRES_PAGE1+$e00,y
072f: 99 00 2f sta HIRES_PAGE1+$f00,y
0732: 99 00 30 sta HIRES_PAGE1+$1000,y
0735: 99 00 31 sta HIRES_PAGE1+$1100,y
0738: 99 00 32 sta HIRES_PAGE1+$1200,y
073b: 99 00 33 sta HIRES_PAGE1+$1300,y
073e: 99 00 34 sta HIRES_PAGE1+$1400,y
0741: 99 00 35 sta HIRES_PAGE1+$1500,y
0744: 99 00 36 sta HIRES_PAGE1+$1600,y
0747: 99 00 37 sta HIRES_PAGE1+$1700,y
074a: 99 00 38 sta HIRES_PAGE1+$1800,y
074d: 99 00 39 sta HIRES_PAGE1+$1900,y
0750: 99 00 3a sta HIRES_PAGE1+$1a00,y
0753: 99 00 3b sta HIRES_PAGE1+$1b00,y
0756: 99 00 3c sta HIRES_PAGE1+$1c00,y
0759: 99 00 3d sta HIRES_PAGE1+$1d00,y
075c: 99 00 3e sta HIRES_PAGE1+$1e00,y
075f: 99 00 3f sta HIRES_PAGE1+$1f00,y
0762: c9 00 cmp #$00 ;clearing to black?
0764: f0 02 beq :NotColor ;yes, branch
0766: 49 7f eor #$7f ;no, flip pixels for odd/even columns
0768: c8 :NotColor iny
0769: d0 97 bne :Loop
076b: 60 rts
076c: 00 00 00 00+ .junk 20 ;junk + screen hole
;
; Draws a full set of terrain lines.
;
0780: a2 bf DrawFullTerrain ldx #191 ;bottom line of screen
0782: bd 00 08 :NextLine lda hires_addr_hi,x ;get hi-res line address
0785: 8d 97 07 sta :_Store+2
0788: bd c0 08 lda hires_addr_lo,x
078b: 8d 96 07 sta :_Store+1
078e: a0 00 ldy #$00
0790: 20 00 1c jsr DecrTerrPtrAndDfC ;back up a line in the terrain data
0793: b1 60 :_Load lda (terrain_src_ptr),y
0795: 99 00 20 :_Store sta HIRES_PAGE1,y
0798: c8 iny
0799: c0 28 cpy #40 ;done with line?
079b: 90 f6 bcc :_Load
079d: ca dex
079e: ca dex
079f: e0 09 cpx #$09 ;done with screen?
07a1: b0 df bcs :NextLine
07a3: 60 rts
07a4: 00 00 00 00+ .align $0100 (92 bytes)
;
; Hi-res line base address table.
0800: 20 24 28 2c+ hires_addr_hi .bulk $20,$24,$28,$2c,$30,$34,$38,$3c,$20,$24,$28,$2c,$30,$34,$38,$3c
+ $21,$25,$29,$2d,$31,$35,$39,$3d,$21,$25,$29,$2d,$31,$35,$39,$3d
+ $22,$26,$2a,$2e,$32,$36,$3a,$3e,$22,$26,$2a,$2e,$32,$36,$3a,$3e
+ $23,$27,$2b,$2f,$33,$37,$3b,$3f,$23,$27,$2b,$2f,$33,$37,$3b,$3f
+ $20,$24,$28,$2c,$30,$34,$38,$3c,$20,$24,$28,$2c,$30,$34,$38,$3c
+ $21,$25,$29,$2d,$31,$35,$39,$3d,$21,$25,$29,$2d,$31,$35,$39,$3d
+ $22,$26,$2a,$2e,$32,$36,$3a,$3e,$22,$26,$2a,$2e,$32,$36,$3a,$3e
+ $23,$27,$2b,$2f,$33,$37,$3b,$3f,$23,$27,$2b,$2f,$33,$37,$3b,$3f
+ $20,$24,$28,$2c,$30,$34,$38,$3c,$20,$24,$28,$2c,$30,$34,$38,$3c
+ $21,$25,$29,$2d,$31,$35,$39,$3d,$21,$25,$29,$2d,$31,$35,$39,$3d
+ $22,$26,$2a,$2e,$32,$36,$3a,$3e,$22,$26,$2a,$2e,$32,$36,$3a,$3e
+ $23,$27,$2b,$2f,$33,$37,$3b,$3f,$23,$27,$2b,$2f,$33,$37,$3b,$3f
08c0: 00 00 00 00+ hires_addr_lo .bulk $00,$00,$00,$00,$00,$00,$00,$00,$80,$80,$80,$80,$80,$80,$80,$80
+ $00,$00,$00,$00,$00,$00,$00,$00,$80,$80,$80,$80,$80,$80,$80,$80
+ $00,$00,$00,$00,$00,$00,$00,$00,$80,$80,$80,$80,$80,$80,$80,$80
+ $00,$00,$00,$00,$00,$00,$00,$00,$80,$80,$80,$80,$80,$80,$80,$80
+ $28,$28,$28,$28,$28,$28,$28,$28,$a8,$a8,$a8,$a8,$a8,$a8,$a8,$a8
+ $28,$28,$28,$28,$28,$28,$28,$28,$a8,$a8,$a8,$a8,$a8,$a8,$a8,$a8
+ $28,$28,$28,$28,$28,$28,$28,$28,$a8,$a8,$a8,$a8,$a8,$a8,$a8,$a8
+ $28,$28,$28,$28,$28,$28,$28,$28,$a8,$a8,$a8,$a8,$a8,$a8,$a8,$a8
+ $50,$50,$50,$50,$50,$50,$50,$50,$d0,$d0,$d0,$d0,$d0,$d0,$d0,$d0
+ $50,$50,$50,$50,$50,$50,$50,$50,$d0,$d0,$d0,$d0,$d0,$d0,$d0,$d0
+ $50,$50,$50,$50,$50,$50,$50,$50,$d0,$d0,$d0,$d0,$d0,$d0,$d0,$d0
+ $50,$50,$50,$50,$50,$50,$50,$50,$d0,$d0,$d0,$d0,$d0,$d0,$d0,$d0
;
; Bomb bitmaps (1x8, height doubled). There's only one version of these, not
; seven shifted forms, which is why bombs don't always line up with the plane.
0980: 04 0e 1f 1f+ bomb_0 .bulk $04,$0e,$1f,$1f,$1f,$0e,$1b,$00
0988: 00 06 0f 0f+ bomb_1 .bulk $00,$06,$0f,$0f,$0f,$06,$09,$00
0990: 00 00 04 0e+ bomb_2 .bulk $00,$00,$04,$0e,$0e,$0e,$04,$00
0998: 00 00 00 0e+ bomb_3 .bulk $00,$00,$00,$0e,$0e,$0e,$00,$00
;
; Draws a falling bomb. Like the player's plane, the bomb is drawn on even
; rows. The bomb is one byte wide.
;
; On entry:
; $04: start row
; $05: end row (exclusive)
; $07: must be $00 (used as data index)
;
09a0: a5 04 DrawBomb lda start_row
09a2: 38 sec
09a3: e9 04 sbc #$04 ;previous bomb was drawn a few lines up,
09a5: aa tax ; so erase those (SBC #$02 is sufficent)
09a6: e0 c0 :RowLoop1 cpx #192 ;off bottom of screen?
09a8: b0 1b bcs :NextLine1 ;yes, skip draw
09aa: e0 08 cpx #$08 ;off top of screen?
09ac: 90 17 bcc :NextLine1 ;yes, skip draw
09ae: bd 00 08 lda hires_addr_hi,x ;set up hi-res address
09b1: 8d c4 09 sta :_Store1+2
09b4: bd c0 08 lda hires_addr_lo,x
09b7: 8d c3 09 sta :_Store1+1
09ba: a4 06 ldy start_col ;get column
09bc: c0 28 cpy #40 ;off screen left/right?
09be: b0 05 bcs :NextLine1
09c0: a9 00 lda #$00 ;draw black pixels
09c2: 99 d0 38 :_Store1 sta HIRES_PAGE1+$18d0,y ;erase previous bomb
09c5: e8 :NextLine1 inx
09c6: e8 inx
09c7: e4 04 cpx start_row ;stop when we reach first row of new output
09c9: d0 db bne :RowLoop1
; Draw bomb.
09cb: e0 c0 :RowLoop2 cpx #192 ;off bottom of screen?
09cd: b0 1c bcs :NextLine2 ;yes, skip draw
09cf: e0 08 cpx #$08 ;off top of screen?
09d1: 90 18 bcc :NextLine2 ;yes, skip draw
09d3: bd 00 08 lda hires_addr_hi,x ;set up hi-res address
09d6: 8d e8 09 sta :_Store+2
09d9: bd c0 08 lda hires_addr_lo,x
09dc: 8d e7 09 sta :_Store+1
09df: a4 07 ldy end_col
09e1: b9 98 09 _LoadBombGfx lda bomb_3,y ;get pixels from bitmap, set earlier
09e4: a4 06 ldy start_col
09e6: 99 d0 39 :_Store sta HIRES_PAGE1+$19d0,y ;copy to screen
09e9: e6 07 inc end_col ;increment index into bitmap data
09eb: e8 :NextLine2 inx
09ec: e8 inx
09ed: e4 05 cpx end_row ;done with rows?
09ef: d0 da bne :RowLoop2 ;not yet
09f1: 60 rts
09f2: 00 00 00 00+ .junk 5
;
; Addresses of bomb bitmaps (1x8, height doubled) This is just the low byte of
; the address; all bitmaps are at $09xx. Note each frame is shown twice.
09f7: 00 bomb_addrs .dd1 $00 ;state 0
09f8: 80 .dd1 <bomb_0
09f9: 80 .dd1 <bomb_0
09fa: 88 .dd1 <bomb_1
09fb: 88 .dd1 <bomb_1
09fc: 90 .dd1 <bomb_2
09fd: 90 .dd1 <bomb_2
09fe: 98 .dd1 <bomb_3
09ff: 98 .dd1 <bomb_3 ;state 8
;
; Updates the state of a falling bomb. Handles impact detonation.
;
• Clear variables
]hptr .var $00 {addr/2}
0a00: a5 f0 UpdateBomb lda bomb_state ;check bomb state
0a02: d0 01 bne :Active ;it's active, branch
0a04: 60 rts
0a05: c9 09 :Active cmp #$09 ;have we hit the ground?
0a07: b0 27 bcs :BombImpact ;yes, go deal with that
0a09: aa tax ;no, draw it
0a0a: bd f7 09 lda bomb_addrs,x ;set up bitmap address
0a0d: 8d e2 09 sta _LoadBombGfx+1 ;high byte doesn't change
0a10: a5 f1 lda bomb_vert_posn ;set up bomb renderer
0a12: 85 04 sta start_row
0a14: 18 clc
0a15: 69 10 adc #16 ;16 rows high (8 * 2)
0a17: 85 05 sta end_row
0a19: a5 f2 lda bomb_horiz_posn
0a1b: 85 06 sta start_col
0a1d: a9 00 lda #$00
0a1f: 85 07 sta end_col ;used as data index
0a21: e6 f0 inc bomb_state ;advance bomb state
0a23: a5 f1 lda bomb_vert_posn ;move down so it falls behind player plane
0a25: 18 clc
0a26: 69 02 adc #$02 ;+2 rows (need to stay on even rows)
0a28: 85 f1 sta bomb_vert_posn
0a2a: 4c a0 09 jmp DrawBomb ;draw it; erases previous remnant
0a2d: ea ea ea .junk 3
; Bomb has hit the ground. We need to erase it, because the bomb explosion is
; drawn on the odd (terrain) lines rather than the even (player) lines and won't
; overwrite it.
0a30: a9 00 :BombImpact lda #$00
0a32: 85 f0 sta bomb_state ;reset bomb state
; Erase bomb.
0a34: a5 f1 lda bomb_vert_posn
0a36: aa tax ;set top row
0a37: 18 clc
0a38: 69 10 adc #16 ;erase all 16 rows
0a3a: 85 05 sta end_row
0a3c: a4 f2 ldy bomb_horiz_posn ;get column
0a3e: e0 c0 :EraseLoop cpx #192 ;off the bottom?
0a40: b0 12 bcs :NextRow ;yes, branch
0a42: e0 08 cpx #8 ;off the top?
0a44: 90 0e bcc :NextRow ;yes, branch
0a46: bd 00 08 lda hires_addr_hi,x ;set up hi-res addr
0a49: 85 01 sta ]hptr+1
0a4b: bd c0 08 lda hires_addr_lo,x
0a4e: 85 00 sta ]hptr
0a50: a9 00 lda #$00 ;black pixels
0a52: 91 00 sta (]hptr),y
0a54: e8 :NextRow inx
0a55: e8 inx
0a56: e4 05 cpx end_row ;done with bitmap?
0a58: d0 e4 bne :EraseLoop ;not yet, loop
0a5a: 4c 8f 0b jmp HandleBombImpact ;consequence time
0a5d: 00 00 00 .junk 3
;
; Checks to see if the button is down. If so, and a bomb is not already
; falling, drop one.
;
; Holding the button down drops bombs continuously.
;
0a60: a5 f0 CheckBombButton lda bomb_state ;is a bomb falling?
0a62: f0 01 beq :DoCheck ;no, check button
0a64: 60 rts
0a65: ad 61 c0 :DoCheck lda BUTN0 ;get button state
0a68: 30 06 bmi :ButtonDown ;pressed, branch
0a6a: 60 rts
0a6b: 61 c0 30 01+ .junk 5
0a70: a9 01 :ButtonDown lda #$01
0a72: 85 f0 sta bomb_state ;set button-down flag
0a74: a5 0c lda player_row
0a76: 18 clc
0a77: 69 34 adc #52 ;move down screen to bottom of plane
0a79: c9 c0 cmp #192 ;off bottom of screen?
0a7b: 90 05 bcc :OnScreen ;no, branch
0a7d: a9 00 lda #$00 ;whoops, cancel bomb
0a7f: 85 f0 sta bomb_state
0a81: 60 rts
0a82: 85 f1 :OnScreen sta bomb_vert_posn ;set as bomb position (vertical)
0a84: a5 0e lda player_col_shift ;get two-pixel shift amount (0-6)
0a86: 4a lsr A ;divide by 4 to get byte offset (0-1)
0a87: 4a lsr A
0a88: 18 clc
0a89: 65 0d adc player_col ;add column (0-34); result is still 0-34
0a8b: 69 03 adc #$03 ;add 3 to center it on plane (now 3-37)
0a8d: c9 28 cmp #40 ;off screen?
0a8f: 90 05 bcc :OnScreen2 ;no, branch
0a91: a9 00 lda #$00 ;whoops, cancel bomb
0a93: 85 f0 sta bomb_state
0a95: 60 rts
0a96: 85 f2 :OnScreen2 sta bomb_horiz_posn ;set as bomb position (horizontal)
0a98: 60 rts
0a99: 00 00 00 00+ .junk 6
;
; Addresses of bomb explosion animations.
bomb_exp_addr_lo
0a9f: 00 .dd1 $00
0aa0: 00 .dd1 <bomb_expl_0
0aa1: 6c .dd1 <bomb_expl_1
0aa2: d8 .dd1 <bomb_expl_2 ;max frame (low-value)
0aa3: 44 .dd1 <bomb_expl_3
0aa4: b0 .dd1 <bomb_expl_4
0aa5: 1c .dd1 <bomb_expl_5
0aa6: 88 .dd1 <bomb_expl_6 ;max frame (medium-value)
0aa7: f4 .dd1 <bomb_expl_7
0aa8: 60 .dd1 <bomb_expl_8
0aa9: cc .dd1 <bomb_expl_9
0aaa: 38 .dd1 <bomb_expl_a
0aab: cc .dd1 <bomb_expl_9
0aac: 38 .dd1 <bomb_expl_a ;max frame (high-value)
0aad: 00 00 .junk 2
bomb_exp_addr_hi
0aaf: 00 .dd1 $00
0ab0: 67 .dd1 >bomb_expl_0
0ab1: 67 .dd1 >bomb_expl_1
0ab2: 67 .dd1 >bomb_expl_2
0ab3: 68 .dd1 >bomb_expl_3
0ab4: 68 .dd1 >bomb_expl_4
0ab5: 69 .dd1 >bomb_expl_5
0ab6: 69 .dd1 >bomb_expl_6
0ab7: 69 .dd1 >bomb_expl_7
0ab8: 6a .dd1 >bomb_expl_8
0ab9: 6a .dd1 >bomb_expl_9
0aba: 6b .dd1 >bomb_expl_a
0abb: 6a .dd1 >bomb_expl_9
0abc: 6b .dd1 >bomb_expl_a
0abd: 00 00 00 .junk 3
;
; Draws a bomb explosion bitmap.
;
; Each frame is drawn without erasing the previous frame, and zero-valued bytes
; aren't copied. This means that parts of previous frames may blend with the
; current frame. This is important because the explosion is drawn on odd
; (terrain) lines, and needs to blend with the terrain features.
;
; On entry:
; A-reg: bitmap index (1-13)
;
0ac0: aa DrawBombExp1 tax
0ac1: bd 9f 0a lda bomb_exp_addr_lo,x ;set up bitmap address
0ac4: 8d ea 0a sta :_Load+1
0ac7: bd af 0a lda bomb_exp_addr_hi,x
0aca: 8d eb 0a sta :_Load+2
0acd: a6 04 ldx start_row ;get top row
0acf: e0 c0 :RowLoop cpx #192 ;off bottom of screen?
0ad1: b0 31 bcs :ClickReturn ;yes, bail
0ad3: e0 08 cpx #8 ;off top of screen?
0ad5: 90 2d bcc :ClickReturn ;yes, bail
0ad7: bd 00 08 lda hires_addr_hi,x ;set up hi-res address
0ada: 8d f0 0a sta :_Store+2
0add: bd c0 08 lda hires_addr_lo,x
0ae0: 8d ef 0a sta :_Store+1
0ae3: a4 06 ldy start_col ;get left column
0ae5: c0 28 :ColLoop cpy #40 ;check left/right
0ae7: b0 08 bcs :SkipDraw ;off screen, skip
0ae9: ad 94 69 :_Load lda bomb_expl_6+12 ;get pixels
0aec: f0 03 beq :SkipDraw ;all black, don't write
0aee: 99 d0 3f :_Store sta HIRES_PAGE1+$1fd0,y ;update hi-res screen
0af1: c8 :SkipDraw iny ;advance column
0af2: ee ea 0a inc :_Load+1 ;advance bitmap pointer
0af5: d0 03 bne :NoInc
0af7: ee eb 0a inc :_Load+2
0afa: c4 07 :NoInc cpy end_col ;done with row?
0afc: d0 e7 bne :ColLoop ;not yet, loop
0afe: e8 inx ;advance row by 2 (odd lines only)
0aff: e8 inx
0b00: e4 05 cpx end_row ;done?
0b02: d0 cb bne :RowLoop ;no, loop
0b04: 8d 30 c0 :ClickReturn sta SPKR ;click
0b07: 60 rts
0b08: 00 00 00 00+ .junk 8
;
; Draws current frame of bomb explosion sequence. The state advances until it
; reaches the max (which is determined by target value), and then cycles between
; the last two frames until it falls off the screen.
;
; There are five explosion state areas on the direct page, 4 bytes each. Pass
; in a pointer to one of them.
;
; On entry:
; $00-01: pointer to bomb explosion state
;
• Clear variables
]bomb_exp_ptr .var $00 {addr/2}
]cur_frame .var $02 {addr/1}
DrawBombExplosion
0b10: a0 00 ldy #O_EXPL_STATE
0b12: b1 00 lda (]bomb_exp_ptr),y ;get state
0b14: d0 01 bne :Cont ;exploding, continue
0b16: 60 rts
0b17: 85 02 :Cont sta ]cur_frame ;save state
0b19: c8 iny ;O_EXPL_VIGOR
0b1a: b1 00 lda (]bomb_exp_ptr),y ;get max frame value
0b1c: 88 dey ;O_EXPL_STATE
0b1d: c5 02 cmp ]cur_frame ;reached max for this explosion?
0b1f: d0 0b bne :Advance ;not yet
0b21: b1 00 lda (]bomb_exp_ptr),y ;get state
0b23: 38 sec
0b24: e9 02 sbc #$02 ;drop us back two frames
0b26: 91 00 sta (]bomb_exp_ptr),y ;save state
0b28: 4c 33 0b jmp :DoDraw
0b2b: ea .junk 1
0b2c: b1 00 :Advance lda (]bomb_exp_ptr),y ;get state
0b2e: 18 clc
0b2f: 69 01 adc #$01 ;advance animation one frame forward
0b31: 91 00 sta (]bomb_exp_ptr),y ;save state
0b33: a0 02 :DoDraw ldy #O_EXPL_ROW ;set up bitmap renderer
0b35: b1 00 lda (]bomb_exp_ptr),y ;get row
0b37: 85 04 sta start_row
0b39: 18 clc
0b3a: 69 24 adc #36 ;36 lines high
0b3c: 85 05 sta end_row
0b3e: c8 iny ;O_EXPL_COL
0b3f: b1 00 lda (]bomb_exp_ptr),y
0b41: 85 06 sta start_col
0b43: 18 clc
0b44: 69 06 adc #6 ;6 bytes wide
0b46: 85 07 sta end_col
0b48: a0 00 ldy #$00
0b4a: b1 00 lda (]bomb_exp_ptr),y ;get state
0b4c: 38 sec
0b4d: e9 01 sbc #$01 ;subtract one to counteract earlier increment
0b4f: 20 c0 0a jsr DrawBombExp1 ;draw it
0b52: a0 02 ldy #$02
0b54: b1 00 lda (]bomb_exp_ptr),y ;get current row
0b56: 18 clc ;add 4 (2 rows per frame, we're called
0b57: 69 04 adc #$04 ; on alternate frames)
0b59: c9 c0 cmp #192 ;reached bottom of screen?
0b5b: b0 03 bcs :StopExplosion ;yes, deactivate the explosion
0b5d: 91 00 sta (]bomb_exp_ptr),y ;no, save updated value
0b5f: 60 rts
0b60: a0 00 :StopExplosion ldy #$00
0b62: a9 00 lda #$00
0b64: 91 00 sta (]bomb_exp_ptr),y
0b66: 60 rts
0b67: 00 .junk 1
;
; Addresses of zero-page locations that hold the bomb explosion animation state
; (4 bytes each).
0b68: e0 bomb_exp_addrs .dd1 bomb_explosion0
0b69: e4 .dd1 bomb_explosion1
0b6a: e8 .dd1 bomb_explosion2
0b6b: ec .dd1 bomb_explosion3
0b6c: f4 .dd1 bomb_explosion4
0b6d: 00 00 00 .junk 3
;
; Draws all of the active bomb explosions.
;
DrawBombExplosions
0b70: a9 00 lda #$00 ;start at index 0
0b72: 48 :Loop pha ;hang on to this
0b73: aa tax
0b74: bd 68 0b lda bomb_exp_addrs,x ;get ZP address of slot N
0b77: 85 00 sta ]bomb_exp_ptr ;store in pointer
0b79: a9 00 lda #$00
0b7b: 85 01 sta ]bomb_exp_ptr+1 ;set high byte
0b7d: 20 10 0b jsr DrawBombExplosion ;draw the explosion if it's active
0b80: 68 pla ;restore index
0b81: 18 clc
0b82: 69 01 adc #$01 ;increment (no INC A on 6502)
0b84: c9 05 cmp #$05 ;done yet?
0b86: 90 ea bcc :Loop ;no, branch
0b88: 60 rts
0b89: 00 00 00 00+ .junk 6
;
; Handles bomb hitting the ground. Set up explosion record, update score.
;
]hptr .var $02 {addr/2}
HandleBombImpact
0b8f: e6 f3 inc bomb_exp_slot ;move to next slot
0b91: a5 f3 lda bomb_exp_slot
0b93: c9 05 cmp #$05 ;reached the limit?
0b95: 90 04 bcc :Sub5 ;not yet, branch
0b97: a9 00 lda #$00
0b99: 85 f3 sta bomb_exp_slot ;back to zero
0b9b: aa :Sub5 tax ;use as index
0b9c: bd 68 0b lda bomb_exp_addrs,x ;get address of 4-byte record in ZP
0b9f: 85 00 sta ]bomb_exp_ptr ;put in pointer
0ba1: a9 00 lda #$00
0ba3: 85 01 sta ]bomb_exp_ptr+1 ;set ptr high byte
0ba5: a0 00 ldy #O_EXPL_STATE
0ba7: a9 01 lda #$01 ;init state to 1
0ba9: 91 00 sta (]bomb_exp_ptr),y
0bab: a6 f1 ldx bomb_vert_posn ;get (even-numbered) row where bomb hit
0bad: e8 inx ;move down one so we're examining terrain
0bae: bd 00 08 lda hires_addr_hi,x ;get address of strike location
0bb1: 85 03 sta ]hptr+1
0bb3: bd c0 08 lda hires_addr_lo,x
0bb6: 85 02 sta ]hptr
0bb8: a4 f2 ldy bomb_horiz_posn ;get column where bomb hit
0bba: b1 02 lda (]hptr),y ;check value on hi-res screen
0bbc: c9 7f cmp #$7f ;high bit clear, not all white?
0bbe: 90 05 bcc :HiCNoW ;yes, branch
0bc0: a0 0e ldy #14 ;high bit set or white == high value target
0bc2: 4c d0 0b jmp :ScoreBombHit
0bc5: c9 00 :HiCNoW cmp #$00 ;all black?
0bc7: d0 05 bne :NotBlack ;no, branch
0bc9: a0 04 ldy #4 ;yes, hit blank area on map, low score
0bcb: 4c d0 0b jmp :ScoreBombHit
0bce: a0 08 :NotBlack ldy #8 ;medium-value target
0bd0: 20 c0 1b :ScoreBombHit jsr CheckSpecialTargets ;moves Y-reg to A-reg, sets Y-reg to 1
0bd3: 91 00 sta (]bomb_exp_ptr),y ;set "explosion vigor" value (4/8/14)
0bd5: a5 f1 lda bomb_vert_posn ;get row
0bd7: 38 sec
0bd8: e9 05 sbc #$05 ;subtract five to center explosion
0bda: c8 iny
0bdb: 91 00 sta (]bomb_exp_ptr),y ;set explosion row
0bdd: a5 f2 lda bomb_horiz_posn ;get col
0bdf: 38 sec
0be0: e9 03 sbc #$03 ;subtract three to center explosion
0be2: c8 iny
0be3: 91 00 sta (]bomb_exp_ptr),y ;set explosion col
0be5: a0 01 ldy #O_EXPL_VIGOR
0be7: b1 00 lda (]bomb_exp_ptr),y ;get explosion size
0be9: 4a lsr A ;divide by 4 (yielding 1/2/3)
0bea: 4a lsr A
0beb: 48 pha ;preserve
0bec: aa tax ;use as index
0bed: 20 80 5c :ScoreLoop jsr Add10Points ;add 10 points per
0bf0: ca dex
0bf1: d0 fa bne :ScoreLoop
0bf3: 68 pla
0bf4: 4c a0 1c jmp UpdateTargetCounter
0bf7: 4c a0 1c 20+ .junk 9
;
; Draws a frame from the player-crashing sequence.
;
; On entry:
; $04: start row
; $05: end row (exclusive)
; $06: start column
; $07: end column (exclusive), must be start + 9
;
• Clear variables
0c00: a9 00 DrawPlayerCrash lda #$00
0c02: 8d 2c 0c sta :_Load+1 ;page-aligned
0c05: a5 f8 lda player_crash_state
0c07: ea nop
0c08: 4a lsr A ;divide by 2 so we show each frame twice
0c09: 18 clc
0c0a: 69 70 adc #$70 ;$7000, one page per bitmap
0c0c: 8d 2d 0c sta :_Load+2
0c0f: a6 04 ldx start_row
0c11: e0 c0 :RowLoop cpx #192 ;off top of screen?
0c13: b0 2e bcs :SkipRow ;yes, skip
0c15: e0 08 cpx #8
0c17: 90 2a bcc :SkipRow
0c19: bd 00 08 lda hires_addr_hi,x
0c1c: 8d 30 0c sta :_Store+2
0c1f: bd c0 08 lda hires_addr_lo,x
0c22: 8d 2f 0c sta :_Store+1
0c25: a4 06 ldy start_col
0c27: c0 28 :ColLoop cpy #40 ;off left/right edge?
0c29: b0 06 bcs :NextCol ;yes, skip draw
0c2b: ad fc 78 :_Load lda player_crash_0+$8fc ;copy data
0c2e: 99 50 38 :_Store sta HIRES_PAGE1+$1850,y
0c31: c8 :NextCol iny
0c32: ee 2c 0c inc :_Load+1
0c35: c4 07 cpy end_col ;done with row?
0c37: d0 ee bne :ColLoop ;not yet, loop
0c39: e8 :NextRow inx ;move down two rows
0c3a: e8 inx
0c3b: e4 05 cpx end_row ;done with bitmap?
0c3d: d0 d2 bne :RowLoop ;not yet, loop
0c3f: 60 rts
0c40: ea ea ea .junk 3
0c43: ad 2c 0c :SkipRow lda :_Load+1 ;get bitmap load address
0c46: 18 clc
0c47: 69 09 adc #$09 ;assume bitmap is 9 bytes wide
0c49: 8d 2c 0c sta :_Load+1
0c4c: 4c 39 0c jmp :NextRow
0c4f: 00 .junk 1
;
; Updates the state of the player's plane as it crashes.
;
UpdatePlayerCrash
0c50: a5 f8 lda player_crash_state ;check state
0c52: d0 01 bne :Crashing ;still crashing, branch
0c54: 60 rts ;done crashing, return
0c55: c9 12 :Crashing cmp #18 ;have we hit the ground yet?
0c57: b0 1b bcs :Crashed ;yes, handle that
; Draw the crashing plane.
0c59: a5 f9 lda plyr_crash_row ;set up bitmap renderer
0c5b: 85 04 sta start_row
0c5d: 18 clc
0c5e: 69 38 adc #56 ;56 rows high
0c60: 85 05 sta end_row
0c62: a5 fa lda plyr_crash_col
0c64: 85 06 sta start_col
0c66: 18 clc
0c67: 69 09 adc #9 ;9 bytes wide
0c69: 85 07 sta end_col
0c6b: 20 00 0c jsr DrawPlayerCrash ;draw it
0c6e: e6 f8 inc player_crash_state ;advance to next state
0c70: 4c e8 0c jmp UpdateCrashPosn ;shift plane's position
0c73: 08 .junk 1
; We hit the ground. Treat the crash like a bomb impact.
0c74: a5 f0 :Crashed lda bomb_state ;preserve current bomb parameters, in case
0c76: 48 pha ; we dropped one right as we got hit
0c77: a5 f1 lda bomb_vert_posn
0c79: 48 pha
0c7a: a5 f2 lda bomb_horiz_posn
0c7c: 48 pha
0c7d: a5 f9 lda plyr_crash_row ;replace with crashing plane position
0c7f: 18 clc
0c80: 69 08 adc #8 ;toward center of plane
0c82: 85 f1 sta bomb_vert_posn
0c84: a5 fa lda plyr_crash_col
0c86: 18 clc
0c87: 69 04 adc #4 ;toward center of plane
0c89: 85 f2 sta bomb_horiz_posn
0c8b: 20 8f 0b jsr HandleBombImpact ;create bomb explosion record
0c8e: 68 pla ;restore bomb parameters
0c8f: 85 f2 sta bomb_horiz_posn
0c91: 68 pla
0c92: 85 f1 sta bomb_vert_posn
0c94: 68 pla
0c95: 85 f0 sta bomb_state
0c97: a9 00 lda #$00
0c99: 85 f8 sta player_crash_state ;done with crash
; Erase plane crash from even rows. The bomb explosion is on odd rows.
0c9b: a5 f9 lda plyr_crash_row ;get crash area top
0c9d: 85 04 sta start_row
0c9f: 18 clc
0ca0: 69 38 adc #56 ;erase 56 rows (28 * 2)
0ca2: 85 05 sta end_row
0ca4: a5 fa lda plyr_crash_col
0ca6: 85 06 sta start_col
0ca8: 18 clc
0ca9: 69 09 adc #9 ;9 bytes wide
0cab: 85 07 sta end_col
0cad: a6 04 ldx start_row
0caf: e0 c0 :RowLoop cpx #192 ;off bottom of screen?
0cb1: b0 20 bcs :NextRow ;yes, skip
0cb3: e0 08 cpx #8 ;off top of screen?
0cb5: 90 1c bcc :NextRow ;yes, skip
0cb7: bd 00 08 lda hires_addr_hi,x ;set up hi-res address
0cba: 8d cd 0c sta :_Store+2
0cbd: bd c0 08 lda hires_addr_lo,x
0cc0: 8d cc 0c sta :_Store+1
0cc3: a4 06 ldy start_col
0cc5: c0 28 :ColLoop cpy #40 ;off left/right edge?
0cc7: b0 05 bcs :NextCol ;yes, skip
0cc9: a9 00 lda #$00 ;black pixels
0ccb: 99 d0 20 :_Store sta HIRES_PAGE1+208,y ;erase
0cce: c8 :NextCol iny
0ccf: c4 07 cpy end_col ;done with row?
0cd1: d0 f2 bne :ColLoop ;no, branch
0cd3: e8 :NextRow inx
0cd4: e8 inx
0cd5: e4 05 cpx end_row ;done erasing?
0cd7: d0 d6 bne :RowLoop ;no, branch
0cd9: 60 rts
0cda: 00 00 00 00+ .junk 14
;
; Updates the position of the player's plane as it crashes to the ground,
; banking left or right and sliding toward the bottom of the screen.
;
0ce8: a5 fb UpdateCrashPosn lda plyr_crash_flags ;get flags
0cea: 48 pha
0ceb: 4a lsr A ;check "on right" flag
0cec: b0 05 bcs :CrashLeft ;it's set, move plane to left
0cee: e6 fa inc plyr_crash_col ;move to right
0cf0: 4c f5 0c jmp :Cont
0cf3: c6 fa :CrashLeft dec plyr_crash_col ;move to left
0cf5: 68 :Cont pla ;get flags
0cf6: 4a lsr A
0cf7: 4a lsr A ;check "down low" flag
0cf8: b0 04 bcs :NoIncRow ;set, don't alter vertical position
0cfa: e6 f9 inc plyr_crash_row ;move down two rows
0cfc: e6 f9 inc plyr_crash_row
0cfe: 60 :NoIncRow rts
0cff: 00 .junk 1
;
; Pointers to frames in flak burst sequence. There are 24 frames, with each
; image repeated 3x.
0d00: 00 flak_addr_lo .dd1 <flak_burst_0
0d01: 00 .dd1 <flak_burst_0
0d02: 00 .dd1 <flak_burst_0
0d03: a1 .dd1 <flak_burst_1
0d04: a1 .dd1 <flak_burst_1
0d05: a1 .dd1 <flak_burst_1
0d06: 42 .dd1 <flak_burst_2
0d07: 42 .dd1 <flak_burst_2
0d08: 42 .dd1 <flak_burst_2
0d09: e3 .dd1 <flak_burst_3
0d0a: e3 .dd1 <flak_burst_3
0d0b: e3 .dd1 <flak_burst_3
0d0c: 84 .dd1 <flak_burst_4
0d0d: 84 .dd1 <flak_burst_4
0d0e: 84 .dd1 <flak_burst_4
0d0f: 25 .dd1 <flak_burst_5
0d10: 25 .dd1 <flak_burst_5
0d11: 25 .dd1 <flak_burst_5
0d12: c6 .dd1 <flak_burst_6
0d13: c6 .dd1 <flak_burst_6
0d14: c6 .dd1 <flak_burst_6
0d15: 67 .dd1 <flak_burst_7
0d16: 67 .dd1 <flak_burst_7
0d17: 67 .dd1 <flak_burst_7
0d18: 79 flak_addr_hi .dd1 >flak_burst_0
0d19: 79 .dd1 >flak_burst_0
0d1a: 79 .dd1 >flak_burst_0
0d1b: 79 .dd1 >flak_burst_1
0d1c: 79 .dd1 >flak_burst_1
0d1d: 79 .dd1 >flak_burst_1
0d1e: 7a .dd1 >flak_burst_2
0d1f: 7a .dd1 >flak_burst_2
0d20: 7a .dd1 >flak_burst_2
0d21: 7a .dd1 >flak_burst_3
0d22: 7a .dd1 >flak_burst_3
0d23: 7a .dd1 >flak_burst_3
0d24: 7b .dd1 >flak_burst_4
0d25: 7b .dd1 >flak_burst_4
0d26: 7b .dd1 >flak_burst_4
0d27: 7c .dd1 >flak_burst_5
0d28: 7c .dd1 >flak_burst_5
0d29: 7c .dd1 >flak_burst_5
0d2a: 7c .dd1 >flak_burst_6
0d2b: 7c .dd1 >flak_burst_6
0d2c: 7c .dd1 >flak_burst_6
0d2d: 7d .dd1 >flak_burst_7
0d2e: 7d .dd1 >flak_burst_7
0d2f: 7d .dd1 >flak_burst_7
;
; Updates and draws a deadly flak burst.
;
; Drawn on even lines so it doesn't mess up the terrain.
;
0d30: a5 d0 UpdateFlakBurst lda flak_burst_state ;burst active?
0d32: d0 01 bne :DrawFlak ;yes, branch
0d34: 60 rts
0d35: c9 18 :DrawFlak cmp #24 ;did we reach the end of the sequence?
0d37: 90 07 bcc :InSeq ;not yet, branch
0d39: a5 d0 lda flak_burst_state
0d3b: 38 sec
0d3c: e9 06 sbc #$06 ;back up to start of (6,6,6,7,7,7) sequence
0d3e: 85 d0 sta flak_burst_state
0d40: a6 d0 :InSeq ldx flak_burst_state ;get animation frame
0d42: ca dex
0d43: bd 00 0d lda flak_addr_lo,x ;get bitmap address
0d46: 8d 9d 0d sta _FlakGfxLoad+1
0d49: bd 18 0d lda flak_addr_hi,x
0d4c: 8d 9e 0d sta _FlakGfxLoad+2
0d4f: a5 d1 lda flak_burst_row ;configure bitmap renderer
0d51: 85 04 sta start_row
0d53: 18 clc
0d54: 69 2e adc #46 ;46 lines high (23 doubled)
0d56: 85 05 sta end_row
0d58: a5 d2 lda flak_burst_col
0d5a: 85 06 sta start_col
0d5c: 18 clc
0d5d: 69 07 adc #7 ;7 bytes across
0d5f: 85 07 sta end_col
0d61: 20 80 0d jsr DrawFlakBurst ;draw it
0d64: a5 d1 lda flak_burst_row ;get top row
0d66: 18 clc
0d67: 69 08 adc #8 ;move it 8 lines down the screen
0d69: 85 d1 sta flak_burst_row
0d6b: e6 d0 inc flak_burst_state ;advance state
0d6d: c9 c0 cmp #192 ;reached bottom of screen?
0d6f: b0 01 bcs :DeactivateBurst ;yes, deactivate it
0d71: 60 rts
:DeactivateBurst
0d72: a9 00 lda #$00
0d74: 85 d0 sta flak_burst_state ;mark as inactive
0d76: 60 rts
0d77: 00 00 00 00+ .junk 9
;
; Draws a frame of the flak burst animation.
;
; On entry:
; $04: start row
; $05: end row (exclusive)
; $06: start column
; $07: end column (exclusive)
;
0d80: a6 04 DrawFlakBurst ldx start_row ;get top row
0d82: e0 c0 :RowLoop cpx #192 ;off bottom of screen?
0d84: b0 2f bcs :ClickReturn ;yes, bail
0d86: e0 08 cpx #8 ;off top of screen?
0d88: 90 2b bcc :ClickReturn ;yes, bail
0d8a: bd 00 08 lda hires_addr_hi,x ;set up hi-res address
0d8d: 8d a1 0d sta :_Store+2
0d90: bd c0 08 lda hires_addr_lo,x
0d93: 8d a0 0d sta :_Store+1
0d96: a4 06 ldy start_col ;get start column
0d98: c0 28 :ColLoop cpy #40 ;off left/right edge?
0d9a: b0 06 bcs :SkipDraw ;yes, branch
0d9c: ad 41 7c _FlakGfxLoad lda flak_burst_5+28
0d9f: 99 d0 3b :_Store sta HIRES_PAGE1+$1bd0,y
0da2: ee 9d 0d :SkipDraw inc _FlakGfxLoad+1 ;advance bitmap pointer
0da5: d0 03 bne :NoInc
0da7: ee 9e 0d inc _FlakGfxLoad+2
0daa: c8 :NoInc iny
0dab: c4 07 cpy end_col ;done with row?
0dad: d0 e9 bne :ColLoop ;no, loop
0daf: e8 inx ;advance two rows on hi-res screen
0db0: e8 inx
0db1: e4 05 cpx end_row ;done with bitmap?
0db3: d0 cd bne :RowLoop ;no, loop
0db5: 8d 30 c0 :ClickReturn sta SPKR ;click
0db8: 60 rts
0db9: 00 00 00 00+ .junk 7
;
; Draws player bomb sight bitmap. Image must reside on a single page.
;
; On entry:
; $04: start row
; $05: end row (exclusive)
; $06: start column
; $07: end column (exclusive)
;
0dc0: a6 04 DrawPlyrSight1 ldx start_row ;start at the top
0dc2: e0 c0 :RowLoop cpx #192 ;off bottom of screen?
0dc4: b0 24 bcs :NextRow ;yes, branch
0dc6: e0 08 cpx #8 ;off top of screen?
0dc8: 90 20 bcc :NextRow ;yes, branch
0dca: bd 00 08 lda hires_addr_hi,x ;get hi-res address
0dcd: 8d e1 0d sta :Store+2
0dd0: bd c0 08 lda hires_addr_lo,x
0dd3: 8d e0 0d sta :Store+1
0dd6: a4 06 ldy start_col ;get left column
0dd8: c0 28 :ColLoop cpy #40 ;off left/right edges?
0dda: b0 06 bcs :SkipDraw ;yes, branch
0ddc: ad 85 6e _LoadSightGfx lda bomb_sight_s5+5 ;copy a byte
0ddf: 99 a8 2a :Store sta HIRES_PAGE1+$aa8,y
0de2: c8 :SkipDraw iny
0de3: ee dd 0d inc _LoadSightGfx+1 ;advance bitmap pointer
0de6: c4 07 cpy end_col ;done with row?
0de8: d0 ee bne :ColLoop ;no, loop
0dea: e8 :NextRow inx ;move down two rows
0deb: e8 inx
0dec: e4 05 cpx end_row ;done with bitmap?
0dee: d0 d2 bne :RowLoop ;no, loop
0df0: 60 rts
0df1: ad dd 0d 18+ .junk 31
;
; Draws the player's bomb sight during the bombing phase.
;
; As with the plane, we don't explicitly erase the entire bitmap. Instead, we
; draw the bitmap and clean up edges as needed. The top and bottom lines in the
; bitmap are black, so those are self-erasing, but the left/right edges may need
; to be trimmed.
;
• Clear variables
]hptr .var $00 {addr/2}
0e10: a5 0c DrawPlyrSight lda player_row ;get row where plane would be
0e12: 18 clc
0e13: 69 0c adc #12 ;start 12 rows down
0e15: 85 04 sta start_row
0e17: 18 clc
0e18: 69 26 adc #38 ;38 rows high
0e1a: 85 05 sta end_row
0e1c: a5 0d lda player_col ;get column where plane would be
0e1e: 18 clc
0e1f: 69 00 adc #$00 ;don't modify it (?)
0e21: 85 06 sta start_col ;set left column
0e23: 18 clc
0e24: 69 07 adc #7 ;7 bytes wide
0e26: 85 07 sta end_col
0e28: 20 78 0f jsr GetSightAddr ;get addr of shifted image
0e2b: 20 c0 0d jsr DrawPlyrSight1 ;draw it
0e2e: 4c 37 0e jmp :EraseLeft ;erase left/right sides as needed
0e31: 0e 8d de 0d+ .junk 6
0e37: ea :EraseLeft nop
0e38: a5 0e lda player_col_shift ;check pixel position
0e3a: d0 2f bne :EraseRight ;nonzero, left edge is fine; branch
0e3c: a5 0c lda player_row
0e3e: 18 clc
0e3f: 69 18 adc #24 ;start 24 rows down (leftward-extending part)
0e41: aa tax ;use as start
0e42: 18 clc
0e43: 69 0e adc #14 ;erase 14 lines
0e45: 85 04 sta start_row ;put the end row in start_row
0e47: a4 0d ldy player_col
0e49: 88 dey
0e4a: e0 c0 :RowLoopL cpx #192 ;off bottom of screen? (not possible)
0e4c: b0 16 bcs :NextRowL ;yes, branch
0e4e: e0 08 cpx #8 ;off top of screen? (also not possible)
0e50: 90 12 bcc :NextRowL ;yes, branch
0e52: c0 28 cpy #40 ;off left/right edge? (nope!)
0e54: b0 14 bcs :Return ;yes, branch
0e56: bd 00 08 lda hires_addr_hi,x ;set up hi-res address
0e59: 85 01 sta ]hptr+1
0e5b: bd c0 08 lda hires_addr_lo,x
0e5e: 85 00 sta ]hptr
0e60: a9 00 lda #$00 ;black pixels
0e62: 91 00 sta (]hptr),y ;erase one byte
0e64: e8 :NextRowL inx
0e65: e8 inx
0e66: e4 04 cpx start_row ;have we reached the end row?
0e68: d0 e0 bne :RowLoopL ;no, loop
0e6a: 60 :Return rts
0e6b: c9 05 :EraseRight cmp #$05 ;pixel position at right edge?
0e6d: 90 fb bcc :Return ;no, right edge is fine; branch
0e6f: a5 0c lda player_row
0e71: 18 clc
0e72: 69 18 adc #24 ;(same as above)
0e74: aa tax ; ...
0e75: 18 clc
0e76: 69 0e adc #14
0e78: 85 04 sta start_row
0e7a: a5 0d lda player_col
0e7c: 18 clc
0e7d: 69 07 adc #7 ;right edge, 7 bytes over
0e7f: a8 tay
0e80: c0 28 cpy #40
0e82: b0 e6 bcs :Return
0e84: e0 c0 :RowLoopR cpx #192
0e86: b0 12 bcs :NextRowR
0e88: e0 08 cpx #$08
0e8a: 90 0e bcc :NextRowR
0e8c: bd 00 08 lda hires_addr_hi,x
0e8f: 85 01 sta ]hptr+1
0e91: bd c0 08 lda hires_addr_lo,x
0e94: 85 00 sta ]hptr
0e96: a9 00 lda #$00
0e98: 91 00 sta (]hptr),y
0e9a: e8 :NextRowR inx
0e9b: e8 inx
0e9c: e4 04 cpx start_row
0e9e: d0 e4 bne :RowLoopR
0ea0: 60 rts
0ea1: 00 00 00 00+ .junk 10
;
; Erases the player's plane while bombing. Only used when switching from the
; plane to the bomb sight.
;
ErasePlayerPlane
0eab: a5 0c lda player_row ;set up bitmap renderer
0ead: 85 04 sta start_row
0eaf: 18 clc
0eb0: 69 38 adc #56 ;56 lines high
0eb2: 85 05 sta end_row
0eb4: a5 0d lda player_col
0eb6: 85 06 sta start_col
0eb8: 18 clc
0eb9: 69 0a adc #10 ;10 bytes wide
0ebb: 85 07 sta end_col
0ebd: c6 06 dec start_col
0ebf: 8d 30 c0 sta SPKR ;click
0ec2: a6 04 ldx start_row
0ec4: e0 c0 :RowLoop cpx #192 ;off bottom of screen?
0ec6: b0 1d bcs :NextRow ;yes, branch
0ec8: e0 08 cpx #8 ;off top of screen?
0eca: 90 19 bcc :NextRow ;yes, branch
0ecc: bd 00 08 lda hires_addr_hi,x ;set up hi-res address
0ecf: 85 01 sta ]hptr+1
0ed1: bd c0 08 lda hires_addr_lo,x
0ed4: 85 00 sta ]hptr
0ed6: a4 06 ldy start_col
0ed8: c0 28 :ColLoop cpy #40
0eda: b0 04 bcs :SkipErase
0edc: a9 00 lda #$00 ;black pixels
0ede: 91 00 sta (]hptr),y
0ee0: c8 :SkipErase iny
0ee1: c4 07 cpy end_col ;done with row?
0ee3: d0 f3 bne :ColLoop ;no, branch
0ee5: e8 :NextRow inx
0ee6: e8 inx
0ee7: e4 05 cpx end_row ;done?
0ee9: d0 d9 bne :RowLoop ;no, branch
0eeb: 60 rts
0eec: 00 00 00 00 .junk 4
;
; Erases the player's bomb sight. Only used when switching from the bomb sight
; to the plane.
;
ErasePlayerSight
0ef0: a5 0c lda player_row
0ef2: 18 clc
0ef3: 69 0a adc #10 ;start 10 lines down (sight is smaller than
0ef5: 85 04 sta start_row ; player plane)
0ef7: 18 clc
0ef8: 69 26 adc #38 ;38 lines high
0efa: 85 05 sta end_row
0efc: a5 0d lda player_col
0efe: 85 06 sta start_col
0f00: 18 clc
0f01: 69 09 adc #9 ;9 bytes wide
0f03: 85 07 sta end_col
0f05: a6 04 ldx start_row
0f07: e0 c0 :RowLoop cpx #192 ;off bottom of screen?
0f09: b0 1d bcs :NextRow ;yes, branch
0f0b: e0 08 cpx #8 ;off top of screen?
0f0d: 90 19 bcc :NextRow ;yes, branch
0f0f: bd 00 08 lda hires_addr_hi,x ;set up hi-res address
0f12: 85 01 sta ]hptr+1
0f14: bd c0 08 lda hires_addr_lo,x
0f17: 85 00 sta ]hptr
0f19: a4 06 ldy start_col
0f1b: c0 28 :ColLoop cpy #40 ;off left/right edge?
0f1d: b0 04 bcs :SkipErase ;yes, don't erase
0f1f: a9 00 lda #$00 ;black pixels
0f21: 91 00 sta (]hptr),y
0f23: c8 :SkipErase iny
0f24: c4 07 cpy end_col ;done with row?
0f26: d0 f3 bne :ColLoop ;no, branch
0f28: e8 :NextRow inx
0f29: e8 inx
0f2a: e4 05 cpx end_row ;done?
0f2c: d0 d9 bne :RowLoop ;no, branch
0f2e: 60 rts
0f2f: 00 .junk 1
;
; Checks to see if the player hit the spacebar to flip between plane and bomb
; sight.
;
0f30: ad 00 c0 CheckKbdSpc lda KBD ;check keyboard
0f33: c9 a0 cmp #“ ” ;spacebar hit?
0f35: f0 01 beq :IsSpc ;yes, continue
0f37: 60 rts ;no, return
0f38: 8d 10 c0 :IsSpc sta KBDSTRB ;clear key
0f3b: a9 01 lda #$01
0f3d: 38 sec
0f3e: e5 fd sbc player_as_plane
0f40: 85 fd sta player_as_plane ;value = 1 - value (toggles between 0/1)
0f42: d0 10 bne :DrawPlane ;now 1, configure plane
; Toggle to bomb sight.
0f44: 20 ab 0e jsr ErasePlayerPlane ;erase plane
0f47: a9 10 lda #<DrawPlyrSight ;next time, draw sight
0f49: 8d a6 13 sta _JmpDrawPlayer+1
0f4c: a9 0e lda #>DrawPlyrSight
0f4e: 8d a7 13 sta _JmpDrawPlayer+2
0f51: 60 rts
0f52: ea ea .junk 2
0f54: a9 c0 :DrawPlane lda #<DrawPlyrPlane ;next time, draw plane
0f56: 8d a6 13 sta _JmpDrawPlayer+1
0f59: a9 12 lda #>DrawPlyrPlane
0f5b: 8d a7 13 sta _JmpDrawPlayer+2
0f5e: 20 f0 0e jsr ErasePlayerSight ;erase sight
0f61: 60 rts
0f62: 00 00 00 00+ .fill 6,$00
;
; Addresses of shifted bomb sight bitmaps.
0f68: 00 sight_addr_lo .dd1 <bomb_sight_s0
0f69: 80 .dd1 <bomb_sight_s1
0f6a: 00 .dd1 <bomb_sight_s2
0f6b: 80 .dd1 <bomb_sight_s3
0f6c: 00 .dd1 <bomb_sight_s4
0f6d: 80 .dd1 <bomb_sight_s5
0f6e: 00 .dd1 <bomb_sight_s6
0f6f: 00 .dd1 $00
0f70: 6c sight_addr_hi .dd1 >bomb_sight_s0
0f71: 6c .dd1 >bomb_sight_s1
0f72: 6d .dd1 >bomb_sight_s2
0f73: 6d .dd1 >bomb_sight_s3
0f74: 6e .dd1 >bomb_sight_s4
0f75: 6e .dd1 >bomb_sight_s5
0f76: 6f .dd1 >bomb_sight_s6
0f77: 00 .dd1 $00
;
; Returns an entry in the bomb sight table.
;
0f78: a6 0e GetSightAddr ldx player_col_shift ;get pixel position
0f7a: bd 68 0f lda sight_addr_lo,x ;get bitmap address
0f7d: 8d dd 0d sta _LoadSightGfx+1 ;configure renderer
0f80: bd 70 0f lda sight_addr_hi,x
0f83: 8d de 0d sta _LoadSightGfx+2
0f86: 60 rts
0f87: 00 00 00 00+ .junk 9
;
; Draw a flak pop graphic with exclusive-OR. Call a second time to erase.
;
; This is used for the quick harmless flashes (which may presage the damaging
; burst). This is drawn on odd (terrain) lines so it doesn't clash with the
; plane. It's not on-screen for very long, so the color distortions it causes
; don't seem weird.
;
; The bitmap is a full 6x36, so when drawing it on alternating lines we must
; also skip those lines in the source bitmap. The bitmap must reside on a
; single page.
;
; On entry:
; $04: start row
; $05: end row (exclusive)
; $06: start column
; $07: end column (exclusive); must be start + 6
;
• Clear variables
]hptr .var $00 {addr/2}
0f90: a9 00 XdrawFlakPop lda #$00 ;zero the low byte of the address to reset to the
0f92: 8d a4 0f sta :_Load+1 ; start of the bitmap
0f95: a6 04 ldx start_row
0f97: bd 00 08 :RowLoop lda hires_addr_hi,x ;get hi-res address
0f9a: 85 01 sta ]hptr+1
0f9c: bd c0 08 lda hires_addr_lo,x
0f9f: 85 00 sta ]hptr
0fa1: a4 06 ldy start_col
0fa3: ad d8 54 :_Load lda flak_pop+216 ;loads from $5400-54d7 (6x36)
0fa6: 51 00 eor (]hptr),y ;exclusive-OR with hi-res screen
0fa8: 91 00 sta (]hptr),y
0faa: ee a4 0f inc :_Load+1 ;advance to next byte in bitmap
0fad: c8 iny
0fae: c4 07 cpy end_col ;done with row?
0fb0: 90 f1 bcc :_Load ;no, loop
0fb2: e8 inx ;move down two lines
0fb3: e8 inx
0fb4: ad a4 0f lda :_Load+1
0fb7: 18 clc
0fb8: 69 06 adc #$06 ;add 6 to skip a line of the source bitmap
0fba: 8d a4 0f sta :_Load+1
0fbd: e4 05 cpx end_row ;done with bitmap?
0fbf: 90 d6 bcc :RowLoop ;not yet, loop
0fc1: a2 20 ldx #$20 ;fall into sound routine
;
; Plays a sound.
;
; On entry:
; X-reg: determines frequency and duration
;
0fc3: 8a PlaySimpleSound txa ;(TXY)
0fc4: a8 tay
0fc5: 88 :WaitLoop dey
0fc6: ea nop
0fc7: d0 fc bne :WaitLoop
0fc9: 8d 30 c0 sta SPKR
0fcc: ca dex ;reduces delay and counts down duration
0fcd: d0 f4 bne PlaySimpleSound
0fcf: 60 rts
;
; Plays sound when a flak burst fires.
;
0fd0: a2 30 PlayBurstSound ldx #$30
0fd2: 20 c3 0f jsr PlaySimpleSound
0fd5: a2 20 ldx #$20
0fd7: 4c c3 0f jmp PlaySimpleSound
0fda: 00 00 00 00+ .junk 22
;
; Used for bullets. These values are ORed into the blue background.
0ff0: 01 02 04 08+ single_pixel .bulk $01,$02,$04,$08,$10,$20,$40,$00
0ff8: 03 06 0c 18+ double_pixel .bulk $03,$06,$0c,$18,$30,$60,$60,$00
;
; Updates progress on a deadly flak burst.
;
; The states are:
; 0 - no burst pending
; 1 - draw flak "pop"
; 2 - erase flak "pop"
; 3 - pause a few frames, then fire the burst
;
1000: a5 c1 UpdateBurstSeq lda burst_pending_state ;get state
1002: d0 01 bne :Pending ;branch if burst is pending
1004: 60 rts
1005: c9 02 :Pending cmp #$02 ;in "draw" state?
1007: b0 17 bcs :NotDraw ;no, branch
1009: a5 c4 :DrawPop lda flak_burst_pop_row
100b: 85 04 sta start_row
100d: 18 clc
100e: 69 24 adc #36 ;36 lines high (18, doubled)
1010: 85 05 sta end_row
1012: a5 c5 lda flak_burst_pop_col
1014: 85 06 sta start_col
1016: 18 clc
1017: 69 06 adc #6 ;6 bytes across
1019: 85 07 sta end_col
101b: e6 c1 inc burst_pending_state ;incr from 1 to 2
101d: 4c 90 0f jmp XdrawFlakPop
1020: c9 03 :NotDraw cmp #$03 ;in "erase" state?
1022: b0 10 bcs :NotErase ;no, branch
1024: a5 c4 lda flak_burst_pop_row
1026: 18 clc
1027: 69 04 adc #$04 ;move down 4 lines to match new position
1029: 85 c4 sta flak_burst_pop_row
102b: 20 09 10 jsr :DrawPop
102e: a9 06 lda #$06
1030: 85 c3 sta burst_delay_ctr ;init counter to 6 frames
1032: 60 rts
1033: ea .junk 1
1034: c6 c3 :NotErase dec burst_delay_ctr ;time to fire the burst?
1036: f0 01 beq :FireBurst ;yes, branch
1038: 60 rts
1039: a9 00 :FireBurst lda #$00
103b: 85 c1 sta burst_pending_state ;reset burst state
103d: a5 c4 lda flak_burst_pop_row ;get the row where we showed the burst
103f: 18 clc
1040: 69 0f adc #15 ;move it down 15 rows (even row number)
1042: 85 d1 sta flak_burst_row
1044: a5 c5 lda flak_burst_pop_col ;copy the column
1046: 85 d2 sta flak_burst_col
1048: a9 01 lda #$01
104a: 85 d0 sta flak_burst_state ;init burst animation state
104c: 4c d0 0f jmp PlayBurstSound
104f: 00 .junk 1
;
; Checks to see if we're due for a flak burst. If so, we need to fire a flak
; pop as a warning.
;
; Also checks to see if it's time to show an air-attack message. At difficulty
; level 1, the flak checks are happening so infrequently that we don't actually
; get a chance to display the message before the transition. On higher
; difficulties things line up in a way that gets us different warning durations
; (12/10/6/12).
;
; Note hostile flak is disabled during an air warning.
;
1050: c6 c0 CheckFlakBurst1 dec flak_burst_ctr ;time for a flak burst?
1052: f0 01 beq :FireFlakBurst ;yes, branch
1054: 60 rts
1055: a5 0c :FireFlakBurst lda player_row ;get player row
1057: 38 sec
1058: e9 21 sbc #33 ;move up 33 lines (now odd)
105a: 85 c4 sta flak_burst_pop_row
105c: ad 84 24 lda HIRES_PAGE1+$484 ;read contents of hi-res line 9, column 4
105f: 05 60 ora terrain_src_ptr ;mix with pointer ("randomization")
1061: 29 1e and #$1e ;limit to 0-30, even values only
1063: 85 c5 sta flak_burst_pop_col ;save as column
1065: a9 01 lda #$01
1067: 85 c1 sta burst_pending_state ;set state to first frame
1069: a9 50 _LevelFlakBurst lda #$50 ;modified by difficulty ($50 - $10)
106b: 85 c0 sta flak_burst_ctr ;reset time-between-bursts counter
106d: a5 c4 lda flak_burst_pop_row ;check row
106f: c9 c0 cmp #192 ;off bottom?
1071: b0 04 bcs :TrimRow ;yes, clamp it
1073: c9 08 cmp #$08 ;off top?
1075: b0 04 bcs :CheckAam ;no, branch
1077: a9 09 :TrimRow lda #$09
1079: 85 c4 sta flak_burst_pop_row ;set to top of screen
107b: 4c e0 10 :CheckAam jmp ShowAamMaybe ;show air-attack message, maybe
107e: 00 00 .junk 2
1080: a5 c1 CheckFlakBurst lda burst_pending_state ;burst already in progress?
1082: f0 cc beq CheckFlakBurst1 ;not yet, see if we want to create one
1084: 4c 00 10 jmp UpdateBurstSeq ;yes, advance the burst state
1087: 00 ff ff 00+ .junk 9
;
; Checks to see if the player collided with a flak burst.
;
• Clear variables
]row .var $00 {addr/1}
]row_sub_48 .var $01 {addr/1}
]col_sub_2 .var $03 {addr/1}
]col_plus_8 .var $04 {addr/1}
CheckPlayerFlakked
1090: a5 d0 lda flak_burst_state ;flak burst active?
1092: d0 01 bne :GotFlak
1094: 60 :Return rts
; Define the hit box as the player's plane expanded 2 bytes left/right. Flak
; bursts happen near the player's row and move down quickly, so we don't bother
; extending top/bottom.
1095: a5 0c :GotFlak lda player_row ;get top row
1097: 85 00 sta ]row
1099: 18 clc
109a: 69 30 adc #48 ;48 lines high (24 doubled)
109c: 85 01 sta ]row_sub_48
109e: 20 70 12 jsr PlayerColSub2 ;sets $03 to (player_column - 2)
10a1: ea nop
10a2: 18 clc
10a3: 69 08 adc #8 ;8 bytes across
10a5: 85 04 sta ]col_plus_8
10a7: a5 d1 lda flak_burst_row ;see if burst center is inside player hit box
10a9: c5 00 cmp ]row
10ab: 90 e7 bcc :Return
10ad: c5 01 cmp ]row_sub_48
10af: b0 e3 bcs :Return
10b1: a5 d2 lda flak_burst_col
10b3: c5 03 cmp ]col_sub_2
10b5: 90 dd bcc :Return
10b7: c5 04 cmp ]col_plus_8
10b9: b0 d9 bcs :Return
; Player has been hit.
10bb: a9 01 lda #$01
10bd: 85 f8 sta player_crash_state ;init crash state
10bf: a5 0c lda player_row
10c1: 85 f9 sta plyr_crash_row ;copy position to crash position
10c3: a5 0d lda player_col
10c5: 85 fa sta plyr_crash_col
10c7: a9 30 lda #$30
10c9: 85 21 sta plyr_crash_ctr ;crash lasts for this long
10cb: a5 f9 lda plyr_crash_row ;check row
10cd: c9 70 cmp #112 ;>= 112? (not possible?)
10cf: 26 fb rol plyr_crash_flags ;set bit
10d1: a5 fa lda plyr_crash_col ;check column
10d3: c9 11 cmp #17 ;+3 would be 20, center of screen
10d5: 26 fb rol plyr_crash_flags ;set low bit if on right side of screen
10d7: 4c 20 15 jmp PlayerCrashLoop
10da: 00 00 ff ff+ .junk 6
;
; Draws "air attack" message if appropriate. Also, overrides the burst column
; if the player is on the right edge of the screen.
;
10e0: a5 63 ShowAamMaybe lda air_attack_msg_flag ;showing message?
10e2: f0 0b beq :CheckCol ;no, branch
10e4: a9 00 lda #$00
10e6: 85 c1 sta burst_pending_state ;disable dangerous flak
10e8: a9 04 lda #$04
10ea: 85 c0 sta flak_burst_ctr ;set counter to 4 so message color toggles frequently
10ec: 4c 50 5a jmp DrawAirAttackMsg ;draw it
10ef: a5 0d :CheckCol lda player_col ;is player on right side of screen?
10f1: c9 20 cmp #32
10f3: b0 01 bcs :OnRight ;yes, branch
10f5: 60 rts
10f6: a9 22 :OnRight lda #34 ;fire flak so it will hit player
10f8: 85 c5 sta flak_burst_pop_col
10fa: 60 rts
10fb: 00 ff ff 00+ .junk 5
;
; Table of plane behaviors. Determines position and escape direction.
;
; There are one or two active planes, with state stored in $70-77 and $a0-a7.
; The values are copied from the list below, although the last byte in each
; entry is ignored: $77/$a7 is set to $03 by the copy functions (and possibly
; reset to $02 after it counts down).
;
; Code generally works off the primary ($a0) copy, swapping with state with $70
; to update the secondary plane.
;
; The plane created in the primary slot is hostile: it will fire at the player,
; and killing it counts for points. The plane in the secondary slot is passive:
; it doesn't fire, and killing it doesn't count for anything.
;
; Enemy planes approach the player over a few frames, fire their guns (if
; hostile), and veer away. While flying in and firing they "float" up and down
; a bit. The veering and floating are controlled by the table below.
;
; Each animation frame is held for a few updates. Reducing the hold count
; increases the apparent speed of the planes. At level 1, the counter is set to
; 3; at higher levels, it's set to two. (Plane updates happen every few game
; frames; increasing the update frequency also makes everything faster.)
;
; Values:
; +00: animation frame; 0=inactive, <$80=alive, >$80=exploding
; +01: row
; +02: column
; +03: float direction ($00=up, $ff=down) while approaching
; +04: veer direction ($01=up, $02=left, $03=right)
; +05: float duration (time until float changes direction)
; +06: float counter (initial value)
; +07: frame hold counter (initial value) [not used]
;
; This table must be page-aligned.
enemy_plane_behav
1100: 01 50 10 ff+ .bulk $01,$50,$10,$ff,$03,$20,$20,$00
1108: 01 20 14 ff+ .bulk $01,$20,$14,$ff,$01,$20,$20,$03
1110: 01 90 12 00+ .bulk $01,$90,$12,$00,$01,$40,$40,$00
1118: 01 10 20 ff+ .bulk $01,$10,$20,$ff,$02,$20,$20,$03
1120: 01 80 10 ff+ .bulk $01,$80,$10,$ff,$03,$10,$10,$03
1128: 01 60 1c ff+ .bulk $01,$60,$1c,$ff,$01,$04,$04,$03
1130: 01 70 10 ff+ .bulk $01,$70,$10,$ff,$01,$10,$10,$03
1138: 01 60 20 00+ .bulk $01,$60,$20,$00,$02,$40,$40,$03
1140: 01 90 10 00+ .bulk $01,$90,$10,$00,$01,$10,$10,$03
1148: 01 80 0e 00+ .bulk $01,$80,$0e,$00,$02,$40,$40,$03
1150: 01 a0 20 00+ .bulk $01,$a0,$20,$00,$02,$40,$40,$03
1158: 01 40 10 ff+ .bulk $01,$40,$10,$ff,$01,$30,$30,$03
1160: 01 a0 0a 00+ .bulk $01,$a0,$0a,$00,$03,$40,$40,$00
1168: 01 50 0e ff+ .bulk $01,$50,$0e,$ff,$03,$03,$03,$00
1170: 01 20 18 ff+ .bulk $01,$20,$18,$ff,$01,$20,$20,$03
1178: 01 99 16 00+ .bulk $01,$99,$16,$00,$01,$40,$40,$00
1180: 01 10 20 ff+ .bulk $01,$10,$20,$ff,$02,$02,$02,$03
1188: 01 80 12 ff+ .bulk $01,$80,$12,$ff,$03,$10,$10,$03
1190: 01 60 1c ff+ .bulk $01,$60,$1c,$ff,$01,$20,$20,$03
1198: 01 70 12 ff+ .bulk $01,$70,$12,$ff,$03,$10,$10,$03
11a0: 01 60 20 00+ .bulk $01,$60,$20,$00,$01,$40,$40,$03
11a8: 01 90 10 00+ .bulk $01,$90,$10,$00,$01,$10,$10,$03
11b0: 01 80 0e 00+ .bulk $01,$80,$0e,$00,$02,$40,$40,$03
11b8: 01 a0 14 00+ .bulk $01,$a0,$14,$00,$02,$40,$40,$03
11c0: 01 40 10 ff+ .bulk $01,$40,$10,$ff,$01,$03,$03,$03
11c8: 01 20 10 ff+ .bulk $01,$20,$10,$ff,$01,$20,$20,$03
11d0: 01 90 12 00+ .bulk $01,$90,$12,$00,$01,$40,$40,$00
11d8: 01 10 20 ff+ .bulk $01,$10,$20,$ff,$02,$20,$20,$03
11e0: 01 80 08 ff+ .bulk $01,$80,$08,$ff,$03,$10,$10,$03
11e8: 01 60 10 ff+ .bulk $01,$60,$10,$ff,$01,$04,$04,$03
11f0: 01 50 10 ff+ .bulk $01,$50,$10,$ff,$01,$04,$04,$00
11f8: 01 60 10 00+ .bulk $01,$60,$10,$00,$01,$04,$04,$00
;
; Swaps the state of the primary and secondary planes.
;
1200: a0 07 SwapPlaneState ldy #$07 ;8 bytes
1202: b9 70 00 :Loop lda enemy_plane_state1,y
1205: 48 pha
1206: b9 a0 00 lda eplane_state,y
1209: 99 70 00 sta enemy_plane_state1,y
120c: 68 pla
120d: 99 a0 00 sta eplane_state,y
1210: 88 dey
1211: 10 ef bpl :Loop
1213: 60 rts
1214: ff ff 00 00 .junk 4
;
; Updates the state of the secondary (non-hostile) plane.
;
UpdateSecondaryPlane1
1218: a5 70 lda enemy_plane_state1 ;is plane active?
121a: f0 02 beq :Return ;no, return
121c: 10 01 bpl :DoUpdate ;if not exploding, branch
121e: 60 :Return rts
121f: 20 00 12 :DoUpdate jsr SwapPlaneState ;swap state so we can share code
1222: 20 e0 19 jsr UpdateEnemyPlane ;do the updates
1225: 20 00 1a jsr DeactOffscreenPlane ;deactivate plane if it flew off screen
1228: 20 20 1a jsr UpdateEnemyPlaneFrame ;update the plane's animation frame
122b: 4c 00 12 jmp SwapPlaneState ;swap them back
122e: ea ea .junk 2
;
; Populates the secondary plane slot.
;
; Ideally this will be called the same number of times as the function at $17a0
; (which populates the primary slot). Otherwise the instructions that load data
; from $1100 will eventually both be loading from the same slot, and we'll
; create two planes with identical parameters. If the dogfight is over, we can
; try to keep the balance by going through the motions but marking the plane
; inactive before returning.
;
• Clear variables
]behav_ptr .var $00 {addr/2}
CreateSecondaryPlane
1230: a5 70 lda enemy_plane_state1 ;is secondary plane active?
1232: f0 01 beq :Inactive ;no, create a new one
1234: 60 rts
1235: ad 3f 12 :Inactive lda :_SetLow+1 ;get pointer to behavior table
1238: 18 clc
1239: 69 08 adc #$08 ;advance to next entry
123b: 8d 3f 12 sta :_SetLow+1
123e: a9 b8 :_SetLow lda #<enemy_plane_behav-72 ;get pointer to behavior table
1240: 85 00 sta ]behav_ptr ; as DP pointer this time
1242: a9 11 lda #>enemy_plane_behav
1244: 85 01 sta ]behav_ptr+1
1246: a0 06 ldy #$06 ;copy values 0-6
1248: b1 00 :Loop lda (]behav_ptr),y
124a: 99 70 00 sta enemy_plane_state1,y
124d: 88 dey
124e: 10 f8 bpl :Loop
1250: a9 03 lda #$03 ;hold each frame for 3 updates, not
1252: 85 77 sta enemy_plane_state1+7 ; modified by difficulty
1254: a5 66 lda dogfight_remain ;are we still in a dogfight?
1256: f0 01 beq :NotFighting ;no, branch
1258: 60 rts
1259: a9 00 :NotFighting lda #$00
125b: 85 70 sta enemy_plane_state1 ;mark thing we just created as inactive
125d: 60 rts
125e: 00 00 .junk 2
;
; Updates the secondary (non-hostile) plane.
;
UpdateSecondaryPlane
1260: a9 01 lda #$01
1262: 85 68 sta eplane_suppress_fire ;secondary plane doesn't shoot
1264: 20 18 12 jsr UpdateSecondaryPlane1 ;do the update
1267: 4c 30 12 jmp CreateSecondaryPlane ;try to create it if it's inactive
126a: 00 00 00 00+ .junk 6
;
; Calculates the column of the player's bomber, minus two. The result is
; clamped to zero.
;
; On entry:
; $0d: current column
;
; On exit:
; $03: (column - 2), or zero if the value went negative
;
• Clear variables
]result .var $03 {addr/1}
1270: a5 0d PlayerColSub2 lda player_col ;get player column
1272: 38 sec
1273: e9 02 sbc #$02 ;subtract two
1275: 10 02 bpl :IsPos
1277: a9 00 lda #$00 ;clamp to zero
1279: 85 03 :IsPos sta ]result
127b: 60 rts
127c: 00 00 00 00 .junk 4
;
; Draws plane or bomb sight.
;
; On entry:
; $04: start row
; $05: end row (exclusive)
; $06: start column
; $07: end column (exclusive); must be start + 9
;
• Clear variables
1280: a6 04 DrawBomberGfx ldx start_row ;get screen row
1282: e0 c0 :RowLoop cpx #192 ;off the bottom?
1284: b0 2b bcs :BadRow ;yes, branch
1286: e0 08 cpx #8 ;off the top?
1288: 90 27 bcc :BadRow ;yes, branch
128a: bd 00 08 lda hires_addr_hi,x ;set up hi-res address
128d: 8d a1 12 sta :_Store+2
1290: bd c0 08 lda hires_addr_lo,x
1293: 8d a0 12 sta :_Store+1
1296: a4 06 ldy start_col ;get screen column
1298: c0 28 :ColLoop cpy #40 ;off the right edge?
129a: b0 06 bcs :NextCol ;yes, branch
129c: ad fc 65 :_Load lda phantom_s0+$5fc ;copy a byte
129f: 99 50 30 :_Store sta HIRES_PAGE1+$1050,y
12a2: c8 :NextCol iny ;move to next column
12a3: ee 9d 12 inc :_Load+1 ;advance input (note: must be page-aligned)
12a6: c4 07 cpy end_col ;reached end?
12a8: d0 ee bne :ColLoop ;not yet, loop
12aa: e8 :NextRow inx ;advance screen row by 2
12ab: e8 inx
12ac: e4 05 cpx end_row ;done yet?
12ae: d0 d2 bne :RowLoop ;no, branch
12b0: 60 rts
12b1: ad 9d 12 :BadRow lda :_Load+1
12b4: 18 clc
12b5: 69 09 adc #$09 ;assume bitmap is 9 bytes wide
12b7: 8d 9d 12 sta :_Load+1
12ba: 4c aa 12 jmp :NextRow
12bd: 00 00 00 .junk 3
;
; Draws the player's plane while bombing.
;
; Note we don't erase the plane; we just overwrite it. This works when moving
; to the left because we have a full byte of black down the right edge, but we
; have to do a little cleanup when moving to the right.
;
; The top and bottom rows of the plane are black, so the plane erases its trail
; when drifting up and down.
;
• Clear variables
]hptr .var $00 {addr/2}
12c0: a5 0c DrawPlyrPlane lda player_row ;set up bitmap renderer
12c2: 85 04 sta start_row
12c4: 18 clc
12c5: 69 38 adc #56 ;56 rows high
12c7: 85 05 sta end_row
12c9: a5 0d lda player_col
12cb: 85 06 sta start_col
12cd: 18 clc
12ce: 69 09 adc #9 ;9 bytes wide
12d0: 85 07 sta end_col
12d2: a9 00 lda #$00
12d4: 8d 9d 12 sta :_Load+1 ;zero out the high byte of the pointer
12d7: a9 60 lda #$60 ;bitmap at $60xx
12d9: 18 clc
12da: 65 0e adc player_col_shift ;one bitmap per page
12dc: 8d 9e 12 sta :_Load+2 ;set high byte of pointer
12df: 20 80 12 jsr DrawBomberGfx ;draw it
12e2: ea nop ;hang out for a bit
12e3: ea nop
12e4: ea nop
12e5: ea nop ;yeah
12e6: ea nop
12e7: ea nop
12e8: a5 0e lda player_col_shift ;get horizontal pixel position
12ea: f0 01 beq :EraseLeft ;column 0, erase the left side just in case
12ec: 60 :Return rts
; When moving right, the leftmost part of the bitmap (the edge of the wing)
; doesn't get erased. Take care of that here.
12ed: a4 06 :EraseLeft ldy start_col ;get left column
12ef: 88 dey ;move one more left
12f0: c0 28 cpy #40 ;did it go negative?
12f2: b0 f8 bcs :Return ;yes, bail
12f4: a5 04 lda start_row ;get top row
12f6: 18 clc
12f7: 69 1c adc #28 ;add 28 to get to where the wing starts
12f9: aa tax
12fa: e0 c0 :RowLoop cpx #192 ;off bottom of screen?
12fc: b0 12 bcs :NextRow ;yes, skip this row
12fe: e0 08 cpx #8 ;off top of screen?
1300: 90 0e bcc :NextRow ;yes, skip this row
1302: bd 00 08 lda hires_addr_hi,x ;get hi-res address
1305: 85 01 sta ]hptr+1
1307: bd c0 08 lda hires_addr_lo,x
130a: 85 00 sta ]hptr
130c: a9 00 lda #$00 ;black pixels
130e: 91 00 sta (]hptr),y
1310: e8 :NextRow inx ;move down two rows
1311: e8 inx
1312: e4 05 cpx end_row ;done?
1314: d0 e4 bne :RowLoop ;not yet, loop
1316: 60 rts
1317: 00 00 00 00+ .junk 25
;
; Reads the paddle during a bombing run. We stop when we hit a value of 60,
; which happens a little later than usual because the read loop is 13 cycles
; rather than 12, but it still represents a small fraction of the full range.
;
; On exit:
; $10: value read from paddle (0-60)
;
1330: ad 70 c0 ReadBombPaddle lda PTRIG ;trigger analog paddles
1333: a0 00 ldy #$00
1335: ea nop
1336: ea nop
1337: ad 64 c0 :PdlLoop lda PADDL0 ;4
133a: 10 05 bpl :GotPdl ;2
133c: c8 iny ;2
133d: c0 3c cpy #60 ;2
133f: 90 f6 bcc :PdlLoop ;3 (13 cycles/loop)
1341: 84 10 :GotPdl sty player_desired_xc ;update desired horizontal position
1343: 60 rts
1344: 00 00 00 00 .junk 4
;
; Slides the player's plane or bomb sight up two rows.
;
1348: a5 0c SlidePlayerUp lda player_row ;get current row
134a: 38 sec
134b: e9 02 sbc #$02 ;move up 2
134d: c9 30 cmp #$30 ;reached $30?
134f: 90 02 bcc :Return ;yes, don't move higher
1351: 85 0c sta player_row
1353: 60 :Return rts
1354: ea ea ea ea .junk 4
;
; Slides the player's plane or bomb sight down two rows.
;
1358: a5 0c SlidePlayerDown lda player_row ;get current row
135a: 18 clc
135b: 69 02 adc #$02 ;move down 2
135d: c9 50 cmp #$50 ;reached $50?
135f: b0 02 bcs :Return ;yes, don't move lower
1361: 85 0c sta player_row
1363: 60 :Return rts
1364: 00 00 00 00 .junk 4
;
; Moves the player's plane two positions to the left.
;
; Moving twice isn't necessary for correctness -- the pixel shift mechanism is
; already working off of double pixels -- but it does allow the plane to move
; sideways twice as fast.
;
1368: a5 0e FlyPlayerLeft lda player_col_shift ;get current shift
136a: 38 sec
136b: e9 02 sbc #$02 ;subtract 2
136d: 10 07 bpl :NoByteAdj ;still positive, don't need to update byte
136f: 18 clc
1370: 69 07 adc #$07 ;add 7 to make it positive again
1372: c6 0d dec player_col ;decrement the byte position twice (always even)
1374: c6 0d dec player_col
1376: 85 0e :NoByteAdj sta player_col_shift ;save updated value
1378: 60 rts
;
; Moves the player's plane two pixels to the right.
;
1379: a5 0e FlyPlayerRight lda player_col_shift ;get current shift
137b: 18 clc
137c: 69 02 adc #$02 ;add 2
137e: c9 07 cmp #$07 ;are we at 7 or 8?
1380: 90 07 bcc :NoByteAdj ;nope, leave byte position alone
1382: 38 sec
1383: e9 07 sbc #$07 ;drop it back to 0 or 1
1385: e6 0d inc player_col ;increment the byte position twice (always even)
1387: e6 0d inc player_col
1389: 85 0e :NoByteAdj sta player_col_shift ;save updated value
138b: 60 rts
138c: 00 00 00 00 .junk 4
;
; Draws the player's plane or bombsight.
;
DrawPlaneOrSight
1390: a5 11 lda player_cur_xc ;get current horizontal position
1392: c5 10 cmp player_desired_xc ;compare to desired position
1394: f0 0f beq _JmpDrawPlayer ;equal, no movement required
1396: 90 08 bcc :FlyRight ;current < desired, fly right
; Fly left.
1398: c6 11 dec player_cur_xc ;decrement position
139a: 20 68 13 jsr FlyPlayerLeft
139d: 4c a5 13 jmp _JmpDrawPlayer
13a0: e6 11 :FlyRight inc player_cur_xc ;increment position
13a2: 20 79 13 jsr FlyPlayerRight
13a5: 4c c0 12 _JmpDrawPlayer jmp DrawPlyrPlane ;draw player as plane or bomb sight
13a8: 00 00 00 00+ .junk 8
;
; Slides the player's plane up or down.
;
; During a bombing run, the plane slowly drifts up and down the screen, with the
; top of the plane between $32 and $4e. Because we only draw on even rows, the
; slide is done two rows at a time. There are 14 positions, but we try to move
; each direction 32 times, so we spend about half our time sliding and the other
; half holding position at one end or the other.
;
13b0: e6 12 SlidePlayer inc player_slide_ctr
13b2: a5 12 lda player_slide_ctr ;check the counter
13b4: c9 40 cmp #$40 ;reached limit?
13b6: 90 04 bcc :NotAtLim ;not yet, branch
13b8: a9 00 lda #$00
13ba: 85 12 sta player_slide_ctr ;reset counter
13bc: c9 20 :NotAtLim cmp #$20 ;are we sliding up or down?
13be: 90 03 bcc :Down
13c0: 4c 48 13 jmp SlidePlayerUp
13c3: 4c 58 13 :Down jmp SlidePlayerDown
13c6: 00 00 00 00+ .junk 26
;
; Finishes bombing-phase initialization, and falls into game loop.
;
InitBombingMode2
13e0: a9 00 lda #$00
13e2: 85 63 sta air_attack_msg_flag ;showing status bar
13e4: 85 64 sta bombrun_timer_lo ;init game counters and flags
13e6: 85 65 sta frames_until_dogfight
13e8: 85 66 sta dogfight_remain
13ea: 85 68 sta eplane_suppress_fire
13ec: 85 67 sta bombrun_timer_hi
13ee: a9 02 lda #$02
13f0: 85 20 sta frame_counter ;init alternate-frame counter
;
; Main loop during bombing phase.
;
; On every frame we scroll the terrain, update the plane, and update flak
; bursts. We do additional updates on alterate frames. One set of updates
; reads the paddle and updates the player, the other deals with explosions and
; enemy flak pops.
;
13f2: 20 20 14 BombGameLoop jsr :MainUpdates
13f5: c6 20 dec frame_counter
13f7: d0 13 bne :DoUpdates2
13f9: a9 02 lda #$02
13fb: 85 20 sta frame_counter ;reset counter
; Update set #1.
13fd: 20 30 13 jsr ReadBombPaddle ;read game paddle to position bomber
1400: 20 b0 13 jsr SlidePlayer ;slide player up/down
1403: 20 80 10 jsr CheckFlakBurst ;see if it's time for a flak burst
1406: 20 60 0a jsr CheckBombButton ;drop a bomb if button pushed
1409: 4c f2 13 jmp BombGameLoop
; Update set #2.
140c: 20 70 0b :DoUpdates2 jsr DrawBombExplosions ;update bomb explosions
140f: 20 30 0f jsr CheckKbdSpc ;check for ' ' key
1412: 20 90 10 jsr CheckPlayerFlakked ;check if player got hit by flak burst
1415: 20 00 0a jsr UpdateBomb ;update falling bomb
1418: 20 e0 1f jsr UpdateFlakPops ;update harmless flak pops
141b: 4c f2 13 jmp BombGameLoop
141e: 4c f2 .junk 2
; These happen every frame.
1420: 20 00 04 :MainUpdates jsr ScrollTerrain ;scroll terrain down 2 lines, draw new line at top
1423: 20 90 13 jsr DrawPlaneOrSight ;draw player
1426: 4c 30 0d jmp UpdateFlakBurst ;update flak burst progress
1429: 00 00 00 00+ .fill 23,$00
;
; Difficulty modifiers. The difficulty level is initially 1 and goes up to 5.
; (The last 3 bytes in each item are unused.)
1440: e0 c0 a0 80+ lvl_plane_freq .bulk $e0,$c0,$a0,$80,$60,$00,$00,$00 ;dogfight: game frames between plane updates
1448: 07 07 07 07+ lvl_plane_kdist .bulk $07,$07,$07,$07,$06,$00,$00,$00 ;dogfight: state at which bullets kill player
1450: 03 03 02 02+ lvl_plane_speed .bulk $03,$03,$02,$02,$02,$00,$00,$00 ;dogfight: # of rounds to hold each animation frame
lvl_flak_burst_int
1458: 50 40 30 20+ .bulk $50,$40,$30,$20,$10,$00,$00,$00 ;bombing: flak burst interval
1460: a6 56 SetDifficulty ldx player_level ;get current difficulty (1-5)
1462: ca dex ;now 0-4
1463: bd 40 14 lda lvl_plane_freq,x ;copy values out of table and into "constants"
1466: 8d 97 17 sta _DogfightFreq+1
1469: 4a lsr A
146a: 8d 8a 17 sta _PrimaryPlaneFreq+1
146d: bd 48 14 lda lvl_plane_kdist,x
1470: 8d 92 1e sta _LevelKillFrame+1
1473: bd 50 14 lda lvl_plane_speed,x
1476: 8d 26 1a sta _LevelPlaneSpeed+1
1479: bd 58 14 lda lvl_flak_burst_int,x
147c: 8d 6a 10 sta _LevelFlakBurst+1
147f: 60 rts
1480: d5 aa d5 aa+ .junk 32
;
; Checks to see if a bullet we fired hit an enemy plane. Only used for
; secondary planes.
;
; This is an exact copy of the code at $1a50, with one exception: no points are
; scored.
;
• Clear variables
]top_row .var $00 {addr/1}
]bottom_row .var $01 {addr/1}
]left_col .var $03 {addr/1}
]right_col .var $04 {addr/1}
CheckSecondaryPlaneHit
14a0: a5 b0 lda bullet_flying_flag ;is a bullet in flight?
14a2: d0 01 bne :GotBullet ;yes, do the check
14a4: 60 :Return rts
14a5: a5 a0 :GotBullet lda eplane_state ;is the plane alive?
14a7: 10 01 bpl :IsAlive ;yes, do the check
14a9: 60 rts
14aa: a5 a1 :IsAlive lda eplane_row ;create hitbox around plane
14ac: 85 00 sta ]top_row
14ae: 18 clc
14af: 69 17 adc #23 ;23 rows high
14b1: 85 01 sta ]bottom_row
14b3: a5 a2 lda eplane_col
14b5: 85 03 sta ]left_col
14b7: 18 clc
14b8: 69 06 adc #6 ;6 bytes wide
14ba: 85 04 sta ]right_col
14bc: a5 b1 lda bullet_row ;see if bullet is inside hit box
14be: c5 00 cmp ]top_row
14c0: 90 e2 bcc :Return
14c2: c5 01 cmp ]bottom_row
14c4: b0 de bcs :Return
14c6: a5 b2 lda bullet_col_byte
14c8: c5 03 cmp ]left_col
14ca: 90 d8 bcc :Return
14cc: c5 04 cmp ]right_col
14ce: b0 d4 bcs :Return
; Bullet hit.
14d0: a9 81 lda #$81
14d2: 85 a0 sta eplane_state ;set state to exploding
14d4: a9 17 lda #23
14d6: 85 00 sta ]top_row ;this is now bitmap height
14d8: 20 30 19 jsr EraseEnemyPlane ;erase the plane
14db: a5 a2 lda eplane_col ;make column even so we don't have to
14dd: 29 fe and #$fe ; do odd/even games with bitmap
14df: 85 a2 sta eplane_col
14e1: 60 rts
;
; Checks the secondary plane if it's time to do so.
;
CheckSecondaryPlane
14e2: a5 6b lda enemy_plane_sec_timer ;get the timer
14e4: f0 05 beq :DoCheck ;if zero, do the check
14e6: c9 50 cmp #$50
14e8: f0 01 beq :DoCheck ;if it's $50, do the check
14ea: 60 :Return rts ;otherwise, no check
14eb: a5 70 :DoCheck lda enemy_plane_state1 ;is secondary plane active?
14ed: f0 fb beq :Return ;no, return to caller
14ef: 20 00 12 jsr SwapPlaneState ;swap secondary with primary
14f2: 20 a0 14 jsr CheckSecondaryPlaneHit ;do the check (with a dedicated function...
14f5: 20 00 12 jsr SwapPlaneState ; state swap not necessary)
14f8: 60 rts
14f9: 20 e0 1a 4c+ .junk 7
;
; Initializes state when transitioning to the bombing phase.
;
InitBombingMode1
1500: 20 60 14 jsr SetDifficulty ;configure difficulty values
1503: a0 0f ldy #$0f
1505: a9 00 lda #$00
1507: 99 00 03 :ZeroLoop sta flak0_state,y ;reset the flak pop state
150a: 88 dey
150b: 10 fa bpl :ZeroLoop
150d: ea nop
150e: 85 10 sta player_desired_xc ;set horizontal position to left edge
1510: 85 11 sta player_cur_xc
1512: 85 12 sta player_slide_ctr ;init vertical drift
1514: 85 0d sta player_col ;set byte/pixel position for left edge
1516: 85 0e sta player_col_shift
1518: a9 20 lda #$20 ;start fairly high up
151a: 85 0c sta player_row
151c: 4c e0 13 jmp InitBombingMode2 ;continue initialization
151f: 00 .junk 1
;
; This acts as the game loop while the player is crashing/crashed.
;
1520: 20 50 15 PlayerCrashLoop jsr UpdateTerrainAndFlak ;scroll terrain, update flak burst
1523: c6 20 dec frame_counter ;update plane every other frame
1525: d0 f9 bne PlayerCrashLoop ;not this time, loop
1527: a9 02 lda #$02
1529: 85 20 sta frame_counter ;reset counter
152b: 20 50 0c jsr UpdatePlayerCrash ;update crashing player
152e: 20 43 15 jsr PlayCrashSound
1531: 20 00 0a jsr UpdateBomb ;update bomb if we dropped one before getting hit
1534: 20 e0 1f jsr UpdateFlakPops ;update the flak pops
1537: 20 70 0b jsr DrawBombExplosions ;update bomb explosions (including plane)
153a: c6 21 dec plyr_crash_ctr ;are we done showing player's demise?
153c: d0 e2 bne PlayerCrashLoop ;not yet, loop
153e: 4c 00 1d jmp PlaneShotDown ;that's enough, move on
1541: 00 00 .junk 2
1543: a5 f8 PlayCrashSound lda player_crash_state ;time left on counter?
1545: d0 01 bne :TimeLeft ;yes, play the sound
1547: 60 rts
1548: a2 1a :TimeLeft ldx #$1a
154a: 20 c3 0f jsr PlaySimpleSound
154d: 60 rts
154e: 00 00 .junk 2
;
; Scrolls the terrain and updates the flak burst. Called while the player is
; crashing.
;
UpdateTerrainAndFlak
1550: 20 00 04 jsr ScrollTerrain
1553: a9 00 lda #$00
1555: 85 65 sta frames_until_dogfight
1557: 4c 30 0d jmp UpdateFlakBurst
155a: 00 00 00 00+ .junk 6
;
; Continue initialization of new game.
;
1560: a0 00 InitGame1 ldy #$00
1562: a9 00 :Zero50Loop lda #$00
1564: 99 50 00 sta score,y ;zero score, level, and plane/target hit counters
1567: c8 iny
1568: c0 10 cpy #$10
156a: 90 f6 bcc :Zero50Loop
156c: a9 01 lda #$01
156e: 85 56 sta player_level ;init level to 1
1570: a9 05 lda #$05
1572: 85 5d sta player_lives ;player gets 5 planes
;
; We jump here when transitioning from dogfight mode, and after being shot down.
;
1574: a9 00 InitBombingMode lda #$00
1576: 20 00 07 jsr ClearScreen ;clear screen to black
1579: 20 80 07 jsr DrawFullTerrain ;fill the terrain lines
157c: 20 60 5b jsr DrawScoreTempl ;draw the score text
157f: 20 30 5a jsr RedrawPlaneIcons ;draw the plane icons
1582: 20 12 5c jsr DrawLevel ;draw current difficulty level
1585: 20 50 5c jsr DrawScore ;draw score
1588: 20 20 5c jsr DrawTargetsHit ;draw number of targets hit
158b: 20 38 5c jsr DrawPlanesHit ;draw number of planes hit
; Zero out zero page from $70-ff. This resets most of the active state for both
; bombing and dogfighting.
158e: a0 00 ldy #$00
1590: a9 00 :ZeroLoop70 lda #$00
1592: 99 70 00 sta $0070,y
1595: c8 iny
1596: c0 90 cpy #$90
1598: 90 f6 bcc :ZeroLoop70
159a: a9 30 lda #$30 ;init flak burst counter (L3 timing)
159c: 85 c0 sta flak_burst_ctr
159e: 4c 00 15 jmp InitBombingMode1 ;continue initialization
15a1: 00 00 00 00+ .junk 15
;
; Entry point for starting (or re-starting) the game.
;
15b0: a9 c0 GameStart lda #$c0 ;start terrain at $c000 - 40
15b2: 85 60 sta terrain_src_ptr
15b4: a9 bf lda #$bf
15b6: 85 61 sta terrain_src_ptr+1
15b8: a9 00 lda #$00
15ba: 85 62 sta wronly_62? ;(?)
15bc: 85 63 sta air_attack_msg_flag ;init flags and timers
15be: 85 64 sta bombrun_timer_lo
15c0: 85 65 sta frames_until_dogfight
15c2: 85 68 sta eplane_suppress_fire
15c4: 85 67 sta bombrun_timer_hi
15c6: a0 00 ldy #$00
15c8: a9 00 lda #$00
15ca: 99 00 03 :InitLoop sta flak0_state,y ;init flak pop state
15cd: c8 iny
15ce: c0 10 cpy #$10
15d0: 90 f8 bcc :InitLoop
15d2: 4c 60 15 jmp InitGame1 ;continue initialization
15d5: 00 00 00 00+ .junk 11
;
; Checks whether the primary or secondary enemy plane has been hit.
;
15e0: 20 e0 1a CheckPlanesHit jsr CheckPrimaryPlaneHit ;check primary plane
15e3: 20 e2 14 jsr CheckSecondaryPlane ;check secondary plane
15e6: 4c d0 1d jmp UpdateExplodSecPlane ;if secondary exploding, update it
15e9: 00 00 00 00+ .junk 23
;
; Draws a bullet, recording its position in the bullet-erase list. Makes the
; gun-firing sound.
;
1600: 20 8e 16 DrawBullet jsr DrawBullet1 ;draw it
1603: a6 9e ldx bullet_draw_index ;get index into bullet-erase list
1605: a5 b1 lda bullet_row ;set row and column
1607: 95 90 sta bullet_rows,x
1609: a5 b2 lda bullet_col_byte
160b: 95 97 sta bullet_cols,x
; Make player-gun-firing sound.
160d: e6 af inc gun_sound_ctr
160f: a5 af lda gun_sound_ctr
1611: c9 10 cmp #$10 ;time to click?
1613: 90 07 bcc :Return
1615: a9 00 lda #$00
1617: 85 af sta gun_sound_ctr ;reset counter
1619: 8d 30 c0 sta SPKR ;click
161c: 60 :Return rts
161d: 00 00 00 a5+ .junk 23
;
; Moves a bullet fired by the player.
;
1634: c6 b5 MoveBullet dec bullet_horiz_ctr ;decrement horizontal-movement counter
1636: d0 2a bne :NoHoriz ;still counting, skip movement
1638: a5 b4 lda bullet_horiz_count ;get the move count
163a: 48 pha
163b: 29 7f and #$7f ;strip leftward flag
163d: 85 b5 sta bullet_horiz_ctr ;reset counter
163f: 68 pla ;now check high bit
1640: 0a asl A ;(could just BMI here?)
1641: b0 12 bcs :MoveLeft ;flag set, move left
1643: a5 b3 lda bullet_col_pixel ;get pixel-granularity column
1645: 18 clc
1646: 69 01 adc #$01 ;add one (move right)
1648: c9 07 cmp #$07 ;check for roll into next byte
164a: 90 04 bcc :NoInc1
164c: e6 b2 inc bullet_col_byte ;advance byte, zero pixel
164e: a9 00 lda #$00
1650: 85 b3 :NoInc1 sta bullet_col_pixel
1652: 4c 62 16 jmp :NoHoriz
1655: a5 b3 :MoveLeft lda bullet_col_pixel ;get pixel-granularity column
1657: 38 sec
1658: e9 01 sbc #$01 ;subtract one (move left)
165a: 10 04 bpl :NoDec1 ;didn't roll into next byte, branch
165c: c6 b2 dec bullet_col_byte
165e: a9 06 lda #$06
1660: 85 b3 :NoDec1 sta bullet_col_pixel
; Check vertical movement. Unlike horizontal movement, the counter determines
; how often we *don't* move.
1662: c6 b7 :NoHoriz dec bullet_vert_ctr ;decrement vertical-movement counter
1664: d0 06 bne :DoVert ;still counting, do movement
1666: a5 b6 lda bullet_vert_count ;reset counter
1668: 85 b7 sta bullet_vert_ctr
166a: d0 02 bne :NoDec ;(always)
166c: c6 b1 :DoVert dec bullet_row ;decrement row (move up)
166e: a5 b1 :NoDec lda bullet_row ;check to see if bullet has gone off screen
1670: c9 c0 cmp #192 ;off bottom of screen?
1672: b0 0b bcs :StopBullet ;yes, stop it
1674: c9 08 cmp #8 ;off top of screen?
1676: 90 07 bcc :StopBullet ;yes, stop it
1678: a5 b2 lda bullet_col_byte ;has bullet reached left/right edge?
167a: c9 28 cmp #40 ;check for 0 < value <= 40
167c: b0 01 bcs :StopBullet ;off screen, stop it
167e: 60 rts
167f: a9 00 :StopBullet lda #$00
1681: 85 b0 sta bullet_flying_flag ;stop bullet
1683: 60 rts
1684: 00 00 00 00+ .junk 10
;
; Draw one step of a tracer bullet. This will be a single or double pixel
; depending on how far up the screen it is (effectively making things smaller as
; they get farther away).
;
; In practice, because we're merging with blue, our double pixels are
; effectively just guaranteed single pixels, and single pixels may not appear at
; all. When they do appear it will be as a 3-pixel-wide white dash.
;
; (The frame rate is so high during the dogfight that it's all just a blur
; anyway.)
;
• Clear variables
]hptr .var $00 {addr/2}
168e: 20 34 16 DrawBullet1 jsr MoveBullet ;update position
1691: a5 b0 lda bullet_flying_flag ;still flying?
1693: d0 01 bne :DoDraw ;yes, draw it
1695: 60 rts
1696: a5 b1 :DoDraw lda bullet_row ;get current row
1698: aa tax
1699: c9 60 cmp #96 ;above line 96 (halfway up screen)?
169b: a9 f0 lda #<single_pixel
169d: 90 02 bcc :UseSingle ;yes, use single pixels
169f: a9 f8 lda #<double_pixel ;no, near bottom of screen, use double
16a1: 8d b5 16 :UseSingle sta :_Load+1
16a4: a6 b1 ldx bullet_row ;set up hi-res addr
16a6: bd 00 08 lda hires_addr_hi,x
16a9: 85 01 sta ]hptr+1
16ab: bd c0 08 lda hires_addr_lo,x
16ae: 85 00 sta ]hptr
16b0: a6 b3 ldx bullet_col_pixel ;get horizontal byte/pixel position
16b2: a4 b2 ldy bullet_col_byte
16b4: bd f0 0f :_Load lda single_pixel,x ;get pixel mask
16b7: 11 00 ora (]hptr),y ;blend pixel into blue, yielding white
16b9: 91 00 sta (]hptr),y ; (or possibly no change at all)
16bb: 60 rts
16bc: 00 00 00 00 .junk 4
;
; Bullet movement parameters, for 16 different angles (which are reflected
; left/right). The horizontal value determines how often we move left/right,
; the vertical value determines how often we *don't* move upward.
bullet_horiz_move
16c0: 3f 14 0a 07+ .bulk $3f,$14,$0a,$07,$05,$04,$03,$03,$03,$02,$02,$02,$02,$01,$01,$01
bullet_vert_freeze
16d0: ff 14 0a 07+ .bulk $ff,$14,$0a,$07,$0a,$0a,$32,$05,$03,$06,$04,$03,$02,$06,$03,$02
;
; Get the paddle position for firing guns.
;
; The timing loop is slightly faster than PREAD, but stops when the count
; reaches 128, so it spans slightly less than half the range of the paddle. The
; result is divided by 4 to get 0-32, but anything outside 1-31 just fires
; straight ahead.
;
; The use of an odd number of positions (33) makes sense, because you don't want
; things to be lopsided or have a double-wide center position. However, there
; are only 16 entries in the table, so the far-right paddle position is actually
; wrapping around and reading code.
;
• Clear variables
]tmp .var $00 {addr/1}
16e0: ad 70 c0 ReadGunPaddle lda PTRIG ;trigger paddle discharge
16e3: a0 00 ldy #$00
16e5: ea nop
16e6: ea nop
16e7: ad 64 c0 :PdlLoop lda PADDL0 ;4
16ea: 10 03 bpl :PdlDone ;2
16ec: c8 iny ;2
16ed: 10 f8 bpl :PdlLoop ;3 (11 cycles, 1 faster than PREAD)
16ef: 98 :PdlDone tya ;value is 0-128
16f0: 4a lsr A ;divide by 4 to get 0-32
16f1: 4a lsr A
16f2: c9 10 cmp #16 ;value >= 16?
16f4: b0 0f bcs :OnRight ;yes, branch
16f6: 85 00 sta ]tmp ;no, value is [0,15]
16f8: a9 10 lda #16 ;compute 16 - value
16fa: 38 sec
16fb: e5 00 sbc ]tmp ;now [1,16], where 1 is near center, 16 far left
16fd: aa tax ;put in X-reg
16fe: a9 80 lda #$80
1700: 85 00 sta ]tmp ;negative value
1702: 4c 0d 17 jmp :Cont
1705: 38 :OnRight sec ;value is [16,32]
1706: e9 10 sbc #16 ;subtract 16, now [0,16] (0 at center, 16 far right)
1708: aa tax ;put in X-reg
1709: a9 00 lda #$00 ;positive value
170b: 85 00 sta ]tmp
170d: bd c0 16 :Cont lda bullet_horiz_move,x ;get horizontal move cadence
1710: 85 b5 sta bullet_horiz_ctr ;save as current value
1712: 05 00 ora ]tmp ;OR in the left/right flag
1714: 85 b4 sta bullet_horiz_count ;save as reset value
1716: bd d0 16 lda bullet_vert_freeze,x ;get vertical move cadence
1719: 85 b6 sta bullet_vert_count ;save as reset value
171b: 85 b7 sta bullet_vert_ctr ;save as current value
171d: a9 bf lda #191
171f: 85 b1 sta bullet_row ;start at bottom of screen
1721: a9 14 lda #20
1723: 85 b2 sta bullet_col_byte ;centered horizontally
1725: a9 00 lda #$00
1727: 85 b3 sta bullet_col_pixel
1729: a9 01 lda #$01
172b: 85 b0 sta bullet_flying_flag ;set flag to indicate guns are firing
172d: 60 rts
172e: 00 00 .junk 2
;
; Checks to see if the gun is firing. Updates bullet if one is in flight.
;
; It's hard to see at full speed, but the game fires individual bullets, which
; animate up and away over the course of several frames.
;
; When you press the paddle button, a bullet fires. If you keep the button
; pressed, 3 more will fire before you must release the button and press it
; again. The paddle position is read before firing each bullet, allowing the
; user to sweep the cannon while holding the button down.
;
1730: a5 b0 UpdateGunFiring lda bullet_flying_flag ;bullet in flight?
1732: f0 03 beq :NotFiring ;no, check controls
1734: 4c 00 16 jmp DrawBullet ;yes, update bullet position
1737: 20 e0 1b :NotFiring jsr GetGunButton ;check gun button (resets firing count when rel)
173a: a5 6a lda gun_fire_count ;can we fire more bullets?
173c: f0 0b beq :ShortWait ;no, delay (balances paddle read?)
173e: ad 61 c0 lda BUTN0 ;bullets ready; button pressed?
1741: 10 06 bpl :ShortWait ;no, delay
1743: 20 e0 16 jsr ReadGunPaddle ;get new paddle reading (sets bullet-flying flag)
1746: c6 6a dec gun_fire_count ;bullet fired, reduce count
1748: 60 rts
1749: a9 05 :ShortWait lda #$05 ;delay for ~134 usec
174b: 4c a8 fc jmp MON_WAIT
174e: 00 00 .junk 2
;
; Updates gun state, updates bullet, and erases the current bullet tail.
;
1750: 20 30 17 UpdateGun jsr UpdateGunFiring ;update gun status
1753: 20 00 1b jsr EraseBulletTail ;erase tail of current bullet
1756: e6 9e inc bullet_draw_index ;cycle through 0-6
1758: a5 9e lda bullet_draw_index
175a: c9 07 cmp #$07 ;reached 7?
175c: 90 04 bcc :Return
175e: a9 00 lda #$00
1760: 85 9e sta bullet_draw_index ;start over at 0
1762: 60 :Return rts
1763: 30 c0 60 00+ .junk 29
;
; Main dogfight loop.
;
; There's not a lot going on animation-wise, so each game frame is pretty brief.
; The frame counter is used to pace things to level humans can handle. The
; counter is initialized to a level-dependent value. Halfway through, we update
; the primary plane. When it reaches zero, we update the secondary plane.
;
1780: 20 d8 17 DogfightLoop jsr UpdatePlayerDogfight ;shoot player gun, kill enemy planes
1783: c6 20 dec frame_counter ;is it time to check the secondary plane?
1785: a5 20 lda frame_counter
1787: f0 0a beq :CheckSecondary ;yes, branch
_PrimaryPlaneFreq
1789: c9 40 cmp #$40 ;modified by difficulty
178b: d0 f3 bne DogfightLoop ;not time to advance state yet, branch
178d: 20 ea 1f jsr UpdatePrimaryPlane ;advance hostile plane
1790: 4c 80 17 jmp DogfightLoop
1793: 20 60 12 :CheckSecondary jsr UpdateSecondaryPlane ;advance passive plane
1796: a9 a0 _DogfightFreq lda #$a0 ;modified by difficulty
1798: 85 20 sta frame_counter ;reset counter
179a: 4c 80 17 jmp DogfightLoop
179d: 17 00 00 .junk 3
;
; Creates a hostile enemy plane in the primary slot.
;
• Clear variables
]behav_ptr .var $00 {addr/2}
CreatePrimaryPlane
17a0: a5 a0 lda eplane_state ;enemy plane active?
17a2: f0 01 beq :Inactive ;no, branch
17a4: 60 rts
17a5: ad b3 17 :Inactive lda :_Load+1 ;get behavior table pointer
17a8: 18 clc
17a9: 69 08 adc #$08 ;cycle through table
17ab: 8d b3 17 sta :_Load+1
17ae: ea nop
17af: ea nop
17b0: ea nop
17b1: ea nop
17b2: a9 60 :_Load lda #<enemy_plane_behav+96 ;get behavior table pointer
17b4: 85 00 sta ]behav_ptr ;copy to DP
17b6: a9 11 lda #>enemy_plane_behav
17b8: 85 01 sta ]behav_ptr+1
17ba: a0 00 ldy #$00
17bc: b1 00 :Loop lda (]behav_ptr),y ;copy bytes into primary state
17be: 99 a0 00 sta eplane_state,y
17c1: c8 iny
17c2: c0 08 cpy #$08 ;copy all 8 bytes
17c4: 90 f6 bcc :Loop
17c6: a9 03 lda #$03 ;replace last value with $03
17c8: 85 a7 sta eplane_frame_hold_ctr ;(it may get reset to 2)
17ca: 60 rts
17cb: 01 38 e5 68+ .junk 13
;
; Updates the player's gun, and checks if enemy planes were hit.
;
; This is called in the main dogfight loop, and in the "dogfight done" loop to
; give the final secondary plane a chance to flee (or be shot down) before we go
; back to bombing.
;
UpdatePlayerDogfight
17d8: 20 50 17 jsr UpdateGun ;update gun and bullet
17db: 20 e0 15 jsr CheckPlanesHit ;see if player hit something
17de: ea nop
17df: ea nop
17e0: c6 22 dec dogfight_upd_ctr ;decrement counter
17e2: f0 01 beq :CountZero ;reached zero, do bonus stuff
17e4: 60 rts
17e5: a9 a0 :CountZero lda #$a0
17e7: 85 22 sta dogfight_upd_ctr ;reset counter
17e9: a5 a0 lda eplane_state ;is primary plane exploding?
17eb: 10 0e bpl :Return ;no, bail
17ed: 20 90 18 jsr DrawExplodingPlane ;draw explosion
17f0: e6 a0 inc eplane_state ;advance explosion frame
17f2: a5 a0 lda eplane_state
17f4: c9 88 cmp #$88 ;reached the end?
17f6: 90 03 bcc :Return ;not yet, bail
17f8: 4c 3c 1a jmp DeactivatePlane ;yes, mark plane as inactive
17fb: 60 :Return rts
17fc: 50 1a 00 00 .align $0100 (4 bytes)
;
; Address tables for enemy plane bitmaps. Must be page-aligned.
plane_approach_lo
1800: 20 .dd1 <plane_approach_0
1801: 60 .dd1 <plane_approach_1
1802: a0 .dd1 <plane_approach_2
1803: e0 .dd1 <plane_approach_3
1804: 20 .dd1 <plane_approach_4
1805: 60 .dd1 <plane_approach_5
1806: a0 .dd1 <plane_approach_6
plane_approach_hi
1807: 51 .dd1 >plane_approach_0
1808: 51 .dd1 >plane_approach_1
1809: 51 .dd1 >plane_approach_2
180a: 51 .dd1 >plane_approach_3
180b: 52 .dd1 >plane_approach_4
180c: 52 .dd1 >plane_approach_5
180d: 52 .dd1 >plane_approach_6
180e: 00 00 .junk 2
;
; Addresses for bitmaps of planes veering off, up/left/right. Each table of
; addresses has 6 entries and spans 16 bytes.
1810: 60 plane_rising_lo .dd1 <plane_rising_0
1811: f0 .dd1 <plane_rising_1
1812: 80 .dd1 <plane_rising_2
1813: 10 .dd1 <plane_rising_3
1814: a0 .dd1 <plane_rising_4
1815: 30 .dd1 <plane_rising_5
1816: 4a plane_rising_hi .dd1 >plane_rising_0
1817: 4a .dd1 >plane_rising_1
1818: 4b .dd1 >plane_rising_2
1819: 4c .dd1 >plane_rising_3
181a: 4c .dd1 >plane_rising_4
181b: 4d .dd1 >plane_rising_5
181c: 00 00 00 00 .junk 4
1820: 00 plane_left_lo .dd1 <plane_left_0
1821: 90 .dd1 <plane_left_1
1822: 20 .dd1 <plane_left_2
1823: b0 .dd1 <plane_left_3
1824: 40 .dd1 <plane_left_4
1825: d0 .dd1 <plane_left_5
1826: 47 plane_left_hi .dd1 >plane_left_0
1827: 47 .dd1 >plane_left_1
1828: 48 .dd1 >plane_left_2
1829: 48 .dd1 >plane_left_3
182a: 49 .dd1 >plane_left_4
182b: 49 .dd1 >plane_left_5
182c: 00 00 00 00 .junk 4
1830: c0 plane_right_lo .dd1 <plane_right_0
1831: 50 .dd1 <plane_right_1
1832: e0 .dd1 <plane_right_2
1833: 70 .dd1 <plane_right_3
1834: 00 .dd1 <plane_right_4
1835: 90 .dd1 <plane_right_5
1836: 4d plane_right_hi .dd1 >plane_right_0
1837: 4e .dd1 >plane_right_1
1838: 4e .dd1 >plane_right_2
1839: 4f .dd1 >plane_right_3
183a: 50 .dd1 >plane_right_4
183b: 50 .dd1 >plane_right_5
183c: 00 00 00 00 .junk 4
;
; Draws an enemy plane bitmap.
;
; On entry:
; $04: start row
; $05: end row (exclusive)
; $06: start column
; $07: end column (exclusive), must be start + 6
;
1840: a6 04 DrawEnemyPlane ldx start_row ;get top
1842: e0 c0 :RowLoop cpx #192 ;off bottom of screen?
1844: b0 2f bcs :SkipRow ;yes, branch
1846: e0 08 cpx #8 ;off top of screen?
1848: 90 2b bcc :SkipRow ;yes, branch
184a: bd c0 08 lda hires_addr_lo,x ;get hi-res address
184d: 8d 60 18 sta :_Store+1
1850: bd 00 08 lda hires_addr_hi,x
1853: 8d 61 18 sta :_Store+2
1856: a4 06 ldy start_col ;get left column
1858: c0 28 :ColLoop cpy #40 ;off left/right edge?
185a: b0 06 bcs :SkipDraw ;yes, branch
185c: ad 96 51 _LoadPlaneBits lda plane_approach_0+118 ;get a byte of data
185f: 99 50 3a :_Store sta HIRES_PAGE1+$1a50,y ;copy to hi-res screen
1862: ee 5d 18 :SkipDraw inc _LoadPlaneBits+1 ;advance to next byte of bitmap
1865: d0 03 bne :NoInc
1867: ee 5e 18 inc _LoadPlaneBits+2
186a: c8 :NoInc iny
186b: c4 07 cpy end_col ;done with row?
186d: d0 e9 bne :ColLoop ;no, loop
186f: e8 :NextRow inx ;down one line
1870: e4 05 cpx end_row ;done with bitmap?
1872: d0 ce bne :RowLoop ;no, loop
1874: 60 rts
1875: ad 5d 18 :SkipRow lda _LoadPlaneBits+1 ;get bitmap pointer
1878: 18 clc
1879: 69 06 adc #$06 ;6 bytes wide
187b: 8d 5d 18 sta _LoadPlaneBits+1
187e: 90 ef bcc :NextRow
1880: ee 5e 18 inc _LoadPlaneBits+2 ;update high byte
1883: 4c 6f 18 jmp :NextRow
1886: 00 00 00 00+ .junk 10
;
; Draws an exploding enemy plane.
;
DrawExplodingPlane
1890: a5 a0 lda eplane_state ;get animation frame
1892: 29 7f and #$7f ;strip "exploding" flag
1894: 38 sec
1895: e9 01 sbc #$01 ;index from zero
1897: 18 clc
1898: 69 40 adc #>enemy_pl_exp_0 ;each frame is on its own page
189a: 8d 5e 18 sta _LoadPlaneBits+2 ;set pointer
189d: a9 00 lda #<enemy_pl_exp_0
189f: 8d 5d 18 sta _LoadPlaneBits+1
18a2: a5 a1 lda eplane_row ;set up bitmap renderer
18a4: 85 04 sta start_row
18a6: 18 clc
18a7: 69 24 adc #36 ;36 rows high
18a9: 85 05 sta end_row
18ab: a5 a2 lda eplane_col
18ad: 85 06 sta start_col
18af: 18 clc
18b0: 69 06 adc #6 ;6 bytes wide
18b2: 85 07 sta end_col
18b4: 20 40 18 jsr DrawEnemyPlane ;draw it
18b7: 4c a0 1a jmp EnemyPlaneExplSound ;make some noise
18ba: 00 00 00 00+ .junk 6
;
; Draws an approaching enemy plane.
;
DrawApproachingPlane
18c0: a6 a0 ldx eplane_state ;get state
18c2: ca dex ;index from zero
18c3: bd 00 18 lda plane_approach_lo,x ;get bitmap address
18c6: 8d 5d 18 sta _LoadPlaneBits+1
18c9: bd 07 18 lda plane_approach_hi,x
18cc: 8d 5e 18 sta _LoadPlaneBits+2
18cf: a5 a1 lda eplane_row ;set up bitmap renderer
18d1: 85 04 sta start_row
18d3: 18 clc
18d4: 69 09 adc #9 ;9 rows high
18d6: 85 05 sta end_row
18d8: a5 a2 lda eplane_col
18da: 85 06 sta start_col
18dc: 18 clc
18dd: 69 06 adc #6 ;6 bytes wide
18df: 85 07 sta end_col
18e1: 20 40 18 jsr DrawEnemyPlane ;draw it
18e4: 4c 80 1e jmp FireEnemyGuns ;fire guns if they're close enough
18e7: 00 00 00 00+ .junk 9
;
; Draws a plane as it veers away.
;
DrawVeeringPlane
18f0: a5 a0 lda eplane_state ;get state (veers away at 8)
18f2: 38 sec
18f3: e9 08 sbc #$08 ;index from zero
18f5: aa tax ;copy to X-reg for later
18f6: a5 a4 lda eplane_veer_dir ;get direction (1=up, 2=left, 3=right)
18f8: 0a asl A ;multiply by 16
18f9: 0a asl A
18fa: 0a asl A
18fb: 0a asl A
18fc: 8d 06 19 sta :_LoadAddrLo+1 ;use as offset to low byte in addr table
18ff: 18 clc
1900: 69 06 adc #$06 ;add 6 (6 frames per entry)
1902: 8d 0c 19 sta :_LoadAddrHi+1 ;use as offset to high byte in addr table
1905: bd 10 18 :_LoadAddrLo lda plane_rising_lo,x ;get address of bitmap
1908: 8d 5d 18 sta _LoadPlaneBits+1
190b: bd 16 18 :_LoadAddrHi lda plane_rising_hi,x
190e: 8d 5e 18 sta _LoadPlaneBits+2
1911: a5 a1 lda eplane_row ;set up bitmap renderer
1913: 85 04 sta start_row
1915: 18 clc
1916: 69 17 adc #23 ;23 lines high
1918: 85 05 sta end_row
191a: a5 a2 lda eplane_col
191c: 85 06 sta start_col
191e: 18 clc
191f: 69 06 adc #6 ;6 bytes across
1921: 85 07 sta end_col
1923: 4c 40 18 jmp DrawEnemyPlane ;draw
1926: 00 00 00 00+ .junk 10
;
; Erases an enemy plane to blue. Width is assumed to be 6 bytes.
;
; On entry:
; $00: bitmap height
;
• Clear variables
]bitmap_height .var $00 {addr/1}
1930: a5 a1 EraseEnemyPlane lda eplane_row ;get top row
1932: aa tax ;save in X-reg for later
1933: 18 clc
1934: 65 00 adc ]bitmap_height ;add height
1936: 85 05 sta end_row ;save as end row
1938: a5 a2 lda eplane_col ;get left column
193a: 85 06 sta start_col
193c: 18 clc
193d: 69 06 adc #6 ;6 bytes wide
193f: 85 07 sta end_col
1941: e0 c0 :RowLoop cpx #192 ;off bottom of screen?
1943: b0 21 bcs :NextRow ;yes, branch
1945: e0 08 cpx #8 ;off top of screen?
1947: 90 1d bcc :NextRow ;yes, branch
1949: bd 00 08 lda hires_addr_hi,x ;get hi-res address
194c: 8d 60 19 sta :_Store+2
194f: bd c0 08 lda hires_addr_lo,x
1952: 8d 5f 19 sta :_Store+1
1955: a4 06 ldy start_col ;get left col
1957: c0 28 :ColLoop cpy #40 ;off left/right edge?
1959: b0 06 bcs :SkipDraw ;yes, don't draw
195b: b9 50 53 lda blue_sky,y ;get a byte of blue (odd/even aligned)
195e: 99 50 3e :_Store sta HIRES_PAGE1+$1e50,y ;copy to hi-res screen
1961: c8 :SkipDraw iny ;next column
1962: c4 07 cpy end_col ;done with row?
1964: d0 f1 bne :ColLoop ;no, loop
1966: e8 :NextRow inx ;next row
1967: e4 05 cpx end_row ;done?
1969: d0 d6 bne :RowLoop ;no, loop
196b: 60 rts
196c: 00 00 00 00 .junk 4
;
; Updates an approaching plane, modifying the float, erasing and redrawing it.
;
; Incoming planes float up and down, using values determined by the parameter
; table.
;
UpdateApproachingPlane
1970: c6 a6 dec eplane_float_ctr ;time to update float?
1972: d0 0a bne :NoChange ;not yet
1974: a5 a5 lda eplane_float_time
1976: 85 a6 sta eplane_float_ctr ;reset float counter
1978: a5 a3 lda eplane_float_dir
197a: 49 ff eor #$ff ;reverse float direction ($00/$ff)
197c: 85 a3 sta eplane_float_dir
197e: a9 09 :NoChange lda #9
1980: 85 00 sta ]bitmap_height ;set height to 9
1982: 20 30 19 jsr EraseEnemyPlane ;erase plane
]tmp .var $00 {addr/1}
1985: a5 a0 lda eplane_state ;get current state
1987: 4a lsr A ;cut it in half
1988: 85 00 sta ]tmp ;save it
198a: a5 a3 lda eplane_float_dir
198c: d0 0a bne :FloatDown
; Float up.
198e: a5 a1 lda eplane_row ;get current row
1990: 38 sec
1991: e5 00 sbc ]tmp ;subtract the half-state value
1993: 85 a1 sta eplane_row ;save new row
1995: 4c 9f 19 jmp :DoDrawAppr ;draw it
; Float down.
1998: a5 a1 :FloatDown lda eplane_row ;get current row
199a: 18 clc
199b: 65 00 adc ]tmp ;add the half-state value
199d: 85 a1 sta eplane_row ;save new row
199f: 4c c0 18 :DoDrawAppr jmp DrawApproachingPlane ;draw it
19a2: 00 00 00 00+ .junk 14
;
; Updates plane after it reaches the veer-away state.
;
]bitmap_height .var $00 {addr/1}
19b0: a9 17 PlaneLeaving lda #23
19b2: 85 00 sta ]bitmap_height
19b4: 20 30 19 jsr EraseEnemyPlane ;erase plane
19b7: a5 a1 lda eplane_row ;get row
19b9: 38 sec ;incoming planes are 9 rows high, veer-away planes
19ba: e9 06 sbc #$06 ; are 23 high, so add (23-9)/2=6 to maintain
19bc: 85 a1 sta eplane_row ; center line
19be: a5 a4 lda eplane_veer_dir ;get the veer-off direction
19c0: c9 01 cmp #$01 ;veer up?
19c2: f0 0f beq :DoDraw ;yes, no change to horizontal position
19c4: c9 02 cmp #$02 ;veer left?
19c6: f0 07 beq :GoLeft ;yes, branch
19c8: e6 a2 inc eplane_col ;value=$03, veer right by incrementing column
19ca: e6 a2 inc eplane_col ;twice
19cc: 4c d3 19 jmp :DoDraw
19cf: c6 a2 :GoLeft dec eplane_col ;decrement column
19d1: c6 a2 dec eplane_col ;twice
19d3: 4c f0 18 :DoDraw jmp DrawVeeringPlane
19d6: 00 00 00 00+ .junk 10
;
; Erases and redraws enemy plane. Updates position.
;
UpdateEnemyPlane
19e0: a5 a0 lda eplane_state ;get plane state
19e2: d0 01 bne :IsActive ;active, branch
19e4: 60 rts
19e5: c9 08 :IsActive cmp #$08 ;incoming?
19e7: 90 87 bcc UpdateApproachingPlane ;yes, do that
19e9: c9 10 cmp #$10 ;veering away?
19eb: 90 c3 bcc PlaneLeaving ;yes, do that
19ed: 60 rts ;exploding, do nothing here
19ee: 90 18 00 00+ .junk 18
;
; Deactivates plane if it flies offscreen.
;
DeactOffscreenPlane
1a00: a5 a0 lda eplane_state ;is plane active?
1a02: d0 01 bne :IsActive ;yes, continue
1a04: 60 rts
1a05: a5 a1 :IsActive lda eplane_row ;get row
1a07: c9 c0 cmp #192 ;off bottom of screen?
1a09: 90 09 bcc :RowOk ;no, branch
1a0b: c9 e0 cmp #224 ;off top of screen?
1a0d: b0 05 bcs :RowOk ;no, branch
1a0f: a9 00 :Deactivate lda #$00
1a11: 85 a0 sta eplane_state ;mark inactive
1a13: 60 :Return rts
1a14: a5 a2 :RowOk lda eplane_col ;get column
1a16: c9 28 cmp #40 ;off right edge of screen?
1a18: 90 f9 bcc :Return ;no, bail
1a1a: c9 e0 cmp #$e0 ;off left edge of screen?
1a1c: 90 f1 bcc :Deactivate ;yes, branch
1a1e: 60 rts
1a1f: 00 .junk 1
;
; Advances enemy plane state when hold counter expires.
;
UpdateEnemyPlaneFrame
1a20: c6 a7 dec eplane_frame_hold_ctr ;have we held anim frame for enough game frames?
1a22: f0 01 beq _LevelPlaneSpeed ;yes, branch
1a24: 60 :Return rts
_LevelPlaneSpeed
1a25: a9 03 lda #$03 ;modified by difficulty
1a27: 85 a7 sta eplane_frame_hold_ctr ;reset counter
1a29: a5 a0 lda eplane_state ;get plane state
1a2b: 30 f7 bmi :Return ;exploding, leave it be
1a2d: e6 a0 inc eplane_state ;advance to next frame
1a2f: c9 0d cmp #13 ;reached frame 13?
1a31: 90 04 bcc :Return ;not yet
1a33: a9 0d lda #13 ;cap at 13
1a35: 85 a0 sta eplane_state
1a37: 60 :Return rts
1a38: c9 88 90 fb .junk 4
;
; Marks plane as inactive, and erases it from the screen.
;
1a3c: a9 00 DeactivatePlane lda #$00
1a3e: 85 a0 sta eplane_state ;mark plane as inactive
1a40: a9 24 lda #36 ;use max height (explosions are 36 high)
1a42: 85 00 sta ]bitmap_height
1a44: 20 30 19 jsr EraseEnemyPlane ;erase
1a47: 60 rts
1a48: 00 00 00 00+ .junk 8
;
; Checks to see if one of our bullets has struck an enemy plane. Only used for
; primary planes.
;
; There is an exact copy of this code at $14a0 that does everything but increase
; the score and kill count. It appears this function is used for "hostile"
; planes in the primary slot, and the other is used for passive planes in the
; secondary slot.
;
• Clear variables
]top_row .var $00 {addr/1}
]bottom_row .var $01 {addr/1}
]left_col .var $03 {addr/1}
]right_col .var $04 {addr/1}
CheckEnemyPlaneHit1
1a50: a5 b0 lda bullet_flying_flag ;is a bullet in flight?
1a52: d0 01 bne :GotBullet ;yes, branch
1a54: 60 :Return rts
1a55: a5 a0 :GotBullet lda eplane_state ;is primary plane active and not exploding?
1a57: 10 01 bpl :CheckEnemyHit ;yes, branch
1a59: 60 rts
1a5a: a5 a1 :CheckEnemyHit lda eplane_row ;set up a hit box around enemy plane
1a5c: 85 00 sta ]top_row
1a5e: 18 clc
1a5f: 69 17 adc #23
1a61: 85 01 sta ]bottom_row
1a63: a5 a2 lda eplane_col
1a65: 85 03 sta ]left_col
1a67: 18 clc
1a68: 69 06 adc #6
1a6a: 85 04 sta ]right_col
1a6c: a5 b1 lda bullet_row ;see if our bullet is inside the hit box
1a6e: c5 00 cmp ]top_row
1a70: 90 e2 bcc :Return
1a72: c5 01 cmp ]bottom_row
1a74: b0 de bcs :Return
1a76: a5 b2 lda bullet_col_byte
1a78: c5 03 cmp ]left_col
1a7a: 90 d8 bcc :Return
1a7c: c5 04 cmp ]right_col
1a7e: b0 d4 bcs :Return
; Enemy plane was hit.
1a80: a9 81 lda #$81
1a82: 85 a0 sta eplane_state
1a84: a9 17 lda #23 ;largest height for plane bitmap
1a86: 85 00 sta ]top_row ;(this is now bitmap height arg)
1a88: 20 30 19 jsr EraseEnemyPlane ;erase it
1a8b: a5 a2 lda eplane_col ;make column even
1a8d: 29 fe and #$fe
1a8f: 85 a2 sta eplane_col
; Update score and kill counter.
1a91: a2 04 ldx #$04 ;add 40 points
1a93: 20 80 5c :Add10Loop jsr Add10Points
1a96: ca dex
1a97: d0 fa bne :Add10Loop
1a99: 20 e0 5c jsr IncPlanesHit ;add 1 to number of planes hit
1a9c: 4c c0 1c jmp RedrawPlanesHit ;redraw score, check if dogfight is done
1a9f: ea .junk 1
;
; Plays a sound when enemy plane is shot down.
;
EnemyPlaneExplSound
1aa0: a5 a0 lda eplane_state ;get plane state for a little variety
1aa2: 29 0f and #$0f ;reduce to 0-15
1aa4: 48 pha
1aa5: 68 :Loop1 pla
1aa6: f0 14 beq :Return
1aa8: 38 sec
1aa9: e9 01 sbc #$01
1aab: 48 pha
1aac: a2 20 ldx #$20
1aae: 8a :Loop2 txa
1aaf: a8 tay
1ab0: 88 :Loop3 dey
1ab1: d0 fd bne :Loop3
1ab3: 8d 30 c0 sta SPKR ;click
1ab6: ca dex
1ab7: d0 f5 bne :Loop2
1ab9: 4c a5 1a jmp :Loop1
1abc: 60 :Return rts
1abd: 00 00 00 .junk 3
;
; Checks to see if the POW camp was bombed. Called after confirming the
; vertical position.
;
1ac0: a5 f2 CheckPowCampHit lda bomb_horiz_posn ;get horizontal position
1ac2: c9 0a cmp #10 ;inside column 10-21 inclusive?
1ac4: 90 10 bcc :Return
1ac6: c9 16 cmp #22
1ac8: b0 0c bcs :Return
1aca: a2 00 ldx #$00
1acc: 56 50 :HalveLoop lsr score,x ;halve each decimal digit individually
1ace: e8 inx
1acf: e0 05 cpx #$05
1ad1: 90 f9 bcc :HalveLoop
1ad3: 4c 70 1e jmp PlayPowBombedSound
1ad6: 60 :Return rts
1ad7: 00 00 00 00+ .junk 9
;
; Checks to see if a bullet struck an enemy plane.
;
; We only do this sometimes, perhaps to require multiple shots to bring down a
; plane.
;
CheckPrimaryPlaneHit
1ae0: a5 22 lda dogfight_upd_ctr
1ae2: c9 40 cmp #$40 ;magic value?
1ae4: f0 04 beq :DoCheck ;yes, check
1ae6: c9 80 cmp #$80 ;other magic value?
1ae8: d0 04 bne :Return ;no, bail
1aea: a5 a0 :DoCheck lda eplane_state ;is plane active (alive or exploding)?
1aec: d0 01 bne :CheckIt ;yes, branch to check it
1aee: 60 :Return rts
1aef: 4c 50 1a :CheckIt jmp CheckEnemyPlaneHit1
1af2: 00 .junk 1
;
; Checks to see if a bomb hit one of the special targets. If so, the score is
; updated appropriately.
;
• Clear variables
]hptr .var $02 {addr/2}
CheckSpecialTargets1
1af3: a0 27 ldy #39 ;check rightmost column (odd)
1af5: b1 02 lda (]hptr),y ;POW area has a green line there
1af7: c9 01 cmp #$01 ;do we see that here?
1af9: d0 67 bne CheckSpecialTargets2 ;nope, not POW camp
1afb: 4c c0 1a jmp CheckPowCampHit ;maybe, check column
1afe: 00 00 .junk 2
;
; Erases the tail of the bullets, which are recorded in a 7-element circular
; buffer.
;
; This is called whether or not a bullet is active (need to clean up after
; they're gone). Entries are flagged as inactive as we erase things.
;
]hptr .var $00 {addr/2}
1b00: e6 9f EraseBulletTail inc bullet_erase_index ;cycle through 0-6
1b02: a5 9f lda bullet_erase_index
1b04: c9 07 cmp #$07
1b06: 90 04 bcc :Lt7
1b08: a9 00 lda #$00
1b0a: 85 9f sta bullet_erase_index
1b0c: a4 9f :Lt7 ldy bullet_erase_index ;get index
1b0e: b9 90 00 lda bullet_rows,y ;get row
1b11: c9 ff cmp #$ff ;something here?
1b13: f0 25 beq :Return ;no, bail
1b15: aa tax ;save in X-reg
1b16: a9 ff lda #$ff
1b18: 99 90 00 sta bullet_rows,y ;mark this erasure record as done
1b1b: b9 97 00 lda bullet_cols,y ;get column
1b1e: a8 tay
1b1f: bd 00 08 lda hires_addr_hi,x ;get hi-res address
1b22: 85 01 sta ]hptr+1
1b24: bd c0 08 lda hires_addr_lo,x
1b27: 85 00 sta ]hptr
1b29: e0 c0 cpx #192 ;off bottom of screen?
1b2b: b0 0d bcs :Return ;yes, bail
1b2d: e0 08 cpx #8 ;off top of screen?
1b2f: 90 09 bcc :Return ;yes, bail
1b31: c0 28 cpy #40 ;off left/right edge?
1b33: b0 05 bcs :Return ;yes, bail
1b35: b9 50 53 lda blue_sky,y ;get a byte of blue (odd/even)
1b38: 91 00 sta (]hptr),y ;write to hi-res screen
1b3a: 60 :Return rts
1b3b: 00 00 00 00+ .junk 5
;
; Adds 100 points to the player's score.
;
1b40: a0 03 Add100Points ldy #$03 ;4th column from left (000x00)
1b42: b9 50 00 :Loop lda score,y ;get current value
1b45: 18 clc
1b46: 69 01 adc #$01 ;add one
1b48: c9 0a cmp #10 ;rolled over?
1b4a: 90 09 bcc :NoRoll ;no, done
1b4c: a9 00 lda #$00
1b4e: 99 50 00 sta score,y ;set to zero
1b51: 88 dey ;move left one column
1b52: 10 ee bpl :Loop ;do it again
1b54: 60 rts
1b55: 99 50 00 :NoRoll sta score,y
1b58: 60 rts
1b59: 00 a0 27 b1+ .junk 9
;
; Wasn't the POW camp; check fuel, hospital, and HQ.
;
]hptr .var $02 {addr/2}
CheckSpecialTargets2
1b62: a0 00 ldy #$00 ;leftmost column (even)
1b64: b1 02 lda (]hptr),y ;get byte there
1b66: c9 01 cmp #$01 ;fuel dump has purple line
1b68: f0 1a beq :CheckFuelHit
1b6a: c9 81 cmp #$81 ;hospital has blue line
1b6c: f0 28 beq :CheckHospitalHit
1b6e: c9 82 cmp #$82 ;HQ has orange line
1b70: f0 01 beq :CheckHqHit
1b72: 60 :Return rts
1b73: a5 f2 :CheckHqHit lda bomb_horiz_posn ;get position
1b75: c9 0e cmp #14 ;column 14-19, inclusive?
1b77: 90 f9 bcc :Return
1b79: c9 14 cmp #20
1b7b: b0 f5 bcs :Return
1b7d: 20 40 1b jsr Add100Points ;+100 points for HQ
1b80: 20 50 5c jsr DrawScore ;draw score
1b83: 60 rts
1b84: a5 f2 :CheckFuelHit lda bomb_horiz_posn ;get position
1b86: c9 0c cmp #12 ;column 12 or 13, inclusive?
1b88: f0 04 beq :HitFuel ; (should be 11/12?)
1b8a: c9 0d cmp #13
1b8c: d0 e4 bne :Return
1b8e: 20 40 1b :HitFuel jsr Add100Points ;+100 points for fuel dump
1b91: 4c 50 5c jmp DrawScore ;draw score
1b94: ea ea .junk 2
:CheckHospitalHit
1b96: a5 f2 lda bomb_horiz_posn ;get position
1b98: c9 0e cmp #14 ;column 14-19, inclusive?
1b9a: 90 d6 bcc :Return
1b9c: c9 14 cmp #20
1b9e: b0 d2 bcs :Return
1ba0: a9 00 lda #$00 ;reset score to zero
1ba2: 85 50 sta score
1ba4: 85 51 sta score+1
1ba6: 85 52 sta score+2
1ba8: 85 53 sta score+3
1baa: 85 54 sta score+4
1bac: 20 50 5c jsr DrawScore ;draw score
; Play "hospital bombed" sound.
1baf: a2 18 ldx #$18
1bb1: a0 20 :SoundLoop ldy #$20
1bb3: 88 :WaitLoop dey
1bb4: d0 fd bne :WaitLoop
1bb6: 8d 30 c0 sta SPKR ;click
1bb9: ca dex
1bba: d0 f5 bne :SoundLoop
1bbc: 60 rts
1bbd: 00 00 00 .junk 3
;
; Checks to see if the bomb hit one of the special targets.
;
; All of the score modification is handled by the subroutine. No indication of
; whether a special target was hit is returned. The player is awarded (or
; deducted) points for the special target, and then the general points are
; applied.
;
; On exit:
; A-reg: value of Y-reg on entry
; Y-reg: #$01
; $00-01 preserved
;
]ptr00 .var $00 {addr/2}
CheckSpecialTargets
1bc0: 98 tya
1bc1: 48 pha ;preserve A-reg
1bc2: a5 00 lda ]ptr00 ;preserve $00-01
1bc4: 48 pha
1bc5: a5 01 lda ]ptr00+1
1bc7: 48 pha
1bc8: 20 f3 1a jsr CheckSpecialTargets1 ;check the targets
1bcb: 68 pla ;restore $00-01
1bcc: 85 01 sta ]ptr00+1
1bce: 68 pla
1bcf: 85 00 sta ]ptr00
1bd1: 68 pla ;restore A-reg
1bd2: a0 01 ldy #O_EXPL_VIGOR
1bd4: 60 rts
1bd5: 00 00 00 00+ .junk 11
;
; Checks the paddle button during a bombing run.
;
; On exit:
; $6a: set to $04 if button pressed
;
1be0: ad 61 c0 GetGunButton lda BUTN0 ;button pressed?
1be3: 30 05 bmi :Return ;yes, return without modifying count
1be5: a9 04 lda #$04
1be7: 85 6a sta gun_fire_count ;button not pressed, reset count to 4
1be9: 60 rts
1bea: 60 :Return rts
1beb: 6a f0 fb c6+ .junk 21
;
; Decrements the terrain pointer one line (40 bytes), wrapping around to the end
; when we reach the top. Also, decrements the countdown to dogfight mode.
;
DecrTerrPtrAndDfC
1c00: a5 60 lda terrain_src_ptr
1c02: 38 sec
1c03: e9 28 sbc #40 ;back up one line
1c05: 85 60 sta terrain_src_ptr
1c07: b0 02 bcs :NoDec
1c09: c6 61 dec terrain_src_ptr+1
1c0b: a5 61 :NoDec lda terrain_src_ptr+1
1c0d: c9 8a cmp #>terrain_data ;did we back up off start of data?
1c0f: b0 2f bcs :CheckDfTimer ;not yet
1c11: a9 c0 lda #$c0 ;point to last line: $c000 - 40 = $bfc0
1c13: 85 60 sta terrain_src_ptr
1c15: a9 bf lda #$bf
1c17: 85 61 sta terrain_src_ptr+1
1c19: 4c 40 1c jmp :CheckDfTimer
1c1c: b0 02 c6 61+ .junk 36
1c40: a5 63 :CheckDfTimer lda air_attack_msg_flag ;is "air attack" message enabled?
1c42: d0 0c bne CountdownToDf ;yes, count frames down
1c44: 4c 80 1c jmp UpdateBombRunTime ;no, see if it's time for dogfighting
1c47: 01 60 .junk 2
;
; Initializes the "quiet period" countdown to a dogfight. During this period we
; (try to) show the air-attack message, and deadly flak bursts are suspended.
;
1c49: e6 63 InitDfCountdown inc air_attack_msg_flag ;enable "air attack" message
1c4b: a9 70 lda #112
1c4d: 85 65 sta frames_until_dogfight ;play message for a few frames
1c4f: 60 rts
;
; Updates countdown during pre-dogfight quiet period. If it reaches zero, jump
; to dogfight code.
;
1c50: c6 65 CountdownToDf dec frames_until_dogfight ;decrement count
1c52: f0 01 beq InitDogfightMode ;hit zero, it's dogfight time
1c54: 60 rts
;
; Prepare for a dogfight.
;
InitDogfightMode
1c55: a9 d5 lda #$d5
1c57: 20 00 07 jsr ClearScreen ;clear screen to blue
1c5a: 20 60 5b jsr DrawScoreTempl ;draw status bar
1c5d: 20 30 5a jsr RedrawPlaneIcons ;draw lives-left icons
1c60: 20 50 5c jsr DrawScore ;draw score
1c63: 20 12 5c jsr DrawLevel ;draw difficulty level
1c66: 20 20 5c jsr DrawTargetsHit ;draw targets-hit counter
1c69: 20 38 5c jsr DrawPlanesHit ;draw hostile-planes-hit counter
1c6c: a9 07 lda #$07 ;player must defeat 7 planes to end dogfight
1c6e: 85 66 sta dogfight_remain
1c70: a9 00 lda #$00
1c72: 85 64 sta bombrun_timer_lo ;reset this (why?)
1c74: 85 63 sta air_attack_msg_flag ;clear air-attack message flag
1c76: a9 80 lda #$80
1c78: 85 22 sta dogfight_upd_ctr ;init update counter
1c7a: 4c 80 17 jmp DogfightLoop ;tallyho
1c7d: 00 00 00 .junk 3
;
; Increments the 16-bit bomb run duration timer. When it hits 512, we kick off
; the pre-dogfight quiet period.
;
UpdateBombRunTime
1c80: e6 64 inc bombrun_timer_lo ;count 256x
1c82: d0 0f bne :Return ;not there yet
1c84: e6 67 inc bombrun_timer_hi
1c86: a5 67 lda bombrun_timer_hi
1c88: c9 02 cmp #$02 ;512 interations?
1c8a: 90 07 bcc :Return ;not yet, branch
1c8c: a9 00 lda #$00
1c8e: 85 67 sta bombrun_timer_hi ;reset timer
1c90: 4c 49 1c jmp InitDfCountdown
1c93: 60 :Return rts
1c94: 00 00 00 00+ .junk 12
;
; Updates the "bomb targets hit" counter. Only medium- and high-value targets
; count.
;
; Redraws the hit counter and the score.
;
; On entry:
; A-reg: 1-3 depending on target value
;
UpdateTargetCounter
1ca0: c9 01 cmp #$01 ;low value target?
1ca2: f0 03 beq :NoInc ;yes, don't incr count
1ca4: 20 c0 5c jsr IncTargetsHit ;add one
1ca7: a5 63 :NoInc lda air_attack_msg_flag ;showing status bar?
1ca9: d0 06 bne :Return ;no, showing message; bail
1cab: 20 20 5c jsr DrawTargetsHit ;update on-screen display
1cae: 20 50 5c jsr DrawScore ;draw score
1cb1: 60 :Return rts
1cb2: 00 00 00 00+ .junk 14
;
; Redraws the "hostile planes hit" counter, and the score.
;
; If we've shot down enough planes, we end the dogfight.
;
1cc0: 20 50 5c RedrawPlanesHit jsr DrawScore ;redraw score
1cc3: 20 38 5c jsr DrawPlanesHit ;redraw number of enemy planes shot down
1cc6: c6 66 dec dogfight_remain ;decrement number required to end dogfight
1cc8: f0 01 beq :DogfightOver ;if we hit zero, end the dogfight
1cca: 60 rts
1ccb: a9 18 :DogfightOver lda #24 ;loop this many times
1ccd: 48 pha
;
; This becomes the dogfight game loop when the dogfight is over (successfully).
; We show the "bomb target approach" message and let the secondary plane fly
; away.
;
:DogfightOverLoop
1cce: 68 pla
1ccf: f0 18 beq :BackToBombing ;done, go back to bombing
1cd1: 38 sec
1cd2: e9 01 sbc #$01
1cd4: 48 pha
1cd5: 20 d8 17 :Loop jsr UpdatePlayerDogfight
1cd8: c6 20 dec frame_counter ;check number of frames?
1cda: d0 f9 bne :Loop
1cdc: a9 00 lda #$00
1cde: 85 20 sta frame_counter ;reset counter
1ce0: 20 20 1d jsr DrawBtaMsgAndSecPlane ;show BTA message, and draw non-hostile plane if alive
1ce3: 4c ce 1c jmp :DogfightOverLoop
1ce6: 4c ce 1c .junk 3
1ce9: 20 a0 5c :BackToBombing jsr IncDifficulty ;survived dogfight, increase player level
1cec: 4c 74 15 jmp InitBombingMode ;switch to bombing mode
1cef: 00 e0 17 19+ .junk 17
;
; Plane was shot down, during bombing or dogfight. Reduce difficulty level and
; lives remaining, then go back to bombing.
;
1d00: 20 b0 5c PlaneShotDown jsr DecDifficulty ;shot down by plane, decrease player level
1d03: c6 5d dec player_lives ;decrease lives
1d05: f0 29 beq GameOverMode ;whoops, game over
1d07: 4c 74 15 jmp InitBombingMode ;switch to bombing mode
1d0a: ca d0 f8 c6+ .junk 22
;
; Draws "bomb target approach" message and moves the secondary plane.
;
DrawBtaMsgAndSecPlane
1d20: 20 00 5b jsr DrawBtaMsg ;draw message in status bar
1d23: 4c 60 12 jmp UpdateSecondaryPlane ;let secondary plane flee
1d26: 00 00 00 00+ .junk 10
;
; Game over, man.
;
1d30: a9 00 GameOverMode lda #$00
1d32: 20 00 07 jsr ClearScreen ;clear screen to black
1d35: 20 60 5b jsr DrawScoreTempl ;redraw status bar, with scores
1d38: 20 12 5c jsr DrawLevel
1d3b: 20 20 5c jsr DrawTargetsHit
1d3e: 20 38 5c jsr DrawPlanesHit
1d41: 20 50 5c jsr DrawScore
1d44: 20 80 5f jsr DrawPressStartMsg ;draw "press button to play again" message
1d47: a9 49 lda #73 ;set counter for roughly 60 seconds
1d49: 85 60 sta terrain_src_ptr ;re-use the terrain pointer as a counter
1d4b: 20 50 5f :FlashMsgLoop jsr XdrawGameOver ;draw or erase text
1d4e: ad 61 c0 lda BUTN0 ;button 0 pressed?
1d51: 30 11 bmi :JumpToStart ;yes, start game
1d53: a2 05 ldx #$05
1d55: a9 00 :WaitLoop lda #$00 ;(ought to check button here so tap wakes us up)
1d57: 20 a8 fc jsr MON_WAIT ;wait for ~164 msec
1d5a: ca dex ;repeat 5x, for ~820 msec
1d5b: d0 f8 bne :WaitLoop
1d5d: c6 60 dec terrain_src_ptr ;timer expired?
1d5f: f0 06 beq :ReturnToDemo ;yes, bail out
1d61: 4c 4b 1d jmp :FlashMsgLoop ;no, keep flashing
1d64: 4c b0 15 :JumpToStart jmp GameStart ;start a new game
1d67: 6c 4e 00 :ReturnToDemo jmp (restart_vec) ;reboot (e.g. $C600)
1d6a: 50 5f 4c 47+ .junk 22
;
; Increments the pointer at $00-01.
;
• Clear variables
]hptr .var $00 {addr/2}
]src_ptr .var $02 {addr/2}
1d80: e6 00 IncPtr00 inc ]hptr
1d82: d0 02 bne :NoInc
1d84: e6 01 inc ]hptr+1
1d86: 60 :NoInc rts
1d87: ea .junk 1
;
; Increments the pointer at $02-03.
;
1d88: e6 02 IncPtr02 inc ]src_ptr
1d8a: d0 02 bne :NoInc
1d8c: e6 03 inc ]src_ptr+1
1d8e: 60 :NoInc rts
1d8f: ea .junk 1
;
; Draws jagged lines on the screen after being shot through the cockpit. This
; essentially uncompresses a full-screen overlay.
;
DrawCockpitDeath
1d90: a9 00 lda #$00
1d92: 85 00 sta ]hptr
1d94: 85 02 sta ]src_ptr
1d96: a9 20 lda #>HIRES_PAGE1 ;set draw pointer to start of page
1d98: 85 01 sta ]hptr+1
1d9a: a9 80 lda #>shatter_data ;data starts at $8000
1d9c: 85 03 sta ]src_ptr+1
1d9e: a0 00 ldy #$00
1da0: b1 02 :Loop lda (]src_ptr),y ;get byte of shatter data
1da2: 30 0d bmi :HandleCmd ;if high bit is set, handle specially
1da4: 51 00 eor (]hptr),y ;merge with screen contents
1da6: 91 00 sta (]hptr),y ;store
1da8: 20 80 1d jsr IncPtr00 ;advance hi-res pointer
1dab: 20 88 1d jsr IncPtr02 ;advance data pointer
1dae: 4c a0 1d jmp :Loop
1db1: c9 ff :HandleCmd cmp #$ff ;end of list?
1db3: d0 01 bne :NotDone ;no, keep going
1db5: 60 rts
1db6: 29 7f :NotDone and #%01111111 ;strip high bit
1db8: 18 clc
1db9: 65 00 adc ]hptr ;add value to hi-res pointer
1dbb: 85 00 sta ]hptr
1dbd: 90 02 bcc :NoInc
1dbf: e6 01 inc ]hptr+1
1dc1: 20 88 1d :NoInc jsr IncPtr02 ;advance data pointer
1dc4: 8d 30 c0 sta SPKR ;click
1dc7: 4c a0 1d jmp :Loop
1dca: 00 00 00 00+ .junk 6
;
; Updates secondary plane when it's exploding.
;
; This function has a bug: it swaps primary/secondary plane state, but fails to
; swap them back if the plane hasn't finished exploding. This makes the
; exploding plane primary, and the hostile plane secondary. Which is why, when
; you shoot a secondary plane, the primary plane stops shooting at you.
;
UpdateExplodSecPlane
1dd0: c6 6b dec enemy_plane_sec_timer
1dd2: f0 01 beq :DoUpdate
1dd4: 60 rts
1dd5: a9 a0 :DoUpdate lda #$a0
1dd7: 85 6b sta enemy_plane_sec_timer ;reset timer
1dd9: a5 70 lda enemy_plane_state1 ;secondary plane exploding?
1ddb: 10 14 bpl :Return ;no, inactive or alive; bail
1ddd: 20 00 12 jsr SwapPlaneState ;swap secondary state in
1de0: 20 90 18 jsr DrawExplodingPlane ;draw the exploding plane
1de3: e6 a0 inc eplane_state ;advance the state
1de5: a5 a0 lda eplane_state
1de7: c9 88 cmp #$88 ;fully exploded?
1de9: 90 06 bcc :Return ;not yet (BUG: should swap state back)
1deb: 20 3c 1a jsr DeactivatePlane ;deactivate plane
1dee: 20 00 12 jsr SwapPlaneState ;swap state back
1df1: 60 :Return rts
1df2: 00 00 00 00+ .junk 14
;
; Draws bitmap that indicates enemy plane is firing at us. The bitmap is XORed
; so we can erase it later.
;
; On entry:
; $04: start row
; $05: end row (exclusive)
; $06: start column
; $07: end column (exclusive), must be start + 6
;
• Clear variables
]hptr .var $00 {addr/2}
XdrawPlaneFiring1
1e00: a6 04 ldx start_row ;get top row
1e02: e0 c0 :RowLoop cpx #192 ;off bottom of screen?
1e04: b0 29 bcs :SkipRow ;yes, skip row
1e06: e0 08 cpx #8 ;off top of screen?
1e08: 90 25 bcc :SkipRow ;yes, skip row
1e0a: bd 00 08 lda hires_addr_hi,x ;get hi-res address
1e0d: 85 01 sta ]hptr+1
1e0f: bd c0 08 lda hires_addr_lo,x
1e12: 85 00 sta ]hptr
1e14: a4 06 ldy start_col ;get left column
1e16: c0 28 cpy #40 ;off left/right edge?
1e18: b0 07 bcs :SkipDraw ;yes, skip draw
1e1a: ad 90 53 _PlaneFireLoad lda plane_firing+144 ;get byte from bitmap
1e1d: 51 00 eor (]hptr),y ;XOR with screen contents
1e1f: 91 00 sta (]hptr),y ;update hi-res screen
1e21: ee 1b 1e :SkipDraw inc _PlaneFireLoad+1 ;advance bitmap pointer
1e24: c8 iny
1e25: c4 07 cpy end_col
1e27: d0 f1 bne _PlaneFireLoad ;bug: should branch to CPY two lines above
1e29: e8 :NextRow inx
1e2a: e4 05 cpx end_row
1e2c: d0 d4 bne :RowLoop
1e2e: 60 rts
1e2f: ad 1b 1e :SkipRow lda _PlaneFireLoad+1
1e32: 18 clc
1e33: 69 06 adc #6 ;bitmap is 6 bytes wide
1e35: 8d 1b 1e sta _PlaneFireLoad+1
1e38: 4c 29 1e jmp :NextRow
1e3b: 00 00 00 00+ .junk 5
;
; Draws bitmap that indicates enemy plane is firing at us. The bitmap is XORed
; so we can erase it later.
;
XdrawPlaneFiring
1e40: a5 a1 lda eplane_row ;set up bitmap renderer
1e42: 85 04 sta start_row
1e44: 18 clc
1e45: 69 09 adc #9 ;9 lines high
1e47: 85 05 sta end_row
1e49: a5 a2 lda eplane_col
1e4b: 85 06 sta start_col
1e4d: 18 clc
1e4e: 69 06 adc #6 ;6 columns wide
1e50: 85 07 sta end_col
1e52: a9 00 lda #<plane_firing
1e54: 8d 1b 1e sta _PlaneFireLoad+1
1e57: 20 00 1e jsr XdrawPlaneFiring1 ;draw it
1e5a: a2 20 ldx #$20
1e5c: 4c c3 0f jmp PlaySimpleSound ;make enemy-firing sound
1e5f: 00 .junk 1
;
; Sound subroutine, used for POW camp hit sound.
;
; On entry:
; Y-reg: affects frequency
;
1e60: a2 08 PowBombedSound1 ldx #$08 ;repeat 8x
1e62: ea :WaitLoop nop
1e63: 88 dey
1e64: d0 fc bne :WaitLoop
1e66: 8d 30 c0 sta SPKR ;click
1e69: ca dex
1e6a: d0 f6 bne :WaitLoop ;note Y-reg is now $00
1e6c: 60 rts
1e6d: ea ea ea .junk 3
;
; Plays a distinctive sound when a POW camp is bombed.
;
PlayPowBombedSound
1e70: a0 10 ldy #$10
1e72: 20 60 1e jsr PowBombedSound1
1e75: a0 30 ldy #$30
1e77: 20 60 1e jsr PowBombedSound1
1e7a: a0 20 ldy #$20
1e7c: 4c 60 1e jmp PowBombedSound1
1e7f: 00 .junk 1
;
; Fires enemy guns if the hostile plane is close enough.
;
; The animation frame number for an incoming plane tells us how far they appear
; to be. Starting on frame 4 the guns fire, on frame 7 they either kill the
; player or miss entirely. At difficulty level five, frame 6 becomes the kill
; frame.
;
1e80: a5 68 FireEnemyGuns lda eplane_suppress_fire ;do we need to suppress guns?
1e82: f0 01 beq :FireOk ;no, firing is okay
1e84: 60 rts
1e85: a5 a0 :FireOk lda eplane_state ;check state of incoming plane (effective distance)
1e87: c9 04 cmp #$04 ;close enough?
1e89: b0 01 bcs :CloseEnough ;yes, branch
1e8b: 60 rts
1e8c: 20 40 1e :CloseEnough jsr XdrawPlaneFiring ;draw bitmap and play sound
1e8f: a5 a0 lda eplane_state ;check animation frame
1e91: c9 07 _LevelKillFrame cmp #$07 ;modified by difficulty
1e93: f0 01 beq :JmpCheckShot ;potential kill
1e95: 60 rts
1e96: 4c d0 1e :JmpCheckShot jmp :CheckPlayerIsShot ;see if it's in the strike zone
1e99: 4c 00 1d 00+ .junk 55
:CheckPlayerIsShot
1ed0: a5 a1 lda eplane_row ;get enemy plane's row
1ed2: c9 10 cmp #16 ;near top of screen?
1ed4: b0 01 bcs :NotTop ;no, branch
1ed6: 60 :Return rts
1ed7: c9 80 :NotTop cmp #128 ;near bottom of screen?
1ed9: b0 fb bcs :Return ;yes, give the player a break
1edb: a5 a2 lda eplane_col
1edd: c9 08 cmp #8 ;far left?
1edf: 90 f5 bcc :Return ;yes, not a kill
1ee1: c9 20 cmp #32 ;far right?
1ee3: b0 f1 bcs :Return ;yes, not a kill
; Player has been shot down.
1ee5: 20 90 1d jsr DrawCockpitDeath ;draw shattered windshield
1ee8: a2 30 ldx #$30 ;make some noise
1eea: 20 c3 0f jsr PlaySimpleSound
1eed: a9 00 lda #$00
1eef: 20 a8 fc jsr MON_WAIT
1ef2: a2 30 ldx #$30
1ef4: 20 c3 0f jsr PlaySimpleSound
1ef7: a9 00 lda #$00
1ef9: 20 a8 fc jsr MON_WAIT
1efc: 4c 00 1d jmp PlaneShotDown ;handle death
1eff: 00 .junk 1
;
; Draws or erases the flak pop in slot 0.
;
1f00: ad 00 03 UpdateFlakPop0 lda flak0_state ;is flak active?
1f03: f0 2f beq :Return ;no, bail
1f05: ad 03 03 lda flak0_row ;set up bitmap renderer
1f08: 85 04 sta start_row
1f0a: 18 clc
1f0b: 69 24 adc #36 ;36 lines high
1f0d: 85 05 sta end_row
1f0f: ad 04 03 lda flak0_col
1f12: 85 06 sta start_col
1f14: 18 clc
1f15: 69 06 adc #6 ;6 bytes wide
1f17: 85 07 sta end_col
1f19: 20 90 0f jsr XdrawFlakPop ;draw or erase
1f1c: ad 03 03 lda flak0_row
1f1f: 18 clc
1f20: 69 04 adc #$04 ;called on alternate frames, scroll 2 lines per frame
1f22: 8d 03 03 sta flak0_row
1f25: ee 00 03 inc flak0_state ;advance to next state
1f28: ad 00 03 lda flak0_state
1f2b: c9 03 cmp #$03 ;are we done yet?
1f2d: 90 05 bcc :Return ;no, bail
1f2f: a9 00 lda #$00
1f31: 8d 00 03 sta flak0_state ;mark inactive
1f34: 60 :Return rts
1f35: 00 00 00 00+ .junk 11
;
; Draws or erases the flak pop in slot 1.
;
1f40: ad 08 03 UpdateFlakPop1 lda flak1_state ;is flak active?
1f43: d0 01 bne :NonZero ;yes, branch
1f45: 60 rts
1f46: ad 0a 03 :NonZero lda flak1_row ;set up bitmap renderer
1f49: 85 04 sta start_row
1f4b: 18 clc
1f4c: 69 24 adc #36 ;36 lines high
1f4e: 85 05 sta end_row
1f50: ad 0b 03 lda flak1_col
1f53: 85 06 sta start_col
1f55: 18 clc
1f56: 69 06 adc #6 ;6 bytes wide
1f58: 85 07 sta end_col
1f5a: 20 90 0f jsr XdrawFlakPop ;draw or erase
1f5d: ad 0a 03 lda flak1_row
1f60: 18 clc
1f61: 69 04 adc #$04 ;called on alternate frames, scroll 2 lines per frame
1f63: 8d 0a 03 sta flak1_row
1f66: ee 08 03 inc flak1_state ;advance to next state
1f69: ad 08 03 lda flak1_state
1f6c: c9 03 cmp #$03 ;are we done yet?
1f6e: 90 05 bcc :Return ;no, bail
1f70: a9 00 lda #$00
1f72: 8d 08 03 sta flak1_state ;mark inactive
1f75: 60 :Return rts
1f76: ea 00 00 00+ .junk 10
;
; Generates new flak pops in slots 0/1.
;
1f80: ad 00 03 GenerateFlak lda flak0_state ;slot 0 available?
1f83: d0 15 bne :ZeroBusy ;no, branch
1f85: a9 01 lda #$01
1f87: 8d 00 03 sta flak0_state ;mark as need-draw
1f8a: ad 90 24 lda HIRES_PAGE1+$490 ;get byte from line 9, column 16
1f8d: 29 1e and #$1e ;reduce to 0-30, even values
1f8f: 8d 04 03 sta flak0_col ;set as column
1f92: a5 0c lda player_row
1f94: 38 sec
1f95: e9 1d sbc #29 ;target player row minus 29 (terrain row)
1f97: 8d 03 03 sta flak0_row
1f9a: ad 08 03 :ZeroBusy lda flak1_state ;slot 1 available?
1f9d: f0 01 beq :OneAvail ;yes, branch
1f9f: 60 rts
1fa0: a9 01 :OneAvail lda #$01
1fa2: 8d 08 03 sta flak1_state ;mark as need-draw
1fa5: a5 0c lda player_row
1fa7: 38 sec
1fa8: e9 25 sbc #37 ;target player row minus 37 (terrain row)
1faa: 8d 0a 03 sta flak1_row
1fad: ad 90 2c lda HIRES_PAGE1+$c90 ;get byte from line 11, column 16
1fb0: 05 60 ora terrain_src_ptr ;blend in the low byte of the pointer
1fb2: 29 1e and #$1e ;reduce to 0-30, even values
1fb4: 8d 0b 03 sta flak1_col ;set as column
1fb7: 60 rts
1fb8: 00 00 00 00+ .junk 8
;
; Generates flak pops if it's time to do so.
;
MaybeGenerateFlak
1fc0: ee 0c 03 inc flak_delay_ctr ;increment counter
1fc3: ad 0c 03 lda flak_delay_ctr
1fc6: c9 20 cmp #$20 ;waited long enough?
1fc8: 90 08 bcc :Return ;not yet
1fca: a9 00 lda #$00
1fcc: 8d 0c 03 sta flak_delay_ctr ;reset counter
1fcf: 4c 80 1f jmp GenerateFlak ;generate it
1fd2: 60 :Return rts
1fd3: 00 00 00 00+ .junk 13
;
; Updates the harmless flak pops.
;
1fe0: 20 00 1f UpdateFlakPops jsr UpdateFlakPop0 ;draw or erase pop #0
1fe3: 20 40 1f jsr UpdateFlakPop1 ;draw or erase pop #1
1fe6: 4c c0 1f jmp MaybeGenerateFlak ;generate new pops, if it's time
1fe9: 00 .junk 1
;
; Updates the primary enemy plane.
;
UpdatePrimaryPlane
1fea: a9 00 lda #$00
1fec: 85 68 sta eplane_suppress_fire ;primary plane can shoot
1fee: 20 00 1a jsr DeactOffscreenPlane ;deactivate plane if offscreen
1ff1: 20 20 1a jsr UpdateEnemyPlaneFrame ;advance animation frame
1ff4: 20 e0 19 jsr UpdateEnemyPlane ;update float, redraw
1ff7: a5 a0 lda eplane_state ;plane in primary slot active?
1ff9: d0 03 bne :Return ;yes, bail
1ffb: 20 a0 17 jsr CreatePrimaryPlane ;no, create a new one
1ffe: 60 :Return rts
1fff: 00 .junk 1
.org $b000
;
; Terrain graphics, continued (starts at $8a00). This section runs from $b000-
; bfff after being relocated.
;
b000: 10 00 04 20+ terrain_2 .bulk $10,$00,$04,$20,$40,$70,$00,$00,$00,$00,$82,$0c,$18,$00,$8a,$00
+ $01,$04,$00,$95,$00,$30,$18,$c0,$8a,$41,$00,$00,$a4,$92,$00,$00
+ $00,$00,$00,$00,$00,$a0,$00,$04,$04,$00,$01,$08,$11,$70,$83,$00
+ $00,$80,$82,$0c,$18,$80,$8a,$80,$01,$04,$00,$85,$00,$7c,$07,$00
+ $8a,$41,$00,$00,$12,$49,$00,$00,$00,$00,$00,$00,$00,$88,$00,$00
+ $01,$00,$01,$0a,$04,$00,$87,$00,$00,$80,$82,$0c,$18,$80,$8a,$80
+ $01,$04,$00,$d5,$aa,$d5,$aa,$d5,$8a,$41,$00,$00,$a4,$92,$00,$00
+ $00,$00,$00,$00,$00,$88,$00,$80,$01,$20,$00,$02,$01,$66,$84,$00
+ $00,$80,$82,$0c,$18,$80,$8a,$80,$01,$04,$00,$a4,$92,$c9,$a4,$00
+ $00,$41,$00,$00,$12,$49,$00,$00,$00,$00,$00,$49,$04,$82,$01,$a4
+ $00,$20,$40,$00,$00,$0c,$80,$00,$00,$80,$82,$00,$00,$80,$8a,$80
+ $01,$04,$00,$12,$49,$24,$12,$00,$00,$41,$00,$00,$a4,$92,$00,$00
+ $00,$00,$00,$00,$c0,$80,$00,$a0,$00,$08,$40,$00,$00,$10,$80,$00
+ $00,$80,$aa,$d5,$aa,$d5,$82,$80,$01,$04,$00,$a4,$92,$c9,$a4,$00
+ $00,$41,$00,$00,$12,$49,$00,$00,$00,$02,$08,$00,$c0,$90,$82,$08
+ $00,$0a,$10,$00,$00,$11,$80,$00,$00,$80,$80,$80,$80,$80,$80,$80
+ $01,$04,$00,$12,$49,$24,$12,$00,$00,$41,$00,$00,$a4,$92,$00,$00
+ $00,$00,$00,$00,$90,$d5,$82,$0a,$00,$02,$10,$00,$00,$01,$80,$00
+ $00,$80,$80,$80,$80,$80,$80,$80,$01,$04,$00,$a4,$92,$c9,$a4,$00
+ $00,$41,$00,$00,$12,$49,$00,$00,$00,$00,$00,$00,$90,$d5,$82,$02
+ $40,$02,$04,$00,$00,$0c,$80,$00,$00,$00,$00,$00,$00,$00,$00,$80
+ $01,$04,$00,$12,$49,$24,$12,$00,$00,$41,$00,$00,$a4,$92,$00,$00
+ $00,$00,$00,$00,$a4,$d5,$c0,$00,$40,$00,$04,$00,$30,$06,$80,$00
+ $00,$00,$00,$00,$00,$00,$00,$80,$01,$04,$00,$a4,$92,$c9,$a4,$00
+ $00,$41,$00,$00,$00,$00,$00,$00,$00,$00,$12,$09,$a4,$d1,$c1,$00
+ $10,$00,$01,$00,$60,$08,$80,$00,$00,$00,$00,$00,$00,$00,$00,$80
+ $01,$04,$00,$12,$49,$24,$12,$00,$00,$41,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$a9,$95,$90,$00,$10,$20,$00,$00,$00,$01,$80,$00
+ $00,$00,$00,$00,$00,$00,$00,$80,$01,$04,$00,$a4,$92,$c9,$a4,$00
+ $00,$41,$00,$00,$a4,$92,$00,$00,$00,$00,$00,$80,$a9,$84,$10,$00
+ $04,$20,$00,$00,$48,$01,$80,$00,$00,$00,$00,$00,$00,$00,$00,$80
+ $01,$04,$00,$12,$49,$24,$12,$00,$00,$41,$00,$00,$12,$49,$00,$00
+ $00,$00,$00,$a0,$88,$91,$05,$00,$04,$08,$00,$00,$18,$02,$80,$00
+ $00,$00,$00,$00,$00,$00,$00,$80,$01,$04,$00,$a4,$92,$c9,$a4,$00
+ $00,$41,$00,$00,$a4,$92,$00,$00,$00,$00,$00,$a0,$00,$00,$01,$00
+ $01,$08,$00,$00,$00,$00,$80,$00,$00,$00,$00,$00,$00,$00,$00,$80
+ $01,$04,$00,$12,$49,$24,$12,$00,$00,$41,$00,$00,$12,$49,$00,$00
+ $00,$00,$00,$80,$00,$80,$01,$20,$01,$02,$00,$00,$32,$00,$80,$00
+ $00,$00,$00,$00,$00,$00,$00,$80,$01,$04,$00,$a4,$92,$c9,$a4,$00
+ $00,$41,$00,$00,$a4,$92,$00,$00,$00,$00,$00,$00,$20,$a0,$00,$20
+ $00,$02,$00,$00,$46,$00,$80,$10,$22,$44,$08,$11,$22,$44,$08,$81
+ $01,$04,$00,$12,$49,$24,$12,$00,$10,$41,$00,$00,$12,$49,$00,$00
+ $00,$00,$00,$00,$00,$a0,$00,$08,$40,$02,$00,$00,$02,$00,$80,$80
+ $91,$a2,$c4,$88,$91,$a2,$84,$80,$01,$04,$00,$a4,$92,$c9,$a4,$00
+ $00,$00,$00,$00,$a4,$92,$00,$00,$00,$00,$00,$00,$00,$08,$00,$08
+ $50,$01,$00,$00,$00,$00,$00,$80,$c4,$88,$91,$a2,$c4,$88,$91,$80
+ $01,$04,$00,$12,$49,$24,$12,$00,$00,$00,$00,$00,$12,$49,$00,$00
+ $00,$00,$00,$00,$20,$0a,$00,$02,$30,$02,$00,$00,$08,$00,$00,$80
+ $91,$a2,$c4,$88,$91,$a2,$84,$80,$01,$04,$00,$a4,$92,$c9,$a4,$00
+ $02,$40,$00,$00,$a4,$92,$00,$00,$00,$00,$00,$00,$00,$02,$00,$02
+ $14,$01,$00,$40,$00,$00,$80,$80,$c4,$88,$91,$a2,$c4,$88,$91,$81
+ $01,$04,$00,$12,$49,$24,$12,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$c0,$00,$40,$00,$24,$02,$00,$40,$00,$00,$80,$80
+ $91,$a2,$08,$11,$22,$44,$84,$80,$01,$04,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$c0,$00,$40,$00
+ $11,$01,$00,$40,$00,$00,$80,$80,$c4,$c5,$a2,$d1,$a8,$94,$8a,$80
+ $01,$04,$00,$00,$08,$11,$22,$20,$00,$08,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$90,$00,$10,$00,$25,$02,$00,$00,$02,$00,$80,$80
+ $91,$85,$00,$00,$00,$00,$8a,$80,$01,$04,$00,$00,$22,$44,$08,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$50,$aa,$d5,$aa,$95,$00,$14,$20
+ $12,$01,$00,$00,$02,$00,$80,$80,$c4,$95,$00,$7c,$07,$c0,$8a,$81
+ $01,$04,$00,$00,$08,$11,$22,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$04,$20,$a4,$02,$00,$10,$02,$00,$80,$80
+ $91,$d5,$00,$30,$18,$d0,$8a,$80,$01,$04,$00,$00,$22,$44,$08,$04
+ $00,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$01,$08
+ $12,$01,$00,$10,$00,$00,$80,$80,$c4,$d5,$aa,$30,$18,$d5,$8a,$80
+ $01,$04,$00,$00,$08,$11,$22,$00,$00,$00,$64,$08,$11,$44,$08,$00
+ $00,$00,$00,$00,$00,$00,$01,$02,$a4,$02,$00,$10,$00,$00,$80,$80
+ $91,$d5,$aa,$70,$07,$d5,$8a,$80,$01,$04,$00,$00,$22,$44,$08,$20
+ $44,$08,$11,$22,$44,$11,$02,$00,$00,$00,$00,$00,$00,$20,$00,$02
+ $12,$01,$00,$00,$00,$00,$80,$80,$c4,$d5,$80,$30,$18,$d0,$8a,$81
+ $01,$04,$00,$00,$08,$11,$22,$08,$11,$22,$44,$08,$11,$44,$08,$00
+ $00,$00,$00,$00,$00,$20,$40,$00,$a4,$02,$00,$00,$00,$00,$80,$80
+ $91,$95,$00,$30,$18,$c0,$8a,$80,$01,$04,$00,$00,$22,$44,$08,$22
+ $44,$08,$11,$22,$44,$11,$02,$00,$00,$00,$00,$00,$00,$08,$40,$00
+ $12,$01,$00,$00,$00,$00,$80,$80,$c4,$85,$00,$7c,$07,$00,$8a,$80
+ $01,$04,$00,$00,$08,$11,$40,$08,$11,$22,$44,$08,$11,$44,$08,$00
+ $00,$00,$00,$00,$00,$08,$10,$00,$a4,$02,$08,$11,$22,$44,$80,$80
+ $91,$c5,$a2,$d9,$a8,$94,$8a,$80,$01,$04,$00,$00,$00,$00,$10,$22
+ $44,$08,$11,$22,$44,$11,$02,$00,$00,$00,$00,$00,$00,$02,$10,$00
+ $12,$01,$22,$44,$08,$11,$80,$80,$c4,$88,$91,$a2,$c4,$88,$91,$81
+ $01,$04,$00,$00,$00,$00,$40,$08,$11,$22,$44,$08,$11,$44,$08,$00
+ $00,$00,$00,$00,$00,$00,$04,$00,$a4,$02,$08,$11,$22,$44,$80,$80
+ $91,$a2,$c4,$88,$91,$a2,$84,$80,$01,$04,$00,$00,$00,$00,$10,$22
+ $44,$08,$11,$22,$44,$11,$02,$00,$00,$00,$00,$c4,$88,$91,$82,$00
+ $12,$01,$22,$44,$08,$11,$80,$80,$c4,$88,$91,$a2,$c4,$88,$91,$80
+ $01,$04,$00,$00,$00,$00,$44,$08,$11,$22,$44,$08,$11,$44,$08,$00
+ $00,$00,$00,$11,$22,$44,$08,$00,$a4,$02,$08,$11,$22,$44,$80,$80
+ $91,$a2,$c4,$88,$91,$a2,$84,$80,$01,$04,$00,$00,$00,$00,$11,$22
+ $44,$08,$11,$22,$44,$11,$02,$00,$00,$00,$00,$c4,$88,$91,$82,$00
+ $12,$01,$22,$44,$08,$11,$80,$80,$c4,$88,$91,$a2,$c4,$88,$91,$81
+ $01,$04,$00,$00,$00,$00,$44,$08,$11,$22,$44,$08,$11,$44,$08,$00
+ $00,$00,$00,$11,$22,$44,$08,$00,$a4,$02,$08,$11,$22,$44,$80,$80
+ $91,$a2,$c4,$88,$91,$a2,$84,$80,$01,$04,$00,$00,$00,$00,$11,$00
+ $00,$00,$00,$00,$80,$11,$02,$00,$00,$00,$00,$c4,$88,$91,$82,$00
+ $12,$01,$22,$44,$08,$11,$80,$80,$c4,$88,$91,$a2,$c4,$88,$91,$80
+ $01,$04,$00,$00,$00,$00,$44,$91,$a2,$c4,$88,$91,$8a,$44,$08,$00
+ $00,$00,$00,$11,$22,$44,$08,$00,$a4,$02,$08,$11,$22,$44,$80,$80
+ $91,$a2,$c4,$88,$91,$a2,$84,$80,$01,$04,$00,$00,$00,$00,$11,$85
+ $00,$0c,$18,$00,$8a,$11,$02,$00,$00,$00,$00,$c4,$88,$91,$82,$00
+ $12,$01,$00,$00,$00,$00,$80,$80,$80,$80,$80,$80,$80,$80,$80,$81
+ $01,$04,$00,$00,$00,$00,$44,$95,$00,$3c,$1e,$c0,$8a,$44,$08,$00
+ $00,$00,$00,$11,$22,$44,$08,$00,$a4,$02,$00,$00,$00,$00,$80,$80
+ $80,$80,$80,$80,$80,$80,$80,$80,$01,$04,$00,$00,$00,$00,$11,$d5
+ $00,$4c,$19,$d0,$8a,$11,$02,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $12,$01,$00,$00,$00,$00,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80
+ $01,$04,$00,$00,$00,$00,$44,$95,$a2,$0c,$18,$d1,$8a,$44,$08,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$a4,$02,$00,$00,$00,$00,$80,$80
+ $80,$80,$80,$80,$80,$80,$80,$80,$01,$24,$12,$49,$24,$00,$11,$95
+ $a2,$0c,$18,$91,$8a,$11,$02,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $12,$01,$00,$00,$00,$00,$80,$80,$80,$80,$80,$80,$80,$80,$80,$81
+ $01,$00,$00,$00,$00,$02,$44,$d5,$80,$0c,$18,$d0,$8a,$44,$08,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$a4,$02,$00,$00,$00,$00,$80,$80
+ $80,$80,$80,$80,$80,$80,$c0,$80,$01,$00,$00,$00,$00,$02,$11,$95
+ $00,$0c,$18,$c0,$8a,$11,$02,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $12,$51,$24,$12,$49,$24,$24,$12,$49,$24,$92,$c9,$a4,$92,$c9,$a4
+ $00,$00,$00,$00,$00,$02,$44,$85,$00,$00,$00,$00,$8a,$44,$08,$00
+ $00,$00,$00,$11,$22,$44,$08,$00,$a4,$02,$49,$24,$12,$49,$49,$24
+ $12,$49,$a4,$92,$c9,$a4,$92,$c9,$00,$00,$00,$00,$00,$02,$11,$91
+ $a2,$c4,$88,$91,$8a,$11,$02,$00,$00,$00,$00,$c4,$88,$91,$82,$00
+ $12,$01,$24,$12,$49,$24,$24,$12,$49,$24,$92,$c9,$a4,$92,$c9,$a4
+ $00,$00,$00,$00,$00,$02,$44,$08,$a2,$22,$44,$08,$11,$44,$08,$00
+ $00,$00,$00,$11,$22,$44,$08,$00,$a4,$02,$49,$24,$12,$49,$49,$24
+ $12,$49,$a4,$92,$c9,$a4,$92,$c9,$00,$00,$00,$00,$00,$02,$11,$22
+ $88,$08,$11,$22,$44,$11,$02,$00,$00,$00,$00,$c4,$88,$91,$82,$00
+ $12,$01,$24,$12,$49,$24,$24,$12,$49,$24,$92,$c9,$a4,$92,$c9,$a4
+ $00,$00,$00,$00,$00,$02,$44,$08,$a2,$22,$44,$08,$11,$44,$08,$00
+ $00,$00,$00,$11,$22,$44,$08,$00,$a4,$02,$49,$24,$12,$49,$49,$24
+ $12,$49,$a4,$92,$c9,$a4,$92,$c9,$00,$00,$00,$00,$00,$02,$11,$22
+ $88,$08,$11,$22,$44,$11,$02,$00,$00,$00,$00,$c4,$88,$91,$82,$00
+ $12,$41,$24,$12,$49,$24,$24,$12,$49,$24,$92,$c9,$a4,$92,$c9,$a4
+ $92,$c9,$a4,$92,$00,$02,$44,$08,$a2,$22,$a2,$c4,$88,$44,$08,$00
+ $00,$00,$00,$11,$22,$44,$08,$00,$a4,$02,$49,$24,$12,$49,$49,$24
+ $12,$49,$a4,$92,$c9,$a4,$92,$c9,$a4,$92,$c9,$a4,$00,$02,$11,$22
+ $88,$08,$88,$91,$a2,$11,$02,$00,$00,$00,$00,$c4,$88,$91,$82,$00
+ $12,$01,$24,$12,$49,$24,$24,$12,$49,$24,$92,$c9,$a4,$92,$c9,$a4
+ $92,$c9,$a4,$92,$00,$02,$44,$08,$a2,$22,$a2,$c4,$88,$44,$08,$00
+ $00,$00,$00,$11,$22,$44,$08,$00,$a4,$02,$49,$24,$12,$49,$49,$24
+ $12,$49,$a4,$92,$c9,$a4,$92,$c9,$a4,$92,$c9,$a4,$00,$02,$11,$22
+ $44,$08,$88,$91,$a2,$11,$02,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $12,$01,$24,$12,$49,$24,$24,$12,$49,$24,$92,$c9,$a4,$92,$c9,$a4
+ $92,$c9,$a4,$92,$00,$02,$44,$08,$11,$22,$a2,$c4,$88,$44,$08,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$a4,$02,$49,$24,$12,$49,$49,$24
+ $12,$49,$a4,$92,$c9,$a4,$92,$c9,$a4,$92,$c9,$a4,$00,$02,$11,$22
+ $44,$08,$88,$91,$a2,$11,$02,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $12,$01,$24,$12,$49,$24,$24,$12,$49,$24,$92,$c9,$a4,$92,$c9,$a4
+ $92,$c9,$a4,$92,$00,$02,$44,$08,$11,$22,$a2,$c4,$88,$44,$08,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$a4,$c4,$49,$24,$12,$49,$49,$24
+ $12,$49,$a4,$92,$c9,$a4,$92,$c9,$a4,$92,$c9,$a4,$00,$02,$11,$22
+ $44,$08,$88,$91,$a2,$11,$02,$00,$00,$00,$00,$00,$00,$00,$20,$00
+ $02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$22,$92
+ $00,$00,$00,$40,$00,$02,$44,$08,$11,$22,$a2,$c4,$88,$44,$08,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$40,$08,$11,$22,$44,$40,$00,$02,$11,$22
+ $44,$08,$11,$22,$44,$11,$02,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$91
+ $a2,$c4,$88,$40,$00,$02,$44,$08,$11,$22,$44,$08,$11,$44,$08,$01
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$40,$08,$11,$22,$44,$40,$00,$02,$11,$22
+ $44,$08,$11,$22,$44,$11,$02,$01,$00,$00,$00,$00,$00,$00,$00,$00
+ $02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$22,$91
+ $a2,$c4,$88,$40,$00,$02,$04,$00,$00,$00,$00,$00,$00,$44,$08,$01
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$40,$08,$11,$22,$44,$40,$00,$02,$11,$95
+ $aa,$d4,$a8,$d1,$8a,$11,$02,$01,$00,$00,$00,$00,$00,$00,$00,$00
+ $20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$91
+ $a2,$c4,$88,$40,$00,$02,$44,$85,$00,$0c,$18,$00,$8a,$44,$08,$01
+ $00,$44,$08,$11,$22,$44,$08,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$40,$08,$11,$22,$44,$40,$00,$02,$11,$95
+ $00,$3c,$1e,$c0,$8a,$11,$02,$01,$00,$11,$22,$44,$08,$11,$02,$00
+ $02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$22,$91
+ $a2,$c4,$88,$40,$00,$02,$44,$d5,$00,$4c,$19,$d0,$8a,$44,$08,$01
+ $00,$44,$08,$11,$22,$44,$08,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$40,$08,$11,$22,$44,$40,$00,$02,$11,$d5
+ $aa,$0c,$18,$d5,$8a,$11,$02,$01,$00,$11,$22,$44,$08,$11,$02,$00
+ $20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$00
+ $00,$00,$00,$40,$00,$02,$44,$d5,$aa,$0c,$18,$d5,$8a,$44,$08,$01
+ $00,$44,$08,$11,$22,$44,$08,$00,$00,$00,$aa,$d5,$aa,$d5,$9a,$00
+ $aa,$d5,$aa,$d5,$9a,$00,$40,$00,$00,$00,$00,$40,$00,$02,$11,$d5
+ $80,$0c,$18,$d0,$8a,$11,$02,$01,$00,$11,$22,$44,$08,$11,$02,$00
+ $02,$02,$92,$7c,$07,$92,$cc,$02,$92,$7c,$07,$92,$cc,$02,$22,$00
+ $00,$00,$00,$40,$00,$02,$44,$95,$00,$0c,$18,$c0,$8a,$44,$08,$01
+ $00,$44,$00,$00,$00,$00,$08,$00,$00,$00,$49,$30,$18,$49,$99,$00
+ $49,$30,$18,$49,$99,$00,$40,$00,$00,$00,$00,$40,$00,$02,$11,$85
+ $00,$00,$00,$00,$8a,$11,$02,$01,$00,$11,$d5,$aa,$d5,$aa,$02,$00
+ $20,$20,$92,$30,$18,$92,$cc,$20,$92,$30,$18,$92,$cc,$20,$20,$08
+ $11,$22,$44,$40,$00,$02,$44,$95,$aa,$d4,$a8,$d1,$8a,$44,$08,$01
+ $00,$04,$89,$91,$a2,$a4,$08,$00,$00,$00,$49,$70,$07,$49,$99,$00
+ $49,$70,$07,$49,$99,$00,$40,$91,$a2,$c4,$88,$40,$00,$02,$11,$22
+ $44,$08,$11,$22,$44,$11,$02,$01,$00,$11,$a3,$c4,$88,$b1,$02,$00
+ $02,$02,$92,$30,$00,$92,$cc,$02,$92,$30,$00,$92,$cc,$02,$22,$09
+ $11,$22,$44,$40,$00,$02,$44,$08,$11,$22,$44,$08,$11,$44,$08,$01
+ $00,$44,$89,$91,$a2,$a4,$08,$00,$00,$00,$49,$30,$00,$49,$99,$00
+ $49,$30,$00,$49,$99,$00,$40,$91,$a2,$c4,$88,$40,$00,$02,$11,$22
+ $44,$08,$11,$22,$44,$11,$02,$01,$00,$11,$a3,$c4,$88,$b1,$02,$00
+ $20,$20,$92,$7c,$01,$92,$cc,$20,$92,$7c,$01,$92,$cc,$20,$20,$08
+ $11,$22,$44,$40,$00,$02,$44,$08,$11,$22,$44,$08,$11,$44,$08,$01
+ $00,$44,$89,$0c,$18,$a4,$08,$00,$00,$00,$aa,$d5,$aa,$d5,$9a,$00
+ $aa,$d5,$aa,$d5,$9a,$00,$40,$91,$a2,$c4,$88,$40,$00,$02,$11,$22
+ $44,$08,$11,$22,$44,$11,$02,$01,$00,$11,$a3,$3c,$1e,$b1,$02,$00
+ $02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$22,$09
+ $11,$22,$44,$40,$00,$02,$44,$08,$11,$22,$44,$08,$11,$44,$08,$01
+ $00,$44,$89,$4c,$19,$a4,$08,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$40,$91,$a2,$c4,$88,$40,$00,$02,$11,$22
+ $44,$08,$11,$22,$44,$11,$02,$01,$00,$11,$a3,$0c,$18,$b1,$02,$00
+ $20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$08
+ $11,$22,$44,$40,$00,$02,$44,$08,$11,$22,$44,$08,$11,$22,$04,$01
+ $00,$44,$89,$0c,$18,$a4,$08,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$40,$00,$00,$00,$00,$40,$00,$02,$11,$22
+ $44,$08,$11,$22,$44,$08,$11,$01,$00,$11,$a3,$0c,$18,$b1,$02,$00
+ $00,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$22,$11
+ $22,$44,$00,$40,$00,$02,$00,$00,$00,$00,$00,$00,$00,$00,$00,$01
+ $00,$44,$89,$0c,$18,$a4,$08,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$40,$00,$00,$00,$00,$40,$00,$02,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$01,$00,$11,$a3,$00,$00,$b1,$02,$00
+ $00,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$00,$00
+ $00,$00,$00,$40,$00,$02,$00,$00,$00,$00,$00,$00,$00,$00,$00,$01
+ $00,$44,$89,$91,$a2,$a4,$08,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $aa,$d5,$aa,$d5,$9a,$00,$00,$00,$00,$00,$00,$40,$00,$02,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$01,$00,$11,$a3,$c4,$88,$b1,$02,$00
+ $00,$00,$02,$02,$02,$02,$02,$02,$92,$7c,$07,$92,$cc,$02,$02,$00
+ $00,$00,$08,$40,$00,$02,$00,$00,$00,$00,$00,$00,$01,$04,$00,$01
+ $00,$44,$89,$91,$a2,$a4,$08,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $49,$30,$18,$49,$99,$00,$00,$00,$00,$00,$00,$40,$00,$02,$00,$00
+ $00,$00,$00,$00,$01,$04,$00,$01,$00,$11,$a3,$c4,$88,$b1,$02,$00
+ $00,$00,$20,$20,$20,$20,$20,$20,$92,$30,$18,$92,$cc,$20,$00,$00
+ $00,$00,$00,$40,$00,$02,$00,$11,$22,$44,$08,$00,$01,$04,$00,$01
+ $00,$44,$d5,$aa,$d5,$aa,$08,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $49,$70,$07,$49,$99,$00,$00,$00,$00,$00,$00,$40,$00,$02,$00,$c4
+ $88,$91,$82,$00,$01,$04,$00,$01,$00,$11,$22,$00,$00,$11,$02,$00
+ $00,$00,$00,$02,$02,$02,$02,$02,$92,$30,$00,$92,$cc,$02,$02,$00
+ $00,$00,$00,$41,$00,$02,$00,$11,$22,$44,$08,$00,$01,$04,$00,$01
+ $00,$44,$08,$01,$20,$44,$08,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $49,$30,$00,$49,$99,$00,$00,$00,$00,$00,$00,$40,$00,$02,$00,$c4
+ $88,$91,$82,$00,$01,$04,$00,$01,$00,$11,$22,$00,$00,$11,$02,$00
+ $00,$00,$00,$20,$20,$20,$20,$20,$92,$7c,$01,$92,$cc,$20,$00,$00
+ $00,$00,$00,$40,$00,$02,$00,$11,$00,$00,$08,$00,$01,$04,$00,$01
+ $00,$44,$08,$01,$20,$44,$08,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $aa,$d5,$aa,$d5,$9a,$00,$00,$00,$00,$00,$00,$40,$00,$02,$00,$c4
+ $7c,$07,$82,$00,$01,$04,$00,$01,$00,$11,$22,$00,$00,$11,$02,$00
+ $00,$00,$00,$00,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$00
+ $00,$00,$00,$50,$00,$02,$00,$11,$30,$18,$08,$00,$01,$04,$00,$01
+ $00,$44,$08,$01,$20,$44,$08,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$40,$00,$02,$00,$c4
+ $30,$18,$82,$00,$01,$04,$00,$01,$00,$11,$22,$04,$00,$11,$02,$00
+ $00,$00,$00,$00,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$00,$00
+ $00,$00,$00,$40,$00,$02,$00,$11,$70,$07,$08,$00,$01,$04,$00,$01
+ $00,$44,$08,$01,$20,$44,$08,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$40,$00,$02,$00,$c4
+ $30,$18,$82,$00,$01,$04,$00,$01,$00,$11,$22,$04,$00,$11,$02,$00
+ $00,$00,$00,$00,$00,$02,$02,$02,$02,$02,$02,$02,$02,$02,$02,$00
+ $00,$00,$00,$40,$00,$02,$00,$11,$30,$18,$08,$00,$01,$04,$00,$01
+ $00,$44,$08,$11,$20,$44,$08,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$40,$00,$02,$00,$c4
+ $7c,$07,$82,$00,$01,$04,$00,$01,$00,$11,$22,$04,$00,$11,$02,$00
+ $00,$00,$00,$00,$00,$20,$20,$20,$20,$20,$20,$20,$20,$20,$00,$00
.org $3000
********************************************************************************
* Initial entry point. *
* *
* Relocates data from the hi-res page to high memory, ovewriting the disk I/O *
* routines, then starts the game. *
********************************************************************************
3000: a0 00 Entry ldy #$00
3002: b9 00 20 :_CopyLoop lda $2000,y ;copy $2000-2fff to $b000-bfff
3005: 99 00 b0 :_Store sta terrain_2,y
3008: c8 iny
3009: d0 f7 bne :_CopyLoop
300b: ee 04 30 inc :_CopyLoop+2 ;increment high bytes
300e: ee 07 30 inc :_Store+2
3011: ad 04 30 lda :_CopyLoop+2
3014: c9 30 cmp #$30 ;done yet?
3016: d0 ea bne :_CopyLoop ;no, branch
3018: ad 83 c0 lda LCBANK2 ;enable write to language card
301b: ad 83 c0 lda LCBANK2
301e: a9 65 lda #$65
3020: 8d fc ff sta RESET_VECTOR ;set the reset vector (why?)
3023: a9 ff lda #$ff
3025: 8d fd ff sta RESET_VECTOR+1
3028: ad 82 c0 lda ROMIN_RO ;reset to ROM
302b: 4c b0 15 jmp GameStart ;start the game
302e: 00 00 00 00+ .junk 25
.org $4000
;
; Enemy plane explosion sequence (6x36). Each frame is on its own page.
4000: d5 aa d5 aa+ enemy_pl_exp_0 .bulk $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$a9,$d5,$aa,$d5,$aa
+ $d5,$ad,$d5,$aa,$d5,$aa,$d5,$ac,$d5,$aa,$d5,$aa,$d5,$a4,$d5,$aa
+ $d5,$aa,$d5,$a4,$d5,$ac,$d5,$aa,$d5,$a5,$95,$a9,$d5,$aa,$d5,$b5
+ $a5,$ab,$d5,$aa,$a5,$b5,$ad,$aa,$d5,$ca,$a2,$d5,$aa,$aa,$d5,$d4
+ $aa,$d5,$ea,$aa,$95,$d1,$aa,$d5,$ca,$aa,$95,$d5,$8a,$d4,$da,$aa
+ $d5,$92,$ea,$d3,$d2,$aa,$d5,$aa,$ea,$d1,$d4,$aa,$d5,$aa,$ea,$fe
+ $d5,$aa,$d5,$ca,$aa,$fe,$d4,$aa,$d5,$ca,$8a,$d5,$d4,$aa,$d5,$d2
+ $d0,$c7,$d2,$aa,$d5,$aa,$9d,$d5,$ca,$aa,$d5,$ca,$8a,$d1,$ca,$aa
+ $d5,$da,$9c,$85,$ca,$aa,$d5,$d5,$90,$a9,$d5,$aa,$d5,$95,$95,$aa
+ $d5,$aa,$d5,$a4,$95,$aa,$d5,$aa,$d5,$aa,$95,$a8,$d5,$aa,$d5,$aa
+ $95,$8a,$d5,$aa,$d5,$aa,$95,$8b,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
40d8: e8 e8 e8 e8+ .align $0100 (40 bytes)
4100: d5 aa d5 aa+ .bulk $d5,$aa,$d5,$aa,$a1,$a9,$d5,$aa,$d5,$aa,$95,$aa,$d5,$aa,$94,$ab
+ $a9,$a5,$d5,$d2,$8a,$ab,$aa,$a9,$d5,$ea,$aa,$a9,$ca,$aa,$d5,$ea
+ $a9,$c1,$da,$aa,$d5,$aa,$a9,$d9,$d2,$aa,$d5,$aa,$a9,$c5,$d2,$aa
+ $d5,$aa,$ad,$d5,$d2,$aa,$d5,$aa,$ad,$d5,$c2,$a8,$d5,$aa,$a5,$d5
+ $a8,$d0,$d5,$aa,$a9,$d5,$aa,$d5,$d5,$aa,$aa,$c5,$8a,$a5,$d5,$d5
+ $aa,$df,$8a,$a9,$ad,$d1,$aa,$ff,$ab,$aa,$a5,$95,$ea,$f3,$eb,$aa
+ $d5,$da,$92,$f0,$cb,$aa,$d5,$ca,$ce,$f0,$ca,$aa,$d5,$d2,$ea,$e5
+ $da,$d6,$d5,$94,$ea,$a1,$aa,$b5,$d5,$d5,$da,$bf,$aa,$b5,$ad,$ab
+ $98,$d3,$d2,$a4,$ad,$eb,$aa,$c7,$d2,$aa,$d5,$ca,$aa,$c5,$da,$aa
+ $d5,$ca,$a0,$d1,$da,$aa,$d5,$d2,$a8,$95,$ca,$aa,$d5,$95,$ad,$d0
+ $aa,$aa,$b5,$a5,$ac,$95,$ad,$aa,$ad,$ab,$a9,$a5,$a9,$8b,$dd,$aa
+ $a9,$a5,$a9,$ab,$d5,$aa,$a9,$ad,$95,$aa,$d5,$aa,$a5,$a9,$d5,$aa
+ $d5,$aa,$a5,$ab,$d5,$aa,$d5,$aa,$b5,$ab,$d5,$aa,$d5,$aa,$b5,$ab
+ $d5,$aa,$d5,$aa,$85,$ab,$d5,$aa
41d8: e8 e8 e8 e8+ .align $0100 (40 bytes)
4200: d5 aa d5 aa+ .bulk $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$b5,$a5
+ $d5,$aa,$d5,$aa,$b5,$ad,$d5,$aa,$d5,$aa,$b5,$ad,$d5,$aa,$d5,$aa
+ $b5,$ad,$d5,$aa,$d5,$aa,$d4,$aa,$d5,$aa,$d5,$aa,$d4,$a2,$a9,$a9
+ $d5,$ca,$d0,$aa,$a9,$ab,$d5,$aa,$d5,$aa,$ab,$aa,$d5,$aa,$d5,$a2
+ $ea,$aa,$b5,$a9,$d5,$ab,$c9,$aa,$b5,$a9,$d5,$a9,$d5,$aa,$95,$85
+ $f5,$a9,$d5,$aa,$95,$a5,$dd,$ab,$d5,$aa,$d5,$ad,$a5,$cd,$97,$aa
+ $d5,$ad,$fd,$e5,$d7,$aa,$d5,$aa,$9b,$f3,$f5,$aa,$d5,$aa,$ea,$f2
+ $f5,$aa,$d5,$aa,$de,$aa,$b9,$aa,$d5,$8a,$d5,$a8,$d5,$aa,$d5,$be
+ $c5,$a8,$95,$aa,$d5,$be,$f1,$b1,$a5,$a9,$d5,$aa,$9e,$bf,$a5,$a9
+ $d5,$aa,$c7,$8f,$a1,$a5,$d5,$a5,$c5,$c3,$d5,$a5,$95,$a9,$d5,$f9
+ $d5,$aa,$a5,$a9,$d5,$ff,$d5,$aa,$ad,$a9,$d5,$9f,$d5,$aa,$ed,$aa
+ $d5,$a7,$d5,$aa,$ed,$ea,$d2,$aa,$d5,$aa,$d5,$ca,$d2,$ea,$c2,$aa
+ $d5,$d2,$d4,$ca,$ea,$aa,$d5,$94,$d5,$d5,$ea,$aa,$d5,$a4,$d5,$a1
+ $eb,$aa,$d5,$aa,$d5,$aa,$d5,$aa
42d8: e8 e8 e8 e8+ .align $0100 (40 bytes)
4300: d5 aa d5 aa+ .bulk $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$f5,$aa,$d5,$aa
+ $d5,$d6,$d5,$aa,$d5,$a4,$d5,$d6,$d5,$aa,$d5,$a4,$d5,$aa,$d5,$aa
+ $d5,$a4,$fd,$ef,$d6,$aa,$d5,$a5,$fd,$eb,$d6,$aa,$d5,$a9,$fd,$a1
+ $dd,$aa,$d5,$ab,$b9,$a7,$d7,$aa,$d5,$aa,$b7,$ab,$d7,$aa,$d5,$aa
+ $f4,$8a,$d5,$aa,$d5,$aa,$cf,$aa,$d8,$aa,$d5,$aa,$d7,$bc,$98,$aa
+ $d5,$fa,$d5,$9e,$be,$aa,$d5,$ba,$d5,$f3,$d5,$aa,$d5,$bc,$f9,$bf
+ $d5,$aa,$d5,$88,$8e,$9b,$95,$a5,$d5,$aa,$f1,$ef,$b5,$a9,$d5,$c2
+ $99,$ff,$d5,$8d,$d5,$ea,$f8,$bf,$d5,$ab,$d5,$9b,$84,$9f,$d5,$ab
+ $d5,$99,$b5,$c7,$96,$aa,$f5,$e9,$fb,$a1,$d5,$aa,$d5,$a9,$8e,$a9
+ $d5,$aa,$d5,$aa,$d5,$a9,$d5,$aa,$d5,$aa,$f9,$ab,$d5,$aa,$d5,$aa
+ $f9,$ab,$d5,$aa,$d5,$aa,$91,$aa,$d5,$aa,$d5,$b2,$d5,$d2,$d5,$aa
+ $d5,$aa,$d5,$d5,$d4,$aa,$d5,$aa,$d5,$ea,$d4,$aa,$d5,$aa,$d5,$ea
+ $94,$aa,$d5,$aa,$d5,$8a,$d5,$aa
43d8: e8 e8 e8 e8+ .align $0100 (40 bytes)
4400: d5 aa d5 aa+ .bulk $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$a8,$d5,$aa,$d5,$aa,$d5,$aa
+ $e5,$ab,$d5,$aa,$d5,$aa,$bd,$91,$d5,$a7,$d5,$ea,$ff,$df,$f5,$a6
+ $d5,$aa,$fe,$cf,$fb,$a7,$d5,$c2,$ff,$f7,$98,$a9,$d5,$84,$fc,$f7
+ $dc,$a9,$d5,$8f,$fc,$a1,$f4,$aa,$d5,$bf,$88,$c1,$d3,$aa,$d5,$af
+ $d5,$85,$d6,$aa,$d5,$9f,$88,$87,$d4,$a9,$d5,$a0,$8f,$bf,$f4,$ab
+ $d5,$b1,$dc,$cd,$ff,$ab,$d5,$bf,$fc,$8f,$d3,$8b,$f5,$bf,$bf,$c7
+ $d3,$9a,$f5,$a9,$bf,$c0,$d3,$92,$d5,$ea,$fd,$f0,$c6,$aa,$d5,$ea
+ $fd,$f1,$f5,$aa,$d5,$ea,$ff,$fd,$fc,$a3,$d5,$ea,$fb,$ff,$fc,$ab
+ $d5,$e9,$df,$bf,$fe,$a9,$f5,$a9,$ff,$af,$ff,$aa,$d5,$aa,$fd,$a9
+ $bf,$aa,$d5,$ca,$d3,$ea,$d7,$aa,$d5,$ea,$d3,$ea,$d5,$aa,$d5,$ea
+ $9f,$aa,$d5,$aa,$d5,$ea,$d3,$8a,$d5,$aa,$d5,$aa,$d5,$ea,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
44d8: e8 e8 e8 e8+ .align $0100 (40 bytes)
4500: d5 aa d5 aa+ .bulk $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d4,$aa,$d5,$aa,$d5,$aa,$9f,$aa,$d5,$aa
+ $d5,$aa,$af,$a8,$d5,$aa,$d5,$aa,$cf,$ab,$d5,$aa,$d4,$aa,$e2,$8f
+ $d5,$aa,$d4,$aa,$f8,$f9,$9f,$aa,$d5,$aa,$ff,$ff,$b5,$a9,$d5,$da
+ $ff,$cb,$a5,$ab,$d5,$fa,$ff,$a9,$a4,$aa,$f5,$b6,$f7,$89,$a3,$aa
+ $f9,$be,$be,$a9,$a3,$aa,$d9,$8f,$be,$a9,$a1,$aa,$89,$ae,$ba,$a9
+ $d9,$aa,$d5,$86,$eb,$ef,$c9,$aa,$d5,$8e,$e5,$ff,$cd,$aa,$d5,$9b
+ $d5,$ff,$f7,$a9,$d5,$af,$d4,$ff,$fb,$a9,$d5,$ff,$b4,$ff,$fb,$ab
+ $d5,$ff,$81,$fe,$fd,$aa,$d5,$f0,$85,$be,$ff,$aa,$d5,$f0,$e0,$bf
+ $be,$aa,$d5,$ca,$fe,$bf,$bb,$aa,$d5,$ca,$bf,$97,$91,$aa,$d5,$ea
+ $8e,$eb,$d5,$aa,$c5,$aa,$f1,$a9,$d5,$a9,$d5,$aa,$9f,$ab,$d5,$89
+ $d5,$aa,$d5,$ab,$d5,$aa,$d5,$aa,$d5,$91,$d5,$aa,$d5,$aa,$d5,$b1
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
45d8: e8 e8 e8 e8+ .align $0100 (40 bytes)
4600: d5 aa d5 aa+ .bulk $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$94,$d5,$ab,$fd,$aa,$d5,$9e,$d5,$a9
+ $f5,$aa,$d5,$ae,$d5,$a9,$9d,$aa,$d5,$8a,$8d,$a9,$d5,$aa,$d5,$aa
+ $8e,$9f,$d5,$aa,$d5,$aa,$c3,$8f,$d5,$aa,$d5,$aa,$d5,$01,$d5,$aa
+ $d5,$aa,$d5,$e1,$91,$aa,$d5,$aa,$d5,$bd,$f5,$aa,$d5,$aa,$d5,$bf
+ $c9,$aa,$d5,$ba,$a5,$bf,$c9,$aa,$d5,$ea,$ef,$af,$ee,$aa,$d5,$ca
+ $83,$cb,$cf,$aa,$d5,$aa,$d5,$e1,$c4,$aa,$d5,$aa,$f0,$bf,$d5,$aa
+ $d5,$aa,$fe,$ef,$d6,$aa,$d5,$a2,$fe,$bf,$d6,$aa,$d5,$aa,$fd,$cb
+ $d5,$aa,$d5,$aa,$cd,$b1,$d5,$aa,$d5,$aa,$f9,$ad,$d5,$aa,$d5,$aa
+ $d5,$8b,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
46d8: e8 e8 e8 e8+ .align $0100 (40 bytes)
;
; Plane veering off to left. (6x23)
4700: d5 aa d5 aa+ plane_left_0 .bulk $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $f5,$ab,$d5,$aa,$d5,$aa,$fd,$a7,$d5,$aa,$d5,$aa,$dd,$af,$d5,$aa
+ $d5,$aa,$ed,$9e,$d5,$aa,$d5,$aa,$dd,$7a,$d7,$ea,$d5,$aa,$dd,$6e
+ $7f,$7f,$d5,$aa,$fd,$6d,$d5,$aa,$d5,$fa,$77,$2f,$d5,$aa,$95,$7f
+ $67,$bd,$d5,$aa,$f7,$1f,$f5,$af,$d5,$aa,$c6,$ea,$d5,$a6,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
478a: e8 e8 e8 e8+ .junk 6
4790: d5 aa d5 aa+ plane_left_1 .bulk $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$df,$aa,$d5,$aa,$d5,$aa
+ $7f,$aa,$d5,$aa,$d5,$aa,$6b,$a9,$d5,$aa,$d5,$aa,$7b,$ab,$d5,$aa
+ $d5,$aa,$bf,$a7,$d5,$aa,$d5,$aa,$2f,$7b,$ff,$6f,$d5,$aa,$ff,$bf
+ $f7,$aa,$d5,$aa,$df,$bd,$d5,$aa,$d5,$aa,$ff,$af,$d5,$aa,$d5,$ea
+ $ef,$bf,$d5,$aa,$d5,$fe,$e9,$df,$d5,$aa,$d5,$af,$d5,$7e,$d5,$aa
+ $fd,$ab,$d7,$b6,$d5,$aa,$bd,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
481a: e8 e8 e8 e8+ .junk 6
4820: d5 aa d5 aa+ plane_left_2 .bulk $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$df,$aa,$d5,$aa,$d5,$ea
+ $ff,$aa,$d5,$aa,$d5,$ea,$ef,$ea,$d5,$aa,$d5,$ea,$a7,$eb,$d5,$7f
+ $d5,$ea,$ff,$67,$ff,$af,$d5,$aa,$bf,$bd,$ff,$ab,$d5,$aa,$3e,$ef
+ $d7,$aa,$d5,$aa,$bd,$fd,$df,$aa,$d5,$aa,$f9,$f5,$d4,$aa,$d5,$ca
+ $f7,$f5,$d5,$aa,$d5,$fa,$df,$ff,$d5,$aa,$d5,$de,$cf,$fe,$dd,$aa
+ $d5,$af,$d5,$fa,$d9,$aa,$f5,$aa,$d7,$aa,$d5,$aa,$cd,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
48aa: e8 e8 e8 e8+ .junk 6
48b0: d5 aa d5 aa+ plane_left_3 .bulk $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$ea,$df,$aa,$d5,$be,$d5,$ea
+ $ff,$ea,$d5,$af,$d5,$ea,$eb,$e9,$fd,$a9,$d5,$ea,$ff,$eb,$3f,$aa
+ $d5,$aa,$ef,$ff,$cf,$aa,$d5,$aa,$ef,$fb,$d3,$aa,$d5,$aa,$3e,$bd
+ $d5,$aa,$d5,$aa,$b9,$bd,$d5,$aa,$d5,$aa,$fe,$f6,$d5,$aa,$d5,$ea
+ $cd,$ff,$d5,$aa,$d5,$fa,$d7,$fe,$d5,$aa,$d5,$fa,$d1,$de,$d7,$aa
+ $d5,$1e,$d7,$fa,$d7,$aa,$d5,$a7,$d5,$aa,$d5,$aa,$e5,$a9,$d5,$aa
+ $d5,$aa,$bd,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
493a: e8 e8 e8 e8+ .junk 6
4940: d5 aa d5 aa+ plane_left_4 .bulk $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$9a,$d5,$fa,$d7,$aa
+ $d5,$af,$d5,$fa,$db,$aa,$f5,$ab,$d5,$fa,$be,$aa,$fd,$aa,$d5,$ba
+ $fe,$ea,$f7,$aa,$d5,$fa,$ff,$f9,$dd,$aa,$d5,$fa,$fb,$f9,$d7,$aa
+ $d5,$ea,$ef,$ef,$d5,$aa,$d5,$aa,$5f,$9f,$d5,$aa,$d5,$aa,$3e,$9d
+ $d5,$aa,$d5,$aa,$ff,$b7,$d6,$aa,$d5,$da,$ef,$df,$d6,$aa,$d5,$fa
+ $8b,$ff,$d4,$aa,$d5,$fa,$d3,$dc,$d7,$aa,$d5,$da,$d5,$ba,$d7,$aa
+ $d5,$be,$d5,$ab,$d5,$aa,$d5,$af,$d5,$aa,$d5,$aa,$d5,$ab,$d5,$aa
+ $d5,$aa,$e5,$aa,$d5,$aa,$d5,$aa,$dd,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
49ca: e8 e8 e8 e8+ .junk 6
49d0: d5 7e d5 aa+ plane_left_5 .bulk $d5,$7e,$d5,$aa,$d5,$bc,$d5,$d6,$d3,$aa,$d5,$af,$d5,$9e,$df,$aa
+ $fd,$ab,$d5,$ce,$de,$ea,$7d,$aa,$d5,$9e,$fb,$ba,$df,$aa,$d5,$fe
+ $fe,$fa,$df,$aa,$d5,$fa,$fb,$ff,$d7,$aa,$d5,$fa,$ef,$ef,$d5,$aa
+ $d5,$ea,$eb,$9f,$d5,$aa,$d5,$aa,$ff,$af,$d5,$aa,$d5,$aa,$de,$bd
+ $dd,$aa,$d5,$aa,$7d,$be,$dd,$aa,$d5,$ea,$f7,$ff,$d7,$aa,$d5,$be
+ $6f,$ff,$d7,$aa,$d5,$fa,$df,$fd,$d7,$aa,$d5,$fe,$d3,$da,$d5,$aa
+ $d5,$f6,$d5,$aa,$d5,$aa,$d5,$9d,$d5,$aa,$d5,$aa,$d5,$af,$d5,$aa
+ $d5,$aa,$f5,$ab,$d5,$aa,$d5,$aa,$fd,$aa,$d5,$aa,$d5,$aa,$df,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
4a5a: e8 e8 e8 e8+ .junk 6
;
; Plane, rising. (23x6)
4a60: d5 aa d5 aa+ plane_rising_0 .bulk $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$a9,$d5,$aa,$d5,$aa
+ $f5,$ab,$d5,$aa,$d5,$aa,$f5,$a7,$d5,$aa,$d5,$aa,$f5,$a7,$d5,$aa
+ $d5,$aa,$fd,$af,$d5,$aa,$d5,$aa,$fd,$ae,$d5,$aa,$d5,$aa,$fd,$ae
+ $d5,$aa,$d5,$fa,$7b,$6e,$d7,$aa,$93,$6f,$6b,$6a,$ff,$fa,$ff,$2f
+ $d7,$f5,$fa,$ff,$d7,$aa,$f5,$a7,$d5,$aa,$d5,$aa,$f5,$ab,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
4aea: e8 e8 e8 e8+ .junk 6
4af0: d5 aa d5 aa+ plane_rising_1 .bulk $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $f5,$ab,$d5,$aa,$d5,$aa,$f5,$af,$d5,$aa,$d5,$aa,$fd,$af,$d5,$aa
+ $d5,$aa,$fd,$af,$d5,$aa,$d5,$aa,$fd,$ae,$d5,$aa,$d5,$aa,$fd,$ae
+ $d5,$aa,$d5,$aa,$fd,$ac,$d5,$aa,$d7,$fe,$fb,$6e,$df,$ae,$ff,$7f
+ $fb,$6e,$7f,$3f,$d5,$eb,$f5,$ae,$d5,$aa,$d5,$aa,$f5,$ab,$d5,$aa
+ $d5,$aa,$f5,$ab,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
4b7a: e8 e8 e8 e8+ .junk 6
4b80: d5 aa d5 aa+ plane_rising_2 .bulk $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$ab,$d5,$aa,$d5,$aa
+ $f5,$ab,$d5,$aa,$d5,$aa,$f5,$af,$d5,$aa,$d5,$aa,$bd,$ae,$d5,$aa
+ $d5,$aa,$dd,$ad,$d5,$aa,$d5,$aa,$fd,$af,$d5,$aa,$d5,$aa,$fd,$be
+ $d5,$aa,$d5,$aa,$fd,$bf,$d5,$aa,$d5,$aa,$fd,$be,$d6,$aa,$d5,$ea
+ $3f,$ef,$d7,$aa,$d7,$3f,$3f,$ff,$7e,$af,$ff,$7f,$7b,$ff,$7f,$ff
+ $f7,$aa,$f5,$af,$d5,$fa,$d5,$aa,$f5,$ae,$d5,$aa,$d5,$aa,$f5,$af
+ $d5,$aa,$d5,$aa,$d5,$ab,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
4c0a: e8 e8 e8 e8+ .junk 6
4c10: d5 aa d5 aa+ plane_rising_3 .bulk $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$ab
+ $d5,$aa,$d5,$aa,$f5,$ab,$d5,$aa,$d5,$aa,$f5,$af,$d5,$aa,$d5,$aa
+ $f5,$af,$d5,$aa,$d5,$aa,$fd,$af,$d5,$aa,$d5,$aa,$fd,$ae,$d5,$aa
+ $d5,$aa,$fd,$af,$d5,$aa,$d5,$aa,$fd,$af,$d5,$aa,$d5,$aa,$fd,$ad
+ $d5,$aa,$d5,$aa,$fd,$af,$d5,$aa,$d5,$ea,$ed,$bf,$d5,$aa,$d5,$ea
+ $df,$ff,$d5,$aa,$d5,$fe,$da,$bf,$df,$aa,$f5,$7f,$eb,$eb,$ff,$aa
+ $7f,$3f,$ff,$ff,$7e,$7f,$cf,$aa,$fd,$af,$d5,$fa,$d5,$aa,$f5,$af
+ $d5,$aa,$d5,$aa,$f5,$af,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
4c9a: e8 e8 e8 e8+ .junk 6
4ca0: d5 aa d5 aa+ plane_rising_4 .bulk $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$ab,$d5,$aa,$d5,$aa,$f5,$ab,$d5,$aa,$d5,$aa
+ $f5,$af,$d5,$aa,$d5,$aa,$fd,$af,$d5,$aa,$d5,$aa,$fd,$bf,$d5,$aa
+ $d5,$aa,$fd,$af,$d5,$aa,$d5,$aa,$fd,$bf,$d5,$aa,$d5,$aa,$dd,$af
+ $d5,$aa,$d5,$aa,$dd,$bf,$d5,$aa,$d5,$aa,$f9,$af,$d5,$aa,$d5,$ea
+ $ef,$fb,$d5,$aa,$d5,$fa,$fb,$ef,$cf,$aa,$d5,$7f,$ea,$af,$7d,$aa
+ $fd,$5f,$fa,$af,$55,$4f,$7f,$2f,$df,$ff,$7a,$7f,$df,$aa,$f5,$a7
+ $d5,$fe,$d3,$aa,$f5,$ae,$d5,$ea,$d5,$aa,$e5,$ab,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
4d2a: e8 e8 e8 e8+ .junk 6
4d30: d5 aa d5 aa+ plane_rising_5 .bulk $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$ab,$d5,$aa,$d5,$aa,$f5,$ab
+ $d5,$aa,$d5,$aa,$f5,$af,$d5,$aa,$d5,$aa,$f5,$af,$d5,$aa,$d5,$aa
+ $fd,$af,$d5,$aa,$d5,$aa,$fd,$be,$d5,$aa,$d5,$aa,$dd,$ad,$d5,$aa
+ $d5,$aa,$fd,$bf,$d5,$aa,$d5,$aa,$dd,$ad,$d5,$aa,$d5,$aa,$fd,$bf
+ $d5,$aa,$d5,$aa,$fd,$af,$d5,$aa,$d5,$aa,$fd,$bf,$d5,$aa,$d5,$ba
+ $ff,$be,$d5,$aa,$d5,$ea,$df,$ff,$d7,$aa,$d5,$ff,$be,$ff,$dd,$aa
+ $d5,$ff,$fb,$ff,$f7,$aa,$f7,$df,$7f,$ff,$7d,$db,$ff,$bf,$f5,$a6
+ $f7,$7b,$df,$aa,$f5,$ae,$d5,$fa,$d7,$aa,$f5,$af,$d5,$ea,$d5,$aa
+ $f5,$a7,$d5,$aa,$d5,$aa,$ed,$bb,$d5,$aa
4dba: e8 e8 e8 e8+ .junk 6
;
; Plane, veering off to right. (6x23)
4dc0: d5 aa d5 aa+ plane_right_0 .bulk $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $f5,$a7,$d5,$aa,$d5,$aa,$f5,$af,$d5,$aa,$d5,$aa,$fd,$bd,$d5,$aa
+ $d5,$aa,$bd,$bb,$d5,$aa,$d3,$f4,$2f,$bd,$d5,$aa,$df,$7f,$3b,$bd
+ $d5,$aa,$d5,$da,$db,$bf,$d5,$aa,$d5,$9a,$fa,$77,$d7,$aa,$d5,$ba
+ $52,$b3,$ff,$aa,$d5,$aa,$fd,$ab,$fd,$3f,$d5,$aa,$b5,$ab,$d5,$ba
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
4e4a: e8 e8 e8 e8+ .junk 6
4e50: d5 aa d5 aa+ plane_right_1 .bulk $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$ba,$d5,$aa,$d5,$aa
+ $d5,$7f,$d5,$aa,$d5,$aa,$d5,$6b,$d5,$aa,$d5,$aa,$e5,$6f,$d5,$aa
+ $d1,$aa,$72,$7a,$d5,$aa,$d3,$f7,$6f,$7a,$d5,$aa,$d5,$d7,$4a,$3f
+ $d5,$aa,$d5,$da,$4a,$1d,$d5,$aa,$d5,$92,$fb,$7e,$d5,$aa,$d5,$9a
+ $d7,$7b,$cf,$aa,$d5,$aa,$7d,$cb,$fb,$aa,$d5,$aa,$3f,$ab,$fd,$ab
+ $d5,$aa,$d7,$aa,$e5,$af,$d5,$aa,$d5,$aa,$d5,$9e,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
4eda: e8 e8 e8 e8+ .junk 6
4ee0: d5 aa d5 aa+ plane_right_2 .bulk $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$ea,$d7,$aa,$d5,$aa,$d5,$fe,$d5,$aa,$d5,$aa
+ $d5,$7f,$d7,$aa,$d6,$aa,$d5,$6b,$d5,$aa,$7f,$aa,$e5,$f2,$d5,$aa
+ $f5,$77,$73,$6f,$d5,$aa,$d5,$57,$5a,$3e,$d5,$aa,$d5,$d4,$7a,$3e
+ $d5,$aa,$d5,$ca,$5a,$be,$d5,$aa,$d5,$aa,$56,$ef,$d5,$aa,$d5,$aa
+ $57,$ff,$d5,$aa,$d5,$ea,$7d,$31,$dd,$aa,$d5,$ea,$fe,$fa,$fd,$aa
+ $d5,$ea,$cf,$aa,$fd,$ab,$d5,$aa,$d5,$aa,$d5,$b7,$d5,$aa,$d5,$aa
+ $d5,$ba,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
4f6a: e8 e8 e8 e8+ .junk 6
4f70: d5 aa d5 aa+ plane_right_3 .bulk $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$cf,$aa,$d5,$fc,$d5,$aa,$ed,$aa
+ $d5,$fd,$d5,$aa,$d5,$8f,$d5,$eb,$d5,$aa,$d5,$7e,$a3,$7b,$d5,$aa
+ $d5,$fa,$7f,$7a,$d5,$aa,$d5,$ea,$6b,$7a,$d5,$aa,$d5,$aa,$4a,$be
+ $d5,$aa,$d5,$aa,$5a,$0e,$d5,$aa,$d5,$aa,$37,$ff,$d5,$aa,$d5,$92
+ $75,$59,$d7,$aa,$d5,$92,$ff,$fa,$d5,$aa,$d5,$fa,$dd,$ca,$df,$aa
+ $d5,$ba,$d5,$ea,$dc,$aa,$d5,$aa,$d5,$aa,$f5,$aa,$d5,$aa,$d5,$aa
+ $d5,$ab,$d5,$aa,$d5,$aa,$d5,$be,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
4ffa: e8 e8 e8 e8+ .junk 6
5000: d5 aa d5 aa+ plane_right_4 .bulk $d5,$aa,$d5,$aa,$d5,$aa,$d4,$aa,$d5,$aa,$d5,$aa,$db,$aa,$d5,$ea
+ $d7,$aa,$6c,$a9,$dd,$ba,$d7,$aa,$f5,$97,$d6,$ae,$d7,$aa,$d5,$57
+ $d3,$eb,$d6,$aa,$d5,$de,$5a,$7b,$d3,$aa,$d5,$f2,$4a,$6a,$d7,$aa
+ $d5,$aa,$5b,$7a,$d5,$aa,$d5,$aa,$5c,$7d,$d5,$aa,$d5,$aa,$dd,$3e
+ $d5,$aa,$d5,$aa,$56,$6f,$d5,$aa,$d5,$aa,$75,$ff,$dd,$aa,$d5,$9a
+ $77,$fa,$d7,$aa,$d5,$aa,$dd,$ea,$d7,$aa,$d5,$ba,$d6,$ea,$dd,$aa
+ $d5,$aa,$d5,$aa,$ff,$aa,$d5,$aa,$d5,$aa,$f5,$aa,$d5,$aa,$d5,$aa
+ $d5,$ab,$d5,$aa,$d5,$aa,$d5,$ab,$d5,$aa,$d5,$aa,$d5,$ae,$d5,$aa
+ $d5,$aa,$d5,$b6,$d5,$aa,$d5,$aa,$d5,$aa
508a: e8 e8 e8 e8+ .junk 6
5090: 9c aa d5 aa+ plane_right_5 .bulk $9c,$aa,$d5,$aa,$3f,$aa,$bd,$ab,$d5,$ea,$f5,$aa,$a5,$bf,$cd,$fa
+ $fc,$aa,$d5,$5f,$d7,$ae,$f9,$aa,$d5,$de,$ce,$6e,$dc,$aa,$d5,$fa
+ $52,$2b,$df,$aa,$d5,$fa,$6b,$4a,$df,$aa,$d5,$ea,$6b,$7a,$d7,$aa
+ $d5,$aa,$dd,$6a,$d5,$aa,$d5,$aa,$db,$fe,$d5,$aa,$d5,$aa,$56,$bf
+ $d5,$aa,$d5,$ca,$16,$5f,$d5,$aa,$d5,$a2,$f5,$fe,$f7,$aa,$d5,$aa
+ $bd,$7b,$de,$aa,$d5,$d2,$df,$fa,$de,$aa,$d5,$ea,$d5,$ea,$dd,$aa
+ $d5,$aa,$d5,$aa,$ff,$aa,$d5,$aa,$d5,$aa,$fd,$aa,$d5,$aa,$d5,$aa
+ $fd,$ab,$d5,$aa,$d5,$aa,$f5,$ab,$d5,$aa,$d5,$aa,$d5,$bf,$d5,$aa
+ $d5,$aa,$d5,$be,$d5,$aa,$d5,$aa,$d5,$aa
511a: e8 e8 e8 e8+ .junk 6
;
; Plane, approaching player (6x9).
plane_approach_0
5120: d5 aa d5 aa+ .bulk $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$ab,$d5,$aa,$d5,$aa,$f5,$a7,$d5,$aa,$d5,$ea
+ $6b,$ff,$d7,$aa,$d5,$aa,$f5,$ae,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa
5156: e8 e8 e8 e8+ .junk 10
plane_approach_1
5160: d5 aa d5 aa+ .bulk $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$ab,$d5,$aa,$d5,$aa,$d5,$ab
+ $d5,$aa,$d5,$aa,$f5,$af,$d5,$aa,$d5,$aa,$f5,$af,$d5,$aa,$d5,$ea
+ $bf,$fc,$de,$aa,$d5,$aa,$f5,$af,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa
5196: e8 e8 e8 e8+ .junk 10
plane_approach_2
51a0: d5 aa d5 aa+ .bulk $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$ab,$d5,$aa,$d5,$aa,$d5,$ab
+ $d5,$aa,$d5,$aa,$f5,$af,$d5,$aa,$d5,$aa,$f5,$ad,$d5,$aa,$d5,$fe
+ $bf,$fc,$df,$aa,$d5,$aa,$f5,$af,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa
51d6: e8 e8 e8 e8+ .junk 10
plane_approach_3
51e0: d5 aa d5 aa+ .bulk $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$ab,$d5,$aa,$d5,$aa,$f5,$a7
+ $d5,$aa,$d5,$aa,$f5,$af,$d5,$aa,$d5,$aa,$dd,$9f,$d5,$aa,$d5,$ea
+ $fa,$ef,$d5,$aa,$d5,$ff,$bf,$fc,$ff,$aa,$d5,$aa,$ed,$33,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa
5216: e8 e8 e8 e8+ .junk 10
plane_approach_4
5220: d5 aa d5 aa+ .bulk $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$af,$d5,$aa,$d5,$aa,$d5,$af
+ $d5,$aa,$d5,$aa,$f5,$bf,$d5,$aa,$f4,$aa,$f5,$fd,$d5,$ae,$f5,$d7
+ $9f,$fb,$ef,$af,$f5,$aa,$fd,$df,$d5,$ae,$d5,$aa,$d5,$ab,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa
5256: e8 e8 e8 e8+ .junk 10
plane_approach_5
5260: d5 aa d5 ab+ .bulk $d5,$aa,$d5,$ab,$d5,$aa,$d5,$aa,$f5,$af,$d5,$aa,$d5,$aa,$f5,$af
+ $d5,$aa,$d5,$aa,$bd,$bd,$d5,$aa,$d5,$aa,$f9,$a7,$d5,$aa,$dc,$ea
+ $7f,$7a,$d6,$ba,$fd,$5f,$be,$7d,$7b,$b7,$dd,$aa,$73,$67,$d5,$ba
+ $d5,$aa,$d5,$aa,$d5,$aa
5296: e8 e8 e8 e8+ .junk 10
plane_approach_6
52a0: d5 aa d5 a7+ .bulk $d5,$aa,$d5,$a7,$d5,$aa,$d5,$aa,$f5,$af,$d5,$aa,$d5,$aa,$bd,$bd
+ $d5,$aa,$d5,$aa,$9d,$39,$d5,$aa,$d5,$aa,$be,$3d,$d5,$aa,$d5,$da
+ $bf,$55,$df,$aa,$d6,$ff,$37,$b5,$ff,$eb,$7e,$ff,$2f,$75,$ff,$ff
+ $d6,$aa,$f9,$ad,$d5,$ea
52d6: e8 e8 e8 e8+ .align $0100 (42 bytes)
;
; Bitmap used for planes firing at player (6x9). Drawn on top of approaching
; plane. Must not cross a page boundary.
5300: 00 40 01 02+ plane_firing .bulk $00,$40,$01,$02,$0c,$00,$00,$00,$1b,$07,$07,$00,$00,$00,$1e,$72
+ $01,$00,$00,$00,$3a,$77,$00,$00,$00,$00,$30,$1e,$01,$00,$00,$00
+ $45,$0b,$03,$00,$00,$00,$18,$39,$00,$00,$00,$00,$7c,$75,$00,$00
+ $00,$40,$07,$60,$0f,$00
5336: 00 00 00 00+ .junk 26
;
; Full line of blue sky, used for erasing things during dogfights. The hi-res
; screen's odd/even nature prevents the use of a single color byte value.
5350: d5 aa d5 aa+ blue_sky .bulk $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
5378: d5 00 00 00+ .align $0100 (136 bytes)
;
; Harmless flak pop (6x36). Must not cross a page boundary.
;
; Like other bombing-mode bitmaps, this is drawn on alternating lines. Unlike
; the others, the drawing routine skips every other line of the bitmap itself.
5400: 00 00 00 00+ flak_pop .bulk $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$80,$80
+ $00,$00,$00,$00,$80,$80,$00,$00,$00,$00,$00,$81,$00,$00,$00,$00
+ $80,$81,$00,$00,$00,$00,$80,$80,$00,$00,$00,$00,$00,$85,$00,$00
+ $00,$00,$00,$85,$00,$00,$00,$00,$00,$85,$80,$81,$00,$00,$00,$85
+ $a0,$00,$00,$00,$a0,$85,$a8,$00,$00,$c0,$a2,$d1,$8a,$00,$00,$d0
+ $aa,$d1,$8a,$00,$00,$d4,$a2,$d5,$8a,$00,$00,$d4,$8a,$d4,$88,$00
+ $00,$95,$8a,$d1,$82,$00,$00,$00,$8a,$d0,$80,$84,$00,$80,$8a,$d4
+ $00,$00,$82,$c0,$8a,$d4,$80,$00,$82,$c0,$8a,$d5,$80,$00,$82,$d0
+ $e0,$c7,$82,$00,$00,$80,$b8,$d5,$8a,$00,$00,$00,$bc,$d1,$8a,$00
+ $00,$00,$ac,$85,$8a,$00,$00,$85,$a0,$81,$80,$00,$00,$81,$a0,$81
+ $00,$00,$00,$00,$a0,$81,$00,$00,$00,$00,$a0,$81,$00,$00,$00,$00
+ $a0,$81,$00,$00,$00,$00,$a0,$81,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00
54d8: 00 00 00 00+ .align $0100 (40 bytes)
;
; Numerals 0-9, 8 pixels high. The bitmap is 16x8.
5500: 1c 08 1c 3e+ number_font_0 .bulk $1c,$08,$1c,$3e,$10,$3e,$38,$3e,$1c,$1c,$00,$00,$00,$00,$00,$00
5510: 22 0c 22 20+ number_font_1 .bulk $22,$0c,$22,$20,$18,$02,$04,$20,$22,$22,$00,$00,$00,$00,$00,$00
5520: 32 08 20 10+ number_font_2 .bulk $32,$08,$20,$10,$14,$1e,$02,$10,$22,$22,$00,$00,$00,$00,$00,$00
5530: 2a 08 18 18+ number_font_3 .bulk $2a,$08,$18,$18,$12,$20,$1e,$08,$1c,$3c,$00,$00,$00,$00,$00,$00
5540: 26 08 04 20+ number_font_4 .bulk $26,$08,$04,$20,$3e,$20,$22,$04,$22,$20,$00,$00,$00,$00,$00,$00
5550: 22 08 02 22+ number_font_5 .bulk $22,$08,$02,$22,$10,$22,$22,$04,$22,$10,$00,$00,$00,$00,$00,$00
5560: 1c 1c 3e 1c+ number_font_6 .bulk $1c,$1c,$3e,$1c,$10,$1c,$1c,$04,$1c,$0e,$00,$00,$00,$00,$00,$00
5570: 00 00 00 00+ number_font_7 .bulk $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
;
; Status bar score template: "SCORE:000000 L:0 H:000 T:000". The numeric fields
; are overwritten as they are updated.
;
; This, and some of the other text, has a weird 128-byte alignment restriction.
score_template_0
5580: 1e 1c 1e 1f+ .bulk $1e,$1c,$1e,$1f,$3f,$00,$1c,$1c,$1c,$1c,$1c,$1c,$00,$0f,$00,$1c
+ $00,$33,$00,$1c,$1c,$1c,$00,$3f,$00,$1c,$1c,$1c,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00
score_template_1
55a8: 33 36 33 33+ .bulk $33,$36,$33,$33,$36,$0c,$22,$22,$22,$22,$22,$22,$00,$06,$0c,$22
+ $00,$33,$0c,$22,$22,$22,$00,$3f,$0c,$22,$22,$22,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00
score_template_2
55d0: 03 03 33 33+ .bulk $03,$03,$33,$33,$06,$0c,$32,$32,$32,$32,$32,$32,$00,$06,$0c,$32
+ $00,$33,$0c,$32,$32,$32,$00,$0c,$0c,$32,$32,$32,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00
55f8: 00 00 00 00+ .junk 8
score_template_3
5600: 1e 03 33 1f+ .bulk $1e,$03,$33,$1f,$0e,$00,$2a,$2a,$2a,$2a,$2a,$2a,$00,$06,$00,$2a
+ $00,$3f,$00,$2a,$2a,$2a,$00,$0c,$00,$2a,$2a,$2a,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00
score_template_4
5628: 30 03 33 0f+ .bulk $30,$03,$33,$0f,$06,$0c,$26,$26,$26,$26,$26,$26,$00,$06,$0c,$26
+ $00,$33,$0c,$26,$26,$26,$00,$0c,$0c,$26,$26,$26,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00
score_template_5
5650: 33 36 33 1b+ .bulk $33,$36,$33,$1b,$36,$0c,$22,$22,$22,$22,$22,$22,$00,$36,$0c,$22
+ $00,$33,$0c,$22,$22,$22,$00,$0c,$0c,$22,$22,$22,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00
5678: 00 00 00 00+ .junk 8
score_template_6
5680: 1e 1c 1e 33+ .bulk $1e,$1c,$1e,$33,$3f,$00,$1c,$1c,$1c,$1c,$1c,$1c,$00,$3f,$00,$1c
+ $00,$33,$00,$1c,$1c,$1c,$00,$1e,$00,$1c,$1c,$1c,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00
score_template_7
56a8: 00 00 00 00+ .bulk $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00
;
; Plane icon (2x8), drawn on the right side of the status bar to show how many
; lives the player has remaining.
56d0: 40 40 40 60+ plane_icon_0 .bulk $40,$40,$40,$60,$78,$7c,$44,$40
56d8: 01 01 01 03+ plane_icon_1 .bulk $01,$01,$01,$03,$0f,$1f,$11,$01
56e0: 00 00 00 00+ .junk 32
;
; "WARNING: AIR ATTACK". All characters are two pixels wide so we can AND it
; with a color mask.
5700: 8c 98 c0 81+ air_atk_msg_0 .bulk $8c,$98,$c0,$81,$fc,$87,$8c,$98,$f0,$87,$8c,$98,$f0,$87,$80,$80
+ $80,$80,$80,$80,$c0,$81,$f0,$87,$fc,$87,$80,$80,$c0,$81,$fc,$9f
+ $fc,$9f,$c0,$81,$c0,$87,$8c,$98
5728: 8c 98 b0 86+ air_atk_msg_1 .bulk $8c,$98,$b0,$86,$8c,$98,$8c,$98,$c0,$81,$8c,$98,$8c,$98,$f0,$81
+ $80,$80,$80,$80,$b0,$86,$c0,$81,$8c,$98,$80,$80,$b0,$86,$cc,$99
+ $cc,$99,$b0,$86,$b0,$98,$8c,$86
5750: 8c 98 8c 98+ air_atk_msg_2 .bulk $8c,$98,$8c,$98,$8c,$98,$bc,$98,$c0,$81,$bc,$98,$8c,$80,$f0,$81
+ $80,$80,$80,$80,$8c,$98,$c0,$81,$8c,$98,$80,$80,$8c,$98,$c0,$81
+ $c0,$81,$8c,$98,$8c,$80,$cc,$81
5778: 80 80 80 80+ .junk 8
5780: 8c 98 8c 98+ air_atk_msg_3 .bulk $8c,$98,$8c,$98,$fc,$87,$cc,$99,$c0,$81,$cc,$99,$8c,$80,$80,$80
+ $80,$80,$80,$80,$8c,$98,$c0,$81,$fc,$87,$80,$80,$8c,$98,$c0,$81
+ $c0,$81,$8c,$98,$8c,$80,$bc,$80
57a8: 8c 98 8c 98+ air_atk_msg_4 .bulk $8c,$98,$8c,$98,$fc,$87,$cc,$99,$c0,$81,$cc,$99,$8c,$80,$80,$80
+ $80,$80,$80,$80,$8c,$98,$c0,$81,$fc,$87,$80,$80,$8c,$98,$c0,$81
+ $c0,$81,$8c,$98,$8c,$80,$bc,$80
57d0: cc 99 fc 9f+ air_atk_msg_5 .bulk $cc,$99,$fc,$9f,$cc,$81,$8c,$9e,$c0,$81,$8c,$9e,$8c,$9e,$f0,$81
+ $80,$80,$80,$80,$fc,$9f,$c0,$81,$cc,$81,$80,$80,$fc,$9f,$c0,$81
+ $c0,$81,$fc,$9f,$8c,$80,$cc,$81
57f8: 80 80 80 80+ .junk 8
5800: cc 99 8c 98+ air_atk_msg_6 .bulk $cc,$99,$8c,$98,$8c,$86,$8c,$98,$c0,$81,$8c,$98,$8c,$98,$f0,$81
+ $80,$80,$80,$80,$8c,$98,$c0,$81,$8c,$86,$80,$80,$8c,$98,$c0,$81
+ $c0,$81,$8c,$98,$b0,$98,$8c,$86
5828: b8 8e 8c 98+ air_atk_msg_7 .bulk $b8,$8e,$8c,$98,$8c,$98,$8c,$98,$f0,$87,$8c,$98,$f8,$9f,$80,$80
+ $80,$80,$80,$80,$8c,$98,$f0,$87,$8c,$98,$80,$80,$8c,$98,$f0,$87
+ $f0,$87,$8c,$98,$c0,$87,$8c,$98
5850: 80 80 80 80+ .align $80 (48 bytes)
;
; "BOMB TARGET APPROACH" text. All characters are two pixels wide so we can AND
; it with a color mask.
5880: fc 87 f0 87+ bta_msg_0 .bulk $fc,$87,$f0,$87,$8c,$98,$fc,$87,$80,$80,$fc,$9f,$c0,$81,$fc,$87
+ $f0,$87,$fc,$9f,$fc,$9f,$80,$80,$c0,$81,$fc,$87,$fc,$87,$fc,$87
+ $f0,$87,$c0,$81,$c0,$87,$8c,$98
58a8: b0 98 8c 98+ bta_msg_1 .bulk $b0,$98,$8c,$98,$bc,$9e,$b0,$98,$80,$80,$cc,$99,$b0,$86,$8c,$98
+ $8c,$98,$b0,$98,$cc,$99,$80,$80,$b0,$86,$b0,$98,$b0,$98,$8c,$98
+ $8c,$98,$b0,$86,$b0,$98,$8c,$98
58d0: b0 98 8c 98+ bta_msg_2 .bulk $b0,$98,$8c,$98,$cc,$99,$b0,$98,$80,$80,$c0,$81,$8c,$98,$8c,$98
+ $8c,$80,$b0,$80,$c0,$81,$80,$80,$8c,$98,$b0,$98,$b0,$98,$8c,$98
+ $8c,$98,$8c,$98,$8c,$80,$8c,$98
58f8: 80 80 80 80+ .junk 8
5900: f0 87 8c 98+ bta_msg_3 .bulk $f0,$87,$8c,$98,$8c,$98,$f0,$87,$80,$80,$c0,$81,$8c,$98,$fc,$87
+ $8c,$80,$f0,$81,$c0,$81,$80,$80,$8c,$98,$f0,$87,$f0,$87,$fc,$87
+ $8c,$98,$8c,$98,$8c,$80,$fc,$9f
5928: b0 98 8c 98+ bta_msg_4 .bulk $b0,$98,$8c,$98,$8c,$98,$b0,$98,$80,$80,$c0,$81,$fc,$9f,$cc,$81
+ $8c,$9e,$b0,$80,$c0,$81,$80,$80,$fc,$9f,$b0,$80,$b0,$80,$cc,$81
+ $8c,$98,$fc,$9f,$8c,$80,$8c,$98
5950: b0 98 8c 98+ bta_msg_5 .bulk $b0,$98,$8c,$98,$8c,$98,$b0,$98,$80,$80,$c0,$81,$8c,$98,$8c,$86
+ $8c,$98,$b0,$98,$c0,$81,$80,$80,$8c,$98,$b0,$80,$b0,$80,$8c,$86
+ $8c,$98,$8c,$98,$b0,$98,$8c,$98
5978: 80 80 80 80+ .junk 8
5980: fc 87 f0 87+ bta_msg_6 .bulk $fc,$87,$f0,$87,$8c,$98,$fc,$87,$80,$80,$f0,$87,$8c,$98,$8c,$98
+ $f0,$9f,$fc,$9f,$f0,$87,$80,$80,$8c,$98,$fc,$81,$fc,$81,$8c,$98
+ $f0,$87,$8c,$98,$c0,$87,$8c,$98
59a8: 80 80 80 80+ bta_msg_7 .bulk $80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80
+ $80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80
+ $80,$80,$80,$80,$80,$80,$80,$80
59d0: 80 80 80 80+ .align $0100 (48 bytes)
;
; Text color mask, applied to "bomb target approach" and "warning: air attack"
; messages in status bar. This gets XORed to provide alternating colors.
5a00: d5 aa d5 aa+ text_color_mask .bulk $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
+ $d5,$aa,$d5,$aa,$d5,$aa,$d5,$aa
5a28: d5 aa d5 aa+ .junk 8
;
; Erases the rightmost part of the status area, where the plane icons are shown,
; then calls the draw code.
;
• Clear variables
]hptr .var $00 {addr/2}
RedrawPlaneIcons
5a30: a2 00 ldx #$00 ;line 0
5a32: bd 00 08 :RowLoop lda hires_addr_hi,x ;get hi-res address
5a35: 85 01 sta ]hptr+1
5a37: bd c0 08 lda hires_addr_lo,x
5a3a: 85 00 sta ]hptr
5a3c: a0 1e ldy #30 ;start in column 30
5a3e: a9 00 lda #$00 ;black pixels
5a40: 91 00 :ColLoop sta (]hptr),y
5a42: c8 iny
5a43: c0 28 cpy #40 ;reached column 40 (5 planes * 2 bytes each)?
5a45: 90 f9 bcc :ColLoop
5a47: e8 inx
5a48: e0 08 cpx #8 ;reached line 8?
5a4a: 90 e6 bcc :RowLoop ;not yet, loop
5a4c: 4c a0 5b jmp DrawPlaneIcons ;now draw the appropriate number of icons
5a4f: 00 .junk 1
;
; Displays "WARNING: AIR ATTACK" at the top of the screen. Shown when planes
; are about to attack, and the level is greater than 1.
;
DrawAirAttackMsg
5a50: a0 00 ldy #$00 ;start in left column
5a52: b9 00 57 :Loop lda air_atk_msg_0,y ;get byte from top line
5a55: 39 00 5a and text_color_mask,y ;AND with mask
5a58: 99 00 20 sta HIRES_PAGE1,y ;store in line 0 of the hi-res screen
5a5b: b9 28 57 lda air_atk_msg_1,y ;now do next line
5a5e: 39 00 5a and text_color_mask,y ; ...
5a61: 99 00 24 sta HIRES_PAGE1+$400,y
5a64: b9 50 57 lda air_atk_msg_2,y
5a67: 39 00 5a and text_color_mask,y
5a6a: 99 00 28 sta HIRES_PAGE1+$800,y
5a6d: b9 80 57 lda air_atk_msg_3,y
5a70: 39 00 5a and text_color_mask,y
5a73: 99 00 2c sta HIRES_PAGE1+$c00,y
5a76: b9 a8 57 lda air_atk_msg_4,y
5a79: 39 00 5a and text_color_mask,y
5a7c: 99 00 30 sta HIRES_PAGE1+$1000,y
5a7f: b9 d0 57 lda air_atk_msg_5,y
5a82: 39 00 5a and text_color_mask,y
5a85: 99 00 34 sta HIRES_PAGE1+$1400,y
5a88: b9 00 58 lda air_atk_msg_6,y
5a8b: 39 00 5a and text_color_mask,y
5a8e: 99 00 38 sta HIRES_PAGE1+$1800,y
5a91: b9 28 58 lda air_atk_msg_7,y
5a94: 39 00 5a and text_color_mask,y
5a97: 99 00 3c sta HIRES_PAGE1+$1c00,y
5a9a: c8 iny
5a9b: c0 28 cpy #40 ;finished with entire thing?
5a9d: 90 b3 bcc :Loop ;not yet, loop
5a9f: ea nop
; Invert the color mask for next time.
5aa0: a0 00 InvertColorMask ldy #$00
5aa2: b9 00 5a :MaskLoop lda text_color_mask,y
5aa5: 49 7f eor #$7f
5aa7: 99 00 5a sta text_color_mask,y
5aaa: c8 iny
5aab: c0 28 cpy #40
5aad: 90 f3 bcc :MaskLoop
; Make a sound.
5aaf: a2 20 ldx #$20
5ab1: a0 20 :SoundLoop ldy #$20
5ab3: 88 :DelayLoop dey
5ab4: ea nop
5ab5: d0 fc bne :DelayLoop
5ab7: 8d 30 c0 sta SPKR ;click
5aba: ca dex
5abb: d0 f4 bne :SoundLoop
5abd: 60 rts
5abe: 00 00 00 00+ .fill 66,$00
;
; Draws "BOMB TARGET APPROACH", in alternating colors, at the top of the screen.
; This is shown when a wave of planes is completed successfully.
;
5b00: a0 00 DrawBtaMsg ldy #$00 ;start in left column
5b02: b9 80 58 :Loop lda bta_msg_0,y ;get byte from top line
5b05: 39 00 5a and text_color_mask,y ;AND with mask
5b08: 99 00 20 sta HIRES_PAGE1,y ;store in line 0 of the hi-res screen
5b0b: b9 a8 58 lda bta_msg_1,y ;now do next line
5b0e: 39 00 5a and text_color_mask,y ; ...
5b11: 99 00 24 sta HIRES_PAGE1+$400,y
5b14: b9 d0 58 lda bta_msg_2,y
5b17: 39 00 5a and text_color_mask,y
5b1a: 99 00 28 sta HIRES_PAGE1+$800,y
5b1d: b9 00 59 lda bta_msg_3,y
5b20: 39 00 5a and text_color_mask,y
5b23: 99 00 2c sta HIRES_PAGE1+$c00,y
5b26: b9 28 59 lda bta_msg_4,y
5b29: 39 00 5a and text_color_mask,y
5b2c: 99 00 30 sta HIRES_PAGE1+$1000,y
5b2f: b9 50 59 lda bta_msg_5,y
5b32: 39 00 5a and text_color_mask,y
5b35: 99 00 34 sta HIRES_PAGE1+$1400,y
5b38: b9 80 59 lda bta_msg_6,y
5b3b: 39 00 5a and text_color_mask,y
5b3e: 99 00 38 sta HIRES_PAGE1+$1800,y
5b41: b9 a8 59 lda bta_msg_7,y
5b44: 39 00 5a and text_color_mask,y
5b47: 99 00 3c sta HIRES_PAGE1+$1c00,y
5b4a: c8 iny
5b4b: c0 28 cpy #40
5b4d: 90 b3 bcc :Loop
5b4f: 4c a0 5a jmp InvertColorMask ;flip colors, make sound
5b52: 00 00 00 00+ .junk 14
;
; Draws the score template text across the top of the screen. This renders the
; entire line, so it also clears the entire status bar to black.
;
5b60: a0 00 DrawScoreTempl ldy #$00
5b62: b9 80 55 :Loop lda score_template_0,y ;copy to fixed position on screen
5b65: 99 00 20 sta HIRES_PAGE1,y ;unroll to copy all 8 lines with one loop
5b68: b9 a8 55 lda score_template_1,y
5b6b: 99 00 24 sta HIRES_PAGE1+$400,y
5b6e: b9 d0 55 lda score_template_2,y
5b71: 99 00 28 sta HIRES_PAGE1+$800,y
5b74: b9 00 56 lda score_template_3,y
5b77: 99 00 2c sta HIRES_PAGE1+$c00,y
5b7a: b9 28 56 lda score_template_4,y
5b7d: 99 00 30 sta HIRES_PAGE1+$1000,y
5b80: b9 50 56 lda score_template_5,y
5b83: 99 00 34 sta HIRES_PAGE1+$1400,y
5b86: b9 80 56 lda score_template_6,y
5b89: 99 00 38 sta HIRES_PAGE1+$1800,y
5b8c: b9 a8 56 lda score_template_7,y
5b8f: 99 00 3c sta HIRES_PAGE1+$1c00,y
5b92: c8 iny
5b93: c0 28 cpy #40 ;all the way across?
5b95: 90 cb bcc :Loop ;not yet, loop
5b97: 60 rts
5b98: 00 00 00 00+ .junk 8
;
; Draws plane icons at the top of the screen, to tell the player how many lives
; they have left.
;
• Clear variables
]hptr .var $00 {addr/2}
]col .var $02 {addr/1}
5ba0: a5 5d DrawPlaneIcons lda player_lives ;get number of lives remaining
5ba2: d0 01 :DrawLoop bne :DoDraw ;nonzero, draw an icon
5ba4: 60 rts
5ba5: 48 :DoDraw pha ;preserve count
5ba6: 0a asl A ;double it
5ba7: 85 00 sta ]hptr ;save in temp storage
5ba9: a9 28 lda #40
5bab: 38 sec
5bac: e5 00 sbc ]hptr ;compute 40 - count
5bae: 85 02 sta ]col ;save as column
5bb0: a2 00 ldx #$00 ;start at row 0 of the hi-res screen
5bb2: a4 02 :LineLoop ldy ]col ;get column offset
5bb4: bd 00 08 lda hires_addr_hi,x ;get hi-res address
5bb7: 85 01 sta ]hptr+1
5bb9: bd c0 08 lda hires_addr_lo,x
5bbc: 85 00 sta ]hptr
5bbe: bd d0 56 lda plane_icon_0,x ;get a byte from the bitmap (column 0)
5bc1: 91 00 sta (]hptr),y ;store it
5bc3: c8 iny ;advance to next column
5bc4: bd d8 56 lda plane_icon_1,x ;get a byte from the bitmap (column 1)
5bc7: 91 00 sta (]hptr),y ;store it
5bc9: e8 inx ;advance to next line
5bca: e0 08 cpx #$08 ;done yet?
5bcc: 90 e4 bcc :LineLoop ;no, loop
5bce: 68 pla ;restore count
5bcf: 38 sec
5bd0: e9 01 sbc #$01 ;decrement
5bd2: 4c a2 5b jmp :DrawLoop ;loop
5bd5: 60 55 99 00+ .junk 11
;
; Draws a number in the top row of the screen. Used for scores.
;
; On entry:
; X-reg: number (0-9)
; Y-reg: horizontal offset (0-39)
;
5be0: bd 00 55 DrawNumber lda number_font_0,x ;get byte from appropriate digit glyph
5be3: 99 00 20 sta HIRES_PAGE1,y ;store in top row of hi-res screen
5be6: bd 10 55 lda number_font_1,x ;...unroll...
5be9: 99 00 24 sta HIRES_PAGE1+$400,y
5bec: bd 20 55 lda number_font_2,x
5bef: 99 00 28 sta HIRES_PAGE1+$800,y
5bf2: bd 30 55 lda number_font_3,x
5bf5: 99 00 2c sta HIRES_PAGE1+$c00,y
5bf8: bd 40 55 lda number_font_4,x
5bfb: 99 00 30 sta HIRES_PAGE1+$1000,y
5bfe: bd 50 55 lda number_font_5,x
5c01: 99 00 34 sta HIRES_PAGE1+$1400,y
5c04: bd 60 55 lda number_font_6,x
5c07: 99 00 38 sta HIRES_PAGE1+$1800,y
5c0a: bd 70 55 lda number_font_7,x
5c0d: 99 00 3c sta HIRES_PAGE1+$1c00,y
5c10: 60 rts
5c11: 55 .junk 1
;
; Draws the difficulty level number.
;
5c12: a6 56 DrawLevel ldx player_level ;one digit, column 15
5c14: a0 0f ldy #15
5c16: 4c e0 5b jmp DrawNumber
5c19: 00 ff ff 00+ .junk 7
;
; Draws the number of targets bombed.
;
5c20: a6 57 DrawTargetsHit ldx targets_hit ;3 digits, columns 25-27
5c22: a0 19 ldy #25
5c24: 20 e0 5b jsr DrawNumber
5c27: a6 58 ldx targets_hit+1
5c29: a0 1a ldy #26
5c2b: 20 e0 5b jsr DrawNumber
5c2e: a6 59 ldx targets_hit+2
5c30: a0 1b ldy #27
5c32: 4c e0 5b jmp DrawNumber
5c35: 00 ff ff .junk 3
;
; Draws the number of hostile planes shot down.
;
5c38: a6 5a DrawPlanesHit ldx planes_hit ;3 digits, columns 19-21
5c3a: a0 13 ldy #19
5c3c: 20 e0 5b jsr DrawNumber
5c3f: a6 5b ldx planes_hit+1
5c41: a0 14 ldy #20
5c43: 20 e0 5b jsr DrawNumber
5c46: a6 5c ldx planes_hit+2
5c48: a0 15 ldy #21
5c4a: 4c e0 5b jmp DrawNumber
5c4d: 00 ff ff .junk 3
;
; Draws the score.
;
5c50: a6 50 DrawScore ldx score ;6 digits, columns 7-11
5c52: a0 06 ldy #6
5c54: 20 e0 5b jsr DrawNumber
5c57: a6 51 ldx score+1
5c59: a0 07 ldy #7
5c5b: 20 e0 5b jsr DrawNumber
5c5e: a6 52 ldx score+2
5c60: a0 08 ldy #8
5c62: 20 e0 5b jsr DrawNumber
5c65: a6 53 ldx score+3
5c67: a0 09 ldy #9
5c69: 20 e0 5b jsr DrawNumber
5c6c: a6 54 ldx score+4
5c6e: a0 0a ldy #10
5c70: 20 e0 5b jsr DrawNumber
5c73: a6 55 ldx score+5
5c75: a0 0b ldy #11
5c77: 4c e0 5b jmp DrawNumber
5c7a: ff ff 00 00+ .junk 6
;
; Adds 10 points to the player's score.
;
; On exit:
; X-reg preserved
;
5c80: a0 04 Add10Points ldy #$04 ;5th column from left (0000x0)
5c82: b9 50 00 :NextDigit lda score,y
5c85: 18 clc
5c86: 69 01 adc #$01 ;add one
5c88: c9 0a cmp #10 ;did we roll over?
5c8a: 90 09 bcc :Done ;no, bail
5c8c: a9 00 lda #$00
5c8e: 99 50 00 sta score,y ;set digit to zero
5c91: 88 dey ;move one digit left
5c92: 10 ee bpl :NextDigit
5c94: 60 rts
5c95: 99 50 00 :Done sta score,y
5c98: 60 rts
5c99: 00 ff ff 00+ .junk 7
;
; Increments the difficulty level.
;
5ca0: a5 56 IncDifficulty lda player_level ;get current level
5ca2: 18 clc
5ca3: 69 01 adc #$01
5ca5: c9 06 cmp #$06 ;more than 5?
5ca7: b0 03 bcs :Return ;yes, don't change it
5ca9: 8d 56 00 sta: player_level
5cac: 60 :Return rts
5cad: ea ff ff .junk 3
;
; Decrements the difficulty level.
;
5cb0: a5 56 DecDifficulty lda player_level ;get current level
5cb2: 38 sec
5cb3: e9 01 sbc #$01
5cb5: f0 02 beq :Return ;if reduced to zero, don't change it
5cb7: 85 56 sta player_level
5cb9: 60 :Return rts
5cba: ff ff 00 00+ .junk 6
;
; Increments the number of bomb targets hit.
;
5cc0: a0 02 IncTargetsHit ldy #$02 ;3rd digit from left (00x)
5cc2: b9 57 00 :NextDigit lda targets_hit,y
5cc5: 18 clc
5cc6: 69 01 adc #$01 ;add one
5cc8: c9 0a cmp #10 ;rolled over?
5cca: 90 09 bcc :Done ;no, done
5ccc: a9 00 lda #$00
5cce: 99 57 00 sta targets_hit,y
5cd1: 88 dey
5cd2: 10 ee bpl :NextDigit
5cd4: 60 rts
5cd5: 99 57 00 :Done sta targets_hit,y
5cd8: 60 rts
5cd9: 00 ff ff 00+ .junk 7
;
; Increments the number of hostile planes hit.
;
5ce0: a0 02 IncPlanesHit ldy #$02 ;3rd digit from left (00x)
5ce2: b9 5a 00 :NextDigit lda planes_hit,y
5ce5: 18 clc
5ce6: 69 01 adc #$01 ;add one
5ce8: c9 0a cmp #10 ;rolled over?
5cea: 90 09 bcc :Done ;no, done
5cec: a9 00 lda #$00
5cee: 99 5a 00 sta planes_hit,y
5cf1: 88 dey
5cf2: 10 ee bpl :NextDigit
5cf4: 60 rts
5cf5: 99 5a 00 :Done sta planes_hit,y
5cf8: 60 rts
5cf9: 00 ff ff 00+ .junk 7
;
; "GAME OVER" message (20x8). Shown in middle of black screen, starting on an
; odd column. Must not cross a page boundary.
5d00: f8 87 c0 81+ game_over .bulk $f8,$87,$c0,$81,$8c,$98,$fc,$9f,$80,$80,$f8,$8f,$8c,$98,$fc,$9f
+ $fc,$8b,$80,$80,$8c,$98,$b0,$86,$bc,$9e,$b0,$98,$80,$80,$8c,$98
+ $8c,$98,$b0,$98,$8c,$98,$80,$80,$8c,$80,$8c,$98,$cc,$99,$b0,$80
+ $80,$80,$8c,$98,$8c,$98,$b0,$80,$8c,$98,$80,$80,$8c,$80,$8c,$98
+ $8c,$98,$f0,$81,$80,$80,$8c,$98,$b0,$86,$f0,$81,$fc,$8b,$80,$80
+ $8c,$9e,$fc,$9f,$8c,$98,$b0,$80,$80,$80,$8c,$98,$b0,$86,$b0,$80
+ $cc,$81,$80,$80,$8c,$98,$8c,$98,$8c,$98,$b0,$98,$80,$80,$8c,$98
+ $c0,$81,$b0,$98,$8c,$86,$80,$80,$f8,$9f,$8c,$98,$8c,$98,$fc,$9f
+ $80,$80,$f8,$8f,$c0,$81,$fc,$9f,$8c,$98,$80,$80,$80,$80,$80,$80
+ $80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80
5da0: 00 00 00 00+ .align $0100 (96 bytes)
;
; "PRESS PUSHBUTTON(0) TO START NEW MISSION" text. (40x8)
5e00: 1e 1e 3e 1c+ press_start_msg .bulk $1e,$1e,$3e,$1c,$1c,$00,$1e,$22,$1c,$22,$1e,$22,$3e,$3e,$1c,$22
+ $08,$1c,$08,$00,$3e,$1c,$00,$1c,$3e,$08,$1e,$3e,$00,$22,$3e,$22
+ $00,$22,$1c,$1c,$1c,$1c,$1c,$22,$24,$22,$24,$22,$22,$00,$24,$22
+ $22,$22,$24,$22,$2a,$2a,$22,$22,$04,$22,$10,$00,$2a,$22,$00,$22
+ $2a,$14,$22,$2a,$00,$22,$24,$22,$00,$36,$08,$22,$22,$08,$22,$22
+ $24,$22,$04,$02,$02,$00,$24,$22,$02,$22,$24,$22,$08,$08,$22,$26
+ $02,$32,$20,$00,$08,$22,$00,$02,$08,$22,$22,$08,$00,$26,$04,$22
+ $00,$2a,$08,$02,$02,$08,$22,$26,$1c,$1e,$0c,$1c,$1c,$00,$1c,$22
+ $1c,$3e,$1c,$22,$08,$08,$22,$2a,$02,$2a,$20,$00,$08,$22,$00,$1c
+ $08,$22,$1e,$08,$00,$2a,$0c,$22,$00,$22,$08,$1c,$1c,$08,$22,$2a
+ $04,$0a,$04,$20,$20,$00,$04,$22,$20,$22,$24,$22,$08,$08,$22,$32
+ $02,$26,$20,$00,$08,$22,$00,$20,$08,$3e,$0a,$08,$00,$32,$04,$2a
+ $00,$22,$08,$20,$20,$08,$22,$32,$04,$12,$24,$22,$22,$00,$04,$22
+ $22,$22,$24,$22,$08,$08,$22,$22,$04,$22,$10,$00,$08,$22,$00,$22
+ $08,$22,$12,$08,$00,$22,$24,$2a,$00,$22,$08,$22,$22,$08,$22,$22
+ $0e,$22,$3e,$1c,$1c,$00,$0e,$1c,$1c,$22,$1e,$1c,$1c,$1c,$1c,$22
+ $08,$1c,$08,$00,$1c,$1c,$00,$1c,$1c,$22,$22,$1c,$00,$22,$3e,$14
+ $00,$22,$1c,$1c,$1c,$1c,$1c,$22,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
5f40: 00 00 00 00+ .junk 16
;
; Draws the "GAME OVER" text, using exclusive-OR instructions. Calling this a
; second time erases the text.
;
• Clear variables
]hptr .var $00 {addr/2}
5f50: a9 00 XdrawGameOver lda #<game_over
5f52: 8d 66 5f sta :_Load+1 ;set low byte to zero
5f55: ea nop
5f56: ea nop
5f57: a2 60 ldx #96 ;line at middle of screen
5f59: bd 00 08 :RowLoop lda hires_addr_hi,x ;get hi-res address
5f5c: 85 01 sta ]hptr+1
5f5e: bd c0 08 lda hires_addr_lo,x
5f61: 85 00 sta ]hptr
5f63: a0 0b ldy #11 ;column 11
5f65: ad a0 5d :_Load lda game_over+160 ;reads from $5d00-5d9f
5f68: 51 00 eor (]hptr),y ;exclusive-OR with screen contents
5f6a: ea nop
5f6b: 91 00 sta (]hptr),y ;store on screen
5f6d: ee 66 5f inc :_Load+1 ;next byte
5f70: c8 iny
5f71: c0 1f cpy #31 ;drawn 20 bytes? (11+20=31)
5f73: 90 f0 bcc :_Load ;not yet, loop
5f75: e8 inx
5f76: e0 68 cpx #104 ;drawn 8 lines? (96+8=104)
5f78: 90 df bcc :RowLoop ;not yet, loop
5f7a: 60 rts
5f7b: 00 00 00 00+ .fill 5,$00
;
; Draws the "press button 0 to start" message at the bottom of the screen.
;
DrawPressStartMsg
5f80: a9 00 lda #<press_start_msg ;init bitmap pointer
5f82: 8d 99 5f sta :_Load+1
5f85: a9 5e lda #>press_start_msg
5f87: 8d 9a 5f sta :_Load+2
5f8a: a2 b8 ldx #184 ;near bottom of screen
5f8c: bd 00 08 :RowLoop lda hires_addr_hi,x ;get hi-res address
5f8f: 85 01 sta ]hptr+1
5f91: bd c0 08 lda hires_addr_lo,x
5f94: 85 00 sta ]hptr
5f96: a0 00 ldy #$00
5f98: ad 40 5f :_Load lda press_start_msg+$140 ;get byte from bitmap
5f9b: 91 00 sta (]hptr),y ;store on hi-res screen
5f9d: ee 99 5f inc :_Load+1 ;advance bitmap pointer
5fa0: d0 03 bne :NoInc
5fa2: ee 9a 5f inc :_Load+2
5fa5: c8 :NoInc iny
5fa6: c0 28 cpy #40 ;finished whole row?
5fa8: 90 ee bcc :_Load ;no, loop
5faa: e8 inx
5fab: e0 c0 cpx #192 ;done?
5fad: 90 dd bcc :RowLoop ;no, loop
5faf: 60 rts
5fb0: 00 00 00 00+ .align $0100 (80 bytes)
;
; Player plane bitmap (9x28, height doubled). Shifted right 7x, two pixels per
; shift to avoid weird color effects.
6000: 00 00 00 00+ phantom_s0 .bulk $00,$00,$00,$00,$00,$00,$00,$00,$00,$80,$80,$c0,$81,$80,$80,$00
+ $00,$00,$80,$80,$c0,$81,$80,$80,$00,$00,$00,$80,$80,$e0,$83,$80
+ $80,$00,$00,$00,$80,$80,$f0,$87,$80,$80,$00,$00,$00,$80,$80,$f8
+ $8f,$80,$80,$00,$00,$00,$80,$80,$bc,$9e,$80,$80,$00,$00,$00,$80
+ $80,$9c,$9c,$80,$80,$00,$00,$00,$80,$80,$fc,$9f,$80,$80,$00,$00
+ $00,$80,$80,$9c,$9c,$80,$80,$00,$00,$00,$80,$80,$fc,$9f,$80,$80
+ $00,$00,$00,$80,$80,$fc,$9f,$80,$80,$00,$00,$00,$80,$80,$fd,$df
+ $80,$80,$00,$00,$00,$80,$c0,$ff,$ff,$81,$80,$00,$00,$00,$80,$f8
+ $fb,$ef,$8f,$80,$00,$00,$00,$8c,$de,$fb,$ef,$bd,$98,$00,$00,$00
+ $ec,$d5,$fb,$ef,$d5,$9b,$00,$00,$00,$bc,$d5,$fb,$ef,$d5,$9e,$00
+ $00,$00,$ac,$d5,$fb,$ef,$d5,$9a,$00,$00,$00,$ac,$d5,$fb,$ef,$d5
+ $9a,$00,$00,$00,$ac,$f5,$ff,$ff,$d3,$9a,$00,$00,$00,$ec,$bf,$fc
+ $9f,$fe,$9b,$00,$00,$00,$bc,$80,$ef,$fb,$80,$9e,$00,$00,$00,$8c
+ $e0,$af,$fb,$83,$98,$00,$00,$00,$80,$f0,$ce,$f9,$86,$80,$00,$00
+ $00,$80,$f0,$87,$f0,$87,$80,$00,$00,$00,$80,$b0,$80,$80,$86,$80
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
60fc: 00 00 00 00 .align $0100 (4 bytes)
6100: 80 80 80 80+ phantom_s1 .bulk $80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$86,$80,$80,$80
+ $80,$80,$80,$80,$80,$86,$80,$80,$80,$80,$80,$80,$80,$80,$8f,$80
+ $80,$80,$80,$80,$80,$80,$c0,$9f,$80,$80,$80,$80,$80,$80,$80,$e0
+ $bf,$80,$80,$80,$80,$80,$80,$80,$f0,$f9,$80,$80,$80,$80,$80,$80
+ $80,$f0,$f0,$80,$80,$80,$80,$80,$80,$80,$f0,$ff,$80,$80,$80,$80
+ $80,$80,$80,$f0,$f0,$80,$80,$80,$80,$80,$80,$80,$f0,$ff,$80,$80
+ $80,$80,$80,$80,$80,$f0,$ff,$80,$80,$80,$80,$80,$80,$80,$f4,$ff
+ $82,$80,$80,$80,$80,$80,$80,$fe,$ff,$87,$80,$80,$80,$80,$80,$e0
+ $ef,$bf,$bf,$80,$80,$80,$80,$b0,$f8,$ee,$bf,$f7,$e1,$80,$80,$80
+ $b0,$d7,$ee,$bf,$d7,$ee,$80,$80,$80,$f0,$d5,$ee,$bf,$d7,$fa,$80
+ $80,$80,$b0,$d5,$ee,$bf,$d7,$ea,$80,$80,$80,$b0,$d5,$ee,$bf,$d7
+ $ea,$80,$80,$80,$b0,$d5,$ff,$ff,$cf,$ea,$80,$80,$80,$b0,$ff,$f1
+ $ff,$f8,$ef,$80,$80,$80,$f0,$81,$bc,$ef,$83,$f8,$80,$80,$80,$b0
+ $80,$bf,$ed,$8f,$e0,$80,$80,$80,$80,$c0,$bb,$e6,$9b,$80,$80,$80
+ $80,$80,$c0,$9f,$c0,$9f,$80,$80,$80,$80,$80,$c0,$81,$80,$98,$80
+ $80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80
61fc: 80 80 80 80 .junk 4
6200: 80 80 80 80+ phantom_s2 .bulk $80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$98,$80,$80,$80
+ $80,$80,$80,$80,$80,$98,$80,$80,$80,$80,$80,$80,$80,$80,$bc,$80
+ $80,$80,$80,$80,$80,$80,$80,$fe,$80,$80,$80,$80,$80,$80,$80,$80
+ $ff,$81,$80,$80,$80,$80,$80,$80,$c0,$e7,$83,$80,$80,$80,$80,$80
+ $80,$c0,$c3,$83,$80,$80,$80,$80,$80,$80,$c0,$ff,$83,$80,$80,$80
+ $80,$80,$80,$c0,$c3,$83,$80,$80,$80,$80,$80,$80,$c0,$ff,$83,$80
+ $80,$80,$80,$80,$80,$c0,$ff,$83,$80,$80,$80,$80,$80,$80,$d0,$ff
+ $8b,$80,$80,$80,$80,$80,$80,$f8,$ff,$9f,$80,$80,$80,$80,$80,$80
+ $bf,$ff,$fd,$81,$80,$80,$80,$c0,$e1,$bb,$ff,$dd,$87,$83,$80,$80
+ $c0,$dd,$ba,$ff,$dd,$ba,$83,$80,$80,$c0,$d7,$ba,$ff,$dd,$ea,$83
+ $80,$80,$c0,$d5,$ba,$ff,$dd,$aa,$83,$80,$80,$c0,$d5,$ba,$ff,$dd
+ $aa,$83,$80,$80,$c0,$d5,$fe,$ff,$bf,$aa,$83,$80,$80,$c0,$fd,$c7
+ $ff,$e3,$bf,$83,$80,$80,$c0,$87,$f0,$bd,$8f,$e0,$83,$80,$80,$c0
+ $81,$fc,$b5,$bf,$80,$83,$80,$80,$80,$80,$ee,$99,$ef,$80,$80,$80
+ $80,$80,$80,$fe,$80,$fe,$80,$80,$80,$80,$80,$80,$86,$80,$e0,$80
+ $80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80
62fc: 80 80 80 80 .junk 4
6300: 80 80 80 80+ phantom_s3 .bulk $80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$e0,$80,$80,$80
+ $80,$80,$80,$80,$80,$e0,$80,$80,$80,$80,$80,$80,$80,$80,$f0,$81
+ $80,$80,$80,$80,$80,$80,$80,$f8,$83,$80,$80,$80,$80,$80,$80,$80
+ $fc,$87,$80,$80,$80,$80,$80,$80,$80,$9e,$8f,$80,$80,$80,$80,$80
+ $80,$80,$8e,$8e,$80,$80,$80,$80,$80,$80,$80,$fe,$8f,$80,$80,$80
+ $80,$80,$80,$80,$8e,$8e,$80,$80,$80,$80,$80,$80,$80,$fe,$8f,$80
+ $80,$80,$80,$80,$80,$80,$fe,$8f,$80,$80,$80,$80,$80,$80,$c0,$fe
+ $af,$80,$80,$80,$80,$80,$80,$e0,$ff,$ff,$80,$80,$80,$80,$80,$80
+ $fc,$fd,$f7,$87,$80,$80,$80,$80,$86,$ef,$fd,$f7,$9e,$8c,$80,$80
+ $80,$f6,$ea,$fd,$f7,$ea,$8d,$80,$80,$80,$de,$ea,$fd,$f7,$aa,$8f
+ $80,$80,$80,$d6,$ea,$fd,$f7,$aa,$8d,$80,$80,$80,$d6,$ea,$fd,$f7
+ $aa,$8d,$80,$80,$80,$d6,$fa,$ff,$ff,$a9,$8d,$80,$80,$80,$f6,$9f
+ $fe,$8f,$ff,$8d,$80,$80,$80,$9e,$c0,$f7,$bd,$80,$8f,$80,$80,$80
+ $86,$f0,$d7,$fd,$81,$8c,$80,$80,$80,$80,$b8,$e7,$bc,$83,$80,$80
+ $80,$80,$80,$f8,$83,$f8,$83,$80,$80,$80,$80,$80,$98,$80,$80,$83
+ $80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80
63fc: 80 80 80 80 .junk 4
6400: 80 80 80 80+ phantom_s4 .bulk $80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$83,$80,$80
+ $80,$80,$80,$80,$80,$80,$83,$80,$80,$80,$80,$80,$80,$80,$c0,$87
+ $80,$80,$80,$80,$80,$80,$80,$e0,$8f,$80,$80,$80,$80,$80,$80,$80
+ $f0,$9f,$80,$80,$80,$80,$80,$80,$80,$f8,$bc,$80,$80,$80,$80,$80
+ $80,$80,$b8,$b8,$80,$80,$80,$80,$80,$80,$80,$f8,$bf,$80,$80,$80
+ $80,$80,$80,$80,$b8,$b8,$80,$80,$80,$80,$80,$80,$80,$f8,$bf,$80
+ $80,$80,$80,$80,$80,$80,$f8,$bf,$80,$80,$80,$80,$80,$80,$80,$fa
+ $bf,$81,$80,$80,$80,$80,$80,$80,$ff,$ff,$83,$80,$80,$80,$80,$80
+ $f0,$f7,$df,$9f,$80,$80,$80,$80,$98,$bc,$f7,$df,$fb,$b0,$80,$80
+ $80,$d8,$ab,$f7,$df,$ab,$b7,$80,$80,$80,$f8,$aa,$f7,$df,$ab,$bd
+ $80,$80,$80,$d8,$aa,$f7,$df,$ab,$b5,$80,$80,$80,$d8,$aa,$f7,$df
+ $ab,$b5,$80,$80,$80,$d8,$ea,$ff,$ff,$a7,$b5,$80,$80,$80,$d8,$ff
+ $f8,$bf,$fc,$b7,$80,$80,$80,$f8,$80,$de,$f7,$81,$bc,$80,$80,$80
+ $98,$c0,$df,$f6,$87,$b0,$80,$80,$80,$80,$e0,$9d,$f3,$8d,$80,$80
+ $80,$80,$80,$e0,$8f,$e0,$8f,$80,$80,$80,$80,$80,$e0,$80,$80,$8c
+ $80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80
64fc: 80 80 80 80 .junk 4
6500: 80 80 80 80+ phantom_s5 .bulk $80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$8c,$80,$80
+ $80,$80,$80,$80,$80,$80,$8c,$80,$80,$80,$80,$80,$80,$80,$80,$9e
+ $80,$80,$80,$80,$80,$80,$80,$80,$bf,$80,$80,$80,$80,$80,$80,$80
+ $c0,$ff,$80,$80,$80,$80,$80,$80,$80,$e0,$f3,$81,$80,$80,$80,$80
+ $80,$80,$e0,$e1,$81,$80,$80,$80,$80,$80,$80,$e0,$ff,$81,$80,$80
+ $80,$80,$80,$80,$e0,$e1,$81,$80,$80,$80,$80,$80,$80,$e0,$ff,$81
+ $80,$80,$80,$80,$80,$80,$e0,$ff,$81,$80,$80,$80,$80,$80,$80,$e8
+ $ff,$85,$80,$80,$80,$80,$80,$80,$fc,$ff,$8f,$80,$80,$80,$80,$80
+ $c0,$df,$ff,$fe,$80,$80,$80,$80,$e0,$f0,$dd,$ff,$ee,$c3,$81,$80
+ $80,$e0,$ae,$dd,$ff,$ae,$dd,$81,$80,$80,$e0,$ab,$dd,$ff,$ae,$f5
+ $81,$80,$80,$e0,$aa,$dd,$ff,$ae,$d5,$81,$80,$80,$e0,$aa,$dd,$ff
+ $ae,$d5,$81,$80,$80,$e0,$aa,$ff,$ff,$9f,$d5,$81,$80,$80,$e0,$fe
+ $e3,$ff,$f1,$df,$81,$80,$80,$e0,$83,$f8,$de,$87,$f0,$81,$80,$80
+ $e0,$80,$fe,$da,$9f,$c0,$81,$80,$80,$80,$80,$f7,$cc,$b7,$80,$80
+ $80,$80,$80,$80,$bf,$80,$bf,$80,$80,$80,$80,$80,$80,$83,$80,$b0
+ $80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80
65fc: 80 80 80 80 .junk 4
6600: 80 80 80 80+ phantom_s6 .bulk $80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$b0,$80,$80
+ $80,$80,$80,$80,$80,$80,$b0,$80,$80,$80,$80,$80,$80,$80,$80,$f8
+ $80,$80,$80,$80,$80,$80,$80,$80,$fc,$81,$80,$80,$80,$80,$80,$80
+ $80,$fe,$83,$80,$80,$80,$80,$80,$80,$80,$cf,$87,$80,$80,$80,$80
+ $80,$80,$80,$87,$87,$80,$80,$80,$80,$80,$80,$80,$ff,$87,$80,$80
+ $80,$80,$80,$80,$80,$87,$87,$80,$80,$80,$80,$80,$80,$80,$ff,$87
+ $80,$80,$80,$80,$80,$80,$80,$ff,$87,$80,$80,$80,$80,$80,$80,$a0
+ $ff,$97,$80,$80,$80,$80,$80,$80,$f0,$ff,$bf,$80,$80,$80,$80,$80
+ $80,$fe,$fe,$fb,$83,$80,$80,$80,$80,$c3,$f7,$fe,$bb,$8f,$86,$80
+ $80,$80,$bb,$f5,$fe,$bb,$f5,$86,$80,$80,$80,$af,$f5,$fe,$bb,$d5
+ $87,$80,$80,$80,$ab,$f5,$fe,$bb,$d5,$86,$80,$80,$80,$ab,$f5,$fe
+ $bb,$d5,$86,$80,$80,$80,$ab,$fd,$ff,$ff,$d4,$86,$80,$80,$80,$fb
+ $8f,$ff,$c7,$ff,$86,$80,$80,$80,$8f,$e0,$fb,$9e,$c0,$87,$80,$80
+ $80,$83,$f8,$eb,$fe,$80,$86,$80,$80,$80,$80,$dc,$b3,$de,$81,$80
+ $80,$80,$80,$80,$fc,$81,$fc,$81,$80,$80,$80,$80,$80,$8c,$80,$c0
+ $81,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80
66fc: 80 80 80 00 .align $0100 (4 bytes)
;
; Bomb explosion sequence (6x18, height doubled).
;
; These are drawn without erasing, with empty bytes (value=$00) being skipped.
; This allows them to blend with the terrain and with each other.
6700: 00 00 00 00+ bomb_expl_0 .bulk $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$90,$00,$00,$00,$00,$00,$00,$88,$82,$00,$00,$00
+ $a0,$88,$00,$00,$00,$00,$b0,$8f,$00,$00,$00,$00,$9c,$bf,$00,$00
+ $00,$00,$f0,$b9,$00,$00,$00,$00,$b4,$83,$00,$00,$00,$00,$00,$a2
+ $00,$00,$00,$00,$c8,$82,$00,$00,$00,$00,$00,$84,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
676c: 00 00 00 00+ bomb_expl_1 .bulk $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$82
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$8c,$90,$00,$00,$00,$80
+ $a8,$98,$00,$00,$00,$c0,$e0,$8f,$00,$00,$00,$c0,$be,$9c,$00,$00
+ $00,$00,$de,$f3,$00,$00,$00,$00,$90,$99,$00,$00,$00,$c0,$f8,$87
+ $00,$00,$00,$00,$bc,$84,$00,$00,$00,$c0,$98,$89,$81,$00,$00,$c0
+ $84,$90,$00,$00,$00,$80,$00,$81,$00,$00,$00,$00,$80,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
67d8: 00 00 00 00+ bomb_expl_2 .bulk $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$90,$88
+ $00,$00,$00,$00,$a8,$84,$00,$00,$00,$c0,$90,$00,$81,$00,$00,$c0
+ $ba,$8c,$84,$00,$00,$00,$f8,$bf,$00,$00,$00,$90,$ff,$b6,$00,$00
+ $00,$80,$af,$f6,$81,$00,$00,$00,$af,$97,$00,$00,$00,$c0,$ef,$df
+ $00,$00,$00,$00,$be,$8b,$82,$00,$00,$d0,$c1,$92,$00,$00,$00,$90
+ $e0,$a0,$81,$00,$00,$00,$88,$a0,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
6844: 00 00 00 00+ bomb_expl_3 .bulk $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$a0,$00
+ $00,$00,$00,$d0,$b0,$84,$00,$00,$00,$c0,$c4,$b0,$8e,$00,$00,$00
+ $f0,$bf,$82,$00,$00,$00,$ff,$fd,$00,$00,$00,$00,$f1,$bb,$00,$00
+ $00,$90,$ef,$f5,$83,$00,$00,$80,$8f,$fd,$81,$00,$00,$a0,$af,$bf
+ $00,$00,$00,$00,$ee,$c5,$89,$00,$00,$00,$9c,$c7,$00,$00,$00,$90
+ $88,$e0,$00,$00,$00,$80,$a1,$c1,$83,$00,$00,$00,$00,$82,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
68b0: 00 00 00 00+ bomb_expl_4 .bulk $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$84,$00,$00,$00,$88,$fc
+ $8a,$00,$00,$a5,$9c,$86,$82,$00,$00,$00,$fc,$ef,$81,$00,$00,$c0
+ $ab,$ff,$81,$00,$00,$fc,$ff,$de,$90,$00,$00,$fc,$cf,$ee,$00,$00
+ $00,$e1,$a7,$cc,$83,$00,$00,$f8,$bd,$fd,$83,$00,$00,$fe,$a9,$ff
+ $83,$00,$00,$e2,$aa,$ff,$a1,$00,$00,$f0,$ff,$8f,$00,$00,$00,$f9
+ $d8,$88,$82,$00,$80,$c1,$98,$86,$82,$00,$a0,$c8,$00,$9e,$80,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
691c: 00 00 00 81+ bomb_expl_5 .bulk $00,$00,$00,$81,$00,$00,$00,$00,$00,$82,$00,$00,$00,$81,$e0,$82
+ $a4,$81,$00,$81,$e2,$86,$a0,$00,$00,$a0,$fe,$f7,$00,$00,$00,$00
+ $ff,$df,$00,$00,$80,$fe,$f7,$fa,$81,$00,$00,$de,$f7,$9f,$a7,$00
+ $00,$90,$e7,$d8,$87,$00,$c0,$b8,$e7,$dd,$83,$00,$00,$d8,$a7,$8d
+ $82,$00,$00,$f8,$a7,$ff,$83,$00,$00,$fd,$bb,$bf,$00,$00,$00,$fc
+ $ff,$8f,$82,$00,$a0,$00,$ab,$9c,$00,$00,$00,$00,$e2,$91,$00,$00
+ $00,$88,$90,$80,$00,$00,$00,$00,$00,$00,$00,$00
6988: 00 00 00 00+ bomb_expl_6 .bulk $00,$00,$00,$00,$00,$00,$00,$00,$8c,$00,$84,$00,$a0,$91,$9c,$86
+ $80,$81,$00,$83,$fe,$c7,$a1,$00,$00,$c0,$fc,$fe,$83,$00,$00,$f8
+ $ff,$fb,$82,$00,$c0,$8f,$97,$9f,$83,$00,$00,$ce,$d7,$f8,$8f,$00
+ $00,$e8,$d7,$fd,$87,$81,$00,$f8,$a7,$b5,$81,$00,$a0,$e8,$a6,$8d
+ $87,$00,$00,$fc,$ae,$fd,$81,$00,$a8,$f8,$ab,$fc,$83,$81,$c8,$e8
+ $fb,$87,$00,$00,$00,$b8,$cf,$91,$84,$00,$a0,$a0,$84,$87,$b0,$81
+ $00,$00,$88,$c4,$00,$81,$00,$00,$00,$c0,$00,$00
69f4: 00 00 00 00+ bomb_expl_7 .bulk $00,$00,$00,$00,$a0,$00,$00,$90,$82,$00,$90,$00,$00,$81,$87,$8f
+ $c1,$00,$00,$00,$ff,$ff,$81,$00,$00,$f0,$fa,$ff,$83,$84,$00,$98
+ $bb,$fd,$be,$00,$00,$cf,$ff,$bf,$b0,$00,$d0,$ff,$b7,$f0,$9f,$00
+ $c0,$ff,$a2,$f4,$ff,$83,$00,$bc,$aa,$f6,$bd,$00,$80,$d1,$ab,$d9
+ $8e,$00,$00,$d8,$8b,$df,$8e,$00,$00,$d8,$eb,$fd,$a3,$00,$90,$f0
+ $ef,$ff,$81,$00,$a0,$f2,$bf,$84,$00,$00,$88,$f0,$c0,$87,$88,$00
+ $88,$f0,$c0,$a6,$00,$00,$00,$00,$00,$00,$00,$00
6a60: 00 84 00 00+ bomb_expl_8 .bulk $00,$84,$00,$00,$00,$00,$a0,$a0,$00,$90,$00,$81,$a0,$00,$fe,$99
+ $00,$00,$80,$c1,$fb,$bf,$82,$00,$a0,$fc,$a9,$e0,$cf,$00,$00,$ef
+ $e0,$fb,$8f,$84,$00,$cf,$89,$ff,$8f,$00,$a0,$ff,$ab,$ff,$8f,$00
+ $00,$ff,$a9,$a5,$87,$00,$90,$8c,$ab,$b3,$9f,$82,$00,$9c,$ee,$b1
+ $96,$00,$90,$9e,$9f,$fc,$97,$00,$00,$c7,$af,$f8,$9f,$00,$00,$cf
+ $ef,$fc,$86,$00,$88,$fe,$f7,$fd,$83,$00,$00,$f8,$9f,$ff,$a0,$00
+ $00,$00,$8f,$81,$00,$00,$00,$00,$00,$00,$00,$00
6acc: 80 00 00 00+ bomb_expl_9 .bulk $80,$00,$00,$00,$00,$00,$90,$00,$e7,$f1,$e0,$00,$82,$f8,$8f,$bf
+ $00,$00,$a8,$ec,$bf,$e4,$84,$00,$80,$c4,$bb,$d5,$8c,$82,$80,$a6
+ $fa,$f4,$98,$00,$88,$ee,$fa,$ff,$90,$00,$c0,$fb,$f8,$cf,$9f,$81
+ $c8,$92,$d2,$cb,$9f,$90,$cc,$d9,$91,$fc,$b1,$00,$fc,$ab,$9c,$ff
+ $a9,$00,$fc,$ff,$fa,$ff,$ae,$00,$f0,$8e,$ea,$c7,$b7,$82,$e0,$ef
+ $ab,$f7,$9f,$00,$82,$b8,$a9,$ff,$83,$00,$80,$f0,$ff,$81,$88,$00
+ $80,$82,$87,$90,$00,$00,$80,$00,$00,$00,$00,$00
6b38: 88 00 f1 b8+ bomb_expl_a .bulk $88,$00,$f1,$b8,$00,$00,$80,$f8,$df,$ff,$e1,$00,$80,$fe,$af,$be
+ $f1,$81,$88,$bf,$a0,$b5,$ff,$83,$88,$fb,$d2,$9e,$fd,$97,$90,$ff
+ $9a,$82,$fe,$87,$c0,$e9,$f0,$df,$f2,$8f,$e2,$ac,$dc,$f7,$e2,$8f
+ $e0,$ab,$cd,$d5,$e3,$8e,$f8,$98,$a7,$d5,$fc,$92,$ec,$dc,$b7,$a5
+ $f8,$82,$bc,$d1,$f7,$f1,$e6,$93,$f4,$97,$df,$fe,$f9,$83,$9c,$96
+ $d0,$df,$ee,$81,$b0,$f4,$be,$d5,$be,$00,$e2,$b9,$b4,$ff,$87,$82
+ $90,$f0,$af,$e3,$81,$00,$80,$e0,$87,$b0,$91,$00
6ba4: 00 00 00 00+ .align $0100 (92 bytes)
;
; Bomb sight bitmap (7x19, height doubled). 7x19 is 133 bytes, but only 128
; bytes are used, so there's some overlap in data.
6c00: 00 00 00 00+ bomb_sight_s0 .bulk $00,$00,$00,$00,$00,$00,$00,$00,$00,$60,$00,$00,$00,$00,$00,$00
+ $60,$00,$00,$00,$00,$00,$00,$7e,$0f,$00,$00,$00,$00,$00,$60,$00
+ $00,$00,$00,$00,$00,$60,$00,$00,$00,$00,$00,$00,$78,$03,$00,$00
+ $00,$40,$01,$60,$00,$60,$00,$00,$40,$61,$60,$40,$61,$00,$00,$7c
+ $7f,$07,$7e,$7f,$07,$00,$40,$61,$60,$40,$61,$00,$00,$40,$01,$60
+ $00,$60,$00,$00,$00,$00,$78,$03,$00,$00,$00,$00,$00,$60,$00,$00
+ $00,$00,$00,$00,$60,$00,$00,$00,$00,$00,$00,$7e,$0f,$00,$00,$00
+ $00,$00,$60,$00,$00,$00,$00,$00,$00,$60,$00,$00,$00,$00,$00,$00
6c80: 80 80 80 80+ bomb_sight_s1 .bulk $80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$83,$80,$80,$80,$80,$80
+ $80,$83,$80,$80,$80,$80,$80,$f8,$bf,$80,$80,$80,$80,$80,$80,$83
+ $80,$80,$80,$80,$80,$80,$83,$80,$80,$80,$80,$80,$e0,$8f,$80,$80
+ $80,$80,$86,$80,$83,$80,$83,$80,$80,$86,$83,$83,$86,$83,$80,$f0
+ $ff,$9f,$f8,$ff,$9f,$80,$80,$86,$83,$83,$86,$83,$80,$80,$86,$80
+ $83,$80,$83,$80,$80,$80,$e0,$8f,$80,$80,$80,$80,$80,$80,$83,$80
+ $80,$80,$80,$80,$80,$83,$80,$80,$80,$80,$80,$f8,$bf,$80,$80,$80
+ $80,$80,$80,$83,$80,$80,$80,$80,$80,$80,$83,$80,$80,$80,$80,$80
6d00: 80 80 80 80+ bomb_sight_s2 .bulk $80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$8c,$80,$80,$80,$80,$80
+ $80,$8c,$80,$80,$80,$80,$80,$e0,$ff,$81,$80,$80,$80,$80,$80,$8c
+ $80,$80,$80,$80,$80,$80,$8c,$80,$80,$80,$80,$80,$80,$bf,$80,$80
+ $80,$80,$98,$80,$8c,$80,$8c,$80,$80,$98,$8c,$8c,$98,$8c,$80,$c0
+ $ff,$ff,$e0,$ff,$ff,$80,$80,$98,$8c,$8c,$98,$8c,$80,$80,$98,$80
+ $8c,$80,$8c,$80,$80,$80,$80,$bf,$80,$80,$80,$80,$80,$80,$8c,$80
+ $80,$80,$80,$80,$80,$8c,$80,$80,$80,$80,$80,$e0,$ff,$81,$80,$80
+ $80,$80,$80,$8c,$80,$80,$80,$80,$80,$80,$8c,$80,$80,$80,$80,$80
6d80: 80 80 80 80+ bomb_sight_s3 .bulk $80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$b0,$80,$80,$80,$80,$80
+ $80,$b0,$80,$80,$80,$80,$80,$80,$ff,$87,$80,$80,$80,$80,$80,$b0
+ $80,$80,$80,$80,$80,$80,$b0,$80,$80,$80,$80,$80,$80,$fc,$81,$80
+ $80,$80,$e0,$80,$b0,$80,$b0,$80,$80,$e0,$b0,$b0,$e0,$b0,$80,$80
+ $fe,$ff,$83,$ff,$ff,$83,$80,$e0,$b0,$b0,$e0,$b0,$80,$80,$e0,$80
+ $b0,$80,$b0,$80,$80,$80,$80,$fc,$81,$80,$80,$80,$80,$80,$b0,$80
+ $80,$80,$80,$80,$80,$b0,$80,$80,$80,$80,$80,$80,$ff,$87,$80,$80
+ $80,$80,$80,$b0,$80,$80,$80,$80,$80,$80,$b0,$80,$80,$80,$80,$80
6e00: 80 80 80 80+ bomb_sight_s4 .bulk $80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$c0,$81,$80,$80,$80,$80
+ $80,$c0,$81,$80,$80,$80,$80,$80,$fc,$9f,$80,$80,$80,$80,$80,$c0
+ $81,$80,$80,$80,$80,$80,$c0,$81,$80,$80,$80,$80,$80,$f0,$87,$80
+ $80,$80,$80,$83,$c0,$81,$c0,$81,$80,$80,$c3,$c1,$81,$c3,$81,$80
+ $f8,$ff,$8f,$fc,$ff,$8f,$80,$80,$c3,$c1,$81,$c3,$81,$80,$80,$83
+ $c0,$81,$c0,$81,$80,$80,$80,$f0,$87,$80,$80,$80,$80,$80,$c0,$81
+ $80,$80,$80,$80,$80,$c0,$81,$80,$80,$80,$80,$80,$fc,$9f,$80,$80
+ $80,$80,$80,$c0,$81,$80,$80,$80,$80,$80,$c0,$81,$80,$80,$80,$80
6e80: 80 80 80 80+ bomb_sight_s5 .bulk $80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$86,$80,$80,$80,$80
+ $80,$80,$86,$80,$80,$80,$80,$80,$f0,$ff,$80,$80,$80,$80,$80,$80
+ $86,$80,$80,$80,$80,$80,$80,$86,$80,$80,$80,$80,$80,$c0,$9f,$80
+ $80,$80,$80,$8c,$80,$86,$80,$86,$80,$80,$8c,$86,$86,$8c,$86,$80
+ $e0,$ff,$bf,$f0,$ff,$bf,$80,$80,$8c,$86,$86,$8c,$86,$80,$80,$8c
+ $80,$86,$80,$86,$80,$80,$80,$c0,$9f,$80,$80,$80,$80,$80,$80,$86
+ $80,$80,$80,$80,$80,$80,$86,$80,$80,$80,$80,$80,$f0,$ff,$80,$80
+ $80,$80,$80,$80,$86,$80,$80,$80,$80,$80,$80,$86,$80,$80,$80,$80
6f00: 80 80 80 80+ bomb_sight_s6 .bulk $80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$98,$80,$80,$80,$80
+ $80,$80,$98,$80,$80,$80,$80,$80,$c0,$ff,$83,$80,$80,$80,$80,$80
+ $98,$80,$80,$80,$80,$80,$80,$98,$80,$80,$80,$80,$80,$80,$fe,$80
+ $80,$80,$80,$b0,$80,$98,$80,$98,$80,$80,$b0,$98,$98,$b0,$98,$80
+ $80,$ff,$ff,$c1,$ff,$ff,$80,$80,$b0,$98,$98,$b0,$98,$80,$80,$b0
+ $80,$98,$80,$98,$80,$80,$80,$80,$fe,$80,$80,$80,$80,$80,$80,$98
+ $80,$80,$80,$80,$80,$80,$98,$80,$80,$80,$80,$80,$c0,$ff,$83,$80
+ $80,$80,$80,$80,$98,$80,$80,$80,$80,$80,$80,$98,$80,$80,$80,$80
+ $00,$00,$00,$00,$00
6f85: 00 00 00 00+ .align $0100 (123 bytes)
;
; Player plane crash sequence (9x28, height doubled).
7000: 00 00 00 00+ player_crash_0 .bulk $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$80,$c0,$81,$80
+ $80,$00,$00,$00,$00,$80,$c0,$81,$80,$80,$00,$00,$00,$00,$80,$e0
+ $83,$80,$80,$00,$00,$00,$00,$80,$f0,$87,$80,$80,$00,$00,$00,$00
+ $80,$f8,$8f,$80,$80,$00,$00,$00,$00,$80,$bc,$9e,$88,$80,$00,$00
+ $00,$00,$80,$9c,$9c,$a0,$80,$00,$00,$00,$00,$80,$fc,$9f,$80,$80
+ $00,$00,$00,$00,$91,$9c,$9c,$80,$80,$00,$00,$00,$00,$80,$fc,$9f
+ $84,$87,$00,$00,$00,$00,$80,$fc,$9f,$80,$80,$00,$00,$00,$00,$84
+ $fd,$df,$90,$82,$00,$00,$00,$00,$c0,$ff,$ff,$89,$88,$00,$00,$00
+ $0c,$f8,$fb,$ef,$8f,$8f,$00,$00,$00,$0c,$de,$fb,$ef,$bd,$98,$00
+ $00,$00,$7c,$d5,$fb,$ef,$d5,$9b,$00,$00,$00,$ac,$d5,$fb,$6b,$fd
+ $9e,$00,$00,$00,$ac,$d5,$fb,$6b,$f8,$da,$00,$00,$00,$ac,$d5,$fb
+ $6b,$d5,$9a,$00,$00,$00,$ac,$f5,$ff,$7b,$d2,$9a,$00,$00,$00,$ec
+ $bf,$fc,$1b,$fc,$9b,$00,$00,$00,$3c,$80,$ef,$7b,$c0,$9e,$00,$00
+ $00,$0c,$e0,$af,$7b,$93,$99,$00,$00,$00,$04,$f0,$ce,$79,$b6,$80
+ $00,$00,$00,$00,$f0,$87,$7a,$87,$80,$00,$00,$00,$00,$b0,$80,$1a
+ $86,$80,$00,$00,$00,$00,$00,$00,$00,$00,$80,$00
70fc: 00 00 00 00 .align $0100 (4 bytes)
7100: 00 00 00 00+ player_crash_1 .bulk $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$60,$00,$00
+ $00,$00,$00,$00,$00,$00,$70,$00,$00,$00,$00,$00,$00,$00,$00,$78
+ $01,$00,$00,$00,$00,$00,$00,$80,$6e,$c3,$80,$00,$00,$00,$00,$00
+ $00,$7f,$03,$00,$00,$00,$00,$00,$00,$00,$47,$03,$00,$00,$00,$00
+ $00,$00,$81,$0f,$03,$a2,$84,$00,$00,$00,$80,$00,$77,$03,$00,$c5
+ $00,$00,$00,$88,$c1,$07,$73,$00,$88,$00,$00,$00,$80,$40,$7f,$3b
+ $ba,$8e,$00,$00,$00,$80,$50,$7f,$e3,$9f,$e3,$00,$00,$00,$00,$78
+ $7f,$a3,$fe,$bb,$00,$00,$00,$00,$3f,$7f,$93,$f0,$80,$00,$00,$40
+ $71,$dd,$eb,$f3,$c8,$fe,$00,$00,$40,$af,$dd,$7f,$92,$c8,$81,$00
+ $00,$40,$ab,$d5,$fb,$d6,$fc,$e9,$00,$00,$40,$ab,$d5,$eb,$96,$f1
+ $8d,$00,$00,$40,$ab,$dd,$ef,$96,$ed,$81,$00,$00,$40,$eb,$ff,$ed
+ $28,$9d,$ec,$00,$00,$40,$7f,$71,$ff,$4d,$ee,$9b,$00,$00,$60,$01
+ $3c,$ff,$78,$ef,$89,$00,$00,$60,$01,$3f,$6f,$61,$f8,$84,$00,$00
+ $00,$40,$3b,$6c,$4d,$e2,$84,$00,$00,$00,$40,$1f,$e7,$19,$90,$00
+ $00,$00,$00,$60,$c0,$c1,$7d,$82,$00,$00,$00,$00,$00,$c0,$81,$4c
+ $00,$00,$00,$00,$00,$00,$00,$88,$00,$00,$00,$00
71fc: 00 00 00 00 .align $0100 (4 bytes)
7200: 00 00 00 00+ player_crash_2 .bulk $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$60,$81,$00
+ $00,$00,$00,$00,$00,$00,$60,$81,$82,$00,$00,$00,$00,$00,$00,$78
+ $81,$00,$00,$00,$00,$00,$80,$81,$de,$83,$00,$00,$00,$00,$00,$00
+ $80,$df,$85,$80,$00,$00,$00,$00,$80,$00,$87,$e7,$80,$80,$00,$00
+ $00,$a0,$84,$8f,$b3,$82,$00,$00,$00,$00,$80,$60,$73,$83,$a4,$80
+ $00,$00,$00,$80,$e1,$9f,$fe,$e0,$85,$00,$00,$00,$00,$68,$df,$79
+ $d7,$83,$00,$00,$00,$81,$7c,$cf,$40,$e3,$81,$00,$00,$10,$c1,$5f
+ $ef,$5d,$ee,$81,$00,$00,$50,$bb,$b5,$d7,$15,$84,$8a,$00,$00,$40
+ $a5,$f7,$eb,$59,$a3,$00,$00,$00,$60,$ad,$f5,$eb,$7d,$ed,$9f,$00
+ $00,$60,$ab,$f5,$c3,$54,$0d,$93,$00,$00,$70,$aa,$f5,$8b,$5d,$cf
+ $81,$00,$00,$70,$f7,$1f,$df,$5c,$ed,$b3,$00,$00,$30,$58,$7f,$ff
+ $7c,$fe,$bb,$00,$00,$00,$70,$77,$ff,$6d,$03,$9e,$00,$00,$00,$30
+ $47,$bf,$45,$c3,$83,$00,$00,$00,$70,$63,$88,$40,$a3,$82,$00,$00
+ $00,$0c,$90,$dc,$70,$82,$00,$00,$00,$00,$00,$98,$f0,$4e,$00,$00
+ $00,$00,$00,$00,$8c,$20,$08,$00,$00,$00,$00,$00,$00,$90,$84,$00
+ $00,$00,$00,$00,$00,$00,$00,$8c,$00,$00,$00,$00
72fc: 00 00 00 00 .align $0100 (4 bytes)
7300: 00 00 00 00+ player_crash_3 .bulk $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$84,$60,$00,$00
+ $00,$00,$00,$00,$00,$00,$78,$00,$00,$00,$00,$00,$00,$a0,$80,$7e
+ $00,$00,$00,$00,$00,$00,$80,$84,$7f,$00,$00,$00,$00,$00,$00,$00
+ $81,$67,$02,$00,$00,$00,$00,$00,$a0,$e1,$47,$02,$92,$00,$00,$00
+ $00,$88,$f0,$79,$82,$00,$00,$00,$00,$00,$00,$f0,$f3,$9a,$80,$00
+ $00,$00,$00,$00,$fc,$b5,$be,$b6,$00,$00,$00,$60,$40,$ff,$b7,$be
+ $81,$80,$00,$00,$30,$5f,$fd,$fe,$fa,$81,$c7,$00,$00,$70,$9b,$f5
+ $7f,$60,$a1,$80,$00,$00,$50,$aa,$f5,$bf,$fc,$e3,$83,$00,$00,$50
+ $9a,$f5,$bb,$fd,$a9,$00,$00,$00,$c4,$bd,$f5,$3b,$fd,$f9,$00,$00
+ $00,$94,$c7,$ed,$3b,$dd,$e1,$83,$00,$00,$90,$7c,$7f,$af,$97,$b8
+ $00,$00,$00,$80,$6c,$7d,$bb,$9d,$82,$00,$00,$00,$90,$7c,$f0,$cf
+ $9d,$be,$00,$00,$00,$80,$a3,$dc,$db,$18,$8c,$00,$00,$00,$00,$b0
+ $c7,$cf,$00,$00,$00,$00,$00,$40,$b2,$d5,$8b,$1e,$e7,$81,$00,$00
+ $50,$a0,$95,$c2,$3a,$84,$80,$00,$00,$50,$be,$87,$c6,$66,$80,$80
+ $00,$00,$00,$84,$00,$80,$1c,$80,$00,$00,$00,$00,$80,$82,$00,$87
+ $00,$00,$00,$00,$00,$88,$88,$00,$83,$00,$00,$00
73fc: 00 00 00 00 .align $0100 (4 bytes)
7400: 00 00 00 00+ player_crash_4 .bulk $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$a0,$00,$00,$00,$00,$00,$00,$00,$00
+ $be,$00,$00,$00,$00,$00,$00,$00,$00,$ff,$00,$00,$00,$00,$00,$00
+ $00,$20,$ef,$a1,$00,$00,$00,$00,$00,$c0,$b8,$a3,$81,$00,$00,$00
+ $00,$88,$00,$bc,$e3,$81,$00,$00,$00,$00,$80,$00,$fe,$d3,$81,$00
+ $00,$00,$00,$00,$00,$fe,$fb,$84,$88,$00,$00,$00,$00,$81,$ff,$b7
+ $80,$00,$00,$00,$00,$84,$fd,$ff,$9b,$b9,$00,$00,$00,$00,$c0,$ef
+ $3d,$8b,$81,$82,$00,$00,$90,$e0,$da,$be,$bf,$db,$80,$00,$00,$00
+ $b5,$da,$b4,$8f,$84,$8e,$00,$00,$a0,$fd,$ff,$92,$cf,$8f,$83,$00
+ $00,$80,$fe,$cf,$92,$cf,$c7,$82,$00,$00,$b4,$f8,$c7,$b4,$da,$aa
+ $88,$00,$00,$f0,$9e,$db,$14,$9b,$ca,$82,$00,$00,$94,$fe,$aa,$de
+ $9f,$8c,$00,$00,$00,$10,$fe,$a3,$b6,$8e,$93,$00,$00,$00,$94,$f4
+ $e7,$17,$b8,$9a,$83,$00,$00,$60,$eb,$c7,$11,$a2,$82,$00,$00,$00
+ $00,$90,$bc,$18,$80,$87,$00,$00,$00,$00,$90,$ad,$09,$c8,$c3,$00
+ $00,$00,$00,$00,$84,$18,$00,$d4,$00,$00,$00,$00,$82,$8c,$00,$00
+ $9c,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
74fc: 00 00 00 00 .align $0100 (4 bytes)
7500: 00 00 00 00+ player_crash_5 .bulk $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$82,$00,$00,$00,$00,$00,$00,$00,$00,$80
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$8e,$82,$00,$00,$00,$00,$00
+ $81,$40,$8f,$00,$00,$00,$00,$00,$00,$84,$5c,$8f,$00,$00,$00,$00
+ $00,$00,$90,$fc,$cf,$e3,$00,$00,$00,$00,$00,$00,$fe,$c6,$b0,$00
+ $00,$00,$00,$82,$c1,$9f,$f7,$00,$00,$00,$00,$00,$c0,$fd,$4f,$dd
+ $87,$00,$00,$00,$00,$e0,$bf,$52,$fc,$e1,$81,$00,$00,$c0,$f2,$88
+ $f8,$fd,$86,$00,$00,$00,$00,$b0,$b0,$bc,$e3,$8f,$00,$00,$00,$00
+ $98,$d0,$01,$bc,$f8,$81,$00,$00,$40,$fb,$c9,$1d,$8c,$81,$00,$00
+ $00,$40,$f9,$89,$5e,$8f,$88,$00,$00,$00,$00,$9e,$8d,$cb,$89,$87
+ $00,$00,$00,$40,$de,$df,$0b,$00,$82,$00,$00,$00,$94,$00,$85,$82
+ $84,$fe,$8f,$00,$00,$00,$cc,$83,$41,$c0,$c3,$81,$00,$00,$00,$85
+ $00,$50,$c3,$cf,$00,$00,$00,$00,$82,$90,$10,$d0,$00,$00,$00,$00
+ $00,$82,$91,$18,$89,$83,$00,$00,$00,$00,$88,$81,$08,$f9,$81,$00
+ $00,$00,$00,$00,$00,$5c,$81,$00,$00,$00,$00,$00,$00,$00,$1c,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
75fc: 00 00 00 00 .align $0100 (4 bytes)
7600: 00 00 00 00+ player_crash_6 .bulk $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$a0,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$80,$00,$00,$00,$00,$00,$00
+ $00,$00,$80,$00,$00,$00,$00,$00,$00,$00,$00,$80,$00,$00,$00,$00
+ $00,$00,$00,$00,$80,$00,$00,$00,$00,$82,$00,$90,$00,$80,$00,$00
+ $00,$00,$00,$00,$9c,$00,$80,$00,$00,$00,$00,$00,$00,$b7,$00,$00
+ $00,$00,$00,$00,$88,$c0,$b1,$00,$00,$00,$00,$00,$00,$00,$c0,$90
+ $87,$00,$00,$00,$00,$00,$00,$e0,$be,$00,$00,$00,$00,$00,$00,$fc
+ $f9,$bf,$87,$00,$00,$00,$00,$80,$ff,$af,$8b,$87,$00,$00,$00,$00
+ $84,$fe,$c3,$ff,$98,$00,$00,$00,$00,$84,$f8,$9d,$9f,$88,$00,$00
+ $00,$00,$00,$ae,$9c,$b2,$00,$00,$00,$00,$00,$00,$82,$ec,$a2,$00
+ $82,$00,$00,$00,$80,$e0,$a7,$00,$90,$80,$00,$00,$00,$90,$b8,$96
+ $00,$00,$00,$00,$00,$00,$80,$b8,$82,$e0,$85,$00,$00,$00,$00,$00
+ $c0,$9b,$c8,$81,$00,$00,$00,$00,$00,$00,$d8,$8a,$00,$00,$00,$00
+ $00,$c0,$b8,$c2,$e0,$85,$00,$00,$00,$00,$00,$c0,$9b,$c0,$81,$00
+ $00,$00,$00,$00,$00,$88,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
76fc: 00 00 00 00 .align $0100 (4 bytes)
7700: 00 00 00 00+ player_crash_7 .bulk $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$a0,$00,$00,$00,$00,$00,$00
+ $80,$00,$00,$00,$00,$00,$00,$00,$00,$80,$c4,$88,$00,$00,$00,$00
+ $00,$00,$00,$00,$80,$00,$00,$00,$00,$00,$90,$a0,$00,$80,$81,$00
+ $00,$00,$00,$00,$80,$de,$a1,$81,$00,$00,$00,$00,$00,$00,$e3,$a1
+ $00,$00,$00,$00,$00,$80,$00,$ff,$9c,$00,$00,$00,$00,$00,$c0,$d6
+ $ef,$a5,$f8,$00,$00,$00,$00,$00,$ce,$e4,$81,$af,$00,$00,$00,$00
+ $f0,$fd,$fe,$c7,$bf,$00,$00,$00,$00,$98,$ff,$df,$00,$00,$00,$00
+ $00,$00,$e8,$db,$dc,$00,$00,$00,$00,$00,$00,$a0,$bc,$8e,$a7,$00
+ $00,$00,$00,$00,$00,$88,$84,$82,$00,$00,$00,$00,$00,$00,$80,$a0
+ $f8,$00,$00,$00,$00,$00,$00,$b0,$82,$fe,$81,$00,$00,$00,$00,$00
+ $c0,$00,$c4,$00,$00,$00,$00,$00,$00,$00,$84,$00,$00,$00,$00,$00
+ $00,$00,$00,$80,$00,$00,$00,$00,$00,$00,$00,$80,$c0,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$84,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
77fc: 00 00 00 00 .junk 4
7800: 00 00 00 00+ player_crash_8 .bulk $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$c0,$82,$80,$82,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$a0,$00,$00,$00,$00
+ $00,$00,$00,$84,$00,$80,$00,$00,$00,$00,$00,$00,$c0,$80,$00,$00
+ $00,$00,$00,$00,$8b,$a1,$88,$00,$00,$00,$00,$00,$00,$cb,$00,$00
+ $00,$00,$00,$00,$00,$00,$fc,$f8,$c3,$80,$00,$00,$00,$00,$82,$f0
+ $c1,$e7,$00,$00,$00,$00,$00,$90,$f8,$8f,$89,$00,$00,$00,$00,$00
+ $f4,$a8,$00,$88,$00,$00,$00,$00,$00,$00,$bd,$00,$00,$00,$00,$00
+ $00,$00,$00,$84,$e1,$a1,$00,$00,$00,$00,$00,$00,$00,$f0,$83,$00
+ $00,$00,$00,$00,$81,$82,$00,$00,$00,$00,$00,$00,$00,$00,$82,$86
+ $c0,$83,$00,$00,$00,$00,$00,$00,$82,$00,$82,$00,$00,$00,$00,$90
+ $88,$00,$00,$00,$00,$00,$00,$00,$84,$00,$00,$84,$00,$00,$00,$00
+ $00,$80,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$90,$00,$00,$00
+ $00,$00,$00,$00,$82,$85,$00,$00,$00,$00,$00,$00,$00,$80,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
78fc: 00 00 00 00 .junk 4
;
; Deadly flak burst sequence (7x23, height doubled).
7900: 00 00 00 00+ flak_burst_0 .bulk $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$c0,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$80,$81,$00,$00,$00,$00
+ $00,$98,$b0,$00,$00,$00,$00,$00,$a2,$9a,$86,$00,$00,$00,$00,$b4
+ $e9,$00,$00,$80,$00,$b0,$8e,$a5,$8b,$00,$00,$00,$00,$f2,$df,$00
+ $00,$00,$00,$08,$f3,$8f,$9b,$00,$00,$00,$88,$fb,$d7,$01,$00,$00
+ $00,$20,$a1,$91,$88,$00,$00,$00,$a0,$bc,$bb,$02,$00,$00,$00,$00
+ $93,$9b,$00,$00,$00,$00,$00,$98,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00
79a1: 00 00 00 00+ flak_burst_1 .bulk $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$81,$00,$00
+ $00,$00,$00,$84,$a2,$00,$00,$00,$00,$00,$88,$a1,$88,$00,$00,$00
+ $a0,$96,$90,$82,$00,$00,$00,$c0,$f0,$89,$c9,$00,$00,$00,$88,$a5
+ $f5,$84,$00,$00,$00,$c0,$a2,$a7,$91,$00,$00,$00,$92,$e0,$a7,$84
+ $81,$00,$00,$c0,$9c,$f9,$82,$00,$00,$00,$a0,$a8,$9c,$88,$00,$00
+ $00,$c4,$80,$c0,$a1,$00,$00,$00,$00,$98,$90,$84,$00,$00,$00,$84
+ $00,$00,$00,$00,$00,$00,$00,$c4,$a0,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00
7a42: 00 00 00 00+ flak_burst_2 .bulk $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$81,$00,$00
+ $00,$00,$00,$82,$00,$81,$00,$00,$00,$00,$00,$a1,$00,$00,$00,$00
+ $00,$84,$90,$a0,$00,$00,$00,$c0,$99,$8f,$86,$00,$00,$00,$85,$a4
+ $87,$00,$86,$00,$00,$90,$88,$b1,$b2,$00,$00,$00,$00,$f5,$c7,$00
+ $00,$00,$c0,$c8,$f6,$8f,$e4,$00,$00,$00,$00,$f8,$8b,$00,$90,$00
+ $00,$00,$b3,$c6,$8a,$00,$00,$00,$94,$b6,$d8,$90,$81,$00,$00,$82
+ $91,$89,$82,$00,$00,$00,$a0,$88,$91,$84,$00,$00,$00,$88,$84,$a0
+ $90,$00,$00,$00,$00,$84,$81,$00,$00,$00,$00,$00,$c0,$c0,$00,$00
+ $00
7ae3: 00 00 00 00+ flak_burst_3 .bulk $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$c1,$00,$84,$00,$00,$00,$00,$84,$c1,$00,$00
+ $00,$00,$00,$84,$a0,$00,$00,$00,$00,$c4,$00,$81,$90,$81,$00,$00
+ $00,$98,$9a,$88,$00,$00,$90,$82,$85,$ba,$00,$90,$00,$00,$e8,$fc
+ $9f,$cc,$82,$00,$00,$00,$dc,$f1,$00,$00,$00,$c0,$91,$e6,$af,$89
+ $a6,$00,$88,$00,$f8,$9d,$00,$00,$00,$00,$c0,$94,$99,$84,$00,$00
+ $00,$84,$f0,$85,$88,$81,$00,$00,$00,$d1,$81,$83,$8a,$00,$00,$81
+ $90,$91,$88,$00,$00,$00,$90,$00,$81,$90,$00,$00,$00,$00,$84,$e0
+ $00,$00,$00,$00,$00,$00,$82,$82,$00,$00,$00,$00,$00,$00,$00,$00
+ $00
7b84: 00 00 00 00+ flak_burst_4 .bulk $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$84,$84,$00,$00,$00,$00,$88,$84,$82,$00
+ $00,$00,$a0,$00,$82,$00,$81,$00,$00,$c0,$90,$c4,$c1,$00,$00,$88
+ $00,$a6,$95,$90,$00,$00,$00,$86,$a0,$bc,$88,$98,$00,$00,$d0,$f0
+ $c8,$e1,$00,$00,$00,$80,$c4,$ed,$86,$00,$00,$b0,$80,$e8,$ef,$00
+ $82,$00,$c0,$b1,$ee,$df,$8c,$d1,$00,$00,$00,$cc,$83,$c6,$00,$00
+ $00,$b0,$d0,$c9,$81,$81,$00,$c0,$81,$c8,$95,$00,$a8,$00,$00,$00
+ $8f,$84,$88,$00,$00,$00,$90,$a2,$c4,$c0,$00,$00,$00,$88,$90,$84
+ $81,$81,$00,$00,$00,$84,$82,$82,$00,$00,$00,$00,$84,$84,$00,$00
+ $00
7c25: 00 00 00 00+ flak_burst_5 .bulk $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$84
+ $84,$00,$00,$00,$a0,$8c,$84,$86,$00,$00,$00,$a0,$90,$88,$82,$84
+ $00,$00,$00,$90,$00,$81,$84,$00,$c0,$00,$a3,$ec,$e0,$00,$00,$00
+ $81,$c0,$b0,$00,$c0,$00,$00,$8c,$c8,$9d,$84,$b4,$00,$00,$90,$c3
+ $df,$b7,$82,$00,$00,$00,$f2,$e2,$81,$00,$00,$e8,$8c,$d9,$cd,$a0
+ $c0,$83,$00,$c0,$db,$d7,$99,$8a,$00,$00,$e0,$b3,$b9,$9c,$00,$00
+ $00,$cc,$c0,$ab,$00,$83,$00,$e8,$00,$a6,$81,$83,$e0,$81,$00,$e0
+ $98,$a2,$88,$00,$00,$00,$00,$00,$00,$a1,$00,$00,$00,$85,$88,$82
+ $81,$85,$00,$00,$00,$84,$00,$9c,$00,$00,$00,$00,$83,$86,$00,$00
+ $00
7cc6: 00 00 00 00+ flak_burst_6 .bulk $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$a0,$a0,$83,$a4,$00
+ $00,$00,$c8,$00,$92,$86,$00,$00,$c0,$85,$86,$82,$82,$ba,$00,$a0
+ $92,$88,$c2,$c0,$81,$00,$00,$ea,$90,$a2,$88,$00,$00,$cc,$83,$81
+ $b2,$84,$c0,$06,$94,$81,$e4,$91,$81,$8e,$00,$87,$a0,$ad,$8b,$98
+ $00,$00,$00,$a0,$f0,$ef,$81,$00,$00,$94,$91,$fa,$b9,$9a,$a5,$01
+ $00,$00,$a4,$c7,$00,$c0,$84,$00,$90,$a9,$88,$86,$f0,$00,$c0,$88
+ $e4,$ea,$c0,$fc,$00,$a0,$c0,$a4,$91,$83,$99,$00,$a0,$a0,$90,$a1
+ $84,$b0,$00,$00,$c4,$90,$a3,$8c,$a0,$00,$00,$c4,$84,$00,$90,$00
+ $00
7d67: 00 00 00 00+ flak_burst_7 .bulk $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$e0,$00
+ $00,$00,$00,$00,$90,$00,$c1,$90,$00,$00,$00,$dc,$e0,$83,$84,$00
+ $00,$90,$87,$82,$00,$87,$00,$00,$88,$90,$84,$83,$00,$91,$00,$00
+ $a0,$b0,$d2,$f1,$00,$00,$98,$00,$a2,$92,$8e,$00,$00,$82,$84,$bc
+ $bf,$d8,$d0,$01,$00,$c0,$f9,$ee,$85,$00,$00,$00,$a2,$cc,$9b,$a4
+ $82,$00,$98,$91,$e6,$9f,$84,$e2,$00,$00,$00,$bd,$f0,$00,$c0,$00
+ $8b,$a4,$84,$97,$c6,$00,$00,$a2,$82,$c4,$00,$81,$8c,$00,$00,$c0
+ $a0,$92,$a5,$88,$00,$c0,$eb,$88,$82,$00,$88,$00,$c0,$85,$88,$a2
+ $9c,$00,$00,$00,$84,$00,$00,$9e,$84,$00,$00,$00,$84,$c2,$00,$00
+ $00
7e08: 00 00 00 00+ .junk 504
;
; Data for drawing the "shot through the windshield" graphic. Essentially a
; compressed full-screen overlay.
;
; Algorithm: set the hi-res pointer to $2000, and start walking through the
; data.
; - If the value is <= 0x7f, it's EORed with the byte at the hi-res pointer.
; The hi-res pointer is incremented.
; - If 0x80 <= value < 0xff, then (value & 0x7f) is added to the hi-res
; pointer.
; - If the value is 0xff, stop: we've reached the end of the list.
8000: ad 02 01 84+ shatter_data .bulk $ad,$02,$01,$84,$02,$83,$30,$31,$02,$10,$82,$20,$81,$40,$55,$2a
+ $05,$1c,$10,$90,$20,$01,$84,$03,$82,$05,$82,$08,$10,$81,$04,$85
+ $10,$86,$02,$b7,$20,$01,$81,$40,$83,$01,$83,$5c,$77,$26,$02,$54
+ $81,$04,$08,$40,$2a,$83,$7b,$22,$7e,$01,$85,$10,$89,$40,$85,$06
+ $87,$04,$81,$10,$87,$14,$86,$28,$90,$40,$02,$85,$02,$83,$08,$87
+ $28,$84,$50,$97,$40,$38,$18,$05,$43,$07,$3c,$83,$55,$0a,$07,$78
+ $81,$03,$06,$28,$01,$8d,$04,$84,$06,$40,$02,$82,$01,$83,$04,$82
+ $02,$88,$01,$86,$20,$01,$8b,$40,$0a,$83,$0a,$85,$02,$40,$86,$28
+ $84,$40,$8b,$10,$89,$40,$2a,$01,$81,$18,$81,$4e,$30,$45,$20,$81
+ $02,$81,$20,$1d,$85,$60,$84,$20,$05,$88,$20,$83,$28,$85,$08,$85
+ $02,$81,$08,$89,$02,$90,$01,$88,$08,$84,$40,$84,$20,$01,$84,$20
+ $8b,$20,$89,$02,$83,$20,$83,$08,$34,$82,$20,$83,$20,$84,$01,$04
+ $86,$01,$86,$02,$05,$87,$04,$87,$01,$8b,$04,$9a,$20,$83,$02,$82
+ $10,$85,$10,$8c,$02,$81,$2a,$86,$01,$83,$15,$82,$40,$01,$20,$04
+ $60,$82,$50,$83,$04,$83,$40,$40,$87,$08,$8c,$40,$83,$10,$85,$40
+ $8c,$08,$9a,$01,$82,$08,$82,$10,$84,$20,$50,$02,$8a,$15,$87,$05
+ $83,$04,$83,$40,$01,$81,$02,$11,$81,$60,$21,$82,$50,$81,$40,$84
+ $08,$0c,$87,$40,$8a,$20,$84,$40,$93,$10,$97,$01,$84,$20,$82,$17
+ $83,$10,$01,$81,$28,$87,$0a,$82,$01,$83,$40,$0a,$84,$40,$85,$03
+ $81,$10,$02,$81,$02,$81,$02,$84,$10,$08,$84,$40,$01,$9e,$04,$8c
+ $08,$b9,$02,$04,$84,$08,$83,$1c,$18,$81,$10,$82,$28,$55,$6a,$01
+ $81,$10,$46,$1f,$86,$02,$89,$20,$85,$01,$81,$20,$01,$83,$10,$81
+ $04,$85,$50,$86,$08,$90,$50,$86,$20,$85,$20,$84,$10,$85,$05,$83
+ $40,$02,$8a,$04,$85,$04,$81,$50,$81,$04,$81,$74,$40,$14,$81,$04
+ $02,$55,$84,$49,$2a,$62,$86,$10,$89,$40,$85,$03,$82,$02,$84,$05
+ $89,$10,$86,$20,$01,$90,$0a,$85,$08,$89,$08,$81,$0a,$84,$14,$98
+ $1a,$58,$0b,$06,$1c,$30,$84,$40,$01,$40,$07,$03,$04,$81,$15,$92
+ $02,$50,$83,$01,$83,$10,$82,$02,$88,$01,$87,$05,$8b,$54,$84,$28
+ $85,$08,$40,$86,$0a,$84,$10,$8b,$04,$89,$54,$0a,$82,$0c,$81,$7c
+ $1a,$83,$02,$82,$05,$85,$40,$85,$54,$8c,$0a,$85,$02,$04,$84,$08
+ $81,$08,$89,$02,$99,$20,$89,$20,$91,$20,$89,$02,$83,$30,$82,$01
+ $08,$60,$83,$01,$87,$04,$0c,$86,$04,$86,$20,$01,$87,$01,$93,$04
+ $9b,$01,$85,$10,$85,$10,$8c,$02,$40,$0a,$86,$01,$82,$40,$83,$60
+ $82,$04,$40,$01,$81,$41,$02,$86,$40,$40,$01,$86,$20,$84,$04,$87
+ $40,$83,$10,$92,$08,$9a,$01,$85,$10,$84,$08,$81,$2a,$89,$20,$15
+ $86,$28,$01,$83,$05,$83,$40,$83,$01,$81,$40,$03,$82,$40,$02,$40
+ $84,$08,$08,$87,$40,$02,$81,$20,$87,$20,$84,$40,$86,$20,$8c,$10
+ $97,$04,$86,$40,$13,$83,$10,$03,$81,$08,$86,$50,$87,$50,$02,$84
+ $10,$84,$40,$01,$84,$02,$81,$02,$84,$40,$08,$85,$03,$89,$02,$94
+ $04,$8c,$20,$b9,$02,$14,$84,$08,$83,$0f,$4e,$81,$11,$82,$02,$82
+ $03,$81,$40,$7f,$1d,$86,$02,$89,$20,$84,$40,$01,$81,$20,$01,$83
+ $10,$81,$04,$85,$40,$02,$85,$20,$90,$40,$02,$85,$20,$85,$20,$89
+ $20,$84,$50,$8b,$50,$85,$14,$81,$45,$02,$10,$81,$5c,$70,$04,$81
+ $44,$2a,$01,$83,$40,$41,$6a,$33,$54,$2a,$55,$2a,$55,$2a,$15,$89
+ $50,$84,$40,$01,$82,$02,$84,$01,$89,$40,$87,$05,$90,$28,$85,$20
+ $89,$08,$40,$85,$05,$98,$2f,$7e,$0e,$06,$10,$10,$84,$70,$82,$7c
+ $01,$0c,$81,$50,$02,$8c,$01,$84,$03,$05,$83,$01,$83,$10,$82,$02
+ $88,$04,$87,$14,$8b,$15,$84,$20,$01,$84,$20,$40,$86,$02,$84,$10
+ $8b,$04,$89,$55,$83,$04,$81,$64,$0c,$10,$82,$02,$82,$14,$85,$40
+ $01,$84,$40,$02,$87,$08,$82,$50,$86,$02,$04,$84,$08,$8b,$08,$9a
+ $01,$88,$08,$85,$08,$8b,$20,$88,$40,$84,$18,$81,$28,$01,$20,$41
+ $01,$82,$01,$83,$01,$83,$04,$08,$86,$14,$85,$40,$89,$01,$87,$04
+ $8b,$10,$9b,$01,$85,$10,$85,$04,$8d,$54,$86,$20,$83,$20,$83,$30
+ $81,$08,$10,$81,$03,$81,$01,$0a,$82,$10,$83,$40,$81,$01,$86,$20
+ $84,$04,$87,$10,$83,$10,$86,$02,$8b,$20,$9a,$01,$85,$10,$84,$08
+ $82,$15,$88,$28,$04,$86,$0a,$84,$01,$83,$60,$81,$40,$20,$83,$0f
+ $83,$0a,$86,$18,$88,$02,$81,$20,$87,$08,$84,$40,$86,$20,$8c,$40
+ $97,$04,$86,$60,$10,$83,$04,$06,$81,$02,$86,$14,$82,$20,$84,$15
+ $85,$10,$84,$60,$82,$44,$82,$02,$81,$02,$01,$84,$02,$85,$08,$89
+ $02,$a1,$20,$ba,$50,$84,$20,$82,$64,$03,$47,$20,$11,$81,$40,$83
+ $06,$81,$6e,$07,$0c,$86,$02,$89,$08,$84,$60,$82,$20,$83,$20,$10
+ $88,$02,$86,$01,$90,$0a,$86,$01,$84,$20,$84,$40,$84,$0a,$84,$14
+ $8b,$40,$02,$10,$83,$50,$20,$01,$0a,$10,$81,$5c,$63,$75,$81,$10
+ $85,$40,$30,$6a,$3b,$05,$8f,$10,$84,$60,$82,$40,$85,$01,$81,$40
+ $88,$02,$86,$14,$90,$2a,$01,$84,$20,$01,$82,$02,$86,$10,$84,$20
+ $01,$97,$50,$07,$16,$26,$13,$81,$14,$81,$05,$82,$18,$82,$40,$81
+ $08,$82,$2a,$8c,$01,$83,$40,$21,$01,$83,$01,$86,$02,$88,$04,$87
+ $50,$8a,$28,$01,$85,$05,$85,$01,$85,$40,$02,$84,$04,$8b,$04,$89
+ $01,$83,$06,$81,$44,$04,$10,$82,$08,$82,$50,$02,$83,$20,$81,$01
+ $85,$02,$87,$08,$82,$14,$85,$40,$81,$04,$84,$08,$8b,$08,$9a,$04
+ $84,$02,$83,$0a,$85,$08,$94,$40,$84,$08,$40,$0a,$81,$20,$01,$03
+ $82,$01,$83,$01,$83,$04,$18,$86,$10,$85,$40,$88,$20,$88,$04,$8b
+ $10,$9b,$01,$82,$08,$82,$10,$85,$04,$8b,$40,$81,$15,$86,$20,$83
+ $08,$83,$18,$81,$08,$10,$81,$07,$81,$01,$08,$82,$10,$85,$01,$87
+ $01,$83,$04,$87,$10,$8a,$02,$8b,$20,$9a,$01,$82,$20,$82,$10,$84
+ $02,$82,$10,$87,$40,$0a,$04,$85,$40,$02,$83,$20,$84,$30,$81,$40
+ $20,$40,$82,$0e,$83,$08,$81,$02,$83,$20,$10,$88,$08,$81,$20,$87
+ $08,$84,$40,$93,$40,$97,$10,$85,$01,$30,$10,$83,$04,$0c,$40,$87
+ $05,$82,$20,$84,$05,$85,$04,$84,$30,$82,$44,$82,$02,$40,$81,$01
+ $84,$2a,$85,$20,$89,$02,$94,$10,$8d,$01,$b9,$40,$02,$83,$20,$82
+ $6c,$41,$15,$28,$01,$81,$10,$83,$0c,$5c,$1d,$81,$06,$85,$40,$8a
+ $08,$84,$30,$82,$20,$83,$20,$10,$88,$08,$86,$04,$90,$20,$86,$01
+ $89,$40,$83,$40,$02,$84,$05,$8c,$28,$10,$83,$40,$2a,$81,$28,$40
+ $81,$56,$23,$47,$07,$50,$0a,$84,$60,$60,$79,$3a,$90,$10,$84,$20
+ $82,$40,$85,$01,$81,$40,$88,$08,$86,$50,$8f,$50,$02,$05,$85,$05
+ $82,$02,$85,$20,$14,$84,$28,$97,$20,$55,$0e,$12,$42,$15,$81,$14
+ $81,$14,$82,$0e,$84,$18,$82,$20,$05,$8b,$01,$83,$60,$0a,$88,$40
+ $8b,$10,$87,$40,$02,$89,$2a,$86,$14,$85,$04,$85,$50,$85,$04,$94
+ $20,$84,$03,$81,$04,$81,$10,$82,$08,$83,$0a,$83,$20,$81,$01,$85
+ $08,$87,$08,$81,$20,$01,$85,$40,$81,$04,$84,$20,$81,$20,$89,$20
+ $9a,$10,$84,$02,$82,$40,$02,$85,$02,$8b,$08,$88,$10,$84,$0c,$54
+ $82,$20,$01,$06,$82,$04,$83,$01,$84,$10,$86,$40,$85,$40,$88,$28
+ $82,$10,$91,$40,$9b,$01,$82,$08,$82,$10,$85,$04,$8b,$40,$20,$01
+ $86,$08,$83,$02,$83,$08,$81,$08,$10,$81,$0e,$82,$20,$82,$10,$84
+ $02,$03,$87,$05,$8b,$04,$8a,$02,$8c,$01,$99,$01,$82,$20,$82,$10
+ $84,$02,$82,$04,$87,$50,$81,$04,$85,$54,$84,$08,$84,$18,$81,$40
+ $81,$40,$82,$1c,$83,$28,$81,$02,$83,$20,$30,$88,$08,$89,$02,$84
+ $40,$87,$01,$a3,$10,$85,$01,$1c,$10,$83,$01,$08,$40,$86,$28,$88
+ $01,$85,$04,$84,$10,$82,$14,$83,$40,$81,$01,$84,$28,$86,$01,$9d
+ $10,$8d,$01,$b3,$50,$83,$40,$82,$02,$83,$20,$82,$2c,$20,$15,$08
+ $05,$81,$04,$82,$20,$55,$77,$4e,$81,$07,$85,$40,$8a,$0a,$84,$18
+ $82,$20,$83,$20,$04,$81,$10,$86,$20,$86,$50,$91,$01,$85,$04,$8d
+ $50,$84,$20,$8d,$20,$11,$84,$02,$81,$20,$41,$81,$57,$6d,$1d,$1c
+ $81,$28,$15,$83,$30,$28,$2b,$0c,$05,$94,$30,$82,$14,$81,$01,$83
+ $01,$81,$40,$88,$08,$86,$40,$02,$8e,$14,$81,$14,$85,$14,$82,$02
+ $85,$20,$05,$84,$0a,$97,$2a,$60,$38,$10,$43,$14,$81,$01,$81,$50
+ $82,$03,$84,$10,$83,$14,$8f,$70,$02,$83,$20,$84,$40,$8b,$10,$88
+ $0a,$88,$50,$02,$86,$50,$85,$10,$85,$10,$85,$01,$8b,$01,$88,$20
+ $84,$01,$81,$04,$02,$83,$08,$83,$28,$81,$20,$55,$2a,$81,$03,$85
+ $28,$89,$28,$86,$10,$81,$04,$84,$20,$81,$20,$89,$20,$9a,$40,$84
+ $02,$82,$40,$86,$02,$8b,$08,$88,$10,$84,$26,$05,$83,$01,$0c,$82
+ $04,$87,$10,$30,$86,$40,$85,$10,$88,$08,$82,$10,$85,$10,$8b,$40
+ $9b,$01,$82,$08,$82,$10,$85,$01,$8b,$40,$2a,$87,$0a,$82,$40,$02
+ $83,$0c,$82,$14,$81,$1c,$20,$82,$01,$86,$02,$02,$87,$04,$83,$01
+ $87,$04,$8a,$08,$8c,$01,$99,$01,$82,$20,$82,$14,$87,$05,$87,$14
+ $87,$15,$84,$0a,$84,$0c,$82,$08,$40,$82,$38,$83,$20,$01,$02,$84
+ $21,$88,$20,$81,$08,$8c,$40,$87,$01,$8c,$02,$96,$40,$85,$01,$0e
+ $10,$83,$01,$18,$10,$86,$0a,$83,$08,$8a,$04,$84,$18,$82,$10,$83
+ $40,$81,$01,$84,$20,$86,$04,$87,$40,$95,$10,$8d,$04,$b3,$40,$02
+ $82,$40,$82,$08,$84,$01,$81,$1c,$20,$04,$02,$04,$81,$01,$81,$40
+ $0a,$58,$06,$7f,$81,$03,$85,$40,$8a,$02,$84,$0c,$82,$28,$83,$20
+ $04,$81,$10,$87,$01,$85,$40,$02,$90,$04,$85,$10,$84,$08,$85,$02
+ $82,$04,$84,$08,$8e,$14,$87,$05,$42,$15,$2e,$71,$70,$01,$81,$54
+ $0a,$82,$78,$0b,$1c,$0c,$52,$8f,$04,$84,$18,$81,$20,$01,$81,$01
+ $83,$04,$81,$40,$88,$20,$87,$0a,$8d,$20,$05,$81,$50,$85,$50,$89
+ $01,$83,$40,$02,$96,$54,$02,$30,$60,$01,$61,$40,$02,$41,$82,$02
+ $60,$01,$84,$30,$83,$40,$02,$89,$20,$84,$1c,$84,$20,$87,$08,$88
+ $40,$88,$28,$88,$55,$87,$40,$02,$84,$40,$85,$04,$85,$01,$8b,$01
+ $88,$08,$83,$40,$01,$82,$02,$04,$82,$20,$83,$20,$55,$2a,$82,$01
+ $02,$85,$20,$87,$02,$40,$02,$86,$10,$81,$04,$84,$20,$81,$20,$8a
+ $01,$9a,$02,$83,$02,$82,$10,$85,$40,$8c,$08,$88,$04,$84,$2a,$83
+ $20,$01,$18,$82,$14,$83,$04,$83,$10,$20,$87,$02,$84,$10,$88,$02
+ $82,$10,$85,$10,$8c,$02,$9a,$01,$82,$08,$82,$10,$85,$01,$8b,$40
+ $0a,$86,$50,$83,$40,$84,$06,$81,$02,$14,$81,$38,$20,$82,$05,$86
+ $02,$06,$87,$10,$83,$01,$87,$01,$8a,$08,$8c,$04,$97,$55,$2a,$01
+ $82,$20,$82,$14,$83,$40,$83,$01,$86,$20,$05,$81,$01,$84,$20,$01
+ $83,$40,$02,$84,$06,$81,$10,$08,$83,$20,$84,$05,$85,$64,$8a,$08
+ $8d,$01,$86,$01,$8c,$02,$91,$08,$84,$40,$85,$01,$0b,$10,$82,$20
+ $81,$30,$04,$83,$40,$2a,$55,$02,$83,$08,$8a,$01,$84,$0c,$82,$01
+ $82,$08,$40,$87,$01,$85,$10,$87,$40,$95,$40,$8d,$04,$b4,$28,$82
+ $40,$82,$20,$84,$01,$81,$34,$08,$44,$02,$81,$20,$81,$20,$15,$81
+ $08,$62,$69,$47,$01,$90,$02,$84,$04,$82,$28,$84,$04,$81,$10,$87
+ $05,$86,$0a,$90,$10,$85,$40,$84,$08,$85,$02,$81,$20,$01,$83,$40
+ $02,$96,$10,$62,$30,$1e,$63,$01,$07,$82,$2a,$15,$28,$0d,$0f,$81
+ $06,$02,$0a,$8e,$04,$84,$0c,$81,$28,$82,$01,$83,$04,$8a,$20,$87
+ $28,$8d,$28,$82,$40,$02,$84,$40,$02,$87,$20,$01,$83,$40,$8b,$10
+ $8a,$20,$15,$81,$10,$81,$43,$31,$44,$2a,$40,$82,$28,$30,$85,$20
+ $84,$2a,$89,$20,$84,$0d,$84,$08,$85,$02,$81,$08,$88,$40,$91,$05
+ $88,$02,$84,$40,$85,$05,$84,$20,$8c,$01,$88,$08,$83,$60,$83,$08
+ $14,$82,$20,$83,$20,$84,$01,$06,$86,$01,$86,$02,$50,$87,$04,$87
+ $01,$8b,$01,$9a,$08,$83,$02,$82,$10,$85,$40,$8e,$28,$86,$04,$83
+ $50,$02,$82,$01,$20,$81,$30,$82,$10,$83,$04,$83,$10,$60,$87,$0a
+ $84,$10,$88,$02,$82,$10,$85,$40,$8c,$02,$9a,$01,$82,$08,$82,$10
+ $84,$20,$05,$8b,$50,$87,$14,$83,$10,$84,$03,$81,$02,$10,$81,$70
+ $20,$82,$14,$81,$40,$84,$08,$04,$87,$10,$83,$01,$87,$01,$8a,$08
+ $8c,$04,$97,$01,$84,$20,$82,$1d,$83,$40,$82,$20,$87,$28,$82,$01
+ $84,$2a,$84,$40,$85,$02,$81,$10,$02,$83,$22,$84,$04,$08,$84,$50
+ $8a,$08,$a1,$08,$91,$22,$85,$02,$84,$61,$03,$10,$82,$20,$81,$60
+ $05,$81,$50,$3a,$15,$86,$08,$8a,$01,$08,$83,$06,$82,$05,$82,$08
+ $40,$87,$04,$85,$40,$9d,$40,$99,$ff
89f9: ff ff ff ff+ .align $0100 (7 bytes)
;
; Start of terrain data. This runs from $8a00 to $bfff, separated into two
; ranges by the file loader. This chunk spans $8a00-afff, with $b000-bfff
; starting at +001c00.
;
; At 40 bytes per line, that gives us 345 lines, just shy of 2x the height of
; the hi-res screen (which loses 8 lines at the top for the status area).
;
8a00: 00 00 00 00+ terrain_data .bulk $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$01,$04,$00,$00,$00,$00,$00,$00
+ $00,$41,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$d5,$aa,$d5,$aa,$10,$41,$20,$10,$08,$04,$02,$41,$00
+ $01,$04,$00,$00,$00,$00,$00,$00,$00,$41,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$91,$a2,$c4,$88,$00
+ $08,$04,$02,$41,$20,$10,$08,$00,$01,$04,$00,$08,$11,$22,$44,$00
+ $00,$41,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$c5,$88,$91,$a2,$00,$41,$20,$10,$08,$04,$02,$41,$00
+ $01,$04,$00,$91,$a2,$c4,$88,$00,$00,$41,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$91,$a2,$c4,$88,$00
+ $08,$04,$02,$41,$20,$10,$08,$00,$01,$04,$00,$08,$11,$22,$44,$00
+ $00,$41,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$c5,$88,$91,$a2,$00,$41,$20,$10,$08,$04,$02,$41,$00
+ $01,$04,$00,$91,$a2,$c4,$88,$00,$00,$41,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$91,$a2,$c4,$88,$00
+ $08,$04,$02,$41,$20,$10,$08,$00,$01,$04,$00,$08,$11,$22,$44,$00
+ $00,$41,$00,$00,$80,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$c5,$88,$91,$a2,$00,$41,$20,$10,$08,$04,$02,$41,$00
+ $01,$04,$00,$91,$a2,$c4,$88,$00,$00,$41,$00,$00,$aa,$d5,$aa,$85
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$91,$a2,$c4,$88,$00
+ $08,$04,$02,$41,$20,$10,$08,$00,$01,$04,$00,$08,$11,$22,$44,$00
+ $00,$41,$00,$00,$8a,$91,$a2,$84,$00,$00,$00,$00,$00,$00,$00,$00
+ $12,$01,$00,$d5,$aa,$d5,$aa,$00,$41,$20,$10,$08,$04,$02,$41,$00
+ $01,$04,$00,$91,$a2,$c4,$88,$00,$00,$41,$00,$00,$a2,$c4,$88,$85
+ $00,$00,$00,$00,$00,$00,$00,$00,$a4,$02,$00,$00,$00,$00,$00,$00
+ $08,$04,$02,$41,$20,$10,$08,$00,$01,$04,$00,$08,$11,$22,$44,$00
+ $00,$41,$00,$00,$8a,$91,$a2,$84,$00,$00,$00,$00,$00,$00,$00,$00
+ $12,$01,$00,$00,$00,$00,$00,$00,$41,$20,$10,$08,$04,$02,$41,$00
+ $01,$04,$00,$00,$00,$00,$00,$00,$00,$41,$00,$00,$a2,$c4,$88,$81
+ $00,$80,$aa,$d5,$aa,$d5,$8a,$00,$a4,$02,$00,$00,$00,$00,$00,$00
+ $08,$04,$02,$41,$20,$10,$08,$00,$01,$04,$00,$00,$00,$00,$00,$00
+ $00,$41,$00,$00,$8a,$0c,$18,$85,$00,$c0,$a2,$c4,$88,$91,$8a,$00
+ $12,$01,$00,$00,$00,$00,$00,$00,$41,$20,$10,$08,$04,$02,$41,$00
+ $01,$04,$00,$00,$00,$00,$00,$00,$00,$41,$00,$00,$a2,$3c,$1e,$81
+ $00,$c0,$8c,$91,$a2,$c4,$82,$00,$a4,$02,$00,$00,$00,$00,$00,$00
+ $08,$04,$02,$41,$20,$10,$08,$00,$01,$04,$00,$00,$00,$00,$00,$00
+ $00,$41,$00,$00,$8a,$4c,$19,$84,$00,$c0,$a8,$d5,$aa,$d5,$88,$00
+ $12,$01,$00,$00,$00,$00,$00,$00,$41,$20,$10,$08,$04,$02,$41,$00
+ $01,$04,$00,$08,$11,$22,$44,$00,$00,$41,$00,$00,$a2,$0c,$18,$81
+ $00,$c0,$88,$00,$00,$c0,$88,$00,$a4,$02,$00,$00,$00,$00,$00,$00
+ $08,$04,$02,$41,$20,$10,$08,$00,$01,$04,$00,$91,$a2,$c4,$88,$00
+ $00,$41,$00,$00,$8a,$0c,$18,$84,$00,$c0,$88,$21,$08,$c2,$88,$00
+ $12,$01,$00,$00,$00,$00,$00,$00,$41,$20,$10,$08,$04,$02,$41,$00
+ $01,$04,$00,$08,$11,$22,$44,$00,$00,$41,$00,$00,$a2,$0c,$18,$81
+ $00,$c0,$88,$04,$21,$c0,$88,$00,$a4,$02,$00,$00,$00,$00,$00,$00
+ $08,$04,$02,$41,$20,$10,$08,$00,$01,$04,$00,$91,$a2,$c4,$88,$00
+ $00,$41,$00,$00,$8a,$0c,$18,$84,$00,$c0,$88,$00,$00,$c0,$88,$00
+ $12,$01,$00,$00,$00,$00,$00,$00,$41,$20,$10,$08,$04,$02,$41,$00
+ $01,$04,$00,$08,$11,$22,$44,$00,$00,$41,$00,$00,$a2,$c5,$88,$81
+ $00,$c0,$a8,$d5,$aa,$d5,$88,$00,$a4,$02,$00,$00,$00,$00,$00,$00
+ $08,$04,$02,$41,$20,$10,$08,$00,$01,$04,$00,$91,$a2,$c4,$88,$00
+ $00,$41,$00,$00,$aa,$91,$a2,$84,$00,$c0,$88,$91,$a2,$c4,$89,$00
+ $12,$01,$00,$00,$00,$00,$00,$00,$41,$20,$10,$08,$04,$02,$41,$00
+ $01,$04,$00,$08,$11,$22,$44,$00,$00,$41,$00,$00,$a2,$c4,$88,$85
+ $01,$c0,$a2,$c4,$88,$d1,$8c,$00,$a4,$02,$00,$ff,$ff,$87,$00,$00
+ $08,$04,$02,$41,$20,$10,$08,$00,$01,$04,$00,$91,$a2,$c4,$88,$00
+ $00,$41,$00,$00,$8a,$91,$a2,$84,$01,$c0,$aa,$d5,$aa,$d5,$8a,$00
+ $12,$01,$00,$81,$00,$84,$00,$00,$41,$20,$10,$08,$04,$02,$41,$00
+ $01,$04,$00,$08,$11,$22,$44,$00,$00,$41,$00,$00,$aa,$c4,$88,$81
+ $01,$00,$00,$00,$00,$00,$00,$00,$24,$02,$00,$f1,$1f,$84,$00,$00
+ $08,$04,$02,$41,$20,$10,$08,$00,$01,$04,$00,$00,$00,$00,$00,$00
+ $00,$41,$00,$00,$aa,$d5,$aa,$85,$01,$00,$00,$00,$00,$00,$00,$00
+ $12,$01,$00,$f9,$3f,$84,$00,$00,$41,$20,$10,$08,$04,$02,$41,$00
+ $01,$04,$00,$00,$00,$00,$00,$00,$00,$41,$00,$00,$00,$00,$00,$00
+ $01,$00,$00,$00,$00,$00,$00,$00,$a4,$02,$00,$fd,$7f,$84,$00,$00
+ $08,$04,$02,$41,$20,$10,$08,$00,$01,$04,$00,$00,$00,$00,$00,$00
+ $00,$41,$00,$00,$00,$00,$00,$00,$01,$00,$00,$00,$00,$00,$00,$00
+ $12,$01,$00,$fd,$7f,$84,$00,$00,$41,$20,$10,$08,$04,$02,$41,$00
+ $01,$04,$00,$00,$00,$00,$00,$00,$00,$41,$00,$00,$00,$00,$00,$00
+ $01,$00,$00,$00,$00,$00,$00,$00,$a4,$02,$00,$fd,$7f,$84,$00,$00
+ $08,$04,$02,$41,$20,$10,$08,$00,$01,$04,$00,$a4,$92,$c9,$a4,$92
+ $00,$41,$00,$08,$11,$22,$a4,$92,$01,$00,$00,$00,$00,$00,$00,$00
+ $12,$01,$00,$f9,$3f,$84,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $01,$04,$00,$12,$49,$24,$12,$49,$00,$41,$00,$22,$44,$08,$12,$49
+ $00,$00,$00,$00,$00,$00,$00,$00,$a4,$02,$00,$f1,$1f,$84,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$01,$04,$00,$a4,$92,$c9,$a4,$92
+ $00,$41,$00,$08,$11,$22,$a4,$92,$00,$00,$00,$00,$00,$00,$00,$00
+ $12,$01,$00,$ff,$ff,$87,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $01,$04,$00,$12,$49,$24,$12,$49,$00,$41,$00,$22,$44,$08,$12,$49
+ $00,$00,$00,$00,$00,$00,$00,$00,$a4,$02,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$01,$04,$00,$a4,$92,$c9,$a4,$92
+ $00,$41,$00,$08,$11,$22,$a4,$92,$00,$00,$00,$00,$00,$00,$00,$00
+ $12,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $01,$04,$00,$12,$49,$24,$12,$49,$00,$41,$00,$22,$44,$08,$12,$49
+ $00,$00,$00,$00,$00,$00,$00,$00,$a4,$02,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$01,$04,$00,$a4,$92,$c9,$a4,$92
+ $00,$41,$00,$08,$11,$22,$a4,$92,$00,$d5,$aa,$d5,$aa,$d5,$82,$00
+ $12,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $01,$04,$00,$12,$49,$24,$12,$49,$00,$41,$00,$22,$44,$08,$12,$49
+ $00,$95,$49,$24,$12,$c9,$82,$00,$a4,$02,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$01,$04,$00,$a4,$92,$c9,$a4,$92
+ $00,$41,$00,$08,$11,$22,$a4,$92,$00,$d1,$0c,$18,$00,$94,$82,$00
+ $12,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $01,$04,$00,$12,$49,$24,$12,$49,$00,$41,$00,$00,$00,$00,$00,$00
+ $00,$c5,$3c,$1e,$80,$c5,$82,$00,$a4,$02,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$01,$04,$00,$a4,$92,$c9,$a4,$92
+ $00,$41,$00,$00,$00,$00,$00,$00,$00,$d5,$4c,$19,$a8,$54,$82,$00
+ $12,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $01,$04,$00,$12,$49,$24,$12,$49,$00,$41,$00,$00,$00,$00,$00,$00
+ $00,$d5,$0c,$18,$8a,$54,$82,$00,$a4,$02,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$01,$04,$00,$a4,$92,$c9,$a4,$92
+ $00,$41,$00,$00,$a4,$92,$c9,$a4,$00,$95,$0c,$18,$a8,$54,$82,$00
+ $12,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $01,$04,$00,$12,$49,$24,$12,$49,$00,$41,$00,$00,$12,$49,$24,$12
+ $00,$c5,$0c,$18,$80,$d5,$82,$00,$a4,$02,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$01,$04,$00,$a4,$92,$c9,$a4,$92
+ $00,$41,$00,$00,$a4,$92,$c9,$a4,$00,$d1,$0c,$18,$00,$94,$82,$00
+ $12,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $01,$04,$00,$12,$49,$24,$12,$49,$00,$41,$00,$00,$12,$49,$24,$12
+ $00,$d5,$aa,$d5,$aa,$d5,$82,$00,$a4,$02,$00,$a2,$c4,$88,$91,$a2
+ $c4,$a3,$c4,$88,$91,$a2,$c4,$88,$01,$04,$20,$d5,$aa,$d5,$aa,$d5
+ $82,$41,$00,$00,$a4,$92,$c9,$a4,$00,$00,$00,$00,$00,$00,$00,$00
+ $12,$01,$00,$88,$91,$a2,$c4,$88,$91,$88,$91,$a2,$c4,$88,$91,$a2
+ $01,$04,$00,$95,$0c,$18,$12,$c9,$82,$41,$00,$00,$12,$49,$24,$12
+ $00,$00,$00,$00,$00,$00,$00,$00,$a4,$02,$00,$a2,$aa,$d5,$aa,$d5
+ $8a,$a2,$aa,$d5,$aa,$d5,$8a,$88,$01,$04,$00,$d1,$3c,$1e,$00,$94
+ $82,$41,$00,$00,$a4,$92,$c9,$a4,$00,$00,$00,$00,$00,$00,$00,$00
+ $12,$01,$00,$88,$a2,$c4,$88,$91,$8a,$88,$a2,$c4,$88,$91,$8a,$a2
+ $01,$04,$00,$c5,$4c,$19,$80,$c5,$82,$41,$00,$00,$12,$49,$24,$12
+ $00,$00,$00,$00,$00,$00,$00,$00,$a4,$02,$00,$a2,$8c,$91,$a2,$c4
+ $82,$a2,$8c,$91,$a2,$c4,$82,$88,$01,$04,$00,$d5,$0c,$18,$a8,$54
+ $82,$41,$00,$00,$a4,$92,$c9,$a4,$00,$00,$00,$00,$00,$00,$00,$00
+ $12,$01,$00,$88,$a8,$d5,$aa,$d5,$88,$88,$a8,$7c,$07,$d5,$88,$a2
+ $01,$04,$00,$d5,$0c,$18,$8a,$54,$82,$41,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$a4,$02,$00,$a2,$88,$00,$00,$c0
+ $88,$a2,$88,$0c,$18,$c0,$88,$88,$01,$04,$00,$95,$0c,$18,$a8,$54
+ $82,$41,$00,$00,$00,$00,$00,$00,$00,$00,$08,$11,$22,$44,$00,$00
+ $12,$01,$00,$88,$88,$21,$08,$c2,$88,$88,$88,$0c,$18,$c2,$88,$a2
+ $01,$04,$00,$c5,$0c,$18,$80,$d5,$82,$41,$00,$00,$a4,$92,$00,$00
+ $00,$00,$22,$44,$08,$11,$00,$00,$a4,$02,$00,$a2,$88,$04,$21,$c0
+ $88,$a2,$88,$7c,$07,$c0,$88,$88,$01,$04,$00,$d1,$00,$00,$00,$94
+ $82,$41,$00,$00,$12,$49,$00,$00,$00,$00,$08,$11,$22,$44,$00,$00
+ $12,$01,$00,$88,$88,$00,$00,$c0,$88,$88,$88,$4c,$01,$c0,$88,$a2
+ $01,$04,$00,$d5,$aa,$d5,$aa,$d5,$82,$41,$00,$00,$a4,$92,$00,$00
+ $00,$00,$22,$44,$08,$11,$00,$00,$a4,$02,$00,$a2,$a8,$d5,$aa,$d5
+ $88,$a2,$a8,$0c,$06,$d5,$88,$88,$01,$04,$00,$a4,$92,$c9,$a4,$00
+ $00,$41,$00,$00,$12,$49,$00,$00,$00,$00,$08,$11,$22,$44,$00,$00
+ $12,$01,$00,$88,$88,$91,$a2,$c4,$89,$88,$88,$0c,$18,$c4,$89,$a2
+ $01,$04,$00,$12,$49,$24,$12,$00,$00,$41,$00,$00,$a4,$92,$00,$00
+ $00,$00,$22,$44,$08,$11,$00,$00,$a4,$02,$00,$a2,$a2,$c4,$88,$d1
+ $8c,$a2,$a2,$c4,$88,$d1,$8c,$88,$01,$04,$00,$a4,$92,$c9,$a4,$00
+ $00,$41,$00,$00,$12,$49,$00,$00,$00,$00,$08,$11,$22,$44,$00,$00
+ $12,$01,$00,$88,$aa,$d5,$aa,$d5,$8a,$88,$aa,$d5,$aa,$d5,$8a,$a2
+ $01,$04,$00,$12,$49,$24,$12,$00,$00,$41,$00,$00,$a4,$92,$00,$00
+ $00,$00,$22,$44,$08,$11,$00,$00,$a4,$02,$00,$a2,$c4,$88,$91,$a2
+ $c4,$a2,$c4,$88,$91,$a2,$c4,$88,$01,$04,$00,$a4,$92,$c9,$a4,$00
+ $00,$41,$00,$00,$12,$49,$00,$00,$00,$00,$08,$11,$22,$44,$00,$00
+ $12,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $01,$04,$00,$12,$49,$24,$12,$00,$00,$41,$00,$00,$a4,$92,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$a4,$02,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$01,$04,$00,$a4,$92,$c9,$a4,$00
+ $00,$41,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $12,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $01,$04,$00,$12,$49,$24,$12,$00,$00,$41,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$a4,$02,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$01,$04,$00,$a4,$92,$c9,$a4,$00
+ $00,$41,$00,$00,$a4,$92,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $12,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $01,$04,$00,$12,$49,$24,$12,$00,$00,$41,$00,$00,$12,$49,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$a4,$02,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$01,$04,$00,$a4,$92,$c9,$a4,$00
+ $00,$41,$00,$00,$a4,$92,$00,$00,$00,$d5,$aa,$d5,$aa,$d5,$82,$00
+ $12,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $01,$04,$00,$12,$49,$24,$12,$00,$00,$41,$00,$00,$12,$49,$00,$00
+ $80,$95,$49,$24,$12,$c9,$82,$00,$a4,$02,$00,$00,$50,$4a,$ff,$ff
+ $ff,$ff,$ff,$ff,$00,$d5,$aa,$85,$01,$04,$00,$a4,$92,$c9,$a4,$00
+ $00,$41,$00,$00,$a4,$92,$00,$00,$81,$d1,$00,$00,$00,$94,$82,$00
+ $12,$01,$00,$00,$08,$00,$81,$80,$80,$80,$80,$f8,$00,$81,$00,$84
+ $01,$04,$00,$12,$49,$24,$12,$00,$10,$41,$00,$00,$12,$49,$00,$00
+ $81,$c5,$82,$00,$80,$c5,$82,$00,$a4,$02,$00,$00,$04,$00,$ff,$ff
+ $bf,$fd,$ff,$fb,$00,$91,$00,$84,$01,$04,$00,$a4,$92,$c9,$a4,$00
+ $00,$00,$00,$00,$a4,$92,$00,$00,$81,$d5,$a8,$00,$a8,$54,$82,$00
+ $12,$01,$00,$00,$02,$00,$ff,$ff,$bf,$fd,$ff,$fb,$00,$81,$3f,$84
+ $01,$04,$00,$12,$49,$24,$12,$00,$00,$00,$00,$00,$12,$49,$00,$00
+ $81,$d5,$a0,$d5,$8a,$54,$82,$00,$a4,$02,$00,$00,$61,$11,$ff,$ff
+ $bf,$fd,$ff,$fb,$00,$91,$41,$84,$01,$04,$00,$a4,$92,$c9,$a4,$00
+ $02,$40,$00,$00,$a4,$92,$00,$00,$81,$95,$a8,$00,$a8,$54,$82,$00
+ $12,$01,$00,$40,$00,$00,$ff,$ff,$ab,$95,$ff,$fb,$00,$81,$41,$84
+ $01,$04,$00,$12,$49,$24,$12,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $81,$c5,$82,$00,$80,$d5,$82,$00,$a4,$02,$00,$20,$60,$11,$ff,$ff
+ $a9,$95,$ff,$fb,$00,$91,$3f,$84,$01,$04,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$81,$d1,$00,$00,$00,$94,$82,$00
+ $12,$01,$00,$60,$00,$00,$ff,$ff,$a9,$95,$ff,$fb,$00,$81,$01,$84
+ $01,$04,$00,$00,$08,$11,$22,$20,$00,$08,$00,$00,$00,$00,$00,$00
+ $81,$d5,$aa,$d5,$aa,$d5,$82,$00,$a4,$02,$00,$40,$61,$11,$ff,$ff
+ $bf,$fd,$ff,$fb,$00,$91,$29,$84,$01,$04,$00,$00,$22,$44,$08,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$81,$00,$00,$00,$00,$00,$00,$00
+ $12,$01,$00,$00,$03,$00,$ff,$ff,$bf,$fd,$ff,$fb,$00,$81,$01,$84
+ $01,$04,$00,$00,$08,$11,$22,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $81,$00,$00,$00,$00,$00,$00,$00,$a4,$02,$00,$00,$66,$11,$ff,$ff
+ $bf,$fd,$ff,$fb,$00,$91,$29,$84,$01,$04,$00,$00,$22,$44,$08,$04
+ $00,$01,$00,$00,$00,$00,$00,$00,$81,$00,$00,$00,$00,$00,$00,$00
+ $12,$01,$00,$00,$0c,$00,$ff,$ff,$ff,$ff,$ff,$bb,$00,$81,$00,$84
+ $01,$04,$00,$00,$08,$11,$22,$00,$00,$00,$64,$08,$11,$22,$44,$08
+ $81,$00,$00,$00,$00,$00,$00,$00,$a4,$02,$00,$00,$58,$0a,$ff,$ff
+ $ff,$ff,$ff,$9b,$00,$d5,$aa,$85,$01,$04,$00,$00,$22,$44,$08,$20
+ $44,$08,$11,$22,$44,$08,$11,$02,$80,$00,$00,$00,$00,$00,$00,$00
+ $12,$01,$00,$00,$20,$05,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $01,$04,$00,$00,$08,$11,$22,$08,$11,$22,$44,$08,$11,$22,$44,$08
+ $82,$00,$00,$00,$00,$00,$00,$00,$a4,$02,$00,$00,$00,$c0,$aa,$d5
+ $aa,$d5,$aa,$d5,$aa,$00,$00,$00,$01,$04,$00,$00,$22,$44,$08,$22
+ $44,$08,$11,$22,$44,$08,$11,$02,$82,$00,$00,$00,$00,$00,$00,$00
+ $12,$01,$00,$00,$00,$d0,$aa,$d5,$aa,$d5,$aa,$d5,$aa,$00,$00,$00
+ $01,$04,$00,$00,$08,$11,$40,$08,$11,$22,$44,$08,$11,$22,$44,$08
+ $82,$00,$00,$00,$00,$00,$00,$00,$a4,$02,$00,$00,$00,$90,$00,$00
+ $00,$00,$00,$00,$a8,$00,$00,$00,$01,$04,$00,$00,$00,$00,$10,$22
+ $44,$08,$11,$22,$44,$08,$11,$02,$82,$00,$00,$00,$00,$00,$00,$00
+ $12,$01,$00,$00,$00,$90,$00,$00,$00,$00,$00,$00,$a8,$00,$00,$00
+ $01,$04,$00,$00,$00,$00,$40,$08,$11,$22,$44,$08,$11,$22,$44,$08
+ $82,$00,$00,$11,$22,$44,$08,$00,$a4,$02,$00,$00,$00,$90,$00,$0c
+ $18,$70,$07,$00,$a8,$00,$00,$00,$01,$04,$00,$00,$00,$00,$10,$22
+ $44,$08,$11,$22,$44,$08,$11,$02,$82,$00,$00,$c4,$88,$91,$82,$00
+ $12,$01,$00,$00,$00,$90,$00,$0c,$18,$0c,$18,$00,$a8,$00,$00,$00
+ $01,$04,$00,$00,$00,$00,$44,$08,$11,$22,$44,$08,$11,$22,$44,$08
+ $82,$00,$00,$11,$22,$44,$08,$00,$a4,$02,$00,$00,$08,$90,$00,$0c
+ $18,$0c,$18,$00,$a8,$00,$00,$00,$01,$04,$00,$00,$00,$00,$11,$22
+ $44,$08,$11,$22,$44,$08,$11,$02,$82,$00,$00,$c4,$88,$91,$82,$00
+ $12,$01,$00,$00,$21,$90,$00,$7c,$1f,$0c,$18,$00,$a8,$00,$00,$00
+ $01,$04,$00,$00,$00,$00,$44,$08,$11,$22,$44,$08,$11,$22,$44,$08
+ $82,$00,$00,$11,$22,$44,$08,$00,$a4,$02,$00,$00,$08,$90,$00,$0c
+ $18,$4c,$19,$00,$a8,$00,$00,$00,$01,$04,$00,$00,$00,$00,$11,$22
+ $44,$40,$12,$22,$44,$08,$11,$02,$82,$00,$00,$c4,$88,$91,$82,$00
+ $12,$01,$00,$00,$21,$90,$00,$0c,$18,$0c,$06,$00,$a8,$00,$00,$00
+ $01,$04,$00,$00,$00,$00,$44,$08,$11,$d4,$aa,$d5,$aa,$d5,$82,$08
+ $82,$00,$00,$11,$22,$44,$08,$00,$a4,$02,$00,$00,$08,$90,$00,$0c
+ $18,$70,$19,$00,$a8,$00,$00,$00,$01,$04,$00,$00,$00,$00,$11,$22
+ $44,$30,$06,$24,$12,$c9,$82,$02,$82,$00,$00,$c4,$88,$91,$82,$00
+ $12,$01,$00,$00,$21,$90,$00,$00,$00,$00,$00,$00,$a8,$00,$00,$00
+ $01,$04,$00,$00,$00,$00,$44,$08,$11,$40,$01,$00,$00,$94,$82,$08
+ $82,$00,$00,$11,$22,$44,$08,$00,$a4,$02,$00,$00,$08,$90,$00,$00
+ $00,$00,$00,$00,$a8,$00,$00,$00,$01,$04,$00,$00,$00,$00,$11,$22
+ $44,$30,$06,$00,$80,$c5,$82,$02,$00,$00,$00,$00,$00,$00,$00,$00
+ $12,$01,$00,$00,$00,$90,$00,$00,$00,$00,$00,$00,$a8,$00,$00,$00
+ $01,$04,$00,$00,$00,$00,$44,$08,$11,$0c,$18,$00,$a8,$54,$82,$08
+ $00,$00,$00,$00,$00,$00,$00,$00,$a4,$02,$00,$00,$00,$d0,$aa,$d5
+ $aa,$d5,$aa,$d5,$8a,$00,$00,$00,$01,$24,$12,$49,$24,$00,$11,$22
+ $44,$0c,$18,$d5,$8a,$54,$82,$02,$00,$00,$00,$00,$00,$00,$00,$00
+ $12,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $01,$00,$00,$00,$00,$02,$44,$08,$11,$00,$00,$00,$a8,$54,$82,$08
+ $00,$00,$00,$00,$00,$00,$00,$00,$a4,$02,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$01,$00,$00,$00,$00,$02,$11,$22
+ $44,$c5,$82,$00,$80,$d5,$82,$02,$00,$00,$00,$00,$00,$00,$00,$00
+ $12,$41,$24,$12,$49,$24,$92,$c9,$a4,$92,$c9,$a4,$92,$c9,$a4,$92
+ $01,$00,$00,$00,$00,$02,$44,$08,$a2,$d1,$00,$00,$00,$94,$82,$08
+ $00,$00,$00,$11,$22,$44,$08,$00,$a4,$02,$00,$00,$00,$00,$80,$80
+ $80,$80,$80,$80,$80,$80,$80,$80,$00,$00,$00,$00,$00,$02,$11,$22
+ $88,$d5,$aa,$d5,$aa,$d5,$82,$02,$00,$00,$00,$c4,$88,$91,$82,$00
+ $12,$01,$00,$00,$00,$00,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80
+ $00,$00,$00,$00,$00,$02,$44,$08,$a2,$22,$44,$08,$11,$22,$44,$08
+ $00,$00,$00,$11,$22,$44,$08,$00,$a4,$02,$00,$00,$00,$00,$80,$80
+ $80,$80,$80,$80,$80,$80,$80,$80,$00,$00,$00,$00,$00,$02,$11,$22
+ $88,$08,$11,$22,$44,$08,$11,$02,$00,$00,$00,$c4,$88,$91,$82,$00
+ $12,$01,$00,$00,$00,$00,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80
+ $00,$00,$00,$00,$00,$02,$44,$08,$a2,$22,$44,$08,$11,$22,$44,$08
+ $00,$00,$00,$11,$22,$44,$08,$00,$a4,$02,$00,$00,$00,$00,$80,$80
+ $80,$80,$80,$80,$80,$80,$80,$80,$00,$00,$00,$00,$00,$02,$11,$22
+ $88,$08,$11,$22,$44,$08,$00,$00,$00,$00,$00,$c4,$88,$91,$82,$00
+ $12,$41,$24,$12,$49,$24,$92,$c9,$a4,$92,$c9,$a4,$92,$c9,$a4,$92
+ $49,$24,$12,$49,$00,$02,$44,$08,$a2,$22,$a2,$c4,$88,$22,$00,$00
+ $00,$00,$00,$11,$22,$44,$08,$00,$a4,$02,$00,$00,$00,$00,$80,$80
+ $80,$80,$80,$80,$80,$80,$80,$80,$00,$00,$00,$40,$00,$02,$11,$22
+ $88,$08,$88,$91,$a2,$08,$00,$00,$00,$00,$00,$c4,$88,$91,$82,$00
+ $12,$01,$00,$00,$00,$00,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80
+ $00,$00,$00,$40,$00,$02,$44,$08,$a2,$22,$a2,$c4,$88,$22,$00,$00
+ $00,$00,$00,$11,$22,$44,$08,$00,$a4,$02,$00,$00,$00,$00,$80,$80
+ $80,$80,$80,$80,$80,$80,$80,$80,$00,$00,$00,$40,$00,$02,$11,$22
+ $44,$08,$88,$91,$a2,$08,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $12,$01,$00,$00,$00,$00,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80
+ $00,$00,$00,$40,$00,$02,$44,$08,$11,$22,$a2,$c4,$88,$22,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$a4,$02,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$40,$00,$02,$11,$22
+ $44,$08,$88,$91,$a2,$08,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $12,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$40,$00,$02,$44,$08,$11,$22,$a2,$c4,$88,$22,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$a4,$c4,$c4,$88,$91,$a2,$c4,$88
+ $91,$80,$00,$00,$00,$00,$00,$00,$00,$00,$00,$40,$00,$02,$11,$22
+ $44,$08,$88,$91,$a2,$08,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $12,$91,$91,$a2,$c4,$88,$91,$a2,$c4,$88,$91,$a2,$c4,$88,$00,$00
+ $00,$00,$00,$40,$00,$02,$44,$08,$11,$22,$a2,$c4,$88,$22,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$a4,$c4,$c4,$88,$91,$a2,$c4,$88
+ $91,$a2,$c4,$88,$91,$a2,$00,$08,$11,$22,$44,$40,$00,$02,$11,$22
+ $44,$08,$11,$22,$44,$08,$11,$02,$00,$00,$00,$00,$00,$00,$00,$00
+ $12,$91,$91,$a2,$c4,$88,$91,$a2,$e4,$88,$91,$a2,$c4,$88,$00,$91
+ $a2,$c4,$88,$40,$00,$02,$44,$08,$11,$22,$44,$08,$11,$22,$44,$08
+ $00,$00,$00,$00,$00,$00,$00,$00,$a4,$c4,$c4,$88,$91,$a2,$c4,$88
+ $91,$a2,$c4,$88,$91,$a2,$00,$08,$11,$22,$44,$40,$00,$02,$11,$22
+ $44,$08,$11,$22,$44,$08,$11,$02,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$91,$91,$a3,$c4,$88,$91,$a2,$c4,$88,$91,$a2,$c4,$88,$00,$91
+ $a2,$c4,$88,$40,$00,$02,$44,$08,$11,$22,$44,$08,$11,$22,$44,$08
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$c4,$c4,$88,$91,$a2,$c4,$88
+ $91,$a2,$c4,$88,$91,$a2,$00,$08,$11,$22,$44,$40,$00,$02,$11,$22
+ $44,$d5,$aa,$d5,$aa,$d5,$82,$02,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$91,$91,$a2,$aa,$d5,$aa,$d5,$8a,$88,$91,$a2,$c4,$88,$00,$91
+ $a2,$c4,$88,$40,$00,$02,$44,$08,$11,$95,$49,$24,$12,$c9,$82,$08
+ $00,$45,$08,$11,$22,$45,$08,$11,$22,$c4,$c4,$88,$a2,$c4,$88,$91
+ $8a,$a2,$c4,$88,$91,$a2,$00,$08,$11,$22,$44,$40,$00,$02,$11,$22
+ $44,$d1,$00,$00,$00,$94,$82,$02,$00,$11,$22,$44,$08,$11,$22,$44
+ $08,$91,$91,$a2,$8c,$91,$a2,$c4,$82,$88,$91,$a2,$c4,$88,$00,$91
+ $a2,$c4,$88,$40,$00,$02,$44,$08,$11,$c5,$82,$00,$80,$c5,$82,$08
+ $00,$44,$08,$11,$22,$44,$08,$11,$22,$c4,$c4,$88,$a8,$d5,$aa,$d5
+ $88,$a2,$c4,$88,$91,$a2,$00,$08,$11,$22,$44,$40,$00,$02,$11,$22
+ $44,$d5,$a8,$00,$a8,$54,$82,$02,$00,$11,$22,$44,$08,$11,$22,$44
+ $08,$91,$91,$a2,$88,$00,$00,$c0,$88,$88,$91,$a2,$c4,$88,$00,$00
+ $00,$00,$00,$40,$00,$02,$44,$08,$11,$d5,$a0,$d5,$8a,$54,$82,$08
+ $00,$44,$08,$11,$22,$44,$08,$11,$22,$c4,$c4,$88,$88,$21,$08,$c2
+ $88,$a2,$c4,$88,$91,$a2,$00,$00,$00,$00,$00,$40,$00,$02,$11,$22
+ $44,$95,$a8,$00,$a8,$54,$82,$02,$00,$11,$22,$44,$08,$11,$22,$44
+ $08,$91,$91,$a2,$88,$04,$21,$c0,$88,$88,$91,$a2,$c4,$88,$00,$00
+ $00,$00,$00,$40,$00,$02,$44,$08,$11,$c5,$82,$00,$80,$d5,$82,$08
+ $00,$44,$08,$11,$22,$44,$08,$11,$22,$c4,$c4,$88,$88,$00,$00,$c0
+ $88,$a2,$c4,$88,$91,$a2,$00,$00,$00,$00,$00,$40,$00,$02,$11,$22
+ $44,$d1,$00,$00,$00,$94,$82,$02,$00,$11,$22,$44,$08,$11,$22,$44
+ $08,$91,$91,$a2,$a8,$d5,$aa,$d5,$88,$88,$91,$a2,$c4,$88,$00,$08
+ $11,$22,$44,$40,$00,$02,$44,$08,$11,$d5,$aa,$d5,$aa,$d5,$82,$08
+ $00,$44,$08,$11,$22,$44,$08,$11,$22,$c4,$c4,$88,$88,$91,$a2,$c4
+ $89,$a2,$c4,$88,$91,$a2,$00,$91,$a2,$c4,$88,$40,$00,$02,$11,$22
+ $44,$08,$11,$22,$44,$08,$11,$02,$00,$11,$22,$44,$08,$11,$22,$44
+ $08,$91,$91,$a2,$a2,$c4,$88,$d1,$8c,$88,$91,$a2,$c4,$88,$00,$08
+ $11,$22,$44,$40,$00,$02,$44,$08,$11,$22,$44,$08,$11,$22,$44,$08
+ $00,$44,$08,$11,$22,$44,$08,$11,$22,$c4,$c4,$88,$aa,$d5,$aa,$d5
+ $8a,$a2,$c4,$88,$91,$a2,$00,$91,$a2,$c4,$88,$40,$00,$02,$11,$22
+ $44,$08,$11,$22,$44,$08,$11,$02,$00,$11,$02,$00,$00,$00,$00,$40
+ $08,$91,$91,$a2,$c4,$88,$91,$a2,$c4,$88,$91,$a2,$c4,$88,$00,$08
+ $11,$22,$44,$40,$00,$02,$44,$08,$11,$22,$44,$08,$11,$22,$44,$08
+ $00,$44,$00,$11,$22,$44,$08,$00,$22,$c4,$c4,$88,$91,$a2,$c4,$88
+ $91,$a2,$c4,$88,$91,$a2,$00,$91,$a2,$c4,$88,$40,$00,$02,$11,$22
+ $44,$08,$11,$22,$44,$08,$11,$02,$00,$11,$02,$44,$08,$11,$02,$44
+ $08,$91,$91,$a2,$c4,$88,$91,$a2,$c4,$88,$91,$a2,$c4,$88,$00,$08
+ $11,$22,$44,$40,$00,$02,$44,$08,$11,$22,$44,$08,$11,$22,$44,$08
+ $00,$44,$00,$10,$22,$44,$00,$01,$22,$c4,$c4,$88,$aa,$d5,$aa,$d5
+ $8a,$a2,$c4,$88,$91,$a2,$00,$91,$a2,$c4,$88,$40,$00,$02,$11,$22
+ $44,$08,$11,$22,$44,$08,$11,$02,$00,$11,$22,$40,$08,$11,$20,$44
+ $08,$91,$91,$a2,$a2,$c4,$88,$91,$8a,$88,$91,$a2,$c4,$88,$00,$08
+ $11,$22,$44,$40,$00,$02,$44,$08,$11,$22,$44,$08,$11,$22,$44,$08
+ $00,$44,$00,$01,$22,$04,$08,$01,$22,$c4,$c4,$88,$8c,$91,$a2,$c4
+ $82,$a2,$c4,$88,$91,$a2,$00,$00,$00,$00,$00,$40,$00,$02,$11,$22
+ $44,$08,$11,$22,$44,$08,$11,$02,$00,$11,$22,$04,$08,$01,$22,$44
+ $08,$91,$91,$a2,$a8,$7d,$07,$d5,$88,$88,$91,$a2,$c4,$88,$00,$00
+ $00,$00,$00,$40,$00,$02,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$44,$00,$11,$20,$40,$08,$01,$22,$c4,$c4,$88,$88,$0c,$18,$c0
+ $88,$a2,$c4,$88,$91,$a2,$00,$00,$00,$00,$00,$40,$00,$02,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$11,$22,$44,$00,$10,$22,$44
+ $08,$91,$91,$a2,$88,$0c,$18,$c2,$88,$88,$91,$a2,$c4,$88,$00,$00
+ $00,$00,$00,$40,$00,$02,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$44,$00,$11,$02,$44,$08,$01,$22,$c4,$c4,$88,$88,$7c,$07,$c0
+ $88,$a2,$c4,$88,$91,$a2,$00,$00,$00,$00,$00,$40,$00,$02,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$11,$22,$44,$00,$10,$22,$44
+ $08,$91,$91,$a2,$88,$4c,$01,$c0,$88,$88,$91,$a2,$c4,$88,$00,$00
+ $00,$00,$00,$40,$00,$02,$00,$00,$00,$00,$00,$00,$01,$04,$00,$00
+ $00,$44,$00,$11,$20,$40,$08,$01,$22,$c4,$c4,$88,$a8,$0c,$06,$d5
+ $88,$a2,$c4,$88,$91,$a2,$00,$00,$00,$00,$00,$40,$00,$02,$00,$00
+ $00,$00,$00,$00,$01,$04,$00,$00,$00,$11,$22,$04,$08,$01,$22,$44
+ $08,$91,$91,$a2,$88,$0c,$18,$c4,$89,$88,$91,$a2,$c4,$88,$00,$00
+ $00,$00,$00,$40,$00,$02,$00,$11,$22,$44,$08,$00,$01,$04,$00,$00
+ $00,$44,$00,$01,$22,$04,$08,$01,$22,$c4,$c4,$88,$a2,$c4,$88,$d1
+ $8c,$a2,$c4,$88,$91,$a2,$00,$00,$00,$00,$00,$40,$00,$02,$00,$c4
+ $88,$91,$82,$00,$01,$04,$00,$00,$00,$11,$22,$40,$08,$11,$20,$44
+ $08,$91,$91,$a2,$aa,$d5,$aa,$d5,$8a,$88,$91,$a2,$c4,$88,$00,$00
+ $00,$00,$00,$40,$00,$02,$00,$11,$22,$44,$08,$00,$01,$04,$00,$00
+ $00,$44,$00,$10,$22,$44,$00,$01,$22,$c4,$c4,$88,$91,$a2,$c4,$80
+ $80,$80,$80,$90,$42,$a2,$00,$00,$00,$00,$00,$40,$00,$02,$00,$c4
+ $88,$91,$82,$00,$01,$04,$00,$00,$00,$11,$02,$44,$08,$11,$02,$44
+ $08,$91,$91,$a2,$c4,$88,$91,$c4,$88,$91,$a2,$d4,$88,$88,$00,$00
+ $00,$00,$00,$40,$00,$02,$00,$11,$22,$44,$08,$00,$01,$04,$00,$00
+ $00,$44,$00,$11,$22,$44,$08,$00,$22,$c4,$c4,$88,$91,$a2,$c4,$91
+ $a2,$c4,$88,$90,$42,$a2,$00,$00,$00,$00,$00,$40,$00,$02,$00,$c4
+ $88,$91,$82,$00,$01,$04,$00,$00,$00,$11,$02,$00,$00,$00,$00,$40
+ $08,$91,$91,$a2,$c4,$88,$91,$c4,$88,$91,$a2,$d4,$88,$88,$00,$00
+ $00,$00,$00,$40,$00,$02,$00,$11,$22,$44,$08,$00,$01,$04,$00,$00
+ $00,$44,$08,$11,$22,$44,$08,$11,$22,$c4,$c4,$88,$91,$a2,$c4,$81
+ $80,$80,$88,$90,$42,$a2,$00,$00,$00,$00,$00,$40,$00,$02,$00,$c4
+ $88,$91,$82,$00,$01,$04,$00,$00,$00,$11,$22,$44,$08,$11,$22,$44
+ $08,$91,$91,$a2,$c4,$88,$91,$c4,$88,$91,$a0,$d4,$88,$88,$00,$00
+ $00,$00,$00,$40,$00,$02,$00,$11,$22,$44,$08,$00,$01,$04,$00,$00
+ $00,$44,$08,$11,$22,$44,$08,$11,$22,$c4,$c4,$88,$91,$a2,$c4,$81
+ $0c,$18,$88,$90,$42,$a2,$00,$00,$00,$00,$00,$40,$00,$02,$00,$c4
+ $88,$91,$82,$00,$01,$04,$00,$00,$00,$11,$22,$44,$08,$11,$22,$44
+ $08,$91,$91,$a2,$c4,$88,$91,$c4,$0c,$18,$a0,$d4,$88,$88,$00,$00
+ $00,$00,$00,$40,$00,$02,$00,$11,$22,$44,$08,$00,$01,$04,$00,$00
+ $00,$44,$08,$11,$22,$44,$08,$11,$22,$c4,$c4,$88,$91,$a2,$c4,$81
+ $30,$06,$88,$90,$42,$a2,$00,$00,$00,$00,$00,$40,$00,$02,$00,$c4
+ $88,$91,$82,$00,$01,$04,$00,$00,$00,$11,$22,$44,$08,$11,$22,$44
+ $08,$91,$91,$a2,$c4,$88,$91,$c4,$40,$01,$a0,$d4,$88,$88,$00,$00
+ $00,$00,$00,$40,$00,$02,$00,$11,$22,$44,$08,$00,$01,$04,$00,$00
+ $00,$44,$08,$11,$22,$44,$08,$11,$22,$c4,$c4,$88,$91,$a2,$c4,$81
+ $30,$06,$88,$90,$42,$a2,$00,$00,$00,$00,$00,$40,$00,$02,$00,$c4
+ $88,$91,$82,$00,$01,$04,$00,$00,$00,$11,$22,$44,$08,$11,$22,$44
+ $08,$91,$91,$a2,$c4,$88,$91,$c4,$0c,$18,$a0,$d4,$88,$88,$00,$00
+ $00,$00,$00,$40,$00,$02,$00,$11,$22,$44,$08,$00,$01,$04,$00,$00
+ $00,$44,$00,$00,$00,$00,$00,$00,$22,$c4,$c4,$88,$91,$a2,$c4,$81
+ $0c,$18,$88,$90,$42,$a2,$00,$00,$00,$00,$00,$40,$00,$02,$00,$c4
+ $88,$91,$82,$00,$01,$04,$00,$00,$00,$11,$22,$44,$08,$11,$22,$44
+ $08,$91,$91,$a2,$c4,$88,$91,$c4,$88,$91,$a0,$d4,$88,$88,$00,$00
+ $00,$00,$00,$40,$00,$02,$00,$11,$22,$44,$08,$00,$01,$04,$00,$00
+ $00,$44,$08,$11,$22,$44,$08,$11,$22,$c4,$c4,$88,$91,$a2,$c4,$81
+ $a2,$c4,$88,$90,$42,$a2,$00,$00,$00,$00,$00,$40,$00,$02,$00,$c4
+ $88,$91,$82,$00,$01,$04,$00,$00,$00,$11,$22,$44,$08,$11,$22,$44
+ $08,$91,$91,$a2,$c4,$88,$91,$84,$80,$80,$a0,$d4,$88,$88,$00,$00
+ $00,$00,$00,$40,$00,$02,$00,$00,$00,$00,$00,$00,$01,$04,$00,$00
+ $00,$44,$08,$11,$22,$44,$08,$11,$22,$c4,$c4,$88,$91,$a2,$c4,$91
+ $a2,$c4,$88,$90,$42,$a2,$00,$00,$00,$00,$00,$40,$00,$02,$00,$00
+ $00,$00,$00,$00,$01,$04,$00,$00,$00,$11,$22,$44,$08,$11,$22,$44
+ $08,$91,$91,$a2,$c4,$88,$91,$c4,$88,$91,$a2,$d4,$88,$88,$00,$00
+ $00,$00,$00,$40,$00,$02,$00,$00,$00,$40,$00,$00,$01,$04,$00,$00
+ $00,$44,$08,$11,$22,$44,$08,$11,$22,$c4,$c4,$88,$91,$a2,$c4,$91
+ $a2,$c4,$88,$90,$91,$a2,$00,$00,$00,$00,$00,$40,$00,$02,$00,$00
+ $00,$41,$00,$00,$01,$04,$00,$00,$00,$11,$22,$44,$08,$11,$22,$44
+ $08,$91,$91,$a2,$c4,$88,$91,$a2,$c4,$88,$91,$a2,$c4,$88,$00,$00
+ $00,$00,$00,$40,$00,$02,$00,$00,$00,$41,$00,$00,$01,$04,$00,$00
+ $00,$44,$08,$11,$22,$44,$08,$11,$22,$c4,$c4,$88,$91,$a2,$c4,$88
+ $91,$a2,$c4,$88,$91,$a2,$00,$00,$00,$00,$00,$40,$00,$02,$00,$00
+ $00,$41,$00,$00,$01,$04,$00,$00,$00,$11,$02,$00,$00,$00,$00,$40
+ $08,$91,$91,$a2,$c4,$88,$91,$a2,$84,$80,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$40,$00,$02,$00,$00,$00,$41,$00,$00,$01,$04,$00,$00
+ $00,$44,$08,$11,$22,$44,$08,$11,$22,$80,$80,$80,$80,$80,$80,$80
+ $80,$80,$00,$00,$00,$00,$00,$20,$10,$08,$04,$42,$41,$02,$00,$00
+ $00,$41,$00,$00,$01,$04,$00,$00,$00,$11,$22,$44,$08,$11,$22,$44
+ $08,$80,$80,$80,$80,$80,$80,$80,$80,$80,$00,$00,$00,$00,$00,$04
+ $02,$41,$20,$10,$08,$00,$00,$00,$00,$41,$00,$00,$01,$04,$00,$00
+ $00,$44,$08,$11,$22,$44,$08,$11,$22,$80,$80,$80,$80,$80,$80,$80
+ $80,$80,$00,$00,$00,$00,$00,$20,$10,$08,$04,$02,$41,$00,$00,$00
+ $00,$41,$00,$00,$01,$04,$00,$00,$00,$11,$22,$44,$08,$11,$22,$44
+ $08,$80,$80,$80,$80,$80,$80,$80,$80,$80,$00,$00,$00,$00,$00,$04
+ $02,$41,$20,$10,$08,$00,$00,$00,$00,$41,$00,$00,$01,$04,$00,$00
+ $00,$44,$08,$11,$22,$44,$08,$11,$22,$80,$80,$80,$80,$80,$80,$80
+ $80,$80,$00,$00,$00,$00,$00,$20,$10,$08,$04,$02,$41,$00,$00,$00
+ $00,$41,$00,$00,$01,$04,$00,$00,$00,$11,$22,$44,$08,$11,$22,$44
+ $08,$80,$80,$80,$80,$80,$80,$80,$80,$80,$00,$00,$00,$00,$00,$04
+ $02,$41,$20,$10,$08,$00,$00,$00,$00,$41,$00,$00,$01,$04,$00,$00
+ $00,$44,$08,$11,$22,$44,$08,$11,$22,$80,$80,$80,$80,$80,$80,$80
+ $80,$80,$00,$00,$00,$00,$00,$20,$10,$08,$04,$02,$41,$00,$00,$00
+ $00,$41,$00,$00,$01,$04,$00,$00,$00,$11,$22,$44,$08,$11,$22,$44
+ $08,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$04
+ $02,$41,$20,$10,$08,$00,$00,$00,$00,$41,$00,$00,$01,$04,$00,$00
+ $00,$44,$08,$11,$22,$44,$08,$11,$22,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$20,$10,$08,$04,$02,$41,$00,$00,$00
+ $00,$41,$00,$00,$01,$04,$00,$00,$00,$a3,$c4,$88,$91,$a2,$c4,$88
+ $08,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$04
+ $02,$41,$20,$10,$08,$00,$00,$00,$00,$41,$00,$00,$01,$04,$00,$00
+ $00,$88,$91,$a2,$c4,$88,$91,$a2,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$20,$10,$08,$04,$02,$41,$00,$00,$00
+ $00,$41,$00,$00,$01,$04,$00,$00,$00,$a2,$aa,$d5,$aa,$d5,$8a,$88
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$04
+ $02,$41,$20,$10,$08,$00,$00,$00,$00,$41,$00,$00,$01,$04,$00,$00
+ $00,$88,$a2,$c4,$88,$91,$8a,$a2,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$20,$10,$08,$04,$02,$41,$00,$00,$00
+ $00,$41,$00,$00,$01,$04,$00,$00,$00,$a2,$8c,$91,$a2,$c4,$82,$88
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$04
+ $02,$41,$20,$10,$08,$00,$00,$00,$00,$41,$00,$00,$01,$04,$00,$00
+ $00,$88,$a8,$7c,$07,$d5,$88,$a2,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$20,$10,$08,$04,$02,$41,$00,$00,$00
+ $00,$41,$00,$00,$01,$04,$00,$00,$00,$a2,$88,$0c,$18,$c0,$88,$88
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$04
+ $02,$41,$20,$10,$08,$00,$00,$00,$00,$41,$00,$00,$01,$04,$00,$00
+ $00,$88,$88,$0c,$18,$c2,$88,$a2,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$20,$10,$08,$04,$02,$41,$00,$00,$00
+ $00,$41,$00,$00,$01,$04,$00,$00,$00,$a2,$88,$7c,$07,$c0,$88,$88
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$04
+ $02,$41,$20,$10,$08,$00,$00,$00,$00,$41,$00,$00,$01,$04,$00,$00
+ $00,$88,$88,$4c,$01,$c0,$88,$a2,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$20,$10,$08,$04,$02,$41,$00,$00,$00
+ $00,$41,$00,$00,$01,$04,$00,$00,$00,$a2,$a8,$0c,$06,$d5,$88,$88
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$04
+ $02,$41,$20,$10,$08,$00,$00,$00,$00,$41,$00,$00,$01,$04,$00,$00
+ $00,$88,$88,$0c,$18,$c4,$89,$a2,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$01,$00,$00,$00,$00,$00,$00,$00
+ $00,$41,$00,$00,$00,$00,$00,$00,$00,$a2,$a2,$c4,$88,$d1,$8c,$88
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $01,$04,$00,$00,$00,$00,$00,$00,$00,$41,$00,$00,$00,$00,$00,$00
+ $00,$88,$aa,$d5,$aa,$d5,$8a,$a2,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$01,$04,$00,$00,$00,$00,$00,$00
+ $00,$41,$00,$00,$00,$00,$00,$00,$00,$a2,$c4,$88,$91,$a2,$c4,$88
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $01,$04,$00,$00,$00,$00,$00,$00,$00,$41,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$01,$04,$00,$00,$00,$00,$00,$00
+ $00,$41,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $01,$04,$00,$00,$00,$00,$00,$00,$00,$41,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$01,$04,$00,$00,$00,$00,$00,$00
+ $00,$41,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$10,$00,$00,$00,$00,$00,$00,$00,$00
+ $01,$04,$00,$00,$00,$00,$00,$00,$00,$41,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$01,$04,$00,$08,$11,$22,$44,$00
+ $00,$41,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$20,$45,$22,$51,$28,$14,$0a
+ $01,$04,$00,$91,$a2,$c4,$88,$00,$00,$41,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$20,$00,$00,$00,$00,$00,$00,$01,$04,$00,$08,$11,$22,$44,$00
+ $00,$41,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$08,$00,$00,$00,$00,$00,$00
+ $01,$04,$00,$91,$a2,$c4,$88,$00,$00,$41,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$08,$00,$00,$00,$00,$00,$00,$01,$04,$00,$08,$11,$22,$44,$00
+ $00,$41,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$02,$00,$00,$00,$00,$00,$00
+ $01,$04,$00,$91,$a2,$c4,$88,$00,$00,$41,$00,$00,$d5,$aa,$d5,$aa
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$02,$00,$00,$00,$00,$00,$00,$01,$04,$00,$08,$11,$22,$44,$00
+ $00,$41,$00,$00,$89,$91,$a2,$a4,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$40,$00,$00,$00,$00,$00,$00,$00
+ $01,$04,$00,$91,$a2,$c4,$88,$00,$00,$41,$00,$00,$a3,$c4,$88,$b1
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $40,$00,$00,$00,$00,$00,$00,$00,$01,$04,$00,$08,$11,$22,$44,$00
+ $00,$41,$00,$00,$89,$91,$a2,$a4,$00,$00,$00,$00,$00,$00,$00,$00
+ $12,$01,$00,$00,$00,$00,$00,$00,$10,$00,$00,$00,$00,$00,$00,$00
+ $01,$04,$00,$00,$00,$00,$00,$00,$00,$41,$00,$00,$a3,$c4,$88,$b1
+ $00,$00,$00,$28,$45,$22,$51,$28,$14,$0a,$45,$22,$51,$08,$00,$00
+ $14,$00,$45,$22,$51,$28,$14,$2a,$01,$04,$00,$00,$00,$00,$00,$00
+ $00,$41,$00,$00,$89,$00,$00,$a4,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$08,$00,$00,$04,$20,$00,$00,$00,$00,$00,$00
+ $01,$04,$00,$00,$00,$00,$00,$00,$00,$41,$00,$00,$a3,$7c,$07,$b1
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$08,$00,$00
+ $05,$08,$00,$00,$00,$00,$00,$00,$01,$04,$00,$00,$00,$00,$00,$00
+ $00,$41,$00,$00,$89,$30,$18,$a4,$10,$04,$21,$08,$d2,$aa,$d5,$aa
+ $d5,$aa,$00,$00,$00,$08,$00,$00,$01,$48,$20,$10,$08,$04,$01,$01
+ $01,$04,$00,$08,$11,$22,$44,$00,$00,$41,$00,$00,$a3,$30,$18,$b1
+ $00,$00,$00,$00,$90,$00,$40,$01,$00,$a0,$00,$00,$00,$08,$00,$20
+ $01,$02,$00,$00,$00,$00,$00,$00,$01,$04,$00,$91,$a2,$c4,$88,$00
+ $00,$41,$00,$00,$89,$70,$07,$a4,$00,$00,$00,$00,$84,$00,$30,$06
+ $00,$88,$00,$00,$00,$08,$00,$20,$00,$02,$00,$00,$00,$00,$00,$00
+ $01,$04,$00,$08,$11,$22,$44,$00,$00,$41,$00,$00,$a3,$30,$02,$b1
+ $00,$00,$00,$00,$84,$00,$0c,$18,$00,$88,$00,$00,$00,$00,$00,$28
+ $40,$00,$02,$41,$20,$10,$08,$04,$01,$04,$00,$91,$a2,$c4,$88,$00
+ $00,$41,$00,$00,$89,$30,$0c,$a4,$00,$00,$00,$00,$84,$00,$0c,$18
+ $00,$88,$00,$00,$00,$08,$00,$08,$40,$00,$00,$00,$00,$00,$00,$00
+ $01,$04,$00,$08,$11,$22,$44,$00,$00,$41,$00,$00,$a3,$7c,$31,$b1
+ $00,$21,$08,$02,$81,$00,$7c,$1f,$08,$c2,$10,$00,$00,$08,$00,$02
+ $10,$00,$00,$00,$00,$00,$00,$00,$01,$04,$00,$91,$a2,$c4,$88,$00
+ $00,$49,$11,$22,$89,$91,$a2,$a4,$00,$00,$00,$00,$81,$00,$0c,$18
+ $00,$82,$00,$00,$00,$08,$40,$02,$14,$40,$20,$10,$08,$04,$01,$01
+ $01,$04,$00,$08,$11,$22,$44,$00,$00,$41,$00,$00,$a3,$c4,$88,$b1
+ $00,$00,$00,$80,$81,$00,$0c,$18,$00,$82,$00,$00,$00,$0a,$40,$00
+ $04,$00,$00,$00,$00,$00,$00,$00,$01,$04,$00,$91,$a2,$c4,$88,$00
+ $10,$41,$00,$00,$89,$91,$a2,$a4,$00,$00,$00,$b0,$00,$00,$00,$00
+ $c0,$80,$00,$00,$00,$02,$50,$00,$01,$00,$00,$00,$00,$00,$00,$00
+ $01,$04,$00,$08,$11,$22,$44,$20,$00,$41,$00,$00,$a3,$c4,$88,$b1
+ $00,$00,$00,$a0,$d5,$aa,$d5,$aa,$d5,$00,$00,$00,$c0,$00,$10,$00
+ $01,$00,$00,$00,$00,$15,$2a,$20,$11,$0c,$04,$02,$41,$10,$04,$01
+ $00,$43,$08,$04,$d5,$aa,$d5,$aa,$00,$00,$00,$40,$40,$10,$04,$21
+ $08,$42,$10,$00,$c0,$00,$14,$20,$00,$00,$00,$00,$2a,$00,$00,$00
+ $01,$04,$00,$00,$00,$00,$00,$00,$00,$41,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$90,$00,$04,$20
+ $00,$00,$00,$50,$00,$40,$22,$20,$11,$0c,$04,$02,$41,$20,$10,$08
+ $04,$41,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$10,$00,$05,$08,$00,$41,$00,$05,$20,$11,$00,$00
+ $01,$04,$00,$00,$00,$00,$00,$00,$00,$41,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$04,$00,$01,$08
+ $00,$00,$20,$00,$0a,$00,$00,$00,$01,$04,$00,$a4,$92,$c9,$a4,$92
+ $00,$41,$00,$08,$11,$22,$a4,$92,$00,$00,$00,$00,$00,$00,$49,$00
+ $00,$00,$00,$00,$01,$20,$00,$02,$00,$00,$08,$50,$00,$00,$00,$00
+ $01,$04,$00,$12,$49,$24,$12,$49,$00,$41,$00,$22,$44,$08,$12,$49
+ $00,$02,$08,$40,$00,$02,$00,$00,$00,$80,$00,$80,$01,$28,$40,$00
+ $00,$40,$02,$05,$00,$00,$00,$00,$01,$04,$00,$a4,$92,$c9,$a4,$92
+ $00,$41,$00,$08,$11,$22,$a4,$92,$00,$00,$00,$00,$00,$00,$48,$24
+ $c0,$88,$00,$a0,$00,$08,$40,$00,$00,$10,$20,$00,$00,$00,$00,$00
+ $01,$04,$00,$12,$49,$24,$12,$49,$00,$41,$00,$22,$44,$08,$12,$49
+ $00,$00,$00,$00,$00,$00,$00,$00,$90,$00,$00,$a0,$00,$0a,$10,$00
+ $00,$04,$08,$00,$00,$00,$00,$00,$01,$04,$00,$a4,$92,$c9,$a4,$92
+ $00,$41,$00,$08,$11,$22,$a4,$92,$00,$00,$00,$00,$00,$20,$12,$00
+ $90,$00,$00,$08,$00,$02,$10,$00,$02,$41,$02,$00,$00,$00,$00,$00
+ $01,$04,$00,$12,$49,$24,$12,$49,$00,$41,$00,$22,$44,$08,$12,$49
+ $00,$00,$00,$00,$00,$00,$00,$00,$84,$08,$00,$0a,$40,$02,$04,$00
+ $20,$10,$00,$00,$00,$00,$00,$00,$01,$04,$00,$a4,$92,$c9,$a4,$92
+ $00,$41,$00,$08,$11,$22,$a4,$92,$00,$00,$00,$00,$00,$00,$00,$00
+ $84,$00,$00,$02,$40,$00,$04,$00,$08,$04,$00,$00,$00,$00,$00,$00
+ $01,$04,$00,$12,$49,$24,$12,$49,$00,$41,$00,$22,$44,$08,$12,$49
+ $00,$00,$00,$00,$00,$00,$00,$00,$81,$00,$c0,$00,$10,$00,$01,$00
+ $00,$01,$00,$00,$00,$00,$00,$00,$01,$04,$00,$a4,$92,$c9,$a4,$92
+ $00,$41,$00,$08,$11,$22,$a4,$92,$00,$00,$00,$00,$00,$10,$49,$80
+ $81,$08,$c0,$00,$10,$20,$01,$00,$22,$01,$00,$00,$00,$00,$00,$00
+ $01,$04,$00,$12,$49,$24,$12,$49,$00,$41,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$a0,$00,$00,$90,$00,$04,$20,$80,$40
+ $08,$00,$00,$00,$00,$00,$00,$00,$01,$04,$00,$a4,$92,$c9,$a4,$92
+ $00,$41,$00,$00,$00,$00,$00,$00,$00,$02,$08,$40,$00,$00,$00,$a0
+ $00,$00,$10,$00,$05,$08,$80,$10,$00,$00,$00,$00,$00,$00,$00,$00
+ $01,$04,$00,$12,$49,$24,$12,$49,$00,$41,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$00,$00,$88,$10,$08,$04,$00,$01,$28,$80,$00
+ $02,$00,$00,$00,$00,$00,$00,$00,$01,$04,$00,$a4,$92,$c9,$a4,$92
+ $00,$41,$00,$00,$a4,$92,$c9,$a4,$00,$00,$00,$00,$00,$00,$00,$88
+ $00,$00,$01,$20,$01,$0a,$80,$44,$00,$00,$00,$00,$00,$00,$00,$00
+ $01,$04,$00,$12,$49,$24,$12,$49,$00,$41,$00,$00,$12,$49,$24,$12
+ $00,$00,$00,$00,$48,$04,$00,$82,$00,$80,$01,$20,$00,$22,$84,$01
+ $00,$00,$00,$00,$00,$00,$00,$00,$01,$04,$00,$a4,$92,$c9,$a4,$92
+ $00,$41,$00,$00,$a4,$92,$c9,$a4,$00,$00,$00,$00,$20,$12,$c1,$82
+ $10,$a0,$00,$28,$40,$08,$8c,$10,$00,$00,$00,$00,$00,$00,$00,$00
+ $01,$04,$00,$12,$49,$24,$12,$49,$00,$41,$00,$00,$12,$49,$24,$12
+ $00,$00,$00,$00,$12,$01,$c0,$00,$00,$a0,$00,$08,$40,$00,$b8,$04
+ $00,$00,$00,$00,$00,$00,$00,$00,$01,$04,$00,$d5,$aa,$d5,$aa,$d5
+ $8a,$41,$00,$00,$a4,$92,$c9,$a4,$00,$00,$00,$00,$00,$00,$90,$00
+ $00,$08,$00,$02,$10,$00,$b8,$04,$00,$00,$00,$00,$00,$00,$00,$00
+ $01,$04,$00,$85,$00,$01,$00,$00,$8a,$41,$00,$00,$12,$49,$24,$12
+ $00,$00,$00,$00,$00,$00,$90,$04,$10,$0a,$00,$02,$04,$00,$e8,$01
+ $00,$00,$a8,$d5,$aa,$d5,$8a,$00,$01,$04,$00,$95,$00,$7c,$07,$c0
+ $8a,$41,$00,$00,$a4,$92,$c9,$a4,$00,$00,$00,$00,$00,$00,$84,$00
+ $00,$02,$40,$00,$44,$00,$c2,$81,$00,$00,$aa,$d5,$aa,$d5,$8a,$00
+ $01,$04,$00,$d5,$00,$30,$18,$d0,$8a,$41,$00,$00,$12,$49,$24,$12
+ $00,$02,$08,$00,$00,$00,$84,$00,$c0,$00,$50,$00,$11,$20,$22,$83
+ $00,$00,$82,$0c,$18,$00,$8a,$00,$01,$04,$00,$95,$a2,$30,$18,$d1
+ $8a,$41,$00,$00,$a4,$92,$c9,$a4,$00,$00,$00,$40,$24,$02,$81,$04
+ $c0,$00,$10,$00,$05,$40,$00,$82,$00,$00,$82,$3c,$1e,$00,$8a,$00
+ $01,$04,$00,$95,$a2,$70,$07,$d1,$8a,$41,$00,$00,$00,$00,$00,$00
+ $00,$00,$00,$00,$00,$80,$81,$00,$90,$00,$14,$20,$01,$60,$08,$00
+ $00,$00,$82,$4c,$19,$00,$8a,$00,$01,$04,$00,$d5,$80,$30,$18,$d0
+ $8a,$41,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$a0,$00,$00