It's a simple 32-bit protected mode loader that enables A20 and reads the kernel from an unformatted floppy, then jumps to it. Virtual PC (2007) gives the an unrecoverable processor error whenever I try to boot the DD-created image. Here's the code, for anyone who has the time to check it for errors:
Code: Select all
;;;
;; [ID]
;; Boot-Loader\Source\Boot-Loader.asm
;;
;; [Description]
;; Boot loader, or boot sector, for the Grakos kernel. The boot loader is
;; loaded at 0x7C00 by the BIOS startup routines.
;; After that, it loads the kernel at 0x1000 using the BIOS. Upon loading,
;; it disables interrupts, switches to protected mode, and starts the system.
;;
;; [Copyright]
;; Copyright (C) 2007, Griffinsoft Corporation
;;
;; [Web Site]
;; http://www.griffinsoft.net/
;;;
;; NASM is compiling 16-bit code
[BITS 16]
;; This is loaded at 0x7C00
[ORG 0x7C00]
;; Go directly to Start
jmp Start
;;;
;; [ID]
;; Start
;;
;; [Description]
;; Starts the loading process.
;;;
Start:
mov si, 0x100
mov ax, 0x1000
mov es, ax
mov ax, 0x0
mov bx, ax
mov cx, 0x0002
mov dx, ax
;;;
;; [ID]
;; ReadSector
;;
;; [Description]
;; Reads the sector.
;;;
ReadSector:
mov ax, 0x0201
int 0x13
mov ax, es
add ax, 0x20
mov es, ax
dec si
jz ReadSectorEnd
inc cl
cmp cl, 0x12
jbe ReadSector
mov cl, 1
inc dh
cmp dh, 2
jne ReadSector
mov dh, 0
inc ch
jmp ReadSector
;;;
;; [ID]
;; ReadSectorEnd
;;
;; [Description]
;; Kills the floppy drive.
;;;
ReadSectorEnd:
pusha
mov al, 0x0C
mov dx, 0x3F2
out dx, al
popa
;;;
;; [ID]
;; EnableA20
;;
;; [Description]
;; Enables the A20 gate.
;;;
EnableA20:
in al, 0x64
test al, 2
jnz EnableA20
mov al, 0xD1
out 0x64, al
;;;
;; [ID]
;; EnterProtectedMode
;;
;; [Description]
;; Enters protected mode.
;;;
EnterProtectedMode:
in al, 0x64
and ax, byte 2
jnz EnterProtectedMode
mov al, 0xDF
out 0x60, al
cli
mov eax, cr0
or eax, 1
mov cr0, eax
jmp 0x8 : ProtectedMode
[BITS 32]
;;;
;; [ID]
;; ProtectedMode
;;
;; [Description]
;; Goes to the kernel.
;;;
ProtectedMode:
jmp 0x8 : 0x10000
;; Write the boot signature
times 510-($-$$) db 0
dw 0xAA55
- Jeremiah
Edit: Updated source code.