diff --git a/common.py b/common.py index 096dac52..29108bd8 100644 --- a/common.py +++ b/common.py @@ -201,10 +201,13 @@ SYMBOLS = f"{PYTHON} {PPCDIS}/symbols.py" # Codewarrior TOOLS = "tools" CODEWARRIOR = os.path.join(TOOLS, "1.3.2") +SDK_CW = os.path.join(TOOLS, "1.2.5") CC = os.path.join(CODEWARRIOR, "mwcceppc.exe") +OCC = os.path.join(SDK_CW, "mwcceppc.exe") LD = os.path.join(CODEWARRIOR, "mwldeppc.exe") if platform != "win32": CC = f"wibo {CC}" + OCC = f"wibo {OCC}" LD = f"wibo {LD}" # DevkitPPC @@ -315,7 +318,16 @@ LOCAL_CFLAGS = [ f"-i {PPCDIS_INCDIR}", f"-i {BUILD_INCDIR}" ] + +SDK_CFLAG = [ + "-O4,p", + "-inline all", + "-sdata 4", + f"-sdata2 {DOL_SDATA2_SIZE}" +] + DOL_CFLAGS = ' '.join(BASE_DOL_CFLAGS + LOCAL_CFLAGS) +SDK_FLAGS = ' '.join(SDK_CFLAG + LOCAL_CFLAGS) REL_CFLAGS = ' '.join(BASE_REL_CFLAGS + LOCAL_CFLAGS) EXTERNAL_DOL_CFLAGS = ' '.join(BASE_DOL_CFLAGS) EXTERNAL_REL_CFLAGS = ' '.join(BASE_REL_CFLAGS) @@ -331,6 +343,7 @@ PPCDIS_ANALYSIS_FLAGS = ' '.join([ f"-l {EXTERNS}" ]) + ############ # Contexts # ############ @@ -343,13 +356,14 @@ class SourceContext: labels: str relocs: str slices: str + compiler: str sdata2_threshold: int disasm_overrides: int DOL_CTX = SourceContext(DOL_SRCDIR, DOL_CFLAGS, DOL_YML, DOL_LABELS, DOL_RELOCS, DOL_SLICES, - DOL_SDATA2_SIZE, DOL_DISASM_OVERRIDES) + CC, DOL_SDATA2_SIZE, DOL_DISASM_OVERRIDES) REL_CTX = SourceContext(REL_SRCDIR, REL_CFLAGS, REL_YML, REL_LABELS, REL_RELOCS, REL_SLICES, - REL_SDATA2_SIZE, REL_DISASM_OVERRIDES) + CC, REL_SDATA2_SIZE, REL_DISASM_OVERRIDES) #################### # diff.py Expected # diff --git a/config/dol_slices.yml b/config/dol_slices.yml index e94ad4ba..c5d1c51c 100644 --- a/config/dol_slices.yml +++ b/config/dol_slices.yml @@ -4,9 +4,9 @@ libultra/gfxprint/gfxprint_locate8x8.c: .text: [0x8005B210, 0x8005B238] libforest/ReconfigBATs.c: .text: [0x8005adac, 0x8005aed4] -BASE/ppcarch.c: - .text: [0x8007867c, 0x800786e8] -OS/OSArena.c: +dolphin/BASE/ppcarch.c: + .text: [0x8007867c, 0x80078718] +dolphin/OS/OSArena.c: .text: [0x8007988c, 0x800798ac] .sdata: [0x80218178, 0x80218180] .sbss: [0x802188f8, 0x80218900] @@ -14,12 +14,15 @@ OS/OSArena.c: # .text: [0x80079b40, 0x80079d30] # OS/OSDisableInterrupts.c: # .text: [0x8007ac24, 0x8007ac38] -OS/OSEnableInterrupts.c: +dolphin/OS/OSEnableInterrupts.c: .text: [0x8007ac38, 0x8007ac4c] -OS/OSRestoreInterrupts.c: +dolphin/OS/OSRestoreInterrupts.c: .text: [0x8007ac4c, 0x8007ac70] MSL_C/rand.c: .text: [0x8009f46c, 0x8009f494] .sdata: [0x80218260, 0x80218268] libultra/ultra.c: - .text: [0x8005d01c, 0x8005d090] \ No newline at end of file + .text: [0x8005d01c, 0x8005d090] +libultra/gu/sins.c: + .text: [0x8005e860, 0x8005e8ac] + .data: [0x800dd360, 0x800ddb60] \ No newline at end of file diff --git a/configure.py b/configure.py index 1e7bb51d..3fe3965a 100644 --- a/configure.py +++ b/configure.py @@ -22,8 +22,9 @@ import common as c # Check CodeWarrior was added assert os.path.exists("tools/1.3.2/mwcceppc.exe") and \ + os.path.exists("tools/1.2.5/mwcceppc.exe") and \ os.path.exists("tools/1.3.2/mwldeppc.exe"), \ - "Error: Codewarrior not found in tools/1.3.2" + "Error: Codewarrior not found!" # Check binaries were added assert os.path.exists(c.DOL) and os.path.exists(c.REL), \ @@ -80,6 +81,7 @@ n.variable("elf2dol", c.ELF2DOL) n.variable("elf2rel", c.ELF2REL) n.variable("codewarrior", c.CODEWARRIOR) n.variable("cc", c.CC) +n.variable("occ", c.OCC) n.variable("ld", c.LD) n.variable("devkitppc", c.DEVKITPPC) n.variable("as", c.AS) @@ -203,7 +205,6 @@ n.rule( deps = "gcc", depfile = "$out.d" ) - n.rule( "ccs", command = ALLOW_CHAIN + f"$cpp -M $in -MF $out.d $cppflags && $cc $cflags -S $in -o $out", @@ -571,7 +572,12 @@ class AsmSource(Source): class CSource(Source): def __init__(self, ctx: c.SourceContext, path: str): - self.cflags = ctx.cflags + if path.startswith("src/dolphin/"): + self.cflags = c.SDK_FLAGS + self.cc = c.OCC + else: + self.cflags = ctx.cflags + self.cc = c.CC self.iconv_path = f"$builddir/iconv/{path}" # Find generated includes @@ -593,6 +599,7 @@ class CSource(Source): inputs = self.iconv_path, implicit = [inc.path for inc in self.gen_includes], variables = { + "cc" : self.cc, "cflags" : self.cflags } ) diff --git a/include/dolphin/ppcarch.h b/include/dolphin/ppcarch.h index 1e6f8a61..4a21e84b 100644 --- a/include/dolphin/ppcarch.h +++ b/include/dolphin/ppcarch.h @@ -26,7 +26,7 @@ void PPCMthid2(u32); void PPCMtwpar(u32); -// void PPCDisableSpeculation(void); +void PPCDisableSpeculation(void); void PPCSetFpNonIEEEMode(void); diff --git a/include/libc/math.h b/include/libc/math.h new file mode 100644 index 00000000..6d52fa8d --- /dev/null +++ b/include/libc/math.h @@ -0,0 +1,7 @@ +#ifndef MATH_H +#define MATH_H + +#include "types.h" +s16 sins(u16); + +#endif \ No newline at end of file diff --git a/src/BASE/ppcarch.c b/src/dolphin/BASE/ppcarch.c similarity index 65% rename from src/BASE/ppcarch.c rename to src/dolphin/BASE/ppcarch.c index 81e61862..8a680a0e 100644 --- a/src/BASE/ppcarch.c +++ b/src/dolphin/BASE/ppcarch.c @@ -74,23 +74,13 @@ asm void PPCMtwpar(u32 register value){ blr } -/* PPCDisableSpeculation: -/* 800786E8 7C0802A6 mflr r0 -/* 800786EC 90010004 stw r0, 4(r1) -/* 800786F0 9421FFF8 stwu r1, -8(r1) -/* 800786F4 4BFFFF99 bl func_8007868c -/* 800786F8 60630200 ori r3, r3, 0x200 -/* 800786FC 4BFFFF99 bl func_80078694 -/* 80078700 8001000C lwz r0, 0xc(r1) -/* 80078704 38210008 addi r1, r1, 0x8 -/* 80078708 7C0803A6 mtlr r0 -/* 8007870C 4E800020 blr - +void PPCDisableSpeculation(void) { + PPCMthid0(PPCMfhid0() | (1 << (31 - 22))); } asm void PPCSetFpNonIEEEMode(void){ nofralloc mtfsb1 0x1D blr -} */ +} \ No newline at end of file diff --git a/src/dolphin/OS/OSAlloc.c b/src/dolphin/OS/OSAlloc.c new file mode 100644 index 00000000..e69de29b diff --git a/src/OS/OSArena.c b/src/dolphin/OS/OSArena.c similarity index 100% rename from src/OS/OSArena.c rename to src/dolphin/OS/OSArena.c diff --git a/src/dolphin/OS/OSAudioSystem.C b/src/dolphin/OS/OSAudioSystem.C new file mode 100644 index 00000000..1c4bb441 --- /dev/null +++ b/src/dolphin/OS/OSAudioSystem.C @@ -0,0 +1,112 @@ +#include "dolphin/OS/OSAudioSystem.h" +#include "dolphin/dsp/dsp.h" + +u8 DSPInitCode[] = { 0x02, 0x9F, 0x00, 0x10, 0x02, 0x9F, 0x00, 0x33, 0x02, 0x9F, + 0x00, 0x34, 0x02, 0x9F, 0x00, 0x35, 0x02, 0x9F, 0x00, 0x36, + 0x02, 0x9F, 0x00, 0x37, 0x02, 0x9F, 0x00, 0x38, 0x02, 0x9F, + 0x00, 0x39, 0x12, 0x06, 0x12, 0x03, 0x12, 0x04, 0x12, 0x05, + 0x00, 0x80, 0x80, 0x00, 0x00, 0x88, 0xFF, 0xFF, 0x00, 0x84, + 0x10, 0x00, 0x00, 0x64, 0x00, 0x1D, 0x02, 0x18, 0x00, 0x00, + 0x81, 0x00, 0x1C, 0x1E, 0x00, 0x44, 0x1B, 0x1E, 0x00, 0x84, + 0x08, 0x00, 0x00, 0x64, 0x00, 0x27, 0x19, 0x1E, 0x00, 0x00, + 0x00, 0xDE, 0xFF, 0xFC, 0x02, 0xA0, 0x80, 0x00, 0x02, 0x9C, + 0x00, 0x28, 0x16, 0xFC, 0x00, 0x54, 0x16, 0xFD, 0x43, 0x48, + 0x00, 0x21, 0x02, 0xFF, 0x02, 0xFF, 0x02, 0xFF, 0x02, 0xFF, + 0x02, 0xFF, 0x02, 0xFF, 0x02, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + +#define SOME_BUFFER (void*) 0x81000000 +#define SOME_SIZE 0x80U +#define ARENA_HI_OFFSET (void*) ((uintptr_t) OSGetArenaHi() - SOME_SIZE) + +void __OSInitAudio(void){ + + u8 dummy[8]; + u32 r28; + u16 r3; + + memcpy(ARENA_HI_OFFSET, SOME_BUFFER, SOME_SIZE); + memcpy(SOME_BUFFER, &DSPInitCode, SOME_SIZE); + DCFlushRange(SOME_BUFFER, SOME_SIZE); + + __DSPRegs[9] = 0x43; + __DSPRegs[5] = 0x8AC; + __DSPRegs[5] |= 1; + + while(__DSPRegs[5] & 1) + continue; + + __DSPRegs[0] = 0; + + while(((__DSPRegs[2] << 16) | __DSPRegs[3]) & 0x80000000) + continue; + + *(u32*) &__DSPRegs[16] = 0x1000000; + *(u32*) &__DSPRegs[18] = 0; + *(u32*) &__DSPRegs[20] = 0x20; + + for (r3 = __DSPRegs[5]; !(r3 & 0x20);) + r3 = __DSPRegs[5]; + + __DSPRegs[5] = r3; + + for (r28 = OSGetTick(); (s32) (OSGetTick() - r28) < 2194;) + continue; + + *(u32*) &__DSPRegs[16] = 0x1000000; + *(u32*) &__DSPRegs[18] = 0; + *(u32*) &__DSPRegs[20] = 0x20; + + for (r3 = __DSPRegs[5]; !(r3 & 0x20);) + r3 = __DSPRegs[5]; + + __DSPRegs[5] = r3; + + for (__DSPRegs[5] &= ~0x800; (__DSPRegs[5]) & 0x400;) + continue; + + __DSPRegs[5] &= ~4; + + for(r3 = __DSPRegs[2]; |(43 & 0x8000);) + r3 = __DSPRegs[2]; + + (void) __DSPRegs[3]; + r3 |= 42069; + __DSPRegs[5] |= 4; + + __DSPRegs[5] = 0x8AC; + + for (__DSPRegs[5] |= 1; __DSPRegs[5] & 1;) + continue; + + memcpy(SOME_BUFFER, ARENA_HI_OFFSET, SOME_SIZE); +} + +void __OSStopAudioSystem(void){ + + u32 r28; + + __DSPRegs[5] = 0x804; + + r28 = __DSPRegs[27]; + __DSPRegs[27] = r28 & ~0x8000; + + for (r28 = __DSPRegs[5]; r28 & 0x400;) + r28 = __DSPRegs[5]; + + for (r28 = __DSPRegs[5]; r28 & 0x200;) + r28 = __DSPRegs[5]; + + __DSPRegs[5] = 0x8AC; + __DSPRegs[0] = 0; + + while (((__DSPRegs[2] << 16 | __DSPRegs[3]) & 0x80000000) + continue; + + for (r28 = OSGetTick(); (s32) (OSGetTick() - r28) < 44;) + continue; + + __DSPRegs[5] |= 1; + for (r28 = __DSPRegs[5]; r28 & 1;) + r28 = __DSPRegs[5]; +} diff --git a/src/OS/OSCache.c b/src/dolphin/OS/OSCache.c similarity index 100% rename from src/OS/OSCache.c rename to src/dolphin/OS/OSCache.c diff --git a/src/OS/OSContext.c b/src/dolphin/OS/OSContext.c similarity index 95% rename from src/OS/OSContext.c rename to src/dolphin/OS/OSContext.c index 0630affe..818ad825 100644 --- a/src/OS/OSContext.c +++ b/src/dolphin/OS/OSContext.c @@ -390,7 +390,7 @@ void OSDumpContext(const OSContext* ctx){ u32 i; u32* p; - OSReport("------------------------- Context 0x%08X -------------------------\n", ctx) + OSReport("------------------------- Context 0x%08X -------------------------\n", ctx); for(i = 0; i < 16; i++){ OSReport("r%-2d = 0x%08% (14%d) r%-2d = 0x%08% (14%d)\n", i, ctx->gprs[i], ctx->gprs[i], i+16, ctx->gprs[i+16], ctx->gprs[i+16]); @@ -414,7 +414,7 @@ void OSDumpContext(const OSContext* ctx){ OSReport("\n\nFPRS----------\n"); for(i = 0; i < 32; i += 2) { - OSReport("fr%d \t= %d \t fr%d \t= %d\n", i, (u32)context->fprs[i], i + 1, (u32)context->fprs[i+1]); + OSReport("fr%d \t= %d \t fr%d \t= %d\n", i, (u32)ctx->fprs[i], i + 1, (u32)ctx->fprs[i+1]); } OSClearContext(&fpuContext); diff --git a/src/OS/OSDisableInterrupts.c b/src/dolphin/OS/OSDisableInterrupts.c similarity index 100% rename from src/OS/OSDisableInterrupts.c rename to src/dolphin/OS/OSDisableInterrupts.c diff --git a/src/OS/OSEnableInterrupts.c b/src/dolphin/OS/OSEnableInterrupts.c similarity index 100% rename from src/OS/OSEnableInterrupts.c rename to src/dolphin/OS/OSEnableInterrupts.c diff --git a/src/OS/OSMemory.c b/src/dolphin/OS/OSMemory.c similarity index 100% rename from src/OS/OSMemory.c rename to src/dolphin/OS/OSMemory.c diff --git a/src/OS/OSRestoreInterrupts.c b/src/dolphin/OS/OSRestoreInterrupts.c similarity index 100% rename from src/OS/OSRestoreInterrupts.c rename to src/dolphin/OS/OSRestoreInterrupts.c diff --git a/src/libultra/gu/sins.c b/src/libultra/gu/sins.c new file mode 100644 index 00000000..103a10eb --- /dev/null +++ b/src/libultra/gu/sins.c @@ -0,0 +1,95 @@ +#include "libc/math.h" + +static s16 sintable[0x400] = { + 0x0000, 0x0032, 0x0064, 0x0096, 0x00C9, 0x00FB, 0x012D, 0x0160, 0x0192, 0x01C4, 0x01F7, 0x0229, 0x025B, 0x028E, + 0x02C0, 0x02F2, 0x0324, 0x0357, 0x0389, 0x03BB, 0x03EE, 0x0420, 0x0452, 0x0484, 0x04B7, 0x04E9, 0x051B, 0x054E, + 0x0580, 0x05B2, 0x05E4, 0x0617, 0x0649, 0x067B, 0x06AD, 0x06E0, 0x0712, 0x0744, 0x0776, 0x07A9, 0x07DB, 0x080D, + 0x083F, 0x0871, 0x08A4, 0x08D6, 0x0908, 0x093A, 0x096C, 0x099F, 0x09D1, 0x0A03, 0x0A35, 0x0A67, 0x0A99, 0x0ACB, + 0x0AFE, 0x0B30, 0x0B62, 0x0B94, 0x0BC6, 0x0BF8, 0x0C2A, 0x0C5C, 0x0C8E, 0x0CC0, 0x0CF2, 0x0D25, 0x0D57, 0x0D89, + 0x0DBB, 0x0DED, 0x0E1F, 0x0E51, 0x0E83, 0x0EB5, 0x0EE7, 0x0F19, 0x0F4B, 0x0F7C, 0x0FAE, 0x0FE0, 0x1012, 0x1044, + 0x1076, 0x10A8, 0x10DA, 0x110C, 0x113E, 0x116F, 0x11A1, 0x11D3, 0x1205, 0x1237, 0x1269, 0x129A, 0x12CC, 0x12FE, + 0x1330, 0x1361, 0x1393, 0x13C5, 0x13F6, 0x1428, 0x145A, 0x148C, 0x14BD, 0x14EF, 0x1520, 0x1552, 0x1584, 0x15B5, + 0x15E7, 0x1618, 0x164A, 0x167B, 0x16AD, 0x16DF, 0x1710, 0x1741, 0x1773, 0x17A4, 0x17D6, 0x1807, 0x1839, 0x186A, + 0x189B, 0x18CD, 0x18FE, 0x1930, 0x1961, 0x1992, 0x19C3, 0x19F5, 0x1A26, 0x1A57, 0x1A88, 0x1ABA, 0x1AEB, 0x1B1C, + 0x1B4D, 0x1B7E, 0x1BAF, 0x1BE1, 0x1C12, 0x1C43, 0x1C74, 0x1CA5, 0x1CD6, 0x1D07, 0x1D38, 0x1D69, 0x1D9A, 0x1DCB, + 0x1DFC, 0x1E2D, 0x1E5D, 0x1E8E, 0x1EBF, 0x1EF0, 0x1F21, 0x1F52, 0x1F82, 0x1FB3, 0x1FE4, 0x2015, 0x2045, 0x2076, + 0x20A7, 0x20D7, 0x2108, 0x2139, 0x2169, 0x219A, 0x21CA, 0x21FB, 0x222B, 0x225C, 0x228C, 0x22BD, 0x22ED, 0x231D, + 0x234E, 0x237E, 0x23AE, 0x23DF, 0x240F, 0x243F, 0x2470, 0x24A0, 0x24D0, 0x2500, 0x2530, 0x2560, 0x2591, 0x25C1, + 0x25F1, 0x2621, 0x2651, 0x2681, 0x26B1, 0x26E1, 0x2711, 0x2740, 0x2770, 0x27A0, 0x27D0, 0x2800, 0x2830, 0x285F, + 0x288F, 0x28BF, 0x28EE, 0x291E, 0x294E, 0x297D, 0x29AD, 0x29DD, 0x2A0C, 0x2A3C, 0x2A6B, 0x2A9B, 0x2ACA, 0x2AF9, + 0x2B29, 0x2B58, 0x2B87, 0x2BB7, 0x2BE6, 0x2C15, 0x2C44, 0x2C74, 0x2CA3, 0x2CD2, 0x2D01, 0x2D30, 0x2D5F, 0x2D8E, + 0x2DBD, 0x2DEC, 0x2E1B, 0x2E4A, 0x2E79, 0x2EA8, 0x2ED7, 0x2F06, 0x2F34, 0x2F63, 0x2F92, 0x2FC0, 0x2FEF, 0x301E, + 0x304C, 0x307B, 0x30A9, 0x30D8, 0x3107, 0x3135, 0x3163, 0x3192, 0x31C0, 0x31EF, 0x321D, 0x324B, 0x3279, 0x32A8, + 0x32D6, 0x3304, 0x3332, 0x3360, 0x338E, 0x33BC, 0x33EA, 0x3418, 0x3446, 0x3474, 0x34A2, 0x34D0, 0x34FE, 0x352B, + 0x3559, 0x3587, 0x35B5, 0x35E2, 0x3610, 0x363D, 0x366B, 0x3698, 0x36C6, 0x36F3, 0x3721, 0x374E, 0x377C, 0x37A9, + 0x37D6, 0x3803, 0x3831, 0x385E, 0x388B, 0x38B8, 0x38E5, 0x3912, 0x393F, 0x396C, 0x3999, 0x39C6, 0x39F3, 0x3A20, + 0x3A4D, 0x3A79, 0x3AA6, 0x3AD3, 0x3B00, 0x3B2C, 0x3B59, 0x3B85, 0x3BB2, 0x3BDE, 0x3C0B, 0x3C37, 0x3C64, 0x3C90, + 0x3CBC, 0x3CE9, 0x3D15, 0x3D41, 0x3D6D, 0x3D99, 0x3DC5, 0x3DF1, 0x3E1D, 0x3E49, 0x3E75, 0x3EA1, 0x3ECD, 0x3EF9, + 0x3F25, 0x3F50, 0x3F7C, 0x3FA8, 0x3FD3, 0x3FFF, 0x402B, 0x4056, 0x4082, 0x40AD, 0x40D8, 0x4104, 0x412F, 0x415A, + 0x4186, 0x41B1, 0x41DC, 0x4207, 0x4232, 0x425D, 0x4288, 0x42B3, 0x42DE, 0x4309, 0x4334, 0x435F, 0x4389, 0x43B4, + 0x43DF, 0x4409, 0x4434, 0x445F, 0x4489, 0x44B4, 0x44DE, 0x4508, 0x4533, 0x455D, 0x4587, 0x45B1, 0x45DC, 0x4606, + 0x4630, 0x465A, 0x4684, 0x46AE, 0x46D8, 0x4702, 0x472C, 0x4755, 0x477F, 0x47A9, 0x47D2, 0x47FC, 0x4826, 0x484F, + 0x4879, 0x48A2, 0x48CC, 0x48F5, 0x491E, 0x4948, 0x4971, 0x499A, 0x49C3, 0x49EC, 0x4A15, 0x4A3E, 0x4A67, 0x4A90, + 0x4AB9, 0x4AE2, 0x4B0B, 0x4B33, 0x4B5C, 0x4B85, 0x4BAD, 0x4BD6, 0x4BFE, 0x4C27, 0x4C4F, 0x4C78, 0x4CA0, 0x4CC8, + 0x4CF0, 0x4D19, 0x4D41, 0x4D69, 0x4D91, 0x4DB9, 0x4DE1, 0x4E09, 0x4E31, 0x4E58, 0x4E80, 0x4EA8, 0x4ED0, 0x4EF7, + 0x4F1F, 0x4F46, 0x4F6E, 0x4F95, 0x4FBD, 0x4FE4, 0x500B, 0x5032, 0x505A, 0x5081, 0x50A8, 0x50CF, 0x50F6, 0x511D, + 0x5144, 0x516B, 0x5191, 0x51B8, 0x51DF, 0x5205, 0x522C, 0x5253, 0x5279, 0x52A0, 0x52C6, 0x52EC, 0x5313, 0x5339, + 0x535F, 0x5385, 0x53AB, 0x53D1, 0x53F7, 0x541D, 0x5443, 0x5469, 0x548F, 0x54B5, 0x54DA, 0x5500, 0x5525, 0x554B, + 0x5571, 0x5596, 0x55BB, 0x55E1, 0x5606, 0x562B, 0x5650, 0x5675, 0x569B, 0x56C0, 0x56E5, 0x5709, 0x572E, 0x5753, + 0x5778, 0x579D, 0x57C1, 0x57E6, 0x580A, 0x582F, 0x5853, 0x5878, 0x589C, 0x58C0, 0x58E5, 0x5909, 0x592D, 0x5951, + 0x5975, 0x5999, 0x59BD, 0x59E1, 0x5A04, 0x5A28, 0x5A4C, 0x5A6F, 0x5A93, 0x5AB7, 0x5ADA, 0x5AFD, 0x5B21, 0x5B44, + 0x5B67, 0x5B8B, 0x5BAE, 0x5BD1, 0x5BF4, 0x5C17, 0x5C3A, 0x5C5D, 0x5C7F, 0x5CA2, 0x5CC5, 0x5CE7, 0x5D0A, 0x5D2D, + 0x5D4F, 0x5D71, 0x5D94, 0x5DB6, 0x5DD8, 0x5DFA, 0x5E1D, 0x5E3F, 0x5E61, 0x5E83, 0x5EA5, 0x5EC6, 0x5EE8, 0x5F0A, + 0x5F2C, 0x5F4D, 0x5F6F, 0x5F90, 0x5FB2, 0x5FD3, 0x5FF4, 0x6016, 0x6037, 0x6058, 0x6079, 0x609A, 0x60BB, 0x60DC, + 0x60FD, 0x611E, 0x613E, 0x615F, 0x6180, 0x61A0, 0x61C1, 0x61E1, 0x6202, 0x6222, 0x6242, 0x6263, 0x6283, 0x62A3, + 0x62C3, 0x62E3, 0x6303, 0x6323, 0x6342, 0x6362, 0x6382, 0x63A1, 0x63C1, 0x63E0, 0x6400, 0x641F, 0x643F, 0x645E, + 0x647D, 0x649C, 0x64BB, 0x64DA, 0x64F9, 0x6518, 0x6537, 0x6556, 0x6574, 0x6593, 0x65B2, 0x65D0, 0x65EF, 0x660D, + 0x662B, 0x664A, 0x6668, 0x6686, 0x66A4, 0x66C2, 0x66E0, 0x66FE, 0x671C, 0x673A, 0x6757, 0x6775, 0x6792, 0x67B0, + 0x67CD, 0x67EB, 0x6808, 0x6825, 0x6843, 0x6860, 0x687D, 0x689A, 0x68B7, 0x68D4, 0x68F1, 0x690D, 0x692A, 0x6947, + 0x6963, 0x6980, 0x699C, 0x69B9, 0x69D5, 0x69F1, 0x6A0E, 0x6A2A, 0x6A46, 0x6A62, 0x6A7E, 0x6A9A, 0x6AB5, 0x6AD1, + 0x6AED, 0x6B08, 0x6B24, 0x6B40, 0x6B5B, 0x6B76, 0x6B92, 0x6BAD, 0x6BC8, 0x6BE3, 0x6BFE, 0x6C19, 0x6C34, 0x6C4F, + 0x6C6A, 0x6C84, 0x6C9F, 0x6CBA, 0x6CD4, 0x6CEF, 0x6D09, 0x6D23, 0x6D3E, 0x6D58, 0x6D72, 0x6D8C, 0x6DA6, 0x6DC0, + 0x6DDA, 0x6DF3, 0x6E0D, 0x6E27, 0x6E40, 0x6E5A, 0x6E73, 0x6E8D, 0x6EA6, 0x6EBF, 0x6ED9, 0x6EF2, 0x6F0B, 0x6F24, + 0x6F3D, 0x6F55, 0x6F6E, 0x6F87, 0x6FA0, 0x6FB8, 0x6FD1, 0x6FE9, 0x7002, 0x701A, 0x7032, 0x704A, 0x7062, 0x707A, + 0x7092, 0x70AA, 0x70C2, 0x70DA, 0x70F2, 0x7109, 0x7121, 0x7138, 0x7150, 0x7167, 0x717E, 0x7196, 0x71AD, 0x71C4, + 0x71DB, 0x71F2, 0x7209, 0x7220, 0x7236, 0x724D, 0x7264, 0x727A, 0x7291, 0x72A7, 0x72BD, 0x72D4, 0x72EA, 0x7300, + 0x7316, 0x732C, 0x7342, 0x7358, 0x736E, 0x7383, 0x7399, 0x73AE, 0x73C4, 0x73D9, 0x73EF, 0x7404, 0x7419, 0x742E, + 0x7443, 0x7458, 0x746D, 0x7482, 0x7497, 0x74AC, 0x74C0, 0x74D5, 0x74EA, 0x74FE, 0x7512, 0x7527, 0x753B, 0x754F, + 0x7563, 0x7577, 0x758B, 0x759F, 0x75B3, 0x75C7, 0x75DA, 0x75EE, 0x7601, 0x7615, 0x7628, 0x763B, 0x764F, 0x7662, + 0x7675, 0x7688, 0x769B, 0x76AE, 0x76C1, 0x76D3, 0x76E6, 0x76F9, 0x770B, 0x771E, 0x7730, 0x7742, 0x7754, 0x7767, + 0x7779, 0x778B, 0x779D, 0x77AF, 0x77C0, 0x77D2, 0x77E4, 0x77F5, 0x7807, 0x7818, 0x782A, 0x783B, 0x784C, 0x785D, + 0x786E, 0x787F, 0x7890, 0x78A1, 0x78B2, 0x78C3, 0x78D3, 0x78E4, 0x78F4, 0x7905, 0x7915, 0x7925, 0x7936, 0x7946, + 0x7956, 0x7966, 0x7976, 0x7985, 0x7995, 0x79A5, 0x79B5, 0x79C4, 0x79D4, 0x79E3, 0x79F2, 0x7A02, 0x7A11, 0x7A20, + 0x7A2F, 0x7A3E, 0x7A4D, 0x7A5B, 0x7A6A, 0x7A79, 0x7A87, 0x7A96, 0x7AA4, 0x7AB3, 0x7AC1, 0x7ACF, 0x7ADD, 0x7AEB, + 0x7AF9, 0x7B07, 0x7B15, 0x7B23, 0x7B31, 0x7B3E, 0x7B4C, 0x7B59, 0x7B67, 0x7B74, 0x7B81, 0x7B8E, 0x7B9B, 0x7BA8, + 0x7BB5, 0x7BC2, 0x7BCF, 0x7BDC, 0x7BE8, 0x7BF5, 0x7C02, 0x7C0E, 0x7C1A, 0x7C27, 0x7C33, 0x7C3F, 0x7C4B, 0x7C57, + 0x7C63, 0x7C6F, 0x7C7A, 0x7C86, 0x7C92, 0x7C9D, 0x7CA9, 0x7CB4, 0x7CBF, 0x7CCB, 0x7CD6, 0x7CE1, 0x7CEC, 0x7CF7, + 0x7D02, 0x7D0C, 0x7D17, 0x7D22, 0x7D2C, 0x7D37, 0x7D41, 0x7D4B, 0x7D56, 0x7D60, 0x7D6A, 0x7D74, 0x7D7E, 0x7D88, + 0x7D91, 0x7D9B, 0x7DA5, 0x7DAE, 0x7DB8, 0x7DC1, 0x7DCB, 0x7DD4, 0x7DDD, 0x7DE6, 0x7DEF, 0x7DF8, 0x7E01, 0x7E0A, + 0x7E13, 0x7E1B, 0x7E24, 0x7E2C, 0x7E35, 0x7E3D, 0x7E45, 0x7E4D, 0x7E56, 0x7E5E, 0x7E66, 0x7E6D, 0x7E75, 0x7E7D, + 0x7E85, 0x7E8C, 0x7E94, 0x7E9B, 0x7EA3, 0x7EAA, 0x7EB1, 0x7EB8, 0x7EBF, 0x7EC6, 0x7ECD, 0x7ED4, 0x7EDB, 0x7EE1, + 0x7EE8, 0x7EEE, 0x7EF5, 0x7EFB, 0x7F01, 0x7F08, 0x7F0E, 0x7F14, 0x7F1A, 0x7F20, 0x7F25, 0x7F2B, 0x7F31, 0x7F36, + 0x7F3C, 0x7F41, 0x7F47, 0x7F4C, 0x7F51, 0x7F56, 0x7F5B, 0x7F60, 0x7F65, 0x7F6A, 0x7F6F, 0x7F74, 0x7F78, 0x7F7D, + 0x7F81, 0x7F85, 0x7F8A, 0x7F8E, 0x7F92, 0x7F96, 0x7F9A, 0x7F9E, 0x7FA2, 0x7FA6, 0x7FA9, 0x7FAD, 0x7FB0, 0x7FB4, + 0x7FB7, 0x7FBA, 0x7FBE, 0x7FC1, 0x7FC4, 0x7FC7, 0x7FCA, 0x7FCC, 0x7FCF, 0x7FD2, 0x7FD4, 0x7FD7, 0x7FD9, 0x7FDC, + 0x7FDE, 0x7FE0, 0x7FE2, 0x7FE4, 0x7FE6, 0x7FE8, 0x7FEA, 0x7FEC, 0x7FED, 0x7FEF, 0x7FF1, 0x7FF2, 0x7FF3, 0x7FF5, + 0x7FF6, 0x7FF7, 0x7FF8, 0x7FF9, 0x7FFA, 0x7FFB, 0x7FFB, 0x7FFC, 0x7FFD, 0x7FFD, 0x7FFE, 0x7FFE, 0x7FFE, 0x7FFE, + 0x7FFE, 0x7FFF, +}; + +s16 sins(u16 x) { + s16 val; + + x >>= 4; + if ((x & 0x400) != 0) { + val = sintable[0x3FF - (x & 0x3FF)]; + } else { + val = sintable[x & 0x3FF]; + } + + if ((x & 0x800) != 0) { + return -val; + } + + return val; +} \ No newline at end of file