📄 console.c
字号:
#include "types.h"#include "console.h"#include "utils.h"#include "board.h"#include <stdarg.h>#define CONSOLE_OUTPUT 1int console_init(void){ outl(0x03, ULCON0); outl(0x09, UCON0); outl(0x500, UBRDIV0); return 0;}int console_write(int ch){#ifdef CONSOLE_OUTPUT while (!(inl(USTAT0) & 0x40)); outl(ch, UTXBUF0);#endif return 0;}int console_read(void){ while (!(inl(USTAT0) & 0x20)); return (int)inl(URXBUF0);}int kbhit(void){ return (inl(USTAT0) & 0x20);}int getch(void){ return console_read();}int putch(int ch){ return console_write(ch);}int puts(const char *s){ while (*s != 0) { putch(*s++); } return 0;}char *getpass(char *s, int n, char prompt){ char *p; int ch; p = s; while (1) { ch = getch(); if (ch == KEY_ENTER) break; if (ch == KEY_BACKSPACE) { if (p > s) { p--; putch(ch); putch(' '); putch(ch); } } else if ((p - s) < (n - 1)) { /* visiable ascii chars */ if (ch >= 32 && ch <= 126) { *p++ = (char)ch; if (prompt) putch(prompt); } } } *p = '\0'; return s;}char *gets(char *s, int n){ char *p; int ch; p = s; while (1) { ch = getch(); if (ch == KEY_ENTER) break; if (ch == KEY_BACKSPACE) { if (p > s) { p--; putch(ch); putch(' '); putch(ch); } } else if ((p - s) < (n - 1)) { /* visiable ascii chars */ if (ch >= 32 && ch <= 126) { *p++ = (char)ch; putch(ch); } } } *p = '\0'; return s;}unsigned long getul(unsigned long def, int radix){ char buf[9]; gets(buf, 9); if (buf[0] == '\0') return def; return strtoul(buf, NULL, radix);}unsigned char getuc(unsigned char def, int radix){ char buf[4]; unsigned long l; if (radix == 16) gets(buf, 3); else gets(buf, 4); if (buf[0] == '\0') return def; l = strtoul(buf, NULL, radix); if (l > 255) l = 255; return l;} void print_0nx(char ch2, unsigned long l){ unsigned char ch; int i; ch2 = ch2 - '0'; for (i = ch2 - 1; i >= 0; i--) { ch = (l >> (i * 4)) & 0x0f; if (ch < 10) putch(ch + '0'); else putch(ch - 10 + 'a'); }}void print_0nd(char ch2, unsigned long l){ unsigned long prod, t; int flag = 0; unsigned char ch; int i, j; ch2 = ch2 - '0'; for (i = 15; i >= 0; i--) { prod = 1; t = l; for (j = 0; j < i; j++) { prod = prod * 10; t = t / 10; } ch = t; l -= prod * t; if (!flag && !ch && i >= ch2) continue; if (ch < 10) putch(ch + '0'); else putch('?'); flag = 1; }}int printf(const char *s, ...){ va_list ap; unsigned long arg; const char *str; char ch1, ch2, ch3; va_start(ap, s); while (*s != 0) { if (*s == '%') { s++; ch1 = *s++; if (ch1 == 'l') ch1 = *s++; if (ch1 == 's') { str = va_arg(ap, unsigned char *); puts(str); } else if (ch1 == 'd') { arg = va_arg(ap, unsigned long); print_0nd('1', arg); } else { ch2 = *s++; ch3 = *s++; if (ch3 == 'l') ch3 = *s++; arg = va_arg(ap, unsigned long); if (ch3 == 'd') print_0nd(ch2, arg); else print_0nx(ch2, arg); } } else putch(*s++); } va_end(ap); return 0;}int get_select(int min, int max){ int select; int ch; while (1) { ch = getch(); if (ch >= min && ch <= max) { putch(ch); select = ch - min; break; } if (ch == KEY_ESC) { select = -1; break; } } return select;}int get_select_enter(int min, int max){ int select; int ch; while (1) { ch = getch(); if (ch >= min && ch <= max) { putch(ch); select = ch - min; break; } if (ch == KEY_ENTER) { select = -1; break; } } return select;}int get_yes_no(int def){ int ch; while (1) { ch = getch(); if (ch == KEY_ENTER) return def; if (ch == 'y' || ch == 'Y') { putch(ch); return 1; } if (ch == 'n' || ch == 'N') { putch(ch); return 0; } } return def;}int get_enter_esc(void){ int ch; while (1) { ch = getch(); if (ch == KEY_ENTER) return 1; if (ch == KEY_ESC) return 0; } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -