The current URL is datacrystal.tcrf.net.
The Legend of Zelda: Ocarina of Time/RAM map
Functions=
The N64 functions and math functions were found with LFE unless otherwise noted.
Misc
0x800C5484 char * game_alloc(u32 z_gp, int siz, char * fn, int line);
Allocates memory
z_gp is 0x80212020
siz is the size of the block to be allocated
fn is the file (__FILE__)
line is the line (__LINE__)
OoT spawn functions
SpawnObject
0x80097C00 void ObjectSpawn(u32 const_1, u16 object_number);
Spawns an object
const_1 is 0x802237C4
ActorSpawn
0x80031F50 actor * ActorSpawn(u32 const_1, u32 const_2, int actor, f32 fx, f32 fy, f32 fz, u16 rx, u16 ry, u16 rz, int variable);
Spawns an actor
const_1 is 0x80213C44
const_2 is 0x80212020
Return value is a pointer to a loaded actor.
SpawnArea
0x800C0008 void SpawnArea(u32 const80212020, int scene_no, int entrance_no);
Spawns a specified scene
const80212020 is the super important global var
scene_no is the scene number to use
entrance_no is the start position to use.
OoT Text functions
buffer is a text object, 0x2C bytes as I recall. It's structure is still yet to be determined.
SetTextRGBA
0x800FB3AC void SetTextRGBA(void * buffer, u8 r, u8 g, u8 b, u8 a);
Sets color of text to be drawn
SetTextXY
0x800FB41C void SetTextXY(void * buffer, u16 x, u16 y);
Sets the position of text to be drawn
SetTextString
0x800FBCB4 void SetTextString(void * buffer, char * format, ...);
Sets the text string to be drawn
Math functions
absf
0x801067E0 float absf(float value);
Returns absolute value of a float
Not found with LFE, manually found
__sinf/fsin/sinf
0x80100290 float sinf(float angle);
Computes the sine of an angle in floating point
sins
0x80100450 float sins(unsigned short angle)
Computes the sine of an angle in fixed point
__cosf/fcos/cosf
0x80104610 float cosf(float angle);
Computes the cosine of an angle in floating point
coss
0x80104780 float coss(unsigned short angle);
Computes the cosine of an angle in fixed point
sqrtf
0x801031E0 float sqrtf (float value);
Computes the square root
N64 OS functions
osSendMesg
0x80003060 void osSendMesg(OSMesgQueue *mq, OSMesg msg, s32 flag);
Provides messaging and synchronization facilities
osStopThread
0x800031B0 void osStopThread(OSThread *t);
Suspends a given thread
osRecvMesg
0x80003280 s32 osRecvMesg(OSMesgQueue *mq, OSMesg *msg, s32 flag);
Provides messaging and synchronization facilities
osCreateThread
0x80004550 void osCreateThread(OSThread *t, OSId id, void (*entry)(void *), void *arg, void *sp, OSPri pri);
Registers a schedulable object
osWritebackDCache
0x800046C0 void osWritebackDCache(void *vaddr, s32 nbytes);
Writes back CPU data cache lines to physical memory
osVirtualToPhysical
0x80004DE0 u32 osVirtualToPhysical(void *vaddr)
Translates between CPU virtual address/physical memory address
osGetThreadId
0x80004F20 void osGetThreadId(OSThread *t);
Obtains the debugger identifier of a thread
osSetIntMask
0x80004F40 OSIntMask osSetIntMask(OSIntMask im);
Sets the enabled interrupt mask
osInvalICache
0x80006150 void osInvalICache(void *vaddr, s32 nbytes);
Invalidates CPU instruction cache
osCreateMesgQueue
0x800061D0 void osCreateMesgQueue(OSMesgQueue *mq, OSMesg *msg, s32 count);
Provides messaging and synchronization facilities
osInvalDCache
0x80006200 void osInvalDCache(void *vaddr, s32 nbytes);
Invalidates CPU data cache lines
osJamMesg
0x800062E0 void osJamMesg(OSMesgQueue *mq, OSMesg msg, s32 flag);
Provides messaging and synchronization facilities
osSetThreadPri
0x80006430 void osSetThreadPri(OSThread *t, OSPri pri);
Sets the priority of specified thread
osGetThreadPri
0x80006510 void osGetThreadPri(OSThread *t);
Gets the priority of specified thread
osGetTime
0x800069E0 OSTime osGetTime(void);
Gets the real time counter value
osGetCount
0x80006EA0 u32 osGetCount(void);
Returns CPU count register
__osSetCompare
0x80006F00 : void __osSetCompare(u32 value);
Internal routine to access to multiple MIPS R4300 registers
__osSetFpcCsr
0x80007A70 u32 __osSetFpcCsr(u32 value);
Sets the current value of the R4300 floating-point control/status register
__osGetFpcCsr
0x80007A80 u32 __osGetFpcCsr(void);
Returns the current value of the R4300 floating-point control/status register
osYieldThread
0x80007B40 void osYieldThread(void);
Yields the CPU and invokes the thread dispatcher
__osGetCause
0x80007B90 u32 __osGetCause(void);
Returns the current value of the MIPS R4300 Cause register that describes the cause of the most recent exception
osStartThread
0x80008FC0 void osStartThread(OSThread *t);
Starts or resumes a thread
osSpTaskYield
0x801014A0 void osSpTaskLoad(OSTask *task);
Requests that the SP"yield"
osStopTimer
0x80102330 void osStopTimer(OSTimer *timer);
Stops an interval or countdown timer
osDpGetStatus
0x801041C0 u32 osDpGetStatus(void);
Returns the hardware status of the display processor command status register
osDpSetStatus
0x801041D0 void osDpSetStatus(u32 status);
Updates the display processor command status register with status
osAiGetLength
0x80105C00 u32 osAiGetLength(void);
Returns the number of bytes remaining in the current DMA buffer
osWritebackDCacheAll
0x80106490 void osWritebackDCache(void *vaddr, s32 nbytes);
Writes back all cached locations to physical memory
Undocumented
0x8000AE50 : osViModeMpalLan1 0x80012160 : __osRcpImTable 0x80106470 : __osSpGetStatus 0x80106480 : __osSpSetStatus 0x80004300 : __osDequeueThread 0x800046A0 : __osSetSR 0x800046B0 : __osGetSR 0x80005040 : __osProbeTLB 0x80006EB0 : __osSetGlobalIntMask 0x80007220 : __osResetGlobalIntMask 0x80007AE0 : osMapTLBRdb
Other N64 functions
bzero/_bzero/blkclr/_blkclr
0x80004450 void bzero(void *dst, int length);
Zero-clears a byte string
bcmp/_bcmp
0x800068C0 int bcmp(const void *s1, const void *s2, int length);
Compares byte strings
bcopy/_bcopy
0x80006F10 void bcopy(const void *src,void *dst,int length);
Copies a byte string
guPerspectiveF
0x801010D0 void guPerspectiveF( float mf[4][4], u16 *perspNorm, float fovy, float aspect, float near, float far, float scale);
Creates a perspective projection matrix (floating point)
guPerspective
0x80101300 void guPerspective( Mtx *m, u16 *perspNorm, float fovy, float aspect, float near, float far, float scale);
Creates a perspective projection matrix (fixed point)
Undocumented
0x80003710 : __ull_rshift 0x8000373C : __ull_rem 0x80003778 : __ull_div 0x800037B4 : __ll_lshift 0x800037E0 : __ll_rem 0x8000381C : __ll_div 0x80003878 : __ll_mul 0x800038A8 : __ull_divremi 0x80003908 : __ll_mod 0x800039A4 : __ll_rshift 0x80007D00 : _Litob 0x80106550 : __d_to_ll 0x8010656C : __f_to_ll 0x80106588 : __d_to_ull 0x80106628 : __f_to_ull 0x801066C4 : __ll_to_d 0x801066DC : __ll_to_f 0x801066F4 : __ull_to_d 0x80106728 : __ull_to_f 0x8014B2D0 : __libm_qnan_f
Within code
0x8001CE60 - 0x80157D90 is code
801274A0(u32)[0x1A] Jump table for map reading functions 80127520(u16) Adult link object number 80127522(u16) Child link object number 80127524(u32) Number of objects 80127528(u32)[# objs] Object table 801162A0 Actor Table
TODO: scene table, exit table, more functions
Relative to 80212020
80212020 is a very important address, it seems to be argument 0 for many functions, is the 'base' for many variables.
Distance/typ Actual Addr Description --------------------------------------------------- 000270(u32) 80212290 Camera pointer 001C30(u32)[2][12] 80213C50 List of actors, organized by type. first word is number of actors of that type, second word is address of the first of those actors. ?(u32) 80213CE8 What actor the z-target arrow is over ?(u32) 80213CEC What actor is being z-targeted 011CC8(u32) 80223CE8 Map pointer (points to current object set iirc? someone doublecheck) 011DEA(u8) 80223E0A Current entrance number being used. 011DEB(u8) 80223E0B Number of map actors (nulled after actors are spawned iirc) 011DF8(*actorList)[] 80223E18 Pointer to map actor list with position/rotation of stuff. 0117A4(?) 802237C4 Argument 0 for SpawnObject() (this address, not value at this address)
802120E0 u32 screen top 802120E4 u32 screen bottom 802120E8 u32 screen left 802120EC u32 screen right 802120F0 f32 cam distance 802124F4 f32 fog distance 802124F8 f32 z distance 802124FC f32 unknown camera variable - leave at 1.0
RAM segments
80166FA8(u32)[(number of segments)] Segment table, value|0x80000000 = ram addr
char * segments[8] = 0x80166FA8;
Example: Segment 0x6 would be pointed to at 0x80166FC0 ( 0x6 << 2 = 0x18 + 0x80166FA8 = 0x80166FC0 )
Note: the table is for the engine's reference only, so it is not reliable at all times, it is only updated when the game needs to update it, but not necessarily as the banks are updated. Also, it does not have banks 8 - 15.
Controller
typedef struct { /* Buttons */ u16 pad; /* Joystick */ signed x : 8; signed y : 8; } Controller; 80166AF0 Player 1 80166B08 Player 2 80166B20 Player 3 80166B38 Player 4
Misc
8015E693 (s16?) Magic amount 8015E6EE (s8?) Bombs amount 80211174 (u16) Make any Non-Zero value to "freeze" all actors 802120C4 (u16) Current Scene number 802245B0 z64_actor_t Link