From f10fa026cfc3171aa66595c73552a13d7b4a07b0 Mon Sep 17 00:00:00 2001 From: Nero <41307858+nero@users.noreply.github.com> Date: Fri, 18 Dec 2020 18:29:26 +0000 Subject: [PATCH] Add support for floppy types with other geometry than 18/2/80 --- Makefile | 5 ++++- kernel/drive.asm | 16 +++++++++++----- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index cd8dcda..4a9a74e 100644 --- a/Makefile +++ b/Makefile @@ -68,9 +68,12 @@ clean: rm -f *.com *.bs *.0 *.lst *.img *.bin *.rom rm -rf utils -qemu-floppy: fd1440.img $(ROMS) +qemu-floppy3: fd1440.img $(ROMS) $(QEMU) $(QEMU_ARGS) -boot a -fda fd1440.img +qemu-floppy5: fd360.img $(ROMS) + $(QEMU) $(QEMU_ARGS) -boot a -fda fd360.img + qemu-hdd: hdimage.img $(ROMS) $(QEMU) $(QEMU_ARGS) -boot c -hda hdimage.img diff --git a/kernel/drive.asm b/kernel/drive.asm index b78b52c..4582af6 100644 --- a/kernel/drive.asm +++ b/kernel/drive.asm @@ -46,6 +46,9 @@ logdrv: ; dont do anything if drive already selected mov [dsknum], dl ; save info for bios mov [biosnum], dl + ; set default geometry (1.44 MB floppy) + mov word [bpb+BPBNOS], 2 + mov word [bpb+BPBSPT], 18 ; load boot sector xor ax, ax xor dx, dx @@ -61,12 +64,18 @@ logdrv: ; dont do anything if drive already selected mov [bpb+BPBHS+2], ax .ret: ret -calchs: mov bx, (18*2) +calchs: ; put sectors per cylinder into bx + mov ax, [bpb+BPBSPT] + mul word [bpb+BPBNOS] + mov bx, ax + ; but linear sector num into dx:ax + mov ax, [dskseek] + mov dx, [dskseek+2] ; dx:ax = linear count, bx = sectors / cylinder div bx xchg ax, dx ; dx = cylinder, ax = head * spt + sector - mov bl, 18 + mov bl, [bpb+BPBSPT] div byte bl ; dx = cylinder, al = head, ah = sector xchg dl, dh @@ -134,9 +143,6 @@ dirty: or byte [dskflag], 1 ; dirty ; flush buffer if dirty flush: test byte [dskflag], 1 jz .ret - ; load sector number - mov ax, [dskseek] - mov dx, [dskseek+2] ; do the write ; TODO: error handling & retries call calchs