#include "clib.h"
#include "i386.h"
#include "console.h"
void real_debug_handler(int sig) _fastcall;
static int __if = 0;
void __cli(void)
{
int n;
asm ("pushfl\n"
"popl %%eax\n"
"orl $0x8000,%%eax\n"
"shrl $8,%%eax\n"
"jb 1f\n"
"xorl %%eax,%%eax\n"
"1:\n":"=a"(n));
if (n == 0) {
if (__if > 0) __if = 0;
__if--;
asm_cli;
}
else {
__if++;
if (__if > 0) asm_sti;
}
}
void __sti(void)
{
}
console_t debugcon;
void handle_keyboard()
{
int sc;
asm("inb $0x60,%%al":"=al"(sc):);
if (sc == 1) exit(5);
con_convert_key(&debugcon, sc);
}
void real_debug_handler(int sig)
{
asm_cli;
switch (sig) {
case 1: handle_keyboard();
default : return;
}
asm_sti;
}
void debug_msg(const char*msg, ...)
{
va_list args;
char buf[2048];
va_start(args, msg);
vsprintf(buf, msg, args);
con_write(&debugcon, buf);
va_end(args);
}
char readkey(void)
{
char c;
char_t ct;
do {
asm_cli;
ct = con_get_key(&debugcon);
debug_msg("\e[s\e[Hshift %2d\e[u",ct.shift);
asm_sti;
} while (ct.ascii == 0);
if (ct.ascii == 0) kprintf("@@@");
// debug_msg("\e[s\e[Hshift %2d\e[u",ct.shift);
// debug_msg("ascii %c sc %xh",ct.ascii,ct.scanc);
// kprintf("ascii %d sc %xh",ct.ascii,ct.scanc);
c = ct.ascii;
return c;
}
void putc(char c)
{
char str[2] = {c,0};
con_write(&debugcon, str);
}
void debug_start(void)
{
char c;
int i;
asm_cli;
memset(&debugcon,0,sizeof(debugcon));
debugcon.video = (void*)0xB8000;
debugcon.color = 0x0700;
debugcon.fl.outrdy = 1;
debugcon.fl.movecursor = 1;
debugcon.hwwidth = 80;
debugcon.width = 80;
debugcon.height = 25;
asm_cli;
con_write(&debugcon, "\e[2JKernel Debugger V0.0a\n");
for (i = 0; i < 1000; i++) {
con_write(&debugcon, "\e[s\e[Hshift %2d\e[u");
}
asm_cli;
__cli();
asm_sti;
__cli();
do {
c = readkey();
putc(c);
// kprintf("%c", c);
} while (c != 27);
exit(0);
}