summaryrefslogtreecommitdiff
path: root/boot/stage2.asm
diff options
context:
space:
mode:
authorMichal Idziorek <m.i@gmx.at>2014-10-24 01:42:05 +0200
committerMichal Idziorek <m.i@gmx.at>2014-10-24 01:42:05 +0200
commit831df8bcb2717442a41464533bacf0a58a4af0ce (patch)
tree5422b40b6d303a709dac5c6cf6a386df9e071227 /boot/stage2.asm
parent01c79415ed46f645f46287ce3b033943fb9dcb1e (diff)
working on bootloader (extended mem) (broken!)
Diffstat (limited to 'boot/stage2.asm')
-rw-r--r--boot/stage2.asm108
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