MKDS Arm9

From CW-Games Wiki
Jump to: navigation, search

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.
Personal tools
Namespaces
Variants
Actions
Navigation
Toolbox
Courses
Documentation
Files
Full Hacks
Model Hacks
Texture Hacks
Misc Hacks
Applications
Theory
Tutorials
Video