mirror of
https://github.com/subhobhai943/SUB-OS.git
synced 2026-10-25 16:52:29 +00:00
99 lines
1.9 KiB
NASM
99 lines
1.9 KiB
NASM
BITS 16
|
|
ORG 0x7C00
|
|
|
|
start:
|
|
; Set up segments and stack
|
|
cli
|
|
xor ax, ax
|
|
mov ds, ax
|
|
mov es, ax
|
|
mov ss, ax
|
|
mov sp, 0x7C00
|
|
sti
|
|
|
|
; Save boot drive number from BIOS (DL)
|
|
mov [BOOT_DRIVE], dl
|
|
|
|
; Print greeting
|
|
mov si, MSG_BOOT
|
|
call print_string
|
|
|
|
; Check for LBA extensions (INT 13h, AH=41h)
|
|
mov ah, 0x41
|
|
mov bx, 0x55AA
|
|
mov dl, [BOOT_DRIVE]
|
|
int 0x13
|
|
jc load_chs
|
|
cmp bx, 0xAA55
|
|
jne load_chs
|
|
|
|
load_lba:
|
|
; Load stage 2 using LBA (INT 13h, AH=42h)
|
|
; Read 15 sectors starting from LBA 1 to 0x0000:0x7E00
|
|
mov ah, 0x42
|
|
mov dl, [BOOT_DRIVE]
|
|
mov si, dap
|
|
int 0x13
|
|
jc disk_error
|
|
jmp jump_stage2
|
|
|
|
load_chs:
|
|
; Fallback: Load stage 2 using CHS (INT 13h, AH=02h)
|
|
mov ah, 0x02
|
|
mov al, 15 ; 15 sectors (sectors 2-16)
|
|
mov ch, 0 ; Cylinder 0
|
|
mov dh, 0 ; Head 0
|
|
mov cl, 2 ; Sector 2
|
|
xor bx, bx
|
|
mov es, bx
|
|
mov bx, 0x7E00 ; ES:BX = 0x0000:0x7E00
|
|
mov dl, [BOOT_DRIVE]
|
|
int 0x13
|
|
jc disk_error
|
|
|
|
jump_stage2:
|
|
; Pass boot drive in DL to Stage 2
|
|
mov dl, [BOOT_DRIVE]
|
|
jmp 0x0000:0x7E00
|
|
|
|
disk_error:
|
|
mov si, MSG_DISK_ERR
|
|
call print_string
|
|
.halt:
|
|
cli
|
|
hlt
|
|
jmp .halt
|
|
|
|
; BIOS Teletype string print (SI = null-terminated string)
|
|
print_string:
|
|
pusha
|
|
mov ah, 0x0E
|
|
.loop:
|
|
lodsb
|
|
test al, al
|
|
jz .done
|
|
int 0x10
|
|
jmp .loop
|
|
.done:
|
|
popa
|
|
ret
|
|
|
|
; Data
|
|
BOOT_DRIVE db 0
|
|
MSG_BOOT db "SUB-OS Bootloader...", 13, 10, 0
|
|
MSG_DISK_ERR db "Boot Disk Error!", 13, 10, 0
|
|
|
|
; Disk Address Packet for LBA
|
|
align 4
|
|
dap:
|
|
db 0x10 ; DAP size (16 bytes)
|
|
db 0 ; Reserved
|
|
dw 15 ; Read 15 sectors
|
|
dw 0x7E00 ; Offset
|
|
dw 0x0000 ; Segment
|
|
dq 1 ; Starting LBA (Sector 1)
|
|
|
|
; Boot Sector Signature
|
|
times 510 - ($ - $$) db 0
|
|
dw 0xAA55
|