Re-add support for booting from qemu harddisk

This commit is contained in:
Nero 2021-02-18 19:00:54 +00:00
parent 84b754551c
commit 8131db9b29
2 changed files with 31 additions and 119 deletions

View File

@ -64,6 +64,12 @@ fd%.img: $(DISTFILES) $(SYS)
mcopy -i $@ $(DISTFILES) :: mcopy -i $@ $(DISTFILES) ::
$(SYS) $@ @rdos.com $(SYS) $@ @rdos.com
hdd.img: mbr.bs @rdos.com fd1440.img
dd if=mbr.bs bs=512 count=1 of=$@
dd if=@rdos.com bs=512 seek=1 of=$@
dd if=fd1440.img bs=512 seek=63 of=$@
dd if=/dev/zero bs=512 seek=$$(( 63 * 23 )) count=63 of=$@
clean: clean:
rm -f *.com *.bs *.0 *.lst *.img *.bin *.rom rm -f *.com *.bs *.0 *.lst *.img *.bin *.rom
rm -f host/*.elf rm -f host/*.elf
@ -73,3 +79,6 @@ qemu-floppy3: fd1440.img $(ROMS)
qemu-floppy5: fd360.img $(ROMS) qemu-floppy5: fd360.img $(ROMS)
$(QEMU) $(QEMU_ARGS) -boot a -fda fd360.img $(QEMU) $(QEMU_ARGS) -boot a -fda fd360.img
qemu-hdd: hdd.img $(ROMS)
$(QEMU) $(QEMU_ARGS) -boot c -hda hdd.img

View File

@ -1,139 +1,42 @@
; blah dont judge me, i miss 8080
%macro retnz 0
jz short ($+2+1)
ret
%endmacro
%macro callc 1
jnc short ($+2+3)
call %1
%endmacro
%include "inc/bpb.asm"
%define bpb bs+0x0B
cpu 8086 cpu 8086
org 0x0600
bs: equ 0x7C00 %define seg 0x060
org 0x7C00 - (seg << 4)
init: cli init: cli
xor ax, ax mov ax, seg
mov ss, ax mov ss, ax
xor sp, sp
; save driver number
push dx
; save PnP ptr
push es
push di
; Relocate away from bootsector loading area
mov ds, ax mov ds, ax
mov es, ax mov es, ax
mov si, bs xor sp, sp
mov di, $$
mov cx, 0x100
rep movsw
jmp 0:main .retry: mov bx, 7
mov ax, 0x0e2e
int 0x10
%include "inc/booterr.asm" mov ax, 0x0210
mov cx, 2
mov dh, 0
mov bx, 0x100
; find active partition or bail out
; result in si
findp: mov si, part1
mov cx, 4
.loop: test BYTE [si], 0x80
retnz
add si, 0x10
loop .loop
call errcll
main: ; find active partition
call findp
; transfer starting address into DAP
push si
add si, 0x08
mov di, dap.num
movsw
movsw
pop si
; load sector
push si
mov si, dap
mov ah, 0x42
stc
int 0x13 int 0x13
callc errcll jc .retry
pop si
; FAT bpb has "bytes per sector" at this place jmp seg:0x100
; we support only 512 byte sectors anyways
cmp word [bpb+BPBSS], 512
jne chain
; Media descriptor byte is never smaller than 0xF0
cmp byte [bpb+BPBMD], 0xF0
jc chain
; ask BIOS what our disk geometry is
mov ah, 0x08
stc
int 0x13
jc chain
; ES might be messed up from int 13h, fix it
push cs
pop es
; update sectors per track
xor ax, ax
mov al, cl
mov [bpb+BPBSPT], ax
; update number of sides
xor ax, ax
mov al, dh
mov [bpb+BPBNOS], ax
; update partition offset
push si
add si, 0x08
mov di, bpb+BPBHS
movsw
movsw
pop si
chain: ; restore PnP structure
pop di
pop es
pop dx
xor cx, cx
mov bp, si
; chain into partition boot sector
jmp 0:bs
dap:
.size: db 0x10
db 0
.count: dw 1
.buf: dw bs
dw 0
.num: dq 0
times (0x1BE - ($-$$)) db 0 times (0x1BE - ($-$$)) db 0
; assumes 16 heads, 63 sectors per track
; image of 1.44 MB floppy starting on 2nd track
part1: db 0x80 part1: db 0x80
db 1, 1, 0
db 1
db 0xFF, 0xFF, 0xFF db 0xFF, 0xFF, 0xFF
db 0x01 dd 63
db 0xFF, 0xFF, 0xFF dd 0xb40
dd 1
dd (1440 * 2)
times (0x1FE - ($-$$)) db 0 times (0x1FE - ($-$$)) db 0
; Boot signature ; Boot signature
dw 0xAA55 sig: dw 0xAA55