diff --git a/interrupt.c b/interrupt.c index 81448e5..0d9555f 100644 --- a/interrupt.c +++ b/interrupt.c @@ -102,17 +102,17 @@ void gpf_handler_v86(struct interrupt_frame *frame, unsigned long error_code) { stack32 = (uint32_t*)stack; char *vga = (char*)0xb8000 + (160 * 10); - //vga[0] = 'I'; vga[2] = 'P'; int_printWord(frame->eip, (uint16_t*)&vga[4]); vga += 14; - //vga[0] = 'C'; vga[2] = 'S'; int_printWord(frame->cs, (uint16_t*)&vga[4]); vga += 14; - //vga[0] = 'F'; vga[2] = 'L'; int_printDword(frame->eflags, (uint16_t*)&vga[4]); vga += 14; - //vga = (char*)0xb8000 + (160 * 11); - //vga[0] = 'S'; vga[2] = 'P'; int_printWord(frame->esp, (uint16_t*)&vga[4]); vga += 14; - //vga[0] = 'S'; vga[2] = 'S'; int_printWord(frame->ss, (uint16_t*)&vga[4]); vga += 14; - //vga = (char*)0xb8000 + (160 * 12); - //vga[0] = 'E'; vga[2] = 'S'; int_printWord(frame->es, (uint16_t*)&vga[4]); vga += 14; - //vga[0] = 'D'; vga[2] = 'S'; int_printWord(frame->ds, (uint16_t*)&vga[4]); vga += 14; - //vga[0] = 'F'; vga[2] = 'S'; int_printWord(frame->fs, (uint16_t*)&vga[4]); vga += 14; - //vga[0] = 'G'; vga[2] = 'S'; int_printWord(frame->gs, (uint16_t*)&vga[4]); vga += 14; + vga[0] = 'I'; vga[2] = 'P'; int_printWord(frame->eip, (uint16_t*)&vga[4]); vga += 14; + vga[0] = 'C'; vga[2] = 'S'; int_printWord(frame->cs, (uint16_t*)&vga[4]); vga += 14; + vga[0] = 'F'; vga[2] = 'L'; int_printDword(frame->eflags, (uint16_t*)&vga[4]); vga += 14; + vga = (char*)0xb8000 + (160 * 11); + vga[0] = 'S'; vga[2] = 'P'; int_printWord(frame->esp, (uint16_t*)&vga[4]); vga += 14; + vga[0] = 'S'; vga[2] = 'S'; int_printWord(frame->ss, (uint16_t*)&vga[4]); vga += 14; + vga = (char*)0xb8000 + (160 * 12); + vga[0] = 'E'; vga[2] = 'S'; int_printWord(frame->es, (uint16_t*)&vga[4]); vga += 14; + vga[0] = 'D'; vga[2] = 'S'; int_printWord(frame->ds, (uint16_t*)&vga[4]); vga += 14; + vga[0] = 'F'; vga[2] = 'S'; int_printWord(frame->fs, (uint16_t*)&vga[4]); vga += 14; + vga[0] = 'G'; vga[2] = 'S'; int_printWord(frame->gs, (uint16_t*)&vga[4]); vga += 14; //vga[2]++; //printDword(frame, &vga[20]); @@ -220,18 +220,18 @@ void gpf_handler_v86(struct interrupt_frame *frame, unsigned long error_code) { } } done:; - //vga = (char*)0xb8000 + (160 * 13); - //vga[0] = 'I'; vga[2] = 'P'; int_printWord(frame->eip, (uint16_t*)&vga[4]); vga += 14; - //vga[0] = 'C'; vga[2] = 'S'; int_printWord(frame->cs, (uint16_t*)&vga[4]); vga += 14; - //vga[0] = 'F'; vga[2] = 'L'; int_printDword(frame->eflags, (uint16_t*)&vga[4]); vga += 14; - //vga = (char*)0xb8000 + (160 * 14); - //vga[0] = 'S'; vga[2] = 'P'; int_printWord(frame->esp, (uint16_t*)&vga[4]); vga += 14; - //vga[0] = 'S'; vga[2] = 'S'; int_printWord(frame->ss, (uint16_t*)&vga[4]); vga += 14; - //vga = (char*)0xb8000 + (160 * 15); - //vga[0] = 'E'; vga[2] = 'S'; int_printWord(frame->es, (uint16_t*)&vga[4]); vga += 14; - //vga[0] = 'D'; vga[2] = 'S'; int_printWord(frame->ds, (uint16_t*)&vga[4]); vga += 14; - //vga[0] = 'F'; vga[2] = 'S'; int_printWord(frame->fs, (uint16_t*)&vga[4]); vga += 14; - //vga[0] = 'G'; vga[2] = 'S'; int_printWord(frame->gs, (uint16_t*)&vga[4]); vga += 14; + vga = (char*)0xb8000 + (160 * 13); + vga[0] = 'I'; vga[2] = 'P'; int_printWord(frame->eip, (uint16_t*)&vga[4]); vga += 14; + vga[0] = 'C'; vga[2] = 'S'; int_printWord(frame->cs, (uint16_t*)&vga[4]); vga += 14; + vga[0] = 'F'; vga[2] = 'L'; int_printDword(frame->eflags, (uint16_t*)&vga[4]); vga += 14; + vga = (char*)0xb8000 + (160 * 14); + vga[0] = 'S'; vga[2] = 'P'; int_printWord(frame->esp, (uint16_t*)&vga[4]); vga += 14; + vga[0] = 'S'; vga[2] = 'S'; int_printWord(frame->ss, (uint16_t*)&vga[4]); vga += 14; + vga = (char*)0xb8000 + (160 * 15); + vga[0] = 'E'; vga[2] = 'S'; int_printWord(frame->es, (uint16_t*)&vga[4]); vga += 14; + vga[0] = 'D'; vga[2] = 'S'; int_printWord(frame->ds, (uint16_t*)&vga[4]); vga += 14; + vga[0] = 'F'; vga[2] = 'S'; int_printWord(frame->fs, (uint16_t*)&vga[4]); vga += 14; + vga[0] = 'G'; vga[2] = 'S'; int_printWord(frame->gs, (uint16_t*)&vga[4]); vga += 14; } extern void timerHandler(); diff --git a/kernel.c b/kernel.c index 751cdf6..c511c72 100644 --- a/kernel.c +++ b/kernel.c @@ -56,8 +56,12 @@ __attribute((__no_caller_saved_registers__)) extern void enter_v86(uint32_t ss, uint32_t esp, uint32_t cs, uint32_t eip); extern void v86Test(); extern void v86GfxMode(); +extern void v86TextMode(); +extern void v86DiskRead(); __attribute((__no_caller_saved_registers__)) extern char *jmp_usermode_test(); +__attribute((__no_caller_saved_registers__)) +extern void kbd_wait(); /* Real Mode Accessible (First MB) @@ -71,7 +75,8 @@ Real Mode Accessible (First MB) 20080 - 22080 TSS IOMAP (8kB) 22080 - 22400 Unused (896B) 22400 - 23000 Free (3kB) - 23000 - 80000 Free (372kB) + 23000 - 30000 Disk Buffer (52kB) + 30000 - 80000 Free (320kB) 80000 - 90000 Real Mode Stack (64kB) 90000 - A0000 Free (64kB) A0000 - FFFFF BIOS Area (384kB) @@ -127,5 +132,15 @@ void start() { for (int i = 0; i < 320; i++) { vga[i] = i; } + kbd_wait(); + v86_entry = i386LinearToFp(v86TextMode); + enter_v86(0x8000, 0xFF00, FP_SEG(v86_entry), FP_OFF(v86_entry)); + v86_entry = i386LinearToFp(v86DiskRead); + enter_v86(0x8000, 0xFF00, FP_SEG(v86_entry), FP_OFF(v86_entry)); + vga_text = (word *)0xb8000; + char *bootloader = (char *)0x23000; + for (int i = 0; i < (80*25)/2; i++) { + printByte(bootloader[i], &vga_text[i*2]); + } } diff --git a/v86.nasm b/v86.nasm index 091d9a1..0935cbe 100644 --- a/v86.nasm +++ b/v86.nasm @@ -51,6 +51,27 @@ mov ax, 0x13 int 0x10 int 0x30 jmp $ +global v86TextMode +v86TextMode: +mov ax, 0x3 +int 0x10 +int 0x30 +jmp $ +global v86DiskRead +v86DiskRead: +xor ax, ax ; TODO fix assuming we're in first 64k +mov ds, ax +mov ah, 0x42 +mov dl, 0x80 ; TODO get this from BIOS or something +mov si, v86disk_addr_packet ; ds:si +int 0x13 +int 0x30 +jmp $ +v86disk_addr_packet: +db 0x10, 0x00 ; size, reserved +dw 0x20 ; blocks +dd 0x23000000 ; transfer buffer 0x23000 +dq 0 ; start block [BITS 32] ; extern void enter_v86(uint32_t ss, uint32_t esp, uint32_t cs, uint32_t eip); global enter_v86