90 lines
1.4 KiB
NASM
Executable file
90 lines
1.4 KiB
NASM
Executable file
format binary
|
|
org 0x7c00
|
|
use16
|
|
|
|
jmp short start
|
|
nop
|
|
|
|
;; reserved for (E)BPB (which BIOS might scramble)
|
|
;; you could also have one that *could* work
|
|
times 0x3B db 0
|
|
start:
|
|
|
|
;; setup segments
|
|
;; setup stack
|
|
;; trust nothing
|
|
cld
|
|
mov ax, 0
|
|
mov ds, ax
|
|
mov es, ax
|
|
|
|
mov ss, ax
|
|
mov sp, 0x7c00 ;stack down from our load address
|
|
mov bp, sp
|
|
|
|
;; ensure VGA textmode
|
|
mov ah, 0x00
|
|
mov al, 0x03 ;Colour Text mode 3 80x25
|
|
int 0x10
|
|
|
|
;; storeBootdiskNum
|
|
mov [diskNum], dl
|
|
|
|
checkLBASupport:
|
|
;; Set AH = 0x41
|
|
;; BX = 0x55AA
|
|
;; DL = drive
|
|
;; INT 0x13
|
|
|
|
mov si, msg.lba
|
|
mov ah, 0x41
|
|
mov bx, 0x55AA
|
|
int 0x13
|
|
|
|
jc msg.error
|
|
test bx, 0xAA55
|
|
jz msg.error
|
|
test cx, cx
|
|
jp msg.error
|
|
|
|
|
|
getPartitionLBA:
|
|
;; 1st partition entry at 0x1BE (16 bytes)
|
|
;; LBA start 4bytes at 0x1BE + 0x08
|
|
;; Sectors count 4bytes at 0x1BE + 0x0C
|
|
|
|
;; so uhmmmm, read those and use 'em to find next peace of data?
|
|
;; Wait is my MBR one block that is read at once? Lol wait MBR
|
|
;; is also part of my own current loaded memory!
|
|
|
|
|
|
|
|
nomoreThings:
|
|
mov si, msg.nop
|
|
jmp msg.ok
|
|
endloop:
|
|
nop
|
|
jmp endloop
|
|
|
|
msg:
|
|
.ok:
|
|
mov ah, 0x20 ;greenblack
|
|
jmp .prepare
|
|
.error:
|
|
mov ah, 0x47 ;redgray
|
|
.prepare:
|
|
mov bx, 0xb800
|
|
mov es, bx
|
|
mov edi, 0
|
|
.loop:
|
|
lodsb
|
|
test al, al
|
|
jz endloop
|
|
stosw
|
|
jmp .loop
|
|
|
|
.lba db "Inadequate LBA support: Ancient computor or floppy?", 0
|
|
.nop db "Nothingtodo :'(", 0
|
|
|
|
;; Store some data
|
|
diskNum db 0x00
|