;;;Check to set event function;;; 08060940 (T) push r4,r14 08060942 (T) lsl r0,r0,18h 08060944 (T) lsr r2,r0,18h 08060946 (T) mov r4,1h ; Used as an is-valid-event flag 08060948 (T) sub r0,r2,2 ;\ 0806094A (T) cmp r0,6Bh ;| 0806094C (T) bls 8060950h ;| 0806094E (T) b 8060B3Ch ;| 08060950 (T) lsl r0,r0,2h ;} Branch to the code that handles the type of event 08060952 (T) ldr r1,=8060960h ;| 08060954 (T) add r0,r0,r1 ;| 08060956 (T) ldr r0,[r0] ;| 08060958 (T) mov r15,r0 ;/ 0806095A dw 00000h 0806095C dd 008060960h,008060B10h,008060B3Ch,008060B3Ch 0806096C dd 008060B3Ch,008060B3Ch,008060B3Ch,008060B3Ch 0806097C dd 008060B3Ch,008060B10h,008060B3Ch,008060B3Ch 0806098C dd 008060B3Ch,008060B3Ch,008060B10h,008060B30h 0806099C dd 008060B3Ch,008060B3Ch,008060B3Ch,008060B3Ch 080609AC dd 008060B3Ch,008060B3Ch,008060B3Ch,008060B3Ch 080609BC dd 008060B10h,008060B3Ch,008060B3Ch,008060B3Ch 080609CC dd 008060B10h,008060B3Ch,008060B3Ch,008060B30h 080609DC dd 008060B3Ch,008060B3Ch,008060B3Ch,008060B3Ch 080609EC dd 008060B3Ch,008060B3Ch,008060B3Ch,008060B10h 080609FC dd 008060B3Ch,008060B3Ch,008060B3Ch,008060B3Ch 08060A0C dd 008060B3Ch,008060B3Ch,008060B3Ch,008060B3Ch 08060A1C dd 008060B30h,008060B10h,008060B10h,008060B3Ch 08060A2C dd 008060B3Ch,008060B3Ch,008060B3Ch,008060B3Ch 08060A3C dd 008060B3Ch,008060B3Ch,008060B3Ch,008060B30h 08060A4C dd 008060B10h,008060B3Ch,008060B30h,008060B3Ch 08060A5C dd 008060B3Ch,008060B3Ch,008060B3Ch,008060B3Ch 08060A6C dd 008060B3Ch,008060B3Ch,008060B3Ch,008060B3Ch 08060A7C dd 008060B10h,008060B30h,008060B3Ch,008060B3Ch 08060A8C dd 008060B30h,008060B30h,008060B3Ch,008060B3Ch 08060A9C dd 008060B10h,008060B3Ch,008060B3Ch,008060B3Ch 08060AAC dd 008060B3Ch,008060B3Ch,008060B3Ch,008060B3Ch 08060ABC dd 008060B3Ch,008060B3Ch,008060B10h,008060B3Ch 08060ACC dd 008060B30h,008060B3Ch,008060B3Ch,008060B10h 08060ADC dd 008060B3Ch,008060B3Ch,008060B3Ch,008060B3Ch 08060AEC dd 008060B3Ch,008060B10h,008060B30h,008060B3Ch 08060AFC dd 008060B3Ch,008060B30h,008060B30h,008060B30h 08060B0C dd 008060B30h ; Boss-kill events, except Nettori ;02 Killed quarintine bay hornoad ;0A Morphball-get ;0F Charge beam-get ;19 Hi-jump-get - Cacoons - SA-X blown up return route ;1D Speed booster-get ;28 Wild BOX escaped <--can't skip this ;32 Core-X exits data room ;33 Varia suit-get ;3D Cooling unit operational ;49 Space jump-get ;51 Gravity suit-get ;5B Wave beam-get ;60 Screw attack-get ;66 Ice beam-lose 08060B10 (T) ldr r0,=EventCounter ;\ 08060B12 (T) ldrb r1,[r0] ;| 08060B14 (T) sub r0,r2,1 ;} If EventCounter != r0 parameter-1: 08060B16 (T) cmp r1,r0 ;| 08060B18 (T) beq 8060B24h ;/ 08060B1A (T) mov r4,0h ;\ 08060B1C (T) b 8060B46h ;} r4 = 0, continue to return 08060B1E dw 00000h 08060B20 dd 003000B87h 08060B24 (T) ldr r1,=3000046h ;\ 08060B26 (T) mov r0,3Ch ;} Else 3C -> 3000046 08060B28 (T) strb r0,[r1] ;/ 08060B2A (T) b 8060B3Ch ; Continue to 8060B3C 08060B2C dd 003000046h ; Dunno ;10 All stabilizers cleared ;20 Water level lowered ;31 Escaped SA-X ;3C Wide beam-get ;3F Etecoons and Dachora's released ;4A Auxiliary power engaged ;4D Escaped SA-X ;4E Plasma beam-get ;5D 60 seconds to detachment of Restricted Laboratory ;67 Orbit change implemented ;6A Omega metroid kills SA-X ;6B Ice beam-get ;6C Killed omega metroid ;6D Escaped planet 08060B30 (T) ldr r0,=EventCounter ;\ 08060B32 (T) ldrb r1,[r0] ;| 08060B34 (T) sub r0,r2,1 ;} If EventCounter != r0 parameter-1: 08060B36 (T) cmp r1,r0 ;| 08060B38 (T) beq 8060B3Ch ;/ 08060B3A (T) mov r4,0h ; r4 = 0 ; All others, including Adam ;06 In missile download room ;07 Downloaded missiles <--compatible with my patch ;08 Elevator's down ;0C Entered elevator room that SA-X destroys ;0D Entered elevator area ;13 Level 1 doors unlocked ;15 In bombs download room ;16 Downloaded bombs ;17 SA-X blown up return route ;18 Used alternate room exit ;1A Escaped SA-X ;1F Entered pump control unit ;23 Level 2 doors unlocked ;25 In super missile download room ;26 Download super missiles ;27 Reached end of pre-BOX room ;2A Left above navagation room ;2C Above conversation over ;2E In NOC navagation room ;30 SA-X enters ;34 Reached top of post-Mega-X room ;37 Unlocked level 3 doors ;39 In ice missile download room ;3A Downloaded ice missiles ;42 Downloaded power bombs <--compatible with my patch ;43 SA-X enters ;44 Escaped SA-X ;46 Power cuts out ;48 Entered Yakuza's room ;4C Engaged with SA-X ;52 In security room ;53 Unlocked level 4 doors ;55 In data room ;56 Downloaded diffusion missiles ;59 Reached end of pre-restricted zone room ;5A BOXquake ;5C Reached dead end in restricted zone ;5E Escaped ;62 Doors don't open... ;65 Entered SA-X fight room ;68 Skippable by entering ship room: I don't know how to get this event ;69 Entering ship room 08060B3C (T) cmp r4,0h ;\ 08060B3E (T) beq 8060B46h ;} If r4 != 0: 08060B40 (T) mov r0,r2 ;\ 08060B42 (T) bl SetEvent ;} Set the event, r0 parameter as its r0 parameter 08060B46 (T) mov r0,r4 ;\ 08060B48 (T) pop r4 ;| 08060B4A (T) pop r1 ;} Return r4 08060B4C (T) bx r1 ;/ 08060B4E dw 00000h 08060B50 dd 003000B87h ;;;Set event function;;; 08074890 (T) push r4,r14 08074892 (T) lsl r0,r0,18h ;\ 08074894 (T) lsr r1,r0,18h ;| 08074896 (T) ldr r0,=EventCounter ;} Store r0 parameter to event counter 08074898 (T) strb r1,[r0] ;/ 0807489A (T) mov r4,0h ; Used as an is-item-event flag 0807489C (T) cmp r1,6Bh ;\ 0807489E (T) bls 80748A2h ;| 080748A0 (T) b 8074B3Ah ;| 080748A2 (T) lsl r0,r1,2h ;| 080748A4 (T) ldr r1,=80748B4h ;} Branch to the code that handles the event 080748A6 (T) add r0,r0,r1 ;| 080748A8 (T) ldr r0,[r0] ;| 080748AA (T) mov r15,r0 ;/ 080748AC dd 003000B87h,0080748B4h,008074A64h,008074B3Ah 080748BC dd 008074B3Ah,008074A80h,008074B3Ah,008074B3Ah 080748CC dd 008074B3Ah,008074B38h,008074B3Ah,008074B3Ah 080748DC dd 008074B38h,008074B3Ah,008074B3Ah,008074B3Ah 080748EC dd 008074B3Ah,008074B38h,008074B3Ah,008074B3Ah 080748FC dd 008074B3Ah,008074A8Ch,008074B3Ah,008074B3Ah 0807490C dd 008074B38h,008074B3Ah,008074B3Ah,008074B38h 0807491C dd 008074B3Ah,008074B3Ah,008074B3Ah,008074B38h 0807492C dd 008074B3Ah,008074B3Ah,008074B3Ah,008074B3Ah 0807493C dd 008074B3Ah,008074AA0h,008074B3Ah,008074B3Ah 0807494C dd 008074B38h,008074B3Ah,008074B3Ah,008074B3Ah 0807495C dd 008074B3Ah,008074B3Ah,008074B3Ah,008074B3Ah 0807496C dd 008074B3Ah,008074B3Ah,008074B3Ah,008074B3Ah 0807497C dd 008074B3Ah,008074B38h,008074B3Ah,008074B3Ah 0807498C dd 008074B3Ah,008074AB4h,008074B3Ah,008074B3Ah 0807499C dd 008074B38h,008074B3Ah,008074B38h,008074B3Ah 080749AC dd 008074B3Ah,008074B3Ah,008074B3Ah,008074B3Ah 080749BC dd 008074B38h,008074B3Ah,008074B3Ah,008074B3Ah 080749CC dd 008074AEEh,008074B3Ah,008074B3Ah,008074B38h 080749DC dd 008074B3Ah,008074B3Ah,008074AE4h,008074B3Ah 080749EC dd 008074B10h,008074B3Ah,008074B3Ah,008074B38h 080749FC dd 008074B3Ah,008074AC8h,008074B3Ah,008074B3Ah 08074A0C dd 008074B38h,008074B3Ah,008074B3Ah,008074B3Ah 08074A1C dd 008074B3Ah,008074B38h,008074B3Ah,008074B3Ah 08074A2C dd 008074B3Ah,008074B3Ah,008074B38h,008074B3Ah 08074A3C dd 008074B3Ah,008074B3Ah,008074B3Ah,008074B3Ah 08074A4C dd 008074B3Ah,008074B3Ah,008074B3Ah,008074B3Ah 08074A5C dd 008074B3Ah,008074B38h ; Event: 00 ; Game start 08074A64 (T) ldr r0,=Sub-GameModeB84 ;\ 08074A66 (T) ldrb r0,[r0] ;| 08074A68 (T) lsl r0,r0,18h ;| 08074A6A (T) asr r0,r0,18h ;} If Sub-GameModeB84 != 0: 08074A6C (T) cmp r0,0h ;| 08074A6E (T) beq 8074B3Ah ;/ 08074A70 (T) ldr r1,=HealthStatus ;\ 08074A72 (T) mov r0,0FFh ;| 08074A74 (T) strb r0,[r1,0Dh] ;} Lock all security levels 08074A76 (T) b 8074B3Eh ;/ 08074A78 dd 003000B84h,003001310h ; Event: 03 ; Security level 0 unlocked 08074A80 (T) ldr r0,=HealthStatus ;\ 08074A82 (T) mov r1,0h ;} Unlock security level 0 08074A84 (T) strb r1,[r0,0Dh] ;/ 08074A86 (T) b 8074AFCh ; Branch to 08074AFC 08074A88 dd 003001310h ; Event: 13 ; Security level 1 unlocked 08074A8C (T) ldr r2,=HealthStatus ;\ 08074A8E (T) ldr r1,=85760C8h ;| 08074A90 (T) ldrb r0,[r1] ;} Unlock security level 1 08074A92 (T) strb r0,[r2,0Dh] ;/ 08074A94 (T) ldrb r0,[r1,4h] ;\ 08074A96 (T) b 8074AD2h ;} Load 0x23 as r0 parameter and branch to 08074AD2 08074A98 dd 003001310h,0085760C8h ; Event: 23 ; Security level 2 unlocked 08074AA0 (T) ldr r2,=HealthStatus ;\ 08074AA2 (T) ldr r1,=85760C8h ;| 08074AA4 (T) ldrb r0,[r1,8h] ;} Unlock security level 2 08074AA6 (T) strb r0,[r2,0Dh] ;/ 08074AA8 (T) ldrb r0,[r1,0Ch] ;\ 08074AAA (T) b 8074AD2h ;} Load 0x37 as r0 parameter and branch to 08074AD2 08074AAC dd 003001310h,0085760C8h ; Event: 37 ; Security level 3 unlocked 08074AB4 (T) ldr r2,=HealthStatus ;\ 08074AB6 (T) ldr r1,=85760C8h ;| 08074AB8 (T) ldrb r0,[r1,10h] ;} Unlock security level 3 08074ABA (T) strb r0,[r2,0Dh] ;/ 08074ABC (T) ldrb r0,[r1,14h] ;\ 08074ABE (T) b 8074AD2h ;} Load 0x4B as r0 parameter and branch to 08074AD2 08074AC0 dd 003001310h,0085760C8h ; Event: 53 ; Security level 4 unlocked 08074AC8 (T) ldr r2,=HealthStatus ;\ 08074ACA (T) ldr r1,=85760C8h ;| 08074ACC (T) ldrb r0,[r1,18h] ;} Unlock security level 4 08074ACE (T) strb r0,[r2,0Dh] ;/ 08074AD0 (T) ldrb r0,[r1,1Ch] ; Load 0x7D as r0 parameter, where it's written to 03000060 ; Shared door unlocking code 08074AD2 (T) mov r1,0Ah ; Load 0x0A as r1 parameter 08074AD4 (T) bl 8070164h ; 08070164 subroutine 08074AD8 (T) b 8074B3Ah 08074ADA (T) dw 00000h 08074ADC dd 003001310h,0085760C8h ; Event: 4C ; Engaged SA-X 08074AE4 (T) mov r0,71h ; Load 0x71 as r0 parameter 08074AE6 (T) mov r1,0Bh ; Load 0x0B as r1 parameter 08074AE8 (T) bl 8070164h ; 08070164 subroutine 08074AEC (T) b 8074B3Ah ; Event: 46 ; Power cuts out 08074AEE (T) ldr r1,=300001Dh ;\ 08074AF0 (T) ldr r2,=HealthStatus ;| 08074AF2 (T) ldrb r0,[r2,0Dh] ;} Backup security level to 0300001D 08074AF4 (T) strb r0,[r1] ;/ 08074AF6 (T) mov r1,0FFh ;\ 08074AF8 (T) orr r0,r1 ;} Lock all security levels 08074AFA (T) strb r0,[r2,0Dh] ;/ ; Shared with Security level 0 unlocked 08074AFC (T) ldr r0,=DoorFlashingLevel ;\ 08074AFE (T) strb r1,[r0] ;} Stop all door flashing / flash security level 1 doors 08074B00 (T) b 8074B3Ah 08074B02 (T) dw 00000h 08074B04 dd 00300001Dh,003001310h,00300001Ch ; Event: 4E ; Plasma Beam recovered 08074B10 (T) ldr r2,=300001Dh ;\ 08074B12 (T) ldrb r1,[r2] ;| 08074B14 (T) mov r0,r1 ;} If Backup security level != 0xFF: 08074B16 (T) cmp r0,0FFh ;| 08074B18 (T) beq 8074B3Eh ;/ 08074B1A (T) ldr r0,=HealthStatus ;\ 08074B1C (T) strb r1,[r0,0Dh] ;} Restore security level 08074B1E (T) mov r0,0FFh ;\ 08074B20 (T) strb r0,[r2] ;} Set Backup security level to 0xFF 08074B22 (T) ldr r1,=300004Ah ;\ 08074B24 (T) mov r0,2h ;} Store 2 to 0300004A 08074B26 (T) strb r0,[r1] ;/ 08074B28 (T) b 8074B3Eh 08074B2A (T) dw 00000h 08074B2C dd 00300001Dh,003001310h,00300004Ah ; Events: 07 0A 0F 16 19 1D 26 33 3A 3C 42 49 51 56 5B 60 6B ; Item recovered 08074B38 (T) mov r4,1h ; Rest of subroutine / the non-item-recovered events 08074B3A (T) cmp r4,0h ;\ 08074B3C (T) beq 8074BA0h ;} Return if not an item 08074B3E (T) mov r4,12h ; Decrementing from 0x12 08074B40 (T) ldr r3,=EventCounter 08074B42 (T) ldr r2,=8575FA0h ; List of item events: 07 0A 0F 16 19 1D 26 33 3A 3C 42 49 4E 51 56 5B 60 6B 08074B44 (T) add r1,r4,r2 ; Check which item event has been triggered 08074B46 (T) ldrb r0,[r3] ;\ 08074B48 (T) ldrb r1,[r1] ;| 08074B4A (T) cmp r0,r1 ;} The comparison 08074B4C (T) bne 8074B9Ah ;/ ; When found the item event 08074B4E (T) ldr r0,=AbilitiesCounter ;\ 08074B50 (T) strb r4,[r0] ;} Save this value 08074B52 (T) ldr r3,=HealthStatus ;\ 08074B54 (T) ldr r1,=8575FB4h ;| 08074B56 (T) lsl r0,r4,3h ;| 08074B58 (T) add r2,r0,r1 ;| 08074B5A (T) ldrb r0,[r3,0Ah] ;} OR the byte0 of 'Ability Data' to Beam status 08074B5C (T) ldrb r1,[r2] ;| 08074B5E (T) orr r0,r1 ;| 08074B60 (T) strb r0,[r3,0Ah] ;/ 08074B62 (T) ldrb r0,[r3,0Bh] ;\ 08074B64 (T) ldrb r1,[r2,1h] ;| 08074B66 (T) orr r0,r1 ;} OR the byte1 to Missile+bomb status 08074B68 (T) strb r0,[r3,0Bh] ;/ 08074B6A (T) ldrb r0,[r2,3h] ;\ 08074B6C (T) cmp r0,0h ;} If byte3 != 0: (Suits are 01) 08074B6E (T) beq 8074B8Ch ;/ 08074B70 (T) bl 8063190h ; Do this BL 08074B74 (T) b 8074B94h 08074B76 (T) dw 00000h 08074B78 dd 003000B87h,008575FA0h,00300001Bh, 003001310h 08074B88 dd 008575FB4h 08074B8C (T) ldrb r0,[r3,0Ch] ;\ Else: 08074B8E (T) ldrb r1,[r2,2h] ;| 08074B90 (T) orr r0,r1 ;} OR the byte 2 to Suit+misc status 08074B92 (T) strb r0,[r3,0Ch] ;/ 08074B94 (T) bl 80700F4h ; Do this BL, similar to the 08070164 BL 08074B98 (T) b 8074BA0h 08074B9A (T) sub r4,1h ;\ 08074B9C (T) cmp r4,0h ;} The decrementing of the item event iteration 08074B9E (T) bne 8074B44h ;/ 08074BA0 (T) pop r4 08074BA2 (T) pop r0 ; Called from door-unlocking (r1=0Ah) and SA-X engaging events (r1=0Bh) ; 03000060 = {l1 - 0x23}, {l2 - 0x37}, {l3 - 0x4B}, {l4 - 0x7D}, {SA-X - 0x71} 08070164 (T) push r14 08070166 (T) lsl r0,r0,18h 08070168 (T) lsr r0,r0,18h 0807016A (T) lsl r1,r1,18h 0807016C (T) lsr r1,r1,18h 0807016E (T) ldr r2,=3000060h ;\ 08070170 (T) strh r0,[r2] ;} Store r0 parameter to 03000060 08070172 (T) mov r0,r1 ;\ 08070174 (T) bl 8070180h ;} 08070180 subroutine, r1 parameter as its r0 parameter 08070178 (T) pop r0 0807017A (T) bx r0 0807017C dd 003000060h ; Called from all item-get events 080700F4 (T) push r14 080700F6 (T) ldr r1,=8575FB4h ;\ 080700F8 (T) ldr r0,=AbilitiesCounter ;| 080700FA (T) ldrb r0,[r0] ;| 080700FC (T) lsl r0,r0,3h ;| 080700FE (T) add r0,r0,r1 ;} If byte6 of current item's ability data != 0: 08070100 (T) ldrh r1,[r0,6h] ;| 08070102 (T) cmp r1,0h ;| 08070104 (T) beq 8070110h ;/ 08070106 (T) ldr r0,=3000060h ;\ 08070108 (T) strh r1,[r0] ;} Store it to 03000060 0807010A (T) mov r0,9h ;\ 0807010C (T) bl 8070180h ;} And do the 08070180 subroutine, 9 as its r0 parameter 08070110 (T) pop r0 08070112 (T) bx r0 08070114 dd 008575FB4h,00300001Bh,003000060h ; Called from the suit-get events 08063190 (T) push r14 08063192 (T) mov r2,0h 08063194 (T) ldr r0,=300004Ah ;\ 08063196 (T) ldrb r1,[r0] ;| 08063198 (T) cmp r1,90h ;| 0806319A (T) beq 80631A6h ;| 0806319C (T) cmp r1,0h ;} If 0300004A == 0 or 0x90: 0806319E (T) bne 80631A2h ;| 080631A0 (T) mov r2,1h ;| 080631A2 (T) cmp r2,0h ;| 080631A4 (T) beq 80631BCh ;/ 080631A6 (T) mov r1,16h ;\ 080631A8 (T) strb r1,[r0] ;} 0300004A = 0x16 080631AA (T) ldr r0,=300004Bh ;\ 080631AC (T) strb r1,[r0] ;} 0300004B = 0x16 080631AE (T) ldr r1,=3004FA0h ;\ 080631B0 (T) mov r0,0h ;} 03004FA0 = 0x0000 080631B2 (T) strh r0,[r1] ;/ 080631B4 (T) strh r0,[r1,2h] ; 03004FA2 = 0x0000 080631B6 (T) ldr r1,=300002Bh ;\ 080631B8 (T) mov r0,1h ;} 0300002B = 0x01 080631BA (T) strb r0,[r1] ;/ 080631BC (T) pop r0 080631BE (T) bx r0 080631C0 dd 00300004Ah,00300004Bh,003004FA0h,00300002Bh