104 lines
No EOL
2.6 KiB
HolyC
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 "; |