148 lines
2.5 KiB
C
148 lines
2.5 KiB
C
#pragma once
|
|
|
|
static int txt_debug = 0;
|
|
|
|
unsigned short * textmemptr = (unsigned short *)0xB8000;
|
|
static void placech(unsigned char c, int x, int y, int attr) {
|
|
#ifdef EFI_PLATFORM
|
|
unsigned short ch;
|
|
switch (c) {
|
|
case '\030':
|
|
ch = L'↑';
|
|
break;
|
|
case '\031':
|
|
ch = L'↓';
|
|
break;
|
|
case '\032':
|
|
ch = L'←';
|
|
break;
|
|
case '\033':
|
|
ch = L'→';
|
|
break;
|
|
default:
|
|
ch = c;
|
|
break;
|
|
}
|
|
uint16_t string[] = {ch, 0};
|
|
uefi_call_wrapper(ST->ConOut->SetAttribute, 2, ST->ConOut, attr);
|
|
uefi_call_wrapper(ST->ConOut->SetCursorPosition, 3, ST->ConOut, x, y);
|
|
uefi_call_wrapper(ST->ConOut->OutputString, 2, ST->ConOut, string);
|
|
#else
|
|
unsigned short *where;
|
|
unsigned att = attr << 8;
|
|
where = textmemptr + (y * 80 + x);
|
|
*where = c | att;
|
|
#endif
|
|
}
|
|
|
|
static int x = 0;
|
|
static int y = 0;
|
|
static int attr = 0x07;
|
|
static void print_(char * str) {
|
|
while (*str) {
|
|
if (*str == '\n') {
|
|
for (; x < 80; ++x) {
|
|
placech(' ', x, y, attr);
|
|
}
|
|
x = 0;
|
|
y += 1;
|
|
if (y == 24) {
|
|
y = 0;
|
|
}
|
|
} else {
|
|
placech(*str, x, y, attr);
|
|
x++;
|
|
if (x == 80) {
|
|
x = 0;
|
|
y += 1;
|
|
if (y == 24) {
|
|
y = 0;
|
|
}
|
|
}
|
|
}
|
|
str++;
|
|
}
|
|
}
|
|
|
|
static void move_cursor(int _x, int _y) {
|
|
x = _x;
|
|
y = _y;
|
|
}
|
|
|
|
static void set_attr(int _attr) {
|
|
attr = _attr;
|
|
}
|
|
|
|
static void print_banner(char * str) {
|
|
if (!str) {
|
|
for (int i = 0; i < 80; ++i) {
|
|
placech(' ', i, y, attr);
|
|
}
|
|
y++;
|
|
return;
|
|
}
|
|
int len = 0;
|
|
char *c = str;
|
|
while (*c) {
|
|
len++;
|
|
c++;
|
|
}
|
|
int off = (80 - len) / 2;
|
|
|
|
for (int i = 0; i < 80; ++i) {
|
|
placech(' ', i, y, attr);
|
|
}
|
|
for (int i = 0; i < len; ++i) {
|
|
placech(str[i], i + off, y, attr);
|
|
}
|
|
|
|
y++;
|
|
}
|
|
|
|
#ifdef EFI_PLATFORM
|
|
static void print_int_(unsigned int value) {
|
|
unsigned int n_width = 1;
|
|
unsigned int i = 9;
|
|
while (value > i && i < UINT32_MAX) {
|
|
n_width += 1;
|
|
i *= 10;
|
|
i += 9;
|
|
}
|
|
|
|
char buf[n_width+1];
|
|
buf[n_width] = 0;
|
|
i = n_width;
|
|
while (i > 0) {
|
|
unsigned int n = value / 10;
|
|
int r = value % 10;
|
|
buf[i - 1] = r + '0';
|
|
i--;
|
|
value = n;
|
|
}
|
|
print_(buf);
|
|
}
|
|
#endif
|
|
|
|
static void print_hex_(unsigned int value) {
|
|
char out[9] = {0};
|
|
for (int i = 7; i > -1; i--) {
|
|
out[i] = "0123456789abcdef"[(value >> (4 * (7 - i))) & 0xF];
|
|
}
|
|
print_(out);
|
|
}
|
|
|
|
static void clear_() {
|
|
x = 0;
|
|
y = 0;
|
|
for (int y = 0; y < 24; ++y) {
|
|
for (int x = 0; x < 80; ++x) {
|
|
placech(' ', x, y, 0x00);
|
|
}
|
|
}
|
|
}
|
|
|
|
#define print(s) do {if (txt_debug) {print_(s);}} while(0)
|
|
#define clear() do {if (txt_debug) {clear_();}} while(0)
|
|
#define print_hex(d) do {if (txt_debug) {print_hex_(d);}} while(0)
|
|
|