summaryrefslogtreecommitdiff
path: root/lib/ultralib/src/os/initialize_msp.c
diff options
context:
space:
mode:
authorAnghelo Carvajal <angheloalf95@gmail.com>2023-03-28 23:42:56 -0300
committerGitHub <noreply@github.com>2023-03-29 03:42:56 +0100
commitd66a21685f45d130f980e8a5ec7b08cfe189e40b (patch)
treef11b3b09dc5772e419fe08d3d0ead4e778def57f /lib/ultralib/src/os/initialize_msp.c
parent6a5e64cc4c26398cc607bb02cdc12a056ddf42d1 (diff)
Initial repo setup (#1)
* git subrepo clone git@github.com:ethteck/splat.git tools/splat subrepo: subdir: "tools/splat" merged: "4fec014" upstream: origin: "git@github.com:ethteck/splat.git" branch: "master" commit: "4fec014" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo.git" commit: "2f68596" * gitignore * decompress_baserom.py * Initial yaml * run flib * more yaml stuff * Builds an uncompressed ROM * setup ido download * git subrepo clone git@github.com:simonlindholm/asm-differ.git tools/asm-differ subrepo: subdir: "tools/asm-differ" merged: "ae40866" upstream: origin: "git@github.com:simonlindholm/asm-differ.git" branch: "main" commit: "ae40866" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo.git" commit: "2f68596" * git subrepo clone git@github.com:simonlindholm/asm-processor.git tools/asm-processor subrepo: subdir: "tools/asm-processor" merged: "bbd86ea" upstream: origin: "git@github.com:simonlindholm/asm-processor.git" branch: "main" commit: "bbd86ea" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo.git" commit: "2f68596" * git subrepo clone (merge) git@github.com:EllipticEllipsis/fado.git tools/fado subrepo: subdir: "tools/fado" merged: "8d896ee" upstream: origin: "git@github.com:EllipticEllipsis/fado.git" branch: "master" commit: "8d896ee" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo.git" commit: "2f68596" * setup ido in makefile * data and rodata * add automatic file splits * bootstrap most symbol_addrs * git subrepo clone --branch=irix git@github.com:hensldm/ultralib.git lib/ultralib subrepo: subdir: "lib/ultralib" merged: "0d1e095" upstream: origin: "git@github.com:hensldm/ultralib.git" branch: "irix" commit: "0d1e095" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo.git" commit: "2f68596" * setup ido building * various tooling * git subrepo pull tools/asm-differ subrepo: subdir: "tools/asm-differ" merged: "857b398" upstream: origin: "git@github.com:simonlindholm/asm-differ.git" branch: "main" commit: "857b398" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo.git" commit: "2f68596" * Change defines to match IDO * review * newlin * update gitignore * Windows error * D_01000000 * yeet settings.json * yeet * git subrepo clone git@github.com:decompals/ultralib.git lib/ultralib subrepo: subdir: "lib/ultralib" merged: "d03b2a3" upstream: origin: "git@github.com:decompals/ultralib.git" branch: "main" commit: "d03b2a3" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo.git" commit: "2f68596" * clangformat and clangtidy * Setup a bunch of headers * bootstrap boot and code functions and variables headers * global.h * update format.py includes * -D_MIPS_SZLONG=32 * format.py: --verbose * Update tools/decompress_baserom.py Co-authored-by: Derek Hensley <hensley.derek58@gmail.com> * Add libc to global.h * review * yeet saved_regs * yeet headers * yeet _MSC_VER * more header cleanup * add readme licensing note --------- Co-authored-by: Derek Hensley <hensley.derek58@gmail.com>
Diffstat (limited to 'lib/ultralib/src/os/initialize_msp.c')
-rw-r--r--lib/ultralib/src/os/initialize_msp.c154
1 files changed, 154 insertions, 0 deletions
diff --git a/lib/ultralib/src/os/initialize_msp.c b/lib/ultralib/src/os/initialize_msp.c
new file mode 100644
index 0000000..d0deead
--- /dev/null
+++ b/lib/ultralib/src/os/initialize_msp.c
@@ -0,0 +1,154 @@
+#ifndef _FINALROM
+
+#include "PR/os_internal.h"
+#include "PR/rcp.h"
+#include "osint.h"
+
+typedef struct
+{
+ /* 0x0 */ unsigned int inst1;
+ /* 0x4 */ unsigned int inst2;
+ /* 0x8 */ unsigned int inst3;
+ /* 0xC */ unsigned int inst4;
+} __osExceptionVector;
+
+extern __osExceptionVector* __ptExceptionPreamble;
+
+static volatile unsigned int* stat = (unsigned*)0xbff08004;
+static volatile unsigned int* wport = (unsigned*)0xbff08000;
+static volatile unsigned int* piok = (unsigned*)PHYS_TO_K1(PI_STATUS_REG);
+
+static void rmonPutchar(char c) {
+ u32 data;
+
+ while (TRUE) {
+ osPiReadIo(stat, &data);
+ if (data & 4) {
+ osPiWriteIo(wport, c);
+ break;
+ }
+ }
+}
+
+static void* msp_proutSyncPrintf(void* str, const char* buf, int n) {
+ int i;
+ char c;
+ char* p;
+ char* q;
+ char xbuf[128];
+ static int column = 0;
+
+ p = &xbuf;
+
+ for (i = 0; i < n; i++) {
+ c = *buf++;
+
+ switch (c) {
+ case '\n':
+ *p++ = '\n';
+ column = 0;
+ break;
+ case '\t':
+ do {
+ *p++ = ' ';
+ } while (++column % 8);
+ break;
+ default:
+ column++;
+ *p++ = c;
+ break;
+
+ }
+
+ if (c == '\n' || (p - xbuf) > 100) {
+ rmonPutchar((p - xbuf) - 1);
+
+ q = xbuf;
+ while (q != p) {
+ rmonPutchar(*q++);
+ }
+ p = xbuf;
+ }
+ }
+ if (p != xbuf) {
+ rmonPutchar((p - xbuf) - 1);
+
+ q = xbuf;
+ while (q != p) {
+ rmonPutchar(*q++);
+ }
+ }
+ return (void*)1;
+}
+
+extern u32 __kmc_pt_mode;
+
+void __osInitialize_msp(void) {
+ if (!__kmc_pt_mode) {
+ int (*fnc)();
+ unsigned int* src;
+ unsigned int* dst;
+ unsigned int monadr;
+ volatile unsigned int* mon;
+ volatile unsigned int* stat;
+
+ stat = (unsigned*)0xbff08004;
+ mon = (unsigned*)0xBFF00000;
+ if (*mon != 0x4B4D4300) {
+ return;
+ }
+
+ src = (unsigned*)&__ptExceptionPreamble;
+ dst = (unsigned*)E_VEC;
+ *dst++ = *src++;
+ *dst++ = *src++;
+ *dst++ = *src++;
+ src+=2;
+ dst+=2;
+ *dst++ = *src++;
+ *dst++ = *src++;
+ *dst++ = *src++;
+
+ osWritebackDCache(E_VEC, 0x24);
+ osInvalICache(E_VEC, 0x24);
+
+ __kmc_pt_mode = TRUE;
+
+ if ((*stat & 0x10) == 0) {
+ monadr = *(mon + 1);
+ if (monadr != 0xBFF00000) {
+ unsigned int* src;
+ unsigned int* dst = monadr | 0x20000000;
+ unsigned int ct = 0x2000 / 4;
+
+ src = 0xBFF00000;
+
+ while (ct != 0) {
+ *dst++ = *src++;
+ ct--;
+ }
+ }
+ fnc = monadr + 8;
+ fnc(0x4B4D4300, 0);
+ }
+ __printfunc = msp_proutSyncPrintf;
+ }
+}
+
+int __checkHardware_msp(void) {
+ volatile unsigned int* mon = (unsigned*)0xBFF00000;
+
+ if (*mon == 0x4B4D4300) {
+ mon = (unsigned*)0xBFF00010;
+
+ if (*mon == 0) {
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+ } else {
+ return FALSE;
+ }
+}
+
+#endif