Added fun fault recovery :3 (I think I spotted a race condition in exception handling during testing, but whatever, that can wait)
This commit is contained in:
parent
ce771b19bb
commit
7937de6ef0
7
kernel.c
7
kernel.c
@ -65,6 +65,7 @@ extern struct Int13DiskPacket_t v86disk_addr_packet;
|
|||||||
|
|
||||||
extern void enter_v86(uint32_t ss, uint32_t esp, uint32_t cs, uint32_t eip);
|
extern void enter_v86(uint32_t ss, uint32_t esp, uint32_t cs, uint32_t eip);
|
||||||
extern void v86Test();
|
extern void v86Test();
|
||||||
|
extern void v86TransFlag();
|
||||||
extern void v86GfxMode();
|
extern void v86GfxMode();
|
||||||
extern void v86TextMode();
|
extern void v86TextMode();
|
||||||
extern void v86DiskRead();
|
extern void v86DiskRead();
|
||||||
@ -120,10 +121,14 @@ void error_environment() {
|
|||||||
ensure_v86env();
|
ensure_v86env();
|
||||||
FARPTR v86_entry = i386LinearToFp(v86TextMode);
|
FARPTR v86_entry = i386LinearToFp(v86TextMode);
|
||||||
enter_v86(0x8000, 0xFF00, FP_SEG(v86_entry), FP_OFF(v86_entry));
|
enter_v86(0x8000, 0xFF00, FP_SEG(v86_entry), FP_OFF(v86_entry));
|
||||||
printStr("Oh noes!!! System error! ;c", &error_screen[80]);
|
printStr("Oh noes!!! System error! ;c Press E for a fun recovery :3", &error_screen[80]);
|
||||||
uint16_t *vga_text = ((uint16_t*)0xB8000);
|
uint16_t *vga_text = ((uint16_t*)0xB8000);
|
||||||
for (int i = 0; i < 80*50; i++)
|
for (int i = 0; i < 80*50; i++)
|
||||||
vga_text[i] = error_screen[i];
|
vga_text[i] = error_screen[i];
|
||||||
|
uint8_t key;
|
||||||
|
for (key = get_key(); key != 'e' && key != 'E'; key = get_key());
|
||||||
|
v86_entry = i386LinearToFp(v86TransFlag);
|
||||||
|
enter_v86(0x8000, 0xFF00, FP_SEG(v86_entry), FP_OFF(v86_entry));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
25
v86.nasm
25
v86.nasm
@ -45,6 +45,31 @@ int 3
|
|||||||
int 0x30 ; exit
|
int 0x30 ; exit
|
||||||
jmp $
|
jmp $
|
||||||
|
|
||||||
|
global v86TransFlag
|
||||||
|
v86TransFlag:
|
||||||
|
push cs
|
||||||
|
pop es
|
||||||
|
mov ax, 0x13
|
||||||
|
int 0x10
|
||||||
|
mov ax,0x1012
|
||||||
|
xor bx,bx
|
||||||
|
mov cx,5
|
||||||
|
mov dx,.c
|
||||||
|
int 0x10
|
||||||
|
push 0xa000
|
||||||
|
pop es
|
||||||
|
xor di,di
|
||||||
|
xor ax,ax
|
||||||
|
.loop:
|
||||||
|
mov cx, 12800
|
||||||
|
rep stosb
|
||||||
|
inc ax
|
||||||
|
cmp ax,5
|
||||||
|
jl .loop
|
||||||
|
int 0x30
|
||||||
|
jmp $
|
||||||
|
.c: db `\0263>=*.\?\?\?=*.\0263>`
|
||||||
|
|
||||||
global v86GfxMode
|
global v86GfxMode
|
||||||
v86GfxMode:
|
v86GfxMode:
|
||||||
mov ax, 0x13
|
mov ax, 0x13
|
||||||
|
Loading…
Reference in New Issue
Block a user