60C2: Data block at 60C2
60C2 DEFB $58,$27,$20,$FB,$6C,$F8,$2B,$2D
60CA DEFB $65,$33,$FF,$FF,$ED,$10,$0D,$00
60D2 DEFB $09,$00,$85,$1C,$10,$1C,$52,$1B
60DA DEFB $76,$1B,$03,$13,$00,$3E,$C3,$3C
60E2 DEFB $9D,$E0,$60,$18,$3E,$23,$5E
60E9 DEFW $5D42 Saved SP
60EB DEFB $05 Draw-queue length (number of object-record pointers at $60EC; see 9900)
60EC DEFW $8E0F,$A900,$8DB6,$8E27 Draw queue: object-record pointers, drawn by 9900
60F4 DEFW $A918
60F6 DEFB $00,$00,$00,$00,$00,$00,$00,$00
60FE DEFB $00,$00,$00,$00,$00,$00,$00,$00
6106 DEFB $00,$00,$00,$00
610A DEFW $70E0
610C DEFW $8FEF
610E DEFW $A918 Active object list HEAD pointer: points at the most recently spawned object record; each record's +0/+1 links to the next, ending in the fixed records 8DB6 (player) -> $8DCF -> $8DEF -> $0000. Passed as IX into 84AE, which head-inserts the new object here. Other insertion points exist (e.g. $8DEF for creatures -- see 6663), placing objects later in the list.
6110 DEFW $788A Currently-held item: pointer to its 4-byte item-table record (room,Y,X,sprite). Equals the fixed "empty hands" sentinel record at $788A when nothing is held. Set by 8AFB on pickup; the pointed-to record's room byte is zeroed on pickup and restored (to the current room, at the player's position) on drop.
6112 DEFB $00,$00,$00,$00,$00,$00,$00,$04
611A DEFB $05
611B DEFB $00,$00,$00,$00,$00 SCORE (5-digit BCD, most-significant byte first). Added to by 8879, subtracted by 8894, displayed (last 4 digits) by 885A via 8523.
6120 DEFB $00,$00
6122 DEFB $00 "Gnomes Gnabbed" end-game stat counter (BCD), printed by 86CC via 854F
6123 DEFB $00 "Goodies Gathered" end-game stat counter (BCD), printed by 86CC via 854F; incremented by 9341 on each successful item delivery to a Plug Room corner cube
6124 DEFB $00 "Plugs Pulled" end-game stat counter (BCD), printed by 86CC via 854F
6125 DEFB $00 Entry-point room number choosen selecting A/B/C/D in menu, see table 8567
6126 DEFB $02 Room number
6127 DEFW $6CD6 Room description address
6129 DEFB $00 Room shape/layout selector (0 or 1; bit 6 from byte 3 of Room description, shifted to bit 0). Selects one of 2 fixed wall/decoration layouts drawn by 642F.
612A DEFB $0E Bits 4-7 from byte 2 of Room description, shifted to bits 0-3
612B DEFB $00 Room exit/door bitfield (from room description byte1; see 6329). Also reused throughout the code as a numeric base address for room-grid cell addressing ($612B+index, grid starting at $612C) -- these are two unrelated uses of the same address, not a conflict.
8x8 grid (row-major, offset = row*8+col), cleared to 0 then populated by 62A2 from a shared room-type template (72D1 family, selected by $612A via the 72B1 pointer table), plus any per-room extra pairs from the room description itself (see 6CCF). Each entry's grid cell address is $612B+index (i.e. grid_offset = index-1); the stored value is either a plain content code (see table below), or one of $66/$67/$68/$69/$6A/$6B which additionally triggers a dedicated object-spawn routine (8EA7/8EF2/8F1E/8F4C/8E3F) -- these special values do NOT persist in the finished grid; they spawn a dynamic object instead (see 84AE) and the grid cell they occupied stays part of the static terrain layout only incidentally.
Static object codes: $01=small seaweed, $02=flat rock, $03=clam shell (no pearl), $04=small rock, $09=rock, $0D=seaweed, $7F=solid wall (seen as a contiguous 3x3 corner block), $0A-$10=display cubes/cases with varying item glyphs (seen in Plug Rooms). Creatures, pickups (spoon/ball/horseshoe/etc), and air-bubble sources are NEVER on the grid -- they're separate dynamic objects (see 84AE), not static terrain.
612C DEFB $00,$00,$00,$00,$00,$00,$00,$00 Room grid 8x8
6134 DEFB $00,$00,$00,$00,$00,$00,$00,$00
613C DEFB $00,$00,$00,$00,$00,$01,$00,$00
6144 DEFB $00,$00,$00,$00,$00,$00,$00,$01
614C DEFB $00,$02,$00,$00,$00,$01,$00,$00
6154 DEFB $00,$00,$00,$00,$02,$00,$00,$00
615C DEFB $00,$04,$04,$00,$00,$00,$00,$00
6164 DEFB $00,$00,$00,$00,$00,$00,$00,$00
616C DEFB $00,$00,$00,$00,$00,$00,$00,$00
6174 DEFB $00
6175 DEFB $43 Room color 0..15
6176 DEFB $40,$40,$40
6179 DEFB $00
617A DEFB $00
617B DEFB $00 Input device selector, read by 7EBE: 0=keyboard, 1=Kempston joystick, 2=Sinclair joystick, else=Cursor keys
617C DEFB $00 Cumulative input-held counter, incremented each frame by 6186's mask value (used for key-repeat timing)
617D DEFB $BF Keyboard row snapshot (contributes bit 4 -- fire/pick-up -- to 6186 via 7EBE)
617E DEFB $BF Keyboard row snapshot (contributes bit 2 to 6186 via 7EBE)
617F DEFB $BF Keyboard row snapshot (contributes bit 1 to 6186 via 7EBE)
6180 DEFB $BF,$BF
6182 DEFB $BF Keyboard row snapshot (contributes bit 3 to 6186 via 7EBE)
6183 DEFB $BF Keyboard row snapshot (contributes bit 0 to 6186 via 7EBE)
6184 DEFB $BF Keyboard row snapshot (also contributes bit 4 -- fire/pick-up -- to 6186 via 7EBE)
6185 DEFB $00
Resolved 5-bit input mask, produced every frame by 7EBE from whichever control method $617B selects. Bit0=Right, bit1=Left, bit2=Down, bit3=Up (Kempston-port convention: reading Kempston directly copies its byte here unmodified), bit4=Fire/pick-up. Consumed by 8968 (movement -- resolved to a single direction via the table at 88F0) and 8AFB (fire button). Masked against a "previously pressed" copy at $6188 by 7EBE itself (edge-detection), and accumulated into a repeat counter at $617C.
6186 DEFB $00 Resolved input mask (bit0=Right, bit1=Left, bit2=Down, bit3=Up, bit4=Fire/pick-up) -- see N-line
6187 DEFB $00
6188 DEFB $FF Previous frame's 6186 value, used by 7EBE for key-repeat/edge detection
6189 DEFB $01
618A DEFB $00 Message-window restore timer (counts down in 9808; the room/creature title is redrawn when it expires)
618B DEFW $A930 Free-list head pointer for the dynamic object pool (A900), consumed/updated by 84AE. Its high byte (at $618C) is also read standalone as an empty/enabled check.
618D DEFW $BDAE Current sprite: data address (copied from a A5DC record by 84ED)
618F DEFB $10 Current sprite: height, in 8px rows (copied from a A5DC record by 84ED)
6190 DEFB $04,$00,$00 Current sprite: width, in 8px columns, bit 7 = flip-flop flag (copied from a A5DC record by 84ED, unmasked)
6193 DEFB $FF
6194 DEFW $0000
6196 DEFW $FFB9
6198 DEFB $42 Oil cans remaining (BCD), decremented by 6622 on pickup/use
6199 DEFB $00 Flag, set to 1 by 6622 (oil can used) -- purpose of the flag itself not confirmed
619A DEFB $1C Room number copy
619B DEFW $1C34
619D DEFB $04
619E DEFB $00 Weapon ammo count (BCD-ish, decremented by 68C1 per shot), also acts as the weapon-held flag: tested by 8AFB on fire/pick-up to decide attack vs. pick-up/drop; hitting 0 auto-drops the weapon
619F DEFB $00
61A0 DEFB $01
61A1 DEFB $00
61A2 DEFB $7F
61A3 DEFB $04
61A4 DEFB $3A,$5C
61A6 DEFB $00
61A7: JP (HL) trampoline
Used by the routine at 983C.
Used by 983C to call a dynamic object's per-frame behaviour handler
61A7 JP (HL)
61A8: Initialize the object free list: chain B 24-byte records starting at DE (each record's first word points to the next)
Used by the routine at 61C1.
Chains B records of 24 bytes each, starting at DE, writing each record's own first word as the address of the next. The last record links onto the existing free-list head at $618B instead of another new record, then $618B is updated to point at the chain's own start, prepending it to the free list.
61A8 PUSH DE Save DE, the chain's start address
61A9 DEC B B -= 1, the last record links to the existing free list instead of another new record
61AA LD HL,$0018 HL = the next record's address, current + 24 bytes
61AD ADD HL,DE
61AE EX DE,HL Write it as the current record's next-pointer, low then high byte, advance HL past it
61AF LD (HL),E
61B0 INC HL
61B1 LD (HL),D
61B2 DJNZ $61AA Loop for each record
61B4 EX DE,HL Swap back, DE = the existing free-list head at $618B
61B5 LD DE,($618B)
61B9 LD (HL),E Write it as the last record's next-pointer
61BA INC HL
61BB LD (HL),D
61BC POP HL Restore HL, the chain's start address
61BD LD ($618B),HL Store it as the new free-list head at $618B
61C0 RET
61C1: Reset object system
Used by the routine at 676D.
Clears the free/active-list pointers, then initializes two object-record free lists, at $5B00 and $A900, 8 records each, via 61A8.
61C1 LD HL,$0000
61C4 LD ($9D3C),HL
61C7 LD ($8DEF),HL
61CA LD ($618B),HL
61CD LD HL,$8DB6
61D0 LD ($610E),HL set Active object list HEAD pointer
61D3 LD DE,$5B00
61D6 LD B,$08
61D8 CALL $61A8 Initialize the object free list
61DB LD DE,$A900
61DE LD B,$08
61E0 JP $61A8 => Initialize the object free list
61E3: New-game initialization
Used by the routine at 6B05.
Resets oil/rust state, restocks the item table from a master template, clears per-level Plug Room progress and per-room flags, and zeroes the score/end-game counters.
61E3 XOR A clear rust timer 6502
61E4 LD ($6502),A
61E7 LD ($6199),A clear oil-used flag 6199
61EA LD A,$42 oil cans = 42 (BCD) 6198
61EC LD ($6198),A
61EF LD DE,$788A DE = item table base 788A, A = master item count from $7C82
61F2 LD A,($7C82)
61F5 PUSH AF *loop: save the record count
61F6 LD HL,$0004 HL = the live record, 4 bytes on from the master
61F9 ADD HL,DE
61FA LD BC,$0004 copy the 4-byte master item record over it
61FD LDIR
61FF EX DE,HL advance to the next pair, restore the count
6200 POP AF
6201 DEC A loop for each record
6202 JR NZ,$61F5
6204 LD DE,$75B6 DE = spawner table base 75B5
6207 LD A,(DE) *loop: A = this record's length byte
6208 CP $01
620A JR Z,$6219 $01 marks the table end
620C LD HL,$0001 HL = the record's flag byte (offset 1)
620F ADD HL,DE
6210 LD (HL),$01 mark it not-yet-triggered
6212 LD L,A HL = this record's length, widened
6213 LD H,$00
6215 ADD HL,DE
6216 EX DE,HL step to the next record, loop
6217 JR $6207
6219 LD HL,$5C92 zero the score and end-game counters ($611B-$6124) via LDIR from a fixed all-zero block at $5C92
621C LD DE,$611B
621F LD BC,$000A
6222 LDIR
6224 LD DE,$6CCF Room descriptions start address
6227 LD HL,$0001 per-room flag reset: HL = this room's byte1
622A ADD HL,DE
622B LD A,(HL) rotate its high nibble down
622C RRCA
622D RRCA
622E RRCA
622F RRCA
6230 CPL build a mask that clears the door bits
6231 OR $F6
6233 AND (HL) apply it to byte1
6234 LD (HL),A
6235 INC HL advance to byte3, clear its "visited" bit 7
6236 INC HL
6237 RES 7,(HL)
6239 LD A,(DE) A = this record's length byte, widened into HL
623A LD L,A
623B LD H,$00
623D ADD HL,DE advance DE past the record
623E EX DE,HL
623F LD A,(DE) read the next record's length byte
6240 CP $01
6242 JR NZ,$6227 loop until the table terminator
6244 LD HL,$7288 HL = the first level's Plug Room state byte ($7288)
6247 LD A,($72AB) B = the level count ($72AB)
624A LD B,A
624B LD DE,$0006 DE = 6, the per-level stride
624E LD (HL),$00 *loop: clear this level's state byte
6250 ADD HL,DE step to the next level, loop
6251 DJNZ $624E
6253 RET
6254: Set object position (IX+5/+6) from grid index A (cell centre: row*8+4, col*8+4)
Used by the routines at 6663, 6B05, 8E3F, 8EA7, 8EF2, 8F1E and 9341.
A -= 1 first, then column = (A AND $F8) + 4 becomes X (+5); the original A AND $07 rotated left 3 (*8) + 4 becomes Y (+6). Converts a raw 0-63 grid index into the screen-position centre of that cell.
6254 DEC A A -= 1, adjust before extracting the column bits
6255 PUSH AF Save A
6256 AND $F8 Isolate the column value and add 4 for the cell centre
6258 OR $04
625A LD (IX+$05),A Store as the object's X (IX+5)
625D POP AF Restore A, isolate the row bits
625E AND $07
6260 RLCA Multiply by 8, three left shifts, add 4 for the cell centre
6261 RLCA
6262 RLCA
6263 OR $04
6265 LD (IX+$06),A Store as the object's Y (IX+6) and return
6268 RET
6269: Set current room to A: locate its description record and build the room
Used by the routine at 676D.
Stores the room number to $6126, walks the room-description chain from room 0 (each record's own length-byte offsets to the next) to find record A, storing its address at $6127. Extracts byte1 (door/exit bitfield) to $612B, byte2's high nibble (room-type template index into 72B1) to $612A, and byte3 bit 6 (shape selector) to $6129. Clears the 64-byte room grid at $612C, stamps in the room-type template via 62C8, then overlays this room's own extra (index,value) pairs, if its description is longer than the base 4 bytes, via the same 62C8 grid-writer.
6269 LD ($6126),A set room number
626C LD B,A
626D LD HL,$6CCF Room descriptions start address
6270 LD DE,$0000
6273 JR $6277
6275 LD E,(HL) get offset to the next room description
6276 ADD HL,DE
6277 DJNZ $6275
6279 LD ($6127),HL Store room description address
627C INC HL
627D LD A,(HL)
627E LD ($612B),A
6281 INC HL
6282 LD A,(HL)
6283 RRCA
6284 RRCA
6285 RRCA
6286 RRCA
6287 AND $0F
6289 LD ($612A),A
628C INC HL
628D LD A,(HL)
628E RLCA
628F RLCA
6290 AND $01
6292 LD ($6129),A
6295 LD HL,$612C Clear room grid - 64 bytes at 612C
6298 LD DE,$612D
629B LD BC,$003F
629E LD (HL),$00
62A0 LDIR
62A2 LD HL,($612A) HL = the room-type index ($612A), widened
62A5 LD H,$00
62A7 ADD HL,HL doubled, DE = the 72B1 pointer table
62A8 LD DE,$72B1
62AB ADD HL,DE HL = this room type's table slot
62AC LD E,(HL) read the template's address from it
62AD INC HL
62AE LD D,(HL)
62AF EX DE,HL
62B0 LD B,(HL) B = the template's (index,value) pair count
62B1 DEC B empty or negative: nothing to stamp in
62B2 JR Z,$62BB
62B4 JP M,$62BB
62B7 INC HL advance past the count byte
62B8 CALL $62C8
62BB LD HL,($6127) HL = the room description, A = its length
62BE LD A,(HL)
62BF SUB $04 exactly 4 bytes: no extra (index,value) pairs
62C1 JR Z,$62F8
62C3 LD DE,$0004 skip the 4-byte header
62C6 ADD HL,DE
62C7 LD B,A B = the extra-pair count
62C8 LD E,(HL) grid-entry writer: DE = this pair's grid index
62C9 LD D,$00
62CB LD IX,$612B IX = the grid base $612B
62CF ADD IX,DE plus the index: the target cell
62D1 INC HL A = the pair's value
62D2 LD A,(HL)
62D3 LD (IX+$00),A store it into the cell, store A at (IX+0)
62D6 CP $66 dispatch on the special value: $66 -> bubble source
62D8 CALL Z,$8EA7
62DB CP $6A $6A -> bubble source (full strength)
62DD CALL Z,$8EA7
62E0 CP $67 $67 -> plant/coral
62E2 CALL Z,$8EF2
62E5 CP $69 $69 -> 8F1E
62E7 CALL Z,$8F1E
62EA CP $6B $6B -> 8F4C
62EC CALL Z,$8F4C
62EF CP $68 $68 -> rearing snake
62F1 CALL Z,$8E3F
62F4 INC HL advance to the next pair, loop B times (a special-value spawn routine can decrement B as a side effect, see 8EA7)
62F5 DEC B
62F6 DJNZ $62C8
62F8 RET
62F9: Test whether the current room is this level's Plug Room
Used by the routines at 630D, 8F1E, 8F4C, 9341, 94F4 and 952D.
Via the per-level table at $7287; returns Z if so, with HL pointing at the entry's state byte.
62F9 LD A,($6126) get room number
62FC LD B,A B = the room number, A -= 1
62FD DEC A
62FE LD HL,$7281 HL = the per-level table $7281
6301 LD DE,$0006 DE = 6, the per-level entry stride
6304 ADD HL,DE Advance to the next level's entry, subtracting 36 rooms per level, loop while still short
6305 SUB $24
6307 JR NC,$6304
6309 LD A,(HL) A = this level's title-index base, advance HL, compare against the room number
630A INC HL
630B CP B
630C RET
630D: Plug Room grid setup
Used by the routine at 676D.
For each of 4 slots in this level's delivery-state nibble, pokes marker $13 into the corresponding room-grid cell listed at $72AC when the slot's bit is set.
630D CALL $62F9 Test whether the current room is this level's Plug Room
6310 RET NZ Not the Plug Room: return
6311 LD A,(HL) A = the Plug Room's delivery-state nibble byte
6312 LD HL,$72AC HL = the per-slot grid-cell table $72AC
6315 LD BC,$612B BC = $612B, the room grid base
6318 AND $0F Isolate the low nibble, the 4 undelivered-slot bits
631A RET Z All slots delivered: return
631B RRCA Test this slot's bit, rotate into carry, skip the poke below if clear
631C JR NC,$6326
631E LD E,(HL) If set, read the cell offset (E,D) from the table
631F LD D,$00
6321 EX DE,HL
6322 ADD HL,BC Poke marker $13 into that grid cell
6323 LD (HL),$13
6325 EX DE,HL
6326 INC HL Advance to the next table entry, loop for the next slot
6327 JR $6318
6329: Build the door/exit bitfield at $612B from the room description's byte1
Used by the routine at 91A6.
Re-reads room description byte1 (at room_base+1), merges bit4 into bit0 and bit7 into bit3 (via AND $90, RRCA x4, OR), writes the result back into the room description itself AND into $612B. Bits 0-3 of the result are then tested by 6344/6377 to conditionally draw door graphics at fixed screen positions -- one bit per exit direction: bit0=North, bit1=East, bit2=South, bit3=West (see 67F1).
6329 PUSH BC Save BC, DE, HL
632A PUSH DE
632B PUSH HL
632C LD HL,($6127) HL points at the room description's byte1 (advance past the 2-byte pointer at $6127)
632F INC HL
6330 LD A,(HL) A = byte1 masked to bits 4 and 7 (the two door-exit flag bits)
6331 AND $90
6333 RRCA Rotate right 4 places, moving bits 4/7 down into bits 0/3
6334 RRCA
6335 RRCA
6336 RRCA
6337 OR (HL) OR back into byte1's other bits
6338 CP (HL) Compare against the original byte1 value
6339 LD (HL),A Store the merged value back into byte1
633A LD ($612B),A Store the same merged value into $612B, the door bitfield
633D CALL NZ,$6344 Draw single-piece doors, for $612B bits 0 and 3
6340 POP HL Restore HL, DE, BC and return
6341 POP DE
6342 POP BC
6343 RET
6344: Draw single-piece doors, for $612B bits 0 and 3
Used by the routines at 6329 and 6377.
Tests bit 0 of $612B (North), drawing one door-graphic piece via 8128 at a fixed screen position if set; then bit 3 (West), drawing a different fixed-position piece if set.
6344 LD BC,$C7C7 BC = mask/colour $C7C7, A = the door bitfield $612B
6347 LD A,($612B)
634A BIT 0,A Test bit 0 (North)
634C JR NZ,$6355 if set, skip to the alternate mask below
634E LD BC,$BBBB Otherwise BC = $BBBB, test bit 4
6351 BIT 4,A
6353 JR Z,$635E if clear, skip drawing entirely
6355 LD A,$83 A = sprite $83, D/E = the fixed screen position for the North door piece
6357 LD D,$6C
6359 LD E,$B8
635B CALL $8128 Draw sprite C with its mask at screen position DE
635E LD BC,$C7C7 BC = mask/colour $C7C7 again, A = the door bitfield
6361 LD A,($612B)
6364 BIT 3,A Test bit 3 (West)
6366 JR NZ,$636E if set, skip to the alternate mask below
6368 LD BC,$BBBB Otherwise BC = $BBBB, test bit 7
636B BIT 7,A
636D RET Z if clear, return without drawing
636E LD A,$03 A = sprite $03, D/E = the fixed screen position for the West door piece
6370 LD D,$6C
6372 LD E,$48
6374 JP $8128 => Draw sprite C with its mask at screen position DE
6377: Draw three-piece doors, for $612B bits 1 and 2
Used by the routine at 676D.
Tests bit 1 of $612B (East), drawing three door-graphic pieces via 8128 (three fixed screen positions) if set; then bit 2 (South), drawing three different fixed-position pieces if set. Calls 6344 first.
6377 CALL $6344 Draw single-piece doors, for $612B bits 0 and 3
637A LD A,($612B)
637D BIT 1,A
637F JR Z,$63A8
6381 LD A,$02
6383 LD D,$DC
6385 LD E,$C8
6387 LD BC,$BEBE
638A CALL $8128 Draw sprite C with its mask at screen position DE
638D LD A,$02
638F LD D,$D4
6391 LD E,$D8
6393 LD BC,$C1C1
6396 CALL $8128 Draw sprite C with its mask at screen position DE
6399 LD A,$02
639B LD D,$CC
639D LD E,$E8
639F LD BC,$BFBF
63A2 CALL $8128 Draw sprite C with its mask at screen position DE
63A5 LD A,($612B)
63A8 BIT 2,A
63AA RET Z
63AB LD A,$02
63AD LD D,$CC
63AF LD E,$18
63B1 LD BC,$BCBC
63B4 CALL $8128 Draw sprite C with its mask at screen position DE
63B7 LD A,$02
63B9 LD D,$D4
63BB LD E,$28
63BD LD BC,$C0C0
63C0 CALL $8128 Draw sprite C with its mask at screen position DE
63C3 LD A,$02
63C5 LD D,$DC
63C7 LD E,$38
63C9 LD BC,$BDBD
63CC CALL $8128 Draw sprite C with its mask at screen position DE
63CF RET
63D0: Clear shadow screen
Used by the routine at 676D.
Zeroes the entire shadow screen buffer, $E390 through $17FF bytes, via a single-byte seed plus LDIR fill.
63D0 LD HL,$E390 Shadow screen address
63D3 LD DE,$E391
63D6 LD BC,$17FF
63D9 LD (HL),$00
63DB LDIR
63DD RET
63DE: Data block at 63DE
63DE DEFB $E2,$63,$04,$64,$02,$7C,$14,$4C
63E6 DEFB $02,$7E,$40,$4C,$02,$7F,$6C,$4C
63EE DEFB $02,$7D,$14,$64,$82,$7C,$EC,$4C
63F6 DEFB $82,$7E,$C0,$4C,$82,$7F,$94,$4C
63FE DEFB $82,$7D,$EC,$64,$FF,$FF,$02,$7C
6406 DEFB $14,$4C,$02,$7E,$40,$4C,$82,$7D
640E DEFB $6C,$4C,$02,$7D,$14,$64,$82,$7C
6416 DEFB $EC,$4C,$82,$7E,$C0,$4C,$02,$7D
641E DEFB $94,$4C,$82,$7D,$EC,$64,$FF,$01
6426 DEFB $02,$03,$09,$0A,$0B,$11,$12,$13
642E DEFB $FF
642F: Draw the fixed wall/decoration layout selected by $6129
Used by the routine at 676D.
Uses $6129 (0 or 1) to index a 2-entry pointer table at $63DE, selecting one of two fixed layout lists. Each list has two parts: a sequence of 4-byte records (count, screen Y, screen X -- drawn via 8128) terminated by $FF, immediately followed by a sequence of single bytes (grid indices) terminated by $FF, each poked into the room grid ($612B+index, i.e. grid_offset=index-1) as solid wall ($7F). This is the source of the 3x3 solid-wall corner block seen in every room grid -- it is not part of the room-type template; it is this fixed, $6129-selected layout.
642F LD A,($6129) index the layout pointer table $63DE by $6129 (0 or 1)
6432 AND $01
6434 ADD A,A
6435 LD L,A
6436 LD H,$00
6438 LD DE,$63DE HL = the table entry address
643B ADD HL,DE
643C LD E,(HL) DE = the selected layout pointer, IX = DE
643D INC HL
643E LD D,(HL)
643F PUSH DE
6440 POP IX
6442 LD A,(IX+$00) *loop: read this entry's count, jump away at the terminator ($FF)
6445 CP $FF
6447 JR Z,$645D
6449 LD C,(IX+$01) C/B = count, DE = screen position
644C LD B,C
644D LD E,(IX+$02)
6450 LD D,(IX+$03)
6453 CALL $8128 Draw sprite C with its mask at screen position DE
6456 LD DE,$0004 advance IX by 4 (next entry), loop back
6459 ADD IX,DE
645B JR $6442
645D INC IX terminator reached: IX++ (skip the $FF), read the next byte
645F LD A,(IX+$00)
6462 CP $FF test for the outer terminator ($FF), return if done
6464 RET Z
6465 LD C,A C = grid index, B = 0
6466 LD B,$00
6468 LD HL,$612B poke solid wall ($7F) into the grid cell, loop back
646B ADD HL,BC
646C LD (HL),$7F
646E JR $645D
6470: Redraw one terrain grid cell (index in BC), used to restore terrain hidden behind an object's sprite
Used by the routines at 64F3, 9341 and 9745.
Called by 9745 (occlusion redraw) and 9341 (Plug Room item delivery). Looks up the cell's grid value in the 7556 shape table, then falls into 64BB's draw loop.
6470 PUSH AF save row (B) to $649A, C = column
6471 LD C,A
6472 LD A,B
6473 LD ($649A),A
6476 LD B,$00
6478 LD HL,$612C HL = grid cell address, read its content
647B ADD HL,BC
647C LD A,(HL)
647D CP $7F bail out if solid wall ($7F) or already-redrawn (masked $7F)
647F JP Z,$64EB
6482 AND $7F
6484 JP Z,$64EB
6487 LD A,C A = the grid column's low 3 bits
6488 AND $07
648A RLA x8 into D, the sub-cell row
648B RLA
648C RLA
648D LD D,A
648E RLA x16 + $80: E, the screen low byte
648F ADD A,$80
6491 LD E,A
6492 LD A,C A = the column, aligned down
6493 AND $F8
6495 ADD A,D plus the sub-cell row and the $88 screen base
6496 ADD A,$88
6498 LD D,A D = the screen high byte
6499 SUB $18 !!MUT-ARG!! clamp the row to a multiple of $18
649B ADD A,$18 undo the clamp test, round up if it underflowed
649D JR NC,$64A1
649F LD A,D
64A0 INC A
64A1 LD ($64CE),A store the computed screen row byte
64A4 LD A,C A = the grid column, aligned and doubled
64A5 AND $F8
64A7 RLA
64A8 NEG negated
64AA ADD A,E added to the screen low byte
64AB LD E,A
64AC LD L,(HL) HL = grid content value * 2
64AD LD H,$00
64AF ADD HL,HL
64B0 LD BC,$7556 HL = this value's slot in the 7556 shape table
64B3 ADD HL,BC
64B4 LD C,(HL) read the shape record's address from it
64B5 INC HL
64B6 LD H,(HL)
64B7 LD L,C
64B8 LD B,(HL) B = its piece count
64B9 JR $64E8 fall into 64BB's draw loop
64BB: Draw loop shared with 6470: resolve a grid/terrain value to a sprite via the 74CE/750B tables and draw it
For a grid cell whose terrain value (A) resolves via 9AAB/$750B to a sprite/column entry, computes a screen sub-position threshold against $D0 to pick between adjacent sprite variants, then draws it via 8128 with colour 0, adjusting the returned D (screen row-delta) via a small per-entry table before looping across the row, count B, called by 6470 for each terrain cell.
64BB PUSH BC save BC/HL, A = grid value
64BC PUSH HL
64BD LD A,(HL)
64BE CALL $9AAB Search the (key,data) pair table at $74CE for key A
64C1 LD C,(HL) BC = the lookup result
64C2 LD B,$00
64C4 LD HL,$750B HL = the 750B table
64C7 ADD HL,BC plus BC * 3, its entry size
64C8 ADD HL,BC
64C9 ADD HL,BC
64CA LD C,A C = column index, A = the screen row minus the shape-table byte
64CB LD A,D
64CC SUB (HL)
64CD CP $D0 !!MUT-ARG!! compare against a $D0 threshold
64CF JR NC,$64E5 branch on the threshold result
64D1 LD A,C
64D2 AND A
64D3 LD A,D
64D4 JR Z,$64E4
64D6 INC HL D -= next table byte
64D7 LD A,D
64D8 SUB (HL)
64D9 LD D,A
64DA LD A,$00 A = 0 (colour parameter)
64DC CALL $8128 Draw sprite C with its mask at screen position DE
64DF JR C,$64ED branch on the draw result
64E1 LD A,D adjust D via the mask table
64E2 ADD A,(HL)
64E3 DEC HL
64E4 SUB (HL)
64E5 LD D,A restore D, HL, BC
64E6 POP HL
64E7 POP BC
This entry point is used by the routine at 6470.
64E8 INC HL advance, loop 64BB count (B) times
64E9 DJNZ $64BB
This entry point is used by the routine at 6470.
64EB POP AF restore AF, return
64EC RET
64ED JR Z,$64E1 alternate branch: adjust and rejoin the exit path
64EF POP HL
64F0 POP HL
64F1 JR $64EB
64F3: Redraw the whole room's terrain grid
Used by the routine at 676D.
Loops A from 0 up to $3F, all 64 grid cells, with B fixed at $17, calling 6470 once per cell to redraw it.
64F3 XOR A
64F4 LD B,$17
64F6 CALL $6470 Redraw one terrain grid cell (index in BC), used to restore terrain hidden behind an object's sprite
64F9 INC A
64FA CP $40
64FC JR C,$64F4
64FE RET
64FF: Data block at 64FF
64FF DEFB $32
6500 DEFB $01 Oil level??
6501 DEFB $00 Rust/oil timer -- reset to 0 (full oil) by 6622 on using an oil can; per the game instructions, rust accumulates on contact with water and is reversed by oil
6502 DEFB $00 Oil level??
6503: Per-frame rust/oil tick: advances the rust timer, killing the player at $52
Used by the routine at 6B71.
Does nothing if a game-over flag ($617A) is set, or in rooms 1/2 (ending/menu). If the oil-used flag ($6199) is set, just calls 6580 to tick the gauge display. Otherwise decrements a countdown at $6501, and every time it wraps, decrements a cycle counter at $6500; when that hits zero, reloads it from $64FF and increments the rust level at $6502. Once rust reaches $52, the player is killed: switches the player's per-frame handler to $8C48 and sets the game-over flag.
6503 LD A,($617A)
6506 AND A
6507 RET NZ POKE 201 (RET) here for infinite Oil
6508 LD A,($6126) get room number
650B CP $01
650D RET Z
650E CP $02
6510 RET Z
6511 LD A,($6199)
6514 AND A
6515 JP NZ,$6580 => Tick the rust/oil gauge
6518 LD HL,$6501
651B DEC (HL)
651C JP P,$6529
651F INC (HL)
6520 LD HL,$6500
6523 DEC (HL)
6524 RET NZ
6525 LD A,($64FF)
6528 LD (HL),A
6529 LD HL,$6502
652C INC (HL)
652D LD A,(HL)
652E CP $52
6530 JR C,$6543 => Draw one rust-gauge segment
6532 DEC (HL)
6533 LD HL,$8C48
6536 LD ($8DB9),HL set player behaviour-handler pointer
6539 LD A,$01
653B LD ($617A),A
653E RET
653F: Data block at 653F
653F DEFB $B5,$B6,$B7,$B8
6543: Draw one rust-gauge segment: compute its screen column from A and its sprite from table $653F, then draw via 8128
Used by the routines at 6503 and 655E.
Screen column comes from A rotated into a fixed base ($AD, masked to 4-pixel steps); the sprite number is looked up in a 4-entry table at $653F, indexed by (A+1) AND $03, so the segment's appearance cycles through 4 sprite variants as the gauge fills. Draws via 8128 with a fixed row/mask setup (B=C=the looked-up sprite, colour 5).
6543 LD B,A B = the gauge position parameter A
6544 ADD A,$AD Compute the screen column: add $AD and mask to a 4-pixel boundary
6546 AND $FC
6548 LD E,A DE = the column address, high byte fixed at $FC
6549 LD D,$FC
654B LD A,B A = the saved position, compute (A+1) AND 3, the 4-way sprite-variant index
654C ADD A,$01
654E AND $03
6550 LD C,A
6551 LD B,$00 BC = the index, HL = the sprite-variant table $653F
6553 LD HL,$653F
6556 ADD HL,BC Look up the sprite number, C = B = that value
6557 LD C,(HL)
6558 LD B,C
6559 LD A,$05 A = 5, the colour parameter
655B JP $8128 => Draw sprite C with its mask at screen position DE
655E: Draw the rust/oil gauge: base icon plus repeated 6543 icons, scaled by the rust timer $6502
Used by the routines at 6580 and 676D.
Draws a fixed base icon, sprite $C5 colour 3, at $FCD4, then repeated rust-gauge segments via 6543 at increasing positions, A stepping by 3, up to the rust timer $6502, finishing with one more segment at the timer's exact value unless it's already zero.
655E LD DE,$FCD4
6561 LD B,$C5
6563 LD C,B
6564 LD A,$03
6566 CALL $8128 Draw sprite C with its mask at screen position DE
6569 LD A,$01
656B LD HL,$6502
656E CP (HL)
656F JR NC,$657A
6571 PUSH AF
6572 CALL $6543 Draw one rust-gauge segment
6575 POP AF
6576 ADD A,$03
6578 JR $656B
657A LD A,(HL)
657B AND A
657C RET Z
657D JP $6543 => Draw one rust-gauge segment
6580: Tick the rust/oil gauge
Used by the routine at 6503.
Decrements timer $6502 by up to 2 and redraws via 655E, or when already zero, clears the oil-used flag $6199.
6580 LD HL,$6502
6583 LD A,(HL)
6584 AND A
6585 JR Z,$658F
6587 DEC (HL)
6588 JP Z,$655E => Draw the rust/oil gauge
658B DEC (HL)
658C JP $655E => Draw the rust/oil gauge
658F LD ($6199),A
6592 RET
6593: Draw the message window's border/frame: corner icon plus 8-wide top and bottom edge strips, all via 8128
Used by the routine at 676D.
Draws the window's top-left corner icon at $EC2C, then two 8-wide edge strips: the top edge starting at $C408 stepping +8,+16 per tile, and the bottom edge starting at $C4F8 stepping +8,-16 per tile, all via 8128.
6593 LD DE,$EC2C DE = the corner icon's screen position $EC2C, B = C = its sprite $C8
6596 LD B,$C8
6598 LD C,B
6599 LD A,$02 A = 2, the colour parameter
659B CALL $8128 Draw sprite C with its mask at screen position DE
659E LD DE,$C408 DE = the top-edge start position $C408, B = C = sprite $C3, H = 8, the tile count
65A1 LD B,$C3
65A3 LD C,B
65A4 LD H,$08
65A6 LD A,$02 A = 2, the colour parameter
65A8 CALL $8128 Draw sprite C with its mask at screen position DE
65AB LD A,D advance the screen row by 8
65AC ADD A,$08
65AE LD D,A
65AF LD A,E advance the screen column by 16
65B0 ADD A,$10
65B2 LD E,A
65B3 DEC H Decrement the tile count, loop for the top edge
65B4 JR NZ,$65A6
65B6 LD DE,$C4F8 DE = the bottom-edge start position $C4F8, B = C = sprite $C4, H = 8
65B9 LD B,$C4
65BB LD C,B
65BC LD H,$08
65BE LD A,$02 A = 2, the colour parameter
65C0 CALL $8128 Draw sprite C with its mask at screen position DE
65C3 LD A,D advance the screen row by 8
65C4 ADD A,$08
65C6 LD D,A
65C7 LD A,E step the screen column back by 16
65C8 SUB $10
65CA LD E,A
65CB DEC H Decrement the tile count, loop for the bottom edge
65CC JR NZ,$65BE
65CE RET
65CF: Data block at 65CF
65CF DEFB $16,$01,$A4,$5E
65D3 DEFB $16,$01,$B4,$5E
65D7 DEFW $7441
65D9 DEFW $0000
65DB: Draw message window: room/creature title line + rotating clue/joke message line
Used by the routine at 676D.
Prints the fixed "DEATHBOWL" banner via 65CF's prefix, then computes and prints this room's title string, looked up in a table at $73B5 indexed by the room description's byte3 low 6 bits (title index) times 8. Follows with a second, rotating clue/joke message line from a pointer at $65D7 (wrapping to $7441 at the $FF terminator), advancing that pointer by $14, one entry, each call so successive room visits cycle through the message list.
65DB LD HL,$65CF
65DE CALL $7D68 Print string routine
65E1 LD HL,($6127)
65E4 LD DE,$0003
65E7 ADD HL,DE
65E8 LD A,(HL)
65E9 AND $3F
65EB LD L,A
65EC LD H,$00
65EE ADD HL,HL
65EF LD C,L
65F0 LD B,H
65F1 ADD HL,HL
65F2 ADD HL,HL
65F3 ADD HL,BC
65F4 ADD HL,BC
65F5 ADD HL,BC
65F6 LD DE,$73B5 " DEATHBOWL "
65F9 ADD HL,DE
65FA LD ($65D9),HL
65FD CALL $7D68 Print string routine
6600 LD HL,$65D3
6603 CALL $7D68 Print string routine
6606 LD HL,($65D7)
6609 LD A,$FF
660B CP (HL)
660C JR NZ,$6614
660E LD HL,$7441
6611 LD ($65D7),HL
6614 CALL $7D68 Print string routine
6617 LD HL,($65D7)
661A LD DE,$0014
661D ADD HL,DE
661E LD ($65D7),HL
6621 RET
6622: Use an oil can (kind $6E pickup, see 8AFB): resets rust timer, decrements oil-can count, plays sound
Used by the routine at 8AFB.
Sets $6199=1, resets the rust/oil timer $6501 to 0 (full), decrements oil-can count $6198 (BCD), calls $6646 (unidentified), plays sound effect $09.
6622 LD A,$01 Set the oil-used flag $6199
6624 LD ($6199),A
6627 XOR A Clear the rust timer $6501
6628 LD ($6501),A
662B LD HL,$6198 HL = the oil-can count $6198, decrement it in BCD
662E LD A,(HL)
662F SUB $01
6631 DAA
6632 LD (HL),A
6633 CALL $6646
6636 LD A,$09 A = sound effect $09
6638 JP $848E => Request sound effect A
663B: Draw the oil-can icon and its remaining count on HUD ($6198)
Used by the routine at 676D.
Draws the fixed oil-can icon, sprite $6E colour 5, at screen position $D408 via 8128, then prints the remaining oil-can count from $6198 as a BCD number via 854F.
663B LD DE,$D408
663E LD B,$6E
6640 LD C,B
6641 LD A,$05
6643 CALL $8128 Draw sprite C with its mask at screen position DE
This entry point is used by the routine at 6622.
6646 CALL $850E Print an inline string embedded right after the caller's CALL instruction
6649 DEFM $16,$13,$03,$5E cursor position only, no visible text
664D LD A,($6198)
6650 JP $854F => Print BCD byte A as two digits, high digit blanked to a space if zero
6653: Prepare room with color 0
Used by the routine at 676D.
Sets colour to 0 and jumps into 69AC to draw the room's background.
6653 XOR A
6654 JP $69AC => Draw the room's background
6657: Get room color from room description and store to 6175
Used by the routine at 676D.
Reads byte3 of the current room description ($6127+3), masks to the low nibble, colour, ignoring the size bits, and stores it to $6175.
6657 LD HL,($6127) get room description address
665A INC HL
665B INC HL
665C LD A,(HL) get Byte 3: Room colour and Room Size
665D AND $0F color only
665F LD ($6175),A Store room color
6662 RET
6663: Spawn the room's creature (dynamic object)
Used by the routines at 66CE and 8AFB.
Fires during room build. Passes IX=$8DEF (the creature insertion point -- see 8DB6) into 84AE, so the creature is spliced into the active object list right after the fixed records, i.e. processed after the player. Handler is 9341.
6663 PUSH BC
6664 PUSH HL
6665 LD IX,$8DEF
6669 CALL $84AE Dynamic object allocator
666C DEFW $9341 Dynamic object handler address (9341)
666E POP HL
666F PUSH HL
6670 LD (IX+$0E),L
6673 LD (IX+$0F),H
6676 INC HL
6677 LD A,(HL)
6678 INC HL
6679 CALL $6254 Set object position (IX+5/+6) from grid index A
667C LD A,(HL)
667D INC HL
667E LD (IX+$07),A
6681 LD A,(HL)
6682 LD (IX+$08),A
6685 CALL $9AAB Search the (key,data) pair table at $74CE for key A
6688 LD A,(HL)
6689 LD (IX+$0A),A
668C CALL $9A60 Dynamic object finalizer
668F POP HL
6690 POP BC
6691 RET
6692: Insert a record pointer (DE) into the draw queue (60EC), sorted by the record's offset+2 byte
Used by the routine at 6728.
Insertion-sorts DE into the queue, keeping it ordered by each record's offset+2 byte (normally the "owning room" field elsewhere -- its role as a sort key here isn't confirmed). Shifts later entries down to make room; consumed by 9900.
6692 PUSH BC save BC/HL, DE = the new record pointer, IX = queue base $60EC, A = queue count
6693 PUSH HL
6694 EX DE,HL
6695 LD IX,$60EC
6699 LD A,($60EB)
669C AND A
669D JR Z,$66C1 branch to the append path if the queue is empty
669F PUSH AF *loop: save the count
66A0 LD L,(IX+$00) HL = this queue entry's record pointer
66A3 LD H,(IX+$01)
66A6 INC HL advance both pointers to the records' offset+2
66A7 INC HL
66A8 INC DE
66A9 INC DE compare the two records' sort fields
66AA LD A,(DE)
66AB CP (HL)
66AC DEC DE restore both pointers to their record bases
66AD DEC DE
66AE DEC HL
66AF DEC HL
66B0 JR NC,$66B9 skip the shift if not before this entry, else shift this entry's pointer up one slot
66B2 EX DE,HL
66B3 LD (IX+$00),L
66B6 LD (IX+$01),H
66B9 INC IX advance to the next queue slot
66BB INC IX
66BD POP AF restore the count, loop
66BE DEC A
66BF JR NZ,$669F
66C1 LD (IX+$00),E store the new record pointer into the current queue slot
66C4 LD (IX+$01),D
66C7 LD HL,$60EB increment the queue count
66CA INC (HL)
66CB POP HL restore HL/BC, return
66CC POP BC
66CD RET
66CE: Room build: spawn each active object then settle it to the ground (height field +0x07, via collision test 9BF0)
Used by the routine at 6728.
Saves and clears a global "building" flag byte at $8DB8 for the duration. For each active object (count $60EB, records at $60EC), calls 6663 to spawn/refresh it, then settles its height field (+0x07) toward the ground: decrements by 4 with a 9BF0 collision test each step while above $18, or increments by 4 while blocked below $18, clamping to whichever bound clears the test. Clears bit 7 of the flags byte (+0x0D) and writes the settled height into the record's linked height-shadow field (offset+2 via +0x0E/+0x0F), then restores $8DB8 on completion. Called after 6728 queues the room's items.
66CE LD HL,$8DB8 HL = the "building" flag byte $8DB8
66D1 LD A,(HL) Save its value, clear it to 0
66D2 PUSH AF
66D3 LD (HL),$00
66D5 LD A,($60EB) B = the active-object count from $60EB
66D8 AND A
66D9 JR Z,$6723 If zero, nothing to build, skip to the end
66DB LD B,A B = count, IX = the active-object record-pointer list at $60EC
66DC LD IX,$60EC
66E0 PUSH BC Save BC, the outer loop counter
66E1 PUSH IX Save IX, load the record pointer into HL
66E3 LD L,(IX+$00)
66E6 LD H,(IX+$01) HL = the record pointer
66E9 CALL $6663 Spawn the room's creature
66EC LD A,(IX+$07) Decrement the height field (+0x07) by 4
66EF SUB $04
66F1 LD (IX+$07),A
66F4 CP $18 Compare against the rest height $18, skip the extra push below if still above it
66F6 JR C,$66FD
66F8 CALL $9BF0 Collision test
66FB JR NC,$66EC Loop back while still settling
66FD LD A,(IX+$07) Blocked: increment the height field (+0x07) by 4 instead
6700 ADD A,$04
6702 LD (IX+$07),A
6705 CALL $9BF0 Collision test
6708 JR C,$66FD Loop back while still blocked
670A LD (IX+$0D),$00 Clear bit 7 of the flags byte (+0x0D)
670E LD L,(IX+$0E) HL = the record's linked height-shadow field (offset+2 via +0x0E/+0x0F)
6711 LD H,(IX+$0F)
6714 INC HL
6715 INC HL
6716 LD A,(IX+$07) Write the settled height into it
6719 LD (HL),A
671A POP IX Restore IX, advance it past this record
671C INC IX
671E INC IX
6720 POP BC Restore BC, loop for the next object
6721 DJNZ $66E0
6723 POP AF Restore the saved flag byte, write it back to $8DB8
6724 LD ($8DB8),A
6727 RET
6728: Queue this room's dropped items for drawing
Used by the routine at 676D.
Scans the item table at $788A for entries in the current room, inserting each via 6692, then builds the room.
6728 XOR A
6729 LD ($60EB),A
672C LD HL,$788A
672F LD BC,($7C81)
6733 LD A,($6126) get room number
6736 CP (HL)
6737 CALL Z,$6692 Insert a record pointer (DE) into the draw queue (60EC), sorted by the record's offset+2 byte
673A LD DE,$0008
673D ADD HL,DE
673E DJNZ $6733
6740 JP $66CE => Room build
6743: Draw the room title, awarding a first-visit bonus the first time this room is entered
Used by the routine at 676D.
Tests bit 7 of the room description's byte3 (a "room already visited" flag, distinct from bit 6's shape selector and bits 0-5's title index -- see Room-Format.md section 4). If not yet set: marks it, draws the title via 88D7, and adds 5 (BCD) to a counter at $6120/$6121. If already visited, just draws the title via 88DD (no bonus).
6743 LD HL,($6127) HL = room description byte3 (address + 3)
6746 INC HL
6747 INC HL
6748 INC HL
6749 BIT 7,(HL) test the "room visited" flag (bit 7), skip the bonus if already set
674B JR NZ,$6765
674D SET 7,(HL) mark the room as visited (set bit 7)
674F LD IY,$7C9A draw the room title (first-visit variant) via 88D7
6753 CALL $88D7
6756 LD HL,$6120 HL = the BCD bonus counter $6120
6759 LD A,(HL)
675A ADD A,$05 add 5, store
675C DAA
675D LD (HL),A
675E INC HL A = the counter's high byte
675F LD A,(HL)
6760 ADC A,$00 add the carry in, BCD-adjust
6762 DAA
6763 LD (HL),A store it back
6764 RET
6765 LD IY,$7C9A already-visited path: IY = title data $7C9A
6769 CALL $88DD Subtract a BCD value from the score, value from a circular queue via 88B9
676C RET
676D: Draw current room
Used by the routines at 6B05 and 97FC.
Draw the full room (walls, doors, message window, creatures/objects) -- or the reduced special-room variant for rooms $01/$02
Rooms $01 and $02 are the only two type $E rooms, and are special "no walls" rooms (see 6CCF -- room $01 is the ending/winning room). At 67AB, this routine checks if the current room ($6126) is 1 or 2 and, if so, skips straight to 67E0, bypassing: the wall/layout draw (642F), door-graphic draw (6377), the message window (65DB), and several creature/object placement calls (6593/$655E/$663B/$6743/$8F82/$6895/$885A). The room's grid contents (rocks/seaweed etc, from its type $E template) still get drawn via a separate, non-skipped path -- consistent with the "just floating rocks and seaweed, no walls" appearance of room $01. Room $01 additionally gets one extra call, 86CC (CALL Z at 67E8, gated on room==1 specifically, not room==2) -- draws the "DEATHBOWL DIVINED" end-game stats overlay (see 86CC).
676D LD ($8DB8),A
6770 LD ($8E11),A
6773 LD ($8E29),A
6776 LD A,($6126) get room number
6779 LD ($619A),A
677C LD A,($8DC1)
677F LD ($619D),A
6782 XOR A
6783 LD ($6193),A
6786 LD ($618A),A
6789 LD IX,$8DB6
678D CALL $9A49 Snap the object's position (IX+5/+6) to its grid-cell centre, then finalize via 9A60
6790 LD HL,($8DBB)
6793 LD ($619B),HL
6796 CALL $61C1 Reset object system
6799 LD A,($8DB8)
679C CALL $6269 Set current room to A
679F CALL $630D Plug Room grid setup
67A2 CALL $7FC0 Reset the sprite-draw clip window ($610A-$610D) to the full play-field
67A5 CALL $7F8E Reset the redraw bounding-box trackers ($6194-$6197) to empty
67A8 CALL $63D0 Clear shadow screen
67AB LD A,($6126) get Room number
67AE CP $01 if room $6126 is 1 or 2, skip to 67E0 (special "no walls" room -- see 676D)
67B0 JR Z,$67E0
67B2 CP $02
67B4 JR Z,$67E0
67B6 CALL $642F Draw the fixed wall/decoration layout selected by $6129
67B9 CALL $64F3 Redraw the whole room's terrain grid
67BC CALL $6593 Draw the message window's border/frame
67BF CALL $6377 Draw three-piece doors, for $612B bits 1 and 2
67C2 CALL $655E Draw the rust/oil gauge
67C5 CALL $65DB Draw message window
67C8 CALL $663B Draw the oil-can icon and its remaining count on HUD
67CB CALL $6743 Draw the room title, awarding a first-visit bonus the first time this room is entered
67CE CALL $6653 Prepare room with color 0
67D1 CALL $6657 Get room color from room description and store to 6175
67D4 CALL $8F82 Spawn room-membership-gated decoration pairs
67D7 CALL $6895 Draw the currently-held item's icon, and its ammo count if it's a weapon, on HUD
67DA CALL $885A Redraw the score display on HUD
67DD JP $6728 => Queue this room's dropped items for drawing
Special-room path for rooms $01/$02: skips walls/doors/message-window/most creature calls; room $01 additionally calls 86CC (likely the end-game stats overlay)
67E0 CALL $64F3 Redraw the whole room's terrain grid
67E3 LD A,($6126) get Room number
67E6 CP $01
67E8 CALL Z,$86CC Draw the end-game stats screen
67EB CALL $6653 Prepare room with color 0
67EE JP $6657 => Get room color from room description and store to 6175
67F1: Attempt to move to an adjacent room (horizontal, via a door) in the direction given by ($8DC1)
Used by the routine at 8AD9.
Reads a direction code from ($8DC1) -- 1, 2, 4, or else (fallback case) -- and for each, tests one bit of the door bitfield at 612B via HL (set to $612B just before this dispatch) before allowing the move: bit 0 (direction code 1) gates "room number - 6" (row-1, NORTH); bit 1 (direction code 4) gates "room number + 1" (col+1, EAST); bit 2 (direction code 2) gates "room number + 6" (row+1, SOUTH); bit 3 (the fallback case) gates "room number - 1" (col-1, WEST). Also does on-screen player-position bounds checks (against D/E, likely screen row/col) before allowing the move, presumably to require the player to be near the room edge on that side. 97FC is called with the new room number to actually perform the transition.
67F1 LD A,($8DBD)
67F4 CP $29
67F6 JP NC,$687E
67F9 LD HL,$612B
67FC LD DE,($8DBB)
6800 LD A,($8DC1)
6803 CP $01
6805 JR NZ,$6827
6807 BIT 0,(HL)
6809 JR Z,$687E
680B LD A,E
680C CP $03
680E JR NC,$687E
6810 LD A,D
6811 CP $18
6813 JR C,$687E
6815 CP $20
6817 JR NC,$687E
6819 LD A,($6126) get room number
681C SUB $06 change room number: -6 (row-1, move NORTH)
681E LD E,$3C
6820 LD ($8DBB),DE
6824 JP $97FC => Change current room to A = new room number
6827 CP $04
6829 JR NZ,$6845
682B BIT 1,(HL)
682D JR Z,$687E
682F LD A,D
6830 CP $3D
6832 JR C,$687E
6834 LD A,E
6835 CP $18
6837 JR C,$687E
6839 CP $20
683B JR NC,$687E
683D LD A,($6126) get room number
6840 INC A change room number: +1 (col+1, move EAST)
6841 LD D,$04
6843 JR $6820
6845 CP $02
6847 JR NZ,$6864
6849 BIT 2,(HL)
684B JR Z,$687E
684D LD A,E
684E CP $3D
6850 JR C,$687E
6852 LD A,D
6853 CP $18
6855 JR C,$687E
6857 CP $20
6859 JR NC,$687E
685B LD A,($6126) get room number
685E ADD A,$06 change room number: +6 (row+1, move SOUTH)
6860 LD E,$04
6862 JR $6820
6864 BIT 3,(HL)
6866 JR Z,$687E
6868 LD A,D
6869 CP $03
686B JR NC,$687E
686D LD A,E
686E CP $18
6870 JR C,$687E
6872 CP $20
6874 JR NC,$687E
6876 LD A,($6126) get room number
6879 DEC A change room number: -1 (col-1, move WEST)
687A LD D,$3C
687C JR $6820
687E AND A
687F RET
6880: Count item-table entries whose room byte matches A
Used by the routine at 8AFB.
Walks the item table at $788A (count from $7C81, entry stride 8), counting entries whose room byte equals A, returning the count in A. Used to check how many of a room's dropped items remain.
6880 LD HL,$788A HL = the item table $788A
6883 LD DE,$0008 DE = the entry stride, 8 bytes
6886 LD BC,($7C81) BC = the table's entry count
688A LD C,$00 C = 0, the match counter
688C CP (HL) Compare A against this entry's room byte
688D JR NZ,$6890 If different, skip the increment below
688F INC C Match: C += 1
6890 ADD HL,DE Advance to the next entry, loop
6891 DJNZ $688C
6893 LD A,C A = the match count, return
6894 RET
6895: Draw the currently-held item's icon, and its ammo count if it's a weapon, on HUD
Used by the routines at 676D, 68C1 and 8AFB.
Draws the sprite from the held-item record (6110, offset +3) at fixed HUD position $D4F8 via 8128, then checks (via 88E3) whether it's a weapon; if so also prints its ammo count (619E, BCD) via 854F.
6895 LD HL,($6110)
6898 LD DE,$D4F8
689B LD BC,$0003
689E ADD HL,BC
689F LD C,(HL)
68A0 LD B,C
68A1 LD A,B
68A2 LD A,$05
68A4 CALL $8128 Draw sprite C with its mask at screen position DE
68A7 LD A,(HL)
68A8 CALL $88E3 Search the buffer at $7C83 for byte A
68AB RET NZ
68AC JP $68AF
This entry point is used by the routine at 68C1.
68AF PUSH HL
68B0 PUSH BC
68B1 CALL $850E Print an inline string embedded right after the caller's CALL instruction
68B4 DEFM $16,$13,$1C,$5E cursor position only, no visible text
68B8 LD A,($619E) get Weapon-held flag
68BB CALL $854F Print BCD byte A as two digits, high digit blanked to a space if zero
68BE POP BC
68BF POP HL
68C0 RET
68C1: Consume one shot of ammo; auto-drop the weapon when empty
Used by the routine at 8D8D.
Decrements 619E (ammo, BCD); if still nonzero, just redraws the HUD ammo count. If it reached 0: clears the HUD digits, resets 6110 (held item) to the "empty hands" sentinel 788A, and redraws the HUD icon via 6895.
68C1 LD HL,$619E
68C4 LD A,(HL)
68C5 SUB $01
68C7 DAA
68C8 LD (HL),A
68C9 JP NZ,$68AF
68CC CALL $850E Print an inline string embedded right after the caller's CALL instruction
68CF DEFM $16,$13,$1C," ",$5E two spaces at cursor position
68D5 LD HL,$788A
68D8 LD ($6110),HL
68DB JP $6895 => Draw the currently-held item's icon, and its ammo count if it's a weapon, on HUD
68DE: Data block at 68DE
68DE DEFB $04,$58,$06,$1C,$01,$C0,$58,$0E
68E6 DEFB $20,$01,$80,$5A,$04,$18,$01,$98
68EE DEFB $5A,$04,$08,$02,$00,$58,$06,$04
68F6 DEFB $01,$18,$58,$04,$08,$01,$20,$5A
68FE DEFB $07,$02,$04,$42,$5A,$06,$02,$04
6906 DEFB $64,$5A,$05,$02,$04,$86,$5A,$04
690E DEFB $02,$04,$A8,$5A,$03,$02,$04,$CA
6916 DEFB $5A,$02,$02,$04,$EC,$5A,$01,$02
691E DEFB $04,$3E,$5A,$07,$02,$04,$5C,$5A
6926 DEFB $06,$02,$04,$7A,$5A,$05,$02,$04
692E DEFB $98,$5A,$04,$02,$04,$B6,$5A,$03
6936 DEFB $02,$04,$D4,$5A,$02,$02,$04,$F2
693E DEFB $5A,$01,$02,$04,$E0,$59,$02,$02
6946 DEFB $02,$02,$5A,$02,$02,$02,$24,$5A
694E DEFB $02,$02,$02,$46,$5A,$02,$02,$02
6956 DEFB $68,$5A,$02,$02,$02,$8A,$5A,$02
695E DEFB $02,$02,$AC,$5A,$02,$02,$02,$CE
6966 DEFB $5A,$02,$02,$02,$D0,$5A,$02,$02
696E DEFB $02,$B2,$5A,$02,$02,$02,$94,$5A
6976 DEFB $02,$02,$02,$76,$5A,$02,$02,$02
697E DEFB $58,$5A,$02,$02,$02,$3A,$5A,$02
6986 DEFB $02,$02,$1C,$5A,$02,$02,$02,$FE
698E DEFB $59,$02,$02,$02,$00,$00,$00,$00
6996 DEFB $00
6997: Message at 6997
6997 DEFM "EGCFDFEABGBBAGCBDDBCF"
69AC: Draw the room's background
Used by the routines at 6653 and 9C35.
Input
A Room color
Fills the diamond floor/border with the room colour, special-cased for room 1 (ending screen) and room 2 (menu screen).
69AC AND $07 build the border attribute byte (room colour OR $40), store to $6175, enable interrupts
69AE OR $40
69B0 LD ($6175),A
69B3 EI
69B4 LD HL,$5C78 HL = frame counter $5C78 (system variable)
69B7 LD A,(HL) wait for the next frame interrupt
69B8 CP (HL)
69B9 JR Z,$69B8
69BB PUSH IX save IX, A = room colour
69BD LD A,($6175)
69C0 AND $07 A = room colour
69C2 LD C,A
69C3 ADD A,A multiply it by 3, the per-colour table's entry size
69C4 ADD A,C
69C5 LD C,A
69C6 LD B,$00 BC = the offset, HL = the per-colour table $6994
69C8 LD HL,$6994
69CB ADD HL,BC test the table entry
69CC AND A
69CD JR Z,$69DF branch to $69DF if empty
69CF LD A,($6126) get room number
69D2 CP $01 room 1: ending-screen attribute prep
69D4 JP Z,$6A32
69D7 CP $02 room 2: menu-screen attribute prep
69D9 JP Z,$6A7E
69DC JP $69E2
69DF LD HL,$6175 HL = $6175 (fallback path, no per-colour table entry)
69E2 LD DE,$6176 DE = $6176
69E5 LDI copy the 3-byte room-colour record
69E7 LDI
69E9 LDI
69EB LD IX,$68DE IX = wall-piece table $68DE
69EF LD L,(IX+$00) read this entry's screen address (IX+0/1)
69F2 LD H,(IX+$01)
69F5 LD A,H stop the loop at the table terminator
69F6 OR L
69F7 JR Z,$6A2F
69F9 LD B,(IX+$04) B = row count (IX+4)
69FC LD DE,$6174 DE = $6174
69FF INC DE advance DE by B, read a colour byte from the table row
6A00 DJNZ $69FF
6A02 LD A,(DE) read and store the row colour for the fill below
6A03 LD ($6A1A),A
6A06 LD A,(IX+$03) A = column count (IX+3) minus 1
6A09 DEC A
6A0A LD ($6A1F),A store it as the LDIR count below
6A0D NEG negate and add $20: the row stride
6A0F ADD A,$20
6A11 LD ($6A23),A
6A14 LD A,(IX+$02) A = paint count (IX+2), B = 0
6A17 LD B,$00
6A19 LD (HL),$40 !!MUT-ARG!! *loop: poke attribute pattern $40 into the current cell
6A1B LD E,L DE = HL+1
6A1C LD D,H
6A1D INC DE
6A1E LD C,$01 !!MUT-ARG!! C = 1
6A20 LDIR copy the row's pattern via LDIR
6A22 LD C,$1F !!MUT-ARG!! advance HL by the row stride ($1F), loop A times
6A24 ADD HL,BC
6A25 DEC A
6A26 JR NZ,$6A19
6A28 LD BC,$0005 advance IX to the next table entry (5 bytes), loop back
6A2B ADD IX,BC
6A2D JR $69EF
6A2F POP IX restore IX, return
6A31 RET
6A32 LD HL,$5800 Screen attribute area start address
6A35 LD DE,$5801
6A38 LD (HL),$03 fill an 8-byte striped block
6A3A LD BC,$0008
6A3D LDIR spread it via LDIR
6A3F LD A,($6175) A = room colour, seed the next cell with it
6A42 LD (HL),A
6A43 LD BC,$0004 BC = 4
6A46 LDIR spread it
6A48 LD (HL),$03 fill a further $13-cell striped block
6A4A LD BC,$0013
6A4D LDIR spread it
6A4F LD HL,$5800 copy that pattern across the whole screen attribute area
6A52 LD BC,$0100
6A55 LDIR
6A57 LD HL,$5920
6A5A LD DE,$5921
6A5D LD (HL),A fill the message-window block with room colour
6A5E LD BC,$000E
6A61 LDIR spread it
6A63 LD (HL),$03 fill the following block with the striped pattern
6A65 LD BC,$0011
6A68 LDIR spread it
6A6A LD HL,$5920 copy the whole $40-byte pattern block forward
6A6D LD BC,$0040
6A70 LDIR spread it
6A72 LD L,E HL = DE, advance DE past it
6A73 LD H,D
6A74 INC DE
6A75 LD (HL),A
6A76 LD BC,$017F
6A79 LDIR
6A7B JP $6A2F
6A7E LD HL,$5800 room 2: HL/DE = the screen attribute area $5800
6A81 LD DE,$5801
6A84 LD BC,$02FF BC = the whole area
6A87 LD A,($6175) A = room colour, seed the first cell
6A8A LD (HL),A
6A8B LDIR
6A8D LD HL,$5800 HL/DE = $5800 again
6A90 LD DE,$5801
6A93 LD BC,$011F fill $11F cells with the fixed pattern $45
6A96 LD (HL),$45
6A98 LDIR spread it
6A9A LD HL,$5954 HL = the second block $5954
6A9D LD DE,$5955
6AA0 LD BC,$000B
6AA3 LD (HL),$45
6AA5 LDIR
6AA7 JP $6A2F
6AAA: Interrupt service routine: advance the frame counter, drive the AY music chip, then run per-frame game logic
Increments the ROM frame counter $5C78, and unless sound is disabled ($61A0), drives the 128K AY sound chip via port $7FFD and the ROM's PLAY_SOUND routines ($F424/$F427) to advance the music. Calls 6AFB for the actual per-frame game update, then restores everything and re-enables interrupts.
6AAA PUSH IY save all registers
6AAC PUSH IX
6AAE PUSH HL
6AAF PUSH DE
6AB0 PUSH BC
6AB1 PUSH AF
6AB2 LD HL,($5C78) increment the frame counter $5C78
6AB5 INC HL
6AB6 LD ($5C78),HL
6AB9 LD A,($61A0) test the sound-enable flag $61A0, skip the music update if set
6ABC AND A
6ABD JR NZ,$6ADA
6ABF LD BC,$7FFD select AY register 17 via port $7FFD
6AC2 LD A,$11
6AC4 OUT (C),A
6AC6 LD HL,$61A2 compare the current/previous melody-period byte at $61A2/$61A3, update it
6AC9 LD A,(HL)
6ACA INC HL
6ACB CP (HL)
6ACC LD (HL),A
6ACD CALL NZ,$F424 if it changed, call the ROM sound routine $F424
6AD0 CALL $F427 call the ROM routine $F427 to advance the sound driver
6AD3 LD BC,$7FFD restore the AY register select to $10
6AD6 LD A,$10
6AD8 OUT (C),A
6ADA CALL $6AFB Self-modified per-frame hook, called by the ISR 6AAA
6ADD POP AF restore all registers
6ADE POP BC
6ADF POP DE
6AE0 POP HL
6AE1 POP IX
6AE3 POP IY
6AE5 EI enable interrupts, return
6AE6 RET
6AE7: ISR continuation setup: latch the resume address and clear the frame-ready flag
Used by the routine at 6B71.
Pops the return address off the stack and stores it to the self-modified jump target at $6AF9, clears the frame-ready flag byte at $6AFB, then re-enables interrupts and returns.
6AE7 POP HL
6AE8 LD ($6AF9),HL
6AEB XOR A
6AEC LD ($6AFB),A
6AEF EI
6AF0 RET
6AF1: Idle loop: enable interrupts, drive the sound-effect player each pass
Loops forever: enables interrupts, calls 8445 to step the currently-playing sound effect, then repeats.
6AF1 EI Enable interrupts
6AF2 CALL $8445 Per-frame sound-effect player
6AF5 JP $6AF1 => Idle loop
6AF8: Jump to new-game initialization
Used by the routine at 6AFC.
Trampoline: jumps to 6B05 to start a new game.
6AF8 JP $6B05 !!MUT-ARG!! => New-game initialization
6AFB: Self-modified per-frame hook, called by the ISR 6AAA (currently a RET stub, patched by 6AFC)
Used by the routine at 6AAA.
Currently a bare RET, self-modified in by 6AFC; called every frame by the ISR 6AAA as the main per-frame game-logic hook.
6AFB RET !!MUT-CMD!! Do nothing, until self-modified
6AFC: Patch 6AFB to RET (disabling the hook), then jump to new-game initialization
Writes the RET opcode ($C9) into 6AFB, disabling it, then re-enables interrupts and jumps to 6AF8 to start a new game.
6AFC LD A,$C9 A = $C9, the RET opcode
6AFE LD ($6AFB),A Patch it into 6AFB, disabling further triggers
6B01 EI Enable interrupts
6B02 JP $6AF8 => Jump to new-game initialization
6B05: New-game initialization
Used by the routines at 6AF8 and 6B71.
Sets up the player object, global state, and 128K sound, draws the starting room, then enters the main loop.
6B05 CALL $61E3 New-game initialization
6B08 LD HL,$8968
6B0B LD ($8DB9),HL set player behaviour-handler pointer
6B0E LD HL,$788A
6B11 LD ($6110),HL
6B14 LD A,$04
6B16 LD ($8DC1),A
6B19 LD IX,$8DB6
6B1D LD A,$34
6B1F CALL $6254 Set object position (IX+5/+6) from grid index A
6B22 LD (IX+$07),$28
6B26 XOR A
6B27 LD ($619E),A set Weapon-held flag
6B2A LD ($8DC5),A
6B2D LD ($8DC0),A
6B30 LD ($8DC3),A
6B33 LD ($8DCE),A
6B36 LD ($617A),A
6B39 LD ($6125),A set Entry-point room number choosen selecting A/B/C/D in menu
6B3C LD ($6501),A
6B3F LD HL,$9489
6B42 LD ($9493),HL
6B45 LD A,($61A0)
6B48 AND A
6B49 JR NZ,$6B5E
6B4B DI
6B4C LD BC,$7FFD
6B4F LD A,$11
6B51 OUT (C),A
6B53 CALL $F42A
6B56 LD BC,$7FFD
6B59 LD A,$10
6B5B OUT (C),A
6B5D EI
6B5E LD A,$7F
6B60 LD ($61A2),A
6B63 LD ($61A3),A
6B66 LD A,$02
6B68 CALL $676D Draw current room
6B6B CALL $9808 Per-frame main loop entry
6B6E CALL $8596 System/interrupt setup before the main menu
6B71: Main game loop
Frame-rate pacing, per-frame updates (redraw flush, oil timer, screen flip), game-over restart check, and pause/menu key handling.
6B71 LD HL,$0000 Reset the frame counter $5C78 to 0
6B74 LD ($5C78),HL
6B77 LD A,($5C78) Save a copy to $6179 as the pacing baseline
6B7A LD ($6179),A
6B7D CALL $6AE7 ISR continuation setup
6B80 LD A,($5C78) Compare the live frame counter against the saved baseline, test if at least 3 frames have passed
6B83 LD HL,$6179
6B86 SUB (HL)
6B87 CP $03
6B89 JR C,$6B7D If not yet, loop back and wait
6B8B LD A,($5C78) Save the new frame count as the baseline for next time
6B8E LD (HL),A
6B8F CALL $6503 Per-frame rust/oil tick
6B92 CALL $9C35 End-of-frame screen flip
6B95 LD A,($6126) A = the room number, compare against room 2, the menu
6B98 CP $02
6B9A JR Z,$6BA5
6B9C LD A,($61A1) Otherwise test flag $61A1, skip resetting $61A2 if set
6B9F AND A
6BA0 JR NZ,$6BA5
6BA2 LD ($61A2),A Clear $61A2
6BA5 CALL $835E Flush the queued redraw requests at $9D3C
6BA8 CALL $9808 Per-frame main loop entry
6BAB LD A,($617A) A = the game-over flag $617A, compare against $FF
6BAE CP $FF
6BB0 JP Z,$6B05 => New-game initialization
6BB3 LD BC,$7FFE Read the CAPS-SHIFT/Z/X/C/V row ($7FFE), loop back to the top if Z, pause, is pressed
6BB6 IN A,(C)
6BB8 BIT 1,A
6BBA JR NZ,$6B7D
6BBC LD BC,$F7FE Read the SPACE/SYM row ($F7FE), test bit 0, SPACE
6BBF IN A,(C)
6BC1 BIT 0,A
6BC3 JP Z,$6B05 => New-game initialization
6BC6 LD BC,$EFFE Read another row ($EFFE)
6BC9 IN A,(C)
6BCB RRCA test bit 0 via RRCA
6BCC JR C,$6C03 BREAK pressed: handle it below
6BCE DI Disable interrupts
6BCF IN A,(C) Wait for the key to release
6BD1 RRCA
6BD2 JR NC,$6BCF
6BD4 LD A,($61A0) A = flag $61A0, skip forcing the border colour below if set
6BD7 AND A
6BD8 JR NZ,$6BF5
6BDA LD HL,$61A2 HL = $61A2, test its value, skip forcing white if nonzero
6BDD LD A,(HL)
6BDE AND A
6BDF JR NZ,$6BE4
6BE1 INC HL Force $61A3 = $7F, white border
6BE2 LD (HL),$7F
6BE4 LD BC,$7FFD Select AY register $11 via port $7FFD
6BE7 LD A,$11
6BE9 OUT (C),A
6BEB CALL $F42A Call a 128K sound ROM helper
6BEE LD BC,$7FFD Restore AY register select to $10 via port $7FFD
6BF1 LD A,$10
6BF3 OUT (C),A
6BF5 LD BC,$EFFE Read the row again, test bit 0
6BF8 IN A,(C)
6BFA RRCA
6BFB JR C,$6BF5 Loop while still pressed, debounce
6BFD IN A,(C) Read once more, loop until released, second debounce
6BFF RRCA
6C00 JR NC,$6BFD
6C02 EI Re-enable interrupts
6C03 JP $6B7D
6C06: Sprite number -> mask sprite number table (indexed by sprite number, read by 8128)
6C06 DEFB $82,$83,$84,$85,$86,$87,$88,$89
6C0E DEFB $8A,$8B,$8C,$0B,$0C,$0D,$0E,$91
6C16 DEFB $92,$93,$94,$95,$96,$97,$98,$99
6C1E DEFB $9A,$9B,$9C,$9D,$9E,$9F,$A0,$A1
6C26 DEFB $A2,$A3,$A4,$A5,$A6,$A7,$A8,$A9
6C2E DEFB $AA,$AB,$AC,$AD,$AE,$AF,$B0,$B1
6C36 DEFB $B2,$B3,$33,$34,$35,$36,$37,$38
6C3E DEFB $39,$3A,$3B,$3C,$3D,$3E,$3F,$40
6C46 DEFB $41,$42,$43,$44,$45,$46,$47,$48
6C4E DEFB $49,$4A,$4B,$00,$4C,$4D,$4F,$50
6C56 DEFB $51,$52,$53,$54,$55,$56,$57,$58
6C5E DEFB $59,$00,$B1,$B2,$B3,$B4,$5E,$5F
6C66 DEFB $60,$61,$62,$63,$64,$65,$66,$67
6C6E DEFB $68,$69,$6B,$00,$55,$C2,$6F,$70
6C76 DEFB $71,$72,$73,$74,$75,$76,$77,$78
6C7E DEFB $79,$7A,$7B,$00,$7C,$7D,$7E,$7F
6C86 DEFB $00,$00,$00,$00,$00,$00,$00,$A5
6C8E DEFB $00,$00,$00,$A9,$00,$00,$00,$00
6C96 DEFB $00,$00,$00,$00,$B2,$95,$96,$97
6C9E DEFB $98,$99,$9A,$9B,$9C,$9D,$9E,$9F
6CA6 DEFB $A0,$A1,$A2,$A3,$A4,$A5,$A6,$A7
6CAE DEFB $A8,$A9,$AA,$AB,$AC,$AD,$AE,$AF
6CB6 DEFB $B0,$B1,$B2,$B3,$B4,$B9,$B9,$B9
6CBE DEFB $B9,$B9,$BA,$BB,$BC,$BD,$BE,$BF
6CC6 DEFB $C0,$C1,$C2,$C3,$C4,$C5,$C6,$C7
6CCE DEFB $C8
6CCF: Room descriptions.
The world is a 6x6x6 cube of room slots (6 levels, each a 6x6 grid), per an external game map. The highest room number in this table is $D7=215=6*6*6-1, and the table has 216 records total ($00-$D7) -- one per cube slot, including ~15 unused/vacant ones (no room actually there). Horizontal (same-level) neighbours connect via doors (612B); vertical neighbours connect via whirlpools (down, 8A87) and bubbles (up, also 8A87).
The room number decodes to its cube position via n=room_number-1, then level=n/36, row=(n%36)/6, col=n%6 (0-based). Cross-checked against the 4 menu entry points (A/B/C/D) and an external game map (see x-docs/Room-Format.md).
Room description format (consumed by 6269/62BB):
byte 0: record length (offset to the next room's description);
byte 1: door/exit bitfield, stored to $612B (bit0=North, bit1=East, bit2=South, bit3=West -- see 6329/67F1);
byte 2 bits 4-7: room type index (0-15), stored to $612A -- selects the grid template from the 72B1 pointer table AND the room's creature/inhabitant (via the same value used again below);
byte 3 bit 6: wall/decoration layout selector, stored to $6129 (selects one of 2 fixed layouts drawn by 642F);
byte 3 bits 0-5: a 6-bit index (byte3 AND $3F) into the 73B5 room/creature title table -- selects the message-window title text (DEATHBOWL/PIRANHA/SEAHORSE/etc), printed by 65FD. NOT door/exit flags -- exits are encoded in byte1 (see 6329).
bytes 4+ (if record length > 4): extra (index,value) pairs specific to this room, laid out and consumed identically to a room-type template (see 72D1) -- appended on top of the shared room-type template when the room grid is built. The loop counter B starts at (length-4), but a special-value pair (value in $66/$67/$68/$69/$6A/$6B) makes its spawn routine (e.g. 8EA7) decrement B as a side effect, ending the loop early. Example: room $52 (6ECF) has 3 trailing bytes $37/$6A/$20 -- its single special pair ($37,$6A) consumes 2, and the double-decrement ends the loop before the last byte ($20) is read. Odd leftover-byte counts are therefore normal whenever a special-value entry is present.
The "Room $XX" labels below match the in-game room number as read from $6126 (i.e. 1-based: the first record is room $01).
Level 1 of 6 (room numbers $01-$24, cube rows/cols 0-5 -- see x-docs/Room-Format.md) -- entry point 'C' lands in this level (room $1A)
6CCF DEFB $07,$00,$E6,$00 Room $01 description, type $E -- the special ENDING/WINNING room
6CD3 DEFB $34,$6A,$28
6CD6 DEFB $06,$00,$E3,$00 Room $02 description, type $E -- the special MENU room
6CDA DEFB $37,$69
6CDC DEFB $04,$04,$05,$00 Room $03 description, type $0
6CE0 DEFB $04,$02,$51,$47 Room $04 description, type $5
6CE4 DEFB $0A,$0E,$05,$07 Room $05 description, type $0
6CE8 DEFB $1D,$0D,$1D,$66,$14,$40
6CEE DEFB $08,$0C,$12,$47 Room $06 description, type $1
6CF2 DEFB $1B,$03,$1F,$0D
6CF6 DEFB $08,$06,$46,$00 Room $07 description, type $4
6CFA DEFB $14,$66,$28,$40
6CFE DEFB $06,$0A,$64,$00 Room $08 description, type $6
6D02 DEFB $2D,$03
6D04 DEFB $04,$0A,$33,$44 Room $09 description, type $3
6D08 DEFB $04,$0A,$77,$40 Room $0A description, type $7
6D0C DEFB $04,$0D,$11,$07 Room $0B description, type $1
6D10 DEFB $06,$05,$05,$47 Room $0C description, type $0
6D14 DEFB $23,$0D
6D16 DEFB $04,$03,$12,$09 Room $0D description, type $1
6D1A DEFB $04,$0C,$06,$49 Room $0E description, type $0
6D1E DEFB $0E,$02,$04,$40 Room $0F description, type $0
6D22 DEFB $21,$11,$2E,$66,$2D,$60,$22,$68
6D2A DEFB $02,$53
6D2C DEFB $04,$0E,$03,$42 Room $10 description, type $0
6D30 DEFB $0A,$09,$57,$00 Room $11 description, type $5
6D34 DEFB $2D,$69,$0A,$68,$00,$14
6D3A DEFB $0A,$05,$41,$00 Room $12 description, type $4
6D3E DEFB $14,$66,$28,$40,$2E,$69
6D44 DEFB $0C,$06,$75,$40 Room $13 description, type $7
6D48 DEFB $2C,$66,$32,$68,$21,$11,$27,$09
6D50 DEFB $06,$0F,$12,$49 Room $14 description, type $1
6D54 DEFB $1C,$69
6D56 DEFB $04,$0C,$36,$06 Room $15 description, type $3
6D5A DEFB $06,$05,$24,$45 Room $16 description, type $2
6D5E DEFB $2C,$0D
6D60 DEFB $08,$06,$03,$00 Room $17 description, type $0
6D64 DEFB $13,$66,$19,$2C
6D68 DEFB $04,$09,$77,$40 Room $18 description, type $7
6D6C DEFB $04,$14,$01,$02 Room $19 description, type $0
6D70 DEFB $04,$05,$05,$49 Room $1A description, type $0
6D74 DEFB $04,$03,$22,$45 Room $1B description, type $2
6D78 DEFB $06,$09,$36,$04 Room $1C description, type $3
6D7C DEFB $1B,$69
6D7E DEFB $06,$07,$04,$49 Room $1D description, type $0
6D82 DEFB $2C,$0D
6D84 DEFB $06,$0C,$13,$09 Room $1E description, type $1
6D88 DEFB $1B,$03
6D8A DEFB $0A,$03,$27,$45 Room $1F description, type $2
6D8E DEFB $1E,$02,$22,$68,$00,$2E
6D94 DEFB $06,$0B,$61,$00 Room $20 description, type $6
6D98 DEFB $15,$0D
6D9A DEFB $04,$08,$25,$45 Room $21 description, type $2
6D9E DEFB $0A,$02,$12,$06 Room $22 description, type $1
6DA2 DEFB $2C,$03,$24,$66,$35,$60
6DA8 DEFB $08,$0B,$16,$09 Room $23 description, type $1
6DAC DEFB $12,$09,$1A,$09
6DB0 DEFB $04,$09,$54,$49 Room $24 description, type $5
Level 2 of 6 (room numbers $25-$48)
6DB4 DEFB $04,$0C,$05,$00 Room $25 description, type $0
6DB8 DEFB $04,$08,$05,$40 Room $26 description, type $0
6DBC DEFB $04,$05,$06,$00 Room $27 description, type $0
6DC0 DEFB $04,$06,$77,$40 Room $28 description, type $7
6DC4 DEFB $0A,$0A,$03,$40 Room $29 description, type $0
6DC8 DEFB $1D,$02,$1D,$68,$02,$10
6DCE DEFB $08,$08,$11,$06 Room $2A description, type $1
6DD2 DEFB $1B,$12,$0A,$12
6DD6 DEFB $09,$06,$65,$49 Room $2B description, type $6
6DDA DEFB $33,$0D,$2A,$6A,$28
6DDF DEFB $04,$0A,$82,$09 Room $2C description, type $8
6DE3 DEFB $06,$0C,$36,$44 Room $2D description, type $3
6DE7 DEFB $1A,$69
6DE9 DEFB $04,$07,$24,$45 Room $2E description, type $2
6DED DEFB $04,$0A,$53,$09 Room $2F description, type $5
6DF1 DEFB $06,$0C,$07,$49 Room $30 description, type $0
6DF5 DEFB $2C,$69
6DF7 DEFB $04,$05,$71,$40 Room $31 description, type $7
6DFB DEFB $10,$04,$F5,$08 Room $32 description, type $F -- one of 4 PLUG ROOMs (see 73B3), cube position level 2, row 2, col 1
6DFF DEFB $13,$0F,$17,$0E,$33,$0E,$37,$0F 4 decor cubes at grid corners (2,2)/(2,6)/(6,2)/(6,6), values $0F/$0E/$0E/$0F; then Plug+Whirlpool co-located at grid cell $25 -- see 8F4C/8F1E
6E07 DEFB $25,$6B,$25,$69
6E0B DEFB $0A,$07,$12,$46 Room $33 description, type $1
6E0F DEFB $1B,$03,$24,$68,$00,$61
6E15 DEFB $06,$0D,$06,$00 Room $34 description, type $0
6E19 DEFB $0F,$0D
6E1B DEFB $0A,$04,$34,$40 Room $35 description, type $3
6E1F DEFB $21,$11,$1D,$66,$28,$48
6E25 DEFB $06,$01,$03,$49 Room $36 description, type $0
6E29 DEFB $36,$69
6E2B DEFB $04,$07,$27,$05 Room $37 description, type $2
6E2F DEFB $06,$18,$01,$07 Room $38 description, type $0
6E33 DEFB $0A,$09
6E35 DEFB $04,$14,$25,$05 Room $39 description, type $2
6E39 DEFB $04,$05,$32,$44 Room $3A description, type $3
6E3D DEFB $04,$03,$16,$06 Room $3B description, type $1
6E41 DEFB $04,$0C,$34,$44 Room $3C description, type $3
6E45 DEFB $04,$07,$73,$40 Room $3D description, type $7
6E49 DEFB $0A,$0E,$57,$03 Room $3E description, type $5
6E4D DEFB $37,$0D,$0A,$68,$00,$23
6E53 DEFB $04,$09,$31,$43 Room $3F description, type $3
6E57 DEFB $04,$05,$05,$00 Room $40 description, type $0
6E5B DEFB $0A,$04,$12,$46 Room $41 description, type $1
6E5F DEFB $2F,$12,$36,$12,$1E,$12
6E65 DEFB $06,$05,$06,$00 Room $42 description, type $0
6E69 DEFB $14,$0D
6E6B DEFB $08,$03,$04,$40 Room $43 description, type $0
6E6F DEFB $0C,$69,$34,$0D
6E73 DEFB $04,$0B,$83,$03 Room $44 description, type $8
6E77 DEFB $08,$0A,$77,$40 Room $45 description, type $7
6E7B DEFB $1A,$68,$00,$11
6E7F DEFB $04,$0B,$31,$04 Room $46 description, type $3
6E83 DEFB $06,$0B,$55,$00 Room $47 description, type $5
6E87 DEFB $05,$02
6E89 DEFB $12,$09,$42,$00 Room $48 description, type $4
6E8D DEFB $1D,$00,$16,$00,$16,$68,$00,$44
6E95 DEFB $1D,$69,$2E,$68,$00,$48
Level 3 of 6 (room numbers $49-$6C) -- entry point 'A' lands in this level (room $52)
6E9B DEFB $06,$04,$37,$06 Room $49 description, type $3
6E9F DEFB $34,$69
6EA1 DEFB $0E,$06,$63,$00 Room $4A description, type $6
6EA5 DEFB $21,$11,$2E,$66,$30,$68,$2E,$68
6EAD DEFB $00,$5D
6EAF DEFB $04,$84,$04,$02 Room $4B description, type $0
6EB3 DEFB $08,$06,$16,$46 Room $4C description, type $1
6EB7 DEFB $1B,$03,$2F,$03
6EBB DEFB $04,$0A,$33,$04 Room $4D description, type $3
6EBF DEFB $04,$0C,$05,$43 Room $4E description, type $0
6EC3 DEFB $04,$07,$06,$43 Room $4F description, type $0
6EC7 DEFB $04,$0D,$24,$45 Room $50 description, type $2
6ECB DEFB $04,$07,$11,$46 Room $51 description, type $1
6ECF DEFB $07,$0B,$02,$00 Room $52 description, type $0
6ED3 DEFB $37,$6A,$20
6ED6 DEFB $04,$0C,$61,$00 Room $53 description, type $6
6EDA DEFB $0A,$01,$52,$40 Room $54 description, type $5
6EDE DEFB $21,$11,$2D,$66,$2D,$68
6EE4 DEFB $04,$05,$15,$06 Room $55 description, type $1
6EE8 DEFB $04,$01,$52,$00 Room $56 description, type $5
6EEC DEFB $04,$03,$24,$05 Room $57 description, type $2
6EF0 DEFB $04,$0C,$35,$04 Room $58 description, type $3
6EF4 DEFB $08,$07,$41,$40 Room $59 description, type $4
6EF8 DEFB $2E,$66,$28,$58
6EFC DEFB $08,$0C,$05,$40 Room $5A description, type $0
6F00 DEFB $25,$68,$00,$5D
6F04 DEFB $0C,$03,$44,$00 Room $5B description, type $4
6F08 DEFB $13,$02,$13,$68,$02,$1C,$2A,$03
6F10 DEFB $04,$0A,$65,$00 Room $5C description, type $6
6F14 DEFB $08,$0E,$12,$03 Room $5D description, type $1
6F18 DEFB $0D,$68,$02,$2F
6F1C DEFB $08,$09,$07,$43 Room $5E description, type $0
6F20 DEFB $2D,$68,$02,$4B
6F24 DEFB $08,$05,$04,$00 Room $5F description, type $0
6F28 DEFB $37,$66,$28,$58
6F2C DEFB $0D,$05,$56,$00 Room $60 description, type $5
6F30 DEFB $1A,$6A,$28,$33,$69,$3A,$09,$3D
6F38 DEFB $09
6F39 DEFB $04,$07,$04,$00 Room $61 description, type $0
6F3D DEFB $0A,$06,$04,$03 Room $62 description, type $0
6F41 DEFB $2D,$68,$02,$5D,$37,$0D
6F47 DEFB $04,$0F,$43,$03 Room $63 description, type $4
6F4B DEFB $04,$0A,$21,$05 Room $64 description, type $2
6F4F DEFB $10,$09,$F3,$08 Room $65 description, type $F -- one of 4 PLUG ROOMs (see 73B3), cube position level 3, row 4, col 4
6F53 DEFB $13,$0B,$17,$0C,$33,$0A,$37,$0B 4 decor cubes at grid corners (2,2)/(2,6)/(6,2)/(6,6), values $0B/$0C/$0A/$0B; then Plug+Whirlpool co-located at grid cell $25 -- see 8F4C/8F1E
6F5B DEFB $25,$6B,$25,$69
6F5F DEFB $06,$05,$45,$00 Room $66 description, type $4
6F63 DEFB $12,$69
6F65 DEFB $04,$02,$82,$00 Room $67 description, type $8
6F69 DEFB $04,$0B,$14,$03 Room $68 description, type $1
6F6D DEFB $04,$0B,$07,$43 Room $69 description, type $0
6F71 DEFB $08,$0A,$13,$03 Room $6A description, type $1
6F75 DEFB $33,$68,$00,$40
6F79 DEFB $06,$0A,$32,$04 Room $6B description, type $3
6F7D DEFB $0A,$0D
6F7F DEFB $04,$18,$05,$40 Room $6C description, type $0
Level 4 of 6 (room numbers $6D-$90) -- entry point 'D' lands in this level (room $84)
6F83 DEFB $04,$02,$85,$01 Room $6D description, type $8
6F87 DEFB $04,$0E,$12,$09 Room $6E description, type $1
6F8B DEFB $0D,$08,$36,$46 Room $6F description, type $3
6F8F DEFB $1B,$6A,$2D,$16,$02,$16,$68,$02
6F97 DEFB $38
6F98 DEFB $04,$06,$24,$45 Room $70 description, type $2
6F9C DEFB $04,$0A,$73,$40 Room $71 description, type $7
6FA0 DEFB $06,$0C,$27,$05 Room $72 description, type $2
6FA4 DEFB $24,$07
6FA6 DEFB $04,$02,$06,$00 Room $73 description, type $0
6FAA DEFB $06,$03,$65,$40 Room $74 description, type $6
6FAE DEFB $0C,$69
6FB0 DEFB $04,$0E,$02,$02 Room $75 description, type $0
6FB4 DEFB $0E,$09,$46,$02 Room $76 description, type $4
6FB8 DEFB $2E,$69,$0C,$66,$3C,$60,$37,$02
6FC0 DEFB $16,$00
6FC2 DEFB $07,$02,$54,$40 Room $77 description, type $5
6FC6 DEFB $23,$6A,$32
6FC9 DEFB $04,$0D,$63,$00 Room $78 description, type $6
6FCD DEFB $04,$02,$07,$40 Room $79 description, type $0
6FD1 DEFB $04,$02,$01,$40 Room $7A description, type $0
6FD5 DEFB $04,$05,$55,$42 Room $7B description, type $5
6FD9 DEFB $14,$02,$02,$00 Room $7C description, type $0
6FDD DEFB $0B,$09,$12,$09,$14,$09,$1B,$09
6FE5 DEFB $13,$66,$37,$50,$36,$66,$2B,$60
6FED DEFB $08,$0C,$86,$00 Room $7D description, type $8
6FF1 DEFB $0E,$68,$02,$41
6FF5 DEFB $04,$05,$34,$04 Room $7E description, type $3
6FF9 DEFB $16,$06,$73,$40 Room $7F description, type $7
6FFD DEFB $27,$68,$00,$11,$2E,$68,$00,$24
7005 DEFB $2F,$68,$00,$3B,$38,$0D,$0D,$0D
700D DEFB $22,$0D
700F DEFB $07,$0E,$37,$44 Room $80 description, type $3
7013 DEFB $2E,$6A,$40
7016 DEFB $04,$0B,$81,$00 Room $81 description, type $8
701A DEFB $06,$0C,$45,$00 Room $82 description, type $4
701E DEFB $1D,$00
7020 DEFB $04,$16,$02,$47 Room $83 description, type $0
7024 DEFB $04,$0D,$76,$40 Room $84 description, type $7
7028 DEFB $04,$05,$14,$43 Room $85 description, type $1
702C DEFB $04,$07,$03,$01 Room $86 description, type $0
7030 DEFB $04,$86,$67,$09 Room $87 description, type $6
7034 DEFB $06,$0F,$31,$49 Room $88 description, type $3
7038 DEFB $2D,$69
703A DEFB $04,$0F,$65,$00 Room $89 description, type $6
703E DEFB $04,$0D,$32,$04 Room $8A description, type $3
7042 DEFB $06,$03,$46,$03 Room $8B description, type $4
7046 DEFB $1A,$0D
7048 DEFB $04,$09,$84,$03 Room $8C description, type $8
704C DEFB $08,$03,$13,$49 Room $8D description, type $1
7050 DEFB $1B,$03,$2F,$03
7054 DEFB $08,$09,$07,$09 Room $8E description, type $0
7058 DEFB $14,$68,$00,$50
705C DEFB $09,$01,$01,$02 Room $8F description, type $0
7060 DEFB $21,$11,$1E,$6A,$32
7065 DEFB $06,$01,$25,$45 Room $90 description, type $2
7069 DEFB $25,$69
Level 5 of 6 (room numbers $91-$B4)
706B DEFB $0E,$02,$83,$05 Room $91 description, type $8
706F DEFB $1A,$02,$1A,$68,$00,$28,$1D,$68
7077 DEFB $00,$21
7079 DEFB $06,$84,$05,$47 Room $92 description, type $0
707D DEFB $23,$09
707F DEFB $0C,$06,$14,$01 Room $93 description, type $1
7083 DEFB $21,$11,$14,$66,$39,$5E,$1F,$03
708B DEFB $04,$0E,$06,$43 Room $94 description, type $0
708F DEFB $06,$0A,$17,$03 Room $95 description, type $1
7093 DEFB $12,$03
7095 DEFB $04,$0C,$31,$43 Room $96 description, type $3
7099 DEFB $04,$0D,$02,$00 Room $97 description, type $0
709D DEFB $04,$07,$73,$40 Room $98 description, type $7
70A1 DEFB $0C,$0D,$84,$05 Room $99 description, type $8
70A5 DEFB $0C,$68,$00,$1A,$2C,$68,$00,$27
70AD DEFB $0B,$03,$55,$03 Room $9A description, type $5
70B1 DEFB $0A,$03,$21,$11,$25,$6A,$38
70B8 DEFB $10,$0A,$F3,$08 Room $9B description, type $F -- one of 4 PLUG ROOMs (see 73B3), cube position level 5, row 1, col 4
70BC DEFB $13,$10,$17,$10,$33,$10,$37,$10 4 decor cubes at grid corners (2,2)/(2,6)/(6,2)/(6,6), all value $10; then Plug+Whirlpool co-located at grid cell $25 -- see 8F4C/8F1E
70C4 DEFB $25,$6B,$25,$69
70C8 DEFB $06,$0D,$66,$00 Room $9C description, type $6
70CC DEFB $13,$67
70CE DEFB $0A,$06,$17,$41 Room $9D description, type $1
70D2 DEFB $21,$11,$23,$66,$35,$58
70D8 DEFB $08,$0B,$21,$45 Room $9E description, type $2
70DC DEFB $2F,$68,$00,$30
70E0 DEFB $0B,$0F,$42,$09 Room $9F description, type $4
70E4 DEFB $0C,$66,$35,$68,$1A,$6A,$30
70EB DEFB $0E,$0C,$73,$09 Room $A0 description, type $7
70EF DEFB $0A,$68,$00,$10,$0B,$09,$13,$68
70F7 DEFB $00,$4F
70F9 DEFB $0A,$04,$04,$01 Room $A1 description, type $0
70FD DEFB $12,$0D,$13,$0D,$0D,$0D
7103 DEFB $0A,$05,$15,$06 Room $A2 description, type $1
7107 DEFB $0B,$12,$12,$12,$27,$12
710D DEFB $06,$03,$56,$40 Room $A3 description, type $5
7111 DEFB $1E,$67
7113 DEFB $18,$0A,$47,$40 Room $A4 description, type $4
7117 DEFB $16,$00,$2B,$00,$16,$68,$00,$0A
711F DEFB $0D,$68,$00,$2B,$2B,$68,$00,$11
7127 DEFB $34,$68,$00,$2B
712B DEFB $06,$0D,$11,$49 Room $A5 description, type $1
712F DEFB $1C,$69
7131 DEFB $0A,$07,$32,$04 Room $A6 description, type $3
7135 DEFB $12,$68,$00,$39,$26,$69
713B DEFB $04,$1E,$63,$00 Room $A7 description, type $6
713F DEFB $08,$85,$82,$09 Room $A8 description, type $8
7143 DEFB $2E,$68,$00,$1B
7147 DEFB $04,$06,$53,$02 Room $A9 description, type $5
714B DEFB $04,$0E,$04,$47 Room $AA description, type $0
714F DEFB $04,$0F,$15,$07 Room $AB description, type $1
7153 DEFB $04,$0A,$87,$07 Room $AC description, type $8
7157 DEFB $12,$0D,$41,$45 Room $AD description, type $4
715B DEFB $1D,$00,$1D,$68,$00,$13,$14,$68
7163 DEFB $00,$0E,$26,$68,$00,$19
7169 DEFB $07,$05,$32,$09 Room $AE description, type $3
716D DEFB $12,$6A,$3C
7170 DEFB $04,$03,$03,$47 Room $AF description, type $0
7174 DEFB $04,$0B,$24,$07 Room $B0 description, type $2
7178 DEFB $04,$09,$25,$05 Room $B1 description, type $2
717C DEFB $04,$08,$06,$00 Room $B2 description, type $0
7180 DEFB $06,$03,$37,$44 Room $B3 description, type $3
7184 DEFB $2C,$69
7186 DEFB $06,$09,$15,$46 Room $B4 description, type $1
718A DEFB $28,$09
Level 6 of 6 (room numbers $B5-$D8) -- entry point 'B' lands in this level (room $C0)
718C DEFB $10,$06,$12,$45 Room $B5 description, type $1
7190 DEFB $1F,$12,$27,$12,$1A,$12,$15,$12
7198 DEFB $19,$04,$1E,$04
719C DEFB $0C,$0C,$43,$09 Room $B6 description, type $4
71A0 DEFB $0F,$00,$16,$00,$16,$68,$00,$65
71A8 DEFB $0A,$02,$04,$47 Room $B7 description, type $0
71AC DEFB $36,$66,$2D,$68,$21,$11
71B2 DEFB $07,$0E,$85,$07 Room $B8 description, type $8
71B6 DEFB $2E,$6A,$3C
71B9 DEFB $04,$0E,$16,$07 Room $B9 description, type $1
71BD DEFB $04,$08,$87,$02 Room $BA description, type $8
71C1 DEFB $04,$07,$71,$40 Room $BB description, type $7
71C5 DEFB $04,$0B,$82,$09 Room $BC description, type $8
71C9 DEFB $04,$0C,$33,$44 Room $BD description, type $3
71CD DEFB $04,$03,$04,$47 Room $BE description, type $0
71D1 DEFB $04,$0B,$05,$47 Room $BF description, type $0
71D5 DEFB $12,$0C,$06,$00 Room $C0 description, type $0
71D9 DEFB $37,$66,$A0,$36,$2F,$09,$36,$09
71E1 DEFB $38,$09,$3F,$09,$0F,$0D
71E7 DEFB $0D,$01,$67,$07 Room $C1 description, type $6
71EB DEFB $21,$11,$21,$68,$11,$5D,$2E,$6A
71F3 DEFB $35
71F4 DEFB $04,$06,$51,$43 Room $C2 description, type $5
71F8 DEFB $08,$0F,$12,$03 Room $C3 description, type $1
71FC DEFB $1C,$68,$00,$11
7200 DEFB $04,$08,$63,$03 Room $C4 description, type $6
7204 DEFB $08,$06,$14,$01 Room $C5 description, type $1
7208 DEFB $13,$12,$0C,$0D
720C DEFB $0E,$0D,$45,$01 Room $C6 description, type $4
7210 DEFB $16,$00,$24,$00,$2B,$00,$2B,$68
7218 DEFB $00,$4E
721A DEFB $04,$06,$56,$47 Room $C7 description, type $5
721E DEFB $06,$1A,$17,$01 Room $C8 description, type $1
7222 DEFB $34,$03
7224 DEFB $04,$96,$81,$02 Room $C9 description, type $8
7228 DEFB $04,$0E,$12,$49 Room $CA description, type $1
722C DEFB $07,$0B,$53,$41 Room $CB description, type $5
7230 DEFB $2E,$6A,$3C
7233 DEFB $07,$09,$04,$01 Room $CC description, type $0
7237 DEFB $37,$6A,$46
723A DEFB $0D,$03,$45,$07 Room $CD description, type $4
723E DEFB $1A,$6A,$2D,$27,$66,$38,$58,$1D
7246 DEFB $00
7247 DEFB $04,$0C,$36,$47 Room $CE description, type $3
724B DEFB $08,$03,$07,$45 Room $CF description, type $0
724F DEFB $2D,$68,$02,$46
7253 DEFB $04,$09,$81,$09 Room $D0 description, type $8
7257 DEFB $04,$0C,$04,$40 Room $D1 description, type $0
725B DEFB $04,$0C,$04,$40 Room $D2 description, type $0
725F DEFB $04,$02,$84,$01 Room $D3 description, type $8
7263 DEFB $04,$09,$25,$05 Room $D4 description, type $2
7267 DEFB $04,$0A,$04,$00 Room $D5 description, type $0
726B DEFB $04,$0B,$04,$00 Room $D6 description, type $0
726F DEFB $07,$02,$81,$00 Room $D7 description, type $8
7273 DEFB $37,$6A,$28
7276 DEFB $10,$08,$F2,$08 Room $D8 description, type $F -- one of 4 PLUG ROOMs (see 73B3), cube position level 6, row 5, col 5
727A DEFB $13,$0F,$17,$0E,$33,$0E,$37,$0F 4 decor cubes at grid corners (2,2)/(2,6)/(6,2)/(6,6), values $0F/$0E/$0E/$0F; then Plug+Whirlpool co-located at grid cell $25 -- see 8F4C/8F1E
7282 DEFB $25,$6B,$25,$69
7286: Data block at 7286
7286 DEFB $01
Per-level Plug Room table: 6 entries (levels 1-6), 6 bytes each. byte0 = the level's Plug Room number ($00 = none; $32/$65/$9B/$D8 for levels 2/3/5/6), byte1 = state byte (low nibble checked against $0F by 8F4C/94F4 to suppress the plug spawn -- plug already pulled?), bytes 2-5 = purpose not yet known. Looked up by 62F9.
7287 DEFB $00,$00,$00,$00,$00,$00
728D DEFB $32,$00,$7A,$76,$76,$7A
7293 DEFB $65,$00,$42,$38,$3A,$42
7299 DEFB $00,$00,$00,$00,$00,$00
729F DEFB $9B,$00,$70,$70,$70,$70
72A5 DEFB $D8,$00,$7A,$76,$76,$7A
72AB: Data block at 72AB
72AB DEFB $06,$13,$17,$33,$37,$25
72B1: Room-type template pointer table
16 words, indexed by $612A (room type 0-15, from room description byte2 bits 4-7); each points to a template block below. Types 9-14 all share the same template ($73A0).
72B1 DEFW $72D1,$72E4,$72F3,$731A
72B9 DEFW $7329,$733E,$734F,$7362
72C1 DEFW $7389,$73A0,$73A0,$73A0
72C9 DEFW $73A0,$73A0,$73A0,$73B3
72D1: Room-type templates
Each template starts with a byte0 giving the total byte count of that template block (not a pair count -- matches the gap to the next template's pointer exactly), followed by (index,value) pairs consumed by 62C8 to populate the room grid (see 612C).
Room type $0 (19 bytes)
72D1 DEFB $13 byte count for this template (19)
72D2 DEFB $16,$01,$20,$01,$22,$02,$26,$01
72DA DEFB $2D,$02,$32,$04,$33,$04,$1C,$66
72E2 DEFB $37,$40
Room type $1 (15 bytes)
72E4 DEFB $0F byte count for this template (15)
72E5 DEFB $0D,$02,$0E,$04,$2B,$03,$25,$03
72ED DEFB $32,$01,$35,$66,$37,$40
Room type $2 (39 bytes)
72F3 DEFB $27 byte count for this template (39)
72F4 DEFB $0C,$68,$00,$11,$17,$68,$00,$18
72FC DEFB $1A,$68,$00,$27,$1C,$68,$00,$0A
7304 DEFB $1F,$68,$00,$5C,$2E,$68,$00,$35
730C DEFB $33,$68,$00,$1F,$36,$68,$00,$49
7314 DEFB $06,$09,$24,$09,$3A,$09
Room type $3 (15 bytes)
731A DEFB $0F byte count for this template (15)
731B DEFB $0F,$07,$14,$07,$22,$08,$2F,$08
7323 DEFB $33,$07,$1C,$67,$36,$0D
Room type $4 (21 bytes)
7329 DEFB $15 byte count for this template (21)
732A DEFB $08,$09,$0F,$09,$16,$09,$1D,$09
7332 DEFB $24,$09,$2B,$09,$32,$09,$39,$09
733A DEFB $2C,$02,$1F,$04
Room type $5 (17 bytes)
733E DEFB $11 byte count for this template (17)
733F DEFB $0E,$09,$1C,$09,$2B,$09,$26,$09
7347 DEFB $28,$09,$2B,$09,$35,$09,$0E,$0D
Room type $6 (19 bytes)
734F DEFB $13 byte count for this template (19)
7350 DEFB $0D,$0D,$10,$01,$17,$0D,$1C,$0D
7358 DEFB $23,$01,$27,$01,$32,$0D,$36,$0D
7360 DEFB $3D,$0D
Room type $7 (39 bytes)
7362 DEFB $27 byte count for this template (39)
7363 DEFB $0D,$68,$00,$0F,$10,$0D,$17,$0D
736B DEFB $1C,$09,$1E,$09,$1F,$68,$00,$28
7373 DEFB $22,$68,$00,$3F,$25,$68,$00,$39
737B DEFB $26,$0D,$28,$09,$2B,$03,$2D,$09
7383 DEFB $34,$68,$00,$21,$37,$09
Room type $8 (23 bytes)
7389 DEFB $17 byte count for this template (23)
738A DEFB $0B,$0D,$0E,$02,$0F,$01,$13,$03
7392 DEFB $1E,$03,$24,$0D,$2A,$03,$2F,$0D
739A DEFB $34,$01,$25,$66,$3C,$54
Room type $9..$E (19 bytes)
73A0 DEFB $13 byte count for this template (19)
73A1 DEFB $16,$01,$20,$01,$22,$02,$26,$01
73A9 DEFB $2D,$02,$32,$04,$33,$04,$13,$66
73B1 DEFB $23,$58
Room type $F (2 bytes) -- used by exactly 4 rooms in the whole table -- $32, $65, $9B, $D8 (cube positions level2/row2/col1, level3/row4/col4, level5/row1/col4, level6/row5/col5 respectively) -- all four "PLUG ROOM" (title index 8). Per the game's own instructions text (x-docs/Instructions.txt): "the gigantic planetary aquarium... is now so polluted that the only remedy is to completely empty it of water by pulling each of the four main plugs" -- these 4 rooms are the win-condition rooms: pulling all four plugs completes the game. The template itself (2 bytes: length + 1 more) is too short to hold any real (index,value) pair, consistent with Plug Rooms being a distinct, mostly-static-content-free category built around the plug-placement mechanic rather than normal terrain.
73B3 DEFB $01 byte count for this template (2)
73B4 DEFB $01
73B5: Room/creature title table
10 entries, 14 bytes each, terminated by $5E. Indexed by room type (see 72D1); printed as the message window's title line by 65DB and restored by 9808. Entries $A onward (from 7441) are reused as the rotating clue/joke message table printed by 65DB via 65D7.
73B5 DEFM " DEATHBOWL ",$5E " DEATHBOWL "
73C3 DEFM " PIRANHA ",$5E " PIRANHA "
73D1 DEFM " SEAHORSE ",$5E " SEAHORSE "
73DF DEFM " WOLF FISH ",$5E " WOLF FISH "
73ED DEFM " ANEMONE ",$5E " ANEMONE "
73FB DEFM " SEA SLUG ",$5E " SEA SLUG "
7409 DEFM " OYSTER ",$5E " OYSTER "
7417 DEFM " JELLYFISH ",$5E " JELLYFISH "
7425 DEFM " PLUG ROOM ",$5E " PLUG ROOM "
7433 DEFM " BABY WHALE ",$5E " BABY WHALE "
7441: Warning-sign / clue message table
7 entries, 20 bytes each, terminated by $FF; alias into the tail of the 73B5 table.
7441 DEFM "FEEDING PROHIBITED ",$5E "FEEDING PROHIBITED "
7455 DEFM "BATHING NOT ALLOWED",$5E "BATHING NOT ALLOWED"
7469 DEFM "DONT TAP THE GLASS ",$5E "DONT TAP THE GLASS "
747D DEFM "NOW WASH YOUR HANDS",$5E "NOW WASH YOUR HANDS"
7491 DEFM "NOT DRINKING WATER ",$5E "NOT DRINKING WATER "
74A5 DEFM "DONT BITE THE FISH ",$5E "DONT BITE THE FISH "
74B9 DEFM " PLEASE GO QUIETLY ",$5E,$FF " PLEASE GO QUIETLY "
74CE: Data block at 74CE
74CE DEFB $00,$0C,$6A,$0E,$38,$0D,$3A,$0D
74D6 DEFB $3C,$0D,$3E,$0D,$40,$0D,$42,$0D
74DE DEFB $6D,$0D,$6E,$0D,$70,$0D,$76,$0D
74E6 DEFB $72,$0D,$74,$0D,$76,$0D,$78,$0D
74EE DEFB $7A,$0D,$44,$0B,$50,$19,$52,$05
74F6 DEFB $54,$18,$56,$0F,$48,$08,$4E,$19
74FE DEFB $46,$13,$4A,$05,$58,$05,$6C,$18
7506 DEFB $BA,$0A,$04,$1D,$02
750B DEFB $0D,$14,$01,$18,$18,$02,$14,$15
7513 DEFB $02,$09,$10,$03,$0C,$18,$03,$0C
751B DEFB $10,$03,$00,$08,$04,$1C,$1E,$04
7523 DEFB $0C,$12,$02,$1C,$1E,$04,$00,$0A
752B DEFB $04,$14,$18,$02,$10,$0C,$02,$0C
7533 DEFB $14,$04,$1C,$20,$02,$20,$26,$04
753B DEFB $14,$16,$02,$24,$35,$03,$18,$20
7543 DEFB $04,$1C,$1E,$03,$08,$0E,$03,$08
754B DEFB $0C,$03,$10,$14,$03,$08,$10,$04
7553 DEFB $18,$18,$03
7556: Data block at 7556
Per-terrain-code shape/behaviour pointer table, indexed by grid content code * 2 (code $00, unused since a $00 grid cell means "empty" and is never looked up, has a dummy entry). Read by 9ABC (player/object collision -- looks up the pointer, then reads further bytes for shape data) and 8E6E (creature/object setup, same table). 21 entries (codes $00-$14) pointing into the shape-record area starting at $7580; codes above $14 are never used as static grid content and have no entry.
7556 DEFW $1A1A
7558 DEFW $7580
755A DEFW $7582
755C DEFW $7584
755E DEFW $7586
7560 DEFW $7588
7562 DEFW $758A
7564 DEFW $758C
7566 DEFW $758E
7568 DEFW $7590
756A DEFW $7592
756C DEFW $7595
756E DEFW $7598
7570 DEFW $759B
7572 DEFW $759D
7574 DEFW $75A0
7576 DEFW $75A3
7578 DEFW $75A6
757A DEFW $75A9
757C DEFW $75AB
757E DEFW $75AE
7580 DEFB $02,$4A Shape record for terrain code $01 (7556)
7582 DEFB $02,$52 Shape record for terrain code $02 (7556)
7584 DEFB $02,$54 Shape record for terrain code $03 (7556)
7586 DEFB $02,$58 Shape record for terrain code $04 (7556)
7588 DEFB $02,$BA Shape record for terrain code $05 (7556)
758A DEFB $02,$48 Shape record for terrain code $06 (7556)
758C DEFB $02,$4E Shape record for terrain code $07 (7556)
758E DEFB $02,$50 Shape record for terrain code $08 (7556)
7590 DEFB $02,$46 Shape record for terrain code $09 (7556)
7592 DEFB $03,$3A,$BA Shape record for terrain code $0A (7556)
7595 DEFB $03,$42,$BA Shape record for terrain code $0B (7556)
7598 DEFB $03,$38,$BA Shape record for terrain code $0C (7556)
759B DEFB $02,$56 Shape record for terrain code $0D (7556)
759D DEFB $03,$76,$BA Shape record for terrain code $0E (7556)
75A0 DEFB $03,$7A,$BA Shape record for terrain code $0F (7556)
75A3 DEFB $03,$70,$BA Shape record for terrain code $10 (7556)
75A6 DEFB $03,$00,$6A Shape record for terrain code $11 (7556)
75A9 DEFB $02,$6C Shape record for terrain code $12 (7556)
75AB DEFB $03,$6D,$BA Shape record for terrain code $13 (7556)
75AE: Data block at 75AE
75AE DEFB $46,$4E,$50,$52,$54,$56,$6C
75B5: Decoration/creature spawner table (room-gated, see 8F82)
The real table starts at $75B6 (byte $75B5 itself precedes it and its role is unclear); consumed by 8F82 (spawns pairs) and likely other unidentified routines. Each record: offset 0 = total record length (8 + room-list length, a value under 8 marks the end of the table); offset 1 = active flag, tested nonzero, overwritten with the current room number once spawned; offset 2/3 = a handler word for other consumer routines (8F82 ignores it, always uses 9021); offset 4 = X, offset 5 = Y; offset 6 = kind (object +0x0A); offset 7 = waypoint tag (object +0x1A, see 925C); offset 8+ = the room-list, searched via CPIR against the current room.
75B5 DEFB $07 unknown, precedes the table
75B6 DEFB $0D,$01,$32,$92,$34,$34,$07,$00 header
75BE DEFB $04,$05,$06,$0B,$0C room-list
75C3 DEFB $09,$01,$1E,$92,$1C,$14,$07,$40 header
75CB DEFB $08 room-list
75CC DEFB $09,$01,$1E,$92,$1C,$24,$07,$40 header
75D4 DEFB $08 room-list
75D5 DEFB $0C,$01,$85,$90,$34,$34,$07,$00 header
75DD DEFB $0D,$0E,$14,$1A room-list
75E1 DEFB $09,$01,$08,$92,$14,$3C,$09,$00 header
75E9 DEFB $10 room-list
75EA DEFB $09,$01,$08,$92,$34,$0C,$09,$00 header
75F2 DEFB $10 room-list
75F3 DEFB $09,$01,$08,$92,$2C,$0C,$09,$00 header
75FB DEFB $12 room-list
75FC DEFB $09,$01,$08,$92,$14,$3C,$09,$00 header
7604 DEFB $19 room-list
7605 DEFB $09,$01,$08,$92,$34,$0C,$09,$00 header
760D DEFB $19 room-list
760E DEFB $0C,$01,$85,$90,$34,$34,$07,$00 header
7616 DEFB $1D,$1E,$23,$24 room-list
761A DEFB $09,$01,$A8,$90,$24,$3C,$07,$00 header
7622 DEFB $22 room-list
7623 DEFB $0A,$01,$85,$90,$1C,$24,$07,$00 header
762B DEFB $2B,$2C room-list
762D DEFB $0B,$01,$85,$90,$34,$34,$07,$00 header
7635 DEFB $2F,$30,$36 room-list
7638 DEFB $0C,$01,$32,$92,$24,$1C,$07,$00 header
7640 DEFB $34,$3A,$40,$46 room-list
7644 DEFB $09,$01,$32,$92,$34,$34,$07,$00 header
764C DEFB $38 room-list
764D DEFB $09,$01,$1E,$92,$1C,$2C,$07,$40 header
7655 DEFB $3B room-list
7656 DEFB $09,$01,$1E,$92,$24,$1C,$07,$40 header
765E DEFB $3B room-list
765F DEFB $0B,$01,$A8,$90,$24,$34,$07,$00 header
7667 DEFB $3E,$3F,$44 room-list
766A DEFB $09,$01,$08,$92,$14,$24,$09,$00 header
7672 DEFB $48 room-list
7673 DEFB $09,$01,$08,$92,$2C,$1C,$09,$00 header
767B DEFB $48 room-list
767C DEFB $09,$01,$08,$92,$04,$3C,$09,$00 header
7684 DEFB $4B room-list
7685 DEFB $09,$01,$08,$92,$3C,$04,$09,$00 header
768D DEFB $4B room-list
768E DEFB $0A,$01,$A8,$90,$1C,$24,$07,$00 header
7696 DEFB $4E,$54 room-list
7698 DEFB $0A,$01,$A8,$90,$1C,$0C,$07,$00 header
76A0 DEFB $55,$5B room-list
76A2 DEFB $0C,$01,$A8,$90,$34,$34,$07,$00 header
76AA DEFB $5C,$5D,$5E,$63 room-list
76AE DEFB $0C,$01,$A8,$90,$34,$34,$07,$00 header
76B6 DEFB $67,$68,$69,$6A room-list
76BA DEFB $09,$01,$32,$92,$34,$34,$07,$00 header
76C2 DEFB $6C room-list
76C3 DEFB $09,$01,$85,$90,$1C,$1C,$07,$00 header
76CB DEFB $6E room-list
76CC DEFB $0B,$01,$08,$92,$0C,$24,$09,$00 header
76D4 DEFB $75,$76,$7B room-list
76D7 DEFB $0B,$01,$08,$92,$2C,$0C,$09,$00 header
76DF DEFB $75,$76,$7B room-list
76E2 DEFB $09,$01,$1E,$92,$2C,$0C,$07,$40 header
76EA DEFB $78 room-list
76EB DEFB $09,$01,$1E,$92,$04,$2C,$07,$40 header
76F3 DEFB $78 room-list
76F4 DEFB $0D,$01,$85,$90,$24,$14,$07,$00 header
76FC DEFB $82,$87,$88,$8D,$8E room-list
7701 DEFB $09,$01,$32,$92,$34,$34,$07,$00 header
7709 DEFB $83 room-list
770A DEFB $0B,$01,$A8,$90,$24,$14,$07,$00 header
7712 DEFB $85,$8B,$8C room-list
7715 DEFB $09,$01,$1E,$92,$2C,$04,$07,$40 header
771D DEFB $86 room-list
771E DEFB $09,$01,$1E,$92,$0C,$34,$07,$40 header
7726 DEFB $86 room-list
7727 DEFB $09,$01,$08,$92,$0C,$2C,$09,$00 header
772F DEFB $8F room-list
7730 DEFB $09,$01,$08,$92,$2C,$0C,$09,$00 header
7738 DEFB $8F room-list
7739 DEFB $09,$01,$32,$92,$24,$1C,$07,$00 header
7741 DEFB $92 room-list
7742 DEFB $09,$01,$1E,$92,$1C,$2C,$07,$40 header
774A DEFB $93 room-list
774B DEFB $09,$01,$1E,$92,$2C,$1C,$07,$40 header
7753 DEFB $93 room-list
7754 DEFB $0C,$01,$A8,$90,$1C,$24,$07,$00 header
775C DEFB $94,$95,$96,$9A room-list
7760 DEFB $09,$01,$1E,$92,$1C,$2C,$07,$40 header
7768 DEFB $9D room-list
7769 DEFB $09,$01,$1E,$92,$2C,$1C,$07,$40 header
7771 DEFB $9D room-list
7772 DEFB $0B,$01,$85,$90,$24,$14,$07,$00 header
777A DEFB $9F,$A5,$A0 room-list
777D DEFB $09,$01,$1E,$92,$1C,$2C,$07,$40 header
7785 DEFB $A1 room-list
7786 DEFB $09,$01,$1E,$92,$2C,$1C,$07,$40 header
778E DEFB $A1 room-list
778F DEFB $09,$01,$08,$92,$14,$2C,$09,$00 header
7797 DEFB $A7 room-list
7798 DEFB $09,$01,$08,$92,$2C,$0C,$09,$00 header
77A0 DEFB $A7 room-list
77A1 DEFB $0B,$01,$85,$90,$0C,$34,$07,$00 header
77A9 DEFB $A8,$AE,$B4 room-list
77AC DEFB $09,$01,$08,$92,$14,$2C,$09,$00 header
77B4 DEFB $A9 room-list
77B5 DEFB $09,$01,$08,$92,$24,$24,$09,$00 header
77BD DEFB $A9 room-list
77BE DEFB $0B,$01,$32,$92,$1C,$24,$07,$00 header
77C6 DEFB $AA,$AF,$B0 room-list
77C9 DEFB $0A,$01,$32,$92,$1C,$24,$07,$00 header
77D1 DEFB $AB,$AC room-list
77D3 DEFB $09,$01,$08,$92,$24,$24,$09,$00 header
77DB DEFB $B1 room-list
77DC DEFB $09,$01,$08,$92,$24,$14,$09,$00 header
77E4 DEFB $B5 room-list
77E5 DEFB $09,$01,$08,$92,$2C,$34,$09,$00 header
77ED DEFB $B5 room-list
77EE DEFB $0A,$01,$85,$90,$14,$34,$07,$00 header
77F6 DEFB $B6,$BC room-list
77F8 DEFB $0D,$01,$32,$92,$34,$34,$07,$00 header
7800 DEFB $B7,$B8,$B9,$BE,$BF room-list
7805 DEFB $09,$01,$08,$92,$24,$24,$09,$00 header
780D DEFB $BA room-list
780E DEFB $09,$01,$32,$92,$24,$24,$07,$00 header
7816 DEFB $C1 room-list
7817 DEFB $0B,$01,$A8,$90,$1C,$24,$07,$00 header
781F DEFB $C2,$C3,$C4 room-list
7822 DEFB $09,$01,$1E,$92,$1C,$2C,$07,$40 header
782A DEFB $C5 room-list
782B DEFB $09,$01,$1E,$92,$2C,$1C,$07,$40 header
7833 DEFB $C5 room-list
7834 DEFB $09,$01,$1E,$92,$1C,$2C,$07,$40 header
783C DEFB $CC room-list
783D DEFB $09,$01,$1E,$92,$1C,$14,$07,$40 header
7845 DEFB $CC room-list
7846 DEFB $0B,$01,$32,$92,$2C,$24,$07,$00 header
784E DEFB $C7,$CD,$CE room-list
7851 DEFB $09,$01,$08,$92,$14,$24,$09,$00 header
7859 DEFB $C9 room-list
785A DEFB $09,$01,$08,$92,$1C,$1C,$09,$00 header
7862 DEFB $C9 room-list
7863 DEFB $0A,$01,$85,$90,$24,$14,$07,$00 header
786B DEFB $CA,$D0 room-list
786D DEFB $09,$01,$1E,$92,$1C,$24,$07,$40 header
7875 DEFB $D3 room-list
7876 DEFB $09,$01,$1E,$92,$2C,$1C,$07,$40 header
787E DEFB $D3 room-list
787F DEFB $09,$01,$85,$90,$24,$14,$07,$00 header
7887 DEFB $1C room-list
7888 DEFB $01,$5A unused
788A: Data block at 788A
788A DEFB $00,$01,$18,$6D "Empty hands" sentinel item record (room,Y,X,sprite) -- 6110 (currently-held item) points here when nothing is held; 8AFB compares against this fixed address to decide pick-up vs. drop
788E DEFB $00,$01,$18,$6D,$0F,$21,$54,$36
7896 DEFB $0F,$21,$54,$36,$1F,$22,$18,$36
789E DEFB $1F,$22,$18,$36,$35,$21,$54,$36
78A6 DEFB $35,$21,$54,$36,$45,$05,$30,$36
78AE DEFB $45,$05,$30,$36,$47,$2E,$18,$36
78B6 DEFB $47,$2E,$18,$36,$54,$21,$54,$36
78BE DEFB $54,$21,$54,$36,$5B,$12,$18,$36
78C6 DEFB $5B,$12,$18,$36,$6A,$33,$18,$36
78CE DEFB $6A,$33,$18,$36,$76,$37,$30,$36
78D6 DEFB $76,$37,$30,$36,$8D,$1A,$18,$36
78DE DEFB $8D,$1A,$18,$36,$9A,$21,$54,$36
78E6 DEFB $9A,$21,$54,$36,$9D,$21,$54,$36
78EE DEFB $9D,$21,$54,$36,$B7,$21,$54,$36
78F6 DEFB $B7,$21,$54,$36,$C1,$21,$54,$36
78FE DEFB $C1,$21,$54,$36,$CF,$2D,$30,$36
7906 DEFB $CF,$2D,$30,$36,$4A,$21,$54,$42
790E DEFB $4A,$21,$54,$42,$66,$2F,$18,$42
7916 DEFB $66,$2F,$18,$42,$8B,$22,$18,$38
791E DEFB $8B,$22,$18,$38,$72,$05,$18,$3A
7926 DEFB $72,$05,$18,$3A,$21,$17,$18,$72
792E DEFB $21,$17,$18,$72,$18,$24,$18,$72
7936 DEFB $18,$24,$18,$72,$34,$0A,$18,$72
793E DEFB $34,$0A,$18,$72,$71,$0C,$18,$72
7946 DEFB $71,$0C,$18,$72,$84,$1D,$18,$72
794E DEFB $84,$1D,$18,$72,$A6,$12,$18,$72
7956 DEFB $A6,$12,$18,$72,$C3,$1C,$18,$72
795E DEFB $C3,$1C,$18,$72,$2F,$04,$18,$3E
7966 DEFB $2F,$04,$18,$3E,$0E,$0E,$18,$3E
796E DEFB $0E,$0E,$18,$3E,$0C,$1B,$18,$3E
7976 DEFB $0C,$1B,$18,$3E,$53,$0F,$18,$3E
797E DEFB $53,$0F,$18,$3E,$6E,$04,$18,$3E
7986 DEFB $6E,$04,$18,$3E,$81,$02,$18,$3E
798E DEFB $81,$02,$18,$3E,$83,$2C,$18,$3E
7996 DEFB $83,$2C,$18,$3E,$96,$0E,$18,$3E
799E DEFB $96,$0E,$18,$3E,$A0,$25,$18,$3E
79A6 DEFB $A0,$25,$18,$3E,$AC,$23,$18,$3E
79AE DEFB $AC,$23,$18,$3E,$C2,$25,$18,$3E
79B6 DEFB $C2,$25,$18,$3E,$CC,$25,$18,$3E
79BE DEFB $CC,$25,$18,$3E,$41,$1D,$18,$76
79C6 DEFB $41,$1D,$18,$76,$2A,$01,$18,$76
79CE DEFB $2A,$01,$18,$76,$B5,$0D,$18,$76
79D6 DEFB $B5,$0D,$18,$76,$C5,$0B,$18,$76
79DE DEFB $C5,$0B,$18,$76,$67,$12,$18,$74
79E6 DEFB $67,$12,$18,$74,$15,$23,$18,$74
79EE DEFB $15,$23,$18,$74,$43,$2B,$18,$74
79F6 DEFB $43,$2B,$18,$74,$78,$0F,$18,$74
79FE DEFB $78,$0F,$18,$74,$87,$0E,$18,$74
7A06 DEFB $87,$0E,$18,$74,$93,$21,$54,$74
7A0E DEFB $93,$21,$54,$74,$A9,$1B,$18,$74
7A16 DEFB $A9,$1B,$18,$74,$AD,$23,$18,$74
7A1E DEFB $AD,$23,$18,$74,$BC,$27,$18,$74
7A26 DEFB $BC,$27,$18,$74,$BF,$0E,$18,$74
7A2E DEFB $BF,$0E,$18,$74,$CB,$34,$18,$74
7A36 DEFB $CB,$34,$18,$74,$91,$12,$18,$70
7A3E DEFB $91,$12,$18,$70,$7C,$13,$18,$70
7A46 DEFB $7C,$13,$18,$70,$A2,$0A,$18,$70
7A4E DEFB $A2,$0A,$18,$70,$BE,$2B,$18,$70
7A56 DEFB $BE,$2B,$18,$70,$5C,$35,$18,$78
7A5E DEFB $5C,$35,$18,$78,$1D,$1B,$18,$78
7A66 DEFB $1D,$1B,$18,$78,$3D,$2A,$18,$78
7A6E DEFB $3D,$2A,$18,$78,$4C,$2A,$18,$78
7A76 DEFB $4C,$2A,$18,$78,$7F,$21,$18,$78
7A7E DEFB $7F,$21,$18,$78,$9C,$35,$18,$78
7A86 DEFB $9C,$35,$18,$78,$62,$2F,$18,$78
7A8E DEFB $62,$2F,$18,$78,$8A,$0B,$18,$40
7A96 DEFB $8A,$0B,$18,$40,$04,$1B,$18,$40
7A9E DEFB $04,$1B,$18,$40,$48,$36,$18,$40
7AA6 DEFB $48,$36,$18,$40,$7B,$33,$18,$40
7AAE DEFB $7B,$33,$18,$40,$5D,$0C,$18,$40
7AB6 DEFB $5D,$0C,$18,$40,$9E,$37,$18,$40
7ABE DEFB $9E,$37,$18,$40,$A5,$26,$18,$40
7AC6 DEFB $A5,$26,$18,$40,$B4,$1D,$18,$40
7ACE DEFB $B4,$1D,$18,$40,$BA,$2E,$18,$40
7AD6 DEFB $BA,$2E,$18,$40,$CC,$25,$38,$40
7ADE DEFB $CC,$25,$38,$40,$07,$12,$18,$44
7AE6 DEFB $07,$12,$18,$44,$22,$0A,$18,$44
7AEE DEFB $22,$0A,$18,$44,$82,$1D,$18,$44
7AF6 DEFB $82,$1D,$18,$44,$A1,$0A,$18,$44
7AFE DEFB $A1,$0A,$18,$44,$D3,$12,$18,$44
7B06 DEFB $D3,$12,$18,$44,$24,$2D,$18,$3C
7B0E DEFB $24,$2D,$18,$3C,$13,$21,$54,$3C
7B16 DEFB $13,$21,$54,$3C,$8F,$21,$54,$3C
7B1E DEFB $8F,$21,$54,$3C,$AE,$27,$18,$3C
7B26 DEFB $AE,$27,$18,$3C,$CD,$23,$18,$3C
7B2E DEFB $CD,$23,$18,$3C,$06,$24,$18,$6E
7B36 DEFB $06,$24,$18,$6E,$08,$24,$18,$6E
7B3E DEFB $08,$24,$18,$6E,$0D,$24,$18,$6E
7B46 DEFB $0D,$24,$18,$6E,$16,$2E,$18,$6E
7B4E DEFB $16,$2E,$18,$6E,$17,$2D,$18,$6E
7B56 DEFB $17,$2D,$18,$6E,$1E,$0F,$18,$6E
7B5E DEFB $1E,$0F,$18,$6E,$20,$14,$18,$6E
7B66 DEFB $20,$14,$18,$6E,$28,$14,$18,$6E
7B6E DEFB $28,$14,$18,$6E,$31,$1B,$18,$6E
7B76 DEFB $31,$1B,$18,$6E,$33,$24,$18,$6E
7B7E DEFB $33,$24,$18,$6E,$39,$12,$18,$6E
7B86 DEFB $39,$12,$18,$6E,$3E,$0A,$18,$6E
7B8E DEFB $3E,$0A,$18,$6E,$42,$0B,$18,$6E
7B96 DEFB $42,$0B,$18,$6E,$46,$2D,$18,$6E
7B9E DEFB $46,$2D,$18,$6E,$51,$2A,$18,$6E
7BA6 DEFB $51,$2A,$18,$6E,$52,$0E,$18,$6E
7BAE DEFB $52,$0E,$18,$6E,$56,$37,$18,$6E
7BB6 DEFB $56,$37,$18,$6E,$5A,$2D,$30,$6E
7BBE DEFB $5A,$2D,$30,$6E,$5B,$37,$18,$6E
7BC6 DEFB $5B,$37,$18,$6E,$5F,$2D,$18,$6E
7BCE DEFB $5F,$2D,$18,$6E,$69,$37,$18,$6E
7BD6 DEFB $69,$37,$18,$6E,$6D,$12,$18,$6E
7BDE DEFB $6D,$12,$18,$6E,$6F,$0E,$18,$6E
7BE6 DEFB $6F,$0E,$18,$6E,$70,$19,$18,$6E
7BEE DEFB $70,$19,$18,$6E,$77,$24,$18,$6E
7BF6 DEFB $77,$24,$18,$6E,$80,$1B,$18,$6E
7BFE DEFB $80,$1B,$18,$6E,$89,$1B,$18,$6E
7C06 DEFB $89,$1B,$18,$6E,$8B,$1E,$18,$6E
7C0E DEFB $8B,$1E,$18,$6E,$95,$2D,$18,$6E
7C16 DEFB $95,$2D,$18,$6E,$98,$2C,$18,$6E
7C1E DEFB $98,$2C,$18,$6E,$A3,$1B,$18,$6E
7C26 DEFB $A3,$1B,$18,$6E,$A8,$2E,$18,$6E
7C2E DEFB $A8,$2E,$18,$6E,$AB,$23,$18,$6E
7C36 DEFB $AB,$23,$18,$6E,$AF,$22,$18,$6E
7C3E DEFB $AF,$22,$18,$6E,$B3,$1B,$18,$6E
7C46 DEFB $B3,$1B,$18,$6E,$B9,$2A,$18,$6E
7C4E DEFB $B9,$2A,$18,$6E,$BB,$34,$18,$6E
7C56 DEFB $BB,$34,$18,$6E,$BD,$0E,$18,$6E
7C5E DEFB $BD,$0E,$18,$6E,$C6,$24,$18,$6E
7C66 DEFB $C6,$24,$18,$6E,$C7,$14,$18,$6E
7C6E DEFB $C7,$14,$18,$6E,$D0,$2E,$18,$6E
7C76 DEFB $D0,$2E,$18,$6E,$D4,$1B,$18,$6E
7C7E DEFB $D4,$1B,$18
7C81 DEFW $7F6E
7C83 DEFB $3E,$78,$72,$74,$3C
7C88 DEFB $05
7C89: Creature hit/defeat lookup table (see 9401)
5 fixed (room,position,reward-sprite) triples, one per level. Position is $3C in every entry, the shared corner-cube grid cell; reward is $7A except level 3's $36.
7C89 DEFB $07,$3C,$7A
7C8C DEFB $22,$3C,$7A
7C8F DEFB $82,$3C,$36
7C92 DEFB $A1,$3C,$7A
7C95 DEFB $D3,$3C,$7A
7C98 DEFB $05 entry count (B in LD BC,($7C97) at 940E; the paired low byte at $7C97 coincides with the table's last byte, unused)
7C99 DEFB $00
7C9A: Data block at 7C9A
7C9A DEFW $7C9E,$7CA0
7C9E DEFB $53,$01
7CA0 DEFB $39,$00,$35,$02,$00,$01,$07,$01
7CA8 DEFB $52,$00,$00,$00
7CAC DEFW $7CB0,$7CB2
7CB0 DEFB $50,$00
7CB2 DEFB $64,$00,$45,$06,$15,$02,$35,$00
7CBA DEFB $00,$00
7CBC DEFW $7CC0,$7CC2
7CC0 DEFB $48,$00
7CC2 DEFB $84,$00,$12,$00,$25,$01,$00,$00
7CCA DEFW $7CCE,$7CD0
7CCE DEFB $00,$10
7CD0 DEFB $04,$15,$50,$01,$53,$26,$00,$00
7CD8 DEFW $7CDC,$7CDE
7CDC DEFB $70,$05
7CDE DEFB $88,$06,$32,$23,$33,$02,$23,$00
7CE6 DEFB $00,$00
7CE8 DEFW $7CF9 Print char routine vector (current print-engine mode; self-modified by 7D2D)
7CEA DEFW $EBAC Print cursor: current shadow screen print address
7CEC: Print engine entry point
Used by the routines at 8501, 854C, 854F, 85A1, 86CC and 885A.
Input
A char to print, or a control code ($14/$16)
Prints the char/control code in A by jumping through the vector at (7CE8).
7CEC PUSH HL save registers
7CED PUSH DE
7CEE PUSH BC
7CEF PUSH AF
7CF0 LD HL,$61A6 disable interrupt-driven redraw flag at 61A6 while printing
7CF3 LD (HL),$01
7CF5 LD HL,($7CE8) get Print char routine address
7CF8 JP (HL) jump to current print-engine mode handler
7CF9: Print char routine (default mode)
Input
A char to print, or a control code ($14/$16)
Prints char A as a font glyph at (7CEA), or switches mode for control codes $14/$16.
7CF9 CP $20 skip control codes (<$20), fall through for printable chars
7CFB JR C,$7D26
7CFD LD L,A convert char code to font glyph offset (glyph = (A-$20)*8, using codes starting at font base -$20*8)
7CFE LD H,$00
7D00 ADD HL,HL
7D01 ADD HL,HL
7D02 ADD HL,HL
7D03 LD DE,$A300 Font base address
7D06 ADD HL,DE
7D07 EX DE,HL
7D08 LD HL,($7CEA) copy 8 rows of the glyph to the shadow screen at (7CEA), stepping by 32 bytes/row
7D0B LD BC,$0020
7D0E LD A,$08
7D10 PUSH AF
7D11 LD A,(DE)
7D12 NOP !!MUT-CMD!! patched by 7D37
7D13 LD (HL),A
7D14 INC DE
7D15 ADD HL,BC next line
7D16 POP AF
7D17 DEC A
7D18 JR NZ,$7D10
7D1A LD HL,($7CEA) advance print cursor (7CEA) to the next character column
7D1D INC HL
7D1E LD ($7CEA),HL
This entry point is used by the routine at 7D3F.
7D21 POP AF
7D22 POP BC
7D23 POP DE
7D24 POP HL
7D25 RET
7D26 CP $14 control code $14: switch mode to 7D32 (set inverse/highlight flag)
7D28 JR NZ,$7D3F
7D2A LD HL,$7D32
This entry point is used by the routines at 7D32, 7D3F and 7D48.
7D2D LD ($7CE8),HL
7D30 JR $7D21
7D32: Print engine mode: set inverse video flag
Input
A flag: zero sets inverse video (CPL), non-zero sets normal video (NOP)
Self-modifies the LD A at 7D12 to CPL/NOP for subsequent chars.
7D32 AND A
7D33 JR Z,$7D37
7D35 LD A,$2F
7D37 LD ($7D12),A
This entry point is used by the routine at 7D57.
7D3A LD HL,$7CF9
7D3D JR $7D2D
7D3F: Print engine mode: dispatch control code $16
Used by the routine at 7CF9.
Input
A char to test against control code $16
Control code $16 switches mode to 7D48 (set cursor row); else return.
7D3F CP $16
7D41 JR NZ,$7D21
7D43 LD HL,$7D48
7D46 JR $7D2D
7D48: Print engine mode: set cursor row
Input
A cursor row
Sets print cursor row from A (row*256 + shadow screen base).
7D48 LD H,A
7D49 LD L,$00
7D4B LD DE,$E390 Shadow screen address
7D4E ADD HL,DE
7D4F LD ($7CEA),HL
7D52 LD HL,$7D57
7D55 JR $7D2D
7D57: Print engine mode: set cursor column
Input
A cursor column offset
Sets print cursor column from A, then switches back to default char-printing mode.
7D57 LD HL,($7CEA)
7D5A LD E,A
7D5B LD D,$00
7D5D ADD HL,DE
7D5E LD ($7CEA),HL
7D61 JR $7D3A
7D63: Data block at 7D63
7D63 DEFW $0000 Print string cursor: current shadow screen address for 7D68 string printer
7D65 DEFB $00
7D66 DEFB $00,$00
7D68: Print string routine
Used by the routines at 65DB, 8513 and 9808.
Input
HL string address (terminated by $5E)
Prints the string at (HL) to the shadow screen until terminator $5E; handles control codes $16 (set row+col) and $2B (newline, +8 rows).
7D68 LD A,$01 A = 1, set the "row advance" scratch $61A6
7D6A LD ($61A6),A
7D6D LD A,(HL) A = the next string byte, advance HL, test for control code $16
7D6E INC HL
7D6F CP $16
7D71 JP NZ,$7D9F Not $16: jump to the terminator/newline tests below
7D74 LD DE,$7D66 $16: copy the next 2 bytes (row,col) into scratch $7D66, advancing HL
7D77 LDI
7D79 LDI
7D7B LD A,($7D66) A = the row byte, C = it, isolate the low bit into $7D65, halve C
7D7E LD C,A
7D7F AND $01
7D81 LD ($7D65),A
7D84 SRL C A = the column byte + 1, B = it, the loop count
7D86 LD A,($7D67)
7D89 INC A
7D8A LD B,A
7D8B PUSH HL Save HL, the string pointer
7D8C LD HL,$E390 Shadow screen address
7D8F LD DE,$0020 DE = $20, the screen row stride
7D92 JR $7D95
7D94 ADD HL,DE Add the stride, advancing to the next row
7D95 DJNZ $7D94 Loop B times to reach the target row
7D97 ADD HL,BC Add the column offset (C), save the resulting screen address to $7D63
7D98 LD ($7D63),HL
7D9B POP HL Restore HL, the string pointer, loop back for the next character
7D9C JP $7D6D
7D9F CP $5E Test for the string terminator $5E
7DA1 RET Z Terminator: return
7DA2 CP $2B Test for the newline control code $2B
7DA4 JR NZ,$7DB1
7DA6 LD A,($7D67) Newline: advance the row scratch $7D67 by 8, loop back to reposition
7DA9 ADD A,$08
7DAB LD ($7D67),A
7DAE JP $7D7B
7DB1 CALL $7DC7 Print engine
7DB4 JP $7D6D Loop back for the next character
7DB7: Data block at 7DB7
7DB7 DEFB $00,$00,$00,$00,$00,$00,$00,$00
7DBF DEFB $20,$5B,$2D,$5C,$21,$5D,$2E,$5E
7DC7: Print engine: plot one character glyph into the shadow-screen font buffer, then blit it
Used by the routine at 7D68.
Looks up the character (searched in a small table at $7DBF) as an index into a font/glyph table at $A7DC (8 bytes/char), unpacks it into a working buffer at $7DB7 (nibble-swapped if the destination column is odd -- BIT 0,C), then merges it into the shadow screen at ($7D63): if the column-parity flag $7D65 is 0, ORs the low nibble in (right half of a byte pair); if 1, uses RLD to swap in the high nibble instead (left half) -- this is how two 4px-wide half-character columns share one screen byte. Advances $7D63 by one column/row afterward. Underlies the digit/score printing (854F/8523) and the general text print engine (7CEC).
7DC7 PUSH HL
7DC8 LD HL,$7DBF HL = the character table $7DBF, BC = 8
7DCB LD BC,$0008
7DCE CPIR search it for the character in A
7DD0 JR NZ,$7DD3
7DD2 LD A,(HL) found: A = the table's paired value
7DD3 SUB $30 normalize to a glyph index (subtract $30)
7DD5 CP $0A letters sit $07 further down the table
7DD7 JR C,$7DDB
7DD9 SUB $07
7DDB LD C,A C = the index, halved for the row-pair lookup
7DDC SRL A
7DDE LD L,A widen it to a word
7DDF LD H,$00
7DE1 ADD HL,HL multiply by 8, one glyph is 8 rows
7DE2 ADD HL,HL
7DE3 ADD HL,HL
7DE4 LD DE,($A7DC) add the font base ($A7DC)
7DE8 ADD HL,DE
7DE9 LD B,$08 B = 8 rows, DE = the work buffer $7DB7
7DEB LD DE,$7DB7
7DEE LD A,(HL) *loop: read a glyph row, test the destination column parity (bit 0 of C)
7DEF BIT 0,C
7DF1 JR Z,$7DF7
7DF3 RLCA odd column: rotate the nibble into the high half
7DF4 RLCA
7DF5 RLCA
7DF6 RLCA
7DF7 CPL mask to the high nibble
7DF8 AND $F0
7DFA LD (DE),A write it to the work buffer, advance both pointers
7DFB INC HL
7DFC INC DE
7DFD DJNZ $7DEE loop 8 times (one glyph row per iteration)
7DFF LD A,($7D65) test the column-parity flag $7D65
7E02 BIT 0,A
7E04 JP NZ,$7E27 already half-filled: take the RLD merge path instead
7E07 LD B,$08 B = 8 rows
7E09 LD DE,($7D63) DE = the screen row pointer $7D63, HL = the work buffer
7E0D LD HL,$7DB7
7E10 PUSH BC *loop: save the row counter
7E11 LD A,(DE) A = the screen byte, keep its low nibble
7E12 AND $0F
7E14 OR (HL) OR in the glyph's half-character
7E15 LD (DE),A
7E16 INC HL advance the work-buffer pointer
7E17 LD BC,$0020 advance the screen pointer by one row ($20 bytes)
7E1A EX DE,HL
7E1B ADD HL,BC
7E1C EX DE,HL
7E1D POP BC loop 8 times
7E1E DJNZ $7E10
7E20 LD A,$01 mark the parity flag as half-filled
7E22 LD ($7D65),A
7E25 POP HL restore HL and return
7E26 RET
7E27 LD B,$08 alternate path (parity flag set): B = 8 rows
7E29 LD DE,($7D63) DE = the screen row pointer, HL = the work buffer
7E2D LD HL,$7DB7
7E30 PUSH BC
7E31 LD A,(DE) A = the screen byte, RLD the glyph nibble into it
7E32 RLD
7E34 LD (DE),A store it back, advance the work buffer
7E35 INC HL
7E36 LD BC,$0020 advance the screen pointer by one row ($20 bytes)
7E39 EX DE,HL
7E3A ADD HL,BC
7E3B EX DE,HL
7E3C POP BC loop 8 times
7E3D DJNZ $7E30
7E3F XOR A clear the parity flag
7E40 LD ($7D65),A
7E43 LD HL,($7D63) advance $7D63 to the next character cell
7E46 INC HL
7E47 LD ($7D63),HL store it back
7E4A POP HL restore HL and return
7E4B RET
7E4C: Variables to use in routine 7E4F
7E4C DEFW $0000
7E4E DEFB $00
7E4F: Flip sprite horizontally
Used by the routine at 8128.
Input
L Sprite number
Looks up the A5DC record for sprite L (L*4 -- see A5DC), takes its data address (record[0..1]) and masked height (record[2]&$7F, in 8px rows) and width (record[3]&$7F, in 8px columns, toggling record[3] bit 7 in place each call so alternating calls flip between drawing the normal and mirrored image). For each of height*8 pixel rows, copies ceil(width/2) bytes from the front of the row to the back (and vice versa via HL/DE working inward from both ends), bit-reversing each byte with the RLA/RR chain at 7E83 -- the standard trick for mirroring a monochrome bitmap left-to-right. Used to derive a sprite's mirror-image facing from a single stored copy.
7E4F LD H,$00
7E51 ADD HL,HL
7E52 ADD HL,HL
7E53 LD DE,$A5DC Table of sprites address
7E56 ADD HL,DE
7E57 LD E,(HL)
7E58 INC HL
7E59 LD D,(HL)
7E5A INC HL
7E5B LD A,(HL) record[2]: height (mask off bit 7)
7E5C AND $7F
7E5E LD C,A
7E5F INC HL
7E60 LD A,(HL) record[3]: width -- toggle bit 7 in place (flip-flop flag, self-modifying), then mask it off
7E61 XOR $80
7E63 LD (HL),A
7E64 AND $7F
7E66 LD L,A
7E67 LD H,$00
7E69 LD ($7E4C),HL
7E6C SRL A halve the width, rounding up
7E6E ADC A,$00
7E70 LD ($7E4E),A
7E73 LD B,$08 outer loop: once per 8px-row group (height)
7E75 PUSH BC inner loop: 8 pixel rows per group
7E76 LD HL,($7E4C)
7E79 ADD HL,DE
7E7A PUSH HL
7E7B LD A,($7E4E)
7E7E LD B,A
7E7F AND A
7E80 DEC HL innermost loop: ceil(width/2) byte pairs per row
7E81 LD A,(DE)
7E82 LD C,(HL)
7E83 RLA rotate all 8 bits out of A and back into C in reverse order (unrolled x8)
7E84 RR C
7E86 RLA
7E87 RR C
7E89 RLA
7E8A RR C
7E8C RLA
7E8D RR C
7E8F RLA
7E90 RR C
7E92 RLA
7E93 RR C
7E95 RLA
7E96 RR C
7E98 RLA
7E99 RR C
7E9B RLA the final shifted-out bit
7E9C LD (DE),A
7E9D LD (HL),C
7E9E INC DE
7E9F DJNZ $7E80
7EA1 POP DE
7EA2 POP BC
7EA3 DJNZ $7E75
7EA5 DEC C
7EA6 JR NZ,$7E73
7EA8 RET
7EA9: Scan all 6 keyboard half-rows into the row-snapshot buffer at $6184 down to $617F, used by 7EBE's input reader
Used by the routine at 7EBE.
Reads 6 keyboard half-row ports in sequence, starting $7FFE, port high byte advanced by E each iteration, storing each row's byte into the buffer starting at $6184 and decrementing down through $617F. E starts at $80 and is rotated right each iteration, both selecting the next port's high-byte increment and terminating the scan, Z, once it has rotated out.
7EA9 LD HL,$6184 HL = the row buffer $6184, E = $80, the rotation seed, BC = the first port $7FFE
7EAC LD E,$80
7EAE LD BC,$7FFE
7EB1 IN D,(C) Read the row, store it, test/rotate E
7EB3 LD (HL),D
7EB4 AND A
7EB5 RR E
7EB7 RET Z All rows done: return
7EB8 DEC HL Otherwise advance HL, add E into B, the next port's high byte, loop
7EB9 LD A,B
7EBA ADD A,E
7EBB LD B,A
7EBC JR $7EB1
7EBE: Read input: normalize the active control method into the 5-bit mask at 6186
Used by the routine at 8968.
Dispatches on the device selector $617B: keyboard (scans 6 half-rows into $6186's bits, some duplicated -- e.g. both $617D and $6184 set bit 4/fire), Kempston (port $001F, used as the mask directly), Sinclair (port $EFFE, bit-rotated into the mask), or Cursor keys (ports $EFFE/$F7FE). Result is masked against the previous frame's value at $6188 and stored to $6186; also accumulates a held-key counter at $617C. See 6186 for the bit layout.
7EBE LD A,($617B) A = the device selector $617B
7EC1 AND A
7EC2 JP NZ,$7F8A not keyboard: branch to the joystick/cursor paths
7EC5 LD A,($6185) $6185 selects the alternate device path
7EC8 AND A
7EC9 JR NZ,$7F28
7ECB CALL $7EA9 Scan all 6 keyboard half-rows into the row-snapshot buffer at $6184 down to $617F, used by 7EBE's input reader
7ECE LD B,$00 B = 0, the mask accumulator
7ED0 LD A,($6182) row $6182 -> Up (bit 3)
7ED3 AND $1F
7ED5 XOR $1F
7ED7 JR Z,$7EDB
7ED9 SET 3,B
7EDB LD A,($617E) row $617E -> Down (bit 2)
7EDE AND $1F
7EE0 XOR $1F
7EE2 JR Z,$7EE6
7EE4 SET 2,B
7EE6 LD A,($6183) row $6183 -> Right (bit 0)
7EE9 AND $1F
7EEB XOR $1F
7EED JR Z,$7EF1
7EEF SET 0,B
7EF1 LD A,($617F) row $617F -> Left (bit 1)
7EF4 AND $1F
7EF6 XOR $1F
7EF8 JR Z,$7EFC
7EFA SET 1,B
7EFC LD A,($617D) row $617D -> Fire (bit 4)
7EFF AND $1F
7F01 XOR $1F
7F03 JR Z,$7F07
7F05 SET 4,B
7F07 LD A,($6184) row $6184 -> Fire (bit 4, second key group)
7F0A AND $1F
7F0C XOR $1F
7F0E JR Z,$7F12
7F10 SET 4,B
7F12 LD A,B *shared exit: A = the resolved mask
7F13 LD B,A
7F14 LD HL,$6188 mask against the previous frame's value ($6188)
7F17 AND (HL)
7F18 LD ($6186),A set Resolved input mask
7F1B LD A,B
7F1C CPL complement and force the unused bits, store as next frame's baseline
7F1D OR $CF
7F1F LD (HL),A
7F20 LD A,($617C) add the mask into the held-key counter $617C
7F23 ADD A,B
7F24 LD ($617C),A
7F27 RET
7F28 CP $01 device 1: Kempston
7F2A JR NZ,$7F33
7F2C LD BC,$001F read port $001F, used as the mask verbatim
7F2F IN A,(C)
7F31 JR $7F13
7F33 CP $02 device 2: Sinclair
7F35 JR NZ,$7F5A
7F37 LD BC,$EFFE read port $EFFE
7F3A IN A,(C)
7F3C CPL complement: a pressed key reads as 1
7F3D LD B,$00
7F3F RRCA bit 0 -> Fire (bit 4)
7F40 JR NC,$7F44
7F42 SET 4,B
7F44 RRCA bit 1 -> Up (bit 3)
7F45 JR NC,$7F49
7F47 SET 3,B
7F49 RRCA bit 2 -> Down (bit 2)
7F4A JR NC,$7F4E
7F4C SET 2,B
7F4E RRCA bit 3 -> Right (bit 0)
7F4F JR NC,$7F53
7F51 SET 0,B
7F53 RRCA bit 4 -> Left (bit 1)
7F54 JR NC,$7F12
7F56 SET 1,B
7F58 JR $7F12
7F5A LD BC,$EFFE Cursor keys: read port $EFFE
7F5D IN A,(C)
7F5F CPL
7F60 LD BC,$F7FE also read port $F7FE into C
7F63 IN C,(C)
7F65 BIT 4,C test the fire key (bit 4 of the $F7FE row)
7F67 JR NZ,$7F6B
7F69 SET 1,A
7F6B LD B,$00 B = 0, the mask accumulator
7F6D RRCA bit 0 -> Fire (bit 4)
7F6E JR NC,$7F72
7F70 SET 4,B
7F72 RRCA bit 1 -> Left (bit 1)
7F73 JR NC,$7F77
7F75 SET 1,B
7F77 RRCA bit 2 -> Right (bit 0)
7F78 JR NC,$7F7C
7F7A SET 0,B
7F7C RRCA bit 3 -> Up (bit 3)
7F7D JR NC,$7F81
7F7F SET 3,B
7F81 RRCA bit 4 -> Down (bit 2)
7F82 JP NC,$7F12
7F85 SET 2,B
7F87 JP $7F12
7F8A LD ($6186),A set Resolved input mask
7F8D RET
7F8E: Reset the redraw bounding-box trackers ($6194-$6197) to empty
Used by the routines at 676D and 9341.
Sets the min tracker ($6194/$6195) to $0000 and the max tracker ($6196/$6197) to $FFB9, sentinel values that any real screen rectangle will widen via 7F9B.
7F8E LD HL,$0000
7F91 LD ($6194),HL
7F94 LD HL,$FFB9
7F97 LD ($6196),HL
7F9A RET
7F9B: Fold a screen rectangle (DE = top/left, HL = bottom/right pair) into the running redraw bounding box $6194-$6197
Used by the routines at 7FCD and 8315.
Two near-identical passes: the first only lowers the min tracker at $6194/$6195, the second only raises the max tracker at $6196/$6197 -- consumed by 9C35's end-of-frame screen flip. Called by 7FCD (per-sprite) and 8315 (per wall/decoration piece).
7F9B LD HL,$6194 HL = $6194 (min tracker)
7F9E LD BC,$024C BC = $024C
7FA1 LD A,(DE) *loop: compare DE-C against (HL), skip the store if not smaller
7FA2 SUB C
7FA3 CP (HL)
7FA4 JR NC,$7FA7
7FA6 LD (HL),A
7FA7 INC DE advance DE/HL, reset C, loop (high byte then low byte)
7FA8 INC HL
7FA9 LD C,$00
7FAB DJNZ $7FA1
7FAD LD BC,$024C BC = $024C (second pass, HL continues into $6196, the max tracker)
7FB0 LD A,(DE) *loop: compare DE-C against (HL), skip the store if not greater
7FB1 SUB C
7FB2 CP (HL)
7FB3 JR C,$7FB6
7FB5 LD (HL),A
7FB6 INC DE advance DE/HL, reset C, loop
7FB7 INC HL
7FB8 LD C,$00
7FBA DJNZ $7FB0
7FBC RET return
7FBD: Data block at 7FBD
7FBD DEFB $01,$70,$E0
7FC0: Reset the sprite-draw clip window ($610A-$610D) to the full play-field
Used by the routines at 676D, 9341 and 9808.
Sets the clip window wide open: top/left to $4C/$00 and bottom/right to $FF/$FF, effectively disabling clipping until 8315 narrows it for the next piece.
7FC0 LD HL,$004C top/left = $004C/$00 (word write: $610A=$4C, $610B=$00)
7FC3 LD ($610A),HL
7FC6 LD HL,$FFFF bottom/right = $FFFF (word write: $610C/$610D wide open)
7FC9 LD ($610C),HL
7FCC RET
7FCD: Compute the current sprite's own screen bounding box, clamped to the play-field, and fold it into the redraw tracker
Used by the routine at 8128.
Gated on bit 0 of the flag byte $7FBD (skipped for sprites that shouldn't mark the screen dirty, e.g. HUD icons). Derives top/bottom from $7FBF/height and left/right from $7FBE/width (rounded to a 16px boundary), clamping every edge to the $4C play-field limit, then calls 7F9B to merge the box into $6194-$6197.
7FCD LD A,($7FBD) test the redraw-tracking flag (bit 0 of $7FBD), return if clear
7FD0 AND $01
7FD2 RET Z
7FD3 LD A,($7FBF) A = sprite top ($7FBF), clamp to at least $4C (the play-field top)
7FD6 CP $4C
7FD8 JR NC,$7FDC
7FDA LD A,$4C
7FDC LD ($610A),A store the clamped top into $610A
7FDF LD A,($7FBF) A = sprite bottom = top + height, clamp to 0 on overflow
7FE2 LD HL,$618F
7FE5 ADD A,(HL)
7FE6 JR NC,$7FE9
7FE8 XOR A
7FE9 DEC A decrement, clamp to at least $4C
7FEA CP $4C
7FEC JR NC,$7FF0
7FEE LD A,$4C
7FF0 LD ($610C),A store the clamped bottom into $610C
7FF3 INC HL HL = sprite width field, B = width * 4
7FF4 LD A,(HL)
7FF5 ADD A,A
7FF6 ADD A,A
7FF7 LD B,A
7FF8 LD A,($7FBE) A = sprite left ($7FBE) - B, round down to a 16px boundary
7FFB SUB B
7FFC AND $F0
7FFE LD ($610B),A
8001 LD A,($7FBE) A = sprite left + B - 1, round up to a 16px boundary, store as the right edge
8004 ADD A,B
8005 DEC A
8006 OR $0F
8008 LD ($610D),A
800B LD DE,$610A DE = $610A
800E JP $7F9B => Fold a screen rectangle (DE = top/left, HL = bottom/right pair) into the running redraw bounding box $6194-$6197
8011: Sprite draw: clip the current sprite against the screen window ($610A-$610D), adjusting its data pointer and dimensions
Used by the routine at 8128.
Compares the sprite's screen position/size (via $7FBE/$7FBF, 618F/6190) against the clip rectangle $610A(top)/$610B(left)/$610C(bottom)/$610D(right): shrinks the effective height/width and advances the sprite data pointers (618D, A5D8) when the top/left edges are off-window, and just shrinks the count when the bottom/right edges are off-window. Returns with Carry set if the sprite is fully off-window (nothing to draw), NC and A=0 otherwise. Called by 8128 before blitting.
8011 LD HL,$610A HL = clip top ($610A), A = sprite top ($7FBF)
8014 LD A,($7FBF)
8017 LD C,A
8018 CP (HL) not clipped at the top: skip ahead
8019 JR NC,$8046
801B LD A,(HL) top-clipped: clamp the sprite top to the clip edge
801C LD ($7FBF),A
801F SUB C B = the clipped-away row count
8020 LD B,A
8021 LD A,($618F) subtract it from the height ($618F)
8024 SUB B
8025 JR C,$8096 underflowed or exactly zero: fully off-window
8027 JR Z,$8096
8029 LD ($618F),A store the shrunk height
802C LD DE,($6190) DE = sprite width * rows-clipped (row byte count to skip)
8030 LD HL,$0000
8033 LD D,H
8034 ADD HL,DE *loop: HL += DE, DJNZ (multiply row-count by width)
8035 DJNZ $8034
8037 EX DE,HL DE = the byte count to skip, HL = the sprite data pointer
8038 LD HL,($618D)
803B ADD HL,DE advance it past the clipped rows
803C LD ($618D),HL
803F LD HL,($A5D8) same for the mask pointer ($A5D8)
8042 ADD HL,DE
8043 LD ($A5D8),HL store it back
8046 LD A,($7FBF) A = sprite top, HL = the height field $618F
8049 LD HL,$618F
804C ADD A,(HL) A = the sprite's bottom edge
804D DEC A
804E LD HL,$610C subtract the clip bottom ($610C)
8051 SUB (HL)
8052 JR C,$8060 no overhang: skip ahead
8054 LD B,A B = the overhang, A = the height
8055 LD A,($618F)
8058 SUB B shrink it
8059 JR C,$809A underflowed or exactly zero: fully off-window
805B JR Z,$809A
805D LD ($618F),A store the shrunk height
8060 LD A,($6190) A = the sprite width in bytes (*4)
8063 ADD A,A
8064 ADD A,A
8065 LD B,A B = it, A = the sprite's screen X ($7FBE)
8066 LD A,($7FBE)
8069 SUB B A = the left edge, aligned down
806A AND $F8
806C LD HL,$610B compare against the clip left ($610B)
806F CP (HL)
8070 JR NC,$807D not clipped: skip ahead
8072 LD C,A C = the sprite left, A = the clip left
8073 LD A,(HL)
8074 SUB C
8075 RRCA the difference divided by 8: the left-clip column shift
8076 RRCA
8077 RRCA
8078 AND $1F
807A LD ($8124),A store it at $8124
807D LD A,($7FBE) A = the sprite's screen X plus its width
8080 ADD A,B
8081 ADD A,$07 round up to a byte boundary
8083 AND $F8
8085 LD HL,$610D compare against the clip right ($610D)
8088 CP (HL)
8089 JR C,$8094 not clipped: skip ahead
808B SUB (HL) A = the overhang past the clip right
808C RRCA divided by 8: the right-clip column shift
808D RRCA
808E RRCA
808F AND $1F
8091 LD ($8125),A store it at $8125
8094 XOR A fully visible: return NC
8095 RET
8096 OR $01 top/left clip underflowed: return Carry (fully off-window)
8098 SCF
8099 RET
809A XOR A bottom/right clip underflowed: return Carry (fully off-window)
809B SCF
809C RET
809D: Sprite draw: build the per-row blit queue for the shadow screen, from the clipped sprite
Used by the routine at 8128.
Only proceeds for kind $01 (masked via $7FBD AND $7F -- the other kind uses a different path in 8128). Computes the shadow-screen row addresses (via a *8 multiply into a $DA10-based table, i.e. the standard row-address lookup) and column byte offset, then walks two loops (left part / right part of the queue, split at the sprite's row boundary) writing (dest_row_address, count) queue entries into the HUD/shadow blit-queue area at $5E24, one entry every 32 bytes -- consumed by 8107.
809D LD A,($7FBD) A = the draw-kind flags ($7FBD), masked
80A0 AND $7F
80A2 CP $01 only proceed for kind $01 (masked blit)
80A4 RET NZ
80A5 LD HL,($610A) HL = the clip window's top/left, A = the left column
80A8 LD A,H
80A9 LD H,$00 keep just the row
80AB ADD HL,HL multiply it by 32, the screen row stride
80AC ADD HL,HL
80AD ADD HL,HL
80AE ADD HL,HL
80AF ADD HL,HL
80B0 LD DE,$DA10 add the shadow-screen row-address base $DA10
80B3 ADD HL,DE
80B4 AND A A = the left column divided by 8
80B5 RRCA
80B6 RRCA
80B7 RRCA
80B8 LD E,A widen it to a word
80B9 LD D,$00
80BB ADD HL,DE add it to the destination address
80BC PUSH HL save the destination address
80BD LD A,($610C) A = clip bottom ($610C) minus clip left
80C0 LD BC,($610A)
80C4 SUB C
80C5 INC A +1: the visible width in bytes
80C6 AND A
80C7 LD DE,$5E24 DE = the blit queue $5E24
80CA DEC HL back the destination up two bytes, swap into HL
80CB DEC HL
80CC EX DE,HL
80CD LD (HL),E write the destination address into the queue entry
80CE INC HL
80CF LD (HL),D
80D0 INC HL
80D1 LD (HL),A write the row count after it
80D2 INC HL
80D3 EX DE,HL
80D4 PUSH AF save the count
80D5 LD BC,$0020 *loop: BC = 32, one screen row
80D8 LDI copy 2 bytes of this row's data
80DA LDI
80DC ADD HL,BC advance the destination by a row
80DD DEC A loop count times
80DE JR NZ,$80D5
80E0 LD A,($610D) A = clip right ($610D) minus clip top
80E3 LD BC,($610B)
80E7 SUB C +1: the second entry's span
80E8 INC A
80E9 AND A
80EA RRCA divide by 8 -> its row count
80EB RRCA
80EC RRCA
80ED LD C,A BC = it
80EE LD B,$00
80F0 POP AF restore the saved count and destination
80F1 POP HL
80F2 ADD HL,BC advance the destination past the first entry's rows
80F3 EX DE,HL
80F4 LD (HL),E write the second entry's destination address
80F5 INC HL
80F6 LD (HL),D
80F7 INC HL
80F8 LD (HL),A write its row count after it
80F9 INC HL
80FA EX DE,HL
80FB LD BC,$0020 *loop: BC = 32, one screen row
80FE LDI copy 2 bytes of this row's data
8100 LDI
8102 ADD HL,BC advance the destination by a row
8103 DEC A loop count times
8104 JR NZ,$80FB
8106 RET
8107: Sprite draw: execute the blit queue built by 809D, copying 2 planes (pixels+attributes?) per queued row
Used by the routine at 97BA.
Reads (address,count) entries from the queue at $5E24 (32 bytes apart), and for each does `count` LDI pairs from the current source into that row's destination -- the actual pixel-data copy into the shadow screen for the row-clipped sprite draw path.
8107 LD HL,$5E24 HL = pointer into the blit queue built by 809D
810A LD B,$02 B = 2, the loop count matching the two planes named in the title
810C PUSH BC Save BC, the outer loop counter
810D LD E,(HL) Read the destination address (E,D) and row count (A) from the queue entry, advancing HL past the 3-byte header
810E INC HL
810F LD D,(HL)
8110 INC HL
8111 LD A,(HL)
8112 INC HL
8113 LD BC,$0020 BC = $0020, the 32-byte screen row stride
8116 LDI Copy 2 bytes from (HL) to (DE), advancing both pointers
8118 LDI
811A EX DE,HL Swap HL/DE, add the stride to advance the source pointer, swap back
811B ADD HL,BC
811C EX DE,HL
811D DEC A Decrement the row counter
811E JR NZ,$8113 Loop back to $8113 while rows remain
8120 POP BC Restore BC
8121 DJNZ $810C Loop back to $810C for the second plane
8123 RET
8124: Data block at 8124
8124 DEFB $01,$00
8126 DEFB $4C Current sprite number (set by 8128)
8127 DEFB $4C Current mask sprite number (set by 8128)
8128: Draw sprite C with its mask at screen position DE (mask sprite number from the table at 6C06; A bit 7 = mirror flag)
Used by the routines at 6344, 6377, 642F, 64BB, 6543, 655E, 6593, 663B, 6895 and 97BA.
Input
A ??
C ??
Draws a sprite together with its paired mask sprite at a given screen position, optionally flipping either horizontally (via 7E4F) when the caller's flag byte disagrees with the sprite's own stored flip bit. Selects one of several blit paths depending on the caller's path selector (A bits, tested against $05/$03/$02/$01): a direct clipped draw via 8011/809D, or one of the row-queue builders (82F0 and friends) feeding the free-slot pool at $9D3C, later flushed by 8107.
8128 PUSH IX Save IX, HL, DE, BC
812A PUSH HL
812B PUSH DE
812C PUSH BC
812D LD ($7FBD),A Save the flags/kind byte A into $7FBD
8130 LD ($7FBE),DE Save the draw position DE into $7FBE
8134 LD HL,$6C06 HL = the mask-sprite lookup table $6C06, BC = sprite number
8137 LD B,$00
8139 ADD HL,BC Look up the mask sprite number for sprite C, save both to $8126/$8127
813A LD B,(HL)
813B LD ($8126),BC
813F LD L,B L = mask sprite number
8140 CALL $84ED Load a sprite's A5DC record into the "current sprite" scratch variables at 618D, ready for 8128 to draw it
8143 LD A,($7FBD) A = saved flags, test against the mask record's own flip bit
8146 XOR (HL)
8147 JP P,$8150 If sign matches (P), skip flipping
814A LD HL,($8127) HL = mask sprite data address
814D CALL $7E4F Flip sprite horizontally
8150 LD HL,($618D) Save the mask sprite's data address into $A5D8, then load the main sprite's number
8153 LD ($A5D8),HL
8156 LD HL,($8126) HL = main sprite number
8159 CALL $84ED Load a sprite's A5DC record into the "current sprite" scratch variables at 618D, ready for 8128 to draw it
815C LD A,($7FBD) A = saved flags, test against the main sprite record's own flip bit
815F XOR (HL)
8160 JP P,$8169 If sign matches (P), skip flipping
8163 LD HL,($8126) HL = main sprite data address
8166 CALL $7E4F Flip sprite horizontally
8169 LD HL,$7FBD Clear the saved-flags mirror bit
816C RES 7,(HL)
816E LD HL,$6190 HL = the sprite width byte, clear its top bit too
8171 RES 7,(HL)
8173 DEC HL Multiply the width by 8, three left shifts, via the byte before it
8174 SLA (HL)
8176 SLA (HL)
8178 SLA (HL)
817A LD A,($7FBD) A = saved flags, branch on which draw path
817D CP $02
817F JR Z,$818D If path 2, skip straight to the offset calculation
8181 CALL $7FCD Compute the current sprite's own screen bounding box, clamped to the play-field, and fold it into the redraw tracker
8184 CALL $8011 Sprite draw
8187 JP C,$830F If the draw reported off-screen (Carry), abort
818A CALL $809D Sprite draw
818D LD HL,($7FBF) HL = the record's data offset, widened to a word
8190 LD H,$00
8192 ADD HL,HL Multiply by 32, five left shifts, the byte offset within the sprite data
8193 ADD HL,HL
8194 ADD HL,HL
8195 ADD HL,HL
8196 ADD HL,HL
8197 LD A,($6190) A = the sprite's width in pixels, doubled twice to get its byte width, save it
819A ADD A,A
819B ADD A,A
819C LD B,A
819D LD A,($7FBE) Subtract the byte width from the saved draw position's X, re-save it, keep a copy in B
81A0 SUB B
81A1 LD ($7FBE),A
81A4 LD B,A Isolate the row bits of the adjusted X, rotate them into a row index
81A5 AND $F8
81A7 RRCA
81A8 RRCA
81A9 RRCA
81AA LD E,A DE = the row index, add it to the byte-offset HL from before
81AB LD D,$00
81AD ADD HL,DE
81AE LD DE,$DA10 Add a fixed base address $DA10, the sprite data area's start
81B1 ADD HL,DE
81B2 LD A,($7FBD) A = saved flags again, dispatch on path to the matching blit-queue builder
81B5 CP $05
81B7 JP Z,$8246 Path 5 goes to $8246
81BA CP $03 Path 3 goes to $82F0
81BC JP Z,$82F0
81BF CP $02 Path 2 also goes to $82F0
81C1 JP Z,$82F0
81C4 CP $01 Path 1 continues below, anything else goes to $8246
81C6 JR NZ,$8246
81C8 PUSH HL Save the sprite data pointer HL
81C9 LD A,($6190) C = sprite height in rows, A = the byte-width remainder test value
81CC LD C,A
81CD LD A,B
81CE AND $07 If the byte-width remainder is zero skip the extra row, else fall through
81D0 JR Z,$81D3
81D2 INC C C += 1, a partial row needs one more row of queue entries
81D3 LD IX,$9D3C IX = the free-slot scan pointer into table $9D3C
81D7 LD A,(IX+$00) Test whether this slot is free, its word field is zero
81DA OR (IX+$01)
81DD JR Z,$81F2 If free, use this slot
81DF LD E,(IX+$03) Otherwise skip past this slot's row entries to the next slot header
81E2 LD D,$00
81E4 LD B,(IX+$02)
81E7 ADD IX,DE Advance IX by the row stride, once per row
81E9 DJNZ $81E7 Loop for each row
81EB LD DE,$0004 Skip the 4-byte slot header, then re-test the next slot
81EE ADD IX,DE
81F0 JR $81D7 Loop back to re-scan
81F2 LD (IX+$00),L Found a free slot: write the sprite data pointer and row-byte-count into its header
81F5 LD (IX+$01),H
81F8 LD (IX+$02),C
81FB LD A,($618F) Write the sprite's height, row count, into the header's 4th byte
81FE LD (IX+$03),A
8201 LD DE,$0004 Advance IX past the header to the row-entry area
8204 ADD IX,DE
8206 PUSH IX DE = the row-entry area's address, save HL, the sprite data pointer
8208 POP DE
8209 PUSH HL
820A LD B,$00 B = 0, clear carry for a 16-bit subtraction
820C AND A
820D LD HL,$0020 HL = $0020, one screen row's stride, minus the byte width
8210 SBC HL,BC
8212 LD ($823B),HL Store the per-row stride into the blit-queue template at $823B
8215 SLA C C = byte width doubled, mask+sprite pair take 2 bytes per LDI
8217 LD HL,$823A HL = $823A minus the doubled width, another per-row stride variant
821A SBC HL,BC
821C LD ($8224),HL Store into the queue template at $8224
821F LD ($8240),HL Store the same value into the queue template at $8240
8222 POP HL Restore HL, the sprite data pointer
8223 JP $8232 !!MUT-ARG!! Jump into the blit-queue-building code at $8232
8226: Data block at 8226
8226 DEFB $ED,$A0,$ED,$A0,$ED,$A0,$ED,$A0
822E DEFB $ED,$A0
8230: Sprite draw: masked blit (AND mask, OR sprite data) into the shadow screen -- full-width and partial-width paths
$8230/$8232: unmasked/opaque row copy, 5 LDI's per iteration, advancing by the $1C (28) byte screen-row stride -- used when the sprite is a plain full-byte-width blit. $8246 onward: masked blit -- if the sprite's screen X is byte-aligned ($7FBE AND $07 == 0), does a straightforward per-byte `(dest AND NOT mask) OR sprite` merge loop at $8260. Otherwise ($8278-$82B7) handles a non-byte-aligned (shifted) mask/sprite pair: computes a jump offset from the sprite width into a self-modified entry point at $829C (a classic unrolled-loop/"duff's device" trick, jump target poked at $829D/$82CE) so the leftover partial column is merged with the right number of LDI's, then 82A6 does the AND/OR merge for the remaining full columns.
8230 LDI unrolled 5-LDI copy of one row, opaque blit
This entry point is used by the routine at 8128.
8232 LDI
8234 LDI
8236 LDI
8238 LDI }
823A LD BC,$001C !!MUT-ARG!! row stride ($1C)
823D ADD HL,BC advance by it, decrement the row count
823E DEC A
823F JP NZ,$8232 !!MUT-ARG!! loop while rows remain
8242 LD (DE),A terminate the row with two zero bytes
8243 INC DE
8244 LD (DE),A
8245 POP HL restore HL
This entry point is used by the routine at 8128.
8246 LD A,($7FBE) test the sprite's screen-X alignment (bits 0-2 of $7FBE), branch
8249 AND $07
824B JP NZ,$8278
This entry point is used by the routine at 82DB.
824E LD BC,($618F) byte-aligned masked path: BC = the sprite height/width
8252 LD DE,($A5D8) DE = the mask data pointer
8256 LD IX,($618D) IX = the sprite data pointer
825A LD A,$20 A = $20 minus the byte width
825C SUB B
825D LD ($826F),A store it as the row stride at $826F
8260 PUSH BC *outer row loop: push BC
8261 LD A,(DE) *inner loop: A = the mask byte, complemented
8262 CPL
8263 AND (HL) AND it with the screen byte
8264 OR (IX+$00) OR in the sprite byte
8267 LD (HL),A store the merged byte
8268 INC DE advance all three pointers
8269 INC HL
826A INC IX
826C DJNZ $8261 loop the row width
826E LD C,$1C !!MUT-ARG!! advance HL by the row stride, loop the outer count (C) times
8270 ADD HL,BC
8271 POP BC
8272 DEC C
8273 JR NZ,$8260
8275 JP $830E jump to the shared exit $830E
8278 PUSH HL non-aligned path: save HL
8279 LD A,($6190) A = the sprite width ($6190)
827C NEG 8 minus it: the unrolled-loop skip count
827E ADD A,$08
8280 LD B,A B = it, doubled into A
8281 ADD A,A
8282 LD ($829D),A store it as the jump offset at $829D
8285 ADD A,B x3 for the other loop, stored at $82CE
8286 LD ($82CE),A
8289 LD A,$02 A = 2, DE = the nibble-merge buffer $5EAC
828B LD DE,$5EAC
828E LD HL,($618D) HL = the sprite data pointer
8291 LD ($618D),DE point the sprite data at the merge buffer instead
This entry point is used by the routine at 82A6.
8295 PUSH AF *shared entry (also used by 82A6): save AF
8296 LD A,($618F) B = height, C = $FF
8299 LD B,A
829A LD C,$FF
This entry point is used by the routine at 82A6.
829C JR $829C !!MUT-ARG!! self-modified jump target for the duff's-device partial-column merge
829E: Data block at 829E
829E DEFB $ED,$A0,$ED,$A0,$ED,$A0,$ED,$A0
82A6: Non-aligned sprite blit: copy the nibble-merged buffer (built by 82DB) to the destination, row by row
Copies the nibble-merged row buffer, built by 82DB via a 4-LDI unrolled copy, to the destination, terminating each row with a zero byte, looping row-width (C) times per row and row-count (A, from height) times overall, advancing the mask-data pointer $A5D8 between rows. On the last row, falls into the setup for the next sprite's nibble-merge pass at 82DB.
82A6 LDI unrolled 4-LDI copy from the merge buffer to the destination
82A8 LDI
82AA LDI
82AC LDI
82AE XOR A terminate the row (write a zero byte), advance DE
82AF LD (DE),A
82B0 INC DE
82B1 DJNZ $829C loop C times (row width), then restore AF, decrement the row count
82B3 POP AF
82B4 DEC A test for the last row
82B5 JR Z,$82C0
82B7 LD HL,($A5D8) advance the mask-data pointer $A5D8 by DE, loop back to 8295
82BA LD ($A5D8),DE
82BE JR $8295
82C0 LD HL,$6190 last row done: advance the sprite width field, HL = sprite data pointer
82C3 INC (HL)
82C4 LD HL,($618D)
82C7 LD A,($618F) B = height*2, A = 0 (setup for the nibble-merge pass at 82DB)
82CA ADD A,A
82CB LD B,A
82CC XOR A
This entry point is used by the routine at 82DB.
82CD JR $82CD !!MUT-ARG!! self-modified jump target (part of the duff's-device trick)
82CF: Data block at 82CF
82CF DEFB $ED,$67,$23,$ED,$67,$23,$ED,$67
82D7 DEFB $23,$ED,$67,$23
82DB: Sprite draw: RRD nibble-shift tail for 5 planes, non-byte-aligned blit variant
Continuation of the nibble-merge pass, falls in from 82CD's self-modified jump: RRD-shifts 5 consecutive bytes to merge sprite/mask nibbles into the row buffer, one INC HL between each, then loops via 82CD for the next row before popping HL and returning to the shared dispatch at 824E.
82DB RRD RRD-shift 5 bytes to merge sprite/mask nibbles, advancing HL between each (unrolled x5)
82DD INC HL
82DE RRD
82E0 INC HL
82E1 RRD
82E3 INC HL
82E4 RRD
82E6 INC HL
82E7 RRD
82E9 INC HL
82EA DJNZ $82CD Loop for the next row
82EC POP HL Restore HL, return to the shared dispatch
82ED JP $824E
82F0: Sprite draw: full-width unmasked row copy (no mask needed, direct LDIR per row)
Used by the routine at 8128.
Copies BC rows, from $618F's height/width, of C bytes via LDIR from the sprite data ($618D) to the shadow screen, advancing the destination by the fixed $20 row stride between rows. Shares its exit path with 8230's masked blit.
82F0 LD BC,($618F) BC = sprite height/width, DE = sprite data address
82F4 LD DE,($618D)
82F8 LD A,C A = row count, swap B/C, B = 0
82F9 LD C,B
82FA LD B,$00
82FC PUSH BC *loop: save BC/HL
82FD PUSH HL
82FE EX DE,HL swap HL/DE (source vs dest), copy the row via LDIR, swap back
82FF LDIR
8301 EX DE,HL
8302 POP HL restore HL, advance by the row stride ($20), restore BC
8303 LD BC,$0020
8306 ADD HL,BC
8307 POP BC loop A times
8308 DEC A
8309 JR NZ,$82FC
830B JP $830E jump to the shared exit
This entry point is used by the routine at 8230.
830E XOR A shared exit: A = 0
This entry point is used by the routine at 8128.
830F POP BC restore all registers, return
8310 POP DE
8311 POP HL
8312 POP IX
8314 RET
8315: Draw a wall/decoration piece
Used by the routine at 835E.
Sets up the sprite-draw clip window ($610A-$610D) for the piece, then draws it and updates the redraw bounding box.
Reads a (index,height/width) record from (HL), converts the index to a screen row/column via a *8 lookup into $1C70 to get the clip window's top/left ($610A/$610B), derives bottom/right ($610D/$610C) from the record's height/width fields, then draws the piece with a self-modified LDIR row-copy and finishes by calling 7F9B to fold the drawn area into a running screen-bounding-box (min/max) used for redraw invalidation.
8315 LD E,(HL) DE = record word from (HL), advance HL past it, save HL
8316 INC HL
8317 LD D,(HL)
8318 INC HL
8319 PUSH HL HL = $1C70 + DE, *8 (screen row-address lookup)
831A LD HL,$1C70
831D ADD HL,DE
831E ADD HL,HL
831F ADD HL,HL
8320 ADD HL,HL
8321 LD A,H A = the row plus the $4C play-field origin
8322 ADD A,$4C
8324 LD ($610A),A store as the clip top ($610A), keep a copy in C
8327 LD C,A
8328 LD A,L store the column as the clip left ($610B)
8329 LD ($610B),A
832C LD B,A keep a copy in B
832D POP HL restore HL, A = the piece's height
832E LD A,(HL)
832F ADD A,A multiply it by 8
8330 ADD A,A
8331 ADD A,A
8332 ADD A,B plus the clip top, minus 1
8333 DEC A
8334 LD ($610D),A store as the clip bottom ($610D)
8337 LD A,$20 compute the self-modified LDIR row width, save the source byte and count
8339 SUB (HL)
833A LD ($8351),A
833D LD A,(HL)
833E LD ($834D),A
8341 INC HL compute the clip right ($610C) from the width field
8342 LD A,C
8343 ADD A,(HL)
8344 DEC A
8345 LD ($610C),A
8348 LD A,(HL) B = 0, read the source count/pointer
8349 INC HL
834A LD B,$00
834C LD C,$00 !!MUT-ARG!! *loop: row byte count (self-modified)
834E LDIR LDIR one row
8350 LD C,$00 !!MUT-ARG!! row byte count again (self-modified)
8352 EX DE,HL advance dest by the row stride
8353 ADD HL,BC
8354 EX DE,HL
8355 DEC A loop A times
8356 JR NZ,$834C
8358 LD DE,$610A DE = $610A, fold the drawn area into the redraw bounding box via 7F9B
835B JP $7F9B => Fold a screen rectangle (DE = top/left, HL = bottom/right pair) into the running redraw bounding box $6194-$6197
835E: Flush the queued redraw requests at $9D3C: draw each piece via 8315, then clear the queue
Used by the routine at 6B71.
Resets the bounding-box trackers $6194/$6196 (see 7F8E/7F9B), then walks the request list at $9D3C: each entry is a (marker-word, count, stride) triple; a zero marker word ends the list. For each entry, advances a pointer by the stride, count times (computing where the next entry starts), and counts entries in C. Once the list is exhausted, replays each counted piece by walking back through it and calling 8315 to draw it, then clears the queue head.
835E LD HL,$FFB9 reset the bounding-box min tracker $6194
8361 LD ($6194),HL
8364 LD HL,$0000 reset the bounding-box max tracker $6196
8367 LD ($6196),HL
836A LD HL,$9D3C HL = redraw-request list $9D3C, C = 0 (entry count)
836D LD C,$00
836F LD A,(HL) *loop: test the node's marker word, exit if zero (list end)
8370 INC HL
8371 OR (HL)
8372 JR Z,$8382
8374 PUSH HL save the node pointer, advance past its header
8375 INC HL
8376 LD B,(HL) B = its piece count
8377 INC HL
8378 LD E,(HL) DE = its stride, widened
8379 INC HL
837A LD D,$00
837C ADD HL,DE *inner loop: advance HL by the stride, B times
837D DJNZ $837C
837F INC C count this entry, loop to the next node
8380 JR $836F
8382 LD A,C A = entry count, test for zero
8383 AND A
8384 JR Z,$8390
8386 POP HL restore the node pointer (adjusted back by one), save the count
8387 DEC HL
8388 PUSH AF
8389 CALL $8315 Draw a wall/decoration piece
838C POP AF loop count times
838D DEC A
838E JR $8383
8390 LD HL,$0000 clear the queue head, return
8393 LD ($9D3C),HL
8396 RET
8397: Data block at 8397
8397 DEFB $A1,$0F,$00,$00,$00,$00,$CB,$00
839F DEFB $CB,$00,$43,$01,$43,$01,$6B,$01
83A7 DEFB $6B,$01,$93,$01,$93,$01,$E3,$01
83AF DEFB $E3,$01,$33,$02,$33,$02,$83,$02
83B7 DEFB $83,$02,$23,$03,$23,$03,$B3,$04
83BF DEFB $B3,$04,$7B,$05,$7B,$05,$00,$00
83C7 DEFB $93,$01,$23,$03,$00,$00,$B2,$04
83CF DEFB $93,$01,$00,$00,$EB,$03,$91,$01
83D7 DEFB $00,$00,$D0,$07,$D0,$07,$40,$06
83DF DEFB $40,$06,$B0,$04,$B0,$04,$20,$03
83E7 DEFB $20,$03,$90,$01,$90,$01,$90,$01
83EF DEFB $90,$01,$20,$03,$20,$03,$B0,$04
83F7 DEFB $B0,$04,$40,$06,$40,$06,$D0,$07
83FF DEFB $D0,$07,$60,$09,$60,$09,$F0,$0A
8407 DEFB $F0,$0A,$80,$0C,$80,$0C,$10,$0E
840F DEFB $10,$0E,$A0,$0F,$A0,$0F,$A0,$0F
8417 DEFB $A0,$0F,$10,$0E,$10,$0E,$80,$0C
841F DEFB $80,$0C,$F0,$0A,$F0,$0A,$60,$09
8427 DEFB $60,$09,$D0,$07,$D0,$07,$00,$00
842F DEFB $9D,$83,$9D,$83,$97,$83,$D3,$83
8437 DEFB $C7,$83,$D9,$83,$CD,$83,$D9,$83
843F DEFB $D9,$83,$D9,$83,$9D,$83
8445: Per-frame sound-effect player: step the currently-playing effect's tone commands
Used by the routine at 6AF1.
Reads the current effect ID from $61A3 (1-based; 0 = none playing), indexes a pointer table at $842F, then walks a list of command words via IX, extracting a 2-bit pitch/octave selector from each and calling the ROM tone routine at $03B6. On reaching a zero terminator word, clears $61A3 and immediately checks for a newly-queued effect (loops back to re-test).
8445 LD A,($61A0) check the sound-enable flag $61A0, return if off
8448 AND A
8449 RET Z
844A LD A,($61A3) check the currently-playing effect ID $61A3, return if none
844D AND A
844E RET Z
844F DEC A A = (effect id - 1) * 2
8450 ADD A,A
8451 LD L,A widen it into HL
8452 LD H,$00
8454 LD DE,$842F add the sound-effect pointer table $842F
8457 ADD HL,DE
8458 LD ($845D),HL store the entry address at $845D
845B LD IX,($842F) !!MUT-ARG!! IX = the effect's command-word data
845F LD L,(IX+$00) *loop: read the next command word, done if zero (table end)
8462 LD H,(IX+$01)
8465 LD A,L
8466 OR H
8467 JR Z,$8487
8469 SRL H shift the command word right, low bit into A
846B RR L
846D RRA
846E SRL H shift it again, second bit into A
8470 RR L
8472 RLA rotate the two collected bits into place
8473 RLCA
8474 AND $03 mask to 0-3, add 1, E = result
8476 INC A
8477 LD E,A
8478 LD D,$00 call the ROM tone routine ($03B6) with the pitch/duration
847A PUSH IX
847C CALL $03B6
847F POP IX advance IX to the next command word, loop back
8481 INC IX
8483 INC IX
8485 JR $845F
8487 XOR A table exhausted: clear the current-effect ID, check for a newly-queued effect
8488 LD ($61A3),A
848B JP $844A
848E: Request sound effect A (queued at $61A2, gated by the $61A0/$61A1 flags)
Used by the routines at 6622, 8968, 8AFB, 90A8, 91A6, 925C, 9341, 9401, 94F4, 9602, 9923 and 9C35.
$61A0 nonzero forces an immediate switch (overwrites $61A3 directly, interrupting whatever's playing); otherwise, if $61A1 is set, the effect is queued at $61A2/$61A3=$FF (consumer not in this routine); if $61A1 is clear, the request is dropped. Exact meaning of $61A0/$61A1 not confirmed.
848E PUSH BC save BC/HL, B = requested effect ID
848F PUSH HL
8490 LD B,A
8491 LD A,($61A0) test $61A0, branch away (force-switch) if busy
8494 AND A
8495 JR NZ,$84A7
8497 LD A,($61A1) test $61A1 (queue-enable), return without queuing if clear
849A AND A
849B JR Z,$84A4
849D LD HL,$61A2 write the effect ID to $61A2 and a pending marker ($FF) to $61A3
84A0 LD (HL),B
84A1 INC HL
84A2 LD (HL),$FF
84A4 POP HL restore HL/BC, return
84A5 POP BC
84A6 RET
84A7 LD A,B force-switch path: write the effect ID directly to $61A3
84A8 LD ($61A3),A
84AB POP HL
84AC POP BC
84AD RET
84AE: Dynamic object allocator
Used by the routines at 6663, 8E3F, 8EA7, 8EF2, 8F1E, 8F4C, 90A8, 957C and 9923.
Allocates one entry from a free-list of object records (creatures, bubble sources, snakes, whirlpools, plugs -- anything not baked into the static room grid; see 612C). Every caller has 2 embedded bytes immediately after its CALL instruction, holding the little-endian address of that call site's per-object behaviour handler (marked with a W-line at each site, e.g. 666C). On the early-exit path ($618C is 0): pops the return address and skips exactly those 2 bytes (INC HL twice, then JP (HL)) -- no object is allocated, and the handler address is discarded unread. On the success path: pops the SAME return address into HL, then LDIs those same 2 bytes as literal data into the new record's offset $03/$04 (the handler-pointer field), pushes the now-advanced HL (pointing just past the 2 bytes) back onto the stack, copies a fixed 19-byte block from $5C92 (ZX system-variable area, reused as a default object state template) into the rest of the record, then RETs -- popping that pushed address, so execution resumes 2 bytes past the CALL either way. The 2 bytes are never executed as code on either path. Allocation + list insertion: pops the next free record off the free-list head at $618B (each free record's first 2 bytes point to the next free record; the free list can extend outside the A900 pool, e.g. into scratch at $5B00). Then head-inserts the new record into the active object list at the insertion point given by IX: copies the old head word from (IX+0/1) into the new record's +0/+1 link field, then writes the new record's address back to (IX+0/1). IX is usually 610E (the global list head), but can be any record's own link field (e.g. $8DEF for creatures -- see 6663), which splices the object into the middle of the list instead. Switches IX to the new record's address, stores the current room number ($6126) at record offset $02. Sets a flag bit (A=1) and returns with IX = the new record's address. Object pool starts at A900.
84AE LD A,($618C) test $618C, branch to the success path if allocation is enabled
84B1 AND A
84B2 JR NZ,$84B8
84B4 POP HL early-exit: pop the return address, skip the 2 embedded bytes, resume there
84B5 INC HL
84B6 INC HL
84B7 JP (HL)
84B8 LD HL,($618B) pop the next free record off the free list
84BB LD E,(HL)
84BC INC HL
84BD LD D,(HL)
84BE LD ($618B),DE update the free-list head
84C2 LD A,(IX+$01) copy 2 bytes from the caller's template pointer (IX) into the freed slot, to keep the free list intact
84C5 LD (HL),A
84C6 DEC HL
84C7 LD A,(IX+$00)
84CA LD (HL),A
84CB LD (IX+$00),L switch IX to the new record's address
84CE LD (IX+$01),H
84D1 PUSH HL HL = the new record's address
84D2 POP IX
84D4 EX DE,HL DE = HL + 2 (destination for the room-number field)
84D5 INC DE
84D6 INC DE
84D7 LD A,($6126) get room number
84DA LD (DE),A
84DB INC DE
84DC POP HL pop the return address, LDI the 2 embedded handler-address bytes into the record
84DD LDI
84DF LDI
84E1 PUSH HL push the advanced return address back
84E2 LD HL,$5C92 copy the fixed 19-byte default state block from $5C92
84E5 LD BC,$0013
84E8 LDIR
84EA OR $01 set the flag bit, return
84EC RET
84ED: Load a sprite's A5DC record into the "current sprite" scratch variables at 618D, ready for 8128 to draw it
Used by the routine at 8128.
Input
L Sprite number
Looks up the A5DC record for sprite L (L*4), then copies all 4 raw bytes (data address, height, and width -- the width byte copied unmasked, flip-flop bit 7 and all) into 618D/618F/6190. Called by 8128 before it draws a sprite by number.
84ED LD H,$00
84EF ADD HL,HL
84F0 ADD HL,HL
84F1 LD DE,$A5DC sprite table base (A5DC)
84F4 ADD HL,DE
84F5 LD DE,$618D destination: current-sprite scratch variables (618D)
84F8 LDI copy data address (2 bytes) and height (1 byte)
84FA LDI
84FC LDI
84FE LD A,(HL) copy width byte as-is (unmasked, includes the flip-flop flag bit)
84FF LD (DE),A
8500 RET
8501: Print string at HL until terminator byte $5E or $2B
Used by the routines at 850E and 85A1.
Input
HL Address of the string to print (bytes are printed one at a time via 7CEC; the string ends at the first $5E or $2B byte, which is consumed but not printed)
Loops over bytes at HL, printing each one via 7CEC (the print engine, which also interprets embedded control codes like $14/$16 seen at 8623/861A), until it reads a terminator byte ($5E or $2B) -- returns with HL pointing just past the terminator. Called directly with HL already pointing at a string (e.g. from 8513), and via 850E for inline strings embedded right after a CALL.
8501 LD A,(HL)
8502 INC HL
8503 CP $5E terminator check: $5E
8505 RET Z
8506 CP $2B terminator check: $2B
8508 RET Z
8509 CALL $7CEC Print engine entry point
850C JR $8501 => Print string at HL until terminator byte $5E or $2B
850E: Print an inline string embedded right after the caller's CALL instruction
Used by the routines at 663B, 6895, 68C1, 85A1 and 86CC.
Pops the return address off the stack into HL -- since the caller used CALL $850E, this is the address of the string bytes immediately following that CALL. Calls 8501 to print the string (advancing HL past it), then JP (HL) to resume execution right after the embedded string, i.e. normal code flow continues past the inline text.
850E POP HL
850F CALL $8501 Print string at HL until terminator byte $5E or $2B
8512 JP (HL) resume execution after the inline string
8513: Print a message-window string
Used by the routines at 8968, 8AFB, 8C35 and 925C.
Fixed prefix from $65CF, then an inline colour/control byte stored to $618A, then the caller's own inline string.
8513 LD HL,$65CF
8516 CALL $7D68 Print string routine
8519 POP HL
851A LD A,(HL)
851B LD ($618A),A
851E INC HL
851F CALL $7D68 Print string routine
8522 JP (HL)
8523: Print a BCD number
Used by the routines at 86CC and 885A.
B bytes from (HL), two digits per byte, leading zeros as spaces; DE = per-digit print routine (self-modifies 854C's JP).
8523 LD ($854D),DE Set the per-digit print routine, self-modify 854C's JP target
8527 LD C,$20 C = $20, the "space" blank-digit code
8529 XOR A A = 0, E = the next BCD byte, RLD-rotate its high nibble into A
852A LD E,(HL)
852B RLD
852D AND A
852E JR Z,$8532 If the high nibble is 0, keep the space code, else C = $30, the digit code base
8530 LD C,$30
8532 ADD A,C A = the printable digit code
8533 CALL $854C Print one digit
8536 LD (HL),E Write the rotated byte back, decrement the digit-pair counter B
8537 DEC B
8538 JR NZ,$853C If not the last pair, force C back to the digit code base $30
853A LD C,$30
853C INC B A = the low nibble, test it
853D LD A,E
853E AND $0F
8540 JR Z,$8544 If nonzero, force C to the digit code base $30
8542 LD C,$30
8544 ADD A,C A = the printable digit code
8545 CALL $854C Print one digit
8548 INC HL Advance HL, loop for the next byte pair
8549 DJNZ $8529
854B RET
854C: Print one digit (JP target self-modified by 8523)
Used by the routine at 8523.
Self-modified JP target: 8523 patches the operand here before calling, so this resolves to whichever routine (usually 7CEC, the print engine entry point) should print the current digit.
854C JP $7CEC !!MUT-ARG!! => Print engine entry point
854F: Print BCD byte A as two digits, high digit blanked to a space if zero
Used by the routines at 663B, 6895 and 86CC.
Rotates A's high nibble down, prints it via 7CEC as a digit, or a space ($F0 sentinel) if it's zero, then prints the low nibble as a digit unconditionally.
854F PUSH AF
8550 RRCA
8551 RRCA
8552 RRCA
8553 RRCA
8554 AND $0F
8556 JR NZ,$855A
8558 LD A,$F0
855A ADD A,$30
855C CALL $7CEC Print engine entry point
855F POP AF
8560 AND $0F
8562 ADD A,$30
8564 JP $7CEC => Print engine entry point
8567: Entry-point room number table (menu keys A/B/C/D)
4 bytes, one per starting location, in order A/B/C/D: $52 (level 3, row 1, col 4), $C0 (level 6, row 2, col 0), $1A (level 1, row 4, col 2), $84 (level 4, row 4, col 0). See x-docs/Room-Format.md for the full cube-position table and cross-check against an external game map.
8567 DEFB $52,$C0,$1A,$84
856B: Controls sub-menu text
"1 KEYBOARD 2 KEMPSTON 3 SINCLAIR 4 CURSOR", printed by 8617 via the 7CEC print engine.
856B DEFM "1 KEYBOARD+2 KEMPSTON+3 SINCLAIR+4 CURSOR+",$5E
8596: System/interrupt setup before the main menu
Used by the routine at 6B05.
Sets IY from $61A4, a fixed system variables area, enables IM 1 interrupts, and clears a flag byte at $FBAA before falling into 85A1's main menu loop.
8596 LD IY,($61A4)
859A IM 1
859C EI
859D XOR A
859E LD ($FBAA),A
85A1: Main menu screen: title, entry list A-D, controls menu; loops until a selection starts the game
Prints the title, the CONTROLS heading, and the 4 level entries (A-D, Elvis song titles). Each frame, redraws the Controls sub-list with the currently-selected control method (from $6185) shown inverse, and the music/SFX toggle labels reflecting $61A0/$61A1. Waits, via FB90, for a key selecting a level or toggling an option, looping until a level is chosen.
85A1 CALL $850E Print an inline string embedded right after the caller's CALL instruction
85A4 DEFM $14,$00,$16,$00,$00,"DEATHBOWL." main menu title
85B3 DEFM $16,$00,$14,"CONTROLS." sub-heading
85BF DEFM $16,$02,$00,"A RETURN TO SENDER" key A entry name
85D4 DEFM $16,$04,$00,"B JAIL HOUSE ROCK" key B entry name
85E8 DEFM $16,$06,$00,"C O SOLE O MIO" key C entry name
85F9 DEFM $16,$08,$00,"D HEARTBREAK HOTEL",$5E key D entry name (Elvis song titles)
860F LD A,($6185)
8612 ADD A,$01
8614 LD C,A
8615 LD B,$02
8617 LD HL,$856B load pointer to Controls menu text at 856B
861A LD A,$16 control code $16: set print cursor row (selects the menu row to print into)
861C CALL $7CEC
861F LD A,B
8620 CALL $7CEC Print engine entry point
8623 LD A,$14 control code $14 + flag: set/clear inverse video for the currently selected control method
8625 CALL $7CEC
8628 INC B
8629 INC B
862A DEC C
862B JR NZ,$8637
862D LD A,$14
862F CALL $7CEC Print engine entry point
8632 LD A,$01
8634 CALL $7CEC Print engine entry point
8637 CALL $8501 Print string at HL until terminator byte $5E or $2B
863A LD A,$14 control code $14 + $01: restore inverse video flag to normal
863C CALL $7CEC
863F XOR A
8640 CALL $7CEC Print engine entry point
8643 LD A,(HL)
8644 CP $5E
8646 JR NZ,$861A
8648 LD A,($61A0)
864B AND A
864C JR NZ,$8681
864E CALL $850E Print an inline string embedded right after the caller's CALL instruction
8651 DEFM $16,$0A,$14,"5 ",$5E stray "5" (control-code list index? unclear)
8657 LD A,($61A1)
865A AND A
865B JR NZ,$8670
865D CALL $850E Print an inline string embedded right after the caller's CALL instruction
8660 DEFM $14,$01,"MUSIC",$14,$00,"/SFX",$5E "MUSIC" label, shown selected/inverse
866E JR $8681
8670 CALL $850E Print an inline string embedded right after the caller's CALL instruction
8673 DEFM "MUSIC/",$14,$01,"SFX",$14,$00,$5E "SFX" label, shown selected/inverse
8681 CALL $9C35 End-of-frame screen flip
8684 LD (IY-$32),$00
8688 LD B,$32
868A HALT
868B DJNZ $868A
868D CALL $FB90 Menu tune + key-wait driver
8690 RST $38
8691 LD A,(IY-$32)
8694 AND A
8695 JR Z,$8688
8697 CP $31
8699 JR C,$8684
869B CP $35
869D JR NZ,$86AA
869F LD A,($61A1)
86A2 XOR $01
86A4 LD ($61A1),A
86A7 JP $85A1 => Main menu screen
86AA JR NC,$86B4
86AC SUB $31
86AE LD ($6185),A
86B1 JP $85A1 => Main menu screen
86B4 OR $20
86B6 SUB $61
86B8 JR C,$8684
86BA CP $04
86BC JR NC,$8684
86BE LD L,A
86BF LD H,$00
86C1 LD BC,$8567 load pointer to entry-point room number table (8567) -- used to look up the starting room for the pressed menu key A/B/C/D
86C4 ADD HL,BC
86C5 LD A,(HL)
86C6 LD ($6125),A set entry-point room number
86C9 IM 2
86CB RET
86CC: Draw the end-game stats screen
Used by the routine at 676D.
Prints the "DEATHBOWL DIVINED" title and the stat labels (Score Scraped, Plugs Pulled, Goodies Gathered, Gnomes Gnabbed), then the elapsed play-time from $6121/$6120 as BCD minutes:seconds (leading zero blanked) via 7CEC, followed by the score and the other end-game counters (6122-6124).
86CC CALL $850E Print an inline string embedded right after the caller's CALL instruction
End-game stats overlay labels (see 676D: called only when room==1)
86CF DEFM $14,$00,$16,$00,$0D,"DEATHBOWL DIVINED" title
86E5 DEFM $16,$02,$0D,"SCORE SCRAPED" stat label
86F5 DEFM $16,$04,$0D,"PLUGS PULLED" stat label
8704 DEFM $16,$06,$0D,"GOODIES GATHERED" stat label
8717 DEFM $16,$08,$0D,"GNOMES GNABBED" stat label
8728 DEFM $16,$00,$01,$5E cursor position only, no visible text
872C LD HL,$6121
872F LD C,$20
8731 LD A,(HL)
8732 RRCA
8733 RRCA
8734 RRCA
8735 RRCA
8736 AND $0F
8738 JR Z,$873C
873A LD C,$30
873C ADD A,C
873D CALL $7CEC Print engine entry point
8740 LD A,(HL)
8741 AND $0F
8743 JR Z,$8747
8745 LD C,$30
8747 ADD A,C
8748 CALL $7CEC Print engine entry point
874B DEC HL
874C LD A,(HL)
874D RRCA
874E RRCA
874F RRCA
8750 RRCA
8751 AND $0F
8753 ADD A,$30
8755 CALL $7CEC Print engine entry point
8758 LD A,$2E
875A CALL $7CEC Print engine entry point
875D LD A,(HL)
875E AND $0F
8760 ADD A,$30
8762 CALL $7CEC Print engine entry point
8765 LD A,$25
8767 CALL $7CEC Print engine entry point
876A CALL $850E Print an inline string embedded right after the caller's CALL instruction
876D DEFM $16,$02,$01,$5E cursor position only, no visible text (positions for a stat value printed separately)
8771 LD HL,$611D
8774 LD B,$03
8776 LD DE,$7CEC
8779 CALL $8523 Print a BCD number
877C CALL $850E Print an inline string embedded right after the caller's CALL instruction
877F DEFM $16,$04,$05,$5E cursor position only, no visible text
8783 LD A,($6124) get "Plugs Pulled" end-game stat counter
8786 CALL $854F Print BCD byte A as two digits, high digit blanked to a space if zero
8789 CALL $850E Print an inline string embedded right after the caller's CALL instruction
878C DEFM $16,$06,$05,$5E cursor position only, no visible text
8790 LD A,($6123) get "Goodies Gathered" end-game stat counter
8793 CALL $854F Print BCD byte A as two digits, high digit blanked to a space if zero
8796 CALL $850E Print an inline string embedded right after the caller's CALL instruction
8799 DEFM $16,$08,$05,$5E cursor position only, no visible text
879D LD A,($6122) get "Gnomes Gnabbed" end-game stat counter
87A0 CALL $854F Print BCD byte A as two digits, high digit blanked to a space if zero
87A3 LD A,($617A)
87A6 CP $02
87A8 RET NZ
87A9 LD A,($6124) get "Plugs Pulled" end-game stat counter
87AC CP $04
87AE JR Z,$87FD
87B0 CALL $850E Print an inline string embedded right after the caller's CALL instruction
End-game message, shown on an early/partial completion outcome
87B3 DEFM $16,$15,$02,"HYDROFOOL - DONT GO SO FAST" line 1
87D1 DEFM $16,$16,$07,"THE WISE MAN PULLS" line 2
87E6 DEFM $16,$17,$07,"THE LAST PLUG LAST",$5E line 3
87FC RET
87FD CALL $850E Print an inline string embedded right after the caller's CALL instruction
End-game message, shown on full completion (all 4 plugs pulled)
8800 DEFM $16,$14,$05,"THE FOURTH PLUG PULLED" line 1
8819 DEFM $16,$15,$05,"JUST LIKE YOU PLANNED" line 2
8831 DEFM $16,$16,$07,"SO - SEE YOU SOON" line 3
8845 DEFM $16,$17,$08,"- IN WUNDERLAND!",$5E line 4
8859 RET
885A: Redraw the score display on HUD (last 4 BCD digits of 611B via 8523)
Used by the routines at 676D, 888E and 8894.
Sets the print cursor and inverse-video controls, then prints 4 bytes (8 BCD digits) from $611C via 8523, using 7CEC as the per-digit print routine, skipping the top digit at $611B.
885A LD A,$16
885C CALL $7CEC Print engine entry point
885F LD A,$14
8861 CALL $7CEC Print engine entry point
8864 LD A,$18
8866 CALL $7CEC Print engine entry point
8869 LD HL,$611C
886C LD B,$04
886E LD DE,$7CEC
8871 JP $8523 => Print a BCD number
8874: Unused
8874 DEFS $05
8879: Add a 5-digit BCD value at 8874 to the score (611B)
Used by the routine at 888E.
Saves the bonus value (HL) to scratch $8874, then adds it byte-by-byte, 5 bytes BCD via DAA, to the score at $611B-$611F, working from the low byte (DE=$611F) upward while HL walks the bonus bytes forward.
8879 LD ($8874),HL Save the bonus value to scratch $8874
887C LD HL,$8874 HL = the bonus bytes, DE = the score's low byte, B = 5
887F LD DE,$611F
8882 LD B,$05
8884 XOR A
8885 LD A,(DE) *loop: A = the score byte plus the bonus byte
8886 ADC A,(HL)
8887 DAA BCD-adjust and store it back
8888 LD (DE),A
8889 INC HL step both pointers
888A DEC DE
888B DJNZ $8885 loop over all 5 bytes
888D RET
888E: Add a bonus (HL, 5-digit BCD) to the score, then redraw the score display
Used by the routines at 88D7 and 8AFB.
Calls 8879 to add the bonus (HL) to the score, then falls into 885A to redraw the score HUD.
888E CALL $8879 Add a 5-digit BCD value at 8874 to the score
8891 JP $885A => Redraw the score display on HUD
8894: Subtract a BCD value from the score
Used by the routine at 88DD.
Subtracts a 5-digit BCD value at 8874 from the score (611B); if the score can't cover it, resets $611B-$611F from a fixed 5-byte block at $5C92 instead.
Whether the $5C92 fallback is a genuine "reset score" or coincidentally reuses the same default-state bytes seen elsewhere (see A900) is unconfirmed.
8894 LD ($8874),HL Save the subtrahend to scratch $8874
8897 LD HL,$8874 HL = the subtrahend bytes, DE = the score's low byte, B = 5
889A LD DE,$611F
889D LD B,$05
889F XOR A
88A0 LD A,(DE) *loop: A = the score byte minus the subtrahend byte
88A1 SBC A,(HL)
88A2 DAA BCD-adjust and store it back
88A3 LD (DE),A
88A4 INC HL step both pointers
88A5 DEC DE
88A6 DJNZ $88A0 loop over all 5 bytes
88A8 JP NC,$885A => Redraw the score display on HUD
88AB LD HL,$5C92 Score underflowed: HL = the fixed reset block $5C92, DE = the score $611B, BC = 5
88AE LD DE,$611B
88B1 LD BC,$0005
88B4 LDIR Copy the reset block over the score
88B6 JP $885A => Redraw the score display on HUD
88B9: Read the next value from a small circular queue, head pointer at IY+0/1, wrap pointer at IY+2/3, advancing the head
Used by the routines at 88D7 and 88DD.
HL = the head pointer stored at IY+0/1; if the value there is null (0), wraps to the alternate start pointer at IY+2/3 instead. Advances and stores the new head pointer (HL+2) back to IY+0/1, then returns the read value in DE.
88B9 LD L,(IY+$00) HL = the head pointer (IY+0/1)
88BC LD H,(IY+$01)
88BF LD E,(HL) Read the entry there (E,D), advancing HL past it
88C0 INC HL
88C1 LD D,(HL)
88C2 INC HL
88C3 LD A,E If the value is nonzero, use it
88C4 OR D
88C5 JR NZ,$88CF
88C7 LD L,(IY+$02) Otherwise wrap: HL = the alternate start pointer (IY+2/3)
88CA LD H,(IY+$03)
88CD JR $88BF Retry the read from there
88CF LD (IY+$00),L Store the advanced HL back as the new head pointer (IY+0/1)
88D2 LD (IY+$01),H
88D5 EX DE,HL DE = the value read, return
88D6 RET
88D7: Add a bonus to the score, value from a circular queue via 88B9
Used by the routines at 6743, 8AFB and 91A6.
Reads the next bonus value from the circular queue via 88B9, then adds it to the score via 888E.
88D7 CALL $88B9 Read the next value from a small circular queue, head pointer at IY+0/1, wrap pointer at IY+2/3, advancing the head
88DA JP $888E => Add a bonus (HL, 5-digit BCD) to the score, then redraw the score display
88DD: Subtract a BCD value from the score, value from a circular queue via 88B9
Used by the routines at 6743, 8968 and 925C.
Reads the next value from the circular queue via 88B9, then subtracts it from the score via 8894.
88DD CALL $88B9 Read the next value from a small circular queue, head pointer at IY+0/1, wrap pointer at IY+2/3, advancing the head
88E0 JP $8894 => Subtract a BCD value from the score
88E3: Search the buffer at $7C83 for byte A (CPIR, length from $7C88)
Used by the routines at 6895 and 8AFB.
Searches the weapon lookup table at $7C83, length from $7C88, for byte A via CPIR; Z indicates found. Used by 8B2B's pickup logic to recognize weapon items.
88E3 LD HL,$7C83
88E6 LD BC,($7C88)
88EA LD B,$00
88EC CPIR
88EE RET
88EF: Data block at 88EF
88EF DEFB $00
Input-mask -> direction-code priority table, scanned by 8968: (mask,direction) byte pairs, tried in order, first whose mask bits overlap ($6186's mask OR $80) wins. $08,$01 (Up bit -> direction $01); $04,$02 (Down bit -> $02); $02,$06 (Left bit -> $06); $01,$04 (Right bit -> $04); $80,$00 (default/no-input catch-all -- mask bit 7 always matches since 8968 ORs $80 into the scan key -- resolves to direction $00, i.e. no movement).
88F0 DEFB $08,$01
88F2 DEFB $04,$02
88F4 DEFB $02,$06
88F6 DEFB $01,$04
88F8 DEFB $80,$00
88FA DEFB $16,$16,$17,$17,$16,$16,$18,$18
8902 DEFB $16,$16,$17,$17,$1E,$1E,$18,$18
890A DEFB $FF,$02,$02,$03,$03,$02,$02,$04
8912 DEFB $04,$02,$02,$03,$03,$0A,$0A,$04
891A DEFB $04,$FF,$FA,$88,$0B,$89,$08,$07
8922 DEFB $07,$08,$08,$07,$07,$FF,$FE,$01
892A DEFB $08,$FE,$01,$08,$08,$FE,$FF,$08
8932 DEFB $FE,$FF,$08,$08,$FF,$FE,$01,$08
893A DEFB $FE,$01,$08,$FE,$02,$08,$FE,$02
8942 DEFB $08,$FF,$48,$89,$4F,$89,$FE,$FE
894A DEFB $19,$19,$19,$19,$FF,$FE,$FE,$05
8952 DEFB $05,$05,$05,$FF,$5A,$89,$61,$89
895A DEFB $15,$15,$15,$15,$15,$15,$FF,$01
8962 DEFB $01,$01,$01,$01,$01,$FF
8968: PLAYER per-frame behaviour handler
This is the handler address held in the player object record's +3/+4 field ($8DB9 -- see 8DB6), called every frame from 983C's dispatcher like any other object handler. Explains its many special cases: room $01 check (ending room), the vertical room transitions (8A87), etc. The player's handler pointer is swappable for state changes: 955A tests ($8DB9)==$8968 ("normal state?"), 9564 swaps in 8D11.
MOVEMENT: reads the input mask at 6186 (OR $80, a wildcard sentinel), then scans the (mask,direction) pair table at 88F0 for the first entry whose mask overlaps -- this resolves the raw multi-button input into a single prioritized direction code (0/1=Up, 2/3=Down, 4/5=Right, 6/7=Left; the low bit distinguishes sub-states, masked off by 8ABB's AND $0E). If the resolved direction equals the player's current facing ((IX+$0B)), calls 8AD9 immediately to take a step; if it differs and is nonzero, just updates the pending-direction latch at $8DC1 (turning takes one frame before the first step); if it resolves to 0 (no input), no movement happens this frame.
8968 LD A,($6126)
896B CP $01
896D JP Z,$8CAA
8970 BIT 6,(IX+$0D)
8974 JP NZ,$8A6B
8977 CALL $7EBE Read input
897A LD A,(IX+$0D)
897D BIT 1,A
897F JP NZ,$89D6
8982 BIT 0,A
8984 JP NZ,$89D6
8987 LD A,($6126) get room number
898A CP $02
898C JR NZ,$899B
898E LD A,($6125) get Entry-point room number choosen selecting A/B/C/D in menu
8991 AND A
8992 JP Z,$89C9
8995 LD (IX+$0A),$00
8999 JR $89C6
899B CALL $8CDF Player dive-depth step
899E CALL $8AFB Fire/pick-up button handler
89A1 LD A,($6186) get Resolved input mask
89A4 OR $80 set bit 7 as a wildcard sentinel, for the 88F0 priority-table scan (matches its default/no-input entry)
89A6 LD HL,$88F0
89A9 LD C,A
89AA LD A,(HL)
89AB INC HL
89AC AND C
89AD JR NZ,$89B2
89AF INC HL
89B0 JR $89AA
89B2 LD A,(HL)
89B3 LD B,A
89B4 CP (IX+$0B)
89B7 JR NZ,$89BB
89B9 JR $89C6
89BB LD A,B
89BC AND A
89BD JR NZ,$89C1
89BF JR $89C9
89C1 LD ($8DC1),A
89C4 JR $89C9
89C6 CALL $8AD9 Take one walk step
This entry point is used by the routine at 8D11.
89C9 LD IX,$8DB6
89CD LD HL,$891C
89D0 CALL $99A7
89D3 JP $9A60 => Dynamic object finalizer
89D6 LD A,($6501)
89D9 ADD A,$02
89DB LD ($6501),A
89DE LD A,$01
89E0 LD ($8DC5),A
89E3 LD HL,$948B
89E6 LD ($9493),HL
89E9 LD A,$05
89EB CALL $848E Request sound effect A
89EE LD IY,$7CBC
89F2 CALL $88DD Subtract a BCD value from the score, value from a circular queue via 88B9
89F5 CALL $8513 Print a message-window string
89F8 DEFB $14 attribute/control byte for 8513's inline string
89F9 DEFM " OO-ER! ",$5E message text, terminated by $5E
8A07 LD (IX+$0B),$06
8A0B CALL $923E Save continuation
8A0E LD HL,$8920
8A11 CALL $99D5 Sprite-animation stepper
8A14 RET NC
8A15 LD (IX+$0F),$0F
8A19 BIT 1,(IX+$0D)
8A1D JR NZ,$8A23
8A1F LD (IX+$0F),$00
8A23 LD A,$0C
8A25 LD ($88EF),A
8A28 CALL $923E Save continuation
8A2B LD HL,$8928
8A2E CALL $99D5 Sprite-animation stepper
8A31 LD HL,$88EF
8A34 DEC (HL)
8A35 RET NZ
8A36 CALL $923E Save continuation
8A39 LD HL,$8928
8A3C CALL $99D5 Sprite-animation stepper
8A3F CALL $7EBE Read input
8A42 LD A,($6186) get Resolved input mask
8A45 AND $1F test for ANY key pressed (bits 0-4)
8A47 RET Z
8A48 LD HL,$9489
8A4B LD ($9493),HL
8A4E LD HL,$8968
8A51 LD ($8DB9),HL set player behaviour-handler pointer
8A54 LD (IX+$0A),$00
8A58 LD (IX+$0F),$00
8A5C RES 1,(IX+$0D)
8A60 RES 0,(IX+$0D)
8A64 LD (IX+$18),$00
8A68 JP $89C9
8A6B CALL $9A49 Snap the object's position (IX+5/+6) to its grid-cell centre, then finalize via 9A60
8A6E RES 6,(IX+$0D)
8A72 LD (IX+$07),$38
8A76 LD A,($6126) get room number
8A79 CP $01
8A7B JR Z,$8A82
8A7D SUB $24 change room number: -36 (one level DOWN, via whirlpool)
8A7F JP $97FC => Change current room to A = new room number
8A82 LD A,$02 room==1 special case: force A=2 instead
8A84 JP $97FC => Change current room to A = new room number
8A87: Attempt to move to an adjacent room (vertical, via whirlpool/bubble)
Used by the routine at 8D11.
Computes the room number one level down ($6126 - $24, i.e. -36 -- a whirlpool) or one level up ($6126 + $24, i.e. +36 -- a bubble), the 6x6x6 cube level-stride (see x-docs/Room-Format.md). Has special-case handling when the current room number is exactly 1 (down) or 2 (up) -- overrides the computed value instead of using the generic +-36 arithmetic; not yet understood why. The upward case also bounds-checks the result against $D9 before allowing it (JP C,97FC), falling back to a different path (through $8C83) if out of range. 97FC is called with the new room number to actually perform the transition, same as the horizontal case (67F1).
8A87 LD A,$98
8A89 SUB (IX+$17)
8A8C ADD A,(IX+$05)
8A8F ADD A,(IX+$06)
8A92 SUB $4C
8A94 LD (IX+$07),A
8A97 LD A,($6126) get room number
8A9A CP $02
8A9C JR Z,$8AAD
8A9E ADD A,$24 change room number: +36 (one level UP, via bubble)
8AA0 CP $D9 bounds check: is the new room number in range?
8AA2 JP C,$97FC => Change current room to A = new room number
8AA5 LD A,$02 out of range: fall back instead of changing room
8AA7 LD ($617A),A
8AAA JP $8C83
8AAD LD A,($6125) room==2 special case: use $6125 instead
8AB0 JP $97FC => Change current room to A = new room number
8AB3: Direction -> screen position delta table, indexed by (facing_code AND $0E): 4 (dx,dy) pairs -- Up=(-2,0), Down=(+2,0), Right=(0,+2), Left=(0,-2). Read by 8ABB.
8AB3 DEFB $FE,$00,$02,$00,$00,$02,$00,$FE
8ABB: Apply the object's facing direction to its position (IX+5/+6), returning the OLD position in BC
Used by the routines at 8AD9, 9021, 90A8, 925C and 9963.
Looks up (IX+$0B) AND $0E in the delta table at 8AB3 and adds it to the object's position (+5/+6) in place. Screen deltas are +-2px along one axis per direction (Up/Down move dx, Right/Left move dy) -- the isometric-diamond room layout means each cardinal game direction is a diagonal-looking step on screen along a single axis. Used by 8AD9 (player movement) and 9923.
8ABB LD HL,$8AB3 HL = the facing-delta table $8AB3 (entry 8ABE skips this, letting the caller supply a different table)
This entry point is used by the routine at 9923.
8ABE LD A,(IX+$0B) A = the object's facing (IX+$0B)
8AC1 AND $0E Index = facing AND $0E, widened to a word in DE
8AC3 LD E,A
8AC4 LD D,$00
8AC6 ADD HL,DE HL = this direction's delta-table entry
8AC7 LD A,(IX+$05) A = the object's X (IX+5), save it in B, add the delta's dx
8ACA LD B,A
8ACB ADD A,(HL)
8ACC LD (IX+$05),A Store the updated X back (IX+5), advance to the delta's dy byte
8ACF INC HL
8AD0 LD A,(IX+$06) A = the object's Y (IX+6), save it in C, add the delta's dy
8AD3 LD C,A
8AD4 ADD A,(HL)
8AD5 LD (IX+$06),A Store the updated Y back (IX+6) and return
8AD8 RET
8AD9: Take one walk step
Used by the routine at 8968.
Applies the facing delta, then checks for a room-edge/door transition and a collision, reverting the position if blocked.
CALLs 8ABB to move (IX+5/+6) by the facing delta (old position saved in BC), then 67F1 (door/room-transition check) and 9BF0 (grid + object collision check). If 9BF0 reports no collision (NC), the new position is kept as-is. If it reports a collision (C): if also Z, pokes $FF into offset +9 of the colliding object's record (DE, from 9BF0/9ABC) -- disables it; either way, the position is then reverted to the saved BC (blocked), and the animation countdown (+0x0E) is reset.
8AD9 CALL $8ABB Apply the object's facing direction to its position (IX+5/+6), returning the OLD position in BC
8ADC PUSH BC
8ADD CALL $67F1 Attempt to move to an adjacent room (horizontal, via a door) in the direction given by
8AE0 CALL $9BF0 Collision test
8AE3 JR C,$8AE7
8AE5 POP BC
8AE6 RET
8AE7 JR NZ,$8AEF
8AE9 LD HL,$0009
8AEC ADD HL,DE
8AED LD (HL),$FF
8AEF POP BC
8AF0 LD (IX+$05),B
8AF3 LD (IX+$06),C
8AF6 LD (IX+$0E),$00
8AFA RET
8AFB: Fire/pick-up button handler: attack with the held weapon, or pick up/drop an item
Used by the routine at 8968.
Gated on the fire/pick-up key (bit 4 of 6186); if a weapon is currently held ($619E), jumps to 8D8D (attack) instead. Otherwise plays a "reach out" animation, then continues at $8B2B: if the held-item pointer 6110 currently equals the fixed "empty hands" sentinel record at $788A (i.e. nothing held), attempts to PICK UP something nearby; otherwise DROPS the currently-held item.
PICK UP ($8B2B, nothing currently held): walks nearby objects via 9B5D (proximity/collision helper, same one used by movement collision), skipping any whose kind byte (offset +8 from the found record) is $44 (the shared "vulnerable creature" pose -- not pickupable). For the first valid candidate: if its kind is $6E, calls 6622 (unidentified -- likely a special pickup, e.g. a key or weapon-specific item); if its kind is $36, treats it as a GNOME -- calls 888E, increments the "Gnomes Gnabbed" counter at $6122 (BCD), then plays sound effect $04 and finalizes via 9A60 (the gnome object is consumed). For any other kind, searches a weapon lookup buffer at $7C83 (via 88E3) -- if found, sets the Weapon-held flag $619E (and possibly a variant at $619F depending on a $3C check) instead of picking the object straight up; either way, the found record's pointer is stored into 6110 (now "held") and 6895 is called (equip/HUD update?), then sound effect $04 plays.
DROP ($8BC4, something currently held): writes the CURRENT ROOM into the held item's table record (byte0), restoring it to the world -- the same field that item-table entries have their room zeroed on pickup (see Room-Format.md). Re-derives the item's stored Y/X (record bytes 1/2) from the player's own position ($8DBB/$8DBC, grid-aligned) -- i.e. the item is dropped at the player's feet. Exact bit-packing of the combined Y/X byte not fully resolved.
8AFB LD A,($6186)
8AFE BIT 4,A
8B00 RET Z
8B01 LD A,($619E) get Weapon-held flag
8B04 AND A
8B05 JP NZ,$8D8D => Attack
8B08 LD (IX+$0F),$00
8B0C CALL $923E Save continuation
8B0F LD HL,$8944
8B12 CALL $99A7
8B15 RET NC
8B16 LD A,($8DBD)
8B19 ADD A,$04
8B1B LD ($8DBD),A
8B1E LD (IX+$0F),$00
8B22 LD HL,$8968
8B25 LD ($8DB9),HL set player behaviour-handler pointer
8B28 JP $8B2B
8B2B LD HL,($6110)
8B2E LD DE,$788A
8B31 AND A
8B32 SBC HL,DE
8B34 JP NZ,$8BC4
8B37 LD A,($8DBD)
8B3A SUB $08
8B3C LD ($8DBD),A
8B3F CALL $9A60 Dynamic object finalizer
8B42 JR C,$8BB9
8B44 LD (IX+$16),$04
8B48 LD HL,$8DEF
8B4B CALL $9B5D
8B4E JR NC,$8BB9
8B50 LD HL,$0008
8B53 ADD HL,DE
8B54 LD A,(HL)
8B55 CP $44
8B57 JR NZ,$8B5C
8B59 EX DE,HL
8B5A JR $8B4B
8B5C PUSH DE
8B5D LD IY,$7CAC
8B61 CALL $88D7 Add a bonus to the score, value from a circular queue via 88B9
8B64 POP DE
8B65 LD HL,$0002
8B68 ADD HL,DE
8B69 LD (HL),$FF
8B6B LD HL,$000E
8B6E ADD HL,DE
8B6F LD A,(HL)
8B70 INC HL
8B71 LD H,(HL)
8B72 LD L,A
8B73 LD (HL),$00
8B75 EX DE,HL
8B76 LD BC,$0008
8B79 ADD HL,BC
8B7A LD A,(HL)
8B7B CP $6E
8B7D JR NZ,$8B84
8B7F CALL $6622 Use an oil can
8B82 JR $8BB9
8B84 CP $36
8B86 JR NZ,$8B9A
8B88 LD HL,$5000
8B8B CALL $888E Add a bonus (HL, 5-digit BCD) to the score, then redraw the score display
8B8E LD A,($6122) get "Gnomes Gnabbed" end-game stat counter
8B91 ADD A,$01
8B93 DAA
8B94 LD ($6122),A set "Gnomes Gnabbed" end-game stat counter
8B97 JP $8BB4
8B9A CALL $88E3 Search the buffer at $7C83 for byte A
8B9D JR NZ,$8BAD
8B9F LD ($619F),A
8BA2 CP $3C
8BA4 LD A,$03
8BA6 JR NZ,$8BAA
8BA8 LD A,$02
8BAA LD ($619E),A set Weapon-held flag
8BAD LD ($6110),DE
8BB1 CALL $6895 Draw the currently-held item's icon, and its ammo count if it's a weapon, on HUD
8BB4 LD A,$04
8BB6 CALL $848E Request sound effect A
8BB9 LD A,($8DBD)
8BBC ADD A,$08
8BBE LD ($8DBD),A
8BC1 JP $9A60 => Dynamic object finalizer
8BC4 LD HL,($6110)
8BC7 LD A,($6126) get room number
8BCA LD (HL),A
8BCB INC HL
8BCC LD A,($8DBB)
8BCF AND $F8
8BD1 LD (HL),A
8BD2 LD A,($8DBC)
8BD5 RRCA
8BD6 RRCA
8BD7 RRCA
8BD8 AND $07
8BDA OR (HL)
8BDB INC A
8BDC LD (HL),A
8BDD INC HL
8BDE LD A,($8DBD)
8BE1 SUB $10
8BE3 LD (HL),A
8BE4 PUSH IX
8BE6 LD HL,($6110)
8BE9 CALL $6663 Spawn the room's creature
8BEC CALL $9BF0 Collision test
8BEF JR C,$8C0F
8BF1 LD A,($6126) get room number
8BF4 CALL $6880 Count item-table entries whose room byte matches A
8BF7 CP $04
8BF9 JP NC,$8C15
8BFC LD HL,$788A
8BFF LD ($6110),HL
8C02 CALL $6895 Draw the currently-held item's icon, and its ammo count if it's a weapon, on HUD
8C05 LD A,$04
8C07 CALL $848E Request sound effect A
8C0A POP IX
8C0C JP $9A60 => Dynamic object finalizer
8C0F CALL $8C35 Weapon hit-response text
8C12 JP $8C27
8C15 CALL $8513 Print a message-window string
8C18 DEFB $28 attribute/control byte for 8513's inline string
8C19 DEFM " FULL! ",$5E message text, terminated by $5E
8C27 LD HL,($6110)
8C2A LD (HL),$00
8C2C LD (IX+$02),$FF
8C30 POP IX
8C32 JP $9A60 => Dynamic object finalizer
8C35: Weapon hit-response text: print "BLOCKED" via 8513, then return
Used by the routines at 8AFB and 8D8D.
Prints a fixed "BLOCKED" message via 8513, then returns. $8513 never falls through to the next instruction, it jumps past its own inline string data via a computed address, so the bytes immediately following this CALL are the message's attribute/text/terminator, not code (previously misread as a Z/NZ dispatch into $8C3A/$8C3C/$8C45; those were artifacts of disassembling string bytes as instructions).
8C35 CALL $8513 Print a message-window string
8C38 DEFB $28 attribute/control byte for 8513's inline string
8C39 DEFM " BLOCKED ",$5E message text "BLOCKED", terminated by $5E
8C47 RET
8C48: Data block at 8C48
8C48 DEFB $3E,$01,$32,$C5,$8D,$AF,$32,$29
8C50 DEFB $8E,$3E,$05,$CD,$8E,$84,$DD,$36
8C58 DEFB $0B,$06,$CD,$3E,$92,$21,$20,$89
8C60 DEFB $CD,$D5,$99,$D0,$3E,$07,$CD,$8E
8C68 DEFB $84,$DD,$36,$0F,$00,$CD,$3E,$92
8C70 DEFB $DD,$CB,$0D,$76,$20,$0D,$DD,$CB
8C78 DEFB $0D,$E6,$3A,$BD,$8D,$C6,$02,$32
8C80 DEFB $BD,$8D,$C9,$DD,$36,$0B,$06,$DD
8C88 DEFB $36,$0D,$01,$DD,$36,$05,$34,$DD
8C90 DEFB $36,$06,$34,$DD,$36,$07,$28,$DD
8C98 DEFB $36,$0A,$00,$DD,$36,$0F,$00,$21
8CA0 DEFB $68,$89,$22,$B9,$8D,$3E,$01,$C3
8CA8 DEFB $FC,$97,$DD,$CB,$0D,$B6,$CD,$3E
8CB0 DEFB $92,$CD,$BE,$7E,$3A,$86,$61,$E6
8CB8 DEFB $1F,$C8,$CD,$3E,$92,$DD,$CB,$0D
8CC0 DEFB $76,$20,$10,$DD,$7E,$06,$D6,$02
8CC8 DEFB $FE,$1C,$DA,$C9,$89,$CD,$D9,$8A
8CD0 DEFB $C3,$C9,$89,$DD,$CB,$0D,$B6,$3E
8CD8 DEFB $FF
8CD9: Message at 8CD9
8CD9 DEFM "2za"
8CDC: Data block at 8CDC
8CDC DEFB $C3,$C9,$89
8CDF: Player dive-depth step
Used by the routine at 8968.
Decrements the global depth counter $8DBD, capped at $28, testing collision each step, clearing the ledge/climb flags (IX+0x0D bits 0/1) on success.
8CDF LD HL,$8DBD HL = the global depth counter $8DBD, A = $28, the cap
8CE2 LD A,$28
8CE4 CP (HL) If already at or past the cap, return
8CE5 RET NC
8CE6 DEC (HL) Decrement the depth counter
8CE7 CALL $9BF0 Collision test
8CEA RET NC If successful, no collision, return with the new depth
8CEB RES 0,(IX+$0D) Blocked: clear the ledge/climb flags (IX+0x0D bits 0/1)
8CEF RES 1,(IX+$0D)
8CF3 LD HL,$8DBD HL = the depth counter, increment it back, undoing the failed step
8CF6 INC (HL)
8CF7 RET
8CF8: Data block at 8CF8
8CF8 DEFB $FB,$01,$16,$16,$FE,$FF,$FB,$04
8D00 DEFB $02,$02,$FE,$FF,$FB,$02,$82,$82
8D08 DEFB $FE,$FF,$FB,$06,$96,$96,$FE,$FF
8D10 DEFB $FF
8D11: Alternate PLAYER behaviour handler (swapped into $8DB9 by 9564; see 8968 and 8DB6)
Auto-walks the player object toward a fixed target position ($952B,$952C) over multiple frames, continuations via 923E, moving X then Y by up to 5px per call or snapping directly if already within 5px. Once both axes match, runs a settle animation via 8CF8/99D5 and waits for the player's depth ($8DBD) to reach $18 before restoring the normal per-frame handler 8968 and calling 8A87 to complete the room transition. Used for the scripted walk-in after entering a room via a door/lift.
8D11 LD (IX+$0F),$00
8D15 CALL $923E Save continuation
8D18 LD B,$02
8D1A LD C,$02
8D1C LD A,($952B)
8D1F SUB (IX+$05)
8D22 JR NC,$8D2A
8D24 NEG
8D26 LD B,$FE
8D28 LD C,$01
8D2A CP $05
8D2C JR NC,$8D36
8D2E LD A,($952B)
8D31 LD (IX+$05),A
8D34 JR $8D43
8D36 LD A,(IX+$05)
8D39 ADD A,B
8D3A LD (IX+$05),A
8D3D LD (IX+$0B),C
8D40 JP $89C9
8D43 CALL $923E Save continuation
8D46 LD B,$02
8D48 LD C,$04
8D4A LD A,($952C)
8D4D SUB (IX+$06)
8D50 JR NC,$8D58
8D52 NEG
8D54 LD B,$FE
8D56 LD C,$06
8D58 CP $05
8D5A JR NC,$8D64
8D5C LD A,($952C)
8D5F LD (IX+$06),A
8D62 JR $8D71
8D64 LD A,(IX+$06)
8D67 ADD A,B
8D68 LD (IX+$06),A
8D6B LD (IX+$0B),C
8D6E JP $89C9
8D71 LD (IX+$0F),$00
8D75 CALL $923E Save continuation
8D78 LD HL,$8CF8
8D7B CALL $99D5 Sprite-animation stepper
8D7E LD A,($8DBD)
8D81 CP $18
8D83 RET NC
8D84 LD HL,$8968
8D87 LD ($8DB9),HL set player behaviour-handler pointer
8D8A JP $8A87 => Attempt to move to an adjacent room
8D8D: Attack: fire the held weapon (reached from 8AFB when a weapon is held)
Used by the routine at 8AFB.
Calls 9923 (spawns the weapon projectile); if it returns Carry (meaning not fully confirmed -- possibly "could not spawn"), jumps to 8C35 (hit-response/reward text) directly. Otherwise calls 68C1 (consume ammo, auto-drop if empty), plays a firing animation via the $8956 table, then restores the normal player handler 8968. The actual hit detection happens later, asynchronously, in the projectile's own per-frame handler (9963).
8D8D PUSH IX
8D8F LD A,($619F)
8D92 CALL $9923 Spawn the weapon projectile object (thrown from the player's position, facing $8DC1), handler 9963
8D95 POP IX
8D97 JP C,$8C35 => Weapon hit-response text
8D9A CALL $68C1 Consume one shot of ammo
8D9D LD (IX+$0F),$00
8DA1 CALL $923E Save continuation
8DA4 LD HL,$8956
8DA7 CALL $99A7
8DAA RET NC
8DAB LD (IX+$0F),$00
8DAF LD HL,$8968
8DB2 LD ($8DB9),HL set player behaviour-handler pointer
8DB5 RET
8DB6: PLAYER object record + 2 more fixed object records
The player is an object record with the same layout as the dynamic pool records (see A900), statically allocated here. Fields: +0/+1 = $8DCF (link to the next record in the active object list); +2 = current room number (mirrors $6126); +3/+4 = $8968 -- the player's per-frame behaviour handler (8968), SWAPPABLE: 955A tests it against $8968 ("is the player in the normal state?") and 9564 swaps it to 8D11 (an alternate player state); +5/+6 = player Y/X position -- these are the $8DBB/$8DBC bytes referenced by proximity checks all over the code; +16..+19 = previous/target position pair (unconfirmed). The active object list runs: ($610E head) -> newest spawned objects ... -> $8DB6 (player) -> $8DCF -> $8DEF -> $0000 end.
8DB6 DEFW $8DCF link to next object record ($8DCF)
8DB8 DEFB $02 current room number
8DB9 DEFW $8968 player behaviour-handler pointer (normally 8968; swapped for state changes, e.g. 8D11)
8DBB DEFB $34,$1C player Y/X position
8DBD DEFB $28,$02,$00,$00,$04,$AA,$00,$00
8DC5 DEFB $01,$32,$1A,$35,$1D,$00,$02,$0D
8DCD DEFB $14,$00
Second fixed object record (purpose not yet identified). Link points to $8DEF. Its state block (+2 onward, at $8DD1) is re-initialized with 22 bytes from $5C92 by 8F82 during room setup.
8DCF DEFW $8DEF link to next object record ($8DEF)
8DD1 DEFB $00,$00,$00,$00,$00,$17,$00,$00
8DD9 DEFB $00,$00,$00,$00,$00,$01,$00,$00
8DE1 DEFB $00,$00,$00,$00,$00,$00
8DE7 DEFB $00,$00,$00,$64,$32,$00,$00,$00
Third fixed object record -- also the CREATURE insertion point: 6663 passes IX=$8DEF into 84AE, so the room's creature gets spliced into the list right after this record. Link field is $0000 (list end) when the room has no creature. State block (+2 onward, at $8DF1) re-initialized from $5C92 by 8F82.
8DEF DEFW $0000 link to next object record ($0000 = list end, or the room's creature)
8DF1 DEFB $00,$00,$00,$00,$00,$17,$00,$00
8DF9 DEFB $00,$00,$00,$00,$00,$01,$00,$00
8E01 DEFB $00,$00,$00,$00,$00,$00
8E07 DEFB $00,$00,$00,$64,$32,$00,$00,$00
8E0F DEFB $27,$8E,$02,$71,$94,$34,$1C,$18
8E17 DEFB $0B,$0C,$00,$04,$5E,$00,$00,$02
8E1F DEFB $00,$00,$00,$00,$00,$03,$00,$0C
8E27 DEFB $00,$00,$02,$9E,$94,$34,$22,$40
8E2F DEFB $5A,$00,$01,$00,$B2,$00,$00,$02
8E37: Message at 8E37
8E37 DEFM "3!4\""
8E3B: Data block at 8E3B
8E3B DEFB $00,$01,$18,$18
8E3F: Special grid-value spawn routine (value $68) -- rearing snake
Used by the routine at 6269.
Same allocator mechanism as 8EA7; its handler is 9684 (see there for the full state machine).
8E3F INC HL Advance HL past the grid-value byte, decrement the outer loop count
8E40 DEC B
8E41 PUSH AF Save AF, BC, HL, DE
8E42 PUSH BC
8E43 PUSH HL
8E44 PUSH DE
8E45 LD A,(HL) A = the next template byte, the spawn kind, store it into the new record's kind field
8E46 LD (IX+$00),A
8E49 LD IX,$610E IX = the active-object list head $610E, the insertion point
8E4D CALL $84AE Dynamic object allocator
8E50 DEFW $9684 Dynamic object handler address (9684)
8E52 POP DE Restore the template pointer (DE->A), A = the grid index low byte
8E53 LD A,E
8E54 CALL $6254 Set object position (IX+5/+6) from grid index A
8E57 POP HL Restore and re-save the grid-cell pointer
8E58 PUSH HL
8E59 LD C,$18 C = $18, a fixed row-height parameter, A = this cell's terrain code
8E5B LD A,(HL)
8E5C AND A
8E5D JR Z,$8E86 If the code is 0, no terrain shape, skip to the finalize path
8E5F LD L,A HL = the terrain code, widened to a word
8E60 LD H,$00
8E62 ADD HL,HL Double it, DE = the shape-table base $7556
8E63 LD DE,$7556
8E66 ADD HL,DE HL = this code's shape-table entry, A = its first byte, advance
8E67 LD A,(HL)
8E68 INC HL
8E69 LD H,(HL) Read the shape record's address (H,L) and row count (B), rejoin the shared finalize path
8E6A LD L,A
8E6B LD B,(HL)
8E6C JR $8E83
8E6E: Creature spawn: compute initial height
Computes (+0x07) from the room's terrain shape table ($74CE/$750B, summed over B grid rows), then finalizes the object.
8E6E PUSH BC Save BC, HL, the shape-record pointer and row count
8E6F PUSH HL
8E70 LD A,(HL) A = the terrain code at this row's cell
8E71 CALL $9AAB Search the (key,data) pair table at $74CE for key A
8E74 LD A,(HL) A = the matched data byte, compute A*3, an index into the size table
8E75 ADD A,A
8E76 ADD A,(HL)
8E77 LD C,A
8E78 LD B,$00 BC = the index, HL = table $750B
8E7A LD HL,$750B
8E7D ADD HL,BC HL = this entry's byte, A = the height contribution
8E7E LD A,(HL)
8E7F POP HL Restore HL, BC, accumulate the height sum in C
8E80 POP BC
8E81 ADD A,C
8E82 LD C,A
This entry point is used by the routine at 8E3F.
8E83 INC HL Advance to the next row, loop
8E84 DJNZ $8E6E
This entry point is used by the routine at 8E3F.
8E86 LD (IX+$07),C Store the summed height (+0x07), set kind (+0x0A=$04) and flags (+0x0D=$88)
8E89 LD (IX+$0A),$04
8E8D LD (IX+$0D),$88
8E91 CALL $9A60 Dynamic object finalizer
8E94 LD (IX+$16),$00 Clear +0x16, restore HL/BC, advance to the next template field, decrement the outer row-count B
8E98 POP HL
8E99 POP BC
8E9A INC HL
8E9B DEC B
8E9C LD A,(HL) Read the linked-record index byte, store it to +0x0E
8E9D LD (IX+$0E),A
8EA0 POP AF Restore AF, set the sprite number (+0x08=$23)
8EA1 LD (IX+$08),$23
8EA5 XOR A Clear A, return
8EA6 RET
8EA7: Special grid-value spawn routine (values $66/$6A) -- bubble source ($6A full-strength, $66 weak; see 9602)
Used by the routine at 6269.
Called from 62C8 with A=the special value ($66 or $6A) and HL pointing just past it in the template/extras stream. Self-modifies its own 8EC3 operand with A (so the spawned object's initial "kind" byte matches whichever of $66/$6A triggered it). Clears the grid cell to 0 (so the special value never appears in the finished grid -- see 612C). Reads 2 more bytes from the template beyond the normal (index,value) pair -- these are NOT accounted for by the outer 62C8 loop's own HL advancement; instead the routine forces two extra DEC B's (at $8EE8/$8EE9), ending that loop one iteration early to compensate (see 6CCF). Sets up IX=$610E (the active-object list head) as the insertion point, then CALLs 84AE to allocate an object record -- its handler address (8EB9) is 957C. Populates further record fields (offset $07=$18, $0A=$06, $09=triggering value, $0B and $0E=first extra byte, $14=second extra byte), then CALLs 9A60 to finalize. The two extra bytes' exact meaning (screen position? direction?) is not yet confirmed. Offset $09 (the triggering value) reads back as $00 afterward, suggesting it's consumed during finalization.
8EA7 LD ($8EC6),A Self-modify 8EC3's operand with the triggering value ($66 or $6A)
8EAA LD (IX+$00),$00 Clear the new record's own +0x00 field (defensive init)
8EAE PUSH HL Save HL, BC
8EAF PUSH BC
8EB0 DEC HL back up one byte to clear the grid cell
8EB1 PUSH HL
8EB2 LD IX,$610E IX = the active-object list head $610E, the insertion point
8EB6 CALL $84AE Dynamic object allocator
8EB9 DEFW $957C Dynamic object handler address (957C)
8EBB LD (IX+$07),$18 Set height (+0x07=$18) and kind (+0x0A=$06)
8EBF LD (IX+$0A),$06
8EC3 LD (IX+$09),$66 !!MUT-ARG!! patched by 8EA7 with the triggering value ($66 or $6A)
8EC7 POP HL Restore HL, A = the grid index
8EC8 LD A,(HL)
8EC9 CALL $6254 Set object position (IX+5/+6) from grid index A
8ECC INC HL Advance past the index and value bytes to the first extra byte
8ECD INC HL
8ECE LD A,(HL)
8ECF LD (IX+$0E),A Read it and store into both the linked-record index (+0x0E) and facing (+0x0B)
8ED2 LD (IX+$0B),A
8ED5 INC HL Advance to the second extra byte
8ED6 LD A,(HL) Read it and store into +0x14
8ED7 LD (IX+$14),A
8EDA CALL $9A60 Dynamic object finalizer
8EDD POP BC Restore BC, HL
8EDE POP HL
8EDF INC HL advance HL past the two extra bytes
8EE0 LD A,(IX+$09) A = the triggering value stored in the record, compare against $6A
8EE3 CP $6A
8EE5 JR Z,$8EEC If it's the full-strength variant ($6A), take the branch below
8EE7 INC HL Weak variant: force two extra DEC B's to compensate 62C8's loop count, then clear A and return
8EE8 DEC B
8EE9 DEC B
8EEA XOR A
8EEB RET
8EEC LD (IX+$14),$E0 Full-strength: set +0x14=$E0 instead
8EF0 JR $8EE9 Then join the same DEC-B compensation above
8EF2: Special grid-value spawn routine (value $67) -- plant/coral
Used by the routine at 6269.
Same allocator mechanism as 8EA7; its handler is 94EE.
$67 is rare: only 2 occurrences in the whole room table (rooms $9C and $A3).
8EF2 LD (IX+$00),$00
8EF6 PUSH HL
8EF7 PUSH BC
8EF8 DEC HL
8EF9 PUSH HL
8EFA LD IX,$610E
8EFE CALL $84AE Dynamic object allocator
8F01 DEFW $94EE Dynamic object handler address (94EE)
8F03 LD (IX+$07),$18
8F07 LD (IX+$0A),$19
8F0B LD (IX+$0D),$08
8F0F POP HL
8F10 LD A,(HL)
8F11 CALL $6254 Set object position (IX+5/+6) from grid index A
8F14 INC (IX+$05)
This entry point is used by the routines at 8F1E and 8F4C.
8F17 CALL $9A60 Dynamic object finalizer
This entry point is used by the routine at 8F4C.
8F1A POP BC
8F1B POP HL
8F1C XOR A
8F1D RET
8F1E: Special grid-value spawn routine (value $69) -- whirlpool
Used by the routine at 6269.
Every Plug Room's extras end with $25,$6B,$25,$69 -- a Plug and a $69 object co-located at the same grid cell -- and $69 also appears 23x across the room table (not plug-exclusive, unlike $6B). Same allocator mechanism as 8EA7; its handler is 952D.
8F1E LD (IX+$00),$00
8F22 PUSH HL
8F23 PUSH BC
8F24 DEC HL
8F25 PUSH HL
8F26 LD IX,$610E
8F2A CALL $84AE Dynamic object allocator
8F2D DEFW $952D Dynamic object handler address (952D)
8F2F LD (IX+$07),$18
8F33 LD (IX+$0A),$06
8F37 POP HL
8F38 LD A,(HL)
8F39 CALL $6254 Set object position (IX+5/+6) from grid index A
8F3C CALL $62F9 Test whether the current room is this level's Plug Room
8F3F JR NZ,$8F17
8F41 LD (IX+$05),$20
8F45 LD (IX+$06),$20
8F49 JP $8F17
8F4C: Special grid-value spawn routine (value $6B) -- plug
Used by the routine at 6269.
$6B appears in exactly 4 rooms' extras in the whole room table, and they are precisely the 4 Plug Rooms (73B3) -- never in any of the 11 shared room-type templates, only introduced per-room. Same allocator mechanism as 8EA7; its handler is 94F4.
8F4C LD (IX+$00),$00
8F50 PUSH HL
8F51 PUSH BC
8F52 CALL $62F9 Test whether the current room is this level's Plug Room
8F55 LD A,(HL)
8F56 AND $0F
8F58 CP $0F
8F5A JP Z,$8F1A
8F5D LD IX,$610E
8F61 CALL $84AE Dynamic object allocator
8F64 DEFW $94F4 Dynamic object handler address (94F4)
8F66 LD (IX+$07),$19
8F6A LD (IX+$05),$20
8F6E LD (IX+$06),$20
8F72 LD A,$48
8F74 LD (IX+$08),A
8F77 CALL $9AAB Search the (key,data) pair table at $74CE for key A
8F7A LD A,(HL)
8F7B LD (IX+$0A),A
8F7E JP $8F17
8F81: Unused
8F81 DEFS $01
8F82: Spawn room-membership-gated decoration pairs
Used by the routine at 676D.
Re-initializes the two fixed object records, then spawns pairs from the 75B5 spawner table.
After resetting the $8DCF/$8DEF state blocks, walks the spawner table at $75B6 looking for a record whose embedded room-list contains the current room. On a match, spawns a PAIR of objects (handler 9021), chained to each other via +0x18/+0x19, sharing fields copied from the record (position/type) plus a couple of pseudo-randomized flag bytes derived from the Z80 R register. Table format matches 75B5's (len, marker, handler_word, Y, X, type, flags, room-list...) records.
8F82 LD HL,$5C92 copy the 19-byte default state block into $8DD1 (second fixed record)
8F85 LD DE,$8DD1
8F88 LD BC,$0016
8F8B LDIR
8F8D LD HL,$5C92 HL = the default state block, DE = $8DF1 (third fixed record)
8F90 LD DE,$8DF1
8F93 LD BC,$0016 copy it over
8F96 LDIR
8F98 LD A,$02 set the spawn-pair counter $8F81 = 2
8F9A LD ($8F81),A
8F9D LD IX,$8DCF IX = the creature insertion point $8DCF, HL = spawner table $75B6
8FA1 LD HL,$75B6 HL = the spawner table $75B6
8FA4 LD A,(HL) *loop: A = this record's length minus its 8-byte header
8FA5 SUB $08
8FA7 RET C underflowed: end of table
8FA8 LD C,A C = room-list length, B = 0
8FA9 LD B,$00
8FAB EX DE,HL DE = the record pointer
8FAC INC DE A = the record's active flag (offset 1)
8FAD LD A,(DE)
8FAE DEC DE
8FAF AND A inactive: skip this record
8FB0 JR Z,$8FBD
8FB2 LD HL,$0008 HL = the room-list start (record + 8)
8FB5 ADD HL,DE
8FB6 LD A,($6126) get room number
8FB9 CPIR search the room-list for the current room, branch to spawn if found
8FBB JR Z,$8FC4
8FBD EX DE,HL not found: E = this record's total length
8FBE LD E,(HL)
8FBF LD D,$00
8FC1 ADD HL,DE advance past it, loop back
8FC2 JR $8FA4
8FC4 EX DE,HL found: store this object's own pointer into +0x18/+0x19 (pair self-link)
8FC5 LD (IX+$18),L
8FC8 LD (IX+$19),H
8FCB INC HL advance HL, write A back to this position
8FCC LD (HL),A
8FCD PUSH IX DE = the new object record
8FCF POP DE
8FD0 INC DE skip its first two fields
8FD1 INC DE
8FD2 LD BC,$0005 BC = 5, copy 5 bytes from the record (position/type fields)
8FD5 LDIR
8FD7 LD A,(HL) store the record's next byte into +0x0A (kind)
8FD8 LD (IX+$0A),A
8FDB INC HL store the following byte into +0x1A
8FDC LD A,(HL)
8FDD LD (IX+$1A),A
8FE0 LD A,R derive a pseudo-random flag byte from the R register, store to +0x1C
8FE2 AND $7F
8FE4 OR $01
8FE6 LD (IX+$1C),A derive a second flag byte, store to +0x1B
8FE9 XOR $0E
8FEB LD (IX+$1B),A
8FEE LD (IX+$07),$28 height (+0x07) = $28 (fixed)
8FF2 LD (IX+$0B),$01 facing (+0x0B) = 1
8FF6 LD (IX+$0F),$01 phase (+0x0F) = 1
8FFA SET 7,(IX+$0D) set bit 7 of +0x0D
8FFE LD HL,$9021 HL = handler address $9021
9001 LD (IX+$03),L store the handler into +0x03/+0x04
9004 LD (IX+$04),H
9007 CALL $9A60 Dynamic object finalizer
900A LD HL,$8F81 decrement the spawn-pair counter, done if it reaches zero
900D DEC (HL)
900E RET Z
900F LD E,(IX+$18) DE = the spawner record pointer (+0x18/+0x19)
9012 LD D,(IX+$19)
9015 LD L,(IX+$00) HL = the paired object's own address
9018 LD H,(IX+$01)
901B PUSH HL
901C POP IX
901E JP $8FBD loop back to spawn the second paired object
9021: Per-frame animation-table stepper
Searches the table pointed by (IX+$18/$19) for a matching entry ($619A), then applies position/facing changes over several frames via 923E continuations.
9021 LD L,(IX+$18) HL = the linked spawner-record pointer (+0x18/+0x19)
9024 LD H,(IX+$19)
9027 LD A,(HL) A = the record's kind byte minus 8, the waypoint-search length, C = it
9028 SUB $08
902A LD C,A
902B LD B,$00 B = 0, DE = 8, HL = the room-list start (record+8)
902D LD DE,$0008
9030 ADD HL,DE
9031 LD A,($619A) A = the target sprite $619A, search the room-list for it
9034 CPIR
9036 JR NZ,$9064 not found: skip to the idle branch
9038 XOR A Found: clear the search-target $619A, HL = the target position $619B
9039 LD ($619A),A
903C LD HL,($619B)
903F LD (IX+$05),L Store it as the object's position (+0x05/+0x06)
9042 LD (IX+$06),H
9045 LD A,($619D) A = the target facing $619D, store it (+0x0B), set the move counter (+0x09=10)
9048 LD (IX+$0B),A
904B LD (IX+$09),$0A
904F CALL $8ABB Apply the object's facing direction to its position (IX+5/+6), returning the OLD position in BC
9052 CALL $9A60 Dynamic object finalizer
9055 CALL $923E Save continuation
9058 DEC (IX+$09) Decrement the move counter, return unless it just reached 0
905B RET NZ
905C LD (IX+$09),$0A Reset the move counter to 10
9060 CALL $9B5A Collision/overlap scan
9063 RET C Collision: abandon the animation without finalizing
9064 RES 7,(IX+$0D) Clear bit 7 of the flags byte (+0x0D)
9068 LD L,(IX+$18) HL = the record pointer again, advance past the header to the next-link field
906B LD H,(IX+$19)
906E INC HL
906F INC HL
9070 LD E,(HL) Read the linked record's own pointer (E,D), swap into HL
9071 INC HL
9072 LD D,(HL)
9073 EX DE,HL
9074 JP $923F Jump to the continuation there
9077: Message at 9077
9077 DEFM "++,,"
907B: Data block at 907B
907B DEFB $FF
907C: Message at 907C
907C DEFM "))**"
9080: Data block at 9080
9080 DEFB $FF,$77,$90,$7C,$90
9085: Object type stub: dispatch into 90A8's creature AI setup
Sets A=$72 and HL to the object's animation-table pointer $9081, then jumps into 90A8's shared creature AI setup body, a per-kind trampoline supplying its own table/param constants.
9085 LD A,$72 A = $72, the initial width/param
9087 LD HL,$9081 HL = the object's animation-table pointer $9081
908A JP $90AD => Jump into 90A8's shared creature AI setup
908D: Message at 908D
908D DEFM "!!\"\""
9091: Data block at 9091
9091 DEFB $FF,$1F,$1F,$20,$20,$FF,$01,$04
9099 DEFB $02,$06,$01,$8D,$90,$92,$90,$00
90A1 DEFB $08,$08,$00,$00,$08,$08,$00
90A8: Creature idle/wander AI
Sets the walk-animation table (IX+$1D/$1E/$1F), times a walk-then-pause cycle via 91A6, occasionally spawns a bubble/particle child object, and eventually hands off to 925C waypoint movement.
90A8 LD A,$78
90AA LD HL,$909C
This entry point is used by the routines at 9085 and 9232.
90AD LD (IX+$1D),L
90B0 LD (IX+$1E),H
90B3 LD (IX+$1F),A
90B6 CALL $91A6 Creature pause/transform step
90B9 LD HL,$90B6
90BC LD ($9195),HL
90BF DEC (IX+$1C)
90C2 JP Z,$9140
90C5 JP P,$90CB
90C8 INC (IX+$1C)
90CB DEC (IX+$1B)
90CE JP Z,$9109
90D1 LD A,(IX+$1F)
90D4 AND A
90D5 JR Z,$9109
90D7 LD HL,$5C78
90DA LD A,($617C)
90DD ADD A,(HL)
90DE AND $FC
90E0 CP $0C
90E2 JR Z,$90F4
90E4 CALL $8ABB Apply the object's facing direction to its position (IX+5/+6), returning the OLD position in BC
90E7 PUSH BC
90E8 CALL $9BF0 Collision test
90EB POP BC
90EC JR NC,$9103
90EE LD (IX+$05),B
90F1 LD (IX+$06),C
90F4 LD A,(IX+$0B)
90F7 LD HL,$9097
90FA LD BC,$0004
90FD CPIR
90FF LD A,(HL)
9100 LD (IX+$0B),A
9103 CALL $99A1 Direction-indexed sprite-animation stepper
9106 JP $9A60 => Dynamic object finalizer
9109 LD (IX+$1B),$32
910D LD HL,$911B
9110 LD ($9195),HL
9113 LD A,$06
9115 CALL $848E Request sound effect A
9118 CALL $923E Save continuation
911B CALL $91A6 Creature pause/transform step
911E DEC (IX+$1C)
9121 JR Z,$9140
9123 JP P,$9129
9126 INC (IX+$1C)
9129 DEC (IX+$1B)
912C JR Z,$9136
912E BIT 5,(IX+$0D)
9132 JP Z,$925C => Creature waypoint movement
9135 RET
9136 LD (IX+$1B),$64
913A LD HL,$90B6
913D JP $923F
9140 LD (IX+$1C),$05
9144 PUSH IX
9146 POP IY
9148 LD IX,$610E
914C CALL $84AE Dynamic object allocator
914F DEFW $94CA Dynamic object handler address
9151 LD (IX+$0B),$05
9155 LD A,(IY+$0B)
9158 AND $06
915A LD L,A
915B LD H,$00
915D LD DE,$90A0
9160 ADD HL,DE
9161 LD A,(IY+$05)
9164 ADD A,(HL)
9165 LD (IX+$05),A
9168 INC HL
9169 LD A,(IY+$06)
916C ADD A,(HL)
916D LD (IX+$06),A
9170 LD A,(IY+$07)
9173 ADD A,$20
9175 LD (IX+$07),A
9178 LD (IX+$0A),$03
917C CALL $9A60 Dynamic object finalizer
917F PUSH IY
9181 POP IX
9183 CALL $923E Save continuation
9186 CALL $91A6 Creature pause/transform step
9189 CALL $99A1 Direction-indexed sprite-animation stepper
918C DEC (IX+$1C) Decrement the pause timer (+0x1C), return unless it just expired
918F RET NZ
9190 LD (IX+$1C),$32 Reset the pause timer to $32
9194 LD HL,$0000 !!MUT-ARG!! patched by 90BC and 9110 with the resume address
9197 JP $923F Jump to the continuation there
919A: Data block at 919A
919A DEFB $1A,$1A,$9A,$9A,$1B,$1B,$9B,$9B
91A2 DEFB $1A,$1A,$FF,$FF
91A6: Creature pause/transform step
Used by the routine at 90A8.
On the wander timer expiring, clears its list-cell state, rebuilds the door bitfield (6329), plays a sound, and runs a transform animation via 99D5/$919A.
91A6 BIT 2,(IX+$0D)
91AA RET Z
91AB RES 2,(IX+$0D)
91AF LD A,(IX+$09)
91B2 CP (IX+$1F)
91B5 RET NZ
91B6 POP HL
91B7 LD L,(IX+$18)
91BA LD H,(IX+$19)
91BD INC HL
91BE LD (HL),$00
91C0 LD (IX+$0F),$00
91C4 CALL $6329 Build the door/exit bitfield at $612B from the room description's byte1
91C7 LD A,$01
91C9 CALL $848E Request sound effect A
91CC LD IY,$7CCA
91D0 CALL $88D7 Add a bonus to the score, value from a circular queue via 88B9
91D3 CALL $923E Save continuation
91D6 LD HL,$919A
91D9 CALL $99D5 Sprite-animation stepper
91DC RET NC
91DD LD (IX+$02),$00
91E1 RET
91E2: Data block at 91E2
91E2 DEFB $28,$28,$FE,$FE,$28,$28,$FE,$FE
91EA DEFB $28,$28,$FE,$02,$28,$28,$FE,$02
91F2 DEFB $FF,$27,$27,$FE,$FE,$27,$27,$FE
91FA DEFB $FE,$27,$27,$FE,$02,$27,$27,$FE
9202 DEFB $02,$FF,$E2,$91,$F3,$91
9208: Object type stub: dispatch into 9232's shared setup
Sets A=$3E and HL to the object's animation-table pointer $9204, then jumps into 9232's shared setup body ($9237), a per-kind trampoline supplying its own table/param constants.
9208 LD A,$3E A = $3E, the initial width/param
920A LD HL,$9204 HL = the object's animation-table pointer $9204
920D JP $9237 => Jump into 9232's shared setup
9210: Data block at 9210
9210 DEFB $14,$14,$1D,$1D,$FF,$0F,$0F,$10
9218 DEFB $10,$FF,$10,$92,$15,$92,$3E,$00
9220 DEFB $21,$1A,$92,$C3,$37,$92,$12,$12
9228 DEFB $13,$13,$11,$11,$11,$FF,$26,$92
9230 DEFB $26,$92
9232: Object type stub: dispatch into 90A8's creature AI setup
Loads a fixed animation-table pointer ($922E) and initial width/param A=$74, clears the pause-timer field (IX+0x1C), then jumps into 90AD, the shared creature-AI setup body inside 90A8, a per-kind trampoline supplying its own table/param constants.
9232 LD A,$74
9234 LD HL,$922E
This entry point is used by the routine at 9208.
9237 LD (IX+$1C),$00
923B JP $90AD
923E: Save continuation
Used by the routines at 8968, 8AFB, 8D11, 8D8D, 9021, 90A8, 91A6, 9341, 9401, 94F4, 9602 and 9963.
Sets the object's handler (+3/+4) to the address just after the caller's CALL, then jumps there, the object resumes at that point next frame.
923E POP HL Pop the return address off the stack, the caller's CALL site + 3
This entry point is used by the routines at 9021 and 90A8.
923F LD (IX+$03),L Store its low byte into the object's handler pointer (+0x03)
9242 LD (IX+$04),H Store its high byte into the object's handler pointer (+0x04)
9245 JP (HL) Jump to that address now
9246: Data block at 9246
9246 DEFB $00,$00,$00,$00,$00,$00,$01,$04
924E DEFB $06,$02,$04,$02,$01,$06,$02,$06
9256 DEFB $04,$01,$06,$01,$02,$04
925C: Creature waypoint movement
Used by the routine at 90A8.
Steps toward the next patrol point in the linked list at $8DEF, one facing-direction move per call.
Walks the waypoint list at $8DEF (linked via each entry's own +8 offset) looking for the entry matching this object's target-waypoint tag (IX+$1A), copying its target position into scratch $9246. Picks a movement-delta table entry (at $924C, indexed by facing IX+$0B) into scratch $9248, then a 3-iteration threshold scan decides whether the object should approach the near or far side of the target cell (swapping the scratch delta accordingly). Moves up to 4 steps via 8ABB/9BF0, aborting to 99A1 without finalizing on collision. On reaching the target (both position axes match), plays sound effect $05 and adjusts the rust/oil timer $6501 before finalizing via 9A60.
925C LD HL,($8DBB) HL = the object's own position (IX+5/+6 mirror), save it as the initial target scratch
925F LD ($9246),HL Save it to scratch $9246
9262 LD HL,$8DEF HL = the waypoint-list head at $8DEF
9265 LD E,(HL) Read this entry's link pointer (E,D)
9266 INC HL
9267 LD D,(HL)
9268 LD A,E If the link is null, no more waypoints, stop searching
9269 OR D
926A JR Z,$9284
926C LD HL,$0008 HL = the entry's own tag field offset (+8)
926F ADD HL,DE
9270 LD A,(IX+$1A) Compare the object's target-waypoint tag (IX+$1A) against this entry's tag
9273 CP (HL)
9274 JR Z,$9279
9276 EX DE,HL Not a match: follow the link to the next entry and retry
9277 JR $9265
9279 LD HL,$0005 Found it: HL = the entry's position field offset (+5)
927C ADD HL,DE ADD HL,DE
927D LD DE,$9246 DE = scratch $9246, the target-position slot
9280 LDI Copy the 2-byte target position into scratch
9282 LDI
9284 LD A,(IX+$0B) A = the object's current facing (IX+$0B)
9287 AND $0E Isolate the direction bits and double them, an index into the delta table
9289 ADD A,A
928A LD E,A
928B LD D,$00 DE = the direction index, widened to a word
928D LD HL,$924C HL = the movement-delta table at $924C
9290 ADD HL,DE HL = this direction's delta-table entry
9291 LD DE,$9248 DE = scratch $9248
9294 LD BC,$0004 Copy the 4-byte delta entry into scratch
9297 LDIR
9299 LD DE,$9248 DE = scratch $9248 again
929C LD B,$03 B = 3, iterate the entry's 3 threshold fields
929E LD HL,($9246) HL = the target position saved earlier
92A1 LD A,(DE) Threshold field = 1: compare the target's low byte against the object's left edge (IX+5)
92A2 CP $01
92A4 JR NZ,$92AE
92A6 LD A,L If below, take the near-side branch, else fall through
92A7 CP (IX+$05)
92AA JR C,$92D1
92AC JR $92CC
92AE CP $04 Threshold field = 4: compare the target's high byte against the object's top edge (IX+6)
92B0 JR NZ,$92BA
92B2 LD A,(IX+$06) If below, take the near-side branch, else fall through
92B5 CP H
92B6 JR C,$92D1
92B8 JR $92CC
92BA CP $02 Threshold field = 2: compare the target's low byte against the object's left edge (IX+5)
92BC JR NZ,$92C6
92BE LD A,(IX+$05)
92C1 CP L If below, take the near-side branch
92C2 JR C,$92D1
92C4 JR $92CC
92C6 LD A,H Otherwise compare the target's high byte against the object's top edge (IX+6)
92C7 CP (IX+$06)
92CA JR C,$92D1
92CC INC DE Advance to the next threshold field and loop
92CD DJNZ $92A1
92CF JR $92D9 No threshold matched: keep the scratch delta as-is
92D1 LD HL,$9248 Threshold matched: swap the scratch delta's byte with the current threshold field, the near-side adjustment
92D4 LD C,(HL)
92D5 LD A,(DE)
92D6 EX DE,HL
92D7 LD (HL),C
92D8 LD (DE),A
92D9 LD HL,$9248 HL = scratch $9248, the (possibly swapped) delta
92DC LD B,$04 B = 4, up to 4 movement steps
92DE PUSH BC Save BC, save HL (the delta pointer)
92DF PUSH HL
92E0 LD A,(HL) Set the object's facing (IX+$0B) from the next delta byte
92E1 LD (IX+$0B),A
92E4 CALL $8ABB Apply the object's facing direction to its position (IX+5/+6), returning the OLD position in BC
92E7 PUSH BC Save the old position
92E8 CALL $9BF0 Collision test
92EB POP BC Restore the old position into BC
92EC JR NC,$9338 On collision, abandon the walk without finalizing
92EE LD (IX+$05),B Revert the position to the old value (IX+5/+6 = B/C)
92F1 LD (IX+$06),C
92F4 JR NZ,$932D If the collision wasn't a full stop (NZ), skip the arrival check
92F6 LD HL,$8DB6 HL = the level's designated arrival marker $8DB6
92F9 AND A Compare it against the saved target position DE
92FA SBC HL,DE
92FC JR NZ,$932D Not the arrival marker: skip the arrival handling
92FE LD IY,$7CBC IY = a fixed table $7CBC (arrival handler parameters)
9302 CALL $88DD Subtract a BCD value from the score, value from a circular queue via 88B9
9305 LD A,$05 A = sound effect $05
9307 CALL $848E Request sound effect A
930A CALL $8513 Print a message-window string
930D DEFB $14 attribute/control byte for 8513's inline string
930E DEFM " OO-ER! ",$5E message text, terminated by $5E
931C LD B,$01 B = 1, default adjustment
931E LD A,(IX+$1F) A = a per-object flag (IX+0x1F), test it
9321 AND A
9322 JR Z,$9326 If clear, keep the default adjustment
9324 LD B,$02 Otherwise B = 2, a larger adjustment
9326 LD A,($6501) A = the rust/oil timer $6501
9329 ADD A,B Add the arrival-handler's adjustment (B)
932A LD ($6501),A Store the updated timer back to $6501
932D POP HL Restore HL, BC
932E POP BC
932F INC HL Advance the delta pointer past this step's byte
9330 DJNZ $92DE Loop for the next movement step
9332 CALL $9A60 Dynamic object finalizer
9335 JP $99A1 => Direction-indexed sprite-animation stepper
9338 POP HL Collision case: just restore HL, BC
9339 POP BC
933A JP $99A1 => Direction-indexed sprite-animation stepper
933D: Unused
933D DEFS $04
9341: Room-creature per-frame behaviour handler
Installed by the creature spawn at 6663 -- dual purpose: item-delivery detector in Plug Rooms, settle/float physics + hit detection elsewhere.
PLUG ROOM BRANCH (taken when 62F9 confirms the current room is this level's Plug Room): compares this object's own sprite number (+0x08) against each of the 4 required item sprites in the level's 7287 table (bytes 2-5), gated by the corresponding undelivered bit in the level's state nibble (byte1, CPL'd so unset/undelivered bits read as 1). On a match: sets that delivery bit in the state byte, repositions itself at the matching corner-cube grid cell (6254), increments the "Goodies Gathered" counter at $6123 (BCD), plays sound effect $01, runs a short animation via the 919A table, then re-pokes the grid cell to the "delivered" marker $13 and self-destructs ((IX+$02)=$FF). This strongly implies the object's sprite (+0x08) is set elsewhere to track whichever item the player is currently carrying/delivering -- that link is not yet found. If the state nibble is already fully clear (all delivered), falls through to the normal branch below.
NORMAL-ROOM BRANCH (93C1): settle/float physics -- the height/Z field (+0x07) decays by 4 each frame toward a rest value $18 (clamped), tested each step via 9BF0 (collision); if blocked, the height is bounced back up by 4 instead. Also checks bit 2 of (IX+$0D) (a "just hit by a weapon" flag set elsewhere, not yet traced) and calls 9401 if set.
9341 CALL $62F9 Test whether the current room is this level's Plug Room
9344 JR NZ,$93C1
9346 LD ($933F),HL
9349 LD C,$80
934B LD A,(HL)
934C CPL
934D LD DE,$72AB
9350 AND $0F
9352 JR Z,$93C1
9354 INC HL
9355 INC DE
9356 RLC C
9358 RRCA
9359 JR NC,$9350
935B LD B,A
935C LD A,(HL)
935D CP (IX+$08)
9360 LD A,B
9361 JR NZ,$9350
9363 EX DE,HL
9364 LD E,(HL)
9365 LD (IX+$09),E
9368 LD D,$00
936A LD HL,$612B
936D ADD HL,DE
936E LD (HL),$00
9370 LD HL,($933F)
9373 LD A,(HL)
9374 OR C
9375 LD (HL),A
9376 LD L,(IX+$0E)
9379 LD H,(IX+$0F)
937C LD (HL),$00
937E LD A,(IX+$09)
9381 CALL $6254 Set object position (IX+5/+6) from grid index A
9384 LD (IX+$0F),$00
9388 LD (IX+$07),$18
938C LD A,($6123) get "Goodies Gathered" end-game stat counter
938F ADD A,$01
9391 DAA
9392 LD ($6123),A set "Goodies Gathered" end-game stat counter
9395 LD A,$01
9397 CALL $848E Request sound effect A
939A CALL $923E Save continuation
939D LD HL,$919A
93A0 CALL $99D5 Sprite-animation stepper
93A3 RET NC
93A4 CALL $7FC0 Reset the sprite-draw clip window ($610A-$610D) to the full play-field
93A7 CALL $7F8E Reset the redraw bounding-box trackers ($6194-$6197) to empty
93AA LD E,(IX+$09)
93AD LD D,$00
93AF LD HL,$612B
93B2 ADD HL,DE
93B3 LD (HL),$13
93B5 LD A,E
93B6 DEC A
93B7 LD B,$17
93B9 CALL $6470 Redraw one terrain grid cell (index in BC), used to restore terrain hidden behind an object's sprite
93BC LD (IX+$02),$FF
93C0 RET
This entry point is used by the routine at 9401.
93C1 CALL $923E Save continuation
93C4 BIT 2,(IX+$0D)
93C8 CALL NZ,$9401 Creature hit/defeat sequence, called from 9341 when the "just hit" flag (bit 2 of +0x0D) is set
93CB LD A,(IX+$07)
93CE CP $18
93D0 RET Z
93D1 SUB $04
93D3 CP $18
93D5 JR NC,$93D9
93D7 LD A,$18
93D9 LD (IX+$07),A
93DC CALL $9BF0 Collision test
93DF RES 1,(IX+$0D)
93E3 RES 0,(IX+$0D)
93E7 JR NC,$93F4
93E9 JR NZ,$93EB
93EB LD A,(IX+$07)
93EE ADD A,$04
93F0 LD (IX+$07),A
93F3 RET
93F4 LD L,(IX+$0E)
93F7 LD H,(IX+$0F)
93FA INC HL
93FB INC HL
93FC LD A,(IX+$07)
93FF LD (HL),A
9400 RET
9401: Creature hit/defeat sequence, called from 9341 when the "just hit" flag (bit 2 of +0x0D) is set
Used by the routine at 9341.
CONFIRMED structure (trigger not yet traced): clears the hit flag, then only proceeds if the creature's current sprite (+0x08) is $44 (a shared "vulnerable" pose -- creatures presumably must be in this pose to register a hit). Searches a (room, position, reward-sprite) triple table at $7C89 (count from $7C97) for an entry matching the current room and this object's position field (+0x09); on a match, swaps the reward sprite into +0x09 and into offset +3 of a linked record (via +0x0E/+0x0F), plays sound effect $01 (the same "success" sound as item delivery), steps through the 919A animation table to transform the sprite, then finalizes (+0x08 = reward sprite, 9AAB kind lookup into +0x0A, 9A60) and resumes normal behaviour at 93C1. Likely how a creature is "defeated" and turns into a collectible (a Gnome?).
9401 RES 2,(IX+$0D) Clear the "just hit" flag (IX+0x0D bit 2)
9405 LD A,(IX+$08) A = the creature's current sprite, only proceed if it's $44, the vulnerable pose
9408 CP $44
940A RET NZ
940B LD A,(IX+$02) A = the object's position field, HL = the hit table $7C89, BC = its entry count/stride from $7C97
940E LD HL,$7C89
9411 LD BC,($7C97)
9415 CP (HL) Compare against this entry's room byte, advance HL, stop if matched
9416 INC HL
9417 JR Z,$941E
9419 INC HL Otherwise skip the rest of this entry, loop for the next
941A INC HL
941B DJNZ $9415
941D RET
941E LD A,(IX+$09) A = the object's own position field, compare against this entry's position, only proceed on match
9421 CP (HL)
9422 RET NZ
9423 POP DE Discard the return address, HL = the reward-sprite byte, swap it into the object's own position field (+0x09)
9424 INC HL
9425 LD A,(HL)
9426 LD (IX+$09),A
9429 LD E,(IX+$0E)
942C LD D,(IX+$0F) DE = a linked record pointer (+0x0E/+0x0F), write the same reward sprite into its offset +3
942F LD HL,$0003
9432 ADD HL,DE
9433 LD (HL),A
9434 LD A,$01 A = sound effect $01
9436 CALL $848E Request sound effect A
9439 LD HL,$919A HL = the transform animation table $919A, save it as the animation-stepper's own resume pointer
943C LD ($933D),HL
943F CALL $923E Save continuation
9442 LD HL,($933D) Read the next animation sprite from the saved pointer, store it as the object's sprite (+0x08)
9445 LD A,(HL)
9446 INC HL
9447 LD (IX+$08),A
944A LD ($933D),HL Save the advanced pointer, stop, mid-animation, unless the table's end marker $FF was reached
944D CP $FF
944F RET NZ
9450 LD A,(IX+$09) Animation done: A = the reward sprite, set it as the final sprite (+0x08)
9453 LD (IX+$08),A
9456 CALL $9AAB Search the (key,data) pair table at $74CE for key A
9459 LD A,(HL) A = the kind byte from the lookup, store it (+0x0A)
945A LD (IX+$0A),A
945D CALL $9A60 Dynamic object finalizer
9460 JP $93C1 Resume normal creature behaviour
9463: Data block at 9463
9463 DEFB $0D,$0D,$0E,$0E,$FF,$0B,$0B,$0C
946B DEFB $0C,$FF,$63,$94,$68,$94
9471: Behaviour handler of the fixed object record at $8E0F (object identity not yet known)
Copies the player's grid position ($8DBB/$8DBC) into its own fields $8E14/$8E15, copies the player's facing ($8DC1) into its own facing (IX+0x0B), then runs the sprite-animation table $946D via 99A7. Tracks the player's position/facing every frame rather than moving independently -- possibly a HUD marker or an attached "ghost" object, identity unconfirmed.
9471 LD A,($8DBB)
9474 LD ($8E14),A
9477 LD A,($8DBC)
947A LD ($8E15),A
947D LD A,($8DC1)
9480 LD (IX+$0B),A
9483 LD HL,$946D
9486 JP $99A7
9489: Data block at 9489
9489 DEFB $00,$06,$06,$00,$00,$06,$06,$00
9491 DEFB $00,$06,$89,$94
9495: Message at 9495
9495 DEFM "ZZ[["
9499: Data block at 9499
9499 DEFB $5C,$5C,$5D,$5D,$FF
949E: Behaviour handler of the fixed object record at $8E27 (object identity not yet known)
Sets height (+0x07) to $8DBD+$18, relative to the player's current depth, and position (+5/+6) to the player's grid position ($8DBB/$8DBC) offset by a per-facing-direction delta from table $9489, indexed by $8DC1 AND $06, then finalizes via 9A60 and starts the sprite-animation table $9495. Likely spawns/positions a bubble or trail effect relative to the player, though the fixed object's own identity ($8E27) isn't confirmed.
949E LD A,($8DBD) A = the global depth counter $8DBD + $18, set the height field (+0x07)
94A1 ADD A,$18
94A3 LD (IX+$07),A
94A6 LD A,($8DC1) A = the player's facing $8DC1, isolate the direction bits
94A9 AND $06
94AB LD L,A HL = the delta table $9489 plus the direction index
94AC LD H,$00
94AE LD DE,$9489
94B1 ADD HL,DE
94B2 LD A,($8DBB) A = the player's X ($8DBB), add the delta, store as this object's X (+0x05)
94B5 ADD A,(HL)
94B6 LD (IX+$05),A
94B9 INC HL Advance to the delta's dy byte, A = the player's Y ($8DBC), add it, store as Y (+0x06)
94BA LD A,($8DBC)
94BD ADD A,(HL)
94BE LD (IX+$06),A
94C1 CALL $9A60 Dynamic object finalizer
94C4 LD HL,$9495
94C7 JP $99D5 => Sprite-animation stepper
94CA: Object lifetime tick
Decrements lifetime countdown (IX+0x0B), on expiry self-destructs, else advances the sprite (IX+0x08) via an 8-entry per-frame table at $9495.
94CA DEC (IX+$0B) Decrement lifetime countdown (IX+0x0B)
94CD JR NZ,$94D4 If still counting, jump to the frame-advance below
94CF LD (IX+$02),$FF Expired: mark for self-destruction (+0x02=$FF)
94D3 RET
94D4 LD A,(IX+$0F) Advance frame index (IX+0x0F), wrapping at 8
94D7 INC A
94D8 AND $07
94DA LD (IX+$0F),A
94DD LD L,A Widen it to a word offset
94DE LD H,$00
94E0 LD DE,$9495 HL = the table $9495 plus that offset
94E3 ADD HL,DE
94E4 LD A,(HL) Read the sprite number and store it to (IX+0x08)
94E5 LD (IX+$08),A
94E8 RET
94E9: 99D5 sprite-animation table for the plant/coral object (94EE)
Sprites $4E,$4E,$50,$50 (see A714/A71C, both labeled "Plant/coral"), terminated by $FF -- a simple 2-frame swaying decoration.
94E9 DEFB $4E,$4E,$50,$50,$FF
94EE: Per-frame behaviour handler for value-$67 objects -- plant/coral
Its 99D5 animation table (94E9) is sprites $4E,$4E,$50,$50, both "Plant/coral" sprites -- a simple 2-frame swaying decoration.
94EE LD HL,$94E9
94F1 JP $99D5 => Sprite-animation stepper
94F4: Plug Room win-condition trigger
Per-frame behaviour handler for value-$6B objects, the plug. Polls every frame for full item delivery, then pops and increments the "Plugs Pulled" counter.
CONFIRMED: re-checks (every frame, via 62F9 + AND $0F/CP $0F) whether this level's Plug Room state nibble has reached $0F (all 4 items delivered -- see 9341). Once it has: increments the "Plugs Pulled" counter at $6124 (BCD), plays sound effect $09, and animates the plug popping out (+0x07 += 8 per frame, gated by bit 4 of +0x0D so this only fires once), then self-destructs on the following frame (bit 6 of +0x0D check). This is the actual win-condition trigger for a single Plug Room.
94F4 CALL $62F9 Test whether the current room is this level's Plug Room
94F7 LD A,(HL)
94F8 AND $0F
94FA CP $0F
94FC RET NZ
94FD LD A,($6124) get "Plugs Pulled" end-game stat counter
9500 ADD A,$01
9502 DAA
9503 LD ($6124),A set "Plugs Pulled" end-game stat counter
9506 LD A,$09
9508 CALL $848E Request sound effect A
950B CALL $923E Save continuation
950E BIT 6,(IX+$0D)
9512 JR NZ,$9521
9514 SET 4,(IX+$0D)
9518 LD A,(IX+$07)
951B ADD A,$08
951D LD (IX+$07),A
9520 RET
9521 LD (IX+$02),$FF
9525 RET
9526: 99D5 sprite-animation table for the whirlpool object (952D)
9526 DEFB $4C,$4C,$4D,$4D,$FF,$00,$00
952D: Per-frame behaviour handler for value-$69 objects -- whirlpool
Its 99D5 animation table (9526) is sprites $4C,$4C,$4D,$4D, both "Whirlpool, animation phase" sprites.
952D LD HL,$9526
9530 CALL $99D5 Sprite-animation stepper
9533 CALL $62F9 Test whether the current room is this level's Plug Room
9536 JR NZ,$9540
9538 LD A,(HL)
9539 AND $0F
953B CP $0F
953D JR Z,$955A
953F RET
9540 LD A,($8DBB)
9543 SUB (IX+$05)
9546 JR NC,$954A
9548 NEG
954A CP $05
954C RET NC
954D LD A,($8DBC)
9550 SUB (IX+$06)
9553 JR NC,$9557
9555 NEG
9557 CP $06
9559 RET NC
955A LD HL,($8DB9) get player behaviour-handler pointer
955D LD DE,$8968
9560 AND A
9561 SBC HL,DE
9563 RET NZ
9564 LD HL,$8D11
9567 LD ($8DB9),HL set player behaviour-handler pointer
956A LD A,(IX+$05)
956D LD ($952B),A
9570 LD A,(IX+$06)
9573 LD ($952C),A
9576 RET
9577: 99D5 sprite-animation table for the bubble source object (957C)
Sprites $68,$68,$69,$69 (see C38E/C39E, both relabeled "Bubble"), terminated by $FF.
9577 DEFB $68,$68,$69,$69,$FF
957C: Per-frame behaviour handler for value-$66/$6A objects -- bubble source
Its 99D5 animation table (9577) is sprites $68,$68,$69,$69, the 16x8 bubble sprites at C38E/C39E.
957C LD HL,$9577
957F CALL $99D5 Sprite-animation stepper
9582 DEC (IX+$0E)
9585 RET NZ
9586 LD A,(IX+$0B)
9589 LD (IX+$0E),A
958C PUSH IX
958E POP IY
9590 LD IX,$610E
9594 CALL $84AE Dynamic object allocator
9597 DEFW $9602 Dynamic object handler address (9602)
9599 LD A,(IY+$05)
959C LD (IX+$05),A
959F LD A,(IY+$06)
95A2 LD (IX+$06),A
95A5 LD (IX+$07),$18
95A9 LD (IX+$0A),$03
95AD LD A,(IY+$09)
95B0 LD (IX+$0B),A
95B3 LD A,(IY+$14)
95B6 LD (IX+$0E),A
95B9 CALL $9A60 Dynamic object finalizer
95BC PUSH IY
95BE POP IX
95C0 RET
95C1: Data block at 95C1
95C1 DEFB $62,$62,$63,$63,$64,$64,$5E,$FF
95C9 DEFB $FE,$02,$5F,$FE,$02,$5F,$FE,$02
95D1 DEFB $5E,$FE,$02,$5E,$FE,$02,$60,$FE
95D9 DEFB $02,$60,$FE,$02,$5E,$FE,$02,$5E
95E1 DEFB $FF,$FE,$04,$5F,$FE,$04,$5F,$FE
95E9 DEFB $04,$5E,$FE,$04,$5E,$FE,$04,$60
95F1 DEFB $FE,$04,$60,$FE,$04,$5E,$FE,$04
95F9 DEFB $5E,$FF
95FB DEFB $65,$65,$66,$66,$67,$67,$FF
9602: Per-frame behaviour handler for the individual rising-bubble particle spawned by 957C
Plays sound $03, then runs the rise animation via 99D5 (table $95C1, returns NC if off-screen). Resets phase, tests the despawn flag (+0x0D bit 6), jumping to self-destruction if set. If this is the full-strength variant (facing $6A), sets +0x0D bit 4 and switches to the alternate rise table $95E2, then runs the (possibly swapped) table again. If the bubble's height hasn't yet reached its target (+0x0E), or +0x09 is $FF, skips straight to the pop sequence. Otherwise scans for a nearby object via 9B5D; if it's specifically the player ($8DB6), refills the player's height (+0x07) by 2, or 4 for the full-strength variant, sets a player flag (+0x0D bit 4), and returns without popping. If no player nearby, falls through to the pop sequence: sets its own handler to resume past the setup, resets phase, and runs the pop animation via 99D5 (table $95FB).
At $9622-$962D, branches on the inherited trigger value at (IX+$0B) -- only if it's $6A does it SET bit 4 of (IX+$0D) and switch to movement table $95E2 (steps +0x07 by $04/frame) instead of the default 95C9 (steps by $02/frame): the $6A bubble rises at double the rate. That bit 4 flag is later tested at 97E6 (in the sprite-draw wrapper, right after 8128 draws it); only if set does it SET bit 6 of (IX+$0D). Back here at $961B, bit 6 being set causes immediate self-destruct ((IX+$02)=$FF). So only $6A-triggered bubbles can ever reach that clean completion state -- $66 bubbles never do: a full-strength bubble stream that completes its rise ($6A) vs. a weak one that never does ($66), matching gameplay where some bubble sources cannot lift the player all the way. Whether bit 6 specifically means "reached the surface" is unconfirmed.
9602 LD A,$03 A = sound effect $03
9604 CALL $848E Request sound effect A
9607 CALL $923E Save continuation
960A LD HL,$95C1 HL = the rise animation table $95C1
960D CALL $99D5 Sprite-animation stepper
9610 RET NC Off-screen: return
9611 LD (IX+$0F),$00 Reset the animation phase counter (+0x0F)
9615 CALL $923E Save continuation
9618 LD HL,$95C9 HL = the second rise table $95C9, test the despawn flag (+0x0D bit 6)
961B BIT 6,(IX+$0D)
961F JP NZ,$967F If set, jump straight to self-destruct
9622 LD A,(IX+$0B) A = facing, compare against $6A, the full-strength marker
9625 CP $6A
9627 JR NZ,$9630
9629 SET 4,(IX+$0D) Full-strength: set +0x0D bit 4, switch HL to the alternate table $95E2
962D LD HL,$95E2
9630 CALL $99D5 Sprite-animation stepper
9633 LD A,(IX+$07) A = the bubble's height (+0x07), compare against its target (+0x0E)
9636 CP (IX+$0E)
9639 JR NC,$966B If not yet reached, skip straight to the pop sequence
963B LD A,$FF A = $FF, compare against +0x09
963D CP (IX+$09)
9640 JP Z,$966B If it matches, skip straight to the pop sequence
9643 LD HL,$610E HL = the active-object list head $610E, scan for a nearby object
9646 CALL $9B5D
9649 RET NC None found: return
964A LD HL,$8DB6 Compare the found object's address against the player $8DB6
964D AND A
964E SBC HL,DE
9650 JR NZ,$966B Not the player: skip straight to the pop sequence
9652 LD B,$02 B = 2, the default height refill
9654 LD A,(IX+$0B) A = facing, compare against $6A
9657 CP $6A
9659 JR NZ,$965D if matched, B = 4 instead
965B LD B,$04
965D LD HL,$0007 HL = the found object's height field (+7), add B to it
9660 ADD HL,DE
9661 LD A,B
9662 ADD A,(HL)
9663 LD (HL),A
9664 LD HL,$000D HL = the found object's flags field (+0x0D), set bit 4
9667 ADD HL,DE
9668 SET 4,(HL)
966A RET
966B LD HL,$9678 Pop sequence: set the object's own handler to resume at $9678, reset the phase counter
966E LD (IX+$03),L
9671 LD (IX+$04),H
9674 LD (IX+$0F),$00
9678 LD HL,$95FB HL = the pop animation table $95FB
967B CALL $99D5 Sprite-animation stepper
967E RET NC Off-screen: return
967F LD (IX+$02),$FF Mark for self-destruction (+0x02=$FF)
9683 RET
9684: Per-frame behaviour handler for value-$68 objects -- rearing snake
Handler for 8E3F's objects (its handler-address bytes at 8E50 -- see 84AE), called from 983C's dispatcher.
Sprite starts at $23 (set by 8EA1 on spawn) and cycles through $23,$24,$25,$26 -- the "Snake, rearing phase" sprites at B56E/B57E/B59E/B5CE, with increasing sprite height (16x8 -> 16x16 -> 16x24 -> 16x32) as it rises, i.e. more of the snake's body becomes visible each frame. Full cycle: phase 0 = idle countdown at (IX+$0E) (decrements while nonzero); phase 1 = seed position (IX+$16)/(IX+$17) at $FC/$FE then jump +8; phase 2 = each call, INC sprite number (IX+$08) and jump position +8 again, repeating until sprite reaches $26 (fully reared), then sets a long countdown ($24) and advances to phase 3+; phase 3+ (default case) = each call, if sprite isn't back down to $23 yet, DEC sprite and retract position by -8; once back at $23, reset position to 0, set bit 7 of (IX+$0D) (purpose not traced), set another countdown, and restart the cycle at phase 1. A full rise-pause-retract-pause loop.
9684 LD A,(IX+$0E) test countdown (+0x0E), skip ahead if already zero
9687 AND A
9688 JR Z,$968E
968A DEC (IX+$0E) decrement countdown and return
968D RET
968E LD A,(IX+$0F) test phase counter, fall through to the rise seed if nonzero
9691 AND A
9692 JR NZ,$969C
9694 LD (IX+$16),$00 phase 0: init position to 0, advance to phase 1, return
9698 INC (IX+$0F)
969B RET
969C CP $01 phase 1: seed rise start position ($FE/$FC), advance phase
969E JR NZ,$96E0
96A0 LD (IX+$17),$FE
96A4 LD (IX+$16),$FC
96A8 INC (IX+$0F)
96AB LD A,(IX+$17) shared step: bump the Z offset (+0x17) by 8
96AE ADD A,$08
96B0 LD (IX+$17),A
96B3 LD A,(IX+$16) bump the position offset (+0x16) by 8
96B6 ADD A,$08
96B8 LD (IX+$16),A
96BB RES 7,(IX+$0D) clear bit 7 of the flags (+0x0D)
96BF LD HL,$610E HL = the active-object list head $610E
96C2 CALL $9B5D
96C5 RET NC nothing nearby: return
96C6 LD A,(IX+$07) A = this object's height plus its position offset
96C9 ADD A,(IX+$16)
96CC PUSH IX switch IX to the object that was found
96CE PUSH DE
96CF POP IX
96D1 LD (IX+$07),A write the combined height into it (+0x07)
96D4 SET 1,(IX+$0D) flag it as touched (+0x0D bit 1)
96D8 CALL $96BF
96DB EX (SP),IX restore IX, drop the saved pointer
96DD POP HL
96DE JR $96C2 keep scanning for more nearby objects
96E0 CP $02 phase 2?
96E2 JR NZ,$96F7
96E4 INC (IX+$08) step the sprite (+0x08) one frame further up
96E7 LD A,(IX+$08) not yet fully reared ($26): keep rising
96EA CP $26
96EC JR NZ,$96AB
96EE LD (IX+$0E),$24 fully reared: set the long pause countdown (+0x0E = $24)
96F2 INC (IX+$0F) advance to the next phase
96F5 JR $96AB
96F7 LD A,(IX+$08) phase 3+: A = the current sprite (+0x08)
96FA CP $23
96FC JR Z,$9712 back at $23: fully retracted
96FE DEC (IX+$08) otherwise step the sprite back one frame
9701 LD A,(IX+$17) retract the Z offset (+0x17) by 8
9704 SUB $08
9706 LD (IX+$17),A
9709 LD A,(IX+$16) retract the position offset (+0x16) by 8
970C SUB $08
970E LD (IX+$16),A
9711 RET
9712 LD (IX+$16),$00 fully retracted: reset position, restart the cycle at phase 1
9716 SET 7,(IX+$0D)
971A LD (IX+$0E),$24
971E LD (IX+$0F),$01
9722 RET
9723: Data block at 9723
9723 DEFB $39,$01,$39,$01,$31,$02,$29,$03
972B DEFB $21,$04,$19,$05,$11,$06,$09,$07
9733 DEFB $01,$08,$02,$07,$03,$06,$04,$05
973B DEFB $05,$04,$06,$03,$07,$02,$08,$01
9743 DEFB $08,$01
9745: Mark and redraw the static terrain cells behind an object's sprite, so moving objects don't leave trails
Used by the routine at 97BA.
Called by 97BA before drawing an object's sprite. Uses the 9723 table (row-band -> grid-row-start/count) to flag every grid cell (bit 7) within the sprite's vertical extent, skipping empty ($00) and solid-wall ($7F) cells; then does a second pass over the whole 64-cell grid, redrawing (via 6470) any flagged cell that also falls within the sprite's horizontal extent.
9745 LD A,(IX+$07) save the object's Z/height (+0x07)
9748 PUSH AF
9749 LD A,($610B) A = the clip-window top ($610B) divided by 8
974C RRCA
974D RRCA
974E RRCA
974F LD E,A widen it to a word: the row-band index
9750 LD D,$00
9752 LD HL,$9723 HL = 9723 + row-band index
9755 ADD HL,DE
9756 LD A,($610D) A = the clip-window bottom ($610D), rounded up
9759 ADD A,$01
975B RRA divided by 8
975C RRA
975D RRA
975E SUB E minus the top band index
975F RRCA halve it, +1: the band count
9760 INC A
9761 PUSH AF *loop: save the band count
9762 LD E,(HL) E = this band's grid-row start
9763 LD D,$00
9765 INC HL
9766 LD B,(HL) B = its cell count
9767 INC HL
9768 PUSH HL save the table cursor
9769 LD HL,$612B HL = grid base 612C + row-start
976C ADD HL,DE
976D LD DE,$0009 DE = 9 (row stride)
9770 LD A,(HL) *loop: skip empty cells ($00)
9771 AND A
9772 JR Z,$977A
9774 CP $7F skip solid wall cells ($7F)
9776 JR Z,$977A
9778 SET 7,(HL) otherwise mark it (bit 7)
977A ADD HL,DE advance to next cell, loop count times
977B DJNZ $9770
977D POP HL restore the table cursor and band count
977E POP AF
977F DEC A loop for the next row-band
9780 JR NZ,$9761
9782 LD A,(IX+$10) A = the sprite's left edge (+0x10), aligned down
9785 AND $F8
9787 LD L,A L = it, A = the top edge (+0x11)
9788 LD A,(IX+$11)
978B AND $F8 aligned down and divided by 8
978D RRCA
978E RRCA
978F RRCA
9790 ADD A,L C = the combined start cell index
9791 LD C,A
9792 ADD A,$07 B = it plus 7: the end cell index
9794 LD B,A
9795 LD HL,$612C Room grid address
9798 XOR A A = cell index (0)
9799 BIT 7,(HL) *scan: test and clear this cell's mark (bit 7)
979B RES 7,(HL)
979D JR Z,$97AF unmarked: skip it
979F CP C before the sprite's column range: skip it
97A0 JR C,$97AF
97A2 CP B past the end of the range: skip it
97A3 JR Z,$97AF
97A5 PUSH BC in range: save the range and cursor
97A6 PUSH HL
97A7 LD B,(IX+$07) B = the object's height (+0x07)
97AA CALL $6470 Redraw one terrain grid cell (index in BC), used to restore terrain hidden behind an object's sprite
97AD POP HL restore them
97AE POP BC
97AF INC HL advance to next cell
97B0 INC A
97B1 CP $40 loop until all 64 cells checked
97B3 JR C,$9799
97B5 POP AF restore Z/height, return
97B6 LD (IX+$07),A
97B9 RET
97BA: Draw an object's sprite
Used by the routine at 9900.
Input
IX ??
Converts record position (+5/+6) to screen coordinates and draws sprite (+8) with its mask via 8128.
97BA LD L,(IX+$05) HL = the object's position (+5/+6)
97BD LD H,(IX+$06)
97C0 LD A,$98 A = $98 minus the position's row/height offsets, plus L+H, D = the screen row
97C2 SUB (IX+$17)
97C5 SUB (IX+$07)
97C8 ADD A,L
97C9 ADD A,H
97CA LD D,A
97CB LD A,$80 A = $80 minus twice the column, plus twice the row, E = the screen column
97CD SUB L
97CE SUB L
97CF ADD A,H
97D0 ADD A,H
97D1 LD E,A
97D2 LD A,(IX+$08) A = the sprite number, isolate the mirror-flag bit, force bit 0
97D5 AND $80
97D7 OR $01
97D9 LD ($97E2),A Save that flag byte for 8128's own flip test at $97E2
97DC LD C,(IX+$08) C = the sprite number with the mirror flag masked off
97DF RES 7,C
97E1 LD A,$01 !!MUT-ARG!! A = 1, the colour parameter
97E3 CALL $8128 Draw sprite C with its mask at screen position DE
97E6 BIT 4,(IX+$0D) Test and clear the "just entered water" flag (IX+0x0D bit 4)
97EA RES 4,(IX+$0D)
97EE JR NC,$97F6 If clear, skip straight to the redraw-behind step
97F0 RET Z Otherwise, if the sprite draw was off-screen (Z), just return
97F1 SET 6,(IX+$0D) Set the "splash" flag (IX+0x0D bit 6) and return
97F5 RET
97F6 CALL $9745 Mark and redraw the static terrain cells behind an object's sprite, so moving objects don't leave trails
97F9 JP $8107 => Sprite draw
97FC: Change current room to A = new room number
Used by the routines at 67F1, 8968 and 8A87.
Input
A new room number
Draws the new current room via 676D, then restores SP from $60E9, saved by 9808, and falls into 9808 to resume the per-frame main loop.
97FC CALL $676D Draw current room
97FF LD SP,($60E9)
9803 JP $9808 => Per-frame main loop entry
9806: Data block at 9806
9806 DEFW $8E0F
9808: Per-frame main loop entry
Used by the routines at 6B05, 6B71 and 97FC.
Saves SP to $60E9 (restored by 97FC on room change); restores the message-window title when the $618A timer expires.
9808 LD ($60E9),SP
980C LD A,($618A)
980F AND A
9810 JR Z,$9824
9812 DEC A
9813 LD ($618A),A
9816 JR NZ,$9824
9818 LD HL,$65CF
981B CALL $7D68 Print string routine
981E LD HL,($65D9)
9821 CALL $7D68 Print string routine
9824 CALL $7FC0 Reset the sprite-draw clip window ($610A-$610D) to the full play-field
9827 XOR A
9828 LD ($60EB),A
982B LD IX,$610E
982F CALL $983C Per-frame dynamic object dispatcher
9832 LD IX,$9806
9836 CALL $983C Per-frame dynamic object dispatcher
9839 JP $9900 => Draw all queued objects
983C: Per-frame dynamic object dispatcher (walks the active object list from the head at 610E)
Used by the routine at 9808.
Input
IX ???
For each object record (IX) in the list (record +0/+1 links to the next; the list includes the pool records at A900, the PLAYER record at 8DB6, and the room's creature): if offset +2 reads $FF, the record was marked dead mid-frame -- unlinks it back onto the free list ($618B) instead of dispatching it. Otherwise, if its room matches the current room, calls its handler (offset +3/+4) via 61A7, then re-checks the room (the handler may have moved/removed it). If still valid and bit 7 of +0x0D is clear, computes a draw-order sort key ($5E + left edge +0x10 + top edge +0x11) into +0x0C, then inserts the record into the draw queue 60EC: scanning for the first entry whose bounding box (+0x10..+0x13) doesn't overlap this one, or -- if boxes do overlap -- whose sort key/+0x0C value is smaller, shifting later entries down to make room. This is the painter's-algorithm draw-order queue consumed by 9900/97BA.
983C LD L,(IX+$00) HL = the list head pointer
983F LD H,(IX+$01)
9842 LD A,L test for list end, return if so
9843 OR H
9844 RET Z
9845 PUSH HL save HL, IX = this record
9846 EX (SP),IX
9848 LD A,(IX+$02) check for a "deleted" marker (offset +2 == $FF)
984B INC A
984C JR NZ,$986C
984E LD L,(IX+$00) deleted: HL = this record's link, DE = the free-list head
9851 LD H,(IX+$01)
9854 LD DE,($618B) unlink this record, splice it onto the free list
9858 LD (IX+$00),E
985B LD (IX+$01),D
985E LD ($618B),IX update the free-list head, restore IX
9862 POP IX
9864 LD (IX+$00),L store the saved link back into the list, loop to the next record
9867 LD (IX+$01),H
986A JR $9842
986C LD A,($6126) get room number
986F CP (IX+$02)
9872 JP NZ,$98FC
9875 LD L,(IX+$03) HL = the object's handler pointer (+3/+4)
9878 LD H,(IX+$04)
987B CALL $61A7 JP (HL) trampoline
987E LD A,($6126) get room number
9881 CP (IX+$02)
9884 JR NZ,$98FC
9886 BIT 7,(IX+$0D) skip the sort-key update if bit 7 of +0x0D is set
988A JR NZ,$98FC
988C LD A,$5E A = $5E + the left edge (+0x10)
988E ADD A,(IX+$10)
9891 ADD A,(IX+$11) plus the top edge (+0x11)
9894 LD (IX+$0C),A store as the draw sort key (+0x0C)
9897 LD HL,$60EC HL = the draw queue $60EC
989A LD A,($60EB) A = the queue count
989D AND A
989E JR Z,$98F2 empty queue: append instead
98A0 LD B,A B = queue count, A = this object's sort key
98A1 LD A,(IX+$0C)
98A4 LD E,(HL) *loop: DE = this queue entry's record pointer
98A5 INC HL
98A6 LD D,(HL)
98A7 PUSH HL save the queue cursor
98A8 LD HL,$0010 HL = the queued entry's left edge (+0x10)
98AB ADD HL,DE
98AC LD A,(IX+$12) compare this object's right edge (+0x12) against it
98AF CP (HL)
98B0 JR C,$98D4 insert-before if less
98B2 INC HL compare bottom (+0x13) against the queued entry's top
98B3 LD A,(IX+$13)
98B6 CP (HL)
98B7 JR C,$98D4 insert-before if less
98B9 INC HL compare left (+0x10) against the queued entry's right
98BA LD A,(HL)
98BB CP (IX+$10)
98BE JR C,$98D4 insert-before if less
98C0 INC HL compare top (+0x11) against the queued entry's bottom
98C1 LD A,(HL)
98C2 CP (IX+$11)
98C5 JR C,$98D4 insert-before if less
98C7 LD HL,$0007 boxes overlap on both axes: HL = the queued entry's depth (+0x07)
98CA ADD HL,DE
98CB LD A,(HL) A = it
98CC POP HL restore the cursor, compare against this object's own depth
98CD CP (IX+$07)
98D0 JR NC,$98E4 insert-before if this object is nearer
98D2 JR $98DF fall through to keep scanning
98D4 LD HL,$000C boxes don't overlap: HL = the queued entry's sort key (+0x0C)
98D7 ADD HL,DE
98D8 LD A,(IX+$0C) compare against this object's sort key
98DB CP (HL)
98DC POP HL restore the cursor, insert-before if less
98DD JR C,$98E4
98DF INC HL keep scanning: advance HL, loop
98E0 DJNZ $98A4
98E2 JR $98F2 queue exhausted without a match: append instead
98E4 DEC HL found the insert point
98E5 LD A,B compute the shift distance (queue count * 2)
98E6 ADD A,A
98E7 LD C,A
98E8 LD B,$00
98EA ADD HL,BC
98EB LD E,L DE = HL+1, the shifted-up destination
98EC LD D,H
98ED INC DE
98EE DEC HL
98EF LDDR shift the tail of the queue up one slot
98F1 INC HL advance HL back to the insert slot
98F2 PUSH IX DE = this object's own record address (IX)
98F4 POP DE
98F5 LD (HL),E
98F6 INC HL
98F7 LD (HL),D
98F8 LD HL,$60EB increment the queue count
98FB INC (HL)
98FC POP HL restore the list-traversal pointer
98FD JP $983C => Per-frame dynamic object dispatcher
9900: Draw all queued objects: walk the record-pointer list at $60EC (count at $60EB), drawing each via 97BA
Used by the routine at 9808.
Reads the queued-object count from $60EB, returning immediately if zero. Otherwise walks the record-pointer list at $60EC, loading each pointer into IX and calling 97BA to draw it, until the count is exhausted -- the final draw pass consuming the painter's-algorithm queue built by 983C.
9900 LD A,($60EB) B = queued-object count from $60EB
9903 AND A If zero, nothing to draw, return
9904 RET Z
9905 LD B,A B = count, HL = the draw-queue's record-pointer list at $60EC
9906 LD HL,$60EC
9909 PUSH BC Save BC, the outer loop counter
990A LD E,(HL) Read the next queued record pointer (E,D) from the list, advancing HL
990B INC HL
990C LD D,(HL)
990D INC HL
990E PUSH HL Save HL, load the record pointer into IX
990F PUSH DE
9910 POP IX
9912 CALL $97BA Draw an object's sprite
9915 POP HL Restore HL, restore BC, loop back to $9909 for the next queued object
9916 POP BC
9917 DJNZ $9909
9919 RET
991A: Data block at 991A
991A DEFB $00,$FA,$00,$06,$00,$00,$06,$00
9922 DEFB $FA
9923: Spawn the weapon projectile object (thrown from the player's position, facing $8DC1), handler 9963
Used by the routine at 8D8D.
Plays sound effect $08, allocates an object at the active list head, sets its sprite to the weapon's own sprite (A), position from the player, kind $0D, and facing from $8DC1, then calls 9A60 to finalize.
9923 PUSH AF
9924 LD A,$08
9926 CALL $848E Request sound effect A
9929 LD IX,$610E
992D CALL $84AE Dynamic object allocator
9930 DEFW $9963 Dynamic object handler address
9932 POP AF
9933 LD (IX+$08),A
9936 LD A,($8DBD)
9939 LD (IX+$07),A
993C LD HL,($8DBB)
993F LD (IX+$05),L
9942 LD (IX+$06),H
9945 LD (IX+$0A),$0D
9949 LD A,($8DC1)
994C LD (IX+$0B),A
994F LD HL,$991B
9952 CALL $8ABE
9955 CALL $9A60 Dynamic object finalizer
9958 RET NC
9959 LD (IX+$02),$FF
995D RET
995E: Data block at 995E
995E DEFB $1C,$1C,$9C,$9C,$FF
9963: Weapon projectile per-frame handler: move (double step) and detect a hit on collision
Applies the facing delta twice via 8ABE (see 8ABB), testing collision (9BF0) after each step -- a fast-moving shot. On collision with terrain (no target object, DE unset): just stops. On collision with another object (DE = that object's record): SETS bit 2 of its (+0x0D) -- the "just hit" flag consumed by 9341/9401 -- and writes the projectile's own sprite (masked to 7 bits) into that object's offset +9, presumably so 9401's reward lookup can identify which weapon scored the hit. Animates briefly via the 995E table, then self-destructs.
9963 CALL $8ABB Apply the object's facing direction to its position (IX+5/+6), returning the OLD position in BC
9966 PUSH BC
9967 CALL $9BF0 Collision test
996A POP BC
996B JR C,$9976
996D CALL $8ABB Apply the object's facing direction to its position (IX+5/+6), returning the OLD position in BC
9970 PUSH BC
9971 CALL $9BF0 Collision test
9974 POP BC
9975 RET NC
9976 LD (IX+$05),B
9979 LD (IX+$06),C
997C JR NZ,$998E
997E LD HL,$000D
9981 ADD HL,DE
9982 SET 2,(HL)
9984 LD HL,$0009
9987 ADD HL,DE
9988 LD A,(IX+$08)
998B AND $7F
998D LD (HL),A
998E LD (IX+$0F),$00
9992 CALL $923E Save continuation
9995 LD HL,$995E
9998 CALL $99D5 Sprite-animation stepper
999B RET NC
999C LD (IX+$02),$FF
99A0 RET
99A1: Direction-indexed sprite-animation stepper
Used by the routines at 90A8 and 925C.
Picks one of 4 per-direction tables via (IX+$0B), then runs 99D5's stepper on it.
HL = (IX+$1D)/(IX+$1E), a pointer to a table of 4 sub-table addresses. Selects one by facing direction ((IX+$0B), mapped 1->0/2->1/... via a small comparison chain, then AND $03), loads that sub-table's address, and falls into 99D5's shared byte-code interpreter ($FD/$FC/$FE/$FB position-delta markers, otherwise a sprite number) -- this is how the player's (and other directional objects') walk-cycle animation is driven per-facing.
99A1 LD L,(IX+$1D)
99A4 LD H,(IX+$1E)
This entry point is used by the routines at 8968, 8AFB, 8D8D and 9471.
99A7 LD A,$C9 "RET" instruction code
99A9 LD ($99D1),A set instruction
99AC LD A,(IX+$0B)
99AF CP $06
99B1 JR NZ,$99B9
99B3 XOR A "NOP" instruction code
99B4 LD ($99D1),A set instruction
99B7 LD A,$01
99B9 CP $02
99BB JR NZ,$99C3
99BD XOR A "NOP" instruction code
99BE LD ($99D1),A set instruction
99C1 LD A,$04
99C3 RRCA
99C4 AND $03
99C6 LD E,A
99C7 LD D,$00
99C9 ADD HL,DE
99CA LD E,(HL)
99CB INC HL
99CC LD D,(HL)
99CD EX DE,HL
99CE JP $99DA
99D1: NEG / not NEG
Used by the routine at 99D5.
A 1-byte self-modified stub, patched by 99A1/99D5 to either NEG ($44) or RET ($C9). 9A01/9A15 CALL it to conditionally negate a signed delta before adding it to the object's position, letting the same animation-table byte-code represent movement in either direction depending on facing.
99D1 RET !!MUT-CMD!! patched by 99A9, 99B4, 99BE and 99D7
99D2 NEG
99D4 RET
99D5: Sprite-animation stepper: read next entry from a per-object sprite-number table, advancing a phase counter
Used by the routines at 8968, 8D11, 91A6, 9341, 949E, 94EE, 952D, 957C, 9602 and 9963.
Called with HL = a small table of raw sprite numbers (see 9526/9577/94E9 for examples). Indexes the table by (IX+$0F) (a per-object phase counter), reads the byte there into A, then INCs (IX+$0F) for next time. $FF in the table means "wrap to start" (resets (IX+$0F) to 0 and re-reads from the table's first byte); $FD is a second special marker (purpose not yet traced past 9A01). Otherwise A is the next sprite number to display for this object -- this is how 957C/952D/94EE (and others) drive their objects' animation frames.
99D5 LD A,$C9 "RET" instruction code
99D7 LD ($99D1),A set instruction
This entry point is used by the routine at 99A1.
99DA XOR A Clear the wrap-flag scratch $991A
99DB LD ($991A),A
99DE LD C,L save the table base (HL) into BC
99DF LD B,H
99E0 LD E,(IX+$0F) HL = the table base plus the phase counter (IX+0x0F)
99E3 LD D,$00
99E5 ADD HL,DE
99E6 LD A,(HL) A = the next table byte, advance the pointer and the phase counter, test for the wrap marker $FF
99E7 INC HL
99E8 INC (IX+$0F)
99EB CP $FF
99ED JR NZ,$99FC If not the wrap marker, use this byte as-is
99EF LD (IX+$0F),$00 Wrap marker: reset the phase counter to 0, restart from the table base, set the wrap-flag, loop back for the real first byte
99F3 LD L,C
99F4 LD H,B
99F5 LD A,$FF
99F7 LD ($991A),A
99FA JR $99E6
99FC CP $FD Test for the "adjust X" marker $FD
99FE JR NZ,$9A10
9A00 LD A,(HL) A = the delta operand byte
9A01 CALL $99D1 NEG / not NEG
9A04 ADD A,(IX+$05) Add it, possibly negated, to X (+0x05), store back
9A07 LD (IX+$05),A
9A0A INC HL Advance past the operand, advance the phase counter, loop for the next byte
9A0B INC (IX+$0F)
9A0E JR $99E6
9A10 CP $FC Test for the "adjust Y" marker $FC
9A12 JR NZ,$9A20
9A14 LD A,(HL) A = the delta operand byte
9A15 CALL $99D1 NEG / not NEG
9A18 ADD A,(IX+$06) Add it, possibly negated, to Y (+0x06), store back, loop back to advance
9A1B LD (IX+$06),A
9A1E JR $9A0A
9A20 CP $FE Test for the "adjust height" marker $FE
9A22 JR NZ,$9A2D
9A24 LD A,(IX+$07) Add the table byte to the height field (+0x07), store back, loop back to advance
9A27 ADD A,(HL)
9A28 LD (IX+$07),A
9A2B JR $9A0A
9A2D CP $FB Test for the "set facing" marker $FB
9A2F JR NZ,$9A37
9A31 LD A,(HL) A = the table byte, store it as the object's facing (+0x0B), loop back to advance
9A32 LD (IX+$0B),A
9A35 JR $9A0A
9A37 LD (IX+$08),A Otherwise: A is a plain sprite number, store it as the object's sprite (+0x08)
9A3A LD A,($99D1) get instruction code
9A3D AND A If the last instruction code was RET, no wrap happened, set the mirror flag on the sprite (+0x08 bit 7)
9A3E JR NZ,$9A44
9A40 SET 7,(IX+$08)
9A44 LD A,($991A) A = the wrap-flag, 0 or $FF, doubled to a signed byte, return
9A47 ADD A,A
9A48 RET
9A49: Snap the object's position (IX+5/+6) to its grid-cell centre, then finalize via 9A60
Used by the routines at 676D and 8968.
Masks each of X (IX+5) and Y (IX+6) to its 8px-aligned cell (AND $F8) then adds 4 to centre it in the cell, before falling into 9A60 to recompute the bounding box.
9A49 LD A,(IX+$05)
9A4C AND $F8
9A4E OR $04
9A50 LD (IX+$05),A
9A53 LD A,(IX+$06)
9A56 AND $F8
9A58 OR $04
9A5A LD (IX+$06),A
9A5D JP $9A60 => Dynamic object finalizer
9A60: Dynamic object finalizer
Used by the routines at 6663, 8968, 8AFB, 8E6E, 8EA7, 8EF2, 8F82, 9021, 90A8, 925C, 9401, 949E, 957C, 9923, 9A49 and 9BF0.
Computes the object's bounding box (+0x10..+0x13) from its position and a per-kind size template.
CONFIRMED: copies a 3-byte size template from table $750A (indexed by the object's kind, +0x0A, *3) into its own +0x15/+0x16/+0x17 fields, then uses the template's first byte as a half-extent to derive the bounding box: left/right (+0x10/+0x12) from the X position (+5), top/bottom (+0x11/+0x13) from the Y position (+6). Returns with Carry set (and skips writing the far edge) if either edge underflows or the box would extend past screen column/row 63 -- this is presumably how objects too close to the screen edge get flagged. This is the source of the +0x10..+0x13 fields every collision routine (9BF0/9B5A/9ABC) reads.
9A60 PUSH IX HL = IX + 0x15 (the size-template destination), DE = HL
9A62 POP HL
9A63 LD DE,$0015
9A66 ADD HL,DE
9A67 EX DE,HL
9A68 LD C,(IX+$0A) C = object kind (+0x0A), HL = $750A + C*3 (size-template source)
9A6B LD B,$00
9A6D LD HL,$750A
9A70 ADD HL,BC
9A71 ADD HL,BC
9A72 ADD HL,BC
9A73 LD BC,$0003 BC = 3, copy the size template into +0x15/+0x16/+0x17 via LDIR
9A76 LDIR
9A78 LD E,(IX+$15) E = half-extent (template byte 0), A = X position, compute the left edge
9A7B LD A,(IX+$05)
9A7E SUB E
9A7F LD (IX+$10),A store the left edge (+0x10)
9A82 JR C,$9AA7 bail out if the left edge underflowed
9A84 JR Z,$9AA7
9A86 ADD A,E compute the right edge = left + 2*half-extent - 1
9A87 ADD A,E
9A88 DEC A
9A89 LD (IX+$12),A store the right edge (+0x12)
9A8C CP $3F bail out if the right edge is off the 63-column screen
9A8E JR NC,$9AA7
9A90 LD A,(IX+$06) A = Y position, compute the top edge
9A93 SUB E
9A94 LD (IX+$11),A store the top edge (+0x11)
9A97 JR C,$9AA7 bail out if the top edge underflowed
9A99 JR Z,$9AA7
9A9B ADD A,E compute the bottom edge
9A9C ADD A,E
9A9D DEC A
9A9E LD (IX+$13),A store the bottom edge (+0x13)
9AA1 CP $3F bail out if the bottom edge is off the 63-row screen
9AA3 JR NC,$9AA7
9AA5 AND A success: clear Carry, return
9AA6 RET
9AA7 OR $01 failure: set Carry, return
9AA9 SCF
9AAA RET
9AAB: Search the (key,data) pair table at $74CE for key A; returns Z with HL pointing at the matched pair's data byte
Used by the routines at 64BB, 6663, 8E6E, 8F4C, 9401 and 9AFD.
Walks B entries, count = low byte of $7509, starting at $74CE, comparing each entry's key byte against A; on a match (Z) returns with HL pointing at that entry's paired data byte, otherwise returns NZ after scanning the whole table. Used by 8E6E, creature height lookup, and others resolving a code into a data value via this shared 2-byte-record table.
9AAB LD HL,$74CE HL = the key/data pair table $74CE
9AAE LD BC,($7509) BC = table entry count, low byte of $7509
9AB2 LD B,C B = the entry count
9AB3 CP (HL) Compare A against this entry's key
9AB4 INC HL Advance past the key byte, stop (Z) if matched, HL now points at the paired data byte
9AB5 RET Z
9AB6 INC HL Otherwise skip the data byte too
9AB7 DJNZ $9AB3 Loop for the next entry
9AB9 RET Not found, return NZ
9ABA: Data block at 9ABA
9ABA DEFB $00,$FF
9ABC: Terrain collision test for one screen point (B,C): convert to a grid cell and check its content
Used by the routine at 9BF0.
Input
BC ??
Converts screen coordinates (B=X,C=Y) to a room-grid cell: (Y AND $F8)>>3 * 8 + (X AND $F8)>>3 -- confirms the 612C grid's row*8+col indexing operates on 8px-aligned screen tiles. Reads the grid cell; $00 = passable (no collision). $7F = solid wall, hard block (see 9B56). Any other nonzero code is looked up in a per-terrain-code shape/behaviour table at $7556 (the same table 8E6E reads) -- individual terrain codes may have different collision shapes rather than being uniformly solid.
9ABC LD A,B compute the grid row byte from screen Y (B AND $F8)
9ABD AND $F8
9ABF LD L,A
9AC0 LD A,C compute the grid column from screen X (C AND $F8, /8), combine into the cell index
9AC1 AND $F8
9AC3 RRCA
9AC4 RRCA
9AC5 RRCA
9AC6 ADD A,L
9AC7 LD HL,$9ABB dedupe check: skip re-marking the same cell twice in a row (cache at $9ABB)
9ACA CP (HL)
9ACB RET Z
9ACC INC (HL) update the cache, handling the increment-overflow edge case
9ACD JR Z,$9ACF
9ACF LD (HL),A store the cache, L = cell index, H = 0
9AD0 LD L,A
9AD1 LD H,$00
9AD3 LD BC,$612C Room grid address
9AD6 ADD HL,BC HL = grid cell address, read it, done (NC) if empty
9AD7 LD A,(HL)
9AD8 AND A
9AD9 JR Z,$9B40
9ADB LD ($9ABA),A cache the value, branch away (blocked) if solid wall ($7F)
9ADE CP $7F
9AE0 JP Z,$9B56
9AE3 LD L,A HL = 7556 + value*2 (shape-pointer lookup)
9AE4 ADD HL,HL
9AE5 LD H,$00
9AE7 LD BC,$7556
9AEA ADD HL,BC
9AEB LD E,(HL) DE = the shape record pointer
9AEC INC HL
9AED LD D,(HL)
9AEE EX DE,HL
9AEF LD A,(IX+$07) D = the object's height field (+0x07)
9AF2 LD D,A
9AF3 ADD A,(IX+$16) E = D + the object's +0x16 field, minus 1 (in-cell position)
9AF6 DEC A
9AF7 LD E,A
9AF8 LD C,$18 C = $18 (loop threshold), B = shape record byte count
9AFA LD B,(HL)
9AFB JR $9B24 jump into 9AFD's shape-walk loop
9AFD: Terrain sub-cell shape resolver
Walks a 7556 shape record, deciding a partial collision against the object's position within the cell.
Called from 9ABC's grid collision test for non-wall, non-empty terrain codes. Walks the shape record's bytes as (key,threshold) style entries: each key is looked up in 74CE then 750B to get a threshold delta, accumulated and compared against the object's in-cell position (D). Depending on where the accumulated threshold lands relative to D, and whether the resulting shape value is found in a small buffer at $75AE, either returns "no block" (NC) or "blocked" (Carry set), and may SET bit 0 or bit 1 of the object's (IX+$0D) along the way -- exact in-game meaning of those bits (ledge? climbable edge?) not confirmed.
9AFD LD A,E test loop position against threshold C, skip ahead if before it
9AFE CP C
9AFF JR C,$9B27
9B01 PUSH HL save HL/BC, A = this shape-record byte
9B02 PUSH BC
9B03 LD A,(HL)
9B04 CALL $9AAB Search the (key,data) pair table at $74CE for key A
9B07 LD C,(HL)
9B08 LD B,$00
9B0A LD HL,$750B HL = the 750B table
9B0D ADD HL,BC plus the index * 3, its entry size
9B0E ADD HL,BC
9B0F ADD HL,BC
9B10 LD A,(HL) A = the entry's first byte
9B11 POP BC restore BC and HL
9B12 POP HL
9B13 ADD A,C accumulate the running threshold (A += C), compare against D
9B14 LD C,A
9B15 CP D
9B16 JR C,$9B24
9B18 JR NZ,$9B20 branch on the comparison, storing the shape value on an exact match, then advance
9B1A LD A,(HL)
9B1B LD (IX+$14),A
9B1E JR $9B24
9B20 LD A,(HL) test for a nonzero shape value, branch further away if set
9B21 AND A
9B22 JR NZ,$9B42
This entry point is used by the routine at 9ABC.
9B24 INC HL *loop-advance: INC HL, DJNZ back to the top
9B25 DJNZ $9AFD
9B27 LD A,(IX+$14) loop exhausted: test the accumulated shape value, return unblocked if zero
9B2A AND A
9B2B JR Z,$9B40
9B2D LD HL,$75AE search the $75AE buffer for this shape value (count from $75B5)
9B30 LD BC,($75B5)
9B34 LD B,$00
9B36 CPIR
9B38 JR NZ,$9B40
9B3A SET 1,(IX+$0D) found: SET bit 1 of (IX+$0D), return unblocked
9B3E JR $9B40
This entry point is used by the routine at 9ABC.
9B40 AND A *shared exit: clear Carry, return (not blocked)
9B41 RET
9B42 LD (IX+$14),A threshold-exceeded path: store the shape value, search the $75AE buffer
9B45 LD HL,$75AE
9B48 LD BC,($75B5)
9B4C LD B,$00 CPIR search, SET bit 0 of (IX+$0D) if found
9B4E CPIR
9B50 JR NZ,$9B56
9B52 SET 0,(IX+$0D)
This entry point is used by the routine at 9ABC.
9B56 OR $01 *shared exit: return with Carry set (blocked)
9B58 SCF
9B59 RET
9B5A: Collision/overlap scan
Used by the routines at 9021 and 9BF0.
Walks the active object list looking for another same-room object whose bounding box (+$10..+$13) overlaps IX's; DE = the object found.
Per candidate (DE): skips self (DE==IX), skips a different room (+2 mismatch), skips a candidate with bit 7 of +0x0D set (an "inactive/ignore" flag), then does an AABB test between the candidate's and caller's +0x10..+0x13 boxes, then a depth/height check via +0x07 and +0x16. On a depth TIE specifically, hands off to 9BD4 instead of finishing here. On success: if the found object is not the player (8DB6) and its bit 3 of +0x0D is set, SETs bit 0 of the CALLER's +0x0D (9BD4's variant sets bit 1 instead) -- these look like "touching an interactive/solid object" markers, exact consumer not traced. Returns with DE = the found object, Carry set; NC if the list is exhausted with no match.
9B5A LD HL,$610E HL = active object list head 610E
This entry point is used by the routines at 8AFB, 9602, 9684 and 9BD4.
9B5D LD E,(HL) *loop: DE = next record's link
9B5E INC HL
9B5F LD D,(HL)
9B60 LD A,D return if list end (DE=0)
9B61 OR E
9B62 RET Z
9B63 PUSH IX skip if candidate == caller (self)
9B65 POP HL
9B66 AND A
9B67 SBC HL,DE
9B69 JP Z,$9BEC HL = candidate + 2 (room field)
9B6C LD HL,$0002
9B6F ADD HL,DE
9B70 LD A,(IX+$02) A = caller's room
9B73 CP (HL) compare against candidate's room, skip if different
9B74 JP NZ,$9BEC
9B77 LD HL,$000D skip if candidate's bit 7 of +0x0D is set (inactive)
9B7A ADD HL,DE
9B7B BIT 7,(HL)
9B7D JP NZ,$9BEC
9B80 LD HL,$0013 HL = the candidate's bottom edge (+0x13)
9B83 ADD HL,DE
9B84 LD A,(HL) compare against the caller's top (+0x11)
9B85 CP (IX+$11)
9B88 JR C,$9BEC above it: no overlap
9B8A DEC HL compare the candidate's right against the caller's left (+0x10)
9B8B LD A,(HL)
9B8C CP (IX+$10)
9B8F JR C,$9BEC left of it: no overlap
9B91 DEC HL
9B92 LD A,(IX+$13) compare the caller's bottom (+0x13) against the candidate's top
9B95 CP (HL)
9B96 JR C,$9BEC above it: no overlap
9B98 DEC HL compare the caller's right (+0x12) against the candidate's left
9B99 LD A,(IX+$12)
9B9C CP (HL)
9B9D JR C,$9BEC left of it: no overlap
9B9F LD HL,$0016 compute candidate depth (+0x16 + terrain byte at the +0x07 offset)
9BA2 ADD HL,DE
9BA3 LD A,(HL)
9BA4 LD HL,$0007
9BA7 ADD HL,DE
9BA8 ADD A,(HL)
9BA9 CP (IX+$07) compare against caller's depth (+0x07), hand off to 9BD4 on an exact tie
9BAC JR C,$9BEC
9BAE JR Z,$9BD4
9BB0 LD A,(IX+$07) depth check continued: skip if candidate is at or below the caller's height
9BB3 ADD A,(IX+$16)
9BB6 CP (HL)
9BB7 JR C,$9BEC
9BB9 JR Z,$9BEC
9BBB LD HL,$000D HL = the candidate's flags (+0x0D)
9BBE ADD HL,DE
9BBF BIT 3,(HL) bit 3 clear: nothing more to flag
9BC1 JR Z,$9BCF
9BC3 LD HL,$8DB6 compare the candidate against the player ($8DB6)
9BC6 AND A
9BC7 SBC HL,DE
9BC9 JR Z,$9BCF it is the player: skip the flag
9BCB SET 0,(IX+$0D) otherwise set bit 0 of the caller's own flags (+0x0D)
9BCF XOR A match found: return with Carry set
9BD0 SCF
9BD1 RET
9BD2: Data block at 9BD2
9BD2 DEFB $AF,$C9
9BD4: Depth-tie resolver
Used by the routine at 9B5A.
On an exact depth tie with a candidate object (DE), tests its blocking-tag flag and updates the mover's own flags before continuing the overlap scan at 9B5D.
9BD4 LD (IX+$14),$01 Set the mover's "touched something" flag (+0x14) = 1
9BD8 LD HL,$000D HL = the candidate object's flags field (+0x0D), addressed via DE
9BDB ADD HL,DE
9BDC BIT 3,(HL) Test bit 3, a blocking-tag flag
9BDE JR Z,$9BEC If clear, skip the marker check and the flag-set below
9BE0 LD HL,$8DB6 Compare the candidate object's address against the fixed marker $8DB6
9BE3 AND A
9BE4 SBC HL,DE
9BE6 JR Z,$9BEC If it matches, skip the flag-set below
9BE8 SET 1,(IX+$0D) Otherwise set bit 1 of the mover's own flags (+0x0D)
This entry point is used by the routine at 9B5A.
9BEC EX DE,HL Restore DE/HL and continue the object-overlap scan at $9B5D
9BED JP $9B5D
9BF0: Collision test
Used by the routines at 66CE, 8AD9, 8AFB, 8CDF, 90A8, 925C, 9341 and 9963.
Input
IX ??
Checks the object's 4 bounding-box corners against the room grid, then checks for overlap with other objects.
Tests all 4 corners of the object's bounding box (screen-coordinate pairs at +0x10/+0x11, +0x10/+0x13, +0x12/+0x13, +0x12/+0x11 -- i.e. (left,top)/(left,bottom)/(right,bottom)/(right,top)) via 9ABC, returning early (C) if any corner hits solid terrain. If all 4 corners are clear, finishes with 9B5A (object-vs-object overlap scan). Also calls 9A60 first and returns early if it reports collision (purpose of that specific pre-check not fully traced).
9BF0 XOR A
9BF1 LD (IX+$14),A
9BF4 LD ($9ABA),A
9BF7 LD A,$FF
9BF9 LD ($9ABB),A
9BFC CALL $9A60 Dynamic object finalizer
9BFF RET C
9C00 LD B,(IX+$10)
9C03 LD C,(IX+$11)
9C06 CALL $9ABC Terrain collision test for one screen point
9C09 RET C
9C0A LD B,(IX+$10)
9C0D LD C,(IX+$13)
9C10 CALL $9ABC Terrain collision test for one screen point
9C13 RET C
9C14 LD B,(IX+$12)
9C17 LD C,(IX+$13)
9C1A CALL $9ABC Terrain collision test for one screen point
9C1D RET C
9C1E LD B,(IX+$12)
9C21 LD C,(IX+$11)
9C24 CALL $9ABC Terrain collision test for one screen point
9C27 RET C
9C28 XOR A
9C29 LD ($9ABA),A
9C2C CALL $9B5A Collision/overlap scan
9C2F RET C
9C30 AND A
9C31 RET
9C32: Data block at 9C32
9C32 DEFB $00,$B9,$FF
9C35: End-of-frame screen flip
Used by the routines at 6B71 and 85A1.
Copies the shadow screen to the real ZX screen over the dirty bounding box ($6194-$6196), then redraws the room background.
Only copies the rectangle actually touched this frame (tracked by 7F9B/835E's min/max bounds), using an unrolled 32-LDI row copy. Finishes with a one-shot sound cue and jumps to 69AC to redraw the room background.
9C35 LD HL,$61A6 HL = the saved-clip flag $61A6
9C38 LD A,(HL) read it and clear it
9C39 LD (HL),$00
9C3B AND A not set: skip the restore
9C3C JR Z,$9C4A
9C3E LD HL,$9C32 HL = the saved 3-byte clip value $9C32, DE = $6195
9C41 LD DE,$6195
9C44 LDI restore it over the bounding box
9C46 LDI
9C48 LDI
9C4A LD BC,$6194 BC = the bounding-box min tracker $6194
9C4D LD A,(BC) A = the top row, aligned down to a cell boundary
9C4E AND $F8
9C50 LD D,A D = it, write the aligned value back
9C51 LD (BC),A
9C52 AND $38 isolate the row-within-third, *4 into E
9C54 ADD A,A
9C55 ADD A,A
9C56 LD E,A
9C57 LD A,D A = the aligned row again, keep its low 3 bits
9C58 AND $07
9C5A LD H,A
9C5B LD A,D A = the screen-third bits
9C5C AND $C0
9C5E RRCA rotate them down into place
9C5F RRCA
9C60 RRCA
9C61 OR H D = the combined address high byte
9C62 LD D,A
9C63 LD HL,$4000 HL = shadow screen base $4000 + the computed row offset
9C66 ADD HL,DE
9C67 INC BC read the bounding-box min column
9C68 LD A,(BC)
9C69 AND $F8 align it down to a byte boundary, write it back
9C6B LD (BC),A
9C6C RRCA divide by 8 -> the byte-column offset
9C6D RRCA
9C6E RRCA
9C6F LD E,A widen it to a word
9C70 LD D,$00
9C72 ADD HL,DE add it to the destination address
9C73 LD ($9CBB),HL save the destination address at $9CBB
9C76 DEC BC A = the aligned min row again
9C77 LD A,(BC)
9C78 LD L,A widen it to a word
9C79 LD H,$00
9C7B ADD HL,HL multiply by 32, the shadow-screen row stride
9C7C ADD HL,HL
9C7D ADD HL,HL
9C7E ADD HL,HL
9C7F ADD HL,HL
9C80 ADD HL,DE add the column offset
9C81 LD DE,$E390 Shadow screen address
9C84 ADD HL,DE
9C85 LD ($9CBE),HL save the source address at $9CBE
9C88 LD HL,($6194) HL = the bounding box, BC = the max tracker $6196
9C8B LD BC,$6196
9C8E LD A,(BC) A = the max row, rounded up to a cell boundary
9C8F OR $07
9C91 INC A
9C92 SUB L minus the min row: abort if the box is empty
9C93 RET C
9C94 RRCA divide the height by 8, save the row-group count at $9CC1
9C95 RRCA
9C96 RRCA
9C97 LD ($9CC1),A save the row-group count at $9CC1
9C9A INC BC A = the bounding-box max column
9C9B LD A,(BC)
9C9C OR $07 round it up, subtract the min column
9C9E SUB H
9C9F ADD A,$01 round the difference up
9CA1 RRA divide by 4 -> the copy width in LDI pairs
9CA2 RRA
9CA3 LD E,A widen it to a word
9CA4 LD D,$00
9CA6 LD HL,$9D08 HL = the unrolled loop's own tail address $9D08
9CA9 AND A subtract the width: a self-modified jump into the unrolled copy
9CAA SBC HL,DE
9CAC LD ($9D14),HL save it at $9D14
9CAF RRA halve the width again
9CB0 LD E,A
9CB1 LD HL,$0100 HL = $0100
9CB4 AND A minus it: the per-row source stride
9CB5 SBC HL,DE
9CB7 LD ($9D0A),HL save it at $9D0A
Copy shadow screen to ZX screen
9CBA LD DE,$4000 !!MUT-ARG!! DE = real screen base $4000
9CBD LD HL,$E390 !!MUT-ARG!! Shadow screen address
9CC0 LD A,$18 !!MUT-ARG!! A = the row-group count
9CC2 PUSH AF *outer loop: save it
9CC3 LD A,$09 jump into the unrolled copy at its self-modified entry point
9CC5 JP $9D0F
9CC8 LDI unrolled 32-LDI row copy (self-modified entry point handles partial widths)
9CCA LDI
9CCC LDI
9CCE LDI
9CD0 LDI
9CD2 LDI
9CD4 LDI
9CD6 LDI
9CD8 LDI
9CDA LDI
9CDC LDI
9CDE LDI
9CE0 LDI
9CE2 LDI
9CE4 LDI
9CE6 LDI
9CE8 LDI
9CEA LDI
9CEC LDI
9CEE LDI
9CF0 LDI
9CF2 LDI
9CF4 LDI
9CF6 LDI
9CF8 LDI
9CFA LDI
9CFC LDI
9CFE LDI
9D00 LDI
9D02 LDI
9D04 LDI
9D06 LDI
9D08 ADD HL,BC advance the destination by the row stride
9D09 LD BC,$00E0 !!MUT-ARG!! self-modified stride (compensates the copy width)
9D0C EX DE,HL fold the stride into the destination pointer
9D0D ADD HL,BC
9D0E EX DE,HL
9D0F LD BC,$0020 BC = 32 (reset the LDI count), decrement the row-group count
9D12 DEC A
9D13 JP NZ,$9CC8 !!MUT-ARG!! loop the row group
9D16 EX DE,HL
9D17 LD BC,$F820 advance the shadow-screen source to the next row-group
9D1A ADD HL,BC
9D1B LD A,H round the high byte up to the next screen-third boundary
9D1C ADD A,$07
9D1E AND $F8 mask to the boundary and store it back
9D20 LD H,A
9D21 EX DE,HL
9D22 POP AF loop the outer row-group count
9D23 DEC A
9D24 JP NZ,$9CC2
9D27 LD A,($6193) one-shot: test the already-done flag $6193
9D2A AND A
9D2B RET NZ already set: return
9D2C LD A,$FF flag it
9D2E LD ($6193),A
9D31 LD A,$04 A = sound effect $04
9D33 CALL $848E Request sound effect A
9D36 LD A,($6175) A = room colour
9D39 JP $69AC => Draw the room's background
9D3C: Data block at 9D3C
9D3C DEFB $98,$F2,$04,$10,$BE,$00,$00,$00
9D44 DEFB $5C,$00,$00,$00,$B8,$00,$00,$00
9D4C DEFB $E0,$00,$00,$00,$00,$00,$00,$00
9D54 DEFB $00,$00,$00,$00,$00,$00,$00,$00
9D5C DEFB $00,$00,$00,$00,$00,$00,$00,$00
9D64 DEFB $00,$00,$00,$00,$00,$00,$00,$00
9D6C DEFB $00,$00,$00,$00,$00,$00,$00,$00
9D74 DEFB $00,$00,$00,$00,$00,$00,$00,$00
9D7C DEFB $00,$00,$00,$00,$1F,$EE,$02,$08
9D84 DEFB $00,$00,$00,$00,$00,$00,$00,$00
9D8C DEFB $00,$00,$00,$00,$00,$00,$00,$00
9D94 DEFB $98,$EF,$04,$18,$19,$5F,$F6,$B8
9D9C DEFB $06,$B7,$BF,$F0,$03,$7D,$7F,$00
9DA4 DEFB $00,$2F,$80,$00,$00,$00,$00,$00
9DAC DEFB $00,$00,$00,$00,$00,$00,$00,$00
9DB4 DEFB $00,$00,$00,$00,$00,$00,$00,$00
9DBC DEFB $00,$00,$00,$00,$00,$00,$00,$00
9DC4 DEFB $00,$00,$00,$00,$00,$00,$00,$00
9DCC DEFB $00,$00,$00,$00,$80,$00,$00,$00
9DD4 DEFB $E0,$00,$00,$00,$B0,$00,$00,$00
9DDC DEFB $A8,$00,$00,$00,$54,$00,$00,$00
9DE4 DEFB $AC,$00,$00,$00,$54,$00,$00,$00
9DEC DEFB $AE,$00,$00,$00,$96,$00,$00,$00
9DF4 DEFB $6E,$00,$00,$00,$DB,$EC,$01,$18
9DFC DEFB $00,$00,$00,$00,$00,$00,$00,$00
9E04 DEFB $00,$00,$00,$00,$00,$C0,$E0,$50
9E0C DEFB $AC,$56,$AA,$56,$AC,$54,$B8,$F0
9E14 DEFB $1E,$F6,$04,$10,$00,$00,$00,$00
9E1C DEFB $00,$00,$00,$00,$00,$00,$00,$00
9E24 DEFB $00,$00,$00,$00,$00,$00,$00,$00
9E2C DEFB $00,$00,$00,$00,$00,$00,$00,$00
9E34 DEFB $00,$00,$00,$00,$00,$00,$00,$00
9E3C DEFB $00,$00,$00,$00,$00,$00,$00,$00
9E44 DEFB $00,$00,$00,$00,$00,$00,$00,$00
9E4C DEFB $00,$00,$00,$00,$00,$00,$00,$00
9E54 DEFB $00,$00,$00,$00,$00,$00,$00,$00
9E5C DEFB $00,$00,$00,$00,$00,$00,$00,$00
9E64 DEFB $00,$00,$00,$00,$00,$00,$00,$00
9E6C DEFB $00,$00,$00,$00,$00,$00,$00,$00
9E74 DEFB $00,$00,$00,$00,$00,$00,$00,$00
9E7C DEFB $00,$00,$00,$00,$00,$00,$00,$00
9E84 DEFB $00,$00,$00,$00,$00,$00,$00,$00
9E8C DEFB $00,$00,$00,$00,$00,$00,$00,$00
9E94 DEFB $00,$00,$00,$00,$00,$00,$00,$00
9E9C DEFB $00,$00,$00,$00,$00,$00,$00,$00
9EA4 DEFB $00,$00,$00,$00,$00,$00,$00,$00
9EAC DEFB $00,$00,$00,$00,$00,$00,$00,$00
9EB4 DEFB $00,$00,$00,$00,$00,$00,$00,$00
9EBC DEFB $00,$00,$00,$00,$00,$00,$00,$00
9EC4 DEFB $00,$00,$00,$00,$00,$00,$00,$00
9ECC DEFB $00,$00,$00,$00,$00,$00,$00,$00
9ED4 DEFB $00,$00,$00,$00,$00,$00,$00,$00
9EDC DEFB $00,$00,$00,$00,$00,$00,$00,$00
9EE4 DEFB $00,$00,$00,$00,$00,$00,$00,$00
9EEC DEFB $00,$00,$00,$00,$00,$00,$00,$00
9EF4 DEFB $00,$00,$00,$00,$00,$00,$00,$00
9EFC DEFB $00,$00,$00,$00,$00,$00,$00,$00
9F04 DEFB $00,$00,$00,$00,$00,$00,$00,$00
9F0C DEFB $00,$00,$00,$00,$00,$00,$00,$00
9F14 DEFB $00,$00,$00,$00,$00,$00,$00,$00
9F1C DEFB $00,$00,$00,$00,$00,$00,$00,$00
9F24 DEFB $00,$00,$00,$00,$00,$00,$00,$00
9F2C DEFB $00,$00,$00,$00,$00,$00,$00,$00
9F34 DEFB $00,$00,$00,$00,$00,$00,$00,$00
9F3C DEFB $00,$00,$00,$00,$00,$00,$00,$00
9F44 DEFB $00,$00,$00,$00,$00,$00,$00,$00
9F4C DEFB $00,$00,$00,$00,$00,$00,$00,$00
9F54 DEFB $00,$00,$00,$00,$00,$00,$00,$00
9F5C DEFB $00,$00,$00,$00,$00,$00,$00,$00
9F64 DEFB $00,$00,$00,$00,$00,$00,$00,$00
9F6C DEFB $00,$00,$00,$00,$00,$00,$00,$00
9F74 DEFB $00,$00,$00,$00,$00,$00,$00,$00
9F7C DEFB $00,$00,$00,$00,$00,$00,$00,$00
9F84 DEFB $00,$00,$00,$00,$00,$00,$00,$00
9F8C DEFB $00,$00,$00,$00,$00,$00,$00,$00
9F94 DEFB $00,$00,$00,$00,$00,$00,$00,$00
9F9C DEFB $00,$00,$00,$00,$00,$00,$00,$00
9FA4 DEFB $00,$00,$00,$00,$00,$00,$00,$00
9FAC DEFB $00,$00,$00,$00,$00,$00,$00,$00
9FB4 DEFB $00,$00,$00,$00,$00,$00,$00,$00
9FBC DEFB $00,$00,$00,$00,$00,$00,$00,$00
9FC4 DEFB $00,$00,$00,$00,$00,$00,$00,$00
9FCC DEFB $00,$00,$00,$00,$00,$00,$00,$00
9FD4 DEFB $00,$00,$00,$00,$00,$00,$00,$00
9FDC DEFB $00,$00,$00,$00,$00,$00,$00,$00
9FE4 DEFB $00,$00,$00,$00,$00,$00,$00,$00
9FEC DEFB $00,$00,$00,$00,$00,$00,$00,$00
9FF4 DEFB $00,$00,$00,$00,$00,$00,$00,$00
9FFC DEFB $00,$00,$00,$00,$00,$00,$00,$00
A004 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A00C DEFB $00,$00,$00,$00,$00,$00,$00,$00
A014 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A01C DEFB $00,$00,$00,$00,$00,$00,$00,$00
A024 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A02C DEFB $00,$00,$00,$00,$00,$00,$00,$00
A034 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A03C DEFB $00,$00,$00,$00,$00,$00,$00,$00
A044 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A04C DEFB $00,$00,$00,$00,$00,$00,$00,$00
A054 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A05C DEFB $00,$00,$00,$00,$00,$00,$00,$00
A064 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A06C DEFB $00,$00,$00,$00,$00,$00,$00,$00
A074 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A07C DEFB $00,$00,$00,$00,$00,$00,$00,$00
A084 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A08C DEFB $00,$00,$00,$00,$00,$00,$00,$00
A094 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A09C DEFB $00,$00,$00,$00,$00,$00,$00,$00
A0A4 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A0AC DEFB $00,$00,$00,$00,$00,$00,$00,$00
A0B4 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A0BC DEFB $00,$00,$00,$00,$00,$00,$00,$00
A0C4 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A0CC DEFB $00,$00,$00,$00,$00,$00,$00,$00
A0D4 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A0DC DEFB $00,$00,$00,$00,$00,$00,$00,$00
A0E4 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A0EC DEFB $00,$00,$00,$00,$00,$00,$00,$00
A0F4 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A0FC DEFB $00,$00,$00,$00,$00,$00,$00,$00
A104 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A10C DEFB $00,$00,$00,$00,$00,$00,$00,$00
A114 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A11C DEFB $00,$00,$00,$00,$00,$00,$00,$00
A124 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A12C DEFB $00,$00,$00,$00,$00,$00,$00,$00
A134 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A13C DEFB $00,$00,$00,$00,$00,$00,$00,$00
A144 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A14C DEFB $00,$00,$00,$00,$00,$00,$00,$00
A154 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A15C DEFB $00,$00,$00,$00,$00,$00,$00,$00
A164 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A16C DEFB $00,$00,$00,$00,$00,$00,$00,$00
A174 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A17C DEFB $00,$00,$00,$00,$00,$00,$00,$00
A184 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A18C DEFB $00,$00,$00,$00,$00,$00,$00,$00
A194 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A19C DEFB $00,$00,$00,$00,$00,$00,$00,$00
A1A4 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A1AC DEFB $00,$00,$00,$00,$00,$00,$00,$00
A1B4 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A1BC DEFB $00,$00,$00,$00,$00,$00,$00,$00
A1C4 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A1CC DEFB $00,$00,$00,$00,$00,$00,$00,$00
A1D4 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A1DC DEFB $00,$00,$00,$00,$00,$00,$00,$00
A1E4 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A1EC DEFB $00,$00,$00,$00,$00,$00,$00,$00
A1F4 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A1FC DEFB $00,$00,$00,$00,$00,$00,$00,$00
A204 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A20C DEFB $00,$00,$00,$00,$00,$00,$00,$00
A214 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A21C DEFB $00,$00,$00,$00,$00,$00,$00,$00
A224 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A22C DEFB $00,$00,$00,$00,$00,$00,$00,$00
A234 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A23C DEFB $00,$00,$00,$00,$00,$00,$00,$00
A244 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A24C DEFB $00,$00,$00,$00,$00,$00,$00,$00
A254 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A25C DEFB $00,$00,$00,$00,$00,$00,$00,$00
A264 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A26C DEFB $00,$00,$00,$00,$00,$00,$00,$00
A274 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A27C DEFB $00,$00,$00,$00,$00,$00,$00,$00
A284 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A28C DEFB $00,$00,$00,$00,$00,$00,$00,$00
A294 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A29C DEFB $00,$00,$00,$00,$00,$00,$00,$00
A2A4 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A2AC DEFB $00,$00,$00,$00,$00,$00,$00,$00
A2B4 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A2BC DEFB $00,$00,$00,$00,$00,$00,$00,$00
A2C4 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A2CC DEFB $00,$00,$00,$00,$00,$00,$00,$00
A2D4 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A2DC DEFB $00,$00,$00,$00,$00,$00,$00,$00
A2E4 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A2EC DEFB $00,$00,$00,$00,$00,$00,$00,$00
A2F4 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A2FC DEFB $00,$00,$00,$00,$00,$00,$00,$00
A304 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A30C DEFB $00,$00,$00,$00,$00,$00,$00,$00
A314 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A31C DEFB $00,$00,$00,$00,$00,$00,$00,$00
A324 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A32C DEFB $00,$00,$00,$00,$00,$00,$00,$00
A334 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A33C DEFB $00,$00,$00,$00,$00,$00,$00,$00
A344 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A34C DEFB $00,$00,$00,$00,$00,$00,$00,$00
A354 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A35C DEFB $00,$00,$00,$00,$00,$00,$00,$00
A364 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A36C DEFB $00,$00,$00,$00,$00,$00,$00,$00
A374 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A37C DEFB $00,$00,$00,$00,$00,$00,$00,$00
A384 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A38C DEFB $00,$00,$00,$00,$00,$00,$00,$00
A394 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A39C DEFB $00,$00,$00,$00,$00,$00,$00,$00
A3A4 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A3AC DEFB $00,$00,$00,$00,$00,$00,$00,$00
A3B4 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A3BC DEFB $00,$00,$00,$00,$00,$00,$00,$00
A3C4 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A3CC DEFB $00,$00,$00,$00,$00,$00,$00,$00
A3D4 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A3DC DEFB $00,$00,$00,$00,$00,$00,$00,$00
A3E4 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A3EC DEFB $00,$00,$00,$00,$00,$00,$00,$00
A3F4 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A3FC DEFB $00,$00,$00,$00
A400: Font 59 characters, 8 bytes each, 472 bytes
A400 DEFB $00,$00,$00,$00,$00,$00,$00,$00
A408 DEFB $00,$18,$18,$18,$18,$18,$00,$18
A410 DEFB $00,$36,$36,$36,$00,$00,$00,$00
A418 DEFB $00,$6C,$FE,$FE,$6C,$FE,$FE,$6C
A420 DEFB $00,$18,$FE,$98,$FE,$1A,$FE,$18
A428 DEFB $00,$C6,$C6,$0C,$18,$30,$66,$C6
A430 DEFB $00,$18,$24,$18,$30,$4A,$46,$3E
A438 DEFB $00,$08,$08,$10,$00,$00,$00,$00
A440 DEFB $00,$04,$08,$08,$08,$08,$08,$04
A448 DEFB $00,$20,$10,$10,$10,$10,$10,$20
A450 DEFB $00,$00,$54,$38,$FE,$38,$54,$00
A458 DEFB $00,$00,$08,$08,$3E,$08,$08,$00
A460 DEFB $00,$00,$00,$00,$00,$08,$08,$10
A468 DEFB $00,$00,$00,$00,$3C,$00,$00,$00
A470 DEFB $00,$00,$00,$00,$00,$18,$18,$00
A478 DEFB $00,$02,$04,$08,$10,$20,$40,$80
A480 DEFB $00,$FE,$FE,$CE,$D6,$E6,$FE,$FE
A488 DEFB $00,$30,$70,$F0,$30,$30,$FC,$FC
A490 DEFB $00,$FE,$FE,$02,$FE,$C0,$FE,$FE
A498 DEFB $00,$FE,$FE,$06,$3E,$06,$FE,$FE
A4A0 DEFB $00,$C0,$CC,$CC,$FC,$FC,$0C,$0C
A4A8 DEFB $00,$FE,$FE,$C0,$FE,$06,$FE,$FE
A4B0 DEFB $00,$FE,$FE,$80,$FE,$C6,$FE,$FE
A4B8 DEFB $00,$FE,$FE,$06,$06,$06,$06,$06
A4C0 DEFB $00,$FE,$FE,$C6,$FE,$C6,$FE,$FE
A4C8 DEFB $00,$FE,$FE,$C6,$FE,$06,$FE,$FE
A4D0 DEFB $00,$00,$18,$18,$00,$18,$18,$00
A4D8 DEFB $00,$00,$18,$18,$00,$18,$08,$10
A4E0 DEFB $00,$10,$20,$40,$80,$40,$20,$10
A4E8 DEFB $00,$00,$3C,$00,$3C,$00,$00,$00
A4F0 DEFB $00,$08,$04,$02,$01,$02,$04,$08
A4F8 DEFB $00,$18,$24,$04,$08,$10,$00,$10
A500 DEFB $00,$3C,$82,$9A,$94,$98,$82,$7C
A508 DEFB $00,$FE,$FE,$C6,$FE,$FE,$C6,$C6
A510 DEFB $00,$FE,$FE,$C6,$FC,$C6,$FE,$FE
A518 DEFB $00,$FE,$FE,$C6,$C0,$C6,$FE,$FE
A520 DEFB $00,$F8,$FC,$C6,$C6,$C6,$FC,$F8
A528 DEFB $00,$FE,$FE,$C2,$F8,$C2,$FE,$FE
A530 DEFB $00,$FE,$FE,$C2,$F8,$C0,$C0,$C0
A538 DEFB $00,$FE,$FE,$C0,$CE,$C6,$FE,$FE
A540 DEFB $00,$C6,$C6,$FE,$FE,$C6,$C6,$C6
A548 DEFB $00,$7E,$7E,$18,$18,$18,$7E,$7E
A550 DEFB $00,$FE,$FE,$06,$C6,$C6,$FE,$FE
A558 DEFB $00,$CE,$D8,$F0,$F0,$D8,$CC,$C6
A560 DEFB $00,$C0,$C0,$C0,$C0,$C6,$FE,$FE
A568 DEFB $00,$C6,$EE,$FE,$D6,$C6,$C6,$C6
A570 DEFB $00,$C6,$E6,$F6,$DE,$CE,$C6,$C6
A578 DEFB $00,$FE,$FE,$C6,$C6,$C6,$FE,$FE
A580 DEFB $00,$FE,$FE,$C6,$FE,$FE,$C0,$C0
A588 DEFB $00,$FE,$FE,$C6,$C6,$CE,$FE,$02
A590 DEFB $00,$FE,$FE,$C2,$FE,$FC,$CC,$C6
A598 DEFB $00,$FE,$FE,$C0,$FE,$02,$FE,$FE
A5A0 DEFB $00,$FE,$FE,$18,$18,$18,$18,$18
A5A8 DEFB $00,$C6,$C6,$C6,$C6,$C6,$FE,$FE
A5B0 DEFB $00,$C6,$C6,$C6,$C6,$6C,$38,$10
A5B8 DEFB $00,$C6,$C6,$C6,$D6,$FE,$EE,$C6
A5C0 DEFB $00,$86,$CC,$78,$38,$6C,$C6,$82
A5C8 DEFB $00,$C6,$C6,$FE,$FE,$18,$18,$18
A5D0 DEFB $00,$FE,$FE,$0C,$18,$30,$FE,$FE
A5D8: Current mask sprite data address (set by 8128 before drawing)
A5D8 DEFW $BDAE
A5DA DEFW $0000
A5DC: Table of Sprites, 201 records, 4 bytes each
Record format (read by 84ED/7E4F with the sprite number in L): record[0..1] = sprite data address (LE word); record[2] = height in 8px rows, top bit masked off before use ($7F) -- meaning of that bit not yet confirmed, may just be unused/reserved; record[3] = width in 8px columns, but bit 7 here is a live flip-flop flag: 7E4F XORs it in place (self-modifying table entry) on every call, toggling it between the two calls needed to draw a sprite's normal and mirrored/second-buffer image, then masks it off ($7F) to get the actual width.
A5DC DEFW $A9DE Sprite $00
A5DE DEFB $00,$00
A5E0 DEFW $A9DE Sprite $01
A5E2 DEFB $84,$03
A5E4 DEFW $AA3E Sprite $02
A5E6 DEFB $83,$04
A5E8 DEFW $AA9E Sprite $03
A5EA DEFB $83,$04
A5EC DEFW $AAFE Sprite $04
A5EE DEFB $83,$04
A5F0 DEFW $AB5E Sprite $05
A5F2 DEFB $83,$04
A5F4 DEFW $ABBE Sprite $06
A5F6 DEFB $00,$00
A5F8 DEFW $ABBE Sprite $07
A5FA DEFB $83,$04
A5FC DEFW $AC1E Sprite $08
A5FE DEFB $83,$04
A600 DEFW $AC7E Sprite $09
A602 DEFB $00,$00
A604 DEFW $AC7E Sprite $0A
A606 DEFB $83,$04
A608 DEFW $ACDE Sprite $0B
A60A DEFB $82,$04
A60C DEFW $AD1E Sprite $0C
A60E DEFB $82,$04
A610 DEFW $AD5E Sprite $0D
A612 DEFB $82,$04
A614 DEFW $AD9E Sprite $0E
A616 DEFB $82,$04
A618 DEFW $ADDE Sprite $0F
A61A DEFB $83,$03
A61C DEFW $AE26 Sprite $10
A61E DEFB $83,$03
A620 DEFW $AE6E Sprite $11
A622 DEFB $84,$03
A624 DEFW $AECE Sprite $12
A626 DEFB $84,$03
A628 DEFW $AF2E Sprite $13
A62A DEFB $84,$03
A62C DEFW $AF8E Sprite $14
A62E DEFB $83,$03
A630 DEFW $AFD6 Sprite $15
A632 DEFB $84,$03
A634 DEFW $B036 Sprite $16
A636 DEFB $83,$04
A638 DEFW $B096 Sprite $17
A63A DEFB $83,$04
A63C DEFW $B0F6 Sprite $18
A63E DEFB $83,$04
A640 DEFW $B156 Sprite $19
A642 DEFB $83,$04
A644 DEFW $B1B6 Sprite $1A
A646 DEFB $84,$04
A648 DEFW $B236 Sprite $1B
A64A DEFB $83,$04
A64C DEFW $B296 Sprite $1C
A64E DEFB $83,$02
A650 DEFW $B2C6 Sprite $1D
A652 DEFB $83,$03
A654 DEFW $B30E Sprite $1E
A656 DEFB $83,$04
A658 DEFW $B36E Sprite $1F
A65A DEFB $84,$04
A65C DEFW $B3EE Sprite $20
A65E DEFB $84,$04
A660 DEFW $B46E Sprite $21
A662 DEFB $84,$04
A664 DEFW $B4EE Sprite $22
A666 DEFB $84,$04
A668 DEFW $B56E Sprite $23
A66A DEFB $81,$02
A66C DEFW $B57E Sprite $24
A66E DEFB $82,$02
A670 DEFW $B59E Sprite $25
A672 DEFB $83,$02
A674 DEFW $B5CE Sprite $26
A676 DEFB $84,$02
A678 DEFW $B60E Sprite $27
A67A DEFB $84,$02
A67C DEFW $B64E Sprite $28
A67E DEFB $84,$02
A680 DEFW $B68E Sprite $29
A682 DEFB $84,$04
A684 DEFW $B70E Sprite $2A
A686 DEFB $84,$04
A688 DEFW $B78E Sprite $2B
A68A DEFB $84,$04
A68C DEFW $B80E Sprite $2C
A68E DEFB $84,$04
A690 DEFW $B88E Sprite $2D
A692 DEFB $00,$00
A694 DEFW $B5FE Sprite $2E
A696 DEFB $00,$00
A698 DEFW $B5FE Sprite $2F
A69A DEFB $00,$00
A69C DEFW $B5FE Sprite $30
A69E DEFB $00,$00
A6A0 DEFW $B5FE Sprite $31
A6A2 DEFB $00,$00
A6A4 DEFW $B5FE Sprite $32
A6A6 DEFB $00,$00
A6A8 DEFW $B5CE Sprite $33
A6AA DEFB $00,$00
A6AC DEFW $B5CE Sprite $34
A6AE DEFB $00,$00
A6B0 DEFW $B5CE Sprite $35
A6B2 DEFB $00,$00
A6B4 DEFW $B88E Sprite $36
A6B6 DEFB $83,$02
A6B8 DEFW $B8BE Sprite $37
A6BA DEFB $83,$02
A6BC DEFW $B8EE Sprite $38
A6BE DEFB $83,$02
A6C0 DEFW $B91E Sprite $39
A6C2 DEFB $83,$02
A6C4 DEFW $B94E Sprite $3A
A6C6 DEFB $83,$02
A6C8 DEFW $B97E Sprite $3B
A6CA DEFB $83,$02
A6CC DEFW $B9AE Sprite $3C
A6CE DEFB $83,$02
A6D0 DEFW $B9DE Sprite $3D
A6D2 DEFB $83,$02
A6D4 DEFW $BA0E Sprite $3E
A6D6 DEFB $83,$02
A6D8 DEFW $BA3E Sprite $3F
A6DA DEFB $83,$02
A6DC DEFW $BA6E Sprite $40
A6DE DEFB $83,$02
A6E0 DEFW $BA9E Sprite $41
A6E2 DEFB $83,$02
A6E4 DEFW $BACE Sprite $42
A6E6 DEFB $83,$02
A6E8 DEFW $BAFE Sprite $43
A6EA DEFB $83,$02
A6EC DEFW $BB2E Sprite $44
A6EE DEFB $84,$04
A6F0 DEFW $BBAE Sprite $45
A6F2 DEFB $84,$04
A6F4 DEFW $BC2E Sprite $46
A6F6 DEFB $84,$02
A6F8 DEFW $BC6E Sprite $47
A6FA DEFB $84,$02
A6FC DEFW $BCAE Sprite $48
A6FE DEFB $83,$04
A700 DEFW $BD0E Sprite $49
A702 DEFB $83,$04
A704 DEFW $BD6E Sprite $4A
A706 DEFB $82,$02
A708 DEFW $BD8E Sprite $4B
A70A DEFB $82,$02
A70C DEFW $BDAE Sprite $4C
A70E DEFB $82,$04
A710 DEFW $BDEE Sprite $4D
A712 DEFB $82,$04
A714 DEFW $BE2E Sprite $4E
A716 DEFB $84,$03
A718 DEFW $BE8E Sprite $4F
A71A DEFB $84,$03
A71C DEFW $BEEE Sprite $50
A71E DEFB $84,$03
A720 DEFW $BF4E Sprite $51
A722 DEFB $84,$03
A724 DEFW $BFAE Sprite $52
A726 DEFB $82,$04
A728 DEFW $BFEE Sprite $53
A72A DEFB $82,$04
A72C DEFW $C02E Sprite $54
A72E DEFB $84,$04
A730 DEFW $C0AE Sprite $55
A732 DEFB $84,$04
A734 DEFW $C12E Sprite $56
A736 DEFB $85,$02
A738 DEFW $C17E Sprite $57
A73A DEFB $85,$02
A73C DEFW $C1CE Sprite $58
A73E DEFB $82,$02
A740 DEFW $C1EE Sprite $59
A742 DEFB $82,$02
A744 DEFW $C20E Sprite $5A
A746 DEFB $83,$01
A748 DEFW $C226 Sprite $5B
A74A DEFB $83,$01
A74C DEFW $C23E Sprite $5C
A74E DEFB $83,$01
A750 DEFW $C256 Sprite $5D
A752 DEFB $83,$01
A754 DEFW $C26E Sprite $5E
A756 DEFB $82,$02
A758 DEFW $C28E Sprite $5F
A75A DEFB $82,$02
A75C DEFW $C2AE Sprite $60
A75E DEFB $82,$02
A760 DEFW $B796 Sprite $61
A762 DEFB $00,$00
A764 DEFW $C2CE Sprite $62
A766 DEFB $82,$02
A768 DEFW $C2EE Sprite $63
A76A DEFB $82,$02
A76C DEFW $C30E Sprite $64
A76E DEFB $82,$02
A770 DEFW $C32E Sprite $65
A772 DEFB $82,$02
A774 DEFW $C34E Sprite $66
A776 DEFB $82,$02
A778 DEFW $C36E Sprite $67
A77A DEFB $82,$02
A77C DEFW $C38E Sprite $68
A77E DEFB $81,$02
A780 DEFW $C39E Sprite $69
A782 DEFB $81,$02
A784 DEFW $C3AE Sprite $6A
A786 DEFB $84,$04
A788 DEFW $C42E Sprite $6B
A78A DEFB $84,$04
A78C DEFW $C4AE Sprite $6C
A78E DEFB $84,$04
A790 DEFW $C52E Sprite $6D
A792 DEFB $83,$02
A794 DEFW $C55E Sprite $6E
A796 DEFB $83,$02
A798 DEFW $C58E Sprite $6F
A79A DEFB $83,$02
A79C DEFW $C5BE Sprite $70
A79E DEFB $83,$02
A7A0 DEFW $C5EE Sprite $71
A7A2 DEFB $83,$02
A7A4 DEFW $C61E Sprite $72
A7A6 DEFB $83,$02
A7A8 DEFW $C64E Sprite $73
A7AA DEFB $83,$02
A7AC DEFW $C67E Sprite $74
A7AE DEFB $83,$02
A7B0 DEFW $C6AE Sprite $75
A7B2 DEFB $83,$02
A7B4 DEFW $C6DE Sprite $76
A7B6 DEFB $83,$02
A7B8 DEFW $C70E Sprite $77
A7BA DEFB $83,$02
A7BC DEFW $C73E Sprite $78
A7BE DEFB $83,$02
A7C0 DEFW $C76E Sprite $79
A7C2 DEFB $83,$02
A7C4 DEFW $C79E Sprite $7A
A7C6 DEFB $83,$02
A7C8 DEFW $C7CE Sprite $7B
A7CA DEFB $83,$02
A7CC DEFW $C7FE Sprite $7C
A7CE DEFB $83,$05
A7D0 DEFW $C876 Sprite $7D
A7D2 DEFB $8C,$05
A7D4 DEFW $CA56 Sprite $7E
A7D6 DEFB $8C,$06
A7D8 DEFW $CC96 Sprite $7F
A7DA DEFB $8A,$05
A7DC DEFW $CE26 Sprite $80
A7DE DEFB $94,$01
A7E0 DEFW $BE9E Sprite $81
A7E2 DEFB $00,$00
A7E4 DEFW $BE9E Sprite $82
A7E6 DEFB $00,$00
A7E8 DEFW $CEC6 Sprite $83
A7EA DEFB $84,$03
A7EC DEFW $CF26 Sprite $84
A7EE DEFB $83,$04
A7F0 DEFW $CF86 Sprite $85
A7F2 DEFB $83,$04
A7F4 DEFW $CFE6 Sprite $86
A7F6 DEFB $83,$04
A7F8 DEFW $D046 Sprite $87
A7FA DEFB $83,$04
A7FC DEFW $CBB6 Sprite $88
A7FE DEFB $00,$00
A800 DEFW $D0A6 Sprite $89
A802 DEFB $83,$04
A804 DEFW $D106 Sprite $8A
A806 DEFB $83,$04
A808 DEFW $C4F6 Sprite $8B
A80A DEFB $00,$00
A80C DEFW $D166 Sprite $8C
A80E DEFB $83,$04
A810 DEFW $D1C6 Sprite $8D
A812 DEFB $00,$00
A814 DEFW $CC76 Sprite $8E
A816 DEFB $00,$00
A818 DEFW $CC76 Sprite $8F
A81A DEFB $00,$00
A81C DEFW $CC76 Sprite $90
A81E DEFB $00,$00
A820 DEFW $D1C6 Sprite $91
A822 DEFB $83,$03
A824 DEFW $D20E Sprite $92
A826 DEFB $83,$03
A828 DEFW $D256 Sprite $93
A82A DEFB $84,$03
A82C DEFW $D2B6 Sprite $94
A82E DEFB $84,$03
A830 DEFW $D316 Sprite $95
A832 DEFB $84,$03
A834 DEFW $D376 Sprite $96
A836 DEFB $83,$03
A838 DEFW $D3BE Sprite $97
A83A DEFB $84,$03
A83C DEFW $D41E Sprite $98
A83E DEFB $83,$04
A840 DEFW $D47E Sprite $99
A842 DEFB $83,$04
A844 DEFW $D4DE Sprite $9A
A846 DEFB $83,$04
A848 DEFW $D53E Sprite $9B
A84A DEFB $83,$04
A84C DEFW $D59E Sprite $9C
A84E DEFB $84,$04
A850 DEFW $D61E Sprite $9D
A852 DEFB $83,$04
A854 DEFW $D67E Sprite $9E
A856 DEFB $83,$02
A858 DEFW $D6AE Sprite $9F
A85A DEFB $83,$03
A85C DEFW $D6F6 Sprite $A0
A85E DEFB $83,$04
A860 DEFW $D756 Sprite $A1
A862 DEFB $84,$04
A864 DEFW $D7D6 Sprite $A2
A866 DEFB $84,$04
A868 DEFW $D856 Sprite $A3
A86A DEFB $84,$04
A86C DEFW $D8D6 Sprite $A4
A86E DEFB $84,$04
A870 DEFW $D956 Sprite $A5
A872 DEFB $81,$02
A874 DEFW $D966 Sprite $A6
A876 DEFB $82,$02
A878 DEFW $D986 Sprite $A7
A87A DEFB $83,$02
A87C DEFW $D9B6 Sprite $A8
A87E DEFB $84,$02
A880 DEFW $D9F6 Sprite $A9
A882 DEFB $84,$02
A884 DEFW $DA36 Sprite $AA
A886 DEFB $84,$02
A888 DEFW $DA76 Sprite $AB
A88A DEFB $84,$04
A88C DEFW $DAF6 Sprite $AC
A88E DEFB $84,$04
A890 DEFW $DB76 Sprite $AD
A892 DEFB $84,$04
A894 DEFW $DBF6 Sprite $AE
A896 DEFB $84,$04
A898 DEFW $DCB6 Sprite $AF
A89A DEFB $00,$00
A89C DEFW $CD76 Sprite $B0
A89E DEFB $00,$00
A8A0 DEFW $DC76 Sprite $B1
A8A2 DEFB $83,$01
A8A4 DEFW $DC8E Sprite $B2
A8A6 DEFB $83,$01
A8A8 DEFW $DCA6 Sprite $B3
A8AA DEFB $83,$01
A8AC DEFW $DCBE Sprite $B4
A8AE DEFB $83,$01
A8B0 DEFW $DCD6 Sprite $B5
A8B2 DEFB $81,$01
A8B4 DEFW $DCDE Sprite $B6
A8B6 DEFB $81,$01
A8B8 DEFW $DCE6 Sprite $B7
A8BA DEFB $81,$01
A8BC DEFW $DCEE Sprite $B8
A8BE DEFB $81,$01
A8C0 DEFW $DCF6 Sprite $B9
A8C2 DEFB $81,$01
A8C4 DEFW $DCFE Sprite $BA
A8C6 DEFB $84,$04
A8C8 DEFW $DD7E Sprite $BB
A8CA DEFB $84,$04
A8CC DEFW $DDFE Sprite $BC
A8CE DEFB $82,$02
A8D0 DEFW $DE1E Sprite $BD
A8D2 DEFB $82,$02
A8D4 DEFW $DE3E Sprite $BE
A8D6 DEFB $82,$02
A8D8 DEFW $DE5E Sprite $BF
A8DA DEFB $82,$02
A8DC DEFW $DE7E Sprite $C0
A8DE DEFB $82,$02
A8E0 DEFW $DE9E Sprite $C1
A8E2 DEFB $82,$02
A8E4 DEFW $DEBE Sprite $C2
A8E6 DEFB $83,$02
A8E8 DEFW $DEEE Sprite $C3
A8EA DEFB $82,$02
A8EC DEFW $DF0E Sprite $C4
A8EE DEFB $82,$02
A8F0 DEFW $DF2E Sprite $C5
A8F2 DEFB $82,$0B
A8F4 DEFW $DFDE Sprite $C6
A8F6 DEFB $00,$00
A8F8 DEFW $DFDE Sprite $C7
A8FA DEFB $84,$04
A8FC DEFW $E05E Sprite $C8
A8FE DEFB $84,$0B
A900: Dynamic object pool (creatures, bubble sources, snakes, whirlpools, plugs -- anything not baked into the static room grid; see 612C)
Records allocated/freed via a linked list managed by 84AE (free-list head at $618B; the free list can extend outside this pool, e.g. into scratch at $5B00). Record layout (24 bytes, offsets from record start): +0/+1 = link to the next object record in the active object list (head at 610E; the list ends via the fixed records at 8DB6 -- the player record uses this same layout); +2 = room number the object belongs to; +3/+4 = per-object behaviour-handler function pointer, copied by 84AE from the 2 bytes embedded after the spawner's CALL; +5/+6 = Y/X position; +8 = current sprite number; +5..+23 initially a fixed 19-byte default state block copied from $5C92; +7=$18 and +0xA=$06 (constants set by 8EA7-style spawn routines); +9 = triggering grid value (e.g. $66), cleared to 0 by 9A60; +0xB and +0xE = a duplicated "extra" byte from the template; +0xF = animation phase counter (used by 99D5); +0x14 = a second "extra" byte. The exact meaning of the two "extra" bytes (position? direction?) is not yet confirmed.
A900 DEFB $B6,$8D,$02,$7C,$95,$14,$14,$18
A908 DEFB $68,$66,$06,$23,$80,$00,$22,$01
A910 DEFB $11,$11,$16,$16,$58,$03,$00,$08
A918 DEFB $00,$A9,$02,$2D,$95,$34,$34,$18
A920 DEFB $4C,$00,$06,$00,$C0,$00,$00,$01
A928 DEFB $31,$31,$36,$36
A92C: Data block at A92C
A92C DEFW $0300,$0800,$A948,$0000,$A9DE,$0000,$A9DE,$0000
A93C DEFW $A9DE,$0000,$A9DE,$0000,$A9DE,$0000,$A960,$0000
A94C DEFW $A9DE,$0000,$A9DE,$0000,$A9DE,$0000,$A9DE,$0000
A95C DEFW $A9DE,$0000,$A978,$0000,$A9DE,$0000,$A9DE,$0000
A96C DEFW $A9DE,$0000,$A9DE,$0000,$A9DE,$0000,$A990,$0000
A97C DEFW $A9DE,$0000,$A9DE,$0000,$A9DE,$0000,$A9DE,$0000
A98C DEFW $A9DE,$0000,$A9A8,$0000,$A9DE,$0000,$A9DE,$0000
A99C DEFW $A9DE,$0000,$A9DE,$0000,$A9DE,$0000,$5B00,$0000
A9AC DEFW $A9DE,$0000,$A9DE,$0000,$A9DE,$0000,$D5E6,$0000
A9BC DEFW $D5E6,$0000,$D6FE,$0000,$D6FE,$0000,$D906,$0000
A9CC DEFW $DBD6,$0000,$DDDE,$0000,$E046,$0000,$D9FE,$0000
A9DC DEFW $37E0
A9DE: Sprite, 24x32 pixels. Player sitting
A9DE DEFB $00,$00,$00,$00,$3F,$00,$00,$7F sprite-a9de
A9E6 DEFB $80,$00,$E0,$C0,$00,$DF,$60,$01
A9EE DEFB $A0,$A0,$01,$CA,$60,$01,$DB,$60
A9F6 DEFB $01,$CA,$60,$00,$E0,$E0,$03,$7F
A9FE DEFB $C0,$07,$B1,$80,$0F,$D5,$00,$0F
AA06 DEFB $DB,$40,$0D,$C4,$C0,$1F,$EF,$30
AA0E DEFB $1D,$E1,$78,$1E,$DE,$E8,$3E,$FC
AA16 DEFB $D8,$3F,$3E,$68,$3F,$81,$30,$3F
AA1E DEFB $FB,$00,$3E,$FD,$80,$1E,$39,$86
AA26 DEFB $0C,$F3,$1E,$03,$E7,$FE,$07,$83
AA2E DEFB $E6,$07,$E1,$FE,$03,$F8,$FC,$01
AA36 DEFB $DF,$10,$01,$E7,$00,$00,$FE,$00
AA3E: Sprite, 32x24 pixels. Player
AA3E DEFB $00,$00,$00,$00,$00,$00,$00,$00 sprite-aa3e
AA46 DEFB $00,$07,$00,$00,$00,$07,$80,$00
AA4E DEFB $01,$86,$C0,$00,$03,$C7,$60,$00
AA56 DEFB $07,$E4,$F0,$00,$1E,$E3,$EF,$C0
AA5E DEFB $7F,$77,$DF,$E0,$7B,$2F,$B8,$30
AA66 DEFB $76,$0F,$37,$D8,$6E,$1F,$68,$28
AA6E DEFB $3C,$1F,$72,$98,$1C,$07,$76,$D8
AA76 DEFB $08,$1F,$70,$18,$00,$3F,$98,$30
AA7E DEFB $00,$3C,$CF,$E8,$00,$78,$0C,$5C
AA86 DEFB $00,$78,$05,$4E,$00,$60,$06,$DA
AA8E DEFB $00,$78,$00,$00,$00,$3E,$00,$00
AA96 DEFB $00,$3A,$00,$00,$00,$00,$00,$00
AA9E: Sprite, 32x24 pixels. Player
AA9E DEFB $00,$00,$00,$00,$00,$01,$80,$00 sprite-aa9e
AAA6 DEFB $00,$03,$80,$00,$00,$02,$C0,$00
AAAE DEFB $00,$07,$40,$00,$00,$07,$60,$00
AAB6 DEFB $00,$C4,$F0,$00,$01,$F3,$EF,$C0
AABE DEFB $07,$77,$DF,$E0,$0F,$AF,$B8,$30
AAC6 DEFB $3F,$8F,$37,$D8,$7F,$1F,$68,$28
AACE DEFB $7B,$17,$72,$98,$76,$0F,$76,$D8
AAD6 DEFB $6E,$3F,$70,$18,$3C,$7F,$B8,$30
AADE DEFB $1C,$F7,$CF,$E4,$09,$E0,$EC,$6C
AAE6 DEFB $01,$80,$05,$5C,$01,$E0,$06,$CC
AAEE DEFB $00,$F8,$00,$0E,$00,$E8,$00,$1E
AAF6 DEFB $00,$00,$00,$1A,$00,$00,$00,$00
AAFE: Sprite, 32x24 pixels. Player
AAFE DEFB $00,$00,$00,$00,$01,$80,$00,$00 sprite-aafe
AB06 DEFB $03,$C0,$00,$00,$07,$C1,$80,$00
AB0E DEFB $7F,$E3,$C0,$00,$7D,$62,$00,$00
AB16 DEFB $7B,$70,$F0,$00,$37,$73,$EF,$C0
AB1E DEFB $1E,$37,$DF,$E0,$0E,$2F,$B8,$30
AB26 DEFB $04,$0F,$B7,$D8,$00,$1F,$68,$28
AB2E DEFB $00,$1F,$70,$18,$00,$0F,$76,$D8
AB36 DEFB $00,$37,$70,$18,$00,$3F,$B8,$38
AB3E DEFB $00,$3F,$DF,$F4,$00,$18,$EC,$6C
AB46 DEFB $00,$1E,$05,$40,$00,$0F,$06,$C0
AB4E DEFB $00,$07,$80,$00,$00,$07,$C0,$00
AB56 DEFB $00,$03,$40,$00,$00,$00,$00,$00
AB5E: Sprite, 32x24 pixels. Player
AB5E DEFB $00,$00,$00,$00,$01,$81,$80,$00 sprite-ab5e
AB66 DEFB $03,$C3,$80,$00,$07,$C7,$C0,$00
AB6E DEFB $7F,$E6,$C0,$00,$7D,$6F,$60,$00
AB76 DEFB $7B,$74,$60,$00,$37,$73,$9C,$00
AB7E DEFB $1E,$37,$F0,$00,$0E,$2F,$EF,$C0
AB86 DEFB $04,$0F,$DF,$E0,$00,$1F,$B8,$30
AB8E DEFB $00,$1F,$B7,$D8,$00,$0F,$68,$28
AB96 DEFB $00,$03,$70,$18,$00,$07,$76,$D8
AB9E DEFB $00,$0F,$72,$98,$00,$0F,$B8,$38
ABA6 DEFB $00,$0F,$1F,$F4,$00,$06,$0C,$6C
ABAE DEFB $00,$07,$C5,$58,$00,$03,$F6,$DE
ABB6 DEFB $00,$00,$D0,$16,$00,$00,$00,$00
ABBE: Sprite, 32x24 pixels. Player laying on back, hands up
ABBE DEFB $00,$00,$00,$00,$00,$07,$C0,$00 sprite-abbe
ABC6 DEFB $00,$1F,$F0,$00,$34,$38,$30,$50
ABCE DEFB $3C,$36,$D0,$F0,$1E,$74,$58,$E0
ABD6 DEFB $0E,$72,$99,$C0,$0F,$78,$3B,$80
ABDE DEFB $07,$9F,$F7,$80,$03,$ED,$61,$3C
ABE6 DEFB $01,$EC,$4E,$76,$01,$F6,$BB,$76
ABEE DEFB $00,$F9,$3B,$76,$00,$BF,$BB,$76
ABF6 DEFB $00,$7F,$BB,$7E,$00,$7F,$9F,$3E
ABFE DEFB $00,$3F,$DF,$3C,$00,$3E,$1E,$BC
AC06 DEFB $00,$25,$4E,$DC,$00,$3D,$EE,$D8
AC0E DEFB $00,$1F,$EC,$18,$00,$1F,$EC,$00
AC16 DEFB $00,$07,$C0,$00,$00,$00,$00,$00
AC1E: Sprite, 32x24 pixels. Player laying on back, dead
AC1E DEFB $00,$00,$00,$00,$03,$80,$00,$78 sprite-ac1e
AC26 DEFB $0E,$E0,$00,$EC,$1C,$30,$00,$EC
AC2E DEFB $3B,$98,$00,$EC,$37,$1B,$80,$EC
AC36 DEFB $32,$3D,$E0,$7C,$38,$E3,$B1,$78
AC3E DEFB $3F,$DB,$D7,$78,$11,$C7,$FF,$38
AC46 DEFB $0E,$3F,$8F,$B8,$1F,$FE,$77,$B8
AC4E DEFB $3F,$FD,$DA,$30,$3F,$FD,$D8,$00
AC56 DEFB $7D,$FD,$D8,$00,$70,$ED,$D8,$00
AC5E DEFB $7C,$2E,$F8,$00,$3C,$0E,$F8,$00
AC66 DEFB $1F,$06,$F0,$00,$1F,$02,$70,$00
AC6E DEFB $0D,$01,$70,$00,$00,$00,$70,$00
AC76 DEFB $00,$00,$60,$00,$00,$00,$00,$00
AC7E: Sprite, 32x24 pixels. Player
AC7E DEFB $00,$00,$00,$00,$00,$00,$00,$00 sprite-ac7e
AC86 DEFB $00,$07,$00,$00,$00,$07,$80,$00
AC8E DEFB $01,$86,$C0,$00,$03,$C7,$60,$00
AC96 DEFB $07,$E4,$F0,$00,$1E,$E3,$FC,$F0
AC9E DEFB $7F,$77,$FB,$FC,$7B,$2F,$F7,$04
ACA6 DEFB $76,$0F,$EE,$FE,$6E,$1F,$ED,$06
ACAE DEFB $3C,$1F,$EF,$2A,$1C,$07,$EE,$6A
ACB6 DEFB $08,$1F,$F6,$02,$00,$3F,$FB,$04
ACBE DEFB $00,$3C,$FB,$FC,$00,$78,$01,$8A
ACC6 DEFB $00,$78,$00,$CA,$00,$60,$00,$56
ACCE DEFB $00,$78,$00,$00,$00,$3E,$00,$00
ACD6 DEFB $00,$3A,$00,$00,$00,$00,$00,$00
ACDE: Sprite, 32x16 pixels. Player shadow
ACDE DEFB $00,$00,$00,$00,$00,$00,$00,$00 sprite-acde
ACE6 DEFB $00,$15,$00,$00,$00,$2A,$80,$00
ACEE DEFB $01,$45,$40,$00,$02,$A2,$80,$00
ACF6 DEFB $05,$55,$50,$00,$02,$AA,$AA,$80
ACFE DEFB $01,$55,$55,$40,$00,$0A,$AA,$A0
AD06 DEFB $00,$00,$55,$40,$00,$00,$AA,$80
AD0E DEFB $00,$00,$54,$00,$00,$00,$00,$00
AD16 DEFB $00,$00,$00,$00,$00,$00,$00,$00
AD1E: Sprite, 32x16 pixels. Player shadow
AD1E DEFB $00,$00,$00,$00,$00,$00,$00,$00 sprite-ad1e
AD26 DEFB $00,$10,$00,$00,$02,$2A,$80,$00
AD2E DEFB $05,$55,$40,$00,$0A,$8A,$80,$00
AD36 DEFB $05,$41,$50,$00,$02,$AA,$AA,$80
AD3E DEFB $01,$55,$55,$40,$00,$0A,$AA,$80
AD46 DEFB $00,$00,$55,$00,$00,$00,$AA,$80
AD4E DEFB $00,$00,$54,$00,$00,$00,$2A,$00
AD56 DEFB $00,$00,$00,$00,$00,$00,$00,$00
AD5E: Sprite, 32x16 pixels. Player shadow
AD5E DEFB $00,$00,$00,$00,$00,$00,$00,$00 sprite-ad5e
AD66 DEFB $00,$00,$2A,$00,$00,$00,$55,$40
AD6E DEFB $00,$00,$2A,$A0,$00,$05,$55,$50
AD76 DEFB $00,$AA,$AA,$A0,$01,$55,$55,$40
AD7E DEFB $02,$AA,$A8,$00,$01,$51,$40,$00
AD86 DEFB $00,$A2,$A0,$00,$00,$15,$40,$00
AD8E DEFB $00,$0A,$80,$00,$00,$00,$00,$00
AD96 DEFB $00,$00,$00,$00,$00,$00,$00,$00
AD9E: Sprite, 32x16 pixels. Player shadow
AD9E DEFB $00,$00,$00,$00,$00,$00,$15,$00 sprite-ad9e
ADA6 DEFB $00,$00,$2A,$00,$00,$00,$55,$40
ADAE DEFB $00,$00,$2A,$80,$00,$05,$55,$40
ADB6 DEFB $00,$AA,$AA,$A0,$01,$55,$55,$40
ADBE DEFB $02,$A0,$A8,$00,$05,$45,$40,$00
ADC6 DEFB $02,$AA,$A0,$00,$01,$15,$40,$00
ADCE DEFB $00,$08,$00,$00,$00,$00,$00,$00
ADD6 DEFB $00,$00,$00,$00,$00,$00,$00,$00
ADDE: Sprite, 24x24 pixels. Fish cloud
ADDE DEFB $00,$00,$00,$60,$01,$80,$5C,$01 sprite-adde
ADE6 DEFB $B8,$7E,$C1,$FC,$7F,$5C,$FE,$3B
ADEE DEFB $7E,$F6,$3F,$7B,$7E,$0C,$7F,$1C
ADF6 DEFB $06,$39,$00,$00,$06,$70,$18,$07
ADFE DEFB $F8,$19,$C7,$FC,$1F,$E1,$EC,$0F
AE06 DEFB $B1,$FC,$07,$F0,$F0,$43,$20,$00
AE0E DEFB $6E,$DC,$B8,$7F,$7E,$FC,$3F,$BE
AE16 DEFB $7E,$3D,$BB,$76,$1F,$3F,$7E,$06
AE1E DEFB $0E,$1C,$03,$00,$00,$00,$00,$00
AE26: Sprite, 24x24 pixels. Fish cloud
AE26 DEFB $00,$00,$00,$30,$00,$C0,$36,$00 sprite-ae26
AE2E DEFB $B8,$1F,$60,$FC,$1F,$9C,$FE,$1D
AE36 DEFB $BE,$F6,$1F,$BB,$7E,$0E,$3F,$18
AE3E DEFB $03,$3C,$0C,$18,$0B,$70,$1B,$C7
AE46 DEFB $F8,$1F,$E3,$FC,$0F,$73,$EC,$07
AE4E DEFB $F1,$FC,$01,$E0,$E0,$60,$00,$38
AE56 DEFB $6E,$EC,$80,$7F,$7E,$B8,$7F,$BE
AE5E DEFB $FC,$3D,$BB,$7E,$1F,$3F,$76,$06
AE66 DEFB $0C,$7E,$00,$06,$18,$00,$00,$00
AE6E: Sprite, 24x32 pixels. Jellyfish
AE6E DEFB $00,$00,$00,$00,$01,$E0,$00,$0F sprite-ae6e
AE76 DEFB $F8,$00,$1F,$FC,$00,$3F,$5C,$00
AE7E DEFB $7E,$BE,$00,$77,$5E,$00,$EB,$AE
AE86 DEFB $00,$D7,$DE,$01,$FE,$FE,$02,$F5
AE8E DEFB $7C,$0E,$EA,$BC,$19,$75,$58,$33
AE96 DEFB $7A,$B8,$26,$B5,$78,$6D,$DA,$B0
AE9E DEFB $5B,$0F,$F0,$5A,$75,$E0,$51,$E6
AEA6 DEFB $00,$37,$1D,$80,$36,$3B,$00,$66
AEAE DEFB $E3,$00,$6D,$C6,$00,$6B,$1C,$00
AEB6 DEFB $66,$38,$00,$6D,$60,$00,$1A,$C0
AEBE DEFB $00,$19,$80,$00,$33,$40,$00,$26
AEC6 DEFB $F0,$00,$06,$30,$00,$00,$00,$00
AECE: Sprite, 24x32 pixels. Jellyfish
AECE DEFB $00,$00,$00,$00,$00,$00,$00,$1F sprite-aece
AED6 DEFB $00,$01,$FF,$C0,$03,$F5,$70,$03
AEDE DEFB $FA,$78,$43,$F5,$58,$60,$EA,$AC
AEE6 DEFB $73,$36,$5C,$3E,$DF,$BC,$1C,$C6
AEEE DEFB $7E,$01,$BB,$BE,$03,$6D,$5E,$03
AEF6 DEFB $4E,$FE,$06,$3C,$3E,$06,$E3,$BE
AEFE DEFB $0C,$C6,$5C,$18,$DC,$40,$79,$B8
AF06 DEFB $C0,$71,$63,$80,$00,$C6,$00,$61
AF0E DEFB $AC,$00,$7B,$58,$00,$3B,$30,$00
AF16 DEFB $06,$E0,$00,$04,$00,$00,$00,$00
AF1E DEFB $00,$00,$00,$00,$00,$00,$00,$00
AF26 DEFB $00,$00,$00,$00,$00,$00,$00,$00
AF2E: Sprite, 24x32 pixels. Jellyfish
AF2E DEFB $00,$00,$00,$07,$F0,$00,$1F,$BE sprite-af2e
AF36 DEFB $00,$1F,$DF,$C0,$3F,$AB,$E0,$3F
AF3E DEFB $55,$F0,$0F,$FA,$B0,$37,$F5,$58
AF46 DEFB $23,$FA,$B8,$4D,$B9,$5C,$69,$FE
AF4E DEFB $AC,$60,$FF,$D4,$3F,$7F,$AC,$5E
AF56 DEFB $3F,$D4,$60,$CF,$FE,$4F,$C7,$EE
AF5E DEFB $1F,$3B,$D6,$39,$F9,$FE,$33,$C0
AF66 DEFB $6E,$36,$1F,$7C,$76,$3E,$38,$66
AF6E DEFB $E0,$40,$41,$C0,$60,$47,$18,$E0
AF76 DEFB $0E,$30,$C0,$38,$33,$C0,$30,$1F
AF7E DEFB $00,$00,$00,$00,$00,$00,$00,$00
AF86 DEFB $00,$00,$00,$00,$00,$00,$00,$00
AF8E: Sprite, 24x24 pixels. Fish cloud
AF8E DEFB $00,$00,$00,$00,$0C,$00,$06,$1E sprite-af8e
AF96 DEFB $1C,$0F,$3F,$3E,$5D,$BA,$B4,$7F
AF9E DEFB $BE,$FE,$7F,$3E,$FC,$6C,$DC,$B8
AFA6 DEFB $43,$E0,$00,$17,$B0,$70,$1F,$E4
AFAE DEFB $FC,$1F,$E5,$EC,$0F,$C7,$FC,$03
AFB6 DEFB $07,$F8,$00,$06,$70,$00,$00,$00
AFBE DEFB $0C,$8E,$1C,$1E,$BB,$3E,$5A,$BE
AFC6 DEFB $34,$5E,$FD,$BE,$7C,$FD,$FC,$7C
AFCE DEFB $71,$F8,$60,$00,$C0,$00,$00,$00
AFD6: Sprite, 24x32 pixels. Jellyfish
AFD6 DEFB $00,$00,$00,$00,$0F,$00,$00,$3F sprite-afd6
AFDE DEFB $C0,$00,$7F,$20,$00,$7E,$20,$00
AFE6 DEFB $FE,$C0,$00,$FE,$20,$00,$7F,$30
AFEE DEFB $07,$0F,$90,$0F,$76,$F0,$1E,$F6
AFF6 DEFB $70,$1D,$F7,$60,$3D,$F7,$18,$3B
AFFE DEFB $EF,$30,$3B,$DE,$F8,$13,$B7,$F8
B006 DEFB $0C,$6F,$C0,$1F,$EF,$30,$1F,$EE
B00E DEFB $78,$3F,$F1,$F8,$3F,$FF,$B0,$3F
B016 DEFB $FF,$70,$3D,$FE,$F0,$1E,$F9,$E0
B01E DEFB $07,$03,$C0,$00,$F3,$80,$03,$E7
B026 DEFB $80,$07,$EF,$C6,$07,$EF,$FE,$03
B02E DEFB $AF,$C6,$00,$E3,$FE,$00,$00,$3C
B036: Sprite, 32x24 pixels. Player
B036 DEFB $00,$00,$00,$00,$00,$00,$03,$C0 sprite-b036
B03E DEFB $00,$00,$0F,$F0,$00,$00,$1F,$F0
B046 DEFB $00,$03,$C3,$F8,$00,$0E,$3D,$F8
B04E DEFB $00,$1D,$FD,$F8,$00,$1D,$FC,$70
B056 DEFB $00,$02,$F3,$B0,$0D,$1F,$0F,$C0
B05E DEFB $1F,$63,$FF,$C0,$1F,$DC,$7F,$E0
B066 DEFB $1D,$DF,$FF,$E0,$3C,$3F,$FE,$E0
B06E DEFB $34,$3C,$F1,$DC,$36,$2C,$00,$FC
B076 DEFB $6E,$2C,$00,$FC,$6E,$6E,$00,$70
B07E DEFB $7E,$76,$00,$00,$0E,$7E,$00,$00
B086 DEFB $00,$1E,$00,$00,$00,$00,$00,$00
B08E DEFB $00,$00,$00,$00,$00,$00,$00,$00
B096: Sprite, 32x24 pixels. Player
B096 DEFB $00,$00,$00,$00,$00,$00,$03,$C0 sprite-b096
B09E DEFB $00,$00,$0F,$F0,$00,$00,$1F,$F0
B0A6 DEFB $00,$03,$C3,$F8,$00,$0E,$3D,$F8
B0AE DEFB $00,$1D,$FD,$F8,$0C,$1D,$FC,$70
B0B6 DEFB $1F,$1D,$F3,$B0,$1F,$C2,$EF,$C0
B0BE DEFB $1D,$FF,$1F,$C0,$3C,$FF,$FF,$E6
B0C6 DEFB $34,$63,$FF,$EE,$36,$1C,$7E,$EE
B0CE DEFB $6E,$1F,$FE,$FE,$6E,$3F,$F0,$FC
B0D6 DEFB $7E,$3C,$C0,$78,$0E,$2C,$00,$10
B0DE DEFB $00,$2C,$00,$00,$00,$6E,$00,$00
B0E6 DEFB $00,$76,$00,$00,$00,$7E,$00,$00
B0EE DEFB $00,$1E,$00,$00,$00,$00,$00,$00
B0F6: Sprite, 32x24 pixels. Player
B0F6 DEFB $00,$00,$00,$00,$00,$00,$03,$C0 sprite-b0f6
B0FE DEFB $00,$00,$0F,$F0,$00,$00,$1F,$F0
B106 DEFB $00,$03,$C3,$F8,$00,$0E,$3D,$F8
B10E DEFB $00,$0D,$FD,$F8,$00,$31,$FC,$70
B116 DEFB $00,$38,$F3,$B0,$00,$3F,$0F,$C0
B11E DEFB $00,$77,$FF,$C0,$01,$7B,$FF,$C0
B126 DEFB $0F,$5B,$7B,$C0,$1E,$58,$FB,$C0
B12E DEFB $1E,$DC,$03,$C0,$1C,$EC,$01,$C0
B136 DEFB $34,$FC,$01,$E0,$34,$3C,$00,$E0
B13E DEFB $36,$00,$00,$F8,$6E,$00,$00,$F8
B146 DEFB $6E,$00,$00,$78,$7E,$00,$00,$38
B14E DEFB $0E,$00,$00,$00,$00,$00,$00,$00
B156: Sprite, 32x24 pixels. Player
B156 DEFB $00,$00,$00,$00,$00,$00,$00,$00 sprite-b156
B15E DEFB $00,$00,$00,$00,$00,$00,$01,$F0
B166 DEFB $0C,$03,$CB,$F8,$1F,$0E,$3D,$E4
B16E DEFB $1F,$9D,$FD,$C4,$1D,$DD,$FD,$DA
B176 DEFB $3C,$E2,$F3,$CA,$34,$7F,$0F,$62
B17E DEFB $36,$23,$FF,$B2,$6E,$1C,$7F,$DE
B186 DEFB $6E,$1F,$FF,$CC,$7E,$3F,$FE,$EC
B18E DEFB $0E,$3C,$F1,$E0,$00,$2C,$05,$E0
B196 DEFB $00,$2C,$1C,$E0,$00,$6E,$1C,$E0
B19E DEFB $00,$76,$1C,$E0,$00,$7E,$1E,$70
B1A6 DEFB $00,$1E,$0A,$7C,$00,$00,$00,$3C
B1AE DEFB $00,$00,$00,$34,$00,$00,$00,$00
B1B6: Sprite, 32x32 pixels. Explosion
B1B6 DEFB $00,$00,$00,$00,$00,$00,$BC,$00 sprite-b1b6
B1BE DEFB $00,$06,$7E,$00,$00,$15,$FF,$00
B1C6 DEFB $01,$DB,$EB,$00,$01,$75,$D5,$00
B1CE DEFB $06,$AB,$AB,$F0,$0D,$55,$D5,$58
B1D6 DEFB $1A,$AF,$AA,$AC,$35,$7F,$D5,$54
B1DE DEFB $7A,$FC,$2C,$AC,$55,$FB,$DF,$54
B1E6 DEFB $7A,$FF,$EF,$A8,$1D,$FF,$F7,$B8
B1EE DEFB $0F,$FF,$F7,$BC,$1D,$FF,$FB,$DC
B1F6 DEFB $3E,$FF,$FB,$DE,$3E,$FF,$FB,$DE
B1FE DEFB $7E,$FF,$F3,$BE,$7D,$EF,$EF,$BE
B206 DEFB $7D,$EF,$F7,$7E,$7B,$F7,$F4,$FE
B20E DEFB $1B,$FB,$8D,$3C,$29,$FC,$7A,$8C
B216 DEFB $75,$FF,$D5,$50,$6A,$FA,$AB,$B0
B21E DEFB $2A,$FD,$56,$D0,$35,$7B,$B9,$20
B226 DEFB $1A,$7F,$56,$C0,$0F,$3E,$78,$00
B22E DEFB $00,$1D,$80,$00,$00,$00,$00,$00
B236: Sprite, 32x24 pixels. Explosion
B236 DEFB $00,$00,$00,$00,$00,$01,$C0,$00 sprite-b236
B23E DEFB $00,$0B,$B7,$00,$00,$1D,$5D,$00
B246 DEFB $06,$3F,$AA,$C0,$0F,$7E,$3D,$60
B24E DEFB $1F,$B9,$FF,$B0,$1F,$7B,$FF,$F0
B256 DEFB $3F,$7B,$FF,$F0,$7F,$7B,$F7,$60
B25E DEFB $7F,$FD,$F7,$80,$7F,$BE,$2F,$C0
B266 DEFB $7F,$DF,$DF,$C0,$7F,$FF,$FF,$D8
B26E DEFB $7D,$5F,$BF,$BC,$3E,$AE,$BF,$2C
B276 DEFB $05,$55,$4E,$5C,$06,$EA,$B1,$AC
B27E DEFB $05,$B5,$5E,$A8,$02,$4F,$BF,$58
B286 DEFB $01,$B5,$FE,$B0,$00,$1E,$FB,$E0
B28E DEFB $00,$01,$70,$00,$00,$00,$00,$00
B296: Sprite, 16x24 pixels. Explosion small
B296 DEFB $00,$00,$03,$B0,$07,$E8,$0F,$FC sprite-b296
B29E DEFB $0F,$7C,$02,$48,$32,$A8,$2D,$76
B2A6 DEFB $51,$FA,$6E,$F6,$3F,$EE,$27,$FC
B2AE DEFB $6F,$A8,$75,$48,$6E,$A4,$3D,$4C
B2B6 DEFB $12,$98,$07,$70,$06,$38,$0F,$BC
B2BE DEFB $07,$FC,$07,$78,$00,$F0,$00,$00
B2C6: Sprite, 24x24 pixels. Fish cloud
B2C6 DEFB $00,$00,$00,$00,$18,$00,$00,$3C sprite-b2c6
B2CE DEFB $38,$06,$76,$6C,$0F,$7D,$78,$1D
B2D6 DEFB $7D,$FC,$7F,$7D,$F8,$7F,$39,$70
B2DE DEFB $6C,$00,$00,$43,$80,$E0,$17,$45
B2E6 DEFB $C8,$17,$87,$F0,$1F,$C7,$F8,$0F
B2EE DEFB $87,$70,$03,$04,$60,$0C,$00,$18
B2F6 DEFB $1F,$00,$3E,$1A,$8E,$3A,$5E,$BB
B2FE DEFB $7E,$7E,$BE,$7C,$7C,$FE,$7C,$60
B306 DEFB $FC,$60,$00,$70,$00,$00,$00,$00
B30E: Sprite, 32x24 pixels. Player
B30E DEFB $00,$00,$00,$00,$00,$00,$01,$E0 sprite-b30e
B316 DEFB $00,$00,$07,$F8,$00,$00,$0F,$E4
B31E DEFB $00,$03,$C3,$C4,$00,$0E,$3D,$D8
B326 DEFB $00,$1D,$FD,$C4,$00,$1D,$FC,$66
B32E DEFB $00,$02,$F3,$B2,$0C,$1F,$0F,$DE
B336 DEFB $1F,$63,$FF,$CE,$1F,$DC,$7F,$EC
B33E DEFB $1D,$DF,$FF,$E0,$3C,$3F,$FE,$E0
B346 DEFB $34,$3C,$F1,$DC,$36,$2C,$00,$FC
B34E DEFB $6E,$2C,$00,$FC,$6E,$6E,$00,$70
B356 DEFB $7E,$76,$00,$00,$0E,$7E,$00,$00
B35E DEFB $00,$1E,$00,$00,$00,$00,$00,$00
B366 DEFB $00,$00,$00,$00,$00,$00,$00,$00
B36E: Sprite, 32x32 pixels. Fish
B36E DEFB $00,$00,$00,$00,$30,$03,$F0,$00 sprite-b36e
B376 DEFB $78,$1E,$9C,$00,$78,$73,$E7,$00
B37E DEFB $3C,$D5,$55,$C0,$3E,$FF,$FF,$60
B386 DEFB $1D,$AA,$EA,$B0,$3D,$FF,$FF,$70
B38E DEFB $1B,$57,$75,$58,$3A,$BD,$DF,$F8
B396 DEFB $3A,$2E,$BA,$BC,$1B,$FA,$1B,$F6
B39E DEFB $3E,$5C,$1D,$52,$3F,$F8,$CD,$FA
B3A6 DEFB $1E,$B9,$0E,$FA,$1F,$F9,$05,$B2
B3AE DEFB $1F,$58,$8D,$FA,$0D,$EC,$0F,$0C
B3B6 DEFB $1F,$AE,$3C,$70,$1D,$F7,$FB,$FC
B3BE DEFB $1E,$57,$D7,$FE,$35,$FE,$EF,$FE
B3C6 DEFB $3D,$2B,$AF,$6C,$3D,$FF,$DE,$4C
B3CE DEFB $38,$B5,$5C,$00,$30,$7F,$D9,$F0
B3D6 DEFB $30,$FA,$8F,$F8,$11,$FB,$EF,$F8
B3DE DEFB $01,$75,$47,$10,$00,$F7,$F0,$E0
B3E6 DEFB $00,$E0,$7F,$00,$00,$00,$00,$00
B3EE: Sprite, 32x32 pixels. Fish
B3EE DEFB $00,$00,$00,$00,$06,$07,$E0,$00 sprite-b3ee
B3F6 DEFB $0E,$3D,$38,$00,$1C,$E7,$CE,$00
B3FE DEFB $19,$AA,$AB,$80,$19,$FF,$FE,$C0
B406 DEFB $3B,$55,$D5,$60,$3B,$FF,$FE,$E0
B40E DEFB $36,$AE,$EA,$B0,$35,$7B,$BF,$F0
B416 DEFB $74,$5D,$75,$78,$7F,$F7,$F7,$FC
B41E DEFB $3C,$BC,$3A,$AC,$77,$F9,$9B,$F4
B426 DEFB $7D,$72,$5D,$F4,$3F,$F2,$4B,$64
B42E DEFB $3E,$B1,$1B,$F4,$3B,$D8,$1E,$18
B436 DEFB $7F,$5C,$78,$E0,$6B,$EF,$F7,$F8
B43E DEFB $3C,$AF,$AF,$FC,$33,$FD,$DF,$FC
B446 DEFB $12,$57,$5E,$D8,$1B,$FF,$BC,$98
B44E DEFB $1C,$6A,$B8,$00,$09,$FF,$B0,$00
B456 DEFB $07,$F5,$1B,$E0,$05,$E7,$DF,$F0
B45E DEFB $03,$9A,$8E,$20,$00,$0F,$E1,$C0
B466 DEFB $00,$00,$FE,$00,$00,$00,$00,$00
B46E: Sprite, 32x32 pixels. Fish
B46E DEFB $00,$00,$00,$00,$40,$00,$FE,$00 sprite-b46e
B476 DEFB $60,$03,$37,$E0,$7C,$0C,$EA,$A0
B47E DEFB $3E,$1B,$FF,$F8,$3E,$37,$D5,$58
B486 DEFB $1F,$37,$BE,$D8,$0F,$2F,$3B,$F4
B48E DEFB $1D,$6E,$AD,$FC,$1F,$7E,$77,$0C
B496 DEFB $0F,$7D,$FF,$24,$0F,$AC,$AE,$76
B49E DEFB $07,$BD,$EE,$56,$03,$B5,$46,$46
B4A6 DEFB $0F,$BF,$F6,$26,$1F,$BA,$A6,$8C
B4AE DEFB $0F,$67,$F3,$1A,$13,$5D,$55,$7E
B4B6 DEFB $0F,$EF,$9B,$FE,$0F,$2A,$BA,$84
B4BE DEFB $07,$7D,$BF,$B8,$07,$55,$54,$FC
B4C6 DEFB $07,$6F,$DF,$FE,$0F,$BA,$AA,$76
B4CE DEFB $07,$FF,$EF,$BA,$07,$B5,$72,$3C
B4D6 DEFB $0F,$9B,$1C,$1C,$1B,$0E,$70,$00
B4DE DEFB $07,$03,$C0,$00,$1E,$00,$00,$00
B4E6 DEFB $30,$00,$00,$00,$00,$00,$00,$00
B4EE: Sprite, 32x32 pixels. Fish
B4EE DEFB $00,$00,$00,$00,$03,$83,$F8,$00 sprite-b4ee
B4F6 DEFB $07,$0C,$DF,$80,$06,$33,$AA,$80
B4FE DEFB $0F,$2F,$FF,$E0,$0E,$5F,$55,$70
B506 DEFB $06,$5E,$FB,$70,$07,$7C,$EF,$90
B50E DEFB $0F,$3A,$BF,$F0,$0F,$39,$DF,$78
B516 DEFB $0F,$77,$FE,$38,$1F,$32,$BC,$98
B51E DEFB $1D,$77,$B5,$DC,$1B,$95,$35,$5C
B526 DEFB $1F,$BF,$F4,$9C,$1F,$2A,$BA,$38
B52E DEFB $0F,$9F,$DC,$74,$03,$B5,$5D,$7C
B536 DEFB $0F,$BE,$6F,$E8,$07,$2A,$EB,$D0
B53E DEFB $07,$76,$FF,$FC,$07,$55,$57,$70
B546 DEFB $03,$3F,$7E,$FC,$03,$6A,$AB,$38
B54E DEFB $07,$BF,$BE,$00,$07,$9D,$C8,$00
B556 DEFB $03,$BC,$70,$00,$03,$8F,$C0,$00
B55E DEFB $07,$00,$00,$00,$03,$80,$00,$00
B566 DEFB $00,$C0,$00,$00,$00,$00,$00,$00
B56E: Sprite, 16x8 pixels. Snake, rearing phase
B56E DEFB $00,$00,$03,$F0,$1F,$FC,$3F,$DC sprite-b56e
B576 DEFB $5E,$7E,$5C,$3E,$3D,$BC,$0F,$F0
B57E: Sprite, 16x16 pixels. Snake, rearing phase
B57E DEFB $00,$00,$03,$F0,$1F,$FC,$3F,$DC sprite-b57e
B586 DEFB $5E,$7E,$5C,$3E,$7D,$BA,$5E,$7E
B58E DEFB $5F,$E0,$3F,$9C,$3F,$FC,$6F,$F8
B596 DEFB $5D,$C0,$5A,$A0,$3D,$60,$0F,$C0
B59E: Sprite, 16x24 pixels. Snake, rearing phase
B59E DEFB $00,$00,$03,$F0,$1F,$FC,$3F,$DC sprite-b59e
B5A6 DEFB $5E,$7E,$5C,$3E,$7D,$BA,$5E,$7E
B5AE DEFB $5F,$E0,$3F,$9C,$3F,$FC,$6F,$F8
B5B6 DEFB $5D,$C0,$5A,$A0,$5D,$40,$6E,$80
B5BE DEFB $6D,$60,$3E,$F0,$2F,$88,$36,$78
B5C6 DEFB $37,$5C,$0F,$AC,$0F,$58,$07,$F0
B5CE: Sprite, 16x32 pixels. Snake, rearing phase
B5CE DEFB $00,$00,$03,$F0,$1F,$FC,$3F,$DC sprite-b5ce
B5D6 DEFB $5E,$7E,$5C,$3E,$7D,$BA,$5E,$7E
B5DE DEFB $5F,$E0,$3F,$9C,$3F,$FC,$6F,$F8
B5E6 DEFB $5D,$C0,$5A,$A0,$5D,$40,$6E,$80
B5EE DEFB $6D,$60,$3E,$F0,$2F,$88,$36,$78
B5F6 DEFB $37,$58,$1F,$AC,$17,$54,$13,$AC
B5FE DEFB $17,$54,$1F,$AC,$33,$54,$6E,$AC
B606 DEFB $7D,$54,$3E,$A8,$1D,$70,$07,$C0
B60E: Sprite, 16x32 pixels. Sea Horse
B60E DEFB $00,$00,$2F,$00,$1F,$C0,$7F,$C0 sprite-b60e
B616 DEFB $3D,$E0,$7B,$C0,$79,$E0,$3F,$FC
B61E DEFB $77,$3E,$78,$36,$36,$3E,$3F,$9C
B626 DEFB $7F,$C0,$3F,$E0,$5F,$E0,$19,$F0
B62E DEFB $37,$F0,$16,$E0,$09,$E0,$1F,$C0
B636 DEFB $0F,$80,$1E,$00,$1A,$00,$0C,$00
B63E DEFB $1C,$60,$18,$F0,$1C,$70,$0A,$A0
B646 DEFB $0F,$E0,$07,$C0,$03,$00,$00,$00
B64E: Sprite, 16x32 pixels. Sea Horse
B64E DEFB $00,$00,$13,$8C,$0F,$EE,$2F,$7E sprite-b64e
B656 DEFB $1E,$34,$7E,$B0,$1F,$F0,$7F,$E0
B65E DEFB $3D,$C0,$3E,$00,$1D,$80,$6F,$E0
B666 DEFB $7F,$F0,$5F,$C8,$3F,$F0,$37,$F8
B66E DEFB $0F,$B8,$1F,$98,$0F,$E0,$1F,$E0
B676 DEFB $07,$C0,$0F,$80,$06,$80,$1F,$10
B67E DEFB $0F,$38,$1F,$28,$0E,$18,$03,$98
B686 DEFB $07,$70,$03,$E0,$01,$80,$00,$00
B68E: Sprite, 32x32 pixels. Baby whale
B68E DEFB $00,$00,$00,$00,$00,$00,$00,$00 sprite-b68e
B696 DEFB $00,$00,$7C,$00,$00,$03,$FF,$00
B69E DEFB $00,$07,$E7,$C0,$40,$DF,$CD,$E0
B6A6 DEFB $63,$BF,$C3,$F0,$6D,$BF,$FF,$F0
B6AE DEFB $7F,$7F,$FF,$F8,$3E,$7F,$FF,$F8
B6B6 DEFB $0E,$FF,$FF,$FC,$1C,$FF,$FF,$FC
B6BE DEFB $0D,$FF,$FF,$FC,$01,$FF,$FF,$FE
B6C6 DEFB $01,$FF,$FF,$FE,$01,$FF,$FF,$FE
B6CE DEFB $01,$FF,$FF,$FE,$01,$FF,$FF,$FE
B6D6 DEFB $01,$FF,$FF,$FE,$01,$FF,$FF,$FC
B6DE DEFB $00,$FF,$9F,$FE,$00,$FF,$47,$FC
B6E6 DEFB $00,$FF,$6F,$FE,$00,$7F,$9F,$FE
B6EE DEFB $00,$23,$FF,$AC,$00,$1D,$FF,$FC
B6F6 DEFB $00,$3E,$EF,$F8,$00,$7E,$F1,$E0
B6FE DEFB $00,$7C,$FE,$10,$00,$7D,$FF,$E0
B706 DEFB $00,$38,$7F,$00,$00,$00,$00,$00
B70E: Sprite, 32x32 pixels. Baby whale
B70E DEFB $00,$00,$00,$00,$00,$00,$7C,$00 sprite-b70e
B716 DEFB $00,$03,$FF,$00,$00,$07,$F3,$C0
B71E DEFB $00,$1F,$E6,$E0,$00,$3F,$E1,$F0
B726 DEFB $00,$3F,$FF,$F0,$00,$7F,$FF,$F8
B72E DEFB $00,$7F,$FF,$F8,$00,$FF,$FF,$FC
B736 DEFB $00,$FF,$FF,$FC,$01,$FF,$FF,$FC
B73E DEFB $01,$FF,$FF,$FE,$01,$FF,$FF,$FE
B746 DEFB $01,$FF,$FF,$FE,$01,$FF,$FF,$FE
B74E DEFB $01,$FF,$FF,$FE,$0D,$FF,$FF,$FE
B756 DEFB $1D,$FF,$FF,$FC,$3C,$FF,$9F,$FE
B75E DEFB $1E,$FF,$0F,$FC,$7E,$FF,$67,$FE
B766 DEFB $7E,$67,$9F,$FE,$68,$3B,$FF,$AC
B76E DEFB $70,$FF,$FF,$FC,$21,$FD,$E3,$F8
B776 DEFB $01,$FB,$F0,$40,$00,$F1,$FE,$10
B77E DEFB $00,$00,$FF,$E0,$00,$00,$1F,$00
B786 DEFB $00,$00,$00,$00,$00,$00,$00,$00
B78E: Sprite, 32x32 pixels. Baby whale
B78E DEFB $00,$00,$00,$00,$00,$00,$00,$00 sprite-b78e
B796 DEFB $00,$00,$00,$00,$00,$00,$7C,$00
B79E DEFB $00,$03,$FF,$00,$00,$0F,$FF,$C0
B7A6 DEFB $00,$1F,$FF,$E0,$00,$1F,$FF,$F0
B7AE DEFB $00,$3F,$FF,$F8,$00,$3F,$FF,$F8
B7B6 DEFB $00,$7F,$FF,$F8,$00,$7F,$FF,$FC
B7BE DEFB $00,$7F,$FF,$FC,$00,$7F,$FF,$FC
B7C6 DEFB $00,$FF,$FF,$EE,$00,$FF,$FF,$96
B7CE DEFB $38,$78,$FF,$8E,$7F,$87,$0F,$BE
B7D6 DEFB $7F,$7F,$E7,$F8,$1F,$7F,$CF,$F8
B7DE DEFB $1F,$F9,$9F,$FE,$07,$FC,$3F,$C4
B7E6 DEFB $03,$F9,$E7,$B8,$00,$F3,$BB,$7E
B7EE DEFB $00,$07,$DF,$7E,$00,$3F,$DF,$7E
B7F6 DEFB $00,$3F,$FF,$BE,$00,$1F,$FF,$9C
B7FE DEFB $00,$0F,$FE,$00,$00,$07,$FC,$00
B806 DEFB $00,$01,$C0,$00,$00,$00,$00,$00
B80E: Sprite, 32x32 pixels. Baby whale
B80E DEFB $00,$00,$00,$00,$00,$00,$7C,$00 sprite-b80e
B816 DEFB $00,$03,$FF,$00,$00,$0F,$FF,$C0
B81E DEFB $00,$1F,$FF,$E0,$00,$1F,$FF,$F0
B826 DEFB $00,$3F,$FF,$F8,$00,$3F,$FF,$F8
B82E DEFB $00,$7F,$FF,$F8,$00,$7F,$FF,$FC
B836 DEFB $00,$7F,$FF,$FC,$00,$7F,$FF,$FC
B83E DEFB $00,$FF,$FF,$CE,$00,$FF,$FF,$B6
B846 DEFB $00,$FF,$FF,$8E,$00,$A7,$FF,$9E
B84E DEFB $00,$79,$FF,$FA,$00,$FF,$FF,$F8
B856 DEFB $03,$FF,$FF,$FE,$02,$07,$FF,$E4
B85E DEFB $00,$F3,$FF,$D8,$03,$F9,$FF,$F8
B866 DEFB $07,$FC,$3F,$B8,$1F,$F9,$9F,$FC
B86E DEFB $1F,$7F,$CF,$7C,$7F,$7F,$E7,$7C
B876 DEFB $7F,$87,$0E,$38,$38,$00,$3C,$00
B87E DEFB $00,$00,$00,$00,$00,$00,$00,$00
B886 DEFB $00,$00,$00,$00,$00,$00,$00,$00
B88E: Sprite, 16x24 pixels. Gnome item
B88E DEFB $00,$00,$00,$F0,$0E,$CC,$1B,$FA sprite-b88e
B896 DEFB $59,$E4,$72,$1E,$07,$FE,$01,$18
B89E DEFB $05,$5C,$05,$F8,$03,$64,$18,$DC
B8A6 DEFB $4B,$3C,$4C,$DE,$68,$3A,$77,$DA
B8AE DEFB $0F,$F6,$60,$0C,$77,$36,$71,$BA
B8B6 DEFB $16,$BE,$66,$BE,$33,$98,$00,$00
B8BE: Mask, 16x24 pixels. Gnome item
B8BE DEFB $00,$F0,$0F,$FC,$1F,$FE,$5F,$FF sprite-b8be
B8C6 DEFB $FF,$FE,$FF,$FF,$FF,$FF,$0F,$FE
B8CE DEFB $0F,$FE,$0F,$FC,$1F,$FE,$5F,$FE
B8D6 DEFB $FF,$FE,$FF,$FF,$FF,$FF,$FF,$FF
B8DE DEFB $7F,$FF,$FF,$FE,$FF,$FF,$FF,$FF
B8E6 DEFB $7F,$FF,$FF,$FF,$7F,$BE,$33,$18
B8EE: Sprite, 16x24 pixels. Bucket item
B8EE DEFB $00,$00,$07,$80,$0F,$C0,$0C,$60 sprite-b8ee
B8F6 DEFB $08,$60,$18,$00,$1B,$E0,$18,$98
B8FE DEFB $19,$44,$5A,$AA,$59,$46,$18,$1C
B906 DEFB $5B,$F2,$58,$0E,$67,$FE,$7F,$FE
B90E DEFB $3F,$FE,$3F,$FC,$1F,$F8,$27,$E4
B916 DEFB $38,$1C,$1F,$F8,$07,$E0,$00,$00
B91E: Mask, 16x24 pixels. Bucket item
B91E DEFB $07,$80,$0F,$C0,$1F,$E0,$1F,$F0 sprite-b91e
B926 DEFB $3C,$70,$3C,$70,$3F,$F8,$7F,$FC
B92E DEFB $7F,$FE,$FF,$FF,$FF,$FF,$FF,$FF
B936 DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
B93E DEFB $7F,$FF,$7F,$FE,$7F,$FE,$7F,$FE
B946 DEFB $7F,$FE,$3F,$FC,$1F,$F8,$07,$E0
B94E: Sprite, 16x24 pixels. Tin item
B94E DEFB $00,$00,$01,$F0,$07,$70,$0D,$A0 sprite-b94e
B956 DEFB $1B,$60,$16,$D8,$39,$84,$7F,$02
B95E DEFB $5E,$22,$40,$52,$62,$A6,$78,$1E
B966 DEFB $4F,$F2,$51,$8A,$5E,$7A,$57,$EA
B96E DEFB $59,$4A,$5B,$4A,$5B,$5A,$4F,$F2
B976 DEFB $71,$8E,$3E,$7C,$1F,$F8,$07,$E0
B97E: Mask, 16x24 pixels. Tin item
B97E DEFB $01,$F0,$07,$F8,$0F,$F8,$1F,$F0 sprite-b97e
B986 DEFB $3F,$F8,$3F,$FC,$7F,$FE,$7F,$FF
B98E DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
B996 DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
B99E DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
B9A6 DEFB $FF,$FF,$7F,$FE,$3F,$FC,$1F,$F8
B9AE: Sprite, 16x24 pixels. Key item
B9AE DEFB $00,$00,$1C,$38,$3E,$7C,$73,$CE sprite-b9ae
B9B6 DEFB $61,$86,$6D,$B6,$73,$CE,$3E,$7C
B9BE DEFB $0D,$B0,$03,$C0,$03,$40,$03,$40
B9C6 DEFB $03,$40,$03,$40,$03,$7C,$03,$5C
B9CE DEFB $03,$40,$03,$78,$03,$58,$03,$40
B9D6 DEFB $02,$7C,$03,$DC,$01,$80,$00,$00
B9DE: Mask, 16x24 pixels. Key item
B9DE DEFB $1C,$38,$3E,$7C,$7F,$FE,$FF,$FF sprite-b9de
B9E6 DEFB $FF,$FF,$FF,$FF,$FF,$FF,$7F,$FE
B9EE DEFB $3F,$FC,$0F,$F0,$07,$E0,$07,$E0
B9F6 DEFB $07,$E0,$07,$FC,$07,$FE,$07,$FE
B9FE DEFB $07,$FC,$07,$FC,$07,$FC,$07,$FC
BA06 DEFB $07,$FE,$07,$FE,$03,$DC,$01,$80
BA0E: Sprite, 16x24 pixels. Horseshoe item (weapon; kills Sea Horses)
BA0E DEFB $00,$00,$03,$C0,$0E,$70,$1E,$78 sprite-ba0e
BA16 DEFB $3F,$FC,$3C,$3C,$78,$1E,$48,$12
BA1E DEFB $48,$12,$78,$1E,$78,$1E,$38,$1C
BA26 DEFB $38,$1C,$3C,$3C,$24,$24,$24,$24
BA2E DEFB $3C,$3C,$1C,$38,$1C,$38,$1E,$78
BA36 DEFB $32,$4C,$32,$4C,$3E,$7C,$00,$00
BA3E: Mask, 16x24 pixels. Horseshoe item
BA3E DEFB $03,$C0,$0F,$F0,$1F,$F8,$3F,$FC sprite-ba3e
BA46 DEFB $7F,$FE,$7F,$FE,$FC,$3F,$FC,$3F
BA4E DEFB $FC,$3F,$FC,$3F,$FC,$3F,$7C,$3E
BA56 DEFB $7C,$3E,$7E,$7E,$7E,$7E,$7E,$7E
BA5E DEFB $7E,$7E,$3E,$7C,$3E,$7C,$3F,$FC
BA66 DEFB $7F,$FE,$7F,$FE,$7F,$FE,$3E,$7C
BA6E: Sprite, 16x24 pixels. Bone item (lures fish shoals away)
BA6E DEFB $00,$00,$00,$70,$00,$F8,$06,$F8 sprite-ba6e
BA76 DEFB $0F,$78,$1F,$70,$1F,$E0,$1F,$C0
BA7E DEFB $1E,$C0,$0D,$C0,$03,$C0,$03,$C0
BA86 DEFB $03,$C0,$03,$C0,$03,$D8,$03,$DC
BA8E DEFB $01,$FC,$0F,$FC,$1F,$B8,$1F,$90
BA96 DEFB $1F,$80,$1F,$80,$0F,$00,$00,$00
BA9E: Mask, 16x24 pixels. Bone item
BA9E DEFB $00,$70,$00,$F8,$07,$FC,$0F,$FC sprite-ba9e
BAA6 DEFB $1F,$FC,$3F,$F8,$3F,$F0,$3F,$E0
BAAE DEFB $3F,$E0,$1F,$E0,$0F,$E0,$07,$E0
BAB6 DEFB $07,$E0,$07,$F8,$07,$FC,$07,$FE
BABE DEFB $0F,$FE,$1F,$FE,$3F,$FC,$3F,$F8
BAC6 DEFB $3F,$D0,$3F,$C0,$1F,$80,$0F,$00
BACE: Sprite, 16x24 pixels. Boot item
BACE DEFB $00,$00,$03,$50,$0E,$AC,$15,$52 sprite-bace
BAD6 DEFB $12,$AE,$11,$52,$18,$A6,$0E,$1E
BADE DEFB $17,$FE,$0F,$FC,$07,$F8,$09,$E4
BAE6 DEFB $0A,$1C,$07,$EC,$00,$FC,$0F,$3C
BAEE DEFB $3F,$DC,$7F,$F8,$7F,$E8,$3F,$E8
BAF6 DEFB $4F,$D0,$70,$70,$1F,$C0,$00,$00
BAFE: Mask, 16x24 pixels. Boot item
BAFE DEFB $03,$F0,$0F,$F8,$1F,$FE,$3F,$FF sprite-bafe
BB06 DEFB $3F,$FF,$3F,$FF,$1F,$FF,$3F,$FF
BB0E DEFB $3F,$FF,$1F,$FE,$0F,$FC,$1F,$FE
BB16 DEFB $1F,$FE,$0F,$FE,$0F,$FE,$3F,$FE
BB1E DEFB $7F,$FE,$FF,$FC,$FF,$FC,$7F,$FC
BB26 DEFB $FF,$F8,$FF,$F8,$7F,$F0,$1F,$C0
BB2E: Sprite, 32x32 pixels. Treasure chest
BB2E DEFB $00,$00,$00,$00,$03,$E0,$00,$00 sprite-bb2e
BB36 DEFB $0F,$F8,$00,$00,$1F,$FE,$00,$00
BB3E DEFB $3F,$FF,$80,$00,$3F,$FF,$E0,$00
BB46 DEFB $7F,$FF,$F8,$00,$7F,$FF,$FE,$00
BB4E DEFB $3F,$FF,$FF,$80,$5F,$FF,$FF,$E0
BB56 DEFB $67,$C7,$FF,$F8,$79,$B9,$FF,$E4
BB5E DEFB $6E,$7E,$FF,$DE,$63,$4E,$FF,$B8
BB66 DEFB $6B,$76,$FF,$72,$6B,$7D,$FE,$E6
BB6E DEFB $6B,$4C,$7E,$CA,$6B,$45,$9D,$96
BB76 DEFB $6B,$55,$E5,$2A,$63,$45,$B8,$56
BB7E DEFB $7B,$65,$8C,$AA,$1F,$6D,$AD,$56
BB86 DEFB $07,$9D,$AC,$AA,$01,$E5,$AD,$54
BB8E DEFB $00,$79,$AC,$A8,$00,$1F,$AD,$50
BB96 DEFB $00,$07,$AC,$A0,$00,$01,$CD,$40
BB9E DEFB $00,$00,$7C,$80,$00,$00,$1D,$00
BBA6 DEFB $00,$00,$06,$00,$00,$00,$00,$00
BBAE: Mask, 32x32 pixels. Treasure chest
BBAE DEFB $03,$E0,$00,$00,$0F,$F8,$00,$00 sprite-bbae
BBB6 DEFB $1F,$FE,$00,$00,$3F,$FF,$80,$00
BBBE DEFB $7F,$FF,$E0,$00,$7F,$FF,$F8,$00
BBC6 DEFB $FF,$FF,$FE,$00,$FF,$FF,$FF,$80
BBCE DEFB $FF,$FF,$FF,$E0,$FF,$FF,$FF,$F8
BBD6 DEFB $FF,$FF,$FF,$FC,$FF,$FF,$FF,$FE
BBDE DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
BBE6 DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
BBEE DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
BBF6 DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
BBFE DEFB $FF,$FF,$FF,$FF,$7F,$FF,$FF,$FF
BC06 DEFB $1F,$FF,$FF,$FF,$07,$FF,$FF,$FF
BC0E DEFB $01,$FF,$FF,$FE,$00,$7F,$FF,$FC
BC16 DEFB $00,$1F,$FF,$F8,$00,$07,$FF,$F0
BC1E DEFB $00,$01,$FF,$C0,$00,$00,$7F,$80
BC26 DEFB $00,$00,$1F,$00,$00,$00,$06,$00
BC2E: Sprite, 16x32 pixels. Rock
BC2E DEFB $00,$00,$00,$00,$00,$60,$00,$E0 sprite-bc2e
BC36 DEFB $00,$E0,$00,$E0,$01,$F0,$03,$B0
BC3E DEFB $03,$B0,$03,$78,$03,$58,$03,$D8
BC46 DEFB $07,$58,$0F,$58,$0F,$5C,$0E,$F4
BC4E DEFB $1E,$F4,$1E,$D4,$1E,$DC,$36,$D4
BC56 DEFB $3A,$CC,$3E,$D6,$3D,$AA,$3F,$86
BC5E DEFB $3D,$AA,$7D,$96,$6D,$2A,$75,$96
BC66 DEFB $3F,$2C,$1F,$58,$0E,$B0,$07,$C0
BC6E: Mask, 16x32 pixels. Rock
BC6E DEFB $00,$00,$00,$60,$00,$F0,$01,$F0 sprite-bc6e
BC76 DEFB $01,$F0,$01,$F0,$03,$F8,$07,$F8
BC7E DEFB $07,$F8,$07,$FC,$07,$FC,$07,$FC
BC86 DEFB $0F,$FC,$1F,$FC,$1F,$FE,$1F,$FE
BC8E DEFB $3F,$FE,$3F,$FE,$3F,$FE,$7F,$FE
BC96 DEFB $7F,$FE,$7F,$FF,$7F,$FF,$7F,$FF
BC9E DEFB $FF,$FF,$FF,$FF,$FF,$FF,$7F,$FF
BCA6 DEFB $7F,$FF,$3F,$FE,$1F,$F8,$0F,$F0
BCAE: Sprite, 32x24 pixels. Plug
BCAE DEFB $00,$00,$00,$00,$00,$03,$C0,$00 sprite-bcae
BCB6 DEFB $00,$0F,$F0,$00,$00,$1F,$F8,$00
BCBE DEFB $00,$3F,$FC,$00,$00,$39,$FC,$00
BCC6 DEFB $00,$30,$FC,$00,$03,$B2,$FD,$C0
BCCE DEFB $1F,$B2,$FD,$F8,$3F,$B9,$FD,$5C
BCD6 DEFB $7F,$DF,$FA,$AE,$7F,$EF,$F5,$5E
BCDE DEFB $5F,$F3,$CA,$BA,$63,$FC,$2F,$C6
BCE6 DEFB $7C,$1F,$F8,$3E,$3F,$E0,$07,$D4
BCEE DEFB $3F,$FF,$FA,$AC,$3F,$FF,$D5,$54
BCF6 DEFB $1F,$FF,$AA,$A8,$1F,$FD,$D5,$58
BCFE DEFB $1F,$EA,$AA,$B8,$07,$D5,$55,$E0
BD06 DEFB $00,$FE,$BF,$00,$00,$07,$E0,$00
BD0E: Mask, 32x24 pixels. Plug
BD0E DEFB $00,$03,$C0,$00,$00,$0F,$F0,$00 sprite-bd0e
BD16 DEFB $00,$1F,$F8,$00,$00,$3F,$FC,$00
BD1E DEFB $00,$7F,$FE,$00,$00,$7F,$FE,$00
BD26 DEFB $03,$FF,$FF,$C0,$1F,$FF,$FF,$F8
BD2E DEFB $3F,$FF,$FF,$FC,$7F,$FF,$FF,$FE
BD36 DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
BD3E DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
BD46 DEFB $FF,$FF,$FF,$FF,$7F,$FF,$FF,$FE
BD4E DEFB $7F,$FF,$FF,$FE,$7F,$FF,$FF,$FE
BD56 DEFB $3F,$FF,$FF,$FC,$3F,$FF,$FF,$FC
BD5E DEFB $3F,$FF,$FF,$FC,$1F,$FF,$FF,$F8
BD66 DEFB $07,$FF,$FF,$E0,$00,$FF,$FF,$00
BD6E: Sprite, 16x16 pixels. Seaweed sprig
BD6E DEFB $00,$00,$30,$0C,$69,$9E,$6B,$DA sprite-bd6e
BD76 DEFB $33,$CC,$17,$94,$34,$78,$31,$E0
BD7E DEFB $19,$80,$1F,$F0,$06,$6C,$0F,$16
BD86 DEFB $1D,$9E,$0C,$CC,$00,$E0,$00,$70
BD8E: Mask, 16x16 pixels. Seaweed sprig
BD8E DEFB $30,$0C,$79,$9F,$FF,$FF,$FF,$FF sprite-bd8e
BD96 DEFB $7F,$FE,$3F,$FE,$7F,$FC,$7F,$F0
BD9E DEFB $3F,$F0,$3F,$FC,$0F,$FF,$1F,$FF
BDA6 DEFB $1F,$FF,$3F,$FE,$3F,$FC,$0C,$F8
BDAE: Sprite, 32x16 pixels. Whirlpool, animation phase 1
BDAE DEFB $00,$00,$00,$00,$00,$1E,$00,$E0 sprite-bdae
BDB6 DEFB $00,$C0,$7C,$18,$03,$1E,$0F,$00
BDBE DEFB $00,$77,$C3,$C2,$11,$CE,$39,$E9
BDC6 DEFB $23,$30,$07,$E5,$06,$E4,$11,$C4
BDCE DEFB $44,$E8,$A9,$90,$41,$F1,$47,$B1
BDD6 DEFB $4B,$FE,$3E,$61,$03,$CF,$F9,$C6
BDDE DEFB $11,$E7,$C7,$08,$08,$F1,$F8,$30
BDE6 DEFB $06,$3C,$00,$40,$01,$87,$1E,$00
BDEE: Sprite, 32x16 pixels. Whirlpool, animation phase 2
BDEE DEFB $00,$00,$70,$00,$00,$00,$07,$00 sprite-bdee
BDF6 DEFB $00,$03,$E0,$20,$06,$5E,$3C,$08
BDFE DEFB $31,$81,$C6,$12,$4C,$7E,$39,$49
BE06 DEFB $93,$B0,$07,$60,$17,$E0,$43,$B0
BE0E DEFB $06,$E0,$13,$B4,$16,$F0,$87,$F4
BE16 DEFB $93,$7E,$3E,$E8,$89,$4F,$FF,$08
BE1E DEFB $41,$B1,$F8,$71,$22,$1E,$00,$86
BE26 DEFB $08,$83,$E0,$28,$00,$00,$00,$00
BE2E: Sprite, 24x32 pixels. Plant/coral
BE2E DEFB $00,$00,$00,$38,$3C,$00,$7C,$7E sprite-be2e
BE36 DEFB $00,$5C,$7E,$00,$60,$6F,$38,$7C
BE3E DEFB $37,$7C,$3E,$06,$66,$1F,$80,$DE
BE46 DEFB $0F,$E1,$DE,$01,$F3,$CC,$1E,$F7
BE4E DEFB $B0,$3F,$6F,$78,$37,$6F,$18,$73
BE56 DEFB $5E,$78,$67,$5E,$F0,$6E,$DE,$E8
BE5E DEFB $0E,$BF,$78,$0E,$B9,$F8,$0F,$FA
BE66 DEFB $F0,$37,$FF,$C8,$7B,$FE,$3C,$7E
BE6E DEFB $D1,$AC,$3F,$2D,$58,$0F,$FA,$C6
BE76 DEFB $73,$D6,$3E,$7C,$71,$FA,$7F,$8F
BE7E DEFB $D6,$3F,$FE,$AC,$1F,$D5,$58,$0F
BE86 DEFB $AA,$F0,$03,$D7,$C0,$00,$7E,$00
BE8E: Mask, 24x32 pixels. Plant/coral
BE8E DEFB $38,$3C,$00,$7C,$7E,$00,$FE,$FF sprite-be8e
BE96 DEFB $00,$FE,$FF,$38,$FC,$FF,$FC,$FE
BE9E DEFB $7F,$FE,$7F,$BF,$FF,$3F,$CF,$FF
BEA6 DEFB $1F,$F7,$FF,$1F,$FF,$FE,$3F,$FF
BEAE DEFB $FC,$7F,$FF,$FC,$77,$FF,$FC,$F3
BEB6 DEFB $FF,$FC,$E7,$FF,$F8,$EF,$FF,$FC
BEBE DEFB $7F,$FF,$FC,$1F,$FF,$FC,$3F,$FF
BEC6 DEFB $F8,$7F,$FF,$FC,$FF,$FF,$FE,$FF
BECE DEFB $FF,$FE,$7F,$FF,$FC,$7F,$FF,$FF
BED6 DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
BEDE DEFB $FE,$7F,$FF,$FE,$3F,$FF,$FC,$1F
BEE6 DEFB $FF,$F8,$0F,$FF,$F0,$03,$FF,$C0
BEEE: Sprite, 24x32 pixels. Plant/coral
BEEE DEFB $00,$00,$00,$1C,$00,$3C,$3E,$38 sprite-beee
BEF6 DEFB $7E,$36,$7C,$7E,$32,$FC,$DE,$3C
BEFE DEFB $F6,$DC,$1E,$6E,$E0,$0F,$85,$C0
BF06 DEFB $01,$E3,$C0,$3E,$F7,$A0,$7E,$EF
BF0E DEFB $70,$77,$6F,$30,$77,$5F,$70,$73
BF16 DEFB $5E,$E0,$27,$5E,$D0,$0E,$DE,$F8
BF1E DEFB $1E,$DF,$78,$1F,$DD,$F8,$0F,$BA
BF26 DEFB $F0,$37,$FF,$C8,$7B,$FE,$3C,$7E
BF2E DEFB $D1,$AC,$3F,$2D,$58,$0F,$FA,$C6
BF36 DEFB $73,$D6,$3E,$7C,$71,$FA,$7F,$8F
BF3E DEFB $D6,$3F,$FE,$AC,$1F,$D5,$58,$0F
BF46 DEFB $AA,$F0,$03,$D7,$C0,$00,$7E,$00
BF4E: Mask, 24x32 pixels. Plant/coral
BF4E DEFB $1C,$00,$3C,$3E,$38,$7E,$7F,$7C sprite-bf4e
BF56 DEFB $7F,$7F,$FE,$FF,$7F,$FF,$FF,$7F
BF5E DEFB $FF,$FE,$3F,$FF,$FC,$1F,$FF,$E0
BF66 DEFB $3F,$FF,$E0,$7F,$FF,$F0,$FF,$FF
BF6E DEFB $F8,$FF,$FF,$F8,$FF,$FF,$F8,$FF
BF76 DEFB $FF,$F0,$7F,$FF,$F8,$3F,$FF,$FC
BF7E DEFB $3F,$FF,$FC,$1F,$FF,$FC,$3F,$FF
BF86 DEFB $F8,$7F,$FF,$FC,$FF,$FF,$FE,$FF
BF8E DEFB $FF,$FE,$7F,$FF,$FC,$7F,$FF,$FF
BF96 DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
BF9E DEFB $FF,$7F,$FF,$FE,$3F,$FF,$FC,$1F
BFA6 DEFB $FF,$F8,$0F,$FF,$F0,$03,$FF,$C0
BFAE: Sprite, 32x16 pixels. Closed clam shell
BFAE DEFB $00,$00,$00,$00,$00,$07,$3C,$00 sprite-bfae
BFB6 DEFB $00,$3F,$E2,$00,$00,$FF,$C1,$C0
BFBE DEFB $01,$FF,$A8,$E0,$03,$DF,$95,$50
BFC6 DEFB $0F,$7F,$AA,$AC,$1E,$77,$55,$56
BFCE DEFB $3F,$FC,$2A,$AA,$7D,$BE,$55,$56
BFD6 DEFB $73,$5F,$2A,$AC,$32,$BF,$8D,$54
BFDE DEFB $19,$5F,$F6,$B8,$06,$B7,$BF,$F0
BFE6 DEFB $03,$7D,$7F,$00,$00,$2F,$80,$00
BFEE: Mask, 32x16 pixels. Closed clam shell
BFEE DEFB $00,$07,$3C,$00,$00,$3F,$FE,$00 sprite-bfee
BFF6 DEFB $00,$FF,$FF,$C0,$01,$FF,$FF,$E0
BFFE DEFB $03,$FF,$FF,$F0,$0F,$FF,$FF,$FC
C006 DEFB $1F,$FF,$FF,$FE,$3F,$FF,$FF,$FF
C00E DEFB $7F,$FF,$FF,$FF,$FF,$FF,$FF,$FF
C016 DEFB $FF,$FF,$FF,$FE,$7F,$FF,$FF,$FC
C01E DEFB $3F,$FF,$FF,$FC,$0F,$FF,$FF,$F8
C026 DEFB $07,$FF,$FF,$F0,$03,$FF,$FF,$00
C02E: Sprite, 32x32 pixels. Open clam shell
C02E DEFB $00,$7C,$00,$00,$01,$FF,$9E,$00 sprite-c02e
C036 DEFB $03,$E7,$FF,$00,$1F,$98,$23,$80
C03E DEFB $3C,$7D,$51,$80,$71,$7F,$AE,$F0
C046 DEFB $6A,$B7,$D5,$18,$65,$6B,$FE,$A8
C04E DEFB $6A,$B5,$FF,$5C,$35,$6A,$FF,$AC
C056 DEFB $32,$F5,$5F,$58,$19,$7A,$AF,$A8
C05E DEFB $0C,$B5,$55,$58,$0D,$5A,$AA,$B0
C066 DEFB $1E,$BD,$55,$60,$1D,$5A,$BF,$C0
C06E DEFB $1E,$A5,$F3,$80,$07,$E0,$F6,$00
C076 DEFB $00,$DF,$8F,$E0,$07,$30,$73,$B0
C07E DEFB $0F,$EF,$F9,$58,$35,$B8,$CE,$AC
C086 DEFB $4B,$7A,$B3,$56,$55,$77,$39,$26
C08E DEFB $63,$76,$09,$9A,$39,$70,$E3,$A6
C096 DEFB $3D,$BB,$FF,$4E,$1F,$3E,$3C,$3C
C09E DEFB $0F,$E1,$C3,$F8,$03,$FD,$FF,$C0
C0A6 DEFB $00,$3F,$7C,$00,$00,$00,$00,$00
C0AE: Mask, 32x32 pixels. Open clam shell
C0AE DEFB $00,$FF,$9C,$00,$03,$FF,$FE,$00 sprite-c0ae
C0B6 DEFB $1F,$FF,$FF,$00,$3F,$FF,$FF,$80
C0BE DEFB $7F,$FF,$FF,$C0,$FF,$FF,$FF,$F0
C0C6 DEFB $FF,$FF,$FF,$F8,$FF,$FF,$FF,$FC
C0CE DEFB $FF,$FF,$FF,$FC,$FF,$FF,$FF,$FE
C0D6 DEFB $7F,$FF,$FF,$FE,$7F,$FF,$FF,$FC
C0DE DEFB $3F,$FF,$FF,$FC,$1F,$FF,$FF,$FC
C0E6 DEFB $1F,$FF,$FF,$F8,$3F,$FF,$FF,$F0
C0EE DEFB $3F,$FF,$FF,$E0,$3F,$FF,$FF,$C0
C0F6 DEFB $1F,$FF,$FF,$E0,$07,$FF,$FF,$F0
C0FE DEFB $0F,$FF,$FF,$F8,$3F,$FF,$FF,$FC
C106 DEFB $7F,$FF,$FF,$FE,$FF,$FF,$FF,$FF
C10E DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
C116 DEFB $7F,$FF,$FF,$FF,$3F,$FF,$FF,$FF
C11E DEFB $3F,$FF,$FF,$FE,$1F,$FF,$FF,$FC
C126 DEFB $0F,$FF,$FF,$F8,$03,$FF,$FF,$C0
C12E: Sprite, 16x40 pixels. Seaweed
C12E DEFB $00,$00,$04,$00,$0C,$00,$0C,$00 sprite-c12e
C136 DEFB $3C,$50,$58,$78,$38,$32,$30,$34
C13E DEFB $30,$3C,$38,$F4,$30,$70,$18,$32
C146 DEFB $0C,$62,$0E,$6A,$06,$6E,$13,$64
C14E DEFB $0F,$DC,$01,$F0,$00,$E0,$0D,$F0
C156 DEFB $0C,$30,$06,$70,$06,$60,$24,$48
C15E DEFB $7C,$DE,$58,$B2,$50,$60,$21,$C0
C166 DEFB $19,$10,$1B,$70,$35,$34,$36,$3C
C16E DEFB $76,$70,$6E,$60,$78,$60,$70,$E0
C176 DEFB $30,$E0,$38,$C0,$18,$00,$00,$00
C17E: Mask, 16x40 pixels. Seaweed
C17E DEFB $04,$00,$0E,$00,$1E,$00,$1E,$50 sprite-c17e
C186 DEFB $7E,$F8,$7C,$FC,$78,$7A,$78,$7E
C18E DEFB $78,$FE,$7D,$FE,$78,$F4,$3C,$72
C196 DEFB $1E,$F3,$1F,$EF,$3F,$FF,$3F,$FE
C19E DEFB $1F,$FE,$0F,$FC,$0D,$F0,$1F,$F8
C1A6 DEFB $1E,$F8,$0F,$78,$27,$78,$7E,$7E
C1AE DEFB $FC,$FF,$FC,$FF,$F9,$FA,$7B,$F8
C1B6 DEFB $3F,$F8,$3F,$F8,$77,$F8,$77,$F8
C1BE DEFB $F7,$F8,$EF,$F0,$FE,$F6,$F9,$FE
C1C6 DEFB $79,$F8,$7D,$E0,$3C,$00,$18,$00
C1CE: Sprite, 16x16 pixels. Small rock
C1CE DEFB $00,$00,$00,$00,$01,$80,$07,$E0 sprite-c1ce
C1D6 DEFB $0F,$B0,$0F,$A8,$1F,$54,$3F,$AC
C1DE DEFB $37,$54,$0F,$AE,$33,$96,$7E,$6E
C1E6 DEFB $7C,$BE,$79,$5C,$1A,$B8,$07,$E0
C1EE: Mask, 16x16 pixels. Small rock
C1EE DEFB $00,$00,$01,$80,$07,$E0,$0F,$F0 sprite-c1ee
C1F6 DEFB $1F,$F8,$1F,$FC,$3F,$FE,$7F,$FE
C1FE DEFB $7F,$FE,$3F,$FF,$7F,$FF,$FF,$FF
C206 DEFB $FF,$FF,$FF,$FE,$7F,$FC,$1F,$F8
C20E: Sprite, 8x24 pixels. Small debris/particle
C20E DEFB $02,$45,$E2,$40,$08,$14,$08,$22 sprite-c20e
C216 DEFB $57,$22,$00,$00,$00,$00,$00,$00
C21E DEFB $00,$00,$00,$00,$0C,$16,$1E,$0C
C226: Sprite, 8x24 pixels. Small debris/particle
C226 DEFB $00,$11,$82,$00,$28,$00,$08,$20 sprite-c226
C22E DEFB $02,$00,$00,$00,$00,$00,$00,$00
C236 DEFB $38,$7C,$5C,$7C,$38,$00,$00,$00
C23E: Sprite, 8x24 pixels. Small debris/particle
C23E DEFB $00,$02,$00,$10,$00,$00,$00,$08 sprite-c23e
C246 DEFB $00,$00,$00,$1C,$3E,$77,$6F,$6F
C24E DEFB $3E,$1C,$00,$00,$00,$00,$00,$00
C256: Sprite, 8x24 pixels. Small debris/particle
C256 DEFB $00,$00,$00,$00,$00,$00,$00,$3C sprite-c256
C25E DEFB $7E,$E7,$CF,$DF,$DF,$FF,$7E,$3C
C266 DEFB $00,$00,$00,$00,$00,$00,$00,$00
C26E: Sprite, 16x16 pixels. Disc/wheel
C26E DEFB $00,$00,$07,$E0,$0E,$B8,$15,$54 sprite-c26e
C276 DEFB $2A,$AA,$35,$56,$6A,$AB,$55,$55
C27E DEFB $6A,$AB,$55,$55,$6A,$AB,$35,$56
C286 DEFB $2A,$AA,$15,$54,$0E,$B8,$07,$E0
C28E: Sprite, 16x16 pixels. Disc/wheel
C28E DEFB $00,$00,$07,$E0,$1E,$B8,$35,$54 sprite-c28e
C296 DEFB $6A,$AA,$55,$57,$AA,$AB,$D5,$55
C29E DEFB $AA,$AB,$D5,$55,$6A,$AA,$55,$56
C2A6 DEFB $2A,$AC,$1D,$58,$07,$E0,$00,$00
C2AE: Sprite, 16x16 pixels. Disc/wheel
C2AE DEFB $03,$C0,$0E,$F0,$15,$58,$2A,$AC sprite-c2ae
C2B6 DEFB $35,$54,$6A,$AE,$55,$56,$6A,$AA
C2BE DEFB $55,$56,$6A,$AA,$55,$56,$2A,$AC
C2C6 DEFB $35,$54,$1A,$A8,$0D,$70,$03,$C0
C2CE: Sprite, 16x16 pixels. Disc/wheel
C2CE DEFB $00,$00,$00,$00,$00,$00,$00,$00 sprite-c2ce
C2D6 DEFB $00,$00,$00,$00,$00,$00,$00,$00
C2DE DEFB $00,$00,$03,$E0,$0E,$B8,$15,$54
C2E6 DEFB $2A,$AA,$1D,$5C,$0E,$B8,$01,$C0
C2EE: Sprite, 16x16 pixels. Disc/wheel
C2EE DEFB $00,$00,$00,$00,$00,$00,$00,$00 sprite-c2ee
C2F6 DEFB $00,$00,$00,$00,$03,$E0,$0E,$B8
C2FE DEFB $15,$54,$2A,$AA,$35,$56,$6A,$AB
C306 DEFB $55,$55,$3A,$AE,$0F,$78,$01,$C0
C30E: Sprite, 16x16 pixels. Disc/wheel
C30E DEFB $00,$00,$00,$00,$07,$E0,$0E,$B8 sprite-c30e
C316 DEFB $15,$54,$2A,$AA,$35,$56,$6A,$AB
C31E DEFB $55,$55,$6A,$AB,$55,$55,$6A,$AB
C326 DEFB $35,$5E,$1A,$AC,$0F,$78,$03,$E0
C32E: Sprite, 16x16 pixels. Small stars
C32E DEFB $00,$00,$00,$08,$00,$1C,$02,$08 sprite-c32e
C336 DEFB $17,$00,$2A,$40,$10,$A4,$00,$4E
C33E DEFB $08,$04,$1C,$10,$08,$38,$01,$10
C346 DEFB $02,$80,$01,$00,$00,$00,$00,$00
C34E: Sprite, 16x16 pixels. Small stars
C34E DEFB $00,$80,$11,$C0,$38,$80,$10,$40 sprite-c34e
C356 DEFB $00,$E8,$02,$54,$25,$08,$72,$00
C35E DEFB $20,$10,$08,$38,$1C,$10,$08,$00
C366 DEFB $00,$00,$00,$00,$00,$00,$00,$00
C36E: Sprite, 16x16 pixels. Small stars disappearing
C36E DEFB $00,$00,$00,$00,$04,$20,$00,$00 sprite-c36e
C376 DEFB $00,$00,$11,$00,$00,$10,$00,$40
C37E DEFB $08,$00,$00,$08,$04,$80,$00,$10
C386 DEFB $00,$80,$00,$00,$00,$00,$00,$00
C38E: Sprite $68, 16x8 pixels. Bubble source object 957C, animation frame 1
C38E DEFB $01,$10,$40,$38,$E0,$7C,$44,$3A sprite-c38e
C396 DEFB $1A,$15,$11,$22,$4A,$70,$04,$20
C39E: Sprite $69, 16x8 pixels. Bubble source object 957C, animation frame 2
C39E DEFB $04,$20,$0E,$50,$44,$88,$A8,$50 sprite-c39e
C3A6 DEFB $5C,$20,$3E,$02,$1C,$07,$08,$82
C3AE: Sprite, 32x32 pixels. Urn/well with seaweed
C3AE DEFB $00,$00,$00,$00,$00,$1E,$00,$00 sprite-c3ae
C3B6 DEFB $05,$FF,$FC,$00,$1F,$FF,$FF,$E0
C3BE DEFB $3F,$FF,$FF,$F0,$3F,$FF,$FF,$FC
C3C6 DEFB $7F,$FF,$FF,$FC,$7F,$FF,$FF,$F8
C3CE DEFB $3F,$FF,$FF,$FC,$01,$FF,$FF,$FC
C3D6 DEFB $10,$0F,$E0,$F0,$15,$C0,$1D,$04
C3DE DEFB $18,$AD,$1C,$A8,$0D,$5C,$1B,$30
C3E6 DEFB $09,$38,$B5,$68,$05,$58,$2D,$58
C3EE DEFB $02,$BA,$36,$68,$07,$D8,$4E,$58
C3F6 DEFB $0D,$A8,$94,$30,$0E,$88,$A8,$50
C3FE DEFB $0D,$50,$D0,$B0,$0A,$51,$A4,$60
C406 DEFB $0D,$45,$44,$C0,$06,$41,$03,$E0
C40E DEFB $03,$61,$23,$90,$03,$20,$4E,$50
C416 DEFB $01,$24,$0C,$B0,$01,$21,$18,$60
C41E DEFB $00,$20,$19,$20,$00,$40,$70,$C0
C426 DEFB $00,$41,$E1,$40,$00,$41,$00,$00
C42E: Mask, 32x32 pixels. Urn/well with seaweed
C42E DEFB $00,$1E,$00,$00,$05,$FF,$FC,$00 sprite-c42e
C436 DEFB $1F,$FF,$FF,$E0,$3F,$FF,$FF,$F0
C43E DEFB $7F,$FF,$FF,$FC,$7F,$FF,$FF,$FE
C446 DEFB $FF,$FF,$FF,$FE,$FF,$FF,$FF,$FC
C44E DEFB $7F,$FF,$FF,$FE,$7F,$FF,$FF,$FE
C456 DEFB $3F,$FF,$FF,$FE,$3F,$FF,$FF,$FE
C45E DEFB $3F,$FF,$FF,$FC,$1F,$FF,$FF,$FC
C466 DEFB $1F,$FF,$FF,$FC,$0F,$FF,$FF,$FC
C46E DEFB $07,$FF,$FF,$FC,$0F,$FF,$FF,$FC
C476 DEFB $1F,$FF,$FF,$F8,$1F,$FF,$FF,$F8
C47E DEFB $1F,$FF,$FF,$F8,$1F,$FF,$FF,$F0
C486 DEFB $1F,$FF,$FF,$E0,$0F,$FF,$FF,$F0
C48E DEFB $07,$FF,$FF,$F8,$03,$FF,$FF,$F8
C496 DEFB $03,$FF,$FF,$F8,$03,$FF,$FF,$F0
C49E DEFB $01,$FF,$FF,$E0,$01,$FF,$FF,$E0
C4A6 DEFB $01,$FF,$FF,$E0,$01,$FF,$FF,$80
C4AE: Sprite, 32x32 pixels. Clam shell with pearl
C4AE DEFB $00,$00,$00,$00,$00,$7C,$00,$00 sprite-c4ae
C4B6 DEFB $01,$FF,$9E,$00,$03,$E7,$FF,$00
C4BE DEFB $1F,$98,$23,$80,$3C,$7D,$51,$80
C4C6 DEFB $71,$7F,$AE,$F0,$6A,$B7,$D5,$18
C4CE DEFB $65,$6B,$FE,$A8,$6A,$B5,$FF,$5C
C4D6 DEFB $35,$6A,$FF,$AC,$32,$F5,$7F,$58
C4DE DEFB $19,$78,$1C,$A8,$0C,$E3,$E6,$D8
C4E6 DEFB $0D,$CF,$F9,$B0,$1E,$9F,$FC,$E0
C4EE DEFB $1D,$BC,$7E,$C0,$1F,$BC,$FE,$C0
C4F6 DEFB $07,$78,$FF,$40,$01,$79,$FF,$60
C4FE DEFB $07,$79,$FF,$30,$0F,$7F,$FF,$58
C506 DEFB $35,$7F,$FF,$2C,$4A,$BF,$FE,$56
C50E DEFB $55,$BF,$FE,$A6,$62,$9F,$FD,$DA
C516 DEFB $39,$4F,$FA,$A6,$3D,$F1,$C7,$4E
C51E DEFB $1E,$1E,$3C,$BC,$0F,$E1,$C3,$F8
C526 DEFB $03,$FD,$FF,$C0,$00,$3F,$7C,$00
C52E: Sprite, 16x24 pixels. Empty/unused frame
C52E DEFB $00,$00,$00,$00,$00,$00,$00,$00 sprite-c52e
C536 DEFB $00,$00,$00,$00,$00,$00,$00,$00
C53E DEFB $00,$00,$00,$00,$00,$00,$00,$00
C546 DEFB $00,$00,$00,$00,$00,$00,$00,$00
C54E DEFB $00,$00,$00,$00,$00,$00,$00,$00
C556 DEFB $00,$00,$00,$00,$00,$00,$00,$00
C55E: Sprite, 16x24 pixels. Oil can (anti-rust oil, refills Sweevo's suit)
C55E DEFB $00,$00,$0F,$80,$2F,$40,$60,$C0 sprite-c55e
C566 DEFB $60,$C0,$00,$C0,$1E,$D0,$2E,$D8
C56E DEFB $37,$3C,$3B,$FC,$28,$02,$2B,$FE
C576 DEFB $2A,$8A,$2A,$AA,$2A,$8A,$2A,$FA
C57E DEFB $2A,$DA,$2A,$DA,$2A,$FA,$2A,$BA
C586 DEFB $1A,$BA,$0A,$8A,$07,$FE,$00,$00
C58E: Mask, 16x24 pixels. Oil can
C58E DEFB $0F,$80,$1F,$C0,$7F,$E0,$FF,$E0 sprite-c58e
C596 DEFB $F1,$E0,$FF,$F0,$3F,$F8,$7F,$FC
C59E DEFB $7F,$FE,$7F,$FE,$7F,$FF,$7F,$FF
C5A6 DEFB $7F,$FF,$7F,$FF,$7F,$FF,$7F,$FF
C5AE DEFB $7F,$FF,$7F,$FF,$7F,$FF,$7F,$FF
C5B6 DEFB $3F,$FF,$1F,$FF,$0F,$FF,$07,$FE
C5BE: Sprite, 16x24 pixels. Shell item
C5BE DEFB $00,$00,$00,$00,$00,$C0,$00,$E0 sprite-c5be
C5C6 DEFB $01,$50,$03,$B0,$03,$40,$01,$F0
C5CE DEFB $06,$D8,$0F,$78,$0D,$80,$07,$F0
C5D6 DEFB $0B,$98,$1C,$F8,$17,$00,$0D,$F0
C5DE DEFB $07,$98,$19,$F8,$3E,$F0,$37,$0C
C5E6 DEFB $3D,$FC,$1F,$98,$07,$F0,$00,$00
C5EE: Mask, 16x24 pixels. Shell item
C5EE DEFB $00,$00,$00,$C0,$01,$E0,$01,$F0 sprite-c5ee
C5F6 DEFB $03,$F8,$07,$F8,$03,$E0,$07,$F8
C5FE DEFB $0F,$FC,$1F,$FC,$1F,$F8,$0F,$F8
C606 DEFB $1F,$FC,$3F,$FC,$3F,$F8,$1F,$F8
C60E DEFB $1F,$FC,$3F,$FC,$7F,$F8,$7F,$FC
C616 DEFB $7F,$FC,$3F,$FC,$1F,$F8,$0F,$F0
C61E: Sprite, 16x24 pixels. Harpoon item
C61E DEFB $00,$00,$03,$00,$07,$80,$06,$C0 sprite-c61e
C626 DEFB $0C,$60,$0D,$F0,$1F,$F8,$1E,$7C
C62E DEFB $3D,$BC,$3B,$C0,$7A,$40,$77,$C0
C636 DEFB $67,$40,$07,$E0,$0F,$F0,$0E,$78
C63E DEFB $1D,$BC,$1D,$5C,$3B,$C0,$3B,$40
C646 DEFB $7B,$C0,$73,$C0,$03,$00,$00,$00
C64E: Mask, 16x24 pixels. Harpoon item
C64E DEFB $07,$00,$07,$80,$0F,$C0,$0F,$E0 sprite-c64e
C656 DEFB $1F,$F0,$1F,$F8,$3F,$FC,$3F,$FE
C65E DEFB $7F,$FE,$7F,$FC,$FF,$E0,$FF,$E0
C666 DEFB $FF,$E0,$6F,$F0,$1F,$F8,$1F,$FC
C66E DEFB $3F,$FE,$3F,$FE,$7F,$FC,$7F,$E0
C676 DEFB $FF,$E0,$FF,$E0,$77,$C0,$03,$00
C67E: Sprite, 16x24 pixels. Spoon item (weapon; kills Jellyfish)
C67E DEFB $00,$00,$01,$C0,$03,$E0,$05,$70 sprite-c67e
C686 DEFB $06,$F0,$0D,$78,$0A,$F8,$0D,$78
C68E DEFB $0E,$F8,$05,$70,$06,$B0,$03,$60
C696 DEFB $00,$A0,$00,$E0,$00,$60,$00,$E0
C69E DEFB $00,$C0,$01,$C0,$03,$C0,$07,$80
C6A6 DEFB $0D,$80,$0F,$00,$0F,$00,$06,$00
C6AE: Mask, 16x24 pixels. Spoon item
C6AE DEFB $01,$C0,$03,$E0,$07,$F0,$0F,$F8 sprite-c6ae
C6B6 DEFB $0F,$F8,$1F,$FC,$1F,$FC,$1F,$FC
C6BE DEFB $1F,$FC,$0F,$F8,$0F,$F8,$07,$F0
C6C6 DEFB $03,$F0,$00,$F0,$00,$F0,$01,$F0
C6CE DEFB $03,$E0,$07,$E0,$0F,$C0,$1F,$C0
C6D6 DEFB $1F,$80,$1F,$80,$0F,$00,$06,$00
C6DE: Sprite, 16x24 pixels. Ball or pearl
C6DE DEFB $00,$00,$00,$00,$00,$00,$00,$00 sprite-c6de
C6E6 DEFB $00,$00,$00,$00,$00,$00,$00,$00
C6EE DEFB $03,$E0,$0F,$F8,$1F,$FC,$3C,$7E
C6F6 DEFB $3C,$FE,$78,$FF,$79,$FF,$79,$FF
C6FE DEFB $7F,$FF,$7F,$FF,$3F,$FE,$3F,$FE
C706 DEFB $1F,$FC,$0F,$F8,$03,$E0,$00,$00
C70E: Mask, 16x24 pixels. Ball or pearl
C70E DEFB $00,$00,$00,$00,$00,$00,$00,$00 sprite-c70e
C716 DEFB $00,$00,$00,$00,$00,$00,$03,$E0
C71E DEFB $0F,$F8,$1F,$FC,$3F,$FE,$7F,$FF
C726 DEFB $7F,$FF,$FF,$FF,$FF,$FF,$FF,$FF
C72E DEFB $FF,$FF,$FF,$FF,$7F,$FF,$7F,$FF
C736 DEFB $3F,$FE,$1F,$FC,$0F,$F8,$07,$F0
C73E: Sprite, 16x24 pixels. Item icon, unidentified
C73E DEFB $00,$00,$00,$08,$00,$0C,$00,$1E sprite-c73e
C746 DEFB $00,$1F,$10,$1F,$18,$3C,$3C,$32
C74E DEFB $3E,$2E,$3F,$0E,$78,$0E,$64,$0E
C756 DEFB $5C,$0E,$1C,$1E,$1C,$1C,$1E,$3C
C75E DEFB $0F,$B8,$0F,$D8,$07,$D0,$01,$F0
C766 DEFB $00,$70,$00,$F0,$00,$F0,$00,$60
C76E: Mask, 16x24 pixels. Item icon, unidentified
C76E DEFB $00,$08,$00,$1C,$00,$1E,$00,$3F sprite-c76e
C776 DEFB $10,$3F,$38,$3F,$3C,$7F,$7E,$7F
C77E DEFB $7F,$7F,$7F,$BF,$FF,$1F,$FE,$1F
C786 DEFB $FE,$1F,$7E,$3F,$3E,$3E,$3F,$BE
C78E DEFB $1F,$FC,$1F,$F8,$0F,$F8,$07,$F8
C796 DEFB $01,$F8,$01,$F8,$01,$F8,$00,$F0
C79E: Sprite, 16x24 pixels. Item icon, unidentified
C79E DEFB $00,$00,$03,$80,$0F,$E0,$19,$30 sprite-c79e
C7A6 DEFB $10,$10,$10,$10,$10,$10,$11,$10
C7AE DEFB $13,$90,$1B,$B0,$0B,$A0,$03,$80
C7B6 DEFB $01,$00,$07,$C0,$0D,$60,$16,$D0
C7BE DEFB $3B,$B8,$6D,$6C,$56,$D4,$2D,$68
C7C6 DEFB $3B,$B8,$16,$D0,$07,$C0,$00,$00
C7CE: Mask, 16x24 pixels. Item icon, unidentified
C7CE DEFB $03,$80,$0F,$E0,$1F,$F0,$3F,$F8 sprite-c7ce
C7D6 DEFB $39,$38,$38,$38,$39,$38,$3B,$B8
C7DE DEFB $3B,$B8,$3F,$F8,$1F,$F0,$0F,$E0
C7E6 DEFB $03,$80,$0F,$E0,$1F,$F0,$3F,$F8
C7EE DEFB $7F,$FC,$FF,$FE,$FF,$FE,$7F,$FC
C7F6 DEFB $7F,$FC,$3F,$F8,$3F,$F8,$0F,$E0
C7FE: Sprite, 40x24 pixels. Wall
C7FE DEFB $88,$50,$00,$00,$0C,$02,$B8,$00 sprite-c7fe
C806 DEFB $00,$06,$10,$58,$00,$01,$13,$02
C80E DEFB $B0,$00,$80,$4A,$05,$60,$00,$09
C816 DEFB $35,$92,$C0,$00,$00,$46,$00,$60
C81E DEFB $00,$00,$29,$04,$A0,$00,$24,$8A
C826 DEFB $00,$70,$00,$00,$45,$01,$38,$00
C82E DEFB $01,$92,$04,$5C,$00,$10,$49,$01
C836 DEFB $2C,$00,$01,$42,$01,$56,$00,$00
C83E DEFB $B9,$00,$8A,$00,$11,$2A,$00,$26
C846 DEFB $00,$02,$90,$20,$0A,$00,$04,$95
C84E DEFB $00,$27,$00,$02,$48,$00,$89,$00
C856 DEFB $45,$55,$01,$07,$80,$00,$A8,$00
C85E DEFB $0B,$80,$02,$0B,$00,$25,$00,$01
C866 DEFB $92,$00,$09,$00,$02,$92,$00,$07
C86E DEFB $00,$01,$0E,$00,$0A,$00,$20,$54
C876: Sprite, 40x96 pixels. Wall
C876 DEFB $00,$36,$00,$00,$4C,$81,$0B,$80 sprite-c876
C87E DEFB $01,$14,$00,$04,$C0,$12,$8C,$00
C886 DEFB $33,$70,$00,$16,$80,$04,$B0,$00
C88E DEFB $4A,$00,$12,$5C,$00,$06,$02,$05
C896 DEFB $34,$22,$2A,$00,$20,$CE,$00,$06
C89E DEFB $20,$06,$2A,$01,$2E,$00,$11,$4F
C8A6 DEFB $00,$4C,$00,$08,$33,$00,$2C,$00
C8AE DEFB $01,$0D,$00,$48,$10,$10,$93,$82
C8B6 DEFB $18,$80,$02,$24,$80,$08,$10,$04
C8BE DEFB $8A,$81,$5C,$00,$01,$15,$80,$14
C8C6 DEFB $00,$0A,$2B,$00,$4C,$00,$04,$56
C8CE DEFB $00,$17,$80,$8A,$3E,$08,$53,$00
C8D6 DEFB $01,$48,$01,$29,$00,$00,$28,$00
C8DE DEFB $02,$00,$05,$58,$40,$15,$00,$00
C8E6 DEFB $30,$11,$24,$00,$00,$50,$00,$05
C8EE DEFB $10,$08,$B0,$04,$88,$00,$00,$60
C8F6 DEFB $82,$23,$00,$00,$A0,$00,$88,$00
C8FE DEFB $04,$60,$09,$22,$00,$20,$C0,$20
C906 DEFB $10,$00,$00,$40,$02,$A5,$00,$04
C90E DEFB $E0,$20,$11,$00,$00,$60,$02,$45
C916 DEFB $30,$04,$A0,$00,$51,$30,$00,$60
C91E DEFB $09,$15,$18,$01,$30,$22,$44,$08
C926 DEFB $00,$50,$09,$11,$18,$04,$38,$02
C92E DEFB $48,$0C,$21,$18,$00,$95,$14,$00
C936 DEFB $2C,$04,$08,$0C,$01,$14,$01,$45
C93E DEFB $0B,$C4,$0C,$00,$92,$00,$C0,$56
C946 DEFB $02,$44,$05,$79,$0B,$01,$10,$00
C94E DEFB $A8,$05,$82,$42,$09,$5C,$52,$80
C956 DEFB $84,$00,$AC,$01,$A0,$0A,$02,$14
C95E DEFB $06,$80,$95,$00,$AE,$21,$C2,$0A
C966 DEFB $00,$16,$02,$40,$10,$00,$AA,$01
C96E DEFB $40,$85,$02,$8E,$14,$C0,$08,$00
C976 DEFB $92,$01,$60,$02,$00,$46,$12,$B0
C97E DEFB $8D,$00,$13,$80,$50,$12,$00,$82
C986 DEFB $80,$B0,$00,$00,$09,$C2,$58,$02
C98E DEFB $00,$21,$48,$28,$24,$04,$14,$C2
C996 DEFB $9C,$00,$00,$23,$41,$24,$02,$00
C99E DEFB $88,$C2,$9C,$10,$00,$01,$91,$28
C9A6 DEFB $00,$00,$12,$80,$99,$08,$00,$89
C9AE DEFB $82,$2C,$00,$00,$11,$10,$94,$02
C9B6 DEFB $00,$07,$02,$24,$14,$00,$04,$00
C9BE DEFB $F4,$01,$00,$5C,$00,$BC,$0A,$00
C9C6 DEFB $08,$17,$D7,$14,$00,$9C,$06,$2B
C9CE DEFB $E7,$00,$64,$0C,$85,$7D,$00,$97
C9D6 DEFB $88,$00,$AA,$00,$12,$E8,$08,$55
C9DE DEFB $04,$25,$38,$00,$2A,$00,$12,$8C
C9E6 DEFB $00,$85,$00,$A9,$2B,$00,$28,$00
C9EE DEFB $05,$55,$81,$03,$00,$10,$27,$80
C9F6 DEFB $27,$00,$84,$8A,$F0,$1C,$00,$24
C9FE DEFB $55,$40,$70,$04,$02,$2A,$B3,$80
CA06 DEFB $00,$10,$89,$58,$00,$00,$4A,$52
CA0E DEFB $98,$00,$00,$05,$35,$78,$00,$00
CA16 DEFB $11,$52,$F0,$00,$00,$04,$AF,$80
CA1E DEFB $00,$00,$41,$78,$00,$00,$00,$09
CA26 DEFB $C0,$00,$00,$00,$03,$00,$00,$00
CA2E DEFB $02,$06,$00,$00,$00,$00,$1C,$00
CA36 DEFB $00,$00,$0F,$70,$00,$00,$00,$3B
CA3E DEFB $C0,$00,$00,$00,$E0,$00,$00,$00
CA46 DEFB $00,$80,$00,$00,$00,$00,$00,$00
CA4E DEFB $00,$00,$00,$00,$00,$00,$00,$00
CA56: Sprite, 48x96 pixels. Wall
CA56 DEFB $00,$00,$04,$00,$01,$4C,$01,$04 sprite-ca56
CA5E DEFB $16,$02,$04,$CA,$80,$00,$83,$00
CA66 DEFB $21,$4C,$80,$00,$15,$00,$14,$E7
CA6E DEFB $C0,$00,$23,$00,$03,$21,$C0,$04
CA76 DEFB $11,$C0,$28,$A3,$60,$00,$82,$E2
CA7E DEFB $01,$62,$A0,$00,$11,$70,$0C,$C3
CA86 DEFB $60,$00,$84,$B1,$23,$C1,$C0,$04
CA8E DEFB $25,$60,$0E,$C1,$80,$01,$08,$E0
CA96 DEFB $1D,$40,$80,$00,$85,$82,$76,$C0
CA9E DEFB $80,$24,$4A,$80,$03,$80,$C0,$01
CAA6 DEFB $11,$80,$0A,$80,$C0,$00,$8A,$C0
CAAE DEFB $25,$C0,$40,$20,$51,$41,$0A,$C0
CAB6 DEFB $C0,$04,$0A,$C0,$25,$40,$C0,$01
CABE DEFB $15,$40,$80,$C0,$82,$02,$43,$C0
CAC6 DEFB $09,$60,$80,$29,$15,$01,$00,$A0
CACE DEFB $00,$00,$4B,$02,$25,$60,$00,$02
CAD6 DEFB $15,$00,$11,$20,$00,$08,$47,$10
CADE DEFB $80,$60,$40,$01,$2A,$00,$0A,$A0
CAE6 DEFB $00,$02,$8E,$00,$80,$50,$00,$08
CAEE DEFB $56,$00,$02,$B0,$01,$02,$14,$00
CAF6 DEFB $20,$50,$00,$00,$AC,$10,$09,$30
CAFE DEFB $00,$04,$14,$00,$24,$D0,$00,$02
CB06 DEFB $AC,$02,$01,$30,$00,$08,$98,$00
CB0E DEFB $88,$70,$00,$01,$28,$00,$25,$20
CB16 DEFB $00,$20,$18,$02,$50,$A0,$00,$0A
CB1E DEFB $B8,$00,$25,$60,$00,$00,$10,$80
CB26 DEFB $80,$B0,$02,$01,$30,$00,$01,$30
CB2E DEFB $00,$00,$9C,$02,$0A,$D0,$00,$0A
CB36 DEFB $2C,$20,$02,$B0,$00,$00,$96,$00
CB3E DEFB $89,$50,$00,$21,$2A,$00,$02,$F0
CB46 DEFB $00,$00,$17,$02,$29,$C0,$00,$04
CB4E DEFB $8B,$00,$02,$80,$00,$01,$55,$00
CB56 DEFB $05,$80,$80,$08,$2B,$82,$0B,$80
CB5E DEFB $81,$00,$85,$80,$06,$00,$80,$04
CB66 DEFB $2A,$80,$2A,$00,$C0,$02,$95,$90
CB6E DEFB $17,$80,$40,$00,$2B,$00,$09,$F0
CB76 DEFB $C1,$09,$05,$00,$26,$B8,$40,$02
CB7E DEFB $AB,$02,$09,$5C,$C0,$00,$17,$00
CB86 DEFB $16,$AE,$80,$20,$AA,$00,$09,$D2
CB8E DEFB $80,$08,$56,$00,$42,$57,$80,$02
CB96 DEFB $AA,$00,$02,$AB,$00,$20,$16,$01
CB9E DEFB $08,$55,$00,$00,$AA,$00,$02,$AB
CBA6 DEFB $01,$02,$56,$10,$49,$45,$C0,$04
CBAE DEFB $BC,$00,$02,$2A,$C0,$00,$50,$00
CBB6 DEFB $15,$43,$40,$20,$B0,$04,$81,$1F
CBBE DEFB $E0,$01,$20,$00,$14,$EA,$61,$04
CBC6 DEFB $98,$12,$41,$25,$B0,$00,$3C,$00
CBCE DEFB $93,$00,$58,$00,$97,$82,$04,$C1
CBD6 DEFB $2C,$01,$2E,$F0,$3A,$70,$D7,$80
CBDE DEFB $11,$DC,$75,$58,$2A,$84,$2A,$97
CBE6 DEFB $EA,$AC,$55,$C0,$A5,$A2,$51,$54
CBEE DEFB $AA,$C0,$12,$85,$04,$AC,$51,$70
CBF6 DEFB $05,$C0,$24,$96,$4A,$B1,$2A,$C0
CBFE DEFB $09,$4A,$15,$50,$05,$40,$00,$16
CC06 DEFB $52,$B0,$A2,$E1,$02,$2B,$05,$50
CC0E DEFB $05,$60,$00,$01,$4A,$B4,$14,$B0
CC16 DEFB $01,$23,$05,$58,$22,$70,$40,$05
CC1E DEFB $24,$A8,$05,$20,$04,$87,$51,$5C
CC26 DEFB $92,$E0,$00,$0C,$A9,$A4,$21,$40
CC2E DEFB $00,$48,$24,$4C,$02,$C1,$04,$30
CC36 DEFB $45,$0C,$09,$F0,$03,$E0,$50,$48
CC3E DEFB $22,$9F,$06,$00,$22,$18,$09,$81
CC46 DEFB $D8,$00,$08,$BE,$00,$80,$00,$00
CC4E DEFB $A2,$F5,$4A,$80,$00,$00,$0A,$DA
CC56 DEFB $F0,$80,$00,$00,$28,$85,$75,$00
CC5E DEFB $00,$00,$12,$AA,$B9,$00,$00,$00
CC66 DEFB $29,$80,$5D,$00,$00,$00,$01,$04
CC6E DEFB $AF,$00,$00,$00,$53,$09,$1B,$00
CC76 DEFB $00,$00,$0A,$40,$0E,$00,$00,$00
CC7E DEFB $96,$00,$96,$00,$00,$00,$BA,$00
CC86 DEFB $0C,$00,$00,$00,$E1,$80,$70,$00
CC8E DEFB $00,$00,$40,$7F,$00,$00,$00,$00
CC96: Sprite, 40x80 pixels. Wall
CC96 DEFB $80,$00,$0A,$40,$00,$00,$00,$0D sprite-cc96
CC9E DEFB $28,$00,$A0,$00,$0A,$80,$40,$00
CCA6 DEFB $00,$1D,$48,$00,$40,$00,$14,$80
CCAE DEFB $00,$28,$00,$11,$22,$00,$41,$00
CCB6 DEFB $1E,$80,$00,$A4,$00,$09,$48,$20
CCBE DEFB $50,$10,$0A,$21,$00,$AA,$80,$0C
CCC6 DEFB $80,$00,$92,$00,$05,$28,$00,$E9
CCCE DEFB $10,$04,$82,$20,$24,$40,$03,$48
CCD6 DEFB $00,$32,$00,$01,$20,$00,$24,$84
CCDE DEFB $01,$D2,$40,$3A,$90,$00,$A0,$00
CCE6 DEFB $0A,$00,$01,$AA,$00,$0D,$41,$01
CCEE DEFB $C8,$00,$05,$08,$00,$A4,$80,$02
CCF6 DEFB $28,$00,$C8,$00,$03,$95,$00,$6A
CCFE DEFB $10,$01,$5C,$00,$44,$00,$01,$C0
CD06 DEFB $80,$50,$80,$00,$94,$00,$C4,$00
CD0E DEFB $00,$E9,$41,$A9,$10,$80,$74,$83
CD16 DEFB $54,$00,$00,$56,$A3,$A8,$40,$20
CD1E DEFB $E1,$51,$D5,$08,$00,$D2,$A8,$AC
CD26 DEFB $00,$00,$AA,$50,$F2,$40,$01,$D2
CD2E DEFB $68,$15,$08,$11,$A5,$24,$1A,$00
CD36 DEFB $01,$54,$98,$0C,$80,$01,$AA,$B4
CD3E DEFB $0A,$20,$01,$53,$88,$0D,$00,$01
CD46 DEFB $A5,$24,$0A,$82,$01,$52,$C8,$89
CD4E DEFB $00,$11,$A4,$B2,$06,$A0,$01,$D3
CD56 DEFB $68,$03,$80,$10,$E8,$54,$03,$40
CD5E DEFB $00,$32,$20,$11,$80,$04,$29,$C2
CD66 DEFB $81,$48,$00,$32,$A8,$01,$80,$00
CD6E DEFB $14,$C4,$01,$40,$00,$19,$20,$01
CD76 DEFB $88,$04,$2C,$C8,$83,$80,$00,$06
CD7E DEFB $A0,$03,$22,$00,$4A,$D4,$02,$80
CD86 DEFB $01,$13,$A0,$03,$A0,$00,$28,$D1
CD8E DEFB $01,$42,$00,$14,$68,$01,$E8,$01
CD96 DEFB $28,$70,$02,$A0,$00,$00,$2A,$03
CD9E DEFB $70,$00,$00,$30,$06,$B1,$00,$04
CDA6 DEFB $18,$85,$58,$00,$00,$12,$06,$A9
CDAE DEFB $80,$00,$18,$05,$56,$80,$00,$18
CDB6 DEFB $0A,$AF,$E3,$C0,$12,$0D,$58,$73
CDBE DEFB $E0,$30,$0B,$F0,$BE,$BF,$F0,$0E
CDC6 DEFB $00,$2A,$5A,$BC,$7C,$00,$25,$87
CDCE DEFB $57,$C0,$00,$11,$46,$41,$80,$00
CDD6 DEFB $06,$97,$0F,$00,$00,$09,$2B,$D8
CDDE DEFB $00,$00,$00,$94,$F0,$00,$00,$02
CDE6 DEFB $A9,$00,$00,$00,$00,$96,$00,$00
CDEE DEFB $00,$02,$8C,$00,$00,$00,$00,$38
CDF6 DEFB $00,$00,$00,$00,$20,$00,$00,$00
CDFE DEFB $07,$E0,$00,$00,$00,$FC,$00,$00
CE06 DEFB $00,$00,$00,$00,$00,$00,$00,$00
CE0E DEFB $00,$00,$00,$00,$00,$00,$00,$00
CE16 DEFB $00,$00,$00,$00,$00,$00,$00,$00
CE1E DEFB $00,$00,$00,$00,$00,$00,$00,$00
CE26: Sprite, 8x160 pixels. Font: alphanumeric character set, used for HUD/score text (not a game sprite)
CE26 DEFB $00,$72,$56,$52,$52,$52,$52,$77 sprite-ce26
CE2E DEFB $00,$77,$11,$11,$73,$41,$41,$77
CE36 DEFB $00,$47,$44,$44,$57,$71,$11,$17
CE3E DEFB $00,$47,$41,$41,$71,$51,$51,$71
CE46 DEFB $00,$77,$55,$55,$77,$51,$51,$71
CE4E DEFB $00,$76,$55,$55,$76,$55,$55,$56
CE56 DEFB $00,$76,$45,$45,$45,$45,$45,$76
CE5E DEFB $00,$77,$44,$44,$66,$44,$44,$74
CE66 DEFB $00,$75,$45,$45,$57,$55,$55,$75
CE6E DEFB $00,$77,$21,$21,$21,$25,$25,$77
CE76 DEFB $00,$54,$54,$54,$64,$54,$54,$57
CE7E DEFB $00,$55,$75,$77,$77,$57,$55,$55
CE86 DEFB $00,$77,$55,$55,$57,$54,$54,$74
CE8E DEFB $00,$77,$55,$55,$56,$55,$75,$25
CE96 DEFB $00,$77,$42,$42,$72,$12,$12,$72
CE9E DEFB $00,$55,$55,$55,$55,$55,$55,$72
CEA6 DEFB $00,$55,$55,$55,$52,$75,$75,$55
CEAE DEFB $00,$57,$51,$51,$72,$24,$24,$27
CEB6 DEFB $00,$00,$00,$00,$07,$00,$00,$00
CEBE DEFB $00,$20,$20,$20,$20,$20,$00,$22
CEC6: Mask, 24x32 pixels. Diver silhouette
CEC6 DEFB $00,$3F,$00,$00,$7F,$80,$00,$FF sprite-cec6
CECE DEFB $C0,$01,$FF,$E0,$01,$FF,$F0,$03
CED6 DEFB $FF,$F0,$03,$FF,$F0,$03,$FF,$F0
CEDE DEFB $01,$FF,$F0,$03,$FF,$F0,$07,$FF
CEE6 DEFB $E0,$0F,$FF,$C0,$1F,$FF,$C0,$1F
CEEE DEFB $FF,$E0,$1F,$FF,$F0,$3F,$FF,$F8
CEF6 DEFB $3F,$FF,$FC,$3F,$FF,$FC,$7F,$FF
CEFE DEFB $FC,$7F,$FF,$FC,$7F,$FF,$78,$7F
CF06 DEFB $FF,$B0,$7F,$FF,$C6,$3F,$FF,$DF
CF0E DEFB $1F,$FF,$FF,$07,$FF,$FF,$0F,$FF
CF16 DEFB $FF,$0F,$FF,$FF,$07,$FF,$FE,$03
CF1E DEFB $FF,$FC,$03,$FF,$10,$01,$FF,$00
CF26: Mask, 32x24 pixels.
CF26 DEFB $00,$00,$00,$00,$00,$07,$00,$00 sprite-cf26
CF2E DEFB $00,$0F,$80,$00,$01,$8F,$C0,$00
CF36 DEFB $03,$CF,$E0,$00,$07,$EF,$F0,$00
CF3E DEFB $1F,$FF,$FF,$C0,$7F,$FF,$FF,$E0
CF46 DEFB $FF,$FF,$FF,$F0,$FF,$FF,$FF,$F8
CF4E DEFB $FF,$1F,$FF,$FC,$FF,$3F,$FF,$FC
CF56 DEFB $7E,$3F,$FF,$FC,$3E,$1F,$FF,$FC
CF5E DEFB $1C,$3F,$FF,$FC,$08,$7F,$FF,$F8
CF66 DEFB $00,$7F,$FF,$FC,$00,$FC,$DF,$FE
CF6E DEFB $00,$F8,$0F,$FF,$00,$F0,$0F,$FF
CF76 DEFB $00,$FE,$06,$DA,$00,$7F,$00,$00
CF7E DEFB $00,$7F,$00,$00,$00,$3A,$00,$00
CF86: Mask, 32x24 pixels.
CF86 DEFB $00,$03,$80,$00,$00,$03,$C0,$00 sprite-cf86
CF8E DEFB $00,$07,$C0,$00,$00,$07,$E0,$00
CF96 DEFB $00,$0F,$E0,$00,$00,$CF,$F0,$00
CF9E DEFB $01,$EF,$FF,$C0,$07,$FF,$FF,$E0
CFA6 DEFB $0F,$FF,$FF,$F0,$3F,$FF,$FF,$F8
CFAE DEFB $7F,$FF,$FF,$FC,$FF,$BF,$FF,$FC
CFB6 DEFB $FF,$BF,$FF,$FC,$FF,$3F,$FF,$FC
CFBE DEFB $FE,$7F,$FF,$FC,$7E,$FF,$FF,$F8
CFC6 DEFB $3D,$FF,$FF,$FE,$1F,$F7,$FF,$FE
CFCE DEFB $0B,$E0,$EF,$FE,$03,$F8,$0F,$FE
CFD6 DEFB $01,$FC,$06,$DF,$01,$FC,$00,$3F
CFDE DEFB $00,$E8,$00,$3F,$00,$00,$00,$1A
CFE6: Mask, 32x24 pixels.
CFE6 DEFB $01,$80,$00,$00,$03,$C0,$00,$00 sprite-cfe6
CFEE DEFB $07,$E1,$80,$00,$7F,$E3,$C0,$00
CFF6 DEFB $FF,$F7,$E0,$00,$FF,$F7,$F0,$00
CFFE DEFB $FF,$FF,$FF,$C0,$7F,$FF,$FF,$E0
D006 DEFB $3F,$7F,$FF,$F0,$1E,$7F,$FF,$F8
D00E DEFB $0E,$3F,$FF,$FC,$04,$3F,$FF,$FC
D016 DEFB $00,$3F,$FF,$FC,$00,$3F,$FF,$FC
D01E DEFB $00,$7F,$FF,$FC,$00,$7F,$FF,$FC
D026 DEFB $00,$7F,$FF,$FE,$00,$3F,$FF,$FE
D02E DEFB $00,$3F,$EF,$EC,$00,$1F,$8F,$E0
D036 DEFB $00,$0F,$C6,$C0,$00,$0F,$E0,$00
D03E DEFB $00,$07,$E0,$00,$00,$03,$40,$00
D046: Mask, 32x24 pixels.
D046 DEFB $01,$81,$80,$00,$03,$C3,$C0,$00 sprite-d046
D04E DEFB $07,$E7,$C0,$00,$7F,$EF,$E0,$00
D056 DEFB $FF,$FF,$E0,$00,$FF,$FF,$F0,$00
D05E DEFB $FF,$FF,$FC,$00,$7F,$FF,$FE,$00
D066 DEFB $3F,$7F,$FF,$C0,$1F,$7F,$FF,$E0
D06E DEFB $0E,$1F,$FF,$F0,$04,$3F,$FF,$F8
D076 DEFB $00,$3F,$FF,$FC,$00,$1F,$FF,$FC
D07E DEFB $00,$07,$FF,$FC,$00,$0F,$FF,$FC
D086 DEFB $00,$1F,$FF,$FC,$00,$1F,$FF,$F8
D08E DEFB $00,$1F,$BF,$FE,$00,$0F,$1F,$FE
D096 DEFB $00,$0F,$EF,$FC,$00,$07,$FF,$FF
D09E DEFB $00,$03,$F6,$FF,$00,$00,$D0,$16
D0A6: Mask, 32x24 pixels.
D0A6 DEFB $00,$07,$C0,$00,$00,$1F,$F0,$00 sprite-d0a6
D0AE DEFB $34,$3F,$F8,$50,$7E,$7F,$F8,$F8
D0B6 DEFB $7E,$7F,$F9,$F8,$3E,$FF,$FD,$F0
D0BE DEFB $1F,$FF,$FF,$E0,$0F,$FF,$FF,$C0
D0C6 DEFB $0F,$FF,$FF,$FC,$07,$FF,$FF,$FE
D0CE DEFB $03,$FF,$FF,$FF,$03,$FF,$FF,$FF
D0D6 DEFB $01,$FF,$FF,$FF,$01,$FF,$FF,$FF
D0DE DEFB $00,$7F,$FF,$FF,$00,$FF,$FF,$FF
D0E6 DEFB $00,$7F,$FF,$FE,$00,$7F,$FF,$FE
D0EE DEFB $00,$7F,$FF,$FE,$00,$7F,$FF,$FC
D0F6 DEFB $00,$3F,$FE,$FC,$00,$3F,$FE,$18
D0FE DEFB $00,$1F,$EC,$00,$00,$07,$C0,$00
D106: Mask, 32x24 pixels.
D106 DEFB $03,$80,$00,$78,$0F,$E0,$00,$FC sprite-d106
D10E DEFB $1F,$F0,$01,$FE,$3F,$F8,$01,$FE
D116 DEFB $7F,$FF,$81,$FE,$7F,$FF,$E1,$FE
D11E DEFB $7F,$FF,$F1,$FE,$7F,$FF,$FF,$FC
D126 DEFB $7F,$FF,$FF,$FC,$3F,$FF,$FF,$FC
D12E DEFB $1F,$FF,$FF,$FC,$3F,$FF,$FF,$FC
D136 DEFB $7F,$FF,$FF,$F8,$7F,$FF,$FE,$30
D13E DEFB $FF,$FF,$FC,$00,$F9,$FF,$FC,$00
D146 DEFB $FE,$FF,$FC,$00,$7E,$0F,$FC,$00
D14E DEFB $3F,$8F,$F8,$00,$3F,$87,$F8,$00
D156 DEFB $1F,$83,$F8,$00,$0D,$01,$F8,$00
D15E DEFB $00,$00,$F0,$00,$00,$00,$60,$00
D166: Mask, 32x24 pixels.
D166 DEFB $00,$00,$00,$00,$00,$07,$00,$00 sprite-d166
D16E DEFB $00,$0F,$80,$00,$01,$8F,$C0,$00
D176 DEFB $03,$CF,$E0,$00,$07,$EF,$F0,$00
D17E DEFB $1F,$FF,$FC,$F0,$7F,$FF,$FF,$FC
D186 DEFB $FF,$FF,$FF,$FE,$FF,$7F,$FF,$FE
D18E DEFB $FF,$3F,$FF,$FF,$FE,$3F,$FF,$FF
D196 DEFB $7E,$3F,$FF,$FF,$3E,$1F,$FF,$FF
D19E DEFB $1C,$3F,$FF,$FF,$00,$7F,$FF,$FE
D1A6 DEFB $00,$7F,$FF,$FF,$00,$FC,$FB,$FF
D1AE DEFB $00,$FC,$01,$FF,$00,$F8,$00,$FF
D1B6 DEFB $00,$FE,$00,$46,$00,$7F,$00,$00
D1BE DEFB $00,$7F,$00,$00,$00,$3A,$00,$00
D1C6: Mask, 24x24 pixels. Fish cloud
D1C6 DEFB $60,$01,$80,$FC,$03,$F8,$FE,$C3 sprite-d1c6
D1CE DEFB $FC,$FF,$FF,$FE,$FF,$FF,$FF,$7F
D1D6 DEFB $FF,$FF,$7F,$FF,$FF,$3E,$FF,$FE
D1DE DEFB $0F,$7F,$FC,$1E,$3F,$F8,$3D,$CF
D1E6 DEFB $FC,$3F,$EF,$FE,$3F,$F7,$FE,$1F
D1EE DEFB $FB,$FE,$4F,$F9,$FC,$EF,$FC,$F8
D1F6 DEFB $FF,$FF,$FC,$FF,$FF,$FE,$7F,$FF
D1FE DEFB $FF,$7F,$FF,$FF,$3F,$FF,$FF,$1F
D206 DEFB $3F,$7E,$07,$8E,$1C,$03,$00,$00
D20E: Mask, 24x24 pixels. Fish cloud
D20E DEFB $30,$00,$C0,$7E,$01,$F8,$7F,$61 sprite-d20e
D216 DEFB $FC,$3F,$FD,$FE,$3F,$FF,$FF,$3F
D21E DEFB $FF,$FF,$3F,$FF,$FF,$1F,$FF,$FE
D226 DEFB $1F,$3F,$FC,$3F,$CF,$FC,$3F,$EF
D22E DEFB $FC,$3F,$F7,$FE,$1F,$FB,$FE,$0F
D236 DEFB $FB,$FE,$67,$F1,$F8,$FF,$EC,$FC
D23E DEFB $FF,$FF,$FC,$FF,$FF,$FC,$FF,$FF
D246 DEFB $FE,$7F,$FF,$FF,$3F,$FF,$FF,$1F
D24E DEFB $3E,$FF,$06,$0F,$7E,$00,$06,$18
D256: Mask, 24x32 pixels. Jellyfish
D256 DEFB $00,$01,$E0,$00,$0F,$F8,$00,$1F sprite-d256
D25E DEFB $FC,$00,$3F,$FE,$00,$7F,$FE,$00
D266 DEFB $FF,$FF,$00,$FF,$FF,$01,$FF,$FF
D26E DEFB $01,$FF,$FF,$01,$FF,$FF,$0F,$FF
D276 DEFB $FE,$1F,$FF,$FE,$39,$FF,$FC,$7F
D27E DEFB $FF,$FC,$7E,$FF,$FC,$FD,$FF,$F8
D286 DEFB $DF,$FF,$F8,$DF,$FD,$F0,$DB,$EE
D28E DEFB $60,$7F,$DD,$C0,$7F,$FF,$80,$EF
D296 DEFB $E7,$80,$FF,$FF,$00,$EF,$FE,$00
D29E DEFB $EF,$FC,$00,$EF,$F8,$00,$7F,$E0
D2A6 DEFB $00,$3F,$E0,$00,$73,$70,$00,$7F
D2AE DEFB $F8,$00,$2E,$F8,$00,$06,$30,$00
D2B6: Mask, 24x32 pixels. Jellyfish
D2B6 DEFB $00,$00,$00,$00,$1F,$00,$01,$FF sprite-d2b6
D2BE DEFB $C0,$03,$FF,$F0,$07,$FF,$F8,$47
D2C6 DEFB $FF,$FC,$E7,$FF,$FC,$F3,$FF,$FE
D2CE DEFB $FF,$FF,$FE,$7F,$FF,$FE,$3F,$FF
D2D6 DEFB $FF,$1F,$FF,$FF,$07,$FF,$FF,$07
D2DE DEFB $7F,$FF,$06,$FF,$FF,$0F,$FF,$FF
D2E6 DEFB $1D,$FF,$7E,$7D,$FE,$7C,$FF,$FC
D2EE DEFB $E0,$FB,$F3,$C0,$71,$E7,$80,$EB
D2F6 DEFB $EE,$00,$FF,$DC,$00,$7F,$B8,$00
D2FE DEFB $3F,$F0,$00,$0E,$E0,$00,$04,$00
D306 DEFB $00,$00,$00,$00,$00,$00,$00,$00
D30E DEFB $00,$00,$00,$00,$00,$00,$00,$00
D316: Mask, 24x32 pixels. Jellyfish
D316 DEFB $07,$F0,$00,$1F,$FE,$00,$3F,$FF sprite-d316
D31E DEFB $C0,$3F,$FF,$E0,$7F,$FF,$F0,$7F
D326 DEFB $FF,$F8,$3F,$FF,$F8,$7F,$FF,$FC
D32E DEFB $7F,$FF,$FC,$DF,$FF,$FE,$FF,$FF
D336 DEFB $FE,$EF,$FF,$FE,$7F,$FF,$FE,$DF
D33E DEFB $FF,$FE,$E5,$FF,$FF,$CF,$FF,$FF
D346 DEFB $7F,$FF,$FF,$79,$FF,$FF,$73,$DF
D34E DEFB $FF,$76,$3F,$FE,$FE,$FF,$FC,$F7
D356 DEFB $E4,$F8,$E7,$DD,$F0,$CF,$BD,$F0
D35E DEFB $3F,$7B,$E0,$7E,$7F,$E0,$78,$3F
D366 DEFB $C0,$30,$1F,$00,$00,$00,$00,$00
D36E DEFB $00,$00,$00,$00,$00,$00,$00,$00
D376: Mask, 24x24 pixels. Fish cloud
D376 DEFB $00,$0C,$00,$06,$1E,$1C,$0F,$3F sprite-d376
D37E DEFB $3E,$5F,$FF,$FF,$FF,$FF,$FE,$FF
D386 DEFB $FF,$FF,$FF,$FF,$FE,$FF,$FF,$FC
D38E DEFB $EF,$FF,$F0,$57,$BF,$FC,$3F,$FF
D396 DEFB $FE,$3F,$FF,$FE,$1F,$EF,$FE,$0F
D39E DEFB $CF,$FC,$03,$0F,$F8,$0C,$8F,$FC
D3A6 DEFB $1D,$BF,$3E,$5F,$FF,$7F,$FF,$FF
D3AE DEFB $FE,$FF,$FF,$FF,$FF,$FF,$FF,$FC
D3B6 DEFB $FF,$FE,$FC,$73,$FC,$60,$01,$F8
D3BE: Mask, 24x32 pixels. Jellyfish
D3BE DEFB $00,$0F,$00,$00,$3F,$C0,$00,$7F sprite-d3be
D3C6 DEFB $E0,$00,$FF,$F0,$00,$FF,$F0,$01
D3CE DEFB $FF,$E0,$01,$FF,$F0,$07,$FF,$F8
D3D6 DEFB $0F,$FF,$F8,$1F,$FF,$F8,$3F,$FF
D3DE DEFB $F8,$3F,$FF,$F0,$7F,$FF,$FC,$7F
D3E6 DEFB $FF,$F8,$7F,$FF,$FC,$7F,$FF,$FC
D3EE DEFB $1F,$FF,$F8,$3F,$FF,$F8,$3F,$FF
D3F6 DEFB $FC,$7F,$FF,$FC,$7F,$FF,$F8,$7F
D3FE DEFB $FF,$F8,$7F,$FF,$F8,$3F,$FF,$F0
D406 DEFB $1F,$FF,$E0,$01,$FF,$C0,$07,$FF
D40E DEFB $E7,$0F,$FF,$FF,$0F,$FF,$FF,$0F
D416 DEFB $FF,$FF,$03,$EF,$FF,$00,$E3,$FE
D41E: Mask, 32x24 pixels.
D41E DEFB $00,$00,$03,$C0,$00,$00,$0F,$F0 sprite-d41e
D426 DEFB $00,$00,$1F,$F8,$00,$03,$FF,$F8
D42E DEFB $00,$0F,$FF,$FC,$00,$1F,$FF,$FC
D436 DEFB $00,$3F,$FF,$FC,$00,$3F,$FF,$F8
D43E DEFB $0C,$1F,$FF,$F8,$1F,$7F,$FF,$F0
D446 DEFB $3F,$FF,$FF,$E0,$3F,$FF,$FF,$F0
D44E DEFB $3F,$FF,$FF,$F0,$7F,$FF,$FF,$FC
D456 DEFB $7F,$FF,$FF,$FE,$7F,$FE,$F1,$FE
D45E DEFB $FF,$FE,$01,$FE,$FF,$FF,$00,$FC
D466 DEFB $FF,$FF,$00,$70,$7F,$FF,$00,$00
D46E DEFB $0E,$7F,$00,$00,$00,$1E,$00,$00
D476 DEFB $00,$00,$00,$00,$00,$00,$00,$00
D47E: Mask, 32x24 pixels.
D47E DEFB $00,$00,$03,$C0,$00,$00,$0F,$F0 sprite-d47e
D486 DEFB $00,$00,$1F,$F8,$00,$03,$FF,$F8
D48E DEFB $00,$0F,$FF,$FC,$00,$1F,$FF,$FC
D496 DEFB $0C,$3F,$FF,$FC,$1F,$3F,$FF,$F8
D49E DEFB $3F,$FF,$FF,$F8,$3F,$FF,$FF,$F0
D4A6 DEFB $3F,$FF,$FF,$E6,$7F,$FF,$FF,$FF
D4AE DEFB $7F,$FF,$FF,$FF,$7F,$3F,$FF,$FF
D4B6 DEFB $FF,$3F,$FF,$FF,$FF,$7F,$FE,$FE
D4BE DEFB $FF,$7F,$F0,$FC,$7F,$7E,$C0,$78
D4C6 DEFB $0E,$7E,$00,$10,$00,$FF,$00,$00
D4CE DEFB $00,$FF,$00,$00,$00,$FF,$00,$00
D4D6 DEFB $00,$7F,$00,$00,$00,$1E,$00,$00
D4DE: Mask, 32x24 pixels.
D4DE DEFB $00,$00,$03,$C0,$00,$00,$0F,$F0 sprite-d4de
D4E6 DEFB $00,$00,$1F,$F8,$00,$03,$DF,$FC
D4EE DEFB $00,$0F,$FF,$FC,$00,$1F,$FF,$FC
D4F6 DEFB $00,$3F,$FF,$FC,$00,$7F,$FF,$F8
D4FE DEFB $00,$7F,$FF,$F8,$00,$7F,$FF,$F0
D506 DEFB $00,$FF,$FF,$E0,$0F,$FF,$FF,$E0
D50E DEFB $1F,$FF,$FF,$E0,$3F,$FF,$FF,$E0
D516 DEFB $3F,$FE,$FF,$E0,$3F,$FE,$03,$E0
D51E DEFB $7F,$FE,$03,$F0,$7E,$FE,$01,$F8
D526 DEFB $7F,$3C,$01,$FC,$FF,$00,$01,$FC
D52E DEFB $FF,$00,$00,$FC,$FF,$00,$00,$7C
D536 DEFB $7F,$00,$00,$38,$0E,$00,$00,$00
D53E: Mask, 32x24 pixels.
D53E DEFB $00,$00,$00,$00,$00,$00,$00,$00 sprite-d53e
D546 DEFB $00,$00,$01,$F0,$0C,$03,$CB,$F8
D54E DEFB $1F,$0F,$FF,$FC,$3F,$9F,$FF,$FE
D556 DEFB $3F,$FF,$FF,$FF,$3F,$FF,$FF,$FF
D55E DEFB $7F,$FF,$FF,$FF,$7E,$FF,$FF,$FF
D566 DEFB $7F,$7F,$FF,$FF,$FF,$3F,$FF,$FF
D56E DEFB $FF,$3F,$FF,$FE,$FF,$7F,$FF,$FC
D576 DEFB $7F,$7F,$FF,$EC,$0E,$7E,$FF,$F0
D57E DEFB $00,$7E,$3F,$F0,$00,$FF,$3F,$F0
D586 DEFB $00,$FF,$3F,$F0,$00,$FF,$3E,$FE
D58E DEFB $00,$7F,$1E,$FE,$00,$1E,$0A,$7E
D596 DEFB $00,$00,$00,$7E,$00,$00,$00,$34
D59E: Mask, 32x32 pixels. Round
D59E DEFB $00,$00,$BC,$00,$00,$07,$FE,$00 sprite-d59e
D5A6 DEFB $00,$17,$FF,$00,$01,$DF,$FF,$80
D5AE DEFB $03,$FF,$FF,$80,$07,$FF,$FF,$F0
D5B6 DEFB $0F,$FF,$FF,$F8,$1F,$FF,$FF,$FC
D5BE DEFB $3F,$FF,$FF,$FE,$7F,$FF,$FF,$FE
D5C6 DEFB $FF,$FF,$FF,$FE,$FF,$FF,$FF,$FE
D5CE DEFB $FF,$FF,$FF,$FC,$7F,$FF,$FF,$FC
D5D6 DEFB $1F,$FF,$FF,$FE,$3F,$FF,$FF,$FE
D5DE DEFB $7F,$FF,$FF,$FF,$7F,$FF,$FF,$FF
D5E6 DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
D5EE DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
D5F6 DEFB $3F,$FF,$FF,$FE,$7F,$FF,$FF,$FE
D5FE DEFB $FF,$FF,$FF,$FC,$FF,$FF,$FF,$F8
D606 DEFB $7F,$FF,$FF,$F8,$7F,$FF,$FF,$F0
D60E DEFB $3F,$FF,$FF,$E0,$1F,$7F,$FD,$C0
D616 DEFB $0F,$3F,$F8,$00,$00,$1B,$80,$00
D61E: Mask, 32x24 pixels.
D61E DEFB $00,$01,$C0,$00,$00,$0B,$F7,$00 sprite-d61e
D626 DEFB $00,$1F,$FF,$80,$06,$3F,$FF,$C0
D62E DEFB $0F,$7F,$FF,$E0,$1F,$FF,$FF,$F0
D636 DEFB $3F,$FF,$FF,$F8,$3F,$FF,$FF,$F8
D63E DEFB $7F,$FF,$FF,$F8,$FF,$FF,$FF,$F0
D646 DEFB $FF,$FF,$FF,$E0,$FF,$FF,$FF,$E0
D64E DEFB $FF,$FF,$FF,$F8,$FF,$FF,$FF,$FC
D656 DEFB $FF,$FF,$FF,$FE,$7F,$FF,$FF,$FE
D65E DEFB $3F,$FF,$FF,$FE,$0F,$FF,$FF,$FE
D666 DEFB $0F,$FF,$FF,$FC,$07,$FF,$FF,$FC
D66E DEFB $03,$FF,$FF,$F8,$01,$BF,$FF,$F0
D676 DEFB $00,$1F,$FB,$E0,$00,$00,$70,$00
D67E: Mask, 16x24 pixels.
D67E DEFB $03,$B0,$0F,$F8,$0F,$FC,$1F,$FE sprite-d67e
D686 DEFB $0F,$FE,$3F,$FC,$7F,$FC,$7F,$FF
D68E DEFB $FF,$FF,$FF,$FF,$7F,$FF,$7F,$FE
D696 DEFB $FF,$FC,$FF,$FC,$FF,$FE,$7F,$FE
D69E DEFB $3F,$FC,$1F,$F8,$0F,$FC,$1F,$FE
D6A6 DEFB $0F,$FE,$0F,$FC,$07,$F8,$00,$F0
D6AE: Mask, 24x24 pixels. Fish cloud
D6AE DEFB $00,$18,$00,$00,$3C,$38,$06,$7E sprite-d6ae
D6B6 DEFB $7C,$0F,$FF,$FE,$1F,$FF,$FC,$7F
D6BE DEFB $FF,$FE,$FF,$FF,$FC,$FF,$7D,$F8
D6C6 DEFB $FF,$B9,$F0,$FF,$C5,$F8,$7F,$EF
D6CE DEFB $FC,$3F,$CF,$F8,$3F,$EF,$FC,$1F
D6D6 DEFB $CF,$F8,$0B,$8E,$78,$1D,$04,$7E
D6DE DEFB $3F,$8E,$7F,$7F,$DF,$7F,$FF,$FF
D6E6 DEFB $FF,$FF,$FF,$FE,$FF,$FF,$FE,$FD
D6EE DEFB $FE,$FC,$60,$FC,$60,$00,$70,$00
D6F6: Mask, 32x24 pixels.
D6F6 DEFB $00,$00,$01,$E0,$00,$00,$07,$F8 sprite-d6f6
D6FE DEFB $00,$00,$0F,$FC,$00,$03,$DF,$FE
D706 DEFB $00,$0F,$FF,$FE,$00,$1F,$FF,$FC
D70E DEFB $00,$3F,$FF,$FE,$00,$3F,$FF,$FF
D716 DEFB $0C,$1F,$FF,$FF,$1F,$7F,$FF,$FF
D71E DEFB $3F,$FF,$FF,$FF,$3F,$FF,$FF,$FE
D726 DEFB $3F,$FF,$FF,$FC,$7F,$FF,$FF,$FC
D72E DEFB $7F,$FF,$FF,$FE,$7F,$FE,$F1,$FE
D736 DEFB $FF,$FE,$01,$FE,$FF,$FF,$00,$FC
D73E DEFB $FF,$FF,$00,$70,$7F,$FF,$00,$00
D746 DEFB $0E,$7F,$00,$00,$00,$1E,$00,$00
D74E DEFB $00,$00,$00,$00,$00,$00,$00,$00
D756: Mask, 32x32 pixels. Round
D756 DEFB $30,$03,$F0,$00,$78,$1F,$FC,$00 sprite-d756
D75E DEFB $FC,$7F,$FF,$00,$FC,$FF,$FF,$C0
D766 DEFB $7E,$FF,$FF,$E0,$7F,$FF,$FF,$F0
D76E DEFB $3F,$FF,$FF,$F8,$7F,$FF,$FF,$F8
D776 DEFB $3F,$FF,$FF,$FC,$7F,$FF,$FF,$FC
D77E DEFB $7F,$FF,$FF,$FE,$3F,$FF,$FF,$FF
D786 DEFB $7F,$FF,$FF,$FF,$7F,$FF,$FF,$FF
D78E DEFB $3F,$FF,$FF,$FF,$3F,$FF,$FF,$FF
D796 DEFB $3F,$FF,$FF,$FF,$1F,$FF,$FF,$FE
D79E DEFB $3F,$FF,$FF,$FC,$3F,$FF,$FF,$FE
D7A6 DEFB $3F,$FF,$FF,$FF,$7F,$FF,$FF,$FF
D7AE DEFB $7F,$FF,$FF,$FE,$7F,$FF,$FF,$FE
D7B6 DEFB $7D,$FF,$FF,$FC,$78,$FF,$FF,$F8
D7BE DEFB $79,$FF,$FF,$FC,$3B,$FF,$FF,$FC
D7C6 DEFB $13,$FF,$FF,$F8,$03,$FF,$FF,$F0
D7CE DEFB $01,$F7,$FF,$E0,$00,$E0,$7F,$00
D7D6: Mask, 32x32 pixels. Round
D7D6 DEFB $06,$07,$E0,$00,$0F,$3F,$F8,$00 sprite-d7d6
D7DE DEFB $1F,$FF,$FF,$00,$3F,$FF,$FF,$80
D7E6 DEFB $3F,$FF,$FF,$C0,$3F,$FF,$FF,$E0
D7EE DEFB $7F,$FF,$FF,$F0,$7F,$FF,$FF,$F0
D7F6 DEFB $7F,$FF,$FF,$F8,$7F,$FF,$FF,$F8
D7FE DEFB $FF,$FF,$FF,$FC,$FF,$FF,$FF,$FE
D806 DEFB $7F,$FF,$FF,$FE,$FF,$FF,$FF,$FE
D80E DEFB $FF,$FF,$FF,$FE,$7F,$FF,$FF,$FE
D816 DEFB $7F,$FF,$FF,$FE,$7F,$FF,$FF,$FC
D81E DEFB $FF,$FF,$FF,$F8,$FF,$FF,$FF,$FC
D826 DEFB $7F,$FF,$FF,$FE,$7F,$FF,$FF,$FE
D82E DEFB $3F,$FF,$FF,$FC,$3F,$FF,$FF,$FC
D836 DEFB $3F,$FF,$FC,$98,$1F,$FF,$FB,$E0
D83E DEFB $0F,$FF,$FF,$F0,$0F,$FF,$FF,$F8
D846 DEFB $07,$FF,$FF,$F0,$03,$9F,$FF,$E0
D84E DEFB $00,$0F,$FF,$C0,$00,$00,$FE,$00
D856: Mask, 32x32 pixels. Round
D856 DEFB $40,$00,$FE,$00,$E0,$03,$FF,$E0 sprite-d856
D85E DEFB $FC,$0F,$FF,$F0,$7E,$1F,$FF,$F8
D866 DEFB $3F,$3F,$FF,$FC,$7F,$7F,$FF,$FC
D86E DEFB $3F,$FF,$FF,$FC,$1F,$FF,$FF,$FE
D876 DEFB $3F,$FF,$FF,$FE,$3F,$FF,$FF,$FE
D87E DEFB $1F,$FF,$FF,$FE,$1F,$FF,$FF,$FF
D886 DEFB $07,$FF,$FF,$FF,$0F,$FF,$FF,$FF
D88E DEFB $1F,$FF,$FF,$FF,$3F,$FF,$FF,$FE
D896 DEFB $1F,$FF,$FF,$FF,$3F,$FF,$FF,$FF
D89E DEFB $1F,$FF,$FF,$FF,$1F,$FF,$FF,$FE
D8A6 DEFB $0F,$FF,$FF,$FC,$0F,$FF,$FF,$FE
D8AE DEFB $0F,$FF,$FF,$FF,$1F,$FF,$FF,$FF
D8B6 DEFB $0F,$FF,$FF,$FF,$0F,$FF,$FF,$FE
D8BE DEFB $1F,$FF,$FE,$3C,$3F,$9F,$FC,$18
D8C6 DEFB $1F,$8F,$F0,$00,$3F,$03,$C0,$00
D8CE DEFB $7E,$00,$00,$00,$30,$00,$00,$00
D8D6: Mask, 32x32 pixels. Round
D8D6 DEFB $03,$83,$F8,$00,$07,$CF,$FF,$80 sprite-d8d6
D8DE DEFB $0F,$BF,$FF,$C0,$0F,$7F,$FF,$E0
D8E6 DEFB $1F,$FF,$FF,$F0,$1F,$FF,$FF,$F8
D8EE DEFB $0F,$FF,$FF,$F8,$0F,$FF,$FF,$F8
D8F6 DEFB $1F,$FF,$FF,$F8,$1F,$FF,$FF,$FC
D8FE DEFB $1F,$FF,$FF,$FC,$3F,$FF,$FF,$FC
D906 DEFB $3F,$FF,$FF,$FE,$3F,$FF,$FF,$FE
D90E DEFB $3F,$FF,$FF,$FE,$3F,$FF,$FF,$FC
D916 DEFB $1F,$FF,$FF,$FE,$0F,$FF,$FF,$FE
D91E DEFB $1F,$FF,$FF,$FC,$0F,$FF,$FF,$FE
D926 DEFB $0F,$FF,$FF,$FE,$0F,$FF,$FF,$FC
D92E DEFB $07,$FF,$FF,$FE,$07,$FF,$FF,$FC
D936 DEFB $0F,$FF,$FF,$38,$0F,$FF,$FE,$00
D93E DEFB $07,$FF,$F8,$00,$07,$BF,$F0,$00
D946 DEFB $0F,$8F,$C0,$00,$07,$C0,$00,$00
D94E DEFB $03,$E0,$00,$00,$00,$C0,$00,$00
D956: Mask, 16x8 pixels. Snake, rearing phase
D956 DEFB $03,$F0,$1F,$FC,$3F,$FE,$7F,$FE sprite-d956
D95E DEFB $FF,$FF,$FF,$FF,$7F,$FE,$1F,$F8
D966: Mask, 16x16 pixels. Snake, rearing phase
D966 DEFB $03,$F0,$1F,$FC,$3F,$FE,$7F,$FE sprite-d966
D96E DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FE
D976 DEFB $FF,$FC,$7F,$FE,$7F,$FE,$FF,$FC
D97E DEFB $FF,$F8,$FF,$F8,$7F,$E0,$3F,$C0
D986: Mask, 16x24 pixels. Snake, rearing phase
D986 DEFB $03,$F0,$1F,$FC,$3F,$FE,$7F,$FE sprite-d986
D98E DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FE
D996 DEFB $FF,$FC,$7F,$FE,$7F,$FE,$FF,$FC
D99E DEFB $FF,$F8,$FF,$F0,$FF,$E0,$FF,$E0
D9A6 DEFB $FF,$F0,$7F,$F8,$7F,$FC,$7F,$FC
D9AE DEFB $3F,$FC,$3F,$FE,$3F,$FE,$1F,$FC
D9B6: Mask, 16x32 pixels. Snake, rearing phase
D9B6 DEFB $03,$F0,$1F,$FC,$3F,$FE,$7F,$FE sprite-d9b6
D9BE DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FE
D9C6 DEFB $FF,$FC,$7F,$FE,$7F,$FE,$FF,$FC
D9CE DEFB $FF,$F8,$FF,$F0,$FF,$E0,$FF,$E0
D9D6 DEFB $FF,$F0,$7F,$F8,$7F,$FC,$7F,$FC
D9DE DEFB $3F,$FC,$3F,$FE,$3F,$FE,$3F,$FE
D9E6 DEFB $3F,$FE,$3F,$FE,$7F,$FE,$FF,$FE
D9EE DEFB $FF,$FE,$7F,$FC,$1F,$F0,$07,$C0
D9F6: Mask, 16x32 pixels. Sea Horse
D9F6 DEFB $0F,$00,$7F,$C0,$7F,$E0,$FF,$E0 sprite-d9f6
D9FE DEFB $7F,$F0,$FF,$E0,$FF,$FC,$7F,$FE
DA06 DEFB $FF,$FF,$FF,$FF,$7F,$FF,$7F,$FE
DA0E DEFB $FF,$FC,$7F,$F0,$FF,$F0,$3F,$F8
DA16 DEFB $7F,$F8,$3F,$F0,$1F,$F0,$3F,$E0
DA1E DEFB $1F,$C0,$3F,$00,$3F,$00,$1E,$60
DA26 DEFB $3E,$F0,$3C,$F8,$3E,$F8,$1F,$F0
DA2E DEFB $1F,$F0,$0F,$E0,$07,$C0,$03,$00
DA36: Mask, 16x32 pixels. Sea Horse
DA36 DEFB $03,$8C,$1F,$EE,$1F,$FF,$7F,$FF sprite-da36
DA3E DEFB $7F,$FE,$FF,$FC,$7F,$F8,$FF,$F0
DA46 DEFB $7F,$E0,$3F,$80,$7F,$E0,$FF,$F0
DA4E DEFB $FF,$F8,$DF,$FC,$3F,$FC,$7F,$FC
DA56 DEFB $1F,$FC,$3F,$FC,$1F,$F8,$3F,$F0
DA5E DEFB $0F,$E0,$1F,$C0,$1F,$D0,$3F,$B8
DA66 DEFB $1F,$FC,$3F,$FC,$1F,$FC,$07,$FC
DA6E DEFB $0F,$F8,$07,$F0,$03,$E0,$01,$80
DA76: Mask, 32x32 pixels. Baby whale
DA76 DEFB $00,$00,$00,$00,$00,$00,$7C,$00 sprite-da76
DA7E DEFB $00,$03,$FF,$00,$00,$07,$FF,$C0
DA86 DEFB $40,$FF,$FF,$E0,$E3,$FF,$FF,$F0
DA8E DEFB $F7,$FF,$FF,$F8,$FF,$FF,$FF,$F8
DA96 DEFB $FF,$FF,$FF,$FC,$7F,$FF,$FF,$FC
DA9E DEFB $1F,$FF,$FF,$FE,$3F,$FF,$FF,$FE
DAA6 DEFB $1F,$FF,$FF,$FE,$0F,$FF,$FF,$FF
DAAE DEFB $03,$FF,$FF,$FF,$03,$FF,$FF,$FF
DAB6 DEFB $03,$FF,$FF,$FF,$03,$FF,$FF,$FF
DABE DEFB $03,$FF,$FF,$FF,$03,$FF,$FF,$FE
DAC6 DEFB $01,$FF,$FF,$FF,$01,$FF,$FF,$FE
DACE DEFB $01,$FF,$FF,$FF,$00,$FF,$FF,$FF
DAD6 DEFB $00,$7F,$FF,$FE,$00,$3F,$FF,$FE
DADE DEFB $00,$7F,$FF,$FC,$00,$FF,$FF,$F8
DAE6 DEFB $00,$FF,$FF,$F8,$00,$FF,$FF,$F0
DAEE DEFB $00,$7D,$FF,$E0,$00,$38,$7F,$00
DAF6: Mask, 32x32 pixels. Baby whale
DAF6 DEFB $00,$00,$7C,$00,$00,$01,$FF,$00 sprite-daf6
DAFE DEFB $00,$07,$FF,$C0,$00,$1F,$FF,$E0
DB06 DEFB $00,$3F,$FF,$F0,$00,$7F,$FF,$F8
DB0E DEFB $00,$7F,$FF,$F8,$00,$FF,$FF,$FC
DB16 DEFB $00,$FF,$FF,$FC,$01,$FF,$FF,$FE
DB1E DEFB $01,$FF,$FF,$FE,$03,$FF,$FF,$FE
DB26 DEFB $03,$FF,$FF,$FF,$03,$FF,$FF,$FF
DB2E DEFB $03,$FF,$FF,$FF,$03,$FF,$FF,$FF
DB36 DEFB $0F,$FF,$FF,$FF,$1F,$FF,$FF,$FF
DB3E DEFB $3F,$FF,$FF,$FE,$3F,$FF,$FF,$FF
DB46 DEFB $7F,$FF,$FF,$FE,$FF,$FF,$FF,$FF
DB4E DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FE
DB56 DEFB $FF,$FF,$FF,$FE,$7B,$FF,$FF,$FC
DB5E DEFB $23,$FF,$FF,$F8,$01,$FB,$FF,$F8
DB66 DEFB $00,$F1,$FF,$F0,$00,$00,$FF,$E0
DB6E DEFB $00,$00,$1F,$00,$00,$00,$00,$00
DB76: Mask, 32x32 pixels. Baby whale
DB76 DEFB $00,$00,$00,$00,$00,$00,$00,$00 sprite-db76
DB7E DEFB $00,$00,$7C,$00,$00,$03,$FF,$00
DB86 DEFB $00,$0F,$FF,$C0,$00,$1F,$FF,$E0
DB8E DEFB $00,$3F,$FF,$F0,$00,$3F,$FF,$F8
DB96 DEFB $00,$7F,$FF,$FC,$00,$7F,$FF,$FC
DB9E DEFB $00,$FF,$FF,$FC,$00,$FF,$FF,$FE
DBA6 DEFB $00,$FF,$FF,$FE,$00,$FF,$FF,$FE
DBAE DEFB $01,$FF,$FF,$FF,$39,$FF,$FF,$FF
DBB6 DEFB $7F,$FF,$FF,$FF,$FF,$FF,$FF,$FF
DBBE DEFB $FF,$FF,$FF,$FE,$FF,$FF,$FF,$FF
DBC6 DEFB $3F,$FF,$FF,$FF,$1F,$FF,$FF,$FE
DBCE DEFB $07,$FF,$FF,$FE,$03,$FF,$FF,$FF
DBD6 DEFB $00,$FF,$FF,$FF,$00,$7F,$FF,$FF
DBDE DEFB $00,$7F,$FF,$FF,$00,$3F,$FF,$FE
DBE6 DEFB $00,$1F,$FF,$9C,$00,$0F,$FE,$00
DBEE DEFB $00,$07,$FC,$00,$00,$01,$C0,$00
DBF6: Mask, 32x32 pixels. Baby whale
DBF6 DEFB $00,$00,$7C,$00,$00,$03,$FF,$00 sprite-dbf6
DBFE DEFB $00,$0F,$FF,$C0,$00,$1F,$FF,$E0
DC06 DEFB $00,$3F,$FF,$F0,$00,$3F,$FF,$F8
DC0E DEFB $00,$7F,$FF,$FC,$00,$7F,$FF,$FC
DC16 DEFB $00,$FF,$FF,$FC,$00,$FF,$FF,$FE
DC1E DEFB $00,$FF,$FF,$FE,$00,$FF,$FF,$FE
DC26 DEFB $01,$FF,$FF,$FF,$01,$FF,$FF,$FF
DC2E DEFB $01,$FF,$FF,$FF,$01,$FF,$FF,$FF
DC36 DEFB $01,$FF,$FF,$FF,$03,$FF,$FF,$FE
DC3E DEFB $07,$FF,$FF,$FF,$07,$FF,$FF,$FE
DC46 DEFB $03,$FF,$FF,$FC,$0F,$FF,$FF,$FC
DC4E DEFB $1F,$FF,$FF,$FC,$3F,$FF,$FF,$FE
DC56 DEFB $7F,$FF,$FF,$FE,$FF,$FF,$FF,$FE
DC5E DEFB $FF,$FF,$FF,$7C,$7F,$87,$7E,$38
DC66 DEFB $38,$00,$3C,$00,$00,$00,$00,$00
DC6E DEFB $00,$00,$00,$00,$00,$00,$00,$00
DC76: Sprite, 8x24 pixels. Spark/debris
DC76 DEFB $47,$EF,$F7,$EA,$5C,$3E,$3E,$7F sprite-dc76
DC7E DEFB $FF,$77,$22,$00,$00,$00,$00,$00
DC86 DEFB $00,$00,$0C,$1E,$3F,$3F,$1E,$0C
DC8E: Sprite, 8x24 pixels. Spark/debris
DC8E DEFB $12,$BB,$D7,$AA,$7C,$28,$3C,$7A sprite-dc8e
DC96 DEFB $27,$02,$00,$00,$00,$00,$00,$38
DC9E DEFB $7C,$FE,$FE,$FE,$7C,$38,$00,$00
DCA6: Sprite, 8x24 pixels. Spark/debris
DCA6 DEFB $02,$07,$12,$38,$10,$00,$08,$1C sprite-dca6
DCAE DEFB $08,$00,$1C,$3E,$7F,$FF,$FF,$FF
DCB6 DEFB $7F,$3E,$1C,$00,$00,$00,$00,$00
DCBE: Sprite, 8x24 pixels. Spark/debris
DCBE DEFB $00,$00,$00,$00,$00,$3C,$7E,$FF sprite-dcbe
DCC6 DEFB $FF,$FF,$FF,$FF,$FF,$FF,$7E,$3C
DCCE DEFB $00,$00,$00,$00,$00,$00,$00,$00
DCD6: Sprite, 8x8 pixels. Gem/diamond icon
DCD6 DEFB $07,$08,$03,$07,$10,$07,$08,$00 sprite-dcd6
DCDE: Sprite, 8x8 pixels. Gem/diamond icon
DCDE DEFB $03,$04,$0B,$07,$04,$0B,$00,$00 sprite-dcde
DCE6: Sprite, 8x8 pixels. Gem/diamond icon
DCE6 DEFB $01,$02,$03,$0B,$04,$01,$02,$00 sprite-dce6
DCEE: Sprite, 8x8 pixels. Gem/diamond icon
DCEE DEFB $00,$01,$04,$03,$01,$00,$01,$00 sprite-dcee
DCF6: Sprite, 8x8 pixels. Gem/diamond icon
DCF6 DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF sprite-dcf6
DCFE: Sprite, 32x32 pixels. Cube/pedestal
DCFE DEFB $00,$00,$00,$00,$00,$00,$80,$00 sprite-dcfe
DD06 DEFB $00,$03,$60,$00,$00,$0E,$B8,$00
DD0E DEFB $00,$3D,$56,$00,$00,$EA,$AB,$80
DD16 DEFB $03,$D5,$55,$60,$0E,$AA,$AA,$B8
DD1E DEFB $39,$55,$55,$4E,$2C,$AA,$AA,$BA
DD26 DEFB $33,$55,$54,$E2,$28,$CA,$AB,$96
DD2E DEFB $35,$39,$5E,$2A,$2A,$8E,$31,$56
DD36 DEFB $35,$51,$CA,$AA,$2A,$AA,$55,$56
DD3E DEFB $35,$55,$6A,$AA,$2A,$AB,$55,$56
DD46 DEFB $35,$55,$6A,$AA,$2A,$AB,$55,$56
DD4E DEFB $35,$55,$6A,$AA,$2A,$AB,$55,$56
DD56 DEFB $35,$55,$6A,$AA,$2A,$AB,$55,$56
DD5E DEFB $39,$55,$6A,$AE,$0E,$AB,$55,$78
DD66 DEFB $03,$D5,$6A,$E0,$00,$EB,$57,$80
DD6E DEFB $00,$3D,$6E,$00,$00,$0F,$78,$00
DD76 DEFB $00,$03,$E0,$00,$00,$00,$80,$00
DD7E: Sprite, 32x32 pixels. Passage, closed/blocked
DD7E DEFB $58,$3F,$8F,$10,$19,$E0,$7E,$E0 sprite-dd7e
DD86 DEFB $9F,$9F,$87,$60,$5E,$3F,$F3,$B0
DD8E DEFB $18,$FF,$FC,$F0,$33,$FF,$FE,$F0
DD96 DEFB $B7,$F0,$7E,$70,$37,$C0,$1F,$78
DD9E DEFB $37,$28,$0F,$38,$6E,$55,$07,$B8
DDA6 DEFB $EE,$AA,$87,$B8,$EC,$55,$43,$9C
DDAE DEFB $DC,$AA,$A3,$DC,$D9,$55,$43,$D4
DDB6 DEFB $D8,$AA,$A1,$DC,$D9,$55,$51,$DC
DDBE DEFB $D8,$AA,$A1,$D8,$DD,$55,$41,$DC
DDC6 DEFB $D8,$AA,$A3,$DC,$DD,$55,$43,$9C
DDCE DEFB $EE,$AA,$87,$BC,$6E,$55,$07,$2C
DDD6 DEFB $6F,$2A,$0F,$78,$6F,$90,$3E,$78
DDDE DEFB $77,$E0,$FE,$D8,$37,$FF,$FC,$D0
DDE6 DEFB $1B,$FF,$F9,$B0,$1C,$FF,$E7,$50
DDEE DEFB $2F,$7F,$BE,$B0,$17,$1E,$75,$70
DDF6 DEFB $0B,$61,$EA,$A0,$15,$1E,$85,$60
DDFE: Sprite, 16x16 pixels. Passage, part
DDFE DEFB $00,$E0,$03,$F0,$0F,$A8,$7D,$54 sprite-ddfe
DE06 DEFB $7A,$AA,$F5,$57,$FA,$AB,$FF,$55
DE0E DEFB $7B,$AA,$67,$55,$1F,$AA,$03,$D5
DE16 DEFB $00,$6A,$00,$77,$00,$1E,$00,$07
DE1E: Sprite, 16x16 pixels. Passage, part
DE1E DEFB $C0,$00,$70,$00,$AC,$00,$5F,$7E sprite-de1e
DE26 DEFB $BB,$EB,$75,$57,$EA,$AB,$D5,$57
DE2E DEFB $FF,$AF,$67,$FF,$1F,$5E,$03,$AE
DE36 DEFB $00,$FE,$00,$7C,$00,$10,$00,$00
DE3E: Sprite, 16x16 pixels. Passage, part
DE3E DEFB $00,$03,$00,$0F,$00,$3F,$7E,$BF sprite-de3e
DE46 DEFB $FF,$DF,$BF,$EF,$DF,$F7,$DF,$FB
DE4E DEFB $AE,$1F,$D1,$66,$66,$B8,$55,$40
DE56 DEFB $6B,$00,$36,$00,$08,$00,$00,$00
DE5E: Sprite, 16x16 pixels. Passage, part
DE5E DEFB $07,$00,$0F,$C0,$1F,$F0,$3F,$FE sprite-de5e
DE66 DEFB $7F,$F2,$7F,$EB,$FF,$95,$FF,$AB
DE6E DEFB $FF,$56,$FE,$AA,$FE,$58,$FD,$C0
DE76 DEFB $7A,$00,$96,$00,$E8,$00,$E0,$00
DE7E: Sprite, 16x16 pixels. Passage, part
DE7E DEFB $A0,$00,$50,$00,$BC,$00,$77,$00 sprite-de7e
DE86 DEFB $EA,$C0,$55,$70,$AA,$AC,$55,$57
DE8E DEFB $AA,$AA,$55,$55,$3A,$AA,$0D,$55
DE96 DEFB $03,$AA,$00,$D5,$00,$3A,$00,$07
DE9E: Sprite, 16x16 pixels. Passage, part
DE9E DEFB $00,$01,$00,$0F,$00,$37,$00,$F9 sprite-de9e
DEA6 DEFB $03,$FE,$0F,$FF,$3F,$FF,$FF,$FF
DEAE DEFB $FF,$FF,$FF,$FE,$FF,$FC,$FF,$F0
DEB6 DEFB $FF,$C0,$FF,$00,$FC,$00,$E0,$00
DEBE: Mask, 16x24 pixels.
DEBE DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF sprite-debe
DEC6 DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
DECE DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
DED6 DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
DEDE DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
DEE6 DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
DEEE: Mask, 16x16 pixels.
DEEE DEFB $1C,$00,$37,$80,$6B,$E0,$75,$E0 sprite-deee
DEF6 DEFB $7F,$F8,$FF,$FC,$FF,$FC,$FF,$8E
DEFE DEFB $7B,$56,$66,$2A,$1F,$56,$03,$AE
DF06 DEFB $00,$7E,$00,$7C,$00,$10,$00,$00
DF0E: Mask, 16x16 pixels.
DF0E DEFB $00,$E0,$01,$B8,$07,$54,$0A,$AA sprite-df0e
DF16 DEFB $1B,$55,$14,$D3,$7A,$AD,$55,$53
DF1E DEFB $2A,$07,$74,$3E,$6A,$B8,$55,$E0
DF26 DEFB $6A,$00,$3E,$00,$08,$00,$00,$00
DF2E: Sprite, 88x16 pixels. RUSTOMETER gauge graphic
DF2E DEFB $03,$FF,$FF,$FF,$FF,$FF,$FF,$FF sprite-df2e
DF36 DEFB $FF,$FF,$FF,$03,$80,$00,$00,$00
DF3E DEFB $00,$00,$00,$00,$00,$07,$03,$7F
DF46 DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
DF4E DEFB $FB,$03,$7F,$FF,$FF,$FF,$FF,$FF
DF56 DEFB $FF,$FF,$FF,$FB,$03,$80,$00,$00
DF5E DEFB $00,$00,$00,$00,$00,$00,$07,$03
DF66 DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
DF6E DEFB $FF,$FF,$00,$00,$00,$00,$00,$00
DF76 DEFB $00,$00,$00,$00,$00,$00,$00,$00
DF7E DEFB $00,$00,$00,$00,$00,$00,$00,$00
DF86 DEFB $03,$FF,$FF,$FF,$FF,$FF,$FF,$FF
DF8E DEFB $FF,$FF,$FF,$03,$7F,$FF,$F3,$51
DF96 DEFB $11,$51,$11,$3F,$FF,$FB,$02,$B8
DF9E DEFB $00,$75,$57,$B5,$17,$B7,$5C,$00
DFA6 DEFB $75,$03,$70,$00,$35,$51,$B5,$11
DFAE DEFB $B1,$58,$00,$3B,$03,$71,$FE,$33
DFB6 DEFB $5D,$B5,$57,$B7,$38,$FE,$3B,$02
DFBE DEFB $B8,$00,$75,$5D,$B5,$57,$B7,$5C
DFC6 DEFB $00,$75,$03,$7F,$FF,$F5,$11,$B1
DFCE DEFB $51,$B1,$5F,$FF,$FB,$03,$FF,$FF
DFD6 DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
DFDE: Sprite, 32x32 pixels. Passage, open
DFDE DEFB $58,$3F,$8F,$10,$19,$F0,$7E,$E0 sprite-dfde
DFE6 DEFB $9F,$9C,$27,$60,$50,$03,$11,$B0
DFEE DEFB $10,$F8,$CC,$F0,$37,$1C,$22,$70
DFF6 DEFB $B8,$FE,$12,$70,$37,$FF,$89,$78
DFFE DEFB $37,$FF,$C9,$38,$6F,$FF,$E4,$B8
E006 DEFB $EF,$FF,$E4,$B8,$EF,$FF,$E4,$9C
E00E DEFB $DF,$FF,$E2,$9C,$DF,$FF,$F2,$9C
E016 DEFB $DF,$FF,$F2,$5C,$DF,$FF,$F2,$5C
E01E DEFB $DF,$FF,$F4,$58,$DF,$FF,$E4,$9C
E026 DEFB $DF,$FF,$E4,$9C,$DF,$FF,$E5,$1C
E02E DEFB $EF,$FF,$E5,$3C,$6F,$FF,$E9,$7C
E036 DEFB $6F,$FF,$49,$78,$6F,$FF,$92,$78
E03E DEFB $77,$F2,$22,$58,$3D,$6C,$C4,$D0
E046 DEFB $1C,$F1,$19,$B0,$1E,$06,$67,$50
E04E DEFB $2F,$F9,$BE,$B0,$17,$1E,$75,$70
E056 DEFB $0B,$61,$EA,$A0,$15,$1E,$85,$60
E05E: Sprite, 88x32 pixels. Sign: "PIRANHA / DO NOT TAP GLASS"
E05E DEFB $00,$00,$00,$00,$00,$00,$00,$00 sprite-e05e
E066 DEFB $00,$00,$00,$FF,$FF,$FF,$FF,$FF
E06E DEFB $FF,$FF,$FE,$00,$00,$00,$80,$00
E076 DEFB $00,$00,$00,$00,$00,$02,$00,$00
E07E DEFB $00,$FF,$FF,$FF,$FF,$FF,$FF,$FF
E086 DEFB $FE,$00,$00,$00,$DF,$FF,$FF,$FF
E08E DEFB $FF,$FF,$FF,$F6,$00,$00,$00,$AF
E096 DEFB $FF,$F1,$11,$15,$51,$FF,$EA,$00
E09E DEFB $00,$00,$DF,$FF,$F5,$B5,$51,$55
E0A6 DEFB $FF,$F6,$00,$00,$00,$FF,$FF,$F5
E0AE DEFB $B5,$51,$55,$FF,$FE,$00,$00,$00
E0B6 DEFB $FF,$FF,$F1,$B3,$11,$11,$FF,$FE
E0BE DEFB $00,$00,$00,$FF,$FF,$F7,$B5,$51
E0C6 DEFB $55,$FF,$FE,$00,$00,$00,$DF,$FF
E0CE DEFB $F7,$B5,$55,$55,$FF,$F6,$00,$00
E0D6 DEFB $00,$AF,$FF,$F7,$15,$55,$55,$FF
E0DE DEFB $EA,$00,$00,$00,$DF,$FF,$FF,$FF
E0E6 DEFB $FF,$FF,$FF,$F6,$00,$00,$00,$FF
E0EE DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FE,$00
E0F6 DEFB $00,$00,$80,$00,$00,$00,$00,$00
E0FE DEFB $00,$02,$00,$00,$00,$FF,$FF,$FF
E106 DEFB $FF,$FF,$FF,$FF,$FE,$00,$00,$00
E10E DEFB $00,$00,$00,$00,$00,$00,$00,$00
E116 DEFB $00,$00,$00,$FF,$FF,$FF,$FF,$FF
E11E DEFB $FF,$FF,$FF,$FF,$FF,$FC,$80,$00
E126 DEFB $00,$00,$00,$00,$00,$00,$00,$00
E12E DEFB $04,$FF,$FF,$FF,$FF,$FF,$FF,$FF
E136 DEFB $FF,$FF,$FF,$FC,$DF,$FF,$FF,$FF
E13E DEFB $FF,$FF,$FF,$FF,$FF,$FF,$EC,$AF
E146 DEFB $CC,$7E,$A2,$3E,$22,$3E,$2E,$22
E14E DEFB $3F,$D4,$DF,$D5,$7E,$2B,$7F,$6A
E156 DEFB $BE,$AE,$AE,$FF,$EC,$FF,$D5,$7E
E15E DEFB $2B,$7F,$6A,$BE,$EE,$AE,$FF,$FC
E166 DEFB $FF,$D5,$7E,$2B,$7F,$62,$3E,$2E
E16E DEFB $22,$3F,$FC,$FF,$D5,$7E,$2B,$7F
E176 DEFB $6A,$FE,$AE,$BB,$BF,$FC,$DF,$D5
E17E DEFB $7E,$AB,$7F,$6A,$FE,$AE,$BB,$BF
E186 DEFB $EC,$AF,$CC,$7E,$A3,$7F,$6A,$FE
E18E DEFB $22,$A2,$3F,$D4,$DF,$FF,$FF,$FF
E196 DEFB $FF,$FF,$FF,$FF,$FF,$FF,$EC,$FF
E19E DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
E1A6 DEFB $FF,$FC,$80,$00,$00,$00,$00,$00
E1AE DEFB $00,$00,$00,$00,$04,$FF,$FF,$FF
E1B6 DEFB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FC
E1BE: Data block at E1BE
E1BE DEFB $31,$D4,$00,$00,$00,$00,$00,$00
E1C6 DEFB $00,$00,$00,$00,$00,$00,$00,$00
E1CE DEFB $00,$00,$00,$00,$00,$00,$00,$00
E1D6 DEFB $00,$00,$00,$00,$00,$00,$00,$00
E1DE DEFB $00,$00,$00,$00,$00,$00,$00,$00
E1E6 DEFB $00,$00,$00,$00,$00,$00,$00,$00
E1EE DEFB $00,$00,$00,$00,$00,$00,$00,$00
E1F6 DEFB $00,$00,$00,$00,$00,$00,$00,$00
E1FE DEFB $00,$00,$5D,$5D,$5D,$5D,$5D,$5D
E206 DEFB $5D,$5D,$5D,$5D,$5D,$5D,$5D,$5D
E20E DEFB $5D,$5D,$5D,$5D,$5D,$5D,$5D,$5D
E216 DEFB $5D,$5D,$5D,$5D,$5D,$5D,$5D,$5D
E21E DEFB $5D,$5D,$5D,$5D,$5D,$5D,$5D,$5D
E226 DEFB $5D,$5D,$5D,$5D,$5D,$5D,$5D,$5D
E22E DEFB $5D,$5D,$5D,$5D,$5D,$5D,$5D,$5D
E236 DEFB $5D,$5D,$5D,$5D,$5D,$5D,$5D,$5D
E23E DEFB $5D,$5D,$5D,$5D,$5D,$5D,$5D,$5D
E246 DEFB $5D,$5D,$5D,$5D,$5D,$5D,$5D,$5D
E24E DEFB $5D,$5D,$5D,$5D,$5D,$5D,$5D,$5D
E256 DEFB $5D,$5D,$5D,$5D,$5D,$5D,$5D,$5D
E25E DEFB $5D,$5D,$5D,$5D,$5D,$5D,$5D,$5D
E266 DEFB $5D,$5D,$5D,$5D,$5D,$5D,$5D,$5D
E26E DEFB $5D,$5D,$5D,$5D,$5D,$5D,$5D,$5D
E276 DEFB $5D,$5D,$5D,$5D,$5D,$5D,$5D,$5D
E27E DEFB $5D,$5D,$5D,$5D,$5D,$5D,$5D,$5D
E286 DEFB $5D,$5D,$5D,$5D,$5D,$5D,$5D,$5D
E28E DEFB $5D,$5D,$5D,$5D,$5D,$5D,$5D,$5D
E296 DEFB $5D,$5D,$5D,$5D,$5D,$5D,$5D,$5D
E29E DEFB $5D,$5D,$5D,$5D,$5D,$5D,$5D,$5D
E2A6 DEFB $5D,$5D,$5D,$5D,$5D,$5D,$5D,$5D
E2AE DEFB $5D,$5D,$5D,$5D,$5D,$5D,$5D,$5D
E2B6 DEFB $5D,$5D,$5D,$5D,$5D,$5D,$5D,$5D
E2BE DEFB $5D,$5D,$5D,$5D,$5D,$5D,$5D,$5D
E2C6 DEFB $5D,$5D,$5D,$5D,$5D,$5D,$5D,$5D
E2CE DEFB $5D,$5D,$5D,$5D,$5D,$5D,$5D,$5D
E2D6 DEFB $5D,$5D,$5D,$5D,$5D,$5D,$5D,$5D
E2DE DEFB $5D,$5D,$5D,$5D,$5D,$5D,$5D,$5D
E2E6 DEFB $5D,$5D,$5D,$5D,$5D,$5D,$5D,$5D
E2EE DEFB $5D,$5D,$5D,$5D,$5D,$5D,$5D,$5D
E2F6 DEFB $5D,$5D,$5D,$5D,$5D,$5D,$5D,$5D
E2FE DEFB $5D,$5D,$5D,$00,$00,$00,$00,$00
E306 DEFB $00,$00,$00,$00,$00,$00,$00,$00
E30E DEFB $00,$00,$00,$00,$00,$00,$00,$00
E316 DEFB $00,$00,$00,$00,$00,$00,$00,$00
E31E DEFB $00,$00,$00,$00,$00,$00,$00,$00
E326 DEFB $00,$00,$00,$00,$00,$00,$00,$00
E32E DEFB $00,$00,$00,$00,$00,$00,$00,$00
E336 DEFB $00,$00,$00,$00,$00,$00,$00,$00
E33E DEFB $00,$00,$00,$00,$00,$00,$00,$00
E346 DEFB $00,$00,$00,$00,$00,$00,$00,$00
E34E DEFB $00,$00,$00,$00,$00,$00,$00,$00
E356 DEFB $00,$00,$00,$00,$00,$00,$00,$00
E35E DEFB $00,$00,$00,$00,$00,$00,$00,$00
E366 DEFB $00,$00,$00,$00,$00,$00,$00,$00
E36E DEFB $00,$00,$00,$00,$00,$00,$00,$00
E376 DEFB $00,$00,$00,$00,$00,$00,$00,$00
E37E DEFB $00,$00,$00,$00,$00,$00,$00,$00
E386 DEFB $00,$00,$00,$00,$00,$00,$00,$00
E38E DEFB $00,$00
E390: Shadow screen 256x192, 32*192=6144 bytes
screen-e390
E390 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
E3B0 DEFB $F8,$FE,$FE,$FE,$C6,$FE,$FE,$C6,$C0,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$FE,$FE,$C6,$FE,$FE,$FE,$C0,$FE,$00,$00,$00,$00
E3D0 DEFB $FC,$FE,$FE,$FE,$C6,$FE,$FE,$C6,$C0,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$FE,$FE,$E6,$FE,$FE,$FE,$C0,$FE,$00,$00,$00,$00
E3F0 DEFB $C6,$C2,$C6,$18,$FE,$C6,$C6,$C6,$C0,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$C6,$C6,$F6,$18,$C2,$C6,$C0,$C0,$00,$00,$00,$00
E410 DEFB $C6,$F8,$FE,$18,$FE,$FC,$C6,$D6,$C0,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$C0,$C6,$DE,$18,$FE,$C6,$C0,$FE,$00,$00,$00,$00
E430 DEFB $C6,$C2,$FE,$18,$C6,$C6,$C6,$FE,$C6,$18,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$C6,$C6,$CE,$18,$FC,$C6,$C6,$02,$18,$00,$00,$00
E450 DEFB $FC,$FE,$C6,$18,$C6,$FE,$FE,$EE,$FE,$18,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$FE,$FE,$C6,$18,$CC,$FE,$FE,$FE,$18,$00,$00,$00
E470 DEFB $F8,$FE,$C6,$18,$C6,$FE,$FE,$C6,$FE,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$FE,$FE,$C6,$18,$C6,$FE,$FE,$FE,$00,$00,$00,$00
E490 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
E4B0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
E4D0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
E4F0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
E510 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
E530 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
E550 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
E570 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
E590 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$00,$00
E5B0 DEFB $FE,$00,$FE,$FE,$FE,$C6,$FE,$C6,$00,$FE,$FE,$00,$FE,$FE,$C6,$F8,$FE,$FE,$00,$00,$CF,$FF,$31,$01,$39,$01,$01,$01,$01,$07,$00,$00
E5D0 DEFB $FE,$00,$FE,$FE,$FE,$C6,$FE,$E6,$00,$FE,$FE,$00,$FE,$FE,$E6,$FC,$FE,$FE,$00,$00,$8F,$FF,$27,$01,$39,$01,$01,$01,$01,$03,$00,$00
E5F0 DEFB $C6,$00,$C2,$C2,$18,$C6,$C2,$F6,$00,$18,$C6,$00,$C0,$C2,$F6,$C6,$C2,$C2,$00,$00,$0F,$FF,$0F,$3D,$01,$39,$39,$39,$3D,$39,$00,$00
E610 DEFB $FE,$00,$FE,$F8,$18,$C6,$FE,$DE,$00,$18,$C6,$00,$FE,$F8,$DE,$C6,$F8,$FE,$00,$00,$CF,$FF,$0F,$07,$01,$03,$39,$01,$01,$39,$00,$00
E630 DEFB $FE,$00,$FC,$C2,$18,$C6,$FC,$CE,$00,$18,$C6,$00,$02,$C2,$CE,$C6,$C2,$FC,$00,$00,$CF,$FF,$27,$3D,$E7,$39,$39,$01,$03,$39,$00,$00
E650 DEFB $C6,$00,$CC,$FE,$18,$FE,$CC,$C6,$00,$18,$FE,$00,$FE,$FE,$C6,$FC,$FE,$CC,$00,$00,$03,$FF,$33,$01,$E7,$01,$01,$39,$33,$03,$00,$00
E670 DEFB $C6,$00,$C6,$FE,$18,$FE,$C6,$C6,$00,$18,$FE,$00,$FE,$FE,$C6,$F8,$FE,$C6,$00,$00,$03,$FF,$39,$01,$E7,$01,$01,$39,$39,$07,$00,$00
E690 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
E6B0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
E6D0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
E6F0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
E710 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
E730 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
E750 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
E770 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
E790 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
E7B0 DEFB $FE,$00,$FE,$FE,$7E,$C0,$00,$C6,$FE,$C6,$FE,$FE,$00,$FE,$FE,$FE,$CE,$00,$00,$00,$FE,$00,$CE,$FE,$C6,$FE,$FE,$FE,$FE,$C6,$00,$00
E7D0 DEFB $FE,$00,$FE,$FE,$7E,$C0,$00,$C6,$FE,$C6,$FE,$FE,$00,$FE,$FE,$FE,$D8,$00,$00,$00,$FE,$00,$D8,$FE,$EE,$FE,$FE,$FE,$FE,$E6,$00,$00
E7F0 DEFB $C6,$00,$06,$C6,$18,$C0,$00,$FE,$C6,$C6,$C0,$C2,$00,$C2,$C6,$C6,$F0,$00,$00,$00,$02,$00,$F0,$C2,$FE,$C6,$C0,$18,$C6,$F6,$00,$00
E810 DEFB $FC,$00,$C6,$FE,$18,$C0,$00,$FE,$C6,$C6,$FE,$F8,$00,$FE,$C6,$C0,$F0,$00,$00,$00,$FE,$00,$F0,$F8,$D6,$FE,$FE,$18,$C6,$DE,$00,$00
E830 DEFB $C6,$00,$C6,$FE,$18,$C6,$00,$C6,$C6,$C6,$02,$C2,$00,$FC,$C6,$C6,$D8,$00,$00,$00,$C0,$00,$D8,$C2,$C6,$FE,$02,$18,$C6,$CE,$00,$00
E850 DEFB $FE,$00,$FE,$C6,$7E,$FE,$00,$C6,$FE,$FE,$FE,$FE,$00,$CC,$FE,$FE,$CC,$00,$00,$00,$FE,$00,$CC,$FE,$C6,$C0,$FE,$18,$FE,$C6,$00,$00
E870 DEFB $FE,$00,$FE,$C6,$7E,$FE,$00,$C6,$FE,$FE,$FE,$FE,$00,$C6,$FE,$FE,$C6,$00,$00,$00,$FE,$00,$C6,$FE,$C6,$C0,$FE,$18,$FE,$C6,$00,$00
E890 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
E8B0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
E8D0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
E8F0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
E910 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
E930 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
E950 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
E970 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
E990 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
E9B0 DEFB $FE,$00,$FE,$00,$FE,$FE,$C0,$FE,$00,$FE,$00,$C6,$7E,$FE,$00,$00,$00,$00,$00,$00,$FE,$00,$FE,$7E,$C6,$FE,$C0,$FE,$7E,$FE,$00,$00
E9D0 DEFB $FE,$00,$FE,$00,$FE,$FE,$C0,$FE,$00,$FE,$00,$EE,$7E,$FE,$00,$00,$00,$00,$00,$00,$FE,$00,$FE,$7E,$E6,$FE,$C0,$FE,$7E,$FE,$00,$00
E9F0 DEFB $C6,$00,$C6,$00,$C0,$C6,$C0,$C2,$00,$C6,$00,$FE,$18,$C6,$00,$00,$00,$00,$00,$00,$06,$00,$C0,$18,$F6,$C6,$C0,$C6,$18,$C2,$00,$00
EA10 DEFB $C0,$00,$C6,$00,$FE,$C6,$C0,$F8,$00,$C6,$00,$D6,$18,$C6,$00,$00,$00,$00,$00,$00,$3E,$00,$FE,$18,$DE,$C0,$C0,$FE,$18,$FE,$00,$00
EA30 DEFB $C6,$00,$C6,$00,$02,$C6,$C6,$C2,$00,$C6,$00,$C6,$18,$C6,$00,$00,$00,$00,$00,$00,$06,$00,$02,$18,$CE,$C6,$C6,$FE,$18,$FC,$00,$00
EA50 DEFB $FE,$00,$FE,$00,$FE,$FE,$FE,$FE,$00,$FE,$00,$C6,$7E,$FE,$00,$00,$00,$00,$00,$00,$FE,$00,$FE,$7E,$C6,$FE,$FE,$C6,$7E,$CC,$00,$00
EA70 DEFB $FE,$00,$FE,$00,$FE,$FE,$FE,$FE,$00,$FE,$00,$C6,$7E,$FE,$00,$00,$00,$00,$00,$00,$FE,$00,$FE,$7E,$C6,$FE,$FE,$C6,$7E,$C6,$00,$00
EA90 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
EAB0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
EAD0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
EAF0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
EB10 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
EB30 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
EB50 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
EB70 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
EB90 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
EBB0 DEFB $F8,$00,$C6,$FE,$FE,$FE,$FE,$FE,$FE,$FE,$FE,$CE,$00,$C6,$FE,$FE,$FE,$C0,$00,$00,$C0,$00,$FE,$C6,$FE,$FE,$FE,$FE,$00,$00,$00,$00
EBD0 DEFB $FC,$00,$C6,$FE,$FE,$FE,$FE,$FE,$FE,$FE,$FE,$D8,$00,$C6,$FE,$FE,$FE,$C0,$00,$00,$CC,$00,$FE,$C6,$FE,$FE,$FE,$FE,$00,$00,$00,$00
EBF0 DEFB $C6,$00,$FE,$C2,$C6,$C2,$18,$C6,$C2,$C2,$C6,$F0,$00,$FE,$C6,$18,$C2,$C0,$00,$00,$CC,$00,$C6,$C6,$C2,$C0,$C6,$C2,$00,$00,$00,$00
EC10 DEFB $C6,$00,$FE,$F8,$FE,$FE,$18,$FC,$FE,$F8,$FE,$F0,$00,$FE,$C6,$18,$F8,$C0,$00,$00,$FC,$00,$C0,$C6,$FE,$FE,$C6,$FE,$00,$00,$00,$00
EC30 DEFB $C6,$00,$C6,$C2,$FE,$FC,$18,$C6,$FC,$C2,$FE,$D8,$00,$C6,$C6,$18,$C2,$C6,$00,$00,$FC,$00,$C6,$C6,$FC,$02,$C6,$FC,$00,$00,$00,$00
EC50 DEFB $FC,$00,$C6,$FE,$C6,$CC,$18,$FE,$CC,$FE,$C6,$CC,$00,$C6,$FE,$18,$FE,$FE,$00,$00,$0C,$00,$FE,$FE,$CC,$FE,$FE,$CC,$00,$00,$00,$00
EC70 DEFB $F8,$00,$C6,$FE,$C6,$C6,$18,$FE,$C6,$FE,$C6,$C6,$00,$C6,$FE,$18,$FE,$FE,$00,$00,$0C,$00,$FE,$FE,$C6,$FE,$FE,$C6,$00,$00,$00,$00
EC90 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
ECB0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
ECD0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$02,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
ECF0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$45,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
ED10 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$E2,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
ED30 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$40,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
ED50 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$08,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
ED70 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$14,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
ED90 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$08,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
EDB0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$22,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
EDD0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$57,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
EDF0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$22,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
EE10 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$01,$10,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
EE30 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$3C,$00,$00,$00,$00,$40,$38,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
EE50 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$3F,$E2,$00,$00,$00,$00,$E0,$7C,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
EE70 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$FF,$C1,$C0,$00,$00,$00,$44,$3A,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
EE90 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$01,$FF,$A8,$E0,$00,$00,$00,$1A,$15,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
EEB0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$03,$DF,$95,$50,$00,$00,$00,$11,$22,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
EED0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$0F,$7F,$AA,$AC,$00,$00,$00,$4A,$70,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
EEF0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$1E,$77,$55,$56,$00,$00,$00,$04,$20,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
EF10 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$3F,$FC,$2A,$A2,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
EF30 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$7D,$BE,$55,$40,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
EF50 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$73,$5F,$2A,$8C,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
EF70 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$32,$BF,$8D,$56,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
EF90 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$19,$5F,$F6,$BE,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
EFB0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$06,$B0,$BF,$FC,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
EFD0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$03,$77,$7F,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
EFF0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$27,$80,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F010 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$01,$86,$C0,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F030 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$03,$C7,$60,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$30,$0C,$00,$00,$00,$00,$00,$00,$00,$00,$00
F050 DEFB $00,$00,$00,$00,$00,$01,$80,$00,$07,$E4,$F0,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$69,$9E,$00,$00,$00,$00,$00,$00,$00,$00,$00
F070 DEFB $00,$00,$00,$00,$00,$07,$E0,$00,$1E,$E3,$EF,$C0,$00,$00,$00,$00,$00,$00,$00,$00,$00,$6B,$DA,$00,$00,$00,$00,$00,$00,$00,$00,$00
F090 DEFB $00,$00,$00,$00,$00,$0F,$B0,$00,$7F,$77,$DF,$E0,$00,$00,$00,$00,$00,$00,$00,$00,$00,$33,$CC,$00,$00,$00,$00,$00,$00,$00,$00,$00
F0B0 DEFB $00,$00,$00,$00,$00,$0F,$A8,$00,$7B,$2F,$B8,$30,$00,$00,$00,$00,$00,$00,$00,$00,$00,$17,$94,$00,$00,$00,$00,$00,$00,$00,$00,$00
F0D0 DEFB $00,$00,$00,$00,$00,$1F,$54,$00,$76,$0F,$37,$D8,$00,$00,$00,$00,$00,$00,$00,$00,$00,$34,$78,$00,$00,$00,$00,$00,$00,$00,$00,$00
F0F0 DEFB $00,$00,$00,$00,$00,$3F,$AC,$00,$6E,$1F,$68,$28,$00,$00,$00,$00,$00,$00,$00,$00,$00,$31,$E0,$00,$00,$00,$00,$00,$00,$00,$00,$00
F110 DEFB $00,$00,$00,$00,$00,$37,$54,$00,$3C,$1F,$72,$98,$00,$00,$00,$00,$00,$00,$00,$00,$00,$19,$80,$00,$00,$00,$00,$00,$00,$00,$00,$00
F130 DEFB $00,$00,$00,$00,$00,$0F,$AE,$00,$1C,$07,$76,$D8,$00,$00,$00,$00,$00,$00,$00,$00,$00,$1F,$F0,$00,$00,$00,$00,$00,$00,$00,$00,$00
F150 DEFB $00,$00,$00,$00,$00,$33,$96,$01,$88,$1F,$70,$18,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$6C,$00,$00,$00,$00,$00,$00,$00,$00,$00
F170 DEFB $00,$00,$00,$00,$00,$7E,$6E,$07,$E0,$3F,$98,$30,$00,$00,$00,$00,$00,$00,$00,$00,$00,$0F,$16,$00,$00,$00,$00,$00,$00,$00,$00,$00
F190 DEFB $00,$00,$00,$00,$00,$7C,$BE,$0F,$B0,$3C,$CF,$E8,$00,$00,$00,$00,$00,$00,$00,$00,$00,$1D,$9E,$00,$00,$00,$00,$00,$00,$00,$00,$00
F1B0 DEFB $00,$00,$00,$00,$00,$79,$5C,$0F,$A8,$78,$0C,$5C,$00,$00,$00,$00,$00,$00,$00,$00,$00,$0C,$CC,$00,$00,$00,$00,$00,$00,$00,$00,$00
F1D0 DEFB $00,$00,$00,$00,$00,$1A,$B8,$1F,$54,$78,$05,$4E,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$E0,$00,$00,$00,$00,$00,$00,$00,$00,$00
F1F0 DEFB $00,$00,$00,$00,$00,$07,$E0,$3F,$AC,$60,$06,$DA,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$70,$00,$00,$00,$00,$00,$00,$00,$00,$00
F210 DEFB $00,$00,$00,$00,$00,$00,$00,$37,$54,$78,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F230 DEFB $00,$00,$00,$00,$00,$00,$00,$0F,$AE,$3E,$00,$00,$00,$07,$3C,$00,$00,$30,$0C,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F250 DEFB $00,$00,$00,$00,$00,$00,$00,$33,$96,$3A,$00,$00,$00,$3F,$E2,$00,$00,$69,$9E,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F270 DEFB $00,$00,$00,$00,$00,$00,$00,$7E,$6E,$00,$00,$00,$00,$FF,$C1,$C0,$00,$6B,$DA,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F290 DEFB $00,$00,$00,$00,$00,$00,$00,$7C,$BE,$00,$00,$00,$01,$FF,$A8,$E0,$00,$33,$CC,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F2B0 DEFB $00,$00,$00,$00,$00,$00,$00,$79,$5C,$00,$00,$00,$03,$DF,$95,$50,$00,$17,$94,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F2D0 DEFB $00,$00,$00,$00,$00,$00,$00,$1A,$B8,$15,$00,$00,$0F,$7F,$AA,$AC,$00,$34,$78,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F2F0 DEFB $00,$00,$00,$00,$00,$00,$00,$07,$E0,$2A,$80,$00,$1E,$77,$55,$56,$00,$31,$E0,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F310 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$01,$45,$40,$00,$3F,$FC,$2A,$AA,$00,$19,$80,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F330 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$02,$A2,$80,$00,$7D,$BE,$55,$56,$00,$1F,$F0,$00,$00,$00,$00,$30,$0C,$00,$00,$00,$00,$00,$00,$00
F350 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$05,$55,$50,$00,$73,$5F,$2A,$AC,$00,$06,$6C,$00,$00,$00,$00,$69,$9E,$00,$00,$00,$00,$00,$00,$00
F370 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$02,$AA,$AA,$80,$32,$BF,$8D,$54,$00,$0F,$16,$00,$00,$00,$00,$6B,$DA,$00,$00,$00,$00,$00,$00,$00
F390 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$01,$55,$55,$40,$19,$5F,$F6,$B8,$00,$1D,$9E,$00,$00,$00,$00,$33,$CC,$00,$00,$00,$00,$00,$00,$00
F3B0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$0A,$AA,$A0,$06,$B7,$BF,$F0,$00,$0C,$CC,$00,$00,$00,$00,$17,$94,$00,$00,$00,$00,$00,$00,$00
F3D0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$55,$40,$03,$7D,$7F,$00,$00,$00,$E0,$00,$00,$00,$00,$34,$78,$00,$00,$00,$00,$00,$00,$00
F3F0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$AA,$80,$00,$2F,$80,$00,$00,$00,$70,$00,$00,$00,$00,$31,$E0,$00,$00,$00,$00,$00,$00,$00
F410 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$54,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$19,$80,$00,$00,$00,$00,$00,$00,$00
F430 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$1F,$F0,$00,$00,$00,$00,$00,$00,$00
F450 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$6C,$00,$00,$00,$00,$00,$00,$00
F470 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$0F,$16,$00,$00,$00,$00,$00,$00,$00
F490 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$1D,$9E,$00,$00,$00,$00,$00,$00,$00
F4B0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$0C,$CC,$00,$00,$00,$00,$00,$00,$00
F4D0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$E0,$00,$00,$00,$00,$00,$00,$00
F4F0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$70,$00,$00,$00,$00,$00,$00,$00
F510 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F530 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F550 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F570 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F590 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F5B0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F5D0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F5F0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F610 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F630 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$1E,$00,$E0,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F650 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$C0,$7C,$18,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F670 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$03,$1E,$0F,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F690 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$77,$C3,$C2,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F6B0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$11,$CE,$39,$E9,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F6D0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$23,$30,$07,$E5,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F6F0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$E4,$11,$C4,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F710 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$44,$E8,$A9,$90,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F730 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$41,$F1,$47,$B1,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F750 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$4B,$FE,$3E,$61,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F770 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$03,$CF,$F9,$C6,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F790 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$11,$E7,$C7,$08,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F7B0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$08,$F1,$F8,$30,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F7D0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$3C,$00,$40,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F7F0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$01,$87,$1E,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F810 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F830 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F850 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F870 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F890 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F8B0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F8D0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F8F0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F910 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F930 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F950 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F970 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F990 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F9B0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F9D0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
F9F0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
FA10 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
FA30 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
FA50 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
FA70 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
FA90 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
FAB0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
FAD0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
FAF0 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
FB10 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
FB30 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
FB50 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
FB70 DEFB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
FB90: Menu tune + key-wait driver
Used by the routine at 85A1.
Sets up the melody-table pointers ($FBAB=$FC99, $FBAF=$FE33), then loops: disable interrupts, play one note via FBD7 (which reads/advances through the melody-index table and produces the tone), scan the keyboard via the ROM KEY-SCAN routine at $028E, and repeat until a key is pressed; then re-enable interrupts and return.
FB90 LD HL,$FC99 point $FBAB at the start of the melody-index table (FC9A, aliased as code for a rare branch -- see its note)
FB93 LD ($FBAB),HL
FB96 LD HL,$FE33 point $FBAF at $FE33 (a second/loop-restart table pointer, not yet explored)
FB99 LD ($FBAF),HL
FB9C DI disable interrupts while bit-banging the tone (precise timing)
FB9D CALL $FBD7 Play one note / check key selection
FBA0 CALL $028E ROM KEY-SCAN: scans the keyboard, returns no-key-found as E=$FF
FBA3 INC E if no key was found (E wraps to 0), loop back and play the next note
FBA4 JR Z,$FB9D
FBA6 EI re-enable interrupts and return (a key was pressed)
FBA7 RET
FBA8: Data block at FBA8
FBA8 DEFB $00,$00,$00
FBAB DEFW $EA60
FBAD DEFW $FC9A
FBAF DEFW $EE48
FBB1 DEFW $FE34
FBB3 DEFB $EE
FBB4: Melody-index table reader/advancer, used by FBD7
Used by the routine at FBD7.
Reads the next byte of the melody-index table (via the pointer at (HL)), advances the pointer, and returns it in A. If the byte is $40 (end-of-tune marker), jumps to FBCF to reload the pointer from a loop-restart address instead.
FBB4 LD E,(HL) DE = the melody-index pointer read from (HL), advanced past the current index
FBB5 INC HL
FBB6 LD D,(HL)
FBB7 INC DE
This entry point is used by the routine at FBCF.
FBB8 LD A,(DE) Read the next index, branch to FBCF on the $40 terminator
FBB9 CP $40
FBBB JR Z,$FBCF
FBBD LD (HL),D Store the advanced pointer back to (HL) and return
FBBE DEC HL
FBBF LD (HL),E
FBC0 RET
FBC1: Melody-index to period lookup, used by FBD7
Used by the routine at FBD7.
Converts a melody-index byte (from FBB4, at (HL)) into an actual tone period by adding $0C and indexing into the period table at FC64; returns the period in H, with L fixed at $01. E.g. index $29 (+$0C=$35) -> FC64+$35 = $FC99 = $01.
FBC1 LD A,(HL) A = the melody index at (HL), add $0C
FBC2 ADD A,$0C
FBC4 LD E,A DE = that value, widened
FBC5 LD D,$00
FBC7 LD HL,$FC64 HL = the period table $FC64 plus the index
FBCA ADD HL,DE
FBCB LD H,(HL) H = the looked-up period byte, L = $01 fixed, return
FBCC LD L,$01
FBCE RET
FBCF: Continuation of FBB4
Used by the routine at FBB4.
Reloads the melody-index pointer from a fixed loop-restart address when FBB4 hits the $40 end-of-tune marker, then resumes reading indices from there.
FBCF INC HL
FBD0 LD E,(HL)
FBD1 INC HL
FBD2 LD D,(HL)
FBD3 DEC HL
FBD4 DEC HL
FBD5 JR $FBB8
FBD7: Play one note / check key selection
Used by the routine at FB90.
Calls FBB4 twice (storing results at $FBA8/$FBA9), then FBC1 twice to check them; if neither matches, falls into the tone-generator loop at $FC04, continuing through $FC15/$FC17/$FC25 into FC34, which toggles the speaker/border via OUT ($FE),A (bit 4 = speaker) in a tight DJNZ-timed square-wave loop -- this is the music heard while the menu waits for input. If both checks match, jumps to the plain delay loop at FC46 instead.
FBD7 LD HL,$FBAB
FBDA CALL $FBB4 Melody-index table reader/advancer, used by FBD7
FBDD LD ($FBA8),A
FBE0 LD HL,$FBAF
FBE3 CALL $FBB4 Melody-index table reader/advancer, used by FBD7
FBE6 LD ($FBA9),A
FBE9 LD HL,$FBA8
FBEC CALL $FBC1 Melody-index to period lookup, used by FBD7
FBEF RL E
FBF1 JP C,$FC9A
FBF4 PUSH HL
FBF5 LD HL,$FBA9
FBF8 CALL $FBC1 Melody-index to period lookup, used by FBD7
FBFB POP DE
FBFC LD A,H
FBFD DEC A
FBFE JR NZ,$FC04
FC00 LD A,D
FC01 DEC A
FC02 JR Z,$FC46 => Plain delay loop
FC04 LD A,($FBB3) C = the note duration count ($FBB3)
FC07 LD C,A
FC08 LD B,$00 B = 0
FC0A LD A,($FBAA) load the key state into AF
FC0D EX AF,AF' and into the shadow AF bank
FC0E LD A,($FBAA)
FC11 LD IXh,D IXh = the previous half-period
FC13 LD D,$10 D = $10, the initial half-period
This entry point is used by the routine at FC34.
FC15 NOP
FC16 NOP
This entry point is used by the routine at FC34.
FC17 EX AF,AF'
FC18 DEC E
FC19 OUT ($FE),A toggle speaker/border bit 4 -- produces the audible tone
FC1B JR NZ,$FC34 => Tone generator loop
FC1D LD E,IXh
FC1F XOR D
FC20 EX AF,AF'
FC21 DEC L
FC22 JP NZ,$FC3B
This entry point is used by the routine at FC34.
FC25 OUT ($FE),A toggle speaker/border bit 4 -- produces the audible tone
FC27 LD L,H
FC28 XOR D
FC29 DJNZ $FC15
FC2B INC C
FC2C JP NZ,$FC17
FC2F RET
FC30: NOTE: not a real string
Literal ASCII "adam" embedded as data/padding between code paths; possibly a programmer's signature.
FC30 DEFM "adam"
FC34: Tone generator loop (continued)
Used by the routine at FBD7.
Toggles the speaker bit via OUT ($FE),A, timed by DJNZ.
FC34 JR Z,$FC34 Self-modified: JR Z to itself, replaced with NOPs when idle
FC36 EX AF,AF' Swap in the shadow AF, decrement L, the pitch/period counter
FC37 DEC L
FC38 JP Z,$FC25 If it reaches zero, jump back to reload the next note
This entry point is used by the routine at FBD7.
FC3B OUT ($FE),A toggle speaker/border bit 4 -- produces the audible tone
FC3D NOP Padding NOPs for timing, then loop B times
FC3E NOP
FC3F DJNZ $FC15
FC41 INC C Increment C, the outer note-duration counter, loop while nonzero
FC42 JP NZ,$FC17
FC45 RET
FC46: Plain delay loop (no sound)
Used by the routine at FBD7.
Decrements a counter via $FBB3, with no OUT ($FE) calls.
FC46 LD A,($FBB3) A = delay parameter from $FBB3
FC49 CPL Complement it, the delay length is inversely encoded
FC4A LD C,A C = complemented value, save BC and AF
FC4B PUSH BC
FC4C PUSH AF
FC4D LD B,$00 B = 0, 256 inner iterations per outer pass
FC4F PUSH HL Save HL, inner loop entry point
FC50 LD HL,$0000 HL = self-modified dummy pointer, target patched elsewhere, unused here as data
FC53 SRA (HL) shift a (self-modified) pointer's byte right 3 times (divide by 8) -- pure delay, no sound
FC55 SRA (HL)
FC57 SRA (HL)
FC59 NOP NOP, padding to equalize timing
FC5A POP HL Restore HL, loop back to $FC4F for the next inner iteration
FC5B DJNZ $FC4F
FC5D DEC C Decrement outer counter C
FC5E JP NZ,$FC4F Loop back to $FC4F while C is nonzero, outer pass
FC61 POP AF Restore AF, BC and return
FC62 POP BC
FC63 RET
FC64: Note/period table for the FC04 tone generator
54 bytes: 53 descending values (= ascending pitch), indexed by FBC1 as (melody-index byte + $0C), plus a trailing byte at $FC99 that is never actually read as a melody index (see FC9A).
FC64 DEFB $FF,$F0,$E3,$D7,$CB,$C0,$B4,$AB,$A1,$97,$90,$88,$80,$79,$72,$6C,$66,$60
FC76 DEFB $5B,$56,$51,$4C,$48,$44,$40,$3D,$39,$36,$33,$30,$2D,$2B,$28,$26,$24,$22
FC88 DEFB $20,$1E,$1C,$1B,$19,$18,$17,$15,$14,$13,$12,$11,$10,$0F,$0E,$0D,$0C,$01
FC9A: Melody-index table (start)
Used by the routine at FBD7.
Each byte, +$0C then indexed into FC64, gives the tone period for one note. Terminated by $40. FBB4 stores the pointer as $FC99 but always increments before reading, so the first byte actually consumed is here at $FC9A ($29); +$0C=$35, and FC64+$35=$FC99=$01. This table also happens to be reachable as code via FBF1 (JP C,$FC9A -- 12x ADD HL,HL, a rarely/never-taken branch that reuses these bytes as opcodes; not its primary purpose).
FC9A DEFB $29,$29,$29,$29,$29,$29,$29,$29
FCA2 DEFB $29,$29,$29,$29,$18,$29,$18,$1A
FCAA DEFB $29,$1B,$1C,$1C,$1C,$0C,$29,$29
FCB2 DEFB $F9,$0B,$0E,$F9,$0A,$29,$F9,$07
FCBA DEFB $0A,$F9,$07,$05,$F4,$04,$03,$F4
FCC2 DEFB $04,$03,$F4,$F4,$F6,$F8,$F8,$F6
FCCA DEFB $0E,$0D,$10,$F4,$0C,$0A,$F4,$09
FCD2 DEFB $0C,$F4,$07,$04,$F9,$05,$04,$F9
FCDA DEFB $05,$04,$F9,$F9,$FB,$FD,$FD,$FB
FCE2 DEFB $F9,$29,$29,$F9,$29,$29,$F9,$29
FCEA DEFB $29,$F9,$29,$29,$F4,$29,$29,$F4
FCF2 DEFB $29,$29,$F4,$F4,$F6,$F8,$F8,$F6
FCFA DEFB $FB,$29,$29,$FB,$29,$29,$FB,$29
FD02 DEFB $29,$FB,$29,$29,$FB,$29,$29,$F8
FD0A DEFB $29,$29,$F4,$29,$29,$F4,$29,$29
FD12 DEFB $F4,$29,$29,$F4,$29,$29,$F4,$29
FD1A DEFB $29,$F4,$29,$29,$F9,$0E,$0E,$F9
FD22 DEFB $29,$29,$F9,$29,$29,$F9,$29,$29
FD2A DEFB $FB,$29,$29,$F4,$29,$29,$FB,$29
FD32 DEFB $29,$F4,$29,$29,$F9,$29,$29,$F9
FD3A DEFB $29,$29,$F9,$29,$29,$F9,$29,$29
FD42 DEFB $F4,$29,$29,$F4,$29,$29,$F4,$29
FD4A DEFB $29,$F4,$29,$29,$F9,$29,$29,$F9
FD52 DEFB $29,$29,$F9,$29,$29,$F9,$29,$29
FD5A DEFB $F9,$29,$05,$29,$29,$29,$FE,$29
FD62 DEFB $29,$29,$29,$29,$FD,$29,$29,$FB
FD6A DEFB $29,$29,$F9,$29,$0C,$0C,$0B,$0C
FD72 DEFB $FB,$29,$29,$FB,$29,$29,$F4,$29
FD7A DEFB $29,$F4,$29,$29,$F9,$29,$29,$F9
FD82 DEFB $29,$29,$F9,$29,$29,$F9,$29,$29
FD8A DEFB $F4,$29,$29,$F4,$29,$29,$F4,$29
FD92 DEFB $29,$F4,$29,$29,$F9,$29,$29,$F9
FD9A DEFB $29,$29,$F9,$29,$29,$F9,$29,$29
FDA2 DEFB $FB,$29,$29,$FB,$29,$29,$F4,$29
FDAA DEFB $29,$F4,$29,$29,$F9,$29,$29,$F9
FDB2 DEFB $29,$29,$F9,$29,$29,$F9,$29,$29
FDBA DEFB $1C,$29,$29,$29,$29,$29,$07,$29
FDC2 DEFB $29,$29,$29,$29,$00,$29,$29,$00
FDCA DEFB $29,$29,$00,$29,$29,$00,$29,$29
FDD2 DEFB $00,$29,$29,$00,$29,$29,$00,$29
FDDA DEFB $29,$00,$29,$29,$05,$29,$29,$05
FDE2 DEFB $29,$29,$05,$29,$29,$05,$29,$29
FDEA DEFB $07,$29,$29,$07,$29,$29,$00,$29
FDF2 DEFB $29,$00,$29,$29,$05,$29,$29,$05
FDFA DEFB $29,$29,$00,$29,$29,$00,$29,$29
FE02 DEFB $F4,$29,$29,$F4,$29,$29,$F4,$29
FE0A DEFB $29,$F4,$29,$29,$F9,$29,$29,$F9
FE12 DEFB $29,$29,$F9,$29,$29,$F9,$29,$29
FE1A DEFB $F9,$29,$1D,$1D,$1F,$21,$22,$29
FE22 DEFB $16,$16,$1A,$18,$FD,$29,$29,$FB
FE2A DEFB $29,$29,$F9,$29,$29,$29,$29,$29
FE32 DEFB $40,$00
FE34: Data block at FE34
FE34 DEFB $18,$17,$1A,$18,$29,$29,$0C,$0B
FE3C DEFB $0E,$0C,$29,$29,$18,$29,$18,$1A
FE44 DEFB $1A,$1B,$1C,$1C,$1C,$00,$29,$29
FE4C DEFB $0C,$0B,$0E,$0C,$0A,$09,$09,$07
FE54 DEFB $0A,$09,$07,$05,$04,$04,$03,$04
FE5C DEFB $04,$03,$04,$F4,$F6,$F8,$F8,$F6
FE64 DEFB $F4,$0D,$10,$0E,$0C,$0A,$16,$15
FE6C DEFB $18,$16,$13,$10,$05,$05,$04,$05
FE74 DEFB $05,$0E,$0C,$0C,$0C,$F6,$F6,$F4
FE7C DEFB $0C,$0B,$0E,$0C,$0A,$09,$09,$07
FE84 DEFB $0A,$09,$07,$05,$04,$04,$03,$04
FE8C DEFB $04,$03,$04,$F4,$F6,$F8,$F8,$F6
FE94 DEFB $07,$07,$09,$0B,$0B,$09,$07,$07
FE9C DEFB $09,$0B,$0B,$09,$07,$07,$11,$10
FEA4 DEFB $10,$0E,$0C,$29,$29,$0C,$29,$29
FEAC DEFB $00,$00,$00,$04,$04,$07,$0E,$0E
FEB4 DEFB $29,$0E,$0E,$29,$0E,$0E,$0E,$0E
FEBC DEFB $0E,$0E,$0E,$0C,$0C,$0C,$09,$0C
FEC4 DEFB $0E,$0E,$0E,$0E,$0E,$0E,$0E,$0C
FECC DEFB $0C,$0C,$09,$0C,$0E,$0E,$0E,$0E
FED4 DEFB $0E,$0E,$0E,$0E,$0C,$09,$09,$05
FEDC DEFB $00,$00,$00,$04,$04,$07,$0E,$0E
FEE4 DEFB $29,$0E,$0E,$29,$0E,$0E,$0E,$0E
FEEC DEFB $0E,$0E,$0E,$0E,$0C,$0C,$09,$0C
FEF4 DEFB $11,$29,$05,$05,$07,$09,$0A,$29
FEFC DEFB $0A,$0A,$0E,$0C,$09,$09,$09,$07
FF04 DEFB $07,$07,$05,$29,$0C,$0C,$0B,$0C
FF0C DEFB $0E,$29,$29,$0E,$0E,$0E,$10,$29
FF14 DEFB $29,$10,$10,$10,$13,$29,$29,$11
FF1C DEFB $11,$11,$11,$29,$11,$11,$10,$0E
FF24 DEFB $0C,$0C,$0D,$0E,$0E,$0D,$0C,$29
FF2C DEFB $11,$11,$10,$0E,$0C,$0C,$0D,$0E
FF34 DEFB $0E,$0D,$0C,$29,$0C,$0C,$0B,$0C
FF3C DEFB $0E,$29,$29,$0E,$0E,$0E,$10,$29
FF44 DEFB $29,$10,$10,$10,$13,$29,$29,$11
FF4C DEFB $11,$11,$11,$29,$11,$11,$10,$11
FF54 DEFB $10,$29,$10,$10,$11,$12,$13,$29
FF5C DEFB $13,$13,$15,$17,$18,$1C,$1A,$18
FF64 DEFB $1C,$1A,$18,$29,$29,$18,$29,$29
FF6C DEFB $0C,$0C,$0C,$10,$10,$13,$1A,$1A
FF74 DEFB $29,$1A,$1A,$29,$1A,$1A,$1A,$1A
FF7C DEFB $1A,$1A,$1A,$18,$18,$18,$15,$18
FF84 DEFB $1A,$1A,$1A,$1A,$1A,$1A,$1A,$1A
FF8C DEFB $18,$18,$15,$18,$1A,$1A,$1A,$1A
FF94 DEFB $1A,$1A,$1A,$1A,$18,$15,$15,$11
FF9C DEFB $0C,$0C,$0C,$10,$10,$13,$1A,$1A
FFA4 DEFB $29,$1A,$1A,$29,$1A,$1A,$1A,$1A
FFAC DEFB $1A,$1A,$1A,$1A,$18,$18,$15,$18
FFB4 DEFB $1D,$29,$11,$11,$13,$15,$16,$29
FFBC DEFB $16,$16,$1A,$18,$15,$15,$15,$13
FFC4 DEFB $13,$13,$11,$29,$29,$29,$29,$29
FFCC DEFB $40,$00
FFCE: Data block at FFCE
FFCE DEFB $00,$00,$00,$00,$00,$00,$00,$00
FFD6 DEFB $00,$00,$00,$00,$00,$00,$00,$00
FFDE DEFB $00,$00,$00,$00,$00,$00,$00,$00
FFE6 DEFB $00,$00,$00,$00,$00,$00,$00,$00
FFEE DEFB $00,$00,$00,$00,$00,$00,$00,$00
FFF6 DEFB $00,$00,$00,$00,$00,$00,$00,$00
FFFE DEFB $00,$03