[0879B8BC + AreaID*4] + RoomID*3C List of pointers at 0879B8BC: 00 Main Deck 083C2C4C, 87 rooms 01 SRX 083C40B0, 54 rooms 02 TRO 083C4D58, 61 rooms 03 PYR 083C5BA4, 39 rooms 04 AQA 083C70F8, 48 rooms 05 ARC 083C64C8, 52 rooms 06 NOC 083C7C38, 41 rooms 07 Debug1 083C85D4, 4 rooms 08 Debug2 083C86C4, 4 rooms 09 Debug3 083C87B4, 4 rooms These point to all the room headers in the area, each entry is 3C bytes 00: Tileset 01: Foreground properties ; 0x00: None, 0x10: RLE foreground, 0x40: LZ77 foreground 02: Level properties ; RLE 03: Back-level properties ; 0x00: None, 0x10: RLE 04: Background properties ; LZ77 08: Pointer to foreground 0C: Pointer to level 10: Pointer to back-level 14: Pointer to clipdata 18: Pointer to background 1C: Bg3 Scrolling 1D: Transparency 20: Default pointer to room's enemy data 24: Default spriteset 25: First spriteset change event 28: First pointer to room's enemy data 2C: First spriteset 2D: Second spriteset change event 30: Second spriteset pointer 34: Second pointer to room's enemy data 35: Map X coordinate 36: Map Y coordinate 37: Effect 38: Effect Y position 3A: Music track 083BF888 + Tileset*14h Each entry is 14h bytes 00: Level tiles 04: Palette 08: Background tiles 0C: Tile parts 10: Animated tileset-set index 11: Extra palette 08064820 (T) push r4,r5,r14 08064822 (T) add sp,-3Ch ; Allocate space on the stack for the header 08064824 (T) ldr r0,=Sub-GameModeB84 ;\ 08064826 (T) ldrb r0,[r0] ;| 08064828 (T) lsl r0,r0,18h ;| 0806482A (T) asr r0,r0,18h ;} Return if Sub-game mode B84 != 0 0806482C (T) cmp r0,0h ;| 0806482E (T) beq 8064832h ;| 08064830 (T) b 8064966h ;/ 08064832 (T) ldr r1,=879B8BCh ;\ 08064834 (T) ldr r0,=AreaID ;| 08064836 (T) ldrb r0,[r0] ;} Load area's pointer to headers 08064838 (T) lsl r0,r0,2h ;| 0806483A (T) add r0,r0,r1 ;/ 0806483C (T) ldr r1,=RoomID ;\ 0806483E (T) ldrb r2,[r1] ;| 08064840 (T) ldr r0,[r0] ;| 08064842 (T) lsl r1,r2,4h ;} Get room's pointer to header 08064844 (T) sub r1,r1,r2 ;| 08064846 (T) lsl r1,r1,2h ;| 08064848 (T) add r1,r1,r0 ;/ 0806484A (T) mov r0,r13 ;\ 0806484C (T) mov r2,3Ch ;} Copy room header to stack 0806484E (T) bl 8-bitCopy ;/ 08064852 (T) ldr r1,=Tileset ;\ 08064854 (T) mov r0,r13 ;| 08064856 (T) ldrb r0,[r0] ;} Tileset = byte00 08064858 (T) strb r0,[r1] ;/ 0806485A (T) mov r0,r13 ;\ 0806485C (T) ldrb r0,[r0,1h] ;} Foreground properties = byte01 0806485E (T) strb r0,[r1,1h] ;/ 08064860 (T) mov r0,r13 ;\ 08064862 (T) ldrb r0,[r0,2h] ;} Level properties = byte02 08064864 (T) strb r0,[r1,2h] ;/ 08064866 (T) mov r0,r13 ;\ 08064868 (T) ldrb r0,[r0,3h] ;} Back-level properties = byte03 0806486A (T) strb r0,[r1,3h] ;/ 0806486C (T) mov r0,r13 ;\ 0806486E (T) ldrb r0,[r0,4h] ;} Background properties = byte04 08064870 (T) strb r0,[r1,4h] ;/ 08064872 (T) mov r0,r13 ;\ 08064874 (T) ldrb r0,[r0,1Ch] ;} BG3 scrolling = byte1C 08064876 (T) strb r0,[r1,6h] ;/ 08064878 (T) mov r0,r13 ;\ 0806487A (T) ldrb r0,[r0,1Dh] ;} Transparency level = byte1D 0806487C (T) strb r0,[r1,7h] ;/ 0806487E (T) mov r0,r13 ;\ 08064880 (T) add r0,35h ;| 08064882 (T) ldrb r0,[r0] ;} Map X coordinate = byte35 08064884 (T) strb r0,[r1,0Eh] ;/ 08064886 (T) mov r0,r13 ;\ 08064888 (T) add r0,36h ;| 0806488A (T) ldrb r0,[r0] ;} Map Y coordinate = byte36 0806488C (T) strb r0,[r1,0Fh] ;/ 0806488E (T) mov r0,r13 ;\ 08064890 (T) add r0,37h ;| 08064892 (T) ldrb r0,[r0] ;} Effect = byte37 08064894 (T) strb r0,[r1,10h] ;/ 08064896 (T) mov r0,r13 ;\ 08064898 (T) ldrh r0,[r0,3Ah] ;} Music track = halfword3A 0806489A (T) strh r0,[r1,16h] ;/ 0806489C (T) add r2,sp,38h ;\ 0806489E (T) ldrb r0,[r2] ;| 080648A0 (T) cmp r0,0FFh ;} If byte38 != FF 080648A2 (T) beq 80648BCh ;/ 080648A4 (T) lsl r2,r0,6h ;\ 080648A6 (T) b 80648C0h ;} Effect Y Position = byte38 * 0x40 080648A8 dd 003000B84h,00879B8BCh,00300002Ch,00300002Dh 080648B8 dd 0030000A4h 080648BC (T) ldr r0,=0FFFFh ;\ 080648BE (T) mov r2,r0 ;| 080648C0 (T) mov r0,0h ;} Else: Effect Y Position = FFFF 080648C2 (T) strh r2,[r1,12h] ;/ 080648C4 (T) ldr r4,=3000054h ;\ 080648C6 (T) strb r0,[r4] ;} Used spriteset entry = 0 080648C8 (T) ldr r1,=Tileset ;\ 080648CA (T) mov r0,r13 ;| 080648CC (T) add r0,25h ;} First event spriteset change = byte25 080648CE (T) ldrb r0,[r0] ;| 080648D0 (T) strb r0,[r1,0Ch] ;/ 080648D2 (T) mov r0,r13 ;\ 080648D4 (T) add r0,2Dh ;| 080648D6 (T) ldrb r0,[r0] ;} Second event spriteset change = byte2D 080648D8 (T) strb r0,[r1,0Dh] ;/ 080648DA (T) ldr r2,=EventCounter ;\ 080648DC (T) ldrb r3,[r2] ;| 080648DE (T) lsl r0,r0,18h ;| 080648E0 (T) lsr r0,r0,18h ;| 080648E2 (T) mov r5,r1 ;} If byte2D >= Event counter && != 0: 080648E4 (T) cmp r3,r0 ;| 080648E6 (T) bcc 8064914h ;| 080648E8 (T) cmp r0,0h ;| 080648EA (T) beq 8064914h ;/ 080648EC (T) ldr r0,[sp,30h] ;\ 080648EE (T) str r0,[r5,8h] ;} Default enemy data pointer = word30 080648F0 (T) ldr r1,=3000052h ;\ 080648F2 (T) add r0,sp,34h ;| 080648F4 (T) ldrb r0,[r0] ;} Second enemy data pointer = byte34 080648F6 (T) strb r0,[r1] ;/ 080648F8 (T) mov r0,2h ;\ 080648FA (T) strb r0,[r4] ;} Used spriteset entry = 2 080648FC (T) b 8064944h ; 080648FE dw 00000h ; 08064900 dd 00000FFFFh,003000054h,0030000A4h,003000B87h 08064910 dd 003000052h 08064914 (T) ldrb r0,[r2] ;\ 08064916 (T) ldrb r1,[r5,0Ch] ;| 08064918 (T) cmp r0,r1 ;| 0806491A (T) bcc 8064938h ;} Elseif First spriteset event >= Event counter && != 0: 0806491C (T) cmp r1,0h ;| 0806491E (T) beq 8064938h ;/ 08064920 (T) ldr r0,[sp,28h] ;\ 08064922 (T) str r0,[r5,8h] ;} Enemy data pointer = word28 08064924 (T) ldr r1,=3000052h ;\ 08064926 (T) add r0,sp,2Ch ;| 08064928 (T) ldrb r0,[r0] ;} First spriteset = byte2C 0806492A (T) strb r0,[r1] ;/ 0806492C (T) mov r0,1h ;\ 0806492E (T) strb r0,[r4] ;} Used spriteset entry = 1 08064930 (T) b 8064944h ;/ 08064932 dw 00000h 08064934 dd 003000052h 08064938 (T) ldr r0,[sp,20h] ;\ Else: 0806493A (T) str r0,[r5,8h] ;} Enemy data pointer = word20 0806493C (T) ldr r1,=3000052h ;\ 0806493E (T) add r0,sp,24h ;| 08064940 (T) ldrb r0,[r0] ;} Spriteset = byte24 08064942 (T) strb r0,[r1] ;/ 08064944 (T) mov r0,0h ; 08064946 (T) mov r1,2h ;\ 08064948 (T) strb r1,[r5,5h] ;} 030000A9 = 2 0806494A (T) strb r0,[r5,14h] ; 030000B8 = 0 0806494C (T) strb r0,[r5,18h] ; 030000BC = 0 0806494E (T) strb r0,[r5,19h] ; 030000BD = 0 08064950 (T) ldrb r0,[r4] ;\ 08064952 (T) cmp r0,0h ;| 08064954 (T) beq 8064966h ;| 08064956 (T) ldrb r0,[r5,1h] ;} If Spriteset entry used != 0 && Foreground properties == 0x44: (SA-X rooms) 08064958 (T) cmp r0,44h ;| 0806495A (T) bne 8064966h ;/ 0806495C (T) ldr r1,=30000DCh ;\ 0806495E (T) mov r0,80h ;| 08064960 (T) lsl r0,r0,8h ;} 030000DC = 0x8000 08064962 (T) strh r0,[r1] ;/ 08064964 (T) strh r0,[r1,2h] ; 030000DE = 0x8000 08064966 (T) add sp,3Ch ; Deallocate space on the stack used for the header 08064968 (T) pop r4,r5 0806496A (T) pop r0 0806496C (T) bx r0 0806496E dw 00000h 08064970 dd 003000052h,0030000DCh 08064978 (T) push r4,r5,r14 0806497A (T) add sp,-3Ch ; Allocate space on the stack for the header 0806497C (T) ldr r1,=879B8BCh ;\ 0806497E (T) ldr r4,=AreaID ;| 08064980 (T) ldrb r0,[r4] ;} Load area's pointer to headers 08064982 (T) lsl r0,r0,2h ;| 08064984 (T) add r0,r0,r1 ;/ 08064986 (T) ldr r5,=RoomID ;\ 08064988 (T) ldrb r2,[r5] ;| 0806498A (T) ldr r0,[r0] ;| 0806498C (T) lsl r1,r2,4h ;} Get room's pointer to header 0806498E (T) sub r1,r1,r2 ;| 08064990 (T) lsl r1,r1,2h ;| 08064992 (T) add r1,r1,r0 ;/ 08064994 (T) mov r0,r13 ;\ 08064996 (T) mov r2,3Ch ;} Copy room header to stack 08064998 (T) bl 8-bitCopy ;/ 0806499C (T) ldr r0,=EventCounter ;\ 0806499E (T) ldrb r0,[r0] ;| 080649A0 (T) sub r0,3Ah ;| 080649A2 (T) lsl r0,r0,18h ;| 080649A4 (T) lsr r0,r0,18h ;| 080649A6 (T) cmp r0,2h ;| 080649A8 (T) bhi 80649CAh ;| 080649AA (T) ldrb r0,[r4] ;| 080649AC (T) cmp r0,0h ;} If during meltdown && in elevator station: 080649AE (T) bne 80649CAh ;| 080649B0 (T) ldrb r0,[r5] ;| 080649B2 (T) sub r0,18h ;| 080649B4 (T) lsl r0,r0,18h ;| 080649B6 (T) lsr r0,r0,18h ;| 080649B8 (T) cmp r0,6h ;| 080649BA (T) bhi 80649CAh ;/ 080649BC (T) ldr r1,=Tileset ;\ 080649BE (T) mov r0,40h ;} Foreground properties = 0x40 080649C0 (T) strb r0,[r1,1h] ;/ 080649C2 (T) ldr r0,=8412530h ;\ 080649C4 (T) str r0,[sp,8h] ;} Pointer to foreground = 0x08412530 080649C6 (T) mov r0,24h ;\ 080649C8 (T) strb r0,[r1,7h] ;} Transparency level = 0x24 080649CA (T) ldr r4,=Tileset ;\ 080649CC (T) ldrb r1,[r4,1h] ;| 080649CE (T) mov r5,40h ;| 080649D0 (T) mov r0,r5 ;} If Foreground properties has 0x40: 080649D2 (T) and r0,r1 ;| 080649D4 (T) cmp r0,0h ;| 080649D6 (T) beq 80649DEh ;/ 080649D8 (T) ldr r0,[sp,8h] ;\ 080649DA (T) ldrb r0,[r0] ;} Foreground size = [word8] 080649DC (T) strb r0,[r4,18h] ;/ 080649DE (T) ldr r1,[sp,18h] ;\ 080649E0 (T) ldrb r0,[r1] ;} Background size = [word18] 080649E2 (T) strb r0,[r4,19h] ;/ 080649E4 (T) add r3,r1,4 ;\ 080649E6 (T) ldr r1,=2032000h ;| 080649E8 (T) mov r0,r3 ;} Decompress background 080649EA (T) bl ExecuteLZ77UnCompVram ;/ 080649EE (T) ldrb r1,[r4,1h] ;\ 080649F0 (T) mov r0,10h ;| 080649F2 (T) and r0,r1 ;} If Foreground properties has 0x10: 080649F4 (T) cmp r0,0h ;| 080649F6 (T) beq 8064A3Ch ;/ 080649F8 (T) ldr r3,[sp,8h] ; 080649FA (T) ldr r1,=DecompForegroundPtr ;\ 080649FC (T) ldr r2,=2029000h ;} Set pointer for decompressed foreground 080649FE (T) str r2,[r1] ;/ 08064A00 (T) ldrb r0,[r3] ;\ 08064A02 (T) strh r0,[r1,4h] ;} Set foreground width 08064A04 (T) add r3,1h ;\ 08064A06 (T) ldrb r0,[r3] ;} Set foreground height 08064A08 (T) strh r0,[r1,6h] ;/ 08064A0A (T) add r3,1h ; 08064A0C (T) mov r0,1h ; r0 parameter = 1 08064A0E (T) mov r1,r3 ; r1 parameter = pointer to foreground 08064A10 (T) bl 80658A4h ; Decompress foreground by RLE 08064A14 (T) b 8064A52h 08064A16 dw 00000h 08064A18 dd 00879B8BCh,00300002Ch,00300002Dh,003000B87h 08064A28 dd 0030000A4h,008412530h,002032000h,003000084h 08064A38 dd 002029000h 08064A3C (T) mov r0,r5 ;\ 08064A3E (T) and r0,r1 ;| 08064A40 (T) cmp r0,0h ;} Elseif Foreground properties has 0x40: 08064A42 (T) beq 8064A52h ;/ 08064A44 (T) ldr r0,[sp,8h] ; 08064A46 (T) add r3,r0,4 ; 08064A48 (T) mov r1,0C0h ;\ 08064A4A (T) lsl r1,r1,13h ;} r1 parameter = 0x06000000 08064A4C (T) mov r0,r3 ; r0 parameter = pointer to foreground 08064A4E (T) bl ExecuteLZ77UnCompVram ; Decompress foreground 08064A52 (T) ldr r0,=Sub-GameModeB84 ;\ 08064A54 (T) ldrb r0,[r0] ;| 08064A56 (T) lsl r0,r0,18h ;| 08064A58 (T) asr r0,r0,18h ;} Return if Sub-game mode B84 != 0 08064A5A (T) cmp r0,0h ;| 08064A5C (T) bne 8064ABAh ;/ 08064A5E (T) ldr r3,[sp,14h] ; 08064A60 (T) ldr r4,=DecompForegroundPtr ; 08064A62 (T) ldr r2,=2026000h ;\ 08064A64 (T) str r2,[r4,18h] ;} Set clipdata pointer 08064A66 (T) ldrb r0,[r3] ;\ 08064A68 (T) strh r0,[r4,1Ch] ;} Set clipdata width 08064A6A (T) add r3,1h ;\ 08064A6C (T) ldrb r0,[r3] ;} Set clipdata height 08064A6E (T) strh r0,[r4,1Eh] ;/ 08064A70 (T) add r3,1h ; 08064A72 (T) mov r0,1h ; r0 parameter = 1 08064A74 (T) mov r1,r3 ; r1 parameter = pointer to clipdata 08064A76 (T) bl 80658A4h ; Decompress clipdata by RLE 08064A7A (T) ldr r3,[sp,0Ch] ; 08064A7C (T) ldr r2,=202C000h ;\ 08064A7E (T) str r2,[r4,8h] ;} Set level pointer 08064A80 (T) ldrb r0,[r3] ;\ 08064A82 (T) strh r0,[r4,0Ch] ;} Set level width 08064A84 (T) add r3,1h ;\ 08064A86 (T) ldrb r0,[r3] ;} Set level height 08064A88 (T) strh r0,[r4,0Eh] ;/ 08064A8A (T) add r3,1h ; 08064A8C (T) mov r0,1h ; r0 parameter = 1 08064A8E (T) mov r1,r3 ; r1 parameter = pointer to level 08064A90 (T) bl 80658A4h ; Decompress level by RLE 08064A94 (T) ldr r0,=Tileset ;\ 08064A96 (T) ldrb r1,[r0,3h] ;| 08064A98 (T) mov r0,10h ;| 08064A9A (T) and r0,r1 ;} Return if Back-level properties hasn't 0x10 08064A9C (T) cmp r0,0h ;| 08064A9E (T) beq 8064ABAh ;/ 08064AA0 (T) ldr r3,[sp,10h] ; 08064AA2 (T) ldr r2,=202F000h ;\ 08064AA4 (T) str r2,[r4,10h] ;} Set back-level pointer 08064AA6 (T) ldrb r0,[r3] ;\ 08064AA8 (T) strh r0,[r4,14h] ;} Set back-level width 08064AAA (T) add r3,1h ;\ 08064AAC (T) ldrb r0,[r3] ;} Set back-level height 08064AAE (T) strh r0,[r4,16h] ;/ 08064AB0 (T) add r3,1h ; 08064AB2 (T) mov r0,1h ; r0 parameter = 1 08064AB4 (T) mov r1,r3 ; r1 parameter = pointer to back-level 08064AB6 (T) bl 80658A4h ; Decompress back-level by RLE 08064ABA (T) add sp,3Ch ; Deallocate space on the stack used for the header 08064ABC (T) pop r4,r5 08064ABE (T) pop r0 08064AC0 (T) bx r0 08064AC2 dw 00000h 08064AC4 dd 003000B84h,003000084h,002026000h,00202C000h 08064AD4 dd 0030000A4h,00202F000h 0800F76C (T) push r4-r7,r14 0800F76E (T) mov r7,r10 0800F770 (T) mov r6,r9 0800F772 (T) mov r5,r8 0800F774 (T) push r5-r7 0800F776 (T) ldr r2,=40000D4h ;\ 0800F778 (T) ldr r4,=879A5D8h ;| 0800F77A (T) ldr r0,[r4] ;| 0800F77C (T) str r0,[r2] ;| 0800F77E (T) ldr r0,=6017800h ;| 0800F780 (T) str r0,[r2,4h] ;| 0800F782 (T) ldr r3,=82E4A50h ;} DMA 0x400 bytes from 082E6384 -> 06017800 0800F784 (T) ldr r0,[r3] ;| 0800F786 (T) lsr r0,r0,1h ;| 0800F788 (T) mov r1,80h ;| 0800F78A (T) lsl r1,r1,18h ;| 0800F78C (T) orr r0,r1 ;| 0800F78E (T) str r0,[r2,8h] ;/ 0800F790 (T) ldr r0,[r2,8h ;\ 0800F792 (T) ldr r1,=879A8D4h ;| 0800F794 (T) ldr r0,[r1] ;| 0800F796 (T) str r0,[r2] ;| 0800F798 (T) ldr r0,=50003E0h ;} DMA 0x20 bytes from 082E6B84 -> 050003E0 0800F79A (T) str r0,[r2,4h] ;| 0800F79C (T) ldr r0,=80000010h ;| 0800F79E (T) str r0,[r2,8h] ;/ 0800F7A0 (T) ldr r0,[r2,8h] 0800F7A2 (T) mov r6,0h 0800F7A4 (T) ldr r0,=300068Fh 0800F7A6 (T) mov r10,r0 0800F7A8 (T) ldr r7,=3000052h 0800F7AA (T) ldr r4,=879ADD8h 0800F7AC (T) ldr r3,=3000680h 0800F7AE (T) mov r5,0h 0800F7B0 (T) mov r2,10h 0800F7B2 (T) mov r1,r10 0800F7B4 (T) add r0,r6,r3 ;\ 0800F7B6 (T) strb r2,[r0] ;} Fill Spriteset Enemy IDs with 0x10 0800F7B8 (T) add r0,r6,r1 ;\ 0800F7BA (T) strb r5,[r0] ;} Fill Spriteset Enemy GFX slots with 0x00 0800F7BC (T) add r6,1h 0800F7BE (T) cmp r6,0Eh 0800F7C0 (T) ble 800F7B4h 0800F7C2 (T) mov r1,0FFh 0800F7C4 (T) mov r8,r1 0800F7C6 (T) ldrb r1,[r7] ;\ 0800F7C8 (T) cmp r1,80h ;| 0800F7CA (T) ble 800F7D8h ;| 0800F7CC (T) ldr r0,=AreaID ;| 0800F7CE (T) ldrb r0,[r0] ;} If [03000052] <= 0x80 && Area < 6, r1 = 0x81 0800F7D0 (T) mov r1,0h ;| 0800F7D2 (T) cmp r0,6h ;| 0800F7D4 (T) bls 800F7D8h ;| 0800F7D6 (T) mov r1,81h ;/ 0800F7D8 (T) mov r6,0h 0800F7DA (T) lsl r0,r1,2h ;\ 0800F7DC (T) add r1,r0,r4 ;| 0800F7DE (T) ldr r0,[r1] ;} r3 = [[[03000052]<<2 + 0879ADD8]] 0800F7E0 (T) ldrb r3,[r0] ;} r4 = [[[03000052]<<2 + 0879ADD8] + 1] 0800F7E2 (T) ldrb r4,[r0,1h] ;/ 0800F7E4 (T) mov r7,1h 0800F7E6 (T) cmp r3,0h ;\ 0800F7E8 (T) beq 800F866h ;} Return if r3 == 0 0800F7EA (T) ldr r5,=40000D4h 0800F7EC (T) mov r2,80h 0800F7EE (T) lsl r2,r2,18h 0800F7F0 (T) mov r12,r2 0800F7F2 (T) mov r9,r1 0800F7F4 (T) ldr r1,=3000680h ;\ 0800F7F6 (T) add r0,r6,r1 ;} Spriteset Enemy ID = r3 0800F7F8 (T) strb r3,[r0] ;/ 0800F7FA (T) mov r0,r10 ;\ 0800F7FC (T) add r2,r6,r0 ;| 0800F7FE (T) mov r1,7h ;| 0800F800 (T) mov r0,r4 ;} Spriteset Enemy GFX Slot = r4 & 0x07 0800F802 (T) and r0,r1 ;| 0800F804 (T) strb r0,[r2] ;/ 0800F806 (T) cmp r4,r8 ;\ 0800F808 (T) beq 800F84Eh ;| 0800F80A (T) mov r8,r4 ;} If r4 != previous r4 && r4 != 0x08 0800F80C (T) cmp r4,8h ;| 0800F80E (T) beq 800F84Eh ;/ 0800F810 (T) sub r3,10h ;\ 0800F812 (T) lsl r2,r3,2h ;} r2 = r3-0x10 << 2 0800F814 (T) ldr r1,=879A5D8h ;\ 0800F816 (T) add r0,r2,r1 ;| 0800F818 (T) ldr r0,[r0] ;| 0800F81A (T) str r0,[r5] ;| 0800F81C (T) lsl r0,r4,0Bh ;| 0800F81E (T) ldr r3,=6014000h ;| 0800F820 (T) add r0,r0,r3 ;| 0800F822 (T) str r0,[r5,4h] ;} DMA [082E4A50 + r2] bytes from [0879A5D8 + r2] -> 06014000 + r4<<0x0B 0800F824 (T) ldr r1,=82E4A50h ;| 0800F826 (T) add r0,r2,r1 ;| 0800F828 (T) ldr r1,[r0] ;| 0800F82A (T) lsr r0,r1,1h ;| 0800F82C (T) mov r3,r12 ;| 0800F82E (T) orr r0,r3 ;| 0800F830 (T) str r0,[r5,8h] ;/ 0800F832 (T) ldr r0,[r5,8h] 0800F834 (T) ldr r0,=879A8D4h ;\ 0800F836 (T) add r2,r2,r0 ;| 0800F838 (T) ldr r0,[r2] ;| 0800F83A (T) str r0,[r5] ;| 0800F83C (T) lsl r0,r4,5h ;| 0800F83E (T) ldr r2,=5000300h ;| 0800F840 (T) add r0,r0,r2 ;} DMA r4&0x30 * 2 bytes from [0879A8D4 + r2] -> 05000300 + r4<<5 0800F842 (T) str r0,[r5,4h] ;| 0800F844 (T) lsr r1,r1,0Bh ;| 0800F846 (T) lsl r1,r1,4h ;| 0800F848 (T) orr r1,r3 ;| 0800F84A (T) str r1,[r5,8h] ;/ 0800F84C (T) ldr r0,[r5,8h] 0800F84E (T) add r6,1h ;\ 0800F850 (T) cmp r6,0Eh ;} If all 0x0E slots processed, return 0800F852 (T) bgt 800F866h ;/ 0800F854 (T) mov r3,r9 ;\ 0800F856 (T) ldr r1,[r3] ;| 0800F858 (T) lsl r0,r7,1h ;| 0800F85A (T) add r0,r0,r1 ;} Load next spriteset entry to r3 and r4 0800F85C (T) ldrb r3,[r0] ;| 0800F85E (T) ldrb r4,[r0,1h] ;| 0800F860 (T) add r7,1h ;/ 0800F862 (T) cmp r3,0h ;\ 0800F864 (T) bne 800F7F4h ;} If r3 != 0, process entry 0800F866 (T) pop r3-r5 0800F868 (T) mov r8,r3 0800F86A (T) mov r9,r4 0800F86C (T) mov r10,r5 0800F86E (T) pop r4-r7 0800F870 (T) pop r0 0800F872 (T) bx r0 0800F874 dd 0040000D4h,00879A5D8h,006017800h,0082E4A50h 0800F884 dd 00879A8D4h,0050003E0h,080000010h,00300068Fh 0800F894 dd 003000052h,00879ADD8h,003000680h,00300002Ch 0800F8A4 dd 006014000h,005000300h 0800F96C (T) push r4,r5,r14 0800F96E (T) mov r4,0h 0800F970 (T) ldr r1,=Tileset ;\ 0800F972 (T) ldr r0,[r1,8h] ;| 0800F974 (T) ldrb r3,[r0] ;} If Spriteset data byte0 == 0xFF, return 0800F976 (T) cmp r3,0FFh ;| 0800F978 (T) beq 800F9A8h ;/ 0800F97A (T) mov r5,r1 0800F97C (T) ldr r1,[r5,8h] ;\ 0800F97E (T) lsl r0,r4,1h ;| 0800F980 (T) add r0,r0,r4 ;} r2 parameter = Spriteset data byte1 0800F982 (T) add r0,r0,r1 ;| 0800F984 (T) ldrb r2,[r0,1h] ;/ 0800F986 (T) ldrb r0,[r0,2h] ; r0 parameter = Spriteset data byte2 0800F988 (T) mov r1,r3 ; r1 parameter = Spriteset data byte0 0800F98A (T) mov r3,r4 ; r3 parameter = Spriteset data entry 0800F98C (T) bl 800F9B4h ; 800F9B4 subroutine 0800F990 (T) add r0,r4,1 ;\ 0800F992 (T) lsl r0,r0,18h ;} Next Spriteset data entry 0800F994 (T) lsr r4,r0,18h ;/ 0800F996 (T) cmp r4,17h ;\ 0800F998 (T) bhi 800F9A8h ;} If > 0x17, return 0800F99A (T) ldr r1,[r5,8h] ;\ 0800F99C (T) lsl r0,r4,1h ;| 0800F99E (T) add r0,r0,r4 ;| 0800F9A0 (T) add r0,r0,r1 ;} If Spriteset data byte0 != 0xFF, process next entry 0800F9A2 (T) ldrb r3,[r0] ;| 0800F9A4 (T) cmp r3,0FFh ;| 0800F9A6 (T) bne 800F97Ch ;/ 0800F9A8 (T) pop r4,r5 0800F9AA (T) pop r0 0800F9AC (T) bx r0 0800F9AE dw 00000h 0800F9B0 dd 0030000A4h 0800F9B4 (T) push r4-r7,r14 0800F9B6 (T) mov r7,r10 0800F9B8 (T) mov r6,r9 0800F9BA (T) mov r5,r8 0800F9BC (T) push r5-r7 0800F9BE (T) add sp,-0Ch ; Allocate space on the stack for 3 of the parameters 0800F9C0 (T) lsl r0,r0,18h 0800F9C2 (T) lsr r4,r0,18h 0800F9C4 (T) lsl r1,r1,10h 0800F9C6 (T) lsr r1,r1,10h 0800F9C8 (T) str r1,[sp] 0800F9CA (T) lsl r2,r2,10h 0800F9CC (T) lsr r2,r2,10h 0800F9CE (T) str r2,[sp,4h] 0800F9D0 (T) lsl r3,r3,18h 0800F9D2 (T) lsr r3,r3,18h 0800F9D4 (T) str r3,[sp,8h] 0800F9D6 (T) mov r5,0h 0800F9D8 (T) ldr r0,=EnemySlot0 0800F9DA (T) mov r12,r0 0800F9DC (T) mov r1,1h ;\ 0800F9DE (T) mov r8,r1 ;} Dedicated 1 0800F9E0 (T) mov r7,0h 0800F9E2 (T) mov r0,0h 0800F9E4 (T) mov r9,r0 0800F9E6 (T) ldr r1,=2001h 0800F9E8 (T) mov r10,r1 0800F9EA (T) lsl r2,r5,3h ;\ 0800F9EC (T) sub r0,r2,r5 ;| 0800F9EE (T) lsl r0,r0,3h ;| 0800F9F0 (T) mov r1,r12 ;| 0800F9F2 (T) add r3,r0,r1 ;| 0800F9F4 (T) ldrh r1,[r3] ;} If EnemyOrientation has 0x0001, process next enemy slot 0800F9F6 (T) mov r0,r8 ;| 0800F9F8 (T) and r0,r1 ;| 0800F9FA (T) mov r6,r2 ;| 0800F9FC (T) cmp r0,0h ;| 0800F9FE (T) bne 800FAC4h ;/ 0800FA00 (T) mov r0,80h ;\ 0800FA02 (T) and r0,r4 ;| 0800FA04 (T) cmp r0,0h ;} If r0 parameter has 0x80: 0800FA06 (T) beq 800FA18h ;/ 0800FA08 (T) mov r0,r10 ;\ 0800FA0A (T) strh r0,[r3] ;} EnemyOrientation = 0x2001 0800FA0C (T) b 800FA1Ch ;/ 0800FA0E dw 00000h 0800FA10 dd 003000140h,000002001h 0800FA18 (T) mov r1,r8 ;\ 0800FA1A (T) strh r1,[r3] ;} Else, EnemyOrientation = 0x0001 0800FA1C (T) mov r0,7Fh ;\ 0800FA1E (T) and r4,r0 ;} r0 parameter &= 0x7F 0800FA20 (T) sub r0,r6,r5 ;\ 0800FA22 (T) lsl r0,r0,3h ;| 0800FA24 (T) mov r1,r12 ;| 0800FA26 (T) add r2,r0,r1 ;| 0800FA28 (T) mov r0,r2 ;} EnemyByte2A = r0 parameter 0800FA2A (T) add r0,2Ah ;| 0800FA2C (T) mov r1,0h ;| 0800FA2E (T) strb r4,[r0] ;/ 0800FA30 (T) cmp r4,10h ;\ 0800FA32 (T) bls 800FA58h ;} If r0 parameter > 0x10: ; r0 parameter =- 1 0800FA34 (T) sub r1,r4,1 0800FA36 (T) lsl r1,r1,18h ;\ 0800FA38 (T) mov r0,0F0h ;| 0800FA3A (T) lsl r0,r0,14h ;} r0 parameter = r0 parameter & 0x0F 0800FA3C (T) and r0,r1 ;| 0800FA3E (T) lsr r4,r0,18h ;/ 0800FA40 (T) ldr r1,=300068Fh ;\ 0800FA42 (T) add r0,r4,r1 ;| 0800FA44 (T) ldrb r0,[r0] ;} EnemyByte1F = [r0 parameter + 300068F] 0800FA46 (T) strb r0,[r2,1Fh] ;/ 0800FA48 (T) ldr r1,=3000680h ;\ 0800FA4A (T) add r0,r4,r1 ;| 0800FA4C (T) ldrb r0,[r0] ;} EnemyByte1E = [r0 parameter + 3000680] 0800FA4E (T) b 800FA5Ch ;/ 0800FA50 dd 00300068Fh,003000680h 0800FA58 (T) strb r1,[r2,1Fh] ; Else: EnemyByte1F = 0x00 0800FA5A (T) sub r0,r4,1 0800FA5C (T) strb r0,[r2,1Dh] ; EnemyByte1E = r0 parameter 0800FA5E (T) sub r0,r6,r5 ;\ 0800FA60 (T) lsl r0,r0,3h ;| 0800FA62 (T) add r12,r0 ;| 0800FA64 (T) mov r0,r12 ;} EnemyByte34 = 0x00 0800FA66 (T) add r0,34h ;| 0800FA68 (T) mov r1,r9 ;| 0800FA6A (T) strb r1,[r0] ;/ 0800FA6C (T) ldr r1,[sp] ;\ 0800FA6E (T) lsl r0,r1,6h ;| 0800FA70 (T) add r0,40h ;} Enemy Y position = r1 parameter * 64 + 64 0800FA72 (T) mov r1,r12 ;| 0800FA74 (T) strh r0,[r1,2h] ;/ 0800FA76 (T) ldr r1,[sp,4h] ;\ 0800FA78 (T) lsl r0,r1,6h ;| 0800FA7A (T) add r0,20h ;} Enemy X position = r2 parameter * 64 + 32 0800FA7C (T) mov r1,r12 ;| 0800FA7E (T) strh r0,[r1,4h] ;/ 0800FA80 (T) mov r0,r13 ;\ 0800FA82 (T) ldrb r0,[r0,8h] ;} Enemy spriteset slot = r3 parameter 0800FA84 (T) strb r0,[r1,1Eh] ;/ 0800FA86 (T) add r1,21h ;\ 0800FA88 (T) mov r0,2h ;} EnemyByte21 = 2 0800FA8A (T) strb r0,[r1] ;/ 0800FA8C (T) add r1,1h ;\ 0800FA8E (T) mov r0,4h ;} EnemyByte22 = 4 0800FA90 (T) strb r0,[r1] ;/ 0800FA92 (T) mov r0,r12 ;\ 0800FA94 (T) add r0,24h ;} Enemy pose = 0 0800FA96 (T) strb r7,[r0] ;/ 0800FA98 (T) mov r0,r9 ;\ 0800FA9A (T) mov r1,r12 ;} Enemy health = 0 0800FA9C (T) strh r0,[r1,14h] ;/ 0800FA9E (T) mov r0,r12 ;\ 0800FAA0 (T) add r0,2Ch ;} Enemy invincibility timer = 0 0800FAA2 (T) strb r7,[r0] ;/ 0800FAA4 (T) add r0,1h ;\ 0800FAA6 (T) strb r7,[r0] ;} EnemyByte2D = 0 0800FAA8 (T) sub r0,0Dh ;\ 0800FAAA (T) strb r7,[r0] ;} Enemy Palette = 0 0800FAAC (T) add r0,15h ;\ 0800FAAE (T) strb r7,[r0] ;} EnemyByte35 = 0 0800FAB0 (T) sub r0,0Fh ;\ 0800FAB2 (T) mov r1,r8 ;} EnemyByte26 = 1 0800FAB4 (T) strb r1,[r0] ;/ 0800FAB6 (T) sub r0,3h ;\ 0800FAB8 (T) strb r5,[r0] ;} Enemy slot = enemy slot 0800FABA (T) add r0,0Fh ;\ 0800FABC (T) strb r7,[r0] ;} Enemy freeze timer = 0 0800FABE (T) add r0,4h ;\ 0800FAC0 (T) strb r1,[r0] ;} EnemyByte36 = 1 0800FAC2 (T) b 800FACEh ; Return 0800FAC4 (T) add r0,r5,1 ; Next enemy slot 0800FAC6 (T) lsl r0,r0,18h ;\ 0800FAC8 (T) lsr r5,r0,18h ;| 0800FACA (T) cmp r5,17h ;} Return if > 0x17 0800FACC (T) bls 800F9EAh ;/ 0800FACE (T) add sp,0Ch 0800FAD0 (T) pop r3-r5 0800FAD2 (T) mov r8,r3 0800FAD4 (T) mov r9,r4 0800FAD6 (T) mov r10,r5 0800FAD8 (T) pop r4-r7 0800FADA (T) pop r0 0800FADC (T) bx r0 080646EA (T) push r4-r6,r14 080646EA (T) add sp,-1Ch ; Allocate space on the stack for the header 080646EC (T) ldr r2,=83BF888h ;\ 080646EE (T) ldr r0,=Tileset ;| 080646F0 (T) ldrb r1,[r0] ;| 080646F2 (T) lsl r0,r1,2h ;| 080646F4 (T) add r0,r0,r1 ;} Get room's tileset header pointer 080646F6 (T) lsl r0,r0,2h ;| 080646F8 (T) add r1,sp,4h ;| 080646FA (T) add r0,r0,r2 ;/ 080646FC (T) ldmia [r0]!,r2-r4 ;\ 080646FE (T) stmia [r1]!,r2-r4 ;| 08064700 (T) ldmia [r0]!,r2,r3 ;} Copy tileset header to stack+4 08064702 (T) stmia [r1]!,r2,r3 ;/ 08064704 (T) ldr r1,=3004DDCh ;\ 08064706 (T) ldr r0,[sp,10h] ;| 08064708 (T) add r0,2h ;} Tile parts pointer = word0C + 2 0806470A (T) str r0,[r1] ;/ 0806470C (T) ldr r0,=AreaID ;\ 0806470E (T) ldrb r0,[r0] ;| 08064710 (T) cmp r0,6h ;} If debug area: 08064712 (T) bls 8064734h ;/ 08064714 (T) ldr r0,=83F08E4h ;\ 08064716 (T) str r0,[r1,4h] ;} 03004DE0 = 0x083F08E4 08064718 (T) ldr r0,=83F1348h ;\ 0806471A (T) b 806473Ah ;} 03004DE4 = 0x083F1348 0806471C dd 0083BF888h,0030000A4h,003004DDCh,00300002Ch 0806472C dd 0083F08E4h,0083F1348h 08064734 (T) ldr r0,=83F0834h ;\ Else: 08064736 (T) str r0,[r1,4h] ;} 03004DE0 = 0x083F0834 08064738 (T) ldr r0,=83F11E8h ; 03004DE4 = 0x083F11E8 0806473A (T) str r0,[r1,8h] 0806473C (T) ldr r0,[sp,4h] ;\ 0806473E (T) ldr r1,=6005800h ;| 08064740 (T) bl ExecuteLZ77UnCompVram ;} Decompress word00 to Level tiles @ row 6 08064744 (T) bl WaitForDMA ;/ 08064748 (T) ldr r1,=83F28C8h ;\ 0806474A (T) ldr r2,=6004800h ;| 0806474C (T) mov r3,80h ;| 0806474E (T) lsl r3,r3,5h ;| 08064750 (T) mov r0,10h ;} Load generic level tiles -> row 2..row 6 08064752 (T) str r0,[sp] ;| 08064754 (T) mov r0,3h ;| 08064756 (T) bl CopyDMA ;| 0806475A (T) bl WaitForDMA ;/ 0806475E (T) ldr r4,=40000D4h ;\ 08064760 (T) ldr r0,[sp,8h] ;| 08064762 (T) str r0,[r4] ;| 08064764 (T) ldr r0,=5000040h ;| 08064766 (T) str r0,[r4,4h] ;} Load word04 to palette -> entry 2..end 08064768 (T) ldr r0,=800000E0h ;| 0806476A (T) str r0,[r4,8h] ;| 0806476C (T) ldr r0,[r4,8h] ;| 0806476E (T) bl WaitForDMA ;/ 08064772 (T) ldr r0,=840805Ch ;\ 08064774 (T) str r0,[r4] ;| 08064776 (T) mov r6,0A0h ;| 08064778 (T) lsl r6,r6,13h ;| 0806477A (T) str r6,[r4,4h] ;} Load generic palette -> entry 0..entry 3 0806477C (T) ldr r0,=80000030h ;} (making palette entry 2 completely pointless) 0806477E (T) str r0,[r4,8h] ;| 08064780 (T) ldr r0,[r4,8h] ;| 08064782 (T) bl WaitForDMA ;/ 08064786 (T) ldr r1,=3004E28h ;\ 08064788 (T) ldr r0,[sp,8h] ;| 0806478A (T) ldrh r0,[r0] ;} Tileset transparent colour = colour 0 of word04 0806478C (T) mov r5,0h ;| 0806478E (T) strh r0,[r1] ;/ 08064790 (T) strh r5,[r6] ; Palette entry 0 colour 0 = 0 08064792 (T) strh r5,[r1,2h] ; 03004E2A = 0 08064794 (T) ldr r0,[sp,0Ch] ;\ 08064796 (T) ldrb r2,[r0,2h] ;| 08064798 (T) lsl r2,r2,8h ;| 0806479A (T) ldrb r1,[r0,1h] ;| 0806479C (T) orr r2,r1 ;} Decompress word08 to Background tiles @ tile 0x3EF - decompressed size 0806479E (T) ldr r1,=600FDE0h ;| 080647A0 (T) sub r1,r1,r2 ;| 080647A2 (T) bl ExecuteLZ77UnCompVram ;/ 080647A6 (T) str r5,[sp,18h] ;\ 080647A8 (T) add r0,sp,18h ;| 080647AA (T) str r0,[r4] ;| 080647AC (T) ldr r0,=600FFE0h ;| 080647AE (T) str r0,[r4,4h] ;} Make the last background tile blank 080647B0 (T) ldr r0,=85000008h ;| 080647B2 (T) str r0,[r4,8h] ;| 080647B4 (T) ldr r0,[r4,8h] ;/ 080647B6 (T) ldr r0,=SubGameModeB84 ;\ 080647B8 (T) ldrb r0,[r0] ;| 080647BA (T) lsl r0,r0,18h ;| 080647BC (T) asr r0,r0,18h ;} If 03000B84 == 0: 080647BE (T) cmp r0,0h ;| 080647C0 (T) bne 80647D4h ;/ 080647C2 (T) ldr r2,=Tileset ;\ 080647C4 (T) add r0,sp,4h ;| 080647C6 (T) ldrb r3,[r0,10h] ;} 030000BE = byte10 080647C8 (T) strb r3,[r2,1Ah] ;/ 080647CA (T) ldrb r1,[r0,11h] ;\ 080647CC (T) strb r1,[r2,1Bh] ;} 030000BF = byte11 080647CE (T) ldr r0,=3004FC8h ;\ 080647D0 (T) strb r3,[r0,1h] ;} 03004FC9 = byte10 080647D2 (T) strb r1,[r0] ; 03004FC8 = byte11 080647D4 (T) add sp,1Ch ; Deallocate space on the stack used for the header 080647D6 (T) pop r4-r6 080647D8 (T) pop r0 080647DA (T) bx r0 080647DC dd 0083F0834h,0083F11E8h,006005800h,0083F28C8h 080647EC dd 006004800h,0040000D4h,005000040h,0800000E0h 080647FC dd 00840805Ch,080000030h,003004E28h,00600FDE0h 0806480C dd 00600FFE0h,085000008h,003000B84h,0030000A4h 0806481C dd 003004FC8h ; See below this disassembly 0806998C (T) push r4-r7,r14 0806998E (T) mov r7,r10 08069990 (T) mov r6,r9 08069992 (T) mov r5,r8 08069994 (T) push r5-r7 08069996 (T) ldr r1,=3000028h ;\ 08069998 (T) mov r0,0h ;} 03000028 = 0 0806999A (T) strh r0,[r1] ;/ 0806999C (T) ldr r3,=300531Ch ; r3 = 0x0300531C + i*0Ch 0806999E (T) mov r6,0h ; r6 = i 080699A0 (T) mov r4,0h ; r4 = i*3 080699A2 (T) ldr r7,=83C8F90h ; r7 = 0x083C8F90 (const) 080699A4 (T) ldr r0,=83C8D58h ;\ 080699A6 (T) mov r10,r0 ;} r10 = 0x083C8D58 (const) 080699A8 (T) ldr r2,=3000058h ;\ 080699AA (T) mov r9,r2 ;} r9 = 0x03000058 (const) 080699AC (T) mov r8,r7 ; r8 = 0x083C8F90 (const) 080699AE (T) mov r12,r4 ; r12 = dedicated 0 080699B0 (T) ldr r5,=40000D4h ; r5 = DMA3 base (const) 080699B2 (T) ldr r0,=3004FC8h ;\ 080699B4 (T) ldrb r1,[r0,1h] ;| 080699B6 (T) lsl r0,r1,1h ;} r2 = animated tileset-set index*48 080699B8 (T) add r0,r0,r1 ;| 080699BA (T) lsl r2,r0,4h ;/ 080699BC (T) add r0,r2,1 ;\ 080699BE (T) add r0,r4,r0 ;| 080699C0 (T) add r0,r8 ;} r0 = 0x03000058 + [0x083C8F90+r2 + i*3 + 1] 080699C2 (T) ldrb r0,[r0] ;| 080699C4 (T) add r0,r9 ;/ 080699C6 (T) ldrb r1,[r0] ; r1 = [r0] 080699C8 (T) mov r0,1h ;\ 080699CA (T) and r0,r1 ;| 080699CC (T) cmp r0,0h ;} If r1 & 1: 080699CE (T) beq 80699F4h ;/ 080699D0 (T) add r0,r2,2 ;\ 080699D2 (T) add r0,r4,r0 ;} r0 = r2 + i*3 + 2 080699D4 (T) b 80699F6h 080699D6 dw 00000h 080699D8 dd 003000028h,00300531Ch,0083C8F90h,0083C8D58h 080699E8 dd 003000058h,0040000D4h,003004FC8h 080699F4 (T) add r0,r4,r2 ; Else: r0 = r2 + i*3 080699F6 (T) add r0,r0,r7 ;\ 080699F8 (T) ldrb r0,[r0] ;| 080699FA (T) lsl r1,r0,3h ;} r1 = 0x083C8D58 + [0x083C8F90 + r0]*8 080699FC (T) add r1,r10 ;/ 080699FE (T) ldrb r0,[r1] ;\ 08069A00 (T) strb r0,[r3] ;} r3 = [r1] 08069A02 (T) ldrb r0,[r1,1h] ;\ 08069A04 (T) strb r0,[r3,1h] ;} r3 + 1 = [r1 + 1] 08069A06 (T) ldrb r2,[r1,2h] ; r2 = [r1 + 2] 08069A08 (T) strb r2,[r3,3h] ;} r3 + 3 = [r1 + 2] 08069A0A (T) mov r0,r12 ;\ 08069A0C (T) strb r0,[r3,2h] ;} r3 + 2 = 0 08069A0E (T) strb r0,[r3,4h] ; r3 + 4 = 0 08069A10 (T) ldr r0,[r1,4h] ;\ 08069A12 (T) str r0,[r3,8h] ;} r3 + 8 = [r1 + 4] 08069A14 (T) ldrb r0,[r3] ;\ 08069A16 (T) cmp r0,3h ;| 08069A18 (T) beq 8069A1Eh ;} If [r3] is 3 or 6: 08069A1A (T) cmp r0,6h ;| 08069A1C (T) bne 8069A22h ;/ 08069A1E (T) sub r0,r2,1 ;\ 08069A20 (T) strb r0,[r3,4h] ;} r3 + 4 = [r1 + 2] - 1 08069A22 (T) mov r0,4h ;\ 08069A24 (T) ldsb r0,[r3,r0] ;| 08069A26 (T) lsl r0,r0,7h ;| 08069A28 (T) ldr r1,[r3,8h] ;| 08069A2A (T) add r1,r1,r0 ;| 08069A2C (T) lsl r0,r6,7h ;| 08069A2E (T) ldr r2,=LevelTiles ;} Load 4 tiles from [r3 + 8] + [r3 + 4]*80h to Level tiles @ tile i*4 08069A30 (T) add r0,r0,r2 ;| 08069A32 (T) str r1,[r5] ;| 08069A34 (T) str r0,[r5,4h] ;| 08069A36 (T) ldr r0,=80000040h ;| 08069A38 (T) str r0,[r5,8h] ;| 08069A3A (T) ldr r0,[r5,8h] ;/ 08069A3C (T) add r6,1h ;\ 08069A3E (T) add r3,0Ch ;} ++i 08069A40 (T) add r4,3h ;/ 08069A42 (T) cmp r6,0Fh ;\ 08069A44 (T) ble 80699B2h ;} If i <= 0Fh: next! 08069A46 (T) ldr r1,=40000D4h ;\ 08069A48 (T) ldr r0,=6004600h ;| 08069A4A (T) str r0,[r1] ;| 08069A4C (T) ldr r0,=600FDE0h ;| 08069A4E (T) str r0,[r1,4h] ;} Mirror Level tiles @ tiles 48..63 to Background tiles @ tiles 1007..1022 08069A50 (T) ldr r0,=80000100h ;| 08069A52 (T) str r0,[r1,8h] ;| 08069A54 (T) ldr r0,[r1,8h] ;/ 08069A56 (T) pop r3-r5 08069A58 (T) mov r8,r3 08069A5A (T) mov r9,r4 08069A5C (T) mov r10,r5 08069A5E (T) pop r4-r7 08069A60 (T) pop r0 08069A62 (T) bx r0 08069A64 dd 006004000h,080000040h,0040000D4h,006004600h 08069A74 dd 00600FDE0h,080000100h ; i = 0..0xF ; Get animated tileset-set index from 03004FC9 ; Multiply it by sizeof(animated tileset-set) = 0x30 ; Add animated tileset-sets = 083C8F90 ; Add sizeof(tileset-set) = i*3 ; struct tileset-set ; { ; byte tileset1 index ; byte 03000058 offset ; byte tileset2 index ; } ; animated tileset-set = tileset-set[0x10] ; For tileset-set in animated tileset-sets[animated tileset-set index][i] ; ; if [03000058 + offset] == 0 ; use tileset1 index ; else ; use tileset2 index ; ; Multiply it by sizeof(tileset) = 8 ; Add tilesets = 083C8D58 ; struct tileset ; { ; byte 0300531C+0 ; byte 0300531C+1 ; byte 0300531C+3 ; word 0300531C+8 ; } ; For tilesets[tileset index] ; struct 0300531C[0x10] ; { ; byte tileset+0 Type of animation - 0/2: none; 1: loop forwards; 3: forwards once; 4: loop forwards and backwards; 5: backwards once; 6: loop backwards ; byte tileset+1 Delay between animation frames ; byte 0 Frame counter for current animation frame ; byte tileset+2 Total animation frames ; byte 0 Animation frame ; word tileset+4 Tiles ; } ; For 0300531C[i] ; ; if 0300531C+0 in [3, 6] ; 0300531C+4 = [0300531C+3] - 1 (animation frame = last frame) ; ; DMA [0300531C+8] + [0300531C+4] * 0x80 ; to LevelTiles + i*0x80 ; for 0x80 bytes ; ; DMA LevelTiles + 0x600 ; to BackgroundTiles + 0x7DE0 ; for 0x200 bytes 0806FEC8 (T) push r4-r7,r14 0806FECA (T) ldr r0,=3004FC8h ;\ 0806FECC (T) ldrb r1,[r0] ;| 0806FECE (T) mov r7,r0 ;| 0806FED0 (T) cmp r1,0h ;} If extra palette == 0: return 0806FED2 (T) bne 806FED6h ;| 0806FED4 (T) b 806FFFAh ;/ 0806FED6 (T) mov r6,0h ; Flag for clearing extra palette 0806FED8 (T) ldr r1,=3004FC0h ;\ 0806FEDA (T) ldrb r0,[r1] ;| 0806FEDC (T) add r5,r0,1 ;} ++03004FC0 0806FEDE (T) strb r5,[r1] ;/ 0806FEE0 (T) ldr r2,=83E3764h ;\ 0806FEE2 (T) ldrb r0,[r7] ;| 0806FEE4 (T) lsl r0,r0,3h ;} r3 = 0x083E3764 + extra palette * 8 0806FEE6 (T) add r3,r0,r2 ;/ 0806FEE8 (T) ldrb r0,[r3] 0806FEEA (T) mov r4,r1 ; r4 = 0x03004FC0 0806FEEC (T) mov r12,r2 ; r12 = 0x083E3764 0806FEEE (T) cmp r0,1h ;\ 0806FEF0 (T) beq 806FF0Ch ;} If [r3] == 1: branch to 0806FF0C 0806FEF2 (T) cmp r0,1h ;\ 0806FEF4 (T) ble 806FF98h ;} If [r3] == 0: return 0806FEF6 (T) cmp r0,2h ;\ 0806FEF8 (T) beq 806FF40h ;} If [r3] == 2: branch to 0806FF40 0806FEFA (T) cmp r0,3h ;\ 0806FEFC (T) beq 806FF78h ;} If [r3] == 3: branch to 0806FF78 0806FEFE (T) b 806FF98h ; Return 0806FF00 dd 003004FC8h,003004FC0h,0083E3764h 0806FF0C (T) ldrb r1,[r3,1h] ;\ 0806FF0E (T) lsl r0,r5,18h ;| 0806FF10 (T) lsr r0,r0,18h ;} If [r3 + 1] > [03004FC0]: return 0806FF12 (T) cmp r1,r0 ;| 0806FF14 (T) bhi 806FF98h ;/ 0806FF16 (T) strb r6,[r4] ; 03004FC0 = 0 0806FF18 (T) ldrb r0,[r4,1h] ;\ 0806FF1A (T) add r0,1h ;} ++03004FC1 0806FF1C (T) strb r0,[r4,1h] ;/ 0806FF1E (T) ldrb r1,[r3,2h] ;\ 0806FF20 (T) mov r0,1h ;| 0806FF22 (T) ldsb r0,[r4,r0] ;} If [r3 + 2] > [03004FC1]: branch to 0806FF9C 0806FF24 (T) cmp r1,r0 ;| 0806FF26 (T) bgt 806FF70h ;/ 0806FF28 (T) ldr r0,=3004E3Ah ;\ 0806FF2A (T) ldrb r0,[r0] ;| 0806FF2C (T) lsl r0,r0,18h ;| 0806FF2E (T) asr r0,r0,18h ;} If [03004E3A]: 0806FF30 (T) cmp r0,0h ;| 0806FF32 (T) beq 806FF36h ;/ 0806FF34 (T) mov r6,1h ; r6 = 1 0806FF36 (T) mov r0,0h ; 03004FC1 = 0 0806FF38 (T) b 806FF6Eh ; Branch to 0806FF9C with r6 = 2 0806FF3A dw 00000h 0806FF3C dd 003004E3Ah 0806FF40 (T) ldrb r1,[r3,1h] ;\ 0806FF42 (T) lsl r0,r5,18h ;| 0806FF44 (T) lsr r0,r0,18h ;} If [r3 + 1] > [03004FC0]: return 0806FF46 (T) cmp r1,r0 ;| 0806FF48 (T) bhi 806FF98h ;/ 0806FF4A (T) strb r6,[r4] ; 03004FC0 = 0 0806FF4C (T) ldrb r0,[r4,1h] ;\ 0806FF4E (T) add r0,1h ;} ++03004FC1 0806FF50 (T) strb r0,[r4,1h] ;/ 0806FF52 (T) ldrb r1,[r3,2h] ;\ 0806FF54 (T) mov r0,1h ;| 0806FF56 (T) ldsb r0,[r4,r0] ;} If [r3 + 2] > [03004FC1]: branch to 0806FF9C 0806FF58 (T) cmp r1,r0 ;| 0806FF5A (T) bgt 806FF70h ;/ 0806FF5C (T) ldr r0,=3004E3Ah ;\ 0806FF5E (T) ldrb r0,[r0] ;| 0806FF60 (T) lsl r0,r0,18h ;| 0806FF62 (T) asr r0,r0,18h ;} If [03004E3A]: 0806FF64 (T) cmp r0,0h ;| 0806FF66 (T) beq 806FF6Ah ;/ 0806FF68 (T) mov r6,1h ; r6 = 1 0806FF6A (T) sub r0,r1,1 ;\ 0806FF6C (T) neg r0,r0 ;| ;} 03004FC1 = 1 - [r3 + 2] 0806FF6E (T) strb r0,[r4,1h] ;/ 0806FF70 (T) add r6,1h ;\ 0806FF72 (T) b 806FF98h ;} Branch to 0806FF9C with r6 = 2 0806FF74 dd 003004E3Ah 0806FF78 (T) ldrb r1,[r3,1h] ;\ 0806FF7A (T) lsl r0,r5,18h ;| 0806FF7C (T) lsr r0,r0,18h ;} If [r3 + 1] > [03004FC0]: return 0806FF7E (T) cmp r1,r0 ;| 0806FF80 (T) bhi 806FF98h ;/ 0806FF82 (T) strb r6,[r4] ; 03004FC0 = 0 0806FF84 (T) ldrb r0,[r4,1h] ;\ 0806FF86 (T) sub r0,1h ;} --03004FC1 0806FF88 (T) strb r0,[r4,1h] ;/ 0806FF8A (T) lsl r0,r0,18h ;\ 0806FF8C (T) cmp r0,0h ;} If [03004FC1] < 0: 0806FF8E (T) bge 806FF96h ;/ 0806FF90 (T) ldrb r0,[r3,2h] ;\ 0806FF92 (T) sub r0,1h ;} 03004FC1 = [r3 + 2] - 1 0806FF94 (T) strb r0,[r4,1h] ;/ 0806FF96 (T) mov r6,1h ; r6 = 1 0806FF98 (T) cmp r6,0h ;\ 0806FF9A (T) beq 806FFFAh ;} If r6 == 0: return 0806FF9C (T) mov r3,1h ;\ 0806FF9E (T) ldsb r3,[r4,r3] ;} r3 = [03004FC1] 0806FFA0 (T) cmp r3,0h ;\ 0806FFA2 (T) bge 806FFA6h ;} If r3 < 0: 0806FFA4 (T) neg r3,r3 ; r3 = -r3 0806FFA6 (T) ldr r0,=SubGameMode2 ;\ 0806FFA8 (T) mov r1,0h ;| 0806FFAA (T) ldsh r0,[r0,r1] ;} If subgame mode 2 == 2: 0806FFAC (T) cmp r0,2h ;| 0806FFAE (T) bne 806FFD4h ;/ 0806FFB0 (T) ldr r2,=40000D4h ;\ 0806FFB2 (T) ldrb r0,[r7] ;| 0806FFB4 (T) lsl r0,r0,3h ;| 0806FFB6 (T) mov r1,r12 ;| 0806FFB8 (T) add r1,4h ;| 0806FFBA (T) add r0,r0,r1 ;| 0806FFBC (T) lsl r1,r3,5h ;} Load extra palette slot r3 to palette entry 0Fh 0806FFBE (T) ldr r0,[r0] ;| 0806FFC0 (T) add r0,r0,r1 ;| 0806FFC2 (T) str r0,[r2] ;| 0806FFC4 (T) ldr r0,=50001E0h ;| 0806FFC6 (T) b 806FFEAh ;/ 0806FFC8 dd 003000BE0h,0040000D4h,0050001E0h 0806FFD4 (T) ldr r2,=40000D4h ;\ Else (subgame mode 2 != 2): 0806FFD6 (T) ldrb r0,[r7] ;| 0806FFD8 (T) lsl r0,r0,3h ;| 0806FFDA (T) mov r1,r12 ;| 0806FFDC (T) add r1,4h ;| 0806FFDE (T) add r0,r0,r1 ;} Load extra palette slot r3 to palette backup entry 0Fh 0806FFE0 (T) lsl r1,r3,5h ;| 0806FFE2 (T) ldr r0,[r0] ;| 0806FFE4 (T) add r0,r0,r1 ;| 0806FFE6 (T) str r0,[r2] ;| 0806FFE8 (T) ldr r0,=20355E0h ;/ 0806FFEA (T) str r0,[r2,4h] 0806FFEC (T) ldr r0,=80000010h 0806FFEE (T) str r0,[r2,8h] 0806FFF0 (T) ldr r0,[r2,8h] 0806FFF2 (T) cmp r6,2h ;\ 0806FFF4 (T) bne 806FFFAh ;} If r6 == 2: 0806FFF6 (T) mov r0,0h ;\ 0806FFF8 (T) strb r0,[r7] ;} Extra palette = 0 0806FFFA (T) pop r4-r7 0806FFFC (T) pop r0 0806FFFE (T) bx r0 08070000 dd 0040000D4h,0020355E0h,080000010h