diff --git a/Makefile b/Makefile index 65aaa269..787216de 100644 --- a/Makefile +++ b/Makefile @@ -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 \ No newline at end of file + rm -f thor.flp \ No newline at end of file diff --git a/src/bootloader/bootloader.asm b/src/bootloader/bootloader.asm index ed344a9a..1f631e3a 100644 --- a/src/bootloader/bootloader.asm +++ b/src/bootloader/bootloader.asm @@ -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 \ No newline at end of file diff --git a/src/kernel.asm b/src/kernel.asm new file mode 100644 index 00000000..d3789199 --- /dev/null +++ b/src/kernel.asm @@ -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