Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

kmcprintf OK #80

Merged
merged 2 commits into from
Jun 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/error/commonerror.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
246 changes: 246 additions & 0 deletions src/error/kmcprintf.c
Original file line number Diff line number Diff line change
@@ -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++);
hensldm marked this conversation as resolved.
Show resolved Hide resolved
}
}
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;
hensldm marked this conversation as resolved.
Show resolved Hide resolved

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);
}
Loading