99 lines
1.5 KiB
NASM
99 lines
1.5 KiB
NASM
[BITS 16]
|
|
[ORG 0x7C00]
|
|
|
|
KERNEL_OFFSET equ 0x1000
|
|
STACK_BASE equ 0x9000
|
|
|
|
start:
|
|
cli
|
|
xor ax, ax
|
|
mov ds, ax
|
|
mov es, ax
|
|
mov ss, ax
|
|
mov sp, STACK_BASE
|
|
sti
|
|
|
|
mov [boot_drive], dl
|
|
|
|
mov si, banner
|
|
call print_string
|
|
|
|
call load_kernel
|
|
|
|
call switch_to_pm
|
|
|
|
jmp $
|
|
|
|
load_kernel:
|
|
mov si, loading_msg
|
|
call print_string
|
|
|
|
mov bx, KERNEL_OFFSET
|
|
mov dh, 15
|
|
mov dl, [boot_drive]
|
|
call disk_load
|
|
|
|
mov si, loaded_msg
|
|
call print_string
|
|
ret
|
|
|
|
disk_load:
|
|
pusha
|
|
push dx
|
|
|
|
mov ah, 0x02
|
|
mov al, dh
|
|
mov cl, 0x02
|
|
mov ch, 0x00
|
|
mov dh, 0x00
|
|
|
|
int 0x13
|
|
jc disk_error
|
|
|
|
pop dx
|
|
cmp al, dh
|
|
jne sectors_error
|
|
popa
|
|
ret
|
|
|
|
disk_error:
|
|
mov si, disk_error_msg
|
|
call print_string
|
|
jmp disk_loop
|
|
|
|
sectors_error:
|
|
mov si, sectors_error_msg
|
|
call print_string
|
|
|
|
disk_loop:
|
|
jmp $
|
|
|
|
print_string:
|
|
lodsb
|
|
cmp al, 0
|
|
je done
|
|
mov ah, 0x0e
|
|
int 0x10
|
|
jmp print_string
|
|
done:
|
|
ret
|
|
|
|
%include "gdt.asm"
|
|
%include "print32.asm"
|
|
%include "switch_pm.asm"
|
|
|
|
[BITS 32]
|
|
BEGIN_PM:
|
|
mov ebx, KERNEL_OFFSET
|
|
call ebx
|
|
jmp $
|
|
|
|
boot_drive db 0
|
|
banner db 'ColdBoot v1.0 - Starting...', 0x0D, 0x0A, 0
|
|
loading_msg db 'Loading kernel...', 0x0D, 0x0A, 0
|
|
loaded_msg db 'Kernel loaded, switching to 32-bit...', 0x0D, 0x0A, 0
|
|
disk_error_msg db 'Disk read error!', 0x0D, 0x0A, 0
|
|
sectors_error_msg db 'Sectors read error!', 0x0D, 0x0A, 0
|
|
|
|
times 510 - ($-$$) db 0
|
|
dw 0xaa55 |