From 74f9daaaaab37fe1281271ba06b47789dc2a4e5f Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Mon, 21 Jul 2025 11:19:42 -0700 Subject: [PATCH] USB Floppy Geometry Fix, Issue #456 USB Floppy Driver modified to: - return media id for 1.44 MB Floppy (MID_FD144) - translate CHS to LBA At present, floppy media is assumed to be high density 1.44MB. --- Source/HBIOS/ch376ufi.asm | 42 +++++++++++++++++++++++++++++++++++++-- Source/ver.inc | 2 +- Source/ver.lib | 2 +- 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/Source/HBIOS/ch376ufi.asm b/Source/HBIOS/ch376ufi.asm index ab2e18fb..e0eefbd6 100644 --- a/Source/HBIOS/ch376ufi.asm +++ b/Source/HBIOS/ch376ufi.asm @@ -69,7 +69,7 @@ CH_UFI_SEEK: EXX BIT 7,D ; CHECK FOR LBA FLAG - CALL Z,HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA + CALL Z,CH_UFI_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA RES 7,D ; CLEAR FLAG REGARDLESS (DOES NO HARM IF ALREADY LBA) PUSH DE @@ -83,6 +83,44 @@ CH_UFI_SEEK: XOR A RET ; +; Helper function to convert CHS address in DE:HL to LBA. +; Currently assumes 1.44MB floppy media +; LBA = (TRACK * #HDS * #SPT) + (HEAD * #SPT) + SECTOR +; For 1.44MB FLOPPY, #HDS = 2, #SPT = 18 +; LBA = (TRACK * 36) + (HEAD * 18) + SECTOR +; Algorithm uses B=#HDS*SPT, C=#SPT. For now, hard coded B=36, C=18 +; for 1.44MB media. In future, BC could be passed in to accommodate +; different media geometry. +; +CH_UFI_CHS2LBA: + LD B,2 * 18 ; #HDS * #SPT (SECTORS PER CYLINDER) + LD C,18 ; #SPT + + ; TRACK * #HDS * #SPT + PUSH DE ; SAVE DE + LD E,B ; SECTORS PER CYLINDER + LD H,L ; LSB OF TRACK TO H, H IS NEVER USED BY FLOPPY CHS + CALL MULT8 ; HL = H * E; TRACK LBA + POP DE ; RECOVER DE + PUSH HL ; SAVE TRACK LBA + + ; HEAD * #SPT + PUSH DE ; SAVE DE + LD E,C ; SECTORS PER TRACK + LD H,D ; HEADS + CALL MULT8 ; HL = H * E; HEAD LBA + POP DE ; RECOVER DE + + ; COMPUTE LBA (HL) = SECTOR (E) + HEAD LBA (HL) + TRACK LBA (TOS) + LD A,E ; SECTOR + CALL ADDHLA ; SECTOR * HEAD LBA + POP DE ; RECOVER TRACK LBA + ADD HL,DE ; ADD IN TRACK LBA + + ; FINISH UP + LD DE,0 ; DE IS ALWAYS ZERO + RET +; ; ### Function 0x13 -- Disk Read (DIOREAD) ; ; Inputs @@ -233,7 +271,7 @@ CH_UFI_DEVICE: ; function will return an error status. ; CH_UFI_MEDIA: - LD E, MID_MDRAM ;todo verify device still active? + LD E, MID_FD144 ;todo verify device still active? XOR A RET diff --git a/Source/ver.inc b/Source/ver.inc index f9ae15d7..4508e6f8 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,7 +2,7 @@ #DEFINE RMN 6 #DEFINE RUP 0 #DEFINE RTP 0 -#DEFINE BIOSVER "3.6.0-dev.13" +#DEFINE BIOSVER "3.6.0-dev.14" #define rmj RMJ #define rmn RMN #define rup RUP diff --git a/Source/ver.lib b/Source/ver.lib index ffa3b38f..c0841e56 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 6 rup equ 0 rtp equ 0 biosver macro - db "3.6.0-dev.13" + db "3.6.0-dev.14" endm