diff --git a/Doc/ChangeLog.txt b/Doc/ChangeLog.txt index b19ad88f..4dd2c133 100644 --- a/Doc/ChangeLog.txt +++ b/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 ------------- diff --git a/ReadMe.txt b/ReadMe.txt index bd3667f5..fd854991 100644 --- a/ReadMe.txt +++ b/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 diff --git a/Source/CBIOS/cbios.asm b/Source/CBIOS/cbios.asm index 7365c768..afcd5bab 100644 --- a/Source/CBIOS/cbios.asm +++ b/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 diff --git a/Source/CBIOS/ver.inc b/Source/CBIOS/ver.inc index 187ef730..640bf76e 100644 --- a/Source/CBIOS/ver.inc +++ b/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" diff --git a/Source/HBIOS/API.txt b/Source/HBIOS/API.txt index c6f71d5e..3ec55a3c 100644 --- a/Source/HBIOS/API.txt +++ b/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 diff --git a/Source/HBIOS/fd.asm b/Source/HBIOS/fd.asm index 284a37e4..57416c6e 100644 --- a/Source/HBIOS/fd.asm +++ b/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 diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 4942e59f..29bf9a01 100644 --- a/Source/HBIOS/hbios.asm +++ b/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 ;================================================================================================== ; diff --git a/Source/HBIOS/hdsk.asm b/Source/HBIOS/hdsk.asm index e9da24f8..f253bbf3 100644 --- a/Source/HBIOS/hdsk.asm +++ b/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 ; diff --git a/Source/HBIOS/ide.asm b/Source/HBIOS/ide.asm index 5a0ce67a..c9149ca7 100644 --- a/Source/HBIOS/ide.asm +++ b/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 diff --git a/Source/HBIOS/md.asm b/Source/HBIOS/md.asm index 6eb27aad..2b9c9c0a 100644 --- a/Source/HBIOS/md.asm +++ b/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 diff --git a/Source/HBIOS/ppide.asm b/Source/HBIOS/ppide.asm index 5ace5ce3..f3317915 100644 --- a/Source/HBIOS/ppide.asm +++ b/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 diff --git a/Source/HBIOS/ppp.asm b/Source/HBIOS/ppp.asm index 79d4f4da..2f0cbf1d 100644 --- a/Source/HBIOS/ppp.asm +++ b/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 diff --git a/Source/HBIOS/prp.asm b/Source/HBIOS/prp.asm index c9f18bff..9bd1de1b 100644 --- a/Source/HBIOS/prp.asm +++ b/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 diff --git a/Source/HBIOS/rf.asm b/Source/HBIOS/rf.asm index d8009e09..a259a58a 100644 --- a/Source/HBIOS/rf.asm +++ b/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? diff --git a/Source/HBIOS/romldr.asm b/Source/HBIOS/romldr.asm index 43bb6033..c14327b7 100644 --- a/Source/HBIOS/romldr.asm +++ b/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 diff --git a/Source/HBIOS/sd.asm b/Source/HBIOS/sd.asm index fcfa6e6a..fa754a27 100644 --- a/Source/HBIOS/sd.asm +++ b/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 ; diff --git a/Source/HBIOS/ver.inc b/Source/HBIOS/ver.inc index 187ef730..640bf76e 100644 --- a/Source/HBIOS/ver.inc +++ b/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"