thor-os/bootloader/stage2.asm
Baptiste Wicht 35ba77cb0f Start migrating from floppy to hard disk
Move stage1 into the MBR boot code
Move stage2 into the second sector of the hard disk
2013-12-31 15:16:04 +01:00

144 lines
2.4 KiB
NASM

;=======================================================================
; Copyright Baptiste Wicht 2013.
; Distributed under the Boost Software License, Version 1.0.
; (See accompanying file LICENSE_1_0.txt or copy at
; http://www.boost.org/LICENSE_1_0.txt)
;=======================================================================
[BITS 16]
jmp second_step
%include "intel_16.asm"
%include "sectors.asm"
KERNEL_BASE equ 0x100 ; 0x100:0x0 = 0x1000
bootdev equ 0x0
; Loaded at 0x90:0x0
second_step:
; Set data segment
mov ax, 0x90
mov ds, ax
mov si, load_kernel
call print_line_16
jmp $
; Reset disk drive
xor ax, ax
mov dl, bootdev
int 0x13
jc reset_failed
; Loading the kernel from floppy
mov ax, KERNEL_BASE
mov es, ax
xor di, di
.next:
; Make sure the second part of the address is 0x0
xor bx, bx
; Read one sector
mov ah, 0x2 ; Read sectors from memory
mov al, 1 ; Number of sectors to read
mov ch, [cylinder] ; Cylinder
mov cl, [sector] ; Sector
mov dh, [head] ; Head
mov dl, bootdev ; Drive
int 0x13
jc read_failed
test ah, ah
jne read_failed
cmp al, 1
jne read_failed
mov si, star
call print_16
inc di
cmp di, sectors
jne .continue
mov si, kernel_loaded
call print_line_16
;Run the kernel
jmp dword KERNEL_BASE:0x0
.continue:
mov cl, [sector]
inc cl
mov [sector], cl
cmp cl, 19
jne .next_sector
mov cl, 1
mov [sector], cl
mov dh, [head]
inc dh
mov [head], dh
cmp dh, 2
jne .next_sector
xor dh, dh
mov [head], dh
mov ch, [cylinder]
inc ch
mov [cylinder], ch
.next_sector:
mov ax, es
add ax, 0x20 ; 0x20:0x0 = 512 (sector size)
mov es, ax
jmp .next
reset_failed:
mov si, reset_failed_msg
call print_line_16
jmp error_end
read_failed:
mov si, read_failed_msg
call print_line_16
error_end:
mov si, load_failed
call print_line_16
jmp $
; Variables
sector db 1
head db 0
cylinder db 1
; Constant Datas
load_kernel db 'Attempt to load the kernel...', 0
kernel_loaded db 'Kernel fully loaded', 0
star db '*', 0
reset_failed_msg db 'Reset disk failed', 0
read_failed_msg db 'Read disk failed', 0
load_failed db 'Kernel loading failed', 0
; Make it one sector exactly
times 512-($-$$) db 0