Zelda: Majora's Mask (Debug)
load_file
0x80081094 void load_file(ftl_d * f);
Loads a file from the filesystem
f is a pointer to an instance of this structure:
typedef struct { u32 rom_v_start; char *dest; int siz; } ftl_d;
Note that the memory must already be allocated for dest!
Native Functions
void TextXY(void * text_buffer, u16 x, u16 y) = 0x800872EC; void TextRGBA(void * text_buffer, u8 r, u8 g, u8 b, u8 a) = 0x8008727C; void TextString(void * text_buffer, char * format, ...) = 0x800879AC; void TextDo(void * text_buffer) = 0x80087974; void dma_rom_to_ram(u32 rom_addr, u32 ram_addr, int siz) = 0x80080CE0; ActorSpawn = 0x800CF0B8 set_actor_size = 0x800C8FE0
OS Functions
rm is a tool that ran alongside the debugger (some kind of thread management tool)
0x8008ab60,__osSetCause 0x8008b070,osSetIntMask 0x8008b110,osGetIntMask 0x80090030,__osGetConfig 0x80090040,__osSetConfig 0x80090a60,__osProbeTLB 0x80091e20,osGetCount 0x80092260,sqrtf 0x80093940,osUnmapTLBAll 0x800966c0,__osSetCompare 0x800966d0,__osGetCompare 0x8009b580,__osSetFpcCsr 0x8009b590,__osGetFpcCsr 0x8009df40,osWritebackDCacheAll 0x800a37b0,__osRcpImTable 0x800a3eb0,__libm_qnan_f 0x8008ab70,osSendMesg 0x8008ae70,osStopThread 0x8008af30,osRecvMesg 0x8008b430,__sinf/fsin/sinf 0x8008b5f0,sins 0x8008b970,__ull_rshift 0x8008b99c,__ull_rem 0x8008b9d8,__ull_div 0x8008ba14,__ll_lshift 0x8008ba40,__ll_rem 0x8008ba7c,__ll_div 0x8008bad8,__ll_mul 0x8008bb08,__ull_divremi 0x8008bb68,__ll_mod 0x8008bc04,__ll_rshift 0x8008ca00,__osDequeueThread 0x8008cc00,bzero/_bzero/blkclr/_blkclr 0x80090970,osStopTimer 0x80093e60,osCreateMesgQueue 0x80093e90,osInvalICache 0x80093f10,osInvalDCache 0x80094ef0,osJamMesg 0x80095040,osSetThreadPri 0x80095120,osGetThreadPri 0x80095740,bcmp/_bcmp 0x80095860,osGetTime 0x80095ac0,__osSetGlobalIntMask 0x800966e0,osDpGetStatus 0x800966f0,osDpSetStatus 0x80096700,bcopy/_bcopy 0x80096a10,__osResetGlobalIntMask 0x80097380,__cosf/fcos/cosf 0x800976a0,coss 0x800976d0,osSetTime 0x8009d860,_Litob 0x8009dbf0,__osSpGetStatus 0x8009dc00,__osSpSetStatus 0x8009e1b0,osStartThread 0x8009e460,__d_to_ll 0x8009e47c,__f_to_ll 0x8009e498,__d_to_ull 0x8009e538,__f_to_ull 0x8009e5d4,__ll_to_d 0x8009e5ec,__ll_to_f 0x8009e604,__ull_to_d 0x8009e638,__ull_to_f 0x800a0070,osViModeNtscHpf1 0x800a00c0,osViModeMpalHpf1 0x800a0a80,osViModeNtscHpn1 0x800a0ba0,osViModeNtscLan1 0x800a0bf0,osViModeMpalLan1 0x8008fe10,osReadHost 0x80093fc0,__rmonSendFault 0x80094034,__rmonIOflush 0x80094084,__rmonIOputw 0x800940f0,__rmonIOhandler 0x80097880,__osRdbSend 0x80098180,__rmonExecute 0x80098220,__rmonWriteWordTo 0x80098268,__rmonReadWordAt 0x800982bc,__rmonMemcpy 0x800982f0,__rmonCopyWords 0x80098360,__rmonReadMem 0x8009855c,__rmonWriteMem 0x800987a8,__rmonListProcesses 0x80098828,__rmonLoadProgram 0x80098834,__rmonGetExeName 0x800988dc,__rmonGetRegionCount 0x8009894c,__rmonGetRegions 0x80098b40,__rmonSendHeader 0x80098bd8,__rmonSendReply 0x80098c80,__rmonSendData 0x80098da0,rmonMain 0x80098f40,__rmonMaskIdleThreadInts 0x80098fbc,__rmonGetTCB 0x8009903c,__rmonStopUserThreads 0x80099144,__rmonListThreads 0x80099278,__rmonGetThreadStatus 0x8009956c,__rmonThreadStatus 0x800995d4,__rmonStopThread 0x8009971c,__rmonRunThread 0x800999c0,__rmonSetFault 0x80099a0c,__rmonInit 0x80099ae8,__rmonPanic 0x80099b08,__rmonSetComm 0x80099b50,__rmonRCPrunning 0x80099b74,__rmonIdleRCP 0x80099bb8,__rmonStepRCP 0x80099bcc,__rmonRunRCP 0x80099d84,__rmonSetBreak 0x80099f44,__rmonListBreak 0x80099f50,__rmonClearBreak 0x8009a0ac,__rmonGetBranchTarget 0x8009a368,__rmonSetSingleStep 0x8009a42c,__rmonGetExceptionStatus 0x8009a528,__rmonHitBreak 0x8009a558,__rmonHitSpBreak 0x8009a5c0,__rmonHitCpuFault 0x8009a988,__rmonGetGRegisters 0x8009aae4,__rmonSetGRegisters 0x8009ac34,__rmonGetFRegisters 0x8009acec,__rmonSetFRegisters 0x8009ae04,__rmonGetSRegs 0x8009af64,__rmonSetSRegs 0x8009b074,__rmonGetVRegs 0x8009b18c,__rmonSetVRegs 0x8009b250,__rmonGetRegisterContents
Header commands
0x02
Seemingly the same as the header commands in OoT Debug
0x02 - Cameras used for the 0x1B command.
Format
02xx0000 yyyyyyyy
xx = number of entries
yy = offset xxxxyyyy zzzzzzzz
xx = camera type?
yy = unknown
zz = offset xxxxyyyy
zzzzpppp qqqqrrrr FFFFFFFF FFFF
xx = x position
yy = y position
zz = z position
pp = x rotation
qq = y rotation
rr = z rotation
0x17
Cutscenes
17xx0000 yyyyyyyy
xx = number of cutscenes
yy = offset
Entries
xxxxxxxx yyyyuutt
xx = Offset of cutscene data
yy = Exit
uu = Entrance cutscene activates at
tt = Event flag
Cutscene Header Format
xxxxxxxx yyyyyyyy
xx = Number of markers
yy = Length (Frames)
Small list of cutscene markers (More can be found below):
0000000A Text
0000005A Camera data
00000066 Zelda
00000070 Epona
00000078 Romani
00000082 Happy mask man
00000096 Sound effects?
00000097 ???
00000098 Screen Transition
00000099 Motion blur?
0000009B ???
0000009C ???
000000C8 Link
000000C9 Tatl
0000012C Play song
0000015E End Cutscene
The formats for these markers should be the same as they are in OoT, except for the camera data.
0x1A
Used to animate textures. Maps with mesh that use animated textures will use the DE000000 aa000000 display list command where aa = 08+.
Format
1A000000 xxxxxxxx
xx = offset
then it's
xx00yyyy zzzzzzzz
xx = animated mesh entry (take aa value in DE command and subtract 07 (last entry needs to be negative)
yy = type
00 = one layer
01 = two layers
zz = pointer
then
aabbccdd
aa = x velocity factor
bb = y velocity factor
cc = unknown - use 0x20 if unsure
dd = unknown - use 0x20 if unsure
0x1B
Used by actors to decide what camera to use/cutscene to play.
Format
uuuutttt bbbbcccc nnnnssuu uuuuddee
tt = length (FFFF = constantly playing)
bb = camera to use FFF5 = Mask Transformation FFF6 = opening a large chest FFF7 = ??? FFF8 = ??? FFF9 = ??? FFFA = Song of Soaring FFFB = using event item FFFC = drinking bottle FFFD = playing ocarina FFFE = receiving item from small chest FFFF = null 0000+ = additional cameras (see 0x02 command)
cc = cutscene to play FFFF = null
nn = next entry?
ss = puzzle sound effect to play after
dd = camera position after 00 = keep current position 01 = place behind link 02 = rotate until behind link
ee = size of black bars 80 = max
uu = unknown
-change actor's y rotation to link with 0x1B entry
0x1C
Format
xxxxxxxx yyyyzzzz
xx = pointer to data
yy = zoom
zz = unknown
aaaaxxxx yyyyzzzz bbbb
aa = mini map
xx = x position
yy = y position
zz = z position bb = unknown
Values for the mini map are 0100-0164 iirc.
Cutscenes
Cutscene Data
(Taken from the 0x17 command above)
Cutscenes
17xx0000 yyyyyyyy
xx = number of cutscenes
yy = offset
Entries
xxxxxxxx yyyyuutt
xx = Offset of cutscene data
yy = Exit
uu = Entrance cutscene activates at
tt = Event flag
Scene Table Format
xxxxxxxx yyyyyyyy aaaabbbb 00000000
xx = Scene Start
yy = Scene End
aa = Message Number
bb = Scene Configuration (01 if you want to use the 0x1A command. Goes up to 0x0D IIRC)
Cutscene Header
Cutscene Header Format
xxxxxxxx yyyyyyyy
xx = Number of markers
yy = Length (Frames)
Cutscene Markers
(mostly actor markers)
0000000A Text
0000005A Camera data
00000064 En_Elfgrp
00000065 En_Dnp (Deku Princess)
00000066 Dm_Zl (Zelda)
00000067 Bg_Dy_Yoseizo
00000068 Bg_Ctower_Gear
00000069 En_Dnq (Deku King)
0000006B Dm_Stk (Skullkid)
0000006C En_Ge3
0000006D Dm_Char05
00000070 En_Horse (Epona)
00000073 Dm_Opstage
00000077 En_Gg
00000078 En_Ma_Yts, En_Ma4 (Romani)
00000079 En_Ge1
0000007C Bg_Open_Shutter
0000007D Bg_Open_Spot
0000007E En_Dnk
0000007F En_Mk (Professor)
00000082 En_Osn (Happy Mask Man)
00000083 Dm_Char02
00000084 Obj_Tokeidai
00000086 Obj_Tokei_Step
00000087 Dm_Char01
00000088 Dm_Char03
00000096 Sound effects?
00000098 Screen Transition
00000099 Motion blur?
000000C8 Player (Link)
000000C9 En_Elf (Tatl)
0000012C Play song
0000015E End Cutscene
000001C9 En_Zoraegg
000001CF Dm_Char06
000001D5 Bg_Haka_Curtain
000001D6 En_Jg
000001D7 En_Zog
000001D8 En_Dai
000001DA Dm_Char08
000001DB En_Dno
000001DC En_Ge2
000001DF En_Gk
000001E0 Eff_Kamejima_Wave
000001E2 En_Po_Composer
000001E3 Obj_Hgdoor
000001E4 En_Hg
000001E5 En_Pamera
000001E6 En_Hgo
000001F4 En_Zob
000001F5 En_Zos
000001F6 Eff_Kamejima_Wave
000001F7 Dm_Char09
000001F8 En_Zov
000001F9 En_Test6
000001FA En_Test3
000001FF Obj_Boat
00000200 Eff_Stk
00000201 Dm_Stk (Skullkid)
00000202 Dm_Tsg
00000203 En_Zod
0000020D En_Toto
0000020E En_Gm
0000020F Eff_Zoraband
00000214 En_Bsb
00000228 Obj_Usiyane
0000022C En_Ma_Yto (Cremia)
0000022D En_An, Dm_An, Dm_Gm
00000232 Dm_Al, Dm_Ah, Dm_Nb
00000235 En_And
00000238 Dm_Bal
00000239 Door_Warp1
000002C8 En_Dns (Deku Palace Scrub)
The actors are programmed to check for a specific value. So, to find them, search in their source file for "jal external_func_8010B11C". If there was a match, then usually before or after that instruction would be "li a1, x" where x is the decimal value for the marker. The method doesn't work all the time though, e.g. En_Giant has LHU instructions instead.
Camera Data
0000005A xxxxxxxx
xx = size of data
xxxxyyyy zzzzzzzz
xx = number of camera points
yy = size
zz = length (frames)
Camera Points
The first part of the data is for the camera focus, the second part is for the camera positions. The last part is for the angle of view.
aabbcccc xxxxyyyy zzzz0000
aa = camera behaviour (use 05 if you don't know what to use)
bb = FACTOR (?) <--- What the camera debug calls it. 0x64 seems to be the default
cc = unknown (something to do with the number of frames?)
xx = x position
yy = y position
zz = z position
xxxx0000 yyyy0000
xx = TIME (?) <--- what the camera debug calls it
yy = angle of view