diff --git a/.gitignore b/.gitignore index 6769972..59d2f16 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ baserom.z64 asm assets +build .vscode diff --git a/Makefile b/Makefile index b12637c..778bdbd 100644 --- a/Makefile +++ b/Makefile @@ -68,7 +68,7 @@ ENDLINE := \n' ### Compiler Options ### -IINC := -I include -I $(BUILD_DIR)/include -I src -I asm -I lib/libreultra/include/2.0I/ +IINC := -I include -I $(BUILD_DIR)/include -I lib/libreultra/include/2.0I/ ASFLAGS := -Iinclude -EB -mtune=vr4300 -march=vr4300 CPPFLAGS := $(IINC) -D_LANGUAGE_C -D_FINALROM -DF3DEX_GBI_2 -D_MIPS_SZLONG=32 -nostdinc -mgp32 -mfp32 -mips2 diff --git a/src/common.h b/include/common.h similarity index 100% rename from src/common.h rename to include/common.h diff --git a/splat.yaml b/splat.yaml index df8bbee..93167db 100644 --- a/splat.yaml +++ b/splat.yaml @@ -46,7 +46,7 @@ segments: follows_vram: entry bss_size: 0x3AE70 subsegments: - - [0x1060, asm, "main"] + - [0x1060, c, "main"] - [0x4AC0, asm] - [0x5FC0, asm] - [0x68E0, asm] @@ -109,7 +109,7 @@ segments: - [0x1A5B0, asm] - [0x1A660, c] - [0x1A9A0, asm] - - [0x1AA00, asm, "copy_global_controller_data"] + - [0x1AA00, c] - [0x1AAA0, asm] - [0x1AD10, asm] - [0x1AFD0, asm] @@ -312,7 +312,7 @@ segments: # - [0x3F140, rodata, heapcheck] # - [0x3F170, rodata, heapcheck] - # - { start: 0x3F1B0, type: bss, vram: 0x800E9C20 } + - { start: 0x3F1B0, type: bss, vram: 0x800E9C20 } - type: code dir: overlays/overlay0 diff --git a/src/1A050.c b/src/1A050.c index c20d05a..9005417 100644 --- a/src/1A050.c +++ b/src/1A050.c @@ -10,6 +10,18 @@ INCLUDE_ASM(const s32, "1A050", func_80089C50); INCLUDE_ASM(const s32, "1A050", __init_controllers); +// u8 __init_controllers(void) { +// ? sp18; +// u8 sp28; + +// osCreateMesgQueue(&MQ_CONTROLLER, &D_800BBE60, 8); +// osSetEventMesg(5, &MQ_CONTROLLER, 0); +// osContInit(&MQ_CONTROLLER, &sp28, &sp18); +// osCreateThread(&THREAD_CONTROLLER, 5, __controller_thread_80089D9C, NULL, &MQ_800BE030, 0x73); +// osStartThread(&THREAD_CONTROLLER); +// return sp28; +// } + INCLUDE_ASM(const s32, "1A050", func_80089CF8); INCLUDE_ASM(const s32, "1A050", func_80089D5C); diff --git a/src/1A660.c b/src/1A660.c index 5eb00b2..edcfbe8 100644 --- a/src/1A660.c +++ b/src/1A660.c @@ -1,25 +1,40 @@ #include "common.h" -#include +#include + +void __start_copy_global_controller_data(void); +void __end_copy_global_controller_data(void); + +s32 __read_controller(OSContPad* data, u32 flags); +s32 __real_read_controller(void); +s32 __calls_read_controller_0(s16* arg0); extern void func_8008A354(); extern void func_8008A37C(); -extern u32 D_800C4B30; +extern s32 D_800C4B30; extern OSMesgQueue MQ_CONTROLLER; +extern OSMesgQueue MQ_800E9BF0; INCLUDE_ASM(const s32, "1A660", func_8008A260); -INCLUDE_ASM(const s32, "1A660", func_8008A334); +// INCLUDE_ASM(const s32, "1A660", func_8008A334); +extern void func_8008B1D0(u8*); +extern u8 D_800A9FF8; -INCLUDE_ASM(const s32, "1A660", __start_copy_global_controller_data); +void func_8008A334(void) { + func_8008B1D0(&D_800A9FF8); +} -INCLUDE_ASM(const s32, "1A660", __end_copy_global_controller_data); +void __start_copy_global_controller_data(void) { + osSendMesg(&MQ_800E9BF0, NULL, OS_MESG_BLOCK); +} -// INCLUDE_ASM(const s32, "1A660", __read_controller); +void __end_copy_global_controller_data(void) { + osRecvMesg(&MQ_800E9BF0, NULL, OS_MESG_BLOCK); +} - -s32 __read_controller(OSContPad* data, u32 arg1) { +s32 __read_controller(OSContPad* data, u32 flags) { s32 res; res = osContStartReadData(&MQ_CONTROLLER); @@ -27,7 +42,7 @@ s32 __read_controller(OSContPad* data, u32 arg1) { return res; osRecvMesg(&MQ_CONTROLLER, NULL, OS_MESG_BLOCK); - if (!(arg1 & D_800C4B30)) { + if (!(flags & D_800C4B30)) { func_8008A354(); osContGetReadData(data); func_8008A37C(); @@ -37,11 +52,59 @@ s32 __read_controller(OSContPad* data, u32 arg1) { return 0; } +extern OSContStatus __GLOBAL_CONT_STATUS[MAXCONTROLLERS]; +extern OSMesgQueue MQ_CONTROLLER; -INCLUDE_ASM(const s32, "1A660", __real_read_controller); +s32 __real_read_controller(void) { + s32 var_v0; -INCLUDE_ASM(const s32, "1A660", __calls_read_controller_0); + var_v0 = osContStartQuery(&MQ_CONTROLLER); + if (var_v0 == 0) { + osRecvMesg(&MQ_CONTROLLER, NULL, OS_MESG_BLOCK); + osContGetQuery(__GLOBAL_CONT_STATUS); + return 0; + } else { + return var_v0; + } +} -INCLUDE_ASM(const s32, "1A660", __calls_read_controller_1); +extern void (*D_800A9FE0)(s16); +extern OSMesgQueue MQ_800C4A00; +extern OSContPad __GLOBAL_CONTROLLER_DATA; + +s32 __calls_read_controller_0(s16* arg0) { + if (D_800C4B30 == 0) { + osRecvMesg(&MQ_800C4A00, NULL, 0); + __read_controller(&__GLOBAL_CONTROLLER_DATA, 1); + if (D_800A9FE0 != NULL) { + D_800A9FE0(*arg0); + } + osSendMesg(&MQ_800C4A00, NULL, 0); + } + return 0; +} + +typedef struct { + /* 0x0 */ u8 field_0x0[0xc]; + /* 0xC */ OSContPad* data; +} Arg___calls_read_controller_1; + +void __calls_read_controller_1(Arg___calls_read_controller_1* arg) { + __read_controller(arg->data, 0); +} + +s32 __calls_read_controller_2(s16* arg0) { + s32 var_v0; + + osRecvMesg(&MQ_800C4A00, NULL, 0); + var_v0 = __read_controller(&__GLOBAL_CONTROLLER_DATA, 0); + if (var_v0 == 0) { + if (D_800A9FE0 != NULL) { + D_800A9FE0(*arg0); + } + return 0; + } else { + return var_v0; + } +} -INCLUDE_ASM(const s32, "1A660", __calls_read_controller_2); diff --git a/src/1AA00.c b/src/1AA00.c new file mode 100644 index 0000000..c25d314 --- /dev/null +++ b/src/1AA00.c @@ -0,0 +1,31 @@ +#include "common.h" + +#include + +extern OSContPad __GLOBAL_CONTROLLER_DATA; + +extern void __end_copy_global_controller_data(); +extern void __start_copy_global_controller_data(); + +void __copy_global_controller_data(OSContPad* arg0) { + __start_copy_global_controller_data(); + bcopy(&__GLOBAL_CONTROLLER_DATA, arg0, 0x18); + __end_copy_global_controller_data(); +} + +extern void func_80089CF8(s32, s32); + +void func_8008A640(void) { + func_80089CF8(0x103, 0); +} + +extern s32 D_800A9FE0; + +void func_8008A660(s32 arg0) { + s32 mask; + + mask = osSetIntMask(OS_IM_NONE); + D_800A9FE0 = arg0; + osSetIntMask(mask); +} + diff --git a/src/ctx.h b/src/ctx.h deleted file mode 100644 index cecb347..0000000 --- a/src/ctx.h +++ /dev/null @@ -1,338 +0,0 @@ -typedef unsigned char u8; /* unsigned 8-bit */ -typedef unsigned short u16; /* unsigned 16-bit */ -typedef unsigned long u32; /* unsigned 32-bit */ -typedef unsigned long long u64; /* unsigned 64-bit */ - -typedef signed char s8; /* signed 8-bit */ -typedef short s16; /* signed 16-bit */ -typedef long s32; /* signed 32-bit */ -typedef long long s64; /* signed 64-bit */ - -typedef volatile unsigned char vu8; /* unsigned 8-bit */ -typedef volatile unsigned short vu16; /* unsigned 16-bit */ -typedef volatile unsigned long vu32; /* unsigned 32-bit */ -typedef volatile unsigned long long vu64; /* unsigned 64-bit */ - -typedef volatile signed char vs8; /* signed 8-bit */ -typedef volatile short vs16; /* signed 16-bit */ -typedef volatile long vs32; /* signed 32-bit */ -typedef volatile long long vs64; /* signed 64-bit */ - -typedef float f32; /* single prec floating point */ -typedef double f64; /* double prec floating point */ - -typedef unsigned long size_t; - -#define NULL 0 - -#define true 1 -#define false 0 - - -/* Flags to turn blocking on/off when sending/receiving message */ -#define OS_MESG_NOBLOCK 0 -#define OS_MESG_BLOCK 1 - -/* Recommended thread priorities for the system threads */ -#define OS_PRIORITY_MAX 255 -#define OS_PRIORITY_VIMGR 254 -#define OS_PRIORITY_RMON 250 -#define OS_PRIORITY_RMONSPIN 200 -#define OS_PRIORITY_PIMGR 150 -#define OS_PRIORITY_SIMGR 140 -#define OS_PRIORITY_APPMAX 127 -#define OS_PRIORITY_IDLE 0 /* Must be 0 */ - -typedef s32 OSPri; -typedef s32 OSId; -typedef union { struct { f32 f_odd; f32 f_even; } f; f64 d; } __OSfp; - -typedef struct { - u64 at, v0, v1, a0, a1, a2, a3; - u64 t0, t1, t2, t3, t4, t5, t6, t7; - u64 s0, s1, s2, s3, s4, s5, s6, s7; - u64 t8, t9, gp, sp, s8, ra; - u64 lo, hi; - u32 sr, pc, cause, badvaddr, rcp; - u32 fpcsr; - __OSfp fp0, fp2, fp4, fp6, fp8, fp10, fp12, fp14; - __OSfp fp16, fp18, fp20, fp22, fp24, fp26, fp28, fp30; -} __OSThreadContext; - -typedef struct OSThread_s { - struct OSThread_s *next; /* run/mesg queue link */ - OSPri priority; /* run/mesg queue priority */ - struct OSThread_s **queue; /* queue thread is on */ - struct OSThread_s *tlnext; /* all threads queue link */ - u16 state; /* OS_STATE_* */ - u16 flags; /* flags for rmon */ - OSId id; /* id for debugging */ - int fp; /* thread has used fp unit */ - __OSThreadContext context; /* register/interrupt mask */ -} OSThread; -/* - * Structure for message - */ -typedef void* OSMesg; - -typedef struct { - u16 button; - s8 stick_x; /* -80 <= stick_x <= 80 */ - s8 stick_y; /* -80 <= stick_y <= 80 */ - u8 errno; -} OSContPad; - -/* - * Structure for message queue - */ -typedef struct OSMesgQueue_s { - OSThread *mtqueue; /* Queue to store threads blocked - on empty mailboxes (receive) */ - OSThread *fullqueue; /* Queue to store threads blocked - on full mailboxes (send) */ - s32 validCount; /* Contains number of valid message */ - s32 first; /* Points to first valid message */ - s32 msgCount; /* Contains total # of messages */ - OSMesg *msg; /* Points to message buffer array */ -} OSMesgQueue; - -/* - * OSTranxInfo is set up for Leo Disk DMA. This info will be maintained - * by exception handler. This is how the PIMGR and the ISR communicate. - */ -typedef struct { - u32 errStatus; /* error status */ - void *dramAddr; /* RDRAM buffer address (DMA) */ - void *C2Addr; /* C2 buffer address */ - u32 sectorSize; /* size of transfering sector */ - u32 C1ErrNum; /* total # of C1 errors */ - u32 C1ErrSector[4]; /* error sectors */ -} __OSBlockInfo; - -typedef struct { - u32 cmdType; /* for disk only */ - u16 transferMode; /* Block, Track, or sector? */ - u16 blockNum; /* which block is transfering */ - s32 sectorNum; /* which sector is transfering */ - u32 devAddr; /* Device buffer address */ - u32 bmCtlShadow; /* asic bm_ctl(510) register shadow ram */ - u32 seqCtlShadow; /* asic seq_ctl(518) register shadow ram */ - __OSBlockInfo block[2]; /* bolck transfer info */ -} __OSTranxInfo; - - -typedef struct OSPiHandle_s { - struct OSPiHandle_s *next; /* point to next handle on the table */ - u8 type; /* DEVICE_TYPE_BULK for disk */ - u8 latency; /* domain latency */ - u8 pageSize; /* domain page size */ - u8 relDuration; /* domain release duration */ - u8 pulse; /* domain pulse width */ - u8 domain; /* which domain */ - u32 baseAddress; /* Domain address */ - u32 speed; /* for roms only */ - /* The following are "private" elements" */ - __OSTranxInfo transferInfo; /* for disk only */ -} OSPiHandle; - -/* - * Structure for I/O message block - */ -typedef struct { - u16 type; /* Message type */ - u8 pri; /* Message priority (High or Normal) */ - u8 status; /* Return status */ - OSMesgQueue *retQueue; /* Return message queue to notify I/O - * completion */ -} OSIoMesgHdr; - -typedef struct { - OSIoMesgHdr hdr; /* Message header */ - void * dramAddr; /* RDRAM buffer address (DMA) */ - u32 devAddr; /* Device buffer address (DMA) */ - u32 size; /* DMA transfer size in bytes */ - OSPiHandle *piHandle; /* PI device handle */ -} OSIoMesg; - -/* - * Structure for device manager block - */ -typedef struct { - s32 active; /* Status flag */ - OSThread *thread; /* Calling thread */ - OSMesgQueue *cmdQueue; /* Command queue */ - OSMesgQueue *evtQueue; /* Event queue */ - OSMesgQueue *acsQueue; /* Access queue */ - /* Raw DMA routine */ - s32 (*dma)(s32, u32, void *, u32); - s32 (*edma)(OSPiHandle *, s32, u32, void *, u32); -} OSDevMgr; - - -#define OS_SC_STACKSIZE 0x2000 - -#define OS_SC_RETRACE_MSG 1 -#define OS_SC_DONE_MSG 2 -#define OS_SC_RDP_DONE_MSG 3 -#define OS_SC_PRE_NMI_MSG 4 -#define OS_SC_LAST_MSG 4 /* this should have highest number */ -#define OS_SC_MAX_MESGS 8 - -typedef struct { - short type; - char misc[30]; -} OSScMsg; - -typedef struct { - u32 type; - u32 flags; - - u64 *ucode_boot; - u32 ucode_boot_size; - - u64 *ucode; - u32 ucode_size; - - u64 *ucode_data; - u32 ucode_data_size; - - u64 *dram_stack; - u32 dram_stack_size; - - u64 *output_buff; - u64 *output_buff_size; - - u64 *data_ptr; - u32 data_size; - - u64 *yield_data_ptr; - u32 yield_data_size; - -} OSTask_t; - -typedef union { - OSTask_t t; - long long int force_structure_alignment; -} OSTask; - -typedef struct OSScTask_s { - struct OSScTask_s *next; /* note: this must be first */ - u32 state; - u32 flags; - void *framebuffer; /* used by graphics tasks */ - - OSTask list; - OSMesgQueue *msgQ; - OSMesg msg; -} OSScTask; /* non FINALROM code */ - -/* - * OSScTask flags: - */ -#define OS_SC_NEEDS_RDP 0x0001 /* uses the RDP */ -#define OS_SC_NEEDS_RSP 0x0002 /* uses the RSP */ -#define OS_SC_DRAM_DLIST 0x0004 /* SP & DP communicate through DRAM */ -#define OS_SC_PARALLEL_TASK 0x0010 /* must be first gfx task on list */ -#define OS_SC_LAST_TASK 0x0020 /* last task in queue for frame */ -#define OS_SC_SWAPBUFFER 0x0040 /* swapbuffers when gfx task done */ - -#define OS_SC_RCP_MASK 0x0003 /* mask for needs bits */ -#define OS_SC_TYPE_MASK 0x0007 /* complete type mask */ -/* - * OSScClient: - * - * Data structure used by threads that wish to communicate to the - * scheduling thread - * - */ -typedef struct SCClient_s { - struct SCClient_s *next; /* next client in the list */ - OSMesgQueue *msgQ; /* where to send the frame msg */ -} OSScClient; - -typedef struct { - OSScMsg retraceMsg; - OSScMsg prenmiMsg; - OSMesgQueue interruptQ; - OSMesg intBuf[8]; - OSMesgQueue cmdQ; - OSMesg cmdMsgBuf[8]; - OSThread thread; - OSScClient *clientList; - OSScTask *audioListHead; - OSScTask *gfxListHead; - OSScTask *audioListTail; - OSScTask *gfxListTail; - OSScTask *curRSPTask; - OSScTask *curRDPTask; - u32 frameCount; - s32 doAudio; -} OSSched; - -/* Buttons */ -#define CONT_A 0x8000 -#define CONT_B 0x4000 -#define CONT_G 0x2000 -#define CONT_START 0x1000 -#define CONT_UP 0x0800 -#define CONT_DOWN 0x0400 -#define CONT_LEFT 0x0200 -#define CONT_RIGHT 0x0100 -#define CONT_L 0x0020 -#define CONT_R 0x0010 -#define CONT_E 0x0008 -#define CONT_D 0x0004 -#define CONT_C 0x0002 -#define CONT_F 0x0001 - -/* Nintendo's official button names */ -#define A_BUTTON CONT_A -#define B_BUTTON CONT_B -#define L_TRIG CONT_L -#define R_TRIG CONT_R -#define Z_TRIG CONT_G -#define START_BUTTON CONT_START -#define U_JPAD CONT_UP -#define L_JPAD CONT_LEFT -#define R_JPAD CONT_RIGHT -#define D_JPAD CONT_DOWN -#define U_CBUTTONS CONT_E -#define L_CBUTTONS CONT_C -#define R_CBUTTONS CONT_F -#define D_CBUTTONS CONT_D - -extern void osContGetReadData(OSContPad* data); -extern s32 osContStartReadData(OSMesgQueue *mq); -extern s32 osRecvMesg(OSMesgQueue *mq, OSMesg *msg, s32 flags); -extern void osCreateThread(OSThread *t, OSId id, void (*entry)(void *), void *arg, void *sp, OSPri p); -extern void osSetThreadPri(OSThread *t, OSPri pri); -extern void osStartThread(OSThread *t); -extern void osCreateScheduler(OSSched *s, void *stack, OSPri priority, u8 mode, u8 retraceCount); - -extern void osCreateMesgQueue(OSMesgQueue *mq, OSMesg *msg, s32 count); -extern void osSendMesg(OSMesgQueue *mq, OSMesg msg, s32 flag); -extern void osJamMesg(OSMesgQueue *mq, OSMesg msg, s32 flag); -extern s32 osRecvMesg(OSMesgQueue *mq, OSMesg *msg, s32 flag); - -extern void osInvalDCache(void *vaddr, s32 nbytes); - -extern OSPiHandle* CART_HANDLE; -extern s32 osEPiStartDma(OSPiHandle *pihandle, OSIoMesg *mb, s32 direction); -extern s32 osEPiWriteIo(OSPiHandle *pihandle, u32 devAddr, u32 data); -extern s32 osEPiReadIo(OSPiHandle *pihandle, u32 devAddr, u32 *data); - -extern void osInitialize(void); - -extern void MusFxBankSetPtrBank(void *ifxbank, void *ipbank); -extern void MusSetMasterVolume(unsigned long flags, int volume); -extern void MusFxBankInitialize(void *fxbank); - -extern void osViSetSpecialFeatures(u32 func); - -extern void boot(void* arg); -extern void idle(void* arg); -extern void main_(void* arg); - -extern void romCopy(u8* src, u8* dst, u32 len); - -extern void __calls_romCopy_8009DA50(u8* src, u8* dst, u32 len); \ No newline at end of file diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..f7411ec --- /dev/null +++ b/src/main.c @@ -0,0 +1,105 @@ +#include "common.h" + +INCLUDE_ASM(const s32, "main", func_80070C60); + +INCLUDE_ASM(const s32, "main", AddHeap); + +INCLUDE_ASM(const s32, "main", func_80070F14); + +INCLUDE_ASM(const s32, "main", __virtual_mem_alloc); + +INCLUDE_ASM(const s32, "main", func_800710DC); + +INCLUDE_ASM(const s32, "main", func_80071288); + +INCLUDE_ASM(const s32, "main", func_800712C4); + +INCLUDE_ASM(const s32, "main", func_800713EC); + +INCLUDE_ASM(const s32, "main", HIsAllocatedPointer); + +INCLUDE_ASM(const s32, "main", func_80071634); + +INCLUDE_ASM(const s32, "main", func_8007163C); + +INCLUDE_ASM(const s32, "main", func_80071644); + +INCLUDE_ASM(const s32, "main", func_80071950); + +INCLUDE_ASM(const s32, "main", func_800719E8); + +INCLUDE_ASM(const s32, "main", func_80071A3C); + +INCLUDE_ASM(const s32, "main", func_80071A74); + +INCLUDE_ASM(const s32, "main", func_80071B9C); + +INCLUDE_ASM(const s32, "main", func_80071C04); + +INCLUDE_ASM(const s32, "main", func_80071E74); + +INCLUDE_ASM(const s32, "main", main_); + +INCLUDE_ASM(const s32, "main", func_80072398); + +INCLUDE_ASM(const s32, "main", func_80072710); + +INCLUDE_ASM(const s32, "main", func_80072738); + +INCLUDE_ASM(const s32, "main", func_800727D8); + +INCLUDE_ASM(const s32, "main", func_8007284C); + +INCLUDE_ASM(const s32, "main", func_800728BC); + +INCLUDE_ASM(const s32, "main", func_80072900); + +INCLUDE_ASM(const s32, "main", func_80072944); + +INCLUDE_ASM(const s32, "main", __calls_copy_controller_data); + +INCLUDE_ASM(const s32, "main", func_8007307C); + +INCLUDE_ASM(const s32, "main", func_80073164); + +INCLUDE_ASM(const s32, "main", func_8007328C); + +INCLUDE_ASM(const s32, "main", func_8007337C); + +INCLUDE_ASM(const s32, "main", func_8007338C); + +INCLUDE_ASM(const s32, "main", func_80073398); + +INCLUDE_ASM(const s32, "main", func_800733F8); + +INCLUDE_ASM(const s32, "main", func_800737A0); + +INCLUDE_ASM(const s32, "main", func_8007382C); + +INCLUDE_ASM(const s32, "main", func_80073AE4); + +INCLUDE_ASM(const s32, "main", func_80073BD0); + +INCLUDE_ASM(const s32, "main", func_80073C48); + +INCLUDE_ASM(const s32, "main", func_80073CB0); + +INCLUDE_ASM(const s32, "main", func_80073ED8); + +INCLUDE_ASM(const s32, "main", func_80073F58); + +INCLUDE_ASM(const s32, "main", func_80073FD4); + +INCLUDE_ASM(const s32, "main", func_80074050); + +INCLUDE_ASM(const s32, "main", func_80074080); + +INCLUDE_ASM(const s32, "main", func_800740F0); + +INCLUDE_ASM(const s32, "main", func_800741A8); + +INCLUDE_ASM(const s32, "main", func_8007422C); + +INCLUDE_ASM(const s32, "main", func_800742F4); + +INCLUDE_ASM(const s32, "main", func_80074494); diff --git a/symbol_addrs.txt b/symbol_addrs.txt index 6f5f551..bf35a1b 100644 --- a/symbol_addrs.txt +++ b/symbol_addrs.txt @@ -9,6 +9,8 @@ __inc_menu_timer = 0x8019BCEC; // type:func rom:0x1D21EC __calls_inc_menu_timer = 0x80177A38; // rom:0x4D938 __MENU_INDEX = 0x801BA94C; +__GLOBAL_CONT_STATUS = 0x800C4B38; + musCurrentPtrBank = 0x800B182C; osViModeTable = 0x800AA7E0; @@ -167,13 +169,13 @@ proutSprintf = 0x80093508; osSyncPrintf = 0x80093540; rmonPrintf = 0x80093554; -bzero = 0x80093380; strchr = 0x80093420; strlen = 0x80093460; memcpy = 0x80093484; -_bcmp = 0x80092F50; -_bcopy = 0x80093060; +bcopy = 0x80093060; +bcmp = 0x80092F50; +bzero = 0x80093380; MusHandlePause = 0x80081EA4; MusHandleUnpause = 0x80081EC8;