Working version of reading the kernel from the floppy

This commit is contained in:
Baptiste Wicht 2013-10-10 17:10:31 +02:00
parent af31af2d46
commit 93a44ef339
3 changed files with 145 additions and 17 deletions

View File

@ -1,14 +1,19 @@
default: bootloader.flp
default: thor.flp
bootloader.bin: src/bootloader/bootloader.asm
nasm -f bin -o bootloader.bin src/bootloader/bootloader.asm
bootloader.flp: bootloader.bin
dd status=noxfer conv=notrunc if=bootloader.bin of=bootloader.flp
kernel.bin: src/kernel.asm
nasm -f bin -o kernel.bin src/kernel.asm
start: bootloader.flp
qemu-kvm -fda bootloader.flp
thor.flp: bootloader.bin kernel.bin
cat bootloader.bin > thor.bin
cat kernel.bin >> thor.bin
dd status=noxfer conv=notrunc if=thor.bin of=thor.flp
start: thor.flp
qemu-kvm -fda thor.flp
clean:
rm -f bootloader.bin
rm -f bootloader.flp
rm -f thor.flp

View File

@ -1,4 +1,4 @@
[BITS 16]
[BITS 16]
; Start in real mode
rm_start:
@ -6,13 +6,13 @@ rm_start:
; 1. Set stable environment
; Set stack space (4K) and stack segment
mov ax, 07C0h
mov ax, 0x7C0
add ax, 288
mov ss, ax
mov sp, 4096
; Set data segment
mov ax, 07C0h
mov ax, 0x7C0
mov ds, ax
; 2. Welcome the user to the bootloader
@ -36,10 +36,9 @@ rm_start:
call new_line
; Enable A20 gate
in al, 0x92
or al, 2
out 0x92, al
in al, 0x92
or al, 2
out 0x92, al
; Wait for any key
call key_wait
@ -47,12 +46,48 @@ rm_start:
mov si, load_kernel
call print_line
; 3. Get ready for protected mode
BASE equ 0x100 ; 0x0100:0x0 = 0x1000
sectors equ 0x20 ; sectors to read
; TODO
; Reset disk drive
xor ax, ax
xor ah, ah
mov dl, 0
int 0x13
; Infinite loop to not exit directly the system
jmp $
jc reset_failed
mov ax, BASE
mov es, ax
xor bx, bx
mov ah, 0x2 ; Read sectors from memory
mov al, sectors ; Number of sectors to read
xor ch, ch ; Cylinder 0
mov cl, 2 ; Sector 2
xor dh, dh ; Head 0
mov dl, [bootdev] ; Drive
int 0x13
jc read_failed
jmp dword BASE:0x0
reset_failed:
mov si, reset_failed_msg
call print_line
jmp error_end
read_failed:
mov si, read_failed_msg
call print_line
error_end:
mov si, load_failed
call print_line
jmp $
; Functions
@ -107,6 +142,12 @@ key_wait:
press_key_msg db 'Press any key to load the kernel...', 0
load_kernel db 'Attempt to load the kernel...', 0
reset_failed_msg db 'Reset disk failed', 0
read_failed_msg db 'Read disk failed', 0
load_failed db 'Kernel loading failed', 0
bootdev db 0
; Make a real bootsector
times 510-($-$$) db 0
dw 0xAA55

82
src/kernel.asm Normal file
View File

@ -0,0 +1,82 @@
jmp _start
[BITS 16]
_start:
; Set stack space
mov ax, 0x9000
mov ss, ax
mov sp, 0xffff
; Set data segment
mov ax, 0x100
mov ds, ax
call new_line
mov si, kernel_header_0
call print_line
mov si, kernel_header_1
call print_line
mov si, kernel_header_2
call print_line
call new_line
jmp $
; Functions
new_line:
mov ah, 0Eh
mov al, 0Ah
int 10h
mov al, 0Dh
int 10h
ret
print_line:
mov ah, 0Eh
.repeat:
lodsb
cmp al, 0
je .done
int 10h
jmp .repeat
.done:
call new_line
ret
key_wait:
mov al, 0xD2
out 64h, al
mov al, 0x80
out 60h, al
keyup:
in al, 0x60
and al, 10000000b
jnz keyup
Keydown:
in al, 0x60
ret
; Datas
kernel_header_0 db '******************************', 0
kernel_header_1 db 'Welcome to Thor OS!', 0
kernel_header_2 db '******************************', 0
; Fill the sector
times 512-($-$$) db 0