StupidOS/boot/boot.asm

126 lines
2.4 KiB
NASM

ORG 0x7C00
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
; clear screen
mov al, 0x03
mov ah, 0
int 0x10
mov si, msg_hello
call bios_print
; reset floppy disk
@@:
xor ah, ah
int 0x13
jc @b
mov si, msg_load_stage
call bios_print
; read sector into ES:BX (0100:0000)
mov ax, 0x100 ; 100 segment
mov es, ax ; 0100:0000 (0000:1000)
xor bx, bx
mov ah, 0x2 ; read
mov al, 0x1 ; one sector
mov ch, 0x0 ; cylinder 0
mov cl, 0x2 ; second sector
mov dh, 0x0 ; head 0
int 0x13
jc .error
jmp 0x0:0x1000
.error:
mov si, msg_error_sector
call bios_print
hlt
jmp $
bios_print:
lodsb
or al, al
jz @f
mov ah, 0x0E
int 0x10
jmp bios_print
@@:
ret
msg_hello db "StupidOS Bootloader", 0x0D, 0x0A, 0
msg_load_stage db "Loading next stage", 0x0D, 0x0A, 0
msg_error_sector db "ERROR: Can't read sector", 0x0D, 0x0A, 0
rb 0x7C00+512-2-$
db 0x55, 0xAA
; ---------- stage 1 --------------
ORG 0x1000
stage2:
push cs
pop ds
mov si, msg_stage2
call bios_print
call a20_enable
jc .error_a20
xchg bx, bx
jmp .hang
.error_a20:
mov si, msg_error_a20
call bios_print
.hang:
hlt
jmp $
INCLUDE 'a20.inc'
msg_stage2 db "StupidOS Bootloader (Stage 2)", 0x0D, 0x0A, 0
msg_error_a20 db "ERROR: can't enable a20 line", 0x0D, 0x0A, 0