;;; $0000: Software interrupts ;;; { ;;; $0000: RTS command: reboot ;;; { ROM0:0000 C3 FB 01 jp 01FB } ;;; $0003: Padding ;;; { ROM0:0003 fillto $0008, $00 } ;;; $0008: RTS command: reboot ;;; { ROM0:0008 C3 FB 01 jp 01FB } ;;; $000B: Padding ;;; { ROM0:000B fillto $0028, $00 } ;;; $0028: RTS command: jump using jump table ;;; { ROM0:0028 87 add a,a ROM0:0029 E1 pop hl ROM0:002A 5F ld e,a ROM0:002B 16 00 ld d,00 ROM0:002D 19 add hl,de ROM0:002E 5E ld e,(hl) ROM0:002F 23 inc hl ROM0:0030 56 ld d,(hl) ROM0:0031 D5 push de ROM0:0032 E1 pop hl ROM0:0033 E9 jp hl } ;;; $0034: Padding ;;; { ROM0:0034 fillto $0040, $00 } ;;; $0040: V-blank interrupt point ;;; { ROM0:0040 C3 54 01 jp 0154 ;v-blank int } ;;; $0043: Padding ;;; { ROM0:0043 fillto $0048, $00 } ;;; $0048: LCD interrupt point ;;; { ROM0:0048 C3 5C 3D jp 3D5C ;lcd int } ;;; $004B: Padding ;;; { ROM0:004B fillto $0050, $00 } ;;; $0050: Timer interrupt point ;;; { ROM0:0050 C3 9B 03 jp 039B ;timer int } ;;; $0053: Padding ;;; { ROM0:0053 fillto $0058, $00 } ;;; $0058: Serial interrupt point ;;; { ROM0:0058 C3 53 01 jp 0153 ;serial int } ;;; $005B: Padding ;;; { ROM0:005B fillto $0060, $00 } ;;; $0060: Joypad interrupt point ;;; { ROM0:0060 00 nop ;joypad int } ;;; $0061: Padding ;;; { ROM0:0061 fillto $0100, $00 } } ;;; $0100: Entry point ;;; { ROM0:0100 nop ROM0:0101 C3 50 01 jp 0150 } ;;; $0104: ROM header ;;; { ROM0:0104 CE ED 66 66+ db CE,ED,66,66,CC,0D,00,0B ;logo ROM0:010C 03 73 00 83+ db 03,73,00,83,00,0C,00,0D ROM0:0114 00 08 11 1F+ db 00,08,11,1F,88,89,00,0E ROM0:011C DC CC 6E E6+ db DC,CC,6E,E6,DD,DD,D9,99 ROM0:0124 BB BB 67 63+ db BB,BB,67,63,6E,0E,EC,CC ROM0:012C DD DC 99 9F+ db DD,DC,99,9F,BB,B9,33,3E ROM0:0134 4D 45 54 52+ db 'METROID2' ;title ROM0:0144 00 00 db '' ;new licensee (-) ROM0:0146 00 db 00 ;sgb features (none) ROM0:0147 03 db 03 ;type (mbc1+ram+battery) ROM0:0148 03 db 03 ;rom size (256K) ROM0:0149 02 db 02 ;ram size (8K) ROM0:014A 01 db 01 ;country code (non-japan) ROM0:014B 01 db 01 ;licensee (nintendo) ROM0:014C 00 db 00 ;version number ROM0:014D 97 db 97 ;header chk (ok) ROM0:014E 58 1F db 58,1F ;global chk (okay) } ;;; $0150: Boot point ;;; { ROM0:0150 C3 FB 01 jp 01FB } ;;; $0153: Serial interrupt handler (unit) ;;; { ROM0:0153 D9 reti } ;;; $0154: V-blank interrupt handler ;;; { ROM0:0154 F3 di ; Disable interrupts ROM0:0155 F5 push af ROM0:0156 C5 push bc ROM0:0157 D5 push de ROM0:0158 E5 push hl ROM0:0159 FA 05 C2 ld a,(C205) ;\ ROM0:015C E0 42 ld (FF00+42),a ;} Update LCD scroll Y ROM0:015E FA 06 C2 ld a,(C206) ;\ ROM0:0161 E0 43 ld (FF00+43),a ;} Update LCD scroll X ROM0:0163 FA 7E D0 ld a,(D07E) ;\ ROM0:0166 E0 47 ld (FF00+47),a ;} Update BG palette ROM0:0168 FA 7F D0 ld a,(D07F) ;\ ROM0:016B E0 48 ld (FF00+48),a ;} Update object 0 palette ROM0:016D FA 80 D0 ld a,(D080) ;\ ROM0:0170 E0 49 ld (FF00+49),a ;} Update object 1 palette ROM0:0172 FA 66 D0 ld a,(D066) ;\ ROM0:0175 D6 01 sub 01 ;| ROM0:0177 EA 66 D0 ld (D066),a ;| ROM0:017A FA 67 D0 ld a,(D067) ;| ROM0:017D DE 00 sbc a,00 ;| ROM0:017F EA 67 D0 ld (D067),a ;} Loading timer = max(0, [loading timer] - 1) ROM0:0182 30 07 jr nc,018B ;| ROM0:0184 AF xor a ;| ROM0:0185 EA 66 D0 ld (D066),a ;| ROM0:0188 EA 67 D0 ld (D067),a ;/ ROM0:018B FA 76 D0 ld a,(D076) ;\ ROM0:018E A7 and a ;} If [$D076] != 0: ROM0:018F C2 1E 3E jp nz,3E1E ; Go to $5:403D (to do with credits) ROM0:0192 FA 59 D0 ld a,(D059) ;\ ROM0:0195 A7 and a ;} If [death sequence timer]: ROM0:0196 C2 E1 2F jp nz,2FE1 ; Go to death sequence ROM0:0199 FA 47 D0 ld a,(D047) ;\ ROM0:019C A7 and a ;} If VRAM tiles update: ROM0:019D C2 A3 2B jp nz,2BA3 ; Load tiles to VRAM ROM0:01A0 FA 8E D0 ld a,(D08E) ;\ ROM0:01A3 A7 and a ;} If [screen transition command set index] != 0: ROM0:01A4 C2 8F 2B jp nz,2B8F ; Go to handle metatile update, set v-blank handled, restore bank, return from interrupt ROM0:01A7 FA 8B D0 ld a,(D08B) ;\ ROM0:01AA FE 11 cp 11 ;} If in Metroid Queen's room: go to BRANCH_QUEEN ROM0:01AC 28 2B jr z,01D9 ;/ ROM0:01AE FA 01 DE ld a,(DE01) ;\ ROM0:01B1 A7 and a ;} If metatile updates: ROM0:01B2 28 0B jr z,01BF ;/ ROM0:01B4 FA 58 D0 ld a,(D058) ;\ ROM0:01B7 EA 00 21 ld (2100),a ;} Bank = [room bank] (not actually used) ROM0:01BA CD CF 08 call 08CF ; Handle metatile update entries ROM0:01BD 18 08 jr 01C7 ROM0:01BF 3E 01 ld a,01 ;\ Else (no metatile updates): ROM0:01C1 EA 00 21 ld (2100),a ;} Update status bar ROM0:01C4 CD 3E 49 call 493E ;/ ROM0:01C7 CD A0 FF call FFA0 ; OAM DMA ROM0:01CA FA 4E D0 ld a,(D04E) ;\ ROM0:01CD EA 00 21 ld (2100),a ;} Restore bank ROM0:01D0 3E 01 ld a,01 ;\ ROM0:01D2 E0 82 ld (FF00+82),a ;} Set v-blank handled ROM0:01D4 E1 pop hl ROM0:01D5 D1 pop de ROM0:01D6 C1 pop bc ROM0:01D7 F1 pop af ROM0:01D8 D9 reti ; BRANCH_QUEEN ROM0:01D9 3E 01 ld a,01 ;\ ROM0:01DB EA 00 21 ld (2100),a ;} Update status bar ROM0:01DE CD 3E 49 call 493E ;/ ROM0:01E1 CD A0 FF call FFA0 ; OAM DMA ROM0:01E4 3E 03 ld a,03 ;\ ROM0:01E6 EA 00 21 ld (2100),a ;} Handle displaying Metroid Queen's head ROM0:01E9 CD F0 7C call 7CF0 ;/ ROM0:01EC FA 4E D0 ld a,(D04E) ;\ ROM0:01EF EA 00 21 ld (2100),a ;} Restore bank ROM0:01F2 3E 01 ld a,01 ;\ ROM0:01F4 E0 82 ld (FF00+82),a ;} Set v-blank handled ROM0:01F6 E1 pop hl ROM0:01F7 D1 pop de ROM0:01F8 C1 pop bc ROM0:01F9 F1 pop af ROM0:01FA D9 reti } ;;; $01FB: Boot ;;; { ; LOOP_REBOOT ROM0:01FB AF xor a ;\ ROM0:01FC 21 FF DF ld hl,DFFF ;| ROM0:01FF 0E 10 ld c,10 ;| ROM0:0201 06 00 ld b,00 ;| ;| ROM0:0203 32 ldd (hl),a ;} $D000..DFFF = 0 ROM0:0204 05 dec b ;| ROM0:0205 20 FC jr nz,0203 ;| ROM0:0207 0D dec c ;| ROM0:0208 20 F9 jr nz,0203 ;/ ROM0:020A 3E 01 ld a,01 ROM0:020C F3 di ; Disable interrupts ROM0:020D E0 0F ld (FF00+0F),a ; Request LCD interrupt ROM0:020F E0 FF ld (FF00+FF),a ; Enable LCD interrupt ROM0:0211 AF xor a ROM0:0212 E0 42 ld (FF00+42),a ; LCD scroll Y = 0 ROM0:0214 E0 43 ld (FF00+43),a ; LCD scroll X = 0 ROM0:0216 E0 41 ld (FF00+41),a ; LCD status = 0 ROM0:0218 E0 01 ld (FF00+01),a ; Serial transfer data = 0 ROM0:021A E0 02 ld (FF00+02),a ; Serial transfer control = 0 ROM0:021C 3E 80 ld a,80 ;\ ROM0:021E E0 40 ld (FF00+40),a ;} LCD control = 80h ROM0:0220 F0 44 ld a,(FF00+44) ;\ ROM0:0222 FE 94 cp 94 ;} Wait for v-blank ROM0:0224 20 FA jr nz,0220 ;/ ROM0:0226 3E 03 ld a,03 ;\ ROM0:0228 E0 40 ld (FF00+40),a ;} LCD control = 3 ROM0:022A 3E 93 ld a,93 ;\ ROM0:022C EA 7E D0 ld (D07E),a ;} BG palette = 93h ROM0:022F 3E 93 ld a,93 ;\ ROM0:0231 EA 7F D0 ld (D07F),a ;} Object 0 palette = 93h ROM0:0234 3E 43 ld a,43 ;\ ROM0:0236 EA 80 D0 ld (D080),a ;} Object 1 palette = 43h ROM0:0239 31 FF DF ld sp,DFFF ; SP = $DFFF ROM0:023C CD 78 23 call 2378 ; Initialise audio ROM0:023F 3E 0A ld a,0A ;\ ROM0:0241 EA 00 00 ld (0000),a ;} Enable SRAM ROM0:0244 AF xor a ;\ ROM0:0245 21 FF DF ld hl,DFFF ;| ROM0:0248 06 00 ld b,00 ;| ;} Stack = 0 ROM0:024A 32 ldd (hl),a ;| ROM0:024B 05 dec b ;| ROM0:024C 20 FC jr nz,024A ;/ ROM0:024E 21 FF CF ld hl,CFFF ;\ ROM0:0251 0E 10 ld c,10 ;| ROM0:0253 06 00 ld b,00 ;| ;| ROM0:0255 32 ldd (hl),a ;} $C000..CFFF = 0 ROM0:0256 05 dec b ;| ROM0:0257 20 FC jr nz,0255 ;| ROM0:0259 0D dec c ;| ROM0:025A 20 F9 jr nz,0255 ;/ ROM0:025C 3E FF ld a,FF ;\ ROM0:025E 21 FF CA ld hl,CAFF ;| ROM0:0261 0E 06 ld c,06 ;| ROM0:0263 06 00 ld b,00 ;| ;| ROM0:0265 32 ldd (hl),a ;} $C500..CAFF = FFh ROM0:0266 05 dec b ;| ROM0:0267 20 FC jr nz,0265 ;| ROM0:0269 0D dec c ;| ROM0:026A 20 F9 jr nz,0265 ;/ ROM0:026C AF xor a ;\ ROM0:026D 21 FF 9F ld hl,9FFF ;| ROM0:0270 0E 20 ld c,20 ;| ROM0:0272 06 00 ld b,00 ;| ;| ROM0:0274 32 ldd (hl),a ;} VRAM = 0 ROM0:0275 05 dec b ;| ROM0:0276 20 FC jr nz,0274 ;| ROM0:0278 0D dec c ;| ROM0:0279 20 F9 jr nz,0274 ;/ ROM0:027B 21 FF FE ld hl,FEFF ;\ ROM0:027E 06 00 ld b,00 ;| ;| ROM0:0280 32 ldd (hl),a ;} OAM = 0 ROM0:0281 05 dec b ;| ROM0:0282 20 FC jr nz,0280 ;/ ROM0:0284 21 FE FF ld hl,FFFE ;\ ROM0:0287 06 80 ld b,80 ;| ;| ROM0:0289 32 ldd (hl),a ;} High RAM = 0 ROM0:028A 05 dec b ;| ROM0:028B 20 FC jr nz,0289 ;/ ROM0:028D 0E A0 ld c,A0 ;\ ROM0:028F 06 0A ld b,0A ;| ROM0:0291 21 5C 23 ld hl,235C ;| ;| ROM0:0294 2A ldi a,(hl) ;} Copy OAM DMA routine to high RAM ROM0:0295 E2 ld (FF00+c),a ;| ROM0:0296 0C inc c ;| ROM0:0297 05 dec b ;| ROM0:0298 20 FA jr nz,0294 ;/ ROM0:029A CD 7B 03 call 037B ; Clear VRAM tilemap ROM0:029D 3E 01 ld a,01 ;\ ROM0:029F E0 FF ld (FF00+FF),a ;} Enable LCD interrupt ROM0:02A1 3E 07 ld a,07 ;\ ROM0:02A3 E0 4B ld (FF00+4B),a ;} LCD window X = 0 ROM0:02A5 3E 80 ld a,80 ;\ ROM0:02A7 E0 40 ld (FF00+40),a ;} LCD control = 80h ROM0:02A9 FB ei ; Enable interrupts ROM0:02AA AF xor a ROM0:02AB E0 0F ld (FF00+0F),a ; Clear all interrupt requests ROM0:02AD E0 4A ld (FF00+4A),a ; LCD window Y = 0 ROM0:02AF E0 06 ld (FF00+06),a ; Timer reload = 0 ROM0:02B1 3E 0A ld a,0A ;\ ROM0:02B3 EA 00 00 ld (0000),a ;} Enable SRAM ROM0:02B6 AF xor a ;\ ROM0:02B7 EA A3 D0 ld (D0A3),a ;} Save slot = 0 ROM0:02BA FA C0 A0 ld a,(A0C0) ;\ ROM0:02BD FE 03 cp 03 ;} If [SRAM save slot] <= 3: ROM0:02BF 30 03 jr nc,02C4 ;/ ROM0:02C1 EA A3 D0 ld (D0A3),a ; Save slot = [SRAM save slot] ROM0:02C4 3E 00 ld a,00 ;\ ROM0:02C6 E0 9B ld (FF00+9B),a ;} Game mode = boot ROM0:02C8 3E 00 ld a,00 ;\ ROM0:02CA EA 00 00 ld (0000),a ; Disable SRAM ; LOOP_MAIN_GAME_LOOP ROM0:02CD AF xor a ;\ ROM0:02CE EA 01 DE ld (DE01),a ;} Clear VRAM update flag ROM0:02D1 FA 0E D0 ld a,(D00E) ;\ ROM0:02D4 A7 and a ;} If not disabled buttons: update buttons ROM0:02D5 CC 87 22 call z,2287 ;/ ROM0:02D8 CD F0 02 call 02F0 ; Handle game mode ROM0:02DB CD 84 23 call 2384 ; Handle audio ROM0:02DE CD 9C 23 call 239C ; Handle screen transition command set ROM0:02E1 F0 80 ld a,(FF00+80) ;\ ROM0:02E3 E6 0F and 0F ;| ROM0:02E5 FE 0F cp 0F ;} If pressing ABSs: go to LOOP_REBOOT (soft-reset) ROM0:02E7 CA FB 01 jp z,01FB ;/ ROM0:02EA CD 1C 03 call 031C ; Wait for interrupt and update in-game timer ROM0:02ED C3 CD 02 jp 02CD ; Go to LOOP_MAIN_GAME_LOOP } ;;; $02F0: Handle game mode ;;; { ROM0:02F0 F0 9B ld a,(FF00+9B) ROM0:02F2 EF rst 28 ROM0:02F3 dw 3E3F, ; 0 Boot 3E59, ; 1 Title screen 03B5, ; 2 Loading save 0464, ; 3 Loading save 04DF, ; 4 In-game 36B0, ; 5 Dead 2F86, ; 6 Dying 371B, ; 7 Game over 2CED, ; 8 Paused 3CE2, ; 9 Save to SRAM 3ACE, ; Ah 3E67, ; Bh Start new game 3E72, ; Ch Load from save 031B, ; Dh ret 031B, ; Eh ret 3B2F, ; Fh 3B43, ; 10h (game cleared, unused?) 3BA1, ; 11h (game cleared, unused?) 3E29, ; 12h Reached the gunship 3E34 ; 13h Credits } ;;; $031B: ret (unit) ;;; { ; Routine for game modes Dh and Eh ROM0:031B C9 ret } ;;; $031C: Wait for interrupt and update in-game timer (unit) ;;; { ; Called by main game loop, dead, game over, $3A01, game mode Fh, game mode 11h ROM0:031C 76 halt ; Wait for interrupt ROM0:031D F0 82 ld a,(FF00+82) ;\ ROM0:031F A7 and a ;} Wait until v-blank handled ROM0:0320 28 FB jr z,031D ;/ ROM0:0322 F0 97 ld a,(FF00+97) ;\ ROM0:0324 3C inc a ;} Increment frame counter ROM0:0325 E0 97 ld (FF00+97),a ;/ ROM0:0327 A7 and a ;\ ROM0:0328 20 3B jr nz,0365 ;} If [frame counter] != 0: go to BRANCH_RETURN ROM0:032A F0 9B ld a,(FF00+9B) ;\ ROM0:032C FE 04 cp 04 ;} If [game mode] != in-game: go to BRANCH_RETURN ROM0:032E 20 35 jr nz,0365 ;/ ROM0:0330 FA A2 D0 ld a,(D0A2) ;\ ROM0:0333 3C inc a ;} Increment in-game timer 256-frame periods ROM0:0334 EA A2 D0 ld (D0A2),a ;/ ROM0:0337 FE 0E cp 0E ;\ ROM0:0339 20 2A jr nz,0365 ;} If [in-game timer 256-frame periods] != 14: go to BRANCH_RETURN ROM0:033B AF xor a ;\ ROM0:033C EA A2 D0 ld (D0A2),a ;} In-game timer 256-frame periods = 0 ROM0:033F FA 98 D0 ld a,(D098) ;\ ROM0:0342 C6 01 add a,01 ;| ROM0:0344 27 daa ;} In-game timer minutes += 1 decimally ROM0:0345 EA 98 D0 ld (D098),a ;/ ROM0:0348 FE 60 cp 60 ;\ ROM0:034A 38 19 jr c,0365 ;} If [in-game timer, minutes] > 60h: go to BRANCH_RETURN ROM0:034C AF xor a ;\ ROM0:034D EA 98 D0 ld (D098),a ;} In-game timer minutes = 0 ROM0:0350 FA 99 D0 ld a,(D099) ;\ ROM0:0353 C6 01 add a,01 ;| ROM0:0355 27 daa ;} In-game timer hours += 1 decimally ROM0:0356 EA 99 D0 ld (D099),a ;/ ROM0:0359 20 0A jr nz,0365 ; If [in-game timer hours] != 0: go to BRANCH_RETURN ROM0:035B 3E 59 ld a,59 ;\ ROM0:035D EA 98 D0 ld (D098),a ;| ROM0:0360 3E 99 ld a,99 ;} In-game timer = 99h hours and 59h minutes ROM0:0362 EA 99 D0 ld (D099),a ;/ ; BRANCH_RETURN ROM0:0365 AF xor a ;\ ROM0:0366 E0 82 ld (FF00+82),a ;} Clear v-blank handled ROM0:0368 3E C0 ld a,C0 ;\ ROM0:036A E0 8C ld (FF00+8C),a ;} $FF8C = C0h ROM0:036C AF xor a ;\ ROM0:036D E0 8D ld (FF00+8D),a ;} OAM stack pointer = 0 ROM0:036F C9 ret } ;;; $0370: Clear OAM (unit) ;;; { ; Called by boot and title ROM0:0370 AF xor a ROM0:0371 21 00 C0 ld hl,C000 ROM0:0374 06 A0 ld b,A0 ROM0:0376 22 ldi (hl),a ROM0:0377 05 dec b ROM0:0378 20 FC jr nz,0376 ROM0:037A C9 ret } ;;; $037B: Clear VRAM tilemap (unit) ;;; { ; Called by boot, dead, game mode Ah, game mode 10h, game cleared, and reached the gunship ROM0:037B 21 FF 9F ld hl,9FFF ROM0:037E 01 00 08 ld bc,0800 ROM0:0381 3E FF ld a,FF ROM0:0383 32 ldd (hl),a ROM0:0384 0B dec bc ROM0:0385 78 ld a,b ROM0:0386 B1 or c ROM0:0387 20 F8 jr nz,0381 ROM0:0389 C9 ret } ;;; $038A: Copy [bc] bytes from [hl] to [de] (unit) ;;; { ; Called by load tiles, $3C3F, load credits character tiles, load title screen tiles, and reached the gunship ROM0:038A 2A ldi a,(hl) ROM0:038B 12 ld (de),a ROM0:038C 13 inc de ROM0:038D 0B dec bc ROM0:038E 78 ld a,b ROM0:038F B1 or c ROM0:0390 20 F8 jr nz,038A ROM0:0392 C9 ret } ;;; $0393: Copy FFh terminated data from [de] to hl (unit) ;;; { ; Seems unused ROM0:0393 1A ld a,(de) ROM0:0394 FE FF cp FF ROM0:0396 C8 ret z ROM0:0397 22 ldi (hl),a ROM0:0398 13 inc de ROM0:0399 18 F8 jr 0393 } ;;; $039B: Timer interrupt handler (unit) ;;; { ROM0:039B D9 reti } ;;; $039C: Disable LCD display (unit) ;;; { ; Called by loading save, $2887, dead, game mode Ah, game cleared, and boot ROM0:039C F0 FF ld a,(FF00+FF) ;\ ROM0:039E E0 99 ld (FF00+99),a ;} $FF99 = interrupts enabled ROM0:03A0 CB 87 res 0,a ;\ ROM0:03A2 E0 FF ld (FF00+FF),a ;} Disable v-blank interrupt ROM0:03A4 F0 44 ld a,(FF00+44) ;\ ROM0:03A6 FE 91 cp 91 ;} Wait for v-blank ROM0:03A8 20 FA jr nz,03A4 ;/ ROM0:03AA F0 40 ld a,(FF00+40) ;\ ROM0:03AC E6 7F and 7F ;} Disable LCD display ROM0:03AE E0 40 ld (FF00+40),a ;/ ROM0:03B0 F0 99 ld a,(FF00+99) ;\ ROM0:03B2 E0 FF ld (FF00+FF),a ;} Interrupts enabled = [$FF99] ROM0:03B4 C9 ret } ;;; $03B5: Game mode 2: loading save ;;; { ROM0:03B5 CD A3 0C call 0CA3 ; Set up Samus ROM0:03B8 3E 08 ld a,08 ;\ ROM0:03BA EA 4E D0 ld (D04E),a ;| Bank = 8 ROM0:03BD EA 00 21 ld (2100),a ;/ ROM0:03C0 FA 0D D8 ld a,(D80D) ;\ ROM0:03C3 6F ld l,a ;| ROM0:03C4 FA 0E D8 ld a,(D80E) ;| ROM0:03C7 67 ld h,a ;| ROM0:03C8 11 00 DA ld de,DA00 ;| ;| ROM0:03CB 2A ldi a,(hl) ;} Metatile definitions = [[$D80D]..[$D80D]+1FFh] ROM0:03CC 12 ld (de),a ;| ROM0:03CD 13 inc de ;| ROM0:03CE 7A ld a,d ;| ROM0:03CF FE DC cp DC ;| ROM0:03D1 20 F8 jr nz,03CB ;/ ROM0:03D3 FA 0F D8 ld a,(D80F) ;\ ROM0:03D6 6F ld l,a ;| ROM0:03D7 FA 10 D8 ld a,(D810) ;| ROM0:03DA 67 ld h,a ;| ;| ROM0:03DB 2A ldi a,(hl) ;} Collision table = [[$D80F]..[$D80F]+FFh] ROM0:03DC 12 ld (de),a ;| ROM0:03DD 13 inc de ;| ROM0:03DE 7A ld a,d ;| ROM0:03DF FE DD cp DD ;| ROM0:03E1 20 F8 jr nz,03DB ;/ ROM0:03E3 FA 11 D8 ld a,(D811) ;\ ROM0:03E6 EA 58 D0 ld (D058),a ;} Room bank = [$D811] ROM0:03E9 FA 12 D8 ld a,(D812) ;\ ROM0:03EC EA 56 D0 ld (D056),a ;} Samus solid block threshold = [$D812] ROM0:03EF FA 13 D8 ld a,(D813) ;\ ROM0:03F2 EA 69 D0 ld (D069),a ;} Enemy solid block threshold = [$D813] ROM0:03F5 FA 14 D8 ld a,(D814) ;\ ROM0:03F8 EA 8A D0 ld (D08A),a ;} Projectile solid block threshold = [$D814] ROM0:03FB FA 1F D8 ld a,(D81F) ;\ ROM0:03FE EA 77 D0 ld (D077),a ;} Acid damage = [$D81F] ROM0:0401 FA 20 D8 ld a,(D820) ;\ ROM0:0404 EA 78 D0 ld (D078),a ;} Spike damage = [$D820] ROM0:0407 FA 21 D8 ld a,(D821) ;\ ROM0:040A EA 89 D0 ld (D089),a ;} Real number of Metroids remaining = [$D821] ROM0:040D FA 22 D8 ld a,(D822) ;\ ROM0:0410 EA 92 D0 ld (D092),a ;} Song for room = [$D822] ROM0:0413 FA 23 D8 ld a,(D823) ;\ ROM0:0416 EA 98 D0 ld (D098),a ;} In-game time minutes = [$D823] ROM0:0419 FA 24 D8 ld a,(D824) ;\ ROM0:041C EA 99 D0 ld (D099),a ;} In-game time hours = [$D824] ROM0:041F FA 25 D8 ld a,(D825) ;\ ROM0:0422 EA 9A D0 ld (D09A),a ;} Number of Metroids remaining = [$D825] ROM0:0425 AF xor a ROM0:0426 EA 0E D0 ld (D00E),a ; Door transition direction = none ROM0:0429 EA 59 D0 ld (D059),a ; Death sequence timer = 0 ROM0:042C EA 63 D0 ld (D063),a ; Dying flag = 0 ROM0:042F EA 47 D0 ld (D047),a ; VRAM tiles update flag = 0 ROM0:0432 EA 6B D0 ld (D06B),a ; $D06B = 0 (unused) ROM0:0435 EA 6C D0 ld (D06C),a ; Item pickup = 0 ROM0:0438 EA 6D D0 ld (D06D),a ; $D06D = 0 ROM0:043B EA 6E D0 ld (D06E),a ; Highest OAM stack pointer = 0 ROM0:043E 3E 01 ld a,01 ;\ ROM0:0440 EA 8B D0 ld (D08B),a ;} Metroid Queen's room flag = 1 ROM0:0443 3E FF ld a,FF ;\ ROM0:0445 EA 5D D0 ld (D05D),a ;} $D05D = FFh ROM0:0448 21 00 D9 ld hl,D900 ;\ ;| ; LOOP_ALPHA ;| ROM0:044B AF xor a ;| ROM0:044C 77 ld (hl),a ;} Reset respawning block data ROM0:044D 7D ld a,l ;| ROM0:044E C6 10 add a,10 ;| ROM0:0450 6F ld l,a ;| ROM0:0451 20 F8 jr nz,044B ;/ ROM0:0453 3E 02 ld a,02 ;\ ROM0:0455 EA 4E D0 ld (D04E),a ;| ROM0:0458 EA 00 21 ld (2100),a ;} Execute subroutine $2:418C ROM0:045B CD 8C 41 call 418C ;/ ROM0:045E F0 9B ld a,(FF00+9B) ;\ ROM0:0460 3C inc a ;} Game mode = 3 ROM0:0461 E0 9B ld (FF00+9B),a ;/ ROM0:0463 C9 ret } ;;; $0464: Game mode 3: loading save ;;; { ROM0:0464 CD 9C 03 call 039C ; Disable LCD display ROM0:0467 CD FD 05 call 05FD ; Load tiles ROM0:046A CD B4 3B call 3BB4 ; Execute subroutine $3BB4 ROM0:046D FA 04 D8 ld a,(D804) ;\ ROM0:0470 E0 C8 ld (FF00+C8),a ;| ROM0:0472 FA 05 D8 ld a,(D805) ;} Screen Y position = [$D804] ROM0:0475 E0 C9 ld (FF00+C9),a ;/ ROM0:0477 FA 06 D8 ld a,(D806) ;\ ROM0:047A E0 CA ld (FF00+CA),a ;| ROM0:047C FA 07 D8 ld a,(D807) ;} Screen X position = [$D806] ROM0:047F E0 CB ld (FF00+CB),a ;/ ROM0:0481 FA 58 D0 ld a,(D058) ;\ ROM0:0484 EA 4E D0 ld (D04E),a ;} Bank = [room bank] ROM0:0487 EA 00 21 ld (2100),a ;/ ; LOOP_ALPHA ROM0:048A 3E 00 ld a,00 ;\ ROM0:048C E0 AF ld (FF00+AF),a ;| ROM0:048E 3E DE ld a,DE ;} Stack pointer for metatile update entries = $DE00 ROM0:0490 E0 B0 ld (FF00+B0),a ;/ ROM0:0492 CD CC 06 call 06CC ; Load row above screen ROM0:0495 CD CF 08 call 08CF ; Handle metatile update entries ROM0:0498 F0 C8 ld a,(FF00+C8) ;\ ROM0:049A C6 10 add a,10 ;| ROM0:049C E0 C8 ld (FF00+C8),a ;| ROM0:049E F0 C9 ld a,(FF00+C9) ;} Screen Y position = [screen Y position] + 10h & 0FFFh ROM0:04A0 CE 00 adc a,00 ;| ROM0:04A2 E6 0F and 0F ;| ROM0:04A4 E0 C9 ld (FF00+C9),a ;/ ROM0:04A6 F0 C8 ld a,(FF00+C8) ;\ ROM0:04A8 47 ld b,a ;| ROM0:04A9 FA 04 D8 ld a,(D804) ;} If [screen Y position] & FFh != [$D804]: go to LOOP_ALPHA ROM0:04AC B8 cp b ;| ROM0:04AD 20 DB jr nz,048A ;/ ROM0:04AF FA 04 D8 ld a,(D804) ;\ ROM0:04B2 E0 C8 ld (FF00+C8),a ;| ROM0:04B4 FA 05 D8 ld a,(D805) ;} Screen Y position = [$D804] ROM0:04B7 E0 C9 ld (FF00+C9),a ;/ ROM0:04B9 FA 06 D8 ld a,(D806) ;\ ROM0:04BC E0 CA ld (FF00+CA),a ;| ROM0:04BE FA 07 D8 ld a,(D807) ;} Screen X position = [$D806] ROM0:04C1 E0 CB ld (FF00+CB),a ;/ ROM0:04C3 F0 C8 ld a,(FF00+C8) ;\ ROM0:04C5 D6 78 sub 78 ;} Scroll Y = [screen Y position] - 78h ROM0:04C7 EA 05 C2 ld (C205),a ;/ ROM0:04CA F0 CA ld a,(FF00+CA) ;\ ROM0:04CC D6 30 sub 30 ;} Scroll X = [screen X position] - 30h ROM0:04CE EA 06 C2 ld (C206),a ;/ ROM0:04D1 3E E3 ld a,E3 ;\ ROM0:04D3 E0 40 ld (FF00+40),a ;} Set up LCD control ROM0:04D5 AF xor a ;\ ROM0:04D6 EA 11 D0 ld (D011),a ;} $D011 = 0 (unused) ROM0:04D9 F0 9B ld a,(FF00+9B) ;\ ROM0:04DB 3C inc a ;} Game mode = in-game ROM0:04DC E0 9B ld (FF00+9B),a ;/ ROM0:04DE C9 ret } ;;; $04DF: Game mode 4: in-game ;;; { ; The Metroid Queen branch is just an optimised version of the regular branch that I presume only exists to spare up some (kinda negligible) CPU ; Compared to the regular branch, the Metroid Queen branch: ; Doesn't handle metroid hatching ; Doesn't check if there's a door/screen transition ; Doesn't handle Samus damage ; Doesn't handle item pickup ROM0:04DF FA 20 D0 ld a,(D020) ;\ ROM0:04E2 E6 7F and 7F ;| ROM0:04E4 FE 18 cp 18 ;} If [Samus' pose] & 7Fh >= 18h: go to BRANCH_QUEEN ROM0:04E6 D2 78 05 jp nc,0578 ;/ ROM0:04E9 CD 6D 3D call 3D6D ; Handle window display, game saving, metroid earthquake, low heath beep, fade in, and Baby Metroid cry ROM0:04EC FA 84 D0 ld a,(D084) ;\ ROM0:04EF 47 ld b,a ;| ROM0:04F0 FA 85 D0 ld a,(D085) ;} If [Samus' health for display] = 0: start death sequence ROM0:04F3 B0 or b ;| ROM0:04F4 CC A2 2F call z,2FA2 ;/ ROM0:04F7 F0 C0 ld a,(FF00+C0) ;\ ROM0:04F9 EA 29 D0 ld (D029),a ;| ROM0:04FC F0 C1 ld a,(FF00+C1) ;} Samus' previous Y position = [Samus' Y position] ROM0:04FE EA 2A D0 ld (D02A),a ;/ ROM0:0501 F0 C2 ld a,(FF00+C2) ;\ ROM0:0503 EA 27 D0 ld (D027),a ;| ROM0:0506 F0 C3 ld a,(FF00+C3) ;} Samus' previous X position = [Samus' X position] ROM0:0508 EA 28 D0 ld (D028),a ;/ ROM0:050B FA 63 C4 ld a,(C463) ;\ ROM0:050E A7 and a ;} If metroid is hatching: ROM0:050F 28 11 jr z,0522 ;/ ROM0:0511 FA 20 D0 ld a,(D020) ;\ ROM0:0514 CB BF res 7,a ;} Samus' pose &= ~80h ROM0:0516 EA 20 D0 ld (D020),a ;/ ROM0:0519 F0 81 ld a,(FF00+81) ;\ ROM0:051B CB 57 bit 2,a ;} If newly pressed s: toggle missiles ROM0:051D C4 12 22 call nz,2212 ;/ ROM0:0520 18 1C jr 053E ROM0:0522 FA 0E D0 ld a,(D00E) ;\ Else (metroid is not hatching): ROM0:0525 A7 and a ;} If not in door transition: ROM0:0526 20 16 jr nz,053E ;/ ROM0:0528 AF xor a ;\ ROM0:0529 EA 5C D0 ld (D05C),a ;} $D05C = 0 ROM0:052C CD E3 2E call 2EE3 ; Handle Samus damage ROM0:052F CD 21 0D call 0D21 ; Samus' pose handler ROM0:0532 CD AB 32 call 32AB ; Execute subroutine $32AB (uses $D05C) ROM0:0535 CD FB 21 call 21FB ; Handle toggling missiles and firing a projectile ROM0:0538 CD 8E 3D call 3D8E ; Projectile handler ROM0:053B CD 99 3D call 3D99 ; Bomb handler ROM0:053E CD 98 06 call 0698 ; Handle loading blocks due to scrolling ROM0:0541 CD FE 08 call 08FE ; Handle scrolling / triggering door transitions ROM0:0544 CD 66 23 call 2366 ; Calculate scroll offsets ROM0:0547 CD 2F 37 call 372F ; Handle item pickup ROM0:054A CD 93 3E call 3E93 ; Draw Samus ROM0:054D CD A4 3D call 3DA4 ; Projectile GFX handler ROM0:0550 CD 83 3D call 3D83 ; Handle respawning blocks ROM0:0553 CD 78 3D call 3D78 ; Handle rolling energy and missile counters ROM0:0556 FA 49 D0 ld a,(D049) ;\ ROM0:0559 A7 and a ;| ROM0:055A 28 04 jr z,0560 ;} $D049 = max(0, [$D049] - 1) ROM0:055C 3D dec a ;| ROM0:055D EA 49 D0 ld (D049),a ;/ ROM0:0560 CD 9E 3E call 3E9E ; Drawing blinking Metroid in HUD ROM0:0563 F0 8D ld a,(FF00+8D) ;\ ROM0:0565 EA 64 D0 ld (D064),a ;} $D064 = [OAM stack pointer] ROM0:0568 FA 8E D0 ld a,(D08E) ;\ ROM0:056B A7 and a ;} If [screen transition command set index] = 0: ROM0:056C 20 03 jr nz,0571 ;/ ROM0:056E CD DE 05 call 05DE ; Handle enemies ROM0:0571 CD 88 3E call 3E88 ; Clear deleted OAM ROM0:0574 CD 79 2C call 2C79 ; Handle pausing ROM0:0577 C9 ret ; BRANCH_QUEEN ROM0:0578 CD 6D 3D call 3D6D ; Handle window display, game saving, metroid earthquake, low heath beep, fade in, and Baby Metroid cry ROM0:057B FA 84 D0 ld a,(D084) ;\ ROM0:057E 47 ld b,a ;| ROM0:057F FA 85 D0 ld a,(D085) ;} If Samus' health for display = 0: start death sequence ROM0:0582 B0 or b ;| ROM0:0583 CC A2 2F call z,2FA2 ;/ ROM0:0586 F0 C0 ld a,(FF00+C0) ;\ ROM0:0588 EA 29 D0 ld (D029),a ;| ROM0:058B F0 C1 ld a,(FF00+C1) ;} Samus' previous Y position = [Samus Y position] ROM0:058D EA 2A D0 ld (D02A),a ;/ ROM0:0590 F0 C2 ld a,(FF00+C2) ;\ ROM0:0592 EA 27 D0 ld (D027),a ;| ROM0:0595 F0 C3 ld a,(FF00+C3) ;} Samus' previous X position = [Samus X position] ROM0:0597 EA 28 D0 ld (D028),a ;/ ROM0:059A AF xor a ;\ ROM0:059B EA 5C D0 ld (D05C),a ;} $D05C = 0 ROM0:059E CD 21 0D call 0D21 ; Samus' pose handler ROM0:05A1 CD AB 32 call 32AB ; Execute subroutine $32AB ROM0:05A4 CD FB 21 call 21FB ; Handle toggling missiles and firing a projectile ROM0:05A7 CD 8E 3D call 3D8E ; Projectile handler ROM0:05AA CD 99 3D call 3D99 ; Bomb handler ROM0:05AD CD 98 06 call 0698 ; Handle loading blocks due to scrolling ROM0:05B0 CD FE 08 call 08FE ; Handle scrolling / triggering door transitions ROM0:05B3 CD 66 23 call 2366 ; Calculate scroll offsets ROM0:05B6 CD 93 3E call 3E93 ; Draw Samus ROM0:05B9 CD A4 3D call 3DA4 ; Projectile GFX handler ROM0:05BC CD 83 3D call 3D83 ; Handle respawning blocks ROM0:05BF CD 78 3D call 3D78 ; Handle rolling energy and missile counters ROM0:05C2 FA 49 D0 ld a,(D049) ;\ ROM0:05C5 A7 and a ;| ROM0:05C6 28 04 jr z,05CC ;} $D049 = max(0, [$D049] - 1) ROM0:05C8 3D dec a ;| ROM0:05C9 EA 49 D0 ld (D049),a ;/ ROM0:05CC CD 9E 3E call 3E9E ; Drawing blinking Metroid in HUD ROM0:05CF F0 8D ld a,(FF00+8D) ;\ ROM0:05D1 EA 64 D0 ld (D064),a ;} $D064 = [OAM stack pointer] ROM0:05D4 CD DE 05 call 05DE ; Handle enemies ROM0:05D7 CD 88 3E call 3E88 ; Clear deleted OAM ROM0:05DA CD 79 2C call 2C79 ; Handle pausing ROM0:05DD C9 ret } ;;; $05DE: Handle enemies ;;; { ; Called by in-game, $27BA, $27E3, and $38B9 ROM0:05DE FA 8B D0 ld a,(D08B) ;\ ROM0:05E1 FE 11 cp 11 ;} If not in Metroid Queen's room: ROM0:05E3 28 0C jr z,05F1 ;/ ROM0:05E5 3E 02 ld a,02 ;\ ROM0:05E7 EA 4E D0 ld (D04E),a ;| ROM0:05EA EA 00 21 ld (2100),a ;} Execute subroutine $2:4000 ROM0:05ED CD 00 40 call 4000 ;/ ROM0:05F0 C9 ret ROM0:05F1 3E 03 ld a,03 ;\ Else (in Metroid Queen's room): ROM0:05F3 EA 4E D0 ld (D04E),a ;| ROM0:05F6 EA 00 21 ld (2100),a ;} Execute subroutine $3:6E36 ROM0:05F9 CD 36 6E call 6E36 ;/ ROM0:05FC C9 ret } ;;; $05FD: Load tiles ;;; { ROM0:05FD 3E 07 ld a,07 ;\ ROM0:05FF EA 4E D0 ld (D04E),a ;| ROM0:0602 EA 00 21 ld (2100),a ;| ROM0:0605 01 00 01 ld bc,0100 ;} Load door, refill and missile expansion tiles ROM0:0608 21 90 7A ld hl,7A90 ;| ROM0:060B 11 00 8F ld de,8F00 ;| ROM0:060E CD 8A 03 call 038A ;/ ROM0:0611 3E 06 ld a,06 ;\ ROM0:0613 EA 4E D0 ld (D04E),a ;| ROM0:0616 EA 00 21 ld (2100),a ;| ROM0:0619 01 00 0B ld bc,0B00 ;} Load Samus tiles ROM0:061C 21 20 43 ld hl,4320 ;| ROM0:061F 11 00 80 ld de,8000 ;| ROM0:0622 CD 8A 03 call 038A ;/ ROM0:0625 3E 06 ld a,06 ;\ ROM0:0627 EA 4E D0 ld (D04E),a ;| ROM0:062A EA 00 21 ld (2100),a ;| ROM0:062D 01 00 04 ld bc,0400 ;| ROM0:0630 FA 08 D8 ld a,(D808) ;| ROM0:0633 6F ld l,a ;} $8B00..8EFF = [$6:0000+[enemy tiles source address]..$6:03FF+[enemy tiles source address]] ROM0:0634 FA 09 D8 ld a,(D809) ;| ROM0:0637 67 ld h,a ;| ROM0:0638 11 00 8B ld de,8B00 ;| ROM0:063B CD 8A 03 call 038A ;/ ROM0:063E FA 79 D0 ld a,(D079) ;\ ROM0:0641 A7 and a ;} If need to load characters: ROM0:0642 28 14 jr z,0658 ;/ ROM0:0644 3E 05 ld a,05 ;\ ROM0:0646 EA 4E D0 ld (D04E),a ;| ROM0:0649 EA 00 21 ld (2100),a ;| ROM0:064C 01 00 02 ld bc,0200 ;} Load character tiles ROM0:064F 21 34 6C ld hl,6C34 ;| ROM0:0652 11 00 8C ld de,8C00 ;| ROM0:0655 CD 8A 03 call 038A ;/ ROM0:0658 FA 0A D8 ld a,(D80A) ;\ ROM0:065B EA 4E D0 ld (D04E),a ;| ROM0:065E EA 00 21 ld (2100),a ;| ROM0:0661 01 00 08 ld bc,0800 ;| ROM0:0664 FA 0B D8 ld a,(D80B) ;| ROM0:0667 6F ld l,a ;} $9000..97FF = [[background tiles source address]..$07FF+[background tiles source address]] ROM0:0668 FA 0C D8 ld a,(D80C) ;| ROM0:066B 67 ld h,a ;| ROM0:066C 11 00 90 ld de,9000 ;| ROM0:066F CD 8A 03 call 038A ;/ ROM0:0672 C9 ret } ;;; $0673: Load current screen ;;; { ROM0:0673 AF xor a ROM0:0674 E0 CC ld (FF00+CC),a ;\ ROM0:0676 E0 CE ld (FF00+CE),a ;| ROM0:0678 F0 C9 ld a,(FF00+C9) ;} Row to update = [screen Y position] & FF00h ROM0:067A E0 CD ld (FF00+CD),a ;} Column to update = [screen X position] & FF00h ROM0:067C F0 CB ld a,(FF00+CB) ;| ROM0:067E E0 CF ld (FF00+CF),a ;/ ; LOOP_ALPHA ROM0:0680 3E 00 ld a,00 ;\ ROM0:0682 E0 AF ld (FF00+AF),a ;| ROM0:0684 3E DE ld a,DE ;} Stack pointer for metatile update entries = $DE00 ROM0:0686 E0 B0 ld (FF00+B0),a ;/ ROM0:0688 CD 88 07 call 0788 ; Load row ROM0:068B CD CF 08 call 08CF ; Handle metatile update entries ROM0:068E F0 CC ld a,(FF00+CC) ;\ ROM0:0690 C6 10 add a,10 ;} Row to update += 10h ROM0:0692 E0 CC ld (FF00+CC),a ;/ ROM0:0694 A7 and a ;\ ROM0:0695 20 E9 jr nz,0680 ;} If [row to update] & FFh != 0: go to LOOP_ALPHA ROM0:0697 C9 ret } ;;; $0698: Handle loading blocks due to scrolling ;;; { ; Called by in-game ROM0:0698 FA 58 D0 ld a,(D058) ;\ ROM0:069B EA 4E D0 ld (D04E),a ;} Bank = [room bank] ROM0:069E EA 00 21 ld (2100),a ;/ ROM0:06A1 3E 00 ld a,00 ;\ ROM0:06A3 E0 AF ld (FF00+AF),a ;| ROM0:06A5 3E DE ld a,DE ;} Stack pointer for metatile update entries = $DE00 ROM0:06A7 E0 B0 ld (FF00+B0),a ;/ ROM0:06A9 AF xor a ;\ ROM0:06AA EA 4C D0 ld (D04C),a ;} $D04C = 0 ROM0:06AD F0 97 ld a,(FF00+97) ;\ ROM0:06AF E6 03 and 03 ;} If [frame counter] & 3 = 0: Go to possibly load row above screen ROM0:06B1 28 0E jr z,06C1 ;/ ROM0:06B3 FE 01 cp 01 ;\ ROM0:06B5 28 3C jr z,06F3 ;} If [frame counter] & 3 = 1: Go to possibly load row below screen ROM0:06B7 FE 02 cp 02 ;\ ROM0:06B9 28 69 jr z,0724 ;} If [frame counter] & 3 = 2: Go to possibly load column left of screen ROM0:06BB FE 03 cp 03 ;\ ROM0:06BD CA 56 07 jp z,0756 ;} If [frame counter] & 3 = 3: Go to possibly load column right of screen ROM0:06C0 C9 ret } ;;; $06C1: Possibly load row above screen ;;; { ROM0:06C1 FA 23 D0 ld a,(D023) ;\ ROM0:06C4 CB 77 bit 6,a ;} If screen is not moving up: return ROM0:06C6 C8 ret z ;/ ROM0:06C7 3E FF ld a,FF ;\ ROM0:06C9 EA 4C D0 ld (D04C),a ;} $D04C = FFh } ;;; $06CC: Load row above screen ;;; { ; Also called by loading save ROM0:06CC F0 CA ld a,(FF00+CA) ;\ ROM0:06CE D6 80 sub 80 ;| ROM0:06D0 E0 CE ld (FF00+CE),a ;| ROM0:06D2 F0 CB ld a,(FF00+CB) ;} Column to update = [screen X position] - 80h & FFFh ROM0:06D4 DE 00 sbc a,00 ;| ROM0:06D6 E6 0F and 0F ;| ROM0:06D8 E0 CF ld (FF00+CF),a ;/ ROM0:06DA F0 C8 ld a,(FF00+C8) ;\ ROM0:06DC D6 78 sub 78 ;| ROM0:06DE E0 CC ld (FF00+CC),a ;| ROM0:06E0 F0 C9 ld a,(FF00+C9) ;} Row to update = [screen Y position] - 78h & FFFh ROM0:06E2 DE 00 sbc a,00 ;| ROM0:06E4 E6 0F and 0F ;| ROM0:06E6 E0 CD ld (FF00+CD),a ;/ ROM0:06E8 FA 23 D0 ld a,(D023) ;\ ROM0:06EB CB B7 res 6,a ;} Set screen not moving up ROM0:06ED EA 23 D0 ld (D023),a ;/ ROM0:06F0 C3 88 07 jp 0788 ; Go to load row } ;;; $06F3: Possibly load row below screen ;;; { ROM0:06F3 FA 23 D0 ld a,(D023) ;\ ROM0:06F6 CB 7F bit 7,a ;} If screen not moving down: return ROM0:06F8 C8 ret z ;/ ROM0:06F9 3E FF ld a,FF ;\ ROM0:06FB EA 4C D0 ld (D04C),a ;} $D04C = FFh ROM0:06FE F0 CA ld a,(FF00+CA) ;\ ROM0:0700 D6 80 sub 80 ;| ROM0:0702 E0 CE ld (FF00+CE),a ;| ROM0:0704 F0 CB ld a,(FF00+CB) ;} Column to update = [screen X position] - 80h & FFFh ROM0:0706 DE 00 sbc a,00 ;| ROM0:0708 E6 0F and 0F ;| ROM0:070A E0 CF ld (FF00+CF),a ;/ ROM0:070C F0 C8 ld a,(FF00+C8) ;\ ROM0:070E C6 78 add a,78 ;| ROM0:0710 E0 CC ld (FF00+CC),a ;| ROM0:0712 F0 C9 ld a,(FF00+C9) ;} Row to update = [screen Y position] + 78h & FFFh ROM0:0714 CE 00 adc a,00 ;| ROM0:0716 E6 0F and 0F ;| ROM0:0718 E0 CD ld (FF00+CD),a ;/ ROM0:071A FA 23 D0 ld a,(D023) ;\ ROM0:071D CB BF res 7,a ;} Set screen not moving down ROM0:071F EA 23 D0 ld (D023),a ;/ ROM0:0722 18 64 jr 0788 ; Go to load row } ;;; $0724: Possibly load column left of screen ;;; { ROM0:0724 FA 23 D0 ld a,(D023) ;\ ROM0:0727 CB 6F bit 5,a ;} If screen not moving left: return ROM0:0729 C8 ret z ;/ ROM0:072A 3E FF ld a,FF ;\ ROM0:072C EA 4C D0 ld (D04C),a ;} $D04C = FFh ROM0:072F F0 CA ld a,(FF00+CA) ;\ ROM0:0731 D6 80 sub 80 ;| ROM0:0733 E0 CE ld (FF00+CE),a ;| ROM0:0735 F0 CB ld a,(FF00+CB) ;} Column to update = [screen X position] - 80h & FFFh ROM0:0737 DE 00 sbc a,00 ;| ROM0:0739 E6 0F and 0F ;| ROM0:073B E0 CF ld (FF00+CF),a ;/ ROM0:073D F0 C8 ld a,(FF00+C8) ;\ ROM0:073F D6 78 sub 78 ;| ROM0:0741 E0 CC ld (FF00+CC),a ;| ROM0:0743 F0 C9 ld a,(FF00+C9) ;} Row to update = [screen Y position] - 78h & FFFh ROM0:0745 DE 00 sbc a,00 ;| ROM0:0747 E6 0F and 0F ;| ROM0:0749 E0 CD ld (FF00+CD),a ;/ ROM0:074B FA 23 D0 ld a,(D023) ;\ ROM0:074E CB AF res 5,a ;} Set screen not moving left ROM0:0750 EA 23 D0 ld (D023),a ;/ ROM0:0753 C3 E4 07 jp 07E4 ; Go to load column } ;;; $0756: Possibly load column right of screen ;;; { ROM0:0756 FA 23 D0 ld a,(D023) ;\ ROM0:0759 CB 67 bit 4,a ;} If screen not moving right: return ROM0:075B C8 ret z ;/ ROM0:075C 3E FF ld a,FF ;\ ROM0:075E EA 4C D0 ld (D04C),a ;} $D04C = FFh ROM0:0761 F0 CA ld a,(FF00+CA) ;\ ROM0:0763 C6 70 add a,70 ;| ROM0:0765 E0 CE ld (FF00+CE),a ;| ROM0:0767 F0 CB ld a,(FF00+CB) ;} Column to update = [screen X position] + 70h & FFFh ROM0:0769 CE 00 adc a,00 ;| ROM0:076B E6 0F and 0F ;| ROM0:076D E0 CF ld (FF00+CF),a ;/ ROM0:076F F0 C8 ld a,(FF00+C8) ;\ ROM0:0771 D6 78 sub 78 ;| ROM0:0773 E0 CC ld (FF00+CC),a ;| ROM0:0775 F0 C9 ld a,(FF00+C9) ;} Row to update = [screen Y position] - 78h & FFFh ROM0:0777 DE 00 sbc a,00 ;| ROM0:0779 E6 0F and 0F ;| ROM0:077B E0 CD ld (FF00+CD),a ;/ ROM0:077D FA 23 D0 ld a,(D023) ;\ ROM0:0780 CB A7 res 4,a ;} Set screen not moving right ROM0:0782 EA 23 D0 ld (D023),a ;/ ROM0:0785 C3 E4 07 jp 07E4 ; Go to load column } ;;; $0788: Load row ;;; { ROM0:0788 CD 35 08 call 0835 ; Calculate metatile update addresses ROM0:078B 3E 10 ld a,10 ;\ ROM0:078D E0 AE ld (FF00+AE),a ;} Number of blocks to update = 10h ; LOOP_ALPHA ROM0:078F CD 86 08 call 0886 ; Add metatile update entry ROM0:0792 F0 AA ld a,(FF00+AA) ;\ ROM0:0794 C6 02 add a,02 ;| ROM0:0796 E0 AA ld (FF00+AA),a ;| ROM0:0798 F0 AB ld a,(FF00+AB) ;| ROM0:079A CE 00 adc a,00 ;| ROM0:079C E6 9B and 9B ;} VRAM tilemap metatile update address = [VRAM tilemap metatile update address] + 2 & 9BDFh ROM0:079E E0 AB ld (FF00+AB),a ;| ROM0:07A0 F0 AA ld a,(FF00+AA) ;| ROM0:07A2 E6 DF and DF ;| ROM0:07A4 E0 AA ld (FF00+AA),a ;/ ROM0:07A6 F0 AD ld a,(FF00+AD) ;\ ROM0:07A8 C6 01 add a,01 ;} Increment index of block for metatile update ROM0:07AA E0 AD ld (FF00+AD),a ;\ ROM0:07AC E6 0F and 0F ;} If [index of block for metatile update] & Fh = 0: ROM0:07AE 20 22 jr nz,07D2 ;/ ROM0:07B0 F0 AD ld a,(FF00+AD) ;\ ROM0:07B2 D6 10 sub 10 ;} Index of block for metatile update -= 10h ROM0:07B4 E0 AD ld (FF00+AD),a ;/ ROM0:07B6 F0 AC ld a,(FF00+AC) ;\ ROM0:07B8 E6 F0 and F0 ;| ROM0:07BA 47 ld b,a ;| ROM0:07BB F0 AC ld a,(FF00+AC) ;| ROM0:07BD 3C inc a ;} Index of screen for metatile update = [index of screen for metatile update] & ~Fh | [index of screen for metatile update] + 1 & Fh ROM0:07BE E6 0F and 0F ;| ROM0:07C0 B0 or b ;| ROM0:07C1 E0 AC ld (FF00+AC),a ;/ ROM0:07C3 5F ld e,a ;\ ROM0:07C4 16 00 ld d,00 ;| ROM0:07C6 CB 23 sla e ;| ROM0:07C8 CB 12 rl d ;| ROM0:07CA 21 00 40 ld hl,4000 ;| ROM0:07CD 19 add hl,de ;} bc = [$4000 + [index of screen for metatile update] * 2] (used in $0886) ROM0:07CE 2A ldi a,(hl) ;| ROM0:07CF 4F ld c,a ;| ROM0:07D0 7E ld a,(hl) ;| ROM0:07D1 47 ld b,a ;/ ROM0:07D2 F0 AE ld a,(FF00+AE) ;\ ROM0:07D4 3D dec a ;} Decrement number of blocks to update ROM0:07D5 E0 AE ld (FF00+AE),a ;/ ROM0:07D7 20 B6 jr nz,078F ; If [number of blocks to update] != 0: go to LOOP_ALPHA ROM0:07D9 F0 AF ld a,(FF00+AF) ;\ ROM0:07DB 6F ld l,a ;| ROM0:07DC F0 B0 ld a,(FF00+B0) ;| ROM0:07DE 67 ld h,a ;} [Stack pointer for metatile update entries] = $0000 ROM0:07DF 3E 00 ld a,00 ;| ROM0:07E1 22 ldi (hl),a ;| ROM0:07E2 77 ld (hl),a ;/ ROM0:07E3 C9 ret } ;;; $07E4: Load column ;;; { ROM0:07E4 FA 23 D0 ld a,(D023) ;\ ROM0:07E7 E6 CF and CF ;} Set screen not moving horizontally ROM0:07E9 EA 23 D0 ld (D023),a ;/ ROM0:07EC CD 35 08 call 0835 ; Calculate metatile update addresses ROM0:07EF 3E 10 ld a,10 ;\ ROM0:07F1 E0 AE ld (FF00+AE),a ;} Number of blocks to update = 10h ; LOOP_ALPHA ROM0:07F3 CD 86 08 call 0886 ; Add metatile update entry ROM0:07F6 F0 AA ld a,(FF00+AA) ;\ ROM0:07F8 C6 40 add a,40 ;| ROM0:07FA E0 AA ld (FF00+AA),a ;| ROM0:07FC F0 AB ld a,(FF00+AB) ;} VRAM tilemap metatile update address = [VRAM tilemap metatile update address] + 40h & 9BFFh ROM0:07FE CE 00 adc a,00 ;| ROM0:0800 E6 9B and 9B ;| ROM0:0802 E0 AB ld (FF00+AB),a ;/ ROM0:0804 F0 AD ld a,(FF00+AD) ;\ ROM0:0806 C6 10 add a,10 ;} Index of block for metatile update += 10h ROM0:0808 E0 AD ld (FF00+AD),a ;/ ROM0:080A E6 F0 and F0 ;\ ROM0:080C 20 15 jr nz,0823 ;} If [index of block for metatile update] < 10h: ROM0:080E F0 AC ld a,(FF00+AC) ;\ ROM0:0810 C6 10 add a,10 ;} Index of screen for metatile update += 10h ROM0:0812 E0 AC ld (FF00+AC),a ;/ ROM0:0814 5F ld e,a ;\ ROM0:0815 16 00 ld d,00 ;| ROM0:0817 CB 23 sla e ;| ROM0:0819 CB 12 rl d ;| ROM0:081B 21 00 40 ld hl,4000 ;| ROM0:081E 19 add hl,de ;} bc = [$4000 + [index of screen for metatile update] * 2] (used in $0886) ROM0:081F 2A ldi a,(hl) ;| ROM0:0820 4F ld c,a ;| ROM0:0821 7E ld a,(hl) ;| ROM0:0822 47 ld b,a ;/ ROM0:0823 F0 AE ld a,(FF00+AE) ;\ ROM0:0825 3D dec a ;} Decrement number of blocks to update ROM0:0826 E0 AE ld (FF00+AE),a ;/ ROM0:0828 20 C9 jr nz,07F3 ; If [number of blocks to update] != 0: go to LOOP_ALPHA ROM0:082A F0 AF ld a,(FF00+AF) ;\ ROM0:082C 6F ld l,a ;| ROM0:082D F0 B0 ld a,(FF00+B0) ;| ROM0:082F 67 ld h,a ;} Stack pointer for metatile update entries = $0000 ROM0:0830 3E 00 ld a,00 ;| ROM0:0832 22 ldi (hl),a ;| ROM0:0833 77 ld (hl),a ;/ ROM0:0834 C9 ret } ;;; $0835: Calculate metatile update addresses (unit) ;;; { ; Called by $0788 and $07E4 ROM0:0835 F0 CD ld a,(FF00+CD) ;\ ROM0:0837 CB 37 swap a ;| ROM0:0839 E6 F0 and F0 ;| ROM0:083B 47 ld b,a ;| ROM0:083C F0 CF ld a,(FF00+CF) ;} Index of screen for metatile update = [row screen to update] * 16 + [column screen to update] ROM0:083E E6 0F and 0F ;| ROM0:0840 B0 or b ;| ROM0:0841 E0 AC ld (FF00+AC),a ;/ ROM0:0843 5F ld e,a ;\ ROM0:0844 16 00 ld d,00 ;| ROM0:0846 CB 23 sla e ;| ROM0:0848 CB 12 rl d ;| ROM0:084A 21 00 40 ld hl,4000 ;| ROM0:084D 19 add hl,de ;} bc = [$4000 + [index of screen for metatile update] * 2] (used in $0886) ROM0:084E 2A ldi a,(hl) ;| ROM0:084F 4F ld c,a ;| ROM0:0850 7E ld a,(hl) ;| ROM0:0851 47 ld b,a ;/ ROM0:0852 F0 CC ld a,(FF00+CC) ;\ ROM0:0854 E6 F0 and F0 ;| ROM0:0856 6F ld l,a ;| ROM0:0857 F0 CE ld a,(FF00+CE) ;| ROM0:0859 CB 37 swap a ;} Index of block for metatile update = [row block to update] * 16 + [column block to update] ROM0:085B E6 0F and 0F ;| ROM0:085D B5 or l ;| ROM0:085E E0 AD ld (FF00+AD),a ;/ ROM0:0860 21 00 98 ld hl,9800 ;\ ROM0:0863 F0 CC ld a,(FF00+CC) ;| ROM0:0865 E6 F0 and F0 ;| ROM0:0867 5F ld e,a ;| ROM0:0868 AF xor a ;| ROM0:0869 57 ld d,a ;| ROM0:086A CB 23 sla e ;| ROM0:086C CB 12 rl d ;| ROM0:086E CB 23 sla e ;| ROM0:0870 CB 12 rl d ;| ROM0:0872 19 add hl,de ;| ROM0:0873 F0 CE ld a,(FF00+CE) ;} VRAM tilemap metatile update address = $9800 + ([row block to update] * 32 + [column block to update]) * 2 ROM0:0875 E6 F0 and F0 ;| ROM0:0877 CB 37 swap a ;| ROM0:0879 CB 27 sla a ;| ROM0:087B 5F ld e,a ;| ROM0:087C 16 00 ld d,00 ;| ROM0:087E 19 add hl,de ;| ROM0:087F 7D ld a,l ;| ROM0:0880 E0 AA ld (FF00+AA),a ;| ROM0:0882 7C ld a,h ;| ROM0:0883 E0 AB ld (FF00+AB),a ;/ ROM0:0885 C9 ret } ;;; $0886: Add metatile update entry (unit) ;;; { ; Called by $0788 and $07E4 ROM0:0886 F0 AD ld a,(FF00+AD) ;\ ROM0:0888 6F ld l,a ;| ROM0:0889 26 00 ld h,00 ;| ROM0:088B 09 add hl,bc ;| ROM0:088C 7E ld a,(hl) ;| ROM0:088D 5F ld e,a ;| ROM0:088E AF xor a ;| ROM0:088F 57 ld d,a ;} hl = metatile definitions + [[bc] + [index of block for metatile update]] * 4 ROM0:0890 CB 23 sla e ;| ROM0:0892 CB 12 rl d ;| ROM0:0894 CB 23 sla e ;| ROM0:0896 CB 12 rl d ;| ROM0:0898 21 00 DA ld hl,DA00 ;| ROM0:089B 19 add hl,de ;/ ROM0:089C 2A ldi a,(hl) ;\ ROM0:089D EA 08 D0 ld (D008),a ;} Metatile top-left = [[hl]] ROM0:08A0 2A ldi a,(hl) ;\ ROM0:08A1 EA 09 D0 ld (D009),a ;} Metatile top-right = [[hl] + 1] ROM0:08A4 2A ldi a,(hl) ;\ ROM0:08A5 EA 0A D0 ld (D00A),a ;} Metatile bottom-left = [[hl] + 2] ROM0:08A8 2A ldi a,(hl) ;\ ROM0:08A9 EA 0B D0 ld (D00B),a ;} Metatile bottom-right = [[hl] + 3] ROM0:08AC F0 AF ld a,(FF00+AF) ;\ ROM0:08AE 6F ld l,a ;| ROM0:08AF F0 B0 ld a,(FF00+B0) ;| ROM0:08B1 67 ld h,a ;| ROM0:08B2 F0 AA ld a,(FF00+AA) ;} Metatile update entry dest. address = [VRAM tilemap metatile update address] ROM0:08B4 22 ldi (hl),a ;| ROM0:08B5 F0 AB ld a,(FF00+AB) ;| ROM0:08B7 22 ldi (hl),a ;/ ROM0:08B8 FA 08 D0 ld a,(D008) ;\ ROM0:08BB 22 ldi (hl),a ;} Metatile update entry top-left = [metatile top-left] ROM0:08BC FA 09 D0 ld a,(D009) ;\ ROM0:08BF 22 ldi (hl),a ;} Metatile update entry top-right = [metatile top-right] ROM0:08C0 FA 0A D0 ld a,(D00A) ;\ ROM0:08C3 22 ldi (hl),a ;} Metatile update entry bottom-left = [metatile bottom-left] ROM0:08C4 FA 0B D0 ld a,(D00B) ;\ ROM0:08C7 22 ldi (hl),a ;} Metatile update entry bottom-right = [metatile bottom-right] ROM0:08C8 7D ld a,l ;\ ROM0:08C9 E0 AF ld (FF00+AF),a ;| ROM0:08CB 7C ld a,h ;} Stack pointer for metatile update entries += 6 ROM0:08CC E0 B0 ld (FF00+B0),a ;/ ROM0:08CE C9 ret } ;;; $08CF: Handle metatile update entries (unit) ;;; { ; Called by v-blank interrupt handler, loading save, $0673, and $2B8F ROM0:08CF 11 FF DD ld de,DDFF ; de = metatile definitions - 1 ; LOOP ROM0:08D2 13 inc de ;\ ROM0:08D3 1A ld a,(de) ;| ROM0:08D4 6F ld l,a ;| ROM0:08D5 13 inc de ;} hl = [[++de]] ROM0:08D6 1A ld a,(de) ;| ROM0:08D7 67 ld h,a ;/ ROM0:08D8 A7 and a ;\ ROM0:08D9 28 1E jr z,08F9 ;} If h = 0: go to BRANCH_RETURN ROM0:08DB 13 inc de ;\ ROM0:08DC 1A ld a,(de) ;} [hl] = [[++de]] ROM0:08DD 22 ldi (hl),a ;/ ROM0:08DE 7C ld a,h ;\ ROM0:08DF E6 9B and 9B ;| ROM0:08E1 67 ld h,a ;} [hl + 1 & 9BFFh] = [[++de]] ROM0:08E2 13 inc de ;| ROM0:08E3 1A ld a,(de) ;/ ROM0:08E4 77 ld (hl),a ;/ ROM0:08E5 01 1F 00 ld bc,001F ;\ ROM0:08E8 09 add hl,bc ;| ROM0:08E9 7C ld a,h ;| ROM0:08EA E6 9B and 9B ;| ROM0:08EC 67 ld h,a ;} [hl + 20h & 9BFFh] = [[++de]] ROM0:08ED 13 inc de ;| ROM0:08EE 1A ld a,(de) ;| ROM0:08EF 22 ldi (hl),a ;/ ROM0:08F0 7C ld a,h ;\ ROM0:08F1 E6 9B and 9B ;| ROM0:08F3 67 ld h,a ;| ROM0:08F4 13 inc de ;} [hl + 21h & 9BFFh] = [[++de]] ROM0:08F5 1A ld a,(de) ;| ROM0:08F6 77 ld (hl),a ;/ ROM0:08F7 18 D9 jr 08D2 ; Go to LOOP ; BRANCH_RETURN ROM0:08F9 AF xor a ;\ ROM0:08FA EA 01 DE ld (DE01),a ;} $DE01 = 0 ROM0:08FD C9 ret } ;;; $08FE: Handle scrolling / triggering door transitions ;;; { ; Called by in-game ROM0:08FE FA 0E D0 ld a,(D00E) ;\ ROM0:0901 A7 and a ;} If [door transition]: go to BRANCH_IN_DOOR_TRANSITION ROM0:0902 C2 44 0B jp nz,0B44 ;/ ROM0:0905 F0 C9 ld a,(FF00+C9) ;\ ROM0:0907 CB 37 swap a ;| ROM0:0909 47 ld b,a ;| ROM0:090A F0 CB ld a,(FF00+CB) ;| ROM0:090C B0 or b ;| ROM0:090D 5F ld e,a ;} Door scroll flags = [$4200 + [screen Y position, screen] * 16 + [screen X position, screen]] ROM0:090E 16 00 ld d,00 ;| ROM0:0910 21 00 42 ld hl,4200 ;| ROM0:0913 19 add hl,de ;| ROM0:0914 7E ld a,(hl) ;| ROM0:0915 E0 98 ld (FF00+98),a ;/ ROM0:0917 F0 98 ld a,(FF00+98) ;\ ROM0:0919 CB 47 bit 0,a ;} If can scroll right: go to BRANCH_SCROLL_RIGHT ROM0:091B 28 2C jr z,0949 ;/ ROM0:091D F0 CA ld a,(FF00+CA) ;\ ROM0:091F FE B0 cp B0 ;} If [screen X position] & FFh = B0h: ROM0:0921 C2 36 09 jp nz,0936 ;/ ROM0:0924 FA 3C D0 ld a,(D03C) ;\ ROM0:0927 FE A1 cp A1 ;} If [Samus' X position on screen] < A1h: go to BRANCH_SCROLL_RIGHT_END ROM0:0929 38 66 jr c,0991 ;/ ROM0:092B 3E 01 ld a,01 ;\ ROM0:092D EA 0E D0 ld (D00E),a ;} Door transition direction = right ROM0:0930 CD 37 0C call 0C37 ; Set up door transition ROM0:0933 C3 91 09 jp 0991 ; Go to BRANCH_SCROLL_RIGHT_END ROM0:0936 38 11 jr c,0949 ; If [screen X position] & FFh < B0h: go to BRANCH_SCROLL_RIGHT ROM0:0938 F0 CA ld a,(FF00+CA) ;\ ROM0:093A D6 01 sub 01 ;| ROM0:093C E0 CA ld (FF00+CA),a ;| ROM0:093E F0 CB ld a,(FF00+CB) ;} Screen X position = [screen X position] - 1 & 0FFFh ROM0:0940 DE 00 sbc a,00 ;| ROM0:0942 E6 0F and 0F ;| ROM0:0944 E0 CB ld (FF00+CB),a ;/ ROM0:0946 C3 91 09 jp 0991 ; Go to BRANCH_SCROLL_RIGHT_END ; BRANCH_SCROLL_RIGHT ROM0:0949 FA 35 D0 ld a,(D035) ;\ ROM0:094C A7 and a ;} If [screen right velocity] = 0: go to BRANCH_SCROLL_RIGHT_END ROM0:094D 28 42 jr z,0991 ;/ ROM0:094F 47 ld b,a ;\ ROM0:0950 F0 CA ld a,(FF00+CA) ;| ROM0:0952 80 add a,b ;| ROM0:0953 E0 CA ld (FF00+CA),a ;| ROM0:0955 47 ld b,a ;} Screen X position = [screen X position] + [Screen right velocity] & 0FFFh ROM0:0956 F0 CB ld a,(FF00+CB) ;| ROM0:0958 CE 00 adc a,00 ;| ROM0:095A E6 0F and 0F ;| ROM0:095C E0 CB ld (FF00+CB),a ;/ ROM0:095E FA 23 D0 ld a,(D023) ;\ ROM0:0961 CB E7 set 4,a ;} Set screen moving right ROM0:0963 EA 23 D0 ld (D023),a ;/ ROM0:0966 F0 C2 ld a,(FF00+C2) ;\ ROM0:0968 90 sub b ;| ROM0:0969 C6 60 add a,60 ;} If [Samus' X position] - [screen X position] + 60h >= 40h: ROM0:096B FE 40 cp 40 ;| ROM0:096D 38 10 jr c,097F ;/ ROM0:096F F0 CA ld a,(FF00+CA) ;\ ROM0:0971 C6 01 add a,01 ;| ROM0:0973 E0 CA ld (FF00+CA),a ;| ROM0:0975 F0 CB ld a,(FF00+CB) ;} Screen X position = [screen X position] + 1 & 0FFFh ROM0:0977 CE 00 adc a,00 ;| ROM0:0979 E6 0F and 0F ;| ROM0:097B E0 CB ld (FF00+CB),a ;/ ROM0:097D 18 12 jr 0991 ; Go to BRANCH_SCROLL_RIGHT_END ROM0:097F FE 3F cp 3F ;\ ROM0:0981 30 0E jr nc,0991 ;} If [Samus' X position] - [screen X position] + 60h < 3Fh: (redundant check) ROM0:0983 F0 CA ld a,(FF00+CA) ;\ ROM0:0985 D6 01 sub 01 ;| ROM0:0987 E0 CA ld (FF00+CA),a ;| ROM0:0989 F0 CB ld a,(FF00+CB) ;} Screen X position = [screen X position] - 1 & 0FFFh ROM0:098B DE 00 sbc a,00 ;| ROM0:098D E6 0F and 0F ;| ROM0:098F E0 CB ld (FF00+CB),a ;/ ; BRANCH_SCROLL_RIGHT_END ROM0:0991 F0 98 ld a,(FF00+98) ;\ ROM0:0993 CB 4F bit 1,a ;} If can scroll left: go to BRANCH_SCROLL_LEFT ROM0:0995 28 36 jr z,09CD ;/ ROM0:0997 F0 CA ld a,(FF00+CA) ;\ ROM0:0999 FE 50 cp 50 ;} If [screen X position] = 50h: ROM0:099B 20 1E jr nz,09BB ;/ ROM0:099D FA 3C D0 ld a,(D03C) ;\ ROM0:09A0 FE 0F cp 0F ;} If [Samus' Y position on screen] >= Fh: go to BRANCH_SCROLL_LEFT_END ROM0:09A2 D2 18 0A jp nc,0A18 ;/ ROM0:09A5 3E 02 ld a,02 ;\ ROM0:09A7 EA 0E D0 ld (D00E),a ;} Door transition direction = left ROM0:09AA 3E 00 ld a,00 ;\ ROM0:09AC E0 C2 ld (FF00+C2),a ;} Samus' X position = 0 ROM0:09AE F0 C3 ld a,(FF00+C3) ;\ ROM0:09B0 3C inc a ;| ROM0:09B1 E6 0F and 0F ;} Samus' X position, screen = [Samus' X position, screen] + 1 & 0Fh ROM0:09B3 E0 C3 ld (FF00+C3),a ;/ ROM0:09B5 CD 37 0C call 0C37 ; Set up door transition ROM0:09B8 C3 18 0A jp 0A18 ; Go to BRANCH_SCROLL_LEFT_END ROM0:09BB 30 10 jr nc,09CD ; If [screen X position] < 50h: ROM0:09BD F0 CA ld a,(FF00+CA) ;\ ROM0:09BF C6 01 add a,01 ;| ROM0:09C1 E0 CA ld (FF00+CA),a ;| ROM0:09C3 F0 CB ld a,(FF00+CB) ;} Screen X position = [screen X position] + 1 & 0FFFh ROM0:09C5 CE 00 adc a,00 ;| ROM0:09C7 E6 0F and 0F ;| ROM0:09C9 E0 CB ld (FF00+CB),a ;/ ROM0:09CB 18 4B jr 0A18 ; Go to BRANCH_SCROLL_LEFT_END ; BRANCH_SCROLL_LEFT ROM0:09CD FA 36 D0 ld a,(D036) ;\ ROM0:09D0 A7 and a ;} If [Screen left velocity] = 0: go to BRANCH_SCROLL_LEFT_END ROM0:09D1 28 45 jr z,0A18 ;/ ROM0:09D3 FA 36 D0 ld a,(D036) ;\ ROM0:09D6 47 ld b,a ;| ROM0:09D7 F0 CA ld a,(FF00+CA) ;| ROM0:09D9 90 sub b ;| ROM0:09DA E0 CA ld (FF00+CA),a ;| ROM0:09DC 47 ld b,a ;} Screen X position = [screen X position] - [screen left velocity] & 0FFFh ROM0:09DD F0 CB ld a,(FF00+CB) ;| ROM0:09DF DE 00 sbc a,00 ;| ROM0:09E1 E6 0F and 0F ;| ROM0:09E3 E0 CB ld (FF00+CB),a ;/ ROM0:09E5 FA 23 D0 ld a,(D023) ;\ ROM0:09E8 CB EF set 5,a ;} Set screen moving left ROM0:09EA EA 23 D0 ld (D023),a ;/ ROM0:09ED F0 C2 ld a,(FF00+C2) ;\ ROM0:09EF 90 sub b ;| ROM0:09F0 C6 60 add a,60 ;} If [Samus' X position] - [screen X position] + 60 < 70h: ROM0:09F2 FE 70 cp 70 ;| ROM0:09F4 30 10 jr nc,0A06 ;/ ROM0:09F6 F0 CA ld a,(FF00+CA) ;\ ROM0:09F8 D6 01 sub 01 ;| ROM0:09FA E0 CA ld (FF00+CA),a ;| ROM0:09FC F0 CB ld a,(FF00+CB) ;} Screen X position = [screen X position] - 1 & 0FFFh ROM0:09FE DE 00 sbc a,00 ;| ROM0:0A00 E6 0F and 0F ;| ROM0:0A02 E0 CB ld (FF00+CB),a ;/ ROM0:0A04 18 12 jr 0A18 ; Go to BRANCH_SCROLL_LEFT_END ROM0:0A06 FE 71 cp 71 ;\ ROM0:0A08 38 0E jr c,0A18 ;} If [Samus' X position] - [screen X position] + 60 >= 71h: (redundant check) ROM0:0A0A F0 CA ld a,(FF00+CA) ;\ ROM0:0A0C C6 01 add a,01 ;| ROM0:0A0E E0 CA ld (FF00+CA),a ;| ROM0:0A10 F0 CB ld a,(FF00+CB) ;} Screen X position = [screen X position] + 1 & 0FFFh ROM0:0A12 CE 00 adc a,00 ;| ROM0:0A14 E6 0F and 0F ;| ROM0:0A16 E0 CB ld (FF00+CB),a ;/ ; BRANCH_SCROLL_LEFT_END ROM0:0A18 AF xor a ROM0:0A19 EA 35 D0 ld (D035),a ; Screen right velocity = 0 ROM0:0A1C EA 36 D0 ld (D036),a ; Screen left velocity = 0 ROM0:0A1F F0 C8 ld a,(FF00+C8) ;\ ROM0:0A21 47 ld b,a ;| ROM0:0A22 F0 C0 ld a,(FF00+C0) ;| ROM0:0A24 90 sub b ;} $FF99 = [Samus' Y position] - [screen Y position] + 60h ROM0:0A25 C6 60 add a,60 ;| ROM0:0A27 E0 99 ld (FF00+99),a ;/ ROM0:0A29 FA 0C D0 ld a,(D00C) ;\ ROM0:0A2C 47 ld b,a ;| ROM0:0A2D F0 C0 ld a,(FF00+C0) ;} If [Samus' Y position] = [Samus' previous Y position]: go to BRANCH_RETURN ROM0:0A2F 90 sub b ;| ROM0:0A30 CA 2C 0B jp z,0B2C ;/ ROM0:0A33 CB 7F bit 7,a ;\ ROM0:0A35 C2 B6 0A jp nz,0AB6 ;} If [Samus' Y position] < [Samus' previous Y position]: go to BRANCH_SCROLL_DOWN_END ROM0:0A38 EA 38 D0 ld (D038),a ; Screen down velocity = [Samus' Y position] - [Samus' previous Y position] ROM0:0A3B FA 23 D0 ld a,(D023) ;\ ROM0:0A3E CB FF set 7,a ;} Set screen moving down ROM0:0A40 EA 23 D0 ld (D023),a ;/ ROM0:0A43 F0 98 ld a,(FF00+98) ;\ ROM0:0A45 CB 5F bit 3,a ;} If can scroll down: go to BRANCH_SCROLL_DOWN ROM0:0A47 28 54 jr z,0A9D ;/ ROM0:0A49 FA 8B D0 ld a,(D08B) ;\ ROM0:0A4C FE 11 cp 11 ;} If Metroid Queen's room: go to BRANCH_SCROLL_DOWN_METROID_QUEEN ROM0:0A4E 20 08 jr nz,0A58 ;/ ROM0:0A50 F0 C8 ld a,(FF00+C8) ;\ ROM0:0A52 FE A0 cp A0 ;} If [screen Y position] != A0h: go to BRANCH_ETA ROM0:0A54 20 1B jr nz,0A71 ;/ ROM0:0A56 18 06 jr 0A5E ; Go to BRANCH_ZETA ; BRANCH_SCROLL_DOWN_METROID_QUEEN ROM0:0A58 F0 C8 ld a,(FF00+C8) ;\ ROM0:0A5A FE C0 cp C0 ;} If [screen Y position] != C0h: go to BRANCH_ETA ROM0:0A5C 20 13 jr nz,0A71 ;/ ; BRANCH_ZETA ROM0:0A5E FA 3B D0 ld a,(D03B) ;\ ROM0:0A61 FE 78 cp 78 ;} If [Samus' Y position on screen] < 78h: go to BRANCH_RETURN ROM0:0A63 DA 2C 0B jp c,0B2C ;/ ROM0:0A66 3E 08 ld a,08 ;\ ROM0:0A68 EA 0E D0 ld (D00E),a ;} Door transition direction = down ROM0:0A6B CD 37 0C call 0C37 ; Set up door transition ROM0:0A6E C3 B6 0A jp 0AB6 ; Go to BRANCH_SCROLL_DOWN_END ; BRANCH_ETA ROM0:0A71 38 11 jr c,0A84 ; If not Metroid Queen's room and [screen Y position] >= A0h or [screen Y position] >= C0h: ROM0:0A73 F0 C8 ld a,(FF00+C8) ;\ ROM0:0A75 D6 01 sub 01 ;| ROM0:0A77 E0 C8 ld (FF00+C8),a ;| ROM0:0A79 F0 C9 ld a,(FF00+C9) ;} Screen Y position = [screen Y position] - 1 & 0FFFh ROM0:0A7B DE 00 sbc a,00 ;| ROM0:0A7D E6 0F and 0F ;| ROM0:0A7F E0 C9 ld (FF00+C9),a ;/ ROM0:0A81 C3 2C 0B jp 0B2C ; Go to BRANCH_RETURN ROM0:0A84 F0 99 ld a,(FF00+99) ;\ ROM0:0A86 FE 40 cp 40 ;} If [$FF99] < 40h: go to BRANCH_RETURN ROM0:0A88 DA 2C 0B jp c,0B2C ;/ ROM0:0A8B FA 38 D0 ld a,(D038) ;\ ROM0:0A8E 47 ld b,a ;| ROM0:0A8F F0 C8 ld a,(FF00+C8) ;| ROM0:0A91 80 add a,b ;| ROM0:0A92 E0 C8 ld (FF00+C8),a ;} Screen Y position += [Screen down velocity] ROM0:0A94 F0 C9 ld a,(FF00+C9) ;| ROM0:0A96 CE 00 adc a,00 ;| ROM0:0A98 E0 C9 ld (FF00+C9),a ;/ ROM0:0A9A C3 2C 0B jp 0B2C ; Go to BRANCH_RETURN ; BRANCH_SCROLL_DOWN ROM0:0A9D F0 99 ld a,(FF00+99) ;\ ROM0:0A9F FE 50 cp 50 ;} If [$FF99] < 50h: go to BRANCH_RETURN ROM0:0AA1 DA 2C 0B jp c,0B2C ;/ ROM0:0AA4 FA 38 D0 ld a,(D038) ;\ ROM0:0AA7 47 ld b,a ;| ROM0:0AA8 F0 C8 ld a,(FF00+C8) ;| ROM0:0AAA 80 add a,b ;| ROM0:0AAB E0 C8 ld (FF00+C8),a ;} Screen Y position += [Screen down velocity] ROM0:0AAD F0 C9 ld a,(FF00+C9) ;| ROM0:0AAF CE 00 adc a,00 ;| ROM0:0AB1 E0 C9 ld (FF00+C9),a ;/ ROM0:0AB3 C3 2C 0B jp 0B2C ; Go to BRANCH_RETURN ; BRANCH_SCROLL_DOWN_END ROM0:0AB6 2F cpl ;\ ROM0:0AB7 3C inc a ;} Screen up velocity = [Samus' previous Y position] - [Samus' Y position] (unless the branch came from $0A6E...) ROM0:0AB8 EA 37 D0 ld (D037),a ;/ ROM0:0ABB FA 23 D0 ld a,(D023) ;\ ROM0:0ABE CB F7 set 6,a ;} Set screen moving up ROM0:0AC0 EA 23 D0 ld (D023),a ;/ ROM0:0AC3 F0 98 ld a,(FF00+98) ;\ ROM0:0AC5 CB 57 bit 2,a ;} If can scroll up: go to BRANCH_SCROLL_UP ROM0:0AC7 28 4E jr z,0B17 ;/ ROM0:0AC9 F0 C8 ld a,(FF00+C8) ;\ ROM0:0ACB FE 48 cp 48 ;} If [screen Y position] = 48h: ROM0:0ACD 20 1F jr nz,0AEE ;/ ROM0:0ACF FA 3B D0 ld a,(D03B) ;\ ROM0:0AD2 FE 1B cp 1B ;} If [Samus' Y position on screen] >= 1Bh: go to BRANCH_RETURN ROM0:0AD4 30 56 jr nc,0B2C ;/ ROM0:0AD6 3E 04 ld a,04 ;\ ROM0:0AD8 EA 0E D0 ld (D00E),a ;} Door transition direction = up ROM0:0ADB 3E 00 ld a,00 ;\ ROM0:0ADD E0 C0 ld (FF00+C0),a ;| ROM0:0ADF F0 C9 ld a,(FF00+C9) ;} Samus' Y position high = [screen Y position] & FF00h ROM0:0AE1 E0 C1 ld (FF00+C1),a ;/ ROM0:0AE3 FA 8B D0 ld a,(D08B) ;\ ROM0:0AE6 FE 11 cp 11 ;} If not in Metroid Queen's room: set up door transition ROM0:0AE8 C4 37 0C call nz,0C37 ;/ ROM0:0AEB C3 2C 0B jp 0B2C ; Go to BRANCH_RETURN ROM0:0AEE 30 10 jr nc,0B00 ; If [screen Y position] < 48h: ROM0:0AF0 F0 C8 ld a,(FF00+C8) ;\ ROM0:0AF2 C6 01 add a,01 ;| ROM0:0AF4 E0 C8 ld (FF00+C8),a ;| ROM0:0AF6 F0 C9 ld a,(FF00+C9) ;} Screen Y position = [screen Y position] + 1 & 0FFFh ROM0:0AF8 CE 00 adc a,00 ;| ROM0:0AFA E6 0F and 0F ;| ROM0:0AFC E0 C9 ld (FF00+C9),a ;/ ROM0:0AFE 18 2C jr 0B2C ; Go to BRANCH_RETURN ROM0:0B00 F0 99 ld a,(FF00+99) ;\ ROM0:0B02 FE 3E cp 3E ;} If [$FF99] >= 3Eh: go to BRANCH_RETURN ROM0:0B04 30 26 jr nc,0B2C ;/ ROM0:0B06 FA 37 D0 ld a,(D037) ;\ ROM0:0B09 47 ld b,a ;| ROM0:0B0A F0 C8 ld a,(FF00+C8) ;| ROM0:0B0C 90 sub b ;| ROM0:0B0D E0 C8 ld (FF00+C8),a ;} Screen Y position -= [Screen up velocity] ROM0:0B0F F0 C9 ld a,(FF00+C9) ;| ROM0:0B11 DE 00 sbc a,00 ;| ROM0:0B13 E0 C9 ld (FF00+C9),a ;/ ROM0:0B15 18 15 jr 0B2C ; Go to BRANCH_RETURN ; BRANCH_SCROLL_UP ROM0:0B17 F0 99 ld a,(FF00+99) ;\ ROM0:0B19 FE 4E cp 4E ;} If [$FF99] >= 4Eh: go to BRANCH_RETURN ROM0:0B1B 30 0F jr nc,0B2C ;/ ROM0:0B1D FA 37 D0 ld a,(D037) ;\ ROM0:0B20 47 ld b,a ;| ROM0:0B21 F0 C8 ld a,(FF00+C8) ;| ROM0:0B23 90 sub b ;| ROM0:0B24 E0 C8 ld (FF00+C8),a ;} Screen Y position -= [Screen up velocity] ROM0:0B26 F0 C9 ld a,(FF00+C9) ;| ROM0:0B28 DE 00 sbc a,00 ;| ROM0:0B2A E0 C9 ld (FF00+C9),a ;/ ; BRANCH_RETURN ROM0:0B2C AF xor a ROM0:0B2D EA 38 D0 ld (D038),a ; Screen down velocity = 0 ROM0:0B30 EA 37 D0 ld (D037),a ; Screen up velocity = 0 ROM0:0B33 F0 C0 ld a,(FF00+C0) ;\ ROM0:0B35 EA 0C D0 ld (D00C),a ;} Samus' previous Y position = [Samus' Y position] ROM0:0B38 C9 ret ; Don't see any reference to this... ROM0:0B39 db 00, 01, 01, 00, 00, 00, 01, 02, 02, 01, 01 ; BRANCH_IN_DOOR_TRANSITION ROM0:0B44 FA 72 D0 ld a,(D072) ;\ ROM0:0B47 3C inc a ;} ++$D072 ROM0:0B48 EA 72 D0 ld (D072),a ;/ ROM0:0B4B FA 0E D0 ld a,(D00E) ;\ ROM0:0B4E CB 47 bit 0,a ;} If door transition direction = right: ROM0:0B50 28 30 jr z,0B82 ;/ ROM0:0B52 F0 CA ld a,(FF00+CA) ;\ ROM0:0B54 C6 04 add a,04 ;| ROM0:0B56 E0 CA ld (FF00+CA),a ;| ROM0:0B58 F0 CB ld a,(FF00+CB) ;} Screen X position = [screen X position] + 4 & 0FFFh ROM0:0B5A CE 00 adc a,00 ;| ROM0:0B5C E6 0F and 0F ;| ROM0:0B5E E0 CB ld (FF00+CB),a ;/ ROM0:0B60 FA 22 D0 ld a,(D022) ;\ ROM0:0B63 3C inc a ;| ROM0:0B64 3C inc a ;} $D022 += 3 ROM0:0B65 3C inc a ;| ROM0:0B66 EA 22 D0 ld (D022),a ;/ ROM0:0B69 3E 10 ld a,10 ;\ ROM0:0B6B EA 23 D0 ld (D023),a ;} Set screen moving exclusively right ROM0:0B6E F0 C2 ld a,(FF00+C2) ;\ ROM0:0B70 C6 01 add a,01 ;| ROM0:0B72 E0 C2 ld (FF00+C2),a ;| ROM0:0B74 F0 C3 ld a,(FF00+C3) ;} Increment Samus' X position ROM0:0B76 CE 00 adc a,00 ;| ROM0:0B78 E0 C3 ld (FF00+C3),a ;/ ROM0:0B7A F0 CA ld a,(FF00+CA) ;\ ROM0:0B7C FE 50 cp 50 ;} If [screen X position] != 50h: return ROM0:0B7E C0 ret nz ;/ ROM0:0B7F C3 24 0C jp 0C24 ; Go to BRANCH_DOOR_TRANSITION_FINISHED ROM0:0B82 CB 4F bit 1,a ;\ ROM0:0B84 28 2F jr z,0BB5 ;} If door transition direction = left: ROM0:0B86 F0 CA ld a,(FF00+CA) ;\ ROM0:0B88 D6 04 sub 04 ;| ROM0:0B8A E0 CA ld (FF00+CA),a ;| ROM0:0B8C F0 CB ld a,(FF00+CB) ;} Screen X position = [screen X position] - 4 & 0FFFh ROM0:0B8E DE 00 sbc a,00 ;| ROM0:0B90 E6 0F and 0F ;| ROM0:0B92 E0 CB ld (FF00+CB),a ;/ ROM0:0B94 FA 22 D0 ld a,(D022) ;\ ROM0:0B97 3C inc a ;| ROM0:0B98 3C inc a ;} $D022 += 3 ROM0:0B99 3C inc a ;| ROM0:0B9A EA 22 D0 ld (D022),a ;/ ROM0:0B9D 3E 20 ld a,20 ;\ ROM0:0B9F EA 23 D0 ld (D023),a ;} Set screen moving exclusively left ROM0:0BA2 F0 C2 ld a,(FF00+C2) ;\ ROM0:0BA4 D6 01 sub 01 ;| ROM0:0BA6 E0 C2 ld (FF00+C2),a ;| ROM0:0BA8 F0 C3 ld a,(FF00+C3) ;} Decrement Samus' X position ROM0:0BAA DE 00 sbc a,00 ;| ROM0:0BAC E0 C3 ld (FF00+C3),a ;/ ROM0:0BAE F0 CA ld a,(FF00+CA) ;\ ROM0:0BB0 FE B0 cp B0 ;} If [screen X position] != B0h: return ROM0:0BB2 C0 ret nz ;/ ROM0:0BB3 18 6F jr 0C24 ; Go to BRANCH_DOOR_TRANSITION_FINISHED ROM0:0BB5 CB 57 bit 2,a ;\ ROM0:0BB7 28 35 jr z,0BEE ;} If door transition direction = up: ROM0:0BB9 F0 C8 ld a,(FF00+C8) ;\ ROM0:0BBB D6 04 sub 04 ;| ROM0:0BBD E0 C8 ld (FF00+C8),a ;| ROM0:0BBF F0 C9 ld a,(FF00+C9) ;} Screen X position = [screen X position] - 4 & 0FFFh ROM0:0BC1 DE 00 sbc a,00 ;| ROM0:0BC3 E6 0F and 0F ;| ROM0:0BC5 E0 C9 ld (FF00+C9),a ;/ ROM0:0BC7 FA 22 D0 ld a,(D022) ;\ ROM0:0BCA 3C inc a ;| ROM0:0BCB 3C inc a ;} $D022 += 3 ROM0:0BCC 3C inc a ;| ROM0:0BCD EA 22 D0 ld (D022),a ;/ ROM0:0BD0 3E 40 ld a,40 ;\ ROM0:0BD2 EA 23 D0 ld (D023),a ;} Set screen moving exclusively up ROM0:0BD5 F0 97 ld a,(FF00+97) ;\ ROM0:0BD7 E6 01 and 01 ;| ROM0:0BD9 C6 01 add a,01 ;| ROM0:0BDB 47 ld b,a ;| ROM0:0BDC F0 C0 ld a,(FF00+C0) ;| ROM0:0BDE 90 sub b ;} Samus' Y position -= 1 + [frame counter] % 2 ROM0:0BDF E0 C0 ld (FF00+C0),a ;| ROM0:0BE1 F0 C1 ld a,(FF00+C1) ;| ROM0:0BE3 DE 00 sbc a,00 ;| ROM0:0BE5 E0 C1 ld (FF00+C1),a ;/ ROM0:0BE7 F0 C8 ld a,(FF00+C8) ;\ ROM0:0BE9 FE B8 cp B8 ;} If [screen X position] != B8h: return ROM0:0BEB C0 ret nz ;/ ROM0:0BEC 18 36 jr 0C24 ; Go to BRANCH_DOOR_TRANSITION_FINISHED ROM0:0BEE CB 5F bit 3,a ;\ ROM0:0BF0 C8 ret z ;} If door transition direction = down: return (redundant check) ROM0:0BF1 F0 C8 ld a,(FF00+C8) ;\ ROM0:0BF3 C6 04 add a,04 ;| ROM0:0BF5 E0 C8 ld (FF00+C8),a ;| ROM0:0BF7 F0 C9 ld a,(FF00+C9) ;} Screen X position = [screen X position] + 4 & 0FFFh ROM0:0BF9 CE 00 adc a,00 ;| ROM0:0BFB E6 0F and 0F ;| ROM0:0BFD E0 C9 ld (FF00+C9),a ;/ ROM0:0BFF FA 22 D0 ld a,(D022) ;\ ROM0:0C02 3C inc a ;| ROM0:0C03 3C inc a ;} $D022 += 3 ROM0:0C04 3C inc a ;| ROM0:0C05 EA 22 D0 ld (D022),a ;/ ROM0:0C08 3E 80 ld a,80 ;\ ROM0:0C0A EA 23 D0 ld (D023),a ;} Set screen moving exclusively down ROM0:0C0D F0 97 ld a,(FF00+97) ;\ ROM0:0C0F E6 01 and 01 ;| ROM0:0C11 C6 01 add a,01 ;| ROM0:0C13 47 ld b,a ;| ROM0:0C14 F0 C0 ld a,(FF00+C0) ;| ROM0:0C16 80 add a,b ;} Samus' Y position += 1 + [frame counter] % 2 ROM0:0C17 E0 C0 ld (FF00+C0),a ;| ROM0:0C19 F0 C1 ld a,(FF00+C1) ;| ROM0:0C1B CE 00 adc a,00 ;| ROM0:0C1D E0 C1 ld (FF00+C1),a ;/ ROM0:0C1F F0 C8 ld a,(FF00+C8) ;\ ROM0:0C21 FE 48 cp 48 ;} If [screen X position] != 48h: return ROM0:0C23 C0 ret nz ;/ ; BRANCH_DOOR_TRANSITION_FINISHED ROM0:0C24 AF xor a ROM0:0C25 EA 0E D0 ld (D00E),a ; Door transition direction = none ROM0:0C28 EA 63 C4 ld (C463),a ; $C463 = 0 ROM0:0C2B FA 7E D0 ld a,(D07E) ;\ ROM0:0C2E FE 93 cp 93 ;} If [BG palette] = 93h: return ROM0:0C30 C8 ret z ;/ ROM0:0C31 3E 2F ld a,2F ;\ ROM0:0C33 EA 9B D0 ld (D09B),a ;} Fade in timer = 2Fh ROM0:0C36 C9 ret } ;;; $0C37: Set up door transition (unit) ;;; { ; Called by $08FE ; The debug section transitions to the Metroid Queen's room ROM0:0C37 FA 8B D0 ld a,(D08B) ;\ ROM0:0C3A FE 11 cp 11 ;} If Metroid Queen's room: ROM0:0C3C 20 10 jr nz,0C4E ;/ ROM0:0C3E FA 20 D0 ld a,(D020) ;\ ROM0:0C41 FE 0B cp 0B ;| ROM0:0C43 38 09 jr c,0C4E ;} If Samus is in spider ball: ROM0:0C45 FE 0F cp 0F ;| ROM0:0C47 30 05 jr nc,0C4E ;/ ROM0:0C49 3E 05 ld a,05 ;\ ROM0:0C4B EA 20 D0 ld (D020),a ;} Samus' pose = morphball ROM0:0C4E AF xor a ROM0:0C4F EA 22 C4 ld (C422),a ; Samus damage flag = 0 ROM0:0C52 EA 7D D0 ld (D07D),a ; On save pillar flag = 0 ROM0:0C55 3E FF ld a,FF ROM0:0C57 21 30 DD ld hl,DD30 ;\ ROM0:0C5A 77 ld (hl),a ;| ROM0:0C5B 21 40 DD ld hl,DD40 ;| ROM0:0C5E 77 ld (hl),a ;} Reset bomb projectile data ROM0:0C5F 21 50 DD ld hl,DD50 ;| ROM0:0C62 77 ld (hl),a ;/ ROM0:0C63 EA 9E D0 ld (D09E),a ; Set flag to play room song ROM0:0C66 F0 C9 ld a,(FF00+C9) ;\ ROM0:0C68 CB 37 swap a ;| ROM0:0C6A 5F ld e,a ;| ROM0:0C6B F0 CB ld a,(FF00+CB) ;| ROM0:0C6D 83 add a,e ;| ROM0:0C6E 5F ld e,a ;| ROM0:0C6F 16 00 ld d,00 ;| ROM0:0C71 CB 23 sla e ;| ROM0:0C73 CB 12 rl d ;} Screen transition command set index = [$4300 + ([screen Y position, screen] * 10h + [screen X position, screen]) * 2] & ~800h ROM0:0C75 21 00 43 ld hl,4300 ;| ROM0:0C78 19 add hl,de ;| ROM0:0C79 2A ldi a,(hl) ;| ROM0:0C7A EA 8E D0 ld (D08E),a ;| ROM0:0C7D 7E ld a,(hl) ;| ROM0:0C7E CB 9F res 3,a ;| ROM0:0C80 EA 8F D0 ld (D08F),a ;/ ROM0:0C83 3E 02 ld a,02 ;\ ROM0:0C85 EA 58 C4 ld (C458),a ;} $C458 = 2 ROM0:0C88 AF xor a ;\ ROM0:0C89 EA 9B D0 ld (D09B),a ;} Fade in timer = 0 ROM0:0C8C FA A0 D0 ld a,(D0A0) ;\ ROM0:0C8F A7 and a ;} If not debug: return ROM0:0C90 C8 ret z ;/ ROM0:0C91 F0 80 ld a,(FF00+80) ;\ ROM0:0C93 E6 0F and 0F ;| ROM0:0C95 FE 06 cp 06 ;} If sB pressed and not A or S: ROM0:0C97 C0 ret nz ;/ ROM0:0C98 3E 9D ld a,9D ;\ ROM0:0C9A EA 8E D0 ld (D08E),a ;| ROM0:0C9D 3E 01 ld a,01 ;} Screen transition command set index = 019Dh (Metroid Queen's room) ROM0:0C9F EA 8F D0 ld (D08F),a ;/ ROM0:0CA2 C9 ret } ;;; $0CA3: Set up Samus ;;; { ROM0:0CA3 CD EF 21 call 21EF ; Reset projectile and bomb data ROM0:0CA6 FA 02 D8 ld a,(D802) ;\ ROM0:0CA9 E0 C2 ld (FF00+C2),a ;| ROM0:0CAB FA 00 D8 ld a,(D800) ;| ROM0:0CAE E0 C0 ld (FF00+C0),a ;| ROM0:0CB0 EA 0C D0 ld (D00C),a ;} Samus' previous Y position = Samus' Y position = [$D800] ROM0:0CB3 FA 03 D8 ld a,(D803) ;} Samus' X position = [$D802] ROM0:0CB6 E0 C3 ld (FF00+C3),a ;| ROM0:0CB8 FA 01 D8 ld a,(D801) ;| ROM0:0CBB E0 C1 ld (FF00+C1),a ;/ ROM0:0CBD AF xor a ;\ ROM0:0CBE EA 4F D0 ld (D04F),a ;} Invincibility timer = 0 ROM0:0CC1 FA 15 D8 ld a,(D815) ;\ ROM0:0CC4 EA 45 D0 ld (D045),a ;} Equipment = [$D815] ROM0:0CC7 FA 16 D8 ld a,(D816) ;\ ROM0:0CCA EA 4D D0 ld (D04D),a ;} Samus' beam = Weapon equipped = [$D816] ROM0:0CCD EA 55 D0 ld (D055),a ;/ ROM0:0CD0 FA 1E D8 ld a,(D81E) ;\ ROM0:0CD3 EA 2B D0 ld (D02B),a ;} Direction Samus is facing = [$D81E] ROM0:0CD6 FA 17 D8 ld a,(D817) ;\ ROM0:0CD9 EA 50 D0 ld (D050),a ;} Samus' energy tanks = [$D817] ROM0:0CDC FA 18 D8 ld a,(D818) ;\ ROM0:0CDF EA 51 D0 ld (D051),a ;| ROM0:0CE2 EA 84 D0 ld (D084),a ;| ROM0:0CE5 FA 19 D8 ld a,(D819) ;} Samus' health for display = Samus' health = [$D818] ROM0:0CE8 EA 52 D0 ld (D052),a ;| ROM0:0CEB EA 85 D0 ld (D085),a ;/ ROM0:0CEE FA 1A D8 ld a,(D81A) ;\ ROM0:0CF1 EA 81 D0 ld (D081),a ;| ROM0:0CF4 FA 1B D8 ld a,(D81B) ;} Samus' max missiles = [$D81A] ROM0:0CF7 EA 82 D0 ld (D082),a ;/ ROM0:0CFA FA 1C D8 ld a,(D81C) ;\ ROM0:0CFD EA 53 D0 ld (D053),a ;| ROM0:0D00 EA 86 D0 ld (D086),a ;| ROM0:0D03 FA 1D D8 ld a,(D81D) ;} Samus' missiles for display = Samus' missiles = [$D81C] ROM0:0D06 EA 54 D0 ld (D054),a ;| ROM0:0D09 EA 87 D0 ld (D087),a ;/ ROM0:0D0C 3E 13 ld a,13 ;\ ROM0:0D0E EA 20 D0 ld (D020),a ;} Samus' pose = facing screen ROM0:0D11 3E 40 ld a,40 ;\ ROM0:0D13 EA 66 D0 ld (D066),a ;| ROM0:0D16 3E 01 ld a,01 ;} Loading timer = 140h ROM0:0D18 EA 67 D0 ld (D067),a ;/ ROM0:0D1B 3E 12 ld a,12 ;\ ROM0:0D1D EA DC CE ld (CEDC),a ;} Play Samus fanfare ROM0:0D20 C9 ret } ;;; $0D21: Samus' pose handler ;;; { ;;; $0D21: Samus' pose handler ;;; { ; Called by in-game and Samus' pose handler - turning ROM0:0D21 AF xor a ROM0:0D22 EA 48 D0 ld (D048),a ; $D048 = 0 ROM0:0D25 EA 62 D0 ld (D062),a ; $D062 = 0 ROM0:0D28 FA 72 D0 ld a,(D072) ;\ ROM0:0D2B 3C inc a ;} ++$D072 ROM0:0D2C EA 72 D0 ld (D072),a ;/ ROM0:0D2F FA 63 D0 ld a,(D063) ;\ ROM0:0D32 A7 and a ;} If [dying flag]: ROM0:0D33 28 05 jr z,0D3A ;/ ROM0:0D35 AF xor a ;\ ROM0:0D36 E0 81 ld (FF00+81),a ;} Buttons = new buttons = 0 ROM0:0D38 E0 80 ld (FF00+80),a ;/ ROM0:0D3A FA 0E D0 ld a,(D00E) ;\ ROM0:0D3D A7 and a ;} If in door transition: return ROM0:0D3E C0 ret nz ;/ ROM0:0D3F FA 20 D0 ld a,(D020) ;\ ROM0:0D42 CB 7F bit 7,a ;} If Samus is turning: go to turning ROM0:0D44 C2 9D 13 jp nz,139D ;/ ROM0:0D47 FA 20 D0 ld a,(D020) ;\ ROM0:0D4A EF rst 28 ;} Go to Samus pose dependent code ROM0:0D4B B7 dw 13B7, ; 00: Standing 17BB, ; 01: Jumping 18E8, ; 02: Spin-jumping 14D6, ; 03: Running (set to 83h when turning) 15F4, ; 04: Crouching 1701, ; 05: Morphball 179F, ; 06: Morphball jumping 12F5, ; 07: Falling 124B, ; 08: Morphball falling 19E2, ; 09: Starting to jump 19E2, ; 0A: Starting to spin-jump 1083, ; 0B: Spider ball rolling 11E4, ; 0C: Spider ball falling 1170, ; 0D: Spider ball jumping 1029, ; 0E: Spider ball 0EF7, ; 0F: Knockback 0F38, ; 10: Morphball knockback 0F6C, ; 11: Standing bombed 0ECB, ; 12: Morphball bombed 0EA5, ; 13: Facing screen 0EA5, 0EA5, 0EA5, 0EA5, 0E36, ; 18: Being eaten by Metroid Queen 0DF0, ; 19: In Metroid Queen's mouth 0DBE, ; 1A: Being swallowed by Metroid Queen 0D87, ; 1B: In Metroid Queen's stomach 0D8B, ; 1C: Escaping Metroid Queen 0ECB ; 1D: Escaped Metroid Queen } ;;; $0D87: Samus' pose handler - in Metroid Queen's stomach ;;; { ROM0:0D87 CD 29 2F call 2F29 ; Deal 2 damage every 16 frames ROM0:0D8A C9 ret } ;;; $0D8B: Samus' pose handler - escaping Metroid Queen ;;; { ROM0:0D8B CD 29 2F call 2F29 ; Deal 2 damage every 16 frames ROM0:0D8E F0 C2 ld a,(FF00+C2) ;\ ROM0:0D90 FE B0 cp B0 ;} If [Samus' X position low] = B0h: go to BRANCH_ESCAPED ROM0:0D92 28 1A jr z,0DAE ;/ ROM0:0D94 C6 02 add a,02 ;\ ROM0:0D96 E0 C2 ld (FF00+C2),a ;} Samus' X position low += 2 ROM0:0D98 FE 80 cp 80 ;\ ROM0:0D9A 30 08 jr nc,0DA4 ;} If [Samus' X position low] < 80h: ROM0:0D9C F0 C0 ld a,(FF00+C0) ;\ ROM0:0D9E D6 02 sub 02 ;} Samus' Y position low -= 2 ROM0:0DA0 E0 C0 ld (FF00+C0),a ;/ ROM0:0DA2 18 09 jr 0DAD ROM0:0DA4 FE 98 cp 98 ;\ Else ([Samus' X position low] >= 80h): ROM0:0DA6 38 05 jr c,0DAD ;} If [Samus' X position low] >= 98h: ROM0:0DA8 F0 C0 ld a,(FF00+C0) ;\ ROM0:0DAA 3D dec a ;} Samus' Y position low -= 1 ROM0:0DAB E0 C0 ld (FF00+C0),a ;/ ROM0:0DAD C9 ret ; BRANCH_ESCAPED ROM0:0DAE 3E 40 ld a,40 ;\ ROM0:0DB0 EA 26 D0 ld (D026),a ;} $D026 = 40h ROM0:0DB3 3E 01 ld a,01 ;\ ROM0:0DB5 EA 0F D0 ld (D00F),a ;} $D00F = 1 ROM0:0DB8 3E 1D ld a,1D ;\ ROM0:0DBA EA 20 D0 ld (D020),a ;} Samus' pose = escaped Metroid Queen ROM0:0DBD C9 ret } ;;; $0DBE: Samus' pose handler - being swallowed by Metroid Queen ;;; { ROM0:0DBE CD 29 2F call 2F29 ; Deal 2 damage every 16 frames ROM0:0DC1 F0 C2 ld a,(FF00+C2) ;\ ROM0:0DC3 FE 68 cp 68 ;} If [Samus' X position] = 68: go to BRANCH_SWALLOWED ROM0:0DC5 28 23 jr z,0DEA ;/ ROM0:0DC7 FA A8 C3 ld a,(C3A8) ;\ ROM0:0DCA C6 06 add a,06 ;| ROM0:0DCC 47 ld b,a ;| ROM0:0DCD FA 06 C2 ld a,(C206) ;| ROM0:0DD0 80 add a,b ;} If [Samus' X position] >= [Metroid Queen's head X position] + 6 + [scroll X] ROM0:0DD1 47 ld b,a ;| ROM0:0DD2 F0 C2 ld a,(FF00+C2) ;| ROM0:0DD4 B8 cp b ;| ROM0:0DD5 38 05 jr c,0DDC ;/ ROM0:0DD7 F0 C0 ld a,(FF00+C0) ;\ ROM0:0DD9 3D dec a ;} Samus' Y position low -= 1 ROM0:0DDA E0 C0 ld (FF00+C0),a ;/ ROM0:0DDC F0 C2 ld a,(FF00+C2) ;\ ROM0:0DDE 3D dec a ;} Samus' X position low -= 1 ROM0:0DDF E0 C2 ld (FF00+C2),a ;/ ROM0:0DE1 FE 80 cp 80 ;\ ROM0:0DE3 D0 ret nc ;} If [Samus' X position low] != 80h: return ROM0:0DE4 F0 C0 ld a,(FF00+C0) ;\ ROM0:0DE6 3C inc a ;} Samus' Y position low += 1 ROM0:0DE7 E0 C0 ld (FF00+C0),a ;/ ROM0:0DE9 C9 ret ; BRANCH_SWALLOWED ROM0:0DEA 3E 1B ld a,1B ;\ ROM0:0DEC EA 20 D0 ld (D020),a ;} Samus' pose = in Metroid Queen's stomach ROM0:0DEF C9 ret } ;;; $0DF0: Samus' pose handler - in Metroid Queen's mouth ;;; { ROM0:0DF0 3E 6C ld a,6C ;\ ROM0:0DF2 E0 C0 ld (FF00+C0),a ;} Samus' Y position low = 6Ch ROM0:0DF4 3E A6 ld a,A6 ;\ ROM0:0DF6 E0 C2 ld (FF00+C2),a ;} Samus' X position low = A6h ROM0:0DF8 CD 29 2F call 2F29 ; Deal 2 damage every 16 frames ROM0:0DFB FA 90 D0 ld a,(D090) ;\ ROM0:0DFE FE 05 cp 05 ;} If Samus escaping Metroid Queen's mouth: ROM0:0E00 20 10 jr nz,0E12 ;/ ROM0:0E02 3E 01 ld a,01 ;\ ROM0:0E04 EA 0F D0 ld (D00F),a ;} $D00F = 1 ROM0:0E07 3E 50 ld a,50 ;\ ROM0:0E09 EA 26 D0 ld (D026),a ;} $D026 = 50h ROM0:0E0C 3E 1D ld a,1D ;\ ROM0:0E0E EA 20 D0 ld (D020),a ;} Samus' pose = escaped Metroid Queen ROM0:0E11 C9 ret ROM0:0E12 FE 20 cp 20 ;\ ROM0:0E14 20 10 jr nz,0E26 ;} If [$D090] = 20h: ROM0:0E16 3E 40 ld a,40 ;\ ROM0:0E18 EA 26 D0 ld (D026),a ;} $D026 = 40h ROM0:0E1B 3E 01 ld a,01 ;\ ROM0:0E1D EA 0F D0 ld (D00F),a ;} $D00F = 1 ROM0:0E20 3E 1D ld a,1D ;\ ROM0:0E22 EA 20 D0 ld (D020),a ;} Samus' pose = escaped Metroid Queen ROM0:0E25 C9 ret ROM0:0E26 F0 81 ld a,(FF00+81) ;\ ROM0:0E28 CB 6F bit 5,a ;} If not newly pressing left: return ROM0:0E2A C8 ret z ;/ ROM0:0E2B 3E 1A ld a,1A ;\ ROM0:0E2D EA 20 D0 ld (D020),a ;} Samus' pose = being swallowed by Metroid Queen ROM0:0E30 3E 06 ld a,06 ;\ ROM0:0E32 EA 90 D0 ld (D090),a ;} Metroid Queen eating pose = swallowing Samus ROM0:0E35 C9 ret } ;;; $0E36: Samus' pose handler - being eaten by Metroid Queen ;;; { ROM0:0E36 CD 29 2F call 2F29 ; Deal 2 damage every 16 frames ROM0:0E39 FA 90 D0 ld a,(D090) ;\ ROM0:0E3C FE 03 cp 03 ;} If Metroid Queen's mouth is closing: ROM0:0E3E 20 06 jr nz,0E46 ;/ ROM0:0E40 3E 19 ld a,19 ;\ ROM0:0E42 EA 20 D0 ld (D020),a ;} Samus' pose = in Metroid Queen's mouth ROM0:0E45 C9 ret ROM0:0E46 0E 00 ld c,00 ; c = 0 ROM0:0E48 FA A9 C3 ld a,(C3A9) ;\ ROM0:0E4B C6 13 add a,13 ;| ROM0:0E4D 47 ld b,a ;| ROM0:0E4E FA 3B D0 ld a,(D03B) ;} If [Samus' Y position on screen] = [Metroid Queen's head Y position on screen] + 13h: ROM0:0E51 B8 cp b ;| ROM0:0E52 20 04 jr nz,0E58 ;/ ROM0:0E54 0E 01 ld c,01 ; c = 1 ROM0:0E56 18 1A jr 0E72 ROM0:0E58 38 0D jr c,0E67 ; Else if [Samus' Y position on screen] >= [Metroid Queen's head Y position on screen] + 13h: ROM0:0E5A F0 C0 ld a,(FF00+C0) ;\ ROM0:0E5C D6 01 sub 01 ;} Samus' Y position low -= 1 ROM0:0E5E E0 C0 ld (FF00+C0),a ;/ ROM0:0E60 3E 01 ld a,01 ;\ ROM0:0E62 EA 37 D0 ld (D037),a ;} Screen up velocity = 1 ROM0:0E65 18 0B jr 0E72 ROM0:0E67 F0 C0 ld a,(FF00+C0) ;\ Else ([Samus' Y position on screen] < [Metroid Queen's head Y position on screen] + 13h): ROM0:0E69 C6 01 add a,01 ;} Samus' Y position low += 1 ROM0:0E6B E0 C0 ld (FF00+C0),a ;/ ROM0:0E6D 3E 01 ld a,01 ;\ ROM0:0E6F EA 38 D0 ld (D038),a ;} Screen down velocity = 1 ROM0:0E72 FA A8 C3 ld a,(C3A8) ;\ ROM0:0E75 C6 1A add a,1A ;| ROM0:0E77 47 ld b,a ;| ROM0:0E78 FA 3C D0 ld a,(D03C) ;} If [Samus' X position on screen] = [Metroid Queen's head X position on screen] + 1Ah: ROM0:0E7B B8 cp b ;| ROM0:0E7C 20 03 jr nz,0E81 ;/ ROM0:0E7E 0C inc c ; ++c ROM0:0E7F 28 1A jr z,0E9B ROM0:0E81 38 0D jr c,0E90 ; Else if [Samus' X position on screen] >= [Metroid Queen's head X position on screen] + 1Ah: ROM0:0E83 F0 C2 ld a,(FF00+C2) ;\ ROM0:0E85 D6 02 sub 02 ;} Samus' X position low -= 2 ROM0:0E87 E0 C2 ld (FF00+C2),a ;/ ROM0:0E89 3E 01 ld a,01 ;\ ROM0:0E8B EA 36 D0 ld (D036),a ;} Screen left velocity = 1 ROM0:0E8E 18 0B jr 0E9B ROM0:0E90 F0 C2 ld a,(FF00+C2) ;\ Else ([Samus' X position on screen] < [Metroid Queen's head X position on screen] + 1Ah): ROM0:0E92 C6 01 add a,01 ;} Samus' X position low += 1 ROM0:0E94 E0 C2 ld (FF00+C2),a ;/ ROM0:0E96 3E 01 ld a,01 ;\ ROM0:0E98 EA 35 D0 ld (D035),a ;} Screen right velocity = 1 ROM0:0E9B 79 ld a,c ;\ ROM0:0E9C FE 02 cp 02 ;} If [c] != 2: return ROM0:0E9E C0 ret nz ;/ ROM0:0E9F 3E 02 ld a,02 ;\ ROM0:0EA1 EA 90 D0 ld (D090),a ;} Metroid Queen eating pose = mouth closing ROM0:0EA4 C9 ret } ;;; $0EA5: Samus' pose handler - facing screen (unit) ;;; { ; Called by $0D21 ROM0:0EA5 FA 66 D0 ld a,(D066) ;\ ROM0:0EA8 A7 and a ;| ROM0:0EA9 C0 ret nz ;| ROM0:0EAA FA 67 D0 ld a,(D067) ;} If [loading timer] != 0: return ROM0:0EAD A7 and a ;| ROM0:0EAE C0 ret nz ;/ ROM0:0EAF FA DD CE ld a,(CEDD) ;\ ROM0:0EB2 47 ld b,a ;| ROM0:0EB3 FA 92 D0 ld a,(D092) ;} If [room song] != [$CEDD]: ROM0:0EB6 B8 cp b ;| ROM0:0EB7 28 03 jr z,0EBC ;/ ROM0:0EB9 EA DC CE ld (CEDC),a ; Play [room song] ROM0:0EBC FA 79 D0 ld a,(D079) ;\ ROM0:0EBF A7 and a ;} If [$D079] = 0: ROM0:0EC0 20 04 jr nz,0EC6 ;/ ROM0:0EC2 F0 80 ld a,(FF00+80) ;\ ROM0:0EC4 A7 and a ;} If no buttons pressed: return ROM0:0EC5 C8 ret z ;/ ROM0:0EC6 AF xor a ;\ ROM0:0EC7 EA 20 D0 ld (D020),a ;} Samus' pose = standing ROM0:0ECA C9 ret } ;;; $0ECB: Samus' pose handler - morphball bombed / escaped Metroid Queen ;;; { ROM0:0ECB F0 81 ld a,(FF00+81) ;\ ROM0:0ECD CB 7F bit 7,a ;} If newly pressing down: ROM0:0ECF 28 16 jr z,0EE7 ;/ ROM0:0ED1 FA 45 D0 ld a,(D045) ;\ ROM0:0ED4 CB 6F bit 5,a ;} If spider ball equipped: ROM0:0ED6 28 0F jr z,0EE7 ;/ ROM0:0ED8 3E 0C ld a,0C ;\ ROM0:0EDA EA 20 D0 ld (D020),a ;} Samus' pose = spider ball falling ROM0:0EDD AF xor a ;\ ROM0:0EDE EA 44 D0 ld (D044),a ;} $D044 = 0 ROM0:0EE1 3E 0D ld a,0D ;\ ROM0:0EE3 EA C0 CE ld (CEC0),a ;} Play spider ball sound effect ROM0:0EE6 C9 ret ROM0:0EE7 F0 81 ld a,(FF00+81) ;\ ROM0:0EE9 CB 77 bit 6,a ;} If not newly pressing up: go to standing bombed ROM0:0EEB 28 7F jr z,0F6C ;/ ROM0:0EED CD B3 1B call 1BB3 ; Execute subroutine $1BB3 ROM0:0EF0 3E 10 ld a,10 ;\ ROM0:0EF2 EA 49 D0 ld (D049),a ;} $D049 = 10h ROM0:0EF5 18 75 jr 0F6C ; Go to standing bombed } ;;; $0EF7: Samus' pose handler - knockback ;;; { ROM0:0EF7 F0 81 ld a,(FF00+81) ROM0:0EF9 CB 47 bit 0,a ROM0:0EFB 28 6F jr z,0F6C ROM0:0EFD CD 88 1E call 1E88 ROM0:0F00 D8 ret c ROM0:0F01 AF xor a ROM0:0F02 EA 4F D0 ld (D04F),a ROM0:0F05 3E 21 ld a,21 ROM0:0F07 EA 26 D0 ld (D026),a ROM0:0F0A 3E 02 ld a,02 ;\ ROM0:0F0C EA C0 CE ld (CEC0),a ;} Play hi-jumping sound effect ROM0:0F0F FA 45 D0 ld a,(D045) ROM0:0F12 CB 4F bit 1,a ROM0:0F14 20 0A jr nz,0F20 ROM0:0F16 3E 31 ld a,31 ROM0:0F18 EA 26 D0 ld (D026),a ROM0:0F1B 3E 01 ld a,01 ;\ ROM0:0F1D EA C0 CE ld (CEC0),a ;} Play jumping sound effect ROM0:0F20 FA 48 D0 ld a,(D048) ROM0:0F23 A7 and a ROM0:0F24 28 08 jr z,0F2E ROM0:0F26 FA 26 D0 ld a,(D026) ROM0:0F29 C6 10 add a,10 ROM0:0F2B EA 26 D0 ld (D026),a ROM0:0F2E 3E 09 ld a,09 ROM0:0F30 EA 20 D0 ld (D020),a ROM0:0F33 AF xor a ROM0:0F34 EA 10 D0 ld (D010),a ROM0:0F37 C9 ret } ;;; $0F38: Samus' pose handler - morphball knockback ;;; { ROM0:0F38 F0 81 ld a,(FF00+81) ROM0:0F3A CB 77 bit 6,a ROM0:0F3C CA 47 0F jp z,0F47 ROM0:0F3F CD B3 1B call 1BB3 ROM0:0F42 3E 10 ld a,10 ROM0:0F44 EA 49 D0 ld (D049),a ROM0:0F47 FA 45 D0 ld a,(D045) ROM0:0F4A CB 67 bit 4,a ROM0:0F4C 28 1E jr z,0F6C ROM0:0F4E F0 81 ld a,(FF00+81) ROM0:0F50 CB 47 bit 0,a ROM0:0F52 28 18 jr z,0F6C ROM0:0F54 AF xor a ROM0:0F55 EA 4F D0 ld (D04F),a ROM0:0F58 3E 2E ld a,2E ROM0:0F5A EA 26 D0 ld (D026),a ROM0:0F5D 3E 06 ld a,06 ROM0:0F5F EA 20 D0 ld (D020),a ROM0:0F62 AF xor a ROM0:0F63 EA 10 D0 ld (D010),a ROM0:0F66 3E 01 ld a,01 ;\ ROM0:0F68 EA C0 CE ld (CEC0),a ;} Play jumping sound effect ROM0:0F6B C9 ret } ;;; $0F6C: Samus' pose handler - standing bombed ;;; { ROM0:0F6C FA 26 D0 ld a,(D026) ROM0:0F6F D6 40 sub 40 ROM0:0F71 5F ld e,a ROM0:0F72 16 00 ld d,00 ROM0:0F74 21 F6 0F ld hl,0FF6 ROM0:0F77 19 add hl,de ROM0:0F78 7E ld a,(hl) ROM0:0F79 FE 80 cp 80 ROM0:0F7B 20 02 jr nz,0F7F ROM0:0F7D 18 41 jr 0FC0 ROM0:0F7F CD 4E 1D call 1D4E ROM0:0F82 30 07 jr nc,0F8B ROM0:0F84 FA 26 D0 ld a,(D026) ROM0:0F87 FE 57 cp 57 ROM0:0F89 30 35 jr nc,0FC0 ROM0:0F8B FA 26 D0 ld a,(D026) ROM0:0F8E 3C inc a ROM0:0F8F EA 26 D0 ld (D026),a ROM0:0F92 FE 56 cp 56 ROM0:0F94 38 16 jr c,0FAC ROM0:0F96 F0 80 ld a,(FF00+80) ROM0:0F98 CB 67 bit 4,a ROM0:0F9A 28 05 jr z,0FA1 ROM0:0F9C 3E 01 ld a,01 ROM0:0F9E EA 0F D0 ld (D00F),a ROM0:0FA1 F0 80 ld a,(FF00+80) ROM0:0FA3 CB 6F bit 5,a ROM0:0FA5 28 05 jr z,0FAC ROM0:0FA7 3E FF ld a,FF ROM0:0FA9 EA 0F D0 ld (D00F),a ROM0:0FAC FA 0F D0 ld a,(D00F) ROM0:0FAF FE 01 cp 01 ROM0:0FB1 20 03 jr nz,0FB6 ROM0:0FB3 CD FA 1C call 1CFA ROM0:0FB6 FA 0F D0 ld a,(D00F) ROM0:0FB9 FE FF cp FF ROM0:0FBB C0 ret nz ROM0:0FBC CD 26 1D call 1D26 ROM0:0FBF C9 ret ROM0:0FC0 AF xor a ROM0:0FC1 EA 26 D0 ld (D026),a ROM0:0FC4 3E 16 ld a,16 ROM0:0FC6 EA 24 D0 ld (D024),a ROM0:0FC9 FA 20 D0 ld a,(D020) ROM0:0FCC 5F ld e,a ROM0:0FCD 16 00 ld d,00 ROM0:0FCF 21 D8 0F ld hl,0FD8 ROM0:0FD2 19 add hl,de ROM0:0FD3 7E ld a,(hl) ROM0:0FD4 EA 20 D0 ld (D020),a ROM0:0FD7 C9 ret ROM0:0FD8 db 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 07, 08, 07, 08, 00, 00, 00, 00, 00, 18, 19, 1A, 1B, 1C, 08 ROM0:0FF6 db FD, FD, FD, FD, FE, FD, FE, FD, FE, FE, FE, FE, FE, FE, FF, FE, FE, FF, FE, FF, FE, FF, FF, 00, 00, 00, 00, 01, 01, 02, 01, 02, 01, 02, 02, 01, 02, 02, 02, 02, 02, 02, 03, 02, 03, 02, 03, 03, 03, 03, 80 } ;;; $1029: Samus' pose handler - spider ball ;;; { ROM0:1029 F0 81 ld a,(FF00+81) ROM0:102B CB 47 bit 0,a ROM0:102D 28 0B jr z,103A ROM0:102F 3E 05 ld a,05 ROM0:1031 EA 20 D0 ld (D020),a ROM0:1034 3E 06 ld a,06 ;\ ROM0:1036 EA C0 CE ld (CEC0),a ;} Play morphing sound effect ROM0:1039 C9 ret ROM0:103A CD 42 1A call 1A42 ROM0:103D FA 3D D0 ld a,(D03D) ROM0:1040 A7 and a ROM0:1041 20 0A jr nz,104D ROM0:1043 3E 0C ld a,0C ROM0:1045 EA 20 D0 ld (D020),a ROM0:1048 3E 01 ld a,01 ROM0:104A EA 24 D0 ld (D024),a ROM0:104D F0 81 ld a,(FF00+81) ROM0:104F E6 F0 and F0 ROM0:1051 C8 ret z ROM0:1052 CD 42 1A call 1A42 ROM0:1055 F0 81 ld a,(FF00+81) ROM0:1057 E6 F0 and F0 ROM0:1059 CB 37 swap a ROM0:105B 28 20 jr z,107D ROM0:105D 47 ld b,a ROM0:105E FA 3D D0 ld a,(D03D) ROM0:1061 CB 37 swap a ROM0:1063 80 add a,b ROM0:1064 5F ld e,a ROM0:1065 16 00 ld d,00 ROM0:1067 3E 06 ld a,06 ROM0:1069 EA 4E D0 ld (D04E),a ROM0:106C EA 00 21 ld (2100),a ROM0:106F 21 03 7E ld hl,7E03 ROM0:1072 19 add hl,de ROM0:1073 7E ld a,(hl) ROM0:1074 EA 44 D0 ld (D044),a ROM0:1077 3E 0B ld a,0B ROM0:1079 EA 20 D0 ld (D020),a ROM0:107C C9 ret ROM0:107D 3E 0C ld a,0C ROM0:107F EA 20 D0 ld (D020),a ROM0:1082 C9 ret } ;;; $1083: Samus' pose handler - spider ball rolling ;;; { ROM0:1083 F0 81 ld a,(FF00+81) ROM0:1085 CB 47 bit 0,a ROM0:1087 28 0B jr z,1094 ROM0:1089 3E 05 ld a,05 ROM0:108B EA 20 D0 ld (D020),a ROM0:108E 3E 06 ld a,06 ;\ ROM0:1090 EA C0 CE ld (CEC0),a ;} Play morphing sound effect ROM0:1093 C9 ret ROM0:1094 F0 80 ld a,(FF00+80) ROM0:1096 E6 F0 and F0 ROM0:1098 20 0A jr nz,10A4 ROM0:109A 3E 0E ld a,0E ROM0:109C EA 20 D0 ld (D020),a ROM0:109F AF xor a ROM0:10A0 EA 44 D0 ld (D044),a ROM0:10A3 C9 ret ROM0:10A4 CD 42 1A call 1A42 ROM0:10A7 FA 3D D0 ld a,(D03D) ROM0:10AA A7 and a ROM0:10AB 28 D0 jr z,107D ROM0:10AD 5F ld e,a ROM0:10AE 16 00 ld d,00 ROM0:10B0 FA 44 D0 ld a,(D044) ROM0:10B3 CB 47 bit 0,a ROM0:10B5 28 05 jr z,10BC ROM0:10B7 21 A9 20 ld hl,20A9 ROM0:10BA 18 06 jr 10C2 ROM0:10BC CB 4F bit 1,a ROM0:10BE C8 ret z ROM0:10BF 21 C9 20 ld hl,20C9 ROM0:10C2 19 add hl,de ROM0:10C3 7E ld a,(hl) ROM0:10C4 EA 42 D0 ld (D042),a ROM0:10C7 AF xor a ROM0:10C8 EA 43 D0 ld (D043),a ROM0:10CB FA 42 D0 ld a,(D042) ROM0:10CE CB 47 bit 0,a ROM0:10D0 C4 32 11 call nz,1132 ROM0:10D3 FA 42 D0 ld a,(D042) ROM0:10D6 CB 4F bit 1,a ROM0:10D8 C4 3C 11 call nz,113C ROM0:10DB FA 42 D0 ld a,(D042) ROM0:10DE CB 57 bit 2,a ROM0:10E0 C4 46 11 call nz,1146 ROM0:10E3 FA 42 D0 ld a,(D042) ROM0:10E6 CB 5F bit 3,a ROM0:10E8 C4 52 11 call nz,1152 ROM0:10EB FA 43 D0 ld a,(D043) ROM0:10EE A7 and a ROM0:10EF C0 ret nz ROM0:10F0 FA 3D D0 ld a,(D03D) ROM0:10F3 5F ld e,a ROM0:10F4 16 00 ld d,00 ROM0:10F6 FA 44 D0 ld a,(D044) ROM0:10F9 CB 47 bit 0,a ROM0:10FB 28 05 jr z,1102 ROM0:10FD 21 B9 20 ld hl,20B9 ROM0:1100 18 06 jr 1108 ROM0:1102 CB 4F bit 1,a ROM0:1104 C8 ret z ROM0:1105 21 D9 20 ld hl,20D9 ROM0:1108 19 add hl,de ROM0:1109 7E ld a,(hl) ROM0:110A EA 42 D0 ld (D042),a ROM0:110D AF xor a ROM0:110E EA 43 D0 ld (D043),a ROM0:1111 FA 42 D0 ld a,(D042) ROM0:1114 CB 47 bit 0,a ROM0:1116 C4 32 11 call nz,1132 ROM0:1119 FA 42 D0 ld a,(D042) ROM0:111C CB 4F bit 1,a ROM0:111E C4 3C 11 call nz,113C ROM0:1121 FA 42 D0 ld a,(D042) ROM0:1124 CB 57 bit 2,a ROM0:1126 C4 46 11 call nz,1146 ROM0:1129 FA 42 D0 ld a,(D042) ROM0:112C CB 5F bit 3,a ROM0:112E C4 52 11 call nz,1152 ROM0:1131 C9 ret } ;;; $1132: ;;; { ; Called by spider ball rolling, spider ball jumping and spider ball falling ROM0:1132 CD 94 1C call 1C94 ROM0:1135 FA 35 D0 ld a,(D035) ROM0:1138 EA 43 D0 ld (D043),a ROM0:113B C9 ret } ;;; $113C: ;;; { ; Called by spider ball rolling and spider ball falling ROM0:113C CD C5 1C call 1CC5 ROM0:113F FA 36 D0 ld a,(D036) ROM0:1142 EA 43 D0 ld (D043),a ROM0:1145 C9 ret } ;;; $1146: ;;; { ; Called by spider ball rolling ROM0:1146 3E 01 ld a,01 ROM0:1148 CD 98 1D call 1D98 ROM0:114B FA 37 D0 ld a,(D037) ROM0:114E EA 43 D0 ld (D043),a ROM0:1151 C9 ret } ;;; $1152: ;;; { ; Called by spider ball rolling ROM0:1152 3E 01 ld a,01 ROM0:1154 CD 4E 1D call 1D4E ROM0:1157 FA 38 D0 ld a,(D038) ROM0:115A EA 43 D0 ld (D043),a ROM0:115D D0 ret nc ROM0:115E FA 3A C4 ld a,(C43A) ROM0:1161 A7 and a ROM0:1162 C0 ret nz ROM0:1163 F0 C0 ld a,(FF00+C0) ROM0:1165 E6 F8 and F8 ROM0:1167 F6 04 or 04 ROM0:1169 E0 C0 ld (FF00+C0),a ROM0:116B AF xor a ROM0:116C EA 43 D0 ld (D043),a ROM0:116F C9 ret } ;;; $1170: Samus' pose handler - spider ball jumping ;;; { ROM0:1170 F0 81 ld a,(FF00+81) ROM0:1172 CB 47 bit 0,a ROM0:1174 28 0B jr z,1181 ROM0:1176 3E 06 ld a,06 ROM0:1178 EA 20 D0 ld (D020),a ROM0:117B 3E 06 ld a,06 ;\ ROM0:117D EA C0 CE ld (CEC0),a ;} Play morphing sound effect ROM0:1180 C9 ret ROM0:1181 FA 26 D0 ld a,(D026) ROM0:1184 FE 40 cp 40 ROM0:1186 30 0F jr nc,1197 ROM0:1188 F0 80 ld a,(FF00+80) ROM0:118A CB 47 bit 0,a ROM0:118C 28 04 jr z,1192 ROM0:118E 3E FE ld a,FE ROM0:1190 18 13 jr 11A5 ROM0:1192 3E 56 ld a,56 ROM0:1194 EA 26 D0 ld (D026),a ROM0:1197 D6 40 sub 40 ROM0:1199 21 4A 18 ld hl,184A ROM0:119C 5F ld e,a ROM0:119D 16 00 ld d,00 ROM0:119F 19 add hl,de ROM0:11A0 7E ld a,(hl) ROM0:11A1 FE 80 cp 80 ROM0:11A3 28 2C jr z,11D1 ROM0:11A5 CD 4E 1D call 1D4E ROM0:11A8 DA 33 12 jp c,1233 ROM0:11AB CD 42 1A call 1A42 ROM0:11AE FA 3D D0 ld a,(D03D) ROM0:11B1 A7 and a ROM0:11B2 C2 41 12 jp nz,1241 ROM0:11B5 FA 26 D0 ld a,(D026) ROM0:11B8 3C inc a ROM0:11B9 EA 26 D0 ld (D026),a ROM0:11BC F0 80 ld a,(FF00+80) ROM0:11BE CB 67 bit 4,a ROM0:11C0 28 04 jr z,11C6 ROM0:11C2 CD 32 11 call 1132 ROM0:11C5 C9 ret ROM0:11C6 F0 80 ld a,(FF00+80) ROM0:11C8 CB 6F bit 5,a ROM0:11CA 28 04 jr z,11D0 ROM0:11CC CD C9 1C call 1CC9 ROM0:11CF C9 ret ROM0:11D0 C9 ret ROM0:11D1 AF xor a ROM0:11D2 EA 4A 18 ld (184A),a ;RAM enable ROM0:11D5 3E 16 ld a,16 ROM0:11D7 EA 24 D0 ld (D024),a ROM0:11DA 3E 0C ld a,0C ROM0:11DC EA 20 D0 ld (D020),a ROM0:11DF AF xor a ROM0:11E0 EA 44 D0 ld (D044),a ROM0:11E3 C9 ret } ;;; $11E4: Samus' pose handler - spider ball falling ;;; { ROM0:11E4 F0 81 ld a,(FF00+81) ROM0:11E6 CB 47 bit 0,a ROM0:11E8 28 0B jr z,11F5 ROM0:11EA 3E 08 ld a,08 ROM0:11EC EA 20 D0 ld (D020),a ROM0:11EF 3E 06 ld a,06 ;\ ROM0:11F1 EA C0 CE ld (CEC0),a ;} Play morphing sound effect ROM0:11F4 C9 ret ROM0:11F5 F0 80 ld a,(FF00+80) ROM0:11F7 CB 67 bit 4,a ROM0:11F9 28 05 jr z,1200 ROM0:11FB CD 32 11 call 1132 ROM0:11FE 18 09 jr 1209 ROM0:1200 F0 80 ld a,(FF00+80) ROM0:1202 CB 6F bit 5,a ROM0:1204 28 03 jr z,1209 ROM0:1206 CD 3C 11 call 113C ROM0:1209 21 86 13 ld hl,1386 ROM0:120C FA 24 D0 ld a,(D024) ROM0:120F 5F ld e,a ROM0:1210 16 00 ld d,00 ROM0:1212 19 add hl,de ROM0:1213 7E ld a,(hl) ROM0:1214 CD 4E 1D call 1D4E ROM0:1217 38 1A jr c,1233 ROM0:1219 CD 42 1A call 1A42 ROM0:121C FA 3D D0 ld a,(D03D) ROM0:121F A7 and a ROM0:1220 20 1F jr nz,1241 ROM0:1222 FA 24 D0 ld a,(D024) ROM0:1225 3C inc a ROM0:1226 EA 24 D0 ld (D024),a ROM0:1229 FE 17 cp 17 ROM0:122B 38 05 jr c,1232 ROM0:122D 3E 16 ld a,16 ROM0:122F EA 24 D0 ld (D024),a ROM0:1232 C9 ret ROM0:1233 FA 3A C4 ld a,(C43A) ROM0:1236 A7 and a ROM0:1237 20 08 jr nz,1241 ROM0:1239 F0 C0 ld a,(FF00+C0) ROM0:123B E6 F8 and F8 ROM0:123D F6 04 or 04 ROM0:123F E0 C0 ld (FF00+C0),a ROM0:1241 3E 0B ld a,0B ROM0:1243 EA 20 D0 ld (D020),a ROM0:1246 AF xor a ROM0:1247 EA 24 D0 ld (D024),a ROM0:124A C9 ret } ;;; $124B: Samus' pose handler - morphball falling ;;; { ROM0:124B F0 81 ld a,(FF00+81) ROM0:124D CB 7F bit 7,a ROM0:124F 28 16 jr z,1267 ROM0:1251 FA 45 D0 ld a,(D045) ROM0:1254 CB 6F bit 5,a ROM0:1256 28 0F jr z,1267 ROM0:1258 3E 0C ld a,0C ROM0:125A EA 20 D0 ld (D020),a ROM0:125D AF xor a ROM0:125E EA 44 D0 ld (D044),a ROM0:1261 3E 0D ld a,0D ;\ ROM0:1263 EA C0 CE ld (CEC0),a ;} Play spider ball sound effect ROM0:1266 C9 ret ROM0:1267 F0 81 ld a,(FF00+81) ROM0:1269 CB 47 bit 0,a ROM0:126B 28 18 jr z,1285 ROM0:126D FA 62 D0 ld a,(D062) ROM0:1270 A7 and a ROM0:1271 28 12 jr z,1285 ROM0:1273 EA 26 D0 ld (D026),a ROM0:1276 3E 06 ld a,06 ROM0:1278 EA 20 D0 ld (D020),a ROM0:127B AF xor a ROM0:127C EA 10 D0 ld (D010),a ROM0:127F 3E 01 ld a,01 ;\ ROM0:1281 EA C0 CE ld (CEC0),a ;} Play jumping sound effect ROM0:1284 C9 ret ROM0:1285 F0 81 ld a,(FF00+81) ROM0:1287 CB 77 bit 6,a ROM0:1289 28 0A jr z,1295 ROM0:128B CD B3 1B call 1BB3 ROM0:128E 3E 10 ld a,10 ROM0:1290 EA 49 D0 ld (D049),a ROM0:1293 18 48 jr 12DD ROM0:1295 F0 80 ld a,(FF00+80) ROM0:1297 CB 67 bit 4,a ROM0:1299 28 0F jr z,12AA ROM0:129B CD F5 1C call 1CF5 ROM0:129E FA 45 D0 ld a,(D045) ROM0:12A1 CB 6F bit 5,a ROM0:12A3 28 05 jr z,12AA ROM0:12A5 FA 35 D0 ld a,(D035) ROM0:12A8 18 13 jr 12BD ROM0:12AA F0 80 ld a,(FF00+80) ROM0:12AC CB 6F bit 5,a ROM0:12AE 28 0D jr z,12BD ROM0:12B0 CD 22 1D call 1D22 ROM0:12B3 FA 45 D0 ld a,(D045) ROM0:12B6 CB 6F bit 5,a ROM0:12B8 28 03 jr z,12BD ROM0:12BA FA 36 D0 ld a,(D036) ROM0:12BD 21 86 13 ld hl,1386 ROM0:12C0 FA 24 D0 ld a,(D024) ROM0:12C3 5F ld e,a ROM0:12C4 16 00 ld d,00 ROM0:12C6 19 add hl,de ROM0:12C7 7E ld a,(hl) ROM0:12C8 CD 4E 1D call 1D4E ROM0:12CB 38 11 jr c,12DE ROM0:12CD FA 24 D0 ld a,(D024) ROM0:12D0 3C inc a ROM0:12D1 EA 24 D0 ld (D024),a ROM0:12D4 FE 17 cp 17 ROM0:12D6 38 05 jr c,12DD ROM0:12D8 3E 16 ld a,16 ROM0:12DA EA 24 D0 ld (D024),a ROM0:12DD C9 ret ROM0:12DE 3E 05 ld a,05 ROM0:12E0 EA 20 D0 ld (D020),a ROM0:12E3 AF xor a ROM0:12E4 EA 24 D0 ld (D024),a ROM0:12E7 FA 3A C4 ld a,(C43A) ROM0:12EA A7 and a ROM0:12EB C0 ret nz ROM0:12EC F0 C0 ld a,(FF00+C0) ROM0:12EE E6 F8 and F8 ROM0:12F0 F6 04 or 04 ROM0:12F2 E0 C0 ld (FF00+C0),a ROM0:12F4 C9 ret } ;;; $12F5: Samus' pose handler - falling ;;; { ROM0:12F5 F0 81 ld a,(FF00+81) ROM0:12F7 CB 47 bit 0,a ROM0:12F9 28 3A jr z,1335 ROM0:12FB FA 62 D0 ld a,(D062) ROM0:12FE A7 and a ROM0:12FF 28 05 jr z,1306 ROM0:1301 EA 26 D0 ld (D026),a ROM0:1304 18 0B jr 1311 ROM0:1306 FA 49 D0 ld a,(D049) ROM0:1309 A7 and a ROM0:130A 28 29 jr z,1335 ROM0:130C 3E 21 ld a,21 ROM0:130E EA 26 D0 ld (D026),a ROM0:1311 3E 02 ld a,02 ;\ ROM0:1313 EA C0 CE ld (CEC0),a ;} Play hi-jumping sound effect ROM0:1316 FA 45 D0 ld a,(D045) ROM0:1319 CB 4F bit 1,a ROM0:131B 20 0A jr nz,1327 ROM0:131D 3E 31 ld a,31 ROM0:131F EA 26 D0 ld (D026),a ROM0:1322 3E 01 ld a,01 ;\ ROM0:1324 EA C0 CE ld (CEC0),a ;} Play jumping sound effect ROM0:1327 3E 09 ld a,09 ROM0:1329 EA 20 D0 ld (D020),a ROM0:132C AF xor a ROM0:132D EA 10 D0 ld (D010),a ROM0:1330 AF xor a ROM0:1331 EA 49 D0 ld (D049),a ROM0:1334 C9 ret ROM0:1335 F0 80 ld a,(FF00+80) ROM0:1337 CB 67 bit 4,a ROM0:1339 28 05 jr z,1340 ROM0:133B CD F5 1C call 1CF5 ROM0:133E 18 09 jr 1349 ROM0:1340 F0 80 ld a,(FF00+80) ROM0:1342 CB 6F bit 5,a ROM0:1344 28 03 jr z,1349 ROM0:1346 CD 22 1D call 1D22 ROM0:1349 21 86 13 ld hl,1386 ROM0:134C FA 24 D0 ld a,(D024) ROM0:134F 5F ld e,a ROM0:1350 16 00 ld d,00 ROM0:1352 19 add hl,de ROM0:1353 7E ld a,(hl) ROM0:1354 CD 4E 1D call 1D4E ROM0:1357 38 11 jr c,136A ROM0:1359 FA 24 D0 ld a,(D024) ROM0:135C 3C inc a ROM0:135D EA 24 D0 ld (D024),a ROM0:1360 FE 17 cp 17 ROM0:1362 38 05 jr c,1369 ROM0:1364 3E 16 ld a,16 ROM0:1366 EA 24 D0 ld (D024),a ROM0:1369 C9 ret ROM0:136A CD 37 1B call 1B37 ROM0:136D 30 05 jr nc,1374 ROM0:136F 3E 04 ld a,04 ROM0:1371 EA 20 D0 ld (D020),a ROM0:1374 AF xor a ROM0:1375 EA 24 D0 ld (D024),a ROM0:1378 FA 3A C4 ld a,(C43A) ROM0:137B A7 and a ROM0:137C C0 ret nz ROM0:137D F0 C0 ld a,(FF00+C0) ROM0:137F E6 F8 and F8 ROM0:1381 F6 04 or 04 ROM0:1383 E0 C0 ld (FF00+C0),a ROM0:1385 C9 ret ROM0:1386 db 01, 01, 01, 01, 00, 01, 01, 00, 01, 01, 01, 01, 01, 01, 02, 01, 02, 02, 01, 02, 02, 02, 03 } ;;; $139D: Samus' pose handler - turning ;;; { ROM0:139D CD 0F 1F call 1F0F ; Execute subroutine $1F0F ROM0:13A0 F0 81 ld a,(FF00+81) ;\ ROM0:13A2 CB 47 bit 0,a ;} If not newly pressing A: ROM0:13A4 C2 AC 13 jp nz,13AC ;/ ROM0:13A7 21 2C D0 ld hl,D02C ;\ ROM0:13AA 35 dec (hl) ;} Decrement [Samus turning animation counter] ROM0:13AB C0 ret nz ; If [Samus turning animation counter] != 0: return ROM0:13AC FA 20 D0 ld a,(D020) ;\ ROM0:13AF CB BF res 7,a ;} $D020 &= ~80h ROM0:13B1 EA 20 D0 ld (D020),a ;/ ROM0:13B4 C3 21 0D jp 0D21 ; Go to $0D21 } ;;; $13B7: Samus' pose handler - standing ;;; { ; The logic here dictates that jump+left/right on the same frame only does a spin-jump when space jump is equipped ROM0:13B7 CD 0F 1F call 1F0F ; Execute subroutine $1F0F ROM0:13BA 38 0B jr c,13C7 ; If carry clear: ROM0:13BC 3E 07 ld a,07 ;\ ROM0:13BE EA 20 D0 ld (D020),a ;} Samus' pose = falling ROM0:13C1 3E 01 ld a,01 ;\ ROM0:13C3 EA 24 D0 ld (D024),a ;} $D024 = 1 ROM0:13C6 C9 ret ROM0:13C7 AF xor a ;\ ROM0:13C8 EA 22 D0 ld (D022),a ;} $D022 = 0 ROM0:13CB F0 81 ld a,(FF00+81) ;\ ROM0:13CD CB 47 bit 0,a ;} If not newly pressed A: go to BRANCH_SPIN_JUMPING_END ROM0:13CF 28 50 jr z,1421 ;/ ROM0:13D1 F0 80 ld a,(FF00+80) ;\ ROM0:13D3 E6 30 and 30 ;} If not pressing left nor right: go to BRANCH_SPIN_JUMPING_END ROM0:13D5 28 4A jr z,1421 ;/ ROM0:13D7 FA 45 D0 ld a,(D045) ;\ ROM0:13DA CB 5F bit 3,a ;} If space jump not equipped: go to BRANCH_JUMP ROM0:13DC CA 9E 14 jp z,149E ;/ ROM0:13DF CD 88 1E call 1E88 ; Execute subroutine $1E88 ROM0:13E2 D8 ret c ; If returned carry: return ROM0:13E3 3E 21 ld a,21 ;\ ROM0:13E5 EA 26 D0 ld (D026),a ;} $D026 = 21h ROM0:13E8 3E 02 ld a,02 ;\ ROM0:13EA EA C0 CE ld (CEC0),a ;} Play hi-jumping sound effect ROM0:13ED FA 45 D0 ld a,(D045) ;\ ROM0:13F0 CB 4F bit 1,a ;} If hi-jump not equipped: ROM0:13F2 20 0A jr nz,13FE ;/ ROM0:13F4 3E 31 ld a,31 ;\ ROM0:13F6 EA 26 D0 ld (D026),a ;} $D026 = 31h ROM0:13F9 3E 01 ld a,01 ;\ ROM0:13FB EA C0 CE ld (CEC0),a ;} Play jumping sound effect ROM0:13FE FA 48 D0 ld a,(D048) ;\ ROM0:1401 A7 and a ;} If [$D048] != 0: ROM0:1402 28 08 jr z,140C ;/ ROM0:1404 FA 26 D0 ld a,(D026) ;\ ROM0:1407 C6 10 add a,10 ;} $D026 += 10h ROM0:1409 EA 26 D0 ld (D026),a ;/ ROM0:140C 3E 0A ld a,0A ;\ ROM0:140E EA 20 D0 ld (D020),a ;} Samus' pose = starting to spin-jump ROM0:1411 AF xor a ;\ ROM0:1412 EA 10 D0 ld (D010),a ;} $D010 = 0 ROM0:1415 FA 45 D0 ld a,(D045) ;\ ROM0:1418 CB 57 bit 2,a ;} If screw attack not equipped: return ROM0:141A C8 ret z ;/ ROM0:141B 3E 03 ld a,03 ;\ ROM0:141D EA C0 CE ld (CEC0),a ;} Play screw attacking sound effect ROM0:1420 C9 ret ; BRANCH_SPIN_JUMPING_END ROM0:1421 F0 80 ld a,(FF00+80) ;\ ROM0:1423 CB 67 bit 4,a ;} If not pressing right: go to BRANCH_RUNNING_RIGHT_END ROM0:1425 28 2B jr z,1452 ;/ ROM0:1427 FA 2B D0 ld a,(D02B) ;\ ROM0:142A FE 01 cp 01 ;} If Samus is facing right: ROM0:142C 28 15 jr z,1443 ;/ ROM0:142E 3E 83 ld a,83 ;\ ROM0:1430 EA 20 D0 ld (D020),a ;} Samus' pose = turning ROM0:1433 3E 01 ld a,01 ;\ ROM0:1435 EA 2B D0 ld (D02B),a ;} Set Samus facing right ROM0:1438 3E 02 ld a,02 ;\ ROM0:143A EA 2C D0 ld (D02C),a ;} Samus animation counter = 2 ROM0:143D 3E 04 ld a,04 ;\ ROM0:143F EA C0 CE ld (CEC0),a ;} Play turning around sound effect ROM0:1442 C9 ret ROM0:1443 CD 0D 1C call 1C0D ; Execute subroutine $1C0D ROM0:1446 D8 ret c ; If returned carry: return ROM0:1447 3E 01 ld a,01 ;\ ROM0:1449 EA 2B D0 ld (D02B),a ;} Set Samus facing right ROM0:144C 3E 03 ld a,03 ;\ ROM0:144E EA 20 D0 ld (D020),a ;} Samus' pose = running ROM0:1451 C9 ret ; BRANCH_RUNNING_RIGHT_END ROM0:1452 F0 80 ld a,(FF00+80) ;\ ROM0:1454 CB 6F bit 5,a ;} If not pressing left: go to BRANCH_RUNNING_LEFT_END ROM0:1456 28 2B jr z,1483 ;/ ROM0:1458 FA 2B D0 ld a,(D02B) ;\ ROM0:145B FE 00 cp 00 ;} If Samus is facing left: ROM0:145D 28 15 jr z,1474 ;/ ROM0:145F 3E 83 ld a,83 ;\ ROM0:1461 EA 20 D0 ld (D020),a ;} Samus' pose = turning ROM0:1464 3E 00 ld a,00 ;\ ROM0:1466 EA 2B D0 ld (D02B),a ;} Set Samus facing left ROM0:1469 3E 02 ld a,02 ;\ ROM0:146B EA 2C D0 ld (D02C),a ;} Samus animation counter = 2 ROM0:146E 3E 04 ld a,04 ;\ ROM0:1470 EA C0 CE ld (CEC0),a ;} Play turning around sound effect ROM0:1473 C9 ret ROM0:1474 CD 51 1C call 1C51 ; Execute subroutine $1C51 ROM0:1477 D8 ret c ; If returned carry: return ROM0:1478 3E 00 ld a,00 ;\ ROM0:147A EA 2B D0 ld (D02B),a ;} Set Samus facing left ROM0:147D 3E 03 ld a,03 ;\ ROM0:147F EA 20 D0 ld (D020),a ;} Samus' pose = running ROM0:1482 C9 ret ; BRANCH_RUNNING_LEFT_END ROM0:1483 F0 81 ld a,(FF00+81) ;\ ROM0:1485 CB 7F bit 7,a ;} If newly pressing down: ROM0:1487 28 0F jr z,1498 ;/ ROM0:1489 AF xor a ;\ ROM0:148A EA 22 D0 ld (D022),a ;} $D022 = 0 ROM0:148D 3E 04 ld a,04 ;\ ROM0:148F EA 20 D0 ld (D020),a ;} Samus' pose = crouching ROM0:1492 3E 05 ld a,05 ;\ ROM0:1494 EA C0 CE ld (CEC0),a ;} Play crouching sound effect ROM0:1497 C9 ret ROM0:1498 F0 81 ld a,(FF00+81) ;\ ROM0:149A CB 47 bit 0,a ;} If not newly pressing A: return ROM0:149C 28 37 jr z,14D5 ;/ ; BRANCH_JUMP ROM0:149E CD 88 1E call 1E88 ; Execute subroutine $1E88 ROM0:14A1 D8 ret c ; If returned carry: return ROM0:14A2 3E 21 ld a,21 ;\ ROM0:14A4 EA 26 D0 ld (D026),a ;} $D026 = 21h ROM0:14A7 3E 02 ld a,02 ;\ ROM0:14A9 EA C0 CE ld (CEC0),a ;} Play hi-jumping sound effect ROM0:14AC FA 45 D0 ld a,(D045) ;\ ROM0:14AF CB 4F bit 1,a ;} If hi-jump not equipped: ROM0:14B1 20 0A jr nz,14BD ;/ ROM0:14B3 3E 31 ld a,31 ;\ ROM0:14B5 EA 26 D0 ld (D026),a ;} $D026 = 31h ROM0:14B8 3E 01 ld a,01 ;\ ROM0:14BA EA C0 CE ld (CEC0),a ;} Play jumping sound effect ROM0:14BD FA 48 D0 ld a,(D048) ;\ ROM0:14C0 A7 and a ;} If [$D048] != 0: ROM0:14C1 28 08 jr z,14CB ;/ ROM0:14C3 FA 26 D0 ld a,(D026) ;\ ROM0:14C6 C6 10 add a,10 ;} $D026 += 10h ROM0:14C8 EA 26 D0 ld (D026),a ;/ ROM0:14CB 3E 09 ld a,09 ;\ ROM0:14CD EA 20 D0 ld (D020),a ;} Samus' pose = starting to jump ROM0:14D0 AF xor a ;\ ROM0:14D1 EA 10 D0 ld (D010),a ;} Counter for spin-jumping = 0 ROM0:14D4 C9 ret ROM0:14D5 C9 ret } ;;; $14D6: Samus' pose handler - running ;;; { ROM0:14D6 CD 0F 1F call 1F0F ROM0:14D9 38 0B jr c,14E6 ROM0:14DB 3E 07 ld a,07 ROM0:14DD EA 20 D0 ld (D020),a ROM0:14E0 3E 01 ld a,01 ROM0:14E2 EA 24 D0 ld (D024),a ROM0:14E5 C9 ret ROM0:14E6 21 22 D0 ld hl,D022 ROM0:14E9 34 inc (hl) ROM0:14EA 34 inc (hl) ROM0:14EB 34 inc (hl) ROM0:14EC F0 81 ld a,(FF00+81) ROM0:14EE CB 47 bit 0,a ROM0:14F0 28 49 jr z,153B ROM0:14F2 F0 80 ld a,(FF00+80) ROM0:14F4 E6 30 and 30 ROM0:14F6 28 43 jr z,153B ROM0:14F8 CD 88 1E call 1E88 ROM0:14FB D8 ret c ROM0:14FC 3E 21 ld a,21 ROM0:14FE EA 26 D0 ld (D026),a ROM0:1501 FA 45 D0 ld a,(D045) ;\ ROM0:1504 E6 02 and 02 ;| ROM0:1506 CB 3F srl a ;} Play appropriate jumping sound effect ROM0:1508 3C inc a ;| ROM0:1509 EA C0 CE ld (CEC0),a ;/ ROM0:150C FA 45 D0 ld a,(D045) ROM0:150F CB 4F bit 1,a ROM0:1511 20 05 jr nz,1518 ROM0:1513 3E 31 ld a,31 ROM0:1515 EA 26 D0 ld (D026),a ROM0:1518 FA 48 D0 ld a,(D048) ROM0:151B A7 and a ROM0:151C 28 08 jr z,1526 ROM0:151E FA 26 D0 ld a,(D026) ROM0:1521 C6 10 add a,10 ROM0:1523 EA 26 D0 ld (D026),a ROM0:1526 3E 0A ld a,0A ROM0:1528 EA 20 D0 ld (D020),a ROM0:152B AF xor a ROM0:152C EA 10 D0 ld (D010),a ROM0:152F FA 45 D0 ld a,(D045) ROM0:1532 CB 57 bit 2,a ROM0:1534 C8 ret z ROM0:1535 3E 03 ld a,03 ;\ ROM0:1537 EA C0 CE ld (CEC0),a ;} Play screw attacking sound effect ROM0:153A C9 ret ROM0:153B F0 80 ld a,(FF00+80) ROM0:153D CB 67 bit 4,a ROM0:153F 28 25 jr z,1566 ROM0:1541 FA 2B D0 ld a,(D02B) ROM0:1544 FE 01 cp 01 ROM0:1546 28 15 jr z,155D ROM0:1548 3E 83 ld a,83 ROM0:154A EA 20 D0 ld (D020),a ROM0:154D 3E 01 ld a,01 ROM0:154F EA 2B D0 ld (D02B),a ROM0:1552 3E 02 ld a,02 ROM0:1554 EA 2C D0 ld (D02C),a ROM0:1557 3E 04 ld a,04 ;\ ROM0:1559 EA C0 CE ld (CEC0),a ;} Play turning around sound effect ROM0:155C C9 ret ROM0:155D CD 0D 1C call 1C0D ROM0:1560 D0 ret nc ROM0:1561 AF xor a ROM0:1562 EA 20 D0 ld (D020),a ROM0:1565 C9 ret ROM0:1566 F0 80 ld a,(FF00+80) ROM0:1568 CB 6F bit 5,a ROM0:156A 28 25 jr z,1591 ROM0:156C FA 2B D0 ld a,(D02B) ROM0:156F FE 00 cp 00 ROM0:1571 28 15 jr z,1588 ROM0:1573 3E 83 ld a,83 ROM0:1575 EA 20 D0 ld (D020),a ROM0:1578 3E 00 ld a,00 ROM0:157A EA 2B D0 ld (D02B),a ROM0:157D 3E 02 ld a,02 ROM0:157F EA 2C D0 ld (D02C),a ROM0:1582 3E 04 ld a,04 ;\ ROM0:1584 EA C0 CE ld (CEC0),a ;} Play turning around sound effect ROM0:1587 C9 ret ROM0:1588 CD 51 1C call 1C51 ROM0:158B D0 ret nc ROM0:158C AF xor a ROM0:158D EA 20 D0 ld (D020),a ROM0:1590 C9 ret ROM0:1591 AF xor a ROM0:1592 EA 20 D0 ld (D020),a ROM0:1595 F0 81 ld a,(FF00+81) ROM0:1597 CB 7F bit 7,a ROM0:1599 28 0F jr z,15AA ROM0:159B AF xor a ROM0:159C EA 22 D0 ld (D022),a ROM0:159F 3E 04 ld a,04 ROM0:15A1 EA 20 D0 ld (D020),a ROM0:15A4 3E 05 ld a,05 ;\ ROM0:15A6 EA C0 CE ld (CEC0),a ;} Play crounching sound effect ROM0:15A9 C9 ret ROM0:15AA F0 81 ld a,(FF00+81) ROM0:15AC CB 47 bit 0,a ROM0:15AE 28 43 jr z,15F3 ROM0:15B0 F0 C0 ld a,(FF00+C0) ROM0:15B2 D6 08 sub 08 ROM0:15B4 E0 C0 ld (FF00+C0),a ROM0:15B6 CD 88 1E call 1E88 ROM0:15B9 D8 ret c ROM0:15BA 3E 21 ld a,21 ROM0:15BC EA 26 D0 ld (D026),a ROM0:15BF FA 45 D0 ld a,(D045) ROM0:15C2 CB 4F bit 1,a ROM0:15C4 20 05 jr nz,15CB ROM0:15C6 3E 31 ld a,31 ROM0:15C8 EA 26 D0 ld (D026),a ROM0:15CB 3E 09 ld a,09 ROM0:15CD EA 20 D0 ld (D020),a ROM0:15D0 AF xor a ROM0:15D1 EA 10 D0 ld (D010),a ROM0:15D4 3E 02 ld a,02 ;\ ROM0:15D6 EA C0 CE ld (CEC0),a ;} Play hi-jumping sound effect ROM0:15D9 FA 45 D0 ld a,(D045) ROM0:15DC CB 4F bit 1,a ROM0:15DE 20 05 jr nz,15E5 ROM0:15E0 3E 01 ld a,01 ;\ ROM0:15E2 EA C0 CE ld (CEC0),a ;} Play jumping sound effect ROM0:15E5 FA 48 D0 ld a,(D048) ROM0:15E8 A7 and a ROM0:15E9 28 08 jr z,15F3 ROM0:15EB FA 26 D0 ld a,(D026) ROM0:15EE C6 10 add a,10 ROM0:15F0 EA 26 D0 ld (D026),a ROM0:15F3 C9 ret } ;;; $15F4: Samus' pose handler - crouching ;;; { ROM0:15F4 CD 0F 1F call 1F0F ROM0:15F7 38 0B jr c,1604 ROM0:15F9 3E 07 ld a,07 ROM0:15FB EA 20 D0 ld (D020),a ROM0:15FE 3E 01 ld a,01 ROM0:1600 EA 24 D0 ld (D024),a ROM0:1603 C9 ret ROM0:1604 F0 80 ld a,(FF00+80) ROM0:1606 CB 67 bit 4,a ROM0:1608 28 31 jr z,163B ROM0:160A FA 22 D0 ld a,(D022) ROM0:160D 3C inc a ROM0:160E EA 22 D0 ld (D022),a ROM0:1611 FE 08 cp 08 ROM0:1613 30 06 jr nc,161B ROM0:1615 F0 81 ld a,(FF00+81) ROM0:1617 CB 67 bit 4,a ROM0:1619 28 20 jr z,163B ROM0:161B AF xor a ROM0:161C EA 22 D0 ld (D022),a ROM0:161F FA 2B D0 ld a,(D02B) ROM0:1622 FE 01 cp 01 ROM0:1624 20 0F jr nz,1635 ROM0:1626 CD 37 1B call 1B37 ROM0:1629 D0 ret nc ROM0:162A 3E 05 ld a,05 ROM0:162C EA 20 D0 ld (D020),a ROM0:162F 3E 06 ld a,06 ;\ ROM0:1631 EA C0 CE ld (CEC0),a ;} Play morphing sound effect ROM0:1634 C9 ret ROM0:1635 3E 01 ld a,01 ROM0:1637 EA 2B D0 ld (D02B),a ROM0:163A C9 ret ROM0:163B F0 80 ld a,(FF00+80) ROM0:163D CB 6F bit 5,a ROM0:163F 28 30 jr z,1671 ROM0:1641 FA 22 D0 ld a,(D022) ROM0:1644 3C inc a ROM0:1645 EA 22 D0 ld (D022),a ROM0:1648 FE 08 cp 08 ROM0:164A 30 06 jr nc,1652 ROM0:164C F0 81 ld a,(FF00+81) ROM0:164E CB 6F bit 5,a ROM0:1650 28 1F jr z,1671 ROM0:1652 AF xor a ROM0:1653 EA 22 D0 ld (D022),a ROM0:1656 FA 2B D0 ld a,(D02B) ROM0:1659 A7 and a ROM0:165A 20 0F jr nz,166B ROM0:165C CD 37 1B call 1B37 ROM0:165F D0 ret nc ROM0:1660 3E 05 ld a,05 ROM0:1662 EA 20 D0 ld (D020),a ROM0:1665 3E 06 ld a,06 ;\ ROM0:1667 EA C0 CE ld (CEC0),a ;} Play morphing sound effect ROM0:166A C9 ret ROM0:166B 3E 00 ld a,00 ROM0:166D EA 2B D0 ld (D02B),a ROM0:1670 C9 ret ROM0:1671 F0 81 ld a,(FF00+81) ROM0:1673 CB 47 bit 0,a ROM0:1675 28 4D jr z,16C4 ROM0:1677 FA 45 D0 ld a,(D045) ;\ ROM0:167A E6 02 and 02 ;| ROM0:167C CB 3F srl a ;} Play appropriate jumping sound effect ROM0:167E 3C inc a ;| ROM0:167F EA C0 CE ld (CEC0),a ;/ ROM0:1682 F0 80 ld a,(FF00+80) ROM0:1684 E6 30 and 30 ROM0:1686 28 13 jr z,169B ROM0:1688 3E 02 ld a,02 ROM0:168A EA 20 D0 ld (D020),a ROM0:168D FA 45 D0 ld a,(D045) ROM0:1690 CB 57 bit 2,a ROM0:1692 28 0C jr z,16A0 ROM0:1694 3E 03 ld a,03 ;\ ROM0:1696 EA C0 CE ld (CEC0),a ;} Play screw attacking sound effect ROM0:1699 18 05 jr 16A0 ROM0:169B 3E 01 ld a,01 ROM0:169D EA 20 D0 ld (D020),a ROM0:16A0 3E 21 ld a,21 ROM0:16A2 EA 26 D0 ld (D026),a ROM0:16A5 FA 45 D0 ld a,(D045) ROM0:16A8 CB 4F bit 1,a ROM0:16AA 20 05 jr nz,16B1 ROM0:16AC 3E 31 ld a,31 ROM0:16AE EA 26 D0 ld (D026),a ROM0:16B1 FA 48 D0 ld a,(D048) ROM0:16B4 A7 and a ROM0:16B5 28 08 jr z,16BF ROM0:16B7 FA 26 D0 ld a,(D026) ROM0:16BA C6 10 add a,10 ROM0:16BC EA 26 D0 ld (D026),a ROM0:16BF AF xor a ROM0:16C0 EA 10 D0 ld (D010),a ROM0:16C3 C9 ret ROM0:16C4 F0 81 ld a,(FF00+81) ROM0:16C6 CB 7F bit 7,a ROM0:16C8 28 04 jr z,16CE ROM0:16CA CD A4 1B call 1BA4 ROM0:16CD C9 ret ROM0:16CE F0 80 ld a,(FF00+80) ROM0:16D0 CB 7F bit 7,a ROM0:16D2 28 0E jr z,16E2 ROM0:16D4 FA 22 D0 ld a,(D022) ROM0:16D7 3C inc a ROM0:16D8 EA 22 D0 ld (D022),a ROM0:16DB FE 10 cp 10 ROM0:16DD D8 ret c ROM0:16DE CD A4 1B call 1BA4 ROM0:16E1 C9 ret ROM0:16E2 F0 81 ld a,(FF00+81) ROM0:16E4 CB 77 bit 6,a ROM0:16E6 28 04 jr z,16EC ROM0:16E8 CD 37 1B call 1B37 ROM0:16EB C9 ret ROM0:16EC F0 80 ld a,(FF00+80) ROM0:16EE CB 77 bit 6,a ROM0:16F0 28 0E jr z,1700 ROM0:16F2 FA 22 D0 ld a,(D022) ROM0:16F5 3C inc a ROM0:16F6 EA 22 D0 ld (D022),a ROM0:16F9 FE 10 cp 10 ROM0:16FB D8 ret c ROM0:16FC CD 37 1B call 1B37 ROM0:16FF C9 ret ROM0:1700 C9 ret } ;;; $1701: Samus' pose handler - morphball ;;; { ROM0:1701 CD 0F 1F call 1F0F ROM0:1704 38 0B jr c,1711 ROM0:1706 3E 08 ld a,08 ROM0:1708 EA 20 D0 ld (D020),a ROM0:170B 3E 01 ld a,01 ROM0:170D EA 24 D0 ld (D024),a ROM0:1710 C9 ret ROM0:1711 F0 81 ld a,(FF00+81) ROM0:1713 CB 7F bit 7,a ROM0:1715 20 6E jr nz,1785 ROM0:1717 F0 81 ld a,(FF00+81) ROM0:1719 CB 77 bit 6,a ROM0:171B 28 04 jr z,1721 ROM0:171D CD 2E 1B call 1B2E ROM0:1720 C9 ret ROM0:1721 F0 80 ld a,(FF00+80) ROM0:1723 CB 47 bit 0,a ROM0:1725 28 1B jr z,1742 ROM0:1727 FA 45 D0 ld a,(D045) ROM0:172A CB 67 bit 4,a ROM0:172C 28 14 jr z,1742 ROM0:172E 3E 2E ld a,2E ROM0:1730 EA 26 D0 ld (D026),a ROM0:1733 3E 06 ld a,06 ROM0:1735 EA 20 D0 ld (D020),a ROM0:1738 AF xor a ROM0:1739 EA 10 D0 ld (D010),a ROM0:173C 3E 01 ld a,01 ;\ ROM0:173E EA C0 CE ld (CEC0),a ;} Play jumping sound effect ROM0:1741 C9 ret ROM0:1742 FA 33 D0 ld a,(D033) ROM0:1745 FE 02 cp 02 ROM0:1747 38 1F jr c,1768 ROM0:1749 F0 80 ld a,(FF00+80) ROM0:174B CB 7F bit 7,a ROM0:174D C2 85 17 jp nz,1785 ROM0:1750 3E 06 ld a,06 ROM0:1752 EA 20 D0 ld (D020),a ROM0:1755 3E 01 ld a,01 ;\ ROM0:1757 EA C0 CE ld (CEC0),a ;} Play jumping sound effect ROM0:175A 20 06 jr nz,1762 ROM0:175C 3E 48 ld a,48 ROM0:175E EA 26 D0 ld (D026),a ROM0:1761 C9 ret ROM0:1762 3E 44 ld a,44 ROM0:1764 EA 26 D0 ld (D026),a ROM0:1767 C9 ret ROM0:1768 AF xor a ROM0:1769 EA 33 D0 ld (D033),a ROM0:176C F0 80 ld a,(FF00+80) ROM0:176E CB 67 bit 4,a ROM0:1770 28 07 jr z,1779 ROM0:1772 CD 98 1C call 1C98 ROM0:1775 FA 35 D0 ld a,(D035) ROM0:1778 C9 ret ROM0:1779 F0 80 ld a,(FF00+80) ROM0:177B CB 6F bit 5,a ROM0:177D C8 ret z ROM0:177E CD C9 1C call 1CC9 ROM0:1781 FA 36 D0 ld a,(D036) ROM0:1784 C9 ret ROM0:1785 FA 45 D0 ld a,(D045) ROM0:1788 CB 6F bit 5,a ROM0:178A C8 ret z ROM0:178B 3E 0E ld a,0E ROM0:178D EA 20 D0 ld (D020),a ROM0:1790 3E 01 ld a,01 ROM0:1792 EA 24 D0 ld (D024),a ROM0:1795 AF xor a ROM0:1796 EA 44 D0 ld (D044),a ROM0:1799 3E 0D ld a,0D ;\ ROM0:179B EA C0 CE ld (CEC0),a ;} Play spider ball sound effect ROM0:179E C9 ret } ;;; $179F: Samus' pose handler - morphball jumping ;;; { ROM0:179F F0 81 ld a,(FF00+81) ROM0:17A1 CB 7F bit 7,a ROM0:17A3 28 16 jr z,17BB ROM0:17A5 FA 45 D0 ld a,(D045) ROM0:17A8 CB 6F bit 5,a ROM0:17AA 28 0F jr z,17BB ROM0:17AC 3E 0D ld a,0D ROM0:17AE EA 20 D0 ld (D020),a ROM0:17B1 AF xor a ROM0:17B2 EA 44 D0 ld (D044),a ROM0:17B5 3E 0D ld a,0D ;\ ROM0:17B7 EA C0 CE ld (CEC0),a ;} Play spider ball sound effect ROM0:17BA C9 ret } ;;; $17BB: Samus' pose handler - jumping ;;; { ROM0:17BB FA 26 D0 ld a,(D026) ROM0:17BE FE 40 cp 40 ROM0:17C0 30 18 jr nc,17DA ROM0:17C2 F0 80 ld a,(FF00+80) ROM0:17C4 CB 47 bit 0,a ROM0:17C6 28 0D jr z,17D5 ROM0:17C8 FA 45 D0 ld a,(D045) ROM0:17CB E6 02 and 02 ROM0:17CD CB 3F srl a ROM0:17CF 47 ld b,a ROM0:17D0 3E FE ld a,FE ROM0:17D2 90 sub b ROM0:17D3 18 1E jr 17F3 ROM0:17D5 3E 56 ld a,56 ROM0:17D7 EA 26 D0 ld (D026),a ROM0:17DA D6 40 sub 40 ROM0:17DC 21 4A 18 ld hl,184A ROM0:17DF 5F ld e,a ROM0:17E0 16 00 ld d,00 ROM0:17E2 19 add hl,de ROM0:17E3 7E ld a,(hl) ROM0:17E4 FE 80 cp 80 ROM0:17E6 28 46 jr z,182E ROM0:17E8 CB 7F bit 7,a ROM0:17EA 20 07 jr nz,17F3 ROM0:17EC FA 62 D0 ld a,(D062) ROM0:17EF A7 and a ROM0:17F0 20 3C jr nz,182E ROM0:17F2 7E ld a,(hl) ROM0:17F3 CD 4E 1D call 1D4E ROM0:17F6 30 07 jr nc,17FF ROM0:17F8 FA 26 D0 ld a,(D026) ROM0:17FB FE 57 cp 57 ROM0:17FD 30 2F jr nc,182E ROM0:17FF FA 26 D0 ld a,(D026) ROM0:1802 3C inc a ROM0:1803 EA 26 D0 ld (D026),a ROM0:1806 FA 20 D0 ld a,(D020) ROM0:1809 FE 06 cp 06 ROM0:180B 20 0E jr nz,181B ROM0:180D F0 81 ld a,(FF00+81) ROM0:180F CB 77 bit 6,a ROM0:1811 28 08 jr z,181B ROM0:1813 CD B3 1B call 1BB3 ROM0:1816 3E 10 ld a,10 ROM0:1818 EA 49 D0 ld (D049),a ROM0:181B F0 80 ld a,(FF00+80) ROM0:181D CB 67 bit 4,a ROM0:181F 28 03 jr z,1824 ROM0:1821 CD F5 1C call 1CF5 ROM0:1824 F0 80 ld a,(FF00+80) ROM0:1826 CB 6F bit 5,a ROM0:1828 28 03 jr z,182D ROM0:182A CD 22 1D call 1D22 ROM0:182D C9 ret ROM0:182E AF xor a ROM0:182F EA 4A 18 ld (184A),a ;RAM enable ROM0:1832 3E 16 ld a,16 ROM0:1834 EA 24 D0 ld (D024),a ROM0:1837 FA 20 D0 ld a,(D020) ROM0:183A FE 06 cp 06 ROM0:183C 28 06 jr z,1844 ROM0:183E 3E 07 ld a,07 ROM0:1840 EA 20 D0 ld (D020),a ROM0:1843 C9 ret ROM0:1844 3E 08 ld a,08 ROM0:1846 EA 20 D0 ld (D020),a ROM0:1849 C9 ret } ;;; $184A: ;;; { ROM0:184A db FE, FE, FE, FE, FF, FE, FF, FE, FF, FF, FF, FF, FF, FF, 00, FF, FF, 00, FF, 00, FF, 00, 00, 00, 00, 00, 00, 00, 00, 01, 00, 01, 00, 01, 01, 00, 01, 01, 01, 01, 01, 01, 02, 01, 02, 01, 02, 02, 02, 02, 03, 02, 02, 03, 02, 02, 03, 02, 03, 02, 03, 02, 03, 02, 03, 03, 03, 03, 03, 03, 03, 03, 03, 03, 03, 03, 03, 03, 80 } ;;; $1899: ;;; { ROM0:1899 db 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 02, 01, 02, 02, 02, 02, 03, 02, 02, 03, 02, 02, 03, 02, 03, 02, 03, 02, 03, 02, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 80 } ;;; $18E8: Samus' pose handler - spin-jumping ;;; { ROM0:18E8 F0 81 ld a,(FF00+81) ROM0:18EA CB 4F bit 1,a ROM0:18EC 28 05 jr z,18F3 ROM0:18EE 3E 01 ld a,01 ROM0:18F0 EA 20 D0 ld (D020),a ROM0:18F3 FA 26 D0 ld a,(D026) ROM0:18F6 FE 40 cp 40 ROM0:18F8 30 18 jr nc,1912 ROM0:18FA F0 80 ld a,(FF00+80) ROM0:18FC CB 47 bit 0,a ROM0:18FE 28 0D jr z,190D ROM0:1900 FA 45 D0 ld a,(D045) ROM0:1903 E6 02 and 02 ROM0:1905 CB 3F srl a ROM0:1907 47 ld b,a ROM0:1908 3E FE ld a,FE ROM0:190A 90 sub b ROM0:190B 18 6E jr 197B ROM0:190D 3E 56 ld a,56 ROM0:190F EA 26 D0 ld (D026),a ROM0:1912 D6 40 sub 40 ROM0:1914 5F ld e,a ROM0:1915 16 00 ld d,00 ROM0:1917 F0 81 ld a,(FF00+81) ROM0:1919 CB 47 bit 0,a ROM0:191B 28 42 jr z,195F ROM0:191D 21 99 18 ld hl,1899 ROM0:1920 19 add hl,de ROM0:1921 7E ld a,(hl) ROM0:1922 A7 and a ROM0:1923 28 3A jr z,195F ROM0:1925 FA 45 D0 ld a,(D045) ROM0:1928 CB 5F bit 3,a ROM0:192A 28 33 jr z,195F ROM0:192C 3E 18 ld a,18 ROM0:192E EA 26 D0 ld (D026),a ROM0:1931 3E 02 ld a,02 ;\ ROM0:1933 EA C0 CE ld (CEC0),a ;} Play hi-jumping sound effect ROM0:1936 FA 45 D0 ld a,(D045) ROM0:1939 CB 4F bit 1,a ROM0:193B 20 0A jr nz,1947 ROM0:193D 3E 28 ld a,28 ROM0:193F EA 26 D0 ld (D026),a ROM0:1942 3E 01 ld a,01 ;\ ROM0:1944 EA C0 CE ld (CEC0),a ;} Play jumping sound effect ROM0:1947 FA 45 D0 ld a,(D045) ROM0:194A CB 57 bit 2,a ROM0:194C 28 05 jr z,1953 ROM0:194E 3E 03 ld a,03 ;\ ROM0:1950 EA C0 CE ld (CEC0),a ;} Play screw attacking sound effect ROM0:1953 FA 0F D0 ld a,(D00F) ROM0:1956 A7 and a ROM0:1957 C8 ret z ROM0:1958 3C inc a ROM0:1959 CB 3F srl a ROM0:195B EA 2B D0 ld (D02B),a ROM0:195E C9 ret ROM0:195F FA 0F D0 ld a,(D00F) ROM0:1962 A7 and a ROM0:1963 20 0B jr nz,1970 ROM0:1965 F0 80 ld a,(FF00+80) ROM0:1967 CB 77 bit 6,a ROM0:1969 28 05 jr z,1970 ROM0:196B F0 97 ld a,(FF00+97) ROM0:196D E6 03 and 03 ROM0:196F C0 ret nz ROM0:1970 21 4A 18 ld hl,184A ROM0:1973 19 add hl,de ROM0:1974 7E ld a,(hl) ROM0:1975 FE 80 cp 80 ROM0:1977 20 02 jr nz,197B ROM0:1979 18 4C jr 19C7 ROM0:197B CB 7F bit 7,a ROM0:197D 20 07 jr nz,1986 ROM0:197F FA 62 D0 ld a,(D062) ROM0:1982 A7 and a ROM0:1983 20 42 jr nz,19C7 ROM0:1985 7E ld a,(hl) ROM0:1986 CD 4E 1D call 1D4E ROM0:1989 30 09 jr nc,1994 ROM0:198B FA 26 D0 ld a,(D026) ROM0:198E FE 57 cp 57 ROM0:1990 38 02 jr c,1994 ROM0:1992 18 3F jr 19D3 ROM0:1994 FA 26 D0 ld a,(D026) ROM0:1997 3C inc a ROM0:1998 EA 26 D0 ld (D026),a ROM0:199B F0 80 ld a,(FF00+80) ROM0:199D CB 67 bit 4,a ROM0:199F 28 05 jr z,19A6 ROM0:19A1 3E 01 ld a,01 ROM0:19A3 EA 0F D0 ld (D00F),a ROM0:19A6 F0 80 ld a,(FF00+80) ROM0:19A8 CB 6F bit 5,a ROM0:19AA 28 05 jr z,19B1 ROM0:19AC 3E FF ld a,FF ROM0:19AE EA 0F D0 ld (D00F),a ROM0:19B1 FA 0F D0 ld a,(D00F) ROM0:19B4 FE 01 cp 01 ROM0:19B6 20 04 jr nz,19BC ROM0:19B8 CD FA 1C call 1CFA ROM0:19BB C9 ret ROM0:19BC FA 0F D0 ld a,(D00F) ROM0:19BF FE FF cp FF ROM0:19C1 C0 ret nz ROM0:19C2 CD 26 1D call 1D26 ROM0:19C5 C9 ret ROM0:19C6 C9 ret ROM0:19C7 FA 45 D0 ld a,(D045) ROM0:19CA E6 0C and 0C ROM0:19CC 28 05 jr z,19D3 ROM0:19CE 3E 04 ld a,04 ;\ ROM0:19D0 EA C0 CE ld (CEC0),a ;} Play landing sound effect ROM0:19D3 AF xor a ROM0:19D4 EA 4A 18 ld (184A),a ;RAM enable ROM0:19D7 3E 16 ld a,16 ROM0:19D9 EA 24 D0 ld (D024),a ROM0:19DC 3E 07 ld a,07 ROM0:19DE EA 20 D0 ld (D020),a ROM0:19E1 C9 ret } ;;; $19E2: Samus' pose handler - starting to jump / starting to spin-jump ;;; { ROM0:19E2 F0 80 ld a,(FF00+80) ROM0:19E4 CB 47 bit 0,a ROM0:19E6 28 33 jr z,1A1B ROM0:19E8 F0 97 ld a,(FF00+97) ROM0:19EA E6 02 and 02 ROM0:19EC CB 3F srl a ROM0:19EE 47 ld b,a ROM0:19EF 3E FE ld a,FE ROM0:19F1 90 sub b ROM0:19F2 CD 4E 1D call 1D4E ROM0:19F5 30 04 jr nc,19FB ROM0:19F7 CD 37 1B call 1B37 ROM0:19FA C9 ret ROM0:19FB FA 10 D0 ld a,(D010) ROM0:19FE 3C inc a ROM0:19FF EA 10 D0 ld (D010),a ROM0:1A02 FE 06 cp 06 ROM0:1A04 30 15 jr nc,1A1B ROM0:1A06 F0 80 ld a,(FF00+80) ROM0:1A08 CB 67 bit 4,a ROM0:1A0A 28 04 jr z,1A10 ROM0:1A0C CD F5 1C call 1CF5 ROM0:1A0F C9 ret ROM0:1A10 F0 80 ld a,(FF00+80) ROM0:1A12 CB 6F bit 5,a ROM0:1A14 28 04 jr z,1A1A ROM0:1A16 CD 22 1D call 1D22 ROM0:1A19 C9 ret ROM0:1A1A C9 ret ROM0:1A1B FA 20 D0 ld a,(D020) ROM0:1A1E FE 09 cp 09 ROM0:1A20 20 06 jr nz,1A28 ROM0:1A22 3E 01 ld a,01 ROM0:1A24 EA 20 D0 ld (D020),a ROM0:1A27 C9 ret ROM0:1A28 F0 80 ld a,(FF00+80) ROM0:1A2A E6 30 and 30 ROM0:1A2C CB 37 swap a ROM0:1A2E 5F ld e,a ROM0:1A2F 16 00 ld d,00 ROM0:1A31 21 3F 1A ld hl,1A3F ROM0:1A34 19 add hl,de ROM0:1A35 7E ld a,(hl) ROM0:1A36 EA 0F D0 ld (D00F),a ROM0:1A39 3E 02 ld a,02 ROM0:1A3B EA 20 D0 ld (D020),a ROM0:1A3E C9 ret ROM0:1A3F 00 nop ROM0:1A40 01 FF AF ld bc,AFFF ROM0:1A43 EA 3D D0 ld (D03D),a ROM0:1A46 F0 C2 ld a,(FF00+C2) ROM0:1A48 C6 15 add a,15 ROM0:1A4A EA 04 C2 ld (C204),a ROM0:1A4D F0 C0 ld a,(FF00+C0) ROM0:1A4F C6 1E add a,1E ROM0:1A51 EA 03 C2 ld (C203),a ROM0:1A54 CD BF 1F call 1FBF ROM0:1A57 FA 3D D0 ld a,(D03D) ROM0:1A5A CB 1F rr a ROM0:1A5C EA 3D D0 ld (D03D),a ROM0:1A5F F0 C0 ld a,(FF00+C0) ROM0:1A61 C6 2C add a,2C ROM0:1A63 EA 03 C2 ld (C203),a ROM0:1A66 CD BF 1F call 1FBF ROM0:1A69 FA 3D D0 ld a,(D03D) ROM0:1A6C CB 1F rr a ROM0:1A6E EA 3D D0 ld (D03D),a ROM0:1A71 F0 C2 ld a,(FF00+C2) ROM0:1A73 C6 0A add a,0A ROM0:1A75 EA 04 C2 ld (C204),a ROM0:1A78 F0 C0 ld a,(FF00+C0) ROM0:1A7A C6 1E add a,1E ROM0:1A7C EA 03 C2 ld (C203),a ROM0:1A7F CD BF 1F call 1FBF ROM0:1A82 FA 3D D0 ld a,(D03D) ROM0:1A85 CB 1F rr a ROM0:1A87 EA 3D D0 ld (D03D),a ROM0:1A8A F0 C0 ld a,(FF00+C0) ROM0:1A8C C6 2C add a,2C ROM0:1A8E EA 03 C2 ld (C203),a ROM0:1A91 CD BF 1F call 1FBF ROM0:1A94 FA 3D D0 ld a,(D03D) ROM0:1A97 CB 1F rr a ROM0:1A99 EA 3D D0 ld (D03D),a ROM0:1A9C CB 37 swap a ROM0:1A9E EA 3D D0 ld (D03D),a ROM0:1AA1 F0 C2 ld a,(FF00+C2) ROM0:1AA3 C6 15 add a,15 ROM0:1AA5 EA 04 C2 ld (C204),a ROM0:1AA8 F0 C0 ld a,(FF00+C0) ROM0:1AAA C6 25 add a,25 ROM0:1AAC EA 03 C2 ld (C203),a ROM0:1AAF CD BF 1F call 1FBF ROM0:1AB2 30 08 jr nc,1ABC ROM0:1AB4 FA 3D D0 ld a,(D03D) ROM0:1AB7 F6 03 or 03 ROM0:1AB9 EA 3D D0 ld (D03D),a ROM0:1ABC F0 C2 ld a,(FF00+C2) ROM0:1ABE C6 0A add a,0A ROM0:1AC0 EA 04 C2 ld (C204),a ROM0:1AC3 F0 C0 ld a,(FF00+C0) ROM0:1AC5 C6 25 add a,25 ROM0:1AC7 EA 03 C2 ld (C203),a ROM0:1ACA CD BF 1F call 1FBF ROM0:1ACD 30 08 jr nc,1AD7 ROM0:1ACF FA 3D D0 ld a,(D03D) ROM0:1AD2 F6 0C or 0C ROM0:1AD4 EA 3D D0 ld (D03D),a ROM0:1AD7 F0 C2 ld a,(FF00+C2) ROM0:1AD9 C6 0F add a,0F ROM0:1ADB EA 04 C2 ld (C204),a ROM0:1ADE F0 C0 ld a,(FF00+C0) ROM0:1AE0 C6 1E add a,1E ROM0:1AE2 EA 03 C2 ld (C203),a ROM0:1AE5 CD BF 1F call 1FBF ROM0:1AE8 30 08 jr nc,1AF2 ROM0:1AEA FA 3D D0 ld a,(D03D) ROM0:1AED F6 05 or 05 ROM0:1AEF EA 3D D0 ld (D03D),a ROM0:1AF2 F0 C0 ld a,(FF00+C0) ROM0:1AF4 C6 2C add a,2C ROM0:1AF6 EA 03 C2 ld (C203),a ROM0:1AF9 F0 C2 ld a,(FF00+C2) ROM0:1AFB C6 0F add a,0F ROM0:1AFD EA 04 C2 ld (C204),a ROM0:1B00 CD F5 1F call 1FF5 ROM0:1B03 21 56 D0 ld hl,D056 ROM0:1B06 BE cp (hl) ROM0:1B07 30 0A jr nc,1B13 ROM0:1B09 FA 3D D0 ld a,(D03D) ROM0:1B0C F6 0A or 0A ROM0:1B0E EA 3D D0 ld (D03D),a ROM0:1B11 18 0D jr 1B20 ROM0:1B13 CD 8D 34 call 348D ROM0:1B16 30 08 jr nc,1B20 ROM0:1B18 FA 3D D0 ld a,(D03D) ROM0:1B1B F6 0A or 0A ROM0:1B1D EA 3D D0 ld (D03D),a ROM0:1B20 FA 3D D0 ld a,(D03D) ROM0:1B23 E6 05 and 05 ROM0:1B25 FE 05 cp 05 ROM0:1B27 C8 ret z ROM0:1B28 F0 80 ld a,(FF00+80) ROM0:1B2A CB 47 bit 0,a ROM0:1B2C C8 ret z ROM0:1B2D C9 ret } ;;; $1B2E: ;;; { ROM0:1B2E F0 C2 ld a,(FF00+C2) ROM0:1B30 C6 0B add a,0B ROM0:1B32 EA 04 C2 ld (C204),a ROM0:1B35 18 34 jr 1B6B } ;;; $1B37: ;;; { ROM0:1B37 3E 04 ld a,04 ;\ ROM0:1B39 EA C0 CE ld (CEC0),a ;} Play uncrouching / turning around / landing sound effect ROM0:1B3C F0 C2 ld a,(FF00+C2) ROM0:1B3E C6 0C add a,0C ROM0:1B40 EA 04 C2 ld (C204),a ROM0:1B43 F0 C0 ld a,(FF00+C0) ROM0:1B45 C6 10 add a,10 ROM0:1B47 EA 03 C2 ld (C203),a ROM0:1B4A CD F5 1F call 1FF5 ROM0:1B4D 21 56 D0 ld hl,D056 ROM0:1B50 BE cp (hl) ROM0:1B51 D8 ret c ROM0:1B52 F0 C2 ld a,(FF00+C2) ROM0:1B54 C6 14 add a,14 ROM0:1B56 EA 04 C2 ld (C204),a ROM0:1B59 CD F5 1F call 1FF5 ROM0:1B5C 21 56 D0 ld hl,D056 ROM0:1B5F BE cp (hl) ROM0:1B60 D8 ret c ROM0:1B61 AF xor a ROM0:1B62 EA 20 D0 ld (D020),a ROM0:1B65 3E 04 ld a,04 ;\ ROM0:1B67 EA C0 CE ld (CEC0),a ;} Play play uncrouching / turning around / landing sound effect ROM0:1B6A C9 ret } ;;; $1B6B: ;;; { ROM0:1B6B F0 C0 ld a,(FF00+C0) ROM0:1B6D C6 18 add a,18 ROM0:1B6F EA 03 C2 ld (C203),a ROM0:1B72 CD F5 1F call 1FF5 ROM0:1B75 21 56 D0 ld hl,D056 ROM0:1B78 BE cp (hl) ROM0:1B79 38 1F jr c,1B9A ROM0:1B7B F0 C2 ld a,(FF00+C2) ROM0:1B7D C6 14 add a,14 ROM0:1B7F EA 04 C2 ld (C204),a ROM0:1B82 CD F5 1F call 1FF5 ROM0:1B85 21 56 D0 ld hl,D056 ROM0:1B88 BE cp (hl) ROM0:1B89 38 0F jr c,1B9A ROM0:1B8B 3E 04 ld a,04 ROM0:1B8D EA 20 D0 ld (D020),a ROM0:1B90 AF xor a ROM0:1B91 EA 22 D0 ld (D022),a ROM0:1B94 3E 05 ld a,05 ;\ ROM0:1B96 EA C0 CE ld (CEC0),a ;} Play crouching / unmorphing sound effect ROM0:1B99 C9 ret ROM0:1B9A 3E 05 ld a,05 ROM0:1B9C EA 20 D0 ld (D020),a ROM0:1B9F AF xor a ROM0:1BA0 EA 33 D0 ld (D033),a ROM0:1BA3 C9 ret } ;;; $1BA4: Samus' pose handler - crouching - morph (unit) ;;; { ; Called by crouching ROM0:1BA4 3E 05 ld a,05 ;\ ROM0:1BA6 EA 20 D0 ld (D020),a ;} Samus' pose = morphball ROM0:1BA9 AF xor a ;\ ROM0:1BAA EA 33 D0 ld (D033),a ;} $D033 = 0 ROM0:1BAD 3E 06 ld a,06 ;\ ROM0:1BAF EA C0 CE ld (CEC0),a ;} Play morphing sound effect ROM0:1BB2 C9 ret } ;;; $1BB3: ;;; { ROM0:1BB3 F0 C0 ld a,(FF00+C0) ;\ ROM0:1BB5 C6 08 add a,08 ;} Tile Y = [Samus' Y position low] + 8 ROM0:1BB7 EA 03 C2 ld (C203),a ;/ ROM0:1BBA F0 C2 ld a,(FF00+C2) ;\ ROM0:1BBC C6 0B add a,0B ;} Tile X = [Samus' X position low] + Bh ROM0:1BBE EA 04 C2 ld (C204),a ;/ ROM0:1BC1 CD F5 1F call 1FF5 ; Execute subroutine $1FF5 ROM0:1BC4 21 56 D0 ld hl,D056 ;\ ROM0:1BC7 BE cp (hl) ;} If [a] < [Samus solid block threshold]: return ROM0:1BC8 38 42 jr c,1C0C ;/ ROM0:1BCA F0 C2 ld a,(FF00+C2) ;\ ROM0:1BCC C6 14 add a,14 ;} Tile X = [Samus' X position low] + 14h ROM0:1BCE EA 04 C2 ld (C204),a ;/ ROM0:1BD1 CD F5 1F call 1FF5 ; Execute subroutine $1FF5 ROM0:1BD4 21 56 D0 ld hl,D056 ;\ ROM0:1BD7 BE cp (hl) ;} If [a] < [Samus solid block threshold]: return ROM0:1BD8 38 32 jr c,1C0C ;/ ROM0:1BDA F0 C0 ld a,(FF00+C0) ;\ ROM0:1BDC C6 18 add a,18 ;} Tile Y = [Samus' Y position low] + 18h ROM0:1BDE EA 03 C2 ld (C203),a ;/ ROM0:1BE1 F0 C2 ld a,(FF00+C2) ;\ ROM0:1BE3 C6 0B add a,0B ;} Tile X = [Samus' X position low] + Bh ROM0:1BE5 EA 04 C2 ld (C204),a ;/ ROM0:1BE8 CD F5 1F call 1FF5 ; Execute subroutine $1FF5 ROM0:1BEB 21 56 D0 ld hl,D056 ;\ ROM0:1BEE BE cp (hl) ;} If [a] < [Samus solid block threshold]: return ROM0:1BEF 38 1B jr c,1C0C ;/ ROM0:1BF1 F0 C2 ld a,(FF00+C2) ;\ ROM0:1BF3 C6 14 add a,14 ;} Tile X = [Samus' X position low] + 14h ROM0:1BF5 EA 04 C2 ld (C204),a ;/ ROM0:1BF8 CD F5 1F call 1FF5 ; Execute subroutine $1FF5 ROM0:1BFB 21 56 D0 ld hl,D056 ;\ ROM0:1BFE BE cp (hl) ;} If [a] < [Samus solid block threshold]: return ROM0:1BFF 38 0B jr c,1C0C ;/ ROM0:1C01 3E 07 ld a,07 ;\ ROM0:1C03 EA 20 D0 ld (D020),a ;} Samus' pose = falling ROM0:1C06 3E 04 ld a,04 ;\ ROM0:1C08 EA C0 CE ld (CEC0),a ;} Play landing sound effect ROM0:1C0B C9 ret ROM0:1C0C C9 ret } ;;; $1C0D: ;;; { ROM0:1C0D 3E 01 ld a,01 ROM0:1C0F EA 2B D0 ld (D02B),a ROM0:1C12 06 01 ld b,01 ROM0:1C14 FA 48 D0 ld a,(D048) ROM0:1C17 A7 and a ROM0:1C18 20 12 jr nz,1C2C ROM0:1C1A FA 45 D0 ld a,(D045) ROM0:1C1D CB 77 bit 6,a ROM0:1C1F 28 04 jr z,1C25 ROM0:1C21 06 02 ld b,02 ROM0:1C23 18 07 jr 1C2C ROM0:1C25 F0 97 ld a,(FF00+97) ROM0:1C27 E6 01 and 01 ROM0:1C29 C6 01 add a,01 ROM0:1C2B 47 ld b,a ROM0:1C2C F0 C2 ld a,(FF00+C2) ROM0:1C2E 80 add a,b ROM0:1C2F E0 C2 ld (FF00+C2),a ROM0:1C31 F0 C3 ld a,(FF00+C3) ROM0:1C33 CE 00 adc a,00 ROM0:1C35 E6 0F and 0F ROM0:1C37 E0 C3 ld (FF00+C3),a ROM0:1C39 EA 04 C2 ld (C204),a ROM0:1C3C CD E2 1D call 1DE2 ROM0:1C3F 30 0B jr nc,1C4C ROM0:1C41 FA 27 D0 ld a,(D027) ROM0:1C44 E0 C2 ld (FF00+C2),a ROM0:1C46 FA 28 D0 ld a,(D028) ROM0:1C49 E0 C3 ld (FF00+C3),a ROM0:1C4B C9 ret ROM0:1C4C 78 ld a,b ROM0:1C4D EA 35 D0 ld (D035),a ROM0:1C50 C9 ret } ;;; $1C51: ;;; { ROM0:1C51 AF xor a ROM0:1C52 EA 2B D0 ld (D02B),a ROM0:1C55 06 01 ld b,01 ROM0:1C57 FA 48 D0 ld a,(D048) ROM0:1C5A A7 and a ROM0:1C5B 20 12 jr nz,1C6F ROM0:1C5D FA 45 D0 ld a,(D045) ROM0:1C60 CB 77 bit 6,a ROM0:1C62 28 04 jr z,1C68 ROM0:1C64 06 02 ld b,02 ROM0:1C66 18 07 jr 1C6F ROM0:1C68 F0 97 ld a,(FF00+97) ROM0:1C6A E6 01 and 01 ROM0:1C6C C6 01 add a,01 ROM0:1C6E 47 ld b,a ROM0:1C6F F0 C2 ld a,(FF00+C2) ROM0:1C71 90 sub b ROM0:1C72 E0 C2 ld (FF00+C2),a ROM0:1C74 F0 C3 ld a,(FF00+C3) ROM0:1C76 DE 00 sbc a,00 ROM0:1C78 E6 0F and 0F ROM0:1C7A E0 C3 ld (FF00+C3),a ROM0:1C7C EA 04 C2 ld (C204),a ROM0:1C7F CD D6 1D call 1DD6 ROM0:1C82 30 0B jr nc,1C8F ROM0:1C84 FA 27 D0 ld a,(D027) ROM0:1C87 E0 C2 ld (FF00+C2),a ROM0:1C89 FA 28 D0 ld a,(D028) ROM0:1C8C E0 C3 ld (FF00+C3),a ROM0:1C8E C9 ret ROM0:1C8F 78 ld a,b ROM0:1C90 EA 36 D0 ld (D036),a ROM0:1C93 C9 ret } ;;; $1C94: ;;; { ROM0:1C94 3E 01 ld a,01 ROM0:1C96 18 02 jr 1C9A } ;;; $1C98: ;;; { ROM0:1C98 3E 02 ld a,02 } ;;; $1C9A: ;;; { ROM0:1C9A 47 ld b,a ROM0:1C9B 3E 01 ld a,01 ROM0:1C9D EA 2B D0 ld (D02B),a ROM0:1CA0 F0 C2 ld a,(FF00+C2) ROM0:1CA2 80 add a,b ROM0:1CA3 E0 C2 ld (FF00+C2),a ROM0:1CA5 F0 C3 ld a,(FF00+C3) ROM0:1CA7 CE 00 adc a,00 ROM0:1CA9 E6 0F and 0F ROM0:1CAB E0 C3 ld (FF00+C3),a ROM0:1CAD EA 04 C2 ld (C204),a ROM0:1CB0 CD E2 1D call 1DE2 ROM0:1CB3 30 0B jr nc,1CC0 ROM0:1CB5 FA 27 D0 ld a,(D027) ROM0:1CB8 E0 C2 ld (FF00+C2),a ROM0:1CBA FA 28 D0 ld a,(D028) ROM0:1CBD E0 C3 ld (FF00+C3),a ROM0:1CBF C9 ret ROM0:1CC0 78 ld a,b ROM0:1CC1 EA 35 D0 ld (D035),a ROM0:1CC4 C9 ret } ;;; $1CC5: ;;; { ROM0:1CC5 3E 01 ld a,01 ROM0:1CC7 18 02 jr 1CCB } ;;; $1CC9: ;;; { ROM0:1CC9 3E 02 ld a,02 } ;;; $1CCB: ;;; { ROM0:1CCB 47 ld b,a ROM0:1CCC AF xor a ROM0:1CCD EA 2B D0 ld (D02B),a ROM0:1CD0 F0 C2 ld a,(FF00+C2) ROM0:1CD2 90 sub b ROM0:1CD3 E0 C2 ld (FF00+C2),a ROM0:1CD5 F0 C3 ld a,(FF00+C3) ROM0:1CD7 DE 00 sbc a,00 ROM0:1CD9 E6 0F and 0F ROM0:1CDB E0 C3 ld (FF00+C3),a ROM0:1CDD EA 04 C2 ld (C204),a ROM0:1CE0 CD D6 1D call 1DD6 ROM0:1CE3 30 0B jr nc,1CF0 ROM0:1CE5 FA 27 D0 ld a,(D027) ROM0:1CE8 E0 C2 ld (FF00+C2),a ROM0:1CEA FA 28 D0 ld a,(D028) ROM0:1CED E0 C3 ld (FF00+C3),a ROM0:1CEF C9 ret ROM0:1CF0 78 ld a,b ROM0:1CF1 EA 36 D0 ld (D036),a ROM0:1CF4 C9 ret } ;;; $1CF5: ;;; { ROM0:1CF5 3E 01 ld a,01 ROM0:1CF7 EA 2B D0 ld (D02B),a } ;;; $1CFA: ;;; { ROM0:1CFA 3E 01 ld a,01 ROM0:1CFC 47 ld b,a ROM0:1CFD F0 C2 ld a,(FF00+C2) ROM0:1CFF 80 add a,b ROM0:1D00 E0 C2 ld (FF00+C2),a ROM0:1D02 F0 C3 ld a,(FF00+C3) ROM0:1D04 CE 00 adc a,00 ROM0:1D06 E6 0F and 0F ROM0:1D08 E0 C3 ld (FF00+C3),a ROM0:1D0A EA 04 C2 ld (C204),a ROM0:1D0D CD E2 1D call 1DE2 ROM0:1D10 30 0B jr nc,1D1D ROM0:1D12 FA 27 D0 ld a,(D027) ROM0:1D15 E0 C2 ld (FF00+C2),a ROM0:1D17 FA 28 D0 ld a,(D028) ROM0:1D1A E0 C3 ld (FF00+C3),a ROM0:1D1C C9 ret ROM0:1D1D 78 ld a,b ROM0:1D1E EA 35 D0 ld (D035),a ROM0:1D21 C9 ret } ;;; $1D22: ;;; { ROM0:1D22 AF xor a ROM0:1D23 EA 2B D0 ld (D02B),a } ;;; $1D26: ;;; { ROM0:1D26 3E 01 ld a,01 ROM0:1D28 47 ld b,a ROM0:1D29 F0 C2 ld a,(FF00+C2) ROM0:1D2B 90 sub b ROM0:1D2C E0 C2 ld (FF00+C2),a ROM0:1D2E F0 C3 ld a,(FF00+C3) ROM0:1D30 DE 00 sbc a,00 ROM0:1D32 E6 0F and 0F ROM0:1D34 E0 C3 ld (FF00+C3),a ROM0:1D36 EA 04 C2 ld (C204),a ROM0:1D39 CD D6 1D call 1DD6 ROM0:1D3C 30 0B jr nc,1D49 ROM0:1D3E FA 27 D0 ld a,(D027) ROM0:1D41 E0 C2 ld (FF00+C2),a ROM0:1D43 FA 28 D0 ld a,(D028) ROM0:1D46 E0 C3 ld (FF00+C3),a ROM0:1D48 C9 ret ROM0:1D49 78 ld a,b ROM0:1D4A EA 36 D0 ld (D036),a ROM0:1D4D C9 ret } ;;; $1D4E: ;;; { ROM0:1D4E CB 7F bit 7,a ROM0:1D50 20 44 jr nz,1D96 ROM0:1D52 47 ld b,a ROM0:1D53 78 ld a,b ROM0:1D54 EA 34 D0 ld (D034),a ROM0:1D57 F0 C0 ld a,(FF00+C0) ROM0:1D59 80 add a,b ROM0:1D5A E0 C0 ld (FF00+C0),a ROM0:1D5C F0 C1 ld a,(FF00+C1) ROM0:1D5E CE 00 adc a,00 ROM0:1D60 E6 0F and 0F ROM0:1D62 E0 C1 ld (FF00+C1),a ROM0:1D64 78 ld a,b ROM0:1D65 CD 0F 1F call 1F0F ROM0:1D68 30 0C jr nc,1D76 ROM0:1D6A FA 29 D0 ld a,(D029) ROM0:1D6D E0 C0 ld (FF00+C0),a ROM0:1D6F FA 2A D0 ld a,(D02A) ROM0:1D72 E0 C1 ld (FF00+C1),a ROM0:1D74 37 scf ROM0:1D75 C9 ret ROM0:1D76 FA 48 D0 ld a,(D048) ROM0:1D79 A7 and a ROM0:1D7A 28 0F jr z,1D8B ROM0:1D7C CB 38 srl b ROM0:1D7E FA 29 D0 ld a,(D029) ROM0:1D81 80 add a,b ROM0:1D82 E0 C0 ld (FF00+C0),a ROM0:1D84 FA 2A D0 ld a,(D02A) ROM0:1D87 CE 00 adc a,00 ROM0:1D89 E0 C1 ld (FF00+C1),a ROM0:1D8B 78 ld a,b ROM0:1D8C EA 38 D0 ld (D038),a ROM0:1D8F FA 34 D0 ld a,(D034) ROM0:1D92 EA 33 D0 ld (D033),a ROM0:1D95 C9 ret ROM0:1D96 2F cpl ROM0:1D97 3C inc a } ;;; $1D98: ;;; { ROM0:1D98 47 ld b,a ROM0:1D99 F0 C0 ld a,(FF00+C0) ROM0:1D9B 90 sub b ROM0:1D9C E0 C0 ld (FF00+C0),a ROM0:1D9E F0 C1 ld a,(FF00+C1) ROM0:1DA0 DE 00 sbc a,00 ROM0:1DA2 E6 0F and 0F ROM0:1DA4 E0 C1 ld (FF00+C1),a ROM0:1DA6 78 ld a,b ROM0:1DA7 CD 88 1E call 1E88 ROM0:1DAA 30 10 jr nc,1DBC ROM0:1DAC 3E 56 ld a,56 ROM0:1DAE EA 26 D0 ld (D026),a ROM0:1DB1 FA 29 D0 ld a,(D029) ROM0:1DB4 E0 C0 ld (FF00+C0),a ROM0:1DB6 FA 2A D0 ld a,(D02A) ROM0:1DB9 E0 C1 ld (FF00+C1),a ROM0:1DBB C9 ret ROM0:1DBC FA 48 D0 ld a,(D048) ROM0:1DBF A7 and a ROM0:1DC0 28 0F jr z,1DD1 ROM0:1DC2 CB 38 srl b ROM0:1DC4 FA 29 D0 ld a,(D029) ROM0:1DC7 90 sub b ROM0:1DC8 E0 C0 ld (FF00+C0),a ROM0:1DCA FA 2A D0 ld a,(D02A) ROM0:1DCD DE 00 sbc a,00 ROM0:1DCF E0 C1 ld (FF00+C1),a ROM0:1DD1 78 ld a,b ROM0:1DD2 EA 37 D0 ld (D037),a ROM0:1DD5 C9 ret } ;;; $1DD6: ;;; { ROM0:1DD6 E5 push hl ROM0:1DD7 D5 push de ROM0:1DD8 C5 push bc ROM0:1DD9 F0 C2 ld a,(FF00+C2) ROM0:1DDB C6 0B add a,0B ROM0:1DDD EA 04 C2 ld (C204),a ROM0:1DE0 18 0A jr 1DEC } ;;; $1DE2: ;;; { ROM0:1DE2 E5 push hl ROM0:1DE3 D5 push de ROM0:1DE4 C5 push bc ROM0:1DE5 F0 C2 ld a,(FF00+C2) ROM0:1DE7 C6 14 add a,14 ROM0:1DE9 EA 04 C2 ld (C204),a } ;;; $1DEC: ;;; { ROM0:1DEC CD CF 32 call 32CF ROM0:1DEF DA 84 1E jp c,1E84 ROM0:1DF2 21 FF 20 ld hl,20FF ROM0:1DF5 FA 20 D0 ld a,(D020) ROM0:1DF8 CB 27 sla a ROM0:1DFA CB 27 sla a ROM0:1DFC CB 27 sla a ROM0:1DFE 5F ld e,a ROM0:1DFF 16 00 ld d,00 ROM0:1E01 19 add hl,de ROM0:1E02 2A ldi a,(hl) ROM0:1E03 FE 80 cp 80 ROM0:1E05 CA 84 1E jp z,1E84 ROM0:1E08 EA 2D D0 ld (D02D),a ROM0:1E0B 2A ldi a,(hl) ROM0:1E0C FE 80 cp 80 ROM0:1E0E 28 61 jr z,1E71 ROM0:1E10 EA 2E D0 ld (D02E),a ROM0:1E13 2A ldi a,(hl) ROM0:1E14 FE 80 cp 80 ROM0:1E16 28 46 jr z,1E5E ROM0:1E18 EA 2F D0 ld (D02F),a ROM0:1E1B 2A ldi a,(hl) ROM0:1E1C FE 80 cp 80 ROM0:1E1E 28 2B jr z,1E4B ROM0:1E20 EA 30 D0 ld (D030),a ROM0:1E23 7E ld a,(hl) ROM0:1E24 FE 80 cp 80 ROM0:1E26 28 10 jr z,1E38 ROM0:1E28 47 ld b,a ROM0:1E29 F0 C0 ld a,(FF00+C0) ROM0:1E2B 80 add a,b ROM0:1E2C EA 03 C2 ld (C203),a ROM0:1E2F CD F5 1F call 1FF5 ROM0:1E32 21 56 D0 ld hl,D056 ROM0:1E35 BE cp (hl) ROM0:1E36 38 4C jr c,1E84 ROM0:1E38 FA 30 D0 ld a,(D030) ROM0:1E3B 47 ld b,a ROM0:1E3C F0 C0 ld a,(FF00+C0) ROM0:1E3E 80 add a,b ROM0:1E3F EA 03 C2 ld (C203),a ROM0:1E42 CD F5 1F call 1FF5 ROM0:1E45 21 56 D0 ld hl,D056 ROM0:1E48 BE cp (hl) ROM0:1E49 38 39 jr c,1E84 ROM0:1E4B FA 2F D0 ld a,(D02F) ROM0:1E4E 47 ld b,a ROM0:1E4F F0 C0 ld a,(FF00+C0) ROM0:1E51 80 add a,b ROM0:1E52 EA 03 C2 ld (C203),a ROM0:1E55 CD F5 1F call 1FF5 ROM0:1E58 21 56 D0 ld hl,D056 ROM0:1E5B BE cp (hl) ROM0:1E5C 38 26 jr c,1E84 ROM0:1E5E FA 2E D0 ld a,(D02E) ROM0:1E61 47 ld b,a ROM0:1E62 F0 C0 ld a,(FF00+C0) ROM0:1E64 80 add a,b ROM0:1E65 EA 03 C2 ld (C203),a ROM0:1E68 CD F5 1F call 1FF5 ROM0:1E6B 21 56 D0 ld hl,D056 ROM0:1E6E BE cp (hl) ROM0:1E6F 38 13 jr c,1E84 ROM0:1E71 FA 2D D0 ld a,(D02D) ROM0:1E74 47 ld b,a ROM0:1E75 F0 C0 ld a,(FF00+C0) ROM0:1E77 80 add a,b ROM0:1E78 EA 03 C2 ld (C203),a ROM0:1E7B CD F5 1F call 1FF5 ROM0:1E7E 21 56 D0 ld hl,D056 ROM0:1E81 BE cp (hl) ROM0:1E82 38 00 jr c,1E84 ROM0:1E84 C1 pop bc ROM0:1E85 D1 pop de ROM0:1E86 E1 pop hl ROM0:1E87 C9 ret } ;;; $1E88: ;;; { ROM0:1E88 E5 push hl ROM0:1E89 D5 push de ROM0:1E8A C5 push bc ROM0:1E8B CD EF 34 call 34EF ROM0:1E8E DA 0B 1F jp c,1F0B ROM0:1E91 F0 C2 ld a,(FF00+C2) ROM0:1E93 C6 0C add a,0C ROM0:1E95 EA 04 C2 ld (C204),a ROM0:1E98 21 E9 20 ld hl,20E9 ROM0:1E9B FA 20 D0 ld a,(D020) ROM0:1E9E 5F ld e,a ROM0:1E9F 16 00 ld d,00 ROM0:1EA1 19 add hl,de ROM0:1EA2 7E ld a,(hl) ROM0:1EA3 47 ld b,a ROM0:1EA4 F0 C0 ld a,(FF00+C0) ROM0:1EA6 80 add a,b ROM0:1EA7 EA 03 C2 ld (C203),a ROM0:1EAA CD F5 1F call 1FF5 ROM0:1EAD 21 56 D0 ld hl,D056 ROM0:1EB0 BE cp (hl) ROM0:1EB1 26 DC ld h,DC ROM0:1EB3 6F ld l,a ROM0:1EB4 7E ld a,(hl) ROM0:1EB5 CB 47 bit 0,a ROM0:1EB7 28 06 jr z,1EBF ROM0:1EB9 3E FF ld a,FF ROM0:1EBB EA 48 D0 ld (D048),a ROM0:1EBE 7E ld a,(hl) ROM0:1EBF CB 4F bit 1,a ROM0:1EC1 28 01 jr z,1EC4 ROM0:1EC3 3F ccf ROM0:1EC4 7E ld a,(hl) ROM0:1EC5 CB 67 bit 4,a ROM0:1EC7 28 0D jr z,1ED6 ROM0:1EC9 3E 40 ld a,40 ;\ ROM0:1ECB EA 62 D0 ld (D062),a ;} $D062 = 40h ROM0:1ECE F5 push af ROM0:1ECF FA 77 D0 ld a,(D077) ROM0:1ED2 CD 4A 2F call 2F4A ROM0:1ED5 F1 pop af ROM0:1ED6 38 33 jr c,1F0B ROM0:1ED8 F0 C2 ld a,(FF00+C2) ROM0:1EDA C6 14 add a,14 ROM0:1EDC EA 04 C2 ld (C204),a ROM0:1EDF CD F5 1F call 1FF5 ROM0:1EE2 21 56 D0 ld hl,D056 ROM0:1EE5 BE cp (hl) ROM0:1EE6 26 DC ld h,DC ROM0:1EE8 6F ld l,a ROM0:1EE9 7E ld a,(hl) ROM0:1EEA CB 47 bit 0,a ROM0:1EEC 28 06 jr z,1EF4 ROM0:1EEE 3E FF ld a,FF ROM0:1EF0 EA 48 D0 ld (D048),a ROM0:1EF3 7E ld a,(hl) ROM0:1EF4 CB 4F bit 1,a ROM0:1EF6 28 01 jr z,1EF9 ROM0:1EF8 3F ccf ROM0:1EF9 7E ld a,(hl) ROM0:1EFA CB 67 bit 4,a ROM0:1EFC 28 0D jr z,1F0B ROM0:1EFE 3E 40 ld a,40 ;\ ROM0:1F00 EA 62 D0 ld (D062),a ;} $D062 = 40h ROM0:1F03 F5 push af ROM0:1F04 FA 77 D0 ld a,(D077) ROM0:1F07 CD 4A 2F call 2F4A ROM0:1F0A F1 pop af ROM0:1F0B C1 pop bc ROM0:1F0C D1 pop de ROM0:1F0D E1 pop hl ROM0:1F0E C9 ret } ;;; $1F0F: ;;; { ; Called by turning, standing, running, crouching, morphball, and $1D4E ROM0:1F0F E5 push hl ROM0:1F10 D5 push de ROM0:1F11 C5 push bc ROM0:1F12 CD 8D 34 call 348D ROM0:1F15 30 15 jr nc,1F2C ROM0:1F17 3E 01 ld a,01 ROM0:1F19 EA 3A C4 ld (C43A),a ROM0:1F1C 7D ld a,l ROM0:1F1D EA 5E D0 ld (D05E),a ROM0:1F20 7C ld a,h ROM0:1F21 EA 5F D0 ld (D05F),a ROM0:1F24 3E 20 ld a,20 ROM0:1F26 EA 5D D0 ld (D05D),a ROM0:1F29 C3 BB 1F jp 1FBB ROM0:1F2C F0 C2 ld a,(FF00+C2) ROM0:1F2E C6 0C add a,0C ROM0:1F30 EA 04 C2 ld (C204),a ROM0:1F33 F0 C0 ld a,(FF00+C0) ROM0:1F35 C6 2C add a,2C ROM0:1F37 EA 03 C2 ld (C203),a ROM0:1F3A CD F5 1F call 1FF5 ROM0:1F3D 21 56 D0 ld hl,D056 ROM0:1F40 BE cp (hl) ROM0:1F41 26 DC ld h,DC ROM0:1F43 6F ld l,a ROM0:1F44 7E ld a,(hl) ROM0:1F45 CB 47 bit 0,a ROM0:1F47 28 05 jr z,1F4E ROM0:1F49 3E 31 ld a,31 ROM0:1F4B EA 48 D0 ld (D048),a ROM0:1F4E 7E ld a,(hl) ROM0:1F4F CB 7F bit 7,a ROM0:1F51 28 05 jr z,1F58 ROM0:1F53 3E FF ld a,FF ROM0:1F55 EA 7D D0 ld (D07D),a ROM0:1F58 7E ld a,(hl) ROM0:1F59 CB 57 bit 2,a ROM0:1F5B 28 05 jr z,1F62 ROM0:1F5D FA 20 D0 ld a,(D020) ROM0:1F60 37 scf ROM0:1F61 3F ccf ROM0:1F62 7E ld a,(hl) ROM0:1F63 CB 67 bit 4,a ROM0:1F65 28 0D jr z,1F74 ROM0:1F67 3E 40 ld a,40 ;\ ROM0:1F69 EA 62 D0 ld (D062),a ;} $D062 = 40h ROM0:1F6C F5 push af ROM0:1F6D FA 77 D0 ld a,(D077) ROM0:1F70 CD 4A 2F call 2F4A ROM0:1F73 F1 pop af ROM0:1F74 38 45 jr c,1FBB ROM0:1F76 F0 C2 ld a,(FF00+C2) ROM0:1F78 C6 14 add a,14 ROM0:1F7A EA 04 C2 ld (C204),a ROM0:1F7D CD F5 1F call 1FF5 ROM0:1F80 21 56 D0 ld hl,D056 ROM0:1F83 BE cp (hl) ROM0:1F84 26 DC ld h,DC ROM0:1F86 6F ld l,a ROM0:1F87 7E ld a,(hl) ROM0:1F88 CB 47 bit 0,a ROM0:1F8A 28 05 jr z,1F91 ROM0:1F8C 3E FF ld a,FF ROM0:1F8E EA 48 D0 ld (D048),a ROM0:1F91 7E ld a,(hl) ROM0:1F92 CB 7F bit 7,a ROM0:1F94 28 05 jr z,1F9B ROM0:1F96 3E FF ld a,FF ROM0:1F98 EA 7D D0 ld (D07D),a ROM0:1F9B 7E ld a,(hl) ROM0:1F9C CB 57 bit 2,a ROM0:1F9E 28 02 jr z,1FA2 ROM0:1FA0 37 scf ROM0:1FA1 3F ccf ROM0:1FA2 7E ld a,(hl) ROM0:1FA3 CB 67 bit 4,a ROM0:1FA5 28 0D jr z,1FB4 ROM0:1FA7 3E 40 ld a,40 ;\ ROM0:1FA9 EA 62 D0 ld (D062),a ;} $D062 = 40h ROM0:1FAC F5 push af ROM0:1FAD FA 77 D0 ld a,(D077) ROM0:1FB0 CD 4A 2F call 2F4A ROM0:1FB3 F1 pop af ROM0:1FB4 30 05 jr nc,1FBB ROM0:1FB6 3E 00 ld a,00 ROM0:1FB8 EA 49 D0 ld (D049),a ROM0:1FBB C1 pop bc ROM0:1FBC D1 pop de ROM0:1FBD E1 pop hl ROM0:1FBE C9 ret } ;;; $1FBF: ;;; { ROM0:1FBF CD F5 1F call 1FF5 ROM0:1FC2 21 56 D0 ld hl,D056 ROM0:1FC5 BE cp (hl) ROM0:1FC6 30 18 jr nc,1FE0 ROM0:1FC8 26 DC ld h,DC ROM0:1FCA 6F ld l,a ROM0:1FCB 7E ld a,(hl) ROM0:1FCC CB 67 bit 4,a ROM0:1FCE 28 0B jr z,1FDB ROM0:1FD0 3E 40 ld a,40 ;\ ROM0:1FD2 EA 62 D0 ld (D062),a ;} $D062 = 40h ROM0:1FD5 FA 77 D0 ld a,(D077) ROM0:1FD8 CD 4A 2F call 2F4A ROM0:1FDB 37 scf ROM0:1FDC C9 ret ROM0:1FDD 37 scf ROM0:1FDE 3F ccf ROM0:1FDF C9 ret ROM0:1FE0 26 DC ld h,DC ROM0:1FE2 6F ld l,a ROM0:1FE3 7E ld a,(hl) ROM0:1FE4 CB 67 bit 4,a ROM0:1FE6 28 F5 jr z,1FDD ROM0:1FE8 3E 40 ld a,40 ;\ ROM0:1FEA EA 62 D0 ld (D062),a ;} $D062 = 40h ROM0:1FED FA 77 D0 ld a,(D077) ROM0:1FF0 CD 4A 2F call 2F4A ROM0:1FF3 18 E8 jr 1FDD } ;;; $1FF5: Get tilemap value and handle spike block ;;; { ROM0:1FF5 CD BC 22 call 22BC ; hl = tilemap address ROM0:1FF8 FA 19 C2 ld a,(C219) ;\ ROM0:1FFB E6 08 and 08 ;} If [game over LCD control] & 8 (BG tilemap base address bit): ROM0:1FFD 28 07 jr z,2006 ;/ ROM0:1FFF 3E 04 ld a,04 ;\ ROM0:2001 84 add a,h ;| ROM0:2002 67 ld h,a ;} hl += 400h ROM0:2003 EA 16 C2 ld (C216),a ;/ ROM0:2006 F0 41 ld a,(FF00+41) ;\ ROM0:2008 E6 03 and 03 ;} Wait for h-blank ROM0:200A 20 FA jr nz,2006 ;/ ROM0:200C 46 ld b,(hl) ; b = [[hl]] ROM0:200D F0 41 ld a,(FF00+41) ;\ ROM0:200F E6 03 and 03 ;} Wait for h-blank ROM0:2011 20 FA jr nz,200D ;/ ROM0:2013 7E ld a,(hl) ;\ ROM0:2014 A0 and b ;} b &= [[hl]] ROM0:2015 47 ld b,a ;/ ROM0:2016 FA 4F D0 ld a,(D04F) ;\ ROM0:2019 A7 and a ;} If [invincibility timer] != 0: go to BRANCH_RETURN ROM0:201A 20 1D jr nz,2039 ;/ ROM0:201C 26 DC ld h,DC ;\ ROM0:201E 78 ld a,b ;| ROM0:201F 6F ld l,a ;| ROM0:2020 7E ld a,(hl) ;} If [b] is not a spike: go to BRANCH_RETURN ROM0:2021 CB 5F bit 3,a ;| ROM0:2023 28 14 jr z,2039 ;/ ROM0:2025 3E 04 ld a,04 ;\ ROM0:2027 EA C0 CE ld (CEC0),a ;} Play hurt by spike sound effect ROM0:202A 3E 01 ld a,01 ;\ ROM0:202C EA 22 C4 ld (C422),a ;} Set damage boost flag ROM0:202F AF xor a ;\ ROM0:2030 EA 23 C4 ld (C423),a ;} Damage boost direction = up ROM0:2033 FA 78 D0 ld a,(D078) ;\ ROM0:2036 EA 24 C4 ld (C424),a ;} $C424 = [spike damage] ; BRANCH_RETURN ROM0:2039 78 ld a,b ; a = [b] ROM0:203A C9 ret } } ;;; $203B: Real number of metroids -> metroids remaining in area ;;; { ; Real number of metroids is in BCD for whatever reason, hence the padding ; 0 1 2 3 4 5 6 7 8 9 ROM0:203B db FF, FF, FF, FF, FF, FF, FF, FF, FF, FF, 00, 00, 00, 00, 00, 00, ; 0 01, 02, 03, 01, 01, 01, 02, 03, 04, 05, 00, 00, 00, 00, 00, 00, ; 10h 06, 07, 01, 02, 01, 01, 02, 03, 04, 05, 00, 00, 00, 00, 00, 00, ; 20h 06, 07, 08, 09, 10, 01, 02, 03, 04, 05, 00, 00, 00, 00, 00, 00, ; 30h 06, 07, 08, 01, 02, 03, 04, 01 ; 40h } ;;; $2083: First 8 bytes of save SRAM ;;; { ROM0:2083 db 01 23 45 67 89 AB CD EF } ;;; $208B: Samus' pose damage transition table ;;; { ROM0:208B db 0F, ; 00: Standing 0F, ; 01: Jumping 0F, ; 02: Spin-jumping 0F, ; 03: Running (set to 83h when turning) 0F, ; 04: Crouching 10, ; 05: Morphball 10, ; 06: Morphball jumping 0F, ; 07: Falling 10, ; 08: Morphball falling 0F, ; 09: Starting to jump 0F, ; 0A: Starting to spin-jump 10, ; 0B: Spider ball rolling 10, ; 0C: Spider ball falling 10, ; 0D: Spider ball jumping 10, ; 0E: Spider ball 0F, ; 0F: Knockback 10, ; 10: Morphball knockback 0F, ; 11: Standing bombed 10, ; 12: Morphball bombed 0F, ; 13: Facing screen 00, 00, 00, 00, 10, ; 18: Being eaten by Metroid Queen 10, ; 19: In Metroid Queen's mouth 1A, ; 1A: Being swallowed by Metroid Queen 1B, ; 1B: In Metroid Queen's stomach 1C, ; 1C: Escaping Metroid Queen 1D ; 1D: Escaped Metroid Queen } ;;; $20A9: Spider ball direction tables ;;; { ; _____________________________________________________________ 0: In air ; | _________________________________________________________ 1: On bottom-left corner of ledge ; | | _____________________________________________________ 2: On top-left corner of ledge ; | | | _________________________________________________ 3: On left-facing wall ; | | | | _____________________________________________ 4: On bottom-right corner of ledge ; | | | | | _________________________________________ 5: On ceiling ; | | | | | | _____________________________________ 6: Unused ; | | | | | | | _________________________________ 7: On meet of left-facing wall and ceiling ; | | | | | | | | _____________________________ 8: On top-right corner of ledge ; | | | | | | | | | _________________________ 9: Unused ; | | | | | | | | | | _____________________ Ah: On floor ; | | | | | | | | | | | _________________ Bh: On meet of left-facing wall and floor ; | | | | | | | | | | | | _____________ Ch: On right-facing wall ; | | | | | | | | | | | | | _________ Dh: On meet of right-facing wall and ceiling ; | | | | | | | | | | | | | | _____ Eh: On meet of right-facing wall and floor ; | | | | | | | | | | | | | | | _ Fh: Unused ; | | | | | | | | | | | | | | | | ROM0:20A9 db 00, 04, 01, 04, 02, 02, 00, 02, 08, 00, 01, 04, 08, 08, 01, 00 ; Anti-clockwise ROM0:20B9 db 00, 02, 04, 02, 08, 08, 00, 08, 01, 00, 04, 02, 01, 01, 04, 00 ; Anti-clockwise ROM0:20C9 db 00, 01, 08, 08, 04, 01, 00, 08, 02, 00, 02, 02, 04, 01, 04, 00 ; Clockwise ROM0:20D9 db 00, 08, 02, 02, 01, 08, 00, 02, 04, 00, 04, 04, 01, 08, 01, 00 ; Clockwise } ;;; $20E9: ;;; { ROM0:20E9 db 08, ; 00: Standing 14, ; 01: Jumping 1A, ; 02: Spin-jumping 08, ; 03: Running (set to 83h when turning) 10, ; 04: Crouching 20, ; 05: Morphball 20, ; 06: Morphball jumping 10, ; 07: Falling 20, ; 08: Morphball falling 10, ; 09: Starting to jump 10, ; 0A: Starting to spin-jump 20, ; 0B: Spider ball rolling 20, ; 0C: Spider ball falling 20, ; 0D: Spider ball jumping 20, ; 0E: Spider ball 10, ; 0F: Knockback 20, ; 10: Morphball knockback 10, ; 11: Standing bombed 20, ; 12: Morphball bombed 08, ; 13: Facing screen 20, 20 } ;;; $20FF: ;;; { ROM0:20FF db 10,18,20,28,2A,80,00,00, ; 00: Standing 14,18,20,28,2A,80,00,00, ; 01: Jumping 1A,20,28,2A,80,00,00,00, ; 02: Spin-jumping 10,18,20,28,2A,80,00,00, ; 03: Running (set to 83h when turning) 10,18,20,28,2A,80,00,00, ; 04: Crouching 20,25,2A,80,00,00,00,00, ; 05: Morphball 20,25,2A,80,00,00,00,00, ; 06: Morphball jumping 10,18,20,28,2A,80,00,00, ; 07: Falling 20,25,2A,80,00,00,00,00, ; 08: Morphball falling 10,18,20,28,2A,80,00,00, ; 09: Starting to jump 10,18,20,28,2A,80,00,00, ; 0A: Starting to spin-jump 20,25,2B,80,00,00,00,00, ; 0B: Spider ball rolling 20,25,2B,80,00,00,00,00, ; 0C: Spider ball falling 20,25,2B,80,00,00,00,00, ; 0D: Spider ball jumping 20,25,2B,80,00,00,00,00, ; 0E: Spider ball 14,18,20,28,2A,80,00,00, ; 0F: Knockback 20,25,2A,80,00,00,00,00, ; 10: Morphball knockback 10,18,20,28,2A,80,00,00, ; 11: Standing bombed 20,25,2A,80,00,00,00,00, ; 12: Morphball bombed 10,18,20,28,2A,80,00,00, ; 13: Facing screen 00,00,00,00,00,00,00,00, 00,00,00,00,00,00,00,00, 00,00,00,00,00,00,00,00, 00,00,00,00,00,00,00,00, 20,25,2A,80,00,00,00,00, ; 18: Being eaten by Metroid Queen 20,25,2A,80,00,00,00,00, ; 19: In Metroid Queen's mouth 20,25,2A,80,00,00,00,00, ; 1A: Being swallowed by Metroid Queen 20,25,2A,80,00,00,00,00, ; 1B: In Metroid Queen's stomach 20,25,2A,80,00,00,00,00, ; 1C: Escaping Metroid Queen 20,25,2A,80,00,00,00,00 ; 1D: Escaped Metroid Queen } ;;; $21EF: Reset projectile and bomb data (unit) ;;; { ; Called by $0CA3 ROM0:21EF 26 DD ld h,DD ROM0:21F1 2E 00 ld l,00 ROM0:21F3 3E FF ld a,FF ROM0:21F5 22 ldi (hl),a ROM0:21F6 7D ld a,l ROM0:21F7 A7 and a ROM0:21F8 20 F9 jr nz,21F3 ROM0:21FA C9 ret } ;;; $21FB: Handle toggling missiles and firing a projectile ;;; { ROM0:21FB FA 20 D0 ld a,(D020) ;\ ROM0:21FE FE 13 cp 13 ;} If Samus' pose is facing screen: go to handle firing a projectile ROM0:2200 CA AF 3D jp z,3DAF ;/ ROM0:2203 FA 90 D0 ld a,(D090) ;\ ROM0:2206 FE 22 cp 22 ;} If Metroid Queen is dying: go to handle firing a projectile ROM0:2208 CA AF 3D jp z,3DAF ;/ ROM0:220B F0 81 ld a,(FF00+81) ;\ ROM0:220D CB 57 bit 2,a ;} If not newly pressing s: go to handle firing a projectile ROM0:220F CA AF 3D jp z,3DAF ;/ } ;;; $2212: Toggle missiles ;;; { ROM0:2212 FA 4D D0 ld a,(D04D) ;\ ROM0:2215 FE 08 cp 08 ;} If missile equipped: ROM0:2217 20 12 jr nz,222B ;/ ROM0:2219 FA 55 D0 ld a,(D055) ;\ ROM0:221C EA 4D D0 ld (D04D),a ;} Weapon equipped = [Samus' beam] ROM0:221F 21 49 22 ld hl,2249 ; hl = $2249 ROM0:2222 CD 53 27 call 2753 ; Screen command - load graphics - load graphics ROM0:2225 3E 15 ld a,15 ;\ ROM0:2227 EA C0 CE ld (CEC0),a ;} Play missile select sound effect ROM0:222A C9 ret ROM0:222B FA 4D D0 ld a,(D04D) ;\ ROM0:222E EA 55 D0 ld (D055),a ;} Samus' beam = [weapon equipped] ROM0:2231 3E 08 ld a,08 ;\ ROM0:2233 EA 4D D0 ld (D04D),a ;} Equipt missiles ROM0:2236 21 42 22 ld hl,2242 ; hl = $2242 ROM0:2239 CD 53 27 call 2753 ; Screen command - load graphics - load graphics ROM0:223C 3E 15 ld a,15 ;\ ROM0:223E EA C0 CE ld (CEC0),a ;} Play missile select sound effect ROM0:2241 C9 ret } ;;; $2242: Arm cannon VRAM update entries ;;; { ; ___________________ Bank ; | _______________ Sounce ; | | _________ Destination ; | | | ___ Size ; | | | | ROM0:2242 db 06, 4020, 8080, 0020 ; Missiles out ROM0:2249 db 06, 4000, 8080, 0020 ; Beam out } ;;; $2250: ;;; { ROM0:2250 FA 05 C2 ld a,(C205) ;\ ROM0:2253 47 ld b,a ;| ROM0:2254 FA 4D C4 ld a,(C44D) ;} Tile Y = [scroll Y] + [$C44D] ROM0:2257 80 add a,b ;| ROM0:2258 EA 03 C2 ld (C203),a ;/ ROM0:225B FA 06 C2 ld a,(C206) ;\ ROM0:225E 47 ld b,a ;| ROM0:225F FA 4E C4 ld a,(C44E) ;} Tile X = [scroll X] + [$C44E] ROM0:2262 80 add a,b ;| ROM0:2263 EA 04 C2 ld (C204),a ;/ } ;;; $2266: Get tilemap value ;;; { ; Not sure why this routine is loading the tilemap value twice... ROM0:2266 CD BC 22 call 22BC ; Get tilemap address ROM0:2269 FA 19 C2 ld a,(C219) ;\ ROM0:226C E6 08 and 08 ;} If [game over LCD control] & 8 (BG tilemap base address bit): ROM0:226E 28 07 jr z,2277 ;/ ROM0:2270 3E 04 ld a,04 ;\ ROM0:2272 84 add a,h ;| ROM0:2273 67 ld h,a ;} Tilemap address += 400h ROM0:2274 EA 16 C2 ld (C216),a ;/ ROM0:2277 F0 41 ld a,(FF00+41) ;\ ROM0:2279 E6 03 and 03 ;} Wait for h-blank ROM0:227B 20 FA jr nz,2277 ;/ ROM0:227D 46 ld b,(hl) ; b = [tilemap address] ROM0:227E F0 41 ld a,(FF00+41) ;\ ROM0:2280 E6 03 and 03 ;} Wait for h-blank ROM0:2282 20 FA jr nz,227E ;/ ROM0:2284 7E ld a,(hl) ; a = [tilemap address] ROM0:2285 A0 and b ; a &= [b] ROM0:2286 C9 ret } ;;; $2287: Update buttons (unit) ;;; { ; Called by boot ROM0:2287 3E 20 ld a,20 ;\ ROM0:2289 E0 00 ld (FF00+00),a ;| ROM0:228B F0 00 ld a,(FF00+00) ;| ROM0:228D F0 00 ld a,(FF00+00) ;| ROM0:228F 2F cpl ;| ROM0:2290 E6 0F and 0F ;| ROM0:2292 CB 37 swap a ;| ROM0:2294 47 ld b,a ;| ROM0:2295 3E 10 ld a,10 ;| ROM0:2297 E0 00 ld (FF00+00),a ;| ROM0:2299 F0 00 ld a,(FF00+00) ;| ROM0:229B F0 00 ld a,(FF00+00) ;} c = face buttons | directions << 4 ROM0:229D F0 00 ld a,(FF00+00) ;| ROM0:229F F0 00 ld a,(FF00+00) ;| ROM0:22A1 F0 00 ld a,(FF00+00) ;| ROM0:22A3 F0 00 ld a,(FF00+00) ;| ROM0:22A5 F0 00 ld a,(FF00+00) ;| ROM0:22A7 F0 00 ld a,(FF00+00) ;| ROM0:22A9 2F cpl ;| ROM0:22AA E6 0F and 0F ;| ROM0:22AC B0 or b ;| ROM0:22AD 4F ld c,a ;/ ROM0:22AE F0 80 ld a,(FF00+80) ;\ ROM0:22B0 A9 xor c ;| ROM0:22B1 A1 and c ;} Update new buttons ROM0:22B2 E0 81 ld (FF00+81),a ;/ ROM0:22B4 79 ld a,c ;\ ROM0:22B5 E0 80 ld (FF00+80),a ;} Update buttons ROM0:22B7 3E 30 ld a,30 ;\ ROM0:22B9 E0 00 ld (FF00+00),a ;} Reset joypad ROM0:22BB C9 ret } ;;; $22BC: Get tilemap address (unit) ;;; { ; Called by $1FF5, $2242, $1:56E9, $1:5712, $1:5742, $1:5769, and $5:593E ; All throughout this engine, Y positions are added 10 and X positions are added 8; no idea why, but this routine accounts for it... ROM0:22BC FA 03 C2 ld a,(C203) ;\ ROM0:22BF D6 10 sub 10 ;| ROM0:22C1 06 08 ld b,08 ;| ROM0:22C3 11 20 00 ld de,0020 ;| ROM0:22C6 21 E0 97 ld hl,97E0 ;| ;| ROM0:22C9 19 add hl,de ;| ROM0:22CA 90 sub b ;| ROM0:22CB 30 FC jr nc,22C9 ;| ROM0:22CD FA 04 C2 ld a,(C204) ;} $C215 = $9800 + ([$C203] - 10h) / 8 * 20h + ([$C204] - 8) / 8 ROM0:22D0 90 sub b ;| ROM0:22D1 CB 3F srl a ;| ROM0:22D3 CB 3F srl a ;| ROM0:22D5 CB 3F srl a ;| ROM0:22D7 85 add a,l ;| ROM0:22D8 6F ld l,a ;| ROM0:22D9 EA 15 C2 ld (C215),a ;| ROM0:22DC 7C ld a,h ;| ROM0:22DD EA 16 C2 ld (C216),a ;/ ROM0:22E0 C9 ret } ;;; $22E1: (unit) ;;; { ; Seems unused, maybe used to decompose a tile address into (X,Y)? ROM0:22E1 FA 16 C2 ld a,(C216) ;\ ROM0:22E4 57 ld d,a ;| ROM0:22E5 FA 15 C2 ld a,(C215) ;| ROM0:22E8 5F ld e,a ;| ROM0:22E9 06 04 ld b,04 ;| ;| ROM0:22EB CB 1A rr d ;| ROM0:22ED CB 1B rr e ;| ROM0:22EF 05 dec b ;} Tile Y = ((([$C215] >> 4 & FFh) - 84h & FEh) rotate left 2) + 8 ROM0:22F0 20 F9 jr nz,22EB ;| ROM0:22F2 7B ld a,e ;| ROM0:22F3 D6 84 sub 84 ;| ROM0:22F5 E6 FE and FE ;| ROM0:22F7 07 rlca ;| ROM0:22F8 07 rlca ;| ROM0:22F9 C6 08 add a,08 ;| ROM0:22FB EA 03 C2 ld (C203),a ;/ ROM0:22FE FA 15 C2 ld a,(C215) ;\ ROM0:2301 E6 1F and 1F ;| ROM0:2303 17 rla ;| ROM0:2304 17 rla ;} Tile X = (([$C215] & 1Fh) rotate left 3) + 8 ROM0:2305 17 rla ;| ROM0:2306 C6 08 add a,08 ;| ROM0:2308 EA 04 C2 ld (C204),a ;/ ROM0:230B C9 ret } ;;; $230C: (unit) ;;; { ; Seems unused. If [$C227]: write nybbles from [[de]]..[[de]-2] to [hl]..[hl]+5 where leading zeroes are converted to FFh ; Seems to be processing for the tilemap to display BCD time ROM0:230C FA 27 C2 ld a,(C227) ;\ ROM0:230F A7 and a ;} If [$C227] = 0: return ROM0:2310 C8 ret z ;/ ROM0:2311 0E 03 ld c,03 ; c = 3 ROM0:2313 AF xor a ;\ ROM0:2314 EA 27 C2 ld (C227),a ;} $C227 = 0 ; LOOP_ALPHA ROM0:2317 1A ld a,(de) ;\ ROM0:2318 47 ld b,a ;} b = [[de]] ROM0:2319 CB 37 swap a ;\ ROM0:231B E6 0F and 0F ;} a = [b] >> 4 ROM0:231D 20 2B jr nz,234A ; If [a]: go to BRANCH_GAMMA ROM0:231F FA 27 C2 ld a,(C227) ;\ ROM0:2322 A7 and a ;| ROM0:2323 3E 00 ld a,00 ;} If [$C227]: a = 0 ROM0:2325 20 02 jr nz,2329 ;/ ROM0:2327 3E FF ld a,FF ; Else: a = FFh ; BRANCH_ALPHA ROM0:2329 22 ldi (hl),a ; [hl++] = [a] ROM0:232A 78 ld a,b ;\ ROM0:232B E6 0F and 0F ;} a = [b] & Fh ROM0:232D 20 24 jr nz,2353 ; If [a]: go to BRANCH_DELTA ROM0:232F FA 27 C2 ld a,(C227) ;\ ROM0:2332 A7 and a ;| ROM0:2333 3E 00 ld a,00 ;} If [$C227]: a = 0 ROM0:2335 20 09 jr nz,2340 ;/ ROM0:2337 3E 01 ld a,01 ;\ ROM0:2339 B9 cp c ;| ROM0:233A 3E 00 ld a,00 ;} Else if [c] = 1: a = 0 ROM0:233C 28 02 jr z,2340 ;/ ROM0:233E 3E FF ld a,FF ; Else: a = FFh ; BRANCH_BETA ROM0:2340 22 ldi (hl),a ; [hl++] = a ROM0:2341 1D dec e ; --e ROM0:2342 0D dec c ;\ ROM0:2343 20 D2 jr nz,2317 ;} If --c != 0: go to LOOP_ALPHA ROM0:2345 AF xor a ;\ ROM0:2346 EA 27 C2 ld (C227),a ;} $C227 = 0 ROM0:2349 C9 ret ; BRANCH_GAMMA ROM0:234A F5 push af ROM0:234B 3E 01 ld a,01 ;\ ROM0:234D EA 27 C2 ld (C227),a ;} $C227 = 1 ROM0:2350 F1 pop af ROM0:2351 18 D6 jr 2329 ; Go to BRANCH_ALPHA ; BRANCH_DELTA ROM0:2353 F5 push af ROM0:2354 3E 01 ld a,01 ;\ ROM0:2356 EA 27 C2 ld (C227),a ;} $C227 = 1 ROM0:2359 F1 pop af ROM0:235A 18 E4 jr 2340 ; Go to BRANCH_BETA } ;;; $235C: OAM DMA (unit) ;;; { ROM0:235C 3E C0 ld a,C0 ROM0:235E E0 46 ld (FF00+46),a ;lcd dma ROM0:2360 3E 28 ld a,28 ROM0:2362 3D dec a ROM0:2363 20 FD jr nz,2362 ROM0:2365 C9 ret } ;;; $2366: Calculate scroll offsets ;;; { ROM0:2366 F0 C8 ld a,(FF00+C8) ;\ ROM0:2368 D6 48 sub 48 ;} Scroll Y = [screen Y position] - 48h ROM0:236A EA 05 C2 ld (C205),a ;/ ROM0:236D F0 CA ld a,(FF00+CA) ;\ ROM0:236F D6 50 sub 50 ;} Scroll X = [screen X position] - 50h ROM0:2371 EA 06 C2 ld (C206),a ;/ ROM0:2374 CD ED 3C call 3CED ; Handle earthquake ROM0:2377 C9 ret } ;;; $2378: Initialise audio ;;; { ROM0:2378 3E 04 ld a,04 ROM0:237A EA 4E D0 ld (D04E),a ROM0:237D EA 00 21 ld (2100),a ROM0:2380 CD 06 40 call 4006 ROM0:2383 C9 ret } ;;; $2384: Handle audio ;;; { ROM0:2384 3E 04 ld a,04 ROM0:2386 EA 4E D0 ld (D04E),a ROM0:2389 EA 00 21 ld (2100),a ROM0:238C CD 00 40 call 4000 ROM0:238F C9 ret } ;;; $2390: Clear sound effects and song ;;; { ROM0:2390 3E 04 ld a,04 ROM0:2392 EA 4E D0 ld (D04E),a ROM0:2395 EA 00 21 ld (2100),a ROM0:2398 CD 03 40 call 4003 ROM0:239B C9 ret } ;;; $239C: Handle screen transition command set ;;; { ; LOOP_ALPHA ROM0:239C FA 8E D0 ld a,(D08E) ;\ ROM0:239F 47 ld b,a ;| ROM0:23A0 FA 8F D0 ld a,(D08F) ;} If [screen transition command set index] = 0: go to BRANCH_RETURN ROM0:23A3 B0 or b ;| ROM0:23A4 CA D7 26 jp z,26D7 ;/ ROM0:23A7 FA 64 D0 ld a,(D064) ;\ ROM0:23AA E0 8D ld (FF00+8D),a ;} OAM stack pointer = [$D064] ROM0:23AC CD 88 3E call 3E88 ; Clear deleted OAM ROM0:23AF CD 5E 2C call 2C5E ; Wait a frame ROM0:23B2 CD A0 FF call FFA0 ; OAM DMA ROM0:23B5 3E 05 ld a,05 ;\ ROM0:23B7 EA 4E D0 ld (D04E),a ;} Bank = 5 ROM0:23BA EA 00 21 ld (2100),a ;/ ROM0:23BD FA 8E D0 ld a,(D08E) ;\ ROM0:23C0 5F ld e,a ;| ROM0:23C1 FA 8F D0 ld a,(D08F) ;| ROM0:23C4 57 ld d,a ;| ROM0:23C5 CB 23 sla e ;| ROM0:23C7 CB 12 rl d ;| ROM0:23C9 21 E5 42 ld hl,42E5 ;| ROM0:23CC 19 add hl,de ;} hl = [$42E5 + [screen transition command set index] * 2]] ROM0:23CD 2A ldi a,(hl) ;| ROM0:23CE 5F ld e,a ;| ROM0:23CF 7E ld a,(hl) ;| ROM0:23D0 67 ld h,a ;| ROM0:23D1 7B ld a,e ;| ROM0:23D2 6F ld l,a ;/ ROM0:23D3 06 40 ld b,40 ;\ ROM0:23D5 11 00 D7 ld de,D700 ;| ;| ROM0:23D8 2A ldi a,(hl) ;| ROM0:23D9 12 ld (de),a ;} $D700..3F = [[hl]..[hl]+3Fh] ROM0:23DA 13 inc de ;| ROM0:23DB 05 dec b ;| ROM0:23DC 20 FA jr nz,23D8 ;/ ROM0:23DE 21 00 D7 ld hl,D700 ; hl = $D700 ; LOOP_BETA ROM0:23E1 7E ld a,(hl) ;\ ROM0:23E2 FE FF cp FF ;| ROM0:23E4 C2 EB 23 jp nz,23EB ;} If [[hl]] = FFh: ROM0:23E7 23 inc hl ; ++hl ROM0:23E8 C3 D7 26 jp 26D7 ; Go to BRANCH_RETURN ROM0:23EB E6 F0 and F0 ;\ ROM0:23ED FE B0 cp B0 ;} If [[hl]] & F0h != B0h: go to BRANCH_GRAPHICS_LOAD_STANDARD_END ROM0:23EF 20 11 jr nz,2402 ;/ { ROM0:23F1 AF xor a ROM0:23F2 EA 88 D0 ld (D088),a ; $D088 = 0 ROM0:23F5 EA 7D D0 ld (D07D),a ; $D07D = 0 ROM0:23F8 3E 88 ld a,88 ;\ ROM0:23FA E0 4A ld (FF00+4A),a ;} Window Y = 88h (probably setting up status bar?) ROM0:23FC CD EB 26 call 26EB ; Screen command - load standard graphics ROM0:23FF C3 D1 26 jp 26D1 ; Go to BRANCH_NEXT } ; BRANCH_GRAPHICS_LOAD_STANDARD_END ROM0:2402 FE 00 cp 00 ;\ ROM0:2404 20 11 jr nz,2417 ;} If [[hl]] & F0h != 00: go to BRANCH_GRAPHICS_LOAD_END { ROM0:2406 AF xor a ROM0:2407 EA 88 D0 ld (D088),a ; $D088 = 0 ROM0:240A EA 7D D0 ld (D07D),a ; $D07D = 0 ROM0:240D 3E 88 ld a,88 ;\ ROM0:240F E0 4A ld (FF00+4A),a ;} Window Y = 88h ROM0:2411 CD 47 27 call 2747 ; Screen command - load graphics ROM0:2414 C3 D1 26 jp 26D1 ; Go to BRANCH_NEXT } ; BRANCH_GRAPHICS_LOAD_END ROM0:2417 FE 10 cp 10 ;\ ROM0:2419 20 06 jr nz,2421 ;} If [[hl]] & F0h = 10h: { ROM0:241B CD 2A 28 call 282A ; Screen command - load metatile definitions ROM0:241E C3 D1 26 jp 26D1 ; Go to BRANCH_NEXT } ROM0:2421 FE 20 cp 20 ;\ ROM0:2423 20 06 jr nz,242B ;} If [[hl]] & F0h = 20h: { ROM0:2425 CD 59 28 call 2859 ; Screen command - load tile properties ROM0:2428 C3 D1 26 jp 26D1 ; Go to BRANCH_NEXT } ROM0:242B FE 30 cp 30 ;\ ROM0:242D 20 30 jr nz,245F ;} If [[hl]] & F0h != 30h: go to BRANCH_SET_SOLID_BLOCK_THESHOLD_END { ROM0:242F 2A ldi a,(hl) ;\ ROM0:2430 E5 push hl ;} Save [hl] + 1 ROM0:2431 E6 0F and 0F ;\ ROM0:2433 5F ld e,a ;| ROM0:2434 16 00 ld d,00 ;| ROM0:2436 CB 23 sla e ;| ROM0:2438 CB 23 sla e ;| ROM0:243A 3E 08 ld a,08 ;} Bank = 8, hl = $7EFA + ([[hl]] & Fh) * 4 ROM0:243C EA 4E D0 ld (D04E),a ;| ROM0:243F EA 00 21 ld (2100),a ;| ROM0:2442 21 FA 7E ld hl,7EFA ;| ROM0:2445 19 add hl,de ;/ ROM0:2446 2A ldi a,(hl) ;\ ROM0:2447 EA 56 D0 ld (D056),a ;} $D812 = $D056 = [[hl]] ROM0:244A EA 12 D8 ld (D812),a ;/ ROM0:244D 2A ldi a,(hl) ;\ ROM0:244E EA 69 D0 ld (D069),a ;} $D813 = $D069 = [[hl + 1]] ROM0:2451 EA 13 D8 ld (D813),a ;/ ROM0:2454 2A ldi a,(hl) ;\ ROM0:2455 EA 8A D0 ld (D08A),a ;} $D814 = $D08A = [[hl + 2]] ROM0:2458 EA 14 D8 ld (D814),a ;/ ROM0:245B E1 pop hl ; Restore hl ROM0:245C C3 D1 26 jp 26D1 ; Go to BRANCH_NEXT } ; BRANCH_SET_SOLID_BLOCK_THESHOLD_END ROM0:245F FE 40 cp 40 ;\ ROM0:2461 20 13 jr nz,2476 ;} If [[hl]] & F0h != 40h: go to BRANCH_SET_SCREEN_POSITION_END { ROM0:2463 CD FB 28 call 28FB ; Screen command - set screen position ROM0:2466 3E 01 ld a,01 ;\ ROM0:2468 EA 58 C4 ld (C458),a ;} $C458 = 1 ROM0:246B FA 8B D0 ld a,(D08B) ;\ ROM0:246E E6 0F and 0F ;} $D08B &= Fh ROM0:2470 EA 8B D0 ld (D08B),a ;/ ROM0:2473 C3 D1 26 jp 26D1 ; Go to BRANCH_NEXT } ; BRANCH_SET_SCREEN_POSITION_END ROM0:2476 FE 50 cp 50 ;\ ROM0:2478 20 3E jr nz,24B8 ;} If [[hl]] & F0h != 50h: go to BRANCH_EPSILON { ; Used when exiting Metroid Queen's room ROM0:247A 23 inc hl ; ++hl ROM0:247B F0 FF ld a,(FF00+FF) ;\ ROM0:247D CB 8F res 1,a ;} Disable V-blank interrupt ROM0:247F E0 FF ld (FF00+FF),a ;/ ROM0:2481 3E D7 ld a,D7 ;\ ROM0:2483 E0 C0 ld (FF00+C0),a ;} Samus' Y position low = D7h ROM0:2485 3E 78 ld a,78 ;\ ROM0:2487 E0 C2 ld (FF00+C2),a ;} Samus' X position low = 78h ROM0:2489 3E C0 ld a,C0 ;\ ROM0:248B E0 C8 ld (FF00+C8),a ;} Screen Y position low = C0h ROM0:248D 3E 80 ld a,80 ;\ ROM0:248F E0 CA ld (FF00+CA),a ;} Screen X position low = 80h ROM0:2491 3E F0 ld a,F0 ;\ ROM0:2493 E0 B1 ld (FF00+B1),a ;| ROM0:2495 3E 40 ld a,40 ;} VRAM tiles update source address = $40F0 ROM0:2497 E0 B2 ld (FF00+B2),a ;/ ROM0:2499 3E 00 ld a,00 ;\ ROM0:249B E0 B3 ld (FF00+B3),a ;| ROM0:249D 3E 9C ld a,9C ;} VRAM tiles update dest address = window VRAM tilemap ROM0:249F E0 B4 ld (FF00+B4),a ;/ ROM0:24A1 3E 14 ld a,14 ;\ ROM0:24A3 E0 B5 ld (FF00+B5),a ;| ROM0:24A5 3E 00 ld a,00 ;} VRAM tiles update size = 0014h ROM0:24A7 E0 B6 ld (FF00+B6),a ;/ ROM0:24A9 3E 05 ld a,05 ;\ ROM0:24AB EA 65 D0 ld (D065),a ;} VRAM tiles update bank = 5 ROM0:24AE CD BA 27 call 27BA ; Execute subroutine $27BA ROM0:24B1 AF xor a ;\ ROM0:24B2 EA 36 C4 ld (C436),a ;} $C436 = 0 ROM0:24B5 C3 D1 26 jp 26D1 ; Go to BRANCH_NEXT } ; BRANCH_EPSILON ROM0:24B8 FE 60 cp 60 ;\ ROM0:24BA 20 12 jr nz,24CE ;} If [[hl]] & F0h != 60h: go to BRANCH_SET_ENVIRONMENTAL_DAMAGE_END { ROM0:24BC 23 inc hl ;\ ROM0:24BD 2A ldi a,(hl) ;| ROM0:24BE EA 77 D0 ld (D077),a ;} $D81F = $D077 = [[++hl++]] ROM0:24C1 EA 1F D8 ld (D81F),a ;/ ROM0:24C4 2A ldi a,(hl) ;\ ROM0:24C5 EA 78 D0 ld (D078),a ;} $D820 = $D078 = [[hl++]] ROM0:24C8 EA 20 D8 ld (D820),a ;/ ROM0:24CB C3 D1 26 jp 26D1 ; Go to BRANCH_NEXT } ; BRANCH_SET_ENVIRONMENTAL_DAMAGE_END ROM0:24CE FE 70 cp 70 ;\ ROM0:24D0 20 38 jr nz,250A ;} If [[hl]] & F0h != 70h: go to BRANCH_ETA { ; Used when exiting Metroid Queen's room after killing her ROM0:24D2 23 inc hl ;\ ROM0:24D3 E5 push hl ;} Save ++hl ROM0:24D4 AF xor a ;\ ROM0:24D5 EA 8B D0 ld (D08B),a ;} Metroid Queen's room flag = 0 ROM0:24D8 3E 88 ld a,88 ;\ ROM0:24DA E0 4A ld (FF00+4A),a ;} Window Y = 88h ROM0:24DC 3E 07 ld a,07 ;\ ROM0:24DE E0 4B ld (FF00+4B),a ;} Window X = 0 ROM0:24E0 F0 FF ld a,(FF00+FF) ;\ ROM0:24E2 CB 8F res 1,a ;} Disable v-blank interrupts ROM0:24E4 E0 FF ld (FF00+FF),a ;/ ROM0:24E6 3E F0 ld a,F0 ;\ ROM0:24E8 E0 B1 ld (FF00+B1),a ;| ROM0:24EA 3E 40 ld a,40 ;} VRAM tiles update source address = $40F0 ROM0:24EC E0 B2 ld (FF00+B2),a ;/ ROM0:24EE 3E 00 ld a,00 ;\ ROM0:24F0 E0 B3 ld (FF00+B3),a ;| ROM0:24F2 3E 9C ld a,9C ;} VRAM tiles update dest address = window VRAM tilemap ROM0:24F4 E0 B4 ld (FF00+B4),a ;/ ROM0:24F6 3E 14 ld a,14 ;\ ROM0:24F8 E0 B5 ld (FF00+B5),a ;| ROM0:24FA 3E 00 ld a,00 ;} VRAM tiles update size = 0014h ROM0:24FC E0 B6 ld (FF00+B6),a ;/ ROM0:24FE 3E 05 ld a,05 ;\ ROM0:2500 EA 65 D0 ld (D065),a ;} VRAM tiles update bank = 5 ROM0:2503 CD BA 27 call 27BA ; Execute subroutine $27BA ROM0:2506 E1 pop hl ; Restore hl ROM0:2507 C3 D1 26 jp 26D1 ; Go to BRANCH_NEXT } ; BRANCH_ETA ROM0:250A FE 80 cp 80 ;\ ROM0:250C 20 32 jr nz,2540 ;} If [[hl]] & F0h != 80h: go to BRANCH_SET_SAMUS_POSITION_END { ROM0:250E AF xor a ROM0:250F EA 3B D0 ld (D03B),a ; $D03B = 0 ROM0:2512 EA 3C D0 ld (D03C),a ; $D03C = 0 ROM0:2515 E0 8D ld (FF00+8D),a ; OAM stack pointer = 0 ROM0:2517 EA A6 D0 ld (D0A6),a ; $D0A6 = 0 ROM0:251A 3E 02 ld a,02 ;\ ROM0:251C EA DC CE ld (CEDC),a ;} Play Metroid Queen battle song ROM0:251F E5 push hl ;\ ROM0:2520 CD CA 3E call 3ECA ;} Clear OAM ROM0:2523 E1 pop hl ;/ ROM0:2524 CD 5E 2C call 2C5E ; Wait a frame ROM0:2527 CD A0 FF call FFA0 ; OAM DMA ROM0:252A CD 87 28 call 2887 ; Screen command - set Samus position ROM0:252D 3E 01 ld a,01 ;\ ROM0:252F EA 58 C4 ld (C458),a ;} $C458 = 1 ROM0:2532 3E 11 ld a,11 ;\ ROM0:2534 EA 8B D0 ld (D08B),a ;} $D08B = 11h ROM0:2537 F0 FF ld a,(FF00+FF) ;\ ROM0:2539 CB CF set 1,a ;} Enable v-blank interrupts ROM0:253B E0 FF ld (FF00+FF),a ;/ ROM0:253D C3 D1 26 jp 26D1 ; Go to BRANCH_NEXT } ; BRANCH_SET_SAMUS_POSITION_END ROM0:2540 FE 90 cp 90 ;\ ROM0:2542 20 19 jr nz,255D ;} If [[hl]] & F0h != 90h: go to BRANCH_CONDITIONAL_METROIDS_REMAINING_END { ROM0:2544 23 inc hl ;\ ROM0:2545 FA 89 D0 ld a,(D089) ;| ROM0:2548 47 ld b,a ;| ROM0:2549 2A ldi a,(hl) ;} If [[++hl]] < [$D089]: ROM0:254A B8 cp b ;| ROM0:254B 30 05 jr nc,2552 ;/ ROM0:254D 23 inc hl ;\ ROM0:254E 23 inc hl ;} hl += 3 ROM0:254F C3 D1 26 jp 26D1 ; Go to BRANCH_NEXT ROM0:2552 2A ldi a,(hl) ;\ ROM0:2553 EA 8E D0 ld (D08E),a ;| ROM0:2556 7E ld a,(hl) ;} $D08E = [[++hl]] ROM0:2557 EA 8F D0 ld (D08F),a ;/ ROM0:255A C3 9C 23 jp 239C ; Go to LOOP_ALPHA } ; BRANCH_CONDITIONAL_METROIDS_REMAINING_END ; Wait 4 frames, then brighten palette every 10h frames for 30h frames ROM0:255D FE A0 cp A0 ;\ ROM0:255F 20 3D jr nz,259E ;} If [[hl]] & F0h != A0h: go to BRANCH_FADE_END { ROM0:2561 23 inc hl ;\ ROM0:2562 E5 push hl ;} Save ++hl ROM0:2563 CD 5E 2C call 2C5E ; Wait a frame ROM0:2566 CD 5E 2C call 2C5E ; Wait a frame ROM0:2569 CD 5E 2C call 2C5E ; Wait a frame ROM0:256C CD 5E 2C call 2C5E ; Wait a frame ROM0:256F 3E 2F ld a,2F ;\ ROM0:2571 EA 66 D0 ld (D066),a ;} Loading timer = 2Fh ; LOOP_GAMMA ROM0:2574 21 9B 25 ld hl,259B ;\ ROM0:2577 FA 66 D0 ld a,(D066) ;| ROM0:257A E6 F0 and F0 ;| ROM0:257C CB 37 swap a ;| ROM0:257E 5F ld e,a ;| ROM0:257F 16 00 ld d,00 ;} BG palette = object 0 palette = [$259B + [loading timer] / 20h] ROM0:2581 19 add hl,de ;| ROM0:2582 7E ld a,(hl) ;| ROM0:2583 EA 7E D0 ld (D07E),a ;| ROM0:2586 EA 7F D0 ld (D07F),a ;/ ROM0:2589 CD 5E 2C call 2C5E ; Wait a frame ROM0:258C FA 66 D0 ld a,(D066) ;\ ROM0:258F FE 0E cp 0E ;} If [loading timer] >= Eh: go to LOOP_GAMMA ROM0:2591 30 E1 jr nc,2574 ;/ ROM0:2593 E1 pop hl ; Restore hl ROM0:2594 AF xor a ;\ ROM0:2595 EA 66 D0 ld (D066),a ;} Loading timer = 0 ROM0:2598 C3 D1 26 jp 26D1 ; Go to BRANCH_NEXT ROM0:259B db FF, FB, E7 } ; BRANCH_FADE_END ROM0:259E FE C0 cp C0 ;\ ROM0:25A0 20 72 jr nz,2614 ;} If [[hl]] & F0h != C0h: go to BRANCH_SET_MUSIC_END { ROM0:25A2 FA DF CE ld a,(CEDF) ;\ ROM0:25A5 FE 0E cp 0E ;} If [isolated sound effect playing] = Eh (earthquake): go to BRANCH_MU ROM0:25A7 28 3B jr z,25E4 ;/ ROM0:25A9 2A ldi a,(hl) ;\ ROM0:25AA E6 0F and 0F ;} a = [[hl++]] & Fh ROM0:25AC FE 0A cp 0A ;\ ROM0:25AE 28 20 jr z,25D0 ;} If [a] = item-get: go to BRANCH_LAMBDA ROM0:25B0 EA DC CE ld (CEDC),a ; Play song [a] ROM0:25B3 EA 92 D0 ld (D092),a ; Room song = [a] ROM0:25B6 FE 0B cp 0B ;\ ROM0:25B8 20 0C jr nz,25C6 ;} If [a] = Metroid Queen hallway: ROM0:25BA 3E FF ld a,FF ;\ ROM0:25BC EA A6 D0 ld (D0A6),a ;} $D0A6 = FFh ROM0:25BF AF xor a ;\ ROM0:25C0 EA A5 D0 ld (D0A5),a ;} $D0A5 = 0 ROM0:25C3 C3 D1 26 jp 26D1 ; Go to BRANCH_NEXT ROM0:25C6 AF xor a ROM0:25C7 EA A5 D0 ld (D0A5),a ; $D0A5 = 0 ROM0:25CA EA A6 D0 ld (D0A6),a ; $D0A6 = 0 ROM0:25CD C3 D1 26 jp 26D1 ; Go to BRANCH_NEXT ; BRANCH_LAMBDA ROM0:25D0 3E FF ld a,FF ;\ ROM0:25D2 EA DC CE ld (CEDC),a ;} Play song FFh ROM0:25D5 EA 92 D0 ld (D092),a ; Room song = FFh ROM0:25D8 AF xor a ;\ ROM0:25D9 EA A5 D0 ld (D0A5),a ;} $D0A5 = 0 ROM0:25DC 3E FF ld a,FF ;\ ROM0:25DE EA A6 D0 ld (D0A6),a ;} $D0A6 = FFh ROM0:25E1 C3 D1 26 jp 26D1 ; Go to BRANCH_NEXT ; BRANCH_MU ROM0:25E4 2A ldi a,(hl) ;\ ROM0:25E5 E6 0F and 0F ;} a = [[hl++]] & Fh ROM0:25E7 FE 0A cp 0A ;\ ROM0:25E9 28 16 jr z,2601 ;} If [a] = item-get: go to BRANCH_NU ROM0:25EB EA A5 D0 ld (D0A5),a ; $D0A5 = [a] ROM0:25EE FE 0B cp 0B ;\ ROM0:25F0 20 08 jr nz,25FA ;} If [$D0A5] = Metroid Queen hallway ROM0:25F2 3E FF ld a,FF ;\ ROM0:25F4 EA A6 D0 ld (D0A6),a ;} $D0A6 = FFh ROM0:25F7 C3 D1 26 jp 26D1 ; Go to BRANCH_NEXT ROM0:25FA AF xor a ;\ ROM0:25FB EA A6 D0 ld (D0A6),a ;} $D0A6 = 0 ROM0:25FE C3 D1 26 jp 26D1 ; Go to BRANCH_NEXT ; BRANCH_NU ROM0:2601 3E FF ld a,FF ROM0:2603 EA A5 D0 ld (D0A5),a ; $D0A5 = FFh ROM0:2606 EA A6 D0 ld (D0A6),a ; $D0A6 = FFh ROM0:2609 C3 D1 26 jp 26D1 ; Go to BRANCH_NEXT } ; I don't see any reference to this... ROM0:260C db 04, 05, 06, 07, 08, 09, 10, 12 ; BRANCH_SET_MUSIC_END ROM0:2614 FE D0 cp D0 ;\ ROM0:2616 C2 D1 26 jp nz,26D1 ;} If [[hl]] & F0h != D0h: go to BRANCH_NEXT { ROM0:2619 3E 07 ld a,07 ;\ ROM0:261B EA 4E D0 ld (D04E),a ;| ROM0:261E EA 65 D0 ld (D065),a ;} Bank = VRAM tiles update bank = 7 ROM0:2621 EA 00 21 ld (2100),a ;/ ROM0:2624 7E ld a,(hl) ;\ ROM0:2625 E5 push hl ;| ROM0:2626 3D dec a ;| ROM0:2627 E6 0F and 0F ;| ROM0:2629 CB 37 swap a ;| ROM0:262B 5F ld e,a ;| ROM0:262C 16 00 ld d,00 ;| ROM0:262E CB 23 sla e ;| ROM0:2630 CB 12 rl d ;} VRAM tiles update source address = $7790 + ([[hl]] - 1 & Fh) * 40h ROM0:2632 CB 23 sla e ;| ROM0:2634 CB 12 rl d ;| ROM0:2636 21 90 77 ld hl,7790 ;| ROM0:2639 19 add hl,de ;| ROM0:263A 7D ld a,l ;| ROM0:263B E0 B1 ld (FF00+B1),a ;| ROM0:263D 7C ld a,h ;| ROM0:263E E0 B2 ld (FF00+B2),a ;/ ROM0:2640 3E 40 ld a,40 ;\ ROM0:2642 E0 B3 ld (FF00+B3),a ;| ROM0:2644 3E 8B ld a,8B ;} VRAM tiles update dest address = item tiles ROM0:2646 E0 B4 ld (FF00+B4),a ;/ ROM0:2648 3E 40 ld a,40 ;\ ROM0:264A E0 B5 ld (FF00+B5),a ;| ROM0:264C 3E 00 ld a,00 ;} VRAM tiles update size = 0040h ROM0:264E E0 B6 ld (FF00+B6),a ;/ ROM0:2650 CD BA 27 call 27BA ; Execute subroutine $27BA ROM0:2653 3E 50 ld a,50 ;\ ROM0:2655 E0 B1 ld (FF00+B1),a ;| ROM0:2657 3E 7A ld a,7A ;} VRAM tiles update source address = $7A50 ROM0:2659 E0 B2 ld (FF00+B2),a ;/ ROM0:265B 3E 00 ld a,00 ;\ ROM0:265D E0 B3 ld (FF00+B3),a ;| ROM0:265F 3E 8B ld a,8B ;} VRAM tiles update dest address = chozo orb tiles ROM0:2661 E0 B4 ld (FF00+B4),a ;/ ROM0:2663 3E 40 ld a,40 ;\ ROM0:2665 E0 B5 ld (FF00+B5),a ;| ROM0:2667 3E 00 ld a,00 ;} VRAM tiles update size = 0040h ROM0:2669 E0 B6 ld (FF00+B6),a ;/ ROM0:266B CD BA 27 call 27BA ; Execute subroutine $27BA ROM0:266E 3E 05 ld a,05 ;\ ROM0:2670 EA 4E D0 ld (D04E),a ;| ROM0:2673 EA 65 D0 ld (D065),a ;} Bank = VRAM tiles update bank = 5 ROM0:2676 EA 00 21 ld (2100),a ;/ ROM0:2679 3E 34 ld a,34 ;\ ROM0:267B E0 B1 ld (FF00+B1),a ;| ROM0:267D 3E 6C ld a,6C ;} VRAM tiles update source address = $6C34 ROM0:267F E0 B2 ld (FF00+B2),a ;/ ROM0:2681 3E 00 ld a,00 ;\ ROM0:2683 E0 B3 ld (FF00+B3),a ;| ROM0:2685 3E 8C ld a,8C ;} VRAM tiles update dest address = character tiles ROM0:2687 E0 B4 ld (FF00+B4),a ;/ ROM0:2689 3E 30 ld a,30 ;\ ROM0:268B E0 B5 ld (FF00+B5),a ;| ROM0:268D 3E 02 ld a,02 ;} VRAM tiles update size = 0230h ROM0:268F E0 B6 ld (FF00+B6),a ;/ ROM0:2691 CD BA 27 call 27BA ; Execute subroutine $27BA ROM0:2694 E1 pop hl ROM0:2695 3E 01 ld a,01 ;\ ROM0:2697 EA 4E D0 ld (D04E),a ;| ROM0:269A EA 65 D0 ld (D065),a ;} Bank = VRAM tiles update bank = 1 ROM0:269D EA 00 21 ld (2100),a ;/ ROM0:26A0 2A ldi a,(hl) ;\ ROM0:26A1 E5 push hl ;| ROM0:26A2 E6 0F and 0F ;| ROM0:26A4 5F ld e,a ;| ROM0:26A5 16 00 ld d,00 ;| ROM0:26A7 CB 23 sla e ;| ROM0:26A9 CB 12 rl d ;| ROM0:26AB 21 F1 58 ld hl,58F1 ;| ROM0:26AE 19 add hl,de ;| ROM0:26AF 2A ldi a,(hl) ;} VRAM tiles update source address = [$58F1 + ([[hl++]] & Fh) * 2] ROM0:26B0 5F ld e,a ;| ROM0:26B1 7E ld a,(hl) ;| ROM0:26B2 67 ld h,a ;| ROM0:26B3 7B ld a,e ;| ROM0:26B4 6F ld l,a ;| ROM0:26B5 7D ld a,l ;| ROM0:26B6 E0 B1 ld (FF00+B1),a ;| ROM0:26B8 7C ld a,h ;| ROM0:26B9 E0 B2 ld (FF00+B2),a ;/ ROM0:26BB 3E 20 ld a,20 ;\ ROM0:26BD E0 B3 ld (FF00+B3),a ;| ROM0:26BF 3E 9C ld a,9C ;} VRAM tiles update dest address = message tilemap ROM0:26C1 E0 B4 ld (FF00+B4),a ;/ ROM0:26C3 3E 10 ld a,10 ;\ ROM0:26C5 E0 B5 ld (FF00+B5),a ;| ROM0:26C7 3E 00 ld a,00 ;} VRAM tiles update size = 0010h ROM0:26C9 E0 B6 ld (FF00+B6),a ;/ ROM0:26CB CD BA 27 call 27BA ; Execute subroutine $27BA ROM0:26CE E1 pop hl ROM0:26CF 18 00 jr 26D1 } ; BRANCH_NEXT ROM0:26D1 CD 5E 2C call 2C5E ; Wait a frame ROM0:26D4 C3 E1 23 jp 23E1 ; Go to LOOP_BETA ; BRANCH_RETURN ROM0:26D7 FA 58 C4 ld a,(C458) ;\ ROM0:26DA EA 4B C4 ld (C44B),a ;} $C44B = [$C458] ROM0:26DD AF xor a ROM0:26DE EA 8E D0 ld (D08E),a ;\ ROM0:26E1 EA 8F D0 ld (D08F),a ;} Screen transition command set index = 0 ROM0:26E4 EA 58 C4 ld (C458),a ; $C458 = 0 ROM0:26E7 EA A8 D0 ld (D0A8),a ; $D0A8 = 0 ROM0:26EA C9 ret } ;;; $26EB: Screen command - load standard graphics ;;; { ; Called by handle screen transition command set ROM0:26EB 2A ldi a,(hl) ;\ ROM0:26EC E6 0F and 0F ;} b = [[hl++]] & Fh ROM0:26EE 47 ld b,a ;/ ROM0:26EF FE 01 cp 01 ;\ ROM0:26F1 28 29 jr z,271C ;} If [b] = 1: go to BRANCH_BACKGROUND ROM0:26F3 2A ldi a,(hl) ;\ ROM0:26F4 EA 4E D0 ld (D04E),a ;| ROM0:26F7 EA 65 D0 ld (D065),a ;} VRAM tiles update bank = bank = [hl++] ROM0:26FA EA 00 21 ld (2100),a ;/ ROM0:26FD 2A ldi a,(hl) ;\ ROM0:26FE E0 B1 ld (FF00+B1),a ;| ROM0:2700 EA 08 D8 ld (D808),a ;| ROM0:2703 2A ldi a,(hl) ;} Enemy tiles source address = VRAM tiles update source address = [[hl++]] ROM0:2704 E0 B2 ld (FF00+B2),a ;| ROM0:2706 EA 09 D8 ld (D809),a ;/ ROM0:2709 3E 00 ld a,00 ;\ ROM0:270B E0 B3 ld (FF00+B3),a ;| ROM0:270D 3E 8B ld a,8B ;} VRAM tiles update dest address = $8B00 ROM0:270F E0 B4 ld (FF00+B4),a ;/ ROM0:2711 3E 00 ld a,00 ;\ ROM0:2713 E0 B5 ld (FF00+B5),a ;| ROM0:2715 3E 04 ld a,04 ;} VRAM tiles update size = 400h ROM0:2717 E0 B6 ld (FF00+B6),a ;/ ROM0:2719 C3 BA 27 jp 27BA ; Go to $27BA ; BRANCH_BACKGROUND ROM0:271C 2A ldi a,(hl) ;\ ROM0:271D EA 4E D0 ld (D04E),a ;| ROM0:2720 EA 65 D0 ld (D065),a ;} Background tiles source bank = VRAM tiles update bank = bank = [[hl++]] ROM0:2723 EA 0A D8 ld (D80A),a ;| ROM0:2726 EA 00 21 ld (2100),a ;/ ROM0:2729 2A ldi a,(hl) ;\ ROM0:272A E0 B1 ld (FF00+B1),a ;| ROM0:272C EA 0B D8 ld (D80B),a ;| ROM0:272F 2A ldi a,(hl) ;} Background tiles source address = VRAM tiles update source address = [[hl++]] ROM0:2730 E0 B2 ld (FF00+B2),a ;| ROM0:2732 EA 0C D8 ld (D80C),a ;/ ROM0:2735 3E 00 ld a,00 ;\ ROM0:2737 E0 B3 ld (FF00+B3),a ;| ROM0:2739 3E 90 ld a,90 ;} VRAM tiles update dest address = $9000 ROM0:273B E0 B4 ld (FF00+B4),a ;/ ROM0:273D 3E 00 ld a,00 ;\ ROM0:273F E0 B5 ld (FF00+B5),a ;| ROM0:2741 3E 08 ld a,08 ;} VRAM tiles update size = 800h ROM0:2743 E0 B6 ld (FF00+B6),a ;/ ROM0:2745 18 73 jr 27BA ; Go to $27BA } ;;; $2747: Screen command - load graphics ;;; { ; I don't think this [b] is used anywhere ROM0:2747 2A ldi a,(hl) ROM0:2748 E6 0F and 0F ROM0:274A 47 ld b,a ROM0:274B FE 01 cp 01 ;\ ROM0:274D 28 22 jr z,2771 ;} If [[hl++]] & Fh = 1: go to $2771 ROM0:274F FE 02 cp 02 ;\ ROM0:2751 28 45 jr z,2798 ;} If [[hl]] & Fh = 2: go to $2798 } ;;; $2753: Screen command - load graphics - load graphics ;;; { ROM0:2753 2A ldi a,(hl) ;\ ROM0:2754 EA 4E D0 ld (D04E),a ;| ROM0:2757 EA 65 D0 ld (D065),a ;} VRAM tiles update bank = bank = [[hl++]] ROM0:275A EA 00 21 ld (2100),a ;/ ROM0:275D 2A ldi a,(hl) ;\ ROM0:275E E0 B1 ld (FF00+B1),a ;| ROM0:2760 2A ldi a,(hl) ;} VRAM tiles update source address = [[hl++++]] ROM0:2761 E0 B2 ld (FF00+B2),a ;/ ROM0:2763 2A ldi a,(hl) ;\ ROM0:2764 E0 B3 ld (FF00+B3),a ;| ROM0:2766 2A ldi a,(hl) ;} VRAM tiles update dest address = [[hl++++]] ROM0:2767 E0 B4 ld (FF00+B4),a ;/ ROM0:2769 2A ldi a,(hl) ;\ ROM0:276A E0 B5 ld (FF00+B5),a ;| ROM0:276C 2A ldi a,(hl) ;} VRAM tiles update size = [[hl++++]] ROM0:276D E0 B6 ld (FF00+B6),a ;/ ROM0:276F 18 49 jr 27BA ; Go to $27BA } ;;; $2771: Screen command - load graphics - load background graphics ;;; { ROM0:2771 2A ldi a,(hl) ;\ ROM0:2772 EA 4E D0 ld (D04E),a ;| ROM0:2775 EA 65 D0 ld (D065),a ;} Background tiles source bank = VRAM tiles update bank = bank = [[hl++]] ROM0:2778 EA 0A D8 ld (D80A),a ;| ROM0:277B EA 00 21 ld (2100),a ;/ ROM0:277E 2A ldi a,(hl) ;\ ROM0:277F E0 B1 ld (FF00+B1),a ;| ROM0:2781 EA 0B D8 ld (D80B),a ;| ROM0:2784 2A ldi a,(hl) ;} Background tiles source address = VRAM tiles update source address = [[hl++]] ROM0:2785 E0 B2 ld (FF00+B2),a ;| ROM0:2787 EA 0C D8 ld (D80C),a ;/ ROM0:278A 2A ldi a,(hl) ;\ ROM0:278B E0 B3 ld (FF00+B3),a ;| ROM0:278D 2A ldi a,(hl) ;} VRAM tiles update dest address = [[hl++]] ROM0:278E E0 B4 ld (FF00+B4),a ;/ ROM0:2790 2A ldi a,(hl) ;\ ROM0:2791 E0 B5 ld (FF00+B5),a ;| ROM0:2793 2A ldi a,(hl) ;} VRAM tiles update size = [[hl++]] ROM0:2794 E0 B6 ld (FF00+B6),a ;/ ROM0:2796 18 22 jr 27BA ; Go to $27BA } ;;; $2798: Screen command - load graphics - load enemy graphics ;;; { ROM0:2798 2A ldi a,(hl) ;\ ROM0:2799 EA 4E D0 ld (D04E),a ;| ROM0:279C EA 65 D0 ld (D065),a ;} VRAM tiles update bank = bank = [[hl++]] ROM0:279F EA 00 21 ld (2100),a ;/ ROM0:27A2 2A ldi a,(hl) ;\ ROM0:27A3 E0 B1 ld (FF00+B1),a ;| ROM0:27A5 EA 08 D8 ld (D808),a ;| ROM0:27A8 2A ldi a,(hl) ;} Enemy tiles source address = VRAM tiles update source address = [[hl++]] ROM0:27A9 E0 B2 ld (FF00+B2),a ;| ROM0:27AB EA 09 D8 ld (D809),a ;/ ROM0:27AE 2A ldi a,(hl) ;\ ROM0:27AF E0 B3 ld (FF00+B3),a ;| ROM0:27B1 2A ldi a,(hl) ;} VRAM tiles update dest address = [[hl++]] ROM0:27B2 E0 B4 ld (FF00+B4),a ;/ ROM0:27B4 2A ldi a,(hl) ;\ ROM0:27B5 E0 B5 ld (FF00+B5),a ;| ROM0:27B7 2A ldi a,(hl) ;} VRAM tiles update size = [[hl++]] ROM0:27B8 E0 B6 ld (FF00+B6),a ;/ } ;;; $27BA: ;;; { ; Wait for VRAM tiles update? ROM0:27BA 3E FF ld a,FF ;\ ROM0:27BC EA 47 D0 ld (D047),a ;} Set VRAM tiles update ; LOOP_ALPHA ROM0:27BF FA 8C D0 ld a,(D08C) ;\ ROM0:27C2 A7 and a ;} If [$D08C]: ROM0:27C3 28 14 jr z,27D9 ;/ ROM0:27C5 CD 93 3E call 3E93 ; Draw Samus ROM0:27C8 CD DE 05 call 05DE ; Handle enemies ROM0:27CB 3E 01 ld a,01 ;\ ROM0:27CD EA 4E D0 ld (D04E),a ;| ROM0:27D0 EA 00 21 ld (2100),a ;} Drawing blinking Metroid in HUD ROM0:27D3 CD 2C 4B call 4B2C ;/ ROM0:27D6 CD 88 3E call 3E88 ; Clear deleted OAM ROM0:27D9 CD 5E 2C call 2C5E ; Wait a frame ROM0:27DC FA 47 D0 ld a,(D047) ;\ ROM0:27DF A7 and a ;} If VRAM tiles update: go to LOOP_ALPHA ROM0:27E0 20 DD jr nz,27BF ;/ ROM0:27E2 C9 ret } ;;; $27E3: ;;; { ROM0:27E3 2A ldi a,(hl) ;\ ROM0:27E4 EA 4E D0 ld (D04E),a ;| ROM0:27E7 EA 65 D0 ld (D065),a ;} VRAM tiles update bank = bank = [[hl++]] ROM0:27EA EA 00 21 ld (2100),a ;/ ROM0:27ED 2A ldi a,(hl) ;\ ROM0:27EE E0 B1 ld (FF00+B1),a ;| ROM0:27F0 2A ldi a,(hl) ;} VRAM tiles update source address = [[hl++++]] ROM0:27F1 E0 B2 ld (FF00+B2),a ;/ ROM0:27F3 2A ldi a,(hl) ;\ ROM0:27F4 E0 B3 ld (FF00+B3),a ;| ROM0:27F6 2A ldi a,(hl) ;} VRAM tiles update dest address = [[hl++++]] ROM0:27F7 E0 B4 ld (FF00+B4),a ;/ ROM0:27F9 2A ldi a,(hl) ;\ ROM0:27FA E0 B5 ld (FF00+B5),a ;| ROM0:27FC 2A ldi a,(hl) ;} VRAM tiles update size = [[hl++++]] ROM0:27FD E0 B6 ld (FF00+B6),a ;/ ROM0:27FF 3E FF ld a,FF ;\ ROM0:2801 EA 47 D0 ld (D047),a ;} Set VRAM tiles update ; LOOP_ALPHA ROM0:2804 3E 80 ld a,80 ;\ ROM0:2806 E0 4A ld (FF00+4A),a ;} Window Y = 80h ROM0:2808 CD 93 3E call 3E93 ; Draw Samus ROM0:280B CD DE 05 call 05DE ; Handle enemies ROM0:280E 3E 01 ld a,01 ;\ ROM0:2810 EA 4E D0 ld (D04E),a ;| ROM0:2813 EA 00 21 ld (2100),a ;} Drawing blinking Metroid in HUD ROM0:2816 CD 2C 4B call 4B2C ;/ ROM0:2819 CD 88 3E call 3E88 ; Clear deleted OAM ROM0:281C CD 5E 2C call 2C5E ; Wait a frame ROM0:281F F0 B4 ld a,(FF00+B4) ;\ ROM0:2821 FE 85 cp 85 ;} If [VRAM tiles update dest address] < $8500: go to LOOP_ALPHA ROM0:2823 38 DF jr c,2804 ;/ ROM0:2825 AF xor a ;\ ROM0:2826 EA 8C D0 ld (D08C),a ;} $D08C = 0 ROM0:2829 C9 ret } ;;; $282A: Screen command - load $DA00 ;;; { ROM0:282A 3E 08 ld a,08 ;\ ROM0:282C EA 4E D0 ld (D04E),a ;} Bank = 8 ROM0:282F EA 00 21 ld (2100),a ;/ ROM0:2832 2A ldi a,(hl) ROM0:2833 E5 push hl ; Save [hl] + 1 ROM0:2834 E6 0F and 0F ;\ ROM0:2836 CB 27 sla a ;| ROM0:2838 5F ld e,a ;| ROM0:2839 16 00 ld d,00 ;| ROM0:283B 21 1A 7F ld hl,7F1A ;| ROM0:283E 19 add hl,de ;} $D80D = [$7F1A + ([[hl++]] & Fh) * 2] ROM0:283F 2A ldi a,(hl) ;| ROM0:2840 EA 0D D8 ld (D80D),a ;| ROM0:2843 47 ld b,a ;| ROM0:2844 2A ldi a,(hl) ;| ROM0:2845 EA 0E D8 ld (D80E),a ;/ ROM0:2848 67 ld h,a ;\ ROM0:2849 78 ld a,b ;| ROM0:284A 6F ld l,a ;| ROM0:284B 11 00 DA ld de,DA00 ;| ;| ROM0:284E 2A ldi a,(hl) ;} $DA00..DBFF = [[$D80D]..[$D80D]+1FFh] ROM0:284F 12 ld (de),a ;| ROM0:2850 13 inc de ;| ROM0:2851 7A ld a,d ;| ROM0:2852 FE DC cp DC ;| ROM0:2854 20 F8 jr nz,284E ;/ ROM0:2856 C3 18 29 jp 2918 ; Go to $2918 } ;;; $289C: Screen command - load tile properties (unit) ;;; { ROM0:2859 3E 08 ld a,08 ;\ ROM0:285B EA 4E D0 ld (D04E),a ;} Bank = 8 ROM0:285E EA 00 21 ld (2100),a ;/ ROM0:2861 2A ldi a,(hl) ;\ ROM0:2862 E5 push hl ;| ROM0:2863 E6 0F and 0F ;| ROM0:2865 CB 27 sla a ;| ROM0:2867 5F ld e,a ;| ROM0:2868 16 00 ld d,00 ;| ROM0:286A 21 EA 7E ld hl,7EEA ;} $D80F = [$7EEA + ([hl++] & Fh) * 2] ROM0:286D 19 add hl,de ;| ROM0:286E 2A ldi a,(hl) ;| ROM0:286F EA 0F D8 ld (D80F),a ;| ROM0:2872 47 ld b,a ;| ROM0:2873 2A ldi a,(hl) ;| ROM0:2874 EA 10 D8 ld (D810),a ;/ ROM0:2877 67 ld h,a ;\ ROM0:2878 78 ld a,b ;| ROM0:2879 6F ld l,a ;| ROM0:287A 11 00 DC ld de,DC00 ;| ;| ROM0:287D 2A ldi a,(hl) ;} $DC00..FF = [[$D80F]..[$D80F]+FFh] ROM0:287E 12 ld (de),a ;| ROM0:287F 13 inc de ;| ROM0:2880 7A ld a,d ;| ROM0:2881 FE DD cp DD ;| ROM0:2883 20 F8 jr nz,287D ;/ ROM0:2885 E1 pop hl ROM0:2886 C9 ret } ;;; $2887: Screen command - set Samus position ;;; { ROM0:2887 2A ldi a,(hl) ;\ ROM0:2888 E6 0F and 0F ;| ROM0:288A EA 58 D0 ld (D058),a ;| ROM0:288D EA 11 D8 ld (D811),a ;} Room bank = bank = [[hl++]] & Fh ROM0:2890 EA 4E D0 ld (D04E),a ;| ROM0:2893 EA 00 21 ld (2100),a ;/ ROM0:2896 2A ldi a,(hl) ;\ ROM0:2897 E0 C8 ld (FF00+C8),a ;} Screen Y position low = [[hl]] ROM0:2899 D6 48 sub 48 ;\ ROM0:289B EA 05 C2 ld (C205),a ;} Scroll Y = [[hl++] - 48h ROM0:289E 2A ldi a,(hl) ;\ ROM0:289F E0 C9 ld (FF00+C9),a ;} Screen Y position high = [[hl++]] ROM0:28A1 2A ldi a,(hl) ;\ ROM0:28A2 E0 CA ld (FF00+CA),a ;} Screen X position low = [[hl]] ROM0:28A4 D6 50 sub 50 ;\ ROM0:28A6 EA 06 C2 ld (C206),a ;} Scroll X = [[hl++] - 50h ROM0:28A9 2A ldi a,(hl) ;\ ROM0:28AA E0 CB ld (FF00+CB),a ;} Screen X position high = [[hl++]] ROM0:28AC 2A ldi a,(hl) ;\ ROM0:28AD E0 C0 ld (FF00+C0),a ;| ROM0:28AF 2A ldi a,(hl) ;} Samus' Y position = [[hl++]] ROM0:28B0 E0 C1 ld (FF00+C1),a ;/ ROM0:28B2 2A ldi a,(hl) ;\ ROM0:28B3 E0 C2 ld (FF00+C2),a ;| ROM0:28B5 2A ldi a,(hl) ;} Samus' X position = [[hl++]] ROM0:28B6 E0 C3 ld (FF00+C3),a ;/ ROM0:28B8 E5 push hl ; Save hl ROM0:28B9 CD 9C 03 call 039C ; Disable LCD display ROM0:28BC CD 73 06 call 0673 ; Execute subroutine $0673 ROM0:28BF 3E 03 ld a,03 ;\ ROM0:28C1 EA 4E D0 ld (D04E),a ;| ROM0:28C4 EA 00 21 ld (2100),a ;} Execute subroutine $3:6D4A ROM0:28C7 CD 4A 6D call 6D4A ;/ ROM0:28CA F0 CA ld a,(FF00+CA) ;\ ROM0:28CC 47 ld b,a ;| ROM0:28CD F0 C2 ld a,(FF00+C2) ;| ROM0:28CF 90 sub b ;} $D03C = [Samus' X position] - [screen X position] + 60h ROM0:28D0 C6 60 add a,60 ;| ROM0:28D2 EA 3C D0 ld (D03C),a ;/ ROM0:28D5 F0 C8 ld a,(FF00+C8) ;\ ROM0:28D7 47 ld b,a ;| ROM0:28D8 F0 C0 ld a,(FF00+C0) ;| ROM0:28DA 90 sub b ;} $D03B = [Samus' Y position] - [screen Y position] + 62h ROM0:28DB C6 62 add a,62 ;| ROM0:28DD EA 3B D0 ld (D03B),a ;/ ROM0:28E0 3E E3 ld a,E3 ;\ ROM0:28E2 E0 40 ld (FF00+40),a ;} Enable LCD display ROM0:28E4 AF xor a ROM0:28E5 EA 0E D0 ld (D00E),a ; Door transition direction = 0 ROM0:28E8 EA 05 C2 ld (C205),a ; Scroll Y = 0 ROM0:28EB E0 42 ld (FF00+42),a ; LCD scroll Y = 0 ROM0:28ED FA 7E D0 ld a,(D07E) ;\ ROM0:28F0 FE 93 cp 93 ;} If [BG palette] != 93h: ROM0:28F2 28 05 jr z,28F9 ;/ ROM0:28F4 3E 2F ld a,2F ;\ ROM0:28F6 EA 9B D0 ld (D09B),a ;} Fade in timer = 2Fh ROM0:28F9 E1 pop hl ; Restore hl ROM0:28FA C9 ret } ;;; $28FB: Screen command - set screen position ;;; { ROM0:28FB 2A ldi a,(hl) ;\ ROM0:28FC E6 0F and 0F ;| ROM0:28FE EA 58 D0 ld (D058),a ;} Room bank = [[hl++]] & Fh ROM0:2901 EA 11 D8 ld (D811),a ;/ ROM0:2904 7E ld a,(hl) ;\ ROM0:2905 CB 37 swap a ;| ROM0:2907 E6 0F and 0F ;} Samus' Y position high = screen Y position high = [[hl]] >> 4 ROM0:2909 E0 C9 ld (FF00+C9),a ;| ROM0:290B E0 C1 ld (FF00+C1),a ;/ ROM0:290D 2A ldi a,(hl) ;\ ROM0:290E E6 0F and 0F ;| ROM0:2910 E0 CB ld (FF00+CB),a ;} Samus' X position high = screen X position high = [[hl++]] & Fh ROM0:2912 E0 C3 ld (FF00+C3),a ;/ ROM0:2914 E5 push hl ; Save hl ROM0:2915 CD 5E 2C call 2C5E ; Wait a frame } ;;; $2918: ;;; { ROM0:2918 FA 0E D0 ld a,(D00E) ;\ ROM0:291B FE 01 cp 01 ;} If door transitioning right: go to BRANCH_RIGHT ROM0:291D 28 1A jr z,2939 ;/ ROM0:291F FA 0E D0 ld a,(D00E) ;\ ROM0:2922 FE 02 cp 02 ;} If door transitioning left: go to BRANCH_LEFT ROM0:2924 CA C4 29 jp z,29C4 ;/ ROM0:2927 FA 0E D0 ld a,(D00E) ;\ ROM0:292A FE 04 cp 04 ;} If door transitioning up: go to BRANCH_UP ROM0:292C CA 04 2B jp z,2B04 ;/ ROM0:292F FA 0E D0 ld a,(D00E) ;\ ROM0:2932 FE 08 cp 08 ;} If door transitioning down: go to BRANCH_DOWN ROM0:2934 CA 4F 2A jp z,2A4F ;/ ROM0:2937 E1 pop hl ; Restore hl ROM0:2938 C9 ret ; BRANCH_RIGHT ROM0:2939 FA 58 D0 ld a,(D058) ROM0:293C EA 4E D0 ld (D04E),a ROM0:293F EA 00 21 ld (2100),a ROM0:2942 3E 00 ld a,00 ROM0:2944 E0 AF ld (FF00+AF),a ROM0:2946 3E DE ld a,DE ROM0:2948 E0 B0 ld (FF00+B0),a ROM0:294A 3E FF ld a,FF ROM0:294C EA 4C D0 ld (D04C),a ROM0:294F F0 CA ld a,(FF00+CA) ROM0:2951 C6 50 add a,50 ROM0:2953 E0 CE ld (FF00+CE),a ROM0:2955 F0 CB ld a,(FF00+CB) ROM0:2957 CE 00 adc a,00 ROM0:2959 E6 0F and 0F ROM0:295B E0 CF ld (FF00+CF),a ROM0:295D F0 C8 ld a,(FF00+C8) ROM0:295F D6 74 sub 74 ROM0:2961 E0 CC ld (FF00+CC),a ROM0:2963 F0 C9 ld a,(FF00+C9) ROM0:2965 DE 00 sbc a,00 ROM0:2967 E6 0F and 0F ROM0:2969 E0 CD ld (FF00+CD),a ROM0:296B CD E4 07 call 07E4 ROM0:296E CD 5E 2C call 2C5E ; Wait a frame ROM0:2971 FA 58 D0 ld a,(D058) ROM0:2974 EA 4E D0 ld (D04E),a ROM0:2977 EA 00 21 ld (2100),a ROM0:297A 3E 00 ld a,00 ROM0:297C E0 AF ld (FF00+AF),a ROM0:297E 3E DE ld a,DE ROM0:2980 E0 B0 ld (FF00+B0),a ROM0:2982 3E FF ld a,FF ROM0:2984 EA 4C D0 ld (D04C),a ROM0:2987 F0 CA ld a,(FF00+CA) ROM0:2989 C6 60 add a,60 ROM0:298B E0 CE ld (FF00+CE),a ROM0:298D F0 CB ld a,(FF00+CB) ROM0:298F CE 00 adc a,00 ROM0:2991 E6 0F and 0F ROM0:2993 E0 CF ld (FF00+CF),a ROM0:2995 CD E4 07 call 07E4 ROM0:2998 CD 5E 2C call 2C5E ; Wait a frame ROM0:299B FA 58 D0 ld a,(D058) ROM0:299E EA 4E D0 ld (D04E),a ROM0:29A1 EA 00 21 ld (2100),a ROM0:29A4 3E 00 ld a,00 ROM0:29A6 E0 AF ld (FF00+AF),a ROM0:29A8 3E DE ld a,DE ROM0:29AA E0 B0 ld (FF00+B0),a ROM0:29AC 3E FF ld a,FF ROM0:29AE EA 4C D0 ld (D04C),a ROM0:29B1 F0 CA ld a,(FF00+CA) ROM0:29B3 C6 70 add a,70 ROM0:29B5 E0 CE ld (FF00+CE),a ROM0:29B7 F0 CB ld a,(FF00+CB) ROM0:29B9 CE 00 adc a,00 ROM0:29BB E6 0F and 0F ROM0:29BD E0 CF ld (FF00+CF),a ROM0:29BF CD E4 07 call 07E4 ROM0:29C2 E1 pop hl ROM0:29C3 C9 ret ; BRANCH_LEFT ROM0:29C4 FA 58 D0 ld a,(D058) ROM0:29C7 EA 4E D0 ld (D04E),a ROM0:29CA EA 00 21 ld (2100),a ROM0:29CD 3E 00 ld a,00 ROM0:29CF E0 AF ld (FF00+AF),a ROM0:29D1 3E DE ld a,DE ROM0:29D3 E0 B0 ld (FF00+B0),a ROM0:29D5 3E FF ld a,FF ROM0:29D7 EA 4C D0 ld (D04C),a ROM0:29DA F0 CA ld a,(FF00+CA) ROM0:29DC D6 60 sub 60 ROM0:29DE E0 CE ld (FF00+CE),a ROM0:29E0 F0 CB ld a,(FF00+CB) ROM0:29E2 DE 00 sbc a,00 ROM0:29E4 E6 0F and 0F ROM0:29E6 E0 CF ld (FF00+CF),a ROM0:29E8 F0 C8 ld a,(FF00+C8) ROM0:29EA D6 74 sub 74 ROM0:29EC E0 CC ld (FF00+CC),a ROM0:29EE F0 C9 ld a,(FF00+C9) ROM0:29F0 DE 00 sbc a,00 ROM0:29F2 E6 0F and 0F ROM0:29F4 E0 CD ld (FF00+CD),a ROM0:29F6 CD E4 07 call 07E4 ROM0:29F9 CD 5E 2C call 2C5E ; Wait a frame ROM0:29FC FA 58 D0 ld a,(D058) ROM0:29FF EA 4E D0 ld (D04E),a ROM0:2A02 EA 00 21 ld (2100),a ROM0:2A05 3E 00 ld a,00 ROM0:2A07 E0 AF ld (FF00+AF),a ROM0:2A09 3E DE ld a,DE ROM0:2A0B E0 B0 ld (FF00+B0),a ROM0:2A0D 3E FF ld a,FF ROM0:2A0F EA 4C D0 ld (D04C),a ROM0:2A12 F0 CA ld a,(FF00+CA) ROM0:2A14 D6 70 sub 70 ROM0:2A16 E0 CE ld (FF00+CE),a ROM0:2A18 F0 CB ld a,(FF00+CB) ROM0:2A1A DE 00 sbc a,00 ROM0:2A1C E6 0F and 0F ROM0:2A1E E0 CF ld (FF00+CF),a ROM0:2A20 CD E4 07 call 07E4 ROM0:2A23 CD 5E 2C call 2C5E ; Wait a frame ROM0:2A26 FA 58 D0 ld a,(D058) ROM0:2A29 EA 4E D0 ld (D04E),a ROM0:2A2C EA 00 21 ld (2100),a ROM0:2A2F 3E 00 ld a,00 ROM0:2A31 E0 AF ld (FF00+AF),a ROM0:2A33 3E DE ld a,DE ROM0:2A35 E0 B0 ld (FF00+B0),a ROM0:2A37 3E FF ld a,FF ROM0:2A39 EA 4C D0 ld (D04C),a ROM0:2A3C F0 CA ld a,(FF00+CA) ROM0:2A3E D6 80 sub 80 ROM0:2A40 E0 CE ld (FF00+CE),a ROM0:2A42 F0 CB ld a,(FF00+CB) ROM0:2A44 DE 00 sbc a,00 ROM0:2A46 E6 0F and 0F ROM0:2A48 E0 CF ld (FF00+CF),a ROM0:2A4A CD E4 07 call 07E4 ROM0:2A4D E1 pop hl ROM0:2A4E C9 ret ; BRANCH_DOWN ROM0:2A4F FA 58 D0 ld a,(D058) ROM0:2A52 EA 4E D0 ld (D04E),a ROM0:2A55 EA 00 21 ld (2100),a ROM0:2A58 3E 00 ld a,00 ROM0:2A5A E0 AF ld (FF00+AF),a ROM0:2A5C 3E DE ld a,DE ROM0:2A5E E0 B0 ld (FF00+B0),a ROM0:2A60 3E FF ld a,FF ROM0:2A62 EA 4C D0 ld (D04C),a ROM0:2A65 F0 CA ld a,(FF00+CA) ROM0:2A67 D6 80 sub 80 ROM0:2A69 E0 CE ld (FF00+CE),a ROM0:2A6B F0 CB ld a,(FF00+CB) ROM0:2A6D DE 00 sbc a,00 ROM0:2A6F E6 0F and 0F ROM0:2A71 E0 CF ld (FF00+CF),a ROM0:2A73 F0 C8 ld a,(FF00+C8) ROM0:2A75 C6 78 add a,78 ROM0:2A77 E0 CC ld (FF00+CC),a ROM0:2A79 F0 C9 ld a,(FF00+C9) ROM0:2A7B CE 00 adc a,00 ROM0:2A7D E6 0F and 0F ROM0:2A7F E0 CD ld (FF00+CD),a ROM0:2A81 CD 88 07 call 0788 ; Load row ROM0:2A84 CD 5E 2C call 2C5E ; Wait a frame ROM0:2A87 FA 58 D0 ld a,(D058) ROM0:2A8A EA 4E D0 ld (D04E),a ROM0:2A8D EA 00 21 ld (2100),a ROM0:2A90 3E 00 ld a,00 ROM0:2A92 E0 AF ld (FF00+AF),a ROM0:2A94 3E DE ld a,DE ROM0:2A96 E0 B0 ld (FF00+B0),a ROM0:2A98 3E FF ld a,FF ROM0:2A9A EA 4C D0 ld (D04C),a ROM0:2A9D F0 C8 ld a,(FF00+C8) ROM0:2A9F C6 68 add a,68 ROM0:2AA1 E0 CC ld (FF00+CC),a ROM0:2AA3 F0 C9 ld a,(FF00+C9) ROM0:2AA5 CE 00 adc a,00 ROM0:2AA7 E6 0F and 0F ROM0:2AA9 E0 CD ld (FF00+CD),a ROM0:2AAB CD 88 07 call 0788 ; Load row ROM0:2AAE CD 5E 2C call 2C5E ; Wait a frame ROM0:2AB1 FA 58 D0 ld a,(D058) ROM0:2AB4 EA 4E D0 ld (D04E),a ROM0:2AB7 EA 00 21 ld (2100),a ROM0:2ABA 3E 00 ld a,00 ROM0:2ABC E0 AF ld (FF00+AF),a ROM0:2ABE 3E DE ld a,DE ROM0:2AC0 E0 B0 ld (FF00+B0),a ROM0:2AC2 3E FF ld a,FF ROM0:2AC4 EA 4C D0 ld (D04C),a ROM0:2AC7 F0 C8 ld a,(FF00+C8) ROM0:2AC9 C6 58 add a,58 ROM0:2ACB E0 CC ld (FF00+CC),a ROM0:2ACD F0 C9 ld a,(FF00+C9) ROM0:2ACF CE 00 adc a,00 ROM0:2AD1 E6 0F and 0F ROM0:2AD3 E0 CD ld (FF00+CD),a ROM0:2AD5 CD 88 07 call 0788 ; Load row ROM0:2AD8 CD 5E 2C call 2C5E ; Wait a frame ROM0:2ADB FA 58 D0 ld a,(D058) ROM0:2ADE EA 4E D0 ld (D04E),a ROM0:2AE1 EA 00 21 ld (2100),a ROM0:2AE4 3E 00 ld a,00 ROM0:2AE6 E0 AF ld (FF00+AF),a ROM0:2AE8 3E DE ld a,DE ROM0:2AEA E0 B0 ld (FF00+B0),a ROM0:2AEC 3E FF ld a,FF ROM0:2AEE EA 4C D0 ld (D04C),a ROM0:2AF1 F0 C8 ld a,(FF00+C8) ROM0:2AF3 C6 48 add a,48 ROM0:2AF5 E0 CC ld (FF00+CC),a ROM0:2AF7 F0 C9 ld a,(FF00+C9) ROM0:2AF9 CE 00 adc a,00 ROM0:2AFB E6 0F and 0F ROM0:2AFD E0 CD ld (FF00+CD),a ROM0:2AFF CD 88 07 call 0788 ; Load row ROM0:2B02 E1 pop hl ROM0:2B03 C9 ret ; BRANCH_UP ROM0:2B04 FA 58 D0 ld a,(D058) ROM0:2B07 EA 4E D0 ld (D04E),a ROM0:2B0A EA 00 21 ld (2100),a ROM0:2B0D 3E 00 ld a,00 ROM0:2B0F E0 AF ld (FF00+AF),a ROM0:2B11 3E DE ld a,DE ROM0:2B13 E0 B0 ld (FF00+B0),a ROM0:2B15 3E FF ld a,FF ROM0:2B17 EA 4C D0 ld (D04C),a ROM0:2B1A F0 CA ld a,(FF00+CA) ROM0:2B1C D6 80 sub 80 ROM0:2B1E E0 CE ld (FF00+CE),a ROM0:2B20 F0 CB ld a,(FF00+CB) ROM0:2B22 DE 00 sbc a,00 ROM0:2B24 E6 0F and 0F ROM0:2B26 E0 CF ld (FF00+CF),a ROM0:2B28 F0 C8 ld a,(FF00+C8) ROM0:2B2A D6 78 sub 78 ROM0:2B2C E0 CC ld (FF00+CC),a ROM0:2B2E F0 C9 ld a,(FF00+C9) ROM0:2B30 DE 00 sbc a,00 ROM0:2B32 E6 0F and 0F ROM0:2B34 E0 CD ld (FF00+CD),a ROM0:2B36 CD 88 07 call 0788 ; Load row ROM0:2B39 CD 5E 2C call 2C5E ; Wait a frame ROM0:2B3C FA 58 D0 ld a,(D058) ROM0:2B3F EA 4E D0 ld (D04E),a ROM0:2B42 EA 00 21 ld (2100),a ROM0:2B45 3E 00 ld a,00 ROM0:2B47 E0 AF ld (FF00+AF),a ROM0:2B49 3E DE ld a,DE ROM0:2B4B E0 B0 ld (FF00+B0),a ROM0:2B4D 3E FF ld a,FF ROM0:2B4F EA 4C D0 ld (D04C),a ROM0:2B52 F0 C8 ld a,(FF00+C8) ROM0:2B54 D6 68 sub 68 ROM0:2B56 E0 CC ld (FF00+CC),a ROM0:2B58 F0 C9 ld a,(FF00+C9) ROM0:2B5A DE 00 sbc a,00 ROM0:2B5C E6 0F and 0F ROM0:2B5E E0 CD ld (FF00+CD),a ROM0:2B60 CD 88 07 call 0788 ; Load row ROM0:2B63 CD 5E 2C call 2C5E ; Wait a frame ROM0:2B66 FA 58 D0 ld a,(D058) ROM0:2B69 EA 4E D0 ld (D04E),a ROM0:2B6C EA 00 21 ld (2100),a ROM0:2B6F 3E 00 ld a,00 ROM0:2B71 E0 AF ld (FF00+AF),a ROM0:2B73 3E DE ld a,DE ROM0:2B75 E0 B0 ld (FF00+B0),a ROM0:2B77 3E FF ld a,FF ROM0:2B79 EA 4C D0 ld (D04C),a ROM0:2B7C F0 C8 ld a,(FF00+C8) ROM0:2B7E D6 58 sub 58 ROM0:2B80 E0 CC ld (FF00+CC),a ROM0:2B82 F0 C9 ld a,(FF00+C9) ROM0:2B84 DE 00 sbc a,00 ROM0:2B86 E6 0F and 0F ROM0:2B88 E0 CD ld (FF00+CD),a ROM0:2B8A CD 88 07 call 0788 ; Load row ROM0:2B8D E1 pop hl ROM0:2B8E C9 ret } ;;; $2B8F: Handle metatile update, set v-blank handled, restore bank, return from interrupt ;;; { ROM0:2B8F FA 01 DE ld a,(DE01) ;\ ROM0:2B92 A7 and a ;} If metatile updates: ROM0:2B93 28 50 jr z,2BE5 ;/ ROM0:2B95 FA 58 D0 ld a,(D058) ;\ ROM0:2B98 EA 4E D0 ld (D04E),a ;} Bank = [room bank] (bug? Overwrites $D04E, which is used to restore the previous bank) ROM0:2B9B EA 00 21 ld (2100),a ;/ ROM0:2B9E CD CF 08 call 08CF ; Handle metatile update entries ROM0:2BA1 18 42 jr 2BE5 ; Set v-blank handled, restore bank, return from interrupt } ;;; $2BA3: Load tiles to VRAM ;;; { ; I think only for door transition, doesn't trigger for title screen / dying / starting game ROM0:2BA3 FA 8C D0 ld a,(D08C) ;\ ROM0:2BA6 A7 and a ;} If [$D08C]: go to $2BF4 ROM0:2BA7 C2 F4 2B jp nz,2BF4 ;/ ROM0:2BAA FA 65 D0 ld a,(D065) ;\ ROM0:2BAD EA 00 21 ld (2100),a ;} Bank = [VRAM tiles update source bank] ROM0:2BB0 F0 B5 ld a,(FF00+B5) ;\ ROM0:2BB2 4F ld c,a ;| ROM0:2BB3 F0 B6 ld a,(FF00+B6) ;} bc = [VRAM tiles update size] ROM0:2BB5 47 ld b,a ;/ ROM0:2BB6 F0 B1 ld a,(FF00+B1) ;\ ROM0:2BB8 6F ld l,a ;| ROM0:2BB9 F0 B2 ld a,(FF00+B2) ;} hl = [VRAM tiles update source address] ROM0:2BBB 67 ld h,a ;/ ROM0:2BBC F0 B3 ld a,(FF00+B3) ;\ ROM0:2BBE 5F ld e,a ;| ROM0:2BBF F0 B4 ld a,(FF00+B4) ;} de = [VRAM tiles update dest address] ROM0:2BC1 57 ld d,a ;/ ; LOOP_ALPHA ROM0:2BC2 2A ldi a,(hl) ;\ ROM0:2BC3 12 ld (de),a ;} de++ = [hl++] ROM0:2BC4 13 inc de ;/ ROM0:2BC5 0B dec bc ; --bc ROM0:2BC6 79 ld a,c ;\ ROM0:2BC7 E6 3F and 3F ;} If [c] & 3Fh: go to LOOP_ALPHA ROM0:2BC9 20 F7 jr nz,2BC2 ;/ ROM0:2BCB 79 ld a,c ;\ ROM0:2BCC E0 B5 ld (FF00+B5),a ;| ROM0:2BCE 78 ld a,b ;} VRAM tiles update size = [bc] ROM0:2BCF E0 B6 ld (FF00+B6),a ;/ ROM0:2BD1 7D ld a,l ;\ ROM0:2BD2 E0 B1 ld (FF00+B1),a ;| ROM0:2BD4 7C ld a,h ;} VRAM tiles update source address = [hl] ROM0:2BD5 E0 B2 ld (FF00+B2),a ;/ ROM0:2BD7 7B ld a,e ;\ ROM0:2BD8 E0 B3 ld (FF00+B3),a ;| ROM0:2BDA 7A ld a,d ;} VRAM tiles update dest address = [ed] ROM0:2BDB E0 B4 ld (FF00+B4),a ;/ ROM0:2BDD 78 ld a,b ;\ ROM0:2BDE B1 or c ;} If [VRAM tiles update size] = 0: ROM0:2BDF 20 04 jr nz,2BE5 ;/ ROM0:2BE1 AF xor a ;\ ROM0:2BE2 EA 47 D0 ld (D047),a ;} Clear VRAM tiles update flag } ;;; $2BE5: Set v-blank handled, restore bank, return from interrupt ;;; { ROM0:2BE5 3E 01 ld a,01 ;\ ROM0:2BE7 E0 82 ld (FF00+82),a ;} Set v-blank handled ROM0:2BE9 FA 4E D0 ld a,(D04E) ;\ ROM0:2BEC EA 00 21 ld (2100),a ;} Restore bank ROM0:2BEF E1 pop hl ROM0:2BF0 D1 pop de ROM0:2BF1 C1 pop bc ROM0:2BF2 F1 pop af ROM0:2BF3 D9 reti } ;;; $2BF4: ;;; { ROM0:2BF4 F0 97 ld a,(FF00+97) ;\ ROM0:2BF6 E6 01 and 01 ;} If odd frame: go to BRANCH_RETURN ROM0:2BF8 20 48 jr nz,2C42 ;/ ROM0:2BFA FA 65 D0 ld a,(D065) ;\ ROM0:2BFD EA 00 21 ld (2100),a ;} Bank = tiles bank ROM0:2C00 F0 B3 ld a,(FF00+B3) ;\ ROM0:2C02 6F ld l,a ;| ROM0:2C03 F0 B4 ld a,(FF00+B4) ;} hl = [$FFB3] ROM0:2C05 67 ld h,a ;/ ROM0:2C06 11 10 00 ld de,0010 ; <-- ignore this line ; LOOP_BETA ROM0:2C09 E5 push hl ;\ ROM0:2C0A 11 20 CE ld de,CE20 ;| ROM0:2C0D 19 add hl,de ;| ROM0:2C0E 5D ld e,l ;| ROM0:2C0F 54 ld d,h ;} [hl] = [$CE20 + [hl]] ROM0:2C10 E1 pop hl ;| ROM0:2C11 1A ld a,(de) ;| ROM0:2C12 77 ld (hl),a ;/ ROM0:2C13 7D ld a,l ;\ ROM0:2C14 C6 10 add a,10 ;| ROM0:2C16 6F ld l,a ;| ROM0:2C17 7C ld a,h ;} hl += 10h ROM0:2C18 CE 00 adc a,00 ;| ROM0:2C1A 67 ld h,a ;/ ROM0:2C1B 7D ld a,l ;\ ROM0:2C1C E6 F0 and F0 ;} If [l] >= 10h: go to LOOP_BETA ROM0:2C1E 20 E9 jr nz,2C09 ;/ ROM0:2C20 7D ld a,l ;\ ROM0:2C21 D6 FF sub FF ;} ++l ROM0:2C23 6F ld l,a ;/ ROM0:2C24 7C ld a,h ;\ ROM0:2C25 DE 00 sbc a,00 ;} --h ROM0:2C27 67 ld h,a ;/ ROM0:2C28 7D ld a,l ;\ ROM0:2C29 FE 10 cp 10 ;} If [l] = 10h: ROM0:2C2B 20 07 jr nz,2C34 ;/ ROM0:2C2D C6 F0 add a,F0 ;\ ROM0:2C2F 6F ld l,a ;} l = 0 ROM0:2C30 7C ld a,h ;\ ROM0:2C31 CE 00 adc a,00 ;} ++h ROM0:2C33 67 ld h,a ;/ ROM0:2C34 7D ld a,l ;\ ROM0:2C35 E0 B3 ld (FF00+B3),a ;| ROM0:2C37 7C ld a,h ;} $FFB3 = [hl] ROM0:2C38 E0 B4 ld (FF00+B4),a ;/ ROM0:2C3A FE 85 cp 85 ;\ ROM0:2C3C 20 04 jr nz,2C42 ;} If [$FFB3] = 85h: ROM0:2C3E AF xor a ;\ ROM0:2C3F EA 59 D0 ld (D059),a ;} $D059 = 0 ; BRANCH_RETURN ROM0:2C42 FA 05 C2 ld a,(C205) ;\ ROM0:2C45 E0 42 ld (FF00+42),a ;} Update LCD scroll Y ROM0:2C47 FA 06 C2 ld a,(C206) ;\ ROM0:2C4A E0 43 ld (FF00+43),a ;} Update LCD scroll X ROM0:2C4C CD A0 FF call FFA0 ; OAM DMA ROM0:2C4F FA 4E D0 ld a,(D04E) ;\ ROM0:2C52 EA 00 21 ld (2100),a ;} Restore bank ROM0:2C55 3E 01 ld a,01 ;\ ROM0:2C57 E0 82 ld (FF00+82),a ;} Set v-blank handled ROM0:2C59 E1 pop hl ROM0:2C5A D1 pop de ROM0:2C5B C1 pop bc ROM0:2C5C F1 pop af ROM0:2C5D D9 reti } ;;; $2C5E: Wait a frame ;;; { ROM0:2C5E E5 push hl ROM0:2C5F CD 84 23 call 2384 ; Handle audio ROM0:2C62 E1 pop hl ROM0:2C63 76 halt ROM0:2C64 F0 82 ld a,(FF00+82) ;\ ROM0:2C66 A7 and a ;} Wait until v-blank handled ROM0:2C67 28 FB jr z,2C64 ;/ ROM0:2C69 F0 97 ld a,(FF00+97) ;\ ROM0:2C6B 3C inc a ;} Increment frame counter ROM0:2C6C E0 97 ld (FF00+97),a ;/ ROM0:2C6E AF xor a ;\ ROM0:2C6F E0 82 ld (FF00+82),a ;} Clear v-blank handled ROM0:2C71 3E C0 ld a,C0 ;\ ROM0:2C73 E0 8C ld (FF00+8C),a ;} $FF8C = C0h ROM0:2C75 AF xor a ;\ ROM0:2C76 E0 8D ld (FF00+8D),a ;} OAM stack pointer = 0 ROM0:2C78 C9 ret } ;;; $2C79: Handle pausing ;;; { ROM0:2C79 F0 81 ld a,(FF00+81) ;\ ROM0:2C7B FE 08 cp 08 ;} If not newly pressing only start: return ROM0:2C7D C0 ret nz ;/ ROM0:2C7E FA 8B D0 ld a,(D08B) ;\ ROM0:2C81 FE 11 cp 11 ;} If in Metroid Queen's room: return ROM0:2C83 C8 ret z ;/ ROM0:2C84 FA 20 D0 ld a,(D020) ;\ ROM0:2C87 FE 13 cp 13 ;} If Samus' pose = facing screen: return ROM0:2C89 C8 ret z ;/ ROM0:2C8A FA 0E D0 ld a,(D00E) ;\ ROM0:2C8D A7 and a ;} If in door transition: return ROM0:2C8E C0 ret nz ;/ ROM0:2C8F FA 7D D0 ld a,(D07D) ;\ ROM0:2C92 A7 and a ;} If on save pillar: return ROM0:2C93 C0 ret nz ;/ ROM0:2C94 21 3B 20 ld hl,203B ;\ ROM0:2C97 FA 89 D0 ld a,(D089) ;| ROM0:2C9A 5F ld e,a ;| ROM0:2C9B 16 00 ld d,00 ;} Metroids remaining in area = [$203B + [real number of metroids remaining]] ROM0:2C9D 19 add hl,de ;| ROM0:2C9E 7E ld a,(hl) ;| ROM0:2C9F EA A7 D0 ld (D0A7),a ;/ ROM0:2CA2 FA 91 D0 ld a,(D091) ;\ ROM0:2CA5 A7 and a ;| ROM0:2CA6 20 06 jr nz,2CAE ;| ROM0:2CA8 FA 83 D0 ld a,(D083) ;} If [$D091] = 0 and earthquake active: ROM0:2CAB A7 and a ;| ROM0:2CAC 28 04 jr z,2CB2 ;/ ROM0:2CAE AF xor a ;\ ROM0:2CAF EA A7 D0 ld (D0A7),a ;} Metroids remaining in area = 0 ROM0:2CB2 FA A0 D0 ld a,(D0A0) ;\ ROM0:2CB5 A7 and a ;} If debug enabled: ROM0:2CB6 28 06 jr z,2CBE ;/ ROM0:2CB8 AF xor a ;\ ROM0:2CB9 E0 8D ld (FF00+8D),a ;} OAM stack pointer = 0 ROM0:2CBB CD 88 3E call 3E88 ; Clear deleted OAM ROM0:2CBE AF xor a ROM0:2CBF EA 46 D0 ld (D046),a ; Debug screen selector index = 0 ROM0:2CC2 EA 11 D0 ld (D011),a ; $D011 = 0 ROM0:2CC5 21 02 C0 ld hl,C002 ;\ ;| ROM0:2CC8 7E ld a,(hl) ;| ROM0:2CC9 E6 9A and 9A ;| ROM0:2CCB FE 9A cp 9A ;| ROM0:2CCD 28 0A jr z,2CD9 ;| ROM0:2CCF 7D ld a,l ;| ROM0:2CD0 C6 04 add a,04 ;| ROM0:2CD2 6F ld l,a ;| ROM0:2CD3 FE A0 cp A0 ;} Replace HUD metroid animation with ' L' ROM0:2CD5 38 F1 jr c,2CC8 ;| ROM0:2CD7 18 0A jr 2CE3 ;| ;| ROM0:2CD9 11 04 00 ld de,0004 ;| ROM0:2CDC 3E 36 ld a,36 ;| ROM0:2CDE 77 ld (hl),a ;| ROM0:2CDF 19 add hl,de ;| ROM0:2CE0 3E 0F ld a,0F ;| ROM0:2CE2 77 ld (hl),a ;/ ROM0:2CE3 3E 01 ld a,01 ;\ ROM0:2CE5 EA C7 CF ld (CFC7),a ;} Audio pause control = pause ROM0:2CE8 3E 08 ld a,08 ;\ ROM0:2CEA E0 9B ld (FF00+9B),a ;} Game mode = paused ROM0:2CEC C9 ret } ;;; $2CED: Game mode 8: paused ;;; { ROM0:2CED 06 E7 ld b,E7 ;\ ROM0:2CEF F0 97 ld a,(FF00+97) ;| ROM0:2CF1 CB 67 bit 4,a ;} If [frame counter] & 10h: BG/object palette = E7h ROM0:2CF3 28 02 jr z,2CF7 ;/ ROM0:2CF5 06 93 ld b,93 ; Else: If [frame counter] & 10h: BG/object palette = 93h ROM0:2CF7 78 ld a,b ROM0:2CF8 EA 7E D0 ld (D07E),a ROM0:2CFB EA 7F D0 ld (D07F),a ROM0:2CFE FA A0 D0 ld a,(D0A0) ;\ ROM0:2D01 A7 and a ;} If debug disabled: ROM0:2D02 20 17 jr nz,2D1B ;/ ROM0:2D04 F0 81 ld a,(FF00+81) ;\ ROM0:2D06 CB 5F bit 3,a ;} If not newly pressed S: return ROM0:2D08 C8 ret z ;/ ROM0:2D09 3E 93 ld a,93 ;\ ROM0:2D0B EA 7E D0 ld (D07E),a ;} BG/object palette = 93h ROM0:2D0E EA 7F D0 ld (D07F),a ;/ ROM0:2D11 3E 02 ld a,02 ;\ ROM0:2D13 EA C7 CF ld (CFC7),a ;} Audio pause control = unpause ROM0:2D16 3E 04 ld a,04 ;\ ROM0:2D18 E0 9B ld (FF00+9B),a ;} Game mode = in-game ROM0:2D1A C9 ret ROM0:2D1B CD 9E 3E call 3E9E ; Drawing blinking Metroid in HUD ROM0:2D1E F0 81 ld a,(FF00+81) ;\ ROM0:2D20 FE 08 cp 08 ;} If not newly pressed only Start: ROM0:2D22 20 15 jr nz,2D39 ;/ ROM0:2D24 3E 93 ld a,93 ;\ ROM0:2D26 EA 7E D0 ld (D07E),a ;} BG/object palette = 93h ROM0:2D29 EA 7F D0 ld (D07F),a ;/ ROM0:2D2C CD 88 3E call 3E88 ; Clear deleted OAM ROM0:2D2F 3E 02 ld a,02 ;\ ROM0:2D31 EA C7 CF ld (CFC7),a ;} Audio pause control = unpause ROM0:2D34 3E 04 ld a,04 ;\ ROM0:2D36 E0 9B ld (FF00+9B),a ;} Game mode = in-game ROM0:2D38 C9 ret ROM0:2D39 F0 81 ld a,(FF00+81) ;\ ROM0:2D3B CB 67 bit 4,a ;} If newly not newly pressed >: go to BRANCH_ALPHA ROM0:2D3D 28 3B jr z,2D7A ;/ ROM0:2D3F F0 80 ld a,(FF00+80) ;\ ROM0:2D41 CB 4F bit 1,a ;} If not pressing B: ROM0:2D43 20 0B jr nz,2D50 ;/ ROM0:2D45 FA 46 D0 ld a,(D046) ;\ ROM0:2D48 3D dec a ;| ROM0:2D49 E6 07 and 07 ;} Move debug screen selector right ROM0:2D4B EA 46 D0 ld (D046),a ;/ ROM0:2D4E 18 2A jr 2D7A ; Go to BRANCH_ALPHA ROM0:2D50 CB 47 bit 0,a ;\ ROM0:2D52 28 14 jr z,2D68 ;} If pressing A: ROM0:2D54 FA 89 D0 ld a,(D089) ;\ ROM0:2D57 D6 01 sub 01 ;| ROM0:2D59 27 daa ;} Decrement real number of metroids remaining ROM0:2D5A EA 89 D0 ld (D089),a ;/ ROM0:2D5D FA 9A D0 ld a,(D09A) ;\ ROM0:2D60 D6 01 sub 01 ;| ROM0:2D62 27 daa ;} Decrement number of metroids remaining ROM0:2D63 EA 9A D0 ld (D09A),a ;/ ROM0:2D66 18 12 jr 2D7A ; Go to BRANCH_ALPHA ROM0:2D68 FA 50 D0 ld a,(D050) ;\ ROM0:2D6B A7 and a ;} If Samus has an energy tank: ROM0:2D6C 28 0C jr z,2D7A ;/ ROM0:2D6E 3D dec a ;\ ROM0:2D6F EA 50 D0 ld (D050),a ;} Decrement Samus' energy tanks ROM0:2D72 EA 52 D0 ld (D052),a ;\ ROM0:2D75 3E 99 ld a,99 ;} Refill Samus' health ROM0:2D77 EA 51 D0 ld (D051),a ;/ ; BRANCH_ALPHA ROM0:2D7A F0 81 ld a,(FF00+81) ;\ ROM0:2D7C CB 6F bit 5,a ;} If not newly pressed <: go to BRANCH_BETA ROM0:2D7E 28 3C jr z,2DBC ;/ ROM0:2D80 F0 80 ld a,(FF00+80) ;\ ROM0:2D82 CB 4F bit 1,a ;} If not pressing B: ROM0:2D84 20 0B jr nz,2D91 ;/ ROM0:2D86 FA 46 D0 ld a,(D046) ;\ ROM0:2D89 3C inc a ;| ROM0:2D8A E6 07 and 07 ;} Move debug screen selector left ROM0:2D8C EA 46 D0 ld (D046),a ;/ ROM0:2D8F 18 2B jr 2DBC ; Go to BRANCH_BETA ROM0:2D91 CB 47 bit 0,a ;\ ROM0:2D93 28 14 jr z,2DA9 ;} If pressing A: ROM0:2D95 FA 89 D0 ld a,(D089) ;\ ROM0:2D98 C6 01 add a,01 ;| ROM0:2D9A 27 daa ;} Increment real number of metroids remaining ROM0:2D9B EA 89 D0 ld (D089),a ;/ ROM0:2D9E FA 9A D0 ld a,(D09A) ;\ ROM0:2DA1 C6 01 add a,01 ;| ROM0:2DA3 27 daa ;} Increment number of metroids remaining ROM0:2DA4 EA 9A D0 ld (D09A),a ;/ ROM0:2DA7 18 13 jr 2DBC ; Go to BRANCH_BETA ROM0:2DA9 FA 50 D0 ld a,(D050) ;\ ROM0:2DAC FE 05 cp 05 ;} If Samus doesn't have 5 energy tanks: ROM0:2DAE 28 0C jr z,2DBC ;/ ROM0:2DB0 3C inc a ;\ ROM0:2DB1 EA 50 D0 ld (D050),a ;} Increment Samus' energy tanks ROM0:2DB4 EA 52 D0 ld (D052),a ;\ ROM0:2DB7 3E 99 ld a,99 ;} Refill Samus' health ROM0:2DB9 EA 51 D0 ld (D051),a ;/ ; BRANCH_BETA ROM0:2DBC F0 81 ld a,(FF00+81) ;\ ROM0:2DBE CB 47 bit 0,a ;} If not newly pressing A: go to BRANCH_GAMMA ROM0:2DC0 28 15 jr z,2DD7 ;/ ROM0:2DC2 06 01 ld b,01 ;\ ROM0:2DC4 FA 46 D0 ld a,(D046) ;| ;| ROM0:2DC7 3D dec a ;| ROM0:2DC8 FE FF cp FF ;| ROM0:2DCA 28 04 jr z,2DD0 ;| ROM0:2DCC CB 20 sla b ;} Samus' equipment ^= 1 << [debug screen selector index] ROM0:2DCE 18 F7 jr 2DC7 ;| ;| ROM0:2DD0 FA 45 D0 ld a,(D045) ;| ROM0:2DD3 A8 xor b ;| ROM0:2DD4 EA 45 D0 ld (D045),a ;/ ; BRANCH_GAMMA ROM0:2DD7 F0 81 ld a,(FF00+81) ;\ ROM0:2DD9 CB 77 bit 6,a ;} If not newly pressing ^: go to BRANCH_INCREASE_MISSILES_END ROM0:2DDB 28 2A jr z,2E07 ;/ ROM0:2DDD F0 80 ld a,(FF00+80) ;\ ROM0:2DDF CB 4F bit 1,a ;} If not pressing B: ROM0:2DE1 20 0C jr nz,2DEF ;/ ROM0:2DE3 FA 4D D0 ld a,(D04D) ;\ ROM0:2DE6 3C inc a ;} Increment weapon equipped ROM0:2DE7 EA 4D D0 ld (D04D),a ;/ ROM0:2DEA EA 55 D0 ld (D055),a ; Samus' beam = [weapon equipped] ROM0:2DED 18 18 jr 2E07 ; Go to BRANCH_INCREASE_MISSILES_END ROM0:2DEF FA 81 D0 ld a,(D081) ;\ ROM0:2DF2 C6 10 add a,10 ;| ROM0:2DF4 27 daa ;| ROM0:2DF5 EA 81 D0 ld (D081),a ;| ROM0:2DF8 EA 53 D0 ld (D053),a ;| ROM0:2DFB FA 82 D0 ld a,(D082) ;} Samus' max missiles += 10, refill Samus' missiles ROM0:2DFE CE 00 adc a,00 ;| ROM0:2E00 27 daa ;| ROM0:2E01 EA 82 D0 ld (D082),a ;| ROM0:2E04 EA 54 D0 ld (D054),a ;/ ; BRANCH_INCREASE_MISSILES_END ROM0:2E07 F0 81 ld a,(FF00+81) ;\ ROM0:2E09 CB 7F bit 7,a ;} If not newly pressing v: go to BRANCH_DECREASE_MISSILES_END ROM0:2E0B 28 24 jr z,2E31 ;/ ROM0:2E0D F0 80 ld a,(FF00+80) ;\ ROM0:2E0F CB 4F bit 1,a ;} If not pressing B: ROM0:2E11 20 0C jr nz,2E1F ;/ ROM0:2E13 FA 4D D0 ld a,(D04D) ;\ ROM0:2E16 3D dec a ;} Decrement weapon equipped ROM0:2E17 EA 4D D0 ld (D04D),a ;/ ROM0:2E1A EA 55 D0 ld (D055),a ; Samus' beam = [weapon equipped] ROM0:2E1D 18 12 jr 2E31 ; Go to BRANCH_DECREASE_MISSILES_END ROM0:2E1F FA 53 D0 ld a,(D053) ;\ ROM0:2E22 D6 10 sub 10 ;| ROM0:2E24 27 daa ;| ROM0:2E25 EA 53 D0 ld (D053),a ;| ROM0:2E28 FA 54 D0 ld a,(D054) ;} Samus' missiles -= 10 ROM0:2E2B DE 00 sbc a,00 ;| ROM0:2E2D 27 daa ;| ROM0:2E2E EA 54 D0 ld (D054),a ;/ ; BRANCH_DECREASE_MISSILES_END ROM0:2E31 3E 01 ld a,01 ;\ ROM0:2E33 EA 4E D0 ld (D04E),a ;} Bank = 1 ROM0:2E36 EA 00 21 ld (2100),a ;/ ROM0:2E39 3E 58 ld a,58 ;\ ROM0:2E3B E0 C4 ld (FF00+C4),a ;} Sprite Y position = 58h ROM0:2E3D FA 46 D0 ld a,(D046) ;\ ROM0:2E40 CB 37 swap a ;| ROM0:2E42 CB 3F srl a ;| ROM0:2E44 EE FF xor FF ;} Sprite X position = 68h - ([debug screen selector index] * 8) ROM0:2E46 C6 69 add a,69 ;| ROM0:2E48 E0 C5 ld (FF00+C5),a ;/ ROM0:2E4A FA 46 D0 ld a,(D046) ; a = [debug screen selector index] ROM0:2E4D CD 09 4B call 4B09 ; Add digit to OAM stack ROM0:2E50 3E 54 ld a,54 ;\ ROM0:2E52 E0 C4 ld (FF00+C4),a ;} Sprite Y position = 54h ROM0:2E54 3E 36 ld a,36 ;\ ROM0:2E56 E0 C6 ld (FF00+C6),a ;} Sprite set = bomb 1 ROM0:2E58 3E 34 ld a,34 ;\ ROM0:2E5A E0 C5 ld (FF00+C5),a ;} Sprite X position = 34h ROM0:2E5C FA 45 D0 ld a,(D045) ;\ ROM0:2E5F CB 7F bit 7,a ;} If [Samus' equipment] & 80h: Load sprite set ROM0:2E61 C4 62 4B call nz,4B62 ;/ ROM0:2E64 3E 3C ld a,3C ;\ ROM0:2E66 E0 C5 ld (FF00+C5),a ;} Sprite X position = 3Ch ROM0:2E68 FA 45 D0 ld a,(D045) ;\ ROM0:2E6B CB 77 bit 6,a ;} If Samus has varia suit: Load sprite set ROM0:2E6D C4 62 4B call nz,4B62 ;/ ROM0:2E70 3E 44 ld a,44 ;\ ROM0:2E72 E0 C5 ld (FF00+C5),a ;} Sprite X position = 44h ROM0:2E74 FA 45 D0 ld a,(D045) ;\ ROM0:2E77 CB 6F bit 5,a ;} If Samus has spider ball: Load sprite set ROM0:2E79 C4 62 4B call nz,4B62 ;/ ROM0:2E7C 3E 4C ld a,4C ;\ ROM0:2E7E E0 C5 ld (FF00+C5),a ;} Sprite X position = 4Ch ROM0:2E80 FA 45 D0 ld a,(D045) ;\ ROM0:2E83 CB 67 bit 4,a ;} If Samus has spring ball: Load sprite set ROM0:2E85 C4 62 4B call nz,4B62 ;/ ROM0:2E88 3E 54 ld a,54 ;\ ROM0:2E8A E0 C5 ld (FF00+C5),a ;} Sprite X position = 54h ROM0:2E8C FA 45 D0 ld a,(D045) ;\ ROM0:2E8F CB 5F bit 3,a ;} If Samus has space jump: Load sprite set ROM0:2E91 C4 62 4B call nz,4B62 ;/ ROM0:2E94 3E 5C ld a,5C ;\ ROM0:2E96 E0 C5 ld (FF00+C5),a ;} Sprite X position = 5Ch ROM0:2E98 FA 45 D0 ld a,(D045) ;\ ROM0:2E9B CB 57 bit 2,a ;} If Samus has screw attack: Load sprite set ROM0:2E9D C4 62 4B call nz,4B62 ;/ ROM0:2EA0 3E 64 ld a,64 ;\ ROM0:2EA2 E0 C5 ld (FF00+C5),a ;} Sprite X position = 64h ROM0:2EA4 FA 45 D0 ld a,(D045) ;\ ROM0:2EA7 CB 4F bit 1,a ;} If Samus has hi-jump: Load sprite set ROM0:2EA9 C4 62 4B call nz,4B62 ;/ ROM0:2EAC 3E 6C ld a,6C ;\ ROM0:2EAE E0 C5 ld (FF00+C5),a ;} Sprite X position = 6Ch ROM0:2EB0 FA 45 D0 ld a,(D045) ;\ ROM0:2EB3 CB 47 bit 0,a ;} If Samus has bombs: Load sprite set ROM0:2EB5 C4 62 4B call nz,4B62 ;/ ROM0:2EB8 3E 68 ld a,68 ;\ ROM0:2EBA E0 C4 ld (FF00+C4),a ;} Sprite Y position = 68h ROM0:2EBC 3E 50 ld a,50 ;\ ROM0:2EBE E0 C5 ld (FF00+C5),a ;} Sprite X position = 50h ROM0:2EC0 FA 4D D0 ld a,(D04D) ; a = [weapon equipped] ROM0:2EC3 CD FC 4A call 4AFC ; Add two digits to OAM stack ROM0:2EC6 F0 8D ld a,(FF00+8D) ;\ ROM0:2EC8 EA 6E D0 ld (D06E),a ;} Highest OAM stack pointer = [OAM stack pointer] ROM0:2ECB F0 81 ld a,(FF00+81) ;\ ROM0:2ECD FE 04 cp 04 ;} If not newly pressed only select: return ROM0:2ECF C0 ret nz ;/ ROM0:2ED0 F0 80 ld a,(FF00+80) ;\ ROM0:2ED2 FE 04 cp 04 ;} If not pressing only select: return ROM0:2ED4 C0 ret nz ;/ ROM0:2ED5 FA 20 D0 ld a,(D020) ;\ ROM0:2ED8 A7 and a ;} If Samus pose is not standing: ROM0:2ED9 28 03 jr z,2EDE ;/ ROM0:2EDB FE 05 cp 05 ;\ ROM0:2EDD C0 ret nz ;} If Samus pose is not morphball: return ROM0:2EDE 3E 09 ld a,09 ;\ ROM0:2EE0 E0 9B ld (FF00+9B),a ;} Game mode = save to SRAM ROM0:2EE2 C9 ret } ;;; $2EE3: Handle Samus damage ;;; { ROM0:2EE3 FA 22 C4 ld a,(C422) ;\ ROM0:2EE6 FE 01 cp 01 ;} If [Samus damage flag] != 1: return ROM0:2EE8 C0 ret nz ;/ ROM0:2EE9 AF xor a ;\ ROM0:2EEA EA 22 C4 ld (C422),a ;} Samus damage flag = 0 ROM0:2EED FA 4F D0 ld a,(D04F) ;\ ROM0:2EF0 A7 and a ;} If [invincibility timer] != 0: return ROM0:2EF1 C0 ret nz ;/ ROM0:2EF2 FA 24 C4 ld a,(C424) ; a = [Samus damage] ROM0:2EF5 CD 57 2F call 2F57 ;} Hurt Samus ROM0:2EF8 3E 33 ld a,33 ;\ ROM0:2EFA EA 4F D0 ld (D04F),a ;} Invincibility timer = 33h ROM0:2EFD FA 20 D0 ld a,(D020) ;\ ROM0:2F00 CB BF res 7,a ;| ROM0:2F02 5F ld e,a ;| ROM0:2F03 16 00 ld d,00 ;| ROM0:2F05 21 8B 20 ld hl,208B ;} Samus pose = [$208B + ([Samus pose] & 0x7F)] ROM0:2F08 19 add hl,de ;| ROM0:2F09 7E ld a,(hl) ;| ROM0:2F0A EA 20 D0 ld (D020),a ;/ ROM0:2F0D FA 23 C4 ld a,(C423) ;\ ROM0:2F10 EA 0F D0 ld (D00F),a ;} Current damage boosting direction = [damage boost direction] ROM0:2F13 FA 8B D0 ld a,(D08B) ;\ ROM0:2F16 FE 11 cp 11 ;} If in Metroid Queen's room: ROM0:2F18 20 05 jr nz,2F1F ;/ ROM0:2F1A 3E 01 ld a,01 ;\ ROM0:2F1C EA 0F D0 ld (D00F),a ;} Current damage boosting direction = up-right ROM0:2F1F 3E 40 ld a,40 ;\ ROM0:2F21 EA 26 D0 ld (D026),a ;} $D026 = 40h ROM0:2F24 AF xor a ;\ ROM0:2F25 EA 49 D0 ld (D049),a ;} $D049 = 0 ROM0:2F28 C9 ret } ;;; $2F29: Deal 2 damage every 16 frames ;;; { ROM0:2F29 F0 97 ld a,(FF00+97) ;\ ROM0:2F2B E6 07 and 07 ;} If [frame counter] & 7 != 0: return ROM0:2F2D C0 ret nz ;/ ROM0:2F2E 3E 07 ld a,07 ;\ ROM0:2F30 EA D5 CE ld (CED5),a ;} Play acid damage sound effect ROM0:2F33 F0 97 ld a,(FF00+97) ;\ ROM0:2F35 E6 0F and 0F ;} If [frame counter] & Fh != 0: return ROM0:2F37 C0 ret nz ;/ ROM0:2F38 06 02 ld b,02 ; b = 2 ROM0:2F3A 18 24 jr 2F60 ; Go to $2F60 } ;;; $2F3C: ;;; { ROM0:2F3C 06 03 ld b,03 ; b = 3 ROM0:2F3E F0 97 ld a,(FF00+97) ;\ ROM0:2F40 E6 07 and 07 ;} If [frame counter] & 7 != 0: return ROM0:2F42 C0 ret nz ;/ ROM0:2F43 3E 07 ld a,07 ;\ ROM0:2F45 EA D5 CE ld (CED5),a ;} Play acid damage sound effect ROM0:2F48 18 16 jr 2F60 ; Go to $2F60 } ;;; $2F4A: ;;; { ROM0:2F4A 47 ld b,a ; b = [a] ROM0:2F4B F0 97 ld a,(FF00+97) ;\ ROM0:2F4D E6 0F and 0F ;} If [frame counter] & Fh != 0: return ROM0:2F4F C0 ret nz ;/ ROM0:2F50 3E 07 ld a,07 ;\ ROM0:2F52 EA D5 CE ld (CED5),a ;} Play acid damage sound effect ROM0:2F55 18 09 jr 2F60 ; Go to $2F60 } ;;; $2F57: Hurt Samus with [a] damage ;;; { ROM0:2F57 47 ld b,a ; b = [a] ROM0:2F58 FE 60 cp 60 ;\ ROM0:2F5A D0 ret nc ;} If [a] >= 60h: return ROM0:2F5B 3E 06 ld a,06 ;\ ROM0:2F5D EA D5 CE ld (CED5),a ;} Play Samus hurt sound effect } ;;; $2F60: Deal [b] damage to Samus (unit) ;;; { ; Called by $2F29, $2F3C and $2F4A ROM0:2F60 FA 45 D0 ld a,(D045) ;\ ROM0:2F63 CB 77 bit 6,a ;} If Samus has Varia suit: ROM0:2F65 28 02 jr z,2F69 ;/ ROM0:2F67 CB 38 srl b ; b /= 2 ROM0:2F69 FA 51 D0 ld a,(D051) ;\ ROM0:2F6C 90 sub b ;| ROM0:2F6D 27 daa ;| ROM0:2F6E EA 51 D0 ld (D051),a ;| ROM0:2F71 FA 52 D0 ld a,(D052) ;| ROM0:2F74 DE 00 sbc a,00 ;| ROM0:2F76 27 daa ;} Samus' health = max(0, [Samus' health] - [b]) ROM0:2F77 EA 52 D0 ld (D052),a ;| ROM0:2F7A FE 99 cp 99 ;| ROM0:2F7C 20 07 jr nz,2F85 ;| ROM0:2F7E AF xor a ;| ROM0:2F7F EA 51 D0 ld (D051),a ;| ROM0:2F82 EA 52 D0 ld (D052),a ;/ ROM0:2F85 C9 ret } ;;; $2F86: Game mode 6: dying ;;; { ROM0:2F86 FA 8B D0 ld a,(D08B) ;\ ROM0:2F89 FE 11 cp 11 ;} If [$D08B] != 11h: return ROM0:2F8B 20 14 jr nz,2FA1 ;/ ROM0:2F8D CD 93 3E call 3E93 ; Draw Samus ROM0:2F90 CD 9E 3E call 3E9E ; Drawing blinking Metroid in HUD ROM0:2F93 3E 03 ld a,03 ;\ ROM0:2F95 EA 4E D0 ld (D04E),a ;| ROM0:2F98 EA 00 21 ld (2100),a ;} Execute subroutine $3:6E36 ROM0:2F9B CD 36 6E call 6E36 ;/ ROM0:2F9E CD 88 3E call 3E88 ; Clear deleted OAM ROM0:2FA1 C9 ret } ;;; $2FA2: Start death sequence ;;; { ROM0:2FA2 CD 90 23 call 2390 ; Clear sound effects and song ROM0:2FA5 3E 0B ld a,0B ;\ ROM0:2FA7 EA D5 CE ld (CED5),a ;} Play Samus killed sound effect ROM0:2FAA CD 5E 2C call 2C5E ; Wait a frame ROM0:2FAD CD BF 3E call 3EBF ; Draw Samus, no invisible frames ROM0:2FB0 3E 20 ld a,20 ;\ ROM0:2FB2 EA 59 D0 ld (D059),a ;} Death sequence timer = 20h ROM0:2FB5 AF xor a ;\ ROM0:2FB6 EA 5A D0 ld (D05A),a ;| ROM0:2FB9 3E 80 ld a,80 ;} Base address of pixels to clear in Samus' VRAM tiles = $8000 ROM0:2FBB EA 5B D0 ld (D05B),a ;/ ROM0:2FBE 3E 01 ld a,01 ;\ ROM0:2FC0 EA 63 D0 ld (D063),a ;} Dying flag = 1 ROM0:2FC3 3E 06 ld a,06 ;\ ROM0:2FC5 E0 9B ld (FF00+9B),a ;} Game mode = dying ROM0:2FC7 C9 ret } ;;; $2FC8: Unused. Start alternative death sequence (unit) ;;; { ROM0:2FC8 3E A0 ld a,A0 ;\ ROM0:2FCA EA 2C D0 ld (D02C),a ;} Samus' animation counter = A0h ROM0:2FCD 3E 80 ld a,80 ;\ ROM0:2FCF EA 20 D0 ld (D020),a ;} Samus' pose = standing facing screen ROM0:2FD2 3E 20 ld a,20 ;\ ROM0:2FD4 EA 59 D0 ld (D059),a ;} Death sequence timer = 20h ROM0:2FD7 AF xor a ;\ ROM0:2FD8 EA 5A D0 ld (D05A),a ;| ROM0:2FDB 3E 80 ld a,80 ;} Base address of pixels to clear in Samus' VRAM tiles = $8000 ROM0:2FDD EA 5B D0 ld (D05B),a ;/ ROM0:2FE0 C9 ret } ;;; $2FE1: Death sequence ;;; { ROM0:2FE1 FA 63 D0 ld a,(D063) ;\ ROM0:2FE4 A7 and a ;} If [dying flag] = 0: go to BRANCH_BETA ROM0:2FE5 28 7B jr z,3062 ;/ ROM0:2FE7 F0 97 ld a,(FF00+97) ;\ ROM0:2FE9 E6 03 and 03 ;} If frame counter & 3 != 0: go to BRANCH_ALPHA ROM0:2FEB 20 2C jr nz,3019 ;/ ROM0:2FED 21 42 30 ld hl,3042 ;\ ROM0:2FF0 FA 59 D0 ld a,(D059) ;| ROM0:2FF3 3D dec a ;| ROM0:2FF4 5F ld e,a ;| ROM0:2FF5 16 00 ld d,00 ;} hl = $8000 + [$3042 + [death sequence timer] - 1] ROM0:2FF7 19 add hl,de ;| ROM0:2FF8 7E ld a,(hl) ;| ROM0:2FF9 6F ld l,a ;| ROM0:2FFA 26 80 ld h,80 ;/ ROM0:2FFC 11 20 00 ld de,0020 ; LOOP_ALPHA ROM0:2FFF AF xor a ;\ ROM0:3000 77 ld (hl),a ;} [hl] = 0 ROM0:3001 19 add hl,de ; hl += 20h ROM0:3002 7C ld a,h ;\ ROM0:3003 FE 88 cp 88 ;} If [hl] < $8800: go to LOOP_ALPHA ROM0:3005 20 F8 jr nz,2FFF ;/ ROM0:3007 FA 59 D0 ld a,(D059) ;\ ROM0:300A 3D dec a ;} Decrement death sequence timer ROM0:300B EA 59 D0 ld (D059),a ;/ ROM0:300E 20 09 jr nz,3019 ; If [death sequence timer] = 0: ROM0:3010 3E FF ld a,FF ;\ ROM0:3012 EA 63 D0 ld (D063),a ;} Dying flag = FFh ROM0:3015 3E 05 ld a,05 ;\ ROM0:3017 E0 9B ld (FF00+9B),a ;} Game mode = dead ; BRANCH_ALPHA ROM0:3019 FA 05 C2 ld a,(C205) ;\ ROM0:301C E0 42 ld (FF00+42),a ;} Update LCD scroll Y ROM0:301E FA 06 C2 ld a,(C206) ;\ ROM0:3021 E0 43 ld (FF00+43),a ;} Update LCD scroll X ROM0:3023 CD A0 FF call FFA0 ; OAM DMA ROM0:3026 3E 03 ld a,03 ;\ ROM0:3028 EA 00 21 ld (2100),a ;| ROM0:302B FA 8B D0 ld a,(D08B) ;} If in Metroid Queen's room: execute subroutine $3:7CF0 ROM0:302E FE 11 cp 11 ;| ROM0:3030 CC F0 7C call z,7CF0 ;/ ROM0:3033 FA 4E D0 ld a,(D04E) ;\ ROM0:3036 EA 00 21 ld (2100),a ;} Restore bank ROM0:3039 3E 01 ld a,01 ;\ ROM0:303B E0 82 ld (FF00+82),a ;} Set v-blank handled ROM0:303D E1 pop hl ROM0:303E D1 pop de ROM0:303F C1 pop bc ROM0:3040 F1 pop af ROM0:3041 D9 reti ; Offsets to rows of 4 pixels within two VRAM tiles ; i << 2 & 1Ch | i >> 3 ROM0:3042 db 00, 04, 08, 0C, 10, 14, 18, 1C, 01, 05, 09, 0D, 11, 15, 19, 1D, 02, 06, 0A, 0E, 12, 16, 1A, 1E, 03, 07, 0B, 0F, 13, 17, 1B, 1F ; This below section is unused: ; This routine is only called by $0154, which only calls this routine if [death sequence timer] != 0 ; Death sequence timer is only set by $2FA2, which also sets the dying flag ; Dying flag is only cleared by $03B5, which also clears death sequence timer ; Looks like it would have been used if $2FC8 were used, or maybe the clone at $3F07 ; ***See the clone at $3F07 for comments*** ; BRANCH_BETA ROM0:3062 F0 97 ld a,(FF00+97) ROM0:3064 E6 01 and 01 ROM0:3066 20 37 jr nz,309F ROM0:3068 FA 5A D0 ld a,(D05A) ROM0:306B 6F ld l,a ROM0:306C FA 5B D0 ld a,(D05B) ROM0:306F 67 ld h,a ROM0:3070 11 10 00 ld de,0010 ROM0:3073 AF xor a ROM0:3074 77 ld (hl),a ROM0:3075 19 add hl,de ROM0:3076 7D ld a,l ROM0:3077 E6 F0 and F0 ROM0:3079 20 F8 jr nz,3073 ROM0:307B 7D ld a,l ROM0:307C D6 FF sub FF ROM0:307E 6F ld l,a ROM0:307F 7C ld a,h ROM0:3080 DE 00 sbc a,00 ROM0:3082 67 ld h,a ROM0:3083 7D ld a,l ROM0:3084 FE 10 cp 10 ROM0:3086 20 07 jr nz,308F ROM0:3088 C6 F0 add a,F0 ROM0:308A 6F ld l,a ROM0:308B 7C ld a,h ROM0:308C CE 00 adc a,00 ROM0:308E 67 ld h,a ROM0:308F 7D ld a,l ROM0:3090 EA 5A D0 ld (D05A),a ROM0:3093 7C ld a,h ROM0:3094 EA 5B D0 ld (D05B),a ROM0:3097 FE 85 cp 85 ROM0:3099 20 04 jr nz,309F ROM0:309B AF xor a ROM0:309C EA 59 D0 ld (D059),a ROM0:309F FA 05 C2 ld a,(C205) ROM0:30A2 E0 42 ld (FF00+42),a ROM0:30A4 FA 06 C2 ld a,(C206) ROM0:30A7 E0 43 ld (FF00+43),a ROM0:30A9 CD A0 FF call FFA0 ROM0:30AC FA 4E D0 ld a,(D04E) ROM0:30AF EA 00 21 ld (2100),a ROM0:30B2 3E 01 ld a,01 ROM0:30B4 E0 82 ld (FF00+82),a ROM0:30B6 E1 pop hl ROM0:30B7 D1 pop de ROM0:30B8 C1 pop bc ROM0:30B9 F1 pop af ROM0:30BA D9 reti } ;;; $30BB: Bomb-enemies collision detection ;;; { ; Called by $1:540E ROM0:30BB F0 C4 ld a,(FF00+C4) ;\ ROM0:30BD E0 98 ld (FF00+98),a ;} Bomb Y position = [sprite Y position] ROM0:30BF F0 C5 ld a,(FF00+C5) ;\ ROM0:30C1 E0 99 ld (FF00+99),a ;} Bomb X position = [sprite X position] ROM0:30C3 3E 03 ld a,03 ;\ ROM0:30C5 EA 4E D0 ld (D04E),a ;} Bank = 3 ROM0:30C8 EA 00 21 ld (2100),a ;/ ROM0:30CB 21 00 C6 ld hl,C600 ; hl = $C600 (enemy data address) ; LOOP ROM0:30CE 7E ld a,(hl) ;\ ROM0:30CF E6 0F and 0F ;} If [[hl]] & Fh = 0: ROM0:30D1 20 05 jr nz,30D8 ;/ ROM0:30D3 CD EA 30 call 30EA ; Bomb-enemy collision detection ROM0:30D6 38 09 jr c,30E1 ; If returned carry set: go to BRANCH_RETURN ROM0:30D8 11 20 00 ld de,0020 ;\ ROM0:30DB 19 add hl,de ;} hl += 20h ROM0:30DC 7C ld a,h ;\ ROM0:30DD FE C8 cp C8 ;} If [hl] = $C800: go to LOOP ROM0:30DF 20 ED jr nz,30CE ;/ ; BRANCH_RETURN ROM0:30E1 3E 01 ld a,01 ;\ ROM0:30E3 EA 4E D0 ld (D04E),a ;} Bank = 1 ROM0:30E6 EA 00 21 ld (2100),a ;/ ROM0:30E9 C9 ret } ;;; $30EA: Bomb-enemy collision detection (unit) ;;; { ;; Parameters: ;; hl: Enemy data address ;; Returns: ;; Carry: Set if collision ; Called by $30BB (bomb-enemies collision detection) ROM0:30EA E5 push hl ; Save hl ROM0:30EB 23 inc hl ;\ ROM0:30EC 2A ldi a,(hl) ;| ROM0:30ED FE E0 cp E0 ;} If [enemy Y position] >= E0h: go to BRANCH_NO_COLLISION ROM0:30EF D2 B2 31 jp nc,31B2 ;/ ROM0:30F2 E0 B7 ld (FF00+B7),a ; Working enemy Y position = [enemy Y position] ROM0:30F4 2A ldi a,(hl) ;\ ROM0:30F5 FE E0 cp E0 ;} If [enemy X position] >= E0h: go to BRANCH_NO_COLLISION ROM0:30F7 D2 B2 31 jp nc,31B2 ;/ ROM0:30FA E0 B8 ld (FF00+B8),a ; Working enemy X position = [enemy X position] ROM0:30FC 2A ldi a,(hl) ;\ ROM0:30FD E0 B9 ld (FF00+B9),a ;} Working enemy sprite ID = [enemy sprite ID] ROM0:30FF 23 inc hl ;\ ROM0:3100 2A ldi a,(hl) ;} Working enemy flip flags = [enemy flip flags] ROM0:3101 E0 BF ld (FF00+BF),a ;/ ROM0:3103 F0 B9 ld a,(FF00+B9) ;\ ROM0:3105 CB 27 sla a ;| ROM0:3107 5F ld e,a ;| ROM0:3108 16 00 ld d,00 ;| ROM0:310A CB 12 rl d ;| ROM0:310C 21 39 68 ld hl,6839 ;| ROM0:310F 19 add hl,de ;} hl = [$6839 + [enemy sprite ID] * 2] ROM0:3110 2A ldi a,(hl) ;| ROM0:3111 5F ld e,a ;| ROM0:3112 7E ld a,(hl) ;| ROM0:3113 67 ld h,a ;| ROM0:3114 6B ld l,e ;/ ROM0:3115 F0 B7 ld a,(FF00+B7) ROM0:3117 47 ld b,a ROM0:3118 F0 BF ld a,(FF00+BF) ;\ ROM0:311A CB 77 bit 6,a ;} If [enemy flip flags] & 40h = 0: ROM0:311C 20 0E jr nz,312C ;/ ROM0:311E 2A ldi a,(hl) ;\ ROM0:311F 80 add a,b ;| ROM0:3120 D6 10 sub 10 ;} Enemy top boundary = [enemy Y position] + [[hl]] - 10h ROM0:3122 E0 BA ld (FF00+BA),a ;/ ROM0:3124 2A ldi a,(hl) ;\ ROM0:3125 80 add a,b ;| ROM0:3126 C6 10 add a,10 ;} Enemy bottom boundary = [enemy Y position] + [[hl + 1]] + 10h ROM0:3128 E0 BB ld (FF00+BB),a ;/ ROM0:312A 18 0E jr 313A ROM0:312C 2A ldi a,(hl) ;\ Else ([enemy flip flags] & 40h != 0): ROM0:312D 90 sub b ;| ROM0:312E 2F cpl ;} Enemy bottom boundary = [enemy Y position] - 1 - [[hl]] + 10h ROM0:312F C6 10 add a,10 ;| ROM0:3131 E0 BB ld (FF00+BB),a ;/ ROM0:3133 2A ldi a,(hl) ;\ ROM0:3134 90 sub b ;| ROM0:3135 2F cpl ;} Enemy top boundary = [enemy Y position] - 1 + [[hl] + 1] - 10h ROM0:3136 D6 10 sub 10 ;| ROM0:3138 E0 BA ld (FF00+BA),a ;/ ROM0:313A F0 B8 ld a,(FF00+B8) ROM0:313C 47 ld b,a ROM0:313D F0 BF ld a,(FF00+BF) ;\ ROM0:313F CB 6F bit 5,a ;} If [enemy flip flags] & 20h = 0: ROM0:3141 20 0E jr nz,3151 ;/ ROM0:3143 2A ldi a,(hl) ;\ ROM0:3144 80 add a,b ;| ROM0:3145 D6 10 sub 10 ;} Enemy left boundary = [enemy X position] + [[hl] + 2] - 10h ROM0:3147 E0 BC ld (FF00+BC),a ;/ ROM0:3149 2A ldi a,(hl) ;\ ROM0:314A 80 add a,b ;| ROM0:314B C6 10 add a,10 ;} Enemy right boundary = [enemy X position] + [[hl] + 3] + 10h ROM0:314D E0 BD ld (FF00+BD),a ;/ ROM0:314F 18 0E jr 315F ROM0:3151 2A ldi a,(hl) ;\ Else ([enemy flip flags] & 20h != 0): ROM0:3152 90 sub b ;| ROM0:3153 2F cpl ;} Enemy right boundary = [enemy X position] - 1 - [[hl] + 2] + 10h ROM0:3154 C6 10 add a,10 ;| ROM0:3156 E0 BD ld (FF00+BD),a ;/ ROM0:3158 2A ldi a,(hl) ;\ ROM0:3159 90 sub b ;| ROM0:315A 2F cpl ;} Enemy left boundary = [enemy X position] - 1 + [[hl] + 3] - 10h ROM0:315B D6 10 sub 10 ;| ROM0:315D E0 BC ld (FF00+BC),a ;/ ROM0:315F F0 BA ld a,(FF00+BA) ;\ ROM0:3161 47 ld b,a ;| ROM0:3162 F0 BB ld a,(FF00+BB) ;| ROM0:3164 90 sub b ;| ROM0:3165 4F ld c,a ;} If not [enemy top boundary] <= [bomb Y position] <= [enemy bottom boundary]: go to BRANCH_NO_COLLISION ROM0:3166 F0 98 ld a,(FF00+98) ;| ROM0:3168 90 sub b ;| ROM0:3169 B9 cp c ;| ROM0:316A 30 46 jr nc,31B2 ;/ ROM0:316C F0 BC ld a,(FF00+BC) ;\ ROM0:316E 47 ld b,a ;| ROM0:316F F0 BD ld a,(FF00+BD) ;| ROM0:3171 90 sub b ;| ROM0:3172 4F ld c,a ;} If not [enemy left boundary] <= [bomb X position] <= [enemy right boundary]: go to BRANCH_NO_COLLISION ROM0:3173 F0 99 ld a,(FF00+99) ;| ROM0:3175 90 sub b ;| ROM0:3176 B9 cp c ;| ROM0:3177 30 39 jr nc,31B2 ;/ ROM0:3179 3E 09 ld a,09 ;\ ROM0:317B EA 5D D0 ld (D05D),a ;} $D05D = 9 ROM0:317E E1 pop hl ; Restore hl ROM0:317F 7D ld a,l ;\ ROM0:3180 EA 5E D0 ld (D05E),a ;| ROM0:3183 7C ld a,h ;} $D05E = [hl] ROM0:3184 EA 5F D0 ld (D05F),a ;/ ROM0:3187 FA 90 D0 ld a,(D090) ;\ ROM0:318A FE 03 cp 03 ;} If [Metroid Queen eating pose] = 3 (mouth closed): ROM0:318C 20 0B jr nz,3199 ;/ ROM0:318E F0 B9 ld a,(FF00+B9) ;\ ROM0:3190 FE F1 cp F1 ;} If [enemy sprite ID position] = F1h: ROM0:3192 20 05 jr nz,3199 ;/ ROM0:3194 3E 04 ld a,04 ;\ ROM0:3196 EA 90 D0 ld (D090),a ;} Metroid Queen eating pose = 4 (bombed whilst mouth closed) ROM0:3199 FA 90 D0 ld a,(D090) ;\ ROM0:319C FE 06 cp 06 ;} If [Metroid Queen eating pose] = 6 (swallowing Samus): ROM0:319E 20 10 jr nz,31B0 ;/ ROM0:31A0 F0 B9 ld a,(FF00+B9) ;\ ROM0:31A2 FE F3 cp F3 ;} If [enemy sprite ID position] = F3h: ROM0:31A4 20 0A jr nz,31B0 ;/ ROM0:31A6 3E 07 ld a,07 ;\ ROM0:31A8 EA 90 D0 ld (D090),a ;} Metroid Queen eating pose = 7 (bombed whilst swallowing Samus) ROM0:31AB 3E 1C ld a,1C ;\ ROM0:31AD EA 20 D0 ld (D020),a ;} Samus pose = escaping Metroid Queen ROM0:31B0 37 scf ; Set carry ROM0:31B1 C9 ret ; BRANCH_NO_COLLISION ROM0:31B2 E1 pop hl ; Restore hl ROM0:31B3 37 scf ;\ ROM0:31B4 3F ccf ;} Clear carry ROM0:31B5 C9 ret } ;;; $31B6: Projectile-enemies collision detection ;;; { ; Called by $1:52E0 (projectile-enemy collision handler) ROM0:31B6 FA 05 C2 ld a,(C205) ;\ ROM0:31B9 47 ld b,a ;| ROM0:31BA FA 03 C2 ld a,(C203) ;} Projectile Y position = [tile Y] - [scroll Y] ROM0:31BD 90 sub b ;| ROM0:31BE E0 98 ld (FF00+98),a ;/ ROM0:31C0 FA 06 C2 ld a,(C206) ;\ ROM0:31C3 47 ld b,a ;| ROM0:31C4 FA 04 C2 ld a,(C204) ;} Projectile X position = [tile X] - [scroll X] ROM0:31C7 90 sub b ;| ROM0:31C8 E0 99 ld (FF00+99),a ;/ ROM0:31CA 3E 03 ld a,03 ;\ ROM0:31CC EA 4E D0 ld (D04E),a ;} Bank = 3 ROM0:31CF EA 00 21 ld (2100),a ;/ ROM0:31D2 21 00 C6 ld hl,C600 ; hl = $C600 (enemy data address) ; LOOP ROM0:31D5 7E ld a,(hl) ;\ ROM0:31D6 E6 0F and 0F ;} If [[hl]] & Fh = 0: ROM0:31D8 20 05 jr nz,31DF ;/ ROM0:31DA CD F1 31 call 31F1 ; Projectile-enemy collision detection ROM0:31DD 38 09 jr c,31E8 ; If returned carry set: go to BRANCH_RETURN ROM0:31DF 11 20 00 ld de,0020 ;\ ROM0:31E2 19 add hl,de ;} hl += 20h ROM0:31E3 7C ld a,h ;\ ROM0:31E4 FE C8 cp C8 ;} If [hl] = $C800: go to LOOP ROM0:31E6 20 ED jr nz,31D5 ;/ ; BRANCH_RETURN ROM0:31E8 3E 01 ld a,01 ;\ ROM0:31EA EA 4E D0 ld (D04E),a ;} Bank = 1 ROM0:31ED EA 00 21 ld (2100),a ;/ ROM0:31F0 C9 ret } ;;; $31F1: Projectile-enemy collision detection (unit) ;;; { ;; Parameters: ;; hl: Enemy data address ;; Returns: ;; Carry: Set if collision ; Called by $31B6 (projectile-enemies collision detection) ROM0:31F1 E5 push hl ; Save hl ROM0:31F2 23 inc hl ;\ ROM0:31F3 2A ldi a,(hl) ;| ROM0:31F4 FE E0 cp E0 ;} If [enemy Y position] >= E0h: go to BRANCH_NO_COLLISION ROM0:31F6 D2 A7 32 jp nc,32A7 ;/ ROM0:31F9 E0 B7 ld (FF00+B7),a ; Working enemy Y position = [enemy Y position] ROM0:31FB 2A ldi a,(hl) ;\ ROM0:31FC FE E0 cp E0 ;} If [enemy X position] >= E0h: go to BRANCH_NO_COLLISION ROM0:31FE D2 A7 32 jp nc,32A7 ;/ ROM0:3201 E0 B8 ld (FF00+B8),a ; Working enemy X position = [enemy X position] ROM0:3203 2A ldi a,(hl) ;\ ROM0:3204 E0 B9 ld (FF00+B9),a ;} Working enemy sprite ID = [enemy sprite ID] ROM0:3206 23 inc hl ;\ ROM0:3207 7E ld a,(hl) ;} Working enemy flip flags = [enemy flip flags] ROM0:3208 E0 BF ld (FF00+BF),a ;/ ROM0:320A F0 B9 ld a,(FF00+B9) ;\ ROM0:320C 5F ld e,a ;| ROM0:320D 16 00 ld d,00 ;| ROM0:320F 21 3A 67 ld hl,673A ;| ROM0:3212 19 add hl,de ;} If [$673A + [enemy sprite ID]] (enemy damage) = 0: go to BRANCH_NO_COLLISION ROM0:3213 7E ld a,(hl) ;| ROM0:3214 A7 and a ;| ROM0:3215 CA A7 32 jp z,32A7 ;/ ROM0:3218 F0 B9 ld a,(FF00+B9) ;\ ROM0:321A CB 27 sla a ;| ROM0:321C 5F ld e,a ;| ROM0:321D 16 00 ld d,00 ;| ROM0:321F CB 12 rl d ;| ROM0:3221 21 39 68 ld hl,6839 ;| ROM0:3224 19 add hl,de ;} hl = [$6839 + [enemy sprite ID] * 2] ROM0:3225 2A ldi a,(hl) ;| ROM0:3226 5F ld e,a ;| ROM0:3227 7E ld a,(hl) ;| ROM0:3228 67 ld h,a ;| ROM0:3229 6B ld l,e ;/ ROM0:322A F0 B7 ld a,(FF00+B7) ROM0:322C 47 ld b,a ROM0:322D F0 BF ld a,(FF00+BF) ;\ ROM0:322F CB 77 bit 6,a ;} If [enemy flip flags] & 40h = 0: ROM0:3231 20 0A jr nz,323D ;/ ROM0:3233 2A ldi a,(hl) ;\ ROM0:3234 80 add a,b ;} Enemy top boundary = [enemy Y position] + [[hl]] ROM0:3235 E0 BA ld (FF00+BA),a ;/ ROM0:3237 2A ldi a,(hl) ;\ ROM0:3238 80 add a,b ;} Enemy bottom boundary = [enemy Y position] + [[hl + 1]] ROM0:3239 E0 BB ld (FF00+BB),a ;/ ROM0:323B 18 0A jr 3247 ROM0:323D 2A ldi a,(hl) ;\ Else ([enemy flip flags] & 40h != 0): ROM0:323E 90 sub b ;| ROM0:323F 2F cpl ;} Enemy bottom boundary = [enemy Y position] - 1 - [[hl]] ROM0:3240 E0 BB ld (FF00+BB),a ;/ ROM0:3242 2A ldi a,(hl) ;\ ROM0:3243 90 sub b ;| ROM0:3244 2F cpl ;} Enemy top boundary = [enemy Y position] - 1 + [[hl] + 1] ROM0:3245 E0 BA ld (FF00+BA),a ;/ ROM0:3247 F0 B8 ld a,(FF00+B8) ROM0:3249 47 ld b,a ROM0:324A F0 BF ld a,(FF00+BF) ;\ ROM0:324C CB 6F bit 5,a ;} If [enemy flip flags] & 20h = 0: ROM0:324E 20 0A jr nz,325A ;/ ROM0:3250 2A ldi a,(hl) ;\ ROM0:3251 80 add a,b ;} Enemy left boundary = [enemy X position] + [[hl] + 2] ROM0:3252 E0 BC ld (FF00+BC),a ;/ ROM0:3254 2A ldi a,(hl) ;\ ROM0:3255 80 add a,b ;} Enemy right boundary = [enemy X position] + [[hl] + 3] ROM0:3256 E0 BD ld (FF00+BD),a ;/ ROM0:3258 18 0A jr 3264 ROM0:325A 2A ldi a,(hl) ;\ Else ([enemy flip flags] & 20h != 0): ROM0:325B 90 sub b ;| ROM0:325C 2F cpl ;} Enemy right boundary = [enemy X position] - 1 - [[hl] + 2] ROM0:325D E0 BD ld (FF00+BD),a ;/ ROM0:325F 2A ldi a,(hl) ;\ ROM0:3260 90 sub b ;| ROM0:3261 2F cpl ;} Enemy left boundary = [enemy X position] - 1 + [[hl] + 3] ROM0:3262 E0 BC ld (FF00+BC),a ;/ ROM0:3264 F0 BA ld a,(FF00+BA) ;\ ROM0:3266 47 ld b,a ;| ROM0:3267 F0 BB ld a,(FF00+BB) ;| ROM0:3269 90 sub b ;| ROM0:326A 4F ld c,a ;} If not [enemy top boundary] <= [projectile Y position] <= [enemy bottom boundary]: go to BRANCH_NO_COLLISION ROM0:326B F0 98 ld a,(FF00+98) ;| ROM0:326D 90 sub b ;| ROM0:326E B9 cp c ;| ROM0:326F 30 36 jr nc,32A7 ;/ ROM0:3271 F0 BC ld a,(FF00+BC) ;\ ROM0:3273 47 ld b,a ;| ROM0:3274 F0 BD ld a,(FF00+BD) ;| ROM0:3276 90 sub b ;| ROM0:3277 4F ld c,a ;} If not [enemy left boundary] <= [projectile X position] <= [enemy right boundary]: go to BRANCH_NO_COLLISION ROM0:3278 F0 99 ld a,(FF00+99) ;| ROM0:327A 90 sub b ;| ROM0:327B B9 cp c ;| ROM0:327C 30 29 jr nc,32A7 ;/ ROM0:327E FA 8D D0 ld a,(D08D) ;\ ROM0:3281 EA 5D D0 ld (D05D),a ;} $D05D = [$D08D] ROM0:3284 E1 pop hl ; Restore hl ROM0:3285 7D ld a,l ;\ ROM0:3286 EA 5E D0 ld (D05E),a ;| ROM0:3289 7C ld a,h ;} $D05E = [hl] ROM0:328A EA 5F D0 ld (D05F),a ;/ ROM0:328D FA 12 D0 ld a,(D012) ;\ ROM0:3290 EA 60 D0 ld (D060),a ;} $D060 = [$D012] ROM0:3293 FA 8D D0 ld a,(D08D) ;\ ROM0:3296 FE 08 cp 08 ;} If [$D08D] = 8: ROM0:3298 20 0B jr nz,32A5 ;/ ROM0:329A F0 B9 ld a,(FF00+B9) ;\ ROM0:329C FE F6 cp F6 ;} If [enemy sprite ID position] = F6h: ROM0:329E 20 05 jr nz,32A5 ;/ ROM0:32A0 3E 10 ld a,10 ;\ ROM0:32A2 EA 90 D0 ld (D090),a ;} Metroid Queen eating pose = 10h (paralysed) ROM0:32A5 37 scf ; Set carry ROM0:32A6 C9 ret ; BRANCH_NO_COLLISION ROM0:32A7 E1 pop hl ; Restore hl ROM0:32A8 37 scf ;\ ROM0:32A9 3F ccf ;} Clear carry ROM0:32AA C9 ret } ;;; $32AB: ;;; { ROM0:32AB FA 20 D0 ld a,(D020) ;\ ROM0:32AE FE 18 cp 18 ;} If Samus in a Metroid Queen pose: go to clear carry ROM0:32B0 D2 98 36 jp nc,3698 ;/ ROM0:32B3 FA 63 D0 ld a,(D063) ;\ ROM0:32B6 A7 and a ;} If dying: go to clear carry ROM0:32B7 C2 98 36 jp nz,3698 ;/ ROM0:32BA FA 4F D0 ld a,(D04F) ;\ ROM0:32BD A7 and a ;} If [invincibility timer] != 0: go to clear carry ROM0:32BE C2 98 36 jp nz,3698 ;/ ROM0:32C1 FA 5C D0 ld a,(D05C) ;\ ROM0:32C4 A7 and a ;} If [$D05C] != 0: go to clear carry ROM0:32C5 C2 98 36 jp nz,3698 ;/ ROM0:32C8 FA 3C D0 ld a,(D03C) ;\ ROM0:32CB E0 99 ld (FF00+99),a ;} $FF99 = [Samus' X position on screen] ROM0:32CD 18 28 jr 32F7 ; Go to $32F7 } ;;; $32CF: ;;; { ROM0:32CF FA 20 D0 ld a,(D020) ;\ ROM0:32D2 FE 18 cp 18 ;} If Samus in a Metroid Queen pose: go to clear carry ROM0:32D4 D2 98 36 jp nc,3698 ;/ ROM0:32D7 FA 63 D0 ld a,(D063) ;\ ROM0:32DA A7 and a ;} If [dying flag]: go to clear carry ROM0:32DB C2 98 36 jp nz,3698 ;/ ROM0:32DE FA 59 D0 ld a,(D059) ;\ ROM0:32E1 A7 and a ;} If [death sequence timer]: go to clear carry ROM0:32E2 C2 98 36 jp nz,3698 ;/ ROM0:32E5 FA 4F D0 ld a,(D04F) ;\ ROM0:32E8 A7 and a ;} If [invincibility timer]: go to clear carry ROM0:32E9 C2 98 36 jp nz,3698 ;/ ROM0:32EC F0 CA ld a,(FF00+CA) ;\ ROM0:32EE 47 ld b,a ;| ROM0:32EF FA 04 C2 ld a,(C204) ;| ROM0:32F2 90 sub b ;} $FF99 = [tile X position] - [screen X position] + 50h ROM0:32F3 C6 50 add a,50 ;| ROM0:32F5 E0 99 ld (FF00+99),a ;/ } ;;; $32F7: ;;; { ROM0:32F7 F0 C8 ld a,(FF00+C8) ;\ ROM0:32F9 47 ld b,a ;| ROM0:32FA F0 C0 ld a,(FF00+C0) ;| ROM0:32FC 90 sub b ;} $FF98 = [Samus' Y position] - [screen Y position] ROM0:32FD C6 62 add a,62 ;| ROM0:32FF E0 98 ld (FF00+98),a ;/ ROM0:3301 3E 03 ld a,03 ;\ ROM0:3303 EA 4E D0 ld (D04E),a ;} Bank = 3 ROM0:3306 EA 00 21 ld (2100),a ;/ ROM0:3309 3E FF ld a,FF ;\ ROM0:330B EA 5C D0 ld (D05C),a ;} $D05C = FFh ROM0:330E 21 00 C6 ld hl,C600 ; hl = $C600 (enemy data address) ; LOOP ROM0:3311 7E ld a,(hl) ;\ ROM0:3312 E6 0F and 0F ;} If [[hl]] & Fh = 0: ROM0:3314 20 04 jr nz,331A ;/ ROM0:3316 CD 24 33 call 3324 ; Execute $3324 ROM0:3319 D8 ret c ; If carry set: return ROM0:331A 11 20 00 ld de,0020 ;\ ROM0:331D 19 add hl,de ;} hl += 20h ROM0:331E 7C ld a,h ;\ ROM0:331F FE C8 cp C8 ;} If [hl] != $C800: go to LOOP ROM0:3321 20 EE jr nz,3311 ;/ ROM0:3323 C9 ret } ;;; $3324: ;;; { ROM0:3324 E5 push hl ROM0:3325 23 inc hl ROM0:3326 2A ldi a,(hl) ROM0:3327 FE E0 cp E0 ROM0:3329 D2 89 34 jp nc,3489 ROM0:332C E0 B7 ld (FF00+B7),a ROM0:332E 2A ldi a,(hl) ROM0:332F FE E0 cp E0 ROM0:3331 D2 89 34 jp nc,3489 ROM0:3334 E0 B8 ld (FF00+B8),a ROM0:3336 2A ldi a,(hl) ROM0:3337 E0 B9 ld (FF00+B9),a ROM0:3339 23 inc hl ROM0:333A 2A ldi a,(hl) ROM0:333B E0 BF ld (FF00+BF),a ROM0:333D 23 inc hl ROM0:333E 23 inc hl ROM0:333F 23 inc hl ROM0:3340 23 inc hl ROM0:3341 23 inc hl ROM0:3342 7E ld a,(hl) ROM0:3343 E0 BE ld (FF00+BE),a ROM0:3345 F0 B9 ld a,(FF00+B9) ROM0:3347 CB 27 sla a ROM0:3349 5F ld e,a ROM0:334A 16 00 ld d,00 ROM0:334C CB 12 rl d ROM0:334E 21 39 68 ld hl,6839 ROM0:3351 19 add hl,de ROM0:3352 2A ldi a,(hl) ROM0:3353 5F ld e,a ROM0:3354 7E ld a,(hl) ROM0:3355 67 ld h,a ROM0:3356 6B ld l,e ROM0:3357 F0 B7 ld a,(FF00+B7) ROM0:3359 47 ld b,a ROM0:335A F0 BF ld a,(FF00+BF) ROM0:335C CB 77 bit 6,a ROM0:335E 20 0E jr nz,336E ROM0:3360 2A ldi a,(hl) ROM0:3361 80 add a,b ROM0:3362 D6 11 sub 11 ROM0:3364 E0 BA ld (FF00+BA),a ROM0:3366 2A ldi a,(hl) ROM0:3367 80 add a,b ROM0:3368 D6 04 sub 04 ROM0:336A E0 BB ld (FF00+BB),a ROM0:336C 18 0E jr 337C ROM0:336E 2A ldi a,(hl) ROM0:336F 90 sub b ROM0:3370 2F cpl ROM0:3371 D6 04 sub 04 ROM0:3373 E0 BB ld (FF00+BB),a ROM0:3375 2A ldi a,(hl) ROM0:3376 90 sub b ROM0:3377 2F cpl ROM0:3378 D6 11 sub 11 ROM0:337A E0 BA ld (FF00+BA),a ROM0:337C F0 B8 ld a,(FF00+B8) ROM0:337E 47 ld b,a ROM0:337F F0 BF ld a,(FF00+BF) ROM0:3381 CB 6F bit 5,a ROM0:3383 20 0E jr nz,3393 ROM0:3385 2A ldi a,(hl) ROM0:3386 80 add a,b ROM0:3387 D6 05 sub 05 ROM0:3389 E0 BC ld (FF00+BC),a ROM0:338B 2A ldi a,(hl) ROM0:338C 80 add a,b ROM0:338D C6 05 add a,05 ROM0:338F E0 BD ld (FF00+BD),a ROM0:3391 18 0E jr 33A1 ROM0:3393 2A ldi a,(hl) ROM0:3394 90 sub b ROM0:3395 2F cpl ROM0:3396 C6 05 add a,05 ROM0:3398 E0 BD ld (FF00+BD),a ROM0:339A 2A ldi a,(hl) ROM0:339B 90 sub b ROM0:339C 2F cpl ROM0:339D D6 05 sub 05 ROM0:339F E0 BC ld (FF00+BC),a ROM0:33A1 FA 20 D0 ld a,(D020) ROM0:33A4 E6 7F and 7F ROM0:33A6 5F ld e,a ROM0:33A7 16 00 ld d,00 ROM0:33A9 21 9B 36 ld hl,369B ROM0:33AC 19 add hl,de ROM0:33AD 2A ldi a,(hl) ROM0:33AE 47 ld b,a ROM0:33AF F0 BB ld a,(FF00+BB) ROM0:33B1 90 sub b ROM0:33B2 E0 BB ld (FF00+BB),a ROM0:33B4 F0 BA ld a,(FF00+BA) ROM0:33B6 47 ld b,a ROM0:33B7 F0 BB ld a,(FF00+BB) ROM0:33B9 90 sub b ROM0:33BA 4F ld c,a ROM0:33BB F0 98 ld a,(FF00+98) ROM0:33BD 90 sub b ROM0:33BE B9 cp c ROM0:33BF D2 89 34 jp nc,3489 ROM0:33C2 3E 01 ld a,01 ROM0:33C4 EA 23 C4 ld (C423),a ROM0:33C7 F0 BC ld a,(FF00+BC) ROM0:33C9 47 ld b,a ROM0:33CA F0 99 ld a,(FF00+99) ROM0:33CC 90 sub b ROM0:33CD 4F ld c,a ROM0:33CE F0 BD ld a,(FF00+BD) ROM0:33D0 90 sub b ROM0:33D1 57 ld d,a ROM0:33D2 CB 3A srl d ROM0:33D4 91 sub c ROM0:33D5 DA 89 34 jp c,3489 ROM0:33D8 7A ld a,d ROM0:33D9 B9 cp c ROM0:33DA 38 05 jr c,33E1 ROM0:33DC 3E FF ld a,FF ROM0:33DE EA 23 C4 ld (C423),a ROM0:33E1 FA 45 D0 ld a,(D045) ROM0:33E4 CB 57 bit 2,a ROM0:33E6 28 39 jr z,3421 ROM0:33E8 FA 20 D0 ld a,(D020) ROM0:33EB FE 02 cp 02 ROM0:33ED 28 07 jr z,33F6 ROM0:33EF FA 20 D0 ld a,(D020) ROM0:33F2 FE 0A cp 0A ROM0:33F4 20 2B jr nz,3421 ROM0:33F6 F0 BE ld a,(FF00+BE) ROM0:33F8 A7 and a ROM0:33F9 28 04 jr z,33FF ROM0:33FB CB 47 bit 0,a ROM0:33FD 28 27 jr z,3426 ROM0:33FF F0 B9 ld a,(FF00+B9) ROM0:3401 5F ld e,a ROM0:3402 16 00 ld d,00 ROM0:3404 21 3A 67 ld hl,673A ROM0:3407 19 add hl,de ROM0:3408 7E ld a,(hl) ROM0:3409 FE FF cp FF ROM0:340B 28 19 jr z,3426 ROM0:340D EA 24 C4 ld (C424),a ROM0:3410 E1 pop hl ROM0:3411 3E 10 ld a,10 ROM0:3413 EA 5D D0 ld (D05D),a ROM0:3416 7D ld a,l ROM0:3417 EA 5E D0 ld (D05E),a ROM0:341A 7C ld a,h ROM0:341B EA 5F D0 ld (D05F),a ROM0:341E 37 scf ROM0:341F 3F ccf ROM0:3420 C9 ret ROM0:3421 F0 BE ld a,(FF00+BE) ROM0:3423 A7 and a ROM0:3424 28 22 jr z,3448 ROM0:3426 E1 pop hl ROM0:3427 F0 B9 ld a,(FF00+B9) ROM0:3429 FE F7 cp F7 ROM0:342B 20 19 jr nz,3446 ROM0:342D FA 20 D0 ld a,(D020) ROM0:3430 FE 05 cp 05 ROM0:3432 28 08 jr z,343C ROM0:3434 FE 06 cp 06 ROM0:3436 28 04 jr z,343C ROM0:3438 FE 08 cp 08 ROM0:343A 20 0A jr nz,3446 ROM0:343C 3E 01 ld a,01 ROM0:343E EA 90 D0 ld (D090),a ROM0:3441 3E 18 ld a,18 ROM0:3443 EA 20 D0 ld (D020),a ROM0:3446 37 scf ROM0:3447 C9 ret ROM0:3448 F0 B9 ld a,(FF00+B9) ROM0:344A 5F ld e,a ROM0:344B 16 00 ld d,00 ROM0:344D 21 3A 67 ld hl,673A ROM0:3450 19 add hl,de ROM0:3451 7E ld a,(hl) ROM0:3452 FE FF cp FF ROM0:3454 28 D0 jr z,3426 ROM0:3456 FE FE cp FE ROM0:3458 28 1B jr z,3475 ROM0:345A A7 and a ROM0:345B 28 1B jr z,3478 ROM0:345D EA 24 C4 ld (C424),a ROM0:3460 3E 01 ld a,01 ROM0:3462 EA 22 C4 ld (C422),a ROM0:3465 E1 pop hl ROM0:3466 7D ld a,l ROM0:3467 EA 5E D0 ld (D05E),a ROM0:346A 7C ld a,h ROM0:346B EA 5F D0 ld (D05F),a ROM0:346E 3E 20 ld a,20 ROM0:3470 EA 5D D0 ld (D05D),a ROM0:3473 37 scf ROM0:3474 C9 ret ROM0:3475 CD 3C 2F call 2F3C ROM0:3478 E1 pop hl ROM0:3479 7D ld a,l ROM0:347A EA 5E D0 ld (D05E),a ROM0:347D 7C ld a,h ROM0:347E EA 5F D0 ld (D05F),a ROM0:3481 3E 20 ld a,20 ROM0:3483 EA 5D D0 ld (D05D),a ROM0:3486 37 scf ROM0:3487 3F ccf ROM0:3488 C9 ret ROM0:3489 E1 pop hl ROM0:348A 37 scf ROM0:348B 3F ccf ROM0:348C C9 ret } ;;; $348D: ;;; { ROM0:348D FA 20 D0 ld a,(D020) ;\ ROM0:3490 FE 18 cp 18 ;} If Samus in a Metroid Queen pose: go to clear carry ROM0:3492 D2 98 36 jp nc,3698 ;/ ROM0:3495 FA 63 D0 ld a,(D063) ;\ ROM0:3498 A7 and a ;} If [dying flag]: go to clear carry ROM0:3499 C2 98 36 jp nz,3698 ;/ ROM0:349C FA 4F D0 ld a,(D04F) ;\ ROM0:349F A7 and a ;} If [invincibility timer]: go to clear carry ROM0:34A0 C2 98 36 jp nz,3698 ;/ ROM0:34A3 FA 3B D0 ld a,(D03B) ROM0:34A6 C6 12 add a,12 ROM0:34A8 E0 98 ld (FF00+98),a ROM0:34AA AF xor a ROM0:34AB EA 3A C4 ld (C43A),a ROM0:34AE F0 CA ld a,(FF00+CA) ROM0:34B0 47 ld b,a ROM0:34B1 F0 C2 ld a,(FF00+C2) ROM0:34B3 90 sub b ROM0:34B4 C6 60 add a,60 ROM0:34B6 E0 99 ld (FF00+99),a ROM0:34B8 3E 03 ld a,03 ROM0:34BA EA 4E D0 ld (D04E),a ROM0:34BD EA 00 21 ld (2100),a ROM0:34C0 21 00 C6 ld hl,C600 ROM0:34C3 7E ld a,(hl) ROM0:34C4 E6 0F and 0F ROM0:34C6 20 1D jr nz,34E5 ROM0:34C8 CD 45 35 call 3545 ROM0:34CB 30 18 jr nc,34E5 ROM0:34CD FA 24 C4 ld a,(C424) ROM0:34D0 3D dec a ROM0:34D1 FE FE cp FE ROM0:34D3 38 0E jr c,34E3 ROM0:34D5 F0 9A ld a,(FF00+9A) ROM0:34D7 47 ld b,a ROM0:34D8 F0 C0 ld a,(FF00+C0) ROM0:34DA 90 sub b ROM0:34DB E0 C0 ld (FF00+C0),a ROM0:34DD F0 C1 ld a,(FF00+C1) ROM0:34DF DE 00 sbc a,00 ROM0:34E1 E0 C1 ld (FF00+C1),a ROM0:34E3 37 scf ROM0:34E4 C9 ret ROM0:34E5 11 20 00 ld de,0020 ROM0:34E8 19 add hl,de ROM0:34E9 7C ld a,h ROM0:34EA FE C8 cp C8 ROM0:34EC 20 D5 jr nz,34C3 ROM0:34EE C9 ret } ;;; $34EF: ;;; { ROM0:34EF FA 20 D0 ld a,(D020) ;\ ROM0:34F2 FE 18 cp 18 ;} If Samus in a Metroid Queen pose: go to clear carry ROM0:34F4 D2 98 36 jp nc,3698 ;/ ROM0:34F7 FA 63 D0 ld a,(D063) ;\ ROM0:34FA A7 and a ;} If [dying flag]: go to clear carry ROM0:34FB C2 98 36 jp nz,3698 ;/ ROM0:34FE FA 4F D0 ld a,(D04F) ;\ ROM0:3501 A7 and a ;} If [invincibility timer]: go to clear carry ROM0:3502 C2 98 36 jp nz,3698 ;/ ROM0:3505 FA 20 D0 ld a,(D020) ROM0:3508 E6 7F and 7F ROM0:350A 5F ld e,a ROM0:350B 16 00 ld d,00 ROM0:350D 21 9B 36 ld hl,369B ROM0:3510 19 add hl,de ROM0:3511 2A ldi a,(hl) ROM0:3512 47 ld b,a ROM0:3513 FA 3B D0 ld a,(D03B) ROM0:3516 80 add a,b ROM0:3517 E0 98 ld (FF00+98),a ROM0:3519 AF xor a ROM0:351A EA 3A C4 ld (C43A),a ROM0:351D F0 CA ld a,(FF00+CA) ROM0:351F 47 ld b,a ROM0:3520 F0 C2 ld a,(FF00+C2) ROM0:3522 90 sub b ROM0:3523 C6 60 add a,60 ROM0:3525 E0 99 ld (FF00+99),a ROM0:3527 3E 03 ld a,03 ROM0:3529 EA 4E D0 ld (D04E),a ROM0:352C EA 00 21 ld (2100),a ROM0:352F 21 00 C6 ld hl,C600 ROM0:3532 7E ld a,(hl) ROM0:3533 E6 0F and 0F ROM0:3535 20 04 jr nz,353B ROM0:3537 CD 45 35 call 3545 ROM0:353A D8 ret c ROM0:353B 11 20 00 ld de,0020 ROM0:353E 19 add hl,de ROM0:353F 7C ld a,h ROM0:3540 FE C8 cp C8 ROM0:3542 20 EE jr nz,3532 ROM0:3544 C9 ret } ;;; $3545: ;;; { ROM0:3545 E5 push hl ROM0:3546 23 inc hl ROM0:3547 2A ldi a,(hl) ROM0:3548 FE E0 cp E0 ROM0:354A D2 94 36 jp nc,3694 ROM0:354D E0 B7 ld (FF00+B7),a ROM0:354F 2A ldi a,(hl) ROM0:3550 FE E0 cp E0 ROM0:3552 D2 94 36 jp nc,3694 ROM0:3555 E0 B8 ld (FF00+B8),a ROM0:3557 2A ldi a,(hl) ROM0:3558 E0 B9 ld (FF00+B9),a ROM0:355A 23 inc hl ROM0:355B 2A ldi a,(hl) ROM0:355C E0 BF ld (FF00+BF),a ROM0:355E 23 inc hl ROM0:355F 23 inc hl ROM0:3560 23 inc hl ROM0:3561 23 inc hl ROM0:3562 23 inc hl ROM0:3563 7E ld a,(hl) ROM0:3564 E0 BE ld (FF00+BE),a ROM0:3566 F0 B9 ld a,(FF00+B9) ROM0:3568 CB 27 sla a ROM0:356A 5F ld e,a ROM0:356B 16 00 ld d,00 ROM0:356D CB 12 rl d ROM0:356F 21 39 68 ld hl,6839 ROM0:3572 19 add hl,de ROM0:3573 2A ldi a,(hl) ROM0:3574 5F ld e,a ROM0:3575 7E ld a,(hl) ROM0:3576 67 ld h,a ROM0:3577 6B ld l,e ROM0:3578 F0 B7 ld a,(FF00+B7) ROM0:357A 47 ld b,a ROM0:357B F0 BF ld a,(FF00+BF) ROM0:357D CB 77 bit 6,a ROM0:357F 20 0A jr nz,358B ROM0:3581 2A ldi a,(hl) ROM0:3582 80 add a,b ROM0:3583 E0 BA ld (FF00+BA),a ROM0:3585 2A ldi a,(hl) ROM0:3586 80 add a,b ROM0:3587 E0 BB ld (FF00+BB),a ROM0:3589 18 0A jr 3595 ROM0:358B 2A ldi a,(hl) ROM0:358C 90 sub b ROM0:358D 2F cpl ROM0:358E E0 BB ld (FF00+BB),a ROM0:3590 2A ldi a,(hl) ROM0:3591 90 sub b ROM0:3592 2F cpl ROM0:3593 E0 BA ld (FF00+BA),a ROM0:3595 F0 B8 ld a,(FF00+B8) ROM0:3597 47 ld b,a ROM0:3598 F0 BF ld a,(FF00+BF) ROM0:359A CB 6F bit 5,a ROM0:359C 20 0E jr nz,35AC ROM0:359E 2A ldi a,(hl) ROM0:359F 80 add a,b ROM0:35A0 D6 05 sub 05 ROM0:35A2 E0 BC ld (FF00+BC),a ROM0:35A4 2A ldi a,(hl) ROM0:35A5 80 add a,b ROM0:35A6 C6 05 add a,05 ROM0:35A8 E0 BD ld (FF00+BD),a ROM0:35AA 18 0E jr 35BA ROM0:35AC 2A ldi a,(hl) ROM0:35AD 90 sub b ROM0:35AE 2F cpl ROM0:35AF C6 05 add a,05 ROM0:35B1 E0 BD ld (FF00+BD),a ROM0:35B3 2A ldi a,(hl) ROM0:35B4 90 sub b ROM0:35B5 2F cpl ROM0:35B6 D6 05 sub 05 ROM0:35B8 E0 BC ld (FF00+BC),a ROM0:35BA F0 BA ld a,(FF00+BA) ROM0:35BC 47 ld b,a ROM0:35BD F0 BB ld a,(FF00+BB) ROM0:35BF 90 sub b ROM0:35C0 4F ld c,a ROM0:35C1 F0 98 ld a,(FF00+98) ROM0:35C3 90 sub b ROM0:35C4 E0 9A ld (FF00+9A),a ROM0:35C6 B9 cp c ROM0:35C7 D2 94 36 jp nc,3694 ROM0:35CA 3E 01 ld a,01 ROM0:35CC EA 23 C4 ld (C423),a ROM0:35CF F0 BC ld a,(FF00+BC) ROM0:35D1 47 ld b,a ROM0:35D2 F0 99 ld a,(FF00+99) ROM0:35D4 90 sub b ROM0:35D5 4F ld c,a ROM0:35D6 F0 BD ld a,(FF00+BD) ROM0:35D8 90 sub b ROM0:35D9 57 ld d,a ROM0:35DA CB 3A srl d ROM0:35DC 91 sub c ROM0:35DD DA 94 36 jp c,3694 ROM0:35E0 7A ld a,d ROM0:35E1 B9 cp c ROM0:35E2 38 05 jr c,35E9 ROM0:35E4 3E FF ld a,FF ROM0:35E6 EA 23 C4 ld (C423),a ROM0:35E9 FA 45 D0 ld a,(D045) ROM0:35EC CB 57 bit 2,a ROM0:35EE 28 39 jr z,3629 ROM0:35F0 FA 20 D0 ld a,(D020) ROM0:35F3 FE 02 cp 02 ROM0:35F5 28 07 jr z,35FE ROM0:35F7 FA 20 D0 ld a,(D020) ROM0:35FA FE 0A cp 0A ROM0:35FC 20 2B jr nz,3629 ROM0:35FE F0 BE ld a,(FF00+BE) ROM0:3600 A7 and a ROM0:3601 28 04 jr z,3607 ROM0:3603 CB 47 bit 0,a ROM0:3605 28 27 jr z,362E ROM0:3607 F0 B9 ld a,(FF00+B9) ROM0:3609 5F ld e,a ROM0:360A 16 00 ld d,00 ROM0:360C 21 3A 67 ld hl,673A ROM0:360F 19 add hl,de ROM0:3610 7E ld a,(hl) ROM0:3611 FE FF cp FF ROM0:3613 28 19 jr z,362E ROM0:3615 EA 24 C4 ld (C424),a ROM0:3618 E1 pop hl ROM0:3619 3E 10 ld a,10 ROM0:361B EA 5D D0 ld (D05D),a ROM0:361E 7D ld a,l ROM0:361F EA 5E D0 ld (D05E),a ROM0:3622 7C ld a,h ROM0:3623 EA 5F D0 ld (D05F),a ROM0:3626 37 scf ROM0:3627 3F ccf ROM0:3628 C9 ret ROM0:3629 F0 BE ld a,(FF00+BE) ROM0:362B A7 and a ROM0:362C 28 22 jr z,3650 ROM0:362E E1 pop hl ROM0:362F F0 B9 ld a,(FF00+B9) ROM0:3631 FE F7 cp F7 ROM0:3633 20 19 jr nz,364E ROM0:3635 FA 20 D0 ld a,(D020) ROM0:3638 FE 05 cp 05 ROM0:363A 28 08 jr z,3644 ROM0:363C FE 06 cp 06 ROM0:363E 28 04 jr z,3644 ROM0:3640 FE 08 cp 08 ROM0:3642 20 0A jr nz,364E ROM0:3644 3E 01 ld a,01 ROM0:3646 EA 90 D0 ld (D090),a ROM0:3649 3E 18 ld a,18 ROM0:364B EA 20 D0 ld (D020),a ROM0:364E 37 scf ROM0:364F C9 ret ROM0:3650 F0 B9 ld a,(FF00+B9) ROM0:3652 A7 and a ROM0:3653 28 D9 jr z,362E ROM0:3655 5F ld e,a ROM0:3656 16 00 ld d,00 ROM0:3658 21 3A 67 ld hl,673A ROM0:365B 19 add hl,de ROM0:365C 7E ld a,(hl) ROM0:365D FE FF cp FF ROM0:365F 28 CD jr z,362E ROM0:3661 FE FE cp FE ROM0:3663 28 1B jr z,3680 ROM0:3665 A7 and a ROM0:3666 28 1B jr z,3683 ROM0:3668 EA 24 C4 ld (C424),a ROM0:366B 3E 01 ld a,01 ROM0:366D EA 22 C4 ld (C422),a ROM0:3670 E1 pop hl ROM0:3671 7D ld a,l ROM0:3672 EA 5E D0 ld (D05E),a ROM0:3675 7C ld a,h ROM0:3676 EA 5F D0 ld (D05F),a ROM0:3679 3E 20 ld a,20 ROM0:367B EA 5D D0 ld (D05D),a ROM0:367E 37 scf ROM0:367F C9 ret ROM0:3680 CD 3C 2F call 2F3C ROM0:3683 E1 pop hl ROM0:3684 7D ld a,l ROM0:3685 EA 5E D0 ld (D05E),a ROM0:3688 7C ld a,h ROM0:3689 EA 5F D0 ld (D05F),a ROM0:368C 3E 20 ld a,20 ROM0:368E EA 5D D0 ld (D05D),a ROM0:3691 37 scf ROM0:3692 3F ccf ROM0:3693 C9 ret ROM0:3694 E1 pop hl ROM0:3695 37 scf ROM0:3696 3F ccf ROM0:3697 C9 ret } ;;; $3698: Clear carry (unit) ;;; { ROM0:3698 37 scf ROM0:3699 3F ccf ROM0:369A C9 ret } ;;; $369B: ;;; { ROM0:369B EC undefined opcode ROM0:369C F4 undefined opcode ROM0:369D FC undefined opcode ROM0:369E EC undefined opcode ROM0:369F F6 04 or 04 ROM0:36A1 04 inc b ROM0:36A2 EC undefined opcode ROM0:36A3 04 inc b ROM0:36A4 EC undefined opcode ROM0:36A5 EC undefined opcode ROM0:36A6 04 inc b ROM0:36A7 04 inc b ROM0:36A8 04 inc b ROM0:36A9 04 inc b ROM0:36AA EC undefined opcode ROM0:36AB 04 inc b ROM0:36AC EC undefined opcode ROM0:36AD 04 inc b ROM0:36AE EC undefined opcode ROM0:36AF 04 inc b } ;;; $36B0: Game mode 5: dead ;;; { ; LOOP_WAIT ROM0:36B0 CD 84 23 call 2384 ; Handle audio ROM0:36B3 CD 1C 03 call 031C ; Wait for interrupt and update in-game timer ROM0:36B6 FA D6 CE ld a,(CED6) ;\ ROM0:36B9 FE 0B cp 0B ;} If [noise channel sound effect playing] = Samus killed: go to LOOP_WAIT ROM0:36BB 28 F3 jr z,36B0 ;/ ROM0:36BD AF xor a ;\ ROM0:36BE EA 8B D0 ld (D08B),a ;} Metroid Queen's room flag = 0 ROM0:36C1 CD 9C 03 call 039C ; Disable LCD display ROM0:36C4 CD 7B 03 call 037B ; Clear VRAM tilemap ROM0:36C7 AF xor a ;\ ROM0:36C8 E0 8D ld (FF00+8D),a ;} OAM stack pointer = 0 ROM0:36CA CD CA 3E call 3ECA ; Clear OAM ROM0:36CD 3E 05 ld a,05 ;\ ROM0:36CF EA 4E D0 ld (D04E),a ;| ROM0:36D2 EA 00 21 ld (2100),a ;| ROM0:36D5 21 34 5F ld hl,5F34 ;| ROM0:36D8 11 00 88 ld de,8800 ;| ROM0:36DB 01 00 10 ld bc,1000 ;| ;| ROM0:36DE 2A ldi a,(hl) ;} $8800..97FF = [$5:5F34..6F33] ROM0:36DF 12 ld (de),a ;| ROM0:36E0 13 inc de ;| ROM0:36E1 0B dec bc ;| ROM0:36E2 78 ld a,b ;| ROM0:36E3 B1 or c ;| ROM0:36E4 20 F8 jr nz,36DE ;/ ROM0:36E6 21 11 37 ld hl,3711 ;\ ROM0:36E9 11 06 99 ld de,9906 ;| ;| ROM0:36EC 2A ldi a,(hl) ;| ROM0:36ED FE 80 cp 80 ;} $9906..0E = [$3711..19] ROM0:36EF 28 04 jr z,36F5 ;| ROM0:36F1 12 ld (de),a ;| ROM0:36F2 13 inc de ;| ROM0:36F3 18 F7 jr 36EC ;/ ROM0:36F5 AF xor a ;\ ROM0:36F6 EA 05 C2 ld (C205),a ;} Scroll Y = 0 ROM0:36F9 EA 06 C2 ld (C206),a ; Scroll X = 0 ROM0:36FC E0 42 ld (FF00+42),a ; LCD scroll X = 0 ROM0:36FE E0 43 ld (FF00+43),a ; LCD scroll Y = 0 ROM0:3700 3E C3 ld a,C3 ;\ ROM0:3702 EA 19 C2 ld (C219),a ;} LCD control = $C219 = C3h ROM0:3705 E0 40 ld (FF00+40),a ;/ ROM0:3707 3E FF ld a,FF ;\ ROM0:3709 EA 66 D0 ld (D066),a ;} Loading timer = FFh ROM0:370C 3E 07 ld a,07 ;\ ROM0:370E E0 9B ld (FF00+9B),a ;} Game mode = game over ROM0:3710 C9 ret ROM0:3711 db 56, 50, 5C, 54, FF, 5E, 65, 54, 61, 80 ; 'GAME OVER' } ;;; $371B: Game mode 7: game over ;;; { ROM0:371B CD 84 23 call 2384 ; Handle audio ROM0:371E CD 1C 03 call 031C ; Wait for interrupt and update in-game timer ROM0:3721 FA 66 D0 ld a,(D066) ;\ ROM0:3724 A7 and a ;} If [loading timer] = 0: reboot ROM0:3725 28 05 jr z,372C ;/ ROM0:3727 F0 81 ld a,(FF00+81) ;\ ROM0:3729 FE 08 cp 08 ;} If newly pressed (only) start: reboot ROM0:372B C0 ret nz ;/ ROM0:372C C3 FB 01 jp 01FB ; Go to boot } ;;; $372F: Handle item pickup ;;; { ; Called by: Game mode 4: in-game ROM0:372F FA 6C D0 ld a,(D06C) ;\ ROM0:3732 A7 and a ;} If [item pickup] = 0: return ROM0:3733 C8 ret z ;/ ROM0:3734 CD 5E 2C call 2C5E ; Wait a frame ROM0:3737 CD 5E 2C call 2C5E ; Wait a frame ROM0:373A CD 5E 2C call 2C5E ; Wait a frame ROM0:373D CD 5E 2C call 2C5E ; Wait a frame ROM0:3740 FA 6C D0 ld a,(D06C) ;\ ROM0:3743 EA 93 D0 ld (D093),a ;} $D093 = [item pickup] ROM0:3746 47 ld b,a ROM0:3747 3E 12 ld a,12 ;\ ROM0:3749 EA C0 CE ld (CEC0),a ;} Play sound effect 12h ROM0:374C 3E 01 ld a,01 ;\ ROM0:374E EA DE CE ld (CEDE),a ;} Play item-get music ROM0:3751 3E 01 ld a,01 ;\ ROM0:3753 EA 67 D0 ld (D067),a ;| ROM0:3756 3E 60 ld a,60 ;} Loading timer = 160h ROM0:3758 EA 66 D0 ld (D066),a ;/ ROM0:375B 78 ld a,b ;\ ROM0:375C FE 0D cp 0D ;} If [item pickup] < Dh: go to BRANCH_ABILITY ROM0:375E 38 2B jr c,378B ;/ ROM0:3760 FE 0E cp 0E ;\ ROM0:3762 30 10 jr nc,3774 ;} If [item pickup] >= Eh: go to BRANCH_REFILL ROM0:3764 3E 05 ld a,05 ;\ ROM0:3766 EA DE CE ld (CEDE),a ;} Play missile pickup music ROM0:3769 AF xor a ;\ ROM0:376A EA 67 D0 ld (D067),a ;| ROM0:376D 3E 60 ld a,60 ;} Loading timer = 60h ROM0:376F EA 66 D0 ld (D066),a ;/ ROM0:3772 18 17 jr 378B ; BRANCH_REFILL ROM0:3774 3E 00 ld a,00 ROM0:3776 EA DE CE ld (CEDE),a ; Isolated sound effect to play = 0 ROM0:3779 EA 67 D0 ld (D067),a ;\ ROM0:377C EA 66 D0 ld (D066),a ;} Loading timer = 0 ROM0:377F 3E 0E ld a,0E ;\ ROM0:3781 EA C0 CE ld (CEC0),a ;} Play picked up energy drop sound effect ROM0:3784 28 05 jr z,378B ROM0:3786 3E 0C ld a,0C ;\ ROM0:3788 EA C0 CE ld (CEC0),a ;} Play picked up missile drop sound effect ; BRANCH_ABILITY ROM0:378B FA DF CE ld a,(CEDF) ;\ ROM0:378E FE 0E cp 0E ;} If [isolated sound effect playing] = Eh: ROM0:3790 20 05 jr nz,3797 ;/ ROM0:3792 3E 00 ld a,00 ;\ ROM0:3794 EA DE CE ld (CEDE),a ;} Isolated sound effect to play = 0 ROM0:3797 78 ld a,b ;\ ROM0:3798 3D dec a ;} Execute [$379A + ([item pickup] - 1) * 2] ROM0:3799 EF rst 28 ;/ ROM0:379A dw 37B8, 37DD, 3802, 3827, 3845, 3850, 38B9, 3923, 392E, 3958, 3963, 397A, 39BF, 398F, 399C } ;;; $37B8: Handle item pickup - [item pickup] = 1 (plasma) ;;; { ROM0:37B8 3E 04 ld a,04 ROM0:37BA EA 55 D0 ld (D055),a ROM0:37BD 21 D6 37 ld hl,37D6 ROM0:37C0 CD 53 27 call 2753 ROM0:37C3 FA 4D D0 ld a,(D04D) ROM0:37C6 FE 08 cp 08 ROM0:37C8 CA 01 3A jp z,3A01 ROM0:37CB 3E 04 ld a,04 ROM0:37CD EA 4D D0 ld (D04D),a ROM0:37D0 EA 55 D0 ld (D055),a ROM0:37D3 C3 01 3A jp 3A01 } ;;; $37D6: Spazer/plasma beam VRAM update entry ;;; { ; ________________ Bank ; | _____________ Sounce ; | | ________ Destination ; | | | ___ Size ; | | | | ROM0:37D6 dx 06,4080,87E0,0020 } ;;; $37DD: Handle item pickup - [item pickup] = 2 (ice-beam) ;;; { ROM0:37DD 3E 01 ld a,01 ROM0:37DF EA 55 D0 ld (D055),a ROM0:37E2 21 FB 37 ld hl,37FB ROM0:37E5 CD 53 27 call 2753 ROM0:37E8 FA 4D D0 ld a,(D04D) ROM0:37EB FE 08 cp 08 ROM0:37ED CA 01 3A jp z,3A01 ROM0:37F0 3E 01 ld a,01 ROM0:37F2 EA 4D D0 ld (D04D),a ROM0:37F5 EA 55 D0 ld (D055),a ROM0:37F8 C3 01 3A jp 3A01 } ;;; $37FB: Ice beam VRAM update entry ;;; { ; ________________ Bank ; | _____________ Sounce ; | | ________ Destination ; | | | ___ Size ; | | | | ROM0:37FB dx 06,4040,87E0,0020 } ;;; $3802: Handle item pickup - [item pickup] = 3 (wave) ;;; { ROM0:3802 3E 02 ld a,02 ROM0:3804 EA 55 D0 ld (D055),a ROM0:3807 21 20 38 ld hl,3820 ROM0:380A CD 53 27 call 2753 ROM0:380D FA 4D D0 ld a,(D04D) ROM0:3810 FE 08 cp 08 ROM0:3812 CA 01 3A jp z,3A01 ROM0:3815 3E 02 ld a,02 ROM0:3817 EA 4D D0 ld (D04D),a ROM0:381A EA 55 D0 ld (D055),a ROM0:381D C3 01 3A jp 3A01 } ;;; $37FB: Wave beam VRAM update entry ;;; { ; ________________ Bank ; | _____________ Sounce ; | | ________ Destination ; | | | ___ Size ; | | | | ROM0:3820 dx 06,4060,87E0,0020 } ;;; $3827: Handle item pickup - [item pickup] = 4 (spazer) ;;; { ROM0:3827 3E 03 ld a,03 ROM0:3829 EA 55 D0 ld (D055),a ROM0:382C 21 D6 37 ld hl,37D6 ROM0:382F CD 53 27 call 2753 ROM0:3832 FA 4D D0 ld a,(D04D) ROM0:3835 FE 08 cp 08 ROM0:3837 CA 01 3A jp z,3A01 ROM0:383A 3E 03 ld a,03 ROM0:383C EA 4D D0 ld (D04D),a ROM0:383F EA 55 D0 ld (D055),a ROM0:3842 C3 01 3A jp 3A01 } ;;; $3845: Handle item pickup - [item pickup] = 5 (bomb) ;;; { ROM0:3845 FA 45 D0 ld a,(D045) ROM0:3848 CB C7 set 0,a ROM0:384A EA 45 D0 ld (D045),a ROM0:384D C3 01 3A jp 3A01 } ;;; $3850: Handle item pickup - [item pickup] = 6 (screw attack) ;;; { ROM0:3850 FA 45 D0 ld a,(D045) ROM0:3853 CB D7 set 2,a ROM0:3855 EA 45 D0 ld (D045),a ROM0:3858 CB 5F bit 3,a ROM0:385A 20 0F jr nz,386B ROM0:385C 21 8F 38 ld hl,388F ROM0:385F CD 53 27 call 2753 ROM0:3862 21 96 38 ld hl,3896 ROM0:3865 CD 53 27 call 2753 ROM0:3868 C3 01 3A jp 3A01 ROM0:386B 21 9D 38 ld hl,389D ROM0:386E CD 53 27 call 2753 ROM0:3871 21 A4 38 ld hl,38A4 ROM0:3874 CD 53 27 call 2753 ROM0:3877 C3 01 3A jp 3A01 } ;;; $387A: Samus VRAM update entries ;;; { ; ________________ Bank ; | _____________ Sounce ; | | ________ Destination ; | | | ___ Size ; | | | | ROM0:387A dx 06,4E20,8000,07B0, ; Varia suit ROM0:3881 06,40A0,8500,0070, ;\ ROM0:3888 06,4110,8600,0050, ;} Spin jump - space jump ROM0:388F 06,4160,8500,0070, ;\ ROM0:3896 06,41D0,8600,0050, ;} Spin jump - screw attack ROM0:389D 06,4220,8500,0070, ;\ ROM0:38A4 06,4290,8600,0050, ;} Spin jump - screw attack space jump ROM0:38AB 06,42E0,8590,0020, ;\ ROM0:38B2 06,4300,8690,0020 ;} Spring ball } ;;; $38B9: Handle item pickup - [item pickup] = 7 (varia) ;;; { ; LOOP_WAIT ROM0:38B9 CD 93 3E call 3E93 ; Draw Samus ROM0:38BC CD DE 05 call 05DE ; Handle enemies ROM0:38BF 3E 01 ld a,01 ;\ ROM0:38C1 EA 4E D0 ld (D04E),a ;} Bank = 1 ROM0:38C4 EA 00 21 ld (2100),a ;/ ROM0:38C7 CD 2C 4B call 4B2C ; Drawing blinking Metroid in HUD ROM0:38CA CD 88 3E call 3E88 ; Clear deleted OAM ROM0:38CD 3E 80 ld a,80 ;\ ROM0:38CF E0 4A ld (FF00+4A),a ;} Window Y = 0 ROM0:38D1 CD 5E 2C call 2C5E ; Wait a frame ROM0:38D4 FA 67 D0 ld a,(D067) ;\ ROM0:38D7 A7 and a ;| ROM0:38D8 20 DF jr nz,38B9 ;| ROM0:38DA FA 66 D0 ld a,(D066) ;} If [loading timer] != 0: go to LOOP_WAIT ROM0:38DD A7 and a ;| ROM0:38DE 20 D9 jr nz,38B9 ;/ ROM0:38E0 FA 45 D0 ld a,(D045) ;\ ROM0:38E3 CB F7 set 6,a ;} Equip varia suit ROM0:38E5 EA 45 D0 ld (D045),a ;/ ROM0:38E8 3E 80 ld a,80 ;\ ROM0:38EA EA 20 D0 ld (D020),a ;} Samus' pose = 20h ROM0:38ED CD 93 3E call 3E93 ; Draw Samus ROM0:38F0 3E 10 ld a,10 ;\ ROM0:38F2 EA 2C D0 ld (D02C),a ;} Samus' animation counter = 10h ROM0:38F5 CD 5E 2C call 2C5E ; Wait a frame ROM0:38F8 3E 1D ld a,1D ;\ ROM0:38FA EA C0 CE ld (CEC0),a ;} Play varia suit transformation sound effect ROM0:38FD 3E FF ld a,FF ;\ ROM0:38FF EA 8C D0 ld (D08C),a ;} $D08C = FFh ROM0:3902 21 7A 38 ld hl,387A ; hl = $387A ROM0:3905 CD E3 27 call 27E3 ; Execute subroutine $27E3 ROM0:3908 AF xor a ;\ ROM0:3909 EA 8C D0 ld (D08C),a ;} $D08C = 0 ROM0:390C 21 7A 38 ld hl,387A ; hl = $387A ROM0:390F CD 53 27 call 2753 ; Load graphics ROM0:3912 21 42 22 ld hl,2242 ; hl = arm cannon missiles out VRAM update entry ROM0:3915 FA 4D D0 ld a,(D04D) ;\ ROM0:3918 FE 08 cp 08 ;} If [weapon equipped] = missile: load graphics ROM0:391A CC 53 27 call z,2753 ;/ ROM0:391D CD 84 3A call 3A84 ; Execute subroutine $3A84 ROM0:3920 C3 01 3A jp 3A01 ; Go to $3A01 } ;;; $3923: Handle item pickup - [item pickup] = 8 (hi-jump) ;;; { ROM0:3923 FA 45 D0 ld a,(D045) ROM0:3926 CB CF set 1,a ROM0:3928 EA 45 D0 ld (D045),a ROM0:392B C3 01 3A jp 3A01 } ;;; $392E: Handle item pickup - [item pickup] = 9 (space jump) ;;; { ROM0:392E FA 45 D0 ld a,(D045) ROM0:3931 CB DF set 3,a ROM0:3933 EA 45 D0 ld (D045),a ROM0:3936 CB 57 bit 2,a ROM0:3938 20 0F jr nz,3949 ROM0:393A 21 81 38 ld hl,3881 ROM0:393D CD 53 27 call 2753 ROM0:3940 21 88 38 ld hl,3888 ROM0:3943 CD 53 27 call 2753 ROM0:3946 C3 01 3A jp 3A01 ROM0:3949 21 9D 38 ld hl,389D ROM0:394C CD 53 27 call 2753 ROM0:394F 21 A4 38 ld hl,38A4 ROM0:3952 CD 53 27 call 2753 ROM0:3955 C3 01 3A jp 3A01 } ;;; $3958: Handle item pickup - [item pickup] = Ah (spider ball) ;;; { ROM0:3958 FA 45 D0 ld a,(D045) ROM0:395B CB EF set 5,a ROM0:395D EA 45 D0 ld (D045),a ROM0:3960 C3 01 3A jp 3A01 } ;;; $3963: Handle item pickup - [item pickup] = Bh (spring ball) ;;; { ROM0:3963 FA 45 D0 ld a,(D045) ROM0:3966 CB E7 set 4,a ROM0:3968 EA 45 D0 ld (D045),a ROM0:396B 21 AB 38 ld hl,38AB ROM0:396E CD 53 27 call 2753 ROM0:3971 21 B2 38 ld hl,38B2 ROM0:3974 CD 53 27 call 2753 ROM0:3977 C3 01 3A jp 3A01 } ;;; $397A: Handle item pickup - [item pickup] = Ch (energy expansion) ;;; { ROM0:397A FA 50 D0 ld a,(D050) ROM0:397D FE 05 cp 05 ROM0:397F 28 04 jr z,3985 ROM0:3981 3C inc a ROM0:3982 EA 50 D0 ld (D050),a ROM0:3985 EA 52 D0 ld (D052),a ROM0:3988 3E 99 ld a,99 ROM0:398A EA 51 D0 ld (D051),a ROM0:398D 18 72 jr 3A01 } ;;; $398F: Handle item pickup - [item pickup] = Eh (energy refill) ;;; { ROM0:398F FA 50 D0 ld a,(D050) ROM0:3992 EA 52 D0 ld (D052),a ROM0:3995 3E 99 ld a,99 ROM0:3997 EA 51 D0 ld (D051),a ROM0:399A 18 65 jr 3A01 } ;;; $399C: Handle item pickup - [item pickup] = Fh (reached the gunship) ;;; { ROM0:399C FA 89 D0 ld a,(D089) ;\ ROM0:399F A7 and a ;} If [real number of metroids remaining] = 0: ROM0:39A0 20 0F jr nz,39B1 ;/ ROM0:39A2 3E FF ld a,FF ;\ ROM0:39A4 EA 66 D0 ld (D066),a ;} Loading timer = FFh ROM0:39A7 3E 08 ld a,08 ;\ ROM0:39A9 EA DE CE ld (CEDE),a ;} Play reached the gunship music ROM0:39AC 3E 12 ld a,12 ;\ ROM0:39AE E0 9B ld (FF00+9B),a ;} Game mode = reached the gunship ROM0:39B0 C9 ret ROM0:39B1 FA 81 D0 ld a,(D081) ;\ ROM0:39B4 EA 53 D0 ld (D053),a ;| ROM0:39B7 FA 82 D0 ld a,(D082) ;} Samus' missiles = [Samus' max missiles] ROM0:39BA EA 54 D0 ld (D054),a ;/ ROM0:39BD 18 42 jr 3A01 ; Go to $3A01 } ;;; $39BF: Handle item pickup - [item pickup] = Dh (missile expansion) ;;; { ROM0:39BF FA 81 D0 ld a,(D081) ROM0:39C2 C6 10 add a,10 ROM0:39C4 27 daa ROM0:39C5 EA 81 D0 ld (D081),a ROM0:39C8 FA 82 D0 ld a,(D082) ROM0:39CB CE 00 adc a,00 ROM0:39CD 27 daa ROM0:39CE EA 82 D0 ld (D082),a ROM0:39D1 FE 10 cp 10 ROM0:39D3 38 0A jr c,39DF ROM0:39D5 3E 99 ld a,99 ROM0:39D7 EA 81 D0 ld (D081),a ROM0:39DA 3E 09 ld a,09 ROM0:39DC EA 82 D0 ld (D082),a ROM0:39DF FA 53 D0 ld a,(D053) ROM0:39E2 C6 10 add a,10 ROM0:39E4 27 daa ROM0:39E5 EA 53 D0 ld (D053),a ROM0:39E8 FA 54 D0 ld a,(D054) ROM0:39EB CE 00 adc a,00 ROM0:39ED 27 daa ROM0:39EE EA 54 D0 ld (D054),a ROM0:39F1 FE 10 cp 10 ROM0:39F3 38 0C jr c,3A01 ROM0:39F5 3E 99 ld a,99 ROM0:39F7 EA 53 D0 ld (D053),a ROM0:39FA 3E 09 ld a,09 ROM0:39FC EA 54 D0 ld (D054),a ROM0:39FF 18 00 jr 3A01 } ;;; $3A01: ;;; { ; LOOP_WAIT ROM0:3A01 CD 93 3E call 3E93 ; Draw Samus ROM0:3A04 CD 9E 3E call 3E9E ; Drawing blinking Metroid in HUD ROM0:3A07 3E 02 ld a,02 ;\ ROM0:3A09 EA 4E D0 ld (D04E),a ;| ROM0:3A0C EA 00 21 ld (2100),a ;} Handle enemies ROM0:3A0F CD 00 40 call 4000 ;/ ROM0:3A12 CD 84 23 call 2384 ; Handle audio ROM0:3A15 CD 88 3E call 3E88 ; Clear deleted OAM ROM0:3A18 FA 93 D0 ld a,(D093) ;\ ROM0:3A1B FE 0B cp 0B ;} If [$D093] < Bh: ROM0:3A1D 30 04 jr nc,3A23 ;/ ROM0:3A1F 3E 80 ld a,80 ;\ ROM0:3A21 E0 4A ld (FF00+4A),a ;} IO window Y position = 80h ROM0:3A23 CD 1C 03 call 031C ; Wait for interrupt and update in-game timer ROM0:3A26 FA 67 D0 ld a,(D067) ;\ ROM0:3A29 A7 and a ;| ROM0:3A2A 20 D5 jr nz,3A01 ;| ROM0:3A2C FA 66 D0 ld a,(D066) ;} If [loading timer] != 0: go to LOOP_WAIT ROM0:3A2F A7 and a ;| ROM0:3A30 20 CF jr nz,3A01 ;/ ROM0:3A32 FA 93 D0 ld a,(D093) ;\ ROM0:3A35 FE 0E cp 0E ;} If [$D093] < Eh: ROM0:3A37 30 0C jr nc,3A45 ;/ ROM0:3A39 FA DF CE ld a,(CEDF) ;\ ROM0:3A3C FE 0E cp 0E ;} If [isolated sound effect playing] != earthquake: ROM0:3A3E 28 05 jr z,3A45 ;/ ROM0:3A40 3E 03 ld a,03 ;\ ROM0:3A42 EA DE CE ld (CEDE),a ;} Isolated sound effect to play = 3 (restores some audio state) ROM0:3A45 AF xor a ;\ ROM0:3A46 EA 93 D0 ld (D093),a ;} $D093 = 0 ROM0:3A49 3E 03 ld a,03 ;\ ROM0:3A4B EA 6D D0 ld (D06D),a ;} $D06D = 3 ROM0:3A4E FA 6F D0 ld a,(D06F) ;\ ROM0:3A51 EA 66 C4 ld (C466),a ;} $C466 = [$D06F] ROM0:3A54 FA 70 D0 ld a,(D070) ;\ ROM0:3A57 EA 67 C4 ld (C467),a ;| ROM0:3A5A FA 71 D0 ld a,(D071) ;} $C467 = [$D070] ROM0:3A5D EA 68 C4 ld (C468),a ;/ ; LOOP_BETA ROM0:3A60 CD 93 3E call 3E93 ; Draw Samus ROM0:3A63 CD 9E 3E call 3E9E ; Drawing blinking Metroid in HUD ROM0:3A66 CD AB 32 call 32AB ; Execute subroutine $32AB ROM0:3A69 3E 02 ld a,02 ;\ ROM0:3A6B EA 4E D0 ld (D04E),a ;| ROM0:3A6E EA 00 21 ld (2100),a ;} Handle enemies ROM0:3A71 CD 00 40 call 4000 ;/ ROM0:3A74 CD 84 23 call 2384 ; Handle audio ROM0:3A77 CD 88 3E call 3E88 ; Clear deleted OAM ROM0:3A7A CD 1C 03 call 031C ; Wait for interrupt and update in-game timer ROM0:3A7D FA 6D D0 ld a,(D06D) ;\ ROM0:3A80 A7 and a ;} If [$D06D] != 0: go to LOOP_BETA ROM0:3A81 20 DD jr nz,3A60 ;/ ROM0:3A83 C9 ret } ;;; $3A84: ;;; { ROM0:3A84 FA 45 D0 ld a,(D045) ROM0:3A87 CB 67 bit 4,a ROM0:3A89 28 0C jr z,3A97 ROM0:3A8B 21 AB 38 ld hl,38AB ROM0:3A8E CD 53 27 call 2753 ROM0:3A91 21 B2 38 ld hl,38B2 ROM0:3A94 CD 53 27 call 2753 ROM0:3A97 FA 45 D0 ld a,(D045) ROM0:3A9A E6 0C and 0C ROM0:3A9C FE 0C cp 0C ROM0:3A9E 20 0D jr nz,3AAD ROM0:3AA0 21 9D 38 ld hl,389D ROM0:3AA3 CD 53 27 call 2753 ROM0:3AA6 21 A4 38 ld hl,38A4 ROM0:3AA9 CD 53 27 call 2753 ROM0:3AAC C9 ret ROM0:3AAD FE 08 cp 08 ROM0:3AAF 20 0D jr nz,3ABE ROM0:3AB1 21 81 38 ld hl,3881 ROM0:3AB4 CD 53 27 call 2753 ROM0:3AB7 21 88 38 ld hl,3888 ROM0:3ABA CD 53 27 call 2753 ROM0:3ABD C9 ret ROM0:3ABE FE 04 cp 04 ROM0:3AC0 C0 ret nz ROM0:3AC1 21 8F 38 ld hl,388F ROM0:3AC4 CD 53 27 call 2753 ROM0:3AC7 21 96 38 ld hl,3896 ROM0:3ACA CD 53 27 call 2753 ROM0:3ACD C9 ret } ;;; $3ACE: Game mode Ah ;;; { ROM0:3ACE CD 90 23 call 2390 ; Clear sound effects and song ROM0:3AD1 3E FF ld a,FF ;\ ROM0:3AD3 EA E5 CF ld (CFE5),a ;} $CFE5 = FFh ROM0:3AD6 CD 9C 03 call 039C ; Disable LCD display ROM0:3AD9 CD 7B 03 call 037B ; Clear VRAM tilemap ROM0:3ADC AF xor a ;\ ROM0:3ADD E0 8D ld (FF00+8D),a ;} OAM stack pointer = 0 ROM0:3ADF CD CA 3E call 3ECA ; Clear OAM ROM0:3AE2 3E 05 ld a,05 ;\ ROM0:3AE4 EA 4E D0 ld (D04E),a ;} Bank = 5 ROM0:3AE7 EA 00 21 ld (2100),a ;/ ROM0:3AEA 21 34 5F ld hl,5F34 ;\ ROM0:3AED 11 00 80 ld de,8000 ;| ROM0:3AF0 01 00 18 ld bc,1800 ;| ;| ROM0:3AF3 2A ldi a,(hl) ;| ROM0:3AF4 12 ld (de),a ;} $8000..97FF = [$5734..6F33] ROM0:3AF5 13 inc de ;| ROM0:3AF6 0B dec bc ;| ROM0:3AF7 78 ld a,b ;| ROM0:3AF8 B1 or c ;| ROM0:3AF9 20 F8 jr nz,3AF3 ;/ ROM0:3AFB 21 24 3B ld hl,3B24 ;\ ROM0:3AFE 11 05 99 ld de,9905 ;| ;| ROM0:3B01 2A ldi a,(hl) ;| ROM0:3B02 FE 80 cp 80 ;} $9905..E = [$3B24..2E] ROM0:3B04 28 04 jr z,3B0A ;| ROM0:3B06 12 ld (de),a ;| ROM0:3B07 13 inc de ;| ROM0:3B08 18 F7 jr 3B01 ;/ ROM0:3B0A AF xor a ROM0:3B0B EA 05 C2 ld (C205),a ; Scroll Y = 0 ROM0:3B0E EA 06 C2 ld (C206),a ; Scroll X = 0 ROM0:3B11 3E C3 ld a,C3 ;\ ROM0:3B13 E0 40 ld (FF00+40),a ;} LCD control = C3h ROM0:3B15 3E A0 ld a,A0 ;\ ROM0:3B17 EA 66 D0 ld (D066),a ;| ROM0:3B1A 3E 01 ld a,01 ;} Loading timer = 1A0h ROM0:3B1C EA 67 D0 ld (D067),a ;/ ROM0:3B1F 3E 0F ld a,0F ;\ ROM0:3B21 E0 9B ld (FF00+9B),a ;} Game mode = Fh ROM0:3B23 C9 ret ROM0:3B24 dw 56, 50, 5C, 54, FF, 62, 50, 65, 54, 53, 80 } ;;; $3B2F: Game mode Fh ;;; { ; Identical to game mode 7: game over ROM0:3B2F CD 84 23 call 2384 ; Handle audio ROM0:3B32 CD 1C 03 call 031C ; Wait for interrupt and update in-game timer ROM0:3B35 FA 66 D0 ld a,(D066) ;\ ROM0:3B38 A7 and a ;} If [loading timer] = 0: reboot ROM0:3B39 28 05 jr z,3B40 ;/ ROM0:3B3B F0 81 ld a,(FF00+81) ;\ ROM0:3B3D FE 08 cp 08 ;} If newly pressed (only) start: reboot ROM0:3B3F C0 ret nz ;/ ROM0:3B40 C3 FB 01 jp 01FB ; Go to boot } ;;; $3B43: Game mode 10h: game cleared ;;; { ROM0:3B43 CD 90 23 call 2390 ; Clear sound effects and song ROM0:3B46 3E FF ld a,FF ROM0:3B48 EA E5 CF ld (CFE5),a ROM0:3B4B CD 9C 03 call 039C ROM0:3B4E CD 7B 03 call 037B ROM0:3B51 AF xor a ROM0:3B52 E0 8D ld (FF00+8D),a ROM0:3B54 CD CA 3E call 3ECA ; Clear OAM ROM0:3B57 3E 05 ld a,05 ROM0:3B59 EA 4E D0 ld (D04E),a ROM0:3B5C EA 00 21 ld (2100),a ROM0:3B5F 21 34 5F ld hl,5F34 ROM0:3B62 11 00 88 ld de,8800 ROM0:3B65 01 00 10 ld bc,1000 ROM0:3B68 2A ldi a,(hl) ROM0:3B69 12 ld (de),a ROM0:3B6A 13 inc de ROM0:3B6B 0B dec bc ROM0:3B6C 78 ld a,b ROM0:3B6D B1 or c ROM0:3B6E 20 F8 jr nz,3B68 ROM0:3B70 21 94 3B ld hl,3B94 ROM0:3B73 11 04 99 ld de,9904 ROM0:3B76 2A ldi a,(hl) ROM0:3B77 FE 80 cp 80 ROM0:3B79 28 04 jr z,3B7F ROM0:3B7B 12 ld (de),a ROM0:3B7C 13 inc de ROM0:3B7D 18 F7 jr 3B76 ROM0:3B7F AF xor a ROM0:3B80 EA 05 C2 ld (C205),a ROM0:3B83 EA 06 C2 ld (C206),a ROM0:3B86 3E C3 ld a,C3 ROM0:3B88 E0 40 ld (FF00+40),a ;lcd ctrl ROM0:3B8A 3E FF ld a,FF ROM0:3B8C EA 66 D0 ld (D066),a ROM0:3B8F 3E 11 ld a,11 ROM0:3B91 E0 9B ld (FF00+9B),a ROM0:3B93 C9 ret ROM0:3B94 dw 56, 50, 5C, 54, FF, 52, 5B, 54, 50, 61, 54, 53, 80 } ;;; $3BA1: Game mode 11h ;;; { ; Functionally identical to game mode 7: game over ; Set by game mode 10h ROM0:3BA1 CD 1C 03 call 031C ; Wait for interrupt and update in-game timer ROM0:3BA4 FA 66 D0 ld a,(D066) ;\ ROM0:3BA7 A7 and a ;} If [loading timer] = 0: reboot ROM0:3BA8 28 05 jr z,3BAF ;/ ROM0:3BAA F0 81 ld a,(FF00+81) ;\ ROM0:3BAC FE 08 cp 08 ;} If newly pressed (only) start: reboot ROM0:3BAE C0 ret nz ;/ ROM0:3BAF 3E 00 ld a,00 ROM0:3BB1 E0 9B ld (FF00+9B),a ROM0:3BB3 C9 ret } ;;; $3BB4: Load Samus equipment GFX ;;; { ROM0:3BB4 FA 45 D0 ld a,(D045) ;\ ROM0:3BB7 CB 77 bit 6,a ;} If Samus has varia suit: ROM0:3BB9 28 06 jr z,3BC1 ;/ ROM0:3BBB 21 7A 38 ld hl,387A ;\ ROM0:3BBE CD 3F 3C call 3C3F ;} Load varia suit GFX ROM0:3BC1 FA 45 D0 ld a,(D045) ;\ ROM0:3BC4 CB 67 bit 4,a ;} If Samus has spring ball: ROM0:3BC6 28 0C jr z,3BD4 ;/ ROM0:3BC8 21 AB 38 ld hl,38AB ;\ ROM0:3BCB CD 3F 3C call 3C3F ;| ROM0:3BCE 21 B2 38 ld hl,38B2 ;} Load spring ball GFX ROM0:3BD1 CD 3F 3C call 3C3F ;/ ROM0:3BD4 FA 45 D0 ld a,(D045) ;\ ROM0:3BD7 E6 0C and 0C ;| ROM0:3BD9 FE 0C cp 0C ;} If Samus has space jump and screw attack: ROM0:3BDB 20 0E jr nz,3BEB ;/ ROM0:3BDD 21 9D 38 ld hl,389D ;\ ROM0:3BE0 CD 3F 3C call 3C3F ;| ROM0:3BE3 21 A4 38 ld hl,38A4 ;} Load screw attack space jump GFX ROM0:3BE6 CD 3F 3C call 3C3F ;/ ROM0:3BE9 18 22 jr 3C0D ROM0:3BEB FE 08 cp 08 ;\ Else (Samus hasn't space jump and screw attack): ROM0:3BED 20 0E jr nz,3BFD ;} If Samus has space jump: ROM0:3BEF 21 81 38 ld hl,3881 ;\ ROM0:3BF2 CD 3F 3C call 3C3F ;| ROM0:3BF5 21 88 38 ld hl,3888 ;} Load space jump GFX ROM0:3BF8 CD 3F 3C call 3C3F ;/ ROM0:3BFB 18 10 jr 3C0D ROM0:3BFD FE 04 cp 04 ;\ Else (Samus hasn't space jump): ROM0:3BFF 20 0C jr nz,3C0D ;} If Samus has screw attack: ROM0:3C01 21 8F 38 ld hl,388F ;\ ROM0:3C04 CD 3F 3C call 3C3F ;| ROM0:3C07 21 96 38 ld hl,3896 ;} Load screw attack GFX ROM0:3C0A CD 3F 3C call 3C3F ;/ ROM0:3C0D FA 4D D0 ld a,(D04D) ;\ ROM0:3C10 FE 01 cp 01 ;} If [weapon equpiped] = ice: ROM0:3C12 20 08 jr nz,3C1C ;/ ROM0:3C14 21 FB 37 ld hl,37FB ;\ ROM0:3C17 CD 3F 3C call 3C3F ;} Load ice beam GFX ROM0:3C1A 18 22 jr 3C3E ; Return ROM0:3C1C FE 03 cp 03 ;\ ROM0:3C1E 20 08 jr nz,3C28 ;} If [weapon equpiped] = spazer: ROM0:3C20 21 D6 37 ld hl,37D6 ;\ ROM0:3C23 CD 3F 3C call 3C3F ;} Load spazer beam GFX Return ROM0:3C26 18 16 jr 3C3E ; Return ROM0:3C28 FE 02 cp 02 ;\ ROM0:3C2A 20 08 jr nz,3C34 ;} If [weapon equpiped] = wave: ROM0:3C2C 21 20 38 ld hl,3820 ;\ ROM0:3C2F CD 3F 3C call 3C3F ;} Load wave beam GFX Return ROM0:3C32 18 0A jr 3C3E ; Return ROM0:3C34 FE 04 cp 04 ;\ ROM0:3C36 20 06 jr nz,3C3E ;} If [weapon equpiped] = plasma: ROM0:3C38 21 D6 37 ld hl,37D6 ;\ ROM0:3C3B CD 3F 3C call 3C3F ;} Load plasma beam GFX Return ROM0:3C3E C9 ret } ;;; $3C3F: Copy [[hl] + 5] bytes from [[hl]] to [[hl] + 3] ;;; { ;; Parameters: ;; hl: bb ssss dddd nnnn ROM0:3C3F 2A ldi a,(hl) ;\ ROM0:3C40 EA 4E D0 ld (D04E),a ;| ROM0:3C43 EA 65 D0 ld (D065),a ;} VRAM tiles update bank = bank = [[hl++]] ROM0:3C46 EA 00 21 ld (2100),a ;/ ROM0:3C49 2A ldi a,(hl) ;\ ROM0:3C4A E0 98 ld (FF00+98),a ;| ROM0:3C4C 2A ldi a,(hl) ;} $FF98 = [[hl++]] ROM0:3C4D E0 99 ld (FF00+99),a ;/ ROM0:3C4F 2A ldi a,(hl) ;\ ROM0:3C50 5F ld e,a ;| ROM0:3C51 2A ldi a,(hl) ;} de = [[hl++]] ROM0:3C52 57 ld d,a ;/ ROM0:3C53 2A ldi a,(hl) ;\ ROM0:3C54 4F ld c,a ;| ROM0:3C55 2A ldi a,(hl) ;} bc = [[hl++]] ROM0:3C56 47 ld b,a ;/ ROM0:3C57 F0 98 ld a,(FF00+98) ;\ ROM0:3C59 6F ld l,a ;| ROM0:3C5A F0 99 ld a,(FF00+99) ;} hl = [$FF98] ROM0:3C5C 67 ld h,a ;/ ROM0:3C5D CD 8A 03 call 038A ; Copy [bc] bytes from [hl] to [de] ROM0:3C60 C9 ret } ;;; $3C61: Copy [bc] bytes from [hl] to [de] ;;; { ROM0:3C61 2A ldi a,(hl) ROM0:3C62 12 ld (de),a ROM0:3C63 13 inc de ROM0:3C64 0B dec bc ROM0:3C65 79 ld a,c ROM0:3C66 B0 or b ROM0:3C67 20 F4 jr nz,3C5D ROM0:3C69 C9 ret } ;;; $3C6A: Load credits text to SRAM (unit) ;;; { ; Called by reached the gunship ROM0:3C6A 3E 06 ld a,06 ;\ ROM0:3C6C EA 4E D0 ld (D04E),a ;} Bank = 6 ROM0:3C6F EA 00 21 ld (2100),a ;/ ROM0:3C72 21 20 79 ld hl,7920 ; hl = $7920 ROM0:3C75 11 00 A8 ld de,A800 ; de = $A800 ROM0:3C78 3E 0A ld a,0A ;\ ROM0:3C7A EA 00 00 ld (0000),a ;} Enable SRAM ; LOOP_ALPHA ROM0:3C7D 2A ldi a,(hl) ;\ ROM0:3C7E 12 ld (de),a ;} [de] = [[hl++]] ROM0:3C7F 13 inc de ;\ ROM0:3C80 FE F0 cp F0 ;} If [[de++]] != F0h: go to LOOP_ALPHA ROM0:3C82 20 F9 jr nz,3C7D ;/ ROM0:3C84 3E 00 ld a,00 ;\ ROM0:3C86 EA 00 00 ld (0000),a ;} Disable SRAM ROM0:3C89 3E 05 ld a,05 ;\ ROM0:3C8B EA 4E D0 ld (D04E),a ;} Bank = 5 ROM0:3C8E EA 00 21 ld (2100),a ;/ ROM0:3C91 C9 ret } ;;; $3C92: External calls ;;; { ;;; $3C92: Check if killed target number of Metroids ;;; { ROM0:3C92 3E 08 ld a,08 ROM0:3C94 EA 4E D0 ld (D04E),a ROM0:3C97 EA 00 21 ld (2100),a ROM0:3C9A CD BC 7E call 7EBC ROM0:3C9D 3E 02 ld a,02 ROM0:3C9F EA 4E D0 ld (D04E),a ROM0:3CA2 EA 00 21 ld (2100),a ROM0:3CA5 C9 ret } ;;; $3CA6: Execute subroutine $3:6AE7 ;;; { ROM0:3CA6 3E 03 ld a,03 ROM0:3CA8 EA 4E D0 ld (D04E),a ROM0:3CAB EA 00 21 ld (2100),a ROM0:3CAE CD E7 6A call 6AE7 ROM0:3CB1 3E 02 ld a,02 ROM0:3CB3 EA 4E D0 ld (D04E),a ROM0:3CB6 EA 00 21 ld (2100),a ROM0:3CB9 C9 ret } ;;; $3CBA: Execute subroutine $3:6B44 ;;; { ROM0:3CBA 3E 03 ld a,03 ROM0:3CBC EA 4E D0 ld (D04E),a ROM0:3CBF EA 00 21 ld (2100),a ROM0:3CC2 CD 44 6B call 6B44 ROM0:3CC5 3E 02 ld a,02 ROM0:3CC7 EA 4E D0 ld (D04E),a ROM0:3CCA EA 00 21 ld (2100),a ROM0:3CCD C9 ret } ;;; $3CCE: Execute subroutine $1:56E9 ;;; { ROM0:3CCE 3E 01 ld a,01 ROM0:3CD0 EA 4E D0 ld (D04E),a ROM0:3CD3 EA 00 21 ld (2100),a ROM0:3CD6 CD E9 56 call 56E9 ROM0:3CD9 3E 02 ld a,02 ROM0:3CDB EA 4E D0 ld (D04E),a ROM0:3CDE EA 00 21 ld (2100),a ROM0:3CE1 C9 ret } ;;; $3CE2: Game mode 9: save to SRAM ;;; { ROM0:3CE2 3E 01 ld a,01 ROM0:3CE4 EA 4E D0 ld (D04E),a ROM0:3CE7 EA 00 21 ld (2100),a ROM0:3CEA C3 DF 7A jp 7ADF } ;;; $3CED: Handle earthquake ;;; { ROM0:3CED 3E 01 ld a,01 ROM0:3CEF EA 4E D0 ld (D04E),a ROM0:3CF2 EA 00 21 ld (2100),a ROM0:3CF5 C3 EF 79 jp 79EF } ;;; $3CF8: Execute subroutine $1:73F7 ;;; { ROM0:3CF8 3E 01 ld a,01 ROM0:3CFA EA 4E D0 ld (D04E),a ROM0:3CFD EA 00 21 ld (2100),a ROM0:3D00 CD F7 73 call 73F7 ROM0:3D03 3E 05 ld a,05 ROM0:3D05 EA 4E D0 ld (D04E),a ROM0:3D08 EA 00 21 ld (2100),a ROM0:3D0B C9 ret } ;;; $3D0C: Execute subroutine $1:70BA ;;; { ROM0:3D0C 3E 01 ld a,01 ROM0:3D0E EA 4E D0 ld (D04E),a ROM0:3D11 EA 00 21 ld (2100),a ROM0:3D14 CD BA 70 call 70BA ROM0:3D17 3E 02 ld a,02 ROM0:3D19 EA 4E D0 ld (D04E),a ROM0:3D1C EA 00 21 ld (2100),a ROM0:3D1F C9 ret } ;;; $3D20: Execute subroutine $1:723B ;;; { ROM0:3D20 3E 01 ld a,01 ROM0:3D22 EA 4E D0 ld (D04E),a ROM0:3D25 EA 00 21 ld (2100),a ROM0:3D28 CD 3B 72 call 723B ROM0:3D2B 3E 02 ld a,02 ROM0:3D2D EA 4E D0 ld (D04E),a ROM0:3D30 EA 00 21 ld (2100),a ROM0:3D33 C9 ret } ;;; $3D34: Execute subroutine $1:71CB ;;; { ROM0:3D34 3E 01 ld a,01 ROM0:3D36 EA 4E D0 ld (D04E),a ROM0:3D39 EA 00 21 ld (2100),a ROM0:3D3C CD CB 71 call 71CB ROM0:3D3F 3E 02 ld a,02 ROM0:3D41 EA 4E D0 ld (D04E),a ROM0:3D44 EA 00 21 ld (2100),a ROM0:3D47 C9 ret } ;;; $3D48: Execute subroutine $1:7319 ;;; { ROM0:3D48 3E 01 ld a,01 ROM0:3D4A EA 4E D0 ld (D04E),a ROM0:3D4D EA 00 21 ld (2100),a ROM0:3D50 CD 19 73 call 7319 ROM0:3D53 3E 02 ld a,02 ROM0:3D55 EA 4E D0 ld (D04E),a ROM0:3D58 EA 00 21 ld (2100),a ROM0:3D5B C9 ret } ;;; $3D5C: LCD interrupt handler ;;; { ROM0:3D5C F5 push af ;\ ROM0:3D5D 3E 03 ld a,03 ;| ROM0:3D5F EA 00 21 ld (2100),a ;| ROM0:3D62 CD 7F 7C call 7C7F ;} Execute subroutine $3:7C7F ROM0:3D65 FA 4E D0 ld a,(D04E) ;| ROM0:3D68 EA 00 21 ld (2100),a ;| ROM0:3D6B F1 pop af ;/ ROM0:3D6C D9 reti } ;;; $3D6D: Handle window display, game saving, metroid earthquake, low heath beep, fade in, and Baby Metroid cry ;;; { ROM0:3D6D 3E 01 ld a,01 ROM0:3D6F EA 4E D0 ld (D04E),a ROM0:3D72 EA 00 21 ld (2100),a ROM0:3D75 C3 F2 57 jp 57F2 } ;;; $3D78: Handle rolling energy and missile counters ;;; { ROM0:3D78 3E 01 ld a,01 ROM0:3D7A EA 4E D0 ld (D04E),a ROM0:3D7D EA 00 21 ld (2100),a ROM0:3D80 C3 2B 4A jp 4A2B } ;;; $3D83: Handle respawning blocks ;;; { ROM0:3D83 3E 01 ld a,01 ROM0:3D85 EA 4E D0 ld (D04E),a ROM0:3D88 EA 00 21 ld (2100),a ROM0:3D8B C3 92 56 jp 5692 } ;;; $3D8E: Projectile handler ;;; { ROM0:3D8E 3E 01 ld a,01 ROM0:3D90 EA 4E D0 ld (D04E),a ROM0:3D93 EA 00 21 ld (2100),a ROM0:3D96 C3 0D 50 jp 500D } ;;; $3D99: Bomb handler ;;; { ROM0:3D99 3E 01 ld a,01 ROM0:3D9B EA 4E D0 ld (D04E),a ROM0:3D9E EA 00 21 ld (2100),a ROM0:3DA1 C3 9D 54 jp 549D } ;;; $3DA4: Projectile GFX handler ;;; { ROM0:3DA4 3E 01 ld a,01 ROM0:3DA6 EA 4E D0 ld (D04E),a ROM0:3DA9 EA 00 21 ld (2100),a ROM0:3DAC C3 00 53 jp 5300 } ;;; $3DAF: Handle firing a projectile ;;; { ROM0:3DAF 3E 01 ld a,01 ROM0:3DB1 EA 4E D0 ld (D04E),a ROM0:3DB4 EA 00 21 ld (2100),a ROM0:3DB7 C3 8A 4E jp 4E8A } ;;; $3DBA: Execute subroutine $3:6BD2 ;;; { ROM0:3DBA 3E 03 ld a,03 ROM0:3DBC EA 4E D0 ld (D04E),a ROM0:3DBF EA 00 21 ld (2100),a ROM0:3DC2 CD D2 6B call 6BD2 ROM0:3DC5 3E 02 ld a,02 ROM0:3DC7 EA 4E D0 ld (D04E),a ROM0:3DCA EA 00 21 ld (2100),a ROM0:3DCD C9 ret } ;;; $3DCE: Draw enemies ;;; { ROM0:3DCE 3E 01 ld a,01 ROM0:3DD0 EA 4E D0 ld (D04E),a ROM0:3DD3 EA 00 21 ld (2100),a ROM0:3DD6 CD 11 5A call 5A11 ROM0:3DD9 3E 02 ld a,02 ROM0:3DDB EA 4E D0 ld (D04E),a ROM0:3DDE EA 00 21 ld (2100),a ROM0:3DE1 C9 ret } ;;; $3DE2: Execute subroutine $3:4000 ;;; { ROM0:3DE2 3E 03 ld a,03 ROM0:3DE4 EA 4E D0 ld (D04E),a ROM0:3DE7 EA 00 21 ld (2100),a ROM0:3DEA CD 00 40 call 4000 ROM0:3DED 3E 02 ld a,02 ROM0:3DEF EA 4E D0 ld (D04E),a ROM0:3DF2 EA 00 21 ld (2100),a ROM0:3DF5 C9 ret } ;;; $3DF6: hl = pointer to end of enemy data ;;; { ROM0:3DF6 3E 03 ld a,03 ROM0:3DF8 EA 4E D0 ld (D04E),a ROM0:3DFB EA 00 21 ld (2100),a ROM0:3DFE CD B4 42 call 42B4 ROM0:3E01 3E 02 ld a,02 ROM0:3E03 EA 4E D0 ld (D04E),a ROM0:3E06 EA 00 21 ld (2100),a ROM0:3E09 C9 ret } ;;; $3E0A: Execute subroutine $1:7AB9 ;;; { ROM0:3E0A 3E 01 ld a,01 ROM0:3E0C EA 4E D0 ld (D04E),a ROM0:3E0F EA 00 21 ld (2100),a ROM0:3E12 CD B9 7A call 7AB9 ROM0:3E15 3E 01 ld a,01 ROM0:3E17 EA 4E D0 ld (D04E),a ROM0:3E1A EA 00 21 ld (2100),a ROM0:3E1D C9 ret } ;;; $3E1E: Execute subroutine $5:403D ;;; { ROM0:3E1E 3E 05 ld a,05 ROM0:3E20 EA 4E D0 ld (D04E),a ROM0:3E23 EA 00 21 ld (2100),a ROM0:3E26 C3 3D 40 jp 403D } ;;; $3E29: Game mode 12h: Reached gunship ;;; { ROM0:3E29 3E 05 ld a,05 ROM0:3E2B EA 4E D0 ld (D04E),a ROM0:3E2E EA 00 21 ld (2100),a ROM0:3E31 C3 7F 58 jp 587F } ;;; $3E34: Game mode 13h: Credits ;;; { ROM0:3E34 3E 05 ld a,05 ROM0:3E36 EA 4E D0 ld (D04E),a ROM0:3E39 EA 00 21 ld (2100),a ROM0:3E3C C3 A3 55 jp 55A3 } } ;;; $3E3F: Game mode 0: boot ;;; { ROM0:3E3F CD 9C 03 call 039C ; Disable LCD display ROM0:3E42 CD 70 03 call 0370 ; Clear OAM ROM0:3E45 AF xor a ;\ ROM0:3E46 E0 8D ld (FF00+8D),a ;} OAM stack pointer = 0 ROM0:3E48 CD 88 3E call 3E88 ; Clear deleted OAM ROM0:3E4B CD 90 23 call 2390 ; Clear sound effects and song ROM0:3E4E 3E 05 ld a,05 ;\ ROM0:3E50 EA 4E D0 ld (D04E),a ;| ROM0:3E53 EA 00 21 ld (2100),a ;} Load title screen ROM0:3E56 C3 8F 40 jp 408F ;/ } ;;; $3E59: Game mode 1: title ;;; { ROM0:3E59 CD 70 03 call 0370 ; Clear OAM ROM0:3E5C 3E 05 ld a,05 ;\ ROM0:3E5E EA 4E D0 ld (D04E),a ;| ROM0:3E61 EA 00 21 ld (2100),a ;} Execute subroutine $5:4118 ROM0:3E64 C3 18 41 jp 4118 ;/ } ;;; $3E67: External calls ;;; { ;;; $3E67: Start new game ;;; { ROM0:3E67 3E 01 ld a,01 ROM0:3E69 EA 4E D0 ld (D04E),a ROM0:3E6C EA 00 21 ld (2100),a ROM0:3E6F C3 1C 4E jp 4E1C } ;;; $3E72: Load from save ;;; { ROM0:3E72 3E 01 ld a,01 ROM0:3E74 EA 4E D0 ld (D04E),a ROM0:3E77 EA 00 21 ld (2100),a ROM0:3E7A C3 33 4E jp 4E33 } ;;; $3E7D: Load sprite set ;;; { ROM0:3E7D 3E 01 ld a,01 ROM0:3E7F EA 4E D0 ld (D04E),a ROM0:3E82 EA 00 21 ld (2100),a ROM0:3E85 C3 62 4B jp 4B62 } ;;; $3E88: Clear deleted OAM ;;; { ROM0:3E88 3E 01 ld a,01 ROM0:3E8A EA 4E D0 ld (D04E),a ROM0:3E8D EA 00 21 ld (2100),a ROM0:3E90 C3 B3 4B jp 4BB3 } ;;; $3E93: Draw Samus ;;; { ROM0:3E93 3E 01 ld a,01 ROM0:3E95 EA 4E D0 ld (D04E),a ROM0:3E98 EA 00 21 ld (2100),a ROM0:3E9B C3 D9 4B jp 4BD9 } ;;; $3E9E: Drawing blinking Metroid in HUD ;;; { ROM0:3E9E 3E 01 ld a,01 ROM0:3EA0 EA 4E D0 ld (D04E),a ROM0:3EA3 EA 00 21 ld (2100),a ROM0:3EA6 C3 2C 4B jp 4B2C } ;;; $3EA9: Execute subroutine $1:4B09 ;;; { ROM0:3EA9 3E 01 ld a,01 ROM0:3EAB EA 4E D0 ld (D04E),a ROM0:3EAE EA 00 21 ld (2100),a ROM0:3EB1 C3 09 4B jp 4B09 } ;;; $3EB4: Execute subroutine $1:4AFC ;;; { ROM0:3EB4 3E 01 ld a,01 ROM0:3EB6 EA 4E D0 ld (D04E),a ROM0:3EB9 EA 00 21 ld (2100),a ROM0:3EBC C3 FC 4A jp 4AFC } ;;; $3EBF: Draw Samus, no invisible frames ;;; { ROM0:3EBF 3E 01 ld a,01 ROM0:3EC1 EA 4E D0 ld (D04E),a ROM0:3EC4 EA 00 21 ld (2100),a ROM0:3EC7 C3 F3 4B jp 4BF3 } ;;; $3ECA: Clear OAM ;;; { ROM0:3ECA 3E 01 ld a,01 ROM0:3ECC EA 4E D0 ld (D04E),a ROM0:3ECF EA 00 21 ld (2100),a ROM0:3ED2 C3 CE 4B jp 4BCE } } ;;; $3ED5: Load room sprite priority (unit) ;;; { ; Called by $1:4DDF ROM0:3ED5 FA 58 D0 ld a,(D058) ;\ ROM0:3ED8 EA 4E D0 ld (D04E),a ;} Bank = [room bank] ROM0:3EDB EA 00 21 ld (2100),a ;/ ROM0:3EDE F0 C1 ld a,(FF00+C1) ;\ ROM0:3EE0 CB 37 swap a ;| ROM0:3EE2 5F ld e,a ;| ROM0:3EE3 F0 C3 ld a,(FF00+C3) ;| ROM0:3EE5 83 add a,e ;| ROM0:3EE6 5F ld e,a ;| ROM0:3EE7 16 00 ld d,00 ;| ROM0:3EE9 CB 23 sla e ;| ROM0:3EEB CB 12 rl d ;| ROM0:3EED 21 00 43 ld hl,4300 ;} Room sprite priority = [$4300 + ([Samus' Y position high] * 10h + [Samus' X position high]) * 2] >> 11 & 1 ^ 1 ROM0:3EF0 19 add hl,de ;| ROM0:3EF1 23 inc hl ;| ROM0:3EF2 7E ld a,(hl) ;| ROM0:3EF3 CB 37 swap a ;| ROM0:3EF5 CB 07 rlc a ;| ROM0:3EF7 E6 01 and 01 ;| ROM0:3EF9 EE 01 xor 01 ;| ROM0:3EFB EA 57 D0 ld (D057),a ;/ ROM0:3EFE 3E 01 ld a,01 ;\ ROM0:3F00 EA 4E D0 ld (D04E),a ;} Bank = 1 ROM0:3F03 EA 00 21 ld (2100),a ;/ ROM0:3F06 C9 ret } ;;; $3F07: Unused. Alternative death sequence ;;; { ; Exactly the same as the unused half of "death sequence" ; The standard death sequence clears tile pixel rows until $8800, whereas this one only clears up to $8500, ; which is only enough to clear Samus' standing facing screen pose graphics, ; which is incidentally the pose set if this routine is triggered by $2FC8. ; So this might actually not be a death sequence, it might be an abandoned "reached the gunship" animation ROM0:3F07 F0 97 ld a,(FF00+97) ;\ ROM0:3F09 E6 01 and 01 ;} If [frame counter] & 1: go to BRANCH_BETA ROM0:3F0B 20 37 jr nz,3F44 ;/ ROM0:3F0D FA 5A D0 ld a,(D05A) ;\ ROM0:3F10 6F ld l,a ;| ROM0:3F11 FA 5B D0 ld a,(D05B) ;} hl = [base address of pixels to clear in Samus' VRAM tiles] ROM0:3F14 67 ld h,a ;/ ROM0:3F15 11 10 00 ld de,0010 ; LOOP_ALPHA ROM0:3F18 AF xor a ;\ ROM0:3F19 77 ld (hl),a ;} [hl] = 0 ROM0:3F1A 19 add hl,de ; hl += 10h ROM0:3F1B 7D ld a,l ;\ ROM0:3F1C E6 F0 and F0 ;} If [hl] != [base address of pixels to clear in Samus' VRAM tiles] + 100h: go to LOOP_ALPHA ROM0:3F1E 20 F8 jr nz,3F18 ;/ ROM0:3F20 7D ld a,l ;\ ROM0:3F21 D6 FF sub FF ;| ROM0:3F23 6F ld l,a ;| ROM0:3F24 7C ld a,h ;} hl = [base address of pixels to clear in Samus' VRAM tiles] + 1 ROM0:3F25 DE 00 sbc a,00 ;| ROM0:3F27 67 ld h,a ;/ ROM0:3F28 7D ld a,l ;\ ROM0:3F29 FE 10 cp 10 ;} If [l] = 10h: ROM0:3F2B 20 07 jr nz,3F34 ;/ ROM0:3F2D C6 F0 add a,F0 ;\ ROM0:3F2F 6F ld l,a ;} l = 0 ROM0:3F30 7C ld a,h ;\ ROM0:3F31 CE 00 adc a,00 ;} ++h ROM0:3F33 67 ld h,a ;/ ROM0:3F34 7D ld a,l ;\ ROM0:3F35 EA 5A D0 ld (D05A),a ;| ROM0:3F38 7C ld a,h ;} Base address of pixels to clear in Samus' VRAM tiles = [hl] ROM0:3F39 EA 5B D0 ld (D05B),a ;/ ROM0:3F3C FE 85 cp 85 ;\ ROM0:3F3E 20 04 jr nz,3F44 ;} If [base address of pixels to clear in Samus' VRAM tiles] >= $8500: ROM0:3F40 AF xor a ;\ ROM0:3F41 EA 59 D0 ld (D059),a ;} Death sequence timer = 0 ; BRANCH_BETA ROM0:3F44 FA 05 C2 ld a,(C205) ;\ ROM0:3F47 E0 42 ld (FF00+42),a ;} Update LCD scroll Y ROM0:3F49 FA 06 C2 ld a,(C206) ;\ ROM0:3F4C E0 43 ld (FF00+43),a ;} Update LCD scroll X ROM0:3F4E CD A0 FF call FFA0 ; OAM DMA ROM0:3F51 FA 4E D0 ld a,(D04E) ;\ ROM0:3F54 EA 00 21 ld (2100),a ;} Restore bank ROM0:3F57 3E 01 ld a,01 ;\ ROM0:3F59 E0 82 ld (FF00+82),a ;} Set v-blank handled ROM0:3F5B E1 pop hl ROM0:3F5C D1 pop de ROM0:3F5D C1 pop bc ROM0:3F5E F1 pop af ROM0:3F5F D9 reti } ;;; $3F60: Free space ;;; { ROM0:3F60 fillto $1:4000, $00 }