Browse Source

Disk I/O Cleanup

pull/123/head
Wayne Warthen 6 years ago
parent
commit
182dd322a5
  1. 36
      Source/CBIOS/cbios.asm
  2. 77
      Source/CPM3/diskio.z80
  3. 2
      Source/ver.inc
  4. 2
      Source/ver.lib

36
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)
;

77
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)

2
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"

2
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

Loading…
Cancel
Save