5B00: Data block at 5B00
5B00 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5B08 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5B10 DEFB $00
5B11: Object records, 20 bytes wide
Enemy/object slots. +$00/$01 X/Y (current), +$02/$03 sprite frame/page (current), +$04/$05 X/Y (target), +$06/$07 sprite frame/page (next), +$08/$09/$0A clip bounds, +$0B flags (bit 2 flip, bit 4 wall-solid, bit 5 draw-active), +$11 AI delay timer, +$12 AI state. See 5BDA for the player's own instance and docs/Object-Record.md for the full field writeup.
5B11 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00
5B1B DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00
5B25 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00
5B2F DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00
5B39 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00
5B43 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00
5B4D DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00
5B57 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00
5B61 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00
5B6B DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00
5B75 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00
5B7F DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00
5B89 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00
5B93 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00
5B9D DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00
5BA7 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00
5BB1 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00
5BBB DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00
5BC5 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00
5BCF DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00
5BD9: Data block at 5BD9
5BD9 DEFB $00 ?? = $90
Player's object record
5BDA DEFB $00 Starting column = $10
5BDB DEFB $00 Pixels down screen start point = $40
5BDC DEFB $00 Sprite frame index (+$02) = $02
5BDD DEFB $00
5BDE DEFB $00 Target/new column (+$04)
5BDF DEFB $00 Target/new row (+$05)
5BE0 DEFB $00,$00,$00,$00
5BE4 DEFB $00 Y-axis clip bound (+$0A) = $0A
5BE5 DEFB $00 Flags (+$0B): bit 2 sprite flip, bit 5 draw-active, see 9922 = $30
5BE6 DEFB $00 Sub-state/type byte (+$0C), context-dependent, see 806B and 82C1
5BE7 DEFB $00,$00,$00,$00
5BEB DEFB $00 Action delay timer (+$11), see EB13
5BEC DEFB $00,$00
5BEE DEFB $00 ?? = $90
5BEF DEFB $00,$00,$00,$00,$00,$00,$00,$00
5BF7 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5BFF DEFB $00,$FF,$E0,$00,$00,$3C,$E1,$1C
5C07 DEFB $0D,$0D,$23,$05,$00,$00,$00,$00
5C0F DEFB $00,$01,$00,$06,$00,$0B,$00,$01
5C17 DEFB $00,$01,$00,$06,$00,$10,$00,$00
5C1F DEFB $00,$00,$00,$00,$00,$00,$00,$00
5C27 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5C2F DEFB $00,$00,$00,$00,$00,$00,$00,$00
5C37 DEFB $3C,$40,$00,$FF,$CD,$00,$A5,$61
5C3F DEFB $00,$00,$00,$00,$00,$FF,$FE,$FF
5C47 DEFB $07,$38,$00,$00,$CB,$5C,$00,$00
5C4F DEFB $B6,$5C,$BB,$5C,$CB,$5C,$15,$5D
5C57 DEFB $CA,$5C,$CC,$5C,$0E,$5D,$14,$5D
5C5F DEFB $00,$00,$16,$5D,$16,$5D,$16,$5D
5C67 DEFB $2D,$92,$5C,$00,$02,$00,$00,$00
5C6F DEFB $00,$00,$00,$00,$00,$B6,$1A,$00
5C77 DEFB $00,$A8,$25,$00,$58,$FF,$00,$00
5C7F DEFB $21,$00,$5B,$21,$17,$C0,$40,$E0
5C87 DEFB $50,$21,$12,$21,$17,$03,$38,$00
5C8F DEFB $38,$00,$00,$00,$00,$00,$00,$00
5C97 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5C9F DEFB $00,$00,$00,$00,$00,$00,$00,$00
5CA7 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5CAF DEFB $00,$00,$00,$A8,$61,$FF,$FF,$F4
5CB7 DEFB $09,$A8,$10,$4B,$F4,$09,$C4,$15
5CBF DEFB $53,$81,$0F,$C4,$15,$52,$F4,$09
5CC7 DEFB $C4,$15,$50,$80,$80,$FD,$32,$35
5CCF DEFB $30,$30,$30,$0E,$00,$00,$A8,$61
5CD7 DEFB $00,$3A,$EF,$22,$22,$AF,$3A,$EF
5CDF DEFB $22,$22,$AF,$3A,$EF,$22,$22,$AA
5CE7 DEFB $3A,$F4,$33,$30,$30,$35,$32,$0E
5CEF DEFB $00,$00,$64,$75,$00,$2C,$33,$31
5CF7 DEFB $0E,$00,$00,$1F,$00,$00,$3A,$F2
5CFF DEFB $30,$0E,$00,$00,$00,$00,$00,$3A
5D07 DEFB $F9,$C0,$32,$35,$33,$34,$34,$0E
5D0F DEFB $00,$00,$00,$63,$00,$0D,$80,$00
5D17 DEFB $00,$00,$63,$00,$00,$00,$1F,$00
5D1F DEFB $00,$20,$00,$1B,$00,$40,$00,$00
5D27 DEFB $03,$AA,$20,$20,$20,$20,$20,$20
5D2F DEFB $20,$20,$20,$00,$1B,$40,$9C,$00
5D37 DEFB $80,$AA,$E5,$5C,$00,$00,$20,$00
5D3F DEFB $00,$00,$00,$00,$00,$00,$00,$00
5D47 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5D4F DEFB $00,$00,$00,$00,$00,$00,$00,$00
5D57 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5D5F DEFB $00,$00,$00,$00,$00,$00,$00,$00
5D67 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5D6F DEFB $00,$00,$00,$00,$00,$00,$00,$00
5D77 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5D7F DEFB $00,$00,$00,$00,$00,$00,$00,$00
5D87 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5D8F DEFB $00,$00,$00,$00,$00,$00,$00,$00
5D97 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5D9F DEFB $00,$00,$00,$00,$00,$00,$00,$00
5DA7 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5DAF DEFB $00,$00,$00,$00,$00,$00,$00,$00
5DB7 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5DBF DEFB $00,$00,$00,$00,$00,$00,$00,$00
5DC7 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5DCF DEFB $00,$00,$00,$00,$00,$00,$00,$00
5DD7 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5DDF DEFB $00,$00,$00,$00,$00,$00,$00,$00
5DE7 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5DEF DEFB $00,$00,$00,$00,$00,$00,$00,$00
5DF7 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5DFF DEFB $00,$00,$00,$00,$00,$00,$00,$00
5E07 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5E0F DEFB $00,$00,$00,$00,$00,$00,$00,$00
5E17 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5E1F DEFB $00,$00,$00,$00,$00,$00,$00,$00
5E27 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5E2F DEFB $00,$00,$00,$00,$00,$00,$00,$00
5E37 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5E3F DEFB $00,$00,$00,$00,$00,$00,$00,$00
5E47 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5E4F DEFB $00,$00,$00,$00,$00,$00,$00,$00
5E57 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5E5F DEFB $00,$00,$00,$00,$00,$00,$00,$00
5E67 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5E6F DEFB $00,$00,$00,$00,$00,$00,$00,$00
5E77 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5E7F DEFB $00,$00,$00,$00,$00,$00,$00,$00
5E87 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5E8F DEFB $00,$00,$00,$00,$00,$00,$00,$00
5E97 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5E9F DEFB $00,$00,$00,$00,$00,$00,$00,$00
5EA7 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5EAF DEFB $00,$00,$00,$00,$00,$00,$00,$00
5EB7 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5EBF DEFB $00,$00,$00,$00,$00,$00,$00,$00
5EC7 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5ECF DEFB $00,$00,$00,$00,$00,$00,$00,$00
5ED7 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5EDF DEFB $00,$00,$00,$00,$00,$00,$00,$00
5EE7 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5EEF DEFB $00,$00,$00,$00,$00,$00,$00,$00
5EF7 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5EFF DEFB $00,$00,$00,$00,$00,$00,$00,$00
5F07 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5F0F DEFB $00,$00,$00,$00,$00,$00,$00,$00
5F17 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5F1F DEFB $00,$00,$00,$00,$00,$00,$00,$00
5F27 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5F2F DEFB $00,$00,$00,$00,$00,$00,$00,$00
5F37 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5F3F DEFB $00,$00,$00,$00,$00,$00,$00,$00
5F47 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5F4F DEFB $00,$00,$00,$00,$00,$00,$00,$00
5F57 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5F5F DEFB $00,$00,$00,$00,$00,$00,$00,$00
5F67 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5F6F DEFB $00,$00,$00,$00,$00,$00,$00,$00
5F77 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5F7F DEFB $00,$00,$00,$00,$00,$00,$00,$00
5F87 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5F8F DEFB $00,$00,$00,$00,$00,$00,$00,$00
5F97 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5F9F DEFB $00,$00,$00,$00,$00,$00,$00,$00
5FA7 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5FAF DEFB $00,$00,$00,$00,$00,$00,$00,$00
5FB7 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5FBF DEFB $00,$00,$00,$00,$00,$00,$00,$00
5FC7 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5FCF DEFB $00,$00,$00,$00,$00,$00,$00,$00
5FD7 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5FDF DEFB $00,$00,$00,$00,$00,$00,$00,$00
5FE7 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5FEF DEFB $00,$00,$00,$00,$00,$00,$00,$00
5FF7 DEFB $00,$00,$00,$00,$00,$00,$00,$00
5FFF DEFB $00,$00,$00,$00,$00,$00,$00,$00
6007 DEFB $00,$00,$00,$00,$00,$00,$00,$00
600F DEFB $00,$00,$00,$00,$00,$00,$00,$00
6017 DEFB $00,$00,$00,$00,$00,$00,$00,$00
601F DEFB $00,$00,$00,$00,$00,$00,$00,$00
6027 DEFB $00,$00,$00,$00,$00,$00,$00,$00
602F DEFB $00,$00,$00,$00,$00,$00,$00,$00
6037 DEFB $00,$00,$00,$00,$00,$00,$00,$00
603F DEFB $00,$00,$00,$00,$00,$00,$00,$00
6047 DEFB $00,$00,$00,$00,$00,$00,$00,$00
604F DEFB $00,$00,$00,$00,$00,$00,$00,$00
6057 DEFB $00,$00,$00,$00,$00,$00,$00,$00
605F DEFB $00,$00,$00,$00,$00,$00,$00,$00
6067 DEFB $00,$00,$00,$00,$00,$00,$00,$00
606F DEFB $00,$00,$00,$00,$00,$00,$00,$00
6077 DEFB $00,$00,$00,$00,$00,$00,$00,$00
607F DEFB $00,$00,$00,$00,$00,$00,$00,$00
6087 DEFB $00,$00,$00,$00,$00,$00,$00,$00
608F DEFB $00,$00,$00,$00,$00,$00,$00,$00
6097 DEFB $00,$00,$00,$00,$00,$00,$00,$00
609F DEFB $00,$00,$00,$00,$00,$00,$00,$00
60A7 DEFB $00,$00,$00,$00,$00,$00,$00,$00
60AF DEFB $00,$00,$00,$00,$00,$00,$00,$00
60B7 DEFB $00,$00,$00,$00,$00,$00,$00,$00
60BF DEFB $00,$00,$00,$00,$00,$00,$00,$00
60C7 DEFB $00,$00,$00,$00,$00,$00,$00,$00
60CF DEFB $00,$00,$00,$00,$00,$00,$00,$00
60D7 DEFB $00,$00,$00,$00,$00,$00,$00,$00
60DF DEFB $00,$00,$00,$00,$00,$00,$00,$00
60E7 DEFB $00,$00,$00,$00,$00,$00,$00,$00
60EF DEFB $00,$00,$00,$00,$00,$00,$00,$00
60F7 DEFB $00,$00,$00,$00,$00,$00,$00,$00
60FF DEFB $00,$00,$00,$00,$00,$00,$00,$00
6107 DEFB $00,$00,$00,$00,$00,$00,$00,$00
610F DEFB $00,$00,$00,$00,$00,$00,$00,$00
6117 DEFB $00,$00,$00,$00,$00,$00,$00,$00
611F DEFB $00,$00,$00,$00,$00,$00,$00,$00
6127 DEFB $00,$00,$00,$00,$00,$00,$00,$00
612F DEFB $00,$00,$00,$00,$00,$00,$00,$00
6137 DEFB $00,$00,$00,$00,$00,$00,$00,$00
613F DEFB $00,$00,$00,$00,$00,$00,$00,$00
6147 DEFB $00,$00,$00,$00,$00,$00,$00,$00
614F DEFB $00,$00,$00,$00,$00,$00,$00,$00
6157 DEFB $00,$00,$00,$00,$00,$00,$00,$00
615F DEFB $00,$00,$00,$00,$00,$00,$00,$00
6167 DEFB $00,$00,$00,$00,$00,$00,$00,$00
616F DEFB $00,$00,$00,$00,$00,$00,$00,$00
6177 DEFB $00,$00,$00,$00,$00,$00,$00,$00
617F DEFB $00,$00,$00,$00,$4E,$E2,$83,$E1
6187 DEFB $E8,$8B,$DB,$E1,$BF,$3B,$1A,$39
618F DEFB $5C,$5F,$2B,$2D,$65,$33,$58,$FF
6197 DEFB $ED,$10,$0D,$00,$09,$00,$85,$1C
619F DEFB $10,$1C,$52,$1B,$76,$1B,$03,$13
61A7 DEFB $00,$3E,$00,$00,$00,$00,$00,$00
61AF DEFB $00,$00,$00,$00,$00,$00,$00,$00
61B7 DEFB $00,$00,$00,$00,$00,$00,$00,$00
61BF DEFB $00,$00,$00,$00,$00,$00,$00,$00
61C7 DEFB $00,$00,$00,$00,$00,$00,$00,$00
61CF DEFB $00,$00,$00,$00,$00,$00,$00,$00
61D7 DEFB $00,$00,$00,$00,$00,$00,$00,$00
61DF DEFB $00,$00,$00,$00,$00,$00,$00,$FC
61E7 DEFB $FC,$5D,$7A,$B5,$76,$30,$13,$E0
61EF DEFB $20,$00,$00,$1A,$42,$C7,$71,$6D
61F7 DEFB $72,$C7,$71,$05,$6A,$3A,$5C,$58
61FF DEFB $27,$00,$00,$00,$00,$00,$00,$00
6207 DEFB $00,$00,$00,$00,$00,$00,$00,$00
620F DEFB $00,$00,$00,$00,$00,$00,$00,$00
6217 DEFB $00,$00,$00,$00,$00,$00,$00,$00
621F DEFB $00,$00,$00,$00,$00,$00,$00,$00
6227 DEFB $00,$00,$00,$00,$00,$00,$00,$00
622F DEFB $00,$00,$00,$00,$00,$00,$00,$00
6237 DEFB $00,$00,$00,$00,$00,$00,$00,$00
623F DEFB $00,$00,$00,$00,$00,$00,$00,$00
6247 DEFB $00,$00,$00,$00,$00,$00,$00,$00
624F DEFB $00,$00,$00,$00,$00,$00,$00,$00
6257 DEFB $00,$00,$00,$00,$00,$00,$00,$00
625F DEFB $00,$00,$00,$00,$00,$00,$00,$00
6267 DEFB $00,$00,$00,$00,$00,$00,$00,$00
626F DEFB $00,$00,$00,$00,$00,$00,$00,$00
6277 DEFB $00,$00,$00,$00,$00,$00,$00,$00
627F DEFB $00,$00,$00,$00,$00,$00,$00,$00
6287 DEFB $00,$00,$00,$00,$00,$00,$00,$00
628F DEFB $00,$00,$00,$00,$00,$00,$00,$00
6297 DEFB $00,$00,$00,$00,$00,$00,$00,$00
629F DEFB $00,$00,$00,$00,$00,$00,$00,$00
62A7 DEFB $00,$00,$00,$00,$00,$00,$00,$00
62AF DEFB $00,$00,$00,$00,$00,$00,$00,$00
62B7 DEFB $00,$00,$00,$00,$00,$00,$00,$00
62BF DEFB $00,$00,$00,$00,$00,$00,$00,$00
62C7 DEFB $00,$00,$00,$00,$00,$00,$00,$00
62CF DEFB $00,$00,$00,$00,$00,$00,$00,$00
62D7 DEFB $00,$00,$00,$00,$00,$00,$00,$00
62DF DEFB $00,$00,$00,$00,$00,$00,$00,$00
62E7 DEFB $00,$00,$00,$00,$00,$00,$00,$00
62EF DEFB $00,$00,$00,$00,$00,$00,$00,$00
62F7 DEFB $00,$00,$00,$00,$00,$00,$00,$00
62FF DEFB $00,$3A,$14,$69,$3C,$3C,$42,$46
6307 DEFB $69,$D6,$8B,$0B,$D2,$8C,$0B,$ED
630F DEFB $82,$42,$BA,$67,$3C,$3C,$3C,$3C
6317 DEFB $3C,$D6,$8B,$0B,$FC,$43,$7B,$E1
631F DEFB $C9,$43,$F7,$E1,$33,$99,$4B,$51
6327 DEFB $E1,$01,$69,$E1,$9C,$DC,$3C,$42
632F DEFB $C2,$DF,$E1,$E1,$E1,$E1,$E1,$E1
6337 DEFB $E1,$E1,$E1,$E1,$E1,$E1,$E1,$E1
633F DEFB $E1,$E1,$E1,$E1,$E1,$E1,$E1,$E1
6347 DEFB $E1,$E1,$E1,$E1,$E1,$E1,$E1,$E1
634F DEFB $E1,$E1,$E1,$E1,$E1,$E1,$E1,$E1
6357 DEFB $E1,$E1,$E1,$E1,$E1,$E1,$E1,$E1
635F DEFB $E1,$E1,$E1,$E1,$E1,$E1,$E1,$E1
6367 DEFB $E1,$E1,$E1,$E1,$E1,$E1,$E1,$E1
636F DEFB $E1,$E1,$E1,$E1,$E1,$E1,$E1,$E1
6377 DEFB $E1,$E1,$E1,$E1,$E1,$E1,$E1,$E1
637F DEFB $E1,$E1,$E1,$E1,$E1,$E1,$E1,$E1
6387 DEFB $E1,$E1,$E1,$E1,$E1,$E1,$E1,$E1
638F DEFB $E1,$E1,$E1,$E1,$E1,$E1,$E1,$E1
6397 DEFB $E1,$E1,$E1,$E1,$E1,$E1,$E1,$E1
639F DEFB $E1,$E1,$E1,$E1,$E1,$E1,$E1,$E1
63A7 DEFB $E1,$E1,$E1,$E1,$E1,$E1,$E1,$E1
63AF DEFB $E1,$E1,$E1,$E1,$E1,$E1,$E1,$E1
63B7 DEFB $E1,$E1,$E1,$E1,$E1,$E1,$E1,$E1
63BF DEFB $E1,$E1,$E1,$E1,$E1,$E1,$E1,$E1
63C7 DEFB $E1,$E1,$E1,$E1,$E1,$E1,$E1,$E1
63CF DEFB $E1,$E1,$E1,$E1,$E1,$E1,$E1,$E1
63D7 DEFB $E1,$E1,$E1,$E1,$E1,$E1,$E1,$E1
63DF DEFB $E1,$E1,$E1,$E1,$E1,$E1,$E1,$E1
63E7 DEFB $E1,$E1,$E1,$E1,$E1,$E1,$E1,$E1
63EF DEFB $E1,$E1,$E1,$E1,$E1,$E1,$E1,$E1
63F7 DEFB $E1,$E1,$E1,$E1,$E1,$E1,$E1,$E1
63FF DEFB $E1
6400: Block of redirects
Used by the routines at 8000, 9132, 9176, 9193 and E1A8.
Jump table at the head of the code. Every entry is a jump to the real routine, so callers reach the common services through fixed addresses even when the targets move.
6400 JP $7A10 => Abort
6403 JP $7A5C => Delay by BC HALTs
6406 JP $79CA => System init
6409 JP $0000
640C JP $7621 => Print HL as 4-digit hex/BCD
640F JP $7626
6412 JP $75BE => Fill screen rectangle with byte
This entry point is used by the routines at 8EE3, E1D1, E224, E6FE and EF37.
6415 JP $6825 => Update Score
6418 JP $796A => Prepare New Game
641B JP $792C => Prepare at new Area
This entry point is used by the routine at EF37.
641E JP $69D2 => Set up attract/menu mode, then fall into the main menu
6421 JP $7357 => Game main loop / frame handler
This entry point is used by the routine at ED52.
6424 JP $7511 => XOR AF and AF' with every byte in $F900-F9FF
This entry point is used by the routine at DEEF.
6427 JP $6593 => Scan $6648 table, call $65A5 for active entries
This entry point is used by the routines at 83B8, 85AB, 86F5 and EF37.
642A JP $6600 => Find free slot in $6648 table
This entry point is used by the routines at 8158, 8EE3, DE91, E6FE, ECC1 and EF37.
642D JP $6456 => Trigger sound effect A
This entry point is used by the routines at 8EE3 and ECC1.
6430 JP $6C7A => We've got A more grenades
6433: Sound channel counters (7 slots), decay rates follow at $6441
6433 DEFB $00,$00,$00,$00,$00,$00,$01
643A DEFB $94,$14,$2C,$0A,$14,$10,$02,$04
6442 DEFB $01,$02,$02,$02,$02,$01
6448 DEFW $64F9
644A DEFW $64E9
644C DEFW $64C7
644E DEFW $6505
6450 DEFW $650F
6452 DEFW $64AB
6454 DEFW $6533
6456: Trigger sound effect A (copy its parameter into slot A)
Used by the routines at 6400, 6825 and 7637.
Input
A Sound effect number (0-6, or 7 to silence all)
Copies the byte at $643A+A into the active slot $6433+A to start sound A, or clears all seven slots when A=7.
6456 CP $07
6458 JR Z,$6469 => Clear 7 bytes at $6433
645A LD E,A
645B LD HL,$6433 Destination = $6433 + A
645E ADD A,L
645F LD L,A
6460 LD A,E
6461 LD DE,$643A Source = $643A + A
6464 ADD A,E
6465 LD E,A
6466 LD A,(DE) Copy byte into active slot
6467 LD (HL),A
6468 RET
6469: Clear 7 bytes at $6433
Used by the routines at 6456, 69F3 and 6BBB.
Silences all seven sound channels by clearing their counters.
6469 LD B,$07
646B LD HL,$6433
646E LD (HL),$00
6470 INC HL
6471 DJNZ $646E
6473 RET
6474: Sound-effect dispatcher, 7 channels
Used by the routine at 7357.
Scans the seven sound slots at $6433 for an active channel and dispatches to its handler through the address table at $6446, with the decay routine 6495 queued as the return.
6474 LD HL,$6433 Scan $6433 slots for active sound
6477 LD B,$07
6479 LD A,(HL)
647A AND A
647B JP NZ,$6482 Active slot? dispatch it
647E INC HL
647F DJNZ $6479
6481 RET
6482 LD HL,$6446 Point at the jump table
6485 LD A,B Slot number times two, add in
6486 ADD A,A
6487 ADD A,L
6488 LD L,A
6489 JR NC,$648C
648B INC H
648C LD A,(HL) Load the handler address
648D INC HL
648E LD H,(HL) Take the high byte, restore the low
648F LD L,A
6490 LD DE,$6495 Queue $6495 decay as return
6493 PUSH DE
6494 JP (HL)
6495: Decay sound-effect counters at $6433
Fades the active sound effects, stepping each channel's counter toward silence at its own rate and freeing the slot once it lands there.
6495 LD DE,$6433 Point at the 7 counters and rates
6498 LD HL,$6441
649B LD B,$07
649D LD A,(DE)
649E AND A Skip channels already silent
649F JR Z,$64A6
64A1 SBC A,(HL) Subtract this channel's decay
64A2 JR NC,$64A5
64A4 XOR A Clamp to zero
64A5 LD (DE),A
64A6 INC HL
64A7 INC DE
64A8 DJNZ $649D
64AA RET
64AB: Play a two-stage sound stepped by counter $6434
Plays a two-stage sound stepped by the counter at $6434: a higher pitch while it is under $0A and a lower one above, reloading the counter to $14 when it expires.
64AB LD A,($6434)
64AE DEC A Expired? reload and stop
64AF JR Z,$64C1
64B1 INC A
64B2 CP $0A Pitch varies by counter phase
64B4 JR C,$64BA
64B6 LD A,$14
64B8 JR $64BC
64BA LD A,$0F
64BC LD L,$0C Play for $0C cycles
64BE JP $6575 => Sound a square-wave beep
64C1 LD A,$14 Reload counter to $14
64C3 LD ($6434),A
64C6 RET
64C7: Play beep tone (pitch $6437, duration loop)
Plays a rasping tone by toggling the speaker while flickering the border, the pitch taken from its sound parameter and each cycle padded with a short delay.
64C7 LD A,($6437)
64CA NEG
64CC AND $1F
64CE XOR $1F
64D0 OR $01
64D2 PUSH AF
64D3 LD A,R
64D5 XOR $88
64D7 AND $F8
64D9 LD B,A
64DA LD A,($FDF7) get Border color
64DD OR B
64DE OUT ($FE),A Set border color, toggle speaker bit
64E0 LD B,$0A
64E2 DJNZ $64E2
64E4 POP AF
64E5 DEC A
64E6 JR NZ,$64D2
64E8 RET
64E9: Play a beep with pitch derived from $6438
Turns its sound parameter into a pitch and plays a short beep.
64E9 LD A,($6438)
64EC CP $0C
64EE JR NC,$64F4
64F0 LD B,A
64F1 LD A,$0C
64F3 SUB B
64F4 LD L,$14
64F6 JP $6575 => Sound a square-wave beep
64F9: Play a beep with pitch derived from $6439
Turns its sound parameter into a pitch and plays a short beep.
64F9 LD A,($6439)
64FC NEG
64FE AND $0F
6500 LD L,$09
6502 JP $6575 => Sound a square-wave beep
6505: Play a beep with pitch derived from $6436
Turns its sound parameter into a pitch and plays a short beep.
6505 LD A,($6436)
6508 ADD A,$0A
650A LD L,$09
650C JP $6575 => Sound a square-wave beep
650F: Play a banded sound stepped by counter $6435
Plays a sound whose pitch band steps with the counter at $6435 (raw below $0A, then based at $12 or $1C for higher values) for a fixed 10-cycle duration via 6575.
650F LD A,($6435)
6512 LD B,A
6513 CP $0A Pitch band by counter value
6515 JR C,$652C
6517 LD A,B
6518 CP $1B
651A JR NC,$6525
651C LD A,$12 Mid band: base $12 + low bits
651E LD E,A
651F LD A,B
6520 AND $07
6522 OR E
6523 JR $652C
6525 LD A,$1C High band: base $1C + low bits
6527 LD E,A
6528 LD A,B
6529 AND $07
652B OR E
652C OR $01
652E LD L,$0A Play for $0A cycles
6530 JP $6575 => Sound a square-wave beep
6533: Play a sound-effect tone (pitch from $6433)
Turns the active sound parameter at $6433 into a pitch (base $88, or higher parameters mapped to a shorter period) and plays an 8-cycle beep via 6575.
6533 LD A,($6433) Read the sound parameter ($6433)
6536 CP $14
6538 JR C,$6549 Below $14? use the base pitch
653A SUB $14 Higher: derive a pitch from it
653C LD B,A
653D LD A,$88
653F SUB B
6540 AND $F8
6542 OR $01
6544 LD L,$08 Play for 8 cycles
6546 JP $6575 => Sound a square-wave beep
6549 LD A,$88
654B LD L,$08
654D JP $6575 => Sound a square-wave beep
6550: Unreferenced duplicate of the beeper loop at 6575
An unreferenced copy of the beeper loop -- byte-for-byte the same code as 6575, left in the binary but never called.
6550 LD E,A
6551 LD A,($FDF7)
6554 AND $07
6556 OUT ($FE),A
6558 LD A,E
6559 DEC A
655A JR NZ,$6559
655C LD A,R
655E BIT 0,A
6560 JR Z,$656C
6562 LD B,A
6563 LD A,($FDF7)
6566 AND $07
6568 OR $10
656A OUT ($FE),A
656C LD A,E
656D DEC A
656E JR NZ,$656D
6570 DEC L
6571 JP NZ,$6576
6574 RET
6575: Sound a square-wave beep
Used by the routines at 64AB, 64E9, 64F9, 6505, 650F and 6533.
Input
A Pitch (inner delay per half-cycle)
L Duration (number of cycles)
Sounds a square-wave beep by toggling the speaker for L half-cycle pairs, each half delayed by the pitch value in A so a smaller value gives a higher tone.
6575 LD E,A
This entry point is used by the routine at 6550.
6576 LD A,($FDF7) Toggle speaker bit (tone half-cycle)
6579 AND $07
657B OUT ($FE),A
657D LD A,E
657E DEC A Pitch delay loop
657F JR NZ,$657E
6581 LD A,($FDF7) Read the flag byte, mask to a border colour
6584 AND $07
6586 OR $10 Set toggle bit, out to the port
6588 OUT ($FE),A
658A LD A,E
658B DEC A
658C JR NZ,$658B
658E DEC L Count down the duration
658F JP NZ,$6576
6592 RET
6593: Scan $6648 table, call $65A5 for active entries
Used by the routine at 6400.
Walks the effect slots, ticking each active one and leaving the free slots alone.
6593 LD HL,$6648
6596 LD DE,$0005
6599 LD B,$05
659B LD A,(HL)
659C CP $80
659E CALL NZ,$65A5 Tick an object's timer
65A1 ADD HL,DE
65A2 DJNZ $659B
65A4 RET
65A5: Tick an object's timer; when it runs out, rebuild its work record
Used by the routine at 6593.
Ticks one object's countdown. Most calls just decrement it; when it reaches zero the object's work record is rebuilt -- position copied, sprite frames picked with a small wobble, the object stamped onto the map -- so it only redraws every few frames.
65A5 PUSH HL
65A6 ADD HL,DE
65A7 DEC HL
65A8 DEC (HL) Tick the countdown
65A9 JR Z,$65AD
65AB POP HL
65AC RET
65AD LD (HL),$03 Expired: reload timer to 3
65AF POP HL
65B0 PUSH HL
65B1 PUSH DE
65B2 PUSH BC
65B3 LD IX,$6661 Point IX at the work record
65B7 LD A,(HL)
65B8 LD (IX+$00),A Copy X coordinate into record
65BB LD (IX+$04),A
65BE INC HL
65BF LD B,(HL)
65C0 LD (IX+$01),B Copy Y coordinate into record
65C3 LD A,R Test the draw-mode flag (R bit 7)
65C5 JP P,$65CA
65C8 INC (HL)
65C9 INC B
65CA LD (IX+$05),B
65CD INC HL
65CE LD A,(HL)
65CF INC HL
65D0 LD B,(HL)
65D1 CALL $65F6 Menu key check, set carry/B=$12
65D4 LD (IX+$02),A
65D7 LD (IX+$03),B
65DA LD B,(HL)
65DB DEC HL
65DC INC (HL)
65DD LD A,(HL)
65DE CALL $65F6 Menu key check, set carry/B=$12
65E1 LD (IX+$06),A
65E4 LD (IX+$07),B
65E7 JR NC,$65ED
65E9 DEC HL
65EA DEC HL
65EB LD (HL),$80 Flag record slot as spare
65ED LD C,$07
65EF CALL $800F Mark map cells for object IX, direction-aware
65F2 POP BC
65F3 POP DE
65F4 POP HL
65F5 RET
65F6: Menu key check, set carry/B=$12 (unconfirmed)
Used by the routine at 65A5.
Reports whether a value is a multiple of four, handing back a default of $12 either way.
65F6 OR A
65F7 JR Z,$65FD
65F9 AND $03
65FB RET NZ
65FC SCF
65FD LD B,$12
65FF RET
6600: Find free slot in $6648 table
Used by the routine at 6400.
Input
HL Address to store in the slot
A Attribute seed (stored as A/2 + $13)
Walks the five fixed-size slots looking for one marked free, and if it finds one fills in the caller's address and a starting attribute so the slot becomes active.
6600 EX AF,AF' Scan for slot marked $80 (free)
6601 PUSH HL
6602 LD HL,$6648
6605 LD DE,$0005
6608 LD B,$05
660A LD A,$80
660C CP (HL)
660D JR Z,$6614
660F ADD HL,DE
6610 DJNZ $660C
6612 POP HL
6613 RET
6614 POP DE Take the caller address off the stack
6615 LD (HL),E Store its low byte
6616 INC HL
6617 LD (HL),D ...and its high byte
6618 INC HL
6619 LD (HL),$00 Clear the field after it
661B INC HL
661C EX AF,AF' Store derived attribute value
661D SRL A
661F ADD A,$13
6621 LD (HL),A
6622 INC HL
6623 LD (HL),$01
6625 RET
6626: Prepare records and variables at $6648
Used by the routine at 792C.
Initialises the object work-record at $6661 with its clip bounds and marks all five slots in the $6648 table as free ($80).
6626 LD IX,$6661
662A LD (IX+$08),$04 Set record clip bounds
662E LD (IX+$09),$5F
6632 LD (IX+$0A),$0A
6636 LD (IX+$0B),$00
663A LD HL,$6648 Point at the 5 slots
663D LD DE,$0005
6640 LD B,$05
6642 LD (HL),$80 Mark each slot free ($80)
6644 ADD HL,DE
6645 DJNZ $6642
6647 RET
6648: Effect slot table, 5 records of 5 bytes
6648 DEFB $00,$00,$00,$00,$00 ??
664D DEFB $00,$00,$00,$00,$00
6652 DEFB $00,$00,$00,$00,$00
6657 DEFB $00,$00,$00,$00,$00
665C DEFB $00,$00,$00,$00,$00
6661 DEFB $00,$00,$00,$00,$00,$00,$00,$00
6669 DEFB $00,$00,$00,$00,$73,$18,$C9,$0C
6671 DEFB $63,$1D,$28,$E1,$8C,$51,$92,$FB
6679 DEFB $B8,$C1,$25,$24,$11,$04,$C6,$70
6681 DEFB $14,$A5,$2D,$12,$94,$A1,$28,$82
6689 DEFB $52,$AA,$52,$22,$25,$02,$25,$42
6691 DEFB $2E,$85,$29,$40,$17,$B9,$EB,$10
6699 DEFB $F7,$19,$28,$C2,$12,$8B,$92,$23
66A1 DEFB $38,$C2,$25,$82,$28,$84,$E6,$30
66A9 DEFB $94,$A1,$29,$12,$94,$05,$28,$82
66B1 DEFB $52,$8A,$12,$22,$24,$22,$25,$42
66B9 DEFB $2E,$84,$29,$48,$64,$A1,$29,$0C
66C1 DEFB $94,$38,$CE,$E1,$8C,$8A,$0C,$23
66C9 DEFB $A4,$C1,$19,$24,$11,$04,$26,$30
66D1: Packed tile records, unpacked into the $6711 buffer by 706E
66D1 DEFB $00,$FE,$00,$00,$03,$11,$80,$00 ??
66D9 DEFB $04,$10,$40,$00,$08,$00,$20,$00
66E1 DEFB $08,$00,$20,$00,$10,$00,$10,$00
66E9 DEFB $10,$00,$10,$00,$1E,$00,$F0,$00
66F1 DEFB $10,$00,$10,$00,$10,$00,$10,$00
66F9 DEFB $08,$00,$20,$00,$08,$00,$20,$00
6701 DEFB $04,$10,$40,$00,$03,$11,$80,$00
6709 DEFB $00,$FE,$00,$00,$00,$00,$00,$00
6711 DEFB $00,$00,$00,$00,$00,$00,$00,$00 ?? 4 * 16 bytes
6719 DEFB $00,$00,$00,$00,$00,$00,$00,$00
6721 DEFB $00,$00,$00,$00,$00,$00,$00,$00
6729 DEFB $00,$00,$00,$00,$00,$00,$00,$00
6731 DEFB $00,$00,$00,$00,$00,$00,$00,$00
6739 DEFB $00,$00,$00,$00,$00,$00,$00,$00
6741 DEFB $00,$00,$00,$00,$00,$00,$00,$00
6749 DEFB $00,$00,$00,$00,$00,$00,$00,$00
6751: Set up scrolling string
Used by the routines at 69F3, 6A1E and 7143.
Starts the scrolling title text: points the reader at the message, colours the strip it runs along, and arms the interrupt handler that steps it.
6751 LD HL,$67CE
6754 LD ($681B),HL Set addr of scrolling string
6757 LD HL,$5AE0
675A LD B,$20
675C LD (HL),$04
675E INC L
675F DJNZ $675C
6761 LD A,$01
6763 LD ($681D),A
6766 SET 3,(IY+$07) Set bit 3 of byte ($FD87)
676A RET
676B: Scroll the message banner one pixel left
Used by the routine at 7357.
Shifts the whole banner left by rotating each screen byte and pulling in the next pixel column from a small font-row buffer. A timer paces it so a fresh character is fed in only every few frames.
676B LD A,($681D) Count down the scroll timer
676E DEC A
676F LD ($681D),A
6772 CALL Z,$679D Advance scroll-message pointer, copy next char's font row to $681E
6775 LD E,$02 Two-pass pixel scroll
6777 LD BC,$2007 Set up column/row counts
677A LD HL,$56FF
677D PUSH DE
677E LD DE,$681E Point at the font-row buffer
6781 DEC E
6782 LD A,E
6783 ADD A,C
6784 LD E,A
6785 EX DE,HL
6786 RL (HL) Feed one font bit into the scroll
6788 EX DE,HL
6789 POP DE
678A RL (HL) Rotate it along the screen row
678C DEC L
678D DJNZ $678A
678F LD A,$20 Drop to the next screen line
6791 ADD A,L
6792 LD L,A
6793 LD B,$20
6795 DEC H Step to the next screen third
6796 DEC C
6797 JR NZ,$677D
6799 DEC E
679A JR NZ,$6777
679C RET
679D: Advance scroll-message pointer, copy next char's font row to $681E
Used by the routine at 676B.
Feeds the next character of the scrolling title message into the display buffer $681E: reads it via the pointer at $681B, wrapping at the $1F end marker, and copies its 7-row font glyph from $7D28.
679D LD A,$04 Reset scroll counter, load message pointer
679F LD ($681D),A
67A2 LD HL,($681B)
67A5 LD A,(HL) Read char, check for end-of-message marker
67A6 CP $1F
67A8 JR Z,$67C7
67AA INC HL
67AB LD ($681B),HL
67AE CP $20 Map space to glyph $2F
67B0 JR NZ,$67B4
67B2 LD A,$2F
67B4 LD L,A Char code into L
67B5 LD H,$00
67B7 ADD HL,HL Tripled: eight bytes per font row
67B8 ADD HL,HL
67B9 ADD HL,HL
67BA LD DE,$7D28
67BD ADD HL,DE
67BE LD DE,$681E
67C1 LD BC,$0007
67C4 LDIR Copy 7 font rows to buffer
67C6 RET
67C7 LD HL,$67CE End of message: rewind to start
67CA LD ($681B),HL
67CD RET
67CE: Scrolling title message, $1F ends it
67CE DEFM "PRESS S TO START GAME PRESS J TO CHOOSE JOYSTICK PRESS K TO RED"
680F DEFM "EFINE KEYS "
681A DEFB $1F
681B: Scroll state: message pointer, step timer and the font-row buffer
681B DEFW $67D4 Address of current char in scrolling string
681D DEFB $02,$00,$00,$00,$00,$00,$00,$00
6825: Update Score
Used by the routines at 6400 and 6BBB.
Input
B Value to add into the selected score digit
C Digit position, counted from the right (0 = units)
Adds to the score and redraws it, rippling the carry through the digits and printing each one from the font. Crossing a threshold awards an extra life with a sound.
6825 LD A,($FDE9) Get Score 2nd char
6828 PUSH AF
6829 LD A,$07
682B SUB C
682C LD E,A
682D ADD A,$E8
682F LD L,A
6830 LD H,$FD
6832 LD C,$00
6834 DEC L
6835 LD D,$01
6837 LD A,(HL) Add increment to digit
6838 ADD A,B
6839 CP $3A Decimal carry: subtract 10
683B JR C,$6842
683D SUB $0A
683F INC D
6840 JR $6839
6842 LD (HL),A Store adjusted digit
6843 INC C
6844 DEC E
6845 JR Z,$684A
6847 LD B,D
6848 DJNZ $6834
684A LD D,$40
684C LD A,(HL)
684D INC L
684E SUB $30
6850 PUSH HL
6851 ADD A,A
6852 ADD A,A
6853 ADD A,A
6854 ADD A,$A8 Font 2nd char address, lo byte
6856 LD L,A
6857 LD H,$7E Font address, hi byte
6859 ADC A,H
685A SUB L
685B LD H,A
685C LD B,$07
685E LD A,(HL) One font row across
685F INC L
6860 LD (DE),A Store it, step both pointers
6861 INC D
6862 DJNZ $685E
6864 POP HL
6865 LD A,D
6866 SUB $07
6868 LD D,A
6869 INC E
686A DEC C
686B JR NZ,$684C
686D POP AF
686E CP (IY+$69) Extra life if score digit advanced
6871 RET Z
6872 LD A,$02
6874 CALL $6456 Trigger sound effect A
6877 LD HL,$FDE6 Address of variable - Lives player have
687A INC (HL) plus one live
687B LD A,(HL) Get Lives player have
687C CP $0A
687E RET NC
687F PUSH AF
6880 CALL $7615 Print immediate string
6883 DEFB $16,$00,$15 char $16: set position (col=$00, row=$15)
6886 DEFB $19,$00 char $19: set flag bit 0 ($FDAF) = $00
6888 DEFB $18,$00 char $18: set width counter ($FDB0) = $00
688A DEFB $10,$07 char $10: set $FDA0 bits 0-2 = $07
688C DEFB $11,$02 char $11: set $FDA0 bits 3-5 = $02
688E DEFB $1F char $1F: end of string
688F POP AF
6890 ADD A,$30 number 0..9 -> char '0'..'9'
6892 CALL $7637 Print Char
6895 RET
6896: Convert (H,L) screen coords to screen address
Used by the routine at 69B4.
Input
H Row
L Column
Output
HL Screen address
Converts a packed row/column in HL to a screen address, halving the row to a character line via 98D9 and nudging down one pixel line when the row's low bit is set.
6896 LD A,H
6897 PUSH AF
6898 SRL H Row / 2 to character line
689A SLA L Column * 4
689C SLA L
689E CALL $98D9 Convert row number to screen line address
68A1 POP AF
68A2 RRCA Odd row: nudge down a pixel line
68A3 RET NC
68A4 INC H
68A5 RET
68A6: Zero screen rows using SP as pointer (B rows)
Used by the routine at 68CA.
Input
HL Screen address
B Row count
HL Start screen address
Clears B screen pixel-rows starting at HL by pushing zero words through SP, advancing one pixel line (with third-boundary wrap) each iteration and restoring the real SP on exit.
68A6 LD ($FD82),SP Switch SP to HL, clear DE=0
68AA LD DE,$0000
68AD LD SP,HL
68AE PUSH DE #0-4 five pushes blank ten bytes of the row
68AF PUSH DE
68B0 PUSH DE
68B1 PUSH DE
68B2 PUSH DE
68B3 INC H Check third boundary, wrap if needed
68B4 LD A,H
68B5 AND $07
68B7 JR NZ,$68C3
68B9 LD A,L
68BA ADD A,$20
68BC LD L,A
68BD JR C,$68C3
68BF LD A,H
68C0 SUB $08
68C2 LD H,A
68C3 DJNZ $68AD Loop next row
68C5 LD SP,($FD82) Restore SP
68C9 RET
68CA: Screen wipe/reveal transition, paced by $FDBC
Runs one frame of the screen wipe. It blanks a band of rows either side of a moving boundary and repaints the colour behind it, finishing and clearing the busy flag once the counter reaches the end.
68CA LD A,($FDBC) Read the wipe counter ($FDBC)
68CD CP $A1 Finished at $A1?
68CF JR NZ,$68D6
68D1 RES 2,(IY+$07)
68D5 RET
68D6 BIT 5,A Pick the wipe phase
68D8 JR Z,$6906
68DA PUSH AF
68DB LD HL,$482D Address on the screen
68DE AND $1F Rows to clear from the low bits
68E0 SRL A
68E2 INC A
68E3 LD B,A
68E4 CALL $68A6 Zero screen rows using SP as pointer
68E7 POP AF
68E8 PUSH AF
68E9 AND $1F
68EB SRL A
68ED XOR $0F
68EF JR Z,$68F7
68F1 LD B,A
68F2 CALL $98DC DOWN HL
68F5 DJNZ $68F2
68F7 POP AF
68F8 PUSH AF
68F9 AND $1F
68FB SRL A
68FD SUB $10
68FF NEG
6901 LD B,A
6902 CALL $68A6 Zero screen rows using SP as pointer
6905 POP AF
6906 INC A
6907 LD ($FDBC),A Advance the wipe counter
690A DEC A
690B LD H,A
690C BIT 6,A Fill attributes by direction
690E JR NZ,$6930
6910 BIT 5,A
6912 LD A,H
6913 JR Z,$6919
6915 AND $1F
6917 XOR $1F
6919 AND $1F
691B LD H,A
691C LD A,$1F
691E LD B,$20
6920 LD DE,$0000
6923 SUB H Fill one attribute row
6924 JR NC,$692C
6926 ADD A,$20
6928 CALL $6950 Compute row attribute address, call $69B4
692B INC D
692C INC E Loop the remaining columns
692D DJNZ $6923
692F RET
6930 BIT 5,A Which way is the wipe running?
6932 LD A,H Mirror the column for the reverse pass
6933 JR Z,$6939
6935 AND $1F
6937 XOR $1F
6939 AND $1F Keep it inside the row
693B LD H,A
693C LD A,$1F Set up the column walk
693E LD B,$20
6940 LD DE,$001F
6943 SUB H Step across, wrapping at the edge
6944 JR NC,$694C
6946 ADD A,$20
6948 CALL $6950 Compute row attribute address, call $69B4
694B INC D
694C DEC E
694D DJNZ $6943
694F RET
6950: Compute row attribute address, call $69B4
Used by the routine at 68CA.
Draws the control-type indicator tile: derives the graphic page from the joystick type in $FDBC (bit 5 selecting a mirrored index) and paints it via 69B4 with count $0A.
6950 PUSH AF Save the caller's registers
6951 PUSH DE
6952 PUSH HL
6953 PUSH BC Swap in, point at the joystick font
6954 EXX
6955 LD DE,$7AA0
6958 EXX
6959 LD L,$03
695B LD A,($FDBC) Read control type ($FDBC)
695E DEC A
695F BIT 5,A Bit 5 selects mirrored variant
6961 JR Z,$6965
6963 XOR $1F Mirror the index
6965 AND $1F
6967 ADD A,$91 Graphic page = index + $91
6969 LD H,A
696A LD BC,$000A
696D CALL $69B4 Compute attribute address for tile
6970 POP BC
6971 POP HL
6972 POP DE
6973 POP AF
6974 RET
6975: Fill status-bar columns down, calling $699A per column
Used by the routine at 7357.
Repaints the status bar a column at a time, walking across it and colouring each column in turn.
6975 LD A,($FDBB) Check idle flag ($FDBB), clear on match
6978 LD H,A
6979 CP $20
697B JR NZ,$6982
697D RES 2,(IY+$07)
6981 RET
6982 INC A Store the fill byte
6983 LD ($FDBB),A
6986 LD A,$1F Fill value and column count
6988 LD B,$20
698A LD DE,$0000
698D SUB H Subtract the row height
698E JR NC,$6996
6990 ADD A,$20 Wrapped: add a screen third, call per column
6992 CALL $699A
6995 INC D
6996 INC E
6997 DJNZ $698D
6999 RET
699A: Compute attribute address for fixed tile row
Used by the routine at 6975.
Works out where one column of the status bar sits in the attribute area and paints it.
699A PUSH AF Save the caller's registers
699B PUSH DE
699C PUSH HL
699D PUSH BC
699E EXX Swap in, point at the tile font
699F LD DE,$7BE0
69A2 EXX
69A3 LD L,$05
69A5 LD A,($FDBB) Load row ($FDBB), set size BC=$0016
69A8 LD H,A
69A9 LD BC,$0016
69AC CALL $69B4 Compute attribute address for tile
69AF POP BC
69B0 POP HL
69B1 POP DE
69B2 POP AF
69B3 RET
69B4: Compute attribute address for tile (D,E)
Used by the routines at 6950 and 699A.
Input
D Row
E Column
Works out where a tile sits in the attribute area from its row and column, then copies the tile's colour bytes into place.
69B4 LD A,$1F
69B6 SUB D
69B7 SRL H
69B9 ADD A,H
69BA SUB $10
69BC LD H,A
69BD CALL $6896 Convert (H,L) screen coords to screen address
69C0 PUSH HL
69C1 LD A,$1F
69C3 SUB E
69C4 LD E,A
69C5 LD H,C
69C6 CALL $800C Multiply HL by 10, add DE
69C9 EXX
69CA PUSH DE
69CB EXX
69CC POP DE
69CD ADD HL,DE
69CE POP DE
69CF LDIR
69D1 RET
69D2: Set up attract/menu mode, then fall into the main menu
Used by the routine at 6400.
Sets up attract mode: saves the caller's stack, initialises the system, clears the last key and control type, then drops into the main menu.
69D2 EXX Save the registers
69D3 PUSH HL
69D4 PUSH IY
69D6 EXX
69D7 LD ($FD80),SP Remember the stack pointer
69DB CALL $79CA System init
69DE SET 1,(IY+$07) Set the menu-mode flag
69E2 LD HL,$FDAB Reset the print pointer
69E5 LD ($FDA9),HL
69E8 XOR A
69E9 LD ($FDA7),A
69EC LD ($FD98),A Clear the last key
69EF LD ($FD84),A Clear the joystick type
69F2 EI
69F3: Main menu: show score table, dispatch menu key
Used by the routine at 6CAE.
Main menu: shows the score table, clears the screen and starts the scrolling credits, then waits for a menu key and branches to start the game, pick a joystick or redefine the keys.
69F3 CALL $7274 Print Score Table
69F6 CALL $6AE1 Prepare status bar screen
This entry point is used by the routines at 6E08 and 6F1D.
69F9 CALL $6469 Clear 7 bytes at $6433
69FC CALL $6B21 Clear playfield and status screen/attribute areas
69FF CALL $6751 Set up scrolling string
6A02 CALL $71B6 Print credits screen, scroll text into $5923 area
6A05 CALL $7251 Check menu keys
6A08 JR Z,$6A0F
This entry point is used by the routines at 6A1E and 7143.
6A0A CALL $7251 Check menu keys
6A0D JR NZ,$6A0A
6A0F PUSH AF
6A10 CALL $6B21 Clear playfield and status screen/attribute areas
6A13 POP AF
6A14 CP $53 'S' - Start game
6A16 JP Z,$6BBB => Start Game
6A19 CP $4A 'J' - Joystick
6A1B JP Z,$7143 => Select joystick type
6A1E: Redefine Keys
Redefine Keys screen. It clears the existing assignments, then works down the prompt list asking for one key at a time and refusing any already taken, finishing by switching the control type to keyboard.
6A1E CALL $7615 Print immediate string
6A21 DEFB $15,$00 char $15: set/clear flag bit 1 ($FDAF) = $00
6A23 DEFB $11,$02 char $11: set $FDA0 bits 3-5 = $02
6A25 DEFB $10,$07 char $10: set $FDA0 bits 0-2 = $07
6A27 DEFB $18,$02 char $18: set width counter ($FDB0) = $02
6A29 DEFB $16,$0C,$00 char $16: set position (col=$0C, row=$00)
6A2C DEFB $19,$01 char $19: set flag bit 0 ($FDAF) = $01
6A2E DEFM "REDEFINE",$09,"KEYS"
6A3B DEFB $16,$16,$00 char $16: set position (col=$16, row=$00)
6A3E DEFB $19,$00 char $19: set flag bit 0 ($FDAF) = $00
6A40 DEFB $18,$00 char $18: set width counter ($FDB0) = $00
6A42 DEFB $11,$00 char $11: set $FDA0 bits 3-5 = $00
6A44 DEFB $1F char $1F: end of string
6A45 LD HL,$759C Where to store redefined keys
6A48 LD B,$0C
6A4A LD (HL),$00
6A4C INC HL
6A4D DJNZ $6A4A
6A4F LD B,$06 6 keys to redefine
6A51 LD HL,$6AA3 Start address for messages to use in Redefine Keys
6A54 PUSH BC
6A55 CALL $71A8 Print string HL
6A58 PUSH HL
6A59 CALL $98D6 (HL) -> HL
6A5C HALT
6A5D CALL $6B14 Wait key unpress, wait key press
6A60 LD C,A
6A61 PUSH HL
6A62 CALL $6A8C Check if a key code is already assigned
6A65 POP HL
6A66 JR C,$6A5C
6A68 LD A,($FD99)
6A6B LD (HL),A
6A6C INC HL
6A6D LD A,($FD9A)
6A70 LD (HL),A
6A71 LD A,C
6A72 CALL $75D2 Print key entered on Redefine Keys
6A75 CALL $7615 Print immediate string
6A78 DEFB $03,$04,$0D char $03: repeat character $04, $0D times
6A7B DEFB $1F char $1F: end of string
6A7C POP HL
6A7D INC HL
6A7E INC HL
6A7F POP BC
6A80 DJNZ $6A54
6A82 LD (IY+$04),$00 Set joystick type ($FD84) = Keyboard
6A86 CALL $6751 Set up scrolling string
6A89 JP $6A0A
6A8C: Check if a key code is already assigned (Redefine Keys)
Used by the routine at 6A1E.
Output
Cy Set if the code is already in use
Checks a key against the six already assigned on the Redefine Keys screen, reporting a clash so the same key cannot be used twice.
6A8C LD HL,$759C Point at the six assigned keys
6A8F LD B,$06
6A91 LD A,($FD99) Match the first code byte
6A94 CP (HL)
6A95 INC HL
6A96 JR NZ,$6A9E
6A98 LD A,($FD9A) Second byte too? already used
6A9B CP (HL)
6A9C SCF Flag the clash
6A9D RET Z
6A9E INC HL
6A9F DJNZ $6A91
6AA1 OR A
6AA2 RET
6AA3: Messages to use in Redefine Keys
6AA3 DEFM "UP"
6AA5 DEFB $03,$0D,$2E,$1F
6AA9 DEFB $A0,$75
6AAB DEFM "DOWN"
6AAF DEFB $03,$0B,$2E,$1F
6AB3 DEFB $A2,$75
6AB5 DEFM "LEFT"
6AB9 DEFB $03,$0B,$2E,$1F
6ABD DEFB $A4,$75
6ABF DEFM "RIGHT"
6AC4 DEFB $03,$0A,$2E,$1F
6AC8 DEFB $A6,$75
6ACA DEFM "FIRE"
6ACE DEFB $03,$0B,$2E,$1F
6AD2 DEFB $9E,$75
6AD4 DEFM "GRENADE"
6ADB DEFB $03,$08,$2E,$1F
6ADF DEFB $9C,$75
6AE1: Prepare status bar screen: fill, set scroll handler
Used by the routines at 69F3 and 6CAE.
Prepares the status bar: fills its area, points the interrupt's scroll handler at the status-bar updater, then copies the panel graphic in row by row.
6AE1 LD HL,$5805
6AE4 LD B,$16
6AE6 LD C,$05
6AE8 LD A,$46
6AEA CALL $75BE Fill screen rectangle with byte
6AED XOR A
6AEE LD ($FDBB),A Reset the scroll counter
6AF1 LD HL,$6975
6AF4 LD ($7392),HL Point the $7391 call at the status-bar fill
6AF7 SET 2,(IY+$07)
6AFB LD HL,$4686 Set up the graphic copy (5 rows)
6AFE LD C,$05
6B00 LD DE,$666D
6B03 PUSH HL
6B04 LD B,$14
6B06 LD A,(DE) One byte across
6B07 INC DE
6B08 LD (HL),A Store it, step the column
6B09 INC L
6B0A DJNZ $6B06
6B0C POP HL
6B0D CALL $98DC DOWN HL
6B10 DEC C
6B11 JR NZ,$6B03
6B13 RET
6B14: Wait key unpress, wait key press
Used by the routines at 6A1E, 6E08 and 7143.
Waits for the currently held key to be released and then for the next press, so one keystroke cannot be read twice.
6B14 LD A,($FD98) Get last key read from keyboard
6B17 OR A
6B18 JR NZ,$6B14 => Wait key unpress, wait key press
6B1A LD A,($FD98) Get last key read from keyboard
6B1D OR A
6B1E JR Z,$6B1A
6B20 RET
6B21: Clear playfield and status screen/attribute areas
Used by the routines at 69F3, 6E08 and 6F1D.
Clears the playfield and the status area, blanking both their attributes and their bitmaps.
6B21 RES 3,(IY+$07)
6B25 LD HL,$58C0
6B28 LD BC,$1110
6B2B XOR A
6B2C CALL $75BE Fill screen rectangle with byte
6B2F LD HL,$0600
6B32 LD BC,$1110
6B35 CALL $6B4C Zero rectangle at HL
6B38 LD HL,$5AC0
6B3B LD BC,$2002
6B3E XOR A
6B3F CALL $75BE Fill screen rectangle with byte
6B42 LD HL,$1600
6B45 LD BC,$2002
6B48 CALL $6B4C Zero rectangle at HL
6B4B RET
6B4C: Zero rectangle at HL (C rows x B bytes)
Used by the routines at 6B21 and 6B87.
Input
HL Start screen address
B Row count per column
C Column count
Blanks a rectangle of the screen bitmap, working down row by row and clearing the given number of bytes across.
6B4C SLA C
6B4E SLA C
6B50 SLA C
6B52 ADD HL,HL
6B53 ADD HL,HL
6B54 CALL $98D9 Convert row number to screen line address
6B57 LD D,B
6B58 PUSH HL
6B59 LD B,D
6B5A LD (HL),$00
6B5C INC L
6B5D DJNZ $6B5A
6B5F POP HL
6B60 CALL $98DC DOWN HL
6B63 DEC C
6B64 JR NZ,$6B58
6B66 RET
6B67: Letters to select from entering Top Score
6B67 DEFM "ABCDEFGH"
6B6F DEFM "IJKLMNOP"
6B77 DEFM "QRSTUVWX"
6B7F DEFM "YZ:;<=>?"
6B87: Draw menu box border/frame
Used by the routines at 6BBB and 792C.
Input
A Attribute byte for the box border/frame
Draws the menu box: paints the border in the requested colour with the ink matched to the paper, blanks the interior, then repaints the border over the cleared area.
6B87 PUSH AF
6B88 AND $38 Isolate the PAPER bits
6B8A LD C,A
6B8B RRCA Rotate INK to PAPER position
6B8C RRCA
6B8D RRCA
6B8E OR C OR it into the attribute
6B8F LD HL,$5820
6B92 LD BC,$2017
6B95 CALL $75BE Fill screen rectangle with byte
6B98 LD HL,$0100 Clear the box interior
6B9B LD BC,$2017
6B9E CALL $6B4C Zero rectangle at HL
6BA1 POP AF
6BA2 LD HL,$5820
6BA5 LD BC,$2017
6BA8 CALL $75BE Fill screen rectangle with byte
6BAB RET
6BAC: Scroll the Area in, up to $5C steps or until it arrives
Used by the routine at 792C.
Scrolls the level in at the start of an Area, running the scroll for a fixed run of frames or until the Area flag says it has arrived.
6BAC LD B,$5C
6BAE PUSH BC
6BAF CALL $8003 Advance level scroll
6BB2 POP BC
6BB3 BIT 4,(IY+$15)
6BB7 RET NZ
6BB8 DJNZ $6BAE
6BBA RET
6BBB: Start Game
Used by the routine at 69F3.
Outer game loop. It prepares each Area and runs the main loop; when the player dies it restores their grenades, takes a life and replays the Area from its last spawn point, ending the game once the lives run out. A surviving player gets the Area-complete sequence and moves on.
6BBB CALL $796A Prepare New Game
6BBE CALL $792C Prepare at new Area
6BC1 HALT
6BC2 RES 1,(IY+$07)
6BC6 HALT
6BC7 CALL $8006 Clear the draw-mode flag (R bit 7), enter $9193
6BCA HALT
6BCB CALL $6469 Clear 7 bytes at $6433
6BCE CALL $DC89 Initialization and go to game main loop
6BD1 CALL $6469 Clear 7 bytes at $6433
6BD4 HALT
6BD5 SET 1,(IY+$07)
6BD9 HALT
6BDA LD A,($FD85) Get last joystick/keyboard bits
6BDD OR $E0
6BDF INC A
6BE0 BIT 0,(IY+$62) Is Player alive?
6BE4 JR Z,$6C1D => Successful end of the Area
Player is dead
6BE6 LD HL,$FDE7
6BE9 LD A,(HL) Get player's grenades number
6BEA CP $07
6BEC JR NC,$6BF0
6BEE LD (HL),$06 Set player's grenades number to max allowed
6BF0 CALL $6C80 Update grenades number on the screen
6BF3 CALL $7615 Print immediate string
6BF6 DEFB $16,$00,$15 char $16: set position (col=$00, row=$15)
6BF9 DEFB $1F char $1F: end of string
6BFA LD A,($FDE6) Get lives player have
6BFD ADD A,$2F
6BFF CP $3A
6C01 CALL C,$7637 Print Char
6C04 DEC (IY+$66) Minus one live
6C07 JP Z,$6CAE => Game Over
6C0A LD HL,($FD8A)
6C0D DEC HL
6C0E DEC HL
6C0F DEC HL
6C10 DEC HL
6C11 LD A,(HL)
6C12 CP $22
6C14 JR NZ,$6C0F
6C16 INC HL
6C17 INC HL
6C18 LD ($FD8A),HL
6C1B JR $6BBE
Black screen at the end of an Area
6C1D LD A,$47
6C1F CALL $6B87 Draw menu box border/frame
6C22 CALL $7615 Print immediate string
6C25 DEFB $15,$01 char $15: set/clear flag bit 1 ($FDAF) = $01
6C27 DEFB $19,$01 char $19: set flag bit 0 ($FDAF) = $01
6C29 DEFB $16,$14,$09 char $16: set position (col=$14, row=$09)
6C2C DEFM "BROKE AREA "
6C38 DEFB $1F char $1F: end of string
6C39 CALL $6C96 Print Area number
6C3C INC (IY+$65) increase Area number
6C3F CALL $7615 Print immediate string
6C42 DEFB $16,$19,$06 char $16: set position (col=$19, row=$06)
6C45 DEFM "NOW RUSH TO AREA "
6C57 DEFB $1F char $1F: end of string
6C58 CALL $6C96 Print Area number
6C5B LD BC,$0204 +2000
6C5E CALL $6825 Update Score
6C61 LD BC,$0096
6C64 CALL $7A5C Delay by BC HALTs
6C67 CALL $7615 Print immediate string
6C6A DEFB $16,$00,$0D char $16: set position (col=$00, row=$0D)
6C6D DEFB $1F char $1F: end of string
6C6E CALL $6C96 Print Area number
6C71 CALL $7615 Print immediate string
6C74 DEFB $19,$00 char $19: set flag bit 0 ($FDAF) = $00
6C76 DEFB $1F char $1F: end of string
6C77 JP $6BBE
6C7A: We've got A more grenades
Used by the routine at 6400.
Adds an amount to the grenade count and stores the new total.
6C7A ADD A,(IY+$67)
6C7D LD ($FDE7),A Update player's grenades number
6C80: Update grenades number on the screen
Used by the routine at 6BBB.
Redraws the grenade count in the status bar.
6C80 CALL $7615 Print immediate string
6C83 DEFB $10,$07 char $10: set $FDA0 bits 0-2 = $07
6C85 DEFB $11,$02 char $11: set $FDA0 bits 3-5 = $02
6C87 DEFB $19,$00 char $19: set flag bit 0 ($FDAF) = $00
6C89 DEFB $18,$00 char $18: set width counter ($FDB0) = $00
6C8B DEFB $16,$00,$1E char $16: set position (col=$00, row=$1E)
6C8E DEFB $15,$00 char $15: set/clear flag bit 1 ($FDAF) = $00
6C90 DEFB $1F char $1F: end of string
6C91 LD A,($FDE7) Get player's grenades number
6C94 JR $6C99 => Print 2-digit number A
6C96: Print Area number
Used by the routine at 6BBB.
6C96 LD A,($FDE5) Get Area number
6C99: Print 2-digit number A
Used by the routine at 6C80.
Input
A Number to print (0-99)
Prints a two-digit number, counting out the tens and then the units as characters.
6C99 PUSH BC
6C9A LD B,$2F
6C9C INC B
6C9D SUB $0A minus 10
6C9F JR NC,$6C9C
6CA1 PUSH AF
6CA2 LD A,B
6CA3 CALL $7637 Print Char
6CA6 POP AF
6CA7 ADD A,$3A
6CA9 CALL $7637 Print Char
6CAC POP BC
6CAD RET
6CAE: Game Over
Used by the routine at 6BBB.
Game Over. A score that does not make the table drops straight back to the menu; otherwise it draws the letter grid and lets the player steer around it with the joystick, picking out a name one letter at a time before the entry is written into the table.
6CAE CALL $70F8 Find a place in Top Score table
6CB1 OR A
6CB2 JP Z,$69F3 => Main menu
Enter name for the new Top Score record
6CB5 SUB $0B
6CB7 NEG
6CB9 LD ($FDB9),A
6CBC XOR A
6CBD LD ($FDBA),A
6CC0 CALL $7274 Print Score Table
6CC3 CALL $6AE1 Prepare status bar screen
6CC6 CALL $7615 Print immediate string
6CC9 DEFB $16,$0C,$01 char $16: set position (col=$0C, row=$01)
6CCC DEFB $13,$01 char $13: set fill char ($FD9F) = $01
6CCE DEFB $1F char $1F: end of string
6CCF LD HL,$6B67 Letters to select from entering Top Score
6CD2 LD C,$04 4 rows
6CD4 LD B,$08 8 columns
6CD6 LD A,(HL)
6CD7 INC HL
6CD8 CALL $7637 Print Char
6CDB LD A,$09
6CDD CALL $7637 Print Char
6CE0 DJNZ $6CD6
6CE2 CALL $7615 Print immediate string
6CE5 DEFB $03,$04,$0D char $03: repeat character $04, $0D times
6CE8 DEFB $1F char $1F: end of string
6CE9 DEC C
6CEA JR NZ,$6CD4
6CEC CALL $7615 Print immediate string
6CEF DEFB $16,$20,$01 char $16: set position (col=$20, row=$01)
6CF2 DEFB $18,$02 char $18: set width counter ($FDB0) = $02
6CF4 DEFB $19,$01 char $19: set flag bit 0 ($FDAF) = $01
6CF6 DEFB $11,$01 char $11: set $FDA0 bits 3-5 = $01
6CF8 DEFM "ENTER YOUR NAME"
6D07 DEFB $19,$00 char $19: set flag bit 0 ($FDAF) = $00
6D09 DEFB $11,$00 char $11: set $FDA0 bits 3-5 = $00
6D0B DEFB $13,$00 char $13: set fill char ($FD9F) = $00
6D0D DEFB $1F char $1F: end of string
6D0E LD HL,$70A1 Copy the marker sprite record into place
6D11 LD DE,$70AF
6D14 LD BC,$000E Fourteen bytes of it
6D17 LDIR
6D19 LD IX,$70AF Point at the working copy
6D1D LD B,$11
6D1F PUSH BC Animate for seventeen frames
6D20 HALT
6D21 INC (IX+$05) Step the sprite down a row
6D24 BIT 0,B Flash the colour on alternate frames
6D26 JR Z,$6D30
6D28 LD A,($70B6) Invert the ink
6D2B XOR $0F
6D2D LD ($70B6),A
6D30 CALL $98D0 Update object IX position, clip to screen, dispatch sprite draw
6D33 HALT
6D34 POP BC
6D35 DJNZ $6D1F
6D37 XOR A
6D38 LD ($70B6),A
6D3B CALL $98D0 Update object IX position, clip to screen, dispatch sprite draw
6D3E CALL $70EC Copy 64 bytes $66D1 to $6711
6D41 LD A,$14
6D43 LD ($FDB2),A
6D46 XOR A
6D47 LD ($FDB6),A
6D4A CALL $70BD XOR attribute pattern onto screen, explosion effect
6D4D LD A,($FD98) Get last key read from keyboard
6D50 OR A
6D51 JR NZ,$6D5A
6D53 LD A,($FD85) Get last joystick/keyboard bits
6D56 AND $1F
6D58 JR Z,$6D4D
6D5A CALL $7615 Print immediate string
6D5D DEFB $16,$20,$01 char $16: set position (col=$20, row=$01)
6D60 DEFB $03,$0F,$20 char $03: repeat character $20, $0F times
6D63 DEFB $18,$03 char $18: set width counter ($FDB0) = $03
6D65 DEFB $1F char $1F: end of string
6D66 CALL $6FC7 Prepare records at $6FD9
6D69 CALL $6F46 Prepare records at $6FE5
6D6C LD (IY+$38),$01
6D70 HALT
6D71 BIT 4,(IY+$05) Check bit 4 (Fire) of Last joystick/keyboard bits ($FD85)
6D75 JR NZ,$6D7D
6D77 LD (IY+$37),$00
6D7B JR $6D84
6D7D LD A,($FDB7)
6D80 OR A
6D81 CALL Z,$6F79 Find free record in table at $6FD9
6D84 CALL $6E7B Update the Top Score name-entry selectors
6D87 DEC (IY+$38)
6D8A JR NZ,$6D93
6D8C LD (IY+$38),$02
6D90 CALL $6E11 Print table row using $6E34
6D93 HALT
6D94 LD IX,$70AF
6D98 CALL $98D0 Update object IX position, clip to screen, dispatch sprite draw
6D9B CALL $70BD XOR attribute pattern onto screen, explosion effect
6D9E LD A,($FD85) Get last joystick/keyboard bits
6DA1 AND $0C Left or right pressed, but not both?
6DA3 JP PE,$6DB1
6DA6 CP $04 Pick the step direction
6DA8 LD A,$01
6DAA JR Z,$6DAE
6DAC LD A,$FF
6DAE LD ($FDB6),A Store the horizontal step
6DB1 LD A,($FDB2) Advance the cursor position by its step
6DB4 ADD A,(IY+$36)
6DB7 CP $13 Stop at either end of the grid
6DB9 JR Z,$6DCC
6DBB CP $2D
6DBD JR Z,$6DCC
6DBF LD ($FDB2),A Store the new position
6DC2 AND $07 On a cell boundary?
6DC4 CP $04
6DC6 JR NZ,$6DCC
6DC8 XOR A Clear the step so it settles
6DC9 LD ($FDB6),A
6DCC LD A,($FD85) Get last joystick/keyboard bits
6DCF AND $03
6DD1 JP PE,$6DDD
6DD4 CP $01
6DD6 JR Z,$6DDA
6DD8 LD A,$FF
6DDA LD ($70BB),A
6DDD LD C,(IX+$0C)
6DE0 CALL $6FF5 Advance strip position, scroll the $6711 tile buffer
6DE3 LD A,($70B5)
6DE6 OR A
6DE7 JR NZ,$6E02
6DE9 BIT 0,(IX+$04)
6DED JR NZ,$6E02
6DEF LD (IX+$0C),$00
6DF3 LD A,($70BC)
6DF6 CP $03
6DF8 JR Z,$6E02
6DFA INC A
6DFB JR C,$6DFF
6DFD SUB $02
6DFF LD ($70BC),A
6E02 CALL $70BD XOR attribute pattern onto screen, explosion effect
6E05 JP $6D70
6E08: Name entry finished: wait for the key to lift, clear the screen and return to the menu
Name entry is finished: waits for the key to lift, clears the screen and drops back to the menu.
6E08 CALL $6B14 Wait key unpress, wait key press
6E0B CALL $6B21 Clear playfield and status screen/attribute areas
6E0E JP $69F9
6E11: Print table row using $6E34
Used by the routines at 6CAE and 6F1D.
Prints one row of the high-score table, walking the eight entries and skipping any slot that is empty.
6E11 LD HL,$6FE5 Point at the 8 records
6E14 LD B,$08
6E16 PUSH BC
6E17 LD A,(HL)
6E18 INC HL
6E19 LD C,A
6E1A INC A Skip inactive entries ($FF)
6E1B JR Z,$6E2F
6E1D LD A,(HL)
6E1E CALL $6E34 Print char with derived attribute
6E21 INC (HL)
6E22 LD A,(HL)
6E23 CALL $6E34 Print char with derived attribute
6E26 LD A,(HL)
6E27 CP $20 Finished at $20? mark it done
6E29 JR NZ,$6E2F
6E2B DEC HL
6E2C LD (HL),$FF
6E2E INC HL
6E2F POP BC
6E30 INC HL
6E31 DJNZ $6E16
6E33 RET
6E34: Print char with derived attribute
Used by the routine at 6E11.
Input
A Row/position value
C Character code to print
Prints one letter of a top-score name in the right place, turning the letter into a screen row and column and feeding that position to the printer as formatting codes before the letter itself.
6E34 LD E,C Set the print position (opcode $16)
6E35 LD D,A
6E36 LD A,$16
6E38 CALL $7637 Print Char
6E3B LD A,C Column from the letter
6E3C SUB $41
6E3E JR NC,$6E42
6E40 ADD A,$21
6E42 AND $F8 Scale to a screen column
6E44 SRL A
6E46 ADD A,$0C
6E48 CALL $7637 Print Char
6E4B LD A,C Row from the letter
6E4C CP $41
6E4E ADC A,$00
6E50 DEC A
6E51 AND $07
6E53 ADD A,A
6E54 INC A
6E55 CALL $7637 Print Char
6E58 LD A,D
6E59 AND $03
6E5B RRCA
6E5C JR NC,$6E64
6E5E LD A,$03
6E60 LD C,$40
6E62 JR $6E6B
6E64 OR A
6E65 LD A,$03
6E67 JR Z,$6E6B
6E69 LD A,$01
6E6B LD B,A
6E6C LD A,$18
6E6E CALL $7637 Print Char
6E71 LD A,B
6E72 CALL $7637 Print Char
6E75 LD A,C
6E76 CALL $7637 Print Char
6E79 LD C,E
6E7A RET
6E7B: Update the Top Score name-entry selectors
Used by the routine at 6CAE.
Steps the four name-entry selectors, each on its own timer. When one expires it works out which letter of the grid it landed on, and either commits that letter or finishes the name on the end marker.
6E7B LD IX,$6FD9 Walk the 4 selectors
6E7F LD B,$04
6E81 LD A,(IX+$00) Skip inactive selectors
6E84 INC A
6E85 JR Z,$6E9A
6E87 CALL $6FB0
6E8A DEC (IX+$02) Count down its timer, select on zero
6E8D JR Z,$6EA2
6E8F LD A,(IX+$01) Move the selector
6E92 SUB $04
6E94 LD (IX+$01),A
6E97 CALL $6FB0
6E9A LD DE,$0003
6E9D ADD IX,DE
6E9F DJNZ $6E81
6EA1 RET
6EA2 LD L,(IX+$00)
6EA5 LD H,(IX+$01)
6EA8 LD (IX+$00),$FF
6EAC LD A,H Convert the cursor to a grid cell
6EAD SUB $16
6EAF AND $F8
6EB1 SRL L
6EB3 ADD A,L
6EB4 LD HL,$6B67 Letters to select from entering Top Score
6EB7 CALL $98D3 HL = HL + A
6EBA LD A,(HL)
6EBB CP $3F End marker? finish the name
6EBD JR Z,$6F1D
6EBF PUSH BC
6EC0 PUSH AF
6EC1 CALL $6ECD Draw/move the Top Score name-entry cursor
6EC4 POP AF
6EC5 CP $3E
6EC7 CALL NZ,$6F52 Look up record in $6FE5 table, mask low bits
6ECA POP BC
6ECB JR $6E9A
6ECD: Draw/move the Top Score name-entry cursor
Used by the routine at 6E7B.
Input
C Selected key/letter code
Redraws the name-entry cursor at its current row and column. One special code steps the cursor back instead of forward, and the column wraps round at the end of the row.
6ECD LD C,A
6ECE CALL $7615 Print immediate string
6ED1 DEFB $18,$00 char $18: set width counter ($FDB0) = $00
6ED3 DEFB $16 char $16: opens (2 args) but string ends here -- dangling, never dispatched
6ED4 DEFB $1F char $1F: end of string
6ED5 LD A,($FDB9) Cursor row into a print char
6ED8 LD H,A
6ED9 ADD A,A Scale to the cursor glyph
6EDA ADD A,H
6EDB ADD A,$0C
6EDD CALL $7637 Print Char
6EE0 LD A,($FDBA) Cursor column into a print char
6EE3 LD E,A
6EE4 ADD A,$11
6EE6 CALL $7637 Print Char
6EE9 LD HL,$FDBA
6EEC LD A,C
6EED CP $3E Special key ($3E)?
6EEF JR NZ,$6EF8
6EF1 INC E
6EF2 DEC E
6EF3 RET Z
6EF4 DEC (HL)
6EF5 DEC (HL)
6EF6 LD C,$0C
6EF8 LD A,(HL)
6EF9 INC A Wrap the column at 9
6EFA CP $09
6EFC RET Z
6EFD LD (HL),A
6EFE DEC HL
6EFF LD A,(HL)
6F00 ADD A,A
6F01 ADD A,A
6F02 ADD A,A
6F03 ADD A,A
6F04 SUB (HL)
6F05 INC HL
6F06 ADD A,(HL)
6F07 LD HL,$72B2 Score table address
6F0A DEC A
6F0B CP $FF
6F0D RET Z
6F0E CALL $98D3 HL = HL + A
6F11 LD A,C
6F12 CP $0C
6F14 JR NZ,$6F19
6F16 INC HL
6F17 LD C,$20
6F19 LD (HL),C
6F1A JP $7637 => Print Char
6F1D: Name-entry outro: draw selectors, animate, clear
Used by the routine at 6E7B.
Name-entry outro: draws whatever selectors are still active, animates the table row for a few seconds, then clears the screen and returns to the menu.
6F1D LD IX,$6FD9 Walk the 4 selectors
6F21 LD B,$04
6F23 LD DE,$0003
6F26 LD A,(IX+$00) Draw each active one
6F29 INC A
6F2A CALL NZ,$6FB0
6F2D ADD IX,DE
6F2F DJNZ $6F26
6F31 LD B,$14 Animate for 20 frames
6F33 PUSH BC
6F34 LD B,$04
6F36 HALT Wait 4 frames
6F37 DJNZ $6F36
6F39 CALL $6E11 Print table row using $6E34
6F3C POP BC
6F3D DJNZ $6F33
6F3F POP BC
6F40 CALL $6B21 Clear playfield and status screen/attribute areas
6F43 JP $69F9
6F46: Prepare records at $6FE5
Used by the routine at 6CAE.
Marks all eight name-entry record slots free.
6F46 LD HL,$6FE5
6F49 LD B,$08
6F4B LD (HL),$FF
6F4D INC HL
6F4E INC HL
6F4F DJNZ $6F4B
6F51 RET
6F52: Look up record in $6FE5 table, mask low bits
Used by the routine at 6E7B.
Input
A Value to search for in the table
Output
HL Matched or newly-claimed entry
Looks a value up in the eight-entry record table, trimming the entry it finds; if the value is not there it claims a free slot for it instead.
6F52 LD C,A Scan table for matching value C
6F53 LD HL,$6FE5
6F56 LD B,$08
6F58 LD A,(HL)
6F59 CP C
6F5A JR Z,$6F6E
6F5C INC HL
6F5D INC HL
6F5E DJNZ $6F58
6F60 LD HL,$6FE5 Scan for a free ($FF) slot
6F63 LD B,$08
6F65 LD A,(HL) Free slot?
6F66 INC A
6F67 JR Z,$6F74
6F69 INC HL
6F6A INC HL
6F6B DJNZ $6F65
6F6D RET
6F6E INC HL Mask found entry to 2 bits
6F6F LD A,(HL)
6F70 AND $03
6F72 LD (HL),A
6F73 RET
6F74 LD (HL),C Claim it with the value
6F75 INC HL
6F76 LD (HL),$00
6F78 RET
6F79: Find free record in table at $6FD9
Used by the routine at 6CAE.
Claims a free name-entry selector and sets it going, working out its starting animation frame from the current scroll position.
6F79 LD A,$FF
6F7B LD ($FDB7),A
6F7E LD IX,$6FD9
6F82 LD B,$04
6F84 LD DE,$0003
6F87 LD A,(IX+$00) Check record slot free (byte = $FF)
6F8A INC A
6F8B JR Z,$6F92
6F8D ADD IX,DE
6F8F DJNZ $6F87
6F91 RET
6F92 LD A,($70B3) Mark record active, set flag byte
6F95 INC A
6F96 OR $01
6F98 LD (IX+$00),A
6F9B LD A,$4E
6F9D LD (IX+$01),A
6FA0 SUB (IY+$32) Compute animation frame index into (IX+$02)
6FA3 SUB $06
6FA5 AND $F8
6FA7 SRL A
6FA9 SRL A
6FAB ADD A,$02
6FAD LD (IX+$02),A
This entry point is used by the routines at 6E7B and 6F1D.
6FB0 LD L,(IX+$00)
6FB3 SLA L
6FB5 SLA L
6FB7 LD H,(IX+$01)
6FBA CALL $98D9 Convert row number to screen line address
6FBD LD A,(HL)
6FBE XOR $30
6FC0 LD (HL),A
6FC1 INC H
6FC2 LD A,(HL)
6FC3 XOR $30
6FC5 LD (HL),A
6FC6 RET
6FC7: Prepare records at $6FD9
Used by the routine at 6CAE.
Marks all four name-entry selector slots free.
6FC7 LD IX,$6FD9
6FCB LD DE,$0003
6FCE LD B,$04
6FD0 LD (IX+$00),$FF
6FD4 ADD IX,DE
6FD6 DJNZ $6FD0
6FD8 RET
6FD9: Name-entry selector records, 4 of 3 bytes
6FD9 DEFB $00,$00,$00
6FDC DEFB $00,$00,$00
6FDF DEFB $00,$00,$00
6FE2 DEFB $00,$00,$00
6FE5: Name-entry letter records, 8 of 2 bytes
6FE5 DEFB $00,$00,$00,$00,$00,$00,$00,$00
6FED DEFB $00,$00,$00,$00,$00,$00,$00,$00
6FF5: Advance strip position, scroll the $6711 tile buffer
Used by the routine at 6CAE.
Input
IX Strip record
C Base offset from (IX+$0C)
Steps to the next entry in the strip, noting any feature found there, then scrolls the tile buffer a couple of pixels to follow it. Only the top-score name-entry loop calls this, and what the buffer depicts has not been traced.
6FF5 LD A,($70B3) Row index * 4 into A
6FF8 ADD A,A
6FF9 ADD A,A
6FFA ADD A,(IX+$06)
6FFD ADD A,C
6FFE LD B,A
6FFF CP $FF Stop at the strip end
7001 RET Z
7002 CP $39
7004 RET Z
7005 AND $03 Sub-column position
7007 LD ($70B5),A
700A LD A,B Extract high bits of B into new row
700B SRL A
700D SRL A
700F LD ($70B3),A
7012 LD A,($70BC) Advance the column pointer
7015 ADD A,C
7016 LD B,A
7017 LD HL,$709A Look up entry offset in $709A table
701A CALL $98D3 HL = HL + A
701D LD A,(HL)
701E CP $FF Nothing here? skip
7020 JR Z,$7029
7022 LD ($70B6),A Record the feature
7025 LD A,B
7026 LD ($70BC),A
7029 LD A,($70B5) Which way to scroll?
702C LD B,C
702D LD C,$02
702F DJNZ $7037
7031 OR A
7032 JP Z,$70EC => Copy 64 bytes $66D1 to $6711
7035 JR $7057
7037 INC B
7038 RET Z
7039 CP $03
703B JR Z,$706E => Unpack $66D1 record, scale coordinate x4
703D LD DE,$0007 Scroll the tile buffer left
7040 LD HL,$6714
7043 LD B,$10
7045 SLA (HL) Rotate one column's bits left
7047 DEC HL
7048 RL (HL)
704A DEC HL
704B RL (HL)
704D DEC HL
704E RL (HL)
7050 ADD HL,DE
7051 DJNZ $7045
7053 DEC C
7054 JR NZ,$703D
7056 RET
7057 LD HL,$6711 Scroll the tile buffer right
705A LD B,$10
705C SRL (HL)
705E INC HL #1 second buffer byte
705F RR (HL)
7061 INC HL #2 third byte
7062 RR (HL)
7064 INC HL #3 fourth byte
7065 RR (HL)
7067 INC HL
7068 DJNZ $705C
706A DEC C
706B JR NZ,$7057
706D RET
706E: Unpack $66D1 record, scale coordinate x4
Used by the routine at 6FF5.
Unpacks a run of packed records into the tile buffer, scaling each value up by four as it goes.
706E LD HL,$66D1 Source records ($66D1)
7071 LD DE,$6711 Destination buffer ($6711)
7074 EXX
7075 LD B,$10
7077 EXX
7078 LD C,(HL) Read the 3 packed bytes
7079 INC HL
707A LD B,(HL)
707B INC HL
707C LD A,(HL)
707D INC HL
707E INC HL
707F SLA A Scale the value left x4
7081 RL B
7083 RL C
7085 SLA A
7087 RL B
7089 RL C
708B EX DE,HL
708C LD (HL),$00 Write the 4-byte record
708E INC HL
708F LD (HL),C
7090 INC HL
7091 LD (HL),B
7092 INC HL
7093 LD (HL),A
7094 INC HL
7095 EX DE,HL
7096 EXX
7097 DJNZ $7077
7099 RET
709A: Feature codes for the name-entry strip, indexed by column
709A DEFB $FF,$0B,$0D,$00,$02,$04,$FF,$08
70A2 DEFB $3D,$00,$07,$08,$3D,$00,$07,$48
70AA DEFB $5F,$0A,$00,$00,$03,$00,$00,$00
70B2 DEFB $00,$00,$00,$00,$00,$00,$00,$00
70BA DEFB $00,$00,$00
70BD: XOR attribute pattern onto screen, explosion effect
Used by the routine at 6CAE.
XORs a small pattern over sixteen screen rows, flipping the pixels beneath it -- the flashing effect used on the Game Over screen.
70BD LD A,($70B3) Column * 4
70C0 ADD A,A
70C1 ADD A,A
70C2 LD L,A
70C3 LD A,($FDB2) Row from ($FDB2)
70C6 ADD A,$02
70C8 LD H,A
70C9 CALL $98D9 Convert row number to screen line address
70CC LD B,$10
70CE LD DE,$6711 Pattern source ($6711)
70D1 LD C,L XOR the pattern bytes onto the row
70D2 LD A,(DE) #0 first pattern byte
70D3 INC DE
70D4 XOR (HL)
70D5 LD (HL),A
70D6 INC L
70D7 LD A,(DE) #1 second pattern byte
70D8 INC DE
70D9 XOR (HL)
70DA LD (HL),A
70DB INC L
70DC LD A,(DE) #2 third pattern byte
70DD INC DE
70DE XOR (HL)
70DF LD (HL),A
70E0 INC L
70E1 LD A,(DE)
70E2 INC DE
70E3 XOR (HL)
70E4 LD (HL),A
70E5 LD L,C
70E6 CALL $98DC DOWN HL
70E9 DJNZ $70D1
70EB RET
70EC: Copy 64 bytes $66D1 to $6711
Used by the routines at 6CAE and 6FF5.
Copies the packed record block into the tile buffer.
70EC LD HL,$66D1
70EF LD DE,$6711
70F2 LD BC,$0040
70F5 LDIR
70F7 RET
70F8: Find a place in Top Score table
Used by the routine at 6CAE.
Output
A Rank found, 0 if the score does not place
Ranks a finished score against the high-score table, working down the entries until it finds one the score beats. It reports the position, or zero when the score does not place.
70F8 LD HL,$FDE8 Score address
70FB LD DE,$72AC Point at the table entries
70FE LD C,$0B
7100 LD B,$0F
7102 INC DE Skip to the next entry start
7103 DJNZ $7102
7105 PUSH HL
7106 PUSH DE
7107 EXX
7108 POP DE
7109 POP HL
710A LD B,$06
710C LD A,(DE) Beat this entry?
710D CP (HL)
710E JR C,$711C
7110 JR NZ,$7116
7112 INC HL
7113 INC DE
7114 DJNZ $710C
7116 EXX
7117 DEC C
7118 JR NZ,$7100
711A XOR A No place: return zero
711B RET
711C EXX
711D LD A,C Remember the rank
711E PUSH AF
711F DEC A
7120 JR Z,$7132
7122 EXX
7123 LD HL,$7347 Top score #10 last char address
7126 LD DE,$7356 Top score #11 last char address
7129 LD BC,$000F Top score line width = 15
712C LDDR Shift lower entries down
712E DEC A
712F JR NZ,$7129
7131 EXX
7132 LD A,$20 Blank the freed slot
7134 PUSH DE
7135 LD B,$09
7137 DEC DE
7138 LD (DE),A
7139 DJNZ $7137
713B POP DE
713C LD BC,$0006
713F LDIR Copy the score in
7141 POP AF
7142 RET
7143: Select joystick type
Used by the routine at 69F3.
Joystick selection screen: lists the four supported types and waits for a matching number key, then returns to the menu.
7143 CALL $7615 Print immediate string
7146 DEFB $11,$02 char $11: set $FDA0 bits 3-5 = $02
7148 DEFB $10,$07 char $10: set $FDA0 bits 0-2 = $07
714A DEFB $18,$02 char $18: set width counter ($FDB0) = $02
714C DEFB $16,$0C,$00 char $16: set position (col=$0C, row=$00)
714F DEFB $15,$00 char $15: set/clear flag bit 1 ($FDAF) = $00
7151 DEFB $19,$01 char $19: set flag bit 0 ($FDAF) = $01
7153 DEFM "SELECT"
7159 DEFB $16,$13,$00 char $16: set position (col=$13, row=$00)
715C DEFB $19,$00 char $19: set flag bit 0 ($FDAF) = $00
715E DEFB $11,$00 char $11: set $FDA0 bits 3-5 = $00
7160 DEFM "1.KEMPSTON"
716A DEFB $03,$07,$0D char $03: repeat character $07, $0D times
716D DEFM "2.INTERFACE II"
717B DEFB $03,$07,$0D char $03: repeat character $07, $0D times
717E DEFM "3.FULLER"
7186 DEFB $03,$07,$0D char $03: repeat character $07, $0D times
7189 DEFM "4.CURSOR"
7191 DEFB $1F char $1F: end of string
7192 CALL $6B14 Wait key unpress, wait key press
7195 CP $31 < '1' ?
7197 JR C,$7192
7199 CP $35 >= '5' ?
719B JR NC,$7192
719D SUB $30 char '1'..'4' -> number 1..4
719F LD ($FD84),A
71A2 CALL $6751 Set up scrolling string
71A5 JP $6A0A
71A8: Print string HL
Used by the routine at 6A1E.
Input
HL String address
Prints a string pointed at by HL, stopping at its end marker.
71A8 LD A,(HL)
71A9 INC HL
71AA CP $1F
71AC RET Z
71AD CALL $7637 Print Char
71B0 JR $71A8 => Print string HL
71B2: Screen attributes, 4 bytes
71B2 DEFB $07,$05,$46,$06
71B6: Print credits screen, scroll text into $5923 area
Used by the routine at 69F3.
Prints the credits screen, copying the publisher text directly into screen memory a line at a time, then arms the screen wipe so the display dissolves away afterwards.
71B6 CALL $725D Print immediate string checking menu keys
71B9 DEFB $13,$00,$16,$0C,$02,$18,$02,$19
71C1 DEFB $01,$15,$00
71C4 DEFM "PUBLISHED BY"
71D0 DEFB $1F
71D1 LD DE,$71B2 Source text ($71B2)
71D4 LD HL,$5923 Screen destination ($5923)
71D7 LD C,$04
71D9 LD B,$0A Copy 10 chars per line into screen
71DB LD A,(DE)
71DC INC DE
71DD LD (HL),A
71DE INC L
71DF DJNZ $71DD
71E1 LD B,$16 Gap to the next line
71E3 INC HL
71E4 DJNZ $71E3
71E6 DEC C
71E7 JR NZ,$71D9
71E9 LD A,$40
71EB LD ($FDBC),A Arm the screen-wipe counter
71EE LD HL,$68CA Set the wipe handler
71F1 LD ($7392),HL Point the $7391 call at the screen wipe instead
71F4 SET 2,(IY+$07)
71F8 CALL $725D Print immediate string checking menu keys
71FB DEFB $16,$1D,$02,$18,$00
7200 DEFM "CONVERTED BY",$04,$14,$01
720F DEFM "KEITH BURKHILL",$04
721E DEFM "& NIGEL ALDERTON",$04,$0D,$14,$01
7232 DEFM "GRAPHIC DESIGN",$04,$14,$02
7243 DEFM "RORY & KAREN"
724F DEFB $1F
7250 RET
7251: Check menu keys
Used by the routines at 69F3 and 725D.
Reads the last key pressed and reports whether it is one of the three menu choices.
7251 LD A,($FD98) Get last key read from keyboard
7254 CP $53 'S' - Start game
7256 RET Z
7257 CP $4A 'J' - Joystick
7259 RET Z
725A CP $4B 'K' - Redefine keys
725C RET
725D: Print immediate string checking menu keys
Used by the routine at 71B6.
Prints a string a character at a time while watching for a menu key, abandoning the string as soon as one is pressed -- so the title screens stay responsive.
725D HALT Wait a frame
725E CALL $7251 Check menu keys
7261 POP HL Key pressed? stop
7262 JR Z,$726F
7264 LD A,(HL) Fetch the next char
7265 INC HL
7266 PUSH HL
7267 CP $1F End of string?
7269 RET Z
726A CALL $7637 Print Char
726D JR $725D => Print immediate string checking menu keys
726F RES 2,(IY+$07)
7273 RET
7274: Print Score Table
Used by the routines at 69F3 and 6CAE.
Prints the high-score table: blanks the screen, paints the panel behind it, then feeds the stored table text row by row through the character printer.
7274 XOR A
7275 OUT ($FE),A Set border black
7277 CALL $7615 Print immediate string
727A DEFB $01 char $01: reset print format state
727B DEFB $00,$07 char $00: clear screen, attribute = $07
727D DEFB $15,$01 char $15: set/clear flag bit 1 ($FDAF) = $01
727F DEFB $1F char $1F: end of string
7280 HALT
7281 LD HL,$58D1
7284 LD B,$0F
7286 LD C,$10
7288 LD A,$17
728A CALL $75BE Fill screen rectangle with byte
728D CALL $7615 Print immediate string
7290 DEFB $13,$11 char $13: set fill char ($FD9F) = $11
7292 DEFB $16,$0C,$11 char $16: set position (col=$0C, row=$11)
7295 DEFB $19,$00 char $19: set flag bit 0 ($FDAF) = $00
7297 DEFB $1F char $1F: end of string
7298 LD HL,$72B2 Score table address
729B LD C,$0B 11 = score table lines count
729D LD B,$0F
729F LD A,(HL)
72A0 CALL $7637 Print Char
72A3 INC HL
72A4 DJNZ $729F
72A6 LD A,$0D
72A8 CALL $7637 Print Char
72AB CALL $7637 Print Char
72AE DEC C
72AF JR NZ,$729D
72B1 RET
72B2: Score table
Used by the routine at EF37.
72B2 DEFM "KEITH... 060000"
72C1 DEFM "NIGUL... 050000"
72D0 DEFM "RORY.... 040000"
72DF DEFM "KAREN... 030000"
72EE DEFM "STUART.. 020000"
72FD DEFM "RAY..... 010000"
730C DEFM "CLARE... 009000"
731B DEFM "CHRIS... 008000"
732A DEFM "DAWN.... 007000"
7339 DEFM "PAT.LYNN 006000"
7348 DEFM "TA.MYK.. 005000"
7357: Game main loop / frame handler
Used by the routines at 6400, 7A42 and EF37.
The interrupt handler, and the spine of the frame. It switches to its own stack, verifies the code checksum, reads the controls, ticks the sound and updates the status bar, then restores everything and returns through the delay routine.
7357 LD ($FD8F),HL
735A LD HL,$0000
735D EX (SP),HL
735E LD ($FD92),HL Patch the $FD91 trampoline to return to the interrupted code
7361 LD ($FD8D),SP
7365 LD SP,$FD80
7368 PUSH AF
7369 PUSH BC
736A PUSH DE
736B BIT 1,(IY+$07)
736F JR NZ,$73A4
7371 CALL $7405 Compute code checksum
7374 CALL $7547 Read input
7377 LD ($FD85),A Save the input
737A AND $C0
737C CP $C0
737E LD HL,$FDC2
7381 DEC (HL)
7382 JR NZ,$738D
7384 LD (HL),$02
7386 SET 0,(IY+$07)
738A CALL $6474 Sound-effect dispatcher, 7 channels
738D BIT 2,(IY+$07)
7391 CALL NZ,$6975 Fill status-bar columns down, calling $699A per column
7394 POP DE
7395 POP BC
7396 POP AF
7397 LD HL,($FD8F)
739A LD SP,($FD8D)
739E INC SP
739F INC SP
73A0 EI
73A1 JP $FD91 => Interrupt return trampoline, built in RAM
73A4 CALL $73B7 Read Keyboard
73A7 LD ($FD98),A Save last key read from keyboard
73AA LD ($FD99),BC
73AE BIT 3,(IY+$07)
73B2 CALL NZ,$676B Scroll the message banner one pixel left
73B5 JR $7374
73B7: Read Keyboard
Used by the routine at 7357.
Reads the keyboard, scanning the half-rows in turn until it finds one with a key down, then working out which column it was and looking the character up in the key map.
73B7 LD BC,$FEFE
73BA LD HL,$73DC
73BD LD DE,$0005
73C0 IN A,(C) Read the half-row
73C2 OR $E0 Keep the five key bits, active high
73C4 CPL
73C5 OR A
73C6 JR NZ,$73D1 Any key down? go and identify it
73C8 ADD HL,DE Otherwise step to the next row
73C9 RLC B
73CB JR C,$73C0
73CD XOR A
73CE LD B,A
73CF LD C,A
73D0 RET
73D1 LD C,B Key found: set carry marker, clear column counter
73D2 LD B,$00
73D4 SCF
73D5 INC HL Advance the map pointer
73D6 RL B
73D8 RRCA Rotate the next bit into carry
73D9 JR NC,$73D5
73DB LD A,(HL) Look up char for (row,column) from keyboard map
73DC RET
Keyboard map
73DD DEFM $01,"ZXCV"
73E2 DEFM "ASDFG"
73E7 DEFM "QWERT"
73EC DEFM "12345"
73F1 DEFM "09876"
73F6 DEFM "POIUY"
73FB DEFM $0D,"LKJH"
7400 DEFM " ",$02,"MNB"
7405: Compute code checksum
Used by the routine at 7357.
Anti-tamper check. Each call folds one byte from every code page into a single value and stores it, sweeping a column of memory at a time; once the sweep completes it mixes in a second checksum and saves both halves.
7405 LD DE,($FD8D) Below $8000? no check needed
7409 LD A,D Above $EFFF? no check needed either
740A CP $80
740C RET C
740D CP $F0
740F JP NC,$74FF
7412 CALL $7416 Fold in the adjacent byte too, then advance
7415 INC DE
7416 LD L,E Aim at page $80, clear the accumulator
7417 LD H,$80
7419 XOR A
741A XOR (HL) XOR page $80
741B INC H
741C XOR (HL)
741D INC H
741E XOR (HL)
741F INC H
7420 XOR (HL)
7421 INC H
7422 XOR (HL)
7423 INC H
7424 XOR (HL)
7425 INC H
7426 XOR (HL)
7427 INC H
7428 XOR (HL)
7429 INC H
742A XOR (HL) XOR page $88
742B INC H
742C XOR (HL)
742D INC H
742E XOR (HL)
742F INC H
7430 XOR (HL)
7431 INC H
7432 XOR (HL)
7433 INC H
7434 XOR (HL)
7435 INC H
7436 XOR (HL)
7437 INC H
7438 XOR (HL)
7439 INC H
743A XOR (HL) XOR page $90
743B INC H
743C XOR (HL)
743D INC H
743E XOR (HL)
743F INC H
7440 XOR (HL)
7441 INC H
7442 XOR (HL)
7443 INC H
7444 XOR (HL)
7445 INC H
7446 XOR (HL)
7447 INC H
7448 XOR (HL)
7449 INC H
744A XOR (HL) XOR page $98
744B INC H
744C XOR (HL)
744D INC H
744E XOR (HL)
744F INC H
7450 XOR (HL)
7451 INC H
7452 XOR (HL)
7453 INC H
7454 XOR (HL)
7455 INC H
7456 XOR (HL)
7457 INC H
7458 XOR (HL)
7459 INC H
745A XOR (HL) XOR page $A0
745B INC H
745C XOR (HL)
745D INC H
745E XOR (HL)
745F INC H
7460 XOR (HL)
7461 INC H
7462 XOR (HL)
7463 INC H
7464 XOR (HL)
7465 INC H
7466 XOR (HL)
7467 INC H
7468 XOR (HL)
7469 INC H
746A XOR (HL) XOR page $A8
746B INC H
746C XOR (HL)
746D INC H
746E XOR (HL)
746F INC H
7470 XOR (HL)
7471 INC H
7472 XOR (HL)
7473 INC H
7474 XOR (HL)
7475 INC H
7476 XOR (HL)
7477 INC H
7478 XOR (HL)
7479 INC H
747A XOR (HL) XOR page $B0
747B INC H
747C XOR (HL)
747D INC H
747E XOR (HL)
747F INC H
7480 XOR (HL)
7481 INC H
7482 XOR (HL)
7483 INC H
7484 XOR (HL)
7485 INC H
7486 XOR (HL)
7487 INC H
7488 XOR (HL)
7489 INC H
748A XOR (HL) XOR page $B8
748B INC H
748C XOR (HL)
748D INC H
748E XOR (HL)
748F INC H
7490 XOR (HL)
7491 INC H
7492 XOR (HL)
7493 INC H
7494 XOR (HL)
7495 INC H
7496 XOR (HL)
7497 INC H
7498 XOR (HL)
7499 INC H
749A XOR (HL) XOR page $C0
749B INC H
749C XOR (HL)
749D INC H
749E XOR (HL)
749F INC H
74A0 XOR (HL)
74A1 INC H
74A2 XOR (HL)
74A3 INC H
74A4 XOR (HL)
74A5 INC H
74A6 XOR (HL)
74A7 INC H
74A8 XOR (HL)
74A9 INC H
74AA XOR (HL) XOR page $C8
74AB INC H
74AC XOR (HL)
74AD INC H
74AE XOR (HL)
74AF INC H
74B0 XOR (HL)
74B1 INC H
74B2 XOR (HL)
74B3 INC H
74B4 XOR (HL)
74B5 INC H
74B6 XOR (HL)
74B7 INC H
74B8 XOR (HL)
74B9 INC H
74BA XOR (HL) XOR page $D0
74BB INC H
74BC XOR (HL)
74BD INC H
74BE XOR (HL)
74BF INC H
74C0 XOR (HL)
74C1 INC H
74C2 XOR (HL)
74C3 INC H
74C4 XOR (HL)
74C5 INC H
74C6 XOR (HL)
74C7 INC H
74C8 XOR (HL)
74C9 INC H
74CA XOR (HL) XOR page $D8
74CB INC H
74CC XOR (HL)
74CD INC H
74CE XOR (HL)
74CF INC H
74D0 XOR (HL)
74D1 INC H
74D2 XOR (HL)
74D3 INC H
74D4 XOR (HL)
74D5 INC H
74D6 XOR (HL)
74D7 INC H
74D8 XOR (HL)
74D9 INC H
74DA XOR (HL) XOR page $E0
74DB INC H
74DC XOR (HL)
74DD INC H
74DE XOR (HL)
74DF INC H
74E0 XOR (HL)
74E1 INC H
74E2 XOR (HL)
74E3 INC H
74E4 XOR (HL)
74E5 INC H
74E6 XOR (HL)
74E7 INC H
74E8 XOR (HL)
74E9 INC H
74EA XOR (HL) XOR page $E8
74EB INC H
74EC XOR (HL)
74ED INC H
74EE XOR (HL)
74EF INC H
74F0 XOR (HL)
74F1 INC H
74F2 XOR (HL)
74F3 INC H
74F4 XOR (HL)
74F5 INC H
74F6 XOR (HL)
74F7 INC H
74F8 XOR (HL) XOR page $EF, last of the sweep
74F9 INC H
74FA LD H,$FA Then skip to page $FA
74FC XOR (HL) XOR page $FA into the sum
74FD LD (DE),A
74FE RET
74FF LD A,($FDF5) Fold in checksum from $7511, store to ($FD8D)
7502 EX AF,AF'
7503 LD A,($FDF4)
7506 CALL $7511 XOR AF and AF' with every byte in $F900-F9FF
7509 LD HL,($FD8D) Point at the stored checksum
750C LD (HL),A
750D EX AF,AF' Take the other half
750E INC L
750F LD (HL),A Store it alongside
7510 RET
7511: XOR AF and AF' with every byte in $F900-F9FF
Used by the routines at 6400 and 7405.
Folds a whole page of memory into a pair of checksum bytes, XORing alternate bytes into each half through the two accumulators.
7511 LD HL,$F900 Set up loop pointer to $F900
7514 XOR (HL) #0
7515 EX AF,AF'
7516 INC L
7517 XOR (HL) #1
7518 EX AF,AF'
7519 INC L
751A XOR (HL) #2
751B EX AF,AF'
751C INC L
751D XOR (HL) #3
751E EX AF,AF'
751F INC L
7520 XOR (HL) #4
7521 EX AF,AF'
7522 INC L
7523 XOR (HL) #5
7524 EX AF,AF'
7525 INC L
7526 XOR (HL) #6
7527 EX AF,AF'
7528 INC L
7529 XOR (HL) #7
752A EX AF,AF'
752B INC L
752C XOR (HL) #8
752D EX AF,AF'
752E INC L
752F XOR (HL) #9
7530 EX AF,AF'
7531 INC L
7532 XOR (HL) #10
7533 EX AF,AF'
7534 INC L
7535 XOR (HL) #11
7536 EX AF,AF'
7537 INC L
7538 XOR (HL) #12
7539 EX AF,AF'
753A INC L
753B XOR (HL) #13
753C EX AF,AF'
753D INC L
753E XOR (HL) #14
753F EX AF,AF'
7540 INC L
7541 XOR (HL) #15
7542 EX AF,AF'
7543 INC L
7544 JR NZ,$7514
7546 RET
7547: Read input: joystick or keyboard
Used by the routine at 7357.
Reads the controls, dispatching to whichever joystick handler the player picked or to the keyboard reader when none is set. Kempston and Fuller read their ports directly; Interface II and Cursor scan the keyboard instead.
7547 LD C,$00
7549 LD A,($FD84) Get joystick type 0..4
754C DEC A
754D JP M,$75A8 => Read keyboard in game mode
7550 ADD A,A
7551 LD HL,$755B
7554 CALL $98D3 HL = HL + A
7557 CALL $98D6 (HL) -> HL
755A JP (HL) Go to joystick read procedure
755B DEFW $7563 Joystick read procedure addresses
755D DEFW $7569
755F DEFW $757A
7561 DEFW $7587
7563: Read the Kempston joystick from port $1F
Read Kempston
7563 IN A,($1F) Kempston: read its port directly
7565 AND $1F
7567 LD C,A Return the direction bits
7568 RET
7569: Read Interface II: scan its port and mask list
Read Interface II
7569 LD HL,$7570 Interface II: scan through its port and mask list
756C LD B,$08
756E JR $75AD
7570 DEFB $EF,$01,$EF,$02,$EF,$04,$EF,$10 Keyboard ports + bit masks for cursor keys
7578 DEFB $EF,$08
757A: Read the Fuller joystick from port $7F
Read Fuller
757A LD B,$10 Fuller: read its port and count the bit position
757C IN A,($7F)
757E RLCA
757F RRCA Rotate until the pressed bit falls out
7580 RL B
7582 JR NC,$757F
7584 CPL Invert, since the port reads active low
7585 LD C,A
7586 RET
7587: Read the cursor keys: scan their port and mask list
Read Cursor
7587 LD HL,$758E Cursor keys: scan through their port and mask list
758A LD B,$08
758C JR $75AD
758E DEFB $EF,$01,$EF,$08,$EF,$10,$F7,$10 Keyboard ports + bit masks for cursor keys
7596 DEFB $EF,$04
7598: Keyboard ports and bit masks - keys to read in game mode
7598 DEFB $FE,$01,$7F,$01,$7F,$04,$FE,$02
75A0 DEFB $F7,$02,$FB,$02,$EF,$02,$EF,$01
75A8: Read keyboard in game mode
Used by the routine at 7547.
Reads the movement keys during play, testing each one against its keyboard port and building the direction bits.
75A8 LD B,$01 Set up bit mask, port table pointer
75AA LD HL,$7598
This entry point is used by the routines at 7569 and 7587.
75AD LD A,(HL) Read the port
75AE INC HL
75AF IN A,($FE) Test the key bit against it
75B1 AND (HL)
75B2 INC HL
75B3 JR NZ,$75B6
75B5 SCF
75B6 RL B
75B8 JR NC,$75AD
75BA LD A,B
75BB OR C
75BC LD C,A
75BD RET
75BE: Fill screen rectangle with byte
Used by the routines at 6400, 6AE1, 6B21, 6B87 and 7274.
Input
HL Start screen address
B Row count per column
C Column count
A Fill byte
Fills a rectangle of screen or attribute memory with a single byte, row by row.
75BE LD D,B Fill row bytes, count in B
75BF LD E,L
75C0 LD (HL),A
75C1 INC L
75C2 DJNZ $75C0
75C4 LD B,D
75C5 EX AF,AF' Advance column, wrap to next third
75C6 LD A,E
75C7 ADD A,$20
75C9 LD L,A
75CA JR NC,$75CD
75CC INC H
75CD EX AF,AF'
75CE DEC C
75CF JR NZ,$75BF
75D1 RET
75D2: Print key entered on Redefine Keys
Used by the routine at 6A1E.
Input
A Key entered - character or special code
Prints the label for the key just pressed on the Redefine Keys screen, naming the special keys -- Enter, Space, Caps and Symbol -- and printing anything else as itself, erasing the previous label first.
75D2 CP $0D
75D4 JR Z,$75FB
75D6 CP $20
75D8 JR Z,$7608
75DA CP $02
75DC JR C,$75EF
75DE JP NZ,$7637 => Print Char
75E1 CALL $7615 Print immediate string
75E4 DEFB $03,$05,$08 char $03: repeat character $08, 5 times (erase old label)
75E7 DEFM "SYMBOL"
75ED DEFB $1F char $1F: end of string
75EE RET
75EF CALL $7615 Print immediate string
75F2 DEFB $03,$03,$08 char $03: repeat character $08, 3 times (erase old label)
75F5 DEFM "CAPS"
75F9 DEFB $1F char $1F: end of string
75FA RET
75FB CALL $7615 Print immediate string
75FE DEFB $03,$04,$08 char $03: repeat character $08, 4 times (erase old label)
7601 DEFM "ENTER"
7606 DEFB $1F char $1F: end of string
7607 RET
7608 CALL $7615 Print immediate string
760B DEFB $03,$04,$08 char $03: repeat character $08, 4 times (erase old label)
760E DEFM "SPACE"
7613 DEFB $1F char $1F: end of string
7614 RET
7615: Print immediate string
Used by the routines at 6825, 6A1E, 6BBB, 6C80, 6CAE, 6ECD, 7143, 7274, 75D2, 786E and 796A.
Prints a string that follows the call inline in the code, reading it from the return address and resuming after its end marker.
7615 EX (SP),HL
7616 LD A,(HL)
7617 INC HL
7618 EX (SP),HL
7619 CP $1F
761B RET Z
761C CALL $7637 Print Char
761F JR $7615 => Print immediate string
7621: Print HL as 4-digit hex/BCD
Used by the routine at 6400.
Prints a value as hexadecimal digits, converting each nibble to a character through the decimal-adjust trick.
7621 LD A,H Print high byte via $7626
7622 CALL $7626
7625 LD A,L
This entry point is used by the routine at 6400.
7626 PUSH AF Save the value
7627 RRCA Rotate the nibble down
7628 RRCA
7629 RRCA Twice more, into position
762A RRCA
762B CALL $762F
762E POP AF
762F AND $0F
7631 ADD A,$90
7633 DAA
7634 ADC A,$40
7636 DAA
7637: Print Char
Used by the routines at 6825, 6BBB, 6C99, 6CAE, 6E34, 6ECD, 71A8, 725D, 7274, 75D2, 7615 and 783E.
Input
A Character to print
The character printer. Codes from $20 up print directly, while codes below that are opcodes that each declare how many argument bytes follow. Those arguments are collected across successive calls before the routine dispatches to the handler for that opcode, so a whole formatting sequence can be fed in one byte at a time.
7637 PUSH HL
7638 PUSH AF
7639 LD A,($FDA7) get Special-char argument counter
763C AND A
763D JR Z,$7655
763F POP AF
7640 PUSH AF
7641 LD HL,($FDA9) get Special-char argument write pointer
7644 LD (HL),A
7645 INC HL
7646 LD ($FDA9),HL set Special-char argument write pointer
7649 LD A,($FDA7) get Special-char argument counter
764C DEC A
764D LD ($FDA7),A set Special-char argument counter
7650 JR Z,$7675
7652 POP AF
7653 POP HL
7654 RET
7655 POP AF
7656 PUSH AF
7657 CP $20 $00..$1F ?
7659 JP NC,$7687 no => jump
Process a special char $00..$1F
765C LD ($FDA8),A
765F LD HL,$78CC
7662 CALL $98D3 HL = HL + A
7665 LD A,(HL) A = $00..$02
7666 LD ($FDA7),A set Special-char argument counter
7669 AND A
766A JR Z,$7675
766C LD HL,$FDAB
766F LD ($FDA9),HL set Special-char argument write pointer
7672 POP AF
7673 POP HL
7674 RET
7675 LD A,($FDA8)
7678 ADD A,A
7679 LD HL,$78EC
767C CALL $98D3 HL = HL + A
767F CALL $98D6 (HL) -> HL
7682 PUSH HL Fetch the pending argument bytes
7683 LD HL,$FDA5
7686 RET
Print usual char >= $20
7687 PUSH BC Save the registers
7688 PUSH DE
7689 CP $2E Map full stop to its glyph
768B JR NZ,$768F
768D LD A,$3A
768F CP $21 Map exclamation mark to its glyph
7691 JR NZ,$7695
7693 LD A,$3C
7695 CP $26 Map ampersand to its glyph
7697 JR NZ,$769B
7699 LD A,$3D
769B SUB $20 Fold the character down to a glyph index
769D JR Z,$76A1
769F SUB $0F Letters follow the digits in the font
76A1 LD HL,$FDAF Double-width mode set?
76A4 BIT 0,(HL)
76A6 JR Z,$76B6
76A8 PUSH AF
76A9 OR A
76AA LD A,$06
76AC CALL NZ,$6456 Trigger sound effect A
76AF LD BC,$0004
76B2 CALL $7A5C Delay by BC HALTs
76B5 POP AF
76B6 LD L,A
76B7 LD H,$00
76B9 ADD HL,HL
76BA ADD HL,HL
76BB ADD HL,HL HL = HL * 8
76BC LD DE,($FDA3) Get Font address
76C0 ADD HL,DE
76C1 EX DE,HL
76C2 LD HL,($FDA5)
76C5 ADD HL,HL
76C6 SLA L
76C8 CALL $98D9 Convert row number to screen line address
76CB PUSH HL
76CC LD B,$07
76CE LD A,($FDB0)
76D1 CP $01
76D3 JR C,$7716
76D5 JR Z,$76E6
76D7 CP $02
76D9 JR Z,$770A
76DB LD A,(DE)
76DC INC DE
76DD XOR (HL)
76DE LD (HL),A
76DF CALL $98DC DOWN HL
76E2 DJNZ $76DB
76E4 JR $771E
76E6 LD A,(DE) Take the next font row and shift it out bit by bit
76E7 INC DE
76E8 ADD A,A #0 top pixel of the font row
76E9 RR C
76EB ADD A,A #1
76EC RR C
76EE ADD A,A #2
76EF RR C
76F1 ADD A,A #3
76F2 RR C
76F4 ADD A,A #4
76F5 RR C
76F7 ADD A,A #5
76F8 RR C
76FA ADD A,A #6
76FB RR C
76FD ADD A,A #7 bottom pixel
76FE RR C
7700 LD A,(HL) Merge the row into the screen
7701 XOR C
7702 LD (HL),A
7703 CALL $98DC DOWN HL
7706 DJNZ $76E6
7708 JR $771E
770A LD A,(DE)
770B INC DE
770C LD (HL),A
770D INC H
770E LD (HL),A
770F CALL $98DC DOWN HL
7712 DJNZ $770A
7714 JR $771E
7716 LD A,(DE)
7717 INC DE
7718 LD (HL),A
7719 CALL $98DC DOWN HL
771C DJNZ $7716
771E LD HL,$FDAF Second format flag set? take the short exit
7721 BIT 1,(HL)
7723 POP HL
7724 JR NZ,$774B
7726 LD A,H Keep the pixel row within the character
7727 AND $07
7729 LD C,A
772A LD A,H Row shifted right three
772B RRA
772C RRA
772D RRA Masked to a third index
772E AND $03
7730 ADD A,(IY+$22) Add the attribute page base
7733 LD H,A
7734 LD A,($FDA0) get Print attribute
7737 LD (HL),A Store the glyph row and the row stride
7738 LD DE,$0020
773B LD B,A Save the byte, count down the repeat
773C INC C
773D DEC C
773E JR Z,$7742 None left? skip the repeat
7740 ADD HL,DE Step down a line, store it again
7741 LD (HL),B
7742 LD A,($FDB0) Double-height mode repeats it once more
7745 CP $02
7747 JR NZ,$774B
7749 ADD HL,DE
774A LD (HL),B
774B POP DE Restore the caller's registers
774C POP BC
774D LD A,($FDB1) Index the spacing-mode table
7750 ADD A,A
7751 LD HL,$775F
7754 CALL $98D3 HL = HL + A
7757 CALL $98D6 (HL) -> HL
775A PUSH HL
775B LD HL,$FDA5
775E RET
775F: Spacing-mode handler addresses, indexed by the mode in $FDB1
775F DEFW $77C2
7761 DEFW $77CB
7763 DEFW $77AC
7765 DEFW $77B8
7767: Char $02: set spacing/mode ($FDB1) from arg, range 0-3
Print opcode that selects the character spacing mode for what follows.
7767 LD A,($FDAB)
776A SUB $08
776C JP C,$78BF => -> $7A10
776F CP $04
7771 JP NC,$78BF => -> $7A10
7774 LD ($FDB1),A
7777 JP $78C4 => Print opcode exit
777A: Char $00: clear screen (attributes + bitmap)
Clears the screen: fills the bitmap with zeroes and the attribute area with the colour supplied as the opcode's argument.
777A PUSH BC
777B PUSH DE
777C LD A,($FDAB) Get attribute byte
777F LD E,A
7780 LD D,$00
7782 CALL $7795 Fill all screen attributes with D
7785 LD HL,$4000
7788 LD BC,$0018
778B CALL $779B Clear all the screen bits
778E LD D,E
778F CALL $7795 Fill all screen attributes with D
7792 JP $78C7 => Print opcode exit
7795: Fill all screen attributes with D
Used by the routine at 777A.
Input
D Attribute byte
Floods the whole attribute area with one colour, walking all three screen thirds.
7795 LD HL,$5800
7798 LD BC,$0003
This entry point is used by the routine at 777A.
779B LD (HL),D
779C INC L
779D DJNZ $779B
779F INC H
77A0 DEC C
77A1 JR NZ,$779B
77A3 RET
77A4: Char $04: advance format counter by 2, store fill char
Print opcode that steps the format counter on by two and records the character to pad with.
77A4 INC HL
77A5 INC (HL)
77A6 INC (HL)
77A7 DEC HL
77A8: Char $0D: store the fill char at HL
Used by the routine at 77CB.
Writes the fill character configured at $FD9F to the print cursor position, used for the carriage-return special code.
77A8 LD A,($FD9F) get Fill char for special-char codes $0C/$13/$0D/$09 = $00
77AB LD (HL),A
77AC: Char $0A: increment format counter, abort if it reaches $31
Print opcode that advances the format counter, abandoning the string if it runs past the end of the line.
77AC INC HL
77AD LD A,(HL)
77AE INC A
77AF LD (HL),A
77B0 CP $31
77B2 JP NC,$78BF => -> $7A10
77B5 JP $78C4 => Print opcode exit
77B8: Char $0B: decrement format counter, abort on underflow
Print opcode that steps the format counter back, abandoning the string if it would go past the start.
77B8 INC HL
77B9 LD A,(HL)
77BA DEC A
77BB LD (HL),A
77BC JP C,$78BF => -> $7A10
77BF JP $78C4 => Print opcode exit
77C2: Char $08: decrement format counter, abort if negative
Print opcode that steps the format counter back, abandoning the string if it goes negative.
77C2 LD A,(HL)
77C3 DEC A
77C4 LD (HL),A
77C5 JP M,$78BF => -> $7A10
77C8 JP $78C4 => Print opcode exit
77CB: Char $09: increment format counter, store fill char once $20 reached
Print opcode that advances the format counter and, at the end of the run, records the character to pad with.
77CB LD A,(HL)
77CC INC A
77CD LD (HL),A
77CE CP $20
77D0 JP C,$78C4 => Print opcode exit
77D3 JR $77A8 => Char $0D
77D5: Char $12: set/clear bit 6 of $FDA0 from arg (0/1)
Print opcode that turns the bright attribute on or off for what follows.
77D5 LD HL,$FDA0
77D8 LD A,(HL) Clear the old bit 6
77D9 AND $BF
77DB LD (HL),A
77DC LD A,($FDAB)
77DF CP $02 Reject args >= 2
77E1 JP NC,$78BF => -> $7A10
77E4 RRCA Arg to bit 6, merge in
77E5 RRCA
77E6 OR (HL)
77E7 LD (HL),A
77E8 JP $78C4 => Print opcode exit
77EB: Char $19: set/clear flag bit 0 ($FDAF) from arg
Print opcode that sets or clears one of the printer's format flags from its argument.
77EB LD HL,$FDAF
77EE LD A,($FDAB)
77F1 CP $02
77F3 JP NC,$78BF => -> $7A10
77F6 RES 0,(HL)
77F8 OR (HL)
77F9 LD (HL),A
77FA JP $78C4 => Print opcode exit
77FD: Char $10: set field bits 0-2 of $FDA0 from arg
Print opcode that sets the ink colour used for what follows.
77FD LD HL,$FDA0
7800 LD A,(HL)
7801 AND $F8
7803 LD (HL),A
7804 LD A,($FDAB)
7807 CP $08
7809 JP NC,$78BF => -> $7A10
780C OR (HL)
780D LD (HL),A
780E JP $78C4 => Print opcode exit
7811: Char $11: set field bits 3-5 of $FDA0 from arg
Sets the paper colour used by the printer, rejecting any value outside the eight colours.
7811 LD HL,$FDA0
7814 LD A,(HL) Clear the old PAPER bits
7815 AND $C7
7817 LD (HL),A
7818 LD A,($FDAB)
781B CP $08 Reject values >= 8
781D JP NC,$78BF => -> $7A10
7820 ADD A,A Shift the arg into bits 3-5
7821 ADD A,A
7822 ADD A,A
7823 OR (HL)
7824 LD (HL),A
7825 JP $78C4 => Print opcode exit
7828: Char $16: set print position, 2 bounds-checked args
Print opcode that moves the print position, taking a column and a row as its two arguments and abandoning the string if either is out of range.
7828 LD A,($FDAC)
782B CP $20
782D JP NC,$78BF => -> $7A10
7830 LD (HL),A
7831 INC HL
7832 LD A,($FDAB)
7835 CP $2F
7837 JP NC,$78BF => -> $7A10
783A LD (HL),A
783B JP $78C4 => Print opcode exit
783E: Char $03: repeat character H, L times
Print opcode that repeats a character a given number of times -- used to draw the rules and blank runs on the menu screens.
783E LD HL,($FDAB)
7841 LD A,H
7842 CALL $7637 Print Char
7845 DEC L
7846 JR NZ,$7841
7848 JR $78C4 => Print opcode exit
784A: Char $13: set fill char ($FD9F) from arg
Print opcode that sets the character used to pad and fill.
784A LD A,($FDAB)
784D LD ($FD9F),A set Fill char for special-char codes $0C/$13/$0D/$09 = $00
7850 JR $78C4 => Print opcode exit
7852: Char $14: set tab stop, advance format counter
Print opcode that sets a tab stop: the column is taken up if it is ahead of the current one, otherwise the format counter is nudged along instead.
7852 LD A,($FDAB)
7855 CP $20
7857 JP NC,$78BF => -> $7A10
785A CP (HL)
785B LD (HL),A
785C JP NC,$78C4 => Print opcode exit
785F INC HL
7860 LD A,(HL)
7861 ADD A,$02
7863 LD (HL),A
7864 JR $78C4 => Print opcode exit
7866: Char $1A: set Font address ($FDA3) from arg word
Print opcode that switches the printer to a different font.
7866 LD HL,($FDAB)
7869 LD ($FDA3),HL set Font address = $7EA0
786C JR $78C4 => Print opcode exit
786E: Char $0C: print padded field using $FDB0 width
Print opcode that pads the current field out with spaces to the width the format state holds, restoring the width afterwards.
786E PUSH BC
786F LD HL,$FDB0
7872 LD B,(HL)
7873 LD (HL),$00
7875 CALL $7615 Print immediate string
7878 DEFB $08 char $08: decrement format counter, abort if negative
7879 DEFB $20 literal space char
787A DEFB $08 char $08: decrement format counter, abort if negative
787B DEFB $1F char $1F: end of string
787C LD (HL),B
787D JR $78C8
787F: Char $18: set width/column counter ($FDB0) from arg
Print opcode that sets the field width used for padding.
787F LD A,($FDAB)
7882 LD ($FDB0),A
7885 JR $78C4 => Print opcode exit
7887: Char $15: set/clear flag bit 1 ($FDAF) from arg
Print opcode that sets or clears the second of the printer's format flags from its argument.
7887 LD HL,$FDAF
788A RES 1,(HL)
788C LD A,($FDAB)
788F OR A
7890 JR Z,$78C4 => Print opcode exit
7892 SET 1,(HL)
7894 JR $78C4 => Print opcode exit
7896: Char $01: reset print format state
Print opcode that resets the printer's format state -- colours, width, flags and position -- back to its defaults.
7896 LD A,$07
7898 LD ($FDA0),A set Print attribute
789B LD A,$01
789D LD ($FDB1),A
78A0 XOR A
78A1 LD ($FD9F),A set Fill char for special-char codes $0C/$13/$0D/$09 = $00
78A4 LD ($FDAF),A
78A7 LD ($FDB0),A
78AA LD HL,$0000
78AD LD ($FDA5),HL
78B0 LD HL,$7EA0 Font address
78B3 LD ($FDA3),HL Set Font address
78B6 LD HL,$5800
78B9 LD ($FDA1),HL
78BC JP $78C4 => Print opcode exit
78BF: -> $7A10
Used by the routines at 7767, 77AC, 77B8, 77C2, 77D5, 77EB, 77FD, 7811, 7828 and 7852.
78BF JP $7A10 => Abort
78C2: Print opcode exit: drop two saved register pairs
Extra exit used by handlers that stashed two register pairs, dropping both before falling into the shared exit at 78C4.
78C2 POP BC
78C3 POP DE
78C4: Print opcode exit: drop the saved state and return
Used by the routines at 7767, 77AC, 77B8, 77C2, 77CB, 77D5, 77EB, 77FD, 7811, 7828, 783E, 784A, 7852, 7866, 787F, 7887 and 7896.
Short exit from the print opcodes, restoring the two registers those handlers save.
78C4 POP AF
78C5 POP HL
78C6 RET
78C7: Print opcode exit: drop the saved registers and return
Used by the routine at 777A.
Common exit from the print opcodes: restores the saved registers and returns.
78C7 POP DE
This entry point is used by the routine at 786E.
78C8 POP BC
78C9 POP AF
78CA POP HL
78CB RET
78CC: Table to map special char $00..$1F to types $00..$02
78CC DEFB $01,$00,$01,$02,$00,$00,$00,$00
78D4 DEFB $00,$00,$00,$00,$00,$00,$00,$00
78DC DEFB $01,$01,$01,$01,$01,$01,$02,$00
78E4 DEFB $01,$01,$02,$00,$00,$00,$00,$00
78EC: Address map to print chars $00..$1F - 32 addresses
78EC DEFW $777A char $00, 1 arg: clear screen (attributes + bitmap)
78EE DEFW $7896 char $01, 0 args: reset print format state
78F0 DEFW $7767 char $02, 1 arg: set spacing/mode ($FDB1), range 0-3
78F2 DEFW $783E char $03, 2 args: repeat character H, L times
78F4 DEFW $77A4 char $04, 0 args: advance format counter by 2, store fill char (unconfirmed)
78F6 DEFW $78BF char $05, unused (no-op)
78F8 DEFW $78BF char $06, unused (no-op)
78FA DEFW $78BF char $07, unused (no-op)
78FC DEFW $77C2 char $08, 0 args: decrement format counter, abort if negative
78FE DEFW $77CB char $09, 0 args: increment format counter, store fill char once $20 reached
7900 DEFW $77AC char $0A, 0 args: increment format counter, abort if it reaches $31
7902 DEFW $77B8 char $0B, 0 args: decrement format counter, abort on underflow
7904 DEFW $786E char $0C, 0 args: print padded field using $FDB0 width
7906 DEFW $77A8 char $0D, 0 args: store fill char at HL
7908 DEFW $78BF char $0E, unused (no-op)
790A DEFW $78BF char $0F, unused (no-op)
790C DEFW $77FD char $10, 1 arg: set field bits 0-2 of $FDA0
790E DEFW $7811 char $11, 1 arg: set field bits 3-5 of $FDA0
7910 DEFW $77D5 char $12, 1 arg: set/clear bit 6 of $FDA0
7912 DEFW $784A char $13, 1 arg: set fill char ($FD9F)
7914 DEFW $7852 char $14, 1 arg: set tab stop, advance format counter
7916 DEFW $7887 char $15, 1 arg: set/clear flag bit 1 ($FDAF)
7918 DEFW $7828 char $16, 2 args: set print position, bounds-checked
791A DEFW $78BF char $17, unused (no-op)
791C DEFW $787F char $18, 1 arg: set width/column counter ($FDB0)
791E DEFW $77EB char $19, 1 arg: set/clear flag bit 0 ($FDAF)
7920 DEFW $7866 char $1A, 2 args: set Font address ($FDA3)
7922 DEFW $78BF char $1B, unused (no-op)
7924 DEFW $78BF char $1C, unused (no-op)
7926 DEFW $78BF char $1D, unused (no-op)
7928 DEFW $78BF char $1E, unused (no-op)
792A DEFW $78BF char $1F, unused (no-op)
792C: Prepare at new Area
Used by the routines at 6400 and 6BBB.
Resets the per-Area state -- controls, counters and the vehicle slots -- clears the player's dead flag, then rebuilds the scenery buffer and slot table and draws the surrounding frame.
792C XOR A
792D LD ($FD85),A Clear last joystick/keyboard bits
7930 LD ($FD86),A Clear Land space size
7933 LD ($FD88),A Clear Offset in $FF00 buffer
7936 LD ($FDDA),A
7939 LD ($FDE0),A
793C LD ($FDFA),A
793F LD ($FDFB),A
7942 LD A,$FF
7944 LD ($FDC3),A
7947 LD ($FDC5),A
794A LD ($FDC7),A
794D LD ($FDC9),A
7950 LD ($FDCB),A
7953 RES 0,(IY+$62) Clear Player's dead flag
7957 RES 4,(IY+$15)
795B CALL $79E1 Init $FF00 buffer entries
795E CALL $6626 Prepare records and variables at $6648
7961 LD A,$31
7963 CALL $6B87 Draw menu box border/frame
7966 CALL $6BAC Scroll the Area in, up to $5C steps or until it arrives
7969 RET
796A: Prepare New Game
Used by the routines at 6400 and 6BBB.
Starts a new game: points the level sequence at its first record, sets the Area to 1, zeroes the score, gives the player five lives and six grenades, and clears the screen ready to play.
796A LD HL,($800A)
796D LD ($FD8A),HL
7970 XOR A
7971 LD ($FDA7),A set Special-char argument counter
7974 INC A
7975 LD ($FDE5),A Area number = $01
7978 LD HL,$FDE8 Point at the score, six digits
797B LD B,$06
797D LD (HL),$30 Fill with $30, count down
797F INC HL
7980 DJNZ $797D
7982 LD A,$05 Player's lives = $05
7984 LD ($FDE6),A
7987 INC A
7988 LD ($FDE7),A Set grenades number = $06
798B LD A,$00 Set border black
798D OUT ($FE),A
798F CALL $7615 Print immediate string
7992 DEFB $01 char $01: reset print format state
7993 DEFB $00,$30 char $00: clear screen, attribute = $30
7995 DEFB $15,$00 char $15: set/clear flag bit 1 ($FDAF) = $00
7997 DEFB $16,$00,$00 char $16: set position (col=$00, row=$00)
799A DEFB $18,$00 char $18: set width counter ($FDB0) = $00
799C DEFB $19,$00 char $19: set flag bit 0 ($FDAF) = $00
799E DEFB $11,$02 char $11: set $FDA0 bits 3-5 = $02
79A0 DEFB $10,$07 char $10: set $FDA0 bits 0-2 = $07
79A2 DEFM "000000 AREA 01 MEN 5 BOMBS 06"
79C2 DEFB $1F char $1F: end of string
79C3 EI
79C4 HALT
79C5 RES 0,(IY+$07)
79C9 RET
79CA: System init: interrupt table, screen-line table, checksums
Used by the routines at 6400 and 69D2.
One-time setup: builds the interrupt vector table ($FB00), the $FE00 even-screen-line table and the checksum reference, then initialises the IY-based system variables.
79CA DI
79CB LD IY,$FD80
79CF CALL $7A1E Set up interrupt vector table at $FB00
79D2 CALL $7A45 Prepare $FE00 table - addresses for every even screen line
79D5 CALL $79FB Build the $FA00 column-checksum table
79D8 LD (IY+$07),$00 Clear byte ($FD87)
79DC LD (IY+$42),$02 Set byte ($FDC2) = $02
79E0 RET
79E1: Init $FF00 buffer entries (32 slots, unconfirmed)
Used by the routine at 792C.
Initialises the scenery buffer, laying out its thirty-two slots and linking them into a free list.
79E1 LD HL,$FF00 Buffer pointer, 32 entries
79E4 LD C,$20
79E6 LD A,$08
79E8 LD (HL),A Fill first two bytes of entry
79E9 INC L
79EA SUB $10
79EC LD (HL),A
79ED INC L
79EE ADD A,$18
79F0 LD B,$06
79F2 LD (HL),$00 Zero the rest of the entry
79F4 INC L
79F5 DJNZ $79F2
79F7 DEC C Next entry
79F8 JR NZ,$79E8
79FA RET
79FB: Build the $FA00 column-checksum table
Used by the routine at 79CA.
Builds the reference table the anti-tamper check compares against, folding each column of the code pages down into a single byte.
79FB LD HL,$8000 Source page $8000
79FE LD DE,$FA00 Checksum buffer $FA00
7A01 LD B,$70 112 rows, clear the total
7A03 XOR A
7A04 XOR (HL) XOR the next row
7A05 INC H
7A06 DJNZ $7A04
7A08 LD (DE),A Store the column checksum
7A09 INC E
7A0A LD H,$80 Move to the next column
7A0C INC L
7A0D JR NZ,$7A01
7A0F RET
7A10: Abort: restore stack and interrupts, return to frame loop
Used by the routines at 6400 and 78BF.
Abort path: restores the saved stack ($FD80) and the IY/HL context off it, switches back to IM 1 and re-enables interrupts before returning to the frame loop.
7A10 DI
7A11 LD SP,($FD80) Restore saved stack pointer
7A15 EXX
7A16 POP IY Restore IY/HL context
7A18 POP HL
7A19 EXX
7A1A IM 1 Back to IM 1
7A1C EI
7A1D RET
7A1E: Set up interrupt vector table at $FB00
Used by the routine at 79CA.
Builds the interrupt vector table so every entry points at the one handler, then switches the Z80 into mode 2.
7A1E LD A,($7A42) Copy IM2 vector byte, fill $FB00 table
7A21 LD ($FD91),A Install the JP opcode byte at $FD91
7A24 LD HL,$FB00
7A27 LD B,$00
7A29 LD (HL),$FC
7A2B INC HL
7A2C DJNZ $7A29
7A2E LD (HL),$FC Terminate table, copy 3 more bytes
7A30 LD DE,$FCFC
7A33 LD HL,$7A42
7A36 LD BC,$0003
7A39 LDIR
7A3B LD A,$FB
7A3D LD I,A
7A3F IM 2
7A41 RET
7A42: Game main loop / frame handler (redirect)
7A42 JP $7357 => Game main loop / frame handler
7A45: Prepare $FE00 table - addresses for every even screen line
Used by the routine at 79CA.
Builds the lookup table of screen addresses for every even pixel line, so the blitters can find a row without recomputing it.
7A45 LD B,$80 128 even lines
7A47 LD DE,$4000 Screen start $4000
7A4A LD HL,$FE00 Table at $FE00
7A4D LD (HL),E Low byte of the line address
7A4E INC L
7A4F LD (HL),D High byte alongside it
7A50 INC L
7A51 EX DE,HL
7A52 CALL $98DC DOWN HL
7A55 CALL $98DC DOWN HL
7A58 EX DE,HL
7A59 DJNZ $7A4D
7A5B RET
7A5C: Delay by BC HALTs
Used by the routines at 6400, 6BBB and 7637.
Input
BC Frame count
Waits for a given number of frames by halting until each interrupt arrives.
7A5C HALT
This entry point is used by the routine at EF37.
7A5D DEC BC
7A5E LD A,B
7A5F OR C
7A60 JR NZ,$7A5C => Delay by BC HALTs
7A62 RET
7A63: Data block at 7A63
7A63 DEFB $10,$FB,$36,$FC,$11,$FC,$FC,$21
7A6B DEFB $79,$7A,$01,$03,$00,$ED,$B0,$3E
7A73 DEFB $FB,$ED,$47,$ED,$5E,$C9,$C3,$89
7A7B DEFB $73,$06,$80,$11,$00,$40,$21,$00
7A83 DEFB $FE,$73,$2C,$72,$2C,$EB,$CD,$DC
7A8B DEFB $98,$CD,$DC,$98,$EB,$10,$F2,$C9
7A93 DEFB $76,$0B,$78,$B1,$20,$FA,$C9,$00
7A9B DEFB $00,$00,$00,$00,$00,$00,$00,$00
7AA3 DEFB $07,$07,$07,$00,$00,$00,$00,$00
7AAB DEFB $00,$00,$08,$88,$88,$80,$00,$00
7AB3 DEFB $00,$00,$00,$00,$10,$50,$50,$40
7ABB DEFB $00,$00,$00,$00,$00,$00,$10,$58
7AC3 DEFB $D0,$40,$00,$00,$00,$00,$00,$00
7ACB DEFB $10,$5F,$D0,$40,$00,$00,$00,$00
7AD3 DEFB $00,$00,$10,$4F,$90,$40,$00,$00
7ADB DEFB $00,$00,$00,$00,$10,$47,$10,$40
7AE3 DEFB $00,$00,$00,$00,$00,$00,$10,$40
7AEB DEFB $10,$40,$00,$00,$00,$00,$03,$FF
7AF3 DEFB $90,$47,$10,$3E,$03,$FF,$80,$00
7AFB DEFB $1C,$00,$50,$48,$90,$01,$1C,$00
7B03 DEFB $40,$00,$20,$00,$50,$50,$50,$01
7B0B DEFB $20,$00,$40,$00,$40,$FF,$D0,$50
7B13 DEFB $50,$3F,$40,$FF,$C0,$00,$43,$FF
7B1B DEFB $90,$50,$50,$7E,$43,$FF,$80,$00
7B23 DEFB $87,$00,$10,$50,$50,$40,$87,$00
7B2B DEFB $00,$00,$8C,$00,$10,$50,$50,$40
7B33 DEFB $8C,$00,$00,$01,$88,$00,$10,$50
7B3B DEFB $50,$41,$88,$00,$00,$01,$88,$00
7B43 DEFB $18,$58,$58,$41,$88,$00,$00,$01
7B4B DEFB $88,$00,$18,$D8,$D8,$C1,$88,$00
7B53 DEFB $00,$03,$87,$FF,$98,$D8,$D8,$C3
7B5B DEFB $87,$FF,$80,$03,$80,$00,$58,$D8
7B63 DEFB $D8,$C3,$80,$00,$40,$03,$C0,$00
7B6B DEFB $5D,$DD,$DD,$C3,$C0,$00,$40,$03
7B73 DEFB $FF,$FF,$DF,$DF,$DF,$C3,$FF,$FF
7B7B DEFB $C0,$01,$FF,$FF,$9F,$DF,$DF,$C1
7B83 DEFB $FF,$FF,$80,$01,$F8,$00,$1F,$DF
7B8B DEFB $DF,$C1,$F8,$00,$00,$01,$F8,$00
7B93 DEFB $1E,$DE,$DE,$C1,$F8,$00,$00,$00
7B9B DEFB $FC,$00,$1F,$5F,$5F,$40,$FC,$00
7BA3 DEFB $00,$00,$FB,$00,$1E,$DE,$DE,$C0
7BAB DEFB $FB,$00,$00,$00,$75,$FF,$9D,$5D
7BB3 DEFB $5D,$3E,$75,$FF,$80,$00,$7A,$00
7BBB DEFB $5A,$DA,$DA,$81,$7A,$00,$40,$00
7BC3 DEFB $3D,$00,$5D,$5D,$5D,$41,$3D,$00
7BCB DEFB $40,$00,$1F,$FF,$CF,$8F,$8F,$FF
7BD3 DEFB $1F,$FF,$C0,$00,$03,$FF,$87,$07
7BDB DEFB $07,$FE,$03,$FF,$80,$00,$03,$FF
7BE3 DEFB $FE,$00,$00,$00,$00,$00,$00,$00
7BEB DEFB $00,$00,$00,$00,$00,$00,$00,$07
7BF3 DEFB $F8,$00,$00,$00,$7C,$47,$FD,$00
7BFB DEFB $00,$00,$00,$00,$00,$00,$00,$00
7C03 DEFB $00,$00,$00,$00,$00,$FB,$E7,$F8
7C0B DEFB $00,$00,$88,$0F,$FB,$80,$00,$00
7C13 DEFB $00,$00,$00,$00,$00,$00,$00,$00
7C1B DEFB $00,$00,$01,$FF,$F0,$07,$80,$01
7C23 DEFB $00,$0F,$FB,$C3,$FE,$00,$00,$00
7C2B DEFB $00,$00,$00,$00,$00,$00,$00,$0E
7C33 DEFB $FF,$FF,$F0,$00,$80,$01,$00,$1F
7C3B DEFB $FF,$FF,$FF,$F0,$00,$00,$00,$00
7C43 DEFB $00,$00,$00,$00,$01,$B7,$87,$FF
7C4B DEFB $F8,$18,$40,$02,$01,$E0,$FF,$F3
7C53 DEFB $FF,$C8,$F0,$00,$00,$00,$00,$00
7C5B DEFB $00,$00,$0F,$5F,$CF,$99,$07,$F0
7C63 DEFB $40,$04,$FE,$3F,$00,$37,$EF,$BF
7C6B DEFB $F1,$FC,$00,$00,$00,$00,$00,$05
7C73 DEFB $DF,$DF,$EF,$00,$DC,$0F,$E0,$0F
7C7B DEFB $00,$3F,$EF,$80,$07,$FD,$FE,$26
7C83 DEFB $78,$00,$00,$00,$1F,$FF,$EF,$FF
7C8B DEFB $00,$FB,$FC,$00,$20,$0A,$04,$FF
7C93 DEFB $C1,$E7,$F0,$05,$F8,$5F,$F8,$7F
7C9B DEFB $03,$F8,$3F,$0F,$EE,$00,$EF,$F2
7CA3 DEFB $FC,$00,$20,$08,$38,$3F,$07,$F7
7CAB DEFB $5B,$F8,$00,$7E,$5F,$8F,$83,$E7
7CB3 DEFB $8B,$8E,$01,$EF,$EF,$E1,$FC,$00
7CBB DEFB $20,$0B,$C6,$3F,$C6,$F7,$E0,$FC
7CC3 DEFB $FC,$00,$5C,$1F,$83,$F0,$BE,$01
7CCB DEFB $C7,$C4,$EF,$E1,$FC,$01,$E0,$0C
7CD3 DEFB $00,$3F,$C6,$F7,$F1,$FC,$FC,$78
7CDB DEFB $00,$1B,$83,$F0,$41,$C7,$C7,$23
7CE3 DEFB $CE,$00,$FC,$1E,$20,$09,$E0,$3F
7CEB DEFB $C5,$F7,$F1,$FC,$2C,$F6,$7E,$20
7CF3 DEFB $04,$50,$5F,$07,$C7,$E7,$AF,$A1
7CFB DEFB $3C,$00,$20,$0E,$00,$FF,$C3,$F7
7D03 DEFB $F1,$FC,$FE,$FE,$15,$3F,$07,$F0
7D0B DEFB $5C,$E7,$C7,$E7,$EF,$61,$DF,$00
7D13 DEFB $00,$08,$03,$3F,$FF,$F7,$F1,$AC
7D1B DEFB $FE,$FE,$7F,$7F,$07,$F8,$47,$E7
7D23 DEFB $C1,$E7,$EF,$E0,$FC,$70,$20,$08
7D2B DEFB $04,$3F,$D0,$07,$F1,$F0,$FE,$FE
7D33 DEFB $7F,$FF,$07,$F8,$2F,$F7,$C7,$67
7D3B DEFB $EF,$E0,$5C,$08,$20,$08,$3A,$3F
7D43 DEFB $D0,$00,$F1,$FC,$4F,$FE,$0F,$FF
7D4B DEFB $07,$F8,$33,$F7,$07,$E3,$E2,$E1
7D53 DEFB $FC,$06,$20,$09,$81,$3F,$D0,$07
7D5B DEFB $F1,$FC,$FF,$F4,$7F,$F8,$07,$B8
7D63 DEFB $3F,$2F,$C7,$84,$EF,$E1,$FC,$19
7D6B DEFB $A0,$0E,$00,$3A,$3F,$F7,$41,$FC
7D73 DEFB $FD,$EE,$7F,$EF,$0F,$BC,$1F,$FF
7D7B DEFB $C7,$E7,$EF,$E0,$5C,$20,$20,$08
7D83 DEFB $00,$CF,$C7,$F7,$F1,$FC,$FF,$DE
7D8B DEFB $7F,$FF,$0E,$3C,$1F,$FF,$87,$E7
7D93 DEFB $EF,$E1,$FC,$00,$20,$08,$00,$1F
7D9B DEFB $C7,$F7,$F1,$FC,$FE,$DE,$78,$EF
7DA3 DEFB $0F,$3C,$1F,$DF,$C7,$E7,$0F,$E1
7DAB DEFB $9C,$00,$20,$08,$EC,$3F,$C7,$F7
7DB3 DEFB $F1,$CC,$FA,$BE,$7D,$DF,$0F,$04
7DBB DEFB $1E,$FF,$C7,$E6,$CF,$E0,$6F,$6C
7DC3 DEFB $20,$0F,$00,$7F,$C7,$F7,$F1,$BC
7DCB DEFB $F9,$BE,$7D,$DF,$0F,$3E,$18,$00
7DD3 DEFB $00,$C1,$EF,$E1,$FC,$C0,$20,$08
7DDB DEFB $01,$FF,$C7,$F7,$F1,$FC,$FB,$BE
7DE3 DEFB $7D,$DF,$0E,$FE,$0F,$7F,$C4,$E7
7DEB DEFB $E1,$73,$FC,$00,$60,$08,$0A,$3F
7DF3 DEFB $EB,$F7,$C0,$FC,$F9,$3E,$3C,$9F
7DFB DEFB $1B,$F8,$1E,$7C,$C7,$C7,$EF,$EF
7E03 DEFB $FC,$00,$60,$08,$00,$3F,$EF,$F7
7E0B DEFB $F1,$7C,$F9,$3E,$2C,$9F,$1F,$A6
7E13 DEFB $1F,$3F,$47,$EF,$EF,$DE,$FF,$00
7E1B DEFB $A0,$08,$0F,$FE,$DE,$77,$FB,$FC
7E23 DEFB $28,$3E,$7C,$1F,$1F,$FF,$1F,$3E
7E2B DEFB $07,$FF,$E7,$FF,$0C,$80,$20,$07
7E33 DEFB $F0,$1D,$FF,$84,$57,$E4,$F8,$3E
7E3B DEFB $78,$1F,$1F,$1F,$0B,$1C,$C7,$FB
7E43 DEFB $E8,$7F,$B7,$F0,$20,$04,$C0,$03
7E4B DEFB $FF,$E3,$FF,$F9,$FC,$7F,$72,$3C
7E53 DEFB $A5,$08,$BF,$9B,$EF,$FD,$EF,$BF
7E5B DEFB $F8,$4F,$C0,$03,$20,$0F,$FF,$C3
7E63 DEFB $9F,$F8,$7C,$7F,$6E,$3F,$BF,$9F
7E6B DEFB $BF,$8F,$EF,$FD,$C7,$DF,$F0,$80
7E73 DEFB $40,$00,$80,$07,$FF,$81,$BF,$F1
7E7B DEFB $AC,$7F,$7E,$3F,$BF,$9F,$BF,$8F
7E83 DEFB $EF,$FF,$83,$FF,$F0,$00,$80,$00
7E8B DEFB $7F,$FF,$FF,$7F,$7F,$EE,$FB,$BE
7E93 DEFB $BD,$DF,$5F,$6F,$5F,$75,$D7,$FF
7E9B DEFB $7D,$FF,$FF,$FF,$00
7EA0: Font
font0 font1
7EA0 DEFB $00,$00,$00,$00,$00,$00,$00,$00
7EA8 DEFB $28,$6C,$6C,$6C,$6C,$6C,$28,$00
7EB0 DEFB $18,$38,$18,$18,$18,$18,$3C,$00
7EB8 DEFB $5C,$CE,$4E,$1C,$30,$06,$7E,$00
7EC0 DEFB $6C,$C6,$06,$1C,$06,$C6,$6C,$00
7EC8 DEFB $0C,$0C,$2C,$4C,$EE,$0C,$1E,$00
7ED0 DEFB $FE,$FC,$80,$EC,$06,$C6,$EC,$00
7ED8 DEFB $34,$62,$60,$6C,$66,$66,$34,$00
7EE0 DEFB $FE,$F8,$86,$1C,$38,$3C,$18,$00
7EE8 DEFB $6C,$C6,$C6,$6C,$C6,$C6,$6C,$00
7EF0 DEFB $2C,$66,$66,$36,$06,$46,$2C,$00
7EF8 DEFB $00,$00,$00,$00,$00,$18,$18,$00
7F00 DEFB $6C,$9E,$BE,$BE,$5C,$38,$10,$00
7F08 DEFB $18,$18,$18,$18,$18,$00,$18,$00
7F10 DEFB $38,$64,$38,$72,$9A,$D8,$6C,$00
7F18 DEFB $10,$30,$7E,$FE,$7E,$30,$10,$00
7F20 DEFB $E0,$80,$CC,$8A,$EA,$0A,$0C,$00
7F28 DEFB $18,$18,$18,$18,$18,$18,$18,$00
7F30 DEFB $30,$30,$58,$58,$7C,$8C,$9E,$00
7F38 DEFB $EC,$66,$66,$6C,$66,$66,$EC,$00
7F40 DEFB $6E,$C6,$C2,$C0,$C0,$C2,$6C,$00
7F48 DEFB $EC,$66,$66,$66,$66,$66,$EC,$00
7F50 DEFB $EE,$62,$64,$6C,$64,$62,$EE,$00
7F58 DEFB $EE,$62,$64,$6C,$64,$60,$E0,$00
7F60 DEFB $6E,$C6,$C2,$C0,$CE,$C6,$6C,$00
7F68 DEFB $EE,$6C,$6C,$7C,$6C,$6C,$EE,$00
7F70 DEFB $3C,$18,$18,$18,$18,$18,$3C,$00
7F78 DEFB $1E,$0C,$0C,$0C,$CC,$8C,$58,$00
7F80 DEFB $EE,$64,$68,$78,$6C,$6C,$EE,$00
7F88 DEFB $F0,$60,$60,$60,$62,$66,$EE,$00
7F90 DEFB $8E,$DC,$FC,$7C,$AC,$AC,$8E,$00
7F98 DEFB $C6,$E2,$72,$BA,$9C,$8E,$C6,$00
7FA0 DEFB $6C,$C6,$C6,$C6,$C6,$C6,$6C,$00
7FA8 DEFB $EC,$66,$66,$66,$6C,$60,$E0,$00
7FB0 DEFB $6C,$C6,$C6,$C6,$D6,$CC,$6A,$00
7FB8 DEFB $EC,$66,$66,$6C,$6C,$66,$E6,$00
7FC0 DEFB $6E,$E2,$F0,$7C,$1E,$8E,$EC,$00
7FC8 DEFB $5A,$5A,$18,$18,$18,$18,$18,$00
7FD0 DEFB $F2,$62,$62,$62,$62,$62,$34,$00
7FD8 DEFB $F2,$62,$64,$34,$30,$18,$18,$00
7FE0 DEFB $E2,$6A,$6A,$6A,$34,$34,$34,$00
7FE8 DEFB $C6,$E4,$70,$38,$1C,$4E,$C6,$00
7FF0 DEFB $E6,$64,$30,$18,$18,$18,$3C,$00
7FF8 DEFB $F6,$CE,$9C,$38,$72,$E6,$DE,$00
8000: Entry point: jump to the redirect block, and the base of the checksummed region
8000 JP $6400 => Block of redirects
8003: Advance level scroll: walk $FF00 buffer, process sequence record (redirect)
Used by the routines at 6BAC and DC95.
8003 JP $9193 => Advance level scroll
8006: Clear the draw-mode flag (R bit 7), enter $9193 (redirect)
Used by the routines at 6BBB and DE91.
8006 JP $91AA
8009: Redirect: jump to the level-1 sequence table
8009 JP $9236
800C: Multiply HL by 10, add DE (redirect)
Used by the routine at 69B4.
800C JP $8E92 => Shift-add multiply
800F: Mark map cells for object IX, direction-aware (redirect)
Used by the routines at 65A5 and DD8D.
800F JP $806B => Mark map cells for object IX, direction-aware
8012: Scenery handler addresses, indexed by the level record code minus one (see 9193); the level data at $9236 names what each code places
8012 DEFW $86F5
8014 DEFW $90AC
8016 DEFW $9014
8018 DEFW $9005
801A DEFW $8F42
801C DEFW $8F49
801E DEFW $903E
8020 DEFW $87F1
8022 DEFW $876E
8024 DEFW $8F17
8026 DEFW $8F26
8028 DEFW $8F35
802A DEFW $8DCC
802C DEFW $8D5D
802E DEFW $8EB5
8030 DEFW $8ECC
8032 DEFW $8EE3
8034 DEFW $8E74
8036 DEFW $8E83
8038 DEFW $8301
803A DEFW $88FD
803C DEFW $8914
803E DEFW $872F
8040 DEFW $897F
8042 DEFW $8D58
8044 DEFW $8594
8046 DEFW $8458
8048 DEFW $83A4
804A DEFW $833F
804C DEFW $832F
804E DEFW $8344
8050 DEFW $822B
8052 DEFW $818F
8054 DEFW $8187
8056 DEFW $8169
8058 DEFW $8178
805A DEFW $8164
805C DEFW $904D
805E DEFW $8158
8060 DEFW $8062
8062: End of the enemy run with rocket launchers
Ends the enemy run with rocket launchers, setting the scroll target and arming its timer.
8062 LD (IY+$7B),E
8065 LD (IY+$7D),$01
8069 SCF
806A RET
806B: Mark map cells for object IX, direction-aware
Used by the routines at 800F and 82C1.
Input
IX Address of the 20-byte object record
Stamps an object's footprint onto the collision map, using its direction of travel to decide which cells to mark -- so as it moves it releases the cells behind it while claiming those ahead.
806B EXX
806C LD D,(IX+$01)
806F LD E,(IX+$00)
8072 LD A,(IX+$07)
8075 CP $12
8077 JR Z,$80D6
8079 LD H,(IX+$05)
807C LD L,(IX+$04)
807F LD A,L
8080 CP E
8081 JR Z,$8092
8083 JP M,$808B
8086 CALL $80FB Mark cells in $1600 map, B=1
8089 JR $8092
808B INC E
808C INC E
808D CALL $80FB Mark cells in $1600 map, B=1
8090 DEC E
8091 DEC E
8092 CALL $8101 Mark cells in $1600 map, B=C
8095 INC L
8096 CALL $8101 Mark cells in $1600 map, B=C
8099 INC L
809A CALL $8101 Mark cells in $1600 map, B=C
809D DEC L
809E DEC L
809F LD A,D
80A0 AND $FC
80A2 LD B,A
80A3 LD A,H
80A4 AND $FC
80A6 CP B
80A7 JR Z,$80B4
80A9 JP M,$80B1
80AC CALL $80E4 Mark 3 cells in $1600 map, B=1
80AF JR $80B4
80B1 CALL $80EA Mark 3 cells in $1600 map, B=C
80B4 LD A,D
80B5 INC A
80B6 AND $FC
80B8 LD B,A
80B9 LD A,H
80BA INC A
80BB AND $FC
80BD CP B
80BE JR Z,$80D3
80C0 JP M,$80CC
80C3 LD A,H
80C4 ADD A,$0A
80C6 LD A,H
80C7 CALL $80EA Mark 3 cells in $1600 map, B=C
80CA JR $80D3
80CC LD A,D
80CD ADD A,$0A
80CF LD D,A
80D0 CALL $80E4 Mark 3 cells in $1600 map, B=1
80D3 JP $98D0 => Update object IX position, clip to screen, dispatch sprite draw
80D6 CALL $80FB Mark cells in $1600 map, B=1
80D9 INC E
80DA CALL $80FB Mark cells in $1600 map, B=1
80DD INC E
80DE CALL $80FB Mark cells in $1600 map, B=1
80E1 JP $98D0 => Update object IX position, clip to screen, dispatch sprite draw
80E4: Mark 3 cells in $1600 map, B=1 (entry to $80ED)
Used by the routine at 806B.
Input
DE Map cell address
Marks three cells of the collision map, entering the shared marking loop with a fixed count.
80E4 PUSH DE
80E5 EXX
80E6 LD B,$01
80E8 JR $80ED
80EA: Mark 3 cells in $1600 map, B=C (entry to $80ED)
Used by the routine at 806B.
Input
HL Map cell address
Marks three neighbouring cells of the collision map, stepping along the row.
80EA PUSH HL
80EB EXX
80EC LD B,C
This entry point is used by the routine at 80E4.
80ED POP DE
80EE CALL $8122 Set/test flag in $1600 map at tile
80F1 INC E
80F2 CALL $8122 Set/test flag in $1600 map at tile
80F5 INC E
80F6 CALL $8122 Set/test flag in $1600 map at tile
80F9 EXX
80FA RET
80FB: Mark cells in $1600 map, B=1 (entry to $8104)
Used by the routine at 806B.
Input
DE Map cell address
Marks a single cell of the collision map, entering the shared marking loop with a count of one.
80FB PUSH DE
80FC EXX
80FD LD B,$01
80FF JR $8104
8101: Mark cells in $1600 map, B=C (entry to $8104)
Used by the routine at 806B.
Input
HL Map cell address
C Cell count
Marks a short run of cells down one column of the collision map, stepping four rows at a time.
8101 PUSH HL
8102 EXX
8103 LD B,C
This entry point is used by the routine at 80FB.
8104 POP DE
8105 CALL $8122 Set/test flag in $1600 map at tile
8108 LD A,D
8109 ADD A,$04
810B LD D,A
810C CALL $8122 Set/test flag in $1600 map at tile
810F LD A,D
8110 ADD A,$04
8112 LD D,A
8113 CALL $8122 Set/test flag in $1600 map at tile
8116 LD A,D
8117 ADD A,$04
8119 LD D,A
811A INC A
811B AND $03
811D CALL Z,$8122 Set/test flag in $1600 map at tile
8120 EXX
8121 RET
8122: Set/test flag in $1600 map at tile (D,E)
Used by the routines at 80EA and 8101.
Input
D Row
E Column
B $01 = test only, else set
Reads or sets a flag on one cell of the collision map, working the map address out from the row and column.
8122 LD A,E
8123 CP $20 Reject if column (E) out of range
8125 RET NC
8126 LD A,D Reject if row (D) out of range
8127 DEC A
8128 CP $5F
812A RET NC
812B INC A
812C CP $04
812E RET C
812F ADD A,A Column * 4 into A
8130 ADD A,A
8131 LD H,$16 Row bit 8 into the map base
8133 RL H
8135 ADD A,A Doubled and folded in too
8136 RL H
8138 AND $E0
813A OR E
813B LD L,A
813C LD A,B B=1: test flag only
813D CP $01
813F JR Z,$814D
8141 LD A,(HL)
8142 AND $07
8144 CP $01
8146 RET NZ
8147 LD A,(HL) Merge flag bits, write back
8148 AND $38
814A OR B
814B LD (HL),A
814C RET
814D LD A,(HL)
814E AND $07
8150 CP C
8151 RET NZ
8152 LD A,(HL)
8153 AND $38
8155 OR B
8156 LD (HL),A
8157 RET
8158: Turn the alarm on: sound it, then draw
Turns the alarm on: triggers the sound effect, then draws. It heads a run of small scenery handlers sharing one block, each reached from the $8012 table by its own record code.
8158 LD A,$01
815A DEC E
815B JR Z,$815F
815D LD A,$07
815F CALL $642D
8162 SCF
8163 RET
8164: Draw a trench, right-hand side
Draws the right-hand end of a trench, loading its sprite and joining the neighbouring handler's draw path.
8164 LD HL,($C02C)
8167 JR $816C
8169: Draw a trench, left-hand side
Draws the left-hand end of a trench while its row is on screen.
8169 LD HL,($C028)
This entry point is used by the routine at 8164.
816C LD A,D
816D CP $65
816F CCF
8170 RET C
8171 LD B,$06
8173 LD C,$30
8175 JP $8A7B => Sprite draw dispatch
8178: Draw a trench, middle
Draws the middle of a trench while its row is on screen.
8178 LD A,D
8179 CP $65
817B CCF
817C RET C
817D LD HL,($C02A)
8180 LD B,$06
8182 LD C,$30
8184 JP $8B4B => Sprite draw dispatch
8187: Spawn point marker: the Area replays from here
Marks a spawn point in the level sequence. Dying rewinds the sequence pointer back to the last one of these, so the Area replays from here.
8187 DEC E
8188 SCF
8189 RET NZ
818A SET 4,(IY+$15)
818E RET
818F: Draw the fortress gates
Draws the fortress gates: clips the block against the screen edge, then fills it a row at a time, narrowing the fill when the level counter says the gates are at their edge.
818F LD BC,$1701 Block size $17 by $01
8192 CALL $867C Clip sprite rectangle against screen edge
8195 RET C
8196 EX DE,HL
8197 LD A,E Step the column back eight
8198 SUB $08
819A LD E,A
819B LD C,$02 Default fill width
819D LD A,($FDE0) Narrower fill at the level's edge
81A0 CP $1F
81A2 JR NZ,$81A6
81A4 LD C,$01
81A6 LD A,$08 Set drop type A=8 for draw address calc
81A8 CALL $899E Compute screen draw address for sprite, save state to buffer
81AB LD A,E Step the column forward again
81AC ADD A,$08
81AE LD E,A
81AF EX DE,HL
81B0 LD DE,$FFFF Fill value: all bits set
81B3 EXX Swap in, load $FFFF
81B4 LD HL,$FFFF
81B7 LD B,H Spread it into B, C, D and E too
81B8 LD C,H
81B9 LD D,H
81BA LD E,H
81BB LD A,($FDE0) Load the level's edge counter
81BE SLA B Rotate the mask one bit narrower
81C0 RL C
81C2 RL H
81C4 RL L
81C6 SRL E ...continue through the other half
81C8 RR D
81CA EXX
81CB RR E ...and its swapped-bank tail
81CD RR D
81CF EXX
81D0 DEC A Count down, loop until the width is trimmed
81D1 JP P,$81BE
81D4 EXX Trimmed width reached $17?
81D5 LD A,B
81D6 CP $17
81D8 JR NZ,$81EF No: skip the narrow-fill step
81DA LD A,$08 Otherwise blank $08 bytes from the right edge
81DC DEC L
81DD LD (HL),$00
81DF DEC A
81E0 JR NZ,$81DC
81E2 INC H Then $08 more from the row below
81E3 LD A,$08
81E5 LD (HL),$00
81E7 INC L ...counting both down together
81E8 DEC A
81E9 JR NZ,$81E5
81EB DEC B One row shorter overall
81EC CALL $98DC DOWN HL
81EF LD ($FD82),SP Point SP at the fill buffer
81F3 LD SP,HL Push the first two rows through the stack
81F4 PUSH DE
81F5 EXX
81F6 PUSH DE
81F7 PUSH BC ...and the third and fourth
81F8 PUSH HL
81F9 EXX Swap back, drop a pixel line
81FA INC H
81FB LD SP,HL
81FC PUSH DE Repeat for the second half
81FD EXX
81FE PUSH DE ...its own two rows
81FF PUSH BC
8200 PUSH HL
8201 EXX Swap back, drop a pixel line
8202 INC H
8203 LD A,H Check screen third boundary
8204 AND $07
8206 JR NZ,$8212
8208 LD A,L Advance to the next screen row
8209 ADD A,$20
820B LD L,A
820C JR C,$8212
820E LD A,H Otherwise back a third, forward a row
820F SUB $08
8211 LD H,A
8212 DJNZ $81F3
8214 LD SP,($FD82)
8218 OR A
8219 BIT 4,(IY+$15)
821D RET Z
821E LD HL,$FDE0
8221 INC (HL)
8222 LD A,(HL)
8223 CP $20
8225 CCF
8226 RET NC
8227 LD (HL),$00
8229 SCF
822A RET
822B: Move and draw a prisoner of war
Moves a prisoner of war down the screen while he is active, stepping his position as the counters lapse, then advancing his animation buffers.
822B LD IX,$FDCF Load object at $FDCF, check flag bit 7
822F BIT 7,(IX+$0B)
8233 JR Z,$82A7
8235 LD A,D
8236 CP $28
8238 JR NC,$8244
823A LD A,R
823C JP P,$826F
823F INC (IX+$05)
8242 JR $826F
8244 LD A,(IX+$0B) Check flags, clear ($FDDB) if all clear
8247 OR $ED
8249 INC A
824A JR NZ,$824F
824C LD ($FDDB),A
824F BIT 0,(IY+$5B) Decrement scroll counters, adjust position
8253 JR NZ,$8262
8255 DEC (IX+$06)
8258 JP P,$8262
825B LD (IX+$06),$03
825F DEC (IX+$04)
8262 DEC (IY+$5B)
8265 JP P,$826F
8268 LD (IY+$5B),$03
826C DEC (IX+$05)
826F LD A,$10
8271 LD E,$11
8273 LD C,$02
8275 CALL $82E1 Advance/rotate object buffer pointer
8278 LD A,$08
827A LD E,$10
827C LD C,$03
827E CALL $82E1 Advance/rotate object buffer pointer
8281 LD A,$02
8283 LD E,$11
8285 LD C,$02
8287 CALL $82C1 Set object state flags, call $806B
828A LD HL,$FDDA Read the state flags, clearing the top bit
828D LD A,(HL)
828E RES 7,(HL)
8290 OR $E5 All other bits set? nothing to do
8292 INC A
8293 SCF
8294 RET Z
8295 SET 7,(HL) Put the top bit back
8297 LD HL,$FDD3 Step the buffer position back
829A LD A,(HL)
829B SUB $06
829D LD (HL),A
829E LD HL,$FDCF Step the object row back
82A1 LD A,(HL)
82A2 SUB $06
82A4 LD (HL),A
82A5 OR A
82A6 RET
82A7 LD HL,$82B4 Inactive: reload the record from its template
82AA LD DE,$FDCF
82AD LD BC,$000D Copy the 13-byte template in
82B0 LDIR
82B2 OR A
82B3 RET
82B4: Data 13 bytes to copy at $FDCF
82B4 DEFB $0C,$FA,$00,$00,$0C,$FA,$00,$00
82BC DEFB $04,$5F,$0A,$80,$01
82C1: Set object state flags, call $806B
Used by the routines at 822B and 82E1.
Input
IX Address of the 20-byte object record
E New direction/type value
Stores an object's facing into its record, substituting a special sprite when the flag calls for it, then stamps the object onto the collision map and merges the new state flags in.
82C1 LD (IX+$03),E Store the facing into the record
82C4 LD (IX+$07),E
82C7 PUSH AF
82C8 AND (IX+$0B) Special sprite if the flag is set
82CB JR Z,$82D1
82CD LD (IX+$07),$12
82D1 CALL $806B Mark map cells for object IX, direction-aware
82D4 POP AF
82D5 BIT 5,(IX+$0B) Keep the flags if bit 5 is set
82D9 RET NZ
82DA OR (IX+$0B) Merge in the new flag bits
82DD LD (IX+$0B),A
82E0 RET
82E1: Advance/rotate object buffer pointer
Used by the routine at 822B.
Input
IX Object record
Steps one of an object's animation buffer pointers on, wrapping it round when it passes the end of the buffer.
82E1 LD HL,($FDCF) Save/restore pointer around $82C1 call
82E4 LD B,(IX+$02)
82E7 PUSH HL
82E8 PUSH BC
82E9 CALL $82C1 Set object state flags, call $806B
82EC POP BC
82ED POP HL
82EE LD ($FDCF),HL
82F1 LD (IX+$02),B
82F4 LD HL,$FDD3 Bump ($FDD3) and ($FDCF) counters by 3
82F7 INC (HL)
82F8 INC (HL)
82F9 INC (HL)
82FA LD HL,$FDCF
82FD INC (HL)
82FE INC (HL)
82FF INC (HL)
8300 RET
8301: Draw a small hut
Draws a small hut, its flag bit picking between two sprites and clearing before the draw so the second form persists.
8301 BIT 7,E
8303 RES 7,E
8305 JR Z,$8326
8307 DEC E
8308 LD HL,($C04C)
830B LD BC,$1400
830E PUSH DE
830F CALL $8A14 Sprite draw dispatch variant, C=4
8312 POP DE
8313 LD A,E
8314 ADD A,$07
8316 LD E,A
8317 LD BC,$1400
831A PUSH DE
831B LD HL,($C04E)
831E CALL $8A14 Sprite draw dispatch variant, C=4
8321 POP DE
8322 LD A,E
8323 SUB $06
8325 LD E,A
8326 LD HL,($C030)
8329 LD B,$14
832B LD A,$00
832D JR $834B => Draw sprite HL
832F: Draw the cave body
Draws the cave body, choosing between two sprites by column.
832F LD A,$80
8331 LD B,$14
8333 LD HL,($C034)
8336 INC E
8337 DEC E
8338 JR Z,$834B => Draw sprite HL
833A LD HL,($C036)
833D JR $834B => Draw sprite HL
833F: Draw a cave top edge
Draws a cave top edge, loading its sprite and joining the shared draw path.
833F LD HL,($C038)
8342 JR $8347
8344: Draw a cave bottom edge
Draws a cave bottom edge, loading its sprite and joining the shared draw path.
8344 LD HL,($C03A)
This entry point is used by the routine at 833F.
8347 LD A,$00
8349 LD B,$04
834B: Draw sprite HL
Used by the routines at 8301, 832F and 90AC.
Input
A Attribute/color byte for the sprite
B Sprite height??
D Row
E Column
HL Sprite address
Draws a pre-shifted sprite by pointing the stack at its data buffer and popping bytes straight into screen memory, row by row, after clipping.
834B EX AF,AF' Swap alt HL in from the sprite bank
834C PUSH HL
834D EXX
834E POP HL Load it, swap back
834F EXX
8350 LD C,$0C
8352 CALL $867C Clip sprite rectangle against screen edge
8355 RET C
8356 PUSH HL Stash the position, swap in
8357 EXX
8358 PUSH HL Copy the position across, swap back
8359 EXX
835A POP HL
835B ADD HL,DE Add the clip offset to the address
835C POP DE
835D EX AF,AF'
835E LD C,A
835F LD A,$06
8361 BIT 6,C Check attribute bit 6, choose draw variant
8363 CALL Z,$899E Compute screen draw address for sprite, save state to buffer
8366 LD ($FD82),SP
836A LD SP,HL
836B EX DE,HL
836C LD A,L Remember the row's start
836D POP DE #0 first word, two screen bytes
836E LD (HL),E
836F INC L
8370 LD (HL),D
8371 INC L
8372 POP DE #1 second word
8373 LD (HL),E
8374 INC L
8375 LD (HL),D
8376 INC L
8377 POP DE #2 third word
8378 LD (HL),E
8379 INC L
837A LD (HL),D
837B LD L,A Down to the next pixel line
837C INC H
837D POP DE #0 first word, two screen bytes
837E LD (HL),E
837F INC L
8380 LD (HL),D
8381 INC L
8382 POP DE #1 second word
8383 LD (HL),E
8384 INC L
8385 LD (HL),D
8386 INC L
8387 POP DE #2 third word
8388 LD (HL),E
8389 INC L
838A LD (HL),D
838B LD L,A
838C INC H
838D LD A,H Cross into the next screen third
838E AND $07
8390 JR NZ,$839C
8392 LD A,L
8393 ADD A,$20
8395 LD L,A
8396 JR C,$839C
8398 LD A,H
8399 SUB $08
839B LD H,A
839C DJNZ $836C Loop the rows
839E LD SP,($FD82)
83A2 OR A
83A3 RET
83A4: Spawn the Jeep: seed its record at $FDCB
Spawns the Jeep by seeding its record with a starting position and clearing the two counters that pace it.
83A4 LD HL,$FDCB
83A7 LD (HL),$0A
83A9 INC HL
83AA LD (HL),$6A
83AC INC HL
83AD LD (HL),$46
83AF XOR A
83B0 LD ($FDF9),A
83B3 LD ($FDF8),A
83B6 SCF
83B7 RET
83B8: Update and draw the Jeep sprite
Used by the routine at 9193.
Updates and draws the Jeep. It steps the position and clamps it to the road, retiring the Jeep once it runs off the end; otherwise it clips and draws the body, with a separate path for when it hangs off the screen edge.
83B8 LD HL,$FDCB Read Jeep flag ($FDCB), check active
83BB LD E,(HL)
83BC INC E
83BD RET Z
83BE DEC E
83BF INC HL Step past the position pointer
83C0 INC HL
83C1 DEC (HL) Decrement it, take the absolute value
83C2 LD A,(HL)
83C3 DEC HL
83C4 JP P,$83C9
83C7 NEG
83C9 CP $32 Clamp to the $32 lower bound
83CB JR C,$83CE
83CD DEC (HL) Decrement past it, clamp to $1E too
83CE CP $1E
83D0 JR C,$83D3
83D2 DEC (HL)
83D3 LD A,(HL)
83D4 CP $04 Deactivate Jeep when position under $04
83D6 JR NC,$83F1
83D8 DEC HL
83D9 LD (HL),$FF
83DB RET
83DC RES 7,E Off-screen edge: clear flag bit, redraw
83DE DEC HL
83DF LD (HL),$FF
83E1 PUSH DE
83E2 LD C,$02
83E4 CALL $854A Sprite draw dispatch
83E7 POP HL
83E8 LD A,H
83E9 SUB $0E
83EB LD H,A
83EC LD A,$02
83EE JP $642A => Find free slot in $6648 table
83F1 LD D,A
83F2 LD BC,$1008
83F5 BIT 7,E Test sprite direction bit
83F7 JR NZ,$83DC
83F9 CALL $867C Clip sprite rectangle against screen edge
83FC EX DE,HL
83FD LD A,$04
83FF LD C,$00
8401 CALL $899E Compute screen draw address for sprite, save state to buffer
8404 PUSH DE Save the position and size
8405 PUSH BC
8406 LD A,D Align the row to a character boundary
8407 AND $F8
8409 LD D,A
840A LD A,B Column offset masked to a multiple of 4
840B AND $FC
840D RLCA
840E RLCA Doubled again
840F RLCA
8410 ADD A,E Add it to the row address
8411 LD E,A
8412 JR NC,$841C No carry? nothing more to do
8414 LD A,D Step into the next character row
8415 ADD A,$08
8417 LD D,A
8418 CP $58 Past the screen? use the edge path
841A JR NC,$8425
841C LD A,$04 Set up the second draw
841E LD B,$04
8420 LD C,$01
8422 CALL $899E Compute screen draw address for sprite, save state to buffer
8425 POP BC
8426 POP DE
8427 EX DE,HL
8428 SLA B
842A PUSH HL
842B LD HL,($C032) Jeep sprite address, width 4
842E ADD HL,DE Advance the sprite pointer past the clip
842F POP DE
8430 LD ($FD82),SP Save SP, repurpose as sprite-data pointer
8434 LD SP,HL
8435 EX DE,HL
8436 LD A,L Blit one row of the Jeep
8437 POP DE
8438 LD (HL),E
8439 INC L
843A LD (HL),D
843B INC L
843C POP DE
843D LD (HL),E
843E INC L
843F LD (HL),D
8440 LD L,A
8441 INC H Step down a pixel line
8442 LD A,H Check screen third boundary
8443 AND $07
8445 JR NZ,$8451
8447 LD A,L Advance to the next screen row
8448 ADD A,$20
844A LD L,A
844B JR C,$8451
844D LD A,H
844E SUB $08
8450 LD H,A
8451 DJNZ $8436 Loop the rows
8453 LD SP,($FD82) Restore SP
8457 RET
8458: Set the type of the next motorbike
Records the motorbike's state and sets the type of the next one to appear, reading the existing flag to decide which.
8458 LD A,E Save state ($FDCE), read Motorbike flag ($FDC7)
8459 LD ($FDCE),A
845C LD HL,$FDC7
845F LD E,(HL)
8460 LD A,$03 Default to +3
8462 INC E -1 sentinel keeps it there
8463 JR Z,$846B
8465 DEC E
8466 LD A,E
8467 AND $03
8469 INC HL
846A INC HL
846B LD (HL),A
846C INC HL
846D LD (HL),$04
846F SCF
8470 RET
8471: Run both motorbikes: prepare, animate and draw
Used by the routine at 9193.
Runs both motorbikes, skipping out when neither is active. Each is prepared, animated and drawn in turn, and one that reports itself finished has its slot marked free.
8471 LD HL,$FDC7
8474 LD A,(HL)
8475 INC A
8476 JR NZ,$847D
8478 INC HL
8479 INC HL
847A LD A,(HL)
847B INC A
847C RET Z
847D CALL $8500 Prepare the motorbike sprite
8480 LD HL,$FDC7
8483 PUSH HL
8484 CALL $8497 Animate and draw a motorbike
8487 POP HL
8488 JR NC,$848C
848A LD (HL),$FF
848C INC HL
848D INC HL
848E PUSH HL
848F CALL $8497 Animate and draw a motorbike
8492 POP HL
8493 RET NC
8494 LD (HL),$FF
8496 RET
8497: Animate and draw a motorbike
Used by the routine at 8471.
Input
HL Address of the frame counter byte
Animates and draws an object held in the $FC06 sprite buffer. A per-frame timer in $FDCE steps the animation frame, slowing at the higher frames, with a small random wobble. The chosen frame is then drawn -- one special frame paints a solid block, otherwise the sprite is clipped and blitted from the buffer.
8497 LD E,(HL) Read the frame counter, hold if idle
8498 OR A
8499 INC E
849A RET Z
849B DEC E
849C LD A,($FDCE) Count down the frame timer
849F DEC A
84A0 JR Z,$84AF
84A2 LD ($FDCE),A Reload and step the frame
84A5 INC E
84A6 CP $14 Slow the animation at high frames
84A8 JR NC,$84AE
84AA RRCA
84AB JR C,$84AE
84AD DEC E
84AE LD (HL),E Store the new frame
84AF INC HL
84B0 LD A,R Bump (HL) when the draw-mode flag (R bit 7) is set
84B2 JP P,$84B6
84B5 INC (HL)
84B6 LD D,(HL)
84B7 LD BC,$0C03
84BA LD A,E Halve the frame into a sprite index
84BB SRL E
84BD SRL E
84BF CP $6B Special frame?
84C1 JP Z,$854A => Sprite draw dispatch
84C4 LD C,$0C Set the sprite width
84C6 CALL $867C Clip sprite rectangle against screen edge
84C9 RET C
84CA SLA B
84CC PUSH HL
84CD LD HL,$FC06 Point at the sprite buffer
84D0 ADD HL,DE
84D1 POP DE
84D2 LD ($FD82),SP
84D6 LD SP,HL
84D7 EX DE,HL
84D8 LD A,L
84D9 POP DE
84DA LD (HL),E #0 copy sprite bytes into the row
84DB INC L
84DC LD (HL),D
84DD INC L
84DE POP DE Take the next pair of sprite words
This entry point is used by the routine at EF37.
84DF LD (HL),E #1 write them into the screen row
84E0 INC L
84E1 LD (HL),D
84E2 INC L
84E3 POP DE And the second pair
84E4 LD (HL),E
84E5 INC L
84E6 LD (HL),D
84E7 LD L,A
84E8 INC H Step down a pixel line
84E9 LD A,H Check screen third boundary
84EA AND $07
84EC JR NZ,$84F8
84EE LD A,L Advance to the next screen row
84EF ADD A,$20
84F1 LD L,A
84F2 JR C,$84F8
84F4 LD A,H
84F5 SUB $08
84F7 LD H,A
84F8 DJNZ $84D8 Loop the rows
84FA LD SP,($FD82) Restore SP
84FE OR A
84FF RET
8500: Prepare the motorbike sprite: reload or shift one pixel
Used by the routine at 8471.
Input
HL Motorbike slot address
Prepares the motorbike sprite. Every fourth step it reloads the sprite from the graphics into the work buffer; otherwise it shifts the buffered copy one pixel sideways, so the bike can be drawn at positions between whole cells.
8500 LD A,($FDCE) Check Motorbike state counter ($FDCE)
8503 DEC A
8504 RET Z
8505 CP $14
8507 JR NC,$850B
8509 RRCA
850A RET NC
850B LD A,(HL)
850C INC A
850D AND $03
850F JR NZ,$851D
8511 LD HL,($C02E) Point at the buffered sprite
8514 LD DE,$FC06 Set up the copy: 144 bytes to $FC06
8517 LD BC,$0090
851A LDIR Copy it, return
851C RET
851D LD B,$18 Set up the 24-row shift loop
851F LD HL,$FC06 Point at the sprite buffer
8522 LD A,L Remember this row's start
8523 SRL (HL) 1st shift: row byte 1
8525 INC L
8526 RR (HL) ...byte 2
8528 INC L
8529 RR (HL) ...byte 3
852B INC L
852C RR (HL) ...byte 4
852E INC L
852F RR (HL) ...byte 5
8531 INC L
8532 RR (HL) ...byte 6
8534 LD L,A Restart at the row's start
8535 SRL (HL) 2nd shift: row byte 1
8537 INC L
8538 RR (HL) ...byte 2
853A INC L
853B RR (HL) ...byte 3
853D INC L
853E RR (HL) ...byte 4
8540 INC L
8541 RR (HL) ...byte 5
8543 INC L
8544 RR (HL) ...byte 6
8546 INC L
8547 DJNZ $8522 Next row
8549 RET
854A: Sprite draw dispatch: clip and compute screen address
Used by the routines at 83B8, 8497, 85AB, 86F5 and 8EE3.
Clips a rectangle and works out its screen address, then fills it with zero bytes a row at a time (two halves per row) using the stack -- painting a solid block where the sprite goes.
854A LD A,C Save the column, swap in
854B EX AF,AF'
854C LD A,C Column doubled, minus one
854D ADD A,A
854E DEC A
854F LD L,A
8550 LD H,$00
8552 PUSH HL
8553 CALL $867C Clip sprite rectangle against screen edge
8556 EX AF,AF'
8557 ADD A,A Set width C=$01 for draw address calc
8558 LD C,$01
855A EX DE,HL
855B CALL $899E Compute screen draw address for sprite, save state to buffer
855E SRL A
8560 LD C,A
8561 EX DE,HL
8562 POP DE Add the clip offset to the address
8563 ADD HL,DE
8564 LD ($FD82),SP
8568 LD DE,$0000
856B LD A,B
856C EX AF,AF' Swap back the width
856D LD SP,HL Point SP at this screen row
856E INC SP
856F LD B,C
8570 PUSH DE Blank the left half of the row
8571 DJNZ $8570
8573 INC H
8574 LD SP,HL
8575 INC SP
8576 LD B,C
8577 PUSH DE Blank the right half
8578 DJNZ $8577
857A INC H
857B LD A,H Cross into the next screen third
857C AND $07
857E JR NZ,$858A
8580 LD A,L
8581 ADD A,$20
8583 LD L,A
8584 JR C,$858A
8586 LD A,H
8587 SUB $08
8589 LD H,A
858A EX AF,AF'
858B DEC A Loop the rows
858C JR NZ,$856C
858E LD SP,($FD82)
8592 SCF
8593 RET
8594: Draw the truck
Draws the truck held in the $FDC3 slot, taking its animation frame from the slot's low bits and skipping the draw when the slot is empty.
8594 LD HL,$FDC3
8597 LD E,(HL)
8598 LD A,$07
859A INC E
859B JR Z,$85A3
859D DEC E
859E LD A,E
859F AND $07
85A1 INC HL
85A2 INC HL
85A3 ADD A,$B8
85A5 LD (HL),A
85A6 INC HL
85A7 LD (HL),$04
85A9 SCF
85AA RET
85AB: Update and draw the Truck(s)
Used by the routine at 9193.
Manages the truck objects: bails out if none are active, otherwise readies the truck sprite buffer and ticks each truck's timer -- drawing it while it counts down, and spawning a replacement plus a final sprite when it expires.
85AB LD HL,$FDC3
85AE LD A,(HL) First truck slot active?
85AF INC A
85B0 JR NZ,$85B7
85B2 INC HL
85B3 INC HL
85B4 LD A,(HL) Bail if the second is idle too
85B5 INC A
85B6 RET Z
85B7 PUSH AF
85B8 LD A,R Step the truck timers when the draw-mode flag (R bit 7) is set
85BA JP P,$85C3
85BD INC (IY+$44)
85C0 INC (IY+$46)
85C3 POP AF
85C4 CALL $86B8 Get Truck sprite to $6300 buffer and shift it if needed
85C7 LD HL,$FDC3
85CA CALL $85D0
85CD LD HL,$FDC5
85D0 LD A,(HL) Truck record inactive? stop
85D1 CP $FF
85D3 RET Z
85D4 DEC (HL) Count the timer down, spawn on zero
85D5 JR Z,$8605
85D7 INC HL
85D8 LD A,(HL)
85D9 DEC HL
85DA ADD A,A Not ready to draw yet
85DB JR C,$85E6
85DD PUSH HL
85DE CALL $8618 Draw two-part sprite from record at HL
85E1 POP HL
85E2 RET NC
85E3 LD (HL),$FF
85E5 RET
85E6 PUSH HL
85E7 LD A,(HL) Record index into A
85E8 RRCA
85E9 RRCA Rotated down three, masked to the table
85EA RRCA
85EB AND $1F
85ED INC A
85EE INC HL
85EF LD H,(HL)
85F0 LD L,A
85F1 LD A,H
85F2 AND $7F
85F4 SUB $0E
85F6 LD H,A
85F7 XOR A
85F8 PUSH HL
85F9 CALL $642A Find free slot in $6648 table
85FC POP HL
85FD INC L
85FE INC L
85FF INC L
8600 XOR A
8601 CALL $642A Find free slot in $6648 table
8604 POP HL
8605 LD E,(HL) Reclaim the slot
8606 LD (HL),$FF
8608 SRL E
860A SRL E
860C SRL E
860E INC HL
860F LD D,(HL)
8610 RES 7,D
8612 LD BC,$1004 Draw the final truck sprite
8615 JP $854A => Sprite draw dispatch
8618: Draw two-part sprite from record at HL
Used by the routine at 85AB.
Input
HL Address of the 2-byte sprite record
Draws a sprite made of two stacked halves, taking the frame and colour from a short record and clipping the pair as one block before blitting each half.
8618 LD A,(HL) Frame byte, one past it
8619 INC A
861A INC HL
861B RRCA Rotate the type field down
861C RRCA
861D RRCA Once more, masked to the type bits
861E AND $1F
8620 LD E,A
8621 LD D,(HL) Read attribute (D), set size $1010
8622 LD BC,$1010
8625 CALL $867C Clip sprite rectangle against screen edge
8628 RET C
8629 EX DE,HL
862A LD A,$08 Draw first part, C=$04
862C LD C,$04
862E CALL $899E Compute screen draw address for sprite, save state to buffer
8631 LD A,E
8632 ADD A,$08 Offset second part 8 columns right
8634 LD E,A
8635 LD A,$01
8637 LD C,$01
8639 CALL $899E Compute screen draw address for sprite, save state to buffer
863C LD A,E
863D SUB $08
863F LD E,A
8640 EX DE,HL
8641 SLA B Double row count for both halves
8643 PUSH HL
8644 LD HL,$6300
8647 ADD HL,DE
8648 POP DE
8649 LD ($FD82),SP Save SP, repurpose as sprite-data pointer
864D LD SP,HL
864E EX DE,HL
864F LD A,L Blit row: pop pixel words, store to screen
8650 POP DE #0 first word, two screen bytes
8651 LD (HL),D
8652 INC L
8653 LD (HL),E
8654 INC L
8655 POP DE #1 second word
8656 LD (HL),D
8657 INC L
8658 LD (HL),E
8659 INC L
865A POP DE #2 third word
865B LD (HL),D
865C INC L
865D LD (HL),E
865E INC L
865F POP DE #3 fourth word
8660 LD (HL),D
8661 INC L
8662 LD (HL),E
8663 LD L,A
8664 INC H Advance to next pixel line, handle char/third wrap
8665 LD A,H
8666 AND $07
8668 JR NZ,$8674
866A LD A,L
866B ADD A,$20
866D LD L,A
866E JR C,$8674
8670 LD A,H
8671 SUB $08
8673 LD H,A
8674 DJNZ $864F
8676 LD SP,($FD82) Restore SP
867A OR A
867B RET
867C: Clip sprite rectangle against screen edge (vertical)
Used by the routines at 818F, 834B, 83B8, 8497, 854A, 8618, 8A14, 8A7B, 8AC3, 8B4B, 8BE7, 8CC9 and 90AC.
Input
D Row
B Sprite height
Clips a sprite against the top and bottom screen edges, trimming its height and start row. Returns the screen address of its first visible line, with carry set if it falls entirely off-screen.
867C LD A,D Check the row against the bottom
867D CP $60
867F JR NC,$869B
8681 LD H,B Distance from the top edge
8682 SUB B
8683 CP $03 Fully on-screen? skip the clip
8685 JP P,$86A4
8688 SUB $03 Otherwise clip rows off the top
868A NEG
868C LD H,A
868D NEG
868F ADD A,B
8690 LD B,A
8691 LD A,E
8692 LD E,C
8693 CALL $8E92 Shift-add multiply
8696 LD E,A
8697 LD D,$04
8699 JR $86AB
869B SUB B Off bottom: reduce the visible height
869C SUB $5F
869E CCF
869F RET C
86A0 LD H,B Clamp to the screen edge
86A1 NEG
86A3 LD B,A
86A4 LD A,D Rows above the clip edge
86A5 SUB H
86A6 INC A One more, back into D
86A7 LD D,A
86A8 LD HL,$0000
86AB EX DE,HL
86AC LD A,L
86AD LD L,H
86AE SLA L
86B0 LD H,$FE $FE00 - table of even screen lines addresses
86B2 ADD A,(HL) Fold in the column offset
86B3 INC L
86B4 LD H,(HL)
86B5 LD L,A
86B6 OR A
86B7 RET
86B8: Get Truck sprite to $6300 buffer and shift it if needed
Used by the routine at 85AB.
Prepares the truck sprite for drawing at a sub-cell position. On an eight-pixel boundary it reloads the sprite from the graphics; otherwise it shifts the buffered copy one pixel left, carrying between the bytes of each row.
86B8 AND $07 Reload only on the 8-pixel boundary
86BA JR NZ,$86C7
86BC LD HL,($C03C) Truck sprite address, width 8
86BF LD DE,$6300
86C2 LD BC,$0100
86C5 LDIR
Shift 8*32 bytes at $6300 one bit left
86C7 LD ($FD82),SP
86CB LD HL,$6300 Buffer address
86CE LD DE,$0008
86D1 LD B,$20 Loop counter = 32
86D3 ADD HL,DE Step to the next row
86D4 LD SP,HL
86D5 EXX
86D6 DEC SP
86D7 DEC SP
86D8 POP HL #0 shift the low word left
86D9 ADD HL,HL
86DA PUSH HL
86DB DEC SP #1 carry into the second word
86DC DEC SP
86DD POP HL
86DE ADC HL,HL
86E0 PUSH HL
86E1 DEC SP #2 carry into the third word
86E2 DEC SP
86E3 POP HL
86E4 ADC HL,HL
86E6 PUSH HL
86E7 DEC SP #3 carry into the fourth word
86E8 DEC SP
86E9 POP HL
86EA ADC HL,HL
86EC PUSH HL
86ED EXX
86EE DJNZ $86D3 Loop the 32 rows
86F0 LD SP,($FD82)
86F4 RET
86F5: Draw a bunker
Draws a bunker, choosing between two sprites by column and skipping it once the row scrolls off. A flagged variant paints a solid block instead and books effect slots for the explosion that follows.
86F5 LD A,D Reject if the row is off-screen
86F6 CP $7F
86F8 CCF
86F9 RET C
86FA LD B,$20
86FC BIT 7,E Pick the draw path (bit 7)
86FE JR NZ,$8711
8700 LD C,$32
8702 LD A,E Choose the sprite by column
8703 CP $0F
8705 LD HL,($C024)
8708 JP C,$8C52
870B LD HL,($C026)
870E JP $8C52
8711 RES 7,E Solid-block path: draw it
8713 PUSH DE
8714 LD C,$03
8716 CALL $854A Sprite draw dispatch
8719 POP HL
871A LD A,H Move up for the effect slots
871B SUB $16
871D LD H,A
871E LD A,$02
8720 PUSH HL
8721 CALL $642A Find free slot in $6648 table
8724 POP HL
8725 LD A,$02
8727 INC L
8728 INC L
8729 INC L
872A CALL $642A Find free slot in $6648 table
872D SCF
872E RET
872F: Draw the road surface on a bridge
Input
D Row
Paints the road surface across a bridge, filling each row of attribute cells through the stack.
872F LD A,D Skip if the row is off the bottom
8730 CP $5F
8732 CCF
8733 RET C
8734 AND $03 Only act on every fourth row
8736 RET NZ
8737 LD B,$04 Default to four rows
8739 LD A,D Fewer rows near the top
873A CP $10
873C JR NC,$8743
873E SRL A
8740 SRL A
8742 LD B,A
8743 CALL $896D Get attributes address for the screen line
8746 LD D,$38 Fill colour = $38
8748 LD E,D
8749 LD ($FD82),SP Save SP
874D LD SP,HL Point SP at the end of the attribute row
874E INC SP
874F PUSH DE Sixteen pushes fill it
8750 PUSH DE
8751 PUSH DE
8752 PUSH DE
8753 PUSH DE
8754 PUSH DE
8755 PUSH DE
8756 PUSH DE
8757 PUSH DE
8758 PUSH DE
8759 PUSH DE
875A PUSH DE
875B PUSH DE
875C PUSH DE
875D PUSH DE
875E PUSH DE
875F LD A,L Step up one attribute row
8760 SUB $20
8762 LD L,A
8763 JR NC,$8766
8765 DEC H
8766 DJNZ $874D
8768 LD SP,($FD82) Restore SP
876C OR A
876D RET
876E: Draw a wall
Input
D Row
E Column
Draws a wall the full height of its band, tiling a narrow pattern across the width. A wall starting above the screen has its hidden rows skipped and the pattern advanced to match.
876E LD A,D Reject if the row is off-screen
876F CP $78
8771 CCF
8772 RET C
8773 LD B,$19 Full wall height = 25 rows
8775 LD A,D Row within the band
8776 INC A
8777 SUB B Offset by the sub-band, store it
8778 LD D,A
8779 CP $04
877B JP P,$879E
877E LD A,D Compute second band value, save B
877F ADD A,B
8780 SUB $04
8782 EXX
8783 LD B,A
8784 EXX
8785 LD H,$40
8787 LD A,E
8788 ADD A,$20
878A LD L,A
878B LD A,D
878C EXX
878D NEG Skip the hidden top rows
878F ADD A,$04
8791 LD L,A
8792 LD H,$00
8794 ADD HL,HL Scale to the sprite row stride
8795 ADD HL,HL
8796 ADD HL,HL
8797 LD DE,($C004) Wall sprite address, width 4
879B ADD HL,DE
879C JR $87AE
879E LD A,D Screen address from the row
879F ADD A,A
87A0 LD L,A
87A1 LD A,E
87A2 LD H,$FE $FE00 - table of even screen lines addresses
87A4 ADD A,(HL)
87A5 INC L
87A6 LD H,(HL)
87A7 LD L,A
87A8 EXX
87A9 LD B,$19 Height = 25
87AB LD HL,($C004) Wall sprite address, width 4
87AE LD DE,$0004 Sprite column stride
87B1 LD ($FD82),SP
87B5 LD SP,HL Point SP at the row data
87B6 ADD HL,DE
87B7 EXX Swap in the row's first word
87B8 POP BC
87B9 POP DE Take the row's second word
87BA LD SP,HL
87BB INC SP
87BC PUSH DE #0 tile the pattern pair across
87BD PUSH BC
87BE PUSH DE #1 again
87BF PUSH BC
87C0 PUSH DE #2 and again, twelve bytes in all
87C1 PUSH BC
87C2 INC H Step down a pixel line
87C3 EXX
87C4 LD SP,HL
87C5 ADD HL,DE
87C6 EXX
87C7 POP BC Take the next row's words
87C8 POP DE
87C9 LD SP,HL
87CA INC SP
87CB PUSH DE #0 tile the pattern pair across
87CC PUSH BC
87CD PUSH DE #1 again
87CE PUSH BC
87CF PUSH DE #2 and again
87D0 PUSH BC
87D1 INC H
87D2 LD A,H Cross into the next screen third
87D3 AND $07
87D5 JR NZ,$87E8
87D7 LD A,L Advance to the next screen row
87D8 ADD A,$20
87DA LD L,A
87DB JR C,$87E1
87DD LD A,H
87DE SUB $08
87E0 LD H,A
87E1 LD A,H
87E2 AND $18
87E4 CP $18
87E6 JR Z,$87EB
87E8 EXX
87E9 DJNZ $87B5
87EB LD SP,($FD82)
87EF OR A
87F0 RET
87F1: Draw a bridge section
Input
D Row
E Column
Draws a bridge section, colouring its two-tone attribute band a row at a time through the stack before drawing the sprite itself.
87F1 PUSH DE
87F2 LD A,D
87F3 SUB $03 Align row to the 4-row grid
87F5 LD D,A
87F6 AND $03 Act only on every fourth row
87F8 JR NZ,$885B
87FA LD A,D
87FB LD C,D
87FC CP $60
87FE JR C,$8823
8800 JR NZ,$885B
8802 SUB $04
8804 LD D,A
8805 CALL $896D Get attributes address for the screen line
8808 LD D,$31 Attribute byte
880A LD E,D
880B LD ($FD82),SP
880F LD SP,HL
8810 INC SP
8811 PUSH DE Sixteen pushes fill the attribute row
8812 PUSH DE
8813 PUSH DE
8814 PUSH DE
8815 PUSH DE
8816 PUSH DE
8817 PUSH DE
8818 PUSH DE
8819 PUSH DE
881A PUSH DE
881B PUSH DE
881C PUSH DE
881D PUSH DE
881E PUSH DE
881F PUSH DE
8820 PUSH DE
8821 JR $8857
8823 CALL $896D Get attributes address for the screen line
8826 LD D,$30 Attribute byte
8828 LD E,D
8829 LD ($FD82),SP
882D LD SP,HL
882E INC SP
882F PUSH DE Sixteen pushes fill the attribute row
8830 PUSH DE
8831 PUSH DE
8832 PUSH DE
8833 PUSH DE
8834 PUSH DE
8835 PUSH DE
8836 PUSH DE
8837 PUSH DE
8838 PUSH DE
8839 PUSH DE
883A PUSH DE
883B PUSH DE
883C PUSH DE
883D PUSH DE
883E PUSH DE
883F LD A,C
8840 CP $04
8842 JR Z,$8857
8844 LD D,$31 Attribute byte
8846 LD E,D
8847 PUSH DE Sixteen pushes fill the attribute row
8848 PUSH DE
8849 PUSH DE
884A PUSH DE
884B PUSH DE
884C PUSH DE
884D PUSH DE
884E PUSH DE
884F PUSH DE
8850 PUSH DE
8851 PUSH DE
8852 PUSH DE
8853 PUSH DE
8854 PUSH DE
8855 PUSH DE
8856 PUSH DE
8857 LD SP,($FD82)
885B POP DE
885C CP $69 Reject if row off bottom edge
885E CCF
885F RET C
8860 LD A,D Reject if above the band
8861 CP $65
8863 RET NC
8864 LD B,$06
8866 LD A,D
8867 INC A
8868 SUB B
8869 LD D,A
886A CP $04
886C EXX
886D LD HL,$88E5 Load structure graphic $88E5
8870 EXX
8871 JP P,$8887
8874 LD A,D
8875 ADD A,B
8876 SUB $04
8878 LD B,A
8879 LD A,D
887A NEG
887C ADD A,$04
887E ADD A,A
887F ADD A,A
8880 EXX
8881 CALL $98D3 HL = HL + A
8884 EXX
8885 LD D,$04
8887 LD A,D
8888 ADD A,A
8889 LD L,A
888A LD A,E
888B LD H,$FE $FE00 - table of even screen lines addresses
888D ADD A,(HL) Add the table byte
888E INC L
888F LD H,(HL) Take the high byte, restore the low
8890 LD L,A
8891 LD ($FD82),SP
8895 LD SP,HL Now SP = address on the screen
8896 INC SP
8897 EXX
8898 LD E,(HL) Low byte from table $88E5
8899 INC HL
889A LD D,(HL) High byte alongside it
889B INC HL
889C PUSH DE Sixteen pushes fill the attribute row
889D PUSH DE
889E PUSH DE
889F PUSH DE
88A0 PUSH DE
88A1 PUSH DE
88A2 PUSH DE
88A3 PUSH DE
88A4 PUSH DE
88A5 PUSH DE
88A6 PUSH DE
88A7 PUSH DE
88A8 PUSH DE
88A9 PUSH DE
88AA PUSH DE
88AB PUSH DE
88AC EXX
88AD INC H Next screen line
88AE LD SP,HL
88AF INC SP
88B0 EXX
88B1 LD E,(HL) Get 2nd word from table $88E5
88B2 INC HL
88B3 LD D,(HL)
88B4 INC HL
88B5 PUSH DE Sixteen pushes fill the attribute row
88B6 PUSH DE
88B7 PUSH DE
88B8 PUSH DE
88B9 PUSH DE
88BA PUSH DE
88BB PUSH DE
88BC PUSH DE
88BD PUSH DE
88BE PUSH DE
88BF PUSH DE
88C0 PUSH DE
88C1 PUSH DE
88C2 PUSH DE
88C3 PUSH DE
88C4 PUSH DE
88C5 EXX Step down a pixel line
88C6 INC H
88C7 LD A,H Check screen third boundary
88C8 AND $07
88CA JR NZ,$88DD
88CC LD A,L Advance to the next screen row
88CD ADD A,$20
88CF LD L,A
88D0 JR C,$88D6
88D2 LD A,H Wrap back a third
88D3 SUB $08
88D5 LD H,A
88D6 LD A,H Reached the bottom third? stop
88D7 AND $18
88D9 CP $18
88DB JR Z,$88DF
88DD DJNZ $8895 Loop the rows
88DF LD SP,($FD82) Restore SP
88E3 OR A
88E4 RET
88E5: Two-tone structure graphic, drawn by 87F1
88E5 DEFB $00,$00,$00,$00
88E9 DEFB $3F,$FE,$55,$55
88ED DEFB $6A,$AB,$D5,$55
88F1 DEFB $FF,$FF,$7F,$FF
88F5 DEFB $FF,$FF,$7F,$FF
88F9 DEFB $7F,$FF,$BF,$FE
88FD: Draw a barracks
Draws a barracks, picking between two sprites by column and rejecting the row once it scrolls off.
88FD LD A,D
88FE CP $80
8900 CCF
8901 RET C
8902 LD B,$21
8904 LD C,$31
8906 LD A,E
8907 OR A
8908 LD HL,($C020)
890B JP Z,$8BE7 => Sprite draw dispatch
890E LD HL,($C022)
8911 JP $8BE7 => Sprite draw dispatch
8914: Draw a tunnel
Draws a tunnel and then marks the ground it covers on the collision map, so nothing can walk through it.
8914 LD A,D Reject if the row is off-screen
8915 CP $78
8917 CCF
8918 RET C
8919 LD B,$19 Sprite height = 25 rows
891B LD C,$30
891D LD HL,($C006) Load the sprite address ($C006)
8920 PUSH DE
8921 CALL $8CC9 Clip sprite, then AND/OR-mask blit rows via SP into screen
8924 POP DE
8925 LD A,D Skip the map fill if too low
8926 CP $60
8928 RET NC
8929 LD E,$1F Compute $1600 map row base
892B LD H,$16
892D LD A,D
892E ADD A,A
892F ADD A,A
8930 RL H
8932 ADD A,A
8933 RL H
8935 AND $E0 Combine row/column into map address
8937 OR E
8938 LD L,A
8939 LD D,$30
893B LD E,D
893C LD ($FD82),SP
8940 LD SP,HL
8941 INC SP Switch SP to HL for map fill
8942 PUSH DE Sixteen pushes fill the first 32 map bytes
8943 PUSH DE
8944 PUSH DE
8945 PUSH DE
8946 PUSH DE
8947 PUSH DE
8948 PUSH DE
8949 PUSH DE
894A PUSH DE
894B PUSH DE
894C PUSH DE
894D PUSH DE
894E PUSH DE
894F PUSH DE
8950 PUSH DE
8951 PUSH DE
8952 LD A,H Check width: 15 or 30 columns
8953 CP $5A
8955 JR C,$8967
8957 PUSH DE Sixteen more pushes for the wide variant
8958 PUSH DE
8959 PUSH DE
895A PUSH DE
895B PUSH DE
895C PUSH DE
895D PUSH DE
895E PUSH DE
895F PUSH DE
8960 PUSH DE
8961 PUSH DE
8962 PUSH DE
8963 PUSH DE
8964 PUSH DE
8965 PUSH DE
8966 PUSH DE
8967 LD SP,($FD82)
896B OR A
896C RET
896D: Get attributes address for the screen line
Used by the routines at 872F and 87F1.
Input
D Screen line number, divided by 2
Output
HL Address in the screen attribute area for the given line
Works out where a screen line's colour cells live in the attribute area.
896D LD A,D
896E ADD A,A
896F LD H,$FE $FE00 - table of even screen lines addresses
8971 LD L,A
8972 LD A,E
8973 ADD A,(HL) Add the table byte
8974 INC L
8975 LD H,(HL) Take the high byte, restore the low
8976 LD L,A
8977 LD A,H
8978 RRCA Rotate H right on 3 bits
8979 RRCA
897A RRCA
897B OR $58
897D LD H,A Now HL = address in the screen attribute area for the given line
897E RET
897F: Draw a log crossing
Draws a log crossing while its row is on screen.
897F LD A,D
8980 CP $87
8982 CCF
8983 RET C
8984 LD B,$28
8986 LD C,$32
8988 LD HL,($C012)
898B PUSH DE
898C CALL $8A14 Sprite draw dispatch variant, C=4
898F POP DE
8990 LD A,E
8991 ADD A,$07
8993 LD E,A
8994 LD B,$28
8996 LD C,$32
8998 LD HL,($C012)
899B JP $8A14 => Sprite draw dispatch variant, C=4
899E: Compute screen draw address for sprite, save state to buffer
Used by the routines at 818F, 834B, 83B8, 854A, 8618, 8A14, 8A7B, 8AC3, 8B4B, 8BE7 and 8CC9.
Input
A Column (X)
D Row (Y)
C Attribute (colour) byte
Works out where a sprite lands on screen and colours the ground beneath it, walking down its rows and repainting the attribute cells as it crosses them.
899E PUSH AF
899F PUSH DE
89A0 PUSH HL
89A1 PUSH BC
89A2 LD H,B Pack the column into HL
89A3 LD L,A
89A4 EX AF,AF'
89A5 LD A,D
89A6 PUSH HL
89A7 EXX
89A8 POP BC
89A9 AND $06 Screen third from the row
89AB RRCA
89AC LD H,A
89AD EXX
89AE EX AF,AF'
89AF NEG Column offset within the third
89B1 ADD A,$20
89B3 LD L,A
89B4 LD H,$00
89B6 LD A,D
89B7 RRCA Fold the row into the $58xx attribute page
89B8 RRCA
89B9 RRCA
89BA AND $03
89BC OR $58
89BE LD D,A
89BF EX DE,HL
89C0 EXX
89C1 LD A,H At a third boundary, paint the attributes
89C2 INC A
89C3 AND $03
89C5 JR Z,$89CC
89C7 CALL $89F3 Set attribute color for B cells at HL
89CA JR $89E2
89CC LD A,R Draw-mode flag (R bit 7) picks the wrap direction
89CE JP M,$89DB
89D1 EXX
89D2 PUSH DE
89D3 LD DE,$0020 Step down one screen row
89D6 ADD HL,DE
89D7 POP DE
89D8 EXX
89D9 JR $89E2
89DB BIT 7,C Otherwise cross into the next third
89DD JR NZ,$89D1
89DF CALL $8A03 Set attribute INK=1 for B cells at HL
89E2 DEC B
89E3 JR Z,$89EE
89E5 INC H Advance a row, repaint attributes at a boundary
89E6 LD A,H
89E7 AND $03
89E9 CALL Z,$89F3 Set attribute color for B cells at HL
89EC DJNZ $89E5
89EE POP BC
89EF POP HL
89F0 POP DE
89F1 POP AF
89F2 RET
89F3: Set attribute color for B cells at HL
Used by the routine at 899E.
Input
HL Attribute address
B Cell count
C Ink colour, bit 7 flags on/off state
DE Row step
Recolours a run of attribute cells, keeping the paper colour and taking the ink from the caller, then steps to the next row.
89F3 LD A,C
89F4 EXX
89F5 LD B,A
89F6 RES 7,C
89F8 LD A,(HL) Keep PAPER bits, set INK from C
89F9 AND $38
89FB OR C
89FC LD (HL),A
89FD INC HL Next cell, loop
89FE DJNZ $89F8
8A00 ADD HL,DE Step to the next row
8A01 EXX
8A02 RET
8A03: Set attribute INK=1 for B cells at HL (variant of $89F3)
Used by the routine at 899E.
Input
HL Attribute address
B Cell count
C Bit 7 flags on/off state
DE Row step
Recolours a run of attribute cells, keeping the paper colour but forcing the ink to 1, then steps to the next row.
8A03 LD A,C
8A04 EXX
8A05 LD B,A
8A06 RES 7,C
8A08 LD A,(HL)
8A09 AND $38 Keep PAPER bits, force INK to 1
8A0B OR $01
8A0D LD (HL),A
8A0E INC HL Next cell, loop
8A0F DJNZ $8A08
8A11 ADD HL,DE
8A12 EXX
8A13 RET
8A14: Sprite draw dispatch variant, C=4
Used by the routines at 8301, 897F, 9014 and 90A1.
Input
C Attribute/colour byte
D Row
E Column
HL Sprite address
Output
C Attribute/colour byte, or set with carry if off-screen
Draws a 4-row masked sprite: clips it, computes the screen address, then blits each row either through its mask or straight in, picked at random.
8A14 LD A,C
8A15 EX AF,AF'
8A16 LD C,$04 Set the height to 4 rows
8A18 PUSH HL
8A19 CALL $867C Clip sprite rectangle against screen edge
8A1C JR NC,$8A23
8A1E POP HL Restore the caller stack
8A1F EX AF,AF'
8A20 LD C,A Save the attribute, flag off-screen
8A21 SCF
8A22 RET
8A23 EX (SP),HL
8A24 ADD HL,DE
8A25 POP DE
8A26 EX AF,AF'
8A27 LD C,A
8A28 LD A,$01 On-screen: set draw flag
8A2A CALL $899E Compute screen draw address for sprite, save state to buffer
8A2D LD ($FD82),SP
8A31 LD SP,HL
8A32 EX DE,HL
8A33 LD A,R Draw-mode flag (R bit 7) picks the blit entry point
8A35 JP P,$8A5B
8A38 POP DE Pop the mask/sprite pair
8A39 LD A,(HL)
8A3A AND D AND the mask, OR the sprite
8A3B OR E
8A3C LD (HL),A
8A3D INC H
8A3E POP DE
8A3F LD A,(HL)
8A40 AND D
8A41 OR E
8A42 LD (HL),A
8A43 INC H
8A44 LD A,H Cross into the next screen third
8A45 AND $07
8A47 JR NZ,$8A53
8A49 LD A,L
8A4A ADD A,$20
8A4C LD L,A
8A4D JR C,$8A53
8A4F LD A,H
8A50 SUB $08
8A52 LD H,A
8A53 DJNZ $8A38 Loop the remaining rows
8A55 OR A
8A56 LD SP,($FD82)
8A5A RET
8A5B DEC SP
8A5C POP AF #0 opaque: OR the sprite straight in
8A5D OR (HL)
8A5E LD (HL),A
8A5F INC H
8A60 POP AF #1 next pixel line
8A61 OR (HL)
8A62 LD (HL),A
8A63 INC H
8A64 LD A,H Check screen third boundary
8A65 AND $07
8A67 JR NZ,$8A73
8A69 LD A,L Advance to the next screen row
8A6A ADD A,$20
8A6C LD L,A
8A6D JR C,$8A73
8A6F LD A,H
8A70 SUB $08
8A72 LD H,A
8A73 DJNZ $8A5C Loop the rows
8A75 OR A
8A76 LD SP,($FD82) Restore SP
8A7A RET
8A7B: Sprite draw dispatch: clip and compute screen address, C=$08
Used by the routines at 8169, 8E74, 8E83, 8EB5, 8F17, 8F35 and 9005.
Draws an eight-pixel-wide sprite, clipping it first. Colouring the ground beneath is skipped when the colour byte's top bit is set.
8A7B LD A,C Save color, set width C=$08
8A7C EX AF,AF'
8A7D LD C,$08
8A7F PUSH HL
8A80 CALL $867C Clip sprite rectangle against screen edge
8A83 EX (SP),HL
8A84 ADD HL,DE
8A85 POP DE
8A86 EX AF,AF' Restore color, double for table index
8A87 LD C,A
8A88 ADD A,A
8A89 LD A,$02
8A8B CALL NC,$899E Compute screen draw address for sprite, save state to buffer
8A8E LD ($FD82),SP
8A92 LD SP,HL
8A93 EX DE,HL
8A94 POP DE #0 column 0, upper line
8A95 LD A,(HL)
8A96 AND D
8A97 OR E
8A98 LD (HL),A
8A99 INC L
8A9A POP DE #1 column 0, lower line
8A9B LD A,(HL)
8A9C AND D
8A9D OR E
8A9E LD (HL),A
8A9F INC H
8AA0 POP DE #2 column 1, lower line
8AA1 LD A,(HL)
8AA2 AND D
8AA3 OR E
8AA4 LD (HL),A
8AA5 DEC L
8AA6 POP DE #3 column 1, upper line
8AA7 LD A,(HL)
8AA8 AND D
8AA9 OR E
8AAA LD (HL),A
8AAB INC H
8AAC LD A,H Cross into the next screen third
8AAD AND $07
8AAF JR NZ,$8ABB
8AB1 LD A,L Advance to the next screen row
8AB2 ADD A,$20
8AB4 LD L,A
8AB5 JR C,$8ABB
8AB7 LD A,H
8AB8 SUB $08
8ABA LD H,A
8ABB DJNZ $8A94 Loop the rows
8ABD OR A
8ABE LD SP,($FD82)
8AC2 RET
8AC3: Sprite draw dispatch: clip and compute screen address, C=$0C
Used by the routines at 8ECC, 8EE3, 8F26, 9014 and 903E.
Input
HL Sprite data pointer (interleaved data/mask pairs)
DE Position (D row, E column)
B Number of pixel-line pairs
C Attribute colour
Draws a sprite twelve pixels wide, clipping it and colouring the ground beneath it before the blit. A global mode flag picks between a masked pass and a faster opaque one that skips the mask bytes in the same sprite data.
8AC3 LD A,C Save colour, set width to $0C
8AC4 EX AF,AF'
8AC5 LD C,$0C
8AC7 PUSH HL
8AC8 CALL $867C Clip sprite rectangle against screen edge
8ACB EX (SP),HL
8ACC ADD HL,DE Skip the clipped rows of sprite data
8ACD POP DE
8ACE EX AF,AF'
8ACF LD C,A
8AD0 LD A,$03 Set drop type A=3 for draw address calc
8AD2 CALL $899E Compute screen draw address for sprite, save state to buffer
8AD5 LD ($FD82),SP Save SP, repurpose as sprite-data pointer
8AD9 LD SP,HL
8ADA EX DE,HL
8ADB LD A,R Draw-mode flag (R bit 7) picks masked or opaque
8ADD JP P,$8B1B
8AE0 POP DE #0 column 0, upper line
8AE1 LD A,(HL)
8AE2 AND D
8AE3 OR E
8AE4 LD (HL),A
8AE5 INC L
8AE6 POP DE #1 column 1, upper line
8AE7 LD A,(HL)
8AE8 AND D
8AE9 OR E
8AEA LD (HL),A
8AEB INC L
8AEC POP DE #2 column 2, upper line
8AED LD A,(HL)
8AEE AND D
8AEF OR E
8AF0 LD (HL),A
8AF1 INC H
8AF2 POP DE #3 column 2, lower line
8AF3 LD A,(HL)
8AF4 AND D
8AF5 OR E
8AF6 LD (HL),A
8AF7 DEC L
8AF8 POP DE #4 column 1, lower line
8AF9 LD A,(HL)
8AFA AND D
8AFB OR E
8AFC LD (HL),A
8AFD DEC L
8AFE POP DE #5 column 0, lower line
8AFF LD A,(HL)
8B00 AND D
8B01 OR E
8B02 LD (HL),A
8B03 INC H
8B04 LD A,H Cross into the next screen third
8B05 AND $07
8B07 JR NZ,$8B13
8B09 LD A,L Advance to the next screen row
8B0A ADD A,$20
8B0C LD L,A
8B0D JR C,$8B13
8B0F LD A,H
8B10 SUB $08
8B12 LD H,A
8B13 DJNZ $8AE0 Loop the pixel-line pairs
8B15 OR A
8B16 LD SP,($FD82) Restore SP
8B1A RET
8B1B DEC SP Opaque path: DEC SP misaligns POP AF to read data bytes only
8B1C POP AF #0 column 0, upper line
8B1D OR (HL)
8B1E LD (HL),A
8B1F INC L
8B20 POP AF #1 column 1, upper line
8B21 OR (HL)
8B22 LD (HL),A
8B23 INC L
8B24 POP AF #2 column 2, upper line
8B25 OR (HL)
8B26 LD (HL),A
8B27 INC H
8B28 POP AF #3 column 2, lower line
8B29 OR (HL)
8B2A LD (HL),A
8B2B DEC L
8B2C POP AF #4 column 1, lower line
8B2D OR (HL)
8B2E LD (HL),A
8B2F DEC L
8B30 POP AF #5 column 0, lower line
8B31 OR (HL)
8B32 LD (HL),A
8B33 INC H
8B34 LD A,H Cross into the next screen third
8B35 AND $07
8B37 JR NZ,$8B43
8B39 LD A,L
8B3A ADD A,$20
8B3C LD L,A
8B3D JR C,$8B43
8B3F LD A,H
8B40 SUB $08
8B42 LD H,A
8B43 DJNZ $8B1C Loop the pixel-line pairs
8B45 OR A
8B46 LD SP,($FD82) Restore SP
8B4A RET
8B4B: Sprite draw dispatch: clip and compute screen address, C=$10
Used by the routine at 8178.
Widest member of the sprite-dispatch family: clips the rectangle, computes the screen address and blits with SP walking the sprite data. Like its narrower siblings it takes each popped word as an AND mask plus an OR value.
8B4B LD A,C Save colour, set width to $10
8B4C EX AF,AF'
8B4D LD C,$10
8B4F PUSH HL
8B50 CALL $867C Clip sprite rectangle against screen edge
8B53 EX (SP),HL
8B54 ADD HL,DE Skip the clipped rows of sprite data
8B55 POP DE
8B56 EX AF,AF'
8B57 LD C,A
8B58 LD A,$04 Set drop type A=4 for draw address calc
8B5A CALL $899E Compute screen draw address for sprite, save state to buffer
8B5D LD ($FD82),SP Save SP, repurpose as sprite-data pointer
8B61 LD SP,HL
8B62 EX DE,HL
8B63 LD A,R Draw-mode flag (R bit 7) picks masked or opaque
8B65 JP P,$8BAF
8B68 POP DE #0 column 0, upper line
8B69 LD A,(HL)
8B6A AND D
8B6B OR E
8B6C LD (HL),A
8B6D INC L
8B6E POP DE #1 column 1, upper line
8B6F LD A,(HL)
8B70 AND D
8B71 OR E
8B72 LD (HL),A
8B73 INC L
8B74 POP DE #2 column 2, upper line
8B75 LD A,(HL)
8B76 AND D
8B77 OR E
8B78 LD (HL),A
8B79 INC L
8B7A POP DE #3 column 3, upper line
8B7B LD A,(HL)
8B7C AND D
8B7D OR E
8B7E LD (HL),A
8B7F INC H
8B80 POP DE #4 column 3, lower line
8B81 LD A,(HL)
8B82 AND D
8B83 OR E
8B84 LD (HL),A
8B85 DEC L
8B86 POP DE #5 column 2, lower line
8B87 LD A,(HL)
8B88 AND D
8B89 OR E
8B8A LD (HL),A
8B8B DEC L
8B8C POP DE #6 column 1, lower line
8B8D LD A,(HL)
8B8E AND D
8B8F OR E
8B90 LD (HL),A
8B91 DEC L
8B92 POP DE #7 column 0, lower line
8B93 LD A,(HL)
8B94 AND D
8B95 OR E
8B96 LD (HL),A
8B97 INC H
8B98 LD A,H Check screen third boundary
8B99 AND $07
8B9B JR NZ,$8BA7
8B9D LD A,L Advance to the next screen row
8B9E ADD A,$20
8BA0 LD L,A
8BA1 JR C,$8BA7
8BA3 LD A,H
8BA4 SUB $08
8BA6 LD H,A
8BA7 DJNZ $8B68 Loop the pixel-line pairs
8BA9 OR A
8BAA LD SP,($FD82) Restore SP
8BAE RET
8BAF DEC SP Opaque path: DEC SP misaligns POP AF to read data bytes only
8BB0 POP AF #0 column 0, upper line
8BB1 OR (HL)
8BB2 LD (HL),A
8BB3 INC L
8BB4 POP AF #1 column 1, upper line
8BB5 OR (HL)
8BB6 LD (HL),A
8BB7 INC L
8BB8 POP AF #2 column 2, upper line
8BB9 OR (HL)
8BBA LD (HL),A
8BBB INC L
8BBC POP AF #3 column 3, upper line
8BBD OR (HL)
8BBE LD (HL),A
8BBF INC H
8BC0 POP AF #4 column 3, lower line
8BC1 OR (HL)
8BC2 LD (HL),A
8BC3 DEC L
8BC4 POP AF #5 column 2, lower line
8BC5 OR (HL)
8BC6 LD (HL),A
8BC7 DEC L
8BC8 POP AF
8BC9 OR (HL)
8BCA LD (HL),A
8BCB DEC L
8BCC POP AF
8BCD OR (HL)
8BCE LD (HL),A
8BCF INC H
8BD0 LD A,H
8BD1 AND $07
8BD3 JR NZ,$8BDF
8BD5 LD A,L
8BD6 ADD A,$20
8BD8 LD L,A
8BD9 JR C,$8BDF
8BDB LD A,H
8BDC SUB $08
8BDE LD H,A
8BDF DJNZ $8BB0
8BE1 OR A
8BE2 LD SP,($FD82)
8BE6 RET
8BE7: Sprite draw dispatch: clip and compute screen address, C=$14
Used by the routine at 88FD.
Another member of the sprite-dispatch family, this one for the widest sprites. It clips the rectangle, computes the screen address and blits with SP walking the interleaved mask and data stream.
8BE7 LD A,C Save colour, set width to $14
8BE8 EX AF,AF'
8BE9 LD C,$14
8BEB PUSH HL
8BEC CALL $867C Clip sprite rectangle against screen edge
8BEF EX (SP),HL
8BF0 ADD HL,DE Skip the clipped rows of sprite data
8BF1 POP DE
8BF2 EX AF,AF'
8BF3 LD C,A
8BF4 LD A,$05 Set drop type A=5 for draw address calc
8BF6 CALL $899E Compute screen draw address for sprite, save state to buffer
8BF9 LD ($FD82),SP Save SP, repurpose as sprite-data pointer
8BFD LD SP,HL
8BFE EX DE,HL
8BFF POP DE #0 column 0, upper line
8C00 LD A,(HL)
8C01 AND D
8C02 OR E
8C03 LD (HL),A
8C04 INC L
8C05 POP DE #1 column 1, upper line
8C06 LD A,(HL)
8C07 AND D
8C08 OR E
8C09 LD (HL),A
8C0A INC L
8C0B POP DE #2 column 2, upper line
8C0C LD A,(HL)
8C0D AND D
8C0E OR E
8C0F LD (HL),A
8C10 INC L
8C11 POP DE #3 column 3, upper line
8C12 LD A,(HL)
8C13 AND D
8C14 OR E
8C15 LD (HL),A
8C16 INC L
8C17 POP DE #4 column 4, upper line
8C18 LD A,(HL)
8C19 AND D
8C1A OR E
8C1B LD (HL),A
8C1C INC H
8C1D POP DE #5 column 4, lower line
8C1E LD A,(HL)
8C1F AND D
8C20 OR E
8C21 LD (HL),A
8C22 DEC L
8C23 POP DE #6 column 3, lower line
8C24 LD A,(HL)
8C25 AND D
8C26 OR E
8C27 LD (HL),A
8C28 DEC L
8C29 POP DE #7 column 2, lower line
8C2A LD A,(HL)
8C2B AND D
8C2C OR E
8C2D LD (HL),A
8C2E DEC L
8C2F POP DE #8 column 1, lower line
8C30 LD A,(HL)
8C31 AND D
8C32 OR E
8C33 LD (HL),A
8C34 DEC L
8C35 POP DE #9 column 0, lower line
8C36 LD A,(HL)
8C37 AND D
8C38 OR E
8C39 LD (HL),A
8C3A INC H
8C3B LD A,H Check screen third boundary
8C3C AND $07
8C3E JR NZ,$8C4A
8C40 LD A,L Advance to the next screen row
8C41 ADD A,$20
8C43 LD L,A
8C44 JR C,$8C4A
8C46 LD A,H
8C47 SUB $08
8C49 LD H,A
8C4A DJNZ $8BFF
8C4C OR A
8C4D LD SP,($FD82)
8C51 RET
This entry point is used by the routine at 86F5.
8C52 LD A,C
8C53 EX AF,AF'
8C54 LD C,$18
8C56 PUSH HL
8C57 CALL $867C Clip sprite rectangle against screen edge
8C5A EX (SP),HL
8C5B ADD HL,DE
8C5C POP DE
8C5D EX AF,AF'
8C5E LD C,A
8C5F LD A,$06
8C61 CALL $899E Compute screen draw address for sprite, save state to buffer
8C64 LD ($FD82),SP Save SP, repurpose as sprite-data pointer
8C68 LD SP,HL
8C69 EX DE,HL
8C6A POP DE #0 column 0, upper line
8C6B LD A,(HL)
8C6C AND D
8C6D OR E
8C6E LD (HL),A
8C6F INC L
8C70 POP DE #1 column 1, upper line
8C71 LD A,(HL)
8C72 AND D
8C73 OR E
8C74 LD (HL),A
8C75 INC L
8C76 POP DE #2 column 2, upper line
8C77 LD A,(HL)
8C78 AND D
8C79 OR E
8C7A LD (HL),A
8C7B INC L
8C7C POP DE #3 column 3, upper line
8C7D LD A,(HL)
8C7E AND D
8C7F OR E
8C80 LD (HL),A
8C81 INC L
8C82 POP DE #4 column 4, upper line
8C83 LD A,(HL)
8C84 AND D
8C85 OR E
8C86 LD (HL),A
8C87 INC L
8C88 POP DE
8C89 LD A,(HL)
8C8A AND D
8C8B OR E
8C8C LD (HL),A
8C8D INC H
8C8E POP DE #5 column 4, lower line
8C8F LD A,(HL)
8C90 AND D
8C91 OR E
8C92 LD (HL),A
8C93 DEC L
8C94 POP DE #6 column 3, lower line
8C95 LD A,(HL)
8C96 AND D
8C97 OR E
8C98 LD (HL),A
8C99 DEC L
8C9A POP DE #7 column 2, lower line
8C9B LD A,(HL)
8C9C AND D
8C9D OR E
8C9E LD (HL),A
8C9F DEC L
8CA0 POP DE #8 column 1, lower line
8CA1 LD A,(HL)
8CA2 AND D
8CA3 OR E
8CA4 LD (HL),A
8CA5 DEC L
8CA6 POP DE #9 column 0, lower line
8CA7 LD A,(HL)
8CA8 AND D
8CA9 OR E
8CAA LD (HL),A
8CAB DEC L
8CAC POP DE
8CAD LD A,(HL)
8CAE AND D
8CAF OR E
8CB0 LD (HL),A
8CB1 INC H
8CB2 LD A,H
8CB3 AND $07
8CB5 JR NZ,$8CC1
8CB7 LD A,L
8CB8 ADD A,$20
8CBA LD L,A
8CBB JR C,$8CC1
8CBD LD A,H
8CBE SUB $08
8CC0 LD H,A
8CC1 DJNZ $8C6A
8CC3 OR A
8CC4 LD SP,($FD82)
8CC8 RET
8CC9: Clip sprite, then AND/OR-mask blit rows via SP into screen
Used by the routine at 8914.
Input
B Sprite height
C Attribute/colour byte
D Row
E Column
HL Sprite address
Draws a full-width band across the screen, clipping it first and then laying each row down through the stack, masking the background out and the graphic in as it goes.
8CC9 LD A,C Save color, set width C=$20
8CCA EX AF,AF'
8CCB LD C,$20
8CCD PUSH HL
8CCE CALL $867C Clip sprite rectangle against screen edge
8CD1 EX (SP),HL Swap position for return address
8CD2 ADD HL,DE
8CD3 POP DE
8CD4 EX AF,AF'
8CD5 LD C,A
8CD6 LD A,$08 Set drop type A=8 for draw address calc
8CD8 CALL $899E Compute screen draw address for sprite, save state to buffer
8CDB LD ($FD82),SP
8CDF LD SP,HL
8CE0 EX DE,HL
8CE1 POP DE Draw byte 1 (top row, left to right)
8CE2 LD A,(HL)
8CE3 AND D
8CE4 OR E
8CE5 LD (HL),A
8CE6 INC L
8CE7 POP DE Draw byte 2
8CE8 LD A,(HL)
8CE9 AND D
8CEA OR E
8CEB LD (HL),A
8CEC INC L
8CED POP DE Draw byte 3
8CEE LD A,(HL)
8CEF AND D
8CF0 OR E
8CF1 LD (HL),A
8CF2 INC L
8CF3 POP DE Draw byte 4
8CF4 LD A,(HL)
8CF5 AND D
8CF6 OR E
8CF7 LD (HL),A
8CF8 INC L
8CF9 POP DE Draw byte 5
8CFA LD A,(HL)
8CFB AND D
8CFC OR E
8CFD LD (HL),A
8CFE INC L
8CFF POP DE Draw byte 6
8D00 LD A,(HL)
8D01 AND D
8D02 OR E
8D03 LD (HL),A
8D04 INC L
8D05 POP DE Draw byte 7
8D06 LD A,(HL)
8D07 AND D
8D08 OR E
8D09 LD (HL),A
8D0A INC L
8D0B POP DE Draw byte 8
8D0C LD A,(HL)
8D0D AND D
8D0E OR E
8D0F LD (HL),A
8D10 INC H
8D11 POP DE Draw byte 9 (next row, right to left)
8D12 LD A,(HL)
8D13 AND D
8D14 OR E
8D15 LD (HL),A
8D16 DEC L
8D17 POP DE Draw byte 10
8D18 LD A,(HL)
8D19 AND D
8D1A OR E
8D1B LD (HL),A
8D1C DEC L
8D1D POP DE Draw byte 11
8D1E LD A,(HL)
8D1F AND D
8D20 OR E
8D21 LD (HL),A
8D22 DEC L
8D23 POP DE Draw byte 12
8D24 LD A,(HL)
8D25 AND D
8D26 OR E
8D27 LD (HL),A
8D28 DEC L
8D29 POP DE Draw byte 13
8D2A LD A,(HL)
8D2B AND D
8D2C OR E
8D2D LD (HL),A
8D2E DEC L
8D2F POP DE Draw byte 14
8D30 LD A,(HL)
8D31 AND D
8D32 OR E
8D33 LD (HL),A
8D34 DEC L
8D35 POP DE Draw byte 15
8D36 LD A,(HL)
8D37 AND D
8D38 OR E
8D39 LD (HL),A
8D3A DEC L
8D3B POP DE Draw byte 16
8D3C LD A,(HL)
8D3D AND D
8D3E OR E
8D3F LD (HL),A
8D40 INC H
8D41 LD A,H Every 8 rows, step down to the next screen third
8D42 AND $07
8D44 JR NZ,$8D50
8D46 LD A,L
8D47 ADD A,$20
8D49 LD L,A
8D4A JR C,$8D50
8D4C LD A,H
8D4D SUB $08
8D4F LD H,A
8D50 DJNZ $8CE1 Loop back for the next column pair
8D52 OR A
8D53 LD SP,($FD82)
8D57 RET
8D58: Draw water strip 1
Draws water strip 1, sharing its body with strip 2 at $8D5D and differing only in the attribute used. It works out the screen line from the row, then lays down three segments across it plus one at a fixed column.
8D58 LD A,$0D First entry: attribute $0D
8D5A EX AF,AF'
8D5B JR $8D60
8D5D: Draw water strip 2
Draws water strip 2, the second entry of the pair at $8D58, setting its own attribute before joining the shared body.
8D5D LD A,$31 Second entry: attribute $31
8D5F EX AF,AF'
This entry point is used by the routine at 8D58.
8D60 LD A,D Row into A, compare to $60
8D61 CP $60
8D63 CCF Flip the carry and return once scrolled past it
8D64 RET C
8D65 LD A,D Row * 2 indexes the $FE00 even-line table
8D66 ADD A,A
8D67 LD L,A
8D68 LD H,$FE
8D6A LD A,$07 Seven columns in, add the table byte
8D6C ADD A,(HL)
8D6D INC L Take the high byte, restore the low
8D6E LD H,(HL)
8D6F LD L,A
8D70 LD A,D Row bits flipped and stepped back one
8D71 XOR $03
8D73 DEC A
8D74 AND $03 Masked to the sub-row 0-3
8D76 LD C,A
8D77 CALL $8D9E Draw one segment of the structure and colour the row beneath it
8D7A CALL $8D8D Draw the structure's extra segment when the sub-row index calls for it
8D7D LD A,L Step along by the column spacing
8D7E ADD A,E
8D7F LD L,A
8D80 CALL $8D9E Draw one segment of the structure and colour the row beneath it
8D83 CALL $8D8D Draw the structure's extra segment when the sub-row index calls for it
8D86 LD A,L Jump to the fixed column $18
8D87 OR $18
8D89 LD L,A
8D8A CALL $8D9E Draw one segment of the structure and colour the row beneath it
8D8D: Draw the structure's extra segment when the sub-row index calls for it
Used by the routine at 8D5D.
Input
C Sub-row index
D Row
Draws the structure's extra segment, but only when the sub-row index calls for one and the row is not the bottom of the band.
8D8D INC C Nothing more to draw? return
8D8E DEC C
8D8F RET Z
8D90 LD A,D The bottom row is left alone
8D91 CP $5F
8D93 RET Z
8D94 LD A,C All-ones pattern, swap in
8D95 EXX
8D96 LD DE,$FFFF Both fill words set to $FFFF
8D99 LD B,E
8D9A LD C,E
8D9B JP $8E35 => Fill a block of screen rows with the DE and BC patterns through the stack
8D9E: Draw one segment of the structure and colour the row beneath it
Used by the routine at 8D5D.
Input
HL Screen address
Draws one segment of the structure: fills its rows with a clear pattern through 8E35, steps down a pixel line, then colours the cells beneath it and fills the rows below with a second pattern pair.
8D9E PUSH HL Move the screen address into the alternate set
8D9F EXX
8DA0 POP HL
8DA1 LD DE,$0000 Fill pattern: clear
8DA4 LD B,E
8DA5 LD C,E
8DA6 LD A,$01 Fill one row
8DA8 CALL $8E35
8DAB LD A,D Stop at the bottom row
8DAC CP $5F
8DAE RET Z
8DAF EXX Check screen third boundary
8DB0 LD A,H
8DB1 AND $07
8DB3 JR NZ,$8DBF
8DB5 LD A,L Advance to the next screen row
8DB6 ADD A,$20
8DB8 LD L,A
8DB9 JR C,$8DBF
8DBB LD A,H
8DBC SUB $08
8DBE LD H,A
8DBF CALL $8E51 Fold the screen address into the attribute area and colour the cells
8DC2 LD DE,$8992 Second pattern pair for the lower half
8DC5 LD BC,$E5DD
8DC8 LD A,$01 Fill the rows below
8DCA JR $8E35
8DCC: Draw water
Draws water, snapping the row down to a four-row grid and drawing the piece from the screen line it lands on.
8DCC LD A,D
8DCD CP $60
8DCF CCF
8DD0 RET C
8DD1 LD A,D Snap the row down to the 4-row grid
8DD2 AND $FC
8DD4 ADD A,A
8DD5 LD L,A Look its screen line up in the $FE00 table
8DD6 LD H,$FE
8DD8 LD A,$07
8DDA ADD A,(HL)
8DDB INC L
8DDC LD H,(HL)
8DDD LD L,A
8DDE LD A,D Sub-row index from the low bits
8DDF INC A
8DE0 AND $03
8DE2 LD C,A
8DE3 CALL $8E1D Draw the upper half
8DE6 CALL $8DF9 Colour it
8DE9 LD A,E Step to the lower half
8DEA ADD A,L
8DEB LD L,A
8DEC CALL $8E1D Draw the lower half
8DEF CALL $8DF9
8DF2 LD A,L
8DF3 OR $18
8DF5 LD L,A
8DF6 CALL $8E1D
8DF9 LD A,D
8DFA CP $5F
8DFC RET Z
8DFD EXX
8DFE LD A,H
8DFF AND $07
8E01 JR NZ,$8E0D
8E03 LD A,L
8E04 ADD A,$20
8E06 LD L,A
8E07 JR C,$8E0D
8E09 LD A,H
8E0A SUB $08
8E0C LD H,A
8E0D LD A,$35
8E0F EX AF,AF'
8E10 CALL $8E51 Fold the screen address into the attribute area and colour the cells
8E13 LD DE,$DDE5
8E16 LD BC,$9289
8E19 LD A,$01
8E1B JR $8E35 => Fill a block of screen rows with the DE and BC patterns through the stack
8E1D PUSH HL
8E1E LD A,C
8E1F OR A
8E20 EXX
8E21 POP HL
8E22 LD DE,$FFFF
8E25 LD B,E
8E26 LD C,E
8E27 JR NZ,$8E35 => Fill a block of screen rows with the DE and BC patterns through the stack
8E29 EXX
8E2A LD A,$29
8E2C EX AF,AF'
8E2D CALL $8E51 Fold the screen address into the attribute area and colour the cells
8E30 EXX
8E31 INC DE
8E32 INC BC
8E33 LD A,$04
8E35: Fill a block of screen rows with the DE and BC patterns through the stack
Used by the routines at 8D8D, 8D9E and 8DCC.
Input
HL Screen address of the first row
DE Pattern for the even lines
BC Pattern for the odd lines
A Number of line pairs
Fills a run of screen rows with two alternating patterns, pushing DE onto one line and BC onto the next through SP, for A pairs of lines. The real SP is parked in $FD82 and restored on exit.
8E35 LD ($FD82),SP Save SP, repurpose it as the write pointer
8E39 INC HL Pushes write downwards, so start one byte past the row
8E3A LD SP,HL Point at the even line
8E3B PUSH DE #0-3 four pushes fill its eight bytes
8E3C PUSH DE
8E3D PUSH DE
8E3E PUSH DE
8E3F INC H Step down a pixel line
8E40 LD SP,HL Point at the odd line
8E41 PUSH BC #0-3 four pushes of the second pattern
8E42 PUSH BC
8E43 PUSH BC
8E44 PUSH BC
8E45 INC H Step down again
8E46 DEC A Loop for A pairs of lines
8E47 JR NZ,$8E3A
8E49 DEC HL Undo the pre-step
8E4A EXX
8E4B LD SP,($FD82) Restore SP
8E4F OR A
8E50 RET
8E51: Fold the screen address into the attribute area and colour the cells
Used by the routines at 8D9E and 8DCC.
Input
HL Screen address to colour beneath
Folds a screen address into the matching $58xx attribute page and colours the cells there, so a structure's ground takes its colour in one pass.
8E51 LD B,H
8E52 LD A,H
8E53 AND $F8
8E55 RRCA
8E56 RRCA
8E57 RRCA
8E58 AND $03
8E5A OR $58
8E5C LD H,A
8E5D EX AF,AF'
8E5E LD (HL),A #0 rightmost cell
8E5F DEC L
8E60 LD (HL),A #1
8E61 DEC L
8E62 LD (HL),A #2
8E63 DEC L
8E64 LD (HL),A #3
8E65 DEC L
8E66 LD (HL),A #4
8E67 DEC L
8E68 LD (HL),A #5
8E69 DEC L
8E6A LD (HL),A #6
8E6B DEC L
8E6C LD (HL),A #7 leftmost cell
8E6D EX AF,AF'
8E6E LD A,L
8E6F ADD A,$07
8E71 LD L,A
8E72 LD H,B
8E73 RET
8E74: Draw a left mortar
Draws a left-hand mortar while its row is on screen.
8E74 LD A,D
8E75 CP $67
8E77 CCF
8E78 RET C
8E79 LD B,$08
8E7B LD C,$30
8E7D LD HL,($C00E)
8E80 JP $8A7B => Sprite draw dispatch
8E83: Draw a right mortar
Draws a right-hand mortar while its row is on screen.
8E83 LD A,D
8E84 CP $67
8E86 CCF
8E87 RET C
8E88 LD B,$08
8E8A LD C,$30
8E8C LD HL,($C010)
8E8F JP $8A7B => Sprite draw dispatch
8E92: Shift-add multiply: 8 bits of H, adding DE per set bit
Used by the routines at 800C and 867C.
Input
H Multiplier (bits shifted out MSB first)
DE Value added for each set bit
E ??
Output
HL Product
Multiplies two bytes by shift and add, walking the eight bits of the multiplier and adding the other value in wherever a bit is set.
8E92 LD L,$00 Clear the running total
8E94 LD D,L
8E95 ADD HL,HL #7 top bit: double, add DE when it was set
8E96 JR NC,$8E99
8E98 ADD HL,DE
8E99 ADD HL,HL #6
8E9A JR NC,$8E9D
8E9C ADD HL,DE
8E9D ADD HL,HL #5
8E9E JR NC,$8EA1
8EA0 ADD HL,DE
8EA1 ADD HL,HL #4
8EA2 JR NC,$8EA5
8EA4 ADD HL,DE
8EA5 ADD HL,HL #3
8EA6 JR NC,$8EA9
8EA8 ADD HL,DE
8EA9 ADD HL,HL #2
8EAA JR NC,$8EAD
8EAC ADD HL,DE
8EAD ADD HL,HL #1
8EAE JR NC,$8EB1
8EB0 ADD HL,DE
8EB1 ADD HL,HL #0 bottom bit, then return
8EB2 RET NC
8EB3 ADD HL,DE
8EB4 RET
8EB5: A single grenade pickup
Input
D Row
E Column and flags (bit 7 = claimed)
A grenade box holding one grenade: drawn while it sits unclaimed, and once the player takes it the shared collect handler awards the grenade, scores and plays the pickup sound.
8EB5 LD A,D
8EB6 CP $67 Reject if row off bottom edge
8EB8 CCF
8EB9 RET C
8EBA LD A,$01
8EBC LD B,$08
8EBE LD C,$01
8EC0 BIT 7,E Claimed? jump to collect
8EC2 JR NZ,$8EFA
8EC4 LD C,$32
8EC6 LD HL,($C008) Load sprite $C008
8EC9 JP $8A7B => Sprite draw dispatch
8ECC: A triple grenade pickup
A grenade box holding three grenades: drawn while unclaimed, handing over to the shared collect handler once the player takes it.
8ECC LD A,D
8ECD CP $6A
8ECF CCF
8ED0 RET C
8ED1 LD A,$03
8ED3 LD B,$0B
8ED5 LD C,$02
8ED7 BIT 7,E
8ED9 JR NZ,$8EFA
8EDB LD C,$32
8EDD LD HL,($C00A)
8EE0 JP $8AC3 => Sprite draw dispatch
8EE3: A quintuple grenade pickup
A grenade box holding five grenades: drawn while unclaimed, and on pickup it awards them, scores 1000 and plays a sound.
8EE3 LD A,D Reject if row (D) off bottom edge
8EE4 CP $6A
8EE6 CCF
8EE7 RET C
8EE8 LD A,$05 Wider box, unclaimed variant
8EEA LD B,$0B
8EEC LD C,$02 Flag says which sprite to draw
8EEE BIT 7,E
8EF0 JR NZ,$8EFA
8EF2 LD C,$32
8EF4 LD HL,($C00C)
8EF7 JP $8AC3 => Sprite draw dispatch
This entry point is used by the routines at 8EB5 and 8ECC.
8EFA RES 7,E Claimed: clear flag bit
8EFC CALL $6430 We've got A more grenades
8EFF LD A,C
8F00 ADD A,A
8F01 ADD A,E
8F02 CP $21
8F04 JR C,$8F07
8F06 DEC E
8F07 CALL $854A Sprite draw dispatch
8F0A LD BC,$0104 +1000
8F0D CALL $6415 Update Score
8F10 LD A,$03
8F12 CALL $642D Trigger sound effect A (copy its parameter into slot A)
8F15 SCF
8F16 RET
8F17: Draw sandbags, left-hand side
Draws the left-hand end of a sandbag run while its row is on screen.
8F17 LD A,D
8F18 CP $68
8F1A CCF
8F1B RET C
8F1C LD B,$09
8F1E LD C,$31
8F20 LD HL,($C016)
8F23 JP $8A7B => Sprite draw dispatch
8F26: Draw sandbags, middle
Draws the middle of a sandbag run while its row is on screen.
8F26 LD A,D
8F27 CP $68
8F29 CCF
8F2A RET C
8F2B LD B,$09
8F2D LD C,$31
8F2F LD HL,($C018)
8F32 JP $8AC3 => Sprite draw dispatch
8F35: Draw sandbags, right-hand side
Draws the right-hand end of a sandbag run while its row is on screen.
8F35 LD A,D
8F36 CP $68
8F38 CCF
8F39 RET C
8F3A LD B,$09
8F3C LD HL,($C01A)
8F3F JP $8A7B => Sprite draw dispatch
8F42: Draw the road bottom edging
Draws the road bottom edging, sharing its body with the top edging at $8F49 and differing only in colour and height. Above the band it addresses the screen directly; below it, it snaps the row to a four-row grid.
8F42 EXX First entry: colour $30, height $07
8F43 LD C,$07
8F45 LD A,$30
8F47 JR $8F4E
8F49: Draw the road top edging
Draws the road top edging, the second entry of the pair at $8F42, setting its own colour and height before joining the shared body.
8F49 EXX Second entry: colour $31, height $06
8F4A LD C,$31
8F4C LD A,$06
This entry point is used by the routine at 8F42.
8F4E EXX Keep the colour and height in the alternate set
8F4F EX AF,AF'
8F50 LD A,D Row into A, compare to $9F
8F51 CP $9F
8F53 CCF Flip the carry and return once scrolled past it
8F54 RET C
8F55 LD B,$40 Band height $40
8F57 INC A Row relative to the top of the band
8F58 SUB B
8F59 LD D,A
8F5A SUB $04 Below the band? take the plain path
8F5C JP P,$8F8D
8F5F NEG Above it: distance up from the band
8F61 LD C,A
8F62 LD A,$3F Rows still visible from there
8F64 SUB C
8F65 SRL A
8F67 SRL A
8F69 INC A Round up to a whole row
8F6A LD B,A
8F6B LD A,C Cell column, quartered by two right shifts
8F6C SRL A
8F6E SRL A
8F70 ADD A,E Add into the cursor
8F71 LD E,A
8F72 ADD A,$20 Screen address in the $40xx third
8F74 LD L,A
8F75 LD H,$40
8F77 LD A,C Sub-row 0-3, counted from the bottom
8F78 AND $03
8F7A XOR $03
8F7C LD D,A Count it up from 1
8F7D INC D
8F7E LD A,C Take the sub-row again, default fill $FF
8F7F AND $03
8F81 LD C,$FF
8F83 JR Z,$8FC3 Sub-row 0: straight to the fill
8F85 CP $02 Otherwise pick the partial-row variant
8F87 JR Z,$8FD3
8F89 JR C,$8FCA
8F8B JR $8FDC
8F8D LD B,$10 Plain path: full band height
8F8F LD A,D Row snapped to the 4-row grid
8F90 AND $FC
8F92 ADD A,A Doubled into an offset
8F93 LD L,A
8F94 LD H,$FE Look the screen line up in the $FE00 table
8F96 LD A,(HL)
8F97 INC L
8F98 LD H,(HL) Take the high byte
8F99 ADD A,E Offset by the column
8F9A LD L,A
8F9B LD C,$FF Default fill $FF
8F9D LD A,D Sub-row 0-3 picks how much of the row is drawn
8F9E AND $03
8FA0 JR Z,$8FC3
8FA2 CP $02
8FA4 JR C,$8FBF
8FA6 JR Z,$8FBB
8FA8 LD C,H Keep the screen page for later
8FA9 LD A,H Fold the high byte into the $58xx page
8FAA RRCA
8FAB RRCA
8FAC RRCA One more rotate, then OR in the page bits
8FAD OR $58
8FAF LD H,A
8FB0 EXX Take the colour from the alternate set
8FB1 LD A,C
8FB2 EXX
8FB3 LD (HL),A Colour the cell
8FB4 LD H,C Restore the screen page, clear the fill
8FB5 LD C,$00
8FB7 LD (HL),C #0-1 two rows of the column
8FB8 INC H
8FB9 LD (HL),C
8FBA INC H
8FBB LD (HL),C #2-3 two more
8FBC INC H
8FBD LD (HL),C
8FBE INC H
8FBF LD (HL),C #4-5 two more
8FC0 INC H
8FC1 LD (HL),C
8FC2 INC H
8FC3 LD (HL),C #6-7 last pair
8FC4 INC H
8FC5 LD (HL),C
8FC6 CALL $8FFC DOWN HL, off the bottom? done
8FC9 RET NC
8FCA LD (HL),$3F Sub-row 3: two-thirds fill
8FCC INC H
8FCD LD (HL),$3F The remaining third
8FCF CALL $8FFC DOWN HL, off the bottom? done
8FD2 RET NC
8FD3 LD (HL),$0F Sub-row 2: one-third fill
8FD5 INC H
8FD6 LD (HL),$0F The remaining two-thirds
8FD8 CALL $8FFC DOWN HL, off the bottom? done
8FDB RET NC
8FDC LD C,H Keep the screen page, take the high byte
8FDD LD A,H
8FDE AND $F8 Masked to the attribute third
8FE0 RRCA Folded down into the page bits
8FE1 RRCA
8FE2 RRCA
8FE3 OR $58 OR'd into the $58xx attribute page
8FE5 LD H,A Swap in the colour
8FE6 EX AF,AF' Store it, swap back
8FE7 LD (HL),A
8FE8 EX AF,AF'
8FE9 LD H,C Restore the screen page
8FEA LD (HL),$03 Sub-row 1: one-quarter fill
8FEC INC H
8FED LD (HL),$03 The remaining three-quarters
8FEF CALL $8FFC DOWN HL, off the bottom? done
8FF2 RET NC
8FF3 LD A,D Row on four rows lower
8FF4 ADD A,$04
8FF6 LD D,A
8FF7 INC E Next column, loop the columns
8FF8 DJNZ $8F8F
8FFA OR A
8FFB RET
8FFC CALL $98DC DOWN HL
8FFF LD A,H
9000 AND $18
9002 CP $18
9004 RET
9005: Draw a road marking
Draws a road marking while its row is on screen.
9005 LD A,D
9006 CP $68
9008 CCF
9009 RET C
900A LD B,$09
900C LD C,$87
900E LD HL,($C03E)
9011 JP $8A7B => Sprite draw dispatch
9014: Draw a tree
Draws a tree as a top and bottom half, skipping either half that has scrolled off the screen.
9014 LD A,D Top part off-screen? skip it
9015 CP $6B
9017 JR NC,$9025
9019 LD HL,($C01E) Load the top sprite ($C01E)
901C LD B,$0C
901E LD C,$B4
9020 PUSH DE
9021 CALL $8A14 Sprite draw dispatch variant, C=4
9024 POP DE
9025 DEC E
9026 LD A,D Move to the bottom part row
9027 SUB $0C
9029 CCF
902A RET NC
902B CP $04
902D CCF
902E RET NC
902F LD D,A
9030 CP $67 Bottom part on screen?
9032 CCF
9033 RET C
9034 LD HL,($C01C) Load the bottom sprite ($C01C)
9037 LD B,$08
9039 LD C,$34
903B JP $8AC3 => Sprite draw dispatch
903E: Draw a boulder
Draws a boulder while its row is on screen.
903E LD A,D
903F CP $6A
9041 CCF
9042 RET C
9043 LD B,$0B
9045 LD C,$30
9047 LD HL,($C014)
904A JP $8AC3 => Sprite draw dispatch
904D: Draw a cliff edge
Input
D Row
E Column and flags (bit 7 side, bits 5-6 edge markers)
Draws a cliff edge, left or right variant, noting the edge column so other code knows where the cliff runs, then drawing its upper and lower halves.
904D LD A,E
904E AND $1F
9050 BIT 7,E E bit 7 picks left/right edge
9052 JR NZ,$9070
9054 LD HL,($C002) Get sprite addr Cliff edge left
9057 PUSH HL
9058 LD HL,($C048) Get sprite addr ???
905B BIT 6,E
905D JR Z,$908A
905F LD (IY+$5F),D Record left edge column (IY+$5F)
9062 RES 0,(IY+$71)
9066 BIT 5,E
9068 JR Z,$908A
906A SET 0,(IY+$71)
906E JR $908A
9070 LD HL,($C000) Get sprite addr Cliff edge right
9073 PUSH HL
9074 LD HL,($C042)
9077 BIT 6,E
9079 JR Z,$908A
907B LD (IY+$5E),D Record right edge column (IY+$5E)
907E RES 1,(IY+$71)
9082 BIT 5,E
9084 JR Z,$908A
9086 SET 1,(IY+$71)
908A LD E,A
908B LD B,$15 Top part height = $15
908D LD C,$34
908F LD A,$EC
9091 CALL $90A1 Adjust and clip sprite draw, calls $8A14
9094 POP HL
9095 RET C
9096 LD B,$0F Bottom part height = $0F
9098 LD C,$37
909A LD A,$FE
909C CALL $90A1 Adjust and clip sprite draw, calls $8A14
909F OR A
90A0 RET
90A1: Adjust and clip sprite draw, calls $8A14
Used by the routine at 904D.
Input
A Row offset added to D
B Sprite height
C Attribute/colour byte
DE Screen position (D row, E column)
HL Sprite address
Offsets a sprite's row by the given amount and draws it, skipping the draw when the result lands above the screen.
90A1 PUSH DE
90A2 ADD A,D
90A3 LD D,A
90A4 SUB $04
90A6 OR A
90A7 CALL P,$8A14 Sprite draw dispatch variant, C=4
90AA POP DE
90AB RET
90AC: Draw a mirrored cliff
Input
D Row
E Column and variant flag (bit 7 = left/right)
Draws a mirrored cliff from a top and bottom sprite pair, then colours the attribute cells beneath it from a small palette table.
90AC LD A,D
90AD CP $93 Reject if row off-screen
90AF CCF
90B0 RET C
90B1 BIT 7,E E bit 7 picks left/right variant
90B3 RES 7,E
90B5 LD A,E
90B6 JR NZ,$90C1
90B8 LD HL,($C040) Cliff top-right sprite address, width 6
90BB PUSH HL
90BC LD HL,($C044) Cliff bottom-right sprite address, width 6
90BF JR $90C8
90C1 LD HL,($C046) Cliff top-left sprite address, width 6
90C4 PUSH HL
90C5 LD HL,($C04A) Cliff bottom-left sprite address, width 6
90C8 LD B,$14 Sprite height = 20
90CA PUSH DE
90CB LD A,$40
90CD CALL $834B Draw sprite HL
90D0 POP DE
90D1 POP HL
90D2 LD B,$0C Sprite height = 12
90D4 PUSH DE
90D5 LD A,D
90D6 SUB $24
90D8 LD D,A
90D9 CP $04
90DB LD A,$40
90DD CALL P,$834B Draw sprite HL
90E0 POP DE
90E1 LD A,D
90E2 AND $FC
90E4 LD D,A
90E5 LD BC,$3401
90E8 CALL $867C Clip sprite rectangle against screen edge
90EB PUSH HL
90EC LD A,E
90ED EXX
90EE ADD A,$01
90F0 SRL A
90F2 SRL A
90F4 LD HL,$9124 Colour palette table $9124
90F7 CALL $98D3 HL = HL + A
90FA EX DE,HL
90FB POP HL
90FC LD A,H
90FD RRCA
90FE RRCA
90FF RRCA
9100 AND $03
9102 OR $58 Attribute area base ($58xx)
9104 LD H,A
9105 LD BC,$001B
9108 EXX
9109 LD A,B
910A SRL A
910C SRL A
910E INC A
910F LD B,A
9110 EXX Fill attribute row from palette
9111 LD A,(DE)
9112 INC DE
9113 LD (HL),A #0 first attribute cell
9114 INC L
9115 LD (HL),A #1 second cell
9116 INC L
9117 LD (HL),A #2 third cell
9118 INC L
9119 LD (HL),A #3 fourth cell
911A INC L
911B LD (HL),A #4 fifth cell
911C INC L
911D LD (HL),A
911E ADD HL,BC
911F EXX
9120 DJNZ $9110
9122 OR A
9123 RET
9124: Cliff attribute palette, indexed by column
9124 DEFB $31,$34,$34,$34,$24,$21,$21,$21
912C DEFB $27,$27,$27,$37,$37,$37
9132: Decrement Land space or process next record in the sequence
Used by the routine at 9193.
Advances the level layout by one row. Blank ground is simply counted down a row at a time; otherwise the next record in the level sequence is read and acted on -- setting up more blank ground, marking a spawn point or the level end -- wrapping back to the start when the table runs out.
9132 LD A,($FD86) Get Land space size
9135 OR A zero?
9136 JR Z,$913D yes => process next record in the sequence
9138 DEC A
9139 LD ($FD86),A Update Land space size
913C RET
913D LD HL,($FD8A) Get current level sequence address
9140 LD A,(HL) Get record code
9141 AND $7F
9143 CP $7F End of levels marker?
9145 JR NZ,$914D
9147 LD HL,$9236 Level 1 start address
914A LD A,(HL) Get record code
914B AND $7F
914D INC HL
914E LD E,(HL) Get record parameter
914F INC HL
9150 LD ($FD8A),HL Save current level sequence address
9153 OR A $00 - Land space?
9154 JR NZ,$915B no => jump
9156 LD A,E
9157 LD ($FD86),A Save Land space size
915A RET
915B CP $29
915D JR C,$9165
915F LD BC,$0002
9162 JP $6400 => Block of redirects
9165 CP $22 Spawn Point/Level End ?
9167 JR NZ,$9171 no => jump
9169 DEC E Level End ?
916A JR NZ,$913D no => jump
916C SET 4,(IY+$15)
9170 RET
9171 CALL $9204 Process record codes $01-28, not $22
9174 JR $913D => process next record in the sequence
9176: Level record: abort the sequence through the redirect block
Level-sequence record that abandons the sequence through the redirect block.
9176 LD BC,$0005
9179 JP $6400 => Block of redirects
917C: Walk $FF00 buffer chain (offset $FD88), increment field at +4
Used by the routine at 9193.
Walks the scenery buffer chain and ticks a counter in every entry, so each object ages by one frame.
917C LD A,($FD88) Get Offset in $FF00 buffer
917F OR A
9180 RET Z
9181 LD HL,$FF00
9184 LD L,(HL)
9185 LD E,L
9186 LD A,L
9187 ADD A,$04
9189 LD L,A
918A INC (HL)
918B LD L,E
918C LD A,($FD88) Get Offset in $FF00 buffer
918F CP L
9190 JR NZ,$9184
9192 RET
9193: Advance level scroll: walk $FF00 buffer, process sequence record
Used by the routine at 8003.
Per-frame world update: it advances the scenery buffer and the level sequence, sets this frame's draw mode, draws the three vehicles, then walks the buffer sending each record to its handler.
9193 BIT 4,(IY+$15)
9197 JR NZ,$91AA
9199 CALL $917C Walk $FF00 buffer chain (offset $FD88), increment field at +4
919C CALL $9132 Decrement Land space or process next record in the sequence
919F BIT 1,(IY+$07)
91A3 RET NZ
91A4 LD A,$80
91A6 LD R,A
91A8 JR $91AD
This entry point is used by the routine at 8006.
91AA XOR A
91AB LD R,A
91AD CALL $85AB Update and draw the Truck
91B0 CALL $8471 Run both motorbikes
91B3 CALL $83B8 Update and draw the Jeep sprite
91B6 LD A,($FD88) Get Offset in $FF00 buffer
91B9 OR A Nothing in the buffer? done
91BA RET Z
91BB LD HL,$FF00 Start at the head of the chain
This entry point is used by the routine at 91E3.
91BE LD L,(HL) Follow the link to the next entry
This entry point is used by the routine at 91E3.
91BF PUSH HL
91C0 INC L
91C1 INC L
91C2 LD A,(HL) Read the record code
91C3 AND $7F
91C5 INC L
91C6 LD E,(HL) Read the record position
91C7 INC L
91C8 LD D,(HL)
91C9 CP $29 Codes of $29 and above are not scenery
91CB JR NC,$91DD
91CD LD HL,$91E3 Queue the return point for the handler
91D0 PUSH HL
91D1 DEC A Code doubled into the table
91D2 ADD A,A
91D3 ADD A,$12 Add the table base
91D5 LD L,A
91D6 LD H,$80
91D8 LD A,(HL) Handler low byte
91D9 INC L
91DA LD H,(HL) High byte, jump to it
91DB LD L,A
91DC JP (HL)
91DD LD BC,$0004 Out of range: abort through the redirect
91E0 JP $6400 => Block of redirects
91E3: Link record entry into the $FF00 buffer chain, continue
Input
F Carry selects the exit path
L Buffer entry offset
Return point after a level record is handled. Depending on the flag it either links the entry into the sorted scenery buffer and moves on to the next record, or simply advances the buffer position.
91E3 JR NC,$91FC Carry path: check buffer offset only
91E5 POP HL
91E6 LD A,($FD88) Get Offset in $FF00 buffer
91E9 CP L
91EA JR Z,$91F6 Already at head? update offset
91EC LD A,L
91ED LD L,(HL)
91EE PUSH HL
91EF LD L,A
91F0 CALL $921F Insert entry into $FF00 buffer chain
91F3 POP HL
91F4 JR $91BF
91F6 INC L
91F7 LD A,(HL)
91F8 LD ($FD88),A Update Offset in $FF00 buffer
91FB RET
91FC POP HL
91FD LD A,($FD88) Get Offset in $FF00 buffer
9200 CP L
9201 JR NZ,$91BE
9203 RET
9204: Process record codes $01-28, not $22
Used by the routine at 9132.
Input
A Record code
E Record parameter
Handles the level-sequence record codes that place scenery, unpacking each record and adding the object it describes to the display list.
9204 LD B,A
9205 LD H,$FF
9207 LD A,($FD88) Get Offset in $FF00 buffer
920A LD L,A
920B LD A,(HL)
920C LD L,A
920D LD ($FD88),A Update Offset in $FF00 buffer
9210 INC L
9211 INC L
9212 LD (HL),B
9213 INC L
9214 LD (HL),E
9215 INC L #0 clip bound
9216 LD (HL),$04
9218 INC L #1 cleared field
9219 LD (HL),$00
921B INC L #2 cleared field
921C LD (HL),$00
921E RET
921F: Insert entry into $FF00 buffer chain
Used by the routine at 91E3.
Input
HL New entry offset
Links a new entry into the scenery buffer chain, walking it until the right place is found so the list stays in order.
921F LD D,L Remember the entry being linked
9220 LD A,(HL)
9221 INC L Follow the chain to the next slot
9222 LD L,(HL)
9223 LD E,L
9224 LD (HL),A Write this entry into it
9225 LD L,A Step on to the link field
9226 INC L
9227 LD (HL),E
9228 LD A,($FD88) Get Offset in $FF00 buffer
922B LD L,A
922C LD E,(HL)
922D LD (HL),D
922E LD L,D
922F LD (HL),E
9230 INC L
9231 LD (HL),A
9232 LD L,E
9233 INC L
9234 LD (HL),D
9235 RET
9236: Level 1
Used by the routine at 8009.
9236 DEFB $22,$00 Spawn Point
9238 DEFB $00,$04 Land Space
923A DEFB $83,$0C A tree in column 12
923C DEFB $00,$05 Land Space
923E DEFB $83,$0A A tree in column 10
9240 DEFB $83,$0E A tree in column 14
9242 DEFB $00,$1E Land Space
9244 DEFB $83,$1C A tree in column 28
9246 DEFB $83,$02 A tree in column 2
9248 DEFB $00,$15 Land Space
924A DEFB $82,$9A A mirrored cliff in column 26
924C DEFB $26,$59 A cliff edge in column 25 with jumping soldiers
924E DEFB $00,$14 Land Space
9250 DEFB $87,$14 A boulder in column 20
9252 DEFB $00,$14 Land Space
9254 DEFB $83,$08 A tree in column 8
9256 DEFB $00,$1E Land Space
9258 DEFB $83,$12 A tree in column 18
925A DEFB $83,$16 A tree in column 22
925C DEFB $00,$05 Land Space
925E DEFB $83,$14 A tree in column 20
9260 DEFB $00,$19 Land Space
9262 DEFB $83,$09 A tree in column 9
9264 DEFB $00,$14 Land Space
9266 DEFB $82,$9A A mirrored cliff in column 26
9268 DEFB $26,$59 A cliff edge in column 25 with jumping soldiers
926A DEFB $00,$28 Land Space
926C DEFB $83,$01 A tree in column 1
926E DEFB $83,$17 A tree in column 23
9270 DEFB $83,$05 A tree in column 5
9272 DEFB $00,$06 Land Space
9274 DEFB $83,$03 A tree in column 3
9276 DEFB $00,$10 Land Space
9278 DEFB $8A,$11 Sandbags LHS in column 17
927A DEFB $8B,$13 Sandbags MIDDLE in column 19
927C DEFB $8B,$16 Sandbags MIDDLE in column 22
927E DEFB $8C,$19 Sandbags RHS in column 25
9280 DEFB $00,$08 Land Space
9282 DEFB $83,$0D A tree in column 13
9284 DEFB $0F,$11 A single grenade in column 17
9286 DEFB $00,$1C Land Space
9288 DEFB $83,$18 A tree in column 24
928A DEFB $82,$00 A cliff in column 0
928C DEFB $26,$C6 A mirrored cliff edge in column 6 with jumping soldiers
928E DEFB $00,$28 Land Space
9290 DEFB $83,$19 A tree in column 25
9292 DEFB $00,$1E Land Space
9294 DEFB $82,$8A A mirrored cliff in column 10
9296 DEFB $82,$10 A cliff in column 16
9298 DEFB $26,$09 A cliff edge in column 9
929A DEFB $26,$96 A mirrored cliff edge in column 22
929C DEFB $00,$36 Land Space
929E DEFB $87,$14 A boulder in column 20
92A0 DEFB $00,$04 Land Space
92A2 DEFB $20,$00 Prisoner of war
92A4 DEFB $00,$05 Land Space
92A6 DEFB $22,$00 Spawn Point
92A8 DEFB $00,$23 Land Space
92AA DEFB $83,$02 A tree in column 2
92AC DEFB $00,$14 Land Space
92AE DEFB $83,$13 A tree in column 19
92B0 DEFB $00,$1E Land Space
92B2 DEFB $8B,$1D Sandbags MIDDLE in column 29
92B4 DEFB $8B,$1A Sandbags MIDDLE in column 26
92B6 DEFB $8A,$18 Sandbags LHS in column 24
92B8 DEFB $00,$08 Land Space
92BA DEFB $13,$19 A right mortar in column 25
92BC DEFB $00,$06 Land Space
92BE DEFB $11,$16 A quintuple grenade in column 22
92C0 DEFB $00,$0D Land Space
92C2 DEFB $09,$0B A wall in column 11
92C4 DEFB $09,$1F A wall in column 31
92C6 DEFB $96,$0C A tunnel in column 12
92C8 DEFB $00,$17 Land Space
92CA DEFB $17,$1F Draw Road on bridge
92CC DEFB $00,$01 Land Space
92CE DEFB $1B,$3C Motorbike
92D0 DEFB $00,$0B Land Space
92D2 DEFB $08,$1F A bridge section
92D4 DEFB $00,$14 Land Space
92D6 DEFB $87,$0F A boulder in column 15
92D8 DEFB $00,$32 Land Space
92DA DEFB $22,$00 Spawn Point
92DC DEFB $00,$1E Land Space
92DE DEFB $87,$01 A boulder in column 1
92E0 DEFB $00,$23 Land Space
92E2 DEFB $87,$09 A boulder in column 9
92E4 DEFB $00,$14 Land Space
92E6 DEFB $87,$12 A boulder in column 18
92E8 DEFB $00,$1E Land Space
92EA DEFB $87,$01 A boulder in column 1
92EC DEFB $87,$0E A boulder in column 14
92EE DEFB $87,$1B A boulder in column 27
92F0 DEFB $00,$19 Land Space
92F2 DEFB $8A,$02 Sandbags LHS in column 2
92F4 DEFB $8B,$04 Sandbags MIDDLE in column 4
92F6 DEFB $8B,$07 Sandbags MIDDLE in column 7
92F8 DEFB $8C,$0A Sandbags RHS in column 10
92FA DEFB $00,$0A Land Space
92FC DEFB $11,$03 A quintuple grenade in column 3
92FE DEFB $00,$0F Land Space
9300 DEFB $8A,$13 Sandbags LHS in column 19
9302 DEFB $8B,$15 Sandbags MIDDLE in column 21
9304 DEFB $8B,$18 Sandbags MIDDLE in column 24
9306 DEFB $8C,$1B Sandbags RHS in column 27
9308 DEFB $00,$12 Land Space
930A DEFB $8A,$04 Sandbags LHS in column 4
930C DEFB $8B,$06 Sandbags MIDDLE in column 6
930E DEFB $8C,$09 Sandbags RHS in column 9
9310 DEFB $00,$09 Land Space
9312 DEFB $10,$05 A triple grenade in column 5
9314 DEFB $00,$05 Land Space
9316 DEFB $22,$00 Spawn Point
9318 DEFB $00,$32 Land Space
931A DEFB $8A,$0D Sandbags LHS in column 13
931C DEFB $8B,$0F Sandbags MIDDLE in column 15
931E DEFB $8C,$12 Sandbags RHS in column 18
9320 DEFB $00,$19 Land Space
9322 DEFB $8A,$00 Sandbags LHS in column 0
9324 DEFB $8B,$02 Sandbags MIDDLE in column 2
9326 DEFB $8C,$05 Sandbags RHS in column 5
9328 DEFB $00,$1C Land Space
932A DEFB $8B,$1D Sandbags MIDDLE in column 29
932C DEFB $8B,$1A Sandbags MIDDLE in column 26
932E DEFB $8A,$18 Sandbags LHS in column 24
9330 DEFB $00,$08 Land Space
9332 DEFB $0F,$18 A single grenade in column 24
9334 DEFB $00,$32 Land Space
9336 DEFB $09,$0B A wall in column 11
9338 DEFB $09,$1F A wall in column 31
933A DEFB $21,$14 Fortress gates
933C DEFB $00,$16 Land Space
933E DEFB $22,$01 Spawn Point
9340: Level 2
9340 DEFB $00,$5E Land Space
9342 DEFB $1C,$00 Jeep
9344 DEFB $1A,$00 Truck
9346 DEFB $00,$3C Land Space
9348 DEFB $1B,$FF Motorbike
934A DEFB $00,$28 Land Space
934C DEFB $0F,$07 A single grenade in column 7
934E DEFB $00,$08 Land Space
9350 DEFB $24,$00 A trench MIDDLE in column 0
9352 DEFB $24,$04 A trench MIDDLE in column 4
9354 DEFB $25,$08 A trench RIGHT in column 8
9356 DEFB $00,$19 Land Space
9358 DEFB $23,$14 A trench LHS in column 20
935A DEFB $24,$16 A trench MIDDLE in column 22
935C DEFB $25,$1A A trench RIGHT in column 26
935E DEFB $00,$1E Land Space
9360 DEFB $23,$02 A trench LHS in column 2
9362 DEFB $24,$04 A trench MIDDLE in column 4
9364 DEFB $25,$08 A trench RIGHT in column 8
9366 DEFB $00,$08 Land Space
9368 DEFB $23,$16 A trench LHS in column 22
936A DEFB $24,$18 A trench MIDDLE in column 24
936C DEFB $25,$1C A trench RIGHT in column 28
936E DEFB $00,$1E Land Space
9370 DEFB $23,$0A A trench LHS in column 10
9372 DEFB $24,$0C A trench MIDDLE in column 12
9374 DEFB $24,$10 A trench MIDDLE in column 16
9376 DEFB $25,$14 A trench RIGHT in column 20
9378 DEFB $00,$14 Land Space
937A DEFB $10,$1B A triple grenade in column 27
937C DEFB $00,$0A Land Space
937E DEFB $22,$00 Spawn Point
9380 DEFB $00,$32 Land Space
9382 DEFB $23,$12 A trench LHS in column 18
9384 DEFB $24,$14 A trench MIDDLE in column 20
9386 DEFB $24,$18 A trench MIDDLE in column 24
9388 DEFB $24,$1C A trench MIDDLE in column 28
938A DEFB $00,$19 Land Space
938C DEFB $23,$01 A trench LHS in column 1
938E DEFB $24,$03 A trench MIDDLE in column 3
9390 DEFB $25,$07 A trench RIGHT in column 7
9392 DEFB $00,$1E Land Space
9394 DEFB $23,$0C A trench LHS in column 12
9396 DEFB $24,$0E A trench MIDDLE in column 14
9398 DEFB $24,$12 A trench MIDDLE in column 18
939A DEFB $24,$16 A trench MIDDLE in column 22
939C DEFB $25,$1A A trench RIGHT in column 26
939E DEFB $00,$1E Land Space
93A0 DEFB $23,$02 A trench LHS in column 2
93A2 DEFB $24,$04 A trench MIDDLE in column 4
93A4 DEFB $25,$08 A trench RIGHT in column 8
93A6 DEFB $00,$3C Land Space
93A8 DEFB $10,$14 A triple grenade in column 20
93AA DEFB $00,$0C Land Space
93AC DEFB $09,$0B A wall in column 11
93AE DEFB $09,$1F A wall in column 31
93B0 DEFB $96,$0C A tunnel in column 12
93B2 DEFB $00,$17 Land Space
93B4 DEFB $17,$1F Draw Road on bridge
93B6 DEFB $00,$0C Land Space
93B8 DEFB $08,$1F A bridge section
93BA DEFB $00,$50 Land Space
93BC DEFB $22,$00 Spawn Point
93BE DEFB $00,$14 Land Space
93C0 DEFB $95,$00 A barracks in column 0
93C2 DEFB $00,$23 Land Space
93C4 DEFB $10,$03 A triple grenade in column 3
93C6 DEFB $00,$1E Land Space
93C8 DEFB $28,$19 Start of NME with rocket launchers. Ferocity:25
93CA DEFB $00,$0F Land Space
93CC DEFB $98,$10 A log crossing in column 16
93CE DEFB $00,$02 Land Space
93D0 DEFB $0D,$08 Water
93D2 DEFB $00,$19 Land Space
93D4 DEFB $19,$08 Water Strip 1
93D6 DEFB $00,$05 Land Space
93D8 DEFB $0E,$08 Water Strip 2
93DA DEFB $00,$0A Land Space
93DC DEFB $81,$00 A bunker in column 0
93DE DEFB $00,$14 Land Space
93E0 DEFB $28,$00 End of NME with rocket launchers
93E2 DEFB $00,$32 Land Space
93E4 DEFB $81,$1A A bunker in column 26
93E6 DEFB $00,$05 Land Space
93E8 DEFB $22,$00 Spawn Point
93EA DEFB $00,$3C Land Space
93EC DEFB $81,$00 A bunker in column 0
93EE DEFB $00,$1E Land Space
93F0 DEFB $1F,$1A A cave bottom edge in column 26
93F2 DEFB $00,$03 Land Space
93F4 DEFB $1E,$1A A cave main in column 26
93F6 DEFB $00,$0F Land Space
93F8 DEFB $1F,$00 A cave bottom edge in column 0
93FA DEFB $00,$03 Land Space
93FC DEFB $1E,$00 A cave main in column 0
93FE DEFB $1E,$1A A cave main in column 26
9400 DEFB $00,$13 Land Space
9402 DEFB $1E,$00 A cave main in column 0
9404 DEFB $1E,$1A A cave main in column 26
9406 DEFB $00,$13 Land Space
9408 DEFB $1D,$00 A cave top edge in column 0
940A DEFB $1D,$1A A cave top edge in column 26
940C DEFB $00,$04 Land Space
940E DEFB $09,$0B A wall in column 11
9410 DEFB $09,$1F A wall in column 31
9412 DEFB $21,$14 Fortress gates
9414 DEFB $00,$16 Land Space
9416 DEFB $22,$01 Spawn Point
9418: Level 3
9418 DEFB $00,$14 Land Space
941A DEFB $94,$86 A large hut in column 6
941C DEFB $00,$19 Land Space
941E DEFB $94,$94 A large hut in column 20
9420 DEFB $00,$28 Land Space
9422 DEFB $94,$81 A large hut in column 1
9424 DEFB $00,$14 Land Space
9426 DEFB $10,$16 A triple grenade in column 22
9428 DEFB $00,$0A Land Space
942A DEFB $94,$8B A large hut in column 11
942C DEFB $00,$1E Land Space
942E DEFB $94,$94 A large hut in column 20
9430 DEFB $00,$0A Land Space
9432 DEFB $94,$84 A large hut in column 4
9434 DEFB $00,$28 Land Space
9436 DEFB $94,$8D A large hut in column 13
9438 DEFB $00,$28 Land Space
943A DEFB $94,$86 A large hut in column 6
943C DEFB $00,$19 Land Space
943E DEFB $94,$99 A large hut in column 25
9440 DEFB $00,$23 Land Space
9442 DEFB $23,$12 A trench LHS in column 18
9444 DEFB $24,$14 A trench MIDDLE in column 20
9446 DEFB $25,$18 A trench RIGHT in column 24
9448 DEFB $00,$0D Land Space
944A DEFB $10,$14 A triple grenade in column 20
944C DEFB $94,$81 A large hut in column 1
944E DEFB $00,$16 Land Space
9450 DEFB $94,$8C A large hut in column 12
9452 DEFB $00,$32 Land Space
9454 DEFB $94,$86 A large hut in column 6
9456 DEFB $00,$0A Land Space
9458 DEFB $22,$00 Spawn Point
945A DEFB $00,$05 Land Space
945C DEFB $94,$93 A large hut in column 19
945E DEFB $00,$19 Land Space
9460 DEFB $24,$00 A trench MIDDLE in column 0
9462 DEFB $24,$04 A trench MIDDLE in column 4
9464 DEFB $25,$08 A trench RIGHT in column 8
9466 DEFB $00,$1E Land Space
9468 DEFB $94,$88 A large hut in column 8
946A DEFB $00,$1E Land Space
946C DEFB $23,$14 A trench LHS in column 20
946E DEFB $24,$16 A trench MIDDLE in column 22
9470 DEFB $25,$1A A trench RIGHT in column 26
9472 DEFB $00,$28 Land Space
9474 DEFB $94,$92 A large hut in column 18
9476 DEFB $00,$1E Land Space
9478 DEFB $23,$00 A trench LHS in column 0
947A DEFB $24,$02 A trench MIDDLE in column 2
947C DEFB $24,$06 A trench MIDDLE in column 6
947E DEFB $25,$0A A trench RIGHT in column 10
9480 DEFB $00,$1E Land Space
9482 DEFB $11,$04 A quintuple grenade in column 4
9484 DEFB $00,$28 Land Space
9486 DEFB $09,$0B A wall in column 11
9488 DEFB $09,$1F A wall in column 31
948A DEFB $96,$0C A tunnel in column 12
948C DEFB $00,$17 Land Space
948E DEFB $17,$1F Draw Road on bridge
9490 DEFB $00,$0C Land Space
9492 DEFB $08,$1F A bridge section
9494 DEFB $00,$5A Land Space
9496 DEFB $1A,$00 Truck
9498 DEFB $00,$1E Land Space
949A DEFB $1B,$FF Motorbike
949C DEFB $00,$05 Land Space
949E DEFB $22,$00 Spawn Point
94A0 DEFB $00,$28 Land Space
94A2 DEFB $1A,$00 Truck
94A4 DEFB $00,$23 Land Space
94A6 DEFB $1B,$FF Motorbike
94A8 DEFB $00,$1E Land Space
94AA DEFB $1C,$00 Jeep
94AC DEFB $00,$28 Land Space
94AE DEFB $1A,$00 Truck
94B0 DEFB $00,$3C Land Space
94B2 DEFB $28,$1E Start of NME with rocket launchers. Ferocity:30
94B4 DEFB $00,$28 Land Space
94B6 DEFB $1C,$00 Jeep
94B8 DEFB $28,$00 End of NME with rocket launchers
94BA DEFB $00,$05 Land Space
94BC DEFB $22,$00 Spawn Point
94BE DEFB $00,$3C Land Space
94C0 DEFB $0F,$04 A single grenade in column 4
94C2 DEFB $00,$3C Land Space
94C4 DEFB $8A,$02 Sandbags LHS in column 2
94C6 DEFB $8B,$04 Sandbags MIDDLE in column 4
94C8 DEFB $8C,$07 Sandbags RHS in column 7
94CA DEFB $8A,$17 Sandbags LHS in column 23
94CC DEFB $8B,$19 Sandbags MIDDLE in column 25
94CE DEFB $8C,$1C Sandbags RHS in column 28
94D0 DEFB $00,$05 Land Space
94D2 DEFB $10,$0A A triple grenade in column 10
94D4 DEFB $10,$13 A triple grenade in column 19
94D6 DEFB $00,$04 Land Space
94D8 DEFB $13,$1B A right mortar in column 27
94DA DEFB $12,$03 A left mortar in column 3
94DC DEFB $00,$14 Land Space
94DE DEFB $09,$0B A wall in column 11
94E0 DEFB $09,$1F A wall in column 31
94E2 DEFB $21,$14 Fortress gates
94E4 DEFB $00,$16 Land Space
94E6 DEFB $22,$01 Spawn Point
94E8: Level 4
94E8 DEFB $00,$46 Land Space
94EA DEFB $28,$46 Start of NME with rocket launchers. Ferocity:70
94EC DEFB $00,$14 Land Space
94EE DEFB $98,$10 A log crossing in column 16
94F0 DEFB $00,$02 Land Space
94F2 DEFB $0D,$08 Water
94F4 DEFB $00,$19 Land Space
94F6 DEFB $19,$08 Water Strip 1
94F8 DEFB $00,$05 Land Space
94FA DEFB $0E,$08 Water Strip 2
94FC DEFB $00,$19 Land Space
94FE DEFB $10,$19 A triple grenade in column 25
9500 DEFB $00,$19 Land Space
9502 DEFB $98,$08 A log crossing in column 8
9504 DEFB $00,$02 Land Space
9506 DEFB $0D,$10 Water
9508 DEFB $00,$19 Land Space
950A DEFB $19,$10 Water Strip 1
950C DEFB $00,$05 Land Space
950E DEFB $0E,$10 Water Strip 2
9510 DEFB $00,$3C Land Space
9512 DEFB $98,$10 A log crossing in column 16
9514 DEFB $00,$02 Land Space
9516 DEFB $0D,$08 Water
9518 DEFB $00,$19 Land Space
951A DEFB $19,$08 Water Strip 1
951C DEFB $00,$05 Land Space
951E DEFB $0E,$08 Water Strip 2
9520 DEFB $00,$1E Land Space
9522 DEFB $22,$00 Spawn Point
9524 DEFB $00,$14 Land Space
9526 DEFB $28,$46 Start of NME with rocket launchers. Ferocity:70
9528 DEFB $83,$02 A tree in column 2
952A DEFB $00,$23 Land Space
952C DEFB $83,$14 A tree in column 20
952E DEFB $00,$23 Land Space
9530 DEFB $05,$10 A road bottom edging in column 16
9532 DEFB $00,$13 Land Space
9534 DEFB $27,$01 Turn the alarm ON
9536 DEFB $8A,$01 Sandbags LHS in column 1
9538 DEFB $8B,$03 Sandbags MIDDLE in column 3
953A DEFB $8B,$06 Sandbags MIDDLE in column 6
953C DEFB $8C,$09 Sandbags RHS in column 9
953E DEFB $00,$1E Land Space
9540 DEFB $04,$1B A road marking in column 27
9542 DEFB $28,$14 Start of NME with rocket launchers. Ferocity:20
9544 DEFB $00,$0C Land Space
9546 DEFB $05,$00 A road bottom edging in column 0
9548 DEFB $00,$0C Land Space
954A DEFB $04,$15 A road marking in column 21
954C DEFB $11,$04 A quintuple grenade in column 4
954E DEFB $00,$06 Land Space
9550 DEFB $06,$10 A road top edging in column 16
9552 DEFB $00,$12 Land Space
9554 DEFB $04,$0F A road marking in column 15
9556 DEFB $00,$18 Land Space
9558 DEFB $04,$09 A road marking in column 9
955A DEFB $00,$13 Land Space
955C DEFB $06,$00 A road top edging in column 0
955E DEFB $00,$05 Land Space
9560 DEFB $04,$03 A road marking in column 3
9562 DEFB $83,$14 A tree in column 20
9564 DEFB $00,$14 Land Space
9566 DEFB $83,$1B A tree in column 27
9568 DEFB $00,$32 Land Space
956A DEFB $81,$1A A bunker in column 26
956C DEFB $00,$1E Land Space
956E DEFB $28,$00 End of NME with rocket launchers
9570 DEFB $00,$28 Land Space
9572 DEFB $87,$04 A boulder in column 4
9574 DEFB $00,$05 Land Space
9576 DEFB $22,$00 Spawn Point
9578 DEFB $00,$28 Land Space
957A DEFB $27,$01 Turn the alarm ON
957C DEFB $11,$19 A quintuple grenade in column 25
957E DEFB $00,$14 Land Space
9580 DEFB $8A,$14 Sandbags LHS in column 20
9582 DEFB $8B,$16 Sandbags MIDDLE in column 22
9584 DEFB $8C,$19 Sandbags RHS in column 25
9586 DEFB $00,$32 Land Space
9588 DEFB $27,$00 Turn the alarm OFF
958A DEFB $10,$04 A triple grenade in column 4
958C DEFB $00,$32 Land Space
958E DEFB $09,$0B A wall in column 11
9590 DEFB $09,$1F A wall in column 31
9592 DEFB $21,$14 Fortress gates
9594 DEFB $00,$1E Land Space
9596 DEFB $22,$01 Spawn Point
9598: Level 5
9598 DEFB $00,$05 Land Space
959A DEFB $83,$05 A tree in column 5
959C DEFB $00,$05 Land Space
959E DEFB $83,$0B A tree in column 11
95A0 DEFB $00,$1E Land Space
95A2 DEFB $82,$80 A mirrored cliff in column 0
95A4 DEFB $26,$EC A double cliff mirrored cliff edge in column 12 with jumping soldiers
95A6 DEFB $82,$06 A cliff in column 6
95A8 DEFB $00,$1E Land Space
95AA DEFB $82,$9A A mirrored cliff in column 26
95AC DEFB $26,$59 A cliff edge in column 25 with jumping soldiers
95AE DEFB $00,$1E Land Space
95B0 DEFB $83,$03 A tree in column 3
95B2 DEFB $00,$05 Land Space
95B4 DEFB $83,$07 A tree in column 7
95B6 DEFB $00,$14 Land Space
95B8 DEFB $26,$1F A cliff edge in column 31
95BA DEFB $82,$80 A mirrored cliff in column 0
95BC DEFB $82,$06 A cliff in column 6
95BE DEFB $26,$EC A double cliff mirrored cliff edge in column 12 with jumping soldiers
95C0 DEFB $00,$3C Land Space
95C2 DEFB $0F,$09 A single grenade in column 9
95C4 DEFB $83,$0C A tree in column 12
95C6 DEFB $00,$08 Land Space
95C8 DEFB $83,$0A A tree in column 10
95CA DEFB $00,$28 Land Space
95CC DEFB $82,$8A A mirrored cliff in column 10
95CE DEFB $82,$10 A cliff in column 16
95D0 DEFB $26,$09 A cliff edge in column 9
95D2 DEFB $26,$96 A mirrored cliff edge in column 22
95D4 DEFB $00,$3C Land Space
95D6 DEFB $82,$1A A cliff in column 26
95D8 DEFB $82,$94 A mirrored cliff in column 20
95DA DEFB $26,$73 A double cliff cliff edge in column 19 with jumping soldiers
95DC DEFB $00,$06 Land Space
95DE DEFB $82,$00 A cliff in column 0
95E0 DEFB $26,$C6 A mirrored cliff edge in column 6 with jumping soldiers
95E2 DEFB $00,$32 Land Space
95E4 DEFB $22,$00 Spawn Point
95E6 DEFB $00,$05 Land Space
95E8 DEFB $83,$0A A tree in column 10
95EA DEFB $83,$0E A tree in column 14
95EC DEFB $00,$08 Land Space
95EE DEFB $83,$0C A tree in column 12
95F0 DEFB $00,$28 Land Space
95F2 DEFB $83,$14 A tree in column 20
95F4 DEFB $00,$03 Land Space
95F6 DEFB $83,$18 A tree in column 24
95F8 DEFB $00,$07 Land Space
95FA DEFB $83,$1B A tree in column 27
95FC DEFB $00,$0A Land Space
95FE DEFB $82,$80 A mirrored cliff in column 0
9600 DEFB $82,$06 A cliff in column 6
9602 DEFB $26,$EC A double cliff mirrored cliff edge in column 12 with jumping soldiers
9604 DEFB $00,$0F Land Space
9606 DEFB $82,$1A A cliff in column 26
9608 DEFB $82,$94 A mirrored cliff in column 20
960A DEFB $26,$73 A double cliff cliff edge in column 19 with jumping soldiers
960C DEFB $00,$3C Land Space
960E DEFB $11,$09 A quintuple grenade in column 9
9610 DEFB $00,$0E Land Space
9612 DEFB $09,$0B A wall in column 11
9614 DEFB $09,$1F A wall in column 31
9616 DEFB $96,$0C A tunnel in column 12
9618 DEFB $00,$17 Land Space
961A DEFB $17,$1F Draw Road on bridge
961C DEFB $00,$01 Land Space
961E DEFB $1B,$3C Motorbike
9620 DEFB $00,$0B Land Space
9622 DEFB $08,$1F A bridge section
9624 DEFB $00,$28 Land Space
9626 DEFB $87,$0E A boulder in column 14
9628 DEFB $00,$1E Land Space
962A DEFB $87,$04 A boulder in column 4
962C DEFB $00,$28 Land Space
962E DEFB $22,$00 Spawn Point
9630 DEFB $00,$05 Land Space
9632 DEFB $8A,$18 Sandbags LHS in column 24
9634 DEFB $8B,$1A Sandbags MIDDLE in column 26
9636 DEFB $8B,$1D Sandbags MIDDLE in column 29
9638 DEFB $00,$05 Land Space
963A DEFB $87,$06 A boulder in column 6
963C DEFB $00,$14 Land Space
963E DEFB $87,$19 A boulder in column 25
9640 DEFB $00,$0F Land Space
9642 DEFB $87,$10 A boulder in column 16
9644 DEFB $00,$1E Land Space
9646 DEFB $87,$16 A boulder in column 22
9648 DEFB $8B,$00 Sandbags MIDDLE in column 0
964A DEFB $8C,$03 Sandbags RHS in column 3
964C DEFB $00,$22 Land Space
964E DEFB $87,$02 A boulder in column 2
9650 DEFB $00,$18 Land Space
9652 DEFB $87,$0B A boulder in column 11
9654 DEFB $00,$14 Land Space
9656 DEFB $87,$12 A boulder in column 18
9658 DEFB $00,$08 Land Space
965A DEFB $82,$80 A mirrored cliff in column 0
965C DEFB $82,$06 A cliff in column 6
965E DEFB $26,$EC A double cliff mirrored cliff edge in column 12 with jumping soldiers
9660 DEFB $00,$14 Land Space
9662 DEFB $87,$19 A boulder in column 25
9664 DEFB $00,$1E Land Space
9666 DEFB $8A,$0F Sandbags LHS in column 15
9668 DEFB $8B,$11 Sandbags MIDDLE in column 17
966A DEFB $8C,$14 Sandbags RHS in column 20
966C DEFB $00,$3C Land Space
966E DEFB $28,$1E Start of NME with rocket launchers. Ferocity:30
9670 DEFB $23,$0A A trench LHS in column 10
9672 DEFB $24,$0C A trench MIDDLE in column 12
9674 DEFB $24,$10 A trench MIDDLE in column 16
9676 DEFB $25,$14 A trench RIGHT in column 20
9678 DEFB $00,$14 Land Space
967A DEFB $25,$0A A trench RIGHT in column 10
967C DEFB $24,$06 A trench MIDDLE in column 6
967E DEFB $23,$04 A trench LHS in column 4
9680 DEFB $23,$14 A trench LHS in column 20
9682 DEFB $24,$16 A trench MIDDLE in column 22
9684 DEFB $25,$1A A trench RIGHT in column 26
9686 DEFB $00,$0F Land Space
9688 DEFB $28,$00 End of NME with rocket launchers
968A DEFB $09,$0B A wall in column 11
968C DEFB $09,$1F A wall in column 31
968E DEFB $21,$14 Fortress gates
9690 DEFB $00,$16 Land Space
9692 DEFB $22,$01 Spawn Point
9694: Level 6
9694 DEFB $00,$28 Land Space
9696 DEFB $81,$00 A bunker in column 0
9698 DEFB $00,$32 Land Space
969A DEFB $81,$1A A bunker in column 26
969C DEFB $00,$32 Land Space
969E DEFB $81,$00 A bunker in column 0
96A0 DEFB $00,$28 Land Space
96A2 DEFB $81,$1A A bunker in column 26
96A4 DEFB $00,$32 Land Space
96A6 DEFB $1F,$1A A cave bottom edge in column 26
96A8 DEFB $1F,$00 A cave bottom edge in column 0
96AA DEFB $00,$03 Land Space
96AC DEFB $1E,$1A A cave main in column 26
96AE DEFB $1E,$00 A cave main in column 0
96B0 DEFB $00,$13 Land Space
96B2 DEFB $11,$07 A quintuple grenade in column 7
96B4 DEFB $1E,$1A A cave main in column 26
96B6 DEFB $1E,$00 A cave main in column 0
96B8 DEFB $00,$13 Land Space
96BA DEFB $1E,$1A A cave main in column 26
96BC DEFB $1E,$00 A cave main in column 0
96BE DEFB $00,$13 Land Space
96C0 DEFB $10,$16 A triple grenade in column 22
96C2 DEFB $1E,$1A A cave main in column 26
96C4 DEFB $1E,$00 A cave main in column 0
96C6 DEFB $00,$13 Land Space
96C8 DEFB $1E,$1A A cave main in column 26
96CA DEFB $1E,$00 A cave main in column 0
96CC DEFB $00,$13 Land Space
96CE DEFB $1E,$1A A cave main in column 26
96D0 DEFB $1E,$00 A cave main in column 0
96D2 DEFB $00,$13 Land Space
96D4 DEFB $1D,$00 A cave top edge in column 0
96D6 DEFB $1D,$1A A cave top edge in column 26
96D8 DEFB $00,$23 Land Space
96DA DEFB $09,$0B A wall in column 11
96DC DEFB $09,$1F A wall in column 31
96DE DEFB $96,$0C A tunnel in column 12
96E0 DEFB $00,$17 Land Space
96E2 DEFB $17,$1F Draw Road on bridge
96E4 DEFB $00,$0C Land Space
96E6 DEFB $08,$1F A bridge section
96E8 DEFB $00,$3C Land Space
96EA DEFB $25,$00 A trench RIGHT in column 0
96EC DEFB $00,$1E Land Space
96EE DEFB $22,$00 Spawn Point
96F0 DEFB $00,$05 Land Space
96F2 DEFB $24,$1C A trench MIDDLE in column 28
96F4 DEFB $23,$1A A trench LHS in column 26
96F6 DEFB $00,$21 Land Space
96F8 DEFB $24,$00 A trench MIDDLE in column 0
96FA DEFB $24,$04 A trench MIDDLE in column 4
96FC DEFB $25,$08 A trench RIGHT in column 8
96FE DEFB $00,$19 Land Space
9700 DEFB $23,$10 A trench LHS in column 16
9702 DEFB $24,$12 A trench MIDDLE in column 18
9704 DEFB $24,$16 A trench MIDDLE in column 22
9706 DEFB $28,$14 Start of NME with rocket launchers. Ferocity:20
9708 DEFB $24,$1A A trench MIDDLE in column 26
970A DEFB $25,$1E A trench RIGHT in column 30
970C DEFB $00,$0A Land Space
970E DEFB $11,$04 A quintuple grenade in column 4
9710 DEFB $00,$0E Land Space
9712 DEFB $98,$10 A log crossing in column 16
9714 DEFB $00,$02 Land Space
9716 DEFB $0D,$08 Water
9718 DEFB $00,$19 Land Space
971A DEFB $19,$08 Water Strip 1
971C DEFB $00,$05 Land Space
971E DEFB $0E,$08 Water Strip 2
9720 DEFB $00,$14 Land Space
9722 DEFB $28,$00 End of NME with rocket launchers
9724 DEFB $23,$0A A trench LHS in column 10
9726 DEFB $24,$0C A trench MIDDLE in column 12
9728 DEFB $24,$10 A trench MIDDLE in column 16
972A DEFB $24,$14 A trench MIDDLE in column 20
972C DEFB $25,$18 A trench RIGHT in column 24
972E DEFB $00,$28 Land Space
9730 DEFB $24,$00 A trench MIDDLE in column 0
9732 DEFB $24,$04 A trench MIDDLE in column 4
9734 DEFB $24,$08 A trench MIDDLE in column 8
9736 DEFB $25,$0C A trench RIGHT in column 12
9738 DEFB $00,$1E Land Space
973A DEFB $23,$12 A trench LHS in column 18
973C DEFB $24,$14 A trench MIDDLE in column 20
973E DEFB $25,$18 A trench RIGHT in column 24
9740 DEFB $00,$05 Land Space
9742 DEFB $22,$00 Spawn Point
9744 DEFB $00,$32 Land Space
9746 DEFB $23,$14 A trench LHS in column 20
9748 DEFB $24,$16 A trench MIDDLE in column 22
974A DEFB $25,$1A A trench RIGHT in column 26
974C DEFB $00,$0E Land Space
974E DEFB $10,$16 A triple grenade in column 22
9750 DEFB $28,$19 Start of NME with rocket launchers. Ferocity:25
9752 DEFB $00,$1E Land Space
9754 DEFB $98,$08 A log crossing in column 8
9756 DEFB $00,$02 Land Space
9758 DEFB $0D,$10 Water
975A DEFB $00,$19 Land Space
975C DEFB $19,$10 Water Strip 1
975E DEFB $00,$05 Land Space
9760 DEFB $0E,$10 Water Strip 2
9762 DEFB $00,$19 Land Space
9764 DEFB $23,$06 A trench LHS in column 6
9766 DEFB $24,$08 A trench MIDDLE in column 8
9768 DEFB $24,$0C A trench MIDDLE in column 12
976A DEFB $25,$10 A trench RIGHT in column 16
976C DEFB $00,$14 Land Space
976E DEFB $23,$10 A trench LHS in column 16
9770 DEFB $24,$12 A trench MIDDLE in column 18
9772 DEFB $28,$00 End of NME with rocket launchers
9774 DEFB $24,$16 A trench MIDDLE in column 22
9776 DEFB $25,$1A A trench RIGHT in column 26
9778 DEFB $00,$0F Land Space
977A DEFB $24,$00 A trench MIDDLE in column 0
977C DEFB $24,$04 A trench MIDDLE in column 4
977E DEFB $24,$08 A trench MIDDLE in column 8
9780 DEFB $25,$0C A trench RIGHT in column 12
9782 DEFB $00,$0F Land Space
9784 DEFB $09,$0B A wall in column 11
9786 DEFB $09,$1F A wall in column 31
9788 DEFB $21,$14 Fortress gates
978A DEFB $00,$16 Land Space
978C DEFB $22,$01 Spawn Point
978E: Level 7
978E DEFB $00,$1E Land Space
9790 DEFB $94,$00 A small hut in column 0
9792 DEFB $94,$14 A small hut in column 20
9794 DEFB $94,$1A A small hut in column 26
9796 DEFB $00,$32 Land Space
9798 DEFB $94,$00 A small hut in column 0
979A DEFB $94,$06 A small hut in column 6
979C DEFB $94,$0C A small hut in column 12
979E DEFB $00,$1E Land Space
97A0 DEFB $94,$00 A small hut in column 0
97A2 DEFB $94,$14 A small hut in column 20
97A4 DEFB $94,$1A A small hut in column 26
97A6 DEFB $00,$28 Land Space
97A8 DEFB $94,$00 A small hut in column 0
97AA DEFB $94,$06 A small hut in column 6
97AC DEFB $94,$0C A small hut in column 12
97AE DEFB $00,$3C Land Space
97B0 DEFB $94,$00 A small hut in column 0
97B2 DEFB $94,$06 A small hut in column 6
97B4 DEFB $94,$12 A small hut in column 18
97B6 DEFB $00,$28 Land Space
97B8 DEFB $94,$0A A small hut in column 10
97BA DEFB $94,$10 A small hut in column 16
97BC DEFB $00,$05 Land Space
97BE DEFB $22,$00 Spawn Point
97C0 DEFB $00,$32 Land Space
97C2 DEFB $94,$00 A small hut in column 0
97C4 DEFB $94,$1A A small hut in column 26
97C6 DEFB $00,$1E Land Space
97C8 DEFB $94,$0D A small hut in column 13
97CA DEFB $00,$3C Land Space
97CC DEFB $12,$03 A left mortar in column 3
97CE DEFB $00,$02 Land Space
97D0 DEFB $11,$1A A quintuple grenade in column 26
97D2 DEFB $00,$0F Land Space
97D4 DEFB $09,$0B A wall in column 11
97D6 DEFB $09,$1F A wall in column 31
97D8 DEFB $96,$0C A tunnel in column 12
97DA DEFB $00,$17 Land Space
97DC DEFB $17,$1F Draw Road on bridge
97DE DEFB $00,$0C Land Space
97E0 DEFB $08,$1F A bridge section
97E2 DEFB $00,$3C Land Space
97E4 DEFB $1A,$00 Truck
97E6 DEFB $00,$28 Land Space
97E8 DEFB $22,$00 Spawn Point
97EA DEFB $00,$3C Land Space
97EC DEFB $28,$28 Start of NME with rocket launchers. Ferocity:40
97EE DEFB $11,$04 A quintuple grenade in column 4
97F0 DEFB $00,$1E Land Space
97F2 DEFB $1C,$00 Jeep
97F4 DEFB $00,$50 Land Space
97F6 DEFB $28,$0C Start of NME with rocket launchers. Ferocity:12
97F8 DEFB $00,$32 Land Space
97FA DEFB $11,$03 A quintuple grenade in column 3
97FC DEFB $00,$64 Land Space
97FE DEFB $0F,$19 A single grenade in column 25
9800 DEFB $00,$05 Land Space
9802 DEFB $22,$00 Spawn Point
9804 DEFB $00,$05 Land Space
9806 DEFB $28,$0C Start of NME with rocket launchers. Ferocity:12
9808 DEFB $00,$78 Land Space
980A DEFB $28,$00 End of NME with rocket launchers
980C DEFB $00,$1E Land Space
980E DEFB $09,$0B A wall in column 11
9810 DEFB $09,$1F A wall in column 31
9812 DEFB $21,$14 Fortress gates
9814 DEFB $00,$16 Land Space
9816 DEFB $22,$01 Spawn Point
9818: Level 8
9818 DEFB $00,$3C Land Space
981A DEFB $8A,$07 Sandbags LHS in column 7
981C DEFB $8B,$09 Sandbags MIDDLE in column 9
981E DEFB $8B,$0C Sandbags MIDDLE in column 12
9820 DEFB $8C,$0F Sandbags RHS in column 15
9822 DEFB $00,$28 Land Space
9824 DEFB $98,$08 A log crossing in column 8
9826 DEFB $00,$02 Land Space
9828 DEFB $0D,$10 Water
982A DEFB $00,$19 Land Space
982C DEFB $19,$10 Water Strip 1
982E DEFB $00,$05 Land Space
9830 DEFB $0E,$10 Water Strip 2
9832 DEFB $00,$0F Land Space
9834 DEFB $98,$10 A log crossing in column 16
9836 DEFB $00,$02 Land Space
9838 DEFB $0D,$08 Water
983A DEFB $00,$19 Land Space
983C DEFB $19,$08 Water Strip 1
983E DEFB $00,$05 Land Space
9840 DEFB $0E,$08 Water Strip 2
9842 DEFB $00,$1E Land Space
9844 DEFB $8B,$00 Sandbags MIDDLE in column 0
9846 DEFB $8B,$03 Sandbags MIDDLE in column 3
9848 DEFB $8C,$06 Sandbags RHS in column 6
984A DEFB $8B,$1D Sandbags MIDDLE in column 29
984C DEFB $8A,$1B Sandbags LHS in column 27
984E DEFB $00,$28 Land Space
9850 DEFB $95,$00 A barracks in column 0
9852 DEFB $00,$28 Land Space
9854 DEFB $1B,$FF Motorbike
9856 DEFB $00,$0A Land Space
9858 DEFB $10,$14 A triple grenade in column 20
985A DEFB $00,$14 Land Space
985C DEFB $1B,$FF Motorbike
985E DEFB $00,$05 Land Space
9860 DEFB $22,$00 Spawn Point
9862 DEFB $00,$1E Land Space
9864 DEFB $11,$15 A quintuple grenade in column 21
9866 DEFB $00,$05 Land Space
9868 DEFB $83,$02 A tree in column 2
986A DEFB $00,$23 Land Space
986C DEFB $83,$14 A tree in column 20
986E DEFB $00,$23 Land Space
9870 DEFB $05,$10 A road bottom edging in column 16
9872 DEFB $00,$13 Land Space
9874 DEFB $27,$01 Turn the alarm ON
9876 DEFB $8B,$00 Sandbags MIDDLE in column 0
9878 DEFB $8B,$03 Sandbags MIDDLE in column 3
987A DEFB $8C,$06 Sandbags RHS in column 6
987C DEFB $00,$0A Land Space
987E DEFB $12,$02 A left mortar in column 2
9880 DEFB $00,$13 Land Space
9882 DEFB $04,$1B A road marking in column 27
9884 DEFB $28,$14 Start of NME with rocket launchers. Ferocity:20
9886 DEFB $00,$0C Land Space
9888 DEFB $05,$00 A road bottom edging in column 0
988A DEFB $00,$0C Land Space
988C DEFB $04,$15 A road marking in column 21
988E DEFB $00,$06 Land Space
9890 DEFB $06,$10 A road top edging in column 16
9892 DEFB $00,$12 Land Space
9894 DEFB $04,$0F A road marking in column 15
9896 DEFB $00,$18 Land Space
9898 DEFB $04,$09 A road marking in column 9
989A DEFB $00,$13 Land Space
989C DEFB $06,$00 A road top edging in column 0
989E DEFB $00,$05 Land Space
98A0 DEFB $04,$03 A road marking in column 3
98A2 DEFB $11,$19 A quintuple grenade in column 25
98A4 DEFB $00,$28 Land Space
98A6 DEFB $10,$06 A triple grenade in column 6
98A8 DEFB $00,$14 Land Space
98AA DEFB $95,$00 A barracks in column 0
98AC DEFB $00,$3C Land Space
98AE DEFB $0F,$0A A single grenade in column 10
98B0 DEFB $00,$05 Land Space
98B2 DEFB $22,$00 Spawn Point
98B4 DEFB $00,$05 Land Space
98B6 DEFB $27,$01 Turn the alarm ON
98B8 DEFB $28,$14 Start of NME with rocket launchers. Ferocity:20
98BA DEFB $00,$82 Land Space
98BC DEFB $10,$04 A triple grenade in column 4
98BE DEFB $28,$00 End of NME with rocket launchers
98C0 DEFB $27,$00 Turn the alarm OFF
98C2 DEFB $00,$32 Land Space
98C4 DEFB $09,$0B A wall in column 11
98C6 DEFB $09,$1F A wall in column 31
98C8 DEFB $21,$14 Fortress gates
98CA DEFB $00,$1E Land Space
98CC DEFB $22,$01 Spawn Point
98CE DEFB $FF End of levels marker
98CF DEFB $07
98D0: Update object IX position, clip to screen, dispatch sprite draw (redirect)
Used by the routines at 6CAE, 806B, DD8D and EF37.
98D0 JP $9922 => Update object IX position, clip to screen, dispatch sprite draw
98D3: HL = HL + A (redirect)
Used by the routines at 6E7B, 6ECD, 6FF5, 7547, 7637, 87F1 and 90AC.
98D3 JP $98EA => HL = HL + A
98D6: (HL) -> HL (redirect)
Used by the routines at 6A1E, 7547 and 7637.
98D6 JP $98F0 => (HL) -> HL
98D9: Convert row number to screen line address (redirect)
Used by the routines at 6896, 6B4C, 6F79, 70BD, 7637, DD8D and EF37.
98D9 JP $98F5 => Convert row number to screen line address
98DC: DOWN HL (redirect)
Used by the routines at 68CA, 6AE1, 6B4C, 70BD, 7637, 7A45, 818F and 8F49.
98DC JP $9904 => DOWN HL - move HL to the next screen line
98DF: UP HL (redirect)
98DF JP $9913 => UP HL
98E2: Offsets in $A000 sprites block, lo byte
Indexed as frame*2 (+1 if the flip bit, IX+$0B bit 2, is set) -- 8 entries cover 4 animation frames, each with a normal and flipped variant.
98E2 DEFB $00 frame 0, normal
98E3 DEFB $1E 1
98E4 DEFB $40 2
98E5 DEFB $5E frame 1, flipped
98E6 DEFB $80 frame 2, normal
98E7 DEFB $9E frame 2, flipped
98E8 DEFB $C0 frame 3, normal
98E9 DEFB $DE frame 3, flipped
98EA: HL = HL + A
Used by the routine at 98D3.
Adds the byte in A to HL, carrying into the high byte.
98EA ADD A,L
98EB LD L,A
98EC ADC A,H
98ED SUB L
98EE LD H,A
98EF RET
98F0: (HL) -> HL
Used by the routine at 98D6.
Follows a pointer, replacing HL with the address it points at.
98F0 LD A,(HL)
98F1 INC HL
98F2 LD H,(HL)
98F3 LD L,A
98F4 RET
98F5: Convert row number to screen line address (via $FE00 table)
Used by the routine at 98D9.
Converts a row and column into a screen address, halving the row to a character line and looking it up in the line table.
98F5 LD A,L
98F6 SRL A
98F8 SRL A
98FA LD L,H
98FB SLA L
98FD LD H,$FE $FE00 - table of even screen lines addresses
98FF ADD A,(HL)
9900 INC L
9901 LD H,(HL)
This entry point is used by the routine at EF37.
9902 LD L,A
9903 RET
9904: DOWN HL - move HL to the next screen line
Used by the routine at 98DC.
Input
HL Screen address
Output
HL Screen address one line down
Advances screen address HL down one pixel line, crossing character-cell and screen-third boundaries as needed.
9904 INC H
9905 LD A,H
9906 AND $07 Same character cell? return
9908 RET NZ
9909 LD A,L
990A ADD A,$20 Step down a character row
990C LD L,A
990D RET C
990E LD A,H
990F SUB $08 Cross into next third
9911 LD H,A
9912 RET
9913: UP HL
Used by the routine at 98DF.
Input
HL Screen address
Output
HL Screen address one line up
Moves screen address HL up one pixel line, crossing character-cell and screen-third boundaries as needed.
9913 LD A,H
9914 DEC H
9915 AND $07 Same character cell? return
9917 RET NZ
9918 LD A,L
9919 SUB $20 Step up a character row
991B LD L,A
991C RET C
991D LD A,H
991E ADD A,$08 Cross into previous third
9920 LD H,A
9921 RET
9922: Update object IX position, clip to screen, dispatch sprite draw
Used by the routine at 98D0.
Input
IX Address of the 20-byte object record
Prepares and draws an object's sprite. It marks the object active, takes its pending position, and rejects it if the sprite or its clip window falls off screen; otherwise it resolves the sprite address, promotes the queued next frame into place, and picks the on-screen or off-screen blitter.
9922 SET 5,(IX+$0B) Mark record draw-active (+$0B bit 5)
9926 LD D,(IX+$04)
9929 LD E,(IX+$00)
992C LD (IX+$00),D
992F LD A,D
9930 ADD A,$02 Reject object past right/bottom edge
9932 CP $22
9934 JR C,$993E
9936 LD A,E
9937 ADD A,$02
9939 CP $22
993B JP NC,$9FDE => Finish sprite off-screen
993E LD B,(IX+$05) Take the object height and row
9941 LD C,(IX+$01)
9944 LD A,(IX+$08) Clip window top, less the height
9947 SUB (IX+$0A)
994A CP B Above the window? try the lower edge
994B JP M,$9952
994E CP C Below it? nothing to draw
994F JP P,$9FE2
9952 LD A,(IX+$09)
9955 CP B
9956 JP P,$995D
9959 CP C
995A JP M,$9FDE => Finish sprite off-screen
995D EXX Frame index (IX+$02) * 2 into A
995E LD A,(IX+$02)
9961 ADD A,A
9962 ADD A,$E2 lo byte of $98E2
9964 BIT 2,(IX+$0B) Flipped? add 1 to the frame index
9968 JR Z,$996B
996A INC A
996B LD L,A Look it up in the low-byte table
996C LD H,$98
996E LD L,(HL)
996F LD A,(IX+$03) Sprite page = (IX+$03) + $A0
9972 ADD A,$A0
9974 LD H,A
9975 EXX
9976 LD A,(IX+$06) Copy new frame (IX+$06) into (IX+$02) for next draw
9979 LD (IX+$02),A
997C ADD A,A New frame index * 2 into A
997D ADD A,$E2
997F BIT 2,(IX+$0B) Flipped? add 1 to the frame index
9983 JR Z,$9986
9985 INC A
9986 LD L,A Look it up in the low-byte table
9987 LD H,$98
9989 LD L,(HL)
998A LD A,(IX+$07) Store new sub-frame, sprite page = (IX+$07) + $A0
998D LD (IX+$03),A
9990 ADD A,$A0
9992 LD H,A
9993 LD A,D
9994 CP $1E Off-screen blit if past column $1E
9996 JP NC,$9B61 => Set up sprite erase, dispatch to erase-blit variant
9999 LD A,E
999A CP $1E
999C JP NC,$9B61 => Set up sprite erase, dispatch to erase-blit variant
999F LD A,(IX+$08)
99A2 DEC A
99A3 CP B
99A4 JP P,$9F1D => Off-screen sprite draw
99A7 CP C
99A8 JP P,$9F1D => Off-screen sprite draw
99AB PUSH HL
99AC LD H,(IX+$01)
99AF LD A,(IX+$05)
99B2 CP H
99B3 JR NC,$99B6
99B5 LD H,A
99B6 LD A,(IX+$09)
99B9 SUB H
99BA INC A
99BB EX AF,AF'
99BC LD A,D
99BD LD L,H
99BE SLA L
99C0 LD H,$FE $FE00 - table of even screen lines addresses
99C2 ADD A,(HL)
99C3 INC L
99C4 LD H,(HL)
99C5 LD L,A
99C6 LD A,D
99C7 SUB E
99C8 EX DE,HL
99C9 POP HL
99CA EXX
99CB EX AF,AF'
99CC LD E,A
99CD OR A
99CE EX AF,AF'
99CF LD ($FD82),SP Point SP at the screen address
99D3 LD SP,HL
99D4 LD A,(IX+$01) Take the clip flag, width $00
99D7 LD C,$00
99D9 JP C,$9AE6 => Clip wide sprite edge, dispatch to masked blit
99DC JP NZ,$9A6E => Clip sprite edge, dispatch to masked blit
99DF SUB (IX+$05)
99E2 JR Z,$99F3
99E4 LD HL,$99F3
99E7 LD B,A
99E8 LD C,A
99E9 JP NC,$9EDF => Unmasked-OR blit, draws opaque sprite row across screen thirds
99EC NEG
99EE LD B,A
99EF LD C,A
99F0 JP $9E98 => Masked-OR blit variant, draws sprite row across screen thirds
99F3 LD A,(IX+$0A) Row loop: height = (IX+$0A) - C
99F6 SUB C
99F7 LD B,A
99F8 LD HL,$9A46
99FB EXX Blit masked row (AND mask, OR graphic) across thirds
99FC POP BC Take a mask word
99FD LD A,(DE) #0 column 0, upper line
99FE CPL
99FF OR C
9A00 CPL
9A01 OR (HL)
9A02 LD (DE),A
9A03 INC L
9A04 INC E
9A05 LD A,(DE) #1 column 1, upper line
9A06 CPL
9A07 OR B
9A08 CPL
9A09 OR (HL)
9A0A LD (DE),A
9A0B INC L
9A0C INC E
9A0D POP BC Take the next mask word
9A0E LD A,(DE) #2 column 2, upper line
9A0F CPL
9A10 OR C
9A11 CPL
9A12 OR (HL)
9A13 LD (DE),A
9A14 INC L
9A15 INC D
9A16 LD A,(DE) #3 column 2, lower line
9A17 CPL
9A18 OR B
9A19 CPL
9A1A OR (HL)
9A1B LD (DE),A
9A1C INC L
9A1D DEC E
9A1E POP BC Take the last mask word
9A1F LD A,(DE) #4 column 1, lower line
9A20 CPL
9A21 OR C
9A22 CPL
9A23 OR (HL)
9A24 LD (DE),A
9A25 INC L
9A26 DEC E
9A27 LD A,(DE) #5 column 0, lower line
9A28 CPL
9A29 OR B
9A2A CPL
9A2B OR (HL)
9A2C LD (DE),A
9A2D INC L
9A2E INC D
9A2F LD A,D Advance to next pixel line, handle third wrap
9A30 AND $07
9A32 JR NZ,$9A3E
9A34 LD A,E
9A35 ADD A,$20
9A37 LD E,A
9A38 JR C,$9A3E
9A3A LD A,D
9A3B SUB $08
9A3D LD D,A
9A3E EXX
9A3F DEC E
9A40 JP Z,$9FF5 => Blit finish
9A43 DJNZ $99FB
9A45 JP (HL)
9A46: Blit continuation: draw remaining sprite width
Input
IX Address of the 20-byte object record
Advances the screen line, then draws the remaining sprite-width segment (IX+$05 - IX+$01) through the unmasked or masked blit before committing the width and restoring SP.
9A46 EXX
9A47 EX AF,AF'
9A48 LD A,E Carry vertical offset into E
9A49 ADC A,$00
9A4B LD E,A
9A4C EXX
9A4D LD A,(IX+$05) Remaining width = (IX+$05) - (IX+$01)
9A50 LD L,(IX+$01)
9A53 SUB L
9A54 JR Z,$9A63
9A56 LD HL,$9A63
9A59 LD B,A
9A5A JP NC,$9EDF => Unmasked-OR blit, draws opaque sprite row across screen thirds
9A5D NEG
9A5F LD B,A
9A60 JP $9E98 => Masked-OR blit variant, draws sprite row across screen thirds
This entry point is used by the routines at 9E98 and 9EDF.
9A63 LD A,(IX+$05) Commit drawn width (IX+$01 = IX+$05)
9A66 LD (IX+$01),A
9A69 LD SP,($FD82) Restore SP
9A6D RET
9A6E: Clip sprite edge, dispatch to masked blit
Used by the routine at 9922.
Input
IX Address of the 20-byte object record
A Remaining sprite width
DE Screen address
Handles a sprite straddling a screen-third boundary, sending the visible part to the plain blitter and any overhang through the masked path before both continue into the row blit.
9A6E SUB (IX+$05) Compare sprite width to clip limit
9A71 JR Z,$9A8A
9A73 LD HL,$9A8A On-screen: save entry point, split width
9A76 LD B,A
9A77 LD C,A
9A78 JP NC,$9EDF => Unmasked-OR blit, draws opaque sprite row across screen thirds
9A7B EXX
9A7C DEC E
9A7D EXX
9A7E LD HL,$9A8D Off-left: take the masked path
9A81 NEG Negate the overhang width
9A83 LD B,A
9A84 LD C,A
9A85 SCF Mark clip type, dispatch to masked blit
9A86 EX AF,AF'
9A87 JP $9E98 => Masked-OR blit variant, draws sprite row across screen thirds
9A8A EXX
9A8B DEC E
9A8C EXX
9A8D LD A,(IX+$0A) Row byte count from the sprite width
9A90 SUB C
9A91 LD B,A
9A92 LD HL,$9A46
9A95 EXX Take a mask word
9A96 POP BC
9A97 LD A,(DE) #0 column 0, upper line (mask only)
9A98 CPL
9A99 OR C
9A9A CPL
9A9B LD (DE),A
9A9C INC E
9A9D LD A,(DE) #1 column 1, upper line
9A9E CPL
9A9F OR B
9AA0 CPL
9AA1 OR (HL)
9AA2 LD (DE),A
9AA3 INC L
9AA4 INC E
9AA5 POP BC Take the next mask word
9AA6 LD A,(DE) #2 column 2, upper line
9AA7 CPL
9AA8 OR C
9AA9 CPL
9AAA OR (HL)
9AAB LD (DE),A
9AAC INC L
9AAD INC E
9AAE LD A,(DE) #3 column 3, upper line (graphic only)
9AAF OR (HL)
9AB0 LD (DE),A
9AB1 INC L
9AB2 INC D
9AB3 LD A,(DE) #4 column 3, lower line (graphic only)
9AB4 OR (HL)
9AB5 LD (DE),A
9AB6 INC L
9AB7 DEC E
9AB8 LD A,(DE) #5 column 2, lower line
9AB9 CPL
9ABA OR B
9ABB CPL
9ABC OR (HL)
9ABD LD (DE),A
9ABE INC L
9ABF DEC E
9AC0 POP BC Take the last mask word
9AC1 LD A,(DE) #6 column 1, lower line
9AC2 CPL
9AC3 OR C
9AC4 CPL
9AC5 OR (HL)
9AC6 LD (DE),A
9AC7 INC L
9AC8 DEC E
9AC9 LD A,(DE) #7 column 0, lower line (mask only)
9ACA CPL
9ACB OR B
9ACC CPL
9ACD LD (DE),A
9ACE INC D
9ACF LD A,D Cross into the next screen third
9AD0 AND $07
9AD2 JR NZ,$9ADE
9AD4 LD A,E Advance to the next screen row
9AD5 ADD A,$20
9AD7 LD E,A
9AD8 JR C,$9ADE
9ADA LD A,D
9ADB SUB $08
9ADD LD D,A
9ADE EXX
9ADF DEC E
9AE0 JP Z,$9FF5 => Blit finish
9AE3 DJNZ $9A95
9AE5 JP (HL)
9AE6: Clip wide sprite edge, dispatch to masked blit
Used by the routine at 9922.
Input
IX Address of the 20-byte object record
A Remaining sprite width
DE Screen address
The same clipping decision as its narrower sibling, but for the wide masked blit: the visible part goes to the plain blitter, an overhang to the masked one.
9AE6 SUB (IX+$05) Compare width to clip limit
9AE9 JR Z,$9B08
9AEB LD HL,$9B08
9AEE LD B,A
9AEF LD C,A
9AF0 EX AF,AF'
9AF1 SCF
9AF2 EX AF,AF'
9AF3 JP NC,$9EDF => Unmasked-OR blit, draws opaque sprite row across screen thirds
9AF6 NEG Negate off-left overhang
9AF8 LD B,A
9AF9 LD C,A
9AFA EXX
9AFB INC E
9AFC EXX
9AFD OR A
9AFE EX AF,AF'
9AFF LD HL,$9B05 Off-left: masked path
9B02 JP $9E98 => Masked-OR blit variant, draws sprite row across screen thirds
9B05: Masked blit: four-column band, serpentine
Input
IX Address of the 20-byte object record
DE Screen address
C Left-clip offset
Draws a masked sprite four columns wide, clearing the background under it before laying the graphic on top. It sweeps left to right along one pixel line and back along the next, and the mask reaches a column further than the graphic so the sprite's trailing edge is cut cleanly.
9B05 EXX Adjust column, dispatch entry
9B06 DEC E
9B07 EXX
This entry point is used by the routine at 9AE6.
9B08 LD A,(IX+$0A) Row count = (IX+$0A) - C
9B0B SUB C
9B0C LD B,A
9B0D LD HL,$9A46 Continuation address for the next segment
9B10 EXX Swap to the graphic pointer
9B11 POP BC Take a mask word
9B12 LD A,(DE) Leftmost column: plain OR, no mask
9B13 OR (HL)
9B14 LD (DE),A
9B15 INC L
9B16 INC E
9B17 LD A,(DE) Screen byte masked clear
9B18 CPL
9B19 OR C
9B1A CPL OR in the graphic, store
9B1B OR (HL)
9B1C LD (DE),A
9B1D INC L
9B1E INC E
9B1F LD A,(DE)
9B20 CPL
9B21 OR B
9B22 CPL
9B23 OR (HL)
9B24 LD (DE),A
9B25 INC L
9B26 INC E
9B27 POP BC Take the next mask word
9B28 LD A,(DE) Right edge byte masked clear
9B29 CPL
9B2A OR C
9B2B CPL Store it, no graphic to OR in
9B2C LD (DE),A
9B2D INC D Step down a pixel line
9B2E LD A,(DE)
9B2F CPL
9B30 OR B
9B31 CPL
9B32 LD (DE),A
9B33 DEC E
9B34 POP BC Take the third mask word
9B35 LD A,(DE) #5 column 2, lower line
9B36 CPL
9B37 OR C
9B38 CPL
9B39 OR (HL)
9B3A LD (DE),A
9B3B INC L
9B3C DEC E
9B3D LD A,(DE) #6 column 1, lower line
9B3E CPL
9B3F OR B
9B40 CPL
9B41 OR (HL)
9B42 LD (DE),A
9B43 INC L
9B44 DEC E
9B45 LD A,(DE) Leftmost column again: plain OR
9B46 OR (HL)
9B47 LD (DE),A
9B48 INC D
9B49 INC L Advance column, check wrap point
9B4A LD A,D
9B4B AND $07
9B4D JR NZ,$9B59
9B4F LD A,E Wrap to next screen third if needed
9B50 ADD A,$20
9B52 LD E,A
9B53 JR C,$9B59
9B55 LD A,D
9B56 SUB $08
9B58 LD D,A
9B59 EXX
9B5A DEC E Count down the segments
9B5B JP Z,$9FF5 => Blit finish
9B5E DJNZ $9B10 Loop the rows
9B60 JP (HL) Continue with the next segment
9B61: Set up sprite erase, dispatch to erase-blit variant
Used by the routine at 9922.
Input
IX Address of the 20-byte object record
A Row coordinate
Sets up erasing a sprite: it clips the sprite to the object's bounds, works out where it sits on screen and picks the erase routine matching its width, queueing the redraw pass to run afterwards.
9B61 PUSH DE
9B62 PUSH HL
9B63 OR A
9B64 JP P,$9BCB => Set up sprite erase (positive path), dispatch to erase-blit
9B67 LD HL,$9B97
9B6A PUSH HL
9B6B LD A,C
9B6C LD C,B
9B6D DEC A
9B6E CP (IX+$09) Clip against upper bound (IX+$09)
9B71 RET P
9B72 ADD A,(IX+$0A)
9B75 CP (IX+$08) Clip against lower bound (IX+$08)
9B78 RET M
9B79 SUB (IX+$0A)
9B7C INC A
9B7D LD B,$00
9B7F CALL $9C23 Compute screen address for sprite row via IX object
9B82 LD A,E
9B83 CP $02 Pick erase variant by third span
9B85 JR C,$9B90
9B87 INC A
9B88 JP Z,$9CB1 => Erase sprite
9B8B INC A
9B8C RET NZ
9B8D JP $9CED => Erase sprite variant
9B90 EXX
9B91 ADD A,E
9B92 LD E,A
9B93 EXX
9B94 JP $9C6B => Erase sprite
9B97: Second pass: redraw sprite via unmasked-OR blit
Input
IX Address of the 20-byte object record
C Row coordinate
The redraw pass that follows the erase, re-clipping the sprite and picking the draw routine matching its width.
9B97 EXX
9B98 POP HL
9B99 EXX
9B9A POP DE
9B9B LD HL,$9FEE
9B9E PUSH HL
9B9F LD A,C
9BA0 DEC A
9BA1 CP (IX+$09) Clip against upper bound (IX+$09)
9BA4 RET P
9BA5 ADD A,(IX+$0A)
9BA8 CP (IX+$08) Clip against lower bound (IX+$08)
9BAB RET M
9BAC SUB (IX+$0A)
9BAF INC A
9BB0 LD B,$00
9BB2 CALL $9C23 Compute screen address for sprite row via IX object
9BB5 LD E,D
9BB6 LD A,E
9BB7 CP $02 Pick draw variant by third span
9BB9 JR C,$9BC4
9BBB INC A
9BBC JP Z,$9DCC => Unmasked-OR blit variant
9BBF INC A
9BC0 RET NZ
9BC1 JP $9E03 => Unmasked-OR blit variant
9BC4 EXX
9BC5 ADD A,E
9BC6 LD E,A
9BC7 EXX
9BC8 JP $9D8D => Unmasked-OR blit variant, draws opaque sprite row across screen thirds
9BCB: Set up sprite erase (positive path), dispatch to erase-blit
Used by the routine at 9B61.
Input
IX Address of the 20-byte object record
C Row coordinate
Erase setup for the other coordinate branch, doing the same clipping and dispatch as its sibling with its own redraw pass queued behind it.
9BCB LD HL,$9BF5
9BCE PUSH HL
9BCF LD A,C
9BD0 LD C,B
9BD1 DEC A
9BD2 CP (IX+$09) Clip against upper bound (IX+$09)
9BD5 RET P
9BD6 ADD A,(IX+$0A)
9BD9 CP (IX+$08) Clip against lower bound (IX+$08)
9BDC RET M
9BDD SUB (IX+$0A)
9BE0 INC A
9BE1 LD B,E
9BE2 CALL $9C23 Compute screen address for sprite row via IX object
9BE5 LD A,E
9BE6 CP $20 Pick erase variant by third span
9BE8 RET NC
9BE9 SUB $1F
9BEB JP Z,$9D5B => Erase sprite variant
9BEE INC A
9BEF JP Z,$9D1F => Erase sprite
9BF2 JP $9C6B => Erase sprite
9BF5: Second pass (positive path): redraw via unmasked-OR blit
Input
IX Address of the 20-byte object record
C Row coordinate
The redraw pass for that branch, re-clipping the sprite and picking the draw routine matching its width.
9BF5 EXX
9BF6 POP HL
9BF7 EXX
9BF8 POP DE
9BF9 LD HL,$9FEE
9BFC PUSH HL
9BFD LD E,D
9BFE LD A,C
9BFF DEC A
9C00 CP (IX+$09) Clip against upper bound (IX+$09)
9C03 RET P
9C04 ADD A,(IX+$0A)
9C07 CP (IX+$08) Clip against lower bound (IX+$08)
9C0A RET M
9C0B SUB (IX+$0A)
9C0E INC A
9C0F LD B,E
9C10 CALL $9C23 Compute screen address for sprite row via IX object
9C13 LD A,E
9C14 CP $20 Pick draw variant by third span
9C16 RET NC
9C17 SUB $1F
9C19 JP Z,$9E69 => Unmasked-OR blit variant
9C1C INC A
9C1D JP Z,$9E32 => Unmasked-OR blit variant
9C20 JP $9D8D => Unmasked-OR blit variant, draws opaque sprite row across screen thirds
9C23: Compute screen address for sprite row via IX object
Used by the routines at 9B61, 9B97, 9BCB and 9BF5.
Input
IX Address of the 20-byte object record
A Top row of the sprite
B Column byte offset
Output
DE Screen draw address
B Visible sprite height
Works out where a sprite starts on screen and how much of it is visible, trimming the height at the lower bound. A sprite whose top is off screen has the hidden rows skipped and its data advanced to match.
9C23 CP (IX+$08) Row above the clip bound?
9C26 JP M,$9C47
9C29 LD L,A
9C2A EX AF,AF'
9C2B SLA L
9C2D LD H,$FE $FE00 - table of even screen lines addresses
9C2F LD A,(HL) Add the row offset
9C30 ADD A,B
9C31 INC L Take the high byte
9C32 LD H,(HL)
9C33 LD L,A
9C34 PUSH HL
9C35 EXX
9C36 POP DE
9C37 EX AF,AF'
9C38 LD B,(IX+$0A) Sprite height into B
9C3B SUB (IX+$09)
9C3E NEG
9C40 CP B Trim if it runs past the bound
9C41 JR NC,$9C45
9C43 INC A
9C44 LD B,A
9C45 EXX
9C46 RET
9C47 ADD A,(IX+$0A) Off the top: rows hidden
9C4A SUB (IX+$08)
9C4D EXX
9C4E LD B,A
9C4F LD A,(IX+$0A)
9C52 SUB B
9C53 LD E,A
9C54 ADD A,A Column doubled twice
9C55 ADD A,E
9C56 ADD A,A Added into the pointer
9C57 ADD A,L
9C58 LD L,A
9C59 EX DE,HL
9C5A LD L,(IX+$08) Screen line at the clip edge
9C5D SLA L
9C5F LD H,$FE $FE00 - table of even screen lines addresses
9C61 LD A,(HL)
9C62 INC L
9C63 EXX
9C64 ADD A,B
9C65 EXX
9C66 LD H,(HL)
9C67 LD L,A
9C68 EX DE,HL
9C69 EXX
9C6A RET
9C6B: Erase sprite: AND-mask bytes off screen, SP walks data as pointer
Used by the routines at 9B61 and 9BCB.
Input
HL Mask-data pointer
DE Screen address
B Row count
Erases a six-cell-wide sprite, rubbing its footprint out a row at a time with the stack walking the mask data.
9C6B LD ($FD82),SP Save SP, aim it at the mask data
9C6F EXX
9C70 LD SP,HL
9C71 EX DE,HL
9C72 POP DE #0 clear one column byte
9C73 LD A,E
9C74 CPL
9C75 AND (HL)
9C76 LD (HL),A
9C77 INC L
9C78 LD A,D
9C79 CPL #1 clear the paired byte
9C7A AND (HL)
9C7B LD (HL),A
9C7C INC L
9C7D POP DE
9C7E LD A,E
9C7F CPL
9C80 AND (HL)
9C81 LD (HL),A
9C82 INC H
9C83 LD A,D #2 clear a third byte
9C84 CPL
9C85 AND (HL)
9C86 LD (HL),A
9C87 DEC L
9C88 POP DE #3 clear the fourth byte, next line
9C89 LD A,E
9C8A CPL
9C8B AND (HL)
9C8C LD (HL),A
9C8D DEC L
9C8E LD A,D #4 clear the fifth and sixth bytes
9C8F CPL
9C90 AND (HL)
9C91 LD (HL),A
9C92 INC H
9C93 LD A,H Check screen third boundary
9C94 AND $07
9C96 JR NZ,$9CA2
9C98 LD A,L
9C99 ADD A,$20
9C9B LD L,A
9C9C LD A,H Wrap to next screen third if needed
9C9D JR C,$9CAA
9C9F SUB $08
9CA1 LD H,A
9CA2 DJNZ $9C72 Loop the columns
9CA4 EXX
9CA5 LD SP,($FD82)
9CA9 RET
9CAA AND $18
9CAC JP PO,$9CA2
9CAF JR $9CA4
9CB1: Erase sprite: AND-mask bytes off screen, SP walks data as pointer
Used by the routine at 9B61.
Input
HL Mask-data pointer
DE Screen address
B Row count
Erases a three-cell-wide sprite, rubbing its footprint out a row at a time with the stack walking the mask data.
9CB1 LD ($FD82),SP Save SP, repurpose as mask-data pointer
9CB5 EXX
9CB6 LD SP,HL
9CB7 EX DE,HL
9CB8 POP DE #0 clear one column byte
9CB9 LD A,D
9CBA CPL
9CBB AND (HL)
9CBC LD (HL),A
9CBD INC L
9CBE POP DE
9CBF LD A,E #1 clear the paired byte
9CC0 CPL
9CC1 AND (HL)
9CC2 LD (HL),A
9CC3 INC H
9CC4 LD A,D
9CC5 CPL
9CC6 AND (HL)
9CC7 LD (HL),A
9CC8 DEC L
9CC9 POP DE #2 clear a third byte
9CCA LD A,E
9CCB CPL
9CCC AND (HL)
9CCD LD (HL),A
9CCE INC H
9CCF LD A,H Check screen third boundary
9CD0 AND $07
9CD2 JR NZ,$9CDE
9CD4 LD A,L
9CD5 ADD A,$20
9CD7 LD L,A
9CD8 LD A,H Wrap to next screen third if needed
9CD9 JR C,$9CE6
9CDB SUB $08
9CDD LD H,A
9CDE DJNZ $9CB8 Loop next row
9CE0 EXX
9CE1 LD SP,($FD82) Restore SP
9CE5 RET
9CE6 AND $18
9CE8 JP PO,$9CDE
9CEB JR $9CE0
9CED: Erase sprite variant: AND-mask 2 bytes per column via SP
Used by the routine at 9B61.
Input
HL Mask-data pointer
DE Screen address
B Row count
Erases a sprite two cells per row, with the stack walking the mask data.
9CED LD ($FD82),SP Save SP, repurpose as mask-data pointer
9CF1 EXX
9CF2 LD SP,HL
9CF3 EX DE,HL
9CF4 POP DE
9CF5 POP DE
9CF6 LD A,E #0 clear one column byte
9CF7 CPL
9CF8 AND (HL)
9CF9 LD (HL),A
9CFA INC H
9CFB LD A,D Clear the paired byte
9CFC CPL
9CFD AND (HL)
9CFE LD (HL),A
9CFF POP DE
9D00 INC H
9D01 LD A,H Check screen third boundary
9D02 AND $07
9D04 JR NZ,$9D10
9D06 LD A,L
9D07 ADD A,$20
9D09 LD L,A
9D0A LD A,H
9D0B JR C,$9D18
9D0D SUB $08
9D0F LD H,A
9D10 DJNZ $9CF4 Loop next row
9D12 EXX
9D13 LD SP,($FD82) Restore SP
9D17 RET
9D18 AND $18
9D1A JP PO,$9D10
9D1D JR $9D12
9D1F: Erase sprite: AND-mask bytes off screen, SP walks data as pointer
Used by the routine at 9BCB.
Input
HL Mask-data pointer
DE Screen address
B Row count
Erases a three-cell-wide sprite in a different cell order to its sibling, with the stack walking the mask data.
9D1F LD ($FD82),SP Save SP, repurpose as mask-data pointer
9D23 EXX
9D24 LD SP,HL
9D25 EX DE,HL
9D26 POP DE #0 clear one column byte
9D27 LD A,E
9D28 CPL
9D29 AND (HL)
9D2A LD (HL),A
9D2B INC L
9D2C LD A,D
9D2D CPL #1 clear the paired byte
9D2E AND (HL)
9D2F LD (HL),A
9D30 POP DE
9D31 INC H
9D32 POP DE
9D33 LD A,E
9D34 CPL
9D35 AND (HL)
9D36 LD (HL),A
9D37 DEC L #2 clear a third byte
9D38 LD A,D
9D39 CPL
9D3A AND (HL)
9D3B LD (HL),A
9D3C INC H
9D3D LD A,H Check screen third boundary
9D3E AND $07
9D40 JR NZ,$9D4C
9D42 LD A,L
9D43 ADD A,$20
9D45 LD L,A
9D46 LD A,H Wrap to next screen third if needed
9D47 JR C,$9D54
9D49 SUB $08
9D4B LD H,A
9D4C DJNZ $9D26 Loop next row
9D4E EXX
9D4F LD SP,($FD82) Restore SP
9D53 RET
9D54 AND $18
9D56 JP PO,$9D4C
9D59 JR $9D4E
9D5B: Erase sprite variant: AND-mask row bytes via SP
Used by the routine at 9BCB.
Input
HL Mask-data pointer
DE Screen address
B Row count
Erases a narrow sprite two cells per row, the smallest of the erase variants.
9D5B LD ($FD82),SP Save SP, repurpose as mask-data pointer
9D5F EXX
9D60 LD SP,HL
9D61 EX DE,HL
9D62 POP DE
9D63 LD A,E #0 clear one screen byte
9D64 CPL
9D65 AND (HL)
9D66 LD (HL),A
9D67 POP DE
9D68 INC H
9D69 POP DE
9D6A LD A,D #1 clear the paired byte
9D6B CPL
9D6C AND (HL)
9D6D LD (HL),A
9D6E INC H
9D6F LD A,H Check screen third boundary
9D70 AND $07
9D72 JR NZ,$9D7E
9D74 LD A,L
9D75 ADD A,$20
9D77 LD L,A
9D78 LD A,H
9D79 JR C,$9D86
9D7B SUB $08
9D7D LD H,A
9D7E DJNZ $9D62 Loop next row
9D80 EXX
9D81 LD SP,($FD82) Restore SP
9D85 RET
9D86 AND $18
9D88 JP PO,$9D7E
9D8B JR $9D80
9D8D: Unmasked-OR blit variant, draws opaque sprite row across screen thirds
Used by the routines at 9B97 and 9BF5.
Input
HL Sprite-data pointer
DE Screen address
B Row count
Draws an opaque sprite straight over whatever lies beneath it, with the stack walking the sprite data.
9D8D LD ($FD82),SP Save SP, repurpose as sprite-data pointer
9D91 EXX
9D92 LD SP,HL
9D93 POP HL #0 OR sprite byte, first third
9D94 LD A,(DE)
9D95 OR L
9D96 LD (DE),A
9D97 INC E
9D98 LD A,(DE)
9D99 OR H
9D9A LD (DE),A
9D9B INC E
9D9C POP HL #1 OR sprite byte, second third
9D9D LD A,(DE)
9D9E OR L
9D9F LD (DE),A
9DA0 INC D
9DA1 LD A,(DE)
9DA2 OR H
9DA3 LD (DE),A
9DA4 DEC E
9DA5 POP HL
9DA6 LD A,(DE) #2 OR sprite byte, third third
9DA7 OR L
9DA8 LD (DE),A
9DA9 DEC E
9DAA LD A,(DE)
9DAB OR H
9DAC LD (DE),A
9DAD INC D
9DAE LD A,D Check screen third boundary
9DAF AND $07
9DB1 JR NZ,$9DBD
9DB3 LD A,E
9DB4 ADD A,$20
9DB6 LD E,A
9DB7 LD A,D Wrap to next screen third if needed
9DB8 JR C,$9DC5
9DBA SUB $08
9DBC LD D,A
9DBD DJNZ $9D93 Loop next row
9DBF EXX
9DC0 LD SP,($FD82) Restore SP
9DC4 RET
9DC5 AND $18
9DC7 JP PO,$9DBD
9DCA JR $9DBF
9DCC: Unmasked-OR blit variant: 2 bytes per column via SP
Used by the routine at 9B97.
Two-column version of the opaque blitter, ORing the sprite straight onto the screen and working across and back on alternate pixel lines.
9DCC LD ($FD82),SP
9DD0 EXX
9DD1 LD SP,HL
9DD2 POP HL #0 OR sprite byte into one column byte
9DD3 LD A,(DE)
9DD4 OR H
9DD5 LD (DE),A
9DD6 INC E
9DD7 POP HL
9DD8 LD A,(DE) OR sprite byte into paired byte
9DD9 OR L
9DDA LD (DE),A
9DDB INC D
9DDC LD A,(DE)
9DDD OR H
9DDE LD (DE),A
9DDF DEC E
9DE0 POP HL
9DE1 LD A,(DE)
9DE2 OR L
9DE3 LD (DE),A
9DE4 INC D
9DE5 LD A,D Check screen third boundary
9DE6 AND $07
9DE8 JR NZ,$9DF4
9DEA LD A,E Advance to the next screen row
9DEB ADD A,$20
9DED LD E,A
9DEE LD A,D
9DEF JR C,$9DFC
9DF1 SUB $08
9DF3 LD D,A
9DF4 DJNZ $9DD2 Loop the rows
9DF6 EXX
9DF7 LD SP,($FD82)
9DFB RET
9DFC AND $18
9DFE JP PO,$9DF4
9E01 JR $9DF6
9E03: Unmasked-OR blit variant: one column, 2 lines per pass
Used by the routine at 9B97.
Input
HL Sprite-data pointer
DE Screen address
B Number of pixel-line pairs
Single-column version of the sprite blitter, used when clipping leaves one byte of the sprite showing. Most of each source row is read past and discarded.
9E03 LD ($FD82),SP Save SP, repurpose as sprite-data pointer
9E07 EXX
9E08 LD SP,HL
9E09 POP HL Discard the leading word
9E0A POP HL Take the middle word
9E0B LD A,(DE) #0 OR its low byte into the column
9E0C OR L
9E0D LD (DE),A
9E0E INC D
9E0F LD A,(DE) OR its high byte into the next pixel line
9E10 OR H
9E11 LD (DE),A
9E12 POP HL Discard the trailing word, step a line
9E13 INC D
9E14 LD A,D Check screen third boundary
9E15 AND $07
9E17 JR NZ,$9E23
9E19 LD A,E Advance to the next screen row
9E1A ADD A,$20
9E1C LD E,A
9E1D LD A,D
9E1E JR C,$9E2B
9E20 SUB $08
9E22 LD D,A
9E23 DJNZ $9E09 Loop the pixel-line pairs
9E25 EXX
9E26 LD SP,($FD82) Restore SP
9E2A RET
9E2B AND $18
9E2D JP PO,$9E23
9E30 JR $9E25
9E32: Unmasked-OR blit variant: two columns, serpentine
Used by the routine at 9BF5.
Input
HL Sprite-data pointer
DE Screen address
B Number of pixel-line pairs
Two-column version of the sprite blitter, used when clipping leaves that much of the sprite showing. It works across and back on alternate pixel lines, skipping the parts of each source row it no longer needs.
9E32 LD ($FD82),SP Save SP, repurpose as sprite-data pointer
9E36 EXX
9E37 LD SP,HL
9E38 POP HL #0 OR low byte into the first column
9E39 LD A,(DE)
9E3A OR L
9E3B LD (DE),A
9E3C INC E Step to the adjacent column
9E3D LD A,(DE) OR high byte into the second column
9E3E OR H
9E3F LD (DE),A
9E40 POP HL Discard a word, step down a pixel line
9E41 INC D
9E42 POP HL Take the next word
9E43 LD A,(DE) OR its low byte into the second column
9E44 OR L
9E45 LD (DE),A
9E46 DEC E Back to the first column
9E47 LD A,(DE) OR its high byte into the first column
9E48 OR H
9E49 LD (DE),A
9E4A INC D
9E4B LD A,D Check screen third boundary
9E4C AND $07
9E4E JR NZ,$9E5A
9E50 LD A,E Advance to the next screen row
9E51 ADD A,$20
9E53 LD E,A
9E54 LD A,D
9E55 JR C,$9E62
9E57 SUB $08
9E59 LD D,A
9E5A DJNZ $9E38 Loop the pixel-line pairs
9E5C EXX
9E5D LD SP,($FD82) Restore SP
9E61 RET
9E62 AND $18
9E64 JP PO,$9E5A
9E67 JR $9E5C
9E69: Unmasked-OR blit variant: alternating columns via SP
Used by the routine at 9BF5.
Input
HL Sprite-data pointer
DE Screen address
B Number of pixel-line pairs
Narrowest version of the sprite blitter, for the tightest clipping case. It takes one byte from each end of a source row and skips the rest; which columns of the sprite those are has not been traced.
9E69 LD ($FD82),SP Save SP, repurpose as sprite-data pointer
9E6D EXX
9E6E LD SP,HL
9E6F POP HL Take the low byte of the first word
9E70 LD A,(DE) OR sprite byte into first column
9E71 OR L
9E72 LD (DE),A
9E73 POP HL Skip a word, step down a pixel line
9E74 INC D
9E75 POP HL Take the high byte of the third word
9E76 LD A,(DE) OR sprite byte into second column
9E77 OR H
9E78 LD (DE),A
9E79 INC D
9E7A LD A,D Check screen third boundary
9E7B AND $07
9E7D JR NZ,$9E89
9E7F LD A,E Advance to the next screen row
9E80 ADD A,$20
9E82 LD E,A
9E83 LD A,D
9E84 JR C,$9E91
9E86 SUB $08
9E88 LD D,A
9E89 DJNZ $9E6F Loop the pixel-line pairs
9E8B EXX
9E8C LD SP,($FD82) Restore SP
9E90 RET
9E91 AND $18
9E93 JP PO,$9E89
9E96 JR $9E8B
9E98: Masked-OR blit variant, draws sprite row across screen thirds
Used by the routines at 9922, 9A46, 9A6E, 9AE6 and 9F1D.
Input
DE Screen address of first byte
B Sprite row count
HL Continuation address (jumped to via JP (HL) when done)
Clears a sprite's footprint out of the screen ahead of the graphic being drawn over it, working across the three screen thirds a row at a time.
9E98 EXX
9E99 POP BC #0 AND-mask then OR sprite byte, first third
9E9A LD A,(DE)
9E9B CPL
9E9C OR C
9E9D CPL
9E9E LD (DE),A
9E9F INC E
9EA0 LD A,(DE)
9EA1 CPL
9EA2 OR B
9EA3 CPL
9EA4 LD (DE),A
9EA5 INC E #1 AND-mask then OR sprite byte, second third
9EA6 POP BC
9EA7 LD A,(DE)
9EA8 CPL
9EA9 OR C
9EAA CPL
9EAB LD (DE),A
9EAC INC D
9EAD LD A,(DE)
9EAE CPL
9EAF OR B
9EB0 CPL
9EB1 LD (DE),A
9EB2 DEC E
9EB3 POP BC
9EB4 LD A,(DE) #2 AND-mask then OR sprite byte, third third
9EB5 CPL
9EB6 OR C
9EB7 CPL
9EB8 LD (DE),A
9EB9 DEC E
9EBA LD A,(DE)
9EBB CPL
9EBC OR B
9EBD CPL
9EBE LD (DE),A
9EBF INC D
9EC0 LD A,D Advance column, check wrap point
9EC1 AND $07
9EC3 JR NZ,$9ECF
9EC5 LD A,E Column moves into next third
9EC6 ADD A,$20
9EC8 LD E,A
9EC9 LD A,D Carry says wrap the row too
9ECA JR C,$9ED7
9ECC SUB $08
9ECE LD D,A
9ECF EXX
9ED0 DEC E
9ED1 JP Z,$9FF5 => Blit finish
9ED4 DJNZ $9E98 Loop next sprite row
9ED6 JP (HL) Return via continuation address in HL
9ED7 AND $18
9ED9 JP PO,$9ECF
9EDC JP $9A63
9EDF: Unmasked-OR blit, draws opaque sprite row across screen thirds
Used by the routines at 9922, 9A46, 9A6E, 9AE6 and 9F1D.
Draws an opaque sprite three columns wide, ORing the graphic straight onto the screen with no mask. It works left to right along one pixel line and back along the next, so the sprite data is read in one continuous sweep.
9EDF EXX OR graphic byte into the first column
9EE0 LD A,(DE)
9EE1 OR (HL)
9EE2 LD (DE),A
9EE3 INC L
9EE4 INC E
9EE5 LD A,(DE) #0 OR graphic byte into the second column
9EE6 OR (HL)
9EE7 LD (DE),A
9EE8 INC L
9EE9 INC E
9EEA LD A,(DE)
9EEB OR (HL)
9EEC LD (DE),A
9EED INC L
9EEE INC D
9EEF LD A,(DE) #1 reverse along the next pixel line
9EF0 OR (HL)
9EF1 LD (DE),A
9EF2 INC L
9EF3 DEC E
9EF4 LD A,(DE)
9EF5 OR (HL)
9EF6 LD (DE),A
9EF7 INC L
9EF8 DEC E
9EF9 LD A,(DE)
9EFA OR (HL)
9EFB LD (DE),A
9EFC INC L
9EFD INC D
9EFE LD A,D Advance row, check wrap point
9EFF AND $07
9F01 JR NZ,$9F0D
9F03 LD A,E Column moves into next third
9F04 ADD A,$20
9F06 LD E,A
9F07 LD A,D Carry says wrap the row too
9F08 JR C,$9F15
9F0A SUB $08
9F0C LD D,A
9F0D EXX
9F0E DEC E
9F0F JP Z,$9FF5 => Blit finish
9F12 DJNZ $9EDF
9F14 JP (HL)
9F15 AND $18
9F17 JP PO,$9F0D
9F1A JP $9A63
9F1D: Off-screen sprite draw: clip, compute address, dispatch blit
Used by the routine at 9922.
Draws a sprite running off the left or right edge: clips its width, skips the hidden columns in the sprite data, computes the screen address of the visible part, then hands it to the row blitter.
9F1D PUSH HL Check width against clip limit
9F1E LD ($FD82),SP
9F22 SUB C
9F23 EXX
9F24 INC A Sign check: fully off left/right edge
9F25 JP M,$9F2E
9F28 LD C,A Column times three
9F29 ADD A,A
9F2A ADD A,C
9F2B ADD A,A Doubled again, added into the pointer
9F2C ADD A,L
9F2D LD L,A
9F2E LD SP,HL
9F2F EXX
9F30 LD A,E
9F31 EX AF,AF'
9F32 LD A,C
9F33 EXX
9F34 CP (IX+$08) Clip column against (IX+$08)
9F37 JP P,$9F3D
9F3A LD A,(IX+$08)
9F3D LD C,A
9F3E ADD A,A
9F3F LD L,A
9F40 LD H,$FE $FE00 - table of even screen lines addresses
9F42 EX AF,AF'
9F43 ADD A,(HL) Add the table low byte
9F44 INC L
9F45 LD D,(HL) Take the high byte, restore the low
9F46 LD E,A
9F47 EXX
9F48 LD A,C
9F49 SUB (IX+$08) Width remaining after the clip
9F4C ADD A,(IX+$0A)
9F4F DEC A
9F50 JP M,$9F74
9F53 CP (IX+$0A)
9F56 INC A
9F57 JR C,$9F5C
9F59 LD A,(IX+$0A)
9F5C LD B,A
9F5D EXX
9F5E ADD A,C
9F5F EXX
9F60 DEC A Trim against the vertical bound
9F61 SUB (IX+$09)
9F64 JR C,$9F6C
9F66 JR Z,$9F6C
9F68 NEG
9F6A ADD A,B
9F6B LD B,A
9F6C LD E,$00
9F6E LD HL,$9F74
9F71 JP $9E98 => Masked-OR blit variant, draws sprite row across screen thirds
9F74 LD A,(IX+$08) Other edge: recompute the width
9F77 LD C,(IX+$05) Columns clipped off the left edge
9F7A SUB C
9F7B EXX
9F7C LD C,A
9F7D LD A,$00 Nothing hidden? no data to skip
9F7F JP M,$9F86
9F82 LD A,C Hidden columns times three
9F83 ADD A,A
9F84 ADD A,C Doubled to a byte count
9F85 ADD A,A
9F86 LD SP,($FD82) Reclaim the sprite pointer off the stack
9F8A POP HL
9F8B LD ($FD82),SP
9F8F ADD A,L Skip the hidden columns
9F90 LD L,A
9F91 EXX
9F92 LD A,D Stash the row for later
9F93 EX AF,AF'
9F94 LD A,C
9F95 EXX
9F96 CP (IX+$08) Clamp the start row to the upper bound
9F99 JP P,$9F9F
9F9C LD A,(IX+$08)
9F9F LD C,A
9FA0 ADD A,A Two table entries per row
9FA1 EX DE,HL
9FA2 LD L,A
9FA3 LD H,$FE $FE00 - table of even screen lines addresses
9FA5 EX AF,AF' Look the screen line up in the table
9FA6 ADD A,(HL)
9FA7 INC L
9FA8 LD H,(HL)
9FA9 LD L,A
9FAA EX DE,HL
9FAB EXX
9FAC LD A,C Rows remaining below the start
9FAD SUB (IX+$08)
9FB0 ADD A,(IX+$0A)
9FB3 DEC A Nothing visible? give up
9FB4 JP M,$9FD8
9FB7 CP (IX+$0A) Clamp the height to the sprite
9FBA INC A
9FBB JR C,$9FC0
9FBD LD A,(IX+$0A)
9FC0 LD B,A
9FC1 EXX
9FC2 ADD A,C Where the sprite would end
9FC3 EXX
9FC4 DEC A
9FC5 SUB (IX+$09) Trim anything past the lower bound
9FC8 JR C,$9FD0
9FCA JR Z,$9FD0
9FCC NEG Shorten the height to match
9FCE ADD A,B
9FCF LD B,A
9FD0 LD E,$00 Clear the segment counter
9FD2 LD HL,$9FD8
9FD5 JP $9EDF => Unmasked-OR blit, draws opaque sprite row across screen thirds
9FD8 LD SP,($FD82)
9FDC JR $9FE8
9FDE: Finish sprite off-screen: commit pending fields
Used by the routine at 9922.
Input
IX Address of the 20-byte object record
Finishes an off-screen or clipped sprite without drawing: clears the draw-active flag (+$0B bit 5) and commits the pending frame/page and Y fields (+$06/+$07/+$05) into the current ones (+$02/+$01).
9FDE RES 5,(IX+$0B) Clear draw-active flag
This entry point is used by the routine at 9922.
9FE2 LD A,(IX+$06) Promote next frame into current
9FE5 LD (IX+$02),A
This entry point is used by the routine at 9F1D.
9FE8 LD A,(IX+$07)
9FEB LD (IX+$07),A
9FEE LD A,(IX+$05) Promote next Y into current
9FF1 LD (IX+$01),A
9FF4 RET
9FF5: Blit finish: commit Y position, restore SP
Used by the routines at 9922, 9A6E, 9B05, 9E98 and 9EDF.
Input
IX Address of the 20-byte object record
Blit finish: commits the pending Y position (+$05 into +$01) and restores the real SP saved in $FD82.
9FF5 LD A,(IX+$05) Commit pending Y position
9FF8 LD (IX+$01),A
9FFB LD SP,($FD82) Restore SP
9FFF RET
A000: Sprites of Player and troopers; width 3 height 21
The sprites have no mask; even row bytes go left to right, odd row bytes right to left.
A000 DEFB $03,$D0,$00,$00,$70,$06,$0D,$F0,$00,$00,$F0,$0F,$0F,$F0,$00,$00
A010 DEFB $D8,$17,$3C,$38,$00,$00,$CC,$3F,$1F,$9C,$00,$00,$3C,$1F,$0C,$EC
A020 DEFB $00,$00,$38,$09,$0E,$F0,$00,$00,$F0,$0F,$0F,$E0,$00,$00,$50,$1E
A030 DEFB $2E,$A8,$00,$00,$50,$1F,$2E,$A8,$00,$00,$40,$11,$00,$00,$00,$00
A040 DEFB $00,$F4,$00,$00,$9C,$01,$03,$7C,$00,$00,$FC,$03,$03,$FC,$00,$00
A050 DEFB $F6,$05,$0F,$0E,$00,$00,$F3,$0F,$07,$E7,$00,$00,$CF,$07,$03,$3B
A060 DEFB $00,$00,$4E,$02,$03,$BC,$00,$00,$FC,$03,$03,$F8,$00,$00,$94,$07
A070 DEFB $0B,$AA,$00,$00,$D4,$07,$0B,$AA,$00,$00,$50,$04,$00,$00,$00,$00
A080 DEFB $00,$3D,$00,$00,$67,$00,$00,$DF,$00,$00,$FF,$00,$00,$FF,$00,$80
A090 DEFB $7D,$01,$03,$C3,$80,$C0,$FC,$03,$01,$F9,$C0,$C0,$F3,$01,$00,$CE
A0A0 DEFB $C0,$80,$93,$00,$00,$EF,$00,$00,$FF,$00,$00,$FE,$00,$00,$E5,$01
A0B0 DEFB $02,$EA,$80,$00,$F5,$01,$02,$EA,$80,$00,$14,$01,$00,$00,$00,$00
A0C0 DEFB $00,$0F,$40,$C0,$19,$00,$00,$37,$C0,$C0,$3F,$00,$00,$3F,$C0,$60
A0D0 DEFB $5F,$00,$00,$F0,$E0,$30,$FF,$00,$00,$7E,$70,$F0,$7C,$00,$00,$33
A0E0 DEFB $B0,$E0,$24,$00,$00,$3B,$C0,$C0,$3F,$00,$00,$3F,$80,$40,$79,$00
A0F0 DEFB $00,$BA,$A0,$40,$7D,$00,$00,$BA,$A0,$00,$45,$00,$00,$00,$00,$00
A100 DEFB $00,$00,$00,$00,$C0,$03,$06,$60,$00,$00,$F0,$0D,$0F,$F0,$00,$00
A110 DEFB $F0,$0F,$17,$D8,$00,$00,$28,$3C,$3F,$DC,$00,$00,$9C,$3F,$17,$3C
A120 DEFB $00,$00,$68,$0C,$09,$70,$00,$00,$F0,$0F,$0F,$E0,$00,$00,$E4,$5C
A130 DEFB $2A,$E8,$00,$00,$F4,$55,$2A,$E8,$00,$00,$10,$15,$00,$00,$00,$00
A140 DEFB $00,$00,$00,$00,$F0,$00,$01,$98,$00,$00,$7C,$03,$03,$FC,$00,$00
A150 DEFB $FC,$03,$05,$F6,$00,$00,$0A,$0F,$0F,$F7,$00,$00,$E7,$0F,$05,$CF
A160 DEFB $00,$00,$1A,$03,$02,$5C,$00,$00,$FC,$03,$03,$F8,$00,$00,$39,$17
A170 DEFB $0A,$BA,$00,$00,$7D,$15,$0A,$BA,$00,$00,$44,$05,$00,$00,$00,$00
A180 DEFB $00,$00,$00,$00,$3C,$00,$00,$66,$00,$00,$DF,$00,$00,$FF,$00,$00
A190 DEFB $FF,$00,$01,$7D,$80,$80,$C2,$03,$03,$FD,$C0,$C0,$F9,$03,$01,$73
A1A0 DEFB $C0,$80,$C6,$00,$00,$97,$00,$00,$FF,$00,$00,$FE,$00,$40,$CE,$05
A1B0 DEFB $02,$AE,$80,$40,$5F,$05,$02,$AE,$80,$00,$51,$01,$00,$00,$00,$00
A1C0 DEFB $00,$00,$00,$00,$0F,$00,$00,$19,$80,$C0,$37,$00,$00,$3F,$C0,$C0
A1D0 DEFB $3F,$00,$00,$5F,$60,$A0,$F0,$00,$00,$FF,$70,$70,$FE,$00,$00,$5C
A1E0 DEFB $F0,$A0,$31,$00,$00,$25,$C0,$C0,$3F,$00,$00,$3F,$80,$90,$73,$01
A1F0 DEFB $00,$AB,$A0,$D0,$57,$01,$00,$AB,$A0,$40,$54,$00,$00,$00,$00,$00
A200 DEFB $01,$C0,$00,$00,$60,$02,$05,$F0,$00,$00,$F1,$07,$07,$E3,$00,$00
A210 DEFB $B6,$0B,$1E,$EC,$00,$00,$DA,$19,$13,$FC,$00,$00,$D0,$16,$17,$90
A220 DEFB $00,$00,$70,$0F,$0F,$E4,$00,$00,$FC,$07,$03,$FD,$00,$00,$AA,$07
A230 DEFB $0F,$54,$00,$00,$AA,$0E,$07,$50,$00,$00,$80,$00,$00,$00,$00,$00
A240 DEFB $00,$70,$00,$00,$98,$00,$01,$7C,$00,$40,$FC,$01,$01,$F8,$C0,$80
A250 DEFB $ED,$02,$07,$BB,$00,$80,$76,$06,$04,$FF,$00,$00,$B4,$05,$05,$E4
A260 DEFB $00,$00,$DC,$03,$03,$F9,$00,$00,$FF,$01,$00,$FF,$40,$80,$EA,$01
A270 DEFB $03,$D5,$00,$80,$AA,$03,$01,$D4,$00,$00,$20,$00,$00,$00,$00,$00
A280 DEFB $00,$1C,$00,$00,$26,$00,$00,$5F,$00,$10,$7F,$00,$00,$7E,$30,$60
A290 DEFB $BB,$00,$01,$EE,$C0,$A0,$9D,$01,$01,$3F,$C0,$00,$6D,$01,$01,$79
A2A0 DEFB $00,$00,$F7,$00,$00,$FE,$40,$C0,$7F,$00,$00,$3F,$D0,$A0,$7A,$00
A2B0 DEFB $00,$F5,$40,$A0,$EA,$00,$00,$75,$00,$00,$08,$00,$00,$00,$00,$00
A2C0 DEFB $00,$07,$00,$80,$09,$00,$00,$17,$C0,$C4,$1F,$00,$00,$1F,$8C,$D8
A2D0 DEFB $2E,$00,$00,$7B,$B0,$68,$67,$00,$00,$4F,$F0,$40,$5B,$00,$00,$5E
A2E0 DEFB $40,$C0,$3D,$00,$00,$3F,$90,$F0,$1F,$00,$00,$0F,$F4,$A8,$1E,$00
A2F0 DEFB $00,$3D,$50,$A8,$3A,$00,$00,$1D,$40,$00,$02,$00,$00,$00,$00,$00
A300 DEFB $00,$E0,$00,$00,$30,$01,$02,$F8,$00,$00,$F8,$03,$07,$F2,$00,$00
A310 DEFB $D6,$0B,$0E,$EC,$00,$00,$D8,$1D,$19,$B4,$00,$00,$F8,$1A,$17,$B0
A320 DEFB $00,$00,$30,$0E,$0F,$E0,$00,$00,$C0,$07,$03,$E0,$00,$00,$EA,$01
A330 DEFB $05,$F4,$00,$00,$EA,$0A,$05,$F8,$00,$00,$F0,$00,$00,$00,$00,$00
A340 DEFB $00,$38,$00,$00,$4C,$00,$00,$BE,$00,$00,$FE,$00,$01,$FC,$80,$80
A350 DEFB $F5,$02,$03,$BB,$00,$00,$76,$07,$06,$6D,$00,$00,$BE,$06,$05,$EC
A360 DEFB $00,$00,$8C,$03,$03,$F8,$00,$00,$F0,$01,$00,$F8,$00,$80,$7A,$00
A370 DEFB $01,$7D,$00,$80,$BA,$02,$01,$7E,$00,$00,$3C,$00,$00,$00,$00,$00
A380 DEFB $00,$0E,$00,$00,$13,$00,$00,$2F,$80,$80,$3F,$00,$00,$7F,$20,$60
A390 DEFB $BD,$00,$00,$EE,$C0,$80,$DD,$01,$01,$9B,$40,$80,$AF,$01,$01,$7B
A3A0 DEFB $00,$00,$E3,$00,$00,$FE,$00,$00,$7C,$00,$00,$3E,$00,$A0,$1E,$00
A3B0 DEFB $00,$5F,$40,$A0,$AE,$00,$00,$5F,$80,$00,$0F,$00,$00,$00,$00,$00
A3C0 DEFB $00,$03,$80,$C0,$04,$00,$00,$0B,$E0,$E0,$0F,$00,$00,$1F,$C8,$58
A3D0 DEFB $2F,$00,$00,$3B,$B0,$60,$77,$00,$00,$66,$D0,$E0,$6B,$00,$00,$5E
A3E0 DEFB $C0,$C0,$38,$00,$00,$3F,$80,$00,$1F,$00,$00,$0F,$80,$A8,$07,$00
A3F0 DEFB $00,$17,$D0,$A8,$2B,$00,$00,$17,$E0,$C0,$03,$00,$00,$00,$00,$00
A400 DEFB $01,$C0,$00,$00,$60,$02,$05,$F0,$00,$00,$F0,$07,$0B,$D0,$00,$00
A410 DEFB $18,$27,$73,$E8,$00,$00,$F8,$79,$F4,$D0,$00,$00,$FE,$BF,$FF,$D0
A420 DEFB $00,$00,$B0,$7D,$13,$C0,$00,$00,$E0,$1F,$07,$F0,$00,$00,$60,$07
A430 DEFB $2F,$E8,$00,$00,$D5,$5D,$2F,$28,$00,$00,$50,$17,$00,$00,$00,$00
A440 DEFB $00,$70,$00,$00,$98,$00,$01,$7C,$00,$00,$FC,$01,$02,$F4,$00,$00
A450 DEFB $C6,$01,$0C,$FA,$00,$00,$3C,$1F,$1D,$9A,$00,$C0,$FF,$17,$1F,$7A
A460 DEFB $00,$00,$D2,$0F,$05,$3C,$00,$00,$FF,$07,$03,$FF,$00,$00,$CE,$07
A470 DEFB $0F,$1C,$00,$40,$4F,$1E,$3A,$AA,$80,$00,$55,$1D,$00,$00,$00,$00
A480 DEFB $00,$38,$00,$00,$4C,$00,$00,$BE,$00,$00,$FE,$00,$01,$FA,$00,$00
A490 DEFB $63,$02,$07,$3D,$00,$80,$9F,$07,$0F,$4D,$00,$E0,$FF,$0B,$0F,$DD
A4A0 DEFB $00,$00,$D9,$07,$01,$3F,$00,$00,$FE,$01,$00,$FF,$00,$00,$EF,$01
A4B0 DEFB $07,$E7,$00,$40,$96,$07,$0C,$AF,$20,$80,$53,$05,$00,$00,$00,$00
A4C0 DEFB $00,$0E,$00,$00,$13,$00,$00,$2F,$80,$80,$3F,$00,$00,$3E,$80,$C0
A4D0 DEFB $58,$00,$00,$CF,$40,$C0,$F3,$01,$01,$D9,$A0,$FC,$7F,$01,$00,$F7
A4E0 DEFB $A0,$20,$FD,$00,$00,$53,$C0,$80,$7F,$00,$00,$3F,$80,$80,$3F,$00
A4F0 DEFB $00,$3F,$00,$50,$7D,$00,$00,$9C,$A8,$50,$5E,$00,$00,$00,$00,$00
A500 DEFB $01,$C0,$00,$00,$20,$03,$07,$D0,$00,$00,$F0,$07,$0F,$90,$00,$00
A510 DEFB $10,$1A,$25,$20,$00,$00,$A0,$3B,$3F,$D0,$00,$00,$E8,$1D,$2E,$B0
A520 DEFB $00,$00,$D8,$37,$3D,$8C,$00,$00,$76,$3F,$1F,$80,$00,$00,$80,$2F
A530 DEFB $3B,$E8,$00,$00,$D4,$5D,$2A,$EA,$00,$00,$F4,$14,$00,$00,$00,$00
A540 DEFB $00,$70,$00,$00,$C8,$00,$01,$F4,$00,$00,$FC,$01,$03,$E4,$00,$00
A550 DEFB $84,$06,$09,$48,$00,$00,$E8,$0E,$0F,$F4,$00,$00,$7A,$07,$0B,$AC
A560 DEFB $00,$00,$F6,$0D,$0F,$63,$00,$80,$DD,$0F,$07,$E0,$00,$00,$E0,$0B
A570 DEFB $0E,$FA,$00,$00,$75,$17,$0A,$BA,$80,$00,$3D,$05,$00,$00,$00,$00
A580 DEFB $00,$1C,$00,$00,$32,$00,$00,$7D,$00,$00,$7F,$00,$00,$F9,$00,$00
A590 DEFB $A1,$01,$02,$52,$00,$00,$BA,$03,$03,$FD,$00,$80,$DE,$01,$02,$EB
A5A0 DEFB $00,$80,$7D,$03,$03,$D8,$C0,$60,$F7,$03,$01,$F8,$00,$00,$F8,$02
A5B0 DEFB $03,$BE,$80,$40,$DD,$05,$02,$AE,$A0,$40,$4F,$01,$00,$00,$00,$00
A5C0 DEFB $00,$07,$00,$80,$0C,$00,$00,$1F,$40,$C0,$1F,$00,$00,$3E,$40,$40
A5D0 DEFB $68,$00,$00,$94,$80,$80,$EE,$00,$00,$FF,$40,$A0,$77,$00,$00,$BA
A5E0 DEFB $C0,$60,$DF,$00,$00,$F6,$30,$D8,$FD,$00,$00,$7E,$00,$00,$BE,$00
A5F0 DEFB $00,$EF,$A0,$50,$77,$01,$00,$AB,$A8,$D0,$53,$00,$00,$00,$00,$00
A600 DEFB $03,$80,$00,$00,$40,$06,$0F,$A0,$00,$00,$E0,$0F,$1F,$20,$00,$00
A610 DEFB $20,$1C,$12,$40,$00,$00,$A0,$29,$3B,$D0,$00,$00,$E0,$3E,$1F,$B0
A620 DEFB $00,$00,$98,$3F,$3E,$EC,$00,$00,$80,$1F,$1F,$80,$00,$00,$80,$0F
A630 DEFB $2E,$A8,$00,$00,$D4,$5F,$2E,$AA,$00,$00,$D4,$17,$00,$00,$00,$00
A640 DEFB $00,$E0,$00,$00,$90,$01,$03,$E8,$00,$00,$F8,$03,$07,$C8,$00,$00
A650 DEFB $08,$07,$04,$90,$00,$00,$68,$0A,$0E,$F4,$00,$00,$B8,$0F,$07,$EC
A660 DEFB $00,$00,$E6,$0F,$0F,$BB,$00,$00,$E0,$07,$07,$E0,$00,$00,$E0,$03
A670 DEFB $0B,$AA,$00,$00,$F5,$17,$0B,$AA,$80,$00,$F5,$05,$00,$00,$00,$00
A680 DEFB $00,$38,$00,$00,$64,$00,$00,$FA,$00,$00,$FE,$00,$01,$F2,$00,$00
A690 DEFB $C2,$01,$01,$24,$00,$00,$9A,$02,$03,$BD,$00,$00,$EE,$03,$01,$FB
A6A0 DEFB $00,$80,$F9,$03,$03,$EE,$C0,$00,$F8,$01,$01,$F8,$00,$00,$F8,$00
A6B0 DEFB $02,$EA,$80,$40,$FD,$05,$02,$EA,$A0,$40,$7D,$01,$00,$00,$00,$00
A6C0 DEFB $00,$0E,$00,$00,$19,$00,$00,$3E,$80,$80,$3F,$00,$00,$7C,$80,$80
A6D0 DEFB $70,$00,$00,$49,$00,$80,$A6,$00,$00,$EF,$40,$80,$FB,$00,$00,$7E
A6E0 DEFB $C0,$60,$FE,$00,$00,$FB,$B0,$00,$7E,$00,$00,$7E,$00,$00,$3E,$00
A6F0 DEFB $00,$BA,$A0,$50,$7F,$01,$00,$BA,$A8,$50,$5F,$00,$00,$00,$00,$00
A700 DEFB $00,$00,$00,$00,$C0,$03,$06,$60,$00,$00,$F0,$0D,$0F,$F0,$00,$00
A710 DEFB $18,$18,$34,$2C,$00,$00,$FC,$7B,$6C,$7C,$00,$00,$F8,$3A,$2D,$C0
A720 DEFB $00,$00,$30,$19,$1F,$F0,$00,$00,$F0,$0F,$0F,$F0,$00,$00,$E0,$0F
A730 DEFB $1E,$50,$00,$00,$A8,$2E,$1F,$50,$00,$00,$A8,$2E,$00,$00,$00,$00
A740 DEFB $00,$00,$00,$00,$F0,$00,$01,$98,$00,$00,$7C,$03,$03,$FC,$00,$00
A750 DEFB $06,$06,$0D,$0B,$00,$00,$FF,$1E,$1B,$1F,$00,$00,$BE,$0E,$0B,$70
A760 DEFB $00,$00,$4C,$06,$07,$FC,$00,$00,$FC,$03,$03,$FC,$00,$00,$F8,$03
A770 DEFB $07,$94,$00,$00,$AA,$0B,$07,$D4,$00,$00,$AA,$0B,$00,$00,$00,$00
A780 DEFB $00,$00,$00,$00,$3C,$00,$00,$66,$00,$00,$DF,$00,$00,$FF,$00,$80
A790 DEFB $81,$01,$03,$42,$C0,$C0,$BF,$07,$06,$C7,$C0,$80,$AF,$03,$02,$DC
A7A0 DEFB $00,$00,$93,$01,$01,$FF,$00,$00,$FF,$00,$00,$FF,$00,$00,$FE,$00
A7B0 DEFB $01,$E5,$00,$80,$EA,$02,$01,$F5,$00,$80,$EA,$02,$00,$00,$00,$00
A7C0 DEFB $00,$00,$00,$00,$0F,$00,$00,$19,$80,$C0,$37,$00,$00,$3F,$C0,$60
A7D0 DEFB $60,$00,$00,$D0,$B0,$F0,$EF,$01,$01,$B1,$F0,$E0,$EB,$00,$00,$B7
A7E0 DEFB $00,$C0,$64,$00,$00,$7F,$C0,$C0,$3F,$00,$00,$3F,$C0,$80,$3F,$00
A7F0 DEFB $00,$79,$40,$A0,$BA,$00,$00,$7D,$40,$A0,$BA,$00,$00,$00,$00,$00
A800 DEFB $00,$00,$00,$00,$C0,$03,$06,$60,$00,$00,$F0,$0D,$0F,$F0,$00,$00
A810 DEFB $18,$28,$74,$3C,$00,$00,$DC,$7B,$6C,$F8,$00,$00,$70,$3B,$2D,$C0
A820 DEFB $00,$00,$B0,$19,$1F,$F0,$00,$00,$F0,$1B,$2B,$F8,$00,$00,$E4,$5C
A830 DEFB $2A,$E8,$00,$00,$F4,$55,$2A,$E8,$00,$00,$10,$15,$00,$00,$00,$00
A840 DEFB $00,$00,$00,$00,$F0,$00,$01,$98,$00,$00,$7C,$03,$03,$FC,$00,$00
A850 DEFB $06,$0A,$1D,$0F,$00,$00,$F7,$1E,$1B,$3E,$00,$00,$DC,$0E,$0B,$70
A860 DEFB $00,$00,$6C,$06,$07,$FC,$00,$00,$FC,$06,$0A,$FE,$00,$00,$39,$17
A870 DEFB $0A,$BA,$00,$00,$7D,$15,$0A,$BA,$00,$00,$44,$05,$00,$00,$00,$00
A880 DEFB $00,$00,$00,$00,$3C,$00,$00,$66,$00,$00,$DF,$00,$00,$FF,$00,$80
A890 DEFB $81,$02,$07,$43,$C0,$C0,$BD,$07,$06,$CF,$80,$00,$B7,$03,$02,$DC
A8A0 DEFB $00,$00,$9B,$01,$01,$FF,$00,$00,$BF,$01,$02,$BF,$80,$40,$CE,$05
A8B0 DEFB $02,$AE,$80,$40,$5F,$05,$02,$AE,$80,$00,$51,$01,$00,$00,$00,$00
A8C0 DEFB $00,$00,$00,$00,$0F,$00,$00,$19,$80,$C0,$37,$00,$00,$3F,$C0,$60
A8D0 DEFB $A0,$00,$01,$D0,$F0,$70,$EF,$01,$01,$B3,$E0,$C0,$ED,$00,$00,$B7
A8E0 DEFB $00,$C0,$66,$00,$00,$7F,$C0,$C0,$6F,$00,$00,$AF,$E0,$90,$73,$01
A8F0 DEFB $00,$AB,$A0,$D0,$57,$01,$00,$AB,$A0,$40,$54,$00,$00,$00,$00,$00
A900 DEFB $03,$80,$00,$00,$C0,$04,$0B,$E0,$00,$00,$E0,$0F,$09,$F0,$00,$00
A910 DEFB $78,$08,$04,$FC,$00,$00,$DC,$05,$0A,$FC,$00,$00,$38,$16,$0D,$74
A920 DEFB $00,$00,$EC,$1B,$31,$BC,$00,$00,$FC,$6E,$01,$F8,$00,$00,$F4,$01
A930 DEFB $17,$DC,$00,$00,$BA,$2B,$57,$54,$00,$00,$28,$2F,$00,$00,$00,$00
A940 DEFB $00,$E0,$00,$00,$30,$01,$02,$F8,$00,$00,$F8,$03,$02,$7C,$00,$00
A950 DEFB $1E,$02,$01,$3F,$00,$00,$77,$01,$02,$BF,$00,$00,$8E,$05,$03,$5D
A960 DEFB $00,$00,$FB,$06,$0C,$6F,$00,$00,$BF,$1B,$00,$7E,$00,$00,$7D,$00
A970 DEFB $05,$F7,$00,$80,$EE,$0A,$15,$D5,$00,$00,$CA,$0B,$00,$00,$00,$00
A980 DEFB $00,$38,$00,$00,$4C,$00,$00,$BE,$00,$00,$FE,$00,$00,$9F,$00,$80
A990 DEFB $87,$00,$00,$4F,$C0,$C0,$5D,$00,$00,$AF,$C0,$80,$63,$01,$00,$D7
A9A0 DEFB $40,$C0,$BE,$01,$03,$1B,$C0,$C0,$EF,$06,$00,$1F,$80,$40,$1F,$00
A9B0 DEFB $01,$7D,$C0,$A0,$BB,$02,$05,$75,$40,$80,$F2,$02,$00,$00,$00,$00
A9C0 DEFB $00,$0E,$00,$00,$13,$00,$00,$2F,$80,$80,$3F,$00,$00,$27,$C0,$E0
A9D0 DEFB $21,$00,$00,$13,$F0,$70,$17,$00,$00,$2B,$F0,$E0,$58,$00,$00,$35
A9E0 DEFB $D0,$B0,$6F,$00,$00,$C6,$F0,$F0,$BB,$01,$00,$07,$E0,$D0,$07,$00
A9F0 DEFB $00,$5F,$70,$E8,$AE,$00,$01,$5D,$50,$A0,$BC,$00,$00,$00,$00,$00
AA00 DEFB $01,$C0,$00,$00,$60,$02,$05,$F0,$00,$00,$F0,$07,$04,$F8,$00,$00
AA10 DEFB $38,$04,$02,$78,$00,$00,$FC,$05,$0A,$DC,$00,$00,$7C,$07,$0D,$F8
AA20 DEFB $00,$00,$FC,$19,$37,$7C,$00,$00,$F8,$01,$01,$F8,$00,$00,$F0,$01
AA30 DEFB $15,$74,$00,$00,$FA,$2B,$55,$74,$00,$00,$E8,$2B,$00,$00,$00,$00
AA40 DEFB $00,$70,$00,$00,$98,$00,$01,$7C,$00,$00,$FC,$01,$01,$3E,$00,$00
AA50 DEFB $0E,$01,$00,$9E,$00,$00,$7F,$01,$02,$B7,$00,$00,$DF,$01,$03,$7E
AA60 DEFB $00,$00,$7F,$06,$0D,$DF,$00,$00,$7E,$00,$00,$7E,$00,$00,$7C,$00
AA70 DEFB $05,$5D,$00,$80,$FE,$0A,$15,$5D,$00,$00,$FA,$0A,$00,$00,$00,$00
AA80 DEFB $00,$1C,$00,$00,$26,$00,$00,$5F,$00,$00,$7F,$00,$00,$4F,$80,$80
AA90 DEFB $43,$00,$00,$27,$80,$C0,$5F,$00,$00,$AD,$C0,$C0,$77,$00,$00,$DF
AAA0 DEFB $80,$C0,$9F,$01,$03,$77,$C0,$80,$1F,$00,$00,$1F,$80,$00,$1F,$00
AAB0 DEFB $01,$57,$40,$A0,$BF,$02,$05,$57,$40,$80,$BE,$02,$00,$00,$00,$00
AAC0 DEFB $00,$07,$00,$80,$09,$00,$00,$17,$C0,$C0,$1F,$00,$00,$13,$E0,$E0
AAD0 DEFB $10,$00,$00,$09,$E0,$F0,$17,$00,$00,$2B,$70,$F0,$1D,$00,$00,$37
AAE0 DEFB $E0,$F0,$67,$00,$00,$DD,$F0,$E0,$07,$00,$00,$07,$E0,$C0,$07,$00
AAF0 DEFB $00,$55,$D0,$E8,$AF,$00,$01,$55,$D0,$A0,$AF,$00,$00,$00,$00,$00
AB00 DEFB $03,$80,$00,$00,$C0,$04,$0B,$E0,$00,$00,$E0,$0F,$0B,$D0,$00,$00
AB10 DEFB $FC,$18,$17,$FE,$00,$00,$DE,$1F,$03,$DF,$00,$00,$7D,$7C,$04,$FB
AB20 DEFB $00,$00,$4E,$07,$03,$F8,$00,$00,$F8,$07,$0F,$E0,$00,$00,$E0,$06
AB30 DEFB $07,$F0,$00,$00,$BA,$0B,$54,$F4,$00,$00,$EA,$0A,$00,$00,$00,$00
AB40 DEFB $00,$E0,$00,$00,$30,$01,$02,$F8,$00,$00,$F8,$03,$02,$FC,$00,$00
AB50 DEFB $3C,$06,$05,$FF,$00,$80,$FF,$03,$05,$F7,$80,$80,$3F,$3E,$02,$79
AB60 DEFB $80,$00,$A7,$01,$03,$FE,$00,$00,$FE,$0F,$0F,$FC,$00,$00,$3E,$07
AB70 DEFB $03,$8F,$00,$80,$27,$2F,$15,$51,$C0,$80,$AB,$0A,$00,$00,$00,$00
AB80 DEFB $00,$1C,$00,$00,$26,$00,$00,$5F,$00,$00,$7F,$00,$00,$5F,$80,$C0
AB90 DEFB $C7,$00,$00,$BF,$E0,$E0,$FD,$01,$00,$BD,$F0,$F0,$C7,$07,$00,$4F
ABA0 DEFB $B0,$E0,$74,$00,$00,$7F,$80,$80,$7F,$00,$00,$FF,$00,$80,$F7,$00
ABB0 DEFB $00,$E7,$E0,$E0,$69,$01,$04,$F5,$20,$A0,$CA,$01,$00,$00,$00,$00
ABC0 DEFB $00,$07,$00,$80,$09,$00,$00,$17,$C0,$C0,$1F,$00,$00,$17,$C0,$E0
ABD0 DEFB $31,$00,$00,$2F,$F0,$F8,$3F,$00,$00,$5E,$78,$F8,$E3,$03,$00,$27
ABE0 DEFB $D0,$70,$39,$00,$00,$1F,$E0,$E0,$1F,$00,$00,$1F,$C0,$C0,$1F,$00
ABF0 DEFB $00,$0F,$C0,$E8,$AB,$00,$01,$53,$90,$A8,$A7,$00,$00,$00,$00,$00
AC00 DEFB $03,$80,$00,$00,$C0,$04,$0B,$E0,$00,$00,$E0,$8F,$C7,$E0,$00,$00
AC10 DEFB $D0,$6D,$37,$68,$00,$00,$E8,$5B,$3F,$C8,$00,$00,$58,$0B,$09,$D8
AC20 DEFB $00,$00,$B0,$0E,$27,$F0,$00,$00,$E0,$3F,$BF,$C0,$00,$00,$E0,$55
AC30 DEFB $2A,$F0,$00,$00,$70,$55,$0A,$E0,$00,$00,$00,$01,$00,$00,$00,$00
AC40 DEFB $00,$E0,$00,$00,$30,$01,$02,$F8,$00,$00,$F8,$23,$31,$F8,$00,$00
AC50 DEFB $74,$1B,$0D,$DA,$00,$00,$FA,$16,$0F,$F2,$00,$00,$D6,$02,$02,$76
AC60 DEFB $00,$00,$AC,$03,$09,$FC,$00,$00,$F8,$0F,$2F,$F0,$00,$00,$78,$15
AC70 DEFB $0A,$BC,$00,$00,$5C,$15,$02,$B8,$00,$00,$40,$00,$00,$00,$00,$00
AC80 DEFB $00,$38,$00,$00,$4C,$00,$00,$BE,$00,$00,$FE,$08,$0C,$7E,$00,$00
AC90 DEFB $DD,$06,$03,$76,$80,$80,$BE,$05,$03,$FC,$80,$80,$B5,$00,$00,$9D
ACA0 DEFB $80,$00,$EB,$00,$02,$7F,$00,$00,$FE,$03,$0B,$FC,$00,$00,$5E,$05
ACB0 DEFB $02,$AF,$00,$00,$57,$05,$00,$AE,$00,$00,$10,$00,$00,$00,$00,$00
ACC0 DEFB $00,$0E,$00,$00,$13,$00,$00,$2F,$80,$80,$3F,$02,$03,$1F,$80,$40
ACD0 DEFB $B7,$01,$00,$DD,$A0,$A0,$6F,$01,$00,$FF,$20,$60,$2D,$00,$00,$27
ACE0 DEFB $60,$C0,$3A,$00,$00,$9F,$C0,$80,$FF,$00,$02,$FF,$00,$80,$57,$01
ACF0 DEFB $00,$AB,$C0,$C0,$55,$01,$00,$2B,$80,$00,$04,$00,$00,$00,$00,$00
AD00 DEFB $07,$00,$00,$00,$80,$09,$17,$C0,$00,$00,$C0,$1F,$4F,$E0,$00,$00
AD10 DEFB $D0,$6B,$37,$50,$00,$00,$C8,$1B,$2D,$E8,$00,$00,$48,$1F,$0D,$D8
AD20 DEFB $00,$00,$70,$0C,$07,$F0,$00,$00,$E0,$03,$07,$C0,$00,$00,$80,$57
AD30 DEFB $2F,$A0,$00,$00,$50,$57,$1F,$A0,$00,$00,$00,$0F,$00,$00,$00,$00
AD40 DEFB $01,$C0,$00,$00,$60,$02,$05,$F0,$00,$00,$F0,$07,$13,$F8,$00,$00
AD50 DEFB $F4,$1A,$0D,$D4,$00,$00,$F2,$06,$0B,$7A,$00,$00,$D2,$07,$03,$76
AD60 DEFB $00,$00,$1C,$03,$01,$FC,$00,$00,$F8,$00,$01,$F0,$00,$00,$E0,$15
AD70 DEFB $0B,$E8,$00,$00,$D4,$15,$07,$E8,$00,$00,$C0,$03,$00,$00,$00,$00
AD80 DEFB $00,$70,$00,$00,$98,$00,$01,$7C,$00,$00,$FC,$01,$04,$FE,$00,$00
AD90 DEFB $BD,$06,$03,$75,$00,$80,$BC,$01,$02,$DE,$80,$80,$F4,$01,$00,$DD
ADA0 DEFB $80,$00,$C7,$00,$00,$7F,$00,$00,$3E,$00,$00,$7C,$00,$00,$78,$05
ADB0 DEFB $02,$FA,$00,$00,$75,$05,$01,$FA,$00,$00,$F0,$00,$00,$00,$00,$00
ADC0 DEFB $00,$1C,$00,$00,$26,$00,$00,$5F,$00,$00,$7F,$00,$01,$3F,$80,$40
ADD0 DEFB $AF,$01,$00,$DD,$40,$20,$6F,$00,$00,$B7,$A0,$20,$7D,$00,$00,$37
ADE0 DEFB $60,$C0,$31,$00,$00,$1F,$C0,$80,$0F,$00,$00,$1F,$00,$00,$5E,$01
ADF0 DEFB $00,$BE,$80,$40,$5D,$01,$00,$7E,$80,$00,$3C,$00,$00,$00,$00,$00
AE00 DEFB $07,$00,$00,$00,$80,$09,$D7,$C0,$00,$00,$E0,$DF,$F7,$F8,$00,$40
AE10 DEFB $DC,$F1,$7F,$BE,$C0,$C0,$7F,$3F,$0F,$64,$80,$00,$E7,$0E,$04,$2C
AE20 DEFB $00,$00,$F8,$0F,$0F,$F0,$00,$00,$E0,$1E,$1D,$C0,$00,$00,$F0,$1D
AE30 DEFB $0E,$E8,$00,$00,$70,$00,$00,$38,$00,$00,$70,$00,$00,$00,$00,$00
AE40 DEFB $01,$C0,$00,$00,$60,$02,$35,$F0,$00,$00,$F8,$37,$3D,$FE,$00,$10
AE50 DEFB $77,$3C,$1F,$EF,$B0,$F0,$DF,$0F,$03,$D9,$20,$C0,$B9,$03,$01,$0B
AE60 DEFB $00,$00,$FE,$03,$03,$FC,$00,$00,$B8,$07,$07,$70,$00,$00,$7C,$07
AE70 DEFB $03,$BA,$00,$00,$1C,$00,$00,$0E,$00,$00,$1C,$00,$00,$00,$00,$00
AE80 DEFB $00,$70,$00,$00,$98,$00,$0D,$7C,$00,$00,$FE,$0D,$0F,$7F,$80,$C4
AE90 DEFB $1D,$0F,$07,$FB,$EC,$FC,$F7,$03,$00,$F6,$48,$70,$EE,$00,$00,$42
AEA0 DEFB $C0,$80,$FF,$00,$00,$FF,$00,$00,$EE,$01,$01,$DC,$00,$00,$DF,$01
AEB0 DEFB $00,$EE,$80,$00,$07,$00,$00,$03,$80,$00,$07,$00,$00,$00,$00,$00
AEC0 DEFB $00,$1C,$00,$00,$26,$00,$03,$5F,$00,$80,$7F,$03,$03,$DF,$E0,$71
AED0 DEFB $C7,$03,$01,$FE,$FB,$FF,$FD,$00,$00,$3D,$92,$9C,$3B,$00,$00,$10
AEE0 DEFB $B0,$E0,$3F,$00,$00,$3F,$C0,$80,$7B,$00,$00,$77,$00,$C0,$77,$00
AEF0 DEFB $00,$3B,$A0,$C0,$01,$00,$00,$00,$E0,$C0,$01,$00,$00,$00,$00,$00
AF00 DEFB $00,$38,$00,$00,$64,$00,$00,$FA,$C0,$C0,$FE,$01,$07,$FB,$C0,$C0
AF10 DEFB $E3,$8E,$DF,$7F,$80,$00,$BF,$FF,$49,$BC,$00,$00,$DC,$39,$0D,$08
AF20 DEFB $00,$00,$FC,$07,$03,$FC,$00,$00,$DE,$01,$00,$EE,$00,$00,$EE,$03
AF30 DEFB $05,$DC,$00,$00,$80,$03,$07,$00,$00,$00,$80,$03,$00,$00,$00,$00
AF40 DEFB $00,$0E,$00,$00,$19,$00,$00,$3E,$B0,$B0,$7F,$00,$01,$FE,$F0,$F0
AF50 DEFB $B8,$23,$37,$DF,$E0,$C0,$EF,$3F,$12,$6F,$00,$00,$77,$0E,$03,$42
AF60 DEFB $00,$00,$FF,$01,$00,$FF,$00,$80,$77,$00,$00,$3B,$80,$80,$FB,$00
AF70 DEFB $01,$77,$00,$00,$E0,$00,$01,$C0,$00,$00,$E0,$00,$00,$00,$00,$00
AF80 DEFB $00,$03,$80,$40,$06,$00,$00,$0F,$AC,$EC,$1F,$00,$00,$7F,$BC,$3C
AF90 DEFB $EE,$08,$0D,$F7,$F8,$F0,$FB,$0F,$04,$9B,$C0,$C0,$9D,$03,$00,$D0
AFA0 DEFB $80,$C0,$7F,$00,$00,$3F,$C0,$E0,$1D,$00,$00,$0E,$E0,$E0,$3E,$00
AFB0 DEFB $00,$5D,$C0,$00,$38,$00,$00,$70,$00,$00,$38,$00,$00,$00,$00,$00
AFC0 DEFB $00,$00,$E0,$90,$01,$00,$00,$03,$EB,$FB,$07,$00,$00,$1F,$EF,$8F
AFD0 DEFB $3B,$02,$03,$7D,$FE,$FC,$FE,$03,$01,$26,$F0,$70,$E7,$00,$00,$34
AFE0 DEFB $20,$F0,$1F,$00,$00,$0F,$F0,$78,$07,$00,$00,$03,$B8,$B8,$0F,$00
AFF0 DEFB $00,$17,$70,$00,$0E,$00,$00,$1C,$00,$00,$0E,$00,$00,$00,$00,$00
B000 DEFB $0F,$00,$00,$00,$80,$1F,$3F,$C0,$00,$00,$C0,$3F,$3F,$C0,$00,$00
B010 DEFB $60,$5F,$F0,$E0,$00,$00,$F0,$FF,$7F,$F0,$00,$00,$B0,$77,$39,$70
B020 DEFB $00,$00,$E0,$1E,$31,$00,$00,$00,$C0,$3F,$3F,$80,$00,$00,$40,$79
B030 DEFB $BA,$A0,$00,$00,$40,$7D,$BA,$A0,$00,$00,$00,$45,$00,$00,$00,$00
B040 DEFB $00,$00,$00,$00,$C0,$03,$07,$E0,$00,$00,$F0,$0F,$0F,$F0,$00,$00
B050 DEFB $F0,$0F,$17,$D8,$00,$00,$38,$3C,$3F,$FC,$00,$00,$CC,$3B,$1D,$3C
B060 DEFB $00,$00,$F8,$1E,$09,$20,$00,$00,$F0,$0F,$0F,$E0,$00,$00,$E4,$1E
B070 DEFB $2E,$E8,$00,$00,$54,$1F,$2E,$A8,$00,$00,$50,$15,$00,$00,$00,$00
B080 DEFB $00,$F0,$00,$00,$F8,$01,$03,$FC,$00,$00,$FC,$03,$03,$FC,$00,$00
B090 DEFB $F6,$05,$0F,$0E,$00,$00,$FF,$0F,$0F,$FF,$00,$00,$E7,$05,$06,$9E
B0A0 DEFB $00,$00,$7C,$02,$01,$90,$00,$00,$FC,$03,$03,$F8,$00,$00,$BC,$07
B0B0 DEFB $0B,$BA,$00,$00,$7C,$05,$0A,$BA,$00,$00,$50,$05,$00,$00,$00,$00
B0C0 DEFB $00,$00,$00,$00,$3C,$00,$00,$7E,$00,$00,$FF,$00,$00,$FF,$00,$00
B0D0 DEFB $FF,$00,$01,$7D,$80,$80,$C3,$03,$03,$FF,$C0,$C0,$7E,$03,$03,$99
B0E0 DEFB $C0,$80,$EF,$01,$00,$94,$80,$00,$FF,$00,$00,$FE,$00,$40,$EE,$01
B0F0 DEFB $02,$AE,$80,$40,$5F,$01,$02,$AE,$80,$00,$51,$01,$00,$00,$00,$00
B100 DEFB $00,$00,$00,$00,$00,$0F,$19,$80,$00,$00,$C0,$37,$3F,$C0,$00,$00
B110 DEFB $A0,$7F,$D9,$A0,$00,$00,$A0,$FF,$7E,$B0,$00,$00,$B0,$3E,$3C,$B0
B120 DEFB $00,$00,$90,$31,$25,$A0,$00,$00,$C0,$3F,$3F,$80,$00,$00,$80,$3B
B130 DEFB $3A,$80,$00,$00,$50,$7D,$BA,$A0,$00,$00,$40,$55,$00,$00,$00,$00
B140 DEFB $00,$00,$00,$00,$C0,$03,$06,$60,$00,$00,$F0,$0D,$0F,$F0,$00,$00
B150 DEFB $E8,$0F,$16,$68,$00,$00,$E8,$3F,$3F,$AC,$00,$00,$AC,$3F,$1F,$2C
B160 DEFB $00,$00,$64,$0C,$09,$68,$00,$00,$F0,$0F,$0F,$E0,$00,$00,$E0,$0E
B170 DEFB $0E,$E0,$00,$00,$54,$1F,$2E,$A8,$00,$00,$50,$15,$00,$00,$00,$00
B180 DEFB $00,$00,$00,$00,$F0,$00,$01,$98,$00,$00,$7C,$03,$03,$FC,$00,$00
B190 DEFB $FA,$03,$05,$9A,$00,$00,$FA,$0F,$0F,$EB,$00,$00,$EB,$0F,$0F,$CB
B1A0 DEFB $00,$00,$19,$0B,$06,$5A,$00,$00,$FC,$03,$03,$F8,$00,$00,$B8,$03
B1B0 DEFB $02,$B8,$00,$00,$7D,$05,$0A,$BA,$00,$00,$54,$05,$00,$00,$00,$00
B1C0 DEFB $00,$00,$00,$00,$3C,$00,$00,$66,$00,$00,$DF,$00,$00,$FF,$00,$80
B1D0 DEFB $FE,$00,$01,$66,$80,$80,$FE,$03,$03,$FA,$C0,$C0,$FA,$03,$01,$F2
B1E0 DEFB $C0,$40,$C6,$00,$00,$96,$80,$00,$FF,$00,$00,$FE,$00,$00,$EE,$00
B1F0 DEFB $00,$EE,$00,$40,$5F,$01,$02,$AE,$80,$00,$55,$01,$00,$00,$00,$00
B200 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
B210 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
B220 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
B230 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
B240 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
B250 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
B260 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
B270 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
B280 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
B290 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
B2A0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
B2B0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
B2C0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
B2D0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
B2E0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
B2F0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
B300 DEFB $01,$C0,$00,$00,$60,$02,$05,$F0,$00,$00,$F0,$0F,$05,$F0,$00,$00
B310 DEFB $78,$04,$0B,$FC,$00,$00,$FE,$07,$07,$9E,$00,$00,$FE,$02,$01,$F4
B320 DEFB $00,$00,$DC,$07,$0F,$F8,$00,$00,$F8,$1B,$07,$70,$00,$00,$F0,$06
B330 DEFB $02,$F0,$00,$00,$FA,$2A,$54,$E4,$00,$00,$EA,$29,$00,$00,$00,$00
B340 DEFB $00,$00,$10,$80,$41,$30,$78,$00,$80,$00,$8E,$61,$07,$5E,$00,$80
B350 DEFB $D9,$07,$1D,$FF,$80,$40,$DE,$2F,$1F,$6D,$C0,$C0,$F3,$13,$19,$BE
B360 DEFB $C0,$40,$EF,$1E,$0E,$FB,$80,$80,$FF,$5F,$1C,$D3,$80,$00,$BD,$05
B370 DEFB $23,$7F,$00,$80,$6C,$08,$18,$71,$C0,$C0,$01,$00,$00,$00,$00,$00
B380 DEFB $63,$00,$00,$80,$C9,$47,$05,$C2,$C0,$C0,$CA,$07,$01,$83,$E0,$E0
B390 DEFB $01,$30,$38,$30,$60,$10,$B8,$7C,$74,$3A,$00,$E0,$10,$2C,$3C,$00
B3A0 DEFB $F0,$F0,$20,$19,$03,$24,$60,$60,$0C,$20,$20,$00,$00,$20,$00,$07
B3B0 DEFB $47,$A7,$00,$80,$87,$07,$03,$17,$80,$10,$03,$00,$00,$00,$00,$00
B3C0 DEFB $03,$11,$00,$80,$81,$03,$18,$80,$00,$00,$02,$08,$40,$03,$00,$20
B3D0 DEFB $20,$C4,$E0,$00,$00,$00,$00,$60,$62,$12,$30,$20,$18,$00,$00,$00
B3E0 DEFB $00,$20,$00,$18,$00,$00,$10,$10,$08,$23,$01,$20,$80,$00,$30,$00
B3F0 DEFB $02,$00,$00,$00,$00,$60,$70,$07,$00,$00,$26,$30,$00,$00,$00,$00
B400 DEFB $01,$C0,$00,$00,$60,$02,$05,$F0,$00,$00,$F0,$CF,$E4,$78,$00,$00
B410 DEFB $3C,$7C,$3B,$FE,$00,$00,$FE,$1F,$07,$CF,$00,$00,$7F,$07,$02,$FB
B420 DEFB $00,$00,$EE,$03,$06,$F8,$00,$00,$F8,$0D,$07,$70,$00,$00,$F0,$06
B430 DEFB $02,$F0,$00,$00,$FA,$2A,$54,$E4,$00,$00,$EA,$29,$00,$00,$00,$00
B440 DEFB $00,$00,$01,$18,$04,$03,$07,$80,$08,$E0,$18,$06,$00,$75,$E0,$98
B450 DEFB $7D,$00,$01,$DF,$F8,$E4,$FD,$02,$01,$F6,$DC,$3C,$3F,$01,$01,$9B
B460 DEFB $EC,$F4,$EE,$01,$00,$EF,$B8,$F8,$FF,$05,$01,$CD,$38,$D0,$5B,$00
B470 DEFB $02,$37,$F0,$C8,$86,$00,$01,$87,$1C,$1C,$00,$00,$00,$00,$00,$00
B480 DEFB $06,$30,$00,$98,$7C,$04,$00,$5C,$2C,$AC,$7C,$00,$00,$18,$3E,$1E
B490 DEFB $00,$03,$03,$83,$06,$81,$CB,$07,$07,$43,$A0,$0E,$C1,$02,$03,$C0
B4A0 DEFB $0F,$0F,$92,$01,$00,$32,$46,$C6,$00,$02,$02,$00,$00,$02,$70,$00
B4B0 DEFB $04,$7A,$70,$78,$78,$00,$00,$31,$78,$31,$00,$00,$00,$00,$00,$00
B4C0 DEFB $00,$31,$10,$18,$38,$00,$01,$88,$00,$20,$80,$00,$04,$00,$30,$02
B4D0 DEFB $42,$0C,$0E,$00,$00,$00,$00,$06,$06,$21,$23,$82,$01,$00,$00,$00
B4E0 DEFB $00,$02,$80,$01,$00,$00,$01,$81,$30,$02,$00,$12,$08,$00,$03,$00
B4F0 DEFB $00,$20,$00,$00,$00,$06,$07,$00,$70,$60,$02,$03,$00,$00,$00,$00
B500 DEFB $31,$E0,$00,$00,$70,$32,$75,$FB,$00,$00,$FB,$77,$74,$0F,$00,$00
B510 DEFB $9E,$7A,$3F,$3E,$00,$00,$F4,$3F,$17,$7C,$00,$00,$5C,$1D,$1E,$38
B520 DEFB $00,$00,$8A,$68,$0E,$30,$00,$00,$50,$0D,$1F,$70,$00,$00,$F8,$36
B530 DEFB $78,$3C,$00,$00,$9C,$38,$18,$8E,$00,$00,$07,$38,$00,$00,$00,$00
B540 DEFB $0C,$78,$00,$00,$9C,$0C,$1D,$7E,$C0,$C0,$FE,$1D,$1D,$03,$C0,$80
B550 DEFB $A7,$1E,$0F,$CF,$80,$00,$FD,$0F,$05,$DF,$00,$00,$57,$07,$07,$8E
B560 DEFB $00,$80,$22,$1A,$03,$8C,$00,$00,$54,$03,$07,$DC,$00,$00,$BE,$0D
B570 DEFB $1E,$0F,$00,$00,$27,$0E,$06,$23,$80,$C0,$01,$0E,$00,$00,$00,$00
B580 DEFB $03,$1E,$00,$00,$27,$03,$07,$5F,$B0,$B0,$7F,$07,$07,$40,$F0,$E0
B590 DEFB $A9,$07,$03,$F3,$E0,$40,$FF,$03,$01,$77,$C0,$C0,$D5,$01,$01,$E3
B5A0 DEFB $80,$A0,$88,$06,$00,$E3,$00,$00,$D5,$00,$01,$F7,$00,$80,$6F,$03
B5B0 DEFB $07,$83,$C0,$C0,$89,$03,$01,$88,$E0,$70,$80,$03,$00,$00,$00,$00
B5C0 DEFB $00,$C7,$80,$C0,$C9,$00,$01,$D7,$EC,$EC,$DF,$01,$01,$D0,$3C,$78
B5D0 DEFB $EA,$01,$00,$FC,$F8,$D0,$FF,$00,$00,$5D,$F0,$70,$75,$00,$00,$78
B5E0 DEFB $E0,$28,$A2,$01,$00,$38,$C0,$40,$35,$00,$00,$7D,$C0,$E0,$DB,$00
B5F0 DEFB $01,$E0,$F0,$70,$E2,$00,$00,$62,$38,$1C,$E0,$00,$00,$00,$00,$00
B600 DEFB $07,$8C,$00,$00,$4C,$0E,$DF,$AE,$00,$00,$EE,$DF,$F0,$2E,$00,$00
B610 DEFB $5E,$79,$7C,$FC,$00,$00,$FC,$2F,$3E,$E8,$00,$00,$B8,$3A,$1C,$78
B620 DEFB $00,$00,$16,$51,$0C,$70,$00,$00,$B0,$0A,$0E,$F8,$00,$00,$6C,$1F
B630 DEFB $3C,$1E,$00,$00,$1C,$39,$71,$18,$00,$00,$1C,$E0,$00,$00,$00,$00
B640 DEFB $01,$E3,$00,$00,$93,$03,$37,$EB,$80,$80,$FB,$37,$3C,$0B,$80,$80
B650 DEFB $57,$1E,$1F,$3F,$00,$00,$FF,$0B,$0F,$BA,$00,$00,$AE,$0E,$07,$1E
B660 DEFB $00,$80,$45,$14,$03,$1C,$00,$00,$AC,$02,$03,$BE,$00,$00,$DB,$07
B670 DEFB $0F,$07,$80,$00,$47,$0E,$1C,$46,$00,$00,$07,$38,$00,$00,$00,$00
B680 DEFB $00,$78,$C0,$C0,$E4,$00,$0D,$FA,$E0,$E0,$FE,$0D,$0F,$02,$E0,$E0
B690 DEFB $95,$07,$07,$CF,$C0,$C0,$FF,$02,$03,$EE,$80,$80,$AB,$03,$01,$C7
B6A0 DEFB $80,$60,$11,$05,$00,$C7,$00,$00,$AB,$00,$00,$EF,$80,$C0,$F6,$01
B6B0 DEFB $03,$C1,$E0,$C0,$91,$03,$07,$11,$80,$C0,$01,$0E,$00,$00,$00,$00
B6C0 DEFB $00,$1E,$30,$30,$39,$00,$03,$7E,$B8,$B8,$7F,$03,$03,$C0,$B8,$78
B6D0 DEFB $E5,$01,$01,$F3,$F0,$F0,$BF,$00,$00,$FB,$A0,$E0,$EA,$00,$00,$71
B6E0 DEFB $E0,$58,$44,$01,$00,$31,$C0,$C0,$2A,$00,$00,$3B,$E0,$B0,$7D,$00
B6F0 DEFB $00,$F0,$78,$70,$E4,$00,$01,$C4,$60,$70,$80,$03,$00,$00,$00,$00
B700 DEFB $00,$00,$00,$00,$00,$00,$01,$00,$00,$00,$00,$00,$01,$00,$00,$00
B710 DEFB $20,$08,$01,$00,$00,$00,$80,$03,$57,$D4,$00,$00,$80,$03,$01,$00
B720 DEFB $00,$00,$20,$08,$01,$00,$00,$00,$00,$00,$01,$00,$00,$00,$00,$00
B730 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
B740 DEFB $00,$00,$00,$00,$00,$00,$00,$40,$00,$00,$00,$00,$00,$40,$00,$00
B750 DEFB $08,$02,$00,$40,$00,$00,$E0,$00,$15,$F5,$00,$00,$E0,$00,$00,$40
B760 DEFB $00,$00,$08,$02,$00,$40,$00,$00,$00,$00,$00,$40,$00,$00,$00,$00
B770 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
B780 DEFB $00,$00,$00,$00,$00,$00,$00,$10,$00,$00,$00,$00,$00,$10,$00,$00
B790 DEFB $82,$00,$00,$10,$00,$00,$38,$00,$05,$7D,$40,$00,$38,$00,$00,$10
B7A0 DEFB $00,$00,$82,$00,$00,$10,$00,$00,$00,$00,$00,$10,$00,$00,$00,$00
B7B0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
B7C0 DEFB $00,$00,$00,$00,$00,$00,$00,$04,$00,$00,$00,$00,$00,$04,$00,$80
B7D0 DEFB $20,$00,$00,$04,$00,$00,$0E,$00,$01,$5F,$50,$00,$0E,$00,$00,$04
B7E0 DEFB $00,$80,$20,$00,$00,$04,$00,$00,$00,$00,$00,$04,$00,$00,$00,$00
B7F0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
B800 DEFB $00,$00,$00,$00,$00,$01,$00,$00,$00,$00,$08,$21,$01,$20,$00,$00
B810 DEFB $60,$18,$0D,$C0,$00,$00,$80,$07,$B7,$DA,$00,$00,$C0,$03,$07,$60
B820 DEFB $00,$00,$30,$0C,$09,$00,$00,$00,$08,$21,$00,$00,$00,$00,$00,$01
B830 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
B840 DEFB $00,$00,$00,$00,$40,$00,$00,$00,$00,$00,$42,$08,$00,$48,$00,$00
B850 DEFB $18,$06,$03,$70,$00,$00,$E0,$01,$2D,$F6,$80,$00,$F0,$00,$01,$D8
B860 DEFB $00,$00,$0C,$03,$02,$40,$00,$00,$42,$08,$00,$00,$00,$00,$40,$00
B870 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
B880 DEFB $00,$00,$00,$00,$10,$00,$00,$00,$00,$80,$10,$02,$00,$12,$00,$00
B890 DEFB $86,$01,$00,$DC,$00,$00,$78,$00,$0B,$7D,$A0,$00,$3C,$00,$00,$76
B8A0 DEFB $00,$00,$C3,$00,$00,$90,$00,$80,$10,$02,$00,$00,$00,$00,$10,$00
B8B0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
B8C0 DEFB $00,$00,$00,$00,$04,$00,$00,$00,$00,$20,$84,$00,$00,$04,$80,$80
B8D0 DEFB $61,$00,$00,$37,$00,$00,$1E,$00,$02,$DF,$68,$00,$0F,$00,$00,$1D
B8E0 DEFB $80,$C0,$30,$00,$00,$24,$00,$20,$84,$00,$00,$00,$00,$00,$04,$00
B8F0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
B900 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$40,$07,$0B,$80,$00,$00
B910 DEFB $80,$0B,$0D,$80,$00,$00,$00,$07,$00,$00,$00,$00,$00,$00,$00,$00
B920 DEFB $00,$00,$00,$00,$03,$80,$00,$00,$C0,$04,$05,$C0,$00,$00,$C0,$07
B930 DEFB $03,$80,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
B940 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$D0,$01,$02,$E0,$00,$00
B950 DEFB $E0,$02,$03,$60,$00,$00,$C0,$01,$00,$00,$00,$00,$00,$00,$00,$00
B960 DEFB $00,$00,$00,$00,$00,$E0,$00,$00,$30,$01,$01,$70,$00,$00,$F0,$01
B970 DEFB $00,$E0,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
B980 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$74,$00,$00,$B8,$00,$00
B990 DEFB $B8,$00,$00,$D8,$00,$00,$70,$00,$00,$00,$00,$00,$00,$00,$00,$00
B9A0 DEFB $00,$00,$00,$00,$00,$38,$00,$00,$4C,$00,$00,$5C,$00,$00,$7C,$00
B9B0 DEFB $00,$38,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
B9C0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$1D,$00,$00,$2E,$00,$00
B9D0 DEFB $2E,$00,$00,$36,$00,$00,$1C,$00,$00,$00,$00,$00,$00,$00,$00,$00
B9E0 DEFB $00,$00,$00,$00,$00,$0E,$00,$00,$13,$00,$00,$17,$00,$00,$1F,$00
B9F0 DEFB $00,$0E,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
BA00 DEFB $00,$00,$00,$00,$E0,$01,$06,$D0,$00,$00,$F0,$0D,$0B,$D0,$00,$00
BA10 DEFB $C0,$0B,$0D,$C0,$00,$00,$80,$07,$00,$00,$00,$00,$00,$00,$00,$00
BA20 DEFB $00,$00,$C0,$03,$04,$E0,$00,$00,$E0,$05,$07,$E0,$00,$00,$E0,$07
BA30 DEFB $03,$C0,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
BA40 DEFB $00,$00,$00,$00,$78,$00,$01,$B4,$00,$00,$7C,$03,$02,$F4,$00,$00
BA50 DEFB $F0,$02,$03,$70,$00,$00,$E0,$01,$00,$00,$00,$00,$00,$00,$00,$00
BA60 DEFB $00,$00,$F0,$00,$01,$38,$00,$00,$78,$01,$01,$F8,$00,$00,$F8,$01
BA70 DEFB $00,$F0,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
BA80 DEFB $00,$00,$00,$00,$1E,$00,$00,$6D,$00,$00,$DF,$00,$00,$BD,$00,$00
BA90 DEFB $BC,$00,$00,$DC,$00,$00,$78,$00,$00,$00,$00,$00,$00,$00,$00,$00
BAA0 DEFB $00,$00,$3C,$00,$00,$4E,$00,$00,$5E,$00,$00,$7E,$00,$00,$7E,$00
BAB0 DEFB $00,$3C,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
BAC0 DEFB $00,$00,$00,$80,$07,$00,$00,$1B,$40,$C0,$37,$00,$00,$2F,$40,$00
BAD0 DEFB $2F,$00,$00,$37,$00,$00,$1E,$00,$00,$00,$00,$00,$00,$00,$00,$00
BAE0 DEFB $00,$00,$0F,$00,$00,$13,$80,$80,$17,$00,$00,$1F,$80,$80,$1F,$00
BAF0 DEFB $00,$0F,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
BB00 DEFB $00,$00,$00,$00,$E0,$03,$0D,$F0,$00,$00,$E8,$1B,$17,$F8,$00,$00
BB10 DEFB $E8,$17,$17,$E0,$00,$00,$C0,$1B,$0F,$80,$00,$00,$00,$06,$01,$80
BB20 DEFB $00,$00,$E0,$07,$0C,$F0,$00,$00,$F0,$09,$19,$F8,$00,$00,$F8,$1B
BB30 DEFB $0F,$F0,$00,$00,$F0,$0F,$07,$E0,$00,$00,$80,$01,$00,$00,$00,$00
BB40 DEFB $00,$00,$00,$00,$F8,$00,$03,$7C,$00,$00,$FA,$06,$05,$FE,$00,$00
BB50 DEFB $FA,$05,$05,$F8,$00,$00,$F0,$06,$03,$E0,$00,$00,$80,$01,$00,$60
BB60 DEFB $00,$00,$F8,$01,$03,$3C,$00,$00,$7C,$02,$06,$7E,$00,$00,$FE,$06
BB70 DEFB $03,$FC,$00,$00,$FC,$03,$01,$F8,$00,$00,$60,$00,$00,$00,$00,$00
BB80 DEFB $00,$00,$00,$00,$3E,$00,$00,$DF,$00,$80,$BE,$01,$01,$7F,$80,$80
BB90 DEFB $7E,$01,$01,$7E,$00,$00,$BC,$01,$00,$F8,$00,$00,$60,$00,$00,$18
BBA0 DEFB $00,$00,$7E,$00,$00,$CF,$00,$00,$9F,$00,$01,$9F,$80,$80,$BF,$01
BBB0 DEFB $00,$FF,$00,$00,$FF,$00,$00,$7E,$00,$00,$18,$00,$00,$00,$00,$00
BBC0 DEFB $00,$00,$00,$80,$0F,$00,$00,$37,$C0,$A0,$6F,$00,$00,$5F,$E0,$A0
BBD0 DEFB $5F,$00,$00,$5F,$80,$00,$6F,$00,$00,$3E,$00,$00,$18,$00,$00,$06
BBE0 DEFB $00,$80,$1F,$00,$00,$33,$C0,$C0,$27,$00,$00,$67,$E0,$E0,$6F,$00
BBF0 DEFB $00,$3F,$C0,$C0,$3F,$00,$00,$1F,$80,$00,$06,$00,$00,$00,$00,$00
BC00 DEFB $37,$80,$00,$00,$40,$48,$53,$20,$00,$00,$E0,$5F,$50,$30,$00,$00 Rocket Launcher
BC10 DEFB $58,$48,$EF,$F8,$00,$00,$B8,$CA,$7D,$78,$00,$00,$F0,$4B,$36,$70
BC20 DEFB $00,$00,$20,$3F,$1F,$E0,$00,$00,$E0,$1F,$1D,$C0,$00,$00,$E0,$29
BC30 DEFB $55,$D0,$00,$00,$E0,$2B,$55,$D0,$00,$00,$20,$0A,$00,$00,$00,$00
BC40 DEFB $0D,$E0,$00,$00,$10,$12,$14,$C8,$00,$00,$F8,$17,$14,$0E,$00,$00 Rocket Launcher
BC50 DEFB $16,$12,$3B,$FE,$00,$00,$AE,$32,$1F,$56,$00,$00,$AC,$12,$0D,$5C
BC60 DEFB $00,$00,$F4,$0F,$07,$F8,$00,$00,$F8,$07,$07,$70,$00,$00,$F8,$0F
BC70 DEFB $17,$74,$00,$00,$F8,$0A,$15,$74,$00,$00,$A0,$08,$00,$00,$00,$00
BC80 DEFB $00,$78,$00,$00,$84,$03,$05,$32,$00,$00,$FF,$05,$05,$03,$80,$80 Rocket Launcher
BC90 DEFB $85,$04,$04,$FF,$80,$80,$AB,$0E,$0C,$D5,$80,$00,$AB,$07,$04,$D7
BCA0 DEFB $00,$00,$FE,$03,$01,$FE,$00,$00,$FE,$01,$01,$DC,$00,$00,$FE,$03
BCB0 DEFB $05,$DD,$00,$00,$EA,$03,$05,$D5,$00,$00,$2A,$02,$00,$00,$00,$00
BCC0 DEFB $00,$1E,$00,$00,$E1,$00,$01,$4C,$80,$80,$7F,$01,$01,$40,$E0,$60 Rocket Launcher
BCD0 DEFB $21,$01,$01,$3F,$E0,$E0,$AA,$03,$03,$35,$60,$C0,$EA,$01,$01,$35
BCE0 DEFB $C0,$40,$FF,$00,$00,$7F,$80,$80,$7F,$00,$00,$77,$00,$80,$F2,$00
BCF0 DEFB $01,$75,$40,$80,$F2,$00,$01,$75,$40,$80,$8A,$00,$00,$00,$00,$00
BD00 DEFB $02,$00,$00,$00,$00,$05,$06,$00,$00,$00,$00,$18,$38,$00,$00,$00
BD10 DEFB $00,$78,$F0,$00,$00,$00,$00,$E0,$C0,$00,$00,$00,$00,$00,$00,$00
BD20 DEFB $00,$00,$00,$70,$F8,$00,$00,$00,$00,$70,$00,$00,$00,$00,$00,$00
BD30 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
BD40 DEFB $00,$80,$00,$00,$40,$01,$01,$80,$00,$00,$00,$06,$0E,$00,$00,$00
BD50 DEFB $00,$1E,$3C,$00,$00,$00,$00,$38,$30,$00,$00,$00,$00,$00,$00,$00
BD60 DEFB $00,$00,$00,$1C,$3E,$00,$00,$00,$00,$1C,$00,$00,$00,$00,$00,$00
BD70 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
BD80 DEFB $00,$20,$00,$00,$50,$00,$00,$60,$00,$00,$80,$01,$03,$80,$00,$00
BD90 DEFB $80,$07,$0F,$00,$00,$00,$00,$0E,$0C,$00,$00,$00,$00,$00,$00,$00
BDA0 DEFB $00,$00,$00,$07,$0F,$80,$00,$00,$00,$07,$00,$00,$00,$00,$00,$00
BDB0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
BDC0 DEFB $00,$08,$00,$00,$14,$00,$00,$18,$00,$00,$60,$00,$00,$E0,$00,$00
BDD0 DEFB $E0,$01,$03,$C0,$00,$00,$80,$03,$03,$00,$00,$00,$00,$00,$00,$00
BDE0 DEFB $00,$00,$C0,$01,$03,$E0,$00,$00,$C0,$01,$00,$00,$00,$00,$00,$00
BDF0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
BE00 DEFB $A0,$00,$00,$00,$00,$A0,$40,$00,$00,$00,$00,$E0,$E0,$00,$00,$00
BE10 DEFB $00,$E0,$E0,$00,$00,$00,$00,$E0,$E0,$00,$00,$00,$00,$40,$00,$00
BE20 DEFB $00,$00,$00,$7C,$FE,$00,$00,$00,$00,$7C,$00,$00,$00,$00,$00,$00
BE30 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
BE40 DEFB $28,$00,$00,$00,$00,$28,$10,$00,$00,$00,$00,$38,$38,$00,$00,$00
BE50 DEFB $00,$38,$38,$00,$00,$00,$00,$38,$38,$00,$00,$00,$00,$10,$00,$00
BE60 DEFB $00,$00,$00,$1F,$3F,$80,$00,$00,$00,$1F,$00,$00,$00,$00,$00,$00
BE70 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
BE80 DEFB $0A,$00,$00,$00,$00,$0A,$04,$00,$00,$00,$00,$0E,$0E,$00,$00,$00
BE90 DEFB $00,$0E,$0E,$00,$00,$00,$00,$0E,$0E,$00,$00,$00,$00,$04,$00,$00
BEA0 DEFB $00,$00,$C0,$07,$0F,$E0,$00,$00,$C0,$07,$00,$00,$00,$00,$00,$00
BEB0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
BEC0 DEFB $02,$80,$00,$00,$80,$02,$01,$00,$00,$00,$80,$03,$03,$80,$00,$00
BED0 DEFB $80,$03,$03,$80,$00,$00,$80,$03,$03,$80,$00,$00,$00,$01,$00,$00
BEE0 DEFB $00,$00,$F0,$01,$03,$F8,$00,$00,$F0,$01,$00,$00,$00,$00,$00,$00
BEF0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
BF00 DEFB $40,$00,$00,$00,$00,$A0,$60,$00,$00,$00,$00,$18,$1C,$00,$00,$00
BF10 DEFB $00,$1E,$0F,$00,$00,$00,$00,$07,$03,$00,$00,$00,$00,$00,$3C,$00
BF20 DEFB $00,$00,$00,$FF,$FF,$00,$00,$00,$00,$FF,$3C,$00,$00,$00,$00,$00
BF30 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
BF40 DEFB $10,$00,$00,$00,$00,$28,$18,$00,$00,$00,$00,$06,$07,$00,$00,$00
BF50 DEFB $80,$07,$03,$C0,$00,$00,$C0,$01,$00,$C0,$00,$00,$00,$00,$0F,$00
BF60 DEFB $00,$00,$C0,$3F,$3F,$C0,$00,$00,$C0,$3F,$0F,$00,$00,$00,$00,$00
BF70 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
BF80 DEFB $04,$00,$00,$00,$00,$0A,$06,$00,$00,$00,$80,$01,$01,$C0,$00,$00
BF90 DEFB $E0,$01,$00,$F0,$00,$00,$70,$00,$00,$30,$00,$00,$00,$00,$03,$C0
BFA0 DEFB $00,$00,$F0,$0F,$0F,$F0,$00,$00,$F0,$0F,$03,$C0,$00,$00,$00,$00
BFB0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
BFC0 DEFB $01,$00,$00,$00,$80,$02,$01,$80,$00,$00,$60,$00,$00,$70,$00,$00
BFD0 DEFB $78,$00,$00,$3C,$00,$00,$1C,$00,$00,$0C,$00,$00,$00,$00,$00,$F0
BFE0 DEFB $00,$00,$FC,$03,$03,$FC,$00,$00,$FC,$03,$00,$F0,$00,$00,$00,$00
BFF0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
C000: Sprite addresses
C000 DEFW $C350 Sprite addr Cliff edge right; width 2
C002 DEFW $C318 Sprite addr Cliff edge left; width 2
C004 DEFW $CB50 Sprite addr Wall; width 4
C006 DEFW $CC18 Sprite addr ???
C008 DEFW $CF38 Sprite addr ???
C00A DEFW $CF78 Sprite addr
C00C DEFW $CFFC Sprite addr
C00E DEFW $D080 Sprite addr
C010 DEFW $D0C0 Sprite addr
C012 DEFW $D100 Sprite addr
C014 DEFW $D1A0 Sprite addr
C016 DEFW $D224 Sprite addr
C018 DEFW $D26C Sprite addr
C01A DEFW $D2D8 Sprite addr
C01C DEFW $D320 Sprite addr
C01E DEFW $D614 Sprite addr
C020 DEFW $D380 Sprite addr
C022 DEFW $0000 ??
C024 DEFW $D644 Sprite addr
C026 DEFW $D944 Sprite addr
C028 DEFW $CA90 Sprite addr ???; width ?
C02A DEFW $CAC0 Sprite addr ???; width ?
C02C DEFW $CB20 Sprite addr ???; width ?
C02E DEFW $CA00 Sprite addr Motorbike; width 6
C030 DEFW $C890 Sprite addr Hut; width 6
C032 DEFW $C980 Sprite addr Jeep; width 4
C034 DEFW $C508 Sprite addr Cave, exit to the right; width 6
C036 DEFW $C5F8 Sprite addr Cave, exit to the left; width 6
C038 DEFW $C6E8 Sprite addr Cave top edge; width 6
C03A DEFW $C718 Sprite addr Cave bottom edge; width 6
C03C DEFW $C748 Sprite addr Truck; width 8
C03E DEFW $C848 Sprite addr ???; width 2?
C040 DEFW $C478 Sprite addr Cliff top right; width 6
C042 DEFW $C2C4 Sprite addr ???; width 2
C044 DEFW $C388 Sprite addr Cliff bottom right; width 6
C046 DEFW $C1E0 Sprite addr Cliff top left; width 6
C048 DEFW $C270 Sprite addr ???; width 2
C04A DEFW $C0F0 Sprite addr Cliff bottom left; width 6
C04C DEFW $C0A0 Sprite addr ???; width 2
C04E DEFW $C050 Sprite addr ???; width 2
C050: Sprite ???; width 2
C050 DEFB $00,$7F,$00,$7F,$80,$7F,$80,$3F
C058 DEFB $80,$3F,$C0,$1F,$C0,$5F,$E0,$AF
C060 DEFB $A0,$4F,$50,$27,$B0,$17,$D8,$8B
C068 DEFB $E8,$13,$74,$09,$EC,$55,$F6,$01
C070 DEFB $AA,$00,$FE,$FE,$FF,$7C,$01,$7E
C078 DEFB $83,$54,$81,$2A,$AB,$09,$D5,$C4
C080 DEFB $F6,$EE,$3B,$EC,$11,$EE,$13,$C4
C088 DEFB $11,$00,$3B,$FD,$FF,$7D,$02,$FD
C090 DEFB $82,$54,$05,$2A,$AB,$01,$D5,$FD
C098 DEFB $FE,$55,$02,$01,$AA,$FF,$FE,$FF
C0A0: Sprite ???; width 2
C0A0 DEFB $00,$FF,$00,$FE,$00,$FE,$01,$FE
C0A8 DEFB $01,$FD,$01,$FC,$02,$F9,$03,$FA
C0B0 DEFB $06,$F4,$05,$F2,$0B,$E5,$0D,$EA
C0B8 DEFB $1A,$D5,$15,$CA,$2A,$95,$35,$80
C0C0 DEFB $6A,$80,$7F,$80,$7F,$7E,$7F,$3F
C0C8 DEFB $81,$5F,$C0,$3B,$A0,$55,$C4,$2A
C0D0 DEFB $AA,$80,$D5,$3E,$7F,$7F,$C1,$3F
C0D8 DEFB $80,$5F,$C0,$2A,$A0,$90,$D5,$80
C0E0 DEFB $6F,$7E,$7F,$3F,$81,$57,$C0,$2A
C0E8 DEFB $A8,$00,$D5,$80,$FF,$FF,$7F,$FF
C0F0: Sprite Cliff bottom left; width 6
C0F0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 cliffbotlt
C0FC DEFB $80,$30,$00,$00,$00,$00,$E8,$48,$00,$00,$04,$00
C108 DEFB $F6,$30,$C0,$04,$40,$08,$ED,$83,$80,$00,$28,$04
C114 DEFB $D7,$FF,$04,$00,$00,$00,$EF,$F3,$FE,$18,$01,$3F
C120 DEFB $F7,$EF,$FF,$1F,$FF,$3F,$FF,$EF,$FF,$BF,$FE,$FF
C12C DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
C138 DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
C144 DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
C150 DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
C15C DEFB $FF,$FB,$FF,$BF,$FF,$FF,$FF,$FF,$FF,$DF,$FF,$DF
C168 DEFB $FF,$FF,$FF,$FF,$FF,$BF,$FF,$FF,$FF,$FF,$FF,$FF
C174 DEFB $FD,$FF,$FF,$FF,$FF,$FF,$FA,$FF,$FF,$FF,$FF,$FF
C180 DEFB $FD,$FF,$BF,$FF,$FF,$FF,$FB,$FF,$7F,$FF,$FF,$FF
C18C DEFB $FF,$FE,$DF,$FF,$F3,$FF,$FF,$FE,$DF,$FF,$EB,$FF
C198 DEFB $FF,$FF,$5F,$FF,$F6,$FF,$FF,$FF,$7F,$DF,$FF,$FF
C1A4 DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$BF,$FE,$F7,$FF,$FF
C1B0 DEFB $FF,$7F,$FD,$F7,$FF,$FF,$FE,$FF,$FD,$F7,$FF,$F7
C1BC DEFB $FC,$FF,$FD,$FB,$FF,$FB,$FD,$FF,$FD,$FB,$F7,$FB
C1C8 DEFB $F9,$FF,$F9,$FD,$FF,$FD,$01,$FF,$F8,$03,$FD,$FC
C1D4 DEFB $00,$3F,$80,$00,$FF,$FE,$00,$00,$00,$00,$1F,$FE
C1E0: Sprite Cliff top left; width 6
C1E0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 clifftoplt
C1EC DEFB $00,$00,$00,$00,$00,$0F,$00,$00,$00,$70,$00,$FF
C1F8 DEFB $00,$00,$03,$FF,$07,$FF,$00,$00,$1F,$FF,$FF,$FF
C204 DEFB $00,$00,$7F,$FF,$FF,$8F,$00,$00,$FF,$FF,$FF,$DF
C210 DEFB $00,$01,$FF,$FF,$EF,$FF,$00,$00,$7F,$FF,$FB,$FF
C21C DEFB $00,$67,$BF,$FF,$FF,$FF,$01,$FF,$EF,$FF,$FF,$FF
C228 DEFB $03,$FF,$FF,$F5,$FF,$FF,$07,$FF,$FF,$FF,$FF,$DF
C234 DEFB $0F,$BF,$FF,$FF,$FF,$F7,$1E,$FF,$B7,$FF,$FF,$FF
C240 DEFB $7D,$FF,$FB,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
C24C DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
C258 DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
C264 DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
C270: Sprite ???; width 2
C270 DEFB $00,$FE,$00,$FE,$01,$FE,$01,$FC
C278 DEFB $01,$F8,$03,$F8,$07,$F8,$07,$FC
C280 DEFB $07,$FC,$03,$FE,$03,$F8,$01,$F8
C288 DEFB $07,$F0,$07,$E0,$0F,$E0,$1F,$E4
C290 DEFB $1F,$E2,$1B,$E4,$1D,$C6,$1B,$C0
C298 DEFB $39,$E0,$3F,$E0,$1F,$E0,$1F,$F0
C2A0 DEFB $1F,$F0,$0F,$F0,$0F,$E0,$0F,$E0
C2A8 DEFB $1F,$C0,$1F,$C0,$3F,$80,$3F,$80
C2B0 DEFB $7F,$D0,$7F,$A8,$2F,$90,$57,$28
C2B8 DEFB $6F,$10,$D7,$86,$EF,$E0,$79,$F8
C2C0 DEFB $1F,$FF,$07,$FF
C2C4: Sprite ???; width 2
C2C4 DEFB $00,$7F,$00,$7F,$80,$7F,$80,$3F
C2CC DEFB $80,$1F,$C0,$1F,$E0,$1F,$E0,$3F
C2D4 DEFB $E0,$3F,$C0,$7F,$C0,$1F,$80,$1F
C2DC DEFB $E0,$0F,$E0,$07,$F0,$07,$F8,$17
C2E4 DEFB $F8,$47,$D8,$27,$B8,$63,$D8,$03
C2EC DEFB $9C,$07,$FC,$07,$F8,$07,$F8,$0F
C2F4 DEFB $F8,$0F,$F0,$0F,$F0,$07,$F0,$07
C2FC DEFB $F8,$03,$F8,$03,$FC,$01,$FC,$01
C304 DEFB $FE,$0B,$FE,$15,$F4,$09,$EA,$14
C30C DEFB $F6,$08,$EB,$61,$F7,$07,$9E,$1F
C314 DEFB $F8,$FF,$E0,$FF
C318: Sprite Cliff edge left; width 2
C318 DEFB $00,$00,$00,$00,$01,$00,$03,$00 clifflt
C320 DEFB $03,$00,$03,$00,$03,$00,$07,$00
C328 DEFB $05,$00,$07,$00,$07,$00,$07,$00
C330 DEFB $07,$00,$07,$00,$0F,$00,$0F,$00
C338 DEFB $0F,$00,$0F,$00,$1F,$00,$1F,$00
C340 DEFB $3F,$00,$3B,$00,$35,$00,$7B,$00
C348 DEFB $FF,$00,$3F,$00,$1F,$00,$07,$00
C350: Sprite Cliff edge right; width 2
C350 DEFB $00,$00,$00,$00,$80,$00,$C0,$00 cliffrt
C358 DEFB $C0,$00,$C0,$00,$C0,$00,$E0,$00
C360 DEFB $A0,$00,$E0,$00,$E0,$00,$E0,$00
C368 DEFB $E0,$00,$E0,$00,$F0,$00,$F0,$00
C370 DEFB $F0,$00,$F0,$00,$F8,$00,$F8,$00
C378 DEFB $FC,$00,$DC,$00,$AC,$00,$DE,$00
C380 DEFB $FF,$00,$FC,$00,$F8,$00,$E0,$00
C388: Sprite Cliff bottom right; width 6
C388 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 cliffbotrt
C394 DEFB $00,$00,$00,$00,$0C,$01,$00,$20,$00,$00,$12,$17
C3A0 DEFB $10,$02,$20,$03,$0C,$6F,$20,$14,$00,$01,$C1,$B7
C3AC DEFB $00,$00,$00,$20,$FF,$EB,$FC,$80,$18,$7F,$CF,$F7
C3B8 DEFB $FC,$FF,$F8,$FF,$F7,$EF,$FF,$7F,$FD,$FF,$F7,$FF
C3C4 DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
C3D0 DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
C3DC DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
C3E8 DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
C3F4 DEFB $FF,$FF,$FD,$FF,$DF,$FF,$FB,$FF,$FB,$FF,$FF,$FF
C400 DEFB $FD,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
C40C DEFB $FF,$FF,$FF,$FF,$FF,$BF,$FF,$FF,$FF,$FF,$FF,$5F
C418 DEFB $FF,$FF,$FF,$FD,$FF,$BF,$FF,$FF,$FF,$FE,$FF,$DF
C424 DEFB $FF,$CF,$FF,$FB,$7F,$FF,$FF,$D7,$FF,$FB,$7F,$FF
C430 DEFB $FF,$6F,$FF,$FA,$FF,$FF,$FF,$FF,$FB,$FE,$FF,$FF
C43C DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$EF,$7F,$FD,$FF
C448 DEFB $FF,$FF,$EF,$BF,$FE,$FF,$EF,$FF,$EF,$BF,$FF,$7F
C454 DEFB $DF,$FF,$DF,$BF,$FF,$3F,$DF,$EF,$DF,$BF,$FF,$BF
C460 DEFB $BF,$FF,$BF,$9F,$FF,$9F,$3F,$BF,$C0,$1F,$FF,$80
C46C DEFB $7F,$FF,$00,$01,$FC,$00,$7F,$F8,$00,$00,$00,$00
C478: Sprite Cliff top right; width 6
C478 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 clifftoprt
C484 DEFB $F0,$00,$00,$00,$00,$00,$FF,$00,$0E,$00,$00,$00
C490 DEFB $FF,$E0,$FF,$C0,$00,$00,$FF,$FF,$FF,$F8,$00,$00
C49C DEFB $F1,$FF,$FF,$FE,$00,$00,$FB,$FF,$FF,$FF,$00,$00
C4A8 DEFB $FF,$F7,$FF,$FF,$80,$00,$FF,$DF,$FF,$FE,$00,$00
C4B4 DEFB $FF,$FF,$FF,$FD,$E6,$00,$FF,$FF,$FF,$F7,$FF,$80
C4C0 DEFB $FF,$FF,$AF,$FF,$FF,$C0,$FB,$FF,$FF,$FF,$FF,$E0
C4CC DEFB $EF,$FF,$FF,$FF,$FD,$F0,$FF,$FF,$FF,$ED,$FF,$78
C4D8 DEFB $FF,$FF,$FF,$DF,$FF,$BE,$FF,$FF,$FF,$FF,$FF,$FF
C4E4 DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
C4F0 DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
C4FC DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
C508: Sprite Cave, exit to the right; width 6
C508 DEFB $55,$00,$BD,$A8,$41,$EC,$6A,$81,$46,$D0,$20,$7A cavert
C514 DEFB $55,$02,$81,$E9,$B2,$36,$2A,$01,$83,$B0,$12,$1A
C520 DEFB $35,$02,$87,$0C,$01,$04,$2A,$05,$6B,$03,$3C,$04
C52C DEFB $35,$02,$9E,$00,$FF,$02,$28,$06,$0B,$80,$7F,$82
C538 DEFB $54,$0A,$15,$D0,$FF,$C6,$68,$04,$0B,$68,$FF,$CE
C544 DEFB $54,$0E,$06,$1D,$FF,$F4,$68,$05,$85,$47,$FF,$F8
C550 DEFB $50,$00,$66,$43,$FF,$E0,$A8,$01,$1D,$01,$FE,$80
C55C DEFB $D0,$00,$06,$81,$F5,$00,$A0,$08,$05,$C1,$EA,$00
C568 DEFB $D0,$1E,$02,$71,$D5,$00,$A0,$07,$06,$0D,$EA,$00
C574 DEFB $D0,$02,$E4,$13,$D4,$00,$A8,$05,$08,$21,$AA,$00
C580 DEFB $D0,$03,$0C,$00,$D4,$00,$A8,$04,$06,$20,$AA,$00
C58C DEFB $D0,$02,$07,$20,$D4,$00,$A0,$07,$03,$98,$6A,$00
C598 DEFB $D0,$00,$E7,$C1,$F5,$00,$A0,$00,$5E,$F7,$3A,$00
C5A4 DEFB $50,$00,$0C,$3C,$0D,$00,$68,$00,$14,$06,$0E,$80
C5B0 DEFB $54,$00,$0E,$03,$07,$00,$60,$00,$17,$03,$CD,$80
C5BC DEFB $50,$00,$0B,$80,$60,$C0,$A8,$00,$05,$57,$38,$40
C5C8 DEFB $D0,$02,$0A,$A2,$06,$20,$A0,$05,$55,$70,$01,$34
C5D4 DEFB $50,$1E,$AB,$98,$A0,$DA,$68,$03,$D6,$2D,$98,$2C
C5E0 DEFB $D0,$44,$7D,$1F,$46,$06,$A8,$00,$92,$2F,$A1,$84
C5EC DEFB $54,$00,$20,$15,$D4,$58,$68,$00,$00,$2A,$BA,$34
C5F8: Sprite Cave, exit to the left; width 6
C5F8 DEFB $37,$82,$15,$BD,$00,$AA,$5E,$04,$0B,$62,$81,$56 cavelt
C604 DEFB $6C,$4D,$97,$81,$40,$AA,$58,$48,$0D,$C1,$80,$54
C610 DEFB $20,$80,$30,$E1,$40,$AC,$20,$3C,$C0,$D6,$A0,$54
C61C DEFB $40,$FF,$00,$79,$40,$AC,$41,$FE,$01,$D0,$60,$14
C628 DEFB $63,$FF,$0B,$A8,$50,$2A,$73,$FF,$16,$D0,$20,$16
C634 DEFB $2F,$FF,$B8,$60,$70,$2A,$1F,$FF,$E2,$A1,$A0,$16
C640 DEFB $07,$FF,$C2,$66,$00,$0A,$01,$7F,$80,$B8,$80,$15
C64C DEFB $00,$AF,$81,$60,$00,$0B,$00,$57,$83,$A0,$10,$05
C658 DEFB $00,$AB,$8E,$40,$78,$0B,$00,$57,$B0,$60,$E0,$05
C664 DEFB $00,$2B,$C8,$27,$40,$0B,$00,$55,$84,$10,$A0,$15
C670 DEFB $00,$2B,$00,$30,$C0,$0B,$00,$55,$04,$60,$20,$15
C67C DEFB $00,$2B,$04,$E0,$40,$0B,$00,$56,$19,$C0,$E0,$05
C688 DEFB $00,$AF,$83,$E7,$00,$0B,$00,$5C,$EF,$7A,$00,$05
C694 DEFB $00,$B0,$3C,$30,$00,$0A,$01,$70,$60,$28,$00,$16
C6A0 DEFB $00,$E0,$C0,$70,$00,$2A,$01,$B3,$C0,$E8,$00,$06
C6AC DEFB $03,$06,$01,$D0,$00,$0A,$02,$1C,$EA,$A0,$00,$15
C6B8 DEFB $04,$60,$45,$50,$40,$0B,$2C,$80,$0E,$AA,$A0,$05
C6C4 DEFB $5B,$05,$19,$D5,$78,$0A,$34,$19,$B4,$6B,$C0,$16
C6D0 DEFB $60,$62,$F8,$BE,$22,$0B,$21,$85,$F4,$49,$00,$15
C6DC DEFB $1A,$2B,$A8,$04,$00,$2A,$2C,$5D,$54,$00,$00,$16
C6E8: Sprite Cave top edge; width 6
C6E8 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 cavetop
C6F4 DEFB $0F,$F8,$07,$FC,$0F,$F8,$3A,$AF,$FE,$AB,$FA,$AE
C700 DEFB $55,$55,$55,$05,$55,$55,$68,$00,$00,$00,$00,$01
C70C DEFB $54,$00,$21,$54,$00,$0A,$6A,$64,$CA,$AB,$26,$56
C718: Sprite Cave bottom edge; width 6
C718 DEFB $30,$80,$00,$00,$00,$2A,$30,$00,$00,$00,$00,$15 cavebot
C724 DEFB $25,$00,$04,$00,$2A,$AB,$6A,$B5,$7A,$A0,$F5,$57
C730 DEFB $77,$EB,$C7,$F3,$0E,$BA,$3C,$1E,$01,$9C,$03,$CC
C73C DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
C748: Sprite Truck; width 8
C748 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
C758 DEFB $00,$00,$D0,$01,$40,$29,$10,$44,$07,$00,$AF,$F9,$FA,$50,$A8,$8E
C768 DEFB $08,$00,$DE,$05,$75,$A9,$08,$47,$18,$00,$AF,$07,$EA,$54,$88,$22
C778 DEFB $18,$00,$CE,$05,$75,$80,$14,$07,$18,$00,$A5,$07,$E8,$04,$AC,$23
C788 DEFB $28,$00,$CE,$05,$74,$80,$14,$07,$28,$00,$E5,$07,$38,$02,$AC,$23
C798 DEFB $28,$00,$CA,$05,$75,$80,$D2,$11,$28,$00,$E5,$07,$2A,$42,$EA,$83
C7A8 DEFB $48,$00,$EA,$05,$55,$80,$52,$11,$68,$00,$FC,$07,$80,$03,$02,$0E
C7B8 DEFB $D7,$00,$EF,$FF,$E0,$04,$84,$31,$B0,$00,$DF,$07,$7F,$FC,$FE,$E3
C7C8 DEFB $D7,$00,$CF,$B5,$FF,$F8,$FE,$F1,$AF,$00,$DF,$B7,$7F,$FC,$FE,$E3
C7D8 DEFB $EF,$00,$CF,$75,$FF,$F8,$FE,$F1,$DF,$00,$D7,$72,$7F,$F4,$FE,$E3
C7E8 DEFB $C0,$00,$CF,$03,$FF,$F8,$FE,$D1,$C0,$00,$D7,$02,$7F,$F4,$FE,$E3
C7F8 DEFB $C0,$00,$CF,$03,$FF,$F8,$FE,$D1,$4A,$00,$D7,$AA,$7F,$FC,$FE,$E3
C808 DEFB $57,$00,$CF,$F5,$FF,$F8,$FE,$F1,$78,$00,$DF,$0E,$7F,$FC,$FE,$EB
C818 DEFB $20,$00,$FF,$07,$FF,$FF,$FC,$FF,$27,$00,$AA,$FA,$AA,$AA,$AA,$AA
C828 DEFB $2F,$00,$00,$FF,$00,$00,$02,$00,$16,$00,$FF,$31,$FF,$FF,$FC,$FF
C838 DEFB $07,$00,$00,$70,$73,$E0,$E0,$9C,$03,$00,$00,$E0,$3F,$00,$C0,$0F
C848: Sprite ???; width 2?
C848 DEFB $00,$E7,$00,$FF,$00,$FF,$00,$C3
C850 DEFB $18,$81,$00,$C3,$00,$FF,$3C,$00
C858 DEFB $7E,$00,$00,$7F,$00,$3F,$FF,$80
C860 DEFB $FF,$C0,$80,$1F,$C0,$0F,$7F,$E0
C868 DEFB $3F,$F0,$E0,$07,$F0,$03,$1F,$F8
C870 DEFB $0F,$FC,$F8,$01,$FC,$00,$07,$FE
C878 DEFB $03,$FF,$FE,$00,$FF,$81,$01,$FF
C880 DEFB $00,$FF,$FF,$C3,$7E,$E7,$00,$FF
C888 DEFB $00,$FF,$3C,$FF,$18,$FF,$00,$FF
C890: Sprite Hut; width 6
C890 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 hut
C89C DEFB $FF,$C0,$00,$00,$1F,$FF,$20,$3F,$FF,$FF,$F9,$D0
C8A8 DEFB $34,$6A,$AA,$AA,$AB,$A0,$6A,$F9,$99,$99,$99,$40
C8B4 DEFB $FF,$CA,$AA,$AA,$AB,$84,$FF,$F9,$99,$99,$99,$AA
C8C0 DEFB $8C,$0E,$AA,$AA,$AB,$D5,$06,$03,$99,$99,$99,$EB
C8CC DEFB $A3,$86,$AA,$AA,$AA,$7F,$D5,$45,$99,$99,$99,$01
C8D8 DEFB $FF,$AE,$AA,$AA,$AA,$82,$FF,$59,$99,$99,$99,$D5
C8E4 DEFB $AB,$BA,$AA,$AA,$AA,$EB,$54,$F5,$55,$55,$55,$7F
C8F0 DEFB $AA,$AA,$AA,$AA,$AA,$AA,$FF,$FF,$FF,$FF,$FF,$FF
C8FC DEFB $FF,$FF,$FF,$FF,$FF,$FF,$F7,$FF,$FF,$FF,$FC,$0F
C908 DEFB $E2,$FF,$80,$00,$F8,$03,$C2,$FF,$7F,$FF,$F8,$01
C914 DEFB $6B,$7F,$7F,$FE,$F8,$AA,$D5,$7F,$7F,$FE,$FD,$55
C920 DEFB $7F,$DF,$7F,$FE,$FF,$FF,$7F,$EF,$7F,$FE,$C1,$E0
C92C DEFB $C0,$37,$7F,$FE,$80,$C0,$A0,$1F,$7F,$FE,$80,$62
C938 DEFB $D4,$1F,$7F,$FE,$D5,$D5,$AA,$9F,$7F,$FE,$AB,$6A
C944 DEFB $D5,$5F,$7F,$FE,$D5,$FF,$EA,$BF,$7F,$FE,$FF,$C2
C950 DEFB $7F,$FF,$7F,$FE,$F8,$15,$70,$5F,$7F,$FE,$F0,$AB
C95C DEFB $E0,$2F,$7F,$FE,$F1,$55,$D0,$2F,$7F,$FE,$F8,$AB
C968 DEFB $EA,$2F,$7F,$FE,$FF,$FE,$D5,$2F,$7F,$FE,$FC,$01
C974 DEFB $EA,$DF,$7F,$FE,$FC,$02,$FF,$FF,$FF,$FF,$FF,$D5
C980: Sprite Jeep; width 4
C980 DEFB $7F,$FF,$FF,$FE,$43,$AA,$AA,$C2 jeep
C988 DEFB $47,$FF,$FF,$E2,$3F,$FF,$FF,$FC
C990 DEFB $6F,$F8,$00,$06,$4C,$9F,$FF,$F2
C998 DEFB $59,$E5,$55,$7A,$5B,$F6,$BE,$BA
C9A0 DEFB $57,$3B,$FF,$DE,$66,$FB,$FF,$FA
C9A8 DEFB $63,$F3,$FF,$FE,$61,$E3,$FF,$FA
C9B0 DEFB $40,$03,$F9,$F6,$77,$F7,$B7,$D2
C9B8 DEFB $5A,$AF,$3F,$CE,$5F,$FF,$10,$8A
C9C0 DEFB $98,$0F,$10,$85,$BC,$1F,$1D,$45
C9C8 DEFB $BF,$FF,$1E,$25,$B0,$01,$8E,$45
C9D0 DEFB $9F,$FF,$CF,$09,$C0,$00,$7E,$92
C9D8 DEFB $D5,$55,$57,$75,$AA,$AA,$AE,$AB
C9E0 DEFB $D5,$55,$57,$56,$BF,$FF,$FF,$FD
C9E8 DEFB $C0,$00,$03,$03,$7F,$FF,$FF,$FE
C9F0 DEFB $00,$00,$00,$00,$00,$00,$00,$00
C9F8 DEFB $00,$00,$00,$00,$00,$00,$00,$00
CA00: Sprite Motorbike; width 6
CA00 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 motorbike
CA0C DEFB $00,$00,$38,$00,$00,$00,$00,$00,$44,$00,$00,$00
CA18 DEFB $00,$00,$82,$00,$00,$00,$00,$00,$82,$00,$00,$00
CA24 DEFB $00,$03,$BF,$00,$00,$00,$00,$05,$46,$80,$00,$00
CA30 DEFB $00,$09,$3F,$C0,$00,$00,$00,$1A,$20,$A0,$00,$00
CA3C DEFB $00,$2E,$19,$D1,$C0,$00,$00,$27,$87,$BA,$00,$00
CA48 DEFB $01,$E1,$E2,$6B,$C0,$00,$07,$50,$5D,$FF,$F0,$00
CA54 DEFB $0D,$F8,$3F,$DD,$D8,$00,$19,$06,$1F,$B6,$0C,$00
CA60 DEFB $13,$FF,$1F,$A3,$E4,$00,$37,$56,$3F,$6F,$76,$00
CA6C DEFB $2D,$AC,$7C,$59,$9E,$00,$1D,$FE,$60,$38,$9C,$00
CA78 DEFB $1C,$0F,$80,$38,$1C,$00,$0F,$3D,$C0,$1E,$78,$00
CA84 DEFB $07,$F8,$00,$0F,$F0,$00,$01,$E0,$00,$03,$C0,$00
CA90: Sprite ???; width ?
CA90 DEFB $00,$FF,$00,$37,$00,$80,$00,$FC
CA98 DEFB $00,$C3,$C8,$07,$7F,$1F,$03,$F0
CAA0 DEFB $3C,$F0,$F8,$7F,$E0,$BF,$0F,$C8
CAA8 DEFB $0F,$10,$80,$55,$40,$00,$37,$88
CAB0 DEFB $EF,$E4,$AA,$00,$FF,$3C,$77,$F8
CAB8 DEFB $1B,$79,$FF,$79,$C3,$78,$07,$78
CAC0: Sprite ???; width ?
CAC0 DEFB $00,$7E,$00,$1E,$00,$7E,$00,$1E
CAC8 DEFB $00,$E1,$00,$71,$00,$E1,$00,$71
CAD0 DEFB $81,$8F,$E1,$FF,$81,$8F,$E1,$FF
CAD8 DEFB $1E,$FF,$8E,$FF,$1E,$FF,$8E,$FF
CAE0 DEFB $70,$FF,$00,$FF,$70,$FF,$00,$FF
CAE8 DEFB $00,$AA,$00,$AA,$00,$AA,$00,$AA
CAF0 DEFB $00,$50,$00,$05,$00,$50,$00,$05
CAF8 DEFB $55,$00,$55,$00,$55,$00,$55,$00
CB00 DEFB $AF,$03,$FA,$E0,$AF,$03,$FA,$E0
CB08 DEFB $FF,$FE,$FF,$7F,$FF,$FE,$FF,$7F
CB10 DEFB $FC,$FD,$1F,$7A,$FC,$19,$1F,$11
CB18 DEFB $01,$0E,$80,$9D,$01,$02,$80,$DF
CB20: Sprite ???; width ?
CB20 DEFB $00,$EC,$00,$FF,$00,$3F,$00,$01
CB28 DEFB $13,$E0,$00,$C3,$C0,$0F,$FE,$F8
CB30 DEFB $1F,$FE,$3C,$0F,$F0,$13,$07,$FD
CB38 DEFB $01,$AA,$F0,$08,$EC,$11,$02,$00
CB40 DEFB $55,$00,$F7,$27,$EE,$1F,$FF,$3C
CB48 DEFB $FF,$02,$D8,$FA,$E0,$84,$C3,$D7
CB50: Sprite Wall; width 4
CB50 DEFB $00,$00,$00,$00,$00,$00,$00,$00 wall
CB58 DEFB $7F,$FE,$7F,$FE,$FF,$FF,$FF,$FF
CB60 DEFB $FF,$FF,$FF,$FF,$7F,$FF,$7F,$FF
CB68 DEFB $FF,$FF,$FF,$FF,$AA,$AA,$AA,$AA
CB70 DEFB $7F,$FE,$7F,$FE,$6F,$FE,$6F,$FE
CB78 DEFB $57,$FE,$55,$FE,$EB,$FE,$EB,$FE
CB80 DEFB $D7,$FE,$D5,$FE,$AB,$FE,$AA,$FE
CB88 DEFB $D5,$7E,$D5,$7E,$6A,$AE,$6A,$AE
CB90 DEFB $75,$56,$F5,$56,$3F,$F9,$BF,$FB
CB98 DEFB $01,$80,$03,$80,$F7,$BF,$F7,$BF
CBA0 DEFB $FC,$EA,$FC,$EA,$FE,$D7,$FE,$D7
CBA8 DEFB $FE,$AB,$FE,$AB,$FE,$D5,$FE,$D5
CBB0 DEFB $BE,$AA,$BE,$AA,$56,$55,$56,$55
CBB8 DEFB $AF,$6A,$AE,$EA,$FD,$B7,$FD,$B7
CBC0 DEFB $00,$00,$00,$00,$7F,$F7,$7F,$F7
CBC8 DEFB $AB,$FC,$AB,$FC,$57,$FD,$57,$FD
CBD0 DEFB $AA,$FD,$AA,$FD,$55,$5D,$55,$5D
CBD8 DEFB $AA,$B9,$AA,$B9,$FF,$F6,$FF,$F6
CBE0 DEFB $00,$00,$00,$00,$FB,$7F,$FB,$7F
CBE8 DEFB $FC,$AF,$FC,$AF,$FD,$55,$FD,$55
CBF0 DEFB $BD,$AA,$BD,$AA,$F9,$7F,$F9,$7F
CBF8 DEFB $00,$00,$00,$00,$7F,$FD,$7F,$FC
CC00 DEFB $55,$FE,$55,$FE,$AA,$AE,$AA,$AE
CC08 DEFB $7F,$FC,$7F,$FC,$00,$00,$00,$00
CC10 DEFB $F8,$7F,$F8,$7F,$FE,$AA,$FE,$AA
CC18: ???
CC18 DEFB $00,$80,$00,$01,$00,$80,$00,$01
CC20 DEFB $00,$80,$00,$01,$00,$80,$00,$01
CC28 DEFB $00,$00,$00,$00,$00,$00,$00,$00
CC30 DEFB $00,$00,$00,$00,$00,$00,$00,$00
CC38 DEFB $7F,$00,$FE,$00,$7F,$00,$FE,$00
CC40 DEFB $7F,$00,$FE,$00,$7F,$00,$FE,$00
CC48 DEFB $FF,$00,$FF,$80,$FF,$00,$FF,$80
CC50 DEFB $FF,$00,$FF,$80,$FF,$00,$FF,$80
CC58 DEFB $FF,$00,$FF,$00,$FF,$00,$FF,$00
CC60 DEFB $FF,$00,$FF,$00,$FF,$00,$FF,$00
CC68 DEFB $FF,$55,$7F,$55,$FF,$55,$7F,$55
CC70 DEFB $FF,$55,$7F,$55,$FF,$55,$7F,$55
CC78 DEFB $FF,$80,$FF,$01,$FF,$80,$FF,$01
CC80 DEFB $FF,$00,$FF,$01,$FF,$80,$FF,$01
CC88 DEFB $AA,$01,$AA,$90,$AA,$01,$AA,$50
CC90 DEFB $AA,$01,$AA,$90,$AA,$01,$AA,$90
CC98 DEFB $7F,$AA,$FE,$01,$7F,$AA,$FE,$01
CCA0 DEFB $FF,$AA,$FE,$01,$7F,$A8,$FE,$01
CCA8 DEFB $FE,$01,$6F,$14,$FE,$01,$AF,$FE
CCB0 DEFB $FE,$7F,$6F,$00,$FE,$01,$6F,$14
CCB8 DEFB $55,$2A,$FE,$00,$55,$7F,$FE,$80
CCC0 DEFB $55,$01,$FE,$FE,$57,$28,$FE,$01
CCC8 DEFB $FE,$01,$EB,$F4,$FE,$01,$01,$F8
CCD0 DEFB $80,$02,$FF,$80,$FE,$07,$EB,$55
CCD8 DEFB $D5,$2A,$FF,$98,$80,$17,$7F,$95
CCE0 DEFB $FE,$F1,$01,$50,$D7,$1A,$FE,$81
CCE8 DEFB $FE,$51,$0B,$C7,$FE,$BC,$07,$F2
CCF0 DEFB $FD,$EA,$7F,$0B,$F8,$63,$AA,$95
CCF8 DEFB $D5,$0A,$67,$8F,$E8,$97,$6A,$E5
CD00 DEFB $0E,$55,$AF,$7D,$E5,$F1,$7E,$A9
CD08 DEFB $AE,$86,$38,$F8,$43,$AC,$0D,$A2
CD10 DEFB $15,$C2,$F4,$AA,$9C,$17,$6A,$41
CD18 DEFB $F5,$FA,$70,$6B,$68,$95,$1A,$05
CD20 DEFB $AA,$41,$82,$51,$0E,$5E,$56,$5F
CD28 DEFB $79,$20,$07,$A8,$53,$00,$5D,$10
CD30 DEFB $3D,$08,$55,$00,$E8,$15,$BE,$04
CD38 DEFB $05,$09,$94,$AA,$6A,$01,$FA,$55
CD40 DEFB $BE,$55,$AE,$40,$A1,$55,$A0,$90
CD48 DEFB $DF,$D0,$57,$09,$FF,$A8,$EF,$AA
CD50 DEFB $F7,$AA,$FF,$2A,$EA,$90,$FB,$0B
CD58 DEFB $F6,$13,$55,$C1,$FE,$55,$AA,$55
CD60 DEFB $AA,$55,$BF,$55,$AA,$03,$6F,$C8
CD68 DEFB $2F,$F4,$F6,$84,$57,$AA,$55,$AA
CD70 DEFB $55,$AA,$D5,$AA,$6F,$E2,$F4,$25
CD78 DEFB $EC,$2A,$3E,$C1,$AA,$55,$AA,$55
CD80 DEFB $AA,$55,$AA,$55,$FC,$41,$37,$54
CD88 DEFB $0B,$A2,$7B,$80,$55,$AA,$55,$AA
CD90 DEFB $55,$AA,$55,$AA,$1D,$02,$DA,$C5
CD98 DEFB $D5,$42,$3E,$81,$AA,$55,$AA,$55
CDA0 DEFB $AA,$55,$AA,$55,$BE,$41,$AB,$42
CDA8 DEFB $5D,$02,$7F,$A0,$55,$AA,$55,$AA
CDB0 DEFB $55,$AA,$55,$AA,$FD,$02,$3A,$B0
CDB8 DEFB $BD,$BC,$7E,$05,$AA,$55,$AA,$55
CDC0 DEFB $AA,$55,$AA,$55,$BE,$40,$BD,$19
CDC8 DEFB $FD,$15,$5F,$A0,$55,$AA,$55,$AA
CDD0 DEFB $55,$AA,$55,$AA,$FD,$02,$4F,$BE
CDD8 DEFB $43,$5C,$FA,$05,$AA,$55,$AA,$57
CDE0 DEFB $AA,$57,$AA,$55,$BF,$40,$E6,$2E
CDE8 DEFB $EA,$16,$5F,$A0,$55,$AA,$55,$AA
CDF0 DEFB $55,$AA,$55,$AA,$FD,$02,$41,$28
CDF8 DEFB $A3,$54,$FA,$05,$AA,$D5,$A8,$55
CE00 DEFB $A8,$55,$AA,$5D,$BF,$40,$D1,$2A
CE08 DEFB $E9,$14,$5F,$A0,$55,$AA,$55,$AA
CE10 DEFB $55,$AE,$55,$AE,$FD,$02,$D7,$28
CE18 DEFB $AB,$00,$FA,$05,$2A,$5D,$AA,$D5
CE20 DEFB $AA,$77,$A2,$55,$BF,$40,$D5,$00
CE28 DEFB $EB,$0C,$5F,$A0,$55,$BE,$55,$AA
CE30 DEFB $51,$BA,$51,$AA,$FD,$03,$D7,$30
CE38 DEFB $FF,$7C,$FA,$05,$A2,$D7,$2A,$D5
CE40 DEFB $88,$F5,$AA,$75,$BF,$50,$FF,$2E
CE48 DEFB $F3,$14,$5F,$A0,$41,$BA,$55,$AF
CE50 DEFB $45,$AF,$55,$EB,$FC,$0A,$CF,$28
CE58 DEFB $83,$94,$FA,$07,$28,$5D,$2A,$F5
CE60 DEFB $0A,$D7,$8A,$5F,$AF,$50,$D1,$29
CE68 DEFB $EB,$15,$5F,$E0,$45,$EF,$50,$AE
CE70 DEFB $50,$BE,$14,$EA,$F5,$0A,$D7,$A8
CE78 DEFB $6B,$90,$F8,$07,$A2,$55,$0A,$D7
CE80 DEFB $28,$FF,$A0,$5F,$AF,$50,$D6,$09
CE88 DEFB $EA,$21,$1F,$E0,$10,$EE,$51,$FE
CE90 DEFB $41,$FF,$15,$BE,$F5,$0B,$57,$86
CE98 DEFB $6F,$5C,$F8,$07,$AA,$5F,$28,$FF
CEA0 DEFB $00,$FF,$A0,$FD,$AF,$70,$F6,$32
CEA8 DEFB $DE,$5A,$1F,$A0,$11,$FE,$01,$FF
CEB0 DEFB $00,$FF,$41,$EF,$F4,$0A,$79,$4A
CEB8 DEFB $A3,$44,$F8,$17,$A0,$FF,$00,$FF
CEC0 DEFB $00,$FF,$02,$FF,$8F,$D0,$CD,$22
CEC8 DEFB $A5,$14,$5F,$A8,$01,$FF,$00,$FF
CED0 DEFB $00,$FF,$10,$FF,$F5,$0A,$B5,$28
CED8 DEFB $BB,$21,$E8,$1F,$00,$FF,$00,$FF
CEE0 DEFB $00,$FF,$00,$FF,$2F,$F8,$DD,$84
CEE8 DEFB $EB,$4B,$57,$E9,$00,$FF,$00,$FF
CEF0 DEFB $00,$FF,$00,$FF,$F5,$8F,$D7,$D2
CEF8 DEFB $DE,$15,$E0,$9F,$00,$FF,$00,$FF
CF00 DEFB $00,$FF,$00,$FF,$07,$F8,$7B,$A8
CF08 DEFB $B4,$10,$16,$FC,$00,$FF,$00,$FF
CF10 DEFB $00,$FF,$00,$FF,$70,$3F,$2D,$08
CF18 DEFB $EA,$FF,$60,$FF,$00,$FF,$00,$FE
CF20 DEFB $00,$F9,$00,$E7,$07,$9F,$57,$9F
CF28 DEFB $EF,$FF,$03,$F9,$00,$F2,$00,$E1
CF30 DEFB $00,$C2,$00,$81,$C0,$86,$F7,$8F
CF38: Sprite ???
CF38 DEFB $00,$FF,$00,$9F,$00,$6F,$00,$FE
CF40 DEFB $00,$F9,$60,$F7,$90,$FB,$01,$E7
CF48 DEFB $06,$9F,$08,$F9,$04,$E1,$18,$9F
CF50 DEFB $60,$8F,$06,$95,$1E,$29,$60,$86
CF58 DEFB $70,$81,$6A,$51,$D6,$A7,$79,$C2
CF60 DEFB $7E,$E1,$AE,$1F,$58,$7F,$3D,$F2
CF68 DEFB $1E,$F9,$E0,$FF,$80,$FF,$0D,$FF
CF70 DEFB $06,$FF,$00,$FF,$00,$FF,$00,$FF
CF78: Sprite for the scenery drawn by 8ECC
CF78 DEFB $00,$FF,$00,$F3,$00,$FF,$00,$CF
CF80 DEFB $00,$CD,$00,$FF,$00,$FF,$0C,$3E
CF88 DEFB $00,$B7,$30,$7B,$32,$FF,$00,$FC
CF90 DEFB $00,$F3,$C1,$FF,$48,$3D,$84,$3C
CF98 DEFB $00,$FC,$03,$F3,$0C,$F1,$00,$F2
CFA0 DEFB $C2,$B2,$C3,$04,$03,$C5,$0C,$F0
CFA8 DEFB $0E,$F0,$0D,$2A,$4D,$2A,$FB,$54
CFB0 DEFB $3A,$54,$0F,$C8,$0F,$3C,$D5,$20
CFB8 DEFB $D5,$A3,$AB,$4F,$AB,$44,$37,$3E
CFC0 DEFB $C3,$1F,$DF,$28,$5C,$3F,$B0,$FF
CFC8 DEFB $BB,$54,$C1,$0C,$E0,$02,$D7,$A3
CFD0 DEFB $C0,$FF,$00,$FF,$AB,$4F,$F3,$85
CFD8 DEFB $FD,$C2,$5C,$3F,$00,$FF,$00,$FF
CFE0 DEFB $B0,$FF,$7A,$E4,$3D,$F3,$C0,$FF
CFE8 DEFB $00,$FF,$00,$FF,$00,$FF,$1B,$FF
CFF0 DEFB $0C,$FF,$00,$FF,$00,$FF,$00,$F3
CFF8 DEFB $00,$FF,$00,$FF
CFFC: Sprite for the grenade crate (8EE3)
CFFC DEFB $00,$FF,$00,$FC,$00,$FF,$00,$7F
D004 DEFB $00,$F3,$00,$FF,$00,$FF,$03,$CF
D00C DEFB $00,$8F,$80,$D7,$0C,$3F,$00,$FF
D014 DEFB $00,$FC,$30,$DF,$70,$CB,$28,$0D
D01C DEFB $C0,$EF,$00,$F3,$03,$CF,$20,$F4
D024 DEFB $34,$AC,$F2,$42,$10,$F1,$0C,$CF
D02C DEFB $30,$C7,$0B,$CA,$53,$84,$BD,$2A
D034 DEFB $0E,$11,$30,$C3,$38,$C0,$35,$A8
D03C DEFB $7B,$14,$D5,$A3,$EE,$52,$3C,$21
D044 DEFB $3F,$30,$57,$85,$EB,$0F,$5C,$3F
D04C DEFB $AD,$2A,$DE,$19,$CF,$0C,$7A,$44
D054 DEFB $F0,$FF,$C0,$FF,$D5,$A3,$E6,$02
D05C DEFB $F3,$85,$BB,$4F,$00,$FF,$00,$FF
D064 DEFB $5C,$3F,$FD,$C2,$7A,$E4,$B0,$FF
D06C DEFB $00,$FF,$00,$FF,$C0,$FF,$3D,$F3
D074 DEFB $1B,$FF,$00,$FF,$00,$FF,$00,$FF
D07C DEFB $00,$FF,$0C,$FF
D080: Sprite for the scenery drawn by 8E74
D080 DEFB $00,$FF,$00,$F3,$00,$ED,$00,$FF
D088 DEFB $00,$FF,$0C,$CE,$12,$A6,$00,$FF
D090 DEFB $00,$FF,$31,$46,$59,$81,$00,$FE
D098 DEFB $00,$FD,$B9,$03,$7E,$0F,$01,$FA
D0A0 DEFB $02,$F4,$FC,$0F,$F0,$57,$05,$E8
D0A8 DEFB $0B,$D0,$F0,$B7,$A8,$BB,$17,$43
D0B0 DEFB $2F,$25,$48,$71,$44,$3F,$BC,$C2
D0B8 DEFB $DA,$FF,$8E,$FF,$C0,$B7,$3D,$CF
D0C0: Sprite for the scenery drawn by 8E83
D0C0 DEFB $00,$CF,$00,$FF,$00,$FF,$00,$B7
D0C8 DEFB $30,$73,$00,$FF,$00,$FF,$48,$65
D0D0 DEFB $8C,$62,$00,$FF,$00,$7F,$9A,$81
D0D8 DEFB $9D,$C0,$00,$BF,$80,$5F,$7E,$F0
D0E0 DEFB $3F,$F0,$40,$2F,$A0,$17,$0F,$EA
D0E8 DEFB $0F,$ED,$D0,$0B,$E8,$C2,$15,$DD
D0F0 DEFB $12,$8E,$F4,$A4,$3D,$43,$22,$FC
D0F8 DEFB $71,$FF,$5B,$FF,$BC,$FF,$03,$FF
D100: Sprite for the tall scenery drawn by 897F
D100 DEFB $00,$83,$00,$79,$7C,$3D,$86,$41
D108 DEFB $C2,$41,$BE,$40,$BE,$82,$BF,$6E
D110 DEFB $7D,$39,$91,$31,$C6,$61,$CE,$41
D118 DEFB $9E,$41,$BE,$C5,$BE,$81,$3A,$FD
D120 DEFB $7E,$83,$02,$7D,$7C,$39,$82,$41
D128 DEFB $C6,$41,$BE,$41,$BE,$41,$BE,$41
D130 DEFB $BE,$61,$BE,$41,$9E,$61,$BE,$41
D138 DEFB $9E,$21,$BE,$A1,$DE,$81,$5E,$3D
D140 DEFB $7E,$83,$C2,$75,$7C,$39,$8A,$41
D148 DEFB $C6,$41,$BE,$40,$BE,$42,$BF,$86
D150 DEFB $BD,$ED,$79,$79,$12,$19,$86,$4D
D158 DEFB $E6,$4D,$B2,$46,$B2,$62,$B9,$7D
D160 DEFB $9D,$83,$82,$3D,$7C,$79,$C2,$01
D168 DEFB $86,$41,$FE,$40,$BE,$82,$BF,$F6
D170 DEFB $7D,$7D,$09,$0D,$82,$19,$F2,$71
D178 DEFB $E6,$C1,$8E,$83,$3E,$7D,$7C,$39
D180 DEFB $82,$41,$C6,$61,$BE,$41,$9E,$61
D188 DEFB $BE,$41,$9E,$61,$BE,$71,$9E,$29
D190 DEFB $8E,$3D,$D6,$C3,$C2,$FF,$3C,$FF
D198 DEFB $00,$FF,$00,$FF,$00,$C7,$00,$E7
D1A0: Sprite for the scenery drawn by 903E
D1A0 DEFB $00,$FF,$00,$81,$00,$FF,$00,$7F
D1A8 DEFB $00,$3C,$00,$FE,$00,$FE,$7E,$DD
D1B0 DEFB $00,$3F,$80,$BF,$C3,$FA,$01,$F8
D1B8 DEFB $01,$F3,$22,$FD,$C0,$1F,$40,$9F
D1C0 DEFB $05,$EA,$07,$F7,$0C,$E7,$02,$75
D1C8 DEFB $E0,$0F,$60,$07,$15,$EA,$08,$C7
D1D0 DEFB $18,$DF,$8A,$D5,$F0,$17,$F8,$07
D1D8 DEFB $15,$AA,$38,$DF,$20,$95,$2A,$D4
D1E0 DEFB $E8,$03,$F8,$03,$55,$A0,$20,$BD
D1E8 DEFB $6A,$31,$2B,$44,$FC,$03,$FC,$21
D1F0 DEFB $5F,$88,$42,$72,$CE,$B5,$BB,$40
D1F8 DEFB $FC,$01,$DE,$08,$77,$A0,$8D,$8A
D200 DEFB $4A,$A1,$BF,$40,$FE,$A0,$F7,$55
D208 DEFB $5F,$1B,$75,$50,$5E,$AA,$BF,$AE
D210 DEFB $5F,$AB,$AA,$FF,$E4,$7F,$AF,$F5
D218 DEFB $55,$FF,$51,$FF,$54,$FF,$00,$FE
D220 DEFB $80,$FE,$0A,$FF
D224: Sprite for the scenery drawn by 8F17
D224 DEFB $00,$FF,$00,$81,$00,$7E,$00,$FF
D22C DEFB $00,$FE,$7E,$EA,$81,$54,$00,$FE
D234 DEFB $01,$FE,$15,$A8,$AB,$00,$01,$FF
D23C DEFB $01,$F8,$57,$FB,$FF,$54,$00,$F1
D244 DEFB $07,$E8,$04,$A9,$AB,$02,$0E,$E4
D24C DEFB $17,$E9,$56,$50,$FD,$A9,$1B,$F2
D254 DEFB $16,$C4,$AF,$14,$56,$40,$0D,$A3
D25C DEFB $3B,$54,$EB,$91,$BF,$40,$5C,$80
D264 DEFB $AB,$FF,$6E,$FF,$BF,$00,$7F,$FF
D26C: Sprite for the scenery drawn by 8F26
D26C DEFB $00,$00,$00,$81,$00,$81,$00,$7C
D274 DEFB $00,$7E,$00,$FE,$FF,$6A,$7E,$3A
D27C DEFB $7E,$74,$83,$A8,$81,$54,$01,$54
D284 DEFB $95,$28,$C5,$28,$8B,$55,$57,$00
D28C DEFB $AB,$80,$AB,$00,$D7,$F4,$D7,$FE
D294 DEFB $AA,$FE,$FF,$2A,$7F,$B4,$FF,$A8
D29C DEFB $0B,$01,$01,$4A,$01,$54,$D5,$01
D2A4 DEFB $4B,$14,$57,$84,$FE,$A9,$B5,$41
D2AC DEFB $AB,$2B,$FE,$50,$EB,$2A,$7B,$50
D2B4 DEFB $56,$01,$BE,$14,$D4,$00,$AF,$09
D2BC DEFB $D5,$81,$AF,$6A,$FE,$81,$EB,$62
D2C4 DEFB $FF,$82,$F6,$0E,$7E,$84,$95,$03
D2CC DEFB $7E,$FF,$9D,$FF,$7D,$FF,$F1,$29
D2D4 DEFB $7B,$53,$FC,$0F
D2D8: Sprite for the scenery drawn by 8F35
D2D8 DEFB $00,$FF,$00,$FF,$00,$FF,$00,$0F
D2E0 DEFB $00,$53,$00,$FF,$00,$FF,$F0,$29
D2E8 DEFB $AC,$15,$00,$7F,$00,$BF,$D6,$00
D2F0 DEFB $EA,$DF,$80,$1F,$40,$9F,$FF,$2A
D2F8 DEFB $20,$95,$E0,$5F,$60,$2F,$D5,$40
D300 DEFB $6A,$0A,$A0,$A7,$D0,$57,$BF,$95
D308 DEFB $F5,$28,$58,$27,$A8,$C3,$6A,$02
D310 DEFB $D7,$89,$D8,$27,$3C,$0F,$FD,$28
D318 DEFB $76,$FF,$D8,$FF,$F0,$FF,$D7,$FF
D320: Lower half of the two-part scenery object (9014)
D320 DEFB $00,$FF,$00,$FF,$00,$FF,$00,$1F
D328 DEFB $00,$1F,$00,$FF,$00,$FC,$00,$2C
D330 DEFB $00,$07,$E0,$43,$E0,$88,$00,$F1
D338 DEFB $03,$C0,$D3,$44,$F8,$99,$BC,$07
D340 DEFB $77,$22,$0E,$84,$3F,$22,$BB,$08
D348 DEFB $66,$03,$F8,$B9,$DD,$80,$7B,$D0
D350 DEFB $DD,$80,$F7,$36,$FC,$03,$46,$21
D358 DEFB $7F,$20,$2F,$16,$7F,$70,$C9,$20
D360 DEFB $FC,$0D,$DE,$87,$DF,$8A,$E9,$C0
D368 DEFB $8F,$87,$DF,$21,$F2,$E3,$78,$FB
D370 DEFB $75,$00,$3F,$BF,$78,$FF,$DE,$FF
D378 DEFB $1C,$FF,$04,$3F,$FF,$FF,$40,$FF
D380: Sprite for the scenery drawn by 88FD
D380 DEFB $00,$3F,$00,$FF,$00,$FF,$00,$FF
D388 DEFB $00,$FF,$00,$FF,$00,$FF,$00,$FF
D390 DEFB $00,$FF,$00,$4F,$C0,$A3,$00,$FF
D398 DEFB $00,$FF,$00,$FF,$00,$FF,$00,$FF
D3A0 DEFB $00,$FF,$00,$FF,$00,$FF,$B0,$54
D3A8 DEFB $5C,$AA,$00,$3F,$00,$FF,$00,$FF
D3B0 DEFB $00,$FF,$00,$FF,$00,$FF,$00,$FF
D3B8 DEFB $00,$4F,$AB,$55,$55,$2A,$C0,$03
D3C0 DEFB $00,$FF,$00,$FF,$00,$FF,$00,$FF
D3C8 DEFB $00,$FF,$00,$FF,$B0,$54,$AA,$11
D3D0 DEFB $D5,$02,$FC,$AA,$00,$1F,$00,$FF
D3D8 DEFB $00,$FF,$00,$FF,$00,$FF,$00,$47
D3E0 DEFB $AB,$55,$EE,$25,$FD,$4A,$55,$AA
D3E8 DEFB $E0,$A1,$00,$FF,$00,$FF,$00,$FF
D3F0 DEFB $00,$7F,$B8,$0A,$AA,$15,$DA,$84
D3F8 DEFB $B5,$80,$55,$02,$5E,$15,$00,$1F
D400 DEFB $00,$FF,$00,$FF,$80,$A7,$F5,$AA
D408 DEFB $EA,$04,$7B,$00,$7F,$00,$FD,$08
D410 DEFB $EA,$15,$E0,$51,$00,$FF,$00,$7F
D418 DEFB $58,$A8,$55,$00,$FB,$10,$FF,$00
D420 DEFB $FF,$00,$F7,$10,$EA,$00,$AE,$07
D428 DEFB $00,$8F,$80,$F7,$57,$3F,$FF,$00
D430 DEFB $EF,$20,$FF,$00,$FF,$00,$EF,$40
D438 DEFB $FF,$00,$F8,$7F,$70,$FB,$08,$FB
D440 DEFB $C0,$FF,$FF,$01,$D6,$40,$FF,$00
D448 DEFB $FF,$00,$BF,$80,$FF,$03,$80,$FF
D450 DEFB $04,$FD,$04,$FD,$00,$FF,$FE,$07
D458 DEFB $BF,$80,$FF,$00,$FF,$00,$7F,$80
D460 DEFB $FC,$07,$00,$FF,$02,$FD,$02,$FD
D468 DEFB $00,$FF,$F8,$0F,$7F,$00,$FF,$01
D470 DEFB $FF,$01,$7F,$00,$F8,$1F,$00,$FF
D478 DEFB $02,$FD,$02,$FD,$00,$FF,$F0,$1F
D480 DEFB $FF,$00,$FE,$01,$FE,$01,$FF,$00
D488 DEFB $E0,$3F,$00,$FE,$02,$FD,$02,$FD
D490 DEFB $00,$FC,$E0,$3F,$FF,$00,$FE,$02
D498 DEFB $FE,$02,$FF,$00,$C0,$3F,$01,$FA
D4A0 DEFB $02,$FD,$02,$FD,$03,$F2,$C0,$7F
D4A8 DEFB $FF,$00,$FD,$02,$FD,$02,$FF,$00
D4B0 DEFB $C0,$7F,$05,$E2,$02,$FD,$02,$FD
D4B8 DEFB $0D,$C2,$80,$7F,$FF,$00,$FD,$02
D4C0 DEFB $FD,$02,$FF,$00,$80,$7F,$1D,$82
D4C8 DEFB $02,$FD,$02,$FD,$3D,$02,$80,$7F
D4D0 DEFB $FF,$00,$FD,$02,$FD,$02,$FF,$00
D4D8 DEFB $80,$7F,$7D,$02,$02,$FD,$02,$FD
D4E0 DEFB $FD,$02,$80,$FF,$FF,$00,$FD,$82
D4E8 DEFB $FD,$62,$FF,$00,$80,$FF,$FD,$02
D4F0 DEFB $02,$FD,$02,$FD,$FD,$02,$00,$FF
D4F8 DEFB $FF,$00,$7D,$1A,$9D,$06,$FF,$00
D500 DEFB $00,$FF,$FD,$02,$02,$FD,$02,$FD
D508 DEFB $FD,$02,$00,$FF,$FF,$00,$E5,$02
D510 DEFB $F9,$06,$FF,$00,$00,$FF,$FD,$02
D518 DEFB $02,$F9,$02,$F7,$FD,$02,$00,$FF
D520 DEFB $FF,$00,$FD,$02,$F9,$06,$FF,$00
D528 DEFB $00,$FF,$FD,$02,$06,$EF,$08,$DD
D530 DEFB $FD,$02,$00,$FF,$FF,$00,$FD,$02
D538 DEFB $F9,$06,$FF,$00,$00,$FF,$FD,$02
D540 DEFB $10,$AF,$22,$BF,$FD,$02,$00,$FF
D548 DEFB $FF,$00,$FD,$02,$F9,$86,$FF,$00
D550 DEFB $00,$FF,$FD,$02,$50,$77,$40,$FF
D558 DEFB $FD,$55,$00,$FF,$FF,$00,$FD,$62
D560 DEFB $79,$1A,$FF,$00,$00,$FF,$FD,$2F
D568 DEFB $88,$BF,$00,$FF,$AA,$57,$00,$FF
D570 DEFB $FF,$00,$9D,$06,$E5,$02,$FF,$00
D578 DEFB $00,$FF,$D0,$3F,$40,$EF,$00,$FF
D580 DEFB $A8,$5F,$00,$FF,$FF,$00,$F9,$02
D588 DEFB $FD,$02,$FF,$00,$00,$FF,$C0,$3B
D590 DEFB $10,$FF,$00,$FF,$A0,$7F,$00,$FF
D598 DEFB $FF,$00,$FD,$02,$FD,$02,$FF,$00
D5A0 DEFB $00,$FF,$C4,$6F,$00,$BF,$00,$DF
D5A8 DEFB $80,$FD,$00,$FE,$FF,$00,$FD,$02
D5B0 DEFB $FD,$02,$FF,$00,$00,$FD,$90,$FD
D5B8 DEFB $40,$FF,$20,$FF,$02,$7F,$01,$FD
D5C0 DEFB $FF,$00,$FD,$C2,$FD,$F2,$FF,$00
D5C8 DEFB $02,$FB,$02,$EF,$00,$EF,$00,$FF
D5D0 DEFB $80,$7F,$02,$F7,$FF,$00,$3D,$CC
D5D8 DEFB $0D,$FF,$FF,$80,$04,$EF,$10,$5F
D5E0 DEFB $10,$FF,$00,$FF,$80,$7F,$08,$DF
D5E8 DEFB $FF,$E0,$33,$FB,$00,$FF,$7F,$F8
D5F0 DEFB $10,$B7,$A0,$F7,$00,$FF,$00,$FF
D5F8 DEFB $80,$FF,$20,$7F,$1F,$DE,$04,$DE
D600 DEFB $00,$FF,$07,$FF,$48,$FF,$08,$FF
D608 DEFB $00,$FF,$00,$FF,$00,$FF,$80,$FC
D610 DEFB $21,$FF,$21,$FF
D614: Upper half of the two-part scenery object (9014)
D614 DEFB $FB,$85,$7B,$C7,$7A,$C3,$38,$C3
D61C DEFB $3C,$CB,$3C,$E3,$34,$E1,$1C,$E1
D624 DEFB $1E,$ED,$1E,$E1,$12,$E3,$1E,$DB
D62C DEFB $1C,$C3,$24,$C3,$3C,$E3,$3C,$DB
D634 DEFB $1C,$81,$24,$81,$7E,$11,$7E,$64
D63C DEFB $EE,$EE,$9B,$FF,$11,$FF,$00,$FF
D644: Truck sprite variant used by 86F5
D644 DEFB $00,$FF,$00,$FF,$00,$FF,$00,$FF
D64C DEFB $00,$FF,$00,$FF,$00,$FF,$00,$FF
D654 DEFB $00,$FF,$00,$FF,$00,$FF,$00,$FF
D65C DEFB $00,$FF,$00,$FF,$00,$FF,$00,$FF
D664 DEFB $00,$FF,$00,$FF,$00,$FF,$00,$FF
D66C DEFB $00,$FC,$00,$FF,$00,$FF,$00,$FF
D674 DEFB $00,$FF,$00,$FF,$00,$FF,$00,$FA
D67C DEFB $00,$7F,$00,$FF,$00,$FF,$00,$1F
D684 DEFB $03,$E5,$00,$FF,$00,$FF,$00,$FF
D68C DEFB $00,$FF,$00,$FF,$00,$FF,$05,$CA
D694 DEFB $80,$A7,$00,$FF,$00,$FF,$E0,$51
D69C DEFB $1A,$95,$00,$FF,$00,$FF,$00,$FF
D6A4 DEFB $00,$FF,$00,$FF,$00,$FF,$35,$2A
D6AC DEFB $58,$AA,$00,$FF,$00,$3F,$AE,$55
D6B4 DEFB $6A,$55,$00,$FE,$00,$FF,$00,$FF
D6BC DEFB $00,$FF,$00,$FF,$00,$FC,$D5,$AA
D6C4 DEFB $55,$AA,$00,$8F,$C0,$53,$AA,$55
D6CC DEFB $AA,$55,$01,$F1,$00,$FF,$00,$FF
D6D4 DEFB $00,$FF,$00,$FF,$03,$EA,$55,$AA
D6DC DEFB $55,$AA,$70,$BD,$AC,$59,$AA,$55
D6E4 DEFB $AA,$55,$0E,$D5,$00,$FF,$00,$FF
D6EC DEFB $00,$FF,$00,$FF,$15,$AA,$55,$AA
D6F4 DEFB $55,$AA,$42,$B5,$A6,$F5,$AA,$55
D6FC DEFB $AA,$55,$2A,$55,$00,$FF,$00,$FF
D704 DEFB $00,$FF,$00,$FE,$55,$AA,$55,$AA
D70C DEFB $55,$AA,$4A,$ED,$0A,$DD,$AA,$57
D714 DEFB $AA,$55,$AA,$55,$00,$F9,$00,$FF
D71C DEFB $00,$FF,$01,$F2,$55,$AA,$55,$AA
D724 DEFB $55,$AF,$12,$BD,$22,$BD,$A8,$7F
D72C DEFB $AA,$55,$AA,$55,$06,$E5,$00,$FF
D734 DEFB $00,$FF,$0D,$CA,$55,$AA,$55,$AA
D73C DEFB $50,$FF,$42,$7D,$42,$DD,$80,$FE
D744 DEFB $AA,$55,$AA,$55,$1A,$95,$00,$FF
D74C DEFB $00,$FE,$35,$2A,$55,$AA,$55,$BF
D754 DEFB $00,$FD,$82,$9D,$22,$1D,$01,$FD
D75C DEFB $AA,$FF,$AA,$55,$6A,$55,$00,$FC
D764 DEFB $01,$FA,$D5,$AA,$55,$BF,$40,$FF
D76C DEFB $02,$FB,$62,$1D,$E2,$1D,$02,$F6
D774 DEFB $00,$FF,$AA,$FF,$AA,$55,$03,$F5
D77C DEFB $05,$EA,$55,$BF,$40,$FF,$00,$FF
D784 DEFB $04,$EC,$E2,$1D,$E2,$1D,$09,$E8
D78C DEFB $00,$FF,$00,$FF,$AA,$FF,$0A,$E7
D794 DEFB $15,$E1,$40,$FF,$00,$FF,$00,$FF
D79C DEFB $13,$D8,$E2,$3D,$E2,$3B,$17,$B0
D7A4 DEFB $00,$FF,$00,$FF,$00,$7F,$18,$E0
D7AC DEFB $1E,$E0,$00,$3F,$00,$FF,$00,$FF
D7B4 DEFB $27,$60,$C2,$7B,$C4,$F6,$4F,$40
D7BC DEFB $00,$FF,$00,$FF,$80,$0F,$1F,$E0
D7C4 DEFB $1F,$E0,$C0,$03,$00,$FF,$00,$FE
D7CC DEFB $9F,$C1,$84,$ED,$09,$DF,$BF,$81
D7D4 DEFB $00,$FD,$00,$FF,$F0,$00,$1F,$E0
D7DC DEFB $1F,$A0,$FC,$00,$00,$3F,$01,$FB
D7E4 DEFB $3E,$03,$12,$DD,$20,$BF,$7E,$07
D7EC DEFB $02,$FA,$00,$1F,$FF,$00,$1F,$E0
D7F4 DEFB $5F,$A0,$FF,$00,$C0,$07,$04,$F6
D7FC DEFB $FC,$0F,$22,$7F,$40,$AF,$F8,$0E
D804 DEFB $05,$EC,$E0,$01,$FF,$00,$1F,$E0
D80C DEFB $5F,$E0,$FF,$00,$F8,$00,$09,$5C
D814 DEFB $F0,$1E,$80,$D7,$50,$FF,$F1,$3D
D81C DEFB $13,$1C,$FE,$00,$FF,$00,$1F,$C0
D824 DEFB $1F,$E0,$FF,$00,$FF,$00,$A3,$3C
D82C DEFB $E1,$7B,$28,$EF,$00,$FF,$C2,$7A
D834 DEFB $E3,$3C,$FF,$00,$FF,$00,$3F,$A0
D83C DEFB $1F,$E0,$FF,$00,$FF,$00,$C3,$3C
D844 DEFB $84,$F7,$10,$FF,$00,$DF,$85,$EB
D84C DEFB $C3,$3D,$FF,$00,$FF,$00,$5F,$E0
D854 DEFB $1F,$E0,$FF,$00,$FF,$00,$C3,$3F
D85C DEFB $08,$D7,$00,$FB,$20,$7F,$14,$DB
D864 DEFB $C2,$3F,$FF,$00,$FF,$00,$1F,$E0
D86C DEFB $1F,$F8,$FF,$00,$FF,$00,$C0,$3F
D874 DEFB $28,$BF,$04,$EF,$80,$FF,$24,$7F
D87C DEFB $C0,$3F,$FF,$00,$FF,$00,$1F,$FE
D884 DEFB $07,$DF,$FF,$80,$FF,$00,$C0,$3E
D88C DEFB $40,$FF,$10,$BF,$00,$FF,$80,$B6
D894 DEFB $C0,$3E,$FF,$00,$FF,$C0,$01,$FF
D89C DEFB $20,$F6,$7F,$F0,$FF,$00,$C1,$3D
D8A4 DEFB $00,$FB,$40,$FF,$00,$FF,$49,$FF
D8AC DEFB $C1,$3A,$FF,$00,$3F,$7C,$00,$FF
D8B4 DEFB $09,$FF,$0F,$F7,$FF,$00,$C2,$3B
D8BC DEFB $04,$DF,$00,$DF,$00,$F7,$00,$DD
D8C4 DEFB $C5,$37,$FF,$C0,$83,$7E,$00,$DF
D8CC DEFB $00,$FF,$08,$EF,$FF,$60,$C4,$2D
D8D4 DEFB $20,$F7,$20,$FF,$08,$FF,$22,$FF
D8DC DEFB $C8,$1F,$3F,$F8,$81,$FF,$20,$FF
D8E4 DEFB $00,$ED,$10,$EB,$9F,$F6,$D2,$17
D8EC DEFB $08,$FD,$00,$FF,$00,$FF,$00,$7F
D8F4 DEFB $E0,$BF,$07,$FF,$00,$FF,$00,$F5
D8FC DEFB $12,$FF,$14,$FF,$09,$FD,$E8,$7F
D904 DEFB $02,$FF,$00,$EF,$00,$FF,$80,$FF
D90C DEFB $40,$FF,$00,$7F,$00,$FF,$0A,$FF
D914 DEFB $00,$FF,$00,$FB,$02,$FF,$80,$F7
D91C DEFB $00,$FF,$10,$FF,$00,$FF,$00,$7F
D924 DEFB $00,$FF,$80,$FF,$00,$FF,$00,$FF
D92C DEFB $00,$FF,$04,$FF,$00,$FF,$08,$FF
D934 DEFB $00,$FF,$00,$FF,$00,$FF,$80,$FF
D93C DEFB $00,$FF,$00,$FF,$00,$FF,$00,$FF
D944: Truck sprite variant used by 86F5
D944 DEFB $00,$FF,$00,$FF,$00,$FF,$00,$FF
D94C DEFB $00,$FF,$00,$FF,$00,$FF,$00,$FF
D954 DEFB $00,$FF,$00,$FF,$00,$FF,$00,$FF
D95C DEFB $00,$FF,$00,$FF,$00,$FF,$00,$FF
D964 DEFB $00,$FF,$00,$FF,$00,$FF,$00,$FF
D96C DEFB $00,$FF,$00,$3F,$00,$FF,$00,$FF
D974 DEFB $00,$FF,$00,$FE,$00,$5F,$00,$FF
D97C DEFB $00,$FF,$00,$FF,$00,$FF,$00,$FF
D984 DEFB $00,$FF,$C0,$A7,$00,$F8,$00,$FF
D98C DEFB $00,$FF,$01,$E5,$A0,$53,$00,$FF
D994 DEFB $00,$FF,$00,$FF,$00,$FF,$00,$FF
D99C DEFB $00,$FF,$58,$A9,$07,$8A,$00,$FF
D9A4 DEFB $00,$FF,$1A,$55,$AC,$54,$00,$FF
D9AC DEFB $00,$FF,$00,$FF,$00,$FF,$00,$FF
D9B4 DEFB $00,$7F,$56,$AA,$75,$AA,$00,$FC
D9BC DEFB $00,$F1,$AA,$55,$AB,$55,$00,$3F
D9C4 DEFB $00,$FF,$00,$FF,$00,$FF,$00,$FF
D9CC DEFB $80,$8F,$55,$AA,$55,$AA,$03,$CA
D9D4 DEFB $0E,$BD,$AA,$55,$AA,$55,$C0,$57
D9DC DEFB $00,$FF,$00,$FF,$00,$FF,$00,$FF
D9E4 DEFB $70,$AB,$55,$AA,$55,$AA,$35,$9A
D9EC DEFB $42,$AD,$AA,$55,$AA,$55,$A8,$55
D9F4 DEFB $00,$FF,$00,$FF,$00,$FF,$00,$FF
D9FC DEFB $54,$AA,$55,$AA,$55,$AA,$65,$AF
DA04 DEFB $52,$B7,$AA,$55,$AA,$55,$AA,$55
DA0C DEFB $00,$7F,$00,$FF,$00,$FF,$00,$9F
DA14 DEFB $55,$AA,$55,$AA,$55,$EA,$50,$BB
DA1C DEFB $48,$BD,$AA,$F5,$AA,$55,$AA,$55
DA24 DEFB $80,$4F,$00,$FF,$00,$FF,$60,$A7
DA2C DEFB $55,$AA,$55,$AA,$15,$FE,$44,$BD
DA34 DEFB $42,$BE,$0A,$FF,$AA,$55,$AA,$55
DA3C DEFB $B0,$53,$00,$FF,$00,$FF,$58,$A9
DA44 DEFB $55,$AA,$55,$AA,$01,$7F,$42,$BB
DA4C DEFB $41,$B9,$00,$BF,$AA,$FD,$AA,$55
DA54 DEFB $AC,$54,$00,$7F,$00,$3F,$56,$AA
DA5C DEFB $55,$AA,$55,$FF,$80,$BF,$44,$B8
DA64 DEFB $46,$B8,$40,$DF,$02,$FF,$AA,$FD
DA6C DEFB $AB,$55,$80,$5F,$C0,$AF,$55,$AA
DA74 DEFB $55,$FF,$00,$FF,$40,$6F,$47,$B8
DA7C DEFB $47,$B8,$20,$37,$00,$FF,$02,$FF
DA84 DEFB $AA,$FD,$A0,$57,$50,$E7,$55,$FF
DA8C DEFB $00,$FF,$00,$FF,$90,$17,$47,$B8
DA94 DEFB $47,$BC,$C8,$1B,$00,$FF,$00,$FF
DA9C DEFB $02,$FF,$A8,$87,$18,$07,$00,$FE
DAA4 DEFB $00,$FF,$00,$FF,$E8,$0D,$47,$DC
DAAC DEFB $43,$DE,$E4,$06,$00,$FF,$00,$FF
DAB4 DEFB $00,$FC,$78,$07,$F8,$07,$01,$F0
DABC DEFB $00,$FF,$00,$FF,$F2,$02,$23,$6F
DAC4 DEFB $21,$B7,$F9,$83,$00,$7F,$00,$FF
DACC DEFB $03,$C0,$F8,$07,$F8,$07,$0F,$00
DAD4 DEFB $00,$FF,$00,$BF,$FD,$81,$90,$FB
DADC DEFB $48,$BB,$7C,$C0,$80,$DF,$00,$FC
DAE4 DEFB $3F,$00,$F8,$05,$F8,$07,$FF,$00
DAEC DEFB $00,$F8,$40,$5F,$7E,$E0,$04,$FD
DAF4 DEFB $44,$FE,$3F,$F0,$20,$6F,$03,$E0
DAFC DEFB $FF,$00,$FA,$05,$F8,$07,$FF,$00
DB04 DEFB $07,$80,$A0,$37,$1F,$70,$02,$F5
DB0C DEFB $01,$EB,$0F,$78,$90,$3A,$1F,$00
DB14 DEFB $FF,$00,$FA,$07,$F8,$03,$FF,$00
DB1C DEFB $7F,$00,$C8,$38,$8F,$BC,$0A,$FF
DB24 DEFB $14,$F7,$87,$DE,$C5,$3C,$FF,$00
DB2C DEFB $FF,$00,$F8,$07,$FC,$05,$FF,$00
DB34 DEFB $FF,$00,$C7,$3C,$43,$5E,$00,$FF
DB3C DEFB $08,$FF,$21,$EF,$C3,$3C,$FF,$00
DB44 DEFB $FF,$00,$F8,$07,$FA,$07,$FF,$00
DB4C DEFB $FF,$00,$C3,$BC,$A1,$D7,$00,$FB
DB54 DEFB $00,$DF,$10,$EB,$C3,$FC,$FF,$00
DB5C DEFB $FF,$00,$F8,$07,$F8,$07,$FF,$00
DB64 DEFB $FF,$00,$43,$FC,$28,$DB,$04,$FE
DB6C DEFB $20,$F7,$14,$FD,$03,$FC,$FF,$00
DB74 DEFB $FF,$00,$F8,$1F,$F8,$7F,$FF,$00
DB7C DEFB $FF,$00,$03,$FC,$24,$FE,$01,$FF
DB84 DEFB $08,$FD,$02,$FF,$03,$7C,$FF,$00
DB8C DEFB $FF,$01,$E0,$FB,$80,$FF,$FF,$03
DB94 DEFB $FF,$00,$03,$7C,$01,$6D,$00,$FF
DB9C DEFB $02,$FF,$00,$DF,$83,$BC,$FF,$00
DBA4 DEFB $FE,$0F,$04,$6F,$00,$FF,$FC,$3E
DBAC DEFB $FF,$00,$83,$5C,$92,$FF,$00,$FF
DBB4 DEFB $00,$FB,$20,$FB,$43,$DC,$FF,$00
DBBC DEFB $F0,$EF,$90,$FF,$00,$FB,$C1,$7E
DBC4 DEFB $FF,$03,$A3,$EC,$00,$BB,$00,$EF
DBCC DEFB $04,$FF,$04,$EF,$23,$B4,$FF,$06
DBD4 DEFB $10,$F7,$00,$FF,$04,$FF,$81,$FF
DBDC DEFB $FC,$1F,$13,$F8,$44,$FF,$10,$FF
DBE4 DEFB $00,$FF,$10,$BF,$4B,$E8,$F9,$6F
DBEC DEFB $08,$D7,$00,$B7,$00,$AF,$00,$FF
DBF4 DEFB $E0,$FF,$07,$FD,$00,$FE,$00,$FF
DBFC DEFB $00,$F7,$40,$FF,$17,$FE,$90,$BF
DC04 DEFB $28,$FF,$48,$FF,$50,$FF,$00,$FF
DC0C DEFB $00,$FE,$02,$FF,$01,$FF,$00,$FF
DC14 DEFB $08,$FF,$00,$FF,$01,$EF,$40,$FF
DC1C DEFB $00,$DF,$00,$FF,$00,$FF,$00,$FF
DC24 DEFB $01,$FF,$00,$FF,$00,$FE,$00,$FF
DC2C DEFB $00,$04,$00,$85,$10,$C3,$00,$CB
DC34 DEFB $20,$E1,$00,$ED,$00,$EE,$00,$11
DC3C DEFB $00,$81,$00,$E3,$01,$C3,$00,$E3
DC44 DEFB $AC,$54,$00,$7F,$00,$3F,$56,$AA
DC4C DEFB $55,$AA,$55,$FF,$80,$BF,$44,$B8
DC54 DEFB $46,$B8,$40,$DF,$02,$FF,$AA,$FD
DC5C DEFB $AB,$55,$80,$5F,$C0,$AF,$55,$AA
DC64 DEFB $55,$FF,$00,$FF,$40,$6F,$47,$B8
DC6C DEFB $47,$B8,$20,$37,$00,$FF,$02,$FF
DC74 DEFB $AA,$FD,$A0,$57,$50,$E7,$55,$FF
DC7C DEFB $00,$FF,$00,$FF,$C3,$00,$64
DC83: Get random byte (redirect)
Used by the routines at E1AC, E2EA, E881, E8A0, E90A, E9DD, EB13, EB96, EDD6, EE24 and EF37.
DC83 JP $DF16 => Random number generator
DC86: Entry E=0, dispatch bullet/collision handler via $DF39 (redirect)
Used by the routine at EF37.
DC86 JP $DF37 => Entry E=0, dispatch bullet/collision handler via $DF39
DC89: Initialization and go to game main loop (redirect)
Used by the routine at 6BBB.
DC89 JP $DCDF => Initialization and go to game main loop
DC8C: Check IX flag and column bound, dispatch (redirect)
Used by the routine at E6A8.
DC8C JP $E01B => Check IX flag and column bound, dispatch
DC8F: Check screen brightness threshold, inside $DD8D (redirect)
Used by the routine at EF37.
DC8F JP $DDBE
DC92: Entry E=2, dispatch bullet/collision handler via $DF39 (redirect)
Used by the routine at E2EA.
DC92 JP $DF33 => Entry E=2, dispatch bullet/collision handler via $DF39
DC95: Scroll level and shift all objects down
Used by the routine at DE91.
Advances the level scroll one step, then shifts every object in the $5B11 table down by one row (+$05) until the $90 end marker.
DC95 CALL $8003 Advance level scroll
DC98 LD IX,$5B11
DC9C INC (IX+$05) Scroll object down one row
DC9F LD DE,$0014
DCA2 ADD IX,DE
DCA4 LD A,(IX+$00) Stop at $90 end marker
DCA7 SUB $90
DCA9 JR NZ,$DC9C
DCAB LD ($FDEE),A
DCAE RET
DCAF: Periodically spawn a new enemy from the edge
Used by the routine at DEEF.
Spawns a new enemy in from the screen edge on a countdown, picking the side and column at random and dropping it into a free slot.
DCAF LD A,($FDFB) Spawning enabled ($FDFB)?
DCB2 OR A
DCB3 RET Z
DCB4 DEC (IY+$7D) Count down the spawn timer
DCB7 RET NZ
DCB8 LD ($FDFD),A
DCBB CALL $DF16 Random number generator
DCBE LD B,$04
DCC0 LD L,$FF
DCC2 BIT 7,A Random bit picks spawn edge
DCC4 JR Z,$DCCA
DCC6 LD B,$0C
DCC8 LD L,$1F
DCCA AND $0F
DCCC SUB $04
DCCE LD H,A
DCCF CALL $E112 Draw a small random offset (-1, 0 or +1)
DCD2 ADD A,B
DCD3 LD B,A
DCD4 LD C,$0C
DCD6 CALL $E10F Find free enemy slot in $5B11 table, inside $E01B
DCD9 RET Z
DCDA SET 6,(IX+$0B) Mark new enemy (flag bit 6)
DCDE RET
DCDF: Initialization and go to game main loop
Used by the routine at DC89.
Sets up a fresh game: clears the object table, places the player at the starting position, resets the projectile tables and seeds the random state, then drops into the main loop.
DCDF LD HL,$5B11
DCE2 XOR A
DCE3 LD (HL),A
DCE4 INC L
DCE5 JR NZ,$DCE3
DCE7 LD A,$90
DCE9 LD ($5BD9),A
DCEC LD ($5BEE),A
DCEF LD IY,$FD80
DCF3 LD HL,$5BDA Player's object record address
DCF6 LD (HL),$10 ($5BDA) = $10 - Initial starting column
DCF8 INC HL
DCF9 LD (HL),$40 ($5BDB) = $40 - Initial pixels down screen start point
DCFB INC HL
DCFC LD (HL),$02 ($5BDC) = $02 - ??
DCFE INC HL
DCFF INC HL HL = $5BDE
DD00 EX DE,HL
DD01 LD HL,$5BDA Player's object record address
DD04 LD BC,$0004
DD07 LDIR Copying 4 bytes from $5BDA to $5BDE
DD09 EX DE,HL
DD0A INC HL
DD0B INC HL HL = $5BE4
DD0C LD (HL),$0A
DD0E INC HL HL = $5BE5
DD0F LD (HL),$30
DD11 INC HL HL = $5BE6
DD12 CALL $F221 Clear the projectile/vehicle/explosion tables at $F73C
DD15 LD HL,$FD9B Point at the random state
DD18 LD A,R Seed the first byte from the refresh register
DD1A LD (HL),A
DD1B INC L
DD1C XOR $AA Second byte is the first flipped
DD1E LD (HL),A
DD1F INC L
DD20 RRCA Third is that rotated
DD21 LD (HL),A
DD22 XOR $AA Fourth flips it again
DD24 LD (HL),A
DD25 LD A,$90
DD27 LD ($FD97),A
DD2A LD ($FDDE),A
DD2D LD ($FDDF),A
DD30 LD (IY+$70),$88
DD34 LD (IY+$16),$88
DD38 LD (IY+$5D),$01 $01 - Enemy delay (Time until first enemy appears)
DD3C JP $DE91 => Game's main loop, Part 1
DD3F: Sprite frame table, indexed by object state and direction
DD3F DEFB $00,$01,$00,$01,$02,$03,$04,$04
DD47 DEFB $04,$04,$04,$04,$05,$06,$07,$08
DD4F DEFB $07,$08,$0B,$0B,$09,$0A,$07,$08
DD57 DEFB $0B,$0B,$0B,$0B,$0C,$0D,$00,$01
DD5F DEFB $0F,$0F,$13,$13,$14,$14,$15,$15
DD67 DEFB $16,$16,$12,$12,$12,$12,$0E,$0E
DD6F DEFB $1C,$1C
DD71: Process object records at $5B11
Used by the routine at DE91.
Walks the object table, drawing every entry whose draw-active flag is set, and stops at the end marker.
DD71 LD IX,$5B11
DD75 BIT 5,(IX+$0B)
DD79 CALL NZ,$DD8D Draw object IX
DD7C LD DE,$0014
DD7F ADD IX,DE Next record
DD81 LD A,(IX+$00)
DD84 CP $90 End marker?
DD86 RET Z
DD87 JR $DD75
DD89: Process Player's object record
Used by the routine at DEEF.
DD89 LD IX,$5BDA Player's object record address
DD8D: Draw object IX: select sprite frame, clip, blit
Used by the routine at DD71.
Input
IX Address of the 20-byte object record
Draws one object and works out its clipping. It picks the sprite frame from the object's state and direction, checks the row against the visible band, and on success paints a shadow strip and draws the sprite; an object outside the band is skipped or has its draw flag cleared.
DD8D LD A,(IX+$0C)
DD90 BIT 4,(IX+$0B) Check wall-solid flag, adjust bit 0
DD94 JR Z,$DDA2
DD96 CP $10
DD98 JR NC,$DDA2
DD9A BIT 0,A
DD9C JR Z,$DDA2
DD9E AND $FE
DDA0 OR $02
DDA2 ADD A,A Frame index * 2 into E
DDA3 LD E,A
DDA4 LD A,(IX+$10) Direction offset, halved
DDA7 AND $02
DDA9 RRA Rotated in, added to the frame
DDAA ADD A,E
DDAB LD E,A
DDAC LD D,$00
DDAE LD HL,$DD3F
DDB1 ADD HL,DE
DDB2 LD B,(HL)
DDB3 LD (IX+$07),B
DDB6 LD A,(IX+$12) Skip further checks if state (IX+$12) = $09
DDB9 CP $09
DDBB JP Z,$DE65
This entry point is used by the routine at DC8F.
DDBE LD A,($FD97)
DDC1 CP $88 Check screen brightness upper bound
DDC3 JP NC,$DE65
DDC6 SUB $0D
DDC8 JP C,$DE65
DDCB CP $04 Row above the band? skip
DDCD JP C,$DE65
DDD0 LD B,A
DDD1 LD A,(IX+$05) Row below the object? skip
DDD4 SUB B
DDD5 JP P,$DE65
DDD8 ADD A,$0A Within reach of the object?
DDDA JP P,$DDDF
DDDD JR $DE10
DDDF LD A,B Clamp the row to the visible range
DDE0 CP $5F
DDE2 JR NC,$DE0B
DDE4 LD C,$5F
DDE6 CP (IX+$08) Same column as last frame?
DDE9 JR Z,$DE2A
DDEB PUSH BC
DDEC LD H,A
DDED DEC H
DDEE LD A,H
DDEF CP $60
DDF1 JR NC,$DE08
DDF3 LD L,$3B Set up the shadow row
DDF5 CALL $98D9 Convert row number to screen line address
DDF8 LD BC,$05AA
This entry point is used by the routine at EF37.
DDFB LD (HL),C Fill the shadow bytes
DDFC INC L
DDFD DJNZ $DDFB
DDFF INC H
DE00 DEC L
DE01 LD BC,$0555
DE04 LD (HL),C ...and the row below
DE05 DEC L
DE06 DJNZ $DE04
DE08 POP BC
DE09 JR $DE2A
DE0B RES 5,(IX+$0B) Off screen: clear the draw flag
DE0F RET
DE10 LD A,B Clamp against the left edge
DE11 SUB $1F
DE13 JR NC,$DE19
DE15 LD C,$5F
DE17 JR $DE2A
DE19 CP $04
DE1B JR NC,$DE21
DE1D LD A,$04
DE1F JR $DE27
DE21 CP $5F
DE23 JR C,$DE27
DE25 LD A,$5F
DE27 LD C,A
DE28 LD B,$04
DE2A LD (IX+$09),C Store the computed clip bounds
DE2D LD (IX+$08),B
DE30 LD A,(IX+$05) Object visible vertically?
DE33 CP B
DE34 JP P,$DE3D
DE37 ADD A,$0A
DE39 CP C
DE3A JP P,$DE52
DE3D CALL $DE6D Draw the object
DE40 LD A,(IX+$12)
DE43 CP $07
DE45 JR Z,$DE4D
DE47 LD A,(IX+$04)
DE4A CP $1F
DE4C RET NC
DE4D SET 5,(IX+$0B) Flag it as drawn
DE51 RET
DE52 LD A,(IX+$05) Special mid-screen row band
DE55 CP $E0
DE57 JR NC,$DE3D
DE59 CP $40
DE5B JR C,$DE3D
DE5D LD (IX+$0C),$16 Switch to a specific object state
DE61 LD (IX+$07),$12
DE65 LD (IX+$08),$04 Default clip bounds
DE69 LD (IX+$09),$5F
DE6D BIT 4,(IX+$0B) Solid object? branch
DE71 JR NZ,$DE8C
DE73 BIT 6,(IX+$0B) Otherwise update its position and draw
DE77 JP Z,$98D0 => Update object IX position, clip to screen, dispatch sprite draw
DE7A LD A,(IX+$12)
DE7D LD C,$02
DE7F CP $0C
DE81 JP Z,$DE8E
DE84 CP $0E
DE86 JR NZ,$DE8E
DE88 LD C,$04
DE8A JR $DE8E
DE8C LD C,$00
DE8E JP $800F => Mark map cells for object IX, direction-aware
DE91: Game's main loop, Part 1
Used by the routines at DCDF and DEEF.
First half of the frame. It kills the player if their alive flag has gone, waits for the interrupt marking the frame boundary, then scrolls the level and redraws every object before dropping into Part 2.
DE91 BIT 0,(IY+$62) Is Player alive?
DE95 JR Z,$DEAC
DE97 LD A,($5BE6)
DE9A CP $13
DE9C JR NC,$DEAC
DE9E LD A,$13
DEA0 LD ($5BE6),A
DEA3 LD A,$02
DEA5 LD ($5BEB),A
DEA8 XOR A
DEA9 CALL $642D Trigger sound effect A (copy its parameter into slot A)
DEAC BIT 0,(IY+$07)
DEB0 JR Z,$DEAC
DEB2 RES 0,(IY+$07)
DEB6 LD A,($FDEE)
DEB9 CP $32
DEBB JR NC,$DEC0
DEBD INC (IY+$6E)
DEC0 BIT 5,(IY+$15)
DEC4 JR Z,$DECB
DEC6 CALL $DC95 Scroll level and shift all objects down
DEC9 JR $DECE
DECB CALL $8006 Clear the draw-mode flag (R bit 7), enter $9193
DECE CALL $DD71 Process object records at $5B11
DED1 RES 5,(IY+$15)
DED5 BIT 6,(IY+$05) Check bit 6 (??) of Last joystick/keyboard bits ($FD85)
DED9 JR Z,$DEEF => Game's main loop, Part 2
DEDB JR $DEEF => Game's main loop, Part 2
DEDD: Wait for the pause key to be released, pressed and released again
Blocks on the pause key: waits for it to go up if held from before, then waits for the press and the following release, so a single tap resumes play.
DEDD BIT 6,(IY+$05)
DEE1 JR NZ,$DEDD => Wait for the pause key to be released, pressed and released again
DEE3 BIT 6,(IY+$05)
DEE7 JR Z,$DEE3
DEE9 BIT 6,(IY+$05)
DEED JR NZ,$DEE9
DEEF: Game's main loop, Part 2
Used by the routine at DE91.
Second half of the frame: it rebuilds the object list, reads the controls, then runs each subsystem in turn -- enemies, bullets, grenades, projectiles, explosions, spawning and sound -- before looping back to Part 1.
DEEF CALL $E109 Rebuild active-object list at $F900 from $FF00 buffer
DEF2 CALL $E100 Set up player object pointers (IX=$5BDA)
DEF5 CALL $E103 Check fire button and joystick input
DEF8 CALL $E106 Check player shots against every enemy in $5B11
DEFB CALL $F209 Scan player-bullet table at $F82D, init $F8ED marker
DEFE CALL $F212 Set up grenade table $F81E, dispatch
DF01 CALL $F203 Set up primary projectile/vehicle table $F73C, process motion
DF04 CALL $DD89 Process Player's object record
DF07 CALL $F206 Scan explosion-effect table $F856, entry stride $14
DF0A CALL $E10C Decrement Enemy delay ($FDDD), spawn enemy by Area ($FDE5) when due
DF0D CALL $6427 Scan $6648 table, call $65A5 for active entries
DF10 CALL $DCAF Periodically spawn a new enemy from the edge
DF13 JP $DE91 => Game's main loop, Part 1
DF16: Random number generator: step the 32-bit register at $FD9B
Used by the routines at DC83 and DCAF.
Feeds a bit derived from the flags in $FD9B into the 32-bit shift register held across IY+$1B..$1E, rotating it one place; returns $FD9B in A.
DF16 LD A,($FD9B)
DF19 AND $48 Mask control bits
DF1B ADD A,$38
DF1D RLA
DF1E RLA
DF1F RL (IY+$1E) Rotate the bit through IY+$1B..$1E
DF23 RL (IY+$1D)
DF27 RL (IY+$1C)
DF2B RL (IY+$1B)
DF2F LD A,($FD9B)
DF32 RET
DF33: Entry E=2, dispatch bullet/collision handler via $DF39
Used by the routines at DC92 and E01B.
Enters the bullet collision scan with the wider of the two hit boxes.
DF33 LD E,$02
DF35 JR $DF39
DF37: Entry E=0, dispatch bullet/collision handler via $DF39
Used by the routine at DC86.
Scans the live-object list for anything a bullet has struck, using the list as a stack so it can be walked quickly. Each entry is compared against the bullet's box on both axes, with walls and obstacles branching off to their own handler.
DF37 LD E,$00
This entry point is used by the routine at DF33.
DF39 LD ($FD82),SP Switch to $F900 stack for object scan
DF3D LD SP,$F900
This entry point is used by the routines at DF6D and DF7B.
DF40 XOR A Pop the bullet type
DF41 EX AF,AF'
DF42 POP BC
DF43 LD A,C High bit says a player bullet
DF44 BIT 7,A
DF46 JR NZ,$DF7B => Bullet collision check, carry set on hit
This entry point is used by the routine at DF7B.
DF48 SUB L Below the top edge?
DF49 JR C,$DF4E
DF4B SUB E Try the bottom edge instead
DF4C JR NC,$DF6D
DF4E ADD A,B
DF4F JR C,$DF54
DF51 SUB E
DF52 JR NC,$DF6D => Collision scan
DF54 POP BC Bullet X against the left edge
DF55 LD A,C
DF56 SUB H Past the right edge? no hit
DF57 JP M,$DF40
DF5A SUB B
DF5B JP P,$DF40
This entry point is used by the routine at DF7B.
DF5E LD SP,($FD82)
DF62 EX AF,AF'
DF63 JR NZ,$DF71 => Collision hit on the player
DF65 SCF
DF66 RET
DF67: Collision scan exit: restore SP and report no hit
Used by the routine at DF7B.
Ends the collision scan with no hit, putting the real stack pointer back.
DF67 LD SP,($FD82)
DF6B XOR A
DF6C RET
DF6D: Collision scan: drop this entry and take the next
Used by the routines at DF37 and DF7B.
Drops the entry just examined and goes back for the next one in the collision scan.
DF6D POP BC
DF6E JP $DF40
DF71: Collision hit on the player: flag them dead and mark the object
Used by the routine at DF37.
Kills the player on contact and flags the object that did it, reporting the hit back to the scan.
DF71 SET 0,(IY+$62) Player is dead
DF75 SET 7,(IX+$0B)
DF79 SCF
DF7A RET
DF7B: Bullet collision check, carry set on hit
Used by the routine at DF37.
Reached when the scanned record is a wall or obstacle (type byte bit 7 set) rather than an enemy. It decides how the bullet interacts with the tile -- passing over special tiles, and for real walls testing whether the bullet overlaps and whether the wall is breakable. A breakable tile that is hit gets its top bit set to mark the damage, while solid walls just stop the bullet.
DF7B CP $80 Type $80: pass straight through
DF7D JR Z,$DF67
DF7F AND $7F Split by wall type (bit 1)
DF81 BIT 1,A
DF83 JR Z,$DF96
DF85 INC E
DF86 DEC E
DF87 JR Z,$DF91
DF89 BIT 4,(IX+$0B) Only certain directions damage it
DF8D JR Z,$DF91
DF8F INC A
DF90 EX AF,AF'
DF91 LD A,C Mask the tile column, retest bounds
DF92 AND $7C
DF94 JR $DF48
DF96 BIT 2,A Solid wall? jump to the edge test
DF98 JR NZ,$DFBE
DF9A INC E
DF9B DEC E
DF9C JR Z,$DF6D => Collision scan
DF9E BIT 4,(IX+$0B) Only breakable if the tile is flagged
DFA2 JR Z,$DF6D => Collision scan
DFA4 LD A,B Compare row against wall bound
DFA5 SUB L
DFA6 JR NC,$DF6D
DFA8 ADD A,$08
DFAA JR NC,$DF6D => Collision scan
DFAC POP BC
DFAD LD A,C Compare column against wall bound
DFAE SUB H
DFAF JR C,$DF40
DFB1 SUB $08
DFB3 JR NC,$DF40
DFB5 LD C,B Register the hit
DFB6 LD B,$FF
DFB8 LD A,(BC) Set the tile's damage bit
DFB9 OR $80
DFBB LD (BC),A
DFBC JR $DF67 => Collision scan exit
DFBE LD ($FDB3),DE Save the position for the edge tests
DFC2 POP DE
DFC3 LD C,A
DFC4 SUB L
DFC5 JR NC,$E014
DFC7 ADD A,B
DFC8 JR NC,$E014
DFCA SUB D Check second edge crossing
DFCB JR NC,$DFF3
DFCD LD A,E Distance to the near vertical edge
DFCE SUB H
DFCF JR C,$E014
DFD1 SUB D
DFD2 JR NC,$DFE4
DFD4 LD A,E Does the bullet span overlap the tile?
DFD5 SUB H
DFD6 LD B,A
DFD7 LD A,L
DFD8 SUB D
DFD9 SUB C
DFDA CP B
DFDB JR NC,$E014
DFDD LD DE,($FDB3) Inside the tile: report a hit
DFE1 JP $DF5E
DFE4 SUB D Try the far edge of this half
DFE5 JR NC,$E014
DFE7 LD A,H
DFE8 SUB E
DFE9 ADD A,B
DFEA LD B,A
DFEB LD A,L
DFEC SUB D
DFED SUB C
DFEE CP B
DFEF JR NC,$E014
DFF1 JR $DFDD
DFF3 LD A,E Check the other vertical half
DFF4 SUB H
DFF5 JR C,$E014
DFF7 SUB D
DFF8 JR NC,$E005
DFFA LD A,E
DFFB SUB H
DFFC LD B,A
DFFD LD A,C
DFFE ADD A,D
DFFF SUB L
E000 CP B
E001 JR NC,$E014
E003 JR $DFDD
E005 SUB D ...its far edge too
E006 JR NC,$E014
E008 LD A,H
E009 SUB E
E00A ADD A,B
E00B LD B,A
E00C LD A,C
E00D ADD A,D
E00E SUB L
E00F CP B
E010 JR NC,$E014
E012 JR $DFDD
E014 LD DE,($FDB3) Miss: restore and scan on
E018 JP $DF40
E01B: Check IX flag and column bound, dispatch
Used by the routine at DC8C.
Input
IX Object record pointer
L Target column
E Target coordinate
Tests whether an enemy may move into the cell ahead. A clear cell commits the move; a blocked one either turns the enemy round or picks a new heading, depending on its AI state.
E01B BIT 1,(IX+$0B) Check flag bit 1 and column limit
E01F JR NZ,$E084
E021 LD A,L
E022 CP $20 Reject column past $20
E024 JR NC,$E084
E026 PUSH HL Save the position
E027 PUSH DE
E028 LD A,L Row into A
E029 ADD A,A Times four, base $04 added
E02A ADD A,A
E02B ADD A,$04
E02D ADD A,E
E02E LD L,A
E02F LD A,H
E030 ADD A,$06
E032 LD H,A
E033 CALL $DF33 Entry E=2, dispatch bullet/collision handler via $DF39
E036 POP DE
E037 POP HL
E038 JR NC,$E084 No collision: commit move
E03A BIT 4,(IX+$0B) Check wall-solid flag (IX+$0B)
E03E JR NZ,$E083
E040 LD A,H
E041 CP $60
E043 JR NC,$E049
E045 CP $03
E047 JR NC,$E04E
E049 LD (IX+$0C),$16 Blocked: set turn-around state $16
E04D RET
E04E LD A,(IX+$12) Branch by AI state (IX+$12)
E051 CP $05 #0 state $05
E053 JR Z,$E075
E055 CP $04 #1 state $04
E057 JR Z,$E061
E059 CP $01 #2 state $01
E05B JR Z,$E061
E05D CP $0C
E05F JR NZ,$E075
E061 CALL $E112 Draw a small random offset (-1, 0 or +1)
E064 ADD A,(IX+$13)
E067 XOR $08
E069 AND $0F
E06B LD B,A
E06C AND $07
E06E JR NZ,$E071
E070 INC B
E071 LD (IX+$13),B
E074 RET
E075 CALL $E112 Draw a small random offset (-1, 0 or +1)
E078 ADD A,(IX+$0C)
E07B ADD A,$04
E07D AND $0F
E07F LD (IX+$0C),A
E082 RET
E083 RET
E084 LD (IX+$04),L Store new position into record
E087 LD (IX+$06),E
E08A LD A,D
E08B CP $04
E08D JR C,$E097
E08F CP $0D
E091 JR NC,$E097
This entry point is used by the routine at E0BF.
E093 LD (IX+$05),H
E096 RET
E097 BIT 4,(IX+$0B)
This entry point is used by the routine at E0BF.
E09B JR Z,$E093
E09D LD A,H
E09E CP $3C
E0A0 JR NC,$E093
This entry point is used by the routine at E0BF.
E0A2 BIT 3,(IY+$05) Check bit 3 (Up) of Last joystick/keyboard bits ($FD85)
E0A6 JR Z,$E0BE
E0A8 BIT 4,(IY+$15)
E0AC JR Z,$E0BA
E0AE CP $1A
E0B0 JR NC,$E093
E0B2 BIT 1,(IX+$0B)
E0B6 JR Z,$E0BE
E0B8 JR $E093
E0BA SET 5,(IY+$15)
E0BE RET
E0BF: Map-scan tails: step to the next row, or set the Area flag and return
A run of short tails for the map scan in E01B: each steps down a row and rejoins the scan, stores the new row, or raises the Area-complete flag when the player is at the end row with Up held. Only $E0D8 has a discovered caller, so the entry points of the other tails are not yet traced, and a few bytes between them (at $E0CA, $E0EF, $E0F5 and $E0FC) do not decode into anything sensible -- they may be reached at a different alignment.
E0BF INC H Step down a row and rejoin the scan
E0C0 JR $E093
E0C2 SET 5,(IY+$15) Raise the Area-complete flag and return
E0C6 RET
E0C7 INC H Step down a row and rejoin at $E09B
E0C8 JR $E09B
E0CA RL L
E0CC XOR $C9
E0CE INC H Step down a row and rejoin at $E0A2
E0CF JR $E0A2
E0D1 INC B
E0D2 LD (IX+$05),H Store the new row and return
E0D5 RET
E0D6 BIT 4,(IX+$0B) Only act when the wall-solid flag is set
E0DA JR Z,$E0D2
E0DC LD A,H At the Area-end row $3C?
E0DD CP $3C
E0DF JR NZ,$E0D2
E0E1 BIT 3,(IY+$05) Up pressed as well?
E0E5 JR Z,$E0EB
E0E7 SET 5,(IY+$15) Raise the Area-complete flag
E0EB RET
E0EC INC H Step down a row, then store it
E0ED JR $E0D2
E0EF DEC D
E0F0 XOR $C9
E0F2 INC H Step down and retest the flag
E0F3 JR $E0D8
E0F5 RL L
E0F7 XOR $C9
E0F9 INC H Step down and retest the row
E0FA JR $E0DF
E0FC LD B,$D3
E0FE CP $18
E100: Set up player object pointers (IX=$5BDA) (redirect)
Used by the routine at DEEF.
E100 JP $E4FC => Set up player object pointers
E103: Check fire button and joystick input (redirect)
Used by the routine at DEEF.
E103 JP $ECC1 => Check fire button and joystick input
E106: Check player shots against every enemy in $5B11 (redirect)
Used by the routine at DEEF.
E106 JP $E6FE => Check player shots against every enemy in $5B11
E109: Rebuild active-object list at $F900 from $FF00 buffer (redirect)
Used by the routine at DEEF.
E109 JP $ED52 => Rebuild active-object list at $F900 from $FF00 buffer
E10C: Decrement Enemy delay ($FDDD), spawn enemy by Area ($FDE5) when due (redirect)
Used by the routine at DEEF.
E10C JP $E2EA => Decrement Enemy delay ($FDDD), spawn enemy by Area ($FDE5) when due
E10F: Find free enemy slot in $5B11 table, inside $E01B (redirect)
Used by the routines at DCAF and EF37.
E10F JP $E44D
E112: Draw a small random offset (-1, 0 or +1) (redirect)
Used by the routines at DCAF and E01B.
E112 JP $E1AC => Draw a small random offset
E115: Data block at E115
E115 DEFB $C3,$7D,$E7,$83,$00,$8B,$00,$05
E11D DEFB $05,$80,$00,$80,$00,$80,$00,$88
E125 DEFB $00,$8D,$00,$81,$00,$08,$09,$88
E12D DEFB $FF,$08,$09,$80,$00,$80,$00,$85
E135 DEFB $00,$86,$00,$86,$00,$87,$00,$87
E13D DEFB $00,$8A,$00,$84,$00,$8E,$00,$80
E145 DEFB $00,$82,$00,$80,$00,$80,$00,$80
E14D DEFB $00,$80,$00,$18,$03,$90,$00,$18
E155 DEFB $04,$80,$00,$80,$00,$80,$00,$8F
E15D DEFB $00,$89,$00,$8C,$00,$04,$26,$5C
E165 DEFB $ED,$7C,$EF,$A3,$EF,$52,$F0,$E7
E16D DEFB $F0,$14,$F1,$26,$F1,$4C,$F1,$37
E175 DEFB $EF,$F7,$EE,$3D,$EE,$D6,$ED,$28
E17D DEFB $EE,$15,$EE,$11,$EE,$24,$EE,$94
E185 DEFB $EE,$A8,$E1
E188: Enemy AI state handler addresses, indexed by the state byte (+$12) from E972
E188 DEFW $EB96
E18A DEFW $EB13
E18C DEFW $EC58
E18E DEFW $EB96
E190 DEFW $E881
E192 DEFW $E86B
E194 DEFW $0000
E196 DEFW $EB68
E198 DEFW $EB7B
E19A DEFW $E881
E19C DEFW $0000
E19E DEFW $E9C7
E1A0 DEFW $EA8E
E1A2 DEFW $F180
E1A4 DEFW $E9D2
E1A6 DEFW $E9DD
E1A8: Tail of the AI table block: drop the return address and abort
Tail of the AI table block: drops the queued return address and aborts through the redirect.
E1A8 POP BC
E1A9 JP $6400 => Block of redirects
E1AC: Draw a small random offset (-1, 0 or +1)
Used by the routines at E112, E2EA and E90A.
Draws a random byte for the enemy setup code, used to scatter starting positions and delays.
E1AC CALL $DC83 Get random byte
E1AF AND $03
E1B1 RET Z
E1B2 DEC A
E1B3 DEC A
E1B4 RET
E1B5: Service the two bomb/explosion slots
Used by the routine at E2EA.
Services the two active bomb/explosion slots ($FDC3 and $FDC5), calling E1D1 on each to check for enemy hits and advance the effect.
E1B5 LD HL,$FDF2
E1B8 LD DE,$FDC3
E1BB LD A,(DE) First slot active?
E1BC INC A
E1BD JR Z,$E1C2
E1BF CALL $E1D1 Check pickup/collision near object, award score
E1C2 LD HL,$FDF3
E1C5 LD DE,$FDC5
E1C8 LD A,(DE) Second slot active?
E1C9 INC A
E1CA JR Z,$E224 => Jeep hit check, kill/score, spawn next enemy
E1CC CALL $E1D1 Check pickup/collision near object, award score
E1CF JR $E224 => Jeep hit check, kill/score, spawn next enemy
E1D1: Check pickup/collision near object, award score
Used by the routine at E1B5.
Input
A Slot position/active-flag byte
HL Slot timer address
Checks whether an active bomb/explosion overlaps any enemy in the $F8EA list; a hit marks the enemy and scores 750. With no hit it counts down the explosion's own timer and, when that lapses, spawns a fresh object at a computed position.
E1D1 PUSH DE
E1D2 PUSH HL
E1D3 EX DE,HL
E1D4 ADD A,$08 Turn the position into a scan key
E1D6 LD E,A
E1D7 INC L
E1D8 LD D,(HL)
E1D9 SRL E
E1DB LD HL,$F8EA Scan the enemy list for one in range
E1DE LD B,$1D
E1E0 CALL $E77D
E1E3 POP DE
E1E4 POP HL
E1E5 JR Z,$E1F0 No hit: fall through to the timer
E1E7 INC L
E1E8 SET 7,(HL) Mark hit
E1EA LD BC,$4B02 +750??
E1ED JP $6415 => Update Score
E1F0 EX DE,HL Count down the respawn timer
E1F1 DEC (HL)
E1F2 RET NZ
E1F3 LD (HL),$28 Reload the timer
E1F5 LD A,(DE) Compute the spawn column
E1F6 ADD A,$3B
E1F8 RET C
E1F9 SUB $0A
E1FB AND $F8
E1FD RRA
E1FE RRA
E1FF RRA
E200 LD L,A
E201 INC E
E202 LD A,(DE) Compute the spawn row
E203 SUB $0E
E205 RET C
E206 LD H,A
E207 PUSH HL
E208 LD BC,$1002 Grab a free enemy slot
E20B CALL $E44D
E20E POP DE
E20F RET Z
E210 LD (HL),$FD Fill in the new record
E212 DEC L
E213 DEC L
E214 LD (HL),$0A
E216 DEC L
E217 DEC L
E218 LD (HL),$00
E21A DEC L
E21B LD (HL),$00
E21D DEC L
E21E LD (HL),D
E21F DEC L
E220 DEC L
E221 SET 6,(HL) Flag the new object
E223 RET
E224: Jeep hit check, kill/score, spawn next enemy (unconfirmed)
Used by the routine at E1B5.
Runs the Jeep enemy each frame. Once it has driven far enough it fires shells at the player on a cadence that quickens in later Areas, and enough shell hits destroy it for 1500 points. It also kills the player if caught in the Jeep's body or run over.
E224 LD A,($FDCB) Read the Jeep flag
E227 INC A None active? nothing to do
E228 JP Z,$E2B2
E22B DEC A Flag minus one
E22C ADD A,A
E22D ADD A,A Doubled and based at $08
E22E ADD A,$08
E230 LD E,A
E231 LD A,($FDCC) Load the Jeep's row
E234 LD D,A
E235 CP $50 Only fires past row $50
E237 LD HL,$FDF8
E23A JR C,$E241
E23C INC L
E23D LD (HL),$00
E23F JR $E290
E241 INC (HL)
E242 LD B,$1F Set the fire cadence
E244 CP $20
E246 JR NC,$E253
E248 SRL B
E24A LD A,($FDE5) Get Area number
E24D CP $05
E24F JR C,$E253
E251 SRL B
E253 LD A,(HL) Due to fire this frame?
E254 AND B
E255 PUSH HL
E256 JR NZ,$E26C
E258 PUSH DE
E259 EX DE,HL
E25A LD A,($FDE3) Aim at the player
E25D ADD A,$04
E25F LD C,A
E260 LD A,($FDE4)
E263 ADD A,$04
E265 LD B,A
E266 LD A,$03
E268 CALL $F200 Scan object table (IX,$0E stride), compute and store motion vector
E26B POP DE
E26C LD HL,$F8ED Check the shell against the targets
E26F LD B,$10
E271 LD A,E
E272 SUB $06
E274 LD E,A
E275 LD A,D
E276 SUB $10
E278 LD D,A
E279 CALL $E77D
E27C POP HL
E27D JR Z,$E290
E27F INC L
E280 INC (HL) Count the hits on the Jeep
E281 LD A,(HL)
E282 CP $0C Destroyed after enough hits
E284 JR C,$E290
E286 SET 7,(IY+$4B) Mark it dead
E28A LD BC,$0F03 +1500?? for destroying a Jeep??
E28D CALL $6415 Update Score
E290 LD A,($FDCB) Player caught under the Jeep?
E293 ADD A,A
E294 ADD A,A
E295 SUB $03
E297 SUB (IY+$63)
E29A JR NC,$E2B2
E29C ADD A,$0D
E29E JR NC,$E2B2
E2A0 LD A,($FDCC)
E2A3 SUB $17
E2A5 SUB (IY+$64)
E2A8 JR NC,$E2B2
E2AA ADD A,$0C
E2AC JR NC,$E2B2
E2AE SET 0,(IY+$62) Player is dead
E2B2 LD HL,$FDC7 Update the two gun positions
E2B5 LD A,(HL)
E2B6 INC A
E2B7 CALL NZ,$E2BF
E2BA LD HL,$FDC9
E2BD LD A,(HL)
E2BE RET Z
E2BF LD A,($FDE3) Compare against the player column
E2C2 ADD A,$07
E2C4 SUB (HL)
E2C5 RET C
E2C6 SUB $16
E2C8 RET NC
E2C9 LD A,($FDE4)
E2CC INC L
E2CD SUB (HL)
E2CE RET NC
E2CF ADD A,$10
E2D1 RET NC
E2D2 LD A,($FDCE)
E2D5 CP $3D
E2D7 RET C
E2D8 SET 0,(IY+$62) Player is dead
E2DC RET
E2DD: Init enemy object (BC=$0806, type $07)
Used by the routine at E2EA.
Input
L Column
Output
IX New object record
Places one enemy of the fixed squad at the given column, with its type and timers preset.
E2DD LD BC,$0806
E2E0 LD H,$04
E2E2 CALL $E44D
E2E5 LD (IX+$0A),$07
E2E9 RET
E2EA: Decrement Enemy delay ($FDDD), spawn enemy by Area ($FDE5) when due
Used by the routine at E10C.
Input
IY System-variable base ($FD80)
Drives enemy spawning on a countdown that shortens as the Areas go on. A Fortress Area sends in a fixed squad; elsewhere enemies arrive one at a time, at a random column or in from a screen edge, each dropped into a free slot with a staggered delay. Once the level counter runs out it stops spawning and flags the level done.
E2EA CALL $E1B5 Service the two bomb/explosion slots
E2ED DEC (IY+$5D)
E2F0 JR Z,$E2FF Timer up? go set up the next spawn
E2F2 BIT 4,(IY+$15)
E2F6 RET Z
E2F7 LD A,($FDFA) Force level-end once the counter passes $14
E2FA CP $14
E2FC JR NC,$E34C
E2FE RET
E2FF LD A,($FDE5) Get Area number
E302 CP $07
E304 JR C,$E308
E306 LD A,$07
E308 SRL A Reload the delay -- shorter in later Areas
E30A NEG
E30C ADD A,$03
E30E ADD A,A
E30F ADD A,A
E310 ADD A,A
E311 ADD A,$37
E313 LD (IY+$5D),A
E316 BIT 4,(IY+$15) Take the alternate path if the level flag is set
E31A JP Z,$E3A4
E31D LD A,($FDFA)
E320 OR A
E321 JR NZ,$E348
E323 LD A,($FDE5) Get Area number
E326 AND $03 $03 - Fortress byte
E328 JR NZ,$E348
E32A PUSH AF Fortress Area: spawn a fixed squad
E32B LD L,$02
E32D CALL $E2DD Init enemy object
E330 LD L,$08
E332 CALL $E2DD Init enemy object
E335 LD L,$14
E337 CALL $E2DD Init enemy object
E33A SET 7,(IX+$0B) Mark one squad member special
E33E LD L,$1B
E340 CALL $E2DD Init enemy object
E343 POP AF
E344 LD (IY+$7A),$04
E348 CP $14
E34A JR C,$E35A
E34C LD A,($FDFC) Level cleared: raise the done flag in $5BE5
E34F OR A
E350 RET NZ
E351 LD A,($5BE5)
E354 SET 1,A
E356 LD ($5BE5),A
E359 RET
E35A LD (IY+$5D),$0A Normal spawn: short delay, random placement
E35E LD L,$0F
E360 CALL $DC83 Get random byte
E363 BIT 7,A
E365 JR NZ,$E368
E367 DEC L
E368 AND $07
E36A ADD A,$FF
E36C LD H,A
E36D CALL $E1AC Draw a small random offset
E370 ADD A,$08 Column and default delay for the new enemy
E372 LD B,A
E373 LD C,$0F
E375 LD A,($FDFA) Shorten it once the level counter reaches $0A
E378 CP $0A
E37A JR NZ,$E37D
E37C DEC C
E37D PUSH BC
E37E CALL $E44D Claim a free slot
E381 POP BC
E382 RET Z None free? give up
E383 LD A,C Only this delay gets the special setup
E384 CP $0E
E386 JR NZ,$E398
E388 SET 1,(IX+$0B) Mark it aggressive and facing
E38C SET 6,(IX+$0B)
E390 SET 0,(IX+$0C)
E394 LD (IX+$11),$20 Give it a longer first action
E398 INC (IY+$7A) Count the spawn
E39B CALL $DC83 Get random byte
E39E AND $01
E3A0 JP Z,$EC1B => Check enemy position on-screen, trigger action
E3A3 RET
E3A4 CALL $DC83 Get random byte
E3A7 AND $04
E3A9 JR Z,$E3B5
This entry point is used by the routine at EDD6.
E3AB LD L,$1F Spawn from the right edge
E3AD LD BC,$0C00
E3B0 LD A,($FDDF)
E3B3 JR $E3BD
This entry point is used by the routine at EDD6.
E3B5 LD L,$FE Spawn from the left edge
E3B7 LD BC,$0400
E3BA LD A,($FDDE)
E3BD CP $60 Skip unless within the visible column band
E3BF JR NC,$E3EC
E3C1 CP $28
E3C3 JR C,$E3EC
E3C5 SUB $20 Convert column to a row index
E3C7 LD H,A
E3C8 BIT 3,B
E3CA LD A,($FDF1)
E3CD JR NZ,$E3D0
E3CF RRA
E3D0 LD C,$18
E3D2 RRA
E3D3 JR NC,$E3D7
E3D5 LD C,$30
E3D7 PUSH BC Stagger the spawn timer
E3D8 LD C,$02
E3DA RLC (IY+$16)
E3DE JR C,$E3E4
E3E0 LD (IY+$5D),$08
E3E4 CALL $E44D Grab a free enemy slot
E3E7 POP BC
E3E8 LD (IX+$11),C Store its action timer
E3EB RET
E3EC LD A,($FD97) Off band: retry against the vertical range
E3EF CP $5E
E3F1 JR NC,$E416
E3F3 CP $2A Below the band? try the vertical range
E3F5 JR C,$E416
E3F7 LD H,A Take the row, set the default delay
E3F8 LD C,$07
E3FA RLC (IY+$70) Alternate between the two spawn rows
E3FE JR NC,$E408
E400 LD C,$09 Longer delay on this row
E402 LD A,H Move the spawn row up
E403 SUB $24
E405 LD H,A
E406 JR $E44D
E408 LD A,H Shift the row further
E409 SUB $37
E40B LD H,A Take the low byte, flip the side
E40C LD A,L
E40D XOR $01
E40F LD L,A
E410 LD (IY+$5D),$28 Slow the spawn timer down
E414 JR $E44D
E416 LD A,($FDEE) Too many objects already?
E419 CP $32
E41B JR C,$E425
E41D LD C,$04 Crowded: shorten the delay
E41F SRL (IY+$5D) Halve the spawn timer
E423 JR $E42C
E425 CALL $DC83 Get random byte
E428 AND $0E
E42A JR NZ,$E438
E42C CALL $DC83 Get random byte
E42F LD C,$04
E431 BIT 7,A
E433 JR Z,$E448
E435 INC C
E436 JR $E448
E438 CALL $DC83 Get random byte
E43B AND $1E
E43D LD L,A
E43E LD H,$FF
E440 CALL $E1AC Draw a small random offset
E443 ADD A,$08
E445 LD B,A
E446 JR $E44D
E448 AND $3F
E44A ADD A,$08
E44C LD H,A
This entry point is used by the routines at E10F, E1D1, E2DD, EE24 and EF37.
E44D EXX
E44E LD HL,$5B11 Point at the object table
E451 LD A,(HL) Stop at the end marker -- no slot free
E452 CP $90
E454 RET Z
E455 LD A,L
E456 ADD A,$0B
E458 LD L,A
E459 BIT 5,(HL) Skip records whose active flag is set
E45B JR Z,$E462
E45D ADD A,$09
E45F LD L,A
E460 JR $E451
E462 SUB $0B Found a free record, rewind to its start
E464 LD L,A
E465 PUSH HL
E466 EXX
E467 LD D,$20
E469 LD A,C Some enemy types get a special flag
E46A CP $09 #0 type $09
E46C JR Z,$E47A
E46E CP $0B #1 type $0B
E470 JR Z,$E47A
E472 CP $02 #2 type $02
E474 JR Z,$E47A
E476 CP $0F
E478 JR NZ,$E47C
E47A SET 1,D
E47C PUSH BC
E47D PUSH HL
E47E LD A,L
E47F CP $20
E481 JR C,$E484
E483 XOR A
E484 ADD A,A Convert the spawn spot to a map address
E485 ADD A,A
E486 ADD A,$07
E488 LD L,A
E489 LD A,H
E48A ADD A,$06
E48C LD H,A
E48D CALL $DC92 Entry E=2, dispatch bullet/collision handler via $DF39
E490 POP HL
E491 POP BC
E492 JR NC,$E4A7
E494 LD A,C Reject the spawn if it clashes with the player
E495 CP $06
E497 JR Z,$E4A7
E499 CP $0A
E49B JR Z,$E4A7
E49D BIT 1,D
E49F JR NZ,$E4A7
E4A1 POP HL
E4A2 LD (IY+$5D),$01 Give up: reset the spawn timer
E4A6 RET
E4A7 EX DE,HL Commit the new object into the record
E4A8 EX (SP),HL
E4A9 PUSH HL
E4AA POP IX
E4AC LD (HL),E Write its start position
E4AD INC L
E4AE LD (HL),D
E4AF INC L
E4B0 LD (HL),$00 Clear the position fields
E4B2 INC L
E4B3 LD (HL),$00
E4B5 INC L
E4B6 LD (HL),E Store the spawn column and row
E4B7 INC L
E4B8 LD (HL),D
E4B9 INC L
E4BA LD (HL),$03 Initial state and heading
E4BC INC L
E4BD LD (HL),$00
E4BF INC L
E4C0 LD (HL),$04 Clip bounds for the sprite
E4C2 INC L
E4C3 LD (HL),$5F
E4C5 INC L
E4C6 LD (HL),$0A Sprite height
E4C8 INC L
E4C9 POP DE
E4CA LD (HL),D Store the caller's frame and count
E4CB INC L
E4CC LD (HL),B
E4CD INC L
E4CE LD (HL),$00
E4D0 LD A,L Skip on to the attribute field
E4D1 ADD A,$03
E4D3 LD L,A
E4D4 LD (HL),$00
E4D6 INC L
E4D7 LD E,$0F Bright attribute for types 7 and 8
E4D9 LD A,C
E4DA CP $07
E4DC JR Z,$E4E2
E4DE CP $08
E4E0 JR NZ,$E4E4
E4E2 LD E,$38
E4E4 LD (HL),E Store the attribute and type
E4E5 INC L
E4E6 LD (HL),C
E4E7 INC L
E4E8 LD (HL),B
E4E9 CP $0C Type $0C starts in state $18
E4EB RET NZ
E4EC LD (IX+$0C),$18
E4F0 OR A
E4F1 RET
E4F2: Direction codes read by EBE1 as $E4F1 + the direction bits; index 0 is never used, so the base byte is the RET above
E4F2 DEFB $04,$0C,$0C,$08,$06,$0A,$04,$00
E4FA DEFB $02,$0E
E4FC: Set up player object pointers (IX=$5BDA)
Used by the routine at E100.
Reads the player's position and drives their movement each frame. Under scripted control (entering an area) it injects a synthetic direction to walk the player to a target column, and when captured or dying it runs a death countdown. Otherwise it reads the joystick, maps it through the $E4F1 direction table, and steps the player toward the input.
E4FC LD IX,$5BDA Player's object record address
E500 LD A,($5BDE)
E503 ADD A,A
E504 ADD A,A
E505 ADD A,(IX+$06)
E508 LD ($FDE3),A Store the player's X ($FDE3)
E50B LD E,A
E50C LD A,($5BDF) Store the player's Y ($FDE4)
E50F LD ($FDE4),A
E512 LD D,A
E513 BIT 1,(IX+$0B) In an auto-move state?
E517 JR Z,$E552
E519 BIT 4,(IX+$0C)
E51D JR Z,$E527
E51F LD (IX+$0C),$00
E523 LD (IX+$0A),$0A
E527 LD A,E
E528 CP $40 Reached the target column?
E52A JR NZ,$E53E
E52C LD A,D
E52D OR A
E52E JR NZ,$E53A
E530 RES 0,(IY+$62) Arrived: clear the auto-move
E534 LD (IY+$7A),$00
E538 POP AF
E539 RET
E53A LD D,$08
E53C JR $E546
E53E JR C,$E544
E540 LD D,$02
E542 JR $E546
E544 LD D,$01
E546 LD A,($FD85) Get last joystick/keyboard bits
E549 AND $F0
E54B OR D
E54C LD ($FD85),A Update last joystick/keyboard bits
E54F JP $E586
E552 LD A,($5BE6) Captured or dying? run the death sequence
E555 CP $10
E557 JR C,$E586
E559 DEC (IX+$11) Count down the death timer
E55C RET NZ Not due yet? leave it
E55D LD B,$14
E55F BIT 7,(IX+$0B) Aggressive objects are worth more
E563 JR Z,$E56A
E565 CP $13 ...as is the special state $13
E567 JR Z,$E56A
E569 DEC B
E56A LD A,B Store the score band
E56B LD ($5BE6),A
E56E LD (IX+$11),$02 Short delay before the next step
E572 LD A,($5BE4) Count the remaining objects down
E575 DEC A
E576 LD ($5BE4),A
E579 DEC A None left? finish the wave
E57A JR NZ,$E582
E57C SET 0,(IY+$62) Player is dead
E580 POP AF
E581 RET
E582 INC (IX+$05) Otherwise inch the body down
E585 RET
E586 LD A,($FD85) Get last joystick/keyboard bits
E589 AND $0F
E58B XOR $0F
E58D JR NZ,$E58F
E58F XOR $0F
E591 RET Z
E592 CP $0B Clamp input to 8 directions
E594 JR C,$E598
E596 LD A,$08
E598 LD HL,$E4F1 Look up the target direction
E59B LD C,A
E59C LD B,$00
E59E ADD HL,BC
E59F LD A,(HL)
E5A0 LD D,A
E5A1 LD E,(IX+$0C) Already facing that way?
E5A4 SUB E
E5A5 JR Z,$E5DB => Move enemy toward target, clamp to bounds
E5A7 BIT 4,E
E5A9 JR NZ,$E5DB => Move enemy toward target, clamp to bounds
E5AB CALL $E5B8 Convert direction code (masked 0-15) to E delta
E5AE LD A,E
E5AF AND $0F
E5B1 LD (IX+$0C),A Store the new facing
E5B4 LD D,A
E5B5 JP $E5DB => Move enemy toward target, clamp to bounds
E5B8: Convert direction code (masked 0-15) to E delta
Used by the routine at E4FC.
Input
A Direction code (low nibble selects the step)
E Coordinate to adjust
B Full direction (bit 7 breaks the tie at A=8)
Output
E Adjusted coordinate
Turns a heading into a step along one axis, mapping the low nibble of the direction to a signed offset -- the X component of movement for the sixteen-way headings.
E5B8 LD B,A Mask direction to 0-15, check low range
E5B9 AND $0F
E5BB CP $05
E5BD JR C,$E5D3
E5BF CP $08
E5C1 JR Z,$E5D5
E5C3 JR C,$E5D0 Check mid range, branch
E5C5 CP $0C
E5C7 JR C,$E5CB
E5C9 DEC E Step -1 (directions 12-15)
E5CA RET
E5CB DEC E Step down twice
E5CC DEC E
E5CD DEC E ...and twice more
E5CE DEC E
E5CF RET
E5D0 INC E Step +3 (directions 5-8)
E5D1 INC E
E5D2 INC E
E5D3 INC E Step +1 (directions 0-4)
E5D4 RET
E5D5 BIT 7,B Direction 8: pick sign from bit 7
E5D7 JR NZ,$E5D0
E5D9 JR $E5CB
E5DB: Move enemy toward target, clamp to bounds
Used by the routines at E4FC and E972.
Input
IX Address of the 20-byte object record
Moves an object one step along its heading: the two horizontal directions go through their own movers, anything else falls through to the direction dispatcher. The new position is clamped against the object's bounds before being stored.
E5DB INC (IX+$10) Load object position/velocity into HL/E
E5DE LD H,(IX+$05)
E5E1 LD L,(IX+$04)
E5E4 LD E,(IX+$06)
E5E7 LD A,D Pick $E679 or $E648 handler by direction (D)
E5E8 CP $10
E5EA JR Z,$E5F5
E5EC CP $17
E5EE JR NZ,$E61B
E5F0 CALL $E679 Move left
E5F3 JR $E5F8
E5F5 CALL $E648 Move right
E5F8 LD (IX+$06),E
E5FB LD (IX+$04),L
E5FE LD D,(IX+$0F) Load target coordinates for bound check
E601 LD E,(IX+$0E)
E604 LD H,(IX+$13)
E607 CALL $F21E Clamp/check coordinate H
E60A LD (IX+$0F),H
E60D LD (IX+$0E),L
E610 LD (IX+$13),C
E613 LD A,(IX+$0D)
E616 ADD A,H
E617 LD (IX+$05),A
E61A RET
E61B LD BC,$E628
E61E PUSH BC
E61F OR A
E620 RET Z
E621 CP $08
E623 RET Z
E624 JR C,$E648 => Move right
E626 JR $E679 => Move left
E628: Dispatch by direction, clear draw-active if off-screen
Dispatches an object by its heading, sending it to the up or up/down mover according to which band the direction falls in, and clearing its draw flag when the column has gone out of range.
E628 LD A,L Check column bound, clear active flag
E629 CP $81
E62B JR C,$E636
E62D CP $FE
E62F JR NC,$E636
E631 RES 5,(IX+$0B)
E635 RET
E636 LD A,D Check row band, dispatch by direction
E637 CP $04
E639 JP Z,$E6C3
E63C JR C,$E6A8 => Move enemy up one row if states/flags allow
E63E CP $0C
E640 JP Z,$E6C3
E643 JP C,$E6DB => Move up/down
E646 JR $E6A8 => Move enemy up one row if states/flags allow
E648: Move right: check keys/state, advance E and wrap
Used by the routine at E5DB.
Input
A State/direction code
E Sub-position counter
IX Object record
Moves an object right when its state and the collision flags allow, stepping a sub-position counter and only shifting a whole column once that wraps.
E648 CP $01 Check special states $01/$07, test heading bit
E64A JR Z,$E650
E64C CP $07
E64E JR NZ,$E655
E650 BIT 0,(IX+$10)
E654 RET Z
E655 BIT 4,(IX+$0B)
E659 JR Z,$E660
E65B BIT 0,(IY+$05) Check bit 0 (Right) of Last joystick/keyboard bits ($FD85)
E65F RET Z
E660 LD A,E Counter up one
E661 INC A
E662 AND $03 Wrapped mod 4, stored
E664 LD E,A
E665 JR Z,$E668
E667 RET
E668 LD A,L
E669 INC A
E66A CP $1E
E66C JR NC,$E670
E66E LD L,A
E66F RET
E670 BIT 4,(IX+$0B)
E674 JR Z,$E66E
E676 LD E,$03
E678 RET
E679: Move left: check keys/state, advance E and wrap
Used by the routine at E5DB.
Input
A State/direction code
E Sub-position counter
IX Object record
Moves an object left when its state and the collision flags allow, stepping a sub-position counter and only shifting a whole column once that wraps.
E679 CP $09 Check special states $09/$0F, test heading bit
E67B JR Z,$E681
E67D CP $0F
E67F JR NZ,$E686
E681 BIT 0,(IX+$10)
E685 RET Z
E686 BIT 4,(IX+$0B)
E68A JR Z,$E693
E68C BIT 1,(IY+$05) Check bit 1 (Left) of Last joystick/keyboard bits ($FD85)
E690 JR NZ,$E693
E692 RET
E693 LD A,E Counter down one
E694 DEC A
E695 AND $03 Wrapped mod 4, stored
E697 LD E,A
E698 CP $03
E69A RET NZ
E69B DEC L
E69C LD A,L
E69D INC A
E69E RET NZ
E69F BIT 4,(IX+$0B)
E6A3 RET Z
E6A4 INC L
E6A5 LD E,$00
E6A7 RET
E6A8: Move enemy up one row if states/flags allow
Used by the routine at E628.
Input
IX Address of the 20-byte object record
A Enemy state
H Enemy row
Moves an enemy up one row when its state and collision flags allow it, then bounds-checks the new row and either clears the draw-active flag or falls through to the movement dispatcher at DC8C.
E6A8 CP $03 States $03/$0D take the gated path
E6AA JR Z,$E6B0
E6AC CP $0D
E6AE JR NZ,$E6B6
E6B0 BIT 0,(IX+$10)
E6B4 JR Z,$E6C3
E6B6 BIT 4,(IX+$0B) Blocked by wall-solid flag?
E6BA JR Z,$E6C2
E6BC BIT 3,(IY+$05) Check bit 3 (Up) of Last joystick/keyboard bits ($FD85)
E6C0 JR Z,$E6C3
E6C2 DEC H Move up one row
This entry point is used by the routines at E628 and E6DB.
E6C3 LD A,H
E6C4 CP $61 Reject row above top
E6C6 JR C,$E6D8
E6C8 CP $FA Reject row below bottom
E6CA JR NC,$E6D8
E6CC LD A,(IX+$12)
E6CF CP $07
E6D1 JR Z,$E6D8
E6D3 RES 5,(IX+$0B) Clear draw-active flag
E6D7 RET
E6D8 JP $DC8C => Check IX flag and column bound, dispatch
E6DB: Move up/down: check states, adjust row
Used by the routine at E628.
Moves an object down a row when its state and the collision flags allow, stopping it at the lower limit.
E6DB CP $05 Check special states $05/$0B, test heading bit
E6DD JR Z,$E6E3
E6DF CP $0B
E6E1 JR NZ,$E6E9
E6E3 BIT 0,(IX+$10)
E6E7 JR Z,$E6C3
E6E9 LD A,H Advance row, check limit $55
E6EA INC A
E6EB CP $55
E6ED JR C,$E6FB
E6EF BIT 4,(IX+$0B)
E6F3 JR Z,$E6FB
E6F5 LD A,D
E6F6 CP $08
E6F8 RET Z
E6F9 JR $E6FC
E6FB LD H,A
E6FC JR $E6C3
E6FE: Check player shots against every enemy in $5B11
Used by the routine at E106.
Runs one object from the $5B11 table each frame, checking whether the player's shots have hit it. It works out the object's position, then scans the bullet lists at $F8ED and $F8EA for an overlap. A hit starts the object's death animation and scores 200 points (2000 for a special target), with a sound effect.
E6FE LD A,($FDFC) Copy a state byte forward
E701 LD ($FDFE),A
E704 LD (IY+$7C),$00
E708 LD IX,$5B11 Point at the object table
This entry point is used by the routine at E972.
E70C BIT 5,(IX+$0B) Skip inactive objects
E710 JP Z,$E9B9
E713 LD A,(IX+$04) Object column into the position
E716 ADD A,A
E717 ADD A,A
E718 ADD A,(IX+$06)
E71B LD E,A
E71C LD D,(IX+$05)
E71F LD A,(IX+$12) Read the object's state
E722 CP $0A
E724 JR Z,$E732
E726 CP $06
E728 JR Z,$E732
E72A LD A,D
E72B CP $61 On screen?
E72D JR NC,$E732
E72F INC (IY+$7C)
E732 LD HL,$F8ED Scan the bullet list
E735 LD B,$09
E737 INC E
E738 INC E
E739 LD A,(IX+$0C) Only certain frames can be hit
E73C CP $13
E73E JR C,$E744
E740 CP $17
E742 JR C,$E770
E744 LD A,(IX+$12)
E747 SUB $0A
E749 JR Z,$E770
E74B INC A
E74C JR Z,$E770
E74E CALL $E77D Look for a collision
E751 JR Z,$E770
Killed the object
E753 LD (IX+$0C),$13 Hit: start the death animation
E757 LD (IX+$11),$10
E75B LD BC,$0203 +200 for the kill
E75E LD A,(IX+$12) Bigger score for a special target
E761 CP $0E
E763 JR NZ,$E766
E765 INC C change to +2000
E766 CALL $6415 Update Score
E769 LD A,$05
E76B CALL $642D Trigger sound effect A (copy its parameter into slot A)
E76E JR $E794 => Enemy melee/contact check vs player, kill if close
E770 LD HL,$F8EA Otherwise scan the second list
E773 LD B,$1D
E775 CALL $E77D
E778 JR NZ,$E753 Hit there too? handle the kill
E77A JR $E794 => Enemy melee/contact check vs player, kill if close
E77C: Scan object table for entry near position
Input
HL Record-list pointer (row, column pairs)
D Target row
E Target column
B Search half-size (row/column tolerance)
Output
HL Pointer into the matched record
F Zero set if no record matched (end marker)
Walks a list of row/column record pairs and returns the first one within a B-sized box of the target position (D,E), stopping at the $90 end marker; the zero flag is set only when nothing matched.
E77C INC L
This entry point is used by the routines at E1D1, E224, E6FE and EF37.
E77D LD A,(HL) Read record
E77E INC L
E77F CP $90 Inactive record marker ($90)
E781 RET Z
E782 SUB D Check row within range B
E783 JR C,$E77C
E785 CP B
E786 JR NC,$E77C => Scan object table for entry near position
E788 LD A,E Check column within range B
E789 SUB (HL)
E78A JR NC,$E77C => Scan object table for entry near position
E78C NEG
E78E CP B
E78F JR NC,$E77C => Scan object table for entry near position
E791 INC B Match found: set flags (B nonzero)
E792 DEC B
E793 RET
E794: Enemy melee/contact check vs player, kill if close
Used by the routine at E6FE.
Input
IX Address of the 20-byte object record
D Enemy row
E Enemy column
Runs one frame of an enemy soldier. It first checks whether the player has walked into the enemy and kills them if so, then hands off to the handler for whatever state the enemy is in.
E794 BIT 4,(IX+$0C) Check sub-state flag and AI state $09
E798 JR NZ,$E7BD
E79A LD A,(IX+$12)
E79D CP $09
E79F JR Z,$E7BD
E7A1 LD A,($FDE4) Compare player row/column against enemy
E7A4 SUB D
E7A5 JR NC,$E7BD
E7A7 ADD A,$05
E7A9 JR NC,$E7BD
E7AB LD A,($FDE3)
E7AE ADD A,$03
E7B0 SUB E
E7B1 JR NC,$E7B5
E7B3 NEG
E7B5 CP $06 Player within 6 columns?
E7B7 JR NC,$E7BD
E7B9 SET 0,(IY+$62) Flag player dead
E7BD LD A,(IX+$0C)
E7C0 LD D,A
E7C1 CP $10 Dispatch by enemy state
E7C3 JP C,$E972 => Dispatch enemy AI by state
E7C6 JR Z,$E7E4
E7C8 CP $18
E7CA JP Z,$E972 => Dispatch enemy AI by state
E7CD CP $16
E7CF JR NZ,$E7D8
E7D1 RES 5,(IX+$0B)
E7D5 JP $E9B9
E7D8 CP $11
E7DA JR Z,$E81B
E7DC CP $12
E7DE JR Z,$E843
E7E0 CP $17
E7E2 JR NZ,$E7FF
E7E4 DEC (IX+$11) Count down the state timer
E7E7 LD D,A
E7E8 JR NZ,$E7FC
E7EA LD (IX+$12),$00
E7EE CALL $EBE1 Compute direction bits toward player position
E7F1 LD (IX+$0C),A Store the new heading
E7F4 LD (IX+$11),$10 Reload the state timer
E7F8 RES 1,(IX+$0B)
E7FC JP $E9B6
E7FF DEC (IX+$11) Count the state timer down
E802 LD B,$16
E804 JR Z,$E815
E806 INC (IX+$10) Step the animation counter
E809 LD A,(IX+$10) Pick the heading from its low bits
E80C DEC B
E80D RRA
E80E JR NC,$E815
E810 DEC B
E811 RRA
E812 JR NC,$E815
E814 DEC B
E815 LD (IX+$0C),B Store the heading
E818 JP $E9B9
E81B DEC (IX+$11) Count the state timer down
E81E JP NZ,$E9B9
E821 LD (IX+$0C),$12 Switch to state $12
E825 LD (IX+$11),$04
E829 LD D,(IX+$05) Take the object row
E82C LD A,(IX+$04) Column doubled
E82F ADD A,A Doubled again, added to the row
E830 ADD A,A
E831 ADD A,(IX+$06)
E834 SUB $03
E836 LD E,A
E837 LD C,$00
E839 PUSH IX
E83B CALL $F1BB Check position bounds, set flags
E83E POP IX
E840 JP $E9B9
E843 DEC (IX+$11)
E846 JP NZ,$E9B9
E849 LD (IX+$11),$12
E84D LD A,(IX+$12)
E850 CP $08
E852 JP Z,$EB7B => Enemy patrol AI
E855 CP $04
E857 JR NZ,$E862
E859 CALL $EBE1 Compute direction bits toward player position
E85C LD (IX+$0C),A
E85F JP $E9B9
E862 LD A,(IX+$13)
E865 LD (IX+$0C),A
E868 JP $E9B9
E86B: Enemy AI pause: reload short action timer
Used by the routines at E881 and EB7B.
Input
IX Address of the 20-byte object record
Enemy AI pause state: reloads the action timer (+$11) to $02, or to $04 with sub-state $11 when the object has no queued sprite frame (+$06 = 0), then continues at E9B9.
E86B LD A,$02
E86D LD E,(IX+$06) Read queued sprite frame (+$06)
E870 INC E
E871 DEC E
E872 JR Z,$E876
E874 JR $E87B
E876 LD (IX+$0C),$11 No frame: force sub-state $11
E87A ADD A,A
E87B LD (IX+$11),A Store pause timer
E87E JP $E9B9
E881: Enemy AI: re-aim at player, random fire
Input
IX Address of the 20-byte object record
Enemy AI state that re-aims toward the player, then on a random chance fires (EC1B) unless in state $09, before reloading the action timer and returning to the mover at E992.
E881 CALL $EBE1 Compute direction bits toward player position
E884 LD (IX+$0C),A Aim heading at player
E887 CALL $DC83 Get random byte
E88A RRA
E88B JR C,$E86B => Enemy AI pause
E88D AND $0C
E88F JR NZ,$E899
E891 LD A,(IX+$12)
E894 CP $09
E896 CALL NZ,$EC1B Check enemy position on-screen, trigger action
E899 LD (IX+$11),$0E Reload action timer $0E
E89D JP $E992
E8A0: Enemy wandering AI: timed re-aim, random fire and step
Used by the routine at E972.
Input
IX Address of the 20-byte object record
The enemy's wandering AI, run on a countdown. When the timer expires it cycles through a short sequence of behaviours -- re-aiming at the player, sometimes firing, then picking a fresh random step.
E8A0 DEC (IX+$11) Count down the move timer
E8A3 JP NZ,$E9B9
E8A6 LD A,(IX+$13) Read phase counter (+$13)
E8A9 OR A
E8AA JR Z,$E8D6
E8AC CP $03
E8AE JR Z,$E8D6
E8B0 CP $01
E8B2 JR NZ,$E8BE
E8B4 CALL $EBE1 Compute direction bits toward player position
E8B7 LD (IX+$0C),B
E8BA LD A,$01
E8BC JR $E8D6
E8BE CALL $EBE1 Compute direction bits toward player position
E8C1 LD (IX+$0C),A
E8C4 CALL $DC83 Get random byte
E8C7 BIT 6,A Random chance to fire
E8C9 PUSH AF
E8CA PUSH BC
E8CB CALL NZ,$EC1B Check enemy position on-screen, trigger action
E8CE POP BC
E8CF POP AF
E8D0 AND $02
E8D2 JR NZ,$E8D6
E8D4 JR $E904
E8D6 INC A
E8D7 AND $03 Advance phase counter 0..3
E8D9 LD (IX+$13),A
E8DC LD D,A
E8DD LD BC,$0113
E8E0 CALL $DC83 Get random byte
E8E3 AND $1F Random step size
E8E5 ADD A,C Add the random part to the step
E8E6 LD C,A
E8E7 LD A,D Low bit forces the shorter step
E8E8 BIT 0,A
E8EA JR Z,$E8EE
E8EC LD C,$04
E8EE INC A Second bit picks the direction
E8EF AND $02
E8F1 LD A,B
E8F2 JR Z,$E8F6
E8F4 NEG Negate for the other way
E8F6 LD B,A
E8F7 ADD A,(IX+$05) Apply the step to the row
E8FA LD (IX+$05),A
E8FD LD A,(IX+$0A) And take it off the height
E900 SUB B
E901 LD (IX+$0A),A
E904 LD (IX+$11),C Reload move timer
E907 JP $E9B9
E90A: Enemy AI: check row range, transition to attack state
Used by the routine at E972.
Input
IX Address of the 20-byte object record
Enemy approach AI: it closes on the player's row, switching into the attack state once near enough, and fires at intervals along the way.
E90A LD L,(IX+$04) Load target row, check upper bound
E90D LD A,(IX+$05)
E910 LD H,A
E911 CP $60 Row off-screen? exit
E913 JR NC,$E96F
E915 CP $2E Close enough to attack?
E917 JR C,$E92F
E919 LD (IX+$12),$01 Enter attack state
E91D CALL $E1AC Draw a small random offset
E920 AND $0F
E922 LD (IX+$0C),A
E925 LD (IX+$13),A
E928 LD (IX+$0A),$0A
E92C JP $E9B9
E92F BIT 4,(IY+$15)
E933 JR NZ,$E939
E935 CP $14
E937 JR C,$E96F
E939 LD A,($5BDE)
E93C SUB L Compare against player row
E93D JR Z,$E952
E93F JR NC,$E948
E941 INC A
E942 JR Z,$E952
E944 LD B,$0A
E946 JR $E954
E948 DEC A
E949 JR Z,$E952
E94B DEC A
E94C JR Z,$E952
E94E LD B,$06
E950 JR $E954
E952 LD B,$08
E954 LD (IX+$0C),B Set heading toward player
E957 DEC (IX+$11) Count down fire timer
E95A JR NZ,$E96F
E95C LD (IX+$11),$19 Reload fire timer
E960 CALL $DC83 Get random byte
E963 AND $03
E965 JR Z,$E96C
E967 LD A,B
E968 CP $08
E96A JR NZ,$E96F
E96C CALL $EC1B Check enemy position on-screen, trigger action
E96F JP $E9B9
E972: Dispatch enemy AI by state (IX+$12)
Used by the routine at E794.
Input
IX Address of the 20-byte object record
Sends an enemy to the handler for its current AI state through a jump table, once its action timer expires. Until then it simply keeps moving the enemy toward its target.
E972 LD A,(IX+$12) Special-case states $06 and $0A
E975 CP $06
E977 JR Z,$E90A
E979 CP $0A
E97B JP Z,$E8A0 => Enemy wandering AI
E97E DEC (IX+$11) Count down the action timer
E981 JP NZ,$E992
E984 LD A,(IX+$12) State code doubled
E987 ADD A,A State code doubled and based
E988 ADD A,$88
E98A LD L,A Point at the handler
E98B LD H,$E1
E98D LD E,(HL)
E98E INC L
E98F LD H,(HL)
E990 LD L,E
E991 JP (HL)
This entry point is used by the routines at E881, E9D2, E9DD, EA8E, EB13 and EB96.
E992 LD A,(IX+$12) Check for a small set of special states
E995 CP $0D
E997 JP Z,$E9B9
E99A CP $04 #1 state $04
E99C JR Z,$E9AE
E99E CP $09 #2 state $09
E9A0 JR Z,$E9AE
E9A2 CP $01 #3 state $01
E9A4 JR Z,$E9AE
E9A6 CP $0C #4 state $0C
E9A8 JR Z,$E9AE
E9AA CP $0F
E9AC JR NZ,$E9B3
E9AE LD D,(IX+$13) Use alternate delay field (IX+$13)
E9B1 JR $E9B6
E9B3 LD D,(IX+$0C) Use heading field (IX+$0C)
This entry point is used by the routines at E794, EB68, EB7B and EB96.
E9B6 CALL $E5DB Move enemy toward target, clamp to bounds
This entry point is used by the routines at E6FE, E794, E86B, E8A0, E90A, EA8E, EC58 and EF37.
E9B9 LD DE,$0014
E9BC ADD IX,DE
E9BE LD A,(IX+$00)
E9C1 CP $90
E9C3 RET Z
E9C4 JP $E70C
E9C7: Enemy AI state: clear the turn flag, reset the state and wander
Enemy AI state that clears the turn flag, resets the state byte and sends the object back to wandering.
E9C7 RES 1,(IX+$0B)
E9CB LD (IX+$12),$00
E9CF JP $EB96 => Enemy AI
E9D2: Enemy AI state: clear the turn flag, wait $30 frames
Enemy AI state that clears the turn flag and holds the object still for $30 frames.
E9D2 RES 1,(IX+$0B)
E9D6 LD (IX+$11),$30
E9DA JP $E992
E9DD: Enemy AI state: pick a heading by row band, or fire
Enemy AI state that picks a heading from which row band the object sits in, and fires at the player when the band and its timers line up.
E9DD LD A,(IX+$05)
E9E0 CP $24
E9E2 JR NC,$EA18
E9E4 LD A,(IX+$13) Take the stored heading
E9E7 LD D,A
E9E8 CP $04 Row band picks which behaviour runs
E9EA JR C,$E9F0
E9EC CP $0C
E9EE JR C,$E9FF
E9F0 LD (IX+$12),$01 Enter the attack state
E9F4 RES 1,(IX+$0B) Clear the turn flag
E9F8 LD (IX+$11),$10 Reload the action timer
E9FC JP $E992
E9FF LD B,(IX+$13) Keep the current heading
EA02 LD (IX+$11),$0B Short delay before the next step
EA06 CALL $DC83 Get random byte
EA09 AND $03
EA0B JR NZ,$EA77
EA0D CALL $DC83 Get random byte
EA10 AND $0F
EA12 LD (IX+$0C),A Store it
EA15 JP $E992
EA18 RES 1,(IX+$0B) Clear the turn flag before turning
EA1C CALL $DC83 Get random byte
EA1F PUSH AF
EA20 AND $07
EA22 JR NZ,$EA40
EA24 POP AF
EA25 PUSH AF
EA26 AND $18
EA28 JR NZ,$EA31
EA2A POP AF
EA2B LD (IX+$12),$04
EA2F JR $E9F4
EA31 POP AF
EA32 LD (IX+$12),$00
EA36 AND $E0
EA38 JR $E9F4
EA3A SET 7,(IX+$0B)
EA3E JR $E9F4
EA40 POP AF
EA41 LD (IX+$11),$05
EA45 CALL $EBE1 Compute direction bits toward player position
EA48 LD (IX+$13),B
EA4B CALL $DC83 Get random byte
EA4E BIT 7,A
EA50 JR Z,$EA6F
EA52 AND $0F
EA54 LD C,A
EA55 LD A,B
EA56 AND $07
EA58 JR NZ,$EA69
EA5A LD A,C
EA5B CP $04
EA5D JR Z,$EA67
EA5F CP $0C
EA61 JR NZ,$EA69
EA63 LD C,$0A
EA65 JR $EA69
EA67 LD C,$06
EA69 LD (IX+$0C),C
EA6C JP $E992
EA6F CALL $DC83 Get random byte
EA72 AND $0F
EA74 LD (IX+$13),A
EA77 LD (IX+$0C),B
EA7A LD A,($FDFE)
EA7D CP $01
EA7F JR NZ,$EA83
EA81 JR $EA88
EA83 CALL $DC83 Get random byte
EA86 AND $07
EA88 CALL Z,$EC1B Check enemy position on-screen, trigger action
EA8B JP $E992
EA8E: Enemy AI state: count the turn timer down, then steer
Enemy AI state that counts the turn timer down and, when it lapses, clears the turn flag and steers the object onto its new heading.
EA8E BIT 1,(IX+$0B) Turn flag set?
EA92 JR Z,$EAA4
EA94 DEC (IX+$0E) Count the turn timer down
EA97 LD (IX+$11),$01 Hold the action timer at one while turning
EA9B JP NZ,$E9B9
EA9E RES 1,(IX+$0B) Timer lapsed: clear the turn flag
EAA2 JR $EB0C Skip straight to picking the new heading
EAA4 LD D,(IX+$05) Player's row into D
EAA7 LD A,(IX+$04) Column plus a lookahead offset
EAAA ADD A,A
EAAB ADD A,A
EAAC ADD A,(IX+$06)
EAAF LD E,A
EAB0 LD C,$02 Default: heading east
EAB2 LD A,($FDE3) Player's column, minus this offset
EAB5 SUB E Behind us?
EAB6 JR NC,$EABC No: skip the flip
EAB8 NEG Flip it, heading west instead
EABA LD C,$00
EABC LD B,A Distance into B
EABD LD A,($FDE4) Player's row, minus ours
EAC0 SUB D
EAC1 JR C,$EB0C Below us? too close, bail
EAC3 CP B Distance too small vertically? bail
EAC4 JR C,$EB0C
EAC6 LD A,B Far enough to keep east/west?
EAC7 CP $14
EAC9 JR NC,$EACD Yes: skip the south override
EACB LD C,$01 Otherwise heading south instead
EACD PUSH IX Save state around the bounds check
EACF PUSH BC
EAD0 LD C,$00 No flag bits to OR in
EAD2 CALL $F1BB Check position bounds, set flags
EAD5 POP BC Restore the heading choice
EAD6 JR Z,$EB0A
EAD8 LD (IX+$0C),C Store the heading
EADB SET 0,(IX+$00) Flag it moving
EADF SET 1,(IX+$00) ...and turning
EAE3 LD E,$04 Base speed $04, check the Area
EAE5 LD A,($FDE5)
EAE8 CP $05 Past Area $05?
EAEA JR C,$EAF2
EAEC INC E Faster: past Area $09 too?
EAED CP $09
EAEF JR C,$EAF2 Even faster
EAF1 INC E
EAF2 LD (IX+$06),E Store the speed
EAF5 LD (IX+$07),$73 Set the action timer
EAF9 POP IX Restore IX
EAFB LD (IX+$11),$01 Hold the action timer at one
EAFF SET 1,(IX+$0B) Flag turning
EB03 LD (IX+$0E),$03 Arm the turn timer
EB07 JP $E9B9
EB0A POP IX
EB0C LD (IX+$11),$1C
EB10 JP $E992
EB13: Set enemy AI delay/direction by Area number ($FDE5)
Input
IX Address of the 20-byte object record
An enemy AI state that reloads its timer according to the Area, then either turns to face the player and possibly fires, or holds its existing heading.
EB13 LD B,$10
EB15 LD A,($FDE5) Get Area number
EB18 CP $04
EB1A JR C,$EB1E
EB1C LD B,$09
EB1E LD (IX+$11),B
EB21 CALL $DC83 Get random byte
EB24 AND $01 Coin-flip: re-aim or hold heading
EB26 JR Z,$EB5F
EB28 CALL $EBE1 Compute direction bits toward player position
EB2B LD A,(IX+$13)
EB2E AND $07
EB30 JR NZ,$EB41
EB32 LD A,B
EB33 CP $04
EB35 JR Z,$EB3F
EB37 CP $0C
EB39 JR NZ,$EB41
EB3B LD B,$0A
EB3D JR $EB41
EB3F LD B,$06
EB41 LD (IX+$0C),B Set heading
EB44 LD A,($FDE5) Get Area number
EB47 DEC A
EB48 BIT 1,A Fire probability scales with area
EB4A LD B,$03
EB4C JR Z,$EB55
EB4E LD B,$01
EB50 CP $07
EB52 JR C,$EB55
EB54 DEC B
EB55 CALL $DC83 Get random byte
EB58 AND B Random chance to fire
EB59 CALL Z,$EC1B Check enemy position on-screen, trigger action
EB5C JP $E992
EB5F LD A,(IX+$13) Hold stored heading (IX+$13)
EB62 LD (IX+$0C),A
EB65 JP $E992
EB68: Enter enemy AI state $01 with heading $08
Input
IX Address of the 20-byte object record
Puts an enemy into AI state $01 with heading $08 (current and next) and a $20-tick action timer, then moves via E9B6.
EB68 LD (IX+$12),$01 Enter AI state $01
EB6C LD D,$08
EB6E LD (IX+$0C),D Set heading $08 (current and next)
EB71 LD (IX+$13),D
EB74 LD (IX+$11),$20 Set action timer $20
EB78 JP $E9B6
EB7B: Enemy patrol AI: walk N steps then reverse
Used by the routine at E794.
Input
IX Address of the 20-byte object record
Enemy patrol AI: advances a step counter (+$0D) and keeps walking until it reaches 5, then reverses the heading (XOR $08), reloads the timer and moves via E9B6.
EB7B INC (IX+$0D) Advance step counter
EB7E LD A,(IX+$0D)
EB81 CP $05 Still walking?
EB83 JP C,$E86B => Enemy AI pause
EB86 LD A,(IX+$13)
EB89 XOR $08 Reverse heading 180 degrees
EB8B LD (IX+$0C),A
EB8E LD (IX+$11),$40 Reload timer $40
EB92 LD D,A
EB93 JP $E9B6
EB96: Enemy AI: wander or chase player by aggressive flag
Used by the routine at E9C7.
Input
IX Address of the 20-byte object record
An enemy AI state that wanders on a random heading until it turns aggressive, after which it homes in on the player and fires, dropping back out again after a while.
EB96 BIT 7,(IX+$0B) Aggressive flag set? chase
EB9A JR NZ,$EBB4
EB9C CALL $DC83 Get random byte
EB9F AND $0F Random heading 0-15
EBA1 LD D,A
EBA2 ADD A,$19 Random timer reload
EBA4 LD (IX+$11),A
EBA7 LD A,(IX+$10)
EBAA AND $01
EBAC JR NZ,$EBB4
EBAE LD (IX+$0C),D
EBB1 JP $E9B6
EBB4 CALL $EBE1 Compute direction bits toward player position
EBB7 LD (IX+$0C),B Aim heading at player
EBBA BIT 7,(IX+$0B)
EBBE JR NZ,$EBC9
EBC0 CALL $DC83 Get random byte
EBC3 RRA
EBC4 JR C,$EBDB
EBC6 JP Z,$E992
EBC9 LD (IX+$11),$11 Reload timer
EBCD INC (IX+$0F)
EBD0 LD A,(IX+$0F)
EBD3 AND $07
EBD5 JR NZ,$EBDB
EBD7 RES 7,(IX+$0B) Drop aggressive flag
EBDB CALL $EC1B Check enemy position on-screen, trigger action
EBDE JP $E992
EBE1: Compute direction bits toward player position
Used by the routines at E794, E881, E8A0, E9DD, EB13 and EB96.
Input
IX Address of the 20-byte object record
Output
C Direction bit flags
B Direction code
Works out which way the player lies from an object, comparing the two positions with a small dead zone and turning the result into one of the sixteen headings.
EBE1 LD A,($5BDF) Player Y and zeroed flag accumulator
EBE4 LD BC,$0000
EBE7 SUB (IX+$05) Y distance to player
EBEA JR C,$EBF4
EBEC SUB $10 Below dead-zone: set down bit
EBEE JR C,$EBFA
EBF0 SET 2,C
EBF2 JR $EBFA
EBF4 ADD A,$10 Above dead-zone: set up bit
EBF6 JR C,$EBFA
EBF8 SET 3,C
EBFA LD A,($5BDE) Compare X coordinate to object (IX+$04)
EBFD CP (IX+$04)
EC00 JR Z,$EC12
EC02 JR NC,$EC0C
EC04 ADD A,$01
EC06 JR C,$EC12
EC08 SET 1,C Player to the right: set bit
EC0A JR $EC12
EC0C SUB $01
EC0E JR C,$EC12
EC10 SET 0,C Player to the left: set bit
EC12 LD HL,$E4F1 Look up direction code in $E4F1 table
EC15 ADD HL,BC
EC16 LD A,(HL)
EC17 AND $0F
EC19 LD B,A
EC1A RET
EC1B: Check enemy position on-screen, trigger action
Used by the routines at E2EA, E881, E8A0, E90A, E9DD, EB13 and EB96.
Input
IX Address of the 20-byte object record
Fires an enemy shot from a position looked up for its direction, aimed near the player, provided the shot starts on screen.
EC1B PUSH IX
EC1D PUSH IX
EC1F POP HL
EC20 CALL $ED31 Look up entry in table at $EC81
EC23 LD A,H
EC24 CP $60 Reject if off bottom edge
EC26 JR NC,$EC55
EC28 CP $05
EC2A JR C,$EC55
EC2C LD A,L
EC2D CP $80 Reject if off right edge
EC2F JR NC,$EC55
EC31 LD A,($5BDF)
EC34 ADD A,$04
EC36 LD B,A
EC37 LD A,($FDE3)
EC3A ADD A,$04
EC3C LD C,A
EC3D LD E,$82
EC3F LD A,($FDE5) Get Area number
EC42 CP $04 #0 area band 0-3
EC44 JR C,$EC51
EC46 INC E
EC47 CP $08 #1 area band 4-7
EC49 JR C,$EC51
EC4B INC E
EC4C CP $0C #2 area band 8-11, else 12+
EC4E JR C,$EC51
EC50 INC E
EC51 LD A,E
EC52 CALL $F200 Scan object table (IX,$0E stride), compute and store motion vector
EC55 POP IX
EC57 RET
EC58: Set enemy sub-state (IX+$0C) by threshold, reset delay/target
Input
IX Address of the 20-byte object record
Flips the enemy sub-state (+$0C) between $10 and $17 depending on whether its current value is under $08, then resets its timers and target fields and continues at E9B9.
EC58 LD A,(IX+$0C) Compare (IX+$0C) against $08, pick $17/$10
EC5B CP $08
EC5D JR C,$EC63
EC5F LD A,$17
EC61 JR $EC65
EC63 LD A,$10
EC65 LD (IX+$0C),A Store new sub-state, reset timers to defaults
EC68 LD (IX+$13),$F6
EC6C LD (IX+$11),$10
EC70 LD (IX+$0F),$00 Clear position counters (+$0F/+$0E)
EC74 LD (IX+$0E),$00
EC78 LD A,(IX+$05) Snapshot target row into +$0D
EC7B LD (IX+$0D),A
EC7E JP $E9B9
EC81: Per-direction shot offsets and sizes, read by ED31
EC81 DEFB $04,$FF,$00,$FC,$07,$02,$02,$FC
EC89 DEFB $07,$02,$03,$FD,$07,$02,$04,$FE
EC91 DEFB $07,$04,$04,$00,$07,$07,$04,$02
EC99 DEFB $07,$07,$03,$03,$07,$07,$02,$04
ECA1 DEFB $04,$0A,$00,$04,$00,$06,$FE,$04
ECA9 DEFB $00,$06,$FD,$03,$00,$06,$FC,$02
ECB1 DEFB $00,$05,$FC,$00,$00,$01,$FC,$FE
ECB9 DEFB $00,$01,$FD,$FD,$00,$01,$FE,$FC
ECC1: Check fire button and joystick input
Used by the routine at E103.
Handles the player firing: a tap shoots a bullet, holding the button lobs a grenade if any remain, and either way the shot is spawned with its sound.
ECC1 LD A,($5BE6)
ECC4 CP $10 Skip while player busy
ECC6 RET NC
ECC7 BIT 4,(IY+$05) Check bit 4 (Fire) of Last joystick/keyboard bits ($FD85)
ECCB LD A,($FD95)
ECCE LD D,A
ECCF JR NZ,$ECE3 Fire => jump
ECD1 AND $70 Keep only the charge bits
ECD3 LD ($FD95),A
ECD6 BIT 5,(IY+$05) Grenade key held?
ECDA JR NZ,$ECF2
ECDC BIT 6,A Nothing pending? done
ECDE RET Z
ECDF RES 6,A Clear the pending flag and fire
ECE1 JR $ED1C
Fire button pressed
ECE3 BIT 7,A Already charging?
ECE5 JR Z,$ED1A
ECE7 INC A Step the charge counter on
ECE8 LD ($FD95),A
ECEB AND $0F Held long enough for a grenade?
ECED CP $0F
ECEF LD A,D
ECF0 JR C,$ECD6
ECF2 LD A,($FD95) Clear the charge, keep the mode bits
ECF5 AND $F0
ECF7 LD ($FD95),A
ECFA LD A,($FDE7) Get grenades number
ECFD OR A
ECFE RET Z
ECFF LD A,($5BDA) Get player's column
ED02 ADD A,A
ED03 ADD A,A
ED04 LD L,A
ED05 LD A,($5BDB)
ED08 LD H,A
ED09 SUB $30
ED0B JR NC,$ED0F
ED0D LD A,$04
ED0F LD B,A
ED10 LD C,L
ED11 CALL $F21B Select grenade table $F81E
ED14 RET Z
ED15 LD A,$FF -1 more grenades
ED17 JP $6430 => We've got A more grenades
ED1A OR $C0
ED1C LD ($FD95),A
ED1F LD HL,$5BDA Player's object record address
ED22 LD A,($5BE6)
ED25 LD B,A
ED26 CALL $ED31 Look up entry in table at $EC81
ED29 CALL $F20C Scan player-bullet table at $F82D, entry stride 5
ED2C LD A,$06 Play shot sound $06
ED2E JP $642D => Trigger sound effect A (copy its parameter into slot A)
ED31: Look up entry in table at $EC81
Used by the routines at EC1B and ECC1.
Input
HL Player object record
B Direction index
Output
HL Spawn position
BC Projectile size
Works out where a shot starts and how big it is, offsetting the firer's position by an amount looked up for the direction.
ED31 LD A,(HL) Row index * 4 into E
ED32 ADD A,A
ED33 ADD A,A
ED34 LD E,A
ED35 INC HL
ED36 LD D,(HL)
ED37 INC HL
ED38 LD A,(HL)
ED39 ADD A,E
ED3A LD E,A
ED3B LD HL,$EC81
ED3E LD A,B Column doubled
ED3F ADD A,A
ED40 ADD A,A Doubled again
ED41 LD C,A
ED42 LD B,$00
ED44 ADD HL,BC Add row+column to get table entry offset
ED45 LD A,(HL)
ED46 ADD A,E
ED47 LD E,A
ED48 INC HL
ED49 LD A,(HL)
ED4A ADD A,D
ED4B LD D,A
ED4C INC HL
ED4D LD C,(HL) Read projectile size (C, B)
ED4E INC HL
ED4F LD B,(HL)
ED50 EX DE,HL
ED51 RET
ED52: Rebuild active-object list at $F900 from $FF00 buffer
Used by the routine at E109.
Rebuilds the sprite display list at $F900 each frame by walking the $FF00 linked buffer of live objects. For each object it looks up an attribute-table entry by type and writes a scaled position plus draw data into the list. The active Jeep is appended at the end, then the whole list is checksummed.
ED52 LD (IY+$17),$FF
ED56 LD HL,$FF00
ED59 LD DE,$F900
This entry point is used by the routines at EDD6, EE24 and EF37.
ED5C LD A,L Align the link pointer to its page
ED5D AND $F8
ED5F LD L,A
ED60 CP (IY+$08) Reached the end of the list?
ED63 JR Z,$ED8E
ED65 LD L,(HL) Follow the buffer link
ED66 INC L
ED67 INC L
ED68 LD A,(HL) Read the record type
ED69 AND $3F
ED6B CP $27
ED6D JR NC,$ED5C
ED6F ADD A,A Turn the type into a table index
ED70 ADD A,$16
ED72 LD C,A
ED73 LD B,$E1
ED75 INC L
ED76 LD A,(HL) Scale the Y into the entry
ED77 AND $1F
ED79 ADD A,A
ED7A ADD A,A
ED7B LD (DE),A
ED7C LD A,(BC) Visible object?
ED7D BIT 7,A
ED7F JR NZ,$EDB9
ED81 INC E Copy the fields into the list
ED82 LD (DE),A
ED83 INC E
ED84 INC C
ED85 INC L
ED86 LD A,(HL)
ED87 LD (DE),A
ED88 INC E
ED89 LD A,(BC)
ED8A LD (DE),A
ED8B INC E
ED8C JR $ED5C
ED8E LD A,($FDCB) At the end: append the Jeep if active
ED91 INC A
ED92 JR Z,$EDA8
ED94 DEC A
ED95 ADD A,A
ED96 ADD A,A
ED97 LD (DE),A
ED98 EX DE,HL
ED99 INC L Fill in the Jeep entry
ED9A LD (HL),$10
ED9C INC L
ED9D LD A,($FDCC)
EDA0 SUB $06
EDA2 LD (HL),A
EDA3 INC L
EDA4 LD (HL),$04
EDA6 INC L
EDA7 EX DE,HL
EDA8 LD A,$80 Terminate the list
EDAA LD (DE),A
EDAB XOR A
EDAC EX AF,AF'
EDAD XOR A
EDAE CALL $6424 XOR AF and AF' with every byte in $F900-F9FF
EDB1 LD ($FDF4),A
EDB4 EX AF,AF'
EDB5 LD ($FDF5),A
EDB8 RET
EDB9 AND $7F Hidden object: jump to its handler
EDBB EXX
EDBC ADD A,A
EDBD LD H,$E1
EDBF ADD A,$64
EDC1 LD L,A
EDC2 LD E,(HL)
EDC3 INC L
EDC4 LD D,(HL)
EDC5 PUSH DE
EDC6 EXX
EDC7 RET
EDC8: Populate object record fields from A/B and a source byte
Used by the routines at EDD6, EE24 and EF37.
Input
DE Destination record pointer
HL Source record pointer
A Value stored at +$01
B Value stored at +$03
Writes into the destination record at DE: frame A at +$01, the source byte from HL+1 at +$02, count B at +$03, and $80 (active flag) at +$04, then restores DE.
EDC8 EX DE,HL
EDC9 INC L
EDCA LD (HL),A Store A at record +$01
EDCB INC L
EDCC INC E
EDCD LD A,(DE) Copy source byte into +$02
EDCE LD (HL),A
EDCF INC L
EDD0 LD (HL),B Store B at +$03
EDD1 INC L
EDD2 LD (HL),$80 Set +$04 = $80 (active flag)
EDD4 EX DE,HL
EDD5 RET
EDD6: Init object timer field via $EDC8
Input
HL Object record pointer
IY System-variable base ($FD80)
Sets the record up, then counts a timer down and, when it lapses, reloads it randomly and triggers a spawn suited to the object's type.
EDD6 LD C,(HL) Read record, set up type $1C, count $2D
EDD7 LD A,$1C
EDD9 LD B,$2D
EDDB CALL $EDC8 Populate object record fields from A/B and a source byte
EDDE INC L
EDDF CP $20 Check range, branch by type value
EDE1 JR NC,$EE0E
EDE3 CP $06
EDE5 JR NC,$EDEB
EDE7 LD (HL),$08 Reset timer to $08
EDE9 JR $EE0E
EDEB DEC (HL) Count down timer field
EDEC JR NZ,$EE0E
EDEE CALL $DC83 Get random byte
EDF1 AND $0F Reload timer with random $14-$23
EDF3 ADD A,$14
EDF5 LD (HL),A
EDF6 PUSH HL
EDF7 PUSH DE
EDF8 LD (IY+$16),$AA Raise effect flag (IY+$16)=$AA
EDFC LD A,C
EDFD OR A
EDFE JR Z,$EE09
EE00 CP $18
EE02 JR C,$EE0C
EE04 CALL $E3AB Fire type-specific spawn action
EE07 JR $EE0C
EE09 CALL $E3B5
EE0C POP DE
EE0D POP HL
This entry point is used by the routines at EE15 and EE24.
EE0E JP $ED5C
EE11: Read the scroll value from the record and store it
Reads the scroll value out of the record and stores it as the current position.
EE11 INC L
EE12 LD A,(HL)
EE13 JR $EE1F
EE15: Seed the scroll position from the record when it is unset
Nudges the scroll position on, seeding it from the record when it has not been set yet.
EE15 LD A,($FD97)
EE18 INC A
EE19 JR NZ,$EE22
EE1B INC L
EE1C LD A,(HL)
EE1D ADD A,$26
This entry point is used by the routine at EE11.
EE1F LD ($FD97),A
EE22 JR $EE0E
EE24: Advance the record fields and stamp the object onto the map
Steps an object record on to its next state: nudges the position fields, sets the type and flag bits, then writes the object into the collision map so it blocks movement at its new place.
EE24 LD A,(DE) Step the position field on
EE25 ADD A,$04
EE27 LD (DE),A
EE28 LD A,(DE) Set the type and flag bits
EE29 OR $82
EE2B LD (DE),A
EE2C EX DE,HL
EE2D INC L Store the clip bound
EE2E LD (HL),$04
EE30 INC L
EE31 INC E Take the paired coordinate
EE32 LD A,(DE)
EE33 SUB $04
EE35 LD (HL),A Store it back one step lower
EE36 INC L
EE37 LD (HL),$02 Mark the record live
EE39 INC L
EE3A EX DE,HL
EE3B JR $EE0E
EE3D LD A,(HL) Take the frame from the record's low bits
EE3E AND $1F
EE40 LD C,A
EE41 LD A,$1C Set up the sprite frame and count
EE43 LD B,$12
EE45 CALL $EDC8 Populate object record fields from A/B and a source byte
EE48 INC L
EE49 SUB $12 Wrap the counter when it underflows
EE4B JR NC,$EE51
EE4D LD (HL),$00
EE4F JR $EE0E
This entry point is used by the routine at EF37.
EE51 ADD A,$04
EE53 CP $4E
EE55 JR NC,$EE4F
EE57 LD B,A
EE58 LD A,(HL)
EE59 AND $1F
EE5B JR NZ,$EE64
EE5D CALL $DC83 Get random byte
EE60 AND $1F
EE62 ADD A,$1E
EE64 LD (HL),A
EE65 DEC (HL)
EE66 JR NZ,$EE4F
EE68 CALL $DC83 Get random byte
EE6B AND $C0
EE6D ADD A,$3C
EE6F LD (HL),A
EE70 PUSH HL
EE71 PUSH DE
EE72 LD H,B
EE73 LD L,C
EE74 LD BC,$080B
EE77 INC L
EE78 BIT 7,L
EE7A RES 7,L
EE7C JR Z,$EE80
EE7E LD B,$06
EE80 CALL $E44D
EE83 JR Z,$EE90
EE85 CALL $DC83 Get random byte
EE88 AND $03
EE8A JR NZ,$EE90
EE8C SET 7,(IX+$0B)
EE90 POP DE
EE91 POP HL
EE92 JR $EE4F
EE94 LD A,(HL)
EE95 AND $1F
EE97 LD C,A
EE98 LD A,$18
EE9A LD B,$14
EE9C CALL $EDC8 Populate object record fields from A/B and a source byte
EE9F INC L
EEA0 SUB $12
EEA2 JR NC,$EEA9
EEA4 LD (HL),$00
EEA6 JP $ED5C
EEA9 ADD A,$04
EEAB CP $4E
EEAD JR NC,$EEA6
EEAF LD B,A
EEB0 LD A,(HL)
EEB1 OR A
EEB2 JR NZ,$EEC1
EEB4 LD A,B
EEB5 CP $08
EEB7 JR C,$EEA6
EEB9 CALL $DC83 Get random byte
EEBC AND $80
EEBE ADD A,$28
EEC0 LD (HL),A
EEC1 DEC (HL)
EEC2 JR NZ,$EEA6
EEC4 CALL $DC83 Get random byte
EEC7 AND $3F Fold to a value 0-63, offset by $0C
EEC9 ADD A,$0C
EECB BIT 4,(IY+$15) Draw-mode flag picks the branch
EECF JR Z,$EEDD
EED1 LD A,($FDFA) Too many enemies already? bail out
EED4 CP $14
EED6 JR NC,$EEA6
EED8 INC (IY+$7A) Otherwise bump the spawn counter
EEDB JR $EEDF Skip the alternate offset
EEDD ADD A,$AF Alternate offset, store the byte
EEDF LD (HL),A
EEE0 PUSH HL Save the position pair
EEE1 PUSH DE
EEE2 LD H,B Move the pending record base into HL, size $040B
EEE3 LD L,C
EEE4 LD BC,$040B
EEE7 LD A,L Odd column? widen the box and back off
EEE8 INC L
EEE9 INC L
EEEA OR A
EEEB JR Z,$EEF0 Even: widen it, back off
EEED DEC L
EEEE LD B,$0C
EEF0 CALL $E44D Claim a slot
EEF3 POP DE Restore state, continue the loop
EEF4 POP HL
EEF5 JR $EEA6
EEF6 XOR A
EEF7 LD C,(HL) Take the frame from the record's low bits
EEF8 LD A,(DE) Set the type and flag bits
EEF9 OR $82
EEFB LD (DE),A
EEFC EX DE,HL Store the clip bound $10
EEFD INC L
EEFE LD (HL),$10
EF00 INC L Take the paired coordinate
EF01 INC E
EF02 LD A,(DE) Store it back one step lower
EF03 SUB $04
EF05 LD (HL),A
EF06 INC L Mark the record live
EF07 LD (HL),$02
EF09 INC L Wrap the counter when it underflows
EF0A EX DE,HL
EF0B SUB $02 Underflowed: clear the byte, continue
EF0D JR NC,$EF15
EF0F INC L
EF10 LD (HL),$00
EF12 JP $ED5C
EF15 ADD A,$01 Otherwise add one, save as the new height
EF17 LD B,A
EF18 INC HL Skip an occupied buffer slot
EF19 LD A,(HL)
EF1A INC A
EF1B JR Z,$EF12
EF1D LD (HL),$FF Claim it
EF1F PUSH HL Save the position pair
EF20 PUSH DE
EF21 LD H,B Move the base into HL, size $080A
EF22 LD L,C
EF23 LD BC,$080A
EF26 CALL $E44D Failed? adjust the offset and set height $05
EF29 JR Z,$EF33
EF2B LD A,L
EF2C LD (HL),$00
EF2E SUB $09
EF30 LD L,A
EF31 LD (HL),$05
EF33 POP DE Restore state, loop back
EF34 POP HL
EF35 JR $EF12
EF36 IN A,($03)
EF37: Init object record via $EDC8, entry size $0E
EF37 INC BC
EF38 LD A,(BC)
EF39 EXX
EF3A LD B,A
EF3B EXX
EF3C LD C,(HL)
EF3D LD A,$0C
EF3F LD B,$09
EF41 CALL $EDC8
EF44 SUB $0E
EF46 JR NC,$EF4E
EF48 INC L
EF49 LD (HL),$00
EF4B JP $ED5C
EF4E DEC A
EF4F LD B,A
EF50 INC L
EF51 LD A,(HL)
EF52 INC A
EF53 JR Z,$EF4B
EF55 LD (HL),$FF
EF57 EXX
EF58 INC B
EF59 EXX
EF5A JR NZ,$EF66
EF5C INC (IY+$61)
EF5F BIT 0,(IY+$61)
EF63 JR Z,$EF4B
EF65 INC B
EF66 PUSH HL
EF67 PUSH DE
EF68 LD H,B
EF69 LD L,C
EF6A LD BC,$0806
EF6D CALL $E44D
EF70 JR Z,$EF78
EF72 LD A,L
EF73 SUB $09
EF75 LD L,A
EF76 LD (HL),$08
EF78 POP DE
EF79 POP HL
EF7A JR $EF4B
EF7C LD A,(HL)
EF7D CP $0B
EF7F JR NZ,$EF4B
EF81 LD B,$24
EF83 XOR A
EF84 LD (DE),A
EF85 LD A,$38
EF87 CALL $EDC8
EF8A DEC L
EF8B LD A,$4A
EF8D LD (DE),A
EF8E LD A,$38
EF90 CALL $EDC8
EF93 BIT 4,(IY+$15)
EF97 JP NZ,$ED5C
EF9A SUB $0C
EF9C LD B,A
EF9D LD C,$33
EF9F ADD A,$18
EFA1 JR $EFDD
EFA3 LD A,(DE)
EFA4 LD C,A
EFA5 LD A,$06
EFA7 LD B,$26
EFA9 CALL $EDC8
EFAC DEC L
EFAD LD A,C
EFAE ADD A,$1A
EFB0 LD (DE),A
EFB1 LD B,$26
EFB3 LD A,$06
EFB5 CALL $EDC8
EFB8 EX DE,HL
EFB9 LD (HL),$82
EFBB INC L
EFBC LD (HL),C
EFBD INC L
EFBE LD A,(DE)
EFBF SUB $05
EFC1 LD B,A
EFC2 LD (HL),B
EFC3 INC L
EFC4 LD (HL),$1D
EFC6 INC L
EFC7 LD A,C
EFC8 ADD A,$20
EFCA OR $82
EFCC LD (HL),A
EFCD INC L
EFCE NEG
EFD0 ADD A,$80
EFD2 LD (HL),A
EFD3 INC L
EFD4 LD (HL),B
EFD5 INC L
EFD6 LD (HL),$1D
EFD8 INC L
EFD9 LD (HL),$80
EFDB EX DE,HL
EFDC LD A,B
EFDD INC L
EFDE CP $4B
EFE0 JP NC,$ED5C
EFE3 CP $15
EFE5 JR NC,$EFEF
EFE7 LD (HL),$01
EFE9 INC L
EFEA LD (HL),$00
EFEC JP $ED5C
EFEF DEC (HL)
EFF0 JP NZ,$ED5C
EFF3 LD (HL),$0C
EFF5 CALL $DC83
EFF8 AND $07
EFFA ADD A,B
EFFB SUB $30
EFFD EX AF,AF'
EFFE INC L
EFFF LD A,(HL)
F000 ADD A,$10
F002 LD (HL),A
F003 LD A,($FDE5)
F006 ADD A,$05
F008 RLCA
F009 RLCA
F00A RLCA
F00B CP (HL)
F00C JP C,$ED5C
F00F LD A,(HL)
F010 AND $30
F012 XOR $30
F014 PUSH HL
F015 PUSH DE
F016 LD E,$00
F018 LD A,C
F019 LD BC,$0C07
F01C JR NZ,$F021
F01E INC C
F01F LD E,$12
F021 LD L,$1F
F023 ADD A,$0D
F025 EX AF,AF'
F026 LD H,A
F027 JR NC,$F030
F029 EX AF,AF'
F02A BIT 6,A
F02C JR NZ,$F03B
F02E JR $F035
F030 EX AF,AF'
F031 BIT 6,A
F033 JR Z,$F03B
F035 NEG
F037 ADD A,$80
F039 JR $F03F
F03B LD B,$04
F03D LD L,$FE
F03F SUB E
F040 PUSH AF
F041 CALL $E44D
F044 POP DE
F045 CALL $DC83
F048 AND $07
F04A ADD A,D
F04B LD (IX+$11),A
F04E POP DE
F04F POP HL
F050 JR $F076
F052 EX DE,HL
F053 LD A,(HL)
F054 LD C,A
F055 CP $40
F057 JR C,$F05B
F059 SUB $04
F05B OR $84
F05D LD (HL),A
F05E INC L
F05F LD (HL),$1C
F061 INC L
F062 INC E
F063 LD A,(DE)
F064 LD B,A
F065 LD (HL),A
F066 INC L
F067 LD (HL),$0E
F069 INC L
F06A EX DE,HL
F06B INC L
F06C CP $70
F06E JR NC,$F076
F070 CP $14
F072 JR NC,$F09E
F074 LD (HL),$1C
F076 PUSH BC
F077 EXX
F078 POP DE
F079 LD A,D
F07A SUB $08
F07C LD D,A
F07D LD A,E
F07E ADD A,$0D
F080 LD E,A
F081 LD HL,$F8EA
F084 LD B,$10
F086 CALL $E77D
F089 EXX
F08A JP Z,$ED5C
F08D DEC L
F08E DEC L
F08F SET 7,(HL)
F091 PUSH HL
F092 PUSH DE
F093 LD BC,$0304
F096 CALL $6415
F099 POP DE
F09A POP HL
F09B JP $ED5C
F09E EX AF,AF'
F09F LD A,(HL)
F0A0 CP $19
F0A2 JR C,$F0A6
F0A4 LD (HL),$17
F0A6 EX AF,AF'
F0A7 DEC (HL)
F0A8 JR NZ,$F076
F0AA LD (HL),$17
F0AC SUB $10
F0AE PUSH DE
F0AF PUSH HL
F0B0 PUSH BC
F0B1 LD D,A
F0B2 CP $48
F0B4 LD E,$03
F0B6 JR C,$F0BA
F0B8 LD E,$08
F0BA LD A,($5BDE)
F0BD CP E
F0BE JR C,$F0E2
F0C0 ADD A,E
F0C1 CP $1E
F0C3 JR NC,$F0E2
F0C5 LD A,C
F0C6 BIT 6,A
F0C8 JR NZ,$F0CC
F0CA ADD A,$0A
F0CC ADD A,$04
F0CE LD E,A
F0CF LD C,$80
F0D1 CALL $F1BB
F0D4 JR Z,$F0E2
F0D6 SET 1,(IX+$00)
F0DA LD (IX+$07),$A8
F0DE LD (IX+$06),$05
F0E2 POP BC
F0E3 POP HL
F0E4 POP DE
F0E5 JR $F076
F0E7 EX DE,HL
F0E8 LD BC,$180C
F0EB LD (HL),$84
F0ED INC L
F0EE LD (HL),B
F0EF INC L
F0F0 INC E
F0F1 LD A,(DE)
F0F2 ADD A,$01
F0F4 LD (HL),A
F0F5 INC L
F0F6 LD (HL),C
F0F7 INC L
F0F8 LD (HL),$00
F0FA INC L
F0FB LD (HL),$0F
F0FD INC L
F0FE ADD A,$01
F100 LD (HL),A
F101 INC L
F102 LD (HL),$20
F104 INC L
F105 EX DE,HL
F106 INC L
F107 LD C,$81
F109 SUB $16
F10B JP C,$EE4C
F10E JP $EE51
F111 JP $F076
F114 EX DE,HL
F115 LD A,(HL)
F116 LD (HL),$81
F118 INC L
F119 LD (HL),A
F11A INC E
F11B INC L
F11C LD A,(DE)
F11D LD (HL),A
F11E INC L
F11F DEC E
F120 LD (HL),E
F121 INC L
F122 EX DE,HL
F123 JP $ED5C
F126 EX DE,HL
F127 LD B,(HL)
F128 LD (HL),$81
F12A INC L
F12B LD (HL),B
F12C INC E
F12D INC L
F12E LD A,(DE)
F12F LD C,A
F130 LD (HL),A
F131 INC L
F132 DEC E
F133 LD (HL),E
F134 INC L
F135 LD (HL),$81
F137 INC L
F138 LD A,B
F139 ADD A,$08
F13B LD (HL),A
F13C INC L
F13D LD A,C
F13E SUB $08
F140 JR NC,$F144
F142 LD A,$04
F144 LD (HL),A
F145 INC L
F146 LD (HL),E
F147 INC L
F148 EX DE,HL
F149 JP $ED5C
F14C LD C,(HL)
F14D INC L
F14E LD A,(HL)
F14F INC L
F150 CP $06
F152 JR Z,$F15A
F154 JR NC,$F149
F156 LD (HL),$00
F158 JR $F149
F15A LD A,(HL)
F15B INC A
F15C JR Z,$F149
F15E LD (HL),$FF
F160 PUSH DE
F161 PUSH HL
F162 LD H,$FD
F164 LD L,C
F165 LD BC,$080D
F168 LD A,$80
F16A LD (DE),A
F16B CALL $E44D
F16E JR Z,$F17C
F170 LD (IX+$06),$00
F174 LD (IX+$0F),$14
F178 LD (IX+$11),$01
F17C POP HL
F17D POP DE
F17E JR $F149
F180 LD (IX+$11),$01
F184 LD A,(IX+$04)
F187 ADD A,A
F188 ADD A,A
F189 LD E,A
F18A LD A,(IX+$05)
F18D LD D,A
F18E CP $34
F190 JR C,$F199
F192 RLA
F193 JR C,$F199
F195 LD (IX+$12),$01
F199 LD D,A
F19A DEC (IX+$0F)
F19D JP NZ,$E9B9
F1A0 LD (IX+$0F),$14
F1A4 LD A,E
F1A5 CP $40
F1A7 JR NC,$F1AB
F1A9 ADD A,$08
F1AB SUB $04
F1AD LD E,A
F1AE INC D
F1AF LD C,$80
F1B1 PUSH IX
F1B3 CALL $F1BB
F1B6 POP IX
F1B8 JP $E9B9
This entry point is used by the routines at E794 and EA8E.
F1BB LD A,E
F1BC CP $78
F1BE JR NC,$F1DB
F1C0 LD A,D
F1C1 CP $60
F1C3 JR NC,$F1DB
F1C5 CP $04
F1C7 JR C,$F1DB
F1C9 LD A,($5BDF)
F1CC ADD A,$05
F1CE LD B,A
F1CF LD A,($FDE3)
F1D2 ADD A,$03
F1D4 OR C
F1D5 LD C,A
F1D6 EX DE,HL
F1D7 XOR A
F1D8 JP $F20F
F1DB XOR A
F1DC RET
F1DD LD A,(BC)
F1DE JR NC,$F233
F1E0 LD A,($FDD3)
F1E3 LD C,A
F1E4 ADD A,A
F1E5 ADD A,A
F1E6 ADD A,(IY+$55)
F1E9 SUB E
F1EA JR NC,$F233
F1EC ADD A,$07
F1EE JR NC,$F1FB
F1F0 BIT 4,B
F1F2 JR NZ,$F233
F1F4 SET 4,(IY+$5A)
F1F8 LD L,C
F1F9 JR $F20F
F1FB ADD A,$0B
F1FD JR C,$F233
F1FF ADD A,$C3
F201 OR $F4
This entry point is used by the routine at DEEF.
F203 JP $F381
This entry point is used by the routine at DEEF.
F206 JP $F707
This entry point is used by the routine at DEEF.
F209 JP $F26E
This entry point is used by the routine at ECC1.
F20C JP $F24A
F20F JP $F4E9
This entry point is used by the routine at DEEF.
F212 JP $F36D
F215 JP $F582
F218 JP $F5A0
This entry point is used by the routine at ECC1.
F21B JP $F4E3
This entry point is used by the routine at E5DB.
F21E JP $F34F
This entry point is used by the routine at DCDF.
F221 JP $F224
F224 LD HL,$F73C
F227 CALL $F237
F22A CALL $F237
F22D CALL $F237
F230 CALL $F23B
F233 LD B,$14
F235 JR $F23D
F237 LD B,$0E
F239 JR $F23D
F23B LD B,$05
F23D PUSH BC
F23E LD (HL),$00
F240 INC HL
F241 DJNZ $F23E
F243 POP BC
F244 LD A,(HL)
F245 INC A
F246 JR NZ,$F23D
F248 INC HL
F249 RET
F24A LD IX,$F82D
F24E LD DE,$0005
F251 LD A,(IX+$00)
F254 INC A
F255 RET Z
F256 DEC A
F257 JR Z,$F25D
F259 ADD IX,DE
F25B JR $F251
F25D LD (IX+$01),L
F260 LD (IX+$02),H
F263 LD (IX+$03),C
F266 LD (IX+$04),B
F269 LD (IX+$00),$0E
F26D RET
F26E LD IX,$F82D
F272 LD HL,$F8ED
F275 LD (HL),$90
F277 LD ($FDBD),HL
F27A LD A,(IX+$00)
F27D INC A
F27E RET Z
F27F DEC A
F280 JR NZ,$F289
F282 LD DE,$0005
F285 ADD IX,DE
F287 JR $F27A
F289 LD L,(IX+$01)
F28C LD H,(IX+$02)
F28F CALL $F5BF
F292 LD A,(IX+$03)
F295 ADD A,L
F296 LD (IX+$01),A
F299 LD L,A
F29A RLA
F29B JP C,$F33D
F29E LD A,(IX+$04)
F2A1 ADD A,H
F2A2 BIT 5,(IY+$15)
F2A6 JR Z,$F2A9
F2A8 INC A
F2A9 LD (IX+$02),A
F2AC LD H,A
F2AD CP $60
F2AF JP NC,$F33D
F2B2 CP $05
F2B4 JP C,$F33D
F2B7 DEC (IX+$00)
F2BA JP Z,$F348
F2BD EX DE,HL
F2BE LD HL,($FDBD)
F2C1 LD (HL),D
F2C2 INC L
F2C3 LD (HL),E
F2C4 INC L
F2C5 LD (HL),$90
F2C7 LD ($FDBD),HL
F2CA LD A,($FDDA)
F2CD LD B,A
F2CE BIT 7,A
F2D0 JR Z,$F32F
F2D2 LD A,($FDD4)
F2D5 SUB D
F2D6 JR NC,$F32F
F2D8 ADD A,$0A
F2DA JR NC,$F32F
F2DC LD A,($FDD3)
F2DF LD C,A
F2E0 ADD A,A
F2E1 ADD A,A
F2E2 ADD A,(IY+$55)
F2E5 SUB E
F2E6 JR NC,$F32F
F2E8 ADD A,$07
F2EA JR NC,$F2F7
F2EC BIT 4,B
F2EE JR NZ,$F32F
F2F0 SET 4,(IY+$5A)
F2F4 LD L,C
F2F5 JR $F30B
F2F7 ADD A,$0B
F2F9 JR C,$F32F
F2FB ADD A,$07
F2FD JR NC,$F32F
F2FF BIT 1,B
F301 JR NZ,$F32F
F303 SET 1,(IY+$5A)
F307 LD A,C
F308 ADD A,$04
F30A LD L,A
F30B LD H,(IY+$54)
F30E PUSH DE
F30F LD BC,$1302
F312 PUSH IX
F314 CALL $E10F
F317 JR Z,$F321
F319 LD (IX+$11),$12
F31D SET 6,(IX+$0B)
F321 LD A,$05
F323 CALL $642D
F326 LD BC,$0104
F329 CALL $6415
F32C POP IX
F32E POP DE
F32F EX DE,HL
F330 INC L
F331 CALL $DC86
F334 DEC L
F335 JR C,$F344
F337 CALL $F5C6
F33A JP $F282
F33D LD (IX+$00),$00
F341 JP $F282
F344 LD (IX+$00),$00
F348 EX DE,HL
F349 CALL $F6C2
F34C JP $F282
F34F LD A,H
F350 LD L,$00
F352 ADD A,$02
F354 LD C,A
F355 LD H,A
F356 JP P,$F35D
F359 DEC L
F35A SCF
F35B JR $F35E
F35D XOR A
F35E RR H
F360 RR L
F362 RR H
F364 RR L
F366 RR H
F368 RR L
F36A ADD HL,DE
F36B LD A,H
F36C RET
F36D CALL $F37B
F370 LD IX,$F81E
F374 LD A,$90
F376 LD ($F8EA),A
F379 JR $F385
F37B LD IX,$F7C9
F37F JR $F385
F381 LD IX,$F73C
F385 LD C,(IX+$00)
F388 INC C
F389 RET Z
F38A DEC C
F38B JP Z,$F4DB
F38E LD D,(IX+$03)
F391 LD E,(IX+$02)
F394 PUSH DE
F395 SRL D
F397 SRL E
F399 BIT 3,(IX+$00)
F39D JR Z,$F3A4
F39F CALL $F68A
F3A2 JR $F3A7
F3A4 CALL $F5A0
F3A7 LD A,(IX+$00)
F3AA BIT 3,A
F3AC JR Z,$F3CE
F3AE AND $03
F3B0 JR NZ,$F3CE
F3B2 LD D,(IX+$0A)
F3B5 LD E,(IX+$09)
F3B8 LD H,(IX+$08)
F3BB CALL $F34F
F3BE RLA
F3BF JR C,$F3C5
F3C1 POP DE
F3C2 JP $F481
F3C5 LD (IX+$0A),H
F3C8 LD (IX+$09),L
F3CB LD (IX+$08),C
F3CE LD A,(IX+$01)
F3D1 LD B,(IX+$06)
F3D4 LD C,(IX+$00)
F3D7 LD E,(IX+$04)
F3DA LD D,(IX+$05)
F3DD LD HL,$0000
F3E0 BIT 5,C
F3E2 RES 5,C
F3E4 JR NZ,$F3E9
F3E6 SUB D
F3E7 JR NC,$F3F3
F3E9 INC H
F3EA ADD A,E
F3EB JR C,$F3F3
F3ED DJNZ $F3E9
F3EF SET 5,C
F3F1 JR $F3F6
F3F3 INC L
F3F4 DJNZ $F3E6
F3F6 LD (IX+$01),A
F3F9 LD (IX+$00),C
F3FC POP DE
F3FD LD A,H
F3FE RL C
F400 JR C,$F404
F402 NEG
F404 ADD A,D
F405 BIT 5,(IY+$15)
F409 JR Z,$F40D
F40B INC A
F40C INC A
F40D CP $C0
F40F JR C,$F41C
F411 LD A,(IX+$00)
F414 AND $0C
F416 JP Z,$F4D7
F419 JP $F481
F41C CP $09
F41E JP C,$F411
F421 LD (IX+$03),A
F424 LD D,A
F425 LD A,L
F426 RL C
F428 JR C,$F430
F42A LD A,E
F42B SUB L
F42C JR C,$F411
F42E JR $F433
F430 ADD A,E
F431 JR C,$F411
F433 LD E,A
F434 LD (IX+$02),A
F437 JR C,$F411
F439 SRL D
F43B SRL E
F43D PUSH DE
F43E BIT 3,(IX+$00)
F442 JR Z,$F453
F444 LD H,$01
F446 CALL $F5DD
F449 POP DE
F44A LD A,(IX+$00)
F44D AND $03
F44F JR NZ,$F457
F451 JR $F470
F453 CALL $F582
F456 POP DE
F457 LD A,($FDE3)
F45A INC A
F45B SUB E
F45C JR NC,$F470
F45E ADD A,$06
F460 JR NC,$F470
F462 LD A,($FDE4)
F465 SUB D
F466 JR NC,$F470
F468 ADD A,$05
F46A JR NC,$F470
F46C SET 0,(IY+$62)
F470 LD A,(IX+$07)
F473 SUB (IX+$06)
F476 LD (IX+$07),A
F479 JR NC,$F4DB
F47B LD D,(IX+$03)
F47E LD E,(IX+$02)
F481 SRL D
F483 SRL E
F485 LD A,(IX+$00)
F488 AND $0C
F48A JR Z,$F4D4
F48C LD HL,$F8EA
F48F LD A,D
F490 ADD A,$0F
F492 LD (HL),A
F493 INC L
F494 LD A,E
F495 ADD A,$0F
F497 LD (HL),A
F498 LD A,($FDE4)
F49B SUB $06
F49D SUB D
F49E JR NC,$F4BA
F4A0 ADD A,$14
F4A2 JR NC,$F4BA
F4A4 LD A,($FDE3)
F4A7 SUB E
F4A8 JP C,$F4B1
F4AB SUB $06
F4AD JR NC,$F4BA
F4AF JR $F4B6
F4B1 ADD A,$07
F4B3 JP NC,$F4BA
F4B6 SET 0,(IY+$62)
F4BA LD H,$00
F4BC CALL $F5DD
F4BF LD A,($F8D3)
F4C2 LD L,A
F4C3 LD A,($F8D4)
F4C6 LD H,A
F4C7 LD A,($F8D5)
F4CA CALL $642A
F4CD LD A,$04
F4CF CALL $642D
F4D2 JR $F4D7
F4D4 CALL $F6C2
F4D7 XOR A
F4D8 LD (IX+$00),A
F4DB LD DE,$000E
F4DE ADD IX,DE
F4E0 JP $F385
F4E3 LD IX,$F81E
F4E7 JR $F4ED
F4E9 LD IX,$F7C9
F4ED SET 7,B
F4EF ADD A,A
F4F0 JR NC,$F4F4
F4F2 OR $80
F4F4 JR $F4FA
F4F6 LD IX,$F73C
F4FA SLA H
F4FC SLA L
F4FE EX AF,AF'
F4FF LD DE,$000E
F502 LD A,(IX+$00)
F505 INC A
F506 RET Z
F507 DEC A
F508 JR Z,$F50E
F50A ADD IX,DE
F50C JR $F502
F50E LD A,B
F50F RLA
F510 LD B,$90
F512 JR NC,$F516
F514 SET 3,B
F516 SUB H
F517 JR NC,$F51D
F519 RES 7,B
F51B NEG
F51D LD D,A
F51E SLA C
F520 LD A,C
F521 JR NC,$F525
F523 SET 2,B
F525 SUB L
F526 JR NC,$F52C
F528 NEG
F52A JR $F52E
F52C SET 6,B
F52E LD E,A
F52F CP D
F530 JR C,$F535
F532 LD C,E
F533 JR $F536
F535 LD C,D
F536 LD (IX+$00),B
F539 LD A,E
F53A SRL A
F53C LD (IX+$01),A
F53F LD (IX+$02),L
F542 LD (IX+$03),H
F545 LD (IX+$04),E
F548 LD (IX+$05),D
F54B EX AF,AF'
F54C BIT 7,A
F54E RES 7,A
F550 LD (IX+$06),A
F553 JR Z,$F557
F555 LD C,$50
F557 LD (IX+$07),C
F55A BIT 3,B
F55C JR Z,$F580
F55E LD D,$00
F560 LD (IX+$09),D
F563 LD (IX+$0A),D
F566 LD A,C
F567 AND $E0
F569 BIT 4,C
F56B JR Z,$F56F
F56D ADD A,$20
F56F LD (IX+$07),A
F572 RRA
F573 RRA
F574 RRA
F575 RRA
F576 OR A
F577 RET Z
F578 RRA
F579 LD (IX+$06),A
F57C LD (IX+$08),$E0
F580 OR A
F581 RET
F582 CALL $F5CD
F585 RET NC
F586 EX DE,HL
F587 LD A,L
F588 PUSH AF
F589 CALL $98D9
F58C POP AF
F58D AND $03
F58F LD B,A
F590 LD A,$C0
F592 JR Z,$F598
F594 RRA
F595 RRA
F596 DJNZ $F594
F598 LD D,A
F599 OR (HL)
F59A LD (HL),A
F59B INC H
F59C LD A,D
F59D OR (HL)
F59E LD (HL),A
F59F RET
F5A0 CALL $F5CD
F5A3 RET NC
F5A4 EX DE,HL
F5A5 LD A,L
F5A6 PUSH AF
F5A7 CALL $98D9
F5AA POP AF
F5AB AND $03
F5AD LD B,A
F5AE OR A
F5AF LD A,$3F
F5B1 JR Z,$F5B7
F5B3 RRCA
F5B4 RRCA
F5B5 DJNZ $F5B3
F5B7 LD D,A
F5B8 AND (HL)
F5B9 LD (HL),A
F5BA LD A,D
F5BB INC H
F5BC AND (HL)
F5BD LD (HL),A
F5BE RET
F5BF PUSH HL
F5C0 EX DE,HL
F5C1 CALL $F5A0
F5C4 POP HL
F5C5 RET
F5C6 PUSH HL
F5C7 EX DE,HL
F5C8 CALL $F582
F5CB POP HL
F5CC RET
F5CD LD A,($FD97)
F5D0 SUB $0D
F5D2 RET C
F5D3 SUB D
F5D4 RET C
F5D5 SUB $1F
F5D7 JR NC,$F5DB
F5D9 XOR A
F5DA RET
F5DB SCF
F5DC RET
F5DD EX DE,HL
F5DE LD A,(IX+$0A)
F5E1 LD B,A
F5E2 ADD A,H
F5E3 LD C,A
F5E4 PUSH IX
F5E6 LD A,$20
F5E8 BIT 2,(IX+$00)
F5EC JR Z,$F5F0
F5EE SET 2,A
F5F0 LD ($F8DA),A
F5F3 LD A,L
F5F4 AND $03
F5F6 LD ($F8D5),A
F5F9 LD A,L
F5FA AND $FC
F5FC RRA
F5FD RRA
F5FE LD ($F8D3),A
F601 INC D
F602 DEC D
F603 LD A,B
F604 LD B,$12
F606 JR Z,$F623
F608 BIT 0,(IX+$00)
F60C JR Z,$F615
F60E LD A,(IX+$0C)
F611 ADD A,$1D
F613 JR $F624
F615 NEG
F617 LD B,$19
F619 CP $10
F61B JR C,$F623
F61D INC B
F61E CP $1A
F620 JR C,$F623
F622 INC B
F623 LD A,B
F624 LD ($F8D6),A
F627 LD IX,$F8CF
F62B LD (IX+$08),$04
F62F LD (IX+$09),$5F
F633 LD (IX+$0A),$05
F637 LD A,C
F638 SUB (IX+$01)
F63B JP P,$F661
F63E NEG
F640 SUB $05
F642 JR C,$F681
F644 PUSH AF
F645 LD A,($F8D0)
F648 SUB $04
F64A LD ($F8D4),A
F64D CALL $98D0
F650 POP AF
F651 INC A
F652 LD B,A
F653 LD A,($F8D4)
F656 SUB B
F657 LD C,A
F658 LD A,B
F659 CP $05
F65B JR C,$F640
F65D LD A,$05
F65F JR $F640
F661 SUB $05
F663 JR C,$F681
F665 PUSH AF
F666 LD A,($F8D0)
F669 ADD A,$04
F66B LD ($F8D4),A
F66E CALL $98D0
F671 POP AF
F672 INC A
F673 LD B,A
F674 ADD A,(IX+$05)
F677 LD C,A
F678 LD A,B
F679 CP $05
F67B JR C,$F661
F67D LD A,$05
F67F JR $F661
F681 LD (IX+$05),C
F684 CALL $98D0
F687 POP IX
F689 RET
F68A EX DE,HL
F68B LD A,(IX+$0A)
F68E LD C,A
F68F ADD A,H
F690 LD ($F8D0),A
F693 LD A,L
F694 AND $03
F696 LD ($F8D1),A
F699 LD A,L
F69A AND $FC
F69C RRA
F69D RRA
F69E LD ($F8CF),A
F6A1 BIT 0,(IX+$00)
F6A5 JR Z,$F6AE
F6A7 LD A,(IX+$0C)
F6AA ADD A,$1D
F6AC JR $F6BE
F6AE LD A,C
F6AF NEG
F6B1 LD C,$19
F6B3 CP $10
F6B5 JR C,$F6BD
F6B7 INC C
F6B8 CP $1A
F6BA JR C,$F6BD
F6BC INC C
F6BD LD A,C
F6BE LD ($F8D2),A
F6C1 RET
F6C2 LD HL,$F856
F6C5 LD A,(HL)
F6C6 INC A
F6C7 JR Z,$F704
F6C9 LD BC,$0011
F6CC ADD HL,BC
F6CD LD A,(HL)
F6CE OR A
F6CF JR Z,$F6D7
F6D1 LD BC,$0003
F6D4 ADD HL,BC
F6D5 JR $F6C5
F6D7 PUSH DE
F6D8 LD (HL),$07
F6DA XOR A
F6DB SBC HL,BC
F6DD LD A,E
F6DE SUB $03
F6E0 LD E,A
F6E1 AND $03
F6E3 LD B,A
F6E4 LD A,E
F6E5 AND $FC
F6E7 RRA
F6E8 RRA
F6E9 LD E,A
F6EA LD (HL),E
F6EB INC HL
F6EC LD A,D
F6ED SUB $04
F6EF LD (HL),A
F6F0 INC HL
F6F1 LD (HL),B
F6F2 INC HL
F6F3 LD (HL),$17
F6F5 INC HL
F6F6 LD (HL),E
F6F7 INC HL
F6F8 LD (HL),A
F6F9 INC HL
F6FA LD (HL),B
F6FB INC HL
F6FC LD (HL),$17
F6FE INC HL
F6FF INC HL
F700 INC HL
F701 LD (HL),$0A
F703 POP DE
F704 JP $F5A0
F707 LD IX,$F856
F70B LD A,(IX+$00)
F70E INC A
F70F RET Z
F710 LD A,(IX+$11)
F713 OR A
F714 JR NZ,$F71D
F716 LD DE,$0014
F719 ADD IX,DE
F71B JR $F70B
F71D DEC A
F71E LD (IX+$11),A
F721 JR NZ,$F727
F723 LD B,$12
F725 JR $F734
F727 DEC A
F728 SRL A
F72A JR C,$F716
F72C AND $01
F72E LD B,$18
F730 JR NZ,$F734
F732 LD B,$17
F734 LD (IX+$07),B
F737 CALL $DC8F
F73A JR $F716
F73C NOP
F73D NOP
F73E NOP
F73F NOP
F740 NOP
F741 NOP
F742 NOP
F743 NOP
F744 NOP
F745 NOP
F746 NOP
F747 NOP
F748 NOP
F749 NOP
F74A NOP
F74B NOP
F74C NOP
F74D NOP
F74E NOP
F74F NOP
F750 NOP
F751 NOP
F752 NOP
F753 NOP
F754 NOP
F755 NOP
F756 NOP
F757 NOP
F758 NOP
F759 NOP
F75A NOP
F75B NOP
F75C NOP
F75D NOP
F75E NOP
F75F NOP
F760 NOP
F761 NOP
F762 NOP
F763 NOP
F764 NOP
F765 NOP
F766 NOP
F767 NOP
F768 NOP
F769 NOP
F76A NOP
F76B NOP
F76C NOP
F76D NOP
F76E NOP
F76F NOP
F770 NOP
F771 NOP
F772 NOP
F773 NOP
F774 NOP
F775 NOP
F776 NOP
F777 NOP
F778 NOP
F779 NOP
F77A NOP
F77B NOP
F77C NOP
F77D NOP
F77E NOP
F77F NOP
F780 NOP
F781 NOP
F782 NOP
F783 NOP
F784 NOP
F785 NOP
F786 NOP
F787 NOP
F788 NOP
F789 NOP
F78A NOP
F78B NOP
F78C NOP
F78D NOP
F78E NOP
F78F NOP
F790 NOP
F791 NOP
F792 NOP
F793 NOP
F794 NOP
F795 NOP
F796 NOP
F797 NOP
F798 NOP
F799 NOP
F79A NOP
F79B NOP
F79C NOP
F79D NOP
F79E NOP
F79F NOP
F7A0 NOP
F7A1 NOP
F7A2 NOP
F7A3 NOP
F7A4 NOP
F7A5 NOP
F7A6 NOP
F7A7 NOP
F7A8 NOP
F7A9 NOP
F7AA NOP
F7AB NOP
F7AC NOP
F7AD NOP
F7AE NOP
F7AF NOP
F7B0 NOP
F7B1 NOP
F7B2 NOP
F7B3 NOP
F7B4 NOP
F7B5 NOP
F7B6 NOP
F7B7 NOP
F7B8 NOP
F7B9 NOP
F7BA NOP
F7BB NOP
F7BC NOP
F7BD NOP
F7BE NOP
F7BF NOP
F7C0 NOP
F7C1 NOP
F7C2 NOP
F7C3 NOP
F7C4 NOP
F7C5 NOP
F7C6 NOP
F7C7 NOP
F7C8 RST $38
F7C9 NOP
F7CA NOP
F7CB NOP
F7CC NOP
F7CD NOP
F7CE NOP
F7CF NOP
F7D0 NOP
F7D1 NOP
F7D2 NOP
F7D3 NOP
F7D4 NOP
F7D5 NOP
F7D6 NOP
F7D7 NOP
F7D8 NOP
F7D9 NOP
F7DA NOP
F7DB NOP
F7DC NOP
F7DD NOP
F7DE NOP
F7DF NOP
F7E0 NOP
F7E1 NOP
F7E2 NOP
F7E3 NOP
F7E4 NOP
F7E5 NOP
F7E6 NOP
F7E7 NOP
F7E8 NOP
F7E9 NOP
F7EA NOP
F7EB NOP
F7EC NOP
F7ED NOP
F7EE NOP
F7EF NOP
F7F0 NOP
F7F1 NOP
F7F2 NOP
F7F3 NOP
F7F4 NOP
F7F5 NOP
F7F6 NOP
F7F7 NOP
F7F8 NOP
F7F9 NOP
F7FA NOP
F7FB NOP
F7FC NOP
F7FD NOP
F7FE NOP
F7FF NOP
F800 NOP
F801 NOP
F802 NOP
F803 NOP
F804 NOP
F805 NOP
F806 NOP
F807 NOP
F808 NOP
F809 NOP
F80A NOP
F80B NOP
F80C NOP
F80D NOP
F80E NOP
F80F NOP
F810 NOP
F811 NOP
F812 NOP
F813 NOP
F814 NOP
F815 NOP
F816 NOP
F817 NOP
F818 NOP
F819 NOP
F81A NOP
F81B NOP
F81C NOP
F81D RST $38
F81E NOP
F81F NOP
F820 NOP
F821 NOP
F822 NOP
F823 NOP
F824 NOP
F825 NOP
F826 NOP
F827 NOP
F828 NOP
F829 NOP
F82A NOP
F82B NOP
F82C RST $38
F82D NOP
F82E NOP
F82F NOP
F830 NOP
F831 NOP
F832 NOP
F833 NOP
F834 NOP
F835 NOP
F836 NOP
F837 NOP
F838 NOP
F839 NOP
F83A NOP
F83B NOP
F83C NOP
F83D NOP
F83E NOP
F83F NOP
F840 NOP
F841 NOP
F842 NOP
F843 NOP
F844 NOP
F845 NOP
F846 NOP
F847 NOP
F848 NOP
F849 NOP
F84A NOP
F84B NOP
F84C NOP
F84D NOP
F84E NOP
F84F NOP
F850 NOP
F851 NOP
F852 NOP
F853 NOP
F854 NOP
F855 RST $38
F856 NOP
F857 NOP
F858 NOP
F859 NOP
F85A NOP
F85B NOP
F85C NOP
F85D NOP
F85E NOP
F85F NOP
F860 NOP
F861 NOP
F862 NOP
F863 NOP
F864 NOP
F865 NOP
F866 NOP
F867 NOP
F868 NOP
F869 NOP
F86A NOP
F86B NOP
F86C NOP
F86D NOP
F86E NOP
F86F NOP
F870 NOP
F871 NOP
F872 NOP
F873 NOP
F874 NOP
F875 NOP
F876 NOP
F877 NOP
F878 NOP
F879 NOP
F87A NOP
F87B NOP
F87C NOP
F87D NOP
F87E NOP
F87F NOP
F880 NOP
F881 NOP
F882 NOP
F883 NOP
F884 NOP
F885 NOP
F886 NOP
F887 NOP
F888 NOP
F889 NOP
F88A NOP
F88B NOP
F88C NOP
F88D NOP
F88E NOP
F88F NOP
F890 NOP
F891 NOP
F892 NOP
F893 NOP
F894 NOP
F895 NOP
F896 NOP
F897 NOP
F898 NOP
F899 NOP
F89A NOP
F89B NOP
F89C NOP
F89D NOP
F89E NOP
F89F NOP
F8A0 NOP
F8A1 NOP
F8A2 NOP
F8A3 NOP
F8A4 NOP
F8A5 NOP
F8A6 NOP
F8A7 NOP
F8A8 NOP
F8A9 NOP
F8AA NOP
F8AB NOP
F8AC NOP
F8AD NOP
F8AE NOP
F8AF NOP
F8B0 NOP
F8B1 NOP
F8B2 NOP
F8B3 NOP
F8B4 NOP
F8B5 NOP
F8B6 NOP
F8B7 NOP
F8B8 NOP
F8B9 NOP
F8BA NOP
F8BB NOP
F8BC NOP
F8BD NOP
F8BE NOP
F8BF NOP
F8C0 NOP
F8C1 NOP
F8C2 NOP
F8C3 NOP
F8C4 NOP
F8C5 NOP
F8C6 NOP
F8C7 NOP
F8C8 NOP
F8C9 NOP
F8CA NOP
F8CB NOP
F8CC NOP
F8CD NOP
F8CE RST $38
F8CF NOP
F8D0 NOP
F8D1 NOP
F8D2 NOP
F8D3 NOP
F8D4 NOP
F8D5 NOP
F8D6 NOP
F8D7 INC B
F8D8 LD E,A
F8D9 INC D
F8DA JR NZ,$F8DC
F8DC NOP
F8DD NOP
F8DE NOP
F8DF NOP
F8E0 NOP
F8E1 NOP
F8E2 NOP
F8E3 NOP
F8E4 NOP
F8E5 NOP
F8E6 NOP
F8E7 NOP
F8E8 NOP
F8E9 NOP
F8EA NOP
F8EB NOP
F8EC SUB B
F8ED SUB B
F8EE NOP
F8EF NOP
F8F0 NOP
F8F1 NOP
F8F2 NOP
F8F3 NOP
F8F4 NOP
F8F5 NOP
F8F6 NOP
F8F7 NOP
F8F8 NOP
F8F9 NOP
F8FA NOP
F8FB SUB B
F8FC SUB B
F8FD SUB B
F8FE NOP
F8FF NOP
F900 NOP
F901 NOP
F902 NOP
F903 NOP
F904 NOP
F905 NOP
F906 NOP
F907 NOP
F908 NOP
F909 NOP
F90A NOP
F90B NOP
F90C NOP
F90D NOP
F90E NOP
F90F NOP
F910 NOP
F911 NOP
F912 NOP
F913 NOP
F914 NOP
F915 NOP
F916 NOP
F917 NOP
F918 NOP
F919 NOP
F91A NOP
F91B NOP
F91C NOP
F91D NOP
F91E NOP
F91F NOP
F920 NOP
F921 NOP
F922 NOP
F923 NOP
F924 NOP
F925 NOP
F926 NOP
F927 NOP
F928 NOP
F929 NOP
F92A NOP
F92B NOP
F92C NOP
F92D NOP
F92E NOP
F92F NOP
F930 NOP
F931 NOP
F932 NOP
F933 NOP
F934 NOP
F935 NOP
F936 NOP
F937 NOP
F938 NOP
F939 NOP
F93A NOP
F93B NOP
F93C NOP
F93D NOP
F93E NOP
F93F NOP
F940 NOP
F941 NOP
F942 NOP
F943 NOP
F944 NOP
F945 NOP
F946 NOP
F947 NOP
F948 NOP
F949 NOP
F94A NOP
F94B NOP
F94C NOP
F94D NOP
F94E NOP
F94F NOP
F950 NOP
F951 NOP
F952 NOP
F953 NOP
F954 NOP
F955 NOP
F956 NOP
F957 NOP
F958 NOP
F959 NOP
F95A NOP
F95B NOP
F95C NOP
F95D NOP
F95E NOP
F95F NOP
F960 NOP
F961 NOP
F962 NOP
F963 NOP
F964 NOP
F965 NOP
F966 NOP
F967 NOP
F968 NOP
F969 NOP
F96A NOP
F96B NOP
F96C NOP
F96D NOP
F96E NOP
F96F NOP
F970 NOP
F971 NOP
F972 NOP
F973 NOP
F974 NOP
F975 NOP
F976 NOP
F977 NOP
F978 NOP
F979 NOP
F97A NOP
F97B NOP
F97C NOP
F97D NOP
F97E NOP
F97F NOP
F980 NOP
F981 NOP
F982 NOP
F983 NOP
F984 NOP
F985 NOP
F986 NOP
F987 NOP
F988 NOP
F989 NOP
F98A NOP
F98B NOP
F98C NOP
F98D NOP
F98E NOP
F98F NOP
F990 NOP
F991 NOP
F992 NOP
F993 NOP
F994 NOP
F995 NOP
F996 NOP
F997 NOP
F998 NOP
F999 NOP
F99A NOP
F99B NOP
F99C NOP
F99D NOP
F99E NOP
F99F NOP
F9A0 NOP
F9A1 NOP
F9A2 NOP
F9A3 NOP
F9A4 NOP
F9A5 NOP
F9A6 NOP
F9A7 NOP
F9A8 NOP
F9A9 NOP
F9AA NOP
F9AB NOP
F9AC NOP
F9AD NOP
F9AE NOP
F9AF NOP
F9B0 NOP
F9B1 NOP
F9B2 NOP
F9B3 NOP
F9B4 NOP
F9B5 NOP
F9B6 NOP
F9B7 NOP
F9B8 NOP
F9B9 NOP
F9BA NOP
F9BB NOP
F9BC NOP
F9BD NOP
F9BE NOP
F9BF NOP
F9C0 NOP
F9C1 NOP
F9C2 NOP
F9C3 NOP
F9C4 NOP
F9C5 NOP
F9C6 NOP
F9C7 NOP
F9C8 NOP
F9C9 NOP
F9CA NOP
F9CB NOP
F9CC NOP
F9CD NOP
F9CE NOP
F9CF NOP
F9D0 NOP
F9D1 NOP
F9D2 NOP
F9D3 NOP
F9D4 NOP
F9D5 NOP
F9D6 NOP
F9D7 NOP
F9D8 NOP
F9D9 NOP
F9DA NOP
F9DB NOP
F9DC NOP
F9DD NOP
F9DE NOP
F9DF NOP
F9E0 NOP
F9E1 NOP
F9E2 NOP
F9E3 NOP
F9E4 NOP
F9E5 NOP
F9E6 NOP
F9E7 NOP
F9E8 NOP
F9E9 NOP
F9EA NOP
F9EB NOP
F9EC NOP
F9ED NOP
F9EE NOP
F9EF NOP
F9F0 NOP
F9F1 NOP
F9F2 NOP
F9F3 NOP
F9F4 NOP
F9F5 NOP
F9F6 NOP
F9F7 NOP
F9F8 NOP
F9F9 NOP
F9FA NOP
F9FB NOP
F9FC NOP
F9FD NOP
F9FE NOP
F9FF NOP
FA00 SUB C
FA01 LD H,L
FA02 JP $8E24
FA05 NOP
FA06 POP HL
FA07 LD BC,$723B
FA0A JP Z,$584A
FA0D RST $10
FA0E AND (IY+$16)
FA11 LD E,$FD
FA13 SBC A,L
FA14 LD B,D
FA15 LD C,L
FA16 LD A,A
FA17 LD D,(HL)
FA18 DEC HL
FA19 LD C,L
FA1A LD H,B
FA1B OR L
FA1C INC SP
FA1D SUB H
FA1E LD A,$CE
FA20 CALL NC,$4E3F
FA23 LD B,(HL)
FA24 RET NZ
FA25 POP DE
FA26 JP NZ,$F02A
FA29 ADD HL,BC
FA2A CALL NZ,$5169
FA2D OR D
FA2E LD L,(HL)
FA2F DEFB $DD
FA30 CALL PE,$84DF
FA33 LD B,C
FA34 SBC A,D
FA35 LD H,L
FA36 CALL NC,$B970
FA39 LD (HL),B
FA3A SUB D
FA3B SUB $8B
FA3D LD L,D
FA3E LD D,D
FA3F EXX
FA40 LD L,A
FA41 LD L,D
FA42 CP A
FA43 CP (HL)
FA44 OUT ($00),A
FA46 LD D,B
FA47 ADC A,C
FA48 DEC E
FA49 SUB $BC
FA4B XOR (HL)
FA4C RST $08
FA4D LD L,C
FA4E INC BC
FA4F JP $9717
FA52 LD BC,$A0A1
FA55 LD C,B
FA56 RET NZ
FA57 DI
FA58 PUSH HL
FA59 DEC BC
FA5A LD H,C
FA5B LD H,D
FA5C SBC A,E
FA5D ADC A,D
FA5E LD ($411C),A
FA61 LD C,A
FA62 EX AF,AF'
FA63 ADC A,E
FA64 SUB L
FA65 DEC (IX-$34)
FA68 AND C
FA69 EI
FA6A ADC A,(HL)
FA6B DEFB $ED,$AE
FA6D PUSH BC
FA6E RLCA
FA6F ADC A,C
FA70 LD E,B
FA71 POP BC
FA72 OR E
FA73 LD C,C
FA74 LD L,H
FA75 LD C,(HL)
FA76 LD E,B
FA77 LD H,B
FA78 DEC H
FA79 SBC A,H
FA7A LD D,B
FA7B LD (HL),C
FA7C OR B
FA7D SUB E
FA7E LD D,H
FA7F LD C,(HL)
FA80 LD D,A
FA81 LD A,(DE)
FA82 LD D,D
FA83 DEC B
FA84 POP HL
FA85 DEC L
FA86 SBC A,A
FA87 ADD A,B
FA88 SUB H
FA89 JP P,$4AFE
FA8C XOR B
FA8D CP L
FA8E AND C
FA8F JP M,$72B2
FA92 LD B,D
FA93 LD E,C
FA94 INC DE
FA95 RET NZ
FA96 DEC D
FA97 OR $7D
FA99 JP PO,$C907
FA9C DEC L
FA9D EXX
FA9E LD B,C
FA9F EX AF,AF'
FAA0 INC A
FAA1 JR NC,$FA89
FAA3 CP B
FAA4 LD H,$9C
FAA6 CALL M,$9902
FAA9 ADD A,H
FAAA LD BC,$AD9A
FAAD LD E,$38
FAAF CP A
FAB0 OR D
FAB1 LD E,$FE
FAB3 JP P,$D737
FAB6 LD (DE),A
FAB7 LD D,D
FAB8 EXX
FAB9 LD H,B
FABA ADD A,$09
FABC RET P
FABD LD A,C
FABE DEC SP
FABF INC (HL)
FAC0 LD (HL),L
FAC1 LD D,$BC
FAC3 RET M
FAC4 RL H
FAC6 CP C
FAC7 OUT ($02),A
FAC9 LD (HL),C
FACA XOR A
FACB JR C,$FB42
FACD ADC A,(HL)
FACE CP D
FACF ADD A,E
FAD0 XOR E
FAD1 LD D,L
FAD2 LD (HL),A
FAD3 LD L,E
FAD4 SUB $22
FAD6 LD SP,$299F
FAD9 CALL NZ,$C427
FADC LD B,B
FADD ADC A,H
FADE RRCA
FADF CP B
FAE0 CALL C,$179F
FAE3 RST $30
FAE4 ADC A,C
FAE5 CPL
FAE6 LD A,C
FAE7 PUSH HL
FAE8 RRA
FAE9 OR E
FAEA RET NZ
FAEB CALL PO,$825C
FAEE LD E,D
FAEF OR L
FAF0 JP PO,$96F5
FAF3 LD L,D
FAF4 LD E,B
FAF5 INC D
FAF6 LD A,(HL)
FAF7 LD E,D
FAF8 CP H
FAF9 LD L,C
FAFA JP M,$DDFB
FAFD CP H
FAFE POP BC
FAFF LD SP,HL
FB00 CALL M,$FCFC
FB03 CALL M,$FCFC
FB06 CALL M,$FCFC
FB09 CALL M,$FCFC
FB0C CALL M,$FCFC
FB0F CALL M,$FCFC
FB12 CALL M,$FCFC
FB15 CALL M,$FCFC
FB18 CALL M,$FCFC
FB1B CALL M,$FCFC
FB1E CALL M,$FCFC
FB21 CALL M,$FCFC
FB24 CALL M,$FCFC
FB27 CALL M,$FCFC
FB2A CALL M,$FCFC
FB2D CALL M,$FCFC
FB30 CALL M,$FCFC
FB33 CALL M,$FCFC
FB36 CALL M,$FCFC
FB39 CALL M,$FCFC
FB3C CALL M,$FCFC
FB3F CALL M,$FCFC
FB42 CALL M,$FCFC
FB45 CALL M,$FCFC
FB48 CALL M,$FCFC
FB4B CALL M,$FCFC
FB4E CALL M,$FCFC
FB51 CALL M,$FCFC
FB54 CALL M,$FCFC
FB57 CALL M,$FCFC
FB5A CALL M,$FCFC
FB5D CALL M,$FCFC
FB60 CALL M,$FCFC
FB63 CALL M,$FCFC
FB66 CALL M,$FCFC
FB69 CALL M,$FCFC
FB6C CALL M,$FCFC
FB6F CALL M,$FCFC
FB72 CALL M,$FCFC
FB75 CALL M,$FCFC
FB78 CALL M,$FCFC
FB7B CALL M,$FCFC
FB7E CALL M,$FCFC
FB81 CALL M,$FCFC
FB84 CALL M,$FCFC
FB87 CALL M,$FCFC
FB8A CALL M,$FCFC
FB8D CALL M,$FCFC
FB90 CALL M,$FCFC
FB93 CALL M,$FCFC
FB96 CALL M,$FCFC
FB99 CALL M,$FCFC
FB9C CALL M,$FCFC
FB9F CALL M,$FCFC
FBA2 CALL M,$FCFC
FBA5 CALL M,$FCFC
FBA8 CALL M,$FCFC
FBAB CALL M,$FCFC
FBAE CALL M,$FCFC
FBB1 CALL M,$FCFC
FBB4 CALL M,$FCFC
FBB7 CALL M,$FCFC
FBBA CALL M,$FCFC
FBBD CALL M,$FCFC
FBC0 CALL M,$FCFC
FBC3 CALL M,$FCFC
FBC6 CALL M,$FCFC
FBC9 CALL M,$FCFC
FBCC CALL M,$FCFC
FBCF CALL M,$FCFC
FBD2 CALL M,$FCFC
FBD5 CALL M,$FCFC
FBD8 CALL M,$FCFC
FBDB CALL M,$FCFC
FBDE CALL M,$FCFC
FBE1 CALL M,$FCFC
FBE4 CALL M,$FCFC
FBE7 CALL M,$FCFC
FBEA CALL M,$FCFC
FBED CALL M,$FCFC
FBF0 CALL M,$FCFC
FBF3 CALL M,$FCFC
FBF6 CALL M,$FCFC
FBF9 CALL M,$FCFC
FBFC CALL M,$FCFC
FBFF CALL M,$00FC
FC02 NOP
FC03 NOP
FC04 NOP
FC05 NOP
FC06 NOP
FC07 NOP
FC08 NOP
FC09 NOP
FC0A NOP
FC0B NOP
FC0C NOP
FC0D NOP
FC0E NOP
FC0F NOP
FC10 NOP
FC11 NOP
FC12 NOP
FC13 NOP
FC14 NOP
FC15 NOP
FC16 NOP
FC17 NOP
FC18 NOP
FC19 NOP
FC1A NOP
FC1B NOP
FC1C NOP
FC1D NOP
FC1E NOP
FC1F NOP
FC20 NOP
FC21 NOP
FC22 NOP
FC23 NOP
FC24 NOP
FC25 NOP
FC26 NOP
FC27 NOP
FC28 NOP
FC29 NOP
FC2A NOP
FC2B NOP
FC2C NOP
FC2D NOP
FC2E NOP
FC2F NOP
FC30 NOP
FC31 NOP
FC32 NOP
FC33 NOP
FC34 NOP
FC35 NOP
FC36 NOP
FC37 NOP
FC38 NOP
FC39 NOP
FC3A NOP
FC3B NOP
FC3C NOP
FC3D NOP
FC3E NOP
FC3F NOP
FC40 NOP
FC41 NOP
FC42 NOP
FC43 NOP
FC44 NOP
FC45 NOP
FC46 NOP
FC47 NOP
FC48 NOP
FC49 NOP
FC4A NOP
FC4B NOP
FC4C NOP
FC4D NOP
FC4E NOP
FC4F NOP
FC50 NOP
FC51 NOP
FC52 NOP
FC53 NOP
FC54 NOP
FC55 NOP
FC56 NOP
FC57 NOP
FC58 NOP
FC59 NOP
FC5A NOP
FC5B NOP
FC5C NOP
FC5D NOP
FC5E NOP
FC5F NOP
FC60 NOP
FC61 NOP
FC62 NOP
FC63 NOP
FC64 NOP
FC65 NOP
FC66 NOP
FC67 NOP
FC68 NOP
FC69 NOP
FC6A NOP
FC6B NOP
FC6C NOP
FC6D NOP
FC6E NOP
FC6F NOP
FC70 NOP
FC71 NOP
FC72 NOP
FC73 NOP
FC74 NOP
FC75 NOP
FC76 NOP
FC77 NOP
FC78 NOP
FC79 NOP
FC7A NOP
FC7B NOP
FC7C NOP
FC7D NOP
FC7E NOP
FC7F NOP
FC80 NOP
FC81 NOP
FC82 NOP
FC83 NOP
FC84 NOP
FC85 NOP
FC86 NOP
FC87 NOP
FC88 NOP
FC89 NOP
FC8A NOP
FC8B NOP
FC8C NOP
FC8D NOP
FC8E NOP
FC8F NOP
FC90 NOP
FC91 NOP
FC92 NOP
FC93 NOP
FC94 NOP
FC95 NOP
FC96 NOP
FC97 NOP
FC98 NOP
FC99 NOP
FC9A NOP
FC9B NOP
FC9C NOP
FC9D NOP
FC9E NOP
FC9F NOP
FCA0 NOP
FCA1 NOP
FCA2 NOP
FCA3 NOP
FCA4 NOP
FCA5 NOP
FCA6 NOP
FCA7 NOP
FCA8 NOP
FCA9 NOP
FCAA NOP
FCAB NOP
FCAC NOP
FCAD NOP
FCAE NOP
FCAF NOP
FCB0 NOP
FCB1 NOP
FCB2 NOP
FCB3 NOP
FCB4 NOP
FCB5 NOP
FCB6 NOP
FCB7 NOP
FCB8 NOP
FCB9 NOP
FCBA NOP
FCBB NOP
FCBC NOP
FCBD NOP
FCBE NOP
FCBF NOP
FCC0 NOP
FCC1 NOP
FCC2 NOP
FCC3 NOP
FCC4 NOP
FCC5 NOP
FCC6 NOP
FCC7 NOP
FCC8 NOP
FCC9 NOP
FCCA NOP
FCCB NOP
FCCC NOP
FCCD NOP
FCCE NOP
FCCF NOP
FCD0 NOP
FCD1 NOP
FCD2 NOP
FCD3 NOP
FCD4 NOP
FCD5 NOP
FCD6 NOP
FCD7 NOP
FCD8 NOP
FCD9 NOP
FCDA NOP
FCDB NOP
FCDC NOP
FCDD NOP
FCDE NOP
FCDF NOP
FCE0 NOP
FCE1 NOP
FCE2 NOP
FCE3 NOP
FCE4 NOP
FCE5 NOP
FCE6 NOP
FCE7 NOP
FCE8 NOP
FCE9 NOP
FCEA NOP
FCEB NOP
FCEC NOP
FCED NOP
FCEE NOP
FCEF NOP
FCF0 NOP
FCF1 NOP
FCF2 NOP
FCF3 NOP
FCF4 NOP
FCF5 NOP
FCF6 NOP
FCF7 NOP
FCF8 NOP
FCF9 NOP
FCFA NOP
FCFB NOP
FCFC JP $7357
FCFF NOP
FD00 NOP
FD01 NOP
FD02 NOP
FD03 NOP
FD04 NOP
FD05 NOP
FD06 NOP
FD07 NOP
FD08 NOP
FD09 NOP
FD0A NOP
FD0B NOP
FD0C NOP
FD0D NOP
FD0E NOP
FD0F NOP
FD10 NOP
FD11 NOP
FD12 NOP
FD13 NOP
FD14 NOP
FD15 NOP
FD16 NOP
FD17 NOP
FD18 NOP
FD19 NOP
FD1A NOP
FD1B NOP
FD1C NOP
FD1D NOP
FD1E NOP
FD1F NOP
FD20 NOP
FD21 NOP
FD22 NOP
FD23 NOP
FD24 NOP
FD25 NOP
FD26 NOP
FD27 NOP
FD28 NOP
FD29 NOP
FD2A NOP
FD2B NOP
FD2C NOP
FD2D NOP
FD2E NOP
FD2F NOP
FD30 NOP
FD31 NOP
FD32 NOP
FD33 NOP
FD34 NOP
FD35 NOP
FD36 NOP
FD37 NOP
FD38 NOP
FD39 NOP
FD3A NOP
FD3B NOP
FD3C NOP
FD3D NOP
FD3E NOP
FD3F NOP
FD40 NOP
FD41 NOP
FD42 NOP
FD43 NOP
FD44 NOP
FD45 NOP
FD46 NOP
FD47 NOP
FD48 NOP
FD49 NOP
FD4A NOP
FD4B NOP
FD4C NOP
FD4D NOP
FD4E NOP
FD4F NOP
FD50 NOP
FD51 NOP
FD52 NOP
FD53 NOP
FD54 NOP
FD55 NOP
FD56 NOP
FD57 NOP
FD58 NOP
FD59 NOP
FD5A NOP
FD5B NOP
FD5C NOP
FD5D NOP
FD5E NOP
FD5F NOP
FD60 NOP
FD61 NOP
FD62 NOP
FD63 NOP
FD64 NOP
FD65 NOP
FD66 AND C
FD67 LD L,B
FD68 RET PO
FD69 LD A,E
FD6A DEC B
FD6B LD B,H
FD6C XOR A
FD6D LD L,C
FD6E NOP
FD6F LD BC,$1848
FD72 RRA
FD73 RLA
FD74 ADD HL,BC
FD75 RRA
FD76 SUB L
FD77 LD L,C
FD78 SUB H
FD79 LD (HL),E
FD7A LD B,B
FD7B LD H,H
FD7C INC B
FD7D NOP
FD7E DJNZ $FD82
FD80 CALL M,$0061
FD83 NOP
FD84 NOP
FD85 NOP
FD86 NOP
FD87 RRCA
FD88 NOP
FD89 NOP
FD8A NOP
FD8B NOP
FD8C NOP
FD8D RET PE
FD8E LD H,C
FD8F ADD HL,SP
FD90 LD H,H
This entry point is used by the routine at 7357.
FD91 JP $7A5D
FD94 NOP
FD95 NOP
FD96 NOP
FD97 NOP
FD98 NOP
FD99 NOP
FD9A NOP
FD9B NOP
FD9C NOP
FD9D NOP
FD9E NOP
FD9F NOP
FDA0 RLCA
FDA1 NOP
FDA2 LD E,B
FDA3 AND B
FDA4 LD A,(HL)
FDA5 INC B
FDA6 INC C
FDA7 NOP
FDA8 DEC D
FDA9 XOR H
FDAA DEFB $FD
FDAB NOP
FDAC LD (BC),A
FDAD NOP
FDAE NOP
FDAF LD BC,$0102
FDB2 NOP
FDB3 NOP
FDB4 NOP
FDB5 NOP
FDB6 NOP
FDB7 NOP
FDB8 NOP
FDB9 NOP
FDBA NOP
FDBB ADD HL,DE
FDBC NOP
FDBD NOP
FDBE NOP
FDBF NOP
FDC0 NOP
FDC1 NOP
FDC2 LD (BC),A
FDC3 NOP
FDC4 NOP
FDC5 NOP
FDC6 NOP
FDC7 NOP
FDC8 NOP
FDC9 NOP
FDCA NOP
FDCB NOP
FDCC NOP
FDCD NOP
FDCE NOP
FDCF NOP
FDD0 NOP
FDD1 NOP
FDD2 NOP
FDD3 NOP
FDD4 NOP
FDD5 NOP
FDD6 NOP
FDD7 NOP
FDD8 NOP
FDD9 NOP
FDDA NOP
FDDB NOP
FDDC NOP
FDDD NOP
FDDE NOP
FDDF NOP
FDE0 NOP
FDE1 NOP
FDE2 NOP
FDE3 NOP
FDE4 NOP
FDE5 NOP
FDE6 NOP
FDE7 NOP
FDE8 NOP
FDE9 NOP
FDEA NOP
FDEB NOP
FDEC NOP
FDED NOP
FDEE NOP
FDEF NOP
FDF0 NOP
FDF1 NOP
FDF2 NOP
FDF3 NOP
FDF4 NOP
FDF5 NOP
FDF6 NOP
FDF7 NOP
FDF8 NOP
FDF9 NOP
FDFA NOP
FDFB NOP
FDFC NOP
FDFD NOP
FDFE NOP
FDFF NOP
FE00 NOP
FE01 LD B,B
FE02 NOP
FE03 LD B,D
FE04 NOP
FE05 LD B,H
FE06 NOP
FE07 LD B,(HL)
FE08 JR NZ,$FE4A
FE0A JR NZ,$FE4E
FE0C JR NZ,$FE52
FE0E JR NZ,$FE56
FE10 LD B,B
FE11 LD B,B
FE12 LD B,B
FE13 LD B,D
FE14 LD B,B
FE15 LD B,H
FE16 LD B,B
FE17 LD B,(HL)
FE18 LD H,B
FE19 LD B,B
FE1A LD H,B
FE1B LD B,D
FE1C LD H,B
FE1D LD B,H
FE1E LD H,B
FE1F LD B,(HL)
FE20 ADD A,B
FE21 LD B,B
FE22 ADD A,B
FE23 LD B,D
FE24 ADD A,B
FE25 LD B,H
FE26 ADD A,B
FE27 LD B,(HL)
FE28 AND B
FE29 LD B,B
FE2A AND B
FE2B LD B,D
FE2C AND B
FE2D LD B,H
FE2E AND B
FE2F LD B,(HL)
FE30 RET NZ
FE31 LD B,B
FE32 RET NZ
FE33 LD B,D
FE34 RET NZ
FE35 LD B,H
FE36 RET NZ
FE37 LD B,(HL)
FE38 RET PO
FE39 LD B,B
FE3A RET PO
FE3B LD B,D
FE3C RET PO
FE3D LD B,H
FE3E RET PO
FE3F LD B,(HL)
FE40 NOP
FE41 LD C,B
FE42 NOP
FE43 LD C,D
FE44 NOP
FE45 LD C,H
FE46 NOP
FE47 LD C,(HL)
FE48 JR NZ,$FE92
FE4A JR NZ,$FE96
FE4C JR NZ,$FE9A
FE4E JR NZ,$FE9E
FE50 LD B,B
FE51 LD C,B
FE52 LD B,B
FE53 LD C,D
FE54 LD B,B
FE55 LD C,H
FE56 LD B,B
FE57 LD C,(HL)
FE58 LD H,B
FE59 LD C,B
FE5A LD H,B
FE5B LD C,D
FE5C LD H,B
FE5D LD C,H
FE5E LD H,B
FE5F LD C,(HL)
FE60 ADD A,B
FE61 LD C,B
FE62 ADD A,B
FE63 LD C,D
FE64 ADD A,B
FE65 LD C,H
FE66 ADD A,B
FE67 LD C,(HL)
FE68 AND B
FE69 LD C,B
FE6A AND B
FE6B LD C,D
FE6C AND B
FE6D LD C,H
FE6E AND B
FE6F LD C,(HL)
FE70 RET NZ
FE71 LD C,B
FE72 RET NZ
FE73 LD C,D
FE74 RET NZ
FE75 LD C,H
FE76 RET NZ
FE77 LD C,(HL)
FE78 RET PO
FE79 LD C,B
FE7A RET PO
FE7B LD C,D
FE7C RET PO
FE7D LD C,H
FE7E RET PO
FE7F LD C,(HL)
FE80 NOP
FE81 LD D,B
FE82 NOP
FE83 LD D,D
FE84 NOP
FE85 LD D,H
FE86 NOP
FE87 LD D,(HL)
FE88 JR NZ,$FEDA
FE8A JR NZ,$FEDE
FE8C JR NZ,$FEE2
FE8E JR NZ,$FEE6
FE90 LD B,B
FE91 LD D,B
FE92 LD B,B
FE93 LD D,D
FE94 LD B,B
FE95 LD D,H
FE96 LD B,B
FE97 LD D,(HL)
FE98 LD H,B
FE99 LD D,B
FE9A LD H,B
FE9B LD D,D
FE9C LD H,B
FE9D LD D,H
FE9E LD H,B
FE9F LD D,(HL)
FEA0 ADD A,B
FEA1 LD D,B
FEA2 ADD A,B
FEA3 LD D,D
FEA4 ADD A,B
FEA5 LD D,H
FEA6 ADD A,B
FEA7 LD D,(HL)
FEA8 AND B
FEA9 LD D,B
FEAA AND B
FEAB LD D,D
FEAC AND B
FEAD LD D,H
FEAE AND B
FEAF LD D,(HL)
FEB0 RET NZ
FEB1 LD D,B
FEB2 RET NZ
FEB3 LD D,D
FEB4 RET NZ
FEB5 LD D,H
FEB6 RET NZ
FEB7 LD D,(HL)
FEB8 RET PO
FEB9 LD D,B
FEBA RET PO
FEBB LD D,D
FEBC RET PO
FEBD LD D,H
FEBE RET PO
FEBF LD D,(HL)
FEC0 NOP
FEC1 LD E,B
FEC2 NOP
FEC3 LD E,D
FEC4 NOP
FEC5 LD E,H
FEC6 NOP
FEC7 LD E,(HL)
FEC8 JR NZ,$FF22
FECA JR NZ,$FF26
FECC JR NZ,$FF2A
FECE JR NZ,$FF2E
FED0 LD B,B
FED1 LD E,B
FED2 LD B,B
FED3 LD E,D
FED4 LD B,B
FED5 LD E,H
FED6 LD B,B
FED7 LD E,(HL)
FED8 LD H,B
FED9 LD E,B
FEDA LD H,B
FEDB LD E,D
FEDC LD H,B
FEDD LD E,H
FEDE LD H,B
FEDF LD E,(HL)
FEE0 ADD A,B
FEE1 LD E,B
FEE2 ADD A,B
FEE3 LD E,D
FEE4 ADD A,B
FEE5 LD E,H
FEE6 ADD A,B
FEE7 LD E,(HL)
FEE8 AND B
FEE9 LD E,B
FEEA AND B
FEEB LD E,D
FEEC AND B
FEED LD E,H
FEEE AND B
FEEF LD E,(HL)
FEF0 RET NZ
FEF1 LD E,B
FEF2 RET NZ
FEF3 LD E,D
FEF4 RET NZ
FEF5 LD E,H
FEF6 RET NZ
FEF7 LD E,(HL)
FEF8 RET PO
FEF9 LD E,B
FEFA RET PO
FEFB LD E,D
FEFC RET PO
FEFD LD E,H
FEFE RET PO
FEFF LD E,(HL)
FF00 NOP
FF01 NOP
FF02 LD IX,$4000
FF06 LD DE,$BE00
FF09 LD A,$FF
FF0B SCF
FF0C INC D
FF0D EX AF,AF'
FF0E DEC D
FF0F DI
FF10 LD A,$0F
FF12 OUT ($FE),A
FF14 IN A,($FE)
FF16 RRA
FF17 AND $20
FF19 OR $02
FF1B LD C,A
FF1C CP A
FF1D CALL $FFA7
FF20 JR NC,$FF1D
FF22 LD HL,$0415
FF25 DJNZ $FF25
FF27 DEC HL
FF28 LD A,H
FF29 OR L
FF2A JR NZ,$FF25
FF2C CALL $FFA3
FF2F JR NC,$FF1D
FF31 LD B,$9C
FF33 CALL $FFA3
FF36 JR NC,$FF1D
FF38 LD A,$C6
FF3A CP B
FF3B JR NC,$FF1D
FF3D INC H
FF3E JR NZ,$FF31
FF40 LD B,$C9
FF42 CALL $FFA7
FF45 JR NC,$FF1D
FF47 LD A,B
FF48 CP $D4
FF4A JR NC,$FF40
FF4C CALL $FFA7
FF4F JP NC,$0000
FF52 LD A,C
FF53 XOR $03
FF55 LD C,A
FF56 LD H,$00
FF58 LD B,$B0
FF5A JR $FF83
FF5C EX AF,AF'
FF5D JR NZ,$FF6E
FF5F JR NC,$FF78
FF61 PUSH AF
FF62 LD A,L
FF63 XOR $A5
FF65 RRCA
FF66 ADD A,$0F
FF68 LD (IX+$00),A
FF6B POP AF
FF6C JR $FF7D
FF6E RL C
FF70 XOR L
FF71 RET NZ
FF72 LD A,C
FF73 RRA
FF74 LD C,A
FF75 INC DE
FF76 JR $FF7F
FF78 LD A,(IX+$00)
FF7B XOR L
FF7C RET NZ
FF7D INC IX
FF7F DEC DE
FF80 EX AF,AF'
FF81 LD B,$B2
FF83 LD L,$01
FF85 CALL $FFA3
FF88 RET NC
FF89 LD A,$CB
FF8B CP B
FF8C RL L
FF8E LD B,$B0
FF90 JP NC,$FF85
FF93 LD A,H
FF94 XOR L
FF95 LD H,A
FF96 LD A,D
FF97 OR E
FF98 JR NZ,$FF5C
FF9A LD A,H
FF9B CP $01
FF9D JP NC,$0000
FFA0 JP $FFC7
FFA3 CALL $FFA7
FFA6 RET NC
FFA7 LD A,$16
FFA9 DEC A
FFAA JR NZ,$FFA9
FFAC AND A
FFAD INC B
FFAE RET Z
FFAF LD A,$7F
FFB1 IN A,($FE)
FFB3 RRA
FFB4 NOP
FFB5 XOR C
FFB6 AND $20
FFB8 JR Z,$FFAD
FFBA LD A,C
FFBB CPL
FFBC LD C,A
FFBD LD A,R
FFBF AND $07
FFC1 OR $08
FFC3 OUT ($FE),A
FFC5 SCF
FFC6 RET
FFC7 LD SP,$6200
FFCA JP $641E
FFCD LD HL,$FF63
FFD0 LD A,L
FFD1 LD A,L
FFD2 SCF
FFD3 BIT 2,A
FFD5 LD DE,$FF66
FFD8 LD A,(HL)
FFD9 LD A,(HL)
FFDA LD A,(HL)
FFDB LD B,A
FFDC LD C,A
FFDD SET 2,A
FFDF SET 2,A
FFE1 LD A,(DE)
FFE2 LD (HL),A
FFE3 LD (HL),A
FFE4 LD A,B
FFE5 LD (DE),A
FFE6 INC HL
FFE7 INC DE
FFE8 LD A,(HL)
FFE9 LD B,A
FFEA LD C,A
FFEB SET 2,A
FFED SET 2,A
FFEF LD A,(DE)
FFF0 LD (HL),A
FFF1 LD (HL),A
FFF2 LD A,B
FFF3 LD (DE),A
FFF4 JP $FEEF
FFF7 NOP
FFF8 NOP
FFF9 NOP
FFFA NOP
FFFB NOP
FFFC AND (HL)
FFFD RST $38
FFFE ADC A,B
FFFF RST $38