diff --git a/src/error/commonerror.c b/src/error/commonerror.c index 5a6f1c9..209defe 100644 --- a/src/error/commonerror.c +++ b/src/error/commonerror.c @@ -22,7 +22,7 @@ static OSLog errorLog = { static void __commonErrorHandler(s16 code, s16 numArgs, ...); OSErrorHandler __osCommonHandler = __commonErrorHandler; -char NULSTR[] = { '\0' }; +char NULSTR[] = ""; const char* __os_error_message[] = { NULSTR, diff --git a/src/error/kmcprintf.c b/src/error/kmcprintf.c new file mode 100644 index 0000000..2f4f08e --- /dev/null +++ b/src/error/kmcprintf.c @@ -0,0 +1,246 @@ +// This file was added in 2.0J and removed in 2.0K +#include "stdarg.h" +#include "PR/os.h" +#include "PR/rcp.h" +#include "PR/rdb.h" +#include "ultraerror.h" +#include "../libc/xstdio.h" + +extern u32 __kmc_pt_mode; + +static void* proutSyncPrintf(void* str, const char* buf, size_t n) { + size_t sent = 0; + + while (sent < n) { + sent += __osRdbSend(buf + sent, n - sent, RDB_TYPE_GtoH_PRINT); + } + return 1; +} + +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) { + while (*piok & (PI_STATUS_DMA_BUSY | PI_STATUS_IO_BUSY)) { + } + + while (!(*stat & 4)) { + } + + *wport = c; +} + +static void* kmc_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; +} + +char NULSTR[] = ""; + +const char* __os_error_message[] = { + NULSTR, + "osCreateThread: stack pointer not aligned to 8 bytes (0x%x)", + "osCreateThread: priority not in range [0-255] (%d)", + "osStartThread: thread has bad state (running/runnable/other)", + "osSetThreadPri: priority not in range [0-255] (%d)", + "osCreateMesgQueue: message count not > 0 (%d)", + "osSendMesg: flag not OS_MESG_NOBLOCK or OS_MESG_BLOCK (%d)", + "osJamMesg: flag not OS_MESG_NOBLOCK or OS_MESG_BLOCK (%d)", + "osRecvMesg: flag not OS_MESG_NOBLOCK or OS_MESG_BLOCK (%d)", + "osSetEventMesg: unknown event type (%d)", + "osMapTLB: index not in range [0-30] (%d)", + "osMapTLB: asid argument not -1 or in range [0-255] (%d)", + "osUnmapTLB: index not in range [0-30] (%d)", + "osSetTLBASID: asid not in range [0-255] (%d)", + "osAiSetFrequency: freq not in range [%d-%d] (%d)", + "osAiSetNextBuffer: address not aligned to 8 bytes (0x%x)", + "osAiSetNextBuffer: size not aligned to 8 bytes (0x%x)", + "osDpSetNextBuffer: address not aligned to 8 bytes (0x%x)", + "osDpSetNextBuffer: size not aligned to 8 bytes (0x%x)", + "osPiRawReadIo: address not aligned to 4 bytes (0x%x)", + "osPiRawWriteIo: address not aligned to 4 bytes (0x%x)", + "osPiRawStartDma: direction not OS_READ or OS_WRITE (%d)", + "osPiRawStartDma: device address not aligned to 2 bytes (0x%x)", + "osPiRawStartDma: DRAM address not aligned to 8 bytes (0x%x)", + "osPiRawStartDma: size not aligned to 2 bytes (%d)", + "osPiRawStartDma: size not in range [0,16777216] (%d)", + "osPiReadIo: address not aligned to 4 bytes (0x%x)", + "osPiWriteIo: address not aligned to 4 bytes (0x%x)", + "osPiStartDma: PI Manager not yet begun by osCreatePiManager", + "osPiStartDma: priority not OS_MESG_PRI_[NORMAL|HIGH] (%d)", + "osPiStartDma: direction not OS_READ or OS_WRITE (%d)", + "osPiStartDma: device address not aligned to 2 bytes (0x%x)", + "osPiStartDma: DRAM address not aligned to 8 bytes (0x%x)", + "osPiStartDma: size not aligned to 2 bytes (%d)", + "osPiStartDma: size not in range [0,16777216] (%d)", + "osCreatePiManager: priority not in range [0-255] (%d)", + "osViGetCurrentMode: VI Manager not yet begun", + "osViGetCurrentFramebuffer: VI Manager not yet begun", + "osViGetNextFramebuffer: VI Manager not yet begun", + "osViSetXScale: value not in range [0.25,1.0] (%f)", + "osViSetXScale: VI Manager not yet begun by osCreateViManager", + "osViSetYScale: value not in range [0.05,1.0] (%f)", + "osViSetYScale: VI Manager not yet begun by osCreateViManager", + "osViSetSpecialFeatures: not a known feature value (%d)", + "osViSetSpecialFeatures: VI Manager not yet begun", + "osViSetMode: VI Manager not yet begun by osCreateViManager", + "osViSetEvent: VI Manager not yet begun by osCreateViManager", + "osViSwapBuffer: frame buffer not aligned to 64 bytes (0x%x)", + "osViSwapBuffer: VI Manager not yet begun", + "osCreateViManager: priority not in range [0-255] (%d)", + "osCreateRegion: not a known alignment (%d)", + "osCreateRegion: length (%d) too small for buffer size (%d)", + "osMalloc: invalid or corrupt region (0x%x)", + "osFree: invalid or corrupt region (0x%x)", + "osFree: invalid address (0x%x) or\n corrupt region (0x%x)", + "osGetRegionBufCount: invalid or corrupt region (0x%x)", + "osGetRegionBufSize: invalid or corrupt region (0x%x)", + "osSpTaskLoad: dram_stack not aligned to 16 bytes (0x%x)", + "osSpTaskLoad: output_buff not aligned to 16 bytes (0x%x)", + "osSpTaskLoad: output_buff_size not aligned to 16 bytes (0x%x)", + "osSpTaskLoad: yield_data_ptr not aligned to 16 bytes (0x%x)", + "osProfileInit: profile counter is running, call osProfileStop before init", + "osProfileInit: profcnt is %d", + "osProfileInit: histo_base pointer must be 32-bit aligned (%x)", + "osProfileInit: text_start (%x) >= text_end (%x)", + "osProfileInit: histo_size is an illegal size (%d)", + "osProfileStart: microseconds is < PROF_MIN_INTERVAL (%d)", + "osProfileStart: profiling has already been started", + "osProfileStop: profiling has already been stopped", + "osProfileStop: no profile timer to stop", + "osReadHost: address not aligned to 8 bytes (0x%x)", + "osReadHost: size either 0 or not aligned to 4 bytes (0x%x)", + "osWriteHost: address not aligned to 8 bytes (0x%x)", + "osWriteHost: size either 0 or not aligned to 4 bytes (0x%x)", + "osGetTime: VI manager not yet begun by osCreateViManager", + "osSetTime: VI manager not yet begun by osCreateViManager", + "osSetTimer: VI manager not yet begun by osCreateViManager", + "osStopTimer: VI manager not yet begun by osCreateViManager", + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + NULSTR, + "_handleMIDIMsg: no sound mapped", + "_handleMIDIMsg: no free voices", + "_handleMIDIMsg: couldn't map voice", + "_handleMIDIMsg: note off - couldn't find voice", + "_handleMIDIMsg: poly pressure - couldn't find voice", + "_handleEvent: no free voices", + "Synthesizer: no free updates", + "alSndPDeallocate: attempt to deallocate a sound which is playing", + "alSndpDelete: attempt to delete player with playing sounds", + "alSndpPlay: attempt to play a sound which is playing", + "alSndpSetSound: sound id (%d) out of range (0 - %d)", + "alSndpSetPriority: sound id (%d) out of range (0 - %d)", + "alSndpSet Parameter: target (%d) out of range (0 - %d)", + "alBnkfNew: bank file out of date", + "alSeqNew: 0x%x is not a midi file", + "alSeqNew: 0x%x is not a type 0 midi file", + "alSeqNew: 0x%x has more than 1 track", + "alSeqNew: SMPTE delta times not supported", + "alSeqNew: Error parsing file 0x%x (no track header)", + "alSeqNextEvent: Unsupported system exclusive", + "alSeqNextEvent: Unsupported midi meta event 0x%x", + "_handleMIDIMsg: Invalid program change to %d, max instruments %d", + "_handleMIDIMsg: Unknown midi message 0x%x", + "_unmapVoice: Couldn't unmap voice 0x%x", + "alEvtqPostEvent: Out of free events", + "alHeapAlloc: Can't allocate %d bytes", + "alHeapCheck: Heap corrupt", + "alHeapCheck: Heap corrupt - first block is bad", + "alCSeqGetTrackEvent: Running status of zero on track %d", + "alCSeqGetTrackEvent: Note on velocity of zero on track %d", + "alCSPVoiceHandler: Stopping sequence but voice not free chan %d, key %d", + "alSeqNextEvent: Read past end of sequence", + "osAiSetNextBuffer: DMA buffer location may cause audio clicks (0x%x)", + "_loadOutputBuffer: Modulated delay greater than total delay by %d samples", + "osViExtendVStart: VI Manager not yet begun by osCreateViManager", + "osViExtendVStart: value not in range [0-48] %d", + NULSTR, +}; + +static void kmcErrorHandler(s16 code, s16 numArgs, ...); +OSErrorHandler __kmcErrorHandler = kmcErrorHandler; + +static void kmcErrorHandler(s16 code, s16 numArgs, ...) { + int ans; + va_list ap; + char* fmt; + + fmt = __os_error_message[code]; + va_start(ap, numArgs); + + if (__kmc_pt_mode) { + ans = _Printf(kmc_proutSyncPrintf, NULL, fmt, ap); + } else { + ans = _Printf(proutSyncPrintf, NULL, fmt, ap); + } + + osSyncPrintf("\n"); + + va_end(ap); +}