diff options
Diffstat (limited to 'boot/mbr.asm')
| -rw-r--r-- | boot/mbr.asm | 93 |
1 files changed, 35 insertions, 58 deletions
diff --git a/boot/mbr.asm b/boot/mbr.asm index 32f1a6f..2beac7b 100644 --- a/boot/mbr.asm +++ b/boot/mbr.asm @@ -6,12 +6,31 @@ ; ; we have just been loaded by the BIOS and are in 16-bits real mode! ; -; THIS IS THE CENTRAL FILE OF THE BOOTLOADER, after we finished we -; are inside the C kernel! +; THIS IS THE CENTRAL FILE OF THE BOOTLOADER, +; +; after we are through, +; the following work has been accomplished (chronologically): +; +; * BOOT_DRIVE is set +; +; * 50 sectors of our kernel are loaded at KERNEL_OFFSET from floppy +; +; * memoru map is available at MEMMAP_OFFSET +; (look at MEMMEP_SIZE_OFFSET for number of entries) +; +; * the vesa mode specified by VESA_MODE_SELECT is set up +; (at VESA_MODES, and VESA_MODE_INFO additional info structs are available) +; +; * 32-bit protected mode was set up. +; +; * A20 gate is open +; +; * PICs are configured +; +; * we are inside the C kernel! ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;we want 16-bit instructions, before we switch to 32-bit protected mode. ;define origin of boot record in memory: 0x7c00 ;this is where the BIOS per definition will put the first @@ -19,42 +38,34 @@ ;The Boot record is identified by the last 2 magic bytes: 0xaa55 (?) [org 0x7c00] -;define where we will load our kernel into memory +;define where we will load our kernel into memory and some +;other memory locations KERNEL_OFFSET equ 0x1000 MEMMAP_SIZE_OFFSET equ 0x7c00+0x600 MEMMAP_OFFSET equ 0x7c00+0x400 VESA_MODES equ 0x8300 VESA_MODE_INFO equ 0x8400 VESA_MODE_SELECT equ 0x4114 -;VESA_MODE_SELECT equ 0x411A +;we want 16-bit instructions, before we switch to 32-bit protected mode. [bits 16] jmp boot_16 ;start boot process +;SOME Global Data, mainly strings BOOT_DRIVE: db 0xff - -;SOME Global Data, mainly strings STR_VERSION: db "v0.2~",0 VESA_CHECK: db "vesa check.",0 -;STR_PROT: -; db "32-bit PM",0 -;STR_LOADED: -; db "loaded",0 - ;lets put our temporary GDT (Global Descriptor Table) here %include "boot/GDT.asm" ;include 16-bit real mode routines (print_string, disk_load) -%include "boot/common.asm" -%include "boot/print16.asm" - -;include 32-bit Protected Mode routines (print_string_pm,print_hex_pm) -;%include "boot/common_pm.asm" +%include "boot/disk_load_16.asm" +%include "boot/print_string_16.asm" ;include our routines for switching to 32-bit protected mode %include "boot/pm.asm" @@ -62,7 +73,7 @@ VESA_CHECK: ;pic mapping %include "boot/pic.asm" -;memory map +;get memory map %include "boot/memmap.asm" ;;;;;;;; BOOT 16-bit real ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -82,21 +93,12 @@ boot_16: ;remember BOOT_DRIVE (as was set by BIOS) mov [BOOT_DRIVE],dl - ;print FoolOS version info -; mov bx, STR_VERSION -; call print_string - - ;Load the KERNEL + ;Load the KERNEL (50 sectors starting at sector 2) mov bx,KERNEL_OFFSET mov dh, 50 ;50 sectors! mov dl, [BOOT_DRIVE] call disk_load - ;print info message that kernel was loaded -; mov bx, STR_LOADED -; call print_string - - ;get memory map from bios before we enter 32 bit protected mode mov ax,0 ; set target address in es:di (0:offset) mov es,ax @@ -104,7 +106,8 @@ boot_16: call BiosGetMemoryMap ; this will also put the number of entries ; of the memory map at MEMMAP_SIZE_OFFSET - ;get vesa modes! + ;VESA: also setup vesa stuff before entering 32 bit protected mode + ;VESA: get all available vesa modes! mov ax,0 ; set target address in es:di (0:offset) mov es,ax mov di,VESA_MODES @@ -119,7 +122,7 @@ boot_16: vesa_ok: ; - ;get info on mode of interest + ;VESA: get vesa info on mode of interest mov ax,0 ; set target address in es:di (0:offset) mov es,ax mov di,VESA_MODE_INFO @@ -134,7 +137,7 @@ boot_16: jmp vesa_err2 vesa_ok2: - ;finally switch to the mode of choice! + ;VESA: finally switch to the mode of choice! mov ax,0x4f02 ;vesa function: Set Mode mov bx,VESA_MODE_SELECT int 0x10 @@ -148,11 +151,6 @@ boot_32_pm: ; we could do ALL This inside the kernel!!!!!! TODO - ;print info message that we are in protected mode! -; mov ecx,160 -; mov ebx,STR_PROT -; call print_string_pm - ;enable A20 ;http://www.brokenthorn.com/Resources/OSDev9.html ;Method 3.1: Enables A20 through keyboard controller @@ -162,32 +160,11 @@ boot_32_pm: ;pic setup call pic_setup - call KERNEL_OFFSET ;jump into our Kernel it - -;idt_descriptor: -; dw idt_end-idt_start-1 -; dd KERNEL_OFFSET -;;;; DEBUGGING STUFF -;times 8 db '@' -;dw interrupt -;times 8 db '@' -;dw interrupt2 -;times 8 db '@' + call KERNEL_OFFSET ;jump into our Kernel! ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - ;so we get identified as MBR times 510-($-$$) db 0 dw 0xaa55 -;interrupt descriptor table (hardcoded address of interrupts:) -;idt_start: -;times 33 db 0x50,0x7c,0x08,0x00,0x00,10001110b,0x0,0x0 -;db 0x59,0x7c,0x08,0x00,0x00,10001110b,0x0,0x0 -;times 253 db 0x50,0x7c,0x08,0x00,0x00,10001110b,0x0,0x0 -;idt_end: - - - - |
