erythros/System/Libraries/System.HC

109 lines
No EOL
2.7 KiB
HolyC

class @system
{
Bool text_mode;
CFifoI64* log_fifo;
U8* build_info;
U8* (*BuildInfo)();
U0 (*Init)();
U0 (*Log)(CTask* task, U8* fmt, ...);
U0 (*PowerOff)();
};
@system System;
U0 @system_lex_warn(CCmpCtrl* cc,
U8* str = NULL)
{ // Print warn msg, then, LexPutPos().
if (!MemCmp(str, "Assign U0 ", 10))
return; // suppress "Assign U0 " warnings
if (str)
PrintWarn(str);
if (cc->htc.fun) {
"in fun '%s'.\n", cc->htc.fun->str;
if (IsRaw)
"%s\n", cc->htc.fun->src_link;
else {
"$LK,\"%s\"$\n", cc->htc.fun->src_link;
AdamErr("%s\n", cc->htc.fun->src_link);
}
} else
LexPutPos(cc);
cc->warning_cnt++;
}
U0 @system_print_warn(U8* fmt, ...)
{ // Print "Warn:" and msg in blinking red.
if (!MemCmp(fmt, "Unused var", 10))
return; // suppress "Unused var" warnings
if (!MemCmp(fmt, "Using 64-bit reg var.", 21))
return; // suppress "Using 64-bit reg var." warnings
U8* buf = StrPrintJoin(NULL, fmt, argc, argv);
GetOutOfDollar;
"%,p %,p %,p %,p " ST_WARN_ST "%s", Caller, Caller(2), Caller(3), Caller(4),
buf;
Free(buf);
}
@patch_jmp_rel32(&LexWarn, &@system_lex_warn);
@patch_jmp_rel32(&PrintWarn, &@system_print_warn);
U8* @system_build_info() { return System.build_info; }
U0 @system_log(CTask* task, U8* fmt, ...)
{
if (!config->o("debug"))
return;
if (!config->o("debug")->@("show_system_log_messages"))
return;
U8* buf = StrPrintJoin(NULL, fmt, argc, argv);
U8* str = buf;
U32 color;
MemCpyU32(&color, &task->task_name, 1);
if (!color) {
color = RandU32 * 1048576;
MemCpyU32(&task->pad, &color, 1);
}
U8* log_msg = MAlloc(1024);
StrPrint(log_msg, "[%d][\x1b[38;2;%d;%d;%dm%16s\x1b[0m] %s\n",
SysTimerRead,
color.u8[3] << 5 & 0xFF, color.u8[2] << 4 & 0xFF,
color.u8[1] << 3 & 0xFF, Fs->task_name, buf);
FifoI64Ins(System.log_fifo, log_msg);
Free(buf);
}
U0 @system_log_task()
{
I64 log_msg;
while (1) {
while (FifoI64Cnt(System.log_fifo)) {
FifoI64Rem(System.log_fifo, &log_msg);
"%s", log_msg;
Free(log_msg);
}
Sleep(1);
}
}
U0 @system_power_off()
{
OutU16(0x4004, 0x3400);
OutU16(0x0604, 0x2000);
OutU16(0xB004, 0x2000);
}
U0 @system_init()
{
System.build_info = "";
System.log_fifo = FifoI64New(1024);
Spawn(&@system_log_task, , , T(mp_cnt, 1, 0));
}
System.BuildInfo = &@system_build_info;
System.Init = &@system_init;
System.Log = &@system_log;
System.PowerOff = &@system_power_off;
System.Init();
"system ";