From 03000140 Each enemy slot is 0x38 bytes There are 24 slots From 30006BC to 30006F4 Enemy00 = 0x030006BC: Enemy orientation Enemy02 = 0x030006BE: Enemy Y position Enemy04 = 0x030006C0: Enemy X position Enemy06 = 0x030006C2: Enemy Y position spawn Enemy08 = 0x030006C4: Enemy X position spawn Enemy0A = 0x030006C6: Enemy top boundary offset Enemy0C = 0x030006C8: Enemy bottom boundary offset Enemy0E = 0x030006CA: Enemy left boundary offset Enemy10 = 0x030006CC: Enemy right boundary offset Enemy14 = 0x030006D0: Enemy health Enemy16 = 0x030006D2: Enemy animation Enemy18 = 0x030006D4: Enemy graphic pointer Enemy1C = 0x030006D8: Enemy animation counter Enemy1D = 0x030006D9: Enemy ID Enemy1E = 0x030006DA: Enemy spriteset slot Enemy1F = 0x030006DB: Enemy spriteset GFX slot Enemy20 = 0x030006DC: Enemy palette Enemy21 = 0x030006DD: Unknown (used in spritedata routine) Enemy22 = 0x030006DE: Unknown (used in spritedata routine) Enemy23 = 0x030006DF: Enemy slot Enemy24 = 0x030006E0: Enemy pose Enemy25 = 0x030006E1: Unknown Enemy26 = 0x030006E2: Enemy timer for something Enemy27 = 0x030006E3: Unknown Enemy28 = 0x030006E4: Unknown Enemy29 = 0x030006E5: Unknown Enemy2A = 0x030006E6: Unknown (used in spritedata routine) Enemy2B = 0x030006E7: Unknown Enemy2C = 0x030006E8: Enemy invincibility timer Enemy2D = 0x030006E9: Unknown (used in spritedata routine) Enemy2E = 0x030006EA: Enemy respawn timer Enemy2F = 0x030006EB: Enemy attached enemy slot Enemy30 = 0x030006EC: Unknown Enemy31 = 0x030006ED: Unknown Enemy32 = 0x030006EE: Enemy freeze timer Enemy34 = 0x030006F0: Enemy collision properties Enemy35 = 0x030006F1: Unknown (used in spritedata routine) Enemy36 = 0x030006F2: Unknown (used in spritedata routine) ;;; Main enemy handling routine ;;; ; Welcome to duplicated codesville. The code paths are: ; A: SubGameMode==2 and 8012644==0 ; B: and 8012644!=0 ; C: SubGameMode==6 ; D: SubGameMode!={2,6} ; A = C + a bl 8010220 ; B = C + a check for EnemyPose!=0 or EnemyCollisionProperties has 01 ; D = C - bl 8013B24h - bl 8011D9C - bl 800EABC + a check for EnemyPose==0 0800E7E8 (T) push r4-r7,r14 0800E7EA (T) mov r7,r8 0800E7EC (T) push r7 0800E7EE (T) ldr r0,=SubGameMode2 ;\ 0800E7F0 (T) mov r1,0h ;| 0800E7F2 (T) ldsh r0,[r0,r1] ;| 0800E7F4 (T) cmp r0,2h ;} If SubGameMode2 == 2: 0800E7F6 (T) beq 800E7FAh ;| 0800E7F8 (T) b 800E970h ;/ 0800E7FA (T) bl 8014078h ; Execute subroutine 8014078 (most likely enemy-damage handler) 0800E7FE (T) bl 8012644h ;\ 0800E802 (T) cmp r0,0h ;} If 3001348 == 0 and Samus not facing foreground: 0800E804 (T) bne 800E8B0h ;/ 0800E806 (T) bl 8010220h ; Execute subroutine 8010220 (most likely Samus-enemy interaction) 0800E80A (T) mov r5,0h ; Enemy slot index (00.17h) 0800E80C (T) ldr r7,=EnemySlot0 ; Enemy slots base 0800E80E (T) lsl r2,r5,3h ;\ 0800E810 (T) sub r0,r2,r5 ;| 0800E812 (T) lsl r0,r0,3h ;| 0800E814 (T) add r3,r0,r7 ;| 0800E816 (T) ldrh r1,[r3] ;| 0800E818 (T) mov r0,1h ;} If EnemySlot[r5]Orientation hasn't 01: next slot 0800E81A (T) and r0,r1 ;| 0800E81C (T) mov r6,r2 ;| 0800E81E (T) cmp r0,0h ;| 0800E820 (T) beq 800E89Ch ;/ 0800E822 (T) ldr r4,=EnemyOrientation ;\ 0800E824 (T) mov r0,r4 ;| 0800E826 (T) mov r1,r3 ;} Copy EnemySlot[r5] to enemy processing slot 0800E828 (T) mov r2,38h ;| 0800E82A (T) bl 8-bitCopy ;/ 0800E82E (T) mov r0,r5 ; r0 parameter = enemy slot index 0800E830 (T) bl 800E7A8h ; Enemy random number 0800E834 (T) bl 8013B24h ; Execute subroutine 8013B24 (to do with EnemyPalette) 0800E838 (T) mov r0,r4 ;\ 0800E83A (T) add r0,34h ;| 0800E83C (T) ldrb r1,[r0] ;| 0800E83E (T) mov r0,80h ;} If EnemyCollisionProperties has 80h: 0800E840 (T) and r0,r1 ;| 0800E842 (T) cmp r0,0h ;| 0800E844 (T) beq 800E868h ;/ 0800E846 (T) ldr r0,=879ABD0h ;\ 0800E848 (T) ldrb r1,[r4,1Dh] ;| 0800E84A (T) lsl r1,r1,2h ;| 0800E84C (T) add r1,r1,r0 ;} Execute special enemy AI 0800E84E (T) ldr r0,[r1] ;| 0800E850 (T) bl bx_r0 ;/ 0800E854 (T) b 800E876h 0800E856 dw 00000h 0800E858 dd 003000BE0h,003000140h,0030006BCh,00879ABD0h 0800E868 (T) ldr r0,=879A29Ch ;\ Else (EnemyCollisionProperties hasn't 80h): 0800E86A (T) ldrb r1,[r4,1Dh] ;| 0800E86C (T) lsl r1,r1,2h ;| 0800E86E (T) add r1,r1,r0 ;} Execute enemy AI 0800E870 (T) ldr r0,[r1] ;| 0800E872 (T) bl bx_r0 ;/ 0800E876 (T) ldr r4,=EnemyOrientation ;\ 0800E878 (T) ldrh r1,[r4] ;| 0800E87A (T) mov r0,1h ;| 0800E87C (T) and r0,r1 ;} If EnemyOrientation has 01: 0800E87E (T) cmp r0,0h ;| 0800E880 (T) beq 800E88Eh ;/ 0800E882 (T) bl 8011D9Ch ; Execute subroutine 8011D9C 0800E886 (T) bl 800EABCh ; Execute subroutine 800EABC (Update enemy animation) 0800E88A (T) bl 800F568h ; Execute subroutine 800F568 (Probably to do with enemy being on screen) 0800E88E (T) sub r0,r6,r5 ;\ 0800E890 (T) lsl r0,r0,3h ;| 0800E892 (T) add r0,r0,r7 ;| 0800E894 (T) mov r1,r4 ;} Copy enemy processing slot to EnemySlot[r5] 0800E896 (T) mov r2,38h ;| 0800E898 (T) bl 8-bitCopy ;/ 0800E89C (T) add r0,r5,1 ; Next slot 0800E89E (T) lsl r0,r0,18h 0800E8A0 (T) lsr r5,r0,18h 0800E8A2 (T) cmp r5,17h ;\ 0800E8A4 (T) bls 800E80Eh ;} Loop until r5 == 18h 0800E8A6 (T) b 800EAAAh ; Return 0800E8A8 dd 00879A29Ch,0030006BCh ; Else (3001348 != 0 or Samus facing foreground): 0800E8B0 (T) mov r5,0h ; Enemy slot index (00..17h) 0800E8B2 (T) ldr r0,=EnemySlot0 ;\ 0800E8B4 (T) mov r8,r0 ;} Enemy slots base 0800E8B6 (T) mov r7,1h ; Bit0 0800E8B8 (T) lsl r2,r5,3h ;\ 0800E8BA (T) sub r0,r2,r5 ;| 0800E8BC (T) lsl r0,r0,3h ;| 0800E8BE (T) mov r1,r8 ;| 0800E8C0 (T) add r3,r0,r1 ;| 0800E8C2 (T) ldrh r1,[r3] ;} If EnemySlot[r5]Orientation hasn't 01: next slot 0800E8C4 (T) mov r0,r7 ;| 0800E8C6 (T) and r0,r1 ;| 0800E8C8 (T) mov r6,r2 ;| 0800E8CA (T) cmp r0,0h ;| 0800E8CC (T) beq 800E95Ch ;/ 0800E8CE (T) mov r0,r3 ;\ 0800E8D0 (T) add r0,24h ;| 0800E8D2 (T) ldrb r0,[r0] ;} If EnemySlot[r5]Pose == 0: 0800E8D4 (T) cmp r0,0h ;| 0800E8D6 (T) beq 800E8E6h ;/ 0800E8D8 (T) mov r0,r3 ;\ 0800E8DA (T) add r0,34h ;| 0800E8DC (T) ldrb r1,[r0] ;| 0800E8DE (T) mov r0,r7 ;} If EnemySlot[r5]CollisionProperties hasn't 01: next slot 0800E8E0 (T) and r0,r1 ;| 0800E8E2 (T) cmp r0,0h ;| 0800E8E4 (T) beq 800E95Ch ;/ 0800E8E6 (T) ldr r4,=EnemyOrientation ;\ 0800E8E8 (T) mov r0,r4 ;| 0800E8EA (T) mov r1,r3 ;} Copy EnemySlot[r5] to enemy processing slot 0800E8EC (T) mov r2,38h ;| 0800E8EE (T) bl 8-bitCopy ;/ 0800E8F2 (T) mov r0,r5 ; r0 parameter = enemy slot index 0800E8F4 (T) bl 800E7A8h ; Enemy random number 0800E8F8 (T) bl 8013B24h ; Execute subroutine 8013B24 (to do with EnemyPalette) 0800E8FC (T) mov r0,r4 ;\ 0800E8FE (T) add r0,34h ;| 0800E900 (T) ldrb r1,[r0] ;| 0800E902 (T) mov r0,80h ;} If EnemyCollisionProperties has 80h: 0800E904 (T) and r0,r1 ;| 0800E906 (T) cmp r0,0h ;| 0800E908 (T) beq 800E928h ;/ 0800E90A (T) ldr r0,=879ABD0h ;\ 0800E90C (T) ldrb r1,[r4,1Dh] ;| 0800E90E (T) lsl r1,r1,2h ;| 0800E910 (T) add r1,r1,r0 ;} Execute special enemy AI 0800E912 (T) ldr r0,[r1] ;| 0800E914 (T) bl bx_r0 ;/ 0800E918 (T) b 800E936h 0800E91A dw 00000h 0800E91C dd 003000140h,0030006BCh,00879ABD0h 0800E928 (T) ldr r0,=879A29Ch ;\ Else (EnemyCollisionProperties hasn't 80h): 0800E92A (T) ldrb r1,[r4,1Dh] ;| 0800E92C (T) lsl r1,r1,2h ;| 0800E92E (T) add r1,r1,r0 ;} Execute enemy AI 0800E930 (T) ldr r0,[r1] ;| 0800E932 (T) bl bx_r0 ;/ 0800E936 (T) ldr r4,=EnemyOrientation ;\ 0800E938 (T) ldrh r1,[r4] ;| 0800E93A (T) mov r0,r7 ;| 0800E93C (T) and r0,r1 ;} If EnemyOrientation has 01: 0800E93E (T) cmp r0,0h ;| 0800E940 (T) beq 800E94Eh ;/ 0800E942 (T) bl 8011D9Ch ; Execute subroutine 8011D9C 0800E946 (T) bl 800EABCh ; Execute subroutine 800EABC (Update enemy animation) 0800E94A (T) bl 800F568h ; Execute subroutine 800F568 (Probably to do with enemy being on screen) 0800E94E (T) sub r0,r6,r5 ;\ 0800E950 (T) lsl r0,r0,3h ;| 0800E952 (T) add r0,r8 ;| 0800E954 (T) mov r1,r4 ;} Copy enemy processing slot to EnemySlot[r5] 0800E956 (T) mov r2,38h ;| 0800E958 (T) bl 8-bitCopy ;/ 0800E95C (T) add r0,r5,1 ; Next enemy slot 0800E95E (T) lsl r0,r0,18h 0800E960 (T) lsr r5,r0,18h 0800E962 (T) cmp r5,17h ;\ 0800E964 (T) bls 800E8B8h ;} Loop until r5 == 18h 0800E966 (T) b 800EAAAh ; Return 0800E968 dd 00879A29Ch,0030006BCh 0800E970 (T) cmp r0,6h ;\ Else (SubGameMode2 != 2): 0800E972 (T) bne 800EA14h ;} If SubGameMode2 == 6: 0800E974 (T) mov r5,0h ; Enemy slot index (00.17h) 0800E976 (T) ldr r7,=EnemySlot0 ; Enemy slots base 0800E978 (T) lsl r2,r5,3h ;\ 0800E97A (T) sub r0,r2,r5 ;| 0800E97C (T) lsl r0,r0,3h ;| 0800E97E (T) add r3,r0,r7 ;| 0800E980 (T) ldrh r1,[r3] ;| 0800E982 (T) mov r0,1h ;} If EnemySlot[r5]Orientation hasn't 01: next slot 0800E984 (T) and r0,r1 ;| 0800E986 (T) mov r6,r2 ;| 0800E988 (T) cmp r0,0h ;| 0800E98A (T) beq 800EA00h ;/ 0800E98C (T) ldr r4,=EnemyOrientation ;\ 0800E98E (T) mov r0,r4 ;| 0800E990 (T) mov r1,r3 ;} Copy EnemySlot[r5] to enemy processing slot 0800E992 (T) mov r2,38h ;| 0800E994 (T) bl 8-bitCopy ;/ 0800E998 (T) mov r0,r5 ; r0 parameter = enemy slot index 0800E99A (T) bl 800E7A8h ; Enemy random number 0800E99E (T) bl 8013B24h ; Execute subroutine 8013B24 (to do with EnemyPalette) 0800E9A2 (T) mov r0,r4 ;\ 0800E9A4 (T) add r0,34h ;| 0800E9A6 (T) ldrb r1,[r0] ;| 0800E9A8 (T) mov r0,80h ;} If EnemyCollisionProperties has 80h: 0800E9AA (T) and r0,r1 ;| 0800E9AC (T) cmp r0,0h ;| 0800E9AE (T) beq 800E9CCh ;/ 0800E9B0 (T) ldr r0,=879ABD0h ;\ 0800E9B2 (T) ldrb r1,[r4,1Dh] ;| 0800E9B4 (T) lsl r1,r1,2h ;| 0800E9B6 (T) add r1,r1,r0 ;} Execute special enemy AI 0800E9B8 (T) ldr r0,[r1] ;| 0800E9BA (T) bl bx_r0 ;/ 0800E9BE (T) b 800E9DAh 0800E9C0 dd 003000140h,0030006BCh,00879ABD0h 0800E9CC (T) ldr r0,=879A29Ch ;\ Else (EnemyCollisionProperties hasn't 80h): 0800E9CE (T) ldrb r1,[r4,1Dh] ;| 0800E9D0 (T) lsl r1,r1,2h ;| 0800E9D2 (T) add r1,r1,r0 ;} Execute enemy AI 0800E9D4 (T) ldr r0,[r1] ;| 0800E9D6 (T) bl bx_r0 ;/ 0800E9DA (T) ldr r4,=EnemyOrientation ;\ 0800E9DC (T) ldrh r1,[r4] ;| 0800E9DE (T) mov r0,1h ;| 0800E9E0 (T) and r0,r1 ;} If EnemyOrientation has 01: 0800E9E2 (T) cmp r0,0h ;| 0800E9E4 (T) beq 800E9F2h ;/ 0800E9E6 (T) bl 8011D9Ch ; Execute subroutine 8011D9C 0800E9EA (T) bl 800EABCh ; Execute subroutine 800EABC (Update enemy animation) 0800E9EE (T) bl 800F568h ; Execute subroutine 800F568 (Probably to do with enemy being on screen) 0800E9F2 (T) sub r0,r6,r5 ;\ 0800E9F4 (T) lsl r0,r0,3h ;| 0800E9F6 (T) add r0,r0,r7 ;| 0800E9F8 (T) mov r1,r4 ;} Copy enemy processing slot to EnemySlot[r5] 0800E9FA (T) mov r2,38h ;| 0800E9FC (T) bl 8-bitCopy ;/ 0800EA00 (T) add r0,r5,1 ; Next slot 0800EA02 (T) lsl r0,r0,18h 0800EA04 (T) lsr r5,r0,18h 0800EA06 (T) cmp r5,17h ;\ 0800EA08 (T) bls 800E978h ;} Loop until r5 == 18h 0800EA0A (T) b 800EAAAh ; Return 0800EA0C dd 00879A29Ch,0030006BCh ; Else (SubGameMode != 6): 0800EA14 (T) mov r5,0h ; Enemy slot index (00..17h) 0800EA16 (T) ldr r7,=EnemySlot0 ; Enemy slots base 0800EA18 (T) lsl r2,r5,3h ;\ 0800EA1A (T) sub r0,r2,r5 ;| 0800EA1C (T) lsl r0,r0,3h ;| 0800EA1E (T) add r3,r0,r7 ;| 0800EA20 (T) ldrh r1,[r3] ;| 0800EA22 (T) mov r0,1h ;} If EnemySlot[r5]Orientation hasn't 01: next slot 0800EA24 (T) and r0,r1 ;| 0800EA26 (T) mov r6,r2 ;| 0800EA28 (T) cmp r0,0h ;| 0800EA2A (T) beq 800EAA0h ;/ 0800EA2C (T) ldr r4,=EnemyOrientation ;\ 0800EA2E (T) mov r0,r4 ;| 0800EA30 (T) mov r1,r3 ;} Copy EnemySlot[r5] to enemy processing slot 0800EA32 (T) mov r2,38h ;| 0800EA34 (T) bl 8-bitCopy ;/ 0800EA38 (T) mov r0,r5 ; r0 parameter = enemy slot index 0800EA3A (T) bl 800E7A8h ; Enemy random number 0800EA3E (T) mov r0,r4 ;\ 0800EA40 (T) add r0,24h ;| 0800EA42 (T) ldrb r0,[r0] ;} If EnemySlot[r5]Pose == 0: 0800EA44 (T) cmp r0,0h ;| 0800EA46 (T) bne 800EA82h ;/ 0800EA48 (T) mov r0,r4 ;\ 0800EA4A (T) add r0,34h ;| 0800EA4C (T) ldrb r1,[r0] ;| 0800EA4E (T) mov r0,80h ;} If EnemyCollisionProperties has 80h: 0800EA50 (T) and r0,r1 ;| 0800EA52 (T) cmp r0,0h ;| 0800EA54 (T) beq 800EA74h ;/ 0800EA56 (T) ldr r0,=879ABD0h ;\ 0800EA58 (T) ldrb r1,[r4,1Dh] ;| 0800EA5A (T) lsl r1,r1,2h ;| 0800EA5C (T) add r1,r1,r0 ;} Execute special enemy AI 0800EA5E (T) ldr r0,[r1] ;| 0800EA60 (T) bl bx_r0 ;/ 0800EA64 (T) b 800EA82h 0800EA66 dw 00000h 0800EA68 dd 003000140h,0030006BCh,00879ABD0h 0800EA74 (T) ldr r0,=879A29Ch ;\ Else (EnemyCollisionProperties hasn't 80h): 0800EA76 (T) ldrb r1,[r4,1Dh] ;| 0800EA78 (T) lsl r1,r1,2h ;| 0800EA7A (T) add r1,r1,r0 ;} Execute enemy AI 0800EA7C (T) ldr r0,[r1] ;| 0800EA7E (T) bl bx_r0 ;/ 0800EA82 (T) ldr r4,=EnemyOrientation ;\ 0800EA84 (T) ldrh r1,[r4] ;| 0800EA86 (T) mov r0,1h ;| 0800EA88 (T) and r0,r1 ;} If EnemyOrientation has 01: 0800EA8A (T) cmp r0,0h ;| 0800EA8C (T) beq 800EA92h ;/ 0800EA8E (T) bl 800F568h ; Execute subroutine 800F568 (Probably to do with enemy being on screen) 0800EA92 (T) sub r0,r6,r5 ;\ 0800EA94 (T) lsl r0,r0,3h ;| 0800EA96 (T) add r0,r0,r7 ;| 0800EA98 (T) mov r1,r4 ;} Copy enemy processing slot to EnemySlot[r5] 0800EA9A (T) mov r2,38h ;| 0800EA9C (T) bl 8-bitCopy ;/ 0800EAA0 (T) add r0,r5,1 ; Next slot 0800EAA2 (T) lsl r0,r0,18h 0800EAA4 (T) lsr r5,r0,18h 0800EAA6 (T) cmp r5,17h ;\ 0800EAA8 (T) bls 800EA18h ;} Loop until r5 == 18h 0800EAAA (T) pop r3 0800EAAC (T) mov r8,r3 0800EAAE (T) pop r4-r7 0800EAB0 (T) pop r0 0800EAB2 (T) bx r0 0800EAB4 dd 00879A29Ch,0030006BCh