121 lines
2.4 KiB
NASM
121 lines
2.4 KiB
NASM
|
INCLUDE 'const.inc'
|
||
|
|
||
|
ORG STAGE0_BASE
|
||
|
USE16
|
||
|
|
||
|
jmp short _start
|
||
|
nop
|
||
|
|
||
|
; Boot Record
|
||
|
OEM_identifier db 'STUPID '
|
||
|
bytes_per_sector dw 512
|
||
|
sectors_per_cluster db 1
|
||
|
reserved_sectors dw 1
|
||
|
FAT_count db 2
|
||
|
root_dir_entries dw 224
|
||
|
total_sectors dw 2880
|
||
|
media_desc_type db 0xF0
|
||
|
sectors_per_FAT dw 9
|
||
|
sectors_per_track dw 18
|
||
|
heads_per_cylinder dw 2
|
||
|
hidden_sectors dd 0
|
||
|
large_sector_count dd 0
|
||
|
|
||
|
; Extended Boot Record
|
||
|
drive_number db 0x0
|
||
|
reserved db 0x0
|
||
|
signature db 0x29 ; 0x28 or 0x29
|
||
|
volume_id dd 0xB00B135 ; hope mine will grow :'(
|
||
|
volume_label db 'Stupid Boot'
|
||
|
system_id db 'FAT12 '
|
||
|
|
||
|
|
||
|
_start:
|
||
|
cli
|
||
|
cld
|
||
|
jmp 0x0:.canonicalize_cs
|
||
|
|
||
|
.canonicalize_cs:
|
||
|
xor ax, ax
|
||
|
mov ds, ax
|
||
|
mov ss, ax
|
||
|
mov es, ax
|
||
|
mov sp, 0x7c00
|
||
|
|
||
|
mov [drive_number], dl
|
||
|
|
||
|
; reset floppy disk
|
||
|
@@:
|
||
|
mov dl, [drive_number]
|
||
|
xor ah, ah
|
||
|
int 0x13
|
||
|
jc @b
|
||
|
|
||
|
call fat_load_root
|
||
|
|
||
|
; search in root directory
|
||
|
|
||
|
mov si, kernel_file
|
||
|
call fat_search_root
|
||
|
jc .error_not_found
|
||
|
mov [kernel_start], ax
|
||
|
|
||
|
mov si, stage1_file
|
||
|
call fat_search_root
|
||
|
jc .error_not_found
|
||
|
mov [stage1_start], ax
|
||
|
|
||
|
; load fat
|
||
|
xor ax, ax
|
||
|
mov al, [FAT_count]
|
||
|
mul word [sectors_per_FAT]
|
||
|
mov cx, ax
|
||
|
mov ax, [reserved_sectors]
|
||
|
|
||
|
xor bx, bx
|
||
|
|
||
|
call disk_read_sectors
|
||
|
|
||
|
; preload kernel
|
||
|
mov ax, KERNEL_PRELOAD/0x10
|
||
|
mov es, ax
|
||
|
mov ax, [kernel_start]
|
||
|
xor bx, bx
|
||
|
call fat_load_binary
|
||
|
|
||
|
; load stage 2
|
||
|
mov ax, STAGE1_BASE/0x10
|
||
|
mov es, ax
|
||
|
mov ax, [stage1_start]
|
||
|
xor bx, bx
|
||
|
call fat_load_binary
|
||
|
|
||
|
jmp 0x0:STAGE1_BASE
|
||
|
|
||
|
.error_not_found:
|
||
|
push si
|
||
|
mov si, msg_error
|
||
|
call bios_print
|
||
|
pop si
|
||
|
call bios_print
|
||
|
mov si, msg_not_found
|
||
|
call bios_print
|
||
|
hlt
|
||
|
jmp $
|
||
|
|
||
|
INCLUDE "utils.inc"
|
||
|
INCLUDE "fat12.inc"
|
||
|
|
||
|
msg_error db "ERROR: ", 0
|
||
|
msg_not_found db " not found", CR, LF, 0
|
||
|
|
||
|
kernel_file db "VMSTUPIDSYS", 0
|
||
|
stage1_file db "STPDBOOTSYS", 0
|
||
|
|
||
|
kernel_start dw 0x0
|
||
|
stage1_start dw 0x0
|
||
|
|
||
|
|
||
|
rb 0x7C00+512-2-$
|
||
|
db 0x55, 0xAA
|