erythros/System/Libraries/RawText.HC

104 lines
No EOL
2.6 KiB
HolyC

I64 @rawtext_output_port = NULL;
U0 @rawtext_detect_qemu()
{
CRAXRBCRCXRDX res;
CPUId(0x40000000, &res);
if (res.rbx == 'KVMK')
@rawtext_output_port = 0xe9;
}
U0 @rawtext_detect_vbox()
{
I64 res = PCIClassFind(0x088000, 0);
if (res >= 0)
@rawtext_output_port = 0x504;
}
U0 @dbg_put_char(I64 ch)
{
OutU8(@rawtext_output_port, ch);
if (!System.text_mode)
return;
Context2D* fb = Graphics2D.FrameBufferContext2D();
text.raw_flags &= ~RWF_SHOW_DOLLAR;
if (ch > '~' && ch != 219)
ch = ' ';
I64 row, col;
if (!(text.raw_flags & RWF_SHOW_DOLLAR)) {
if (ch == '$$') {
if (text.raw_flags & RWF_IN_DOLLAR) {
text.raw_flags &= ~RWF_IN_DOLLAR;
if (!(text.raw_flags & RWF_LAST_DOLLAR)) {
text.raw_flags &= ~RWF_LAST_DOLLAR;
return;
}
} else {
text.raw_flags |= RWF_IN_DOLLAR | RWF_LAST_DOLLAR;
return;
}
}
text.raw_flags &= ~RWF_LAST_DOLLAR;
if (text.raw_flags & RWF_IN_DOLLAR)
return;
}
if (ch == '\t') {
@dbg_put_char(CH_SPACE);
while (text.raw_col & 7)
@dbg_put_char(CH_SPACE);
} else if (ch == CH_BACKSPACE) {
text.raw_col--;
@dbg_put_char(CH_SPACE);
text.raw_col--;
} else if (ch == '\n') {
@dbg_put_char(CH_SPACE);
while (text.raw_col % text.cols)
@dbg_put_char(CH_SPACE);
} else if (Bt(char_bmp_displayable, ch)) {
row = text.raw_col / text.cols % text.rows;
col = text.raw_col % text.cols;
if (text.raw_flags & RWF_SCROLL && text.raw_col && !row && !col) {
CopyRect2D(fb, 0, -16, fb);
Rect2D(fb, 0, Display.Height() - 16, Display.Width(), 16, 0x0);
text.raw_col -= text.cols;
row = text.rows - 1;
}
ConsolePrint2D(fb, col * 8, row * 16, , , "%c", ch);
text.raw_col++;
}
}
Bool @kd_raw_putkey(I64 ch, I64)
{
if (IsRaw) {
@dbg_put_char(ch);
return TRUE;
} else
return FALSE;
}
Bool @kd_raw_puts(U8* st)
{
I64 ch;
if (IsRaw) {
while (ch = *st++)
@dbg_put_char(ch);
return TRUE;
} else
return FALSE;
}
U0 @rawdr_dummy(CTask*) { }
CKeyDevEntry* tmp_kde = keydev.put_key_head;
while (tmp_kde->put_s != &KDRawPutS)
tmp_kde = tmp_kde->next;
tmp_kde->put_key = &@kd_raw_putkey;
tmp_kde->put_s = &@kd_raw_puts;
Function.Patch(&RawDr, &@rawdr_dummy);
@rawtext_detect_qemu;
@rawtext_detect_vbox;
"rawtext ";