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 bootloader.bin: src/bootloader/bootloader.asm
nasm -f bin -o bootloader.bin src/bootloader/bootloader.asm nasm -f bin -o bootloader.bin src/bootloader/bootloader.asm
bootloader.flp: bootloader.bin kernel.bin: src/kernel.asm
dd status=noxfer conv=notrunc if=bootloader.bin of=bootloader.flp nasm -f bin -o kernel.bin src/kernel.asm
start: bootloader.flp thor.flp: bootloader.bin kernel.bin
qemu-kvm -fda bootloader.flp 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: clean:
rm -f bootloader.bin 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 ; Start in real mode
rm_start: rm_start:
@ -6,13 +6,13 @@ rm_start:
; 1. Set stable environment ; 1. Set stable environment
; Set stack space (4K) and stack segment ; Set stack space (4K) and stack segment
mov ax, 07C0h mov ax, 0x7C0
add ax, 288 add ax, 288
mov ss, ax mov ss, ax
mov sp, 4096 mov sp, 4096
; Set data segment ; Set data segment
mov ax, 07C0h mov ax, 0x7C0
mov ds, ax mov ds, ax
; 2. Welcome the user to the bootloader ; 2. Welcome the user to the bootloader
@ -36,10 +36,9 @@ rm_start:
call new_line call new_line
; Enable A20 gate ; Enable A20 gate
in al, 0x92
in al, 0x92 or al, 2
or al, 2 out 0x92, al
out 0x92, al
; Wait for any key ; Wait for any key
call key_wait call key_wait
@ -47,12 +46,48 @@ rm_start:
mov si, load_kernel mov si, load_kernel
call print_line 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 jc reset_failed
jmp $
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 ; Functions
@ -107,6 +142,12 @@ key_wait:
press_key_msg db 'Press any key to load the kernel...', 0 press_key_msg db 'Press any key to load the kernel...', 0
load_kernel db 'Attempt 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 ; Make a real bootsector
times 510-($-$$) db 0 times 510-($-$$) db 0
dw 0xAA55 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