MKDS Arm9
This page contains information about the arm9 of mkds.
Contents |
Code
Course Specific Particles
; =============== S U B R O U T I N E ======================================= 02082AEC 02082AEC 02082AEC CourseParticlesRender ; CODE XREF: LoadSpaParticles+27C 02082AEC STMFD SP!, {LR} 02082AF0 SUB SP, SP, #4 02082AF4 LDR R0, =SelectedCoursePointer 02082AF8 MOV R2, #0x1000 02082AFC LDR R0, [R0] 02082B00 LDR R0, [R0,#0x10] 02082B04 CMP R0, #0 02082B08 BEQ loc_2082B18 02082B0C CMP R0, #1 02082B10 LDREQ R2, =0xD9A 02082B14 B loc_2082B1C 02082B18 ; --------------------------------------------------------------------------- 02082B18 02082B18 loc_2082B18 ; CODE XREF: CourseParticlesRender+1C 02082B18 LDR R2, =0xB33 02082B1C 02082B1C loc_2082B1C ; CODE XREF: CourseParticlesRender+28 02082B1C LDR R0, =0x779A 02082B20 MOV R1, #0 02082B24 UMULL R12, R3, R2, R0 02082B28 MLA R3, R2, R1, R3 02082B2C MOV R2, R2,ASR#31 02082B30 MOV R1, #0x800 02082B34 ADDS R1, R12, R1 02082B38 MLA R3, R2, R0, R3 02082B3C ADC R0, R3, #0 02082B40 MOV R1, R1,LSR#12 02082B44 ORR R1, R1, R0,LSL#20 02082B48 MOV R0, #0x1000 02082B4C BL FX_Div 02082B50 LDR R1, =SelectedCoursePointer 02082B54 LDR R12, =dword_217AE9C 02082B58 LDR R3, =dword_217AE88 02082B5C MOV LR, #0 02082B60 LDR R2, =dword_217AE78 02082B64 LDR R1, [R1] 02082B68 STR R0, [R12] 02082B6C STR LR, [R3] 02082B70 STR LR, [R2] 02082B74 LDR R0, [R1] 02082B78 CMP R0, #0x10 ; Check if selected course is N64 Frappe Snowland (0x10) 02082B7C BEQ SnowParticles ; If so, make the snow appear! 02082B80 CMP R0, #0x25 ; Check if selected course is GBA Luigi Circuit (0x25) 02082B84 ADDNE SP, SP, #4 02082B88 LDMNEFD SP!, {LR} 02082B8C BXNE LR 02082B90 LDR R0, [R1,#0xC] 02082B94 CMP R0, #0 02082B98 BNE loc_2082BE0 ; If not so, jump over the raining part 02082B9C LDR R1, =dword_2155A14 02082BA0 MOV R0, #0x24 02082BA4 BL ParticlesRender 02082BA8 LDR R1, =dword_217AE78 02082BAC LDR R2, =sub_2082750 02082BB0 STR R0, [R1] 02082BB4 STR R2, [R0,#0x90] 02082BB8 LDR R1, =dword_2155A14 02082BBC MOV R0, #0x27 02082BC0 BL ParticlesRender 02082BC4 LDR R1, =dword_217AE88 02082BC8 LDR R2, =sub_2082A10 02082BCC STR R0, [R1] 02082BD0 STR R2, [R0,#0x90] 02082BD4 ADD SP, SP, #4 02082BD8 LDMFD SP!, {LR} 02082BDC BX LR 02082BE0 ; --------------------------------------------------------------------------- 02082BE0 02082BE0 loc_2082BE0 ; CODE XREF: CourseParticlesRender+AC 02082BE0 BL sub_2062EC4 02082BE4 CMP R0, #0 02082BE8 BEQ loc_2082C30 02082BEC LDR R1, =dword_2155A14 02082BF0 MOV R0, #0x3D 02082BF4 BL ParticlesRender 02082BF8 LDR R1, =dword_217AE78 02082BFC LDR R2, =sub_20824D0 02082C00 STR R0, [R1] 02082C04 STR R2, [R0,#0x90] 02082C08 LDR R1, =dword_2155A14 02082C0C MOV R0, #0x3F 02082C10 BL ParticlesRender 02082C14 LDR R1, =dword_217AE88 02082C18 LDR R2, =sub_208266C 02082C1C STR R0, [R1] 02082C20 STR R2, [R0,#0x90] 02082C24 ADD SP, SP, #4 02082C28 LDMFD SP!, {LR} 02082C2C BX LR 02082C30 ; --------------------------------------------------------------------------- 02082C30 02082C30 loc_2082C30 ; CODE XREF: CourseParticlesRender+FC 02082C30 LDR R1, =dword_2155A14 02082C34 MOV R0, #0x3C 02082C38 BL ParticlesRender 02082C3C LDR R1, =dword_217AE78 02082C40 LDR R2, =sub_20824D0 02082C44 STR R0, [R1] 02082C48 STR R2, [R0,#0x90] 02082C4C LDR R1, =dword_2155A14 02082C50 MOV R0, #0x3F 02082C54 BL ParticlesRender 02082C58 LDR R1, =dword_217AE88 02082C5C LDR R2, =sub_208266C 02082C60 STR R0, [R1] 02082C64 STR R2, [R0,#0x90] 02082C68 ADD SP, SP, #4 02082C6C LDMFD SP!, {LR} 02082C70 BX LR 02082C74 ; --------------------------------------------------------------------------- 02082C74 02082C74 SnowParticles ; CODE XREF: CourseParticlesRender+90 02082C74 BL sub_2062EC4 02082C78 CMP R0, #0 02082C7C BEQ loc_2082CA8 02082C80 LDR R1, =dword_2155A14 02082C84 MOV R0, #0x3E 02082C88 BL ParticlesRender 02082C8C LDR R1, =dword_217AE78 02082C90 LDR R2, =loc_2082034 02082C94 STR R0, [R1] 02082C98 STR R2, [R0,#0x90] 02082C9C ADD SP, SP, #4 02082CA0 LDMFD SP!, {LR} 02082CA4 BX LR 02082CA8 ; --------------------------------------------------------------------------- 02082CA8 02082CA8 loc_2082CA8 ; CODE XREF: CourseParticlesRender+190 02082CA8 LDR R0, =SelectedCoursePointer 02082CAC LDR R0, [R0] 02082CB0 LDR R0, [R0,#0xC] 02082CB4 CMP R0, #0 02082CB8 BNE loc_2082D00 02082CBC LDR R1, =dword_2155A14 02082CC0 MOV R0, #0x29 02082CC4 BL ParticlesRender 02082CC8 LDR R1, =dword_217AE78 02082CCC LDR R2, =loc_20821CC 02082CD0 STR R0, [R1] 02082CD4 STR R2, [R0,#0x90] 02082CD8 LDR R1, =dword_2155A14 02082CDC MOV R0, #0x25 02082CE0 BL ParticlesRender 02082CE4 LDR R1, =dword_217AE88 02082CE8 LDR R2, =loc_2082368 02082CEC STR R0, [R1] 02082CF0 STR R2, [R0,#0x90] 02082CF4 ADD SP, SP, #4 02082CF8 LDMFD SP!, {LR} 02082CFC BX LR 02082D00 ; --------------------------------------------------------------------------- 02082D00 02082D00 loc_2082D00 ; CODE XREF: CourseParticlesRender+1CC 02082D00 LDR R1, =dword_2155A14 02082D04 MOV R0, #0x29 02082D08 BL ParticlesRender 02082D0C LDR R1, =dword_217AE78 02082D10 LDR R2, =loc_2082034 02082D14 STR R0, [R1] 02082D18 STR R2, [R0,#0x90] 02082D1C ADD SP, SP, #4 02082D20 LDMFD SP!, {LR} 02082D24 BX LR 02082D24 ; End of function CourseParticlesRender 02082D24 02082D24 ; --------------------------------------------------------------------------- 02082D28 off_2082D28 DCD SelectedCoursePointer ; DATA XREF: CourseParticlesRender+8 02082D28 ; CourseParticlesRender+64 02082D2C dword_2082D2C DCD 0xD9A ; DATA XREF: CourseParticlesRender+24 02082D30 dword_2082D30 DCD 0xB33 ; DATA XREF: CourseParticlesRender:loc_2082B18 02082D34 dword_2082D34 DCD 0x779A ; DATA XREF: CourseParticlesRender:loc_2082B1C 02082D38 off_2082D38 DCD dword_217AE9C ; DATA XREF: CourseParticlesRender+68 02082D3C off_2082D3C DCD dword_217AE88 ; DATA XREF: CourseParticlesRender+6C 02082D3C ; CourseParticlesRender+D8 02082D40 off_2082D40 DCD dword_217AE78 ; DATA XREF: CourseParticlesRender+74 02082D40 ; CourseParticlesRender+BC 02082D44 off_2082D44 DCD dword_2155A14 ; DATA XREF: CourseParticlesRender+B0 02082D44 ; CourseParticlesRender+CC 02082D48 off_2082D48 DCD sub_2082750 ; DATA XREF: CourseParticlesRender+C0 02082D4C off_2082D4C DCD sub_2082A10 ; DATA XREF: CourseParticlesRender+DC 02082D50 off_2082D50 DCD sub_20824D0 ; DATA XREF: CourseParticlesRender+110 02082D50 ; CourseParticlesRender+154 02082D54 off_2082D54 DCD sub_208266C ; DATA XREF: CourseParticlesRender+12C 02082D54 ; CourseParticlesRender+170 02082D58 off_2082D58 DCD loc_2082034 ; DATA XREF: CourseParticlesRender+1A4 02082D58 ; CourseParticlesRender+224 02082D5C off_2082D5C DCD loc_20821CC ; DATA XREF: CourseParticlesRender+1E0 02082D60 off_2082D60 DCD loc_2082368 ; DATA XREF: CourseParticlesRender+1FC
I think this is clear. It checks for the selected course and if the right course, it applies the particles.
Items
The object info table points to structures in the arm9 where pointers to the following subroutines are stored.
Initialisation
Many items have an initialisation subroutine. It looks like this in asm (for example):
; =============== S U B R O U T I N E ======================================= 020AC658 020AC658 020AC658 InitShine_balloon ; DATA XREF: RAM:02167DF0 020AC658 LDR R12, =(sub_209BEF0+1) 020AC65C LDR R0, =LoadShine_balloon 020AC660 LDR R1, =RenderShine_balloon 020AC664 LDR R2, =loc_20AC9B0 020AC668 BX R12 ; sub_209BEF0 020AC668 ; End of function InitShine_balloon 020AC668 020AC668 ; --------------------------------------------------------------------------- 020AC66C off_20AC66C DCD sub_209BEF0+1 ; DATA XREF: InitShine_balloon 020AC670 off_20AC670 DCD LoadShine_balloon ; DATA XREF: InitShine_balloon+4 020AC674 off_20AC674 DCD RenderShine_balloon ; DATA XREF: InitShine_balloon+8 020AC678 off_20AC678 DCD loc_20AC9B0 ; DATA XREF: InitShine_balloon+C
It sets the R12 to a unknown subroutine. The R0 to the load subroutine and the R2 to the render subroutine. Then it calls R12 (the unknown subroutine)
Rendering
All items have a rendering subroutine. It looks like this in asm (for example):
; =============== S U B R O U T I N E ======================================= 020AC890 020AC890 020AC890 RenderShine_balloon ; DATA XREF: InitShine_balloon+8 020AC890 ; RAM:off_20AC674 020AC890 020AC890 var_40 = -0x40 020AC890 var_3C = -0x3C 020AC890 var_30 = -0x30 020AC890 var_2C = -0x2C 020AC890 var_28 = -0x28 020AC890 var_24 = -0x24 020AC890 var_20 = -0x20 020AC890 var_1C = -0x1C 020AC890 var_18 = -0x18 020AC890 var_14 = -0x14 020AC890 var_10 = -0x10 020AC890 020AC890 STMFD SP!, {R4,R5,LR} 020AC894 SUB SP, SP, #0x34 020AC898 MOV R4, R1 020AC89C LDR R1, [R4,#0xAC] 020AC8A0 MOV R5, R0 020AC8A4 ADD R0, R1, #0x300 020AC8A8 LDRH R0, [R0,#0x84] 020AC8AC CMP R0, #0 020AC8B0 ADDEQ SP, SP, #0x34 020AC8B4 LDMEQFD SP!, {R4,R5,LR} 020AC8B8 BXEQ LR 020AC8BC MOV R3, #0x1E 020AC8C0 ADD R1, SP, #0x40+var_40 020AC8C4 MOV R0, #0x14 020AC8C8 MOV R2, #1 020AC8CC STR R3, [SP,#0x40+var_40] 020AC8D0 BL NNS_G3dGeBufferOP_N 020AC8D4 ADD R0, R4, #4 020AC8D8 BL sub_20E6CF8 020AC8DC MOV R1, R0 020AC8E0 MOV R0, #0x19 020AC8E4 MOV R2, #0xC 020AC8E8 BL NNS_G3dGeBufferOP_N 020AC8EC LDR R0, [R4,#0xAC] 020AC8F0 BL sub_20A23A0 020AC8F4 MOV R0, R0,ASR#4 020AC8F8 STR R0, [SP,#0x40+var_2C] 020AC8FC MOV R0, #0 020AC900 STR R0, [SP,#0x40+var_30] 020AC904 STR R0, [SP,#0x40+var_28] 020AC908 MOV R0, #0x1C 020AC90C ADD R1, SP, #0x40+var_30 020AC910 MOV R2, #3 020AC914 BL NNS_G3dGeBufferOP_N 020AC918 LDR R3, [R4,#0xA0] 020AC91C CMP R3, #0x1000 020AC920 BEQ loc_20AC940 020AC924 ADD R1, SP, #0x40+var_24 020AC928 MOV R0, #0x1B 020AC92C MOV R2, #3 020AC930 STR R3, [SP,#0x40+var_24] 020AC934 STR R3, [SP,#0x40+var_20] 020AC938 STR R3, [SP,#0x40+var_1C] 020AC93C BL NNS_G3dGeBufferOP_N 020AC940 020AC940 loc_20AC940 ; CODE XREF: RenderShine_balloon+90 020AC940 ADD R1, R4, #0x1C 020AC944 MOV R0, #0x1B 020AC948 MOV R2, #3 020AC94C BL NNS_G3dGeBufferOP_N 020AC950 BL sub_2061808 020AC954 MOV R1, R0 020AC958 ADD R2, SP, #0x40+var_3C 020AC95C ADD R0, R4, #4 020AC960 ADD R1, R1, #0x24 020AC964 BL VEC_Subtract_0 020AC968 ADD R0, SP, #0x40+var_3C 020AC96C BL VEC_Mag_0 020AC970 STR R0, [SP,#0x40+var_18] 020AC974 STR R0, [SP,#0x40+var_14] 020AC978 STR R0, [SP,#0x40+var_10] 020AC97C MOV R0, #0x1B 020AC980 ADD R1, SP, #0x40+var_18 020AC984 MOV R2, #3 020AC988 BL NNS_G3dGeBufferOP_N 020AC98C LDR R1, =dword_217B33C 020AC990 MOV R0, R5 020AC994 LDR R1, [R1] 020AC998 MOV R2, R4 020AC99C BL sub_209BB2C 020AC9A0 ADD SP, SP, #0x34 020AC9A4 LDMFD SP!, {R4,R5,LR} 020AC9A8 BX LR 020AC9A8 ; End of function RenderShine_balloon 020AC9A8 020AC9A8 ; --------------------------------------------------------------------------- 020AC9AC off_20AC9AC DCD dword_217B33C ; DATA XREF: RenderShine_balloon+FC
It is not very clear. But it is for sure the rendering subroutine. (NNS_G3dGeBufferOP_N)
Loading
All items have a loading subroutine. It looks like this in asm (for example):
; =============== S U B R O U T I N E ======================================= 020AC9C8 020AC9C8 020AC9C8 LoadShine_balloon ; DATA XREF: InitShine_balloon+4 020AC9C8 ; RAM:off_20AC670 020AC9C8 STMFD SP!, {LR} 020AC9CC SUB SP, SP, #4 020AC9D0 LDR R1, =aShine_balloon_ ; "shine_balloon.nsbmd" 020AC9D4 BLX LoadMapObjFolderBillboardNSBMD 020AC9D8 LDR R2, =dword_217B33C 020AC9DC MOV R1, #0x3F 020AC9E0 STR R0, [R2] 020AC9E4 BL sub_209B940 020AC9E8 ADD SP, SP, #4 020AC9EC LDMFD SP!, {LR} 020AC9F0 BX LR 020AC9F0 ; End of function LoadShine_balloon 020AC9F0 020AC9F0 ; --------------------------------------------------------------------------- 020AC9F4 off_20AC9F4 DCD aShine_balloon_ ; DATA XREF: LoadShine_balloon+8 020AC9F4 ; "shine_balloon.nsbmd" 020AC9F8 off_20AC9F8 DCD dword_217B33C ; DATA XREF: LoadShine_balloon+10
It loads the required nsbmd and animation files from the MapObj folder in the course carc. The LoadMapObjFolderBillboardNSBMD function returns an offset to the file in R0. In this example, the offset is copied to dword_217B33C.
Tables
| Offset | Name | Description |
|---|---|---|
| 0x15316C | Sequence Table | Table containing sequence IDs. |
| 0x1535B4 | Character Table | Table containing character IDs. |
| 0x15CA1C | Time Trails Course Picture Table | Table containing track ids. |
| 0x15CBEC | Time Trails Course Order Table | Table containing track ids. |
| 0x16B288 | Object Info Table | Table containing object ids and offsets to other data. |