123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- #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)
|