Browse Source

Disk I/O to/from Banked Memory

Supports double-buffered disk i/o to read/write to/from any memory bank specified.

NOTE:  Disk I/O will be temporarily slower than normal because all I/O is being forced thru double-buffering for testing.
pull/48/head
Wayne Warthen 6 years ago
parent
commit
b856a1a529
  1. 2
      Doc/ChangeLog.txt
  2. 2
      ReadMe.txt
  3. 4
      Source/CBIOS/cbios.asm
  4. 2
      Source/CBIOS/ver.inc
  5. 9
      Source/HBIOS/API.txt
  6. 2
      Source/HBIOS/fd.asm
  7. 163
      Source/HBIOS/hbios.asm
  8. 2
      Source/HBIOS/hdsk.asm
  9. 2
      Source/HBIOS/ide.asm
  10. 2
      Source/HBIOS/md.asm
  11. 2
      Source/HBIOS/ppide.asm
  12. 2
      Source/HBIOS/ppp.asm
  13. 2
      Source/HBIOS/prp.asm
  14. 2
      Source/HBIOS/rf.asm
  15. 5
      Source/HBIOS/romldr.asm
  16. 2
      Source/HBIOS/sd.asm
  17. 2
      Source/HBIOS/ver.inc

2
Doc/ChangeLog.txt

@ -14,6 +14,8 @@ Version 2.9.2
- WBW: Add interrupt support to ASCI driver
- WBW: Refactored XModem overlay, merged USB-FIFO support
- PMS: Added DS1210 low battery detection/message
- PMS: Added note playing ability to SPK driver
- WBW: Support disk I/O to any memory bank
Version 2.9.1
-------------

2
ReadMe.txt

@ -7,7 +7,7 @@
***********************************************************************
Wayne Warthen (wwarthen@gmail.com)
Version 2.9.2-pre.7, 2019-09-01
Version 2.9.2-pre.8, 2019-09-03
https://www.retrobrewcomputers.org/
RomWBW is a ROM-based implementation of CP/M-80 2.2 and Z-System for

4
Source/CBIOS/cbios.asm

@ -1409,7 +1409,9 @@ CHS2:
POP BC ; RESTORE INCOMING FUNCTION, DEVICE/UNIT
RET NZ ; ABORT IF SEEK RETURNED AN ERROR W/ ERROR IN A
LD HL,(DSKBUF) ; GET BUFFER ADDRESS
LD DE,1 ; TRANSFER ONE SECTOR
LD A,(BNKBIOS) ; GET BIOS BANK
LD D,A ; TRANSFER TO/FROM BIOS BANK
LD E,1 ; TRANSFER ONE SECTOR
RST 08 ; DO IT
OR A ; SET FLAGS
RET ; DONE

2
Source/CBIOS/ver.inc

@ -2,4 +2,4 @@
#DEFINE RMN 9
#DEFINE RUP 2
#DEFINE RTP 0
#DEFINE BIOSVER "2.9.2-pre.7"
#DEFINE BIOSVER "2.9.2-pre.8"

9
Source/HBIOS/API.txt

@ -267,15 +267,16 @@ SEEK ($12):
READ ($13) / WRITE ($14) / VERIFY ($15):
BC=Function/Unit A=Result
HL=Buffer Address E=Blocks Read
D=Buffer Bank ID
E=Block Count
Read, write, or verify block count sectors to buffer address starting at current target
Read, write, or verify block count sectors to/from buffer bank/address starting at current target
sector. Current sector must be established by prior seek function; however, multiple
read/write/verify function calls can be made after a seek function. Current sector is
incremented after each sector successfully read. On error, current sector is sector is
sector where error occurred. Blocks read indicates number of sectors successfully read.
incremented after each sector successfully read/written. On error, current sector is
sector where error occurred. Block count indicates number of sectors successfully read/written.
Caller must ensure buffer address is large enough to contain data for all sectors
requested.
read/written. If buffer is not in upper 32K, then sectors will be double buffered.
FORMAT ($16):
BC=Function/Unit A=Result

2
Source/HBIOS/fd.asm

@ -851,11 +851,13 @@ FD_SEEK9: ; NOT LBA, JUST SAVE THE CHS VALUE IN CFG ENTRY
RET
;
FD_READ:
CALL HB_DSKREAD ; HOOK HBIOS DISK READ SUPERVISOR
LD (FD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
LD A,DOP_READ
JR FD_RW
;
FD_WRITE:
CALL HB_DSKWRITE ; HOOK HBIOS DISK WRITE SUPERVISOR
LD (FD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
LD A,DOP_WRITE
JR FD_RW

163
Source/HBIOS/hbios.asm

@ -1821,6 +1821,169 @@ DIO_CNT .DB 0 ; ENTRY COUNT PREFIX
DIO_TBL .FILL DIO_SIZ,0 ; SPACE FOR ENTRIES
;
;==================================================================================================
; DISK READ HELPER
;==================================================================================================
;
; IMPLEMENTS MULTI SECTOR READS AND I/O TO/FROM
; BANKED RAM VIA BOUNCE BUFFER
;
; TOS=READ FN ADR
; HL=BUF ADR
; C=SEC COUNT
; D=BUF BANK ID
;
HB_DSKREAD:
;
#IF 0
; CHECK TO SEE IF INTER-BANK I/O NEEDED. IF NOT
; WE JUST ABORT BACK TO DISK DRIVER TO HANDLE.
BIT 7,H ; TGT BUF IN UPPER 32K?
RET NZ ; IF SO, NOTHING TO DO
LD A,D ; GET TGT BANK
CP BID_BIOS ; BIOS BANK?
RET Z ; IF SO, NOTHING TO DO
#ENDIF
;
#IF 1
; RAM BANK RANGE CHECK
LD A,D ; GET TGT BANK
CP BID_RAMN ; BANK IN RANGE 0-N?
CALL NC,PANIC ; IF >N, PANIC
#ENDIF
;
; SAVE TGT BUF BNK/ADR
LD (HB_IOBUF),HL
LD A,D
LD (HB_IOBNK),A
;
; SETUP READ FN ADR
POP HL ; READ FN ADR IS AT TOS
LD (HB_DSKREADFN),HL ; IMBED IN CALL OP BELOW
;
; SETUP READ AND LOOP COUNT
LD B,E ; SEC LOOP COUNTER
LD C,0 ; SEC COMPLETE COUNTER
;
HB_DSKREAD1:
; CALL READ FN
PUSH BC ; SAVE COUNTERS
LD E,1 ; ONE SECTOR
LD HL,HB_WRKBUF ; USE WORK BUF FOR DATA
HB_DSKREADFN .EQU $+1
CALL PANIC ; READ ONE SECTOR
POP BC ; RESTORE COUNTERS
;
; IF FAIL, RETURN ERR
JR NZ,HB_DSKREADX ; BAIL OUT ON ERROR
;
; BNKCPY SEC DATA TO REAL BANK/BUF & INC BUF ADR
PUSH BC ; SAVE COUNTERS
LD A,(HB_IOBNK) ; DEST BANK
LD (HB_DSTBNK),A ; ... TO PROXY
LD A,BID_BIOS ; SRC BANK
LD (HB_SRCBNK),A ; ... TO PROXY
LD BC,512 ; COPY 512 BYTES (1 SEC)
LD DE,(HB_IOBUF) ; TGT BUFFER ADR
LD HL,HB_WRKBUF ; SOURCE BUFFER
CALL HBX_BNKCPY ; DO BANK COPY
LD (HB_IOBUF),DE ; SAVE UPDATED TGT BUF ADR
POP BC ; RESTORE COUNTERS
;
; INC READ COUNT
INC C ; BUMP SEC READ COUNT
DJNZ HB_DSKREAD1 ; LOOP AS NEEDED
XOR A ; SIGNAL SUCCESS
;
HB_DSKREADX:
LD HL,(HB_IOBUF) ; NEXT BUF ADR
LD E,C ; READ COUNT TO E
OR A ; SET RESULT FLAGS
RET ; DONE
;
;==================================================================================================
; DISK WRITE HELPER
;==================================================================================================
;
; IMPLEMENTS MULTI SECTOR WRITES AND I/O TO/FROM
; BANKED RAM VIA BOUNCE BUFFER
;
; TOS=WRITE FN ADR
; HL=BUF ADR
; C=SEC COUNT
; D=BUF BANK ID
;
HB_DSKWRITE:
;
#IF 0
; CHECK TO SEE IF INTER-BANK I/O NEEDED. IF NOT
; WE JUST ABORT BACK TO DISK DRIVER TO HANDLE.
BIT 7,H ; TGT BUF IN UPPER 32K?
RET NZ ; IF SO, NOTHING TO DO
LD A,D ; GET TGT BANK
CP BID_BIOS ; BIOS BANK?
RET Z ; IF SO, NOTHING TO DO
#ENDIF
;
#IF 1
; RAM BANK RANGE CHECK
LD A,D ; GET TGT BANK
CP BID_RAMN ; BANK IN RANGE 0-N?
CALL NC,PANIC ; IF >N, PANIC
#ENDIF
;
; SAVE TGT BUF BNK/ADR
LD (HB_IOBUF),HL
LD A,D
LD (HB_IOBNK),A
;
; SETUP WRITE FN ADR
POP HL ; WRITE FN ADR IS AT TOS
LD (HB_DSKWRITEFN),HL ; IMBED IN CALL OP BELOW
;
; SETUP WRITE AND LOOP COUNT
LD B,E ; SEC LOOP COUNTER
LD C,0 ; SEC COMPLETE COUNTER
;
HB_DSKWRITE1:
; BNKCPY SEC DATA TO WORK BANK/BUF & INC BUF ADR
PUSH BC ; SAVE COUNTERS
LD A,BID_BIOS ; DEST BANK
LD (HB_DSTBNK),A ; ... TO PROXY
LD A,(HB_IOBNK) ; SRC BANK
LD (HB_SRCBNK),A ; ... TO PROXY
LD BC,512 ; COPY 512 BYTES (1 SEC)
LD DE,HB_WRKBUF ; TGT BUFFER ADR
LD HL,(HB_IOBUF) ; SOURCE BUFFER
CALL HBX_BNKCPY ; DO BANK COPY
LD (HB_IOBUF),HL ; SAVE UPDATED SRC BUF ADR
POP BC ; RESTORE COUNTERS
;
; CALL WRITE FN
PUSH BC ; SAVE COUNTERS
LD E,1 ; ONE SECTOR
LD HL,HB_WRKBUF ; USE WORK BUF FOR DATA
HB_DSKWRITEFN .EQU $+1
CALL PANIC ; READ ONE SECTOR
POP BC ; RESTORE COUNTERS
;
; IF FAIL, RETURN ERR
JR NZ,HB_DSKWRITEX ; BAIL OUT ON ERROR
;
; INC WRITE COUNT
INC C ; BUMP SEC WRITE COUNT
DJNZ HB_DSKWRITE1 ; LOOP AS NEEDED
XOR A ; SIGNAL SUCCESS
;
HB_DSKWRITEX:
LD HL,(HB_IOBUF) ; NEXT BUF ADR
LD E,C ; WRITE COUNT TO E
OR A ; SET RESULT FLAGS
RET ; DONE
;
HB_IOBUF .DW 0
HB_IOBNK .DB 0
;
;==================================================================================================
; REAL TIME CLOCK DEVICE DISPATCHER
;==================================================================================================
;

2
Source/HBIOS/hdsk.asm

@ -191,12 +191,14 @@ HDSK_SEEK:
;
;
HDSK_READ:
CALL HB_DSKREAD ; HOOK HBIOS DISK READ SUPERVISOR
LD A,HDSK_CMDREAD
JR HDSK_RW
;
;
;
HDSK_WRITE:
CALL HB_DSKWRITE ; HOOK HBIOS DISK WRITE SUPERVISOR
LD A,HDSK_CMDWRITE
JR HDSK_RW
;

2
Source/HBIOS/ide.asm

@ -423,6 +423,7 @@ IDE_DEFMED:
;
;
IDE_READ:
CALL HB_DSKREAD ; HOOK HBIOS DISK READ SUPERVISOR
LD BC,IDE_RDSEC ; GET ADR OF SECTOR READ FUNC
LD (IDE_IOFNADR),BC ; SAVE IT AS PENDING IO FUNC
JR IDE_IO ; CONTINUE TO GENERIC IO ROUTINE
@ -430,6 +431,7 @@ IDE_READ:
;
;
IDE_WRITE:
CALL HB_DSKWRITE ; HOOK HBIOS DISK WRITE SUPERVISOR
LD BC,IDE_WRSEC ; GET ADR OF SECTOR WRITE FUNC
LD (IDE_IOFNADR),BC ; SAVE IT AS PENDING IO FUNC
JR IDE_IO ; CONTINUE TO GENERIC IO ROUTINE

2
Source/HBIOS/md.asm

@ -174,6 +174,7 @@ MD_SEEK:
;
;
MD_READ:
CALL HB_DSKREAD ; HOOK HBIOS DISK READ SUPERVISOR
LD BC,MD_RDSEC ; GET ADR OF SECTOR READ FUNC
LD (MD_RWFNADR),BC ; SAVE IT AS PENDING IO FUNC
JR MD_RW ; CONTINUE TO GENERIC R/W ROUTINE
@ -182,6 +183,7 @@ MD_READ:
;
;
MD_WRITE:
CALL HB_DSKWRITE ; HOOK HBIOS DISK WRITE SUPERVISOR
LD BC,MD_WRSEC ; GET ADR OF SECTOR WRITE FUNC
LD (MD_RWFNADR),BC ; SAVE IT AS PENDING IO FUNC
LD A,(IY+MD_DEV) ; GET DEVICE NUMBER

2
Source/HBIOS/ppide.asm

@ -411,6 +411,7 @@ PPIDE_DEFMED:
;
;
PPIDE_READ:
CALL HB_DSKREAD ; HOOK HBIOS DISK READ SUPERVISOR
LD BC,PPIDE_RDSEC ; GET ADR OF SECTOR READ FUNC
LD (PPIDE_IOFNADR),BC ; SAVE IT AS PENDING IO FUNC
JR PPIDE_IO ; CONTINUE TO GENERIC IO ROUTINE
@ -418,6 +419,7 @@ PPIDE_READ:
;
;
PPIDE_WRITE:
CALL HB_DSKWRITE ; HOOK HBIOS DISK WRITE SUPERVISOR
LD BC,PPIDE_WRSEC ; GET ADR OF SECTOR WRITE FUNC
LD (PPIDE_IOFNADR),BC ; SAVE IT AS PENDING IO FUNC
JR PPIDE_IO ; CONTINUE TO GENERIC IO ROUTINE

2
Source/HBIOS/ppp.asm

@ -504,6 +504,7 @@ PPPSD_DEFMED:
;
;
PPPSD_READ:
CALL HB_DSKREAD ; HOOK HBIOS DISK READ SUPERVISOR
LD BC,PPPSD_RDSEC ; GET ADR OF SECTOR READ FUNC
LD (PPPSD_IOFNADR),BC ; SAVE IT AS PENDING IO FUNC
JR PPPSD_IO ; CONTINUE TO GENERIC IO ROUTINE
@ -511,6 +512,7 @@ PPPSD_READ:
;
;
PPPSD_WRITE:
CALL HB_DSKWRITE ; HOOK HBIOS DISK WRITE SUPERVISOR
LD BC,PPPSD_WRSEC ; GET ADR OF SECTOR READ FUNC
LD (PPPSD_IOFNADR),BC ; SAVE IT AS PENDING IO FUNC
JR PPPSD_IO ; CONTINUE TO GENERIC IO ROUTINE

2
Source/HBIOS/prp.asm

@ -401,6 +401,7 @@ PRPSD_DEFMED:
;
;
PRPSD_READ:
CALL HB_DSKREAD ; HOOK HBIOS DISK READ SUPERVISOR
LD BC,PRPSD_RDSEC ; GET ADR OF SECTOR READ FUNC
LD (PRPSD_IOFNADR),BC ; SAVE IT AS PENDING IO FUNC
JR PRPSD_IO ; CONTINUE TO GENERIC IO ROUTINE
@ -408,6 +409,7 @@ PRPSD_READ:
;
;
PRPSD_WRITE:
CALL HB_DSKWRITE ; HOOK HBIOS DISK WRITE SUPERVISOR
LD BC,PRPSD_WRSEC ; GET ADR OF SECTOR READ FUNC
LD (PRPSD_IOFNADR),BC ; SAVE IT AS PENDING IO FUNC
JR PRPSD_IO ; CONTINUE TO GENERIC IO ROUTINE

2
Source/HBIOS/rf.asm

@ -182,6 +182,7 @@ RF_SEEK:
;
;
RF_READ:
CALL HB_DSKREAD ; HOOK HBIOS DISK READ SUPERVISOR
LD BC,RF_RDSEC ; GET ADR OF SECTOR READ FUNC
LD (RF_RWFNADR),BC ; SAVE IT AS PENDING IO FUNC
JR RF_RW ; CONTINUE TO GENERIC R/W ROUTINE
@ -189,6 +190,7 @@ RF_READ:
;
;
RF_WRITE:
CALL HB_DSKWRITE ; HOOK HBIOS DISK WRITE SUPERVISOR
LD BC,RF_WRSEC ; GET ADR OF SECTOR WRITE FUNC
LD (RF_RWFNADR),BC ; SAVE IT AS PENDING IO FUNC
CALL RF_CHKWP ; WRITE PROTECTED?

5
Source/HBIOS/romldr.asm

@ -545,7 +545,8 @@ GOBOOTDISK:
LD A,(BL_DEVICE) ; GET BOOT DISK UNIT
LD C,A ; PUT IN C
LD HL,BL_INFOSEC ; READ INTO INFO SEC BUFFER
LD DE,1 ; TRANSFER ONE SECTOR
LD D,BID_USR ; USER BANK ;
LD E,1 ; TRANSFER ONE SECTOR
RST 08 ; DO IT
JP NZ,DB_ERR ; HANDLE ERROR
;
@ -629,7 +630,7 @@ GOBOOTDISK:
LD A,(BL_DEVICE) ; GET BOOT DISK UNIT
LD C,A ; PUT IN C
LD HL,(BB_CPMLOC) ; LOAD ADDRESS
LD D,0
LD D,BID_USR ; USER BANK
LD A,(BL_COUNT) ; GET SECTORS TO READ
LD E,A ; NUMBER OF SECTORS TO LOAD
RST 08

2
Source/HBIOS/sd.asm

@ -585,12 +585,14 @@ SD_DEFMED:
;
;
SD_READ:
CALL HB_DSKREAD ; HOOK HBIOS DISK READ SUPERVISOR
LD A,SD_CMD_READ_SNGL_BLK ; SETUP FOR SINGLE BLOCK READ CMD
JR SD_IO ; CONTINUE TO GENERIC IO ROUTINE
;
;
;
SD_WRITE:
CALL HB_DSKWRITE ; HOOK HBIOS DISK WRITE SUPERVISOR
LD A,SD_CMD_WRITE_BLOCK ; SETUP FOR BLOCK WRITE CMD
JR SD_IO ; CONTINUE TO GENERIC IO ROUTINE
;

2
Source/HBIOS/ver.inc

@ -2,4 +2,4 @@
#DEFINE RMN 9
#DEFINE RUP 2
#DEFINE RTP 0
#DEFINE BIOSVER "2.9.2-pre.7"
#DEFINE BIOSVER "2.9.2-pre.8"

Loading…
Cancel
Save