08000230 (T) push r4-r6,r14 08000232 (T) bl InitialiseGame 08000236 (T) b 8000766h ;} Execute start-of-frame code 08000238 (T) bl UpdateInput 0800023C (T) bl SoftResetCheck 08000240 (T) ldr r1,=8BitFrameCounter ;\ 08000242 (T) ldrb r0,[r1] ;| 08000244 (T) add r0,1h ;| 08000246 (T) strb r0,[r1] ;| 08000248 (T) ldr r1,=16BitFrameCounter ;} Update frame counters 0800024A (T) ldrh r0,[r1] ;| 0800024C (T) add r0,1h ;| 0800024E (T) strh r0,[r1] ;/ 08000250 (T) ldr r0,=GameMode ;\ 08000252 (T) mov r1,0h ;| 08000254 (T) ldsh r0,[r0,r1] ;| 08000256 (T) cmp r0,0Eh ;| 08000258 (T) bls 800025Ch ;| 0800025A (T) b 800074Ch ;} Execute GameMode specific code 0800025C (T) lsl r0,r0,2h ;| 0800025E (T) ldr r1,=8000278h ;| 08000260 (T) add r0,r0,r1 ;| 08000262 (T) ldr r0,[r0] ;| 08000264 (T) mov r15,r0 ;/ 08000266 dw 00000h 08000268 dd 003000BE5h,003000002h,003000BDEh,008000278h 08000278 dd 0080002B4h,008000448h,008000548h,0080004D0h 08000288 dd 00800054Eh,0080005D0h,0080005E4h,0080003ACh 08000298 dd 008000624h,00800069Ch,0080006B0h,0080006D0h 080002A8 dd 0080006E4h,008000730h,00800074Ch ;;; Title ;;; 080002B4 (T) ldr r5,=SubGameMode1 ;\ 080002B6 (T) mov r4,0h ;| 080002B8 (T) ldsb r4,[r5,r4] ;} If SubGameMode1 == 0: 080002BA (T) cmp r4,0h ;| 080002BC (T) bne 80002D8h ;/ 080002BE (T) mov r0,0h ;\ 080002C0 (T) bl SetLanguage ;} Set language 080002C4 (T) cmp r0,0h ;\ 080002C6 (T) bne 80002CAh ;} If returned 0: end GameMode specific code 080002C8 (T) b 800074Ch ;/ 080002CA (T) ldr r0,=SubGameMode2 ;\ 080002CC (T) strh r4,[r0] ;} SubGameMode2 = 0 080002CE (T) b 800032Eh ; SubGameMode1 = 1, end GameMode specific code 080002D0 dd 003000BE2h,003000BE0h ; Pre-title sequence 080002D8 (T) cmp r4,1h ;\ 080002DA (T) bne 80002F8h ;} If SubGameMode1 == 1: 080002DC (T) bl 8087610h ; Call this subroutine 080002E0 (T) cmp r0,0h ;\ 080002E2 (T) bne 80002E6h ;} If returned 0: end GameMode specific code 080002E4 (T) b 800074Ch ;/ 080002E6 (T) ldr r0,=SubGameMode2 ;\ 080002E8 (T) mov r1,0h ;} SubGameMode2 = 0 080002EA (T) strh r1,[r0] ;/ 080002EC (T) mov r0,4h ;\ 080002EE (T) strb r0,[r5] ;} SubGameMode1 = 4 080002F0 (T) b 800074Ch ; End GameMode specific code 080002F2 dw 00000h 080002F4 dd 003000BE0h ; Unused (same as 4 except for the subroutine call) 080002F8 (T) cmp r4,2h ;\ 080002FA (T) bne 8000318h ;} If SubGameMode1 == 2: 080002FC (T) ldr r4,=SubGameModeB84 080002FE (T) bl 8086854h ; Call this subroutine 08000302 (T) strb r0,[r4] ; SubGameModeB84 = returned 08000304 (T) lsl r0,r0,18h ;\ 08000306 (T) asr r0,r0,18h ;| 08000308 (T) cmp r0,1h ;} If returned 1: branch to 800034E 0800030A (T) beq 800034Eh ;/ 0800030C (T) cmp r0,2h ;\ 0800030E (T) beq 8000374h ;} If returned 2: branch to 8000374 08000310 (T) b 8000388h ; Else branch to 8000388 08000312 dw 00000h 08000314 dd 003000B84h ; Unused (though set by SubGameMode1=2/4 SubGameModeB84=2) 08000318 (T) cmp r4,3h ;\ 0800031A (T) bne 8000338h ;} If SubGameMode1 == 3: 0800031C (T) mov r0,1h ;\ 0800031E (T) bl SetLanguage ;} Set language 08000322 (T) cmp r0,0h ;\ 08000324 (T) bne 8000328h ;} If returned 0: end GameMode specific code 08000326 (T) b 800074Ch ;/ 08000328 (T) ldr r0,=SubGameMode2 ;\ 0800032A (T) mov r1,0h ;} SubGameMode2 = 0 0800032C (T) strh r1,[r0] ;/ 0800032E (T) mov r0,1h ;\ 08000330 (T) strb r0,[r5] ;} SubGameMode1 = 1 08000332 (T) b 800074Ch ; End GameMode specific code 08000334 dd 003000BE0h ; Title screen 08000338 (T) cmp r4,4h ;\ 0800033A (T) beq 800033Eh ;} If SubGameMode1 != 4: end GameMode specific code 0800033C (T) b 800074Ch ;/ 0800033E (T) ldr r4,=SubGameModeB84 08000340 (T) bl 8087544h ; Call this subroutine 08000344 (T) strb r0,[r4] ; SubGameModeB84 = returned 08000346 (T) lsl r0,r0,18h ;\ 08000348 (T) asr r0,r0,18h ;| 0800034A (T) cmp r0,1h ;} If returned 1: 0800034C (T) bne 8000370h ;/ ; Entering save-selection screen 0800034E (T) ldr r1,=GameMode ;\ 08000350 (T) mov r0,7h ;} GameMode = 7 (Intro) 08000352 (T) strh r0,[r1] ;/ 08000354 (T) mov r0,0h ;\ 08000356 (T) strb r0,[r4] ;} SubGameModeB84 = 0 08000358 (T) ldr r1,=SubGameMode2 ;\ 0800035A (T) mov r0,0h ;} SubGameMode2 = 0 0800035C (T) strh r0,[r1] ;/ 0800035E (T) strb r0,[r5] ; SubGameMode1 = 0 08000360 (T) b 800074Ch ; End GameMode specific code 08000362 dw 00000h 08000364 dd 003000B84h,003000BDEh,003000BE0h 08000370 (T) cmp r0,2h ;\ 08000372 (T) bne 8000388h ;} If returned 2: ; Unused 08000374 (T) mov r0,0h ;\ 08000376 (T) strb r0,[r4] ;} SubGameModeB84 = 0 08000378 (T) ldr r1,=SubGameMode2 ;\ 0800037A (T) mov r0,0h ;} SubGameMode2 = 0 0800037C (T) strh r0,[r1] ;/ 0800037E (T) mov r0,3h ;\ 08000380 (T) strb r0,[r5] ;} SubGameMode1 = 3 08000382 (T) b 800074Ch ; End GameMode specific code 08000384 dd 003000BE0h ; Entering demo 08000388 (T) cmp r0,64h ;\ 0800038A (T) beq 800038Eh ;} If returned != 0x64: end GameMode specific code 0800038C (T) b 800074Ch ;/ 0800038E (T) bl 80718CCh ; Call this subroutine 08000392 (T) ldr r0,=SubGameMode2 ;\ 08000394 (T) mov r2,0h ;} SubGameMode2 = 0 08000396 (T) strh r2,[r0] ;/ 08000398 (T) ldr r1,=GameMode ;\ 0800039A (T) mov r0,0Ch ;} GameMode = 0xC (Demo) 0800039C (T) strh r0,[r1] ;/ 0800039E (T) strb r2,[r4] ; SubGameModeB84 = 0 080003A0 (T) b 800074Ch ; End GameMode specific code 080003A2 dw 00000h 080003A4 dd 003000BE0h,003000BDEh ;;; Intro ;;; 080003AC (T) ldr r6,=SubGameMode1 ;\ 080003AE (T) mov r4,0h ;| 080003B0 (T) ldsb r4,[r6,r4] ;} If SubGameMode1 == 0: 080003B2 (T) cmp r4,0h ;} Else: branch to 8000418 080003B4 (T) bne 8000418h ;/ ; Save selection 080003B6 (T) ldr r5,=SubGameModeB84 080003B8 (T) bl 809E598h ; Call this subroutine 080003BC (T) strb r0,[r5] ; SubGameModeB84 = returned 080003BE (T) lsl r0,r0,18h ;\ 080003C0 (T) asr r1,r0,18h ;| 080003C2 (T) cmp r1,1h ;} If returned 1 080003C4 (T) bne 80003D8h ;/ ; Chosen a fresh save 080003C6 (T) strb r4,[r5] ; SubGameModeB84 = 0 080003C8 (T) ldr r0,=SubGameMode2 ;\ 080003CA (T) b 80003E8h ;} SubGameMode2 = 0, SubGameMode1 = 1, end GameMode specific code 080003CC dd 003000BE2h,003000B84h,003000BE0h ; Chosen a current save 080003D8 (T) cmp r1,2h ;\ 080003DA (T) bne 80003F8h ;} If returned 2: 080003DC (T) ldr r1,=GameMode ;\ 080003DE (T) mov r0,1h ;} GameMode = 1 080003E0 (T) strh r0,[r1] ;/ 080003E2 (T) strb r4,[r5] ; SubGameModeB84 = 0 080003E4 (T) ldr r0,=SubGameMode2 080003E6 (T) mov r1,0h 080003E8 (T) strh r4,[r0] ; SubGameMode2 = 0 080003EA (T) strb r1,[r6] ; SubGameMode1 = 0 080003EC (T) b 800074Ch ; End GameMode specific code 080003EE dw 00000h 080003F0 dd 003000BDEh,003000BE0h ; Exited back to title 080003F8 (T) cmp r1,3h ;\ 080003FA (T) beq 80003FEh ;} If returned != 3: end GameMode specific code 080003FC (T) b 800074Ch ;/ 080003FE (T) ldr r0,=GameMode 08000400 (T) mov r1,0h 08000402 (T) strh r4,[r0] ; GameMode = 0 08000404 (T) strb r1,[r5] ; SubGameModeB84 = 0 08000406 (T) ldr r0,=SubGameMode2 ;\ 08000408 (T) strh r4,[r0] ;} SubGameMode2 = 0 0800040A (T) mov r0,1h ;\ 0800040C (T) strb r0,[r6] ;} SubGameMode1 = 1 0800040E (T) b 800074Ch ; End GameMode specific code 08000410 dd 003000BDEh,003000BE0h ; Story 08000418 (T) cmp r4,1h ;\ 0800041A (T) beq 800041Eh ;} If SubGameMode1 != 1: end GameMode specific code 0800041C (T) b 800074Ch ;/ 0800041E (T) bl 8087708h ; Call this subroutine 08000422 (T) cmp r0,0h ;\ 08000424 (T) bne 8000428h ;} If returned 0: end GameMode specific code 08000426 (T) b 800074Ch ;/ ; End of story: first objective 08000428 (T) ldr r1,=GameMode ;\ 0800042A (T) mov r0,3h ;} GameMode = 3 0800042C (T) strh r0,[r1] ;/ 0800042E (T) ldr r0,=SubGameModeB84 ;\ 08000430 (T) strb r4,[r0] ;} SubGameModeB84 = 1 08000432 (T) ldr r1,=SubGameMode2 ;\ 08000434 (T) mov r0,0h ;} SubGameMode2 = 0 08000436 (T) strh r0,[r1] ;/ 08000438 (T) strb r0,[r6] ; SubGameMode1 = 0 0800043A (T) b 800074Ch ; End GameMode specific code 0800043C dd 003000BDEh,003000B84h,003000BE0h ;;; In-game ;;; 08000448 (T) bl 800DD24h ; Call this subroutine 0800044C (T) cmp r0,0h ;\ 0800044E (T) bne 8000452h ;} If returned 0: end GameMode specific code 08000450 (T) b 800074Ch ;/ 08000452 (T) ldr r0,=SubGameModeB84 ;\ 08000454 (T) ldrb r0,[r0] ;| 08000456 (T) lsl r0,r0,18h ;| 08000458 (T) asr r0,r0,18h ;} If SubGameModeB84 == 0: branch to 8000480 0800045A (T) cmp r0,0h ;| 0800045C (T) beq 8000480h ;/ 0800045E (T) cmp r0,6h ;\ 08000460 (T) bne 8000474h ;} If SubGameModeB84 == 6: ; First SA-X encounter 08000462 (T) ldr r1,=GameMode ;\ 08000464 (T) mov r0,5h ;} GameMode = 5 08000466 (T) strh r0,[r1] ;/ 08000468 (T) b 800074Ch ; End GameMode specific code 0800046A dw 00000h 0800046C dd 003000B84h,003000BDEh ; Navigation room, pause screen 08000474 (T) ldr r1,=GameMode ;\ 08000476 (T) mov r0,3h ;} GameMode = 3 08000478 (T) strh r0,[r1] ;/ 0800047A (T) b 800074Ch ; End GameMode specific code 0800047C dd 003000BDEh 08000480 (T) ldr r0,=3000BDCh ;\ 08000482 (T) ldrb r2,[r0] ;| 08000484 (T) mov r1,r2 ;} If 3000BDC == 0: branch to 80004BC 08000486 (T) cmp r1,0h ;| 08000488 (T) beq 80004BCh ;/ 0800048A (T) mov r0,80h ;\ 0800048C (T) and r0,r2 ;| 0800048E (T) cmp r0,0h ;} If 3000BDC hasn't 0x80: branch to 80004B0 08000490 (T) beq 80004B0h ;/ 08000492 (T) cmp r1,81h ;\ 08000494 (T) bne 80004A4h ;} If 3000BDC == 0x81: ; SR388 collision timer ran out 08000496 (T) ldr r1,=GameMode ;\ 08000498 (T) mov r0,0Ah ;} GameMode = 0xA, SubGameMode2 = 0, end GameMode specific code 0800049A (T) b 80006BCh ;/ 0800049C dd 003000BDCh,003000BDEh ; Entered ship after beating Omega Metroid 080004A4 (T) ldr r1,=GameMode ;\ 080004A6 (T) mov r0,9h ;} GameMode = 9, SubGameMode2 = 0, end GameMode specific code 080004A8 (T) b 80006BCh ;/ 080004AA dw 00000h 080004AC dd 003000BDEh ; Meltdown/Restricted Lab timer ran out, other cutscenes? 080004B0 (T) ldr r1,=GameMode ;\ 080004B2 (T) mov r0,4h ;} GameMode = 4, SubGameMode2 = 0, end GameMode specific code 080004B4 (T) b 80006BCh ;/ 080004B6 dw 00000h 080004B8 dd 003000BDEh ; ? 080004BC (T) ldr r0,=GameMode ;\ 080004BE (T) strh r1,[r0] ;} GameMode = 0 080004C0 (T) ldr r0,=SubGameMode2 ;\ 080004C2 (T) strh r1,[r0] ;} SubGameMode2 = 0 080004C4 (T) b 800074Ch ; End GameMode specific code 080004C6 dw 00000h 080004C8 dd 003000BDEh,003000BE0h ;;; Map ;;; 080004D0 (T) bl 80765F8h ; Call this subroutine 080004D4 (T) cmp r0,0h ;\ 080004D6 (T) bne 80004DAh ;} If returned 0: end GameMode specific code 080004D8 (T) b 800074Ch ;/ 080004DA (T) ldr r1,=SubGameModeB84 ;\ 080004DC (T) ldrb r0,[r1] ;| 080004DE (T) sub r0,1h ;| 080004E0 (T) lsl r0,r0,18h ;| 080004E2 (T) asr r0,r0,18h ;| 080004E4 (T) mov r2,r1 ;| 080004E6 (T) cmp r0,5h ;} Execute returned specific code 080004E8 (T) bhi 800053Ch ;| 080004EA (T) lsl r0,r0,2h ;| 080004EC (T) ldr r1,=80004FCh ;| 080004EE (T) add r0,r0,r1 ;| 080004F0 (T) ldr r0,[r0] ;| 080004F2 (T) mov r15,r0 ;/ 080004F4 dd 003000B84h,0080004FCh,008000524h,00800053Ch 08000504 dd 00800053Ch,008000514h,00800051Ah,00800053Ch ; Returned 3: ? 08000514 (T) mov r0,0h ;\ 08000516 (T) strb r0,[r2] ;} SubGameModeB84 = 0 08000518 (T) b 800053Ch ; GameMode = 1, SubGameMode2 = 0, end GameMode specific code ; Returned 4: monologue in the last navigation room 0800051A (T) ldr r1,=GameMode ;\ 0800051C (T) mov r0,4h ;} GameMode = 4, SubGameMode2 = 0, end GameMode specific code 0800051E (T) b 80006BCh ;/ 08000520 dd 003000BDEh ; Returned 0: exit ship after first objective 08000524 (T) ldr r1,=GameMode ;\ 08000526 (T) mov r0,1h ;} GameMode = 1 08000528 (T) strh r0,[r1] ;/ 0800052A (T) mov r1,0h ;\ 0800052C (T) strb r1,[r2] ;} SubGameModeB84 = 0 0800052E (T) ldr r0,=3000BE3h ;\ 08000530 (T) strb r1,[r0] ;} 3000BE3 = 0 08000532 (T) b 80006BEh ; SubGameMode2 = 0, end GameMode specific code 08000534 dd 003000BDEh,003000BE3h ; Default: standard return to game 0800053C (T) ldr r1,=GameMode ;\ 0800053E (T) mov r0,1h ;} GameMode = 1, SubGameMode2 = 0, end GameMode specific code 08000540 (T) b 80006BCh ;/ 08000542 dw 00000h 08000544 dd 003000BDEh ;;; Soft reset ;;; 08000548 (T) bl SoftReset 0800054C (T) b 800074Ch ; End GameMode specific code ;;; Most cut-scenes ;;; 0800054E (T) bl 809994Ch ; Call this subroutine 08000552 (T) cmp r0,0h ;\ 08000554 (T) bne 8000558h ;} If returned 0: end GameMode specific code 08000556 (T) b 800074Ch ;/ 08000558 (T) ldr r0,=SubGameMode1 ;\ 0800055A (T) mov r2,0h ;| 0800055C (T) ldsb r2,[r0,r2] ;| 0800055E (T) mov r3,r0 ;} If SubGameMode1 != 0: 08000560 (T) cmp r2,0h ;| 08000562 (T) beq 8000574h ;/ ; Unused: causes a crash 08000564 (T) ldr r1,=GameMode ;\ 08000566 (T) mov r0,0Eh ;} GameMode = 0xE, SubGameMode1 = 0, end GameMode specific code 08000568 (T) b 80005BEh ;/ 0800056A dw 00000h 0800056C dd 003000BE2h,003000BDEh 08000574 (T) ldr r0,=3000BDCh ;\ 08000576 (T) ldrb r0,[r0] ;| 08000578 (T) cmp r0,9h ;} If 3000BDC == 9: 0800057A (T) bne 8000594h ;/ ; Return to map screen 0800057C (T) ldr r1,=SubGameModeB84 ;\ 0800057E (T) mov r0,4h ;} SubGameModeB84 = 4 08000580 (T) strb r0,[r1] ;/ 08000582 (T) ldr r1,=GameMode ;\ 08000584 (T) mov r0,3h ;} GameMode = 3, SubGameMode2 = 0, SubGameMode1 = 0, end GameModeSpecific code 08000586 (T) b 80005B8h ;/ 08000588 dd 003000BDCh,003000B84h,003000BDEh 08000594 (T) cmp r0,9h ;\ 08000596 (T) blt 80005B4h ;| 08000598 (T) cmp r0,0Ch ;| 0800059A (T) bgt 80005B4h ;} If 3000BDC == 0xB..0xC: 0800059C (T) cmp r0,0Bh ;| 0800059E (T) blt 80005B4h ;/ ; Samus death cutscene: go to game over 080005A0 (T) ldr r0,=GameMode ;\ 080005A2 (T) mov r1,8h ;} GameMode = 8 080005A4 (T) strh r1,[r0] ;/ 080005A6 (T) ldr r0,=SubGameModeB84 ;\ 080005A8 (T) strb r2,[r0] ;} SubGameModeB84 = 0 080005AA (T) b 80005BAh 080005AC dd 003000BDEh,003000B84h ; Return to in-game 080005B4 (T) ldr r1,=GameMode ;\ Else: 080005B6 (T) mov r0,1h ;| ;} GameMode = 1 080005B8 (T) strh r0,[r1] ;/ 080005BA (T) ldr r1,=SubGameMode2 ;\ 080005BC (T) mov r0,0h ;| ;} SubGameMode2 = 0 080005BE (T) strh r0,[r1] ;/ 080005C0 (T) mov r0,0h ;\ 080005C2 (T) strb r0,[r3] ;} SubGameMode1 = 0 080005C4 (T) b 800074Ch ; End GameMode specific code 080005C6 dw 00000h 080005C8 dd 003000BDEh,003000BE0h ;;; SA-X close-up ;;; 080005D0 (T) bl 809DB74h ; Call this subroutine 080005D4 (T) cmp r0,0h ;\ 080005D6 (T) bne 80005DAh ;} If returned 0: end GameMode specific code 080005D8 (T) b 800074Ch ;/ ; Scene's over 080005DA (T) ldr r1,=GameMode ;\ 080005DC (T) mov r0,1h ;} GameMode = 1, SubGameMode 2 = 0, end GameMode specific code 080005DE (T) b 80006BCh ;/ 080005E0 dd 003000BDEh ;;; Erase SRAM menu ;;; 080005E4 (T) bl 80809F0h ; Call this subroutine 080005E8 (T) cmp r0,0h ;\ 080005EA (T) bne 80005EEh ;} If returned == 0: end GameMode specific coderr 080005EC (T) b 800074Ch ;/ 080005EE (T) ldr r0,=SubGameMode1 ;\ 080005F0 (T) mov r1,0h ;| 080005F2 (T) ldsb r1,[r0,r1] ;| 080005F4 (T) mov r3,r0 ;} If SubGameMode1 == 1: 080005F6 (T) cmp r1,1h ;| 080005F8 (T) bne 800060Ch ;/ ; Cleared SRAM 080005FA (T) ldr r1,=RebootFlag ;\ 080005FC (T) mov r0,2h ;} RebootFlag = 2 080005FE (T) strb r0,[r1] ;/ 08000600 (T) b 8000612h 08000602 dw 00000h 08000604 dd 003000BE2h,003000020h ; Didn't clear SRAM 0800060C (T) ldr r1,=GameMode ;\ Else: 0800060E (T) mov r0,0h ;} GameMode = 0 08000610 (T) strh r0,[r1] ;/ 08000612 (T) ldr r1,=SubGameMode2 ;\ 08000614 (T) mov r0,0h ;} SubGameMode2 = 0 08000616 (T) strh r0,[r1] ;/ 08000618 (T) strb r0,[r3] ; SubGameMode1 = 0 0800061A (T) b 800074Ch ; End GameMode specific code 0800061C dd 003000BDEh,003000BE0h ;;; Game Over ;;; 08000624 (T) ldr r4,=SubGameMode1 08000626 (T) bl 809DEB4h ; Call this subroutine 0800062A (T) strb r0,[r4] ; SubGameMode1 = returned 0800062C (T) lsl r0,r0,18h ;\ 0800062E (T) asr r4,r0,18h ;| 08000630 (T) cmp r4,1h ;} If SubGameMode1 != 1: branch to 8000684 08000632 (T) bne 8000684h ;/ ; Retried 08000634 (T) bl 8080968h ; Call this subroutine 08000638 (T) cmp r0,0h ;\ 0800063A (T) beq 8000654h ;} If returned != 0: ; Load from save point 0800063C (T) ldr r0,=GameMode ;\ 0800063E (T) strh r4,[r0] ;} GameMode = 1 08000640 (T) ldr r1,=SubGameModeB84 ;\ 08000642 (T) mov r0,0h ;} SubGameModeB84 = 0 08000644 (T) strb r0,[r1] ;/ 08000646 (T) b 800065Eh 08000648 dd 003000BE2h,003000BDEh,003000B84h ; Load from navigation room 08000654 (T) ldr r0,=GameMode ;\ Else: 08000656 (T) mov r1,3h ;} GameMode = 3 08000658 (T) strh r1,[r0] ;/ 0800065A (T) ldr r0,=SubGameModeB84 ;\ 0800065C (T) strb r4,[r0] ;} SubGameModeB84 = 1 0800065E (T) ldr r0,=3000BE3h ;\ 08000660 (T) mov r1,0h ;} 3000BE3 = 0 08000662 (T) strb r1,[r0] ;/ 08000664 (T) ldr r0,=3000BDCh ;\ 08000666 (T) strb r1,[r0] ;} 3000BDC = 0 08000668 (T) ldr r1,=SubGameMode2 ;\ 0800066A (T) mov r0,0h ;} SubGameMode2 = 0 0800066C (T) strh r0,[r1] ;/ 0800066E (T) b 800068Ch ; SubGameMode1 = 0, end GameMode specific code 08000670 dd 003000BDEh,003000B84h,003000BE3h,003000BDCh 08000680 dd 003000BE0h ; Back to title 08000684 (T) cmp r4,2h ;\ 08000686 (T) bne 800068Ch ;} If SubGameMode1 == 2: 08000688 (T) ldr r0,=GameMode ;\ 0800068A (T) strh r4,[r0] ;} GameMode = 2 0800068C (T) ldr r1,=SubGameMode1 ;\ 0800068E (T) mov r0,0h ;} SubGameMode1 = 0 08000690 (T) strb r0,[r1] ;/ 08000692 (T) b 800074Ch ; End GameMode specific code 08000694 dd 003000BDEh,003000BE2h ;;; Ending ;;; 0800069C (T) bl 8094E84h ; Call this subroutine 080006A0 (T) cmp r0,0h ;\ 080006A2 (T) beq 800074Ch ;} If returned 0: end GameMode specific code ; End of last dialogue 080006A4 (T) ldr r1,=GameMode ;\ 080006A6 (T) mov r0,0Bh ;} GameMode = 0xB, SubGameMode2 = 0, end GameMode specific code 080006A8 (T) b 80006BCh ;/ 080006AA dw 00000h 080006AC dd 003000BDEh ;;; Died from SR388 collision ;;; 080006B0 (T) bl 809741Ch ; Call this subroutine 080006B4 (T) cmp r0,0h ;\ 080006B6 (T) beq 800074Ch ;} If returned 0: end GameMode specific code ; End of cutscene 080006B8 (T) ldr r1,=GameMode ;\ 080006BA (T) mov r0,8h ;| ;} GameMode = 8 080006BC (T) strh r0,[r1] ;/ 080006BE (T) ldr r1,=SubGameMode2 ;\ 080006C0 (T) mov r0,0h ;} SubGameMode2 = 0 080006C2 (T) strh r0,[r1] ;/ 080006C4 (T) b 800074Ch ; End GameMode specific code 080006C6 dw 00000h 080006C8 dd 003000BDEh,003000BE0h ;;; Credits ;;; 080006D0 (T) bl 80A1C84h ; Call this subroutine 080006D4 (T) cmp r0,0h ;\ 080006D6 (T) beq 800074Ch ;} If returned 0: end GameMode specific code 080006D8 (T) ldr r1,=GameMode ;\ 080006DA (T) mov r0,2h ;} GameMode = 2 080006DC (T) strh r0,[r1] ;/ 080006DE (T) b 800074Ch ; End GameMode specific code 080006E0 dd 003000BDEh ;;; Demo ;;; 080006E4 (T) bl 800DD24h ; Call this subroutine 080006E8 (T) cmp r0,0h ;\ 080006EA (T) beq 800074Ch ;} If returned 0: end GameMode specific code 080006EC (T) ldr r0,=SubGameModeB84 ;\ 080006EE (T) mov r1,0h ;} SubGameModeB84 = 0 080006F0 (T) strb r1,[r0] ;/ 080006F2 (T) ldr r0,=3000BE3h ;\ 080006F4 (T) strb r1,[r0] ;} 3000BE3 = 0 080006F6 (T) ldr r1,=SubGameMode2 ;\ 080006F8 (T) mov r0,0h ;} SubGameMode2 = 0 080006FA (T) strh r0,[r1] ;/ 080006FC (T) ldr r0,=3001242h ;\ 080006FE (T) ldrb r1,[r0] ;| 08000700 (T) cmp r1,0h ;} If 3001242 == 0: 08000702 (T) bne 8000720h ;/ ; Interrupted demo, end of last demo 08000704 (T) ldr r0,=GameMode ;\ 08000706 (T) strh r1,[r0] ;} GameMode = 0 08000708 (T) b 800074Ch ; End GameMode specific code 0800070A dw 00000h 0800070C dd 003000B84h,003000BE3h,003000BE0h,003001242h 0800071C dd 003000BDEh ; Next demo 08000720 (T) bl 80718CCh ; Call this subroutine 08000724 (T) ldr r1,=GameMode ;\ 08000726 (T) mov r0,0Ch ;} GameMode = 0xC 08000728 (T) strh r0,[r1] ;/ 0800072A (T) b 800074Ch ; End GameMode specific code 0800072C dd 003000BDEh ;;; Game mode 0Dh (unused?), seems to copy a lot of the intro stuff ;;; 08000730 (T) bl 8087920h ; Call this subroutine 08000734 (T) cmp r0,0h ;\ 08000736 (T) beq 800074Ch ;} If returned 0: end GameMode specific code 08000738 (T) ldr r2,=SubGameMode1 ;\ 0800073A (T) mov r0,0h ;| 0800073C (T) ldsb r0,[r2,r0] ;} If SubGameMode1 != 0: 0800073E (T) cmp r0,0h ;| 08000740 (T) beq 8000748h ;/ 08000742 (T) ldr r1,=GameMode ;\ 08000744 (T) mov r0,0Eh ;} GameMode = 0xE 08000746 (T) strh r0,[r1] ;/ 08000748 (T) mov r0,0h ;\ 0800074A (T) strb r0,[r2] ;} SubGameMode1 = 0 ;;; Execution continues here after all game mode specific code is executed ;;; ; This is also the branch for game mode 0Eh 0800074C (T) ldr r0,=VBlankRequestFlag ;\ 0800074E (T) ldrh r2,[r0] ;| 08000750 (T) ldr r1,=0FFFEh ;} Clear VBlankRequestFlag 08000752 (T) and r1,r2 ;| 08000754 (T) strh r1,[r0] ;/ 08000756 (T) mov r2,r0 08000758 (T) mov r3,1h 0800075A (T) swi 2h ;Halt ; Wait for interrupt 0800075C (T) ldrh r1,[r2] ;\ 0800075E (T) mov r0,r3 ;| 08000760 (T) and r0,r1 ;} Loop until VBlankRequestFlag set (by interrupt) 08000762 (T) cmp r0,0h ;| 08000764 (T) beq 800075Ah ;/ 08000766 (T) ldr r1,=ClearedEveryFrame ;\ 08000768 (T) mov r0,0h ;} Clear this... 0800076A (T) strb r0,[r1] ;/ 0800076C (T) bl StartOfFrameCode ; Call this subroutine 08000770 (T) ldr r0,=RebootFlag ;\ 08000772 (T) ldrb r0,[r0] ;| 08000774 (T) cmp r0,0h ;} Loop if RebootFlag != 0 08000776 (T) bne 800077Ah ;| 08000778 (T) b 8000238h ;/ 0800077A (T) pop r4-r6 ;\ 0800077C (T) pop r0 ;} Return to game entry loop (to reboot) 0800077E (T) bx r0 ;/ 08000780 dd 003000BE2h,003000BDEh,003000BE6h,00000FFFEh 08000790 dd 003000BE4h,003000020h