diff options
Diffstat (limited to 'boot/stage2.asm')
| -rw-r--r-- | boot/stage2.asm | 108 |
1 files changed, 97 insertions, 11 deletions
diff --git a/boot/stage2.asm b/boot/stage2.asm index ebc346e..3fde5c1 100644 --- a/boot/stage2.asm +++ b/boot/stage2.asm @@ -27,10 +27,10 @@ ;we want 16-bit instructions, before we switch to 32-bit protected mode. [bits 16] -;define origin of boot record in memory: 0x7c00 +;define origin of boot record in memory: 0x7c00 was bootloader0 ;this is where the BIOS per definition will put the first ;512 bytes of data from the boot device -;The Boot record is identified by the last 2 magic bytes: 0xaa55 (?) +;wer are one sector after that. [org 0x7e00] ;;define some constants @@ -49,6 +49,8 @@ jmp boot_16 ;start boot process ;;SOME Global Data, mainly info/error strings BOOT_DRIVE: db 0xff +KERNEL_CHUNK: + dw 0x1 STR_VERSION: db "Fool Loader Stage 2 v0.5",0 @@ -58,6 +60,8 @@ STR_BOOT: db "Boot Drive: ",0 MEMMAP_INFO: db "Getting Memory Map from BIOS.",0 +STR_PM: + db "PROTECTED MODE",0 ; ;;lets put our temporary GDT (Global Descriptor Table) here @@ -72,6 +76,11 @@ MEMMAP_INFO: ; ;;include our routines for switching to 32-bit protected mode %include "boot/pm.asm" + +;include some pm mode helpers +%include "boot/common_pm.asm" + +; ; ; ;;get memory map routine @@ -82,29 +91,27 @@ MEMMAP_INFO: ;;lets start [bits 16] +idt_real: + dw 0x3ff ; 256 entries, 4b each = 1K + dd 0 ; Real Mode IVT @ 0x0000 + boot_16: mov [BOOT_DRIVE],dl -; pr info + ;pr info mov bx, STR_VERSION call print_string call print_nextline + ;show bootdrive mov bx, STR_BOOT call print_string mov al,dl call print_hex_byte call print_nextline - ;show bootdrive - ; Load the KERNEL Image - mov bx, STR_LOAD - call print_string - call print_nextline - call disk_load_16 - ; memmap message mov bx,MEMMAP_INFO call print_string @@ -117,7 +124,13 @@ boot_16: call BiosGetMemoryMap ; this will also put the number of entries ; of the memory map at MEMMAP_SIZE_OFFSET - call VesaSetup +kernel_load: + ; Load the KERNEL Image + mov bx, STR_LOAD + call print_string + call print_nextline + call disk_load_16 + call switch_to_pm ; @@ -132,8 +145,81 @@ boot_32_pm: or al, 2 out 0x92, al + + ; tell the world we are protected + mov ebx,STR_PM + mov ecx,2*23*80 + call print_string_pm + + push edx ; persist edx for some reason!? + + mov edx,0 + mov dx,[KERNEL_CHUNK] + mov ecx,2*24*80 + call print_hex_pm + + + + ; here we should move the chunk away or stop the loop if everything loaded. + mov ax,[KERNEL_CHUNK] + add ax,1 + mov [KERNEL_CHUNK],ax + + ; here we should copy the chunk into ext mem! + + + + + ; and now go back to real! (first 16bit protected!) + cmp edx,0x20 + je finish_load + pop edx + + + + jmp CODE16_SEG:reinit_16 + finish_load: + ; + + call VesaSetup + ; call kernel! mov eax,0 ;tell the kernel ; we are the booting processor call 0x18000 ;jump into our Kernel! + +[bits 16] +reinit_16: ;16 bit protected mode + + mov eax,DATA16_SEG + mov ds,eax + mov es,eax + mov fs,eax + mov gs,eax + mov ss,eax + + + mov eax,cr0 + and eax,!0x1 ; Disable protected mode + mov cr0, eax + + jmp 0:realmode + + +realmode: + + mov sp,0x07bff + mov bp,sp + + mov ax,0 + mov ds,ax + mov es,ax + mov fs,ax + mov gs,ax + mov ss,ax + + lidt [idt_real] + + sti + jmp kernel_load |
