From 182dd322a5502a2fbdad11e90340bf1c45a64a47 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Fri, 8 May 2020 15:46:30 -0700 Subject: [PATCH] Disk I/O Cleanup --- Source/CBIOS/cbios.asm | 36 +++++++++++++------- Source/CPM3/diskio.z80 | 77 ++++++++++++++++++++++++------------------ Source/ver.inc | 2 +- Source/ver.lib | 2 +- 4 files changed, 69 insertions(+), 48 deletions(-) diff --git a/Source/CBIOS/cbios.asm b/Source/CBIOS/cbios.asm index 9940be25..4482cf6e 100644 --- a/Source/CBIOS/cbios.asm +++ b/Source/CBIOS/cbios.asm @@ -1247,7 +1247,7 @@ DSK_SELECT1: BIT 7,B ; TEST RAM DRIVE BIT LD A,MID_MDROM ; ASSUME ROM JR Z,DSK_SELECT1A ; IS ROM, DONE - LD A,MID_MDRAM ; MSUT BE RAM + LD A,MID_MDRAM ; MUST BE RAM ; DSK_SELECT1A: LD (MEDID),A @@ -1269,10 +1269,28 @@ DSK_SELECT1A: #ENDIF ; ; CLEAR LBA OFFSET (DWORD) + ; SET HI BIT FOR LBA ACCESS FOR NOW LD HL,0 ; ZERO LD (SEKLBA),HL ; CLEAR FIRST WORD + SET 7,H ; ASSUME LBA ACCESS FOR NOW LD (SEKLBA+2),HL ; CLEAR SECOND WORD ; +#IFDEF PLTWBW +; + LD A,(SEKUNIT) ; GET UNIT + LD C,A ; STORE IN C + LD B,BF_DIODEVICE ; HBIOS FUNC: REPORT DEVICE INFO + RST 08 ; GET UNIT INFO, DEVICE TYPE IN D + LD A,D ; DEVICE TYPE -> A + AND $F0 ; ISOLATE HIGH BITS + CP DIODEV_FD ; FLOPPY? + JR NZ,DSK_SELECT1B ; IF NOT, DO LBA IO + LD HL,SEKLBA+3 ; POINT TO HIGH ORDER BYTE + RES 7,(HL) ; SWITCH FROM LBA -> CHS +; +#ENDIF +; +DSK_SELECT1B: ; SET LEGACY SECTORS PER SLICE LD HL,16640 ; LEGACY SECTORS PER SLICE LD (SPS),HL ; SAVE IT @@ -1452,6 +1470,7 @@ DSK_MBR7: DEC A ; DEC LOOP DOWNCOUNTER JR DSK_MBR6 ; AND LOOP DSK_MBR8: + SET 7,D ; SET LBA ACCESS FLAG ; RESAVE IT LD (SEKLBA),HL ; LOWORD LD (SEKLBA+2),DE ; HIWORD @@ -1498,15 +1517,9 @@ DSK_IO: LD C,A ; UNIT -> C ; #IFDEF PLTWBW -; - PUSH BC ; SAVE FUNC/UNIT - LD B,BF_DIODEVICE ; HBIOS FUNC: REPORT DEVICE INFO - RST 08 ; GET UNIT INFO, DEVICE TYPE IN D - POP BC ; GET FUNC/UNIT BACK TO BC - LD A,D ; DEVICE TYPE -> A - AND $F0 ; ISOLATE HIGH BITS - CP DIODEV_FD ; FLOPPY? - JR NZ,LBA_IO ; IF NOT, DO LBA IO + LD A,(HSTLBA+3) ; GET HIGH ORDER BYTE + BIT 7,A ; LBA ACCESS? + JR NZ,LBA_IO ; IF SET, GO TO LBA I/O ; ; FLOPPY SPECIFIC TRANSLATION ASSUMES FLOPPY IS DOUBLE-SIDED AND ; USES LOW ORDER BIT OF TRACK AS HEAD VALUE @@ -1540,9 +1553,6 @@ LBA_IO: LD BC,(HSTLBA+2) ; LBA OFFSET HIWORD ADC HL,BC EX DE,HL -#IFDEF PLTWBW - SET 7,D ; MAKE SURE LBA ACCESS BIT SET -#ENDIF POP BC ; RESTORE FUNC/UNIT ;JR DSK_IO2 ; DO THE DISK I/O (FALL THRU) ; diff --git a/Source/CPM3/diskio.z80 b/Source/CPM3/diskio.z80 index 8ba7574d..3e52d60a 100644 --- a/Source/CPM3/diskio.z80 +++ b/Source/CPM3/diskio.z80 @@ -421,7 +421,7 @@ media: ld (retry$adr),hl ; Sense media to determine media format - ld a,(unit) ; Get disk unit + ld a,(unit) ; get disk unit ld c,a ; put in C ld b,18h ; HBIOS Media function ld e,1 ; Enable media check/discovery @@ -435,7 +435,22 @@ media: ; Initialize slice start LBA & sectors per slice ld hl,0 ; assume slice starts ld (lba),hl ; ... at LBA offset - ld (lba+2),hl ; ... of zero + set 7,h ; ... of zero + ld (lba+2),hl ; ... w/ LBA access + + ; Check device type + ld a,(unit) ; get disk unit + ld c,a ; put in C + ld b,17h ; HBIOS func: report device info + call 0FFF0h ; get unit info, device type in D + ld a,d ; device type -> A + and 0F0h ; isolate high bits + cp 10h ; floppy? + jr nz,media1 ; if not, do LBA I/O + ld hl,lba+3 ; point to high order byte + res 7,(hl) ; switch from LBA -> CHS + +media1: ld hl,16640 ; assume legacy value for ld (sps),hl ; ... sectors per slice @@ -472,7 +487,7 @@ media: media3: ld a,(hl) ; get part type cp 2Eh ; CP/M partition? - jr z,media4 ; cool, grab the LBA offset + jr z,media4 ; cool, grab the LBA offset ld de,16 ; part table entry size add hl,de ; bump to next part type djnz media3 ; loop thru table @@ -536,9 +551,10 @@ boot7: dec a ; dec loop downcounter jr boot6 ; and loop boot8: + set 7,d ; set LBA access flag ld (lba),hl ; save new lba, low word ld (lba+2),de ; save new lba, high word - + media9: ; Locate DPB corresponding to media id ld hl,dpb$start - dpb$sz @@ -599,23 +615,31 @@ dsk$rw: ; Common disk read/write routine ; Assumes func is set to HBIOS read or write - ; Save XDPH address - ld (curdph),de ; save to curdph - ; Set retry address - ld hl,dsk$rw + ld hl,dsk$rw$retry ld (retry$adr),hl - ; Check device type - ld a,(@rdrv) ; get unit - ld c,a ; BIOS Disk Unit in C - ld b,17h ; HBIOS DEVICE function - call 0FFF0h ; do it, D=device type - ld a,d ; put in accum - and 0F0h ; isolate high bits - cp 10h ; floppy? - jr nz,dsk$rw2 ; if not, do LBA i/o - + ; Save XDPH address + ld (curdph),de ; save to curdph + +dsk$rw$retry: + ; Get LBA offset from DPH to DE:HL + ld hl,(curdph) ; HL := DPH adr + ld de,25 ; LBA value adr + add hl,de ; HL := LBA offset + ld e,(hl) ; lobyte of loword + inc hl ; bump + ld d,(hl) ; hibyte of loword + inc hl ; bump + push de ; save loword + ld e,(hl) ; lobyte of hiword + inc hl ; bump + ld d,(hl) ; hibyte of hiword + pop hl ; recover loword + + bit 7,d ; LBA access bit set? + jr nz,dsk$rw2 ; if so, go to LBA I/O + ; Floppy I/O ld de,(@sect) ; sector -> de, head(d) becomes zero ld hl,(@trk) ; track -> hl (low bit has head) @@ -625,20 +649,8 @@ dsk$rw: jr dsk$rw9 ; do the disk I/O dsk$rw2: - ; LBA IO: Get LBA offset from DPH - ld hl,(curdph) ; HL := DPH adr - ld de,25+3 ; LBA value + 3 - add hl,de ; HL := LBA offset (last byte!) - ld b,(hl) ; hibyte of hiword - dec hl ; bump - ld c,(hl) ; lobyte of hiword - dec hl ; bump - push bc ; save hiword - ld b,(hl) ; hibyte of loword - dec hl ; bump - ld c,(hl) ; lobyte of loword - dec hl ; bump - push bc ; save loword + push de ; save hiword of LBA + push hl ; save loword of LBA ; Get track and shift into correct bits ld hl,(@trk) ; get track @@ -658,7 +670,6 @@ dsk$rw2: pop bc ; lba offset hiword adc hl,bc ; add w/ carry to cur hiword ex de,hl ; swap back - set 7,d ; set lba access bit dsk$rw9: ; DE:HL has sector address to read (LBA or CHS) diff --git a/Source/ver.inc b/Source/ver.inc index dea2c716..3cb3dc77 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,4 +2,4 @@ #DEFINE RMN 1 #DEFINE RUP 1 #DEFINE RTP 0 -#DEFINE BIOSVER "3.1.1-pre.2" +#DEFINE BIOSVER "3.1.1-pre.3" diff --git a/Source/ver.lib b/Source/ver.lib index cff1d4a5..3c226412 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 1 rup equ 1 rtp equ 0 biosver macro - db "3.1.1-pre.2" + db "3.1.1-pre.3" endm