From feee56990a19adecb06786315add1ae1b3a1c20c Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Sun, 10 Dec 2017 19:54:34 -0800 Subject: [PATCH] Finalize 2.8.6 - Support for RC2014 - Handle IDE disk spinup without timing out --- ReadMe.txt | 5 +- Source/CBIOS/ver.inc | 2 +- Source/HBIOS/fd.asm | 106 ++++++++++++++++++++-------------------- Source/HBIOS/ide.asm | 66 +++++++++++++++---------- Source/HBIOS/ppide.asm | 107 +++++++++++++++++++++++++++++++++-------- Source/HBIOS/ver.inc | 2 +- 6 files changed, 185 insertions(+), 103 deletions(-) diff --git a/ReadMe.txt b/ReadMe.txt index c0ec2bfb..85839e32 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -7,7 +7,7 @@ *********************************************************************** Wayne Warthen (wwarthen@gmail.com) -Version 2.8.6, 2017-10-09 +Version 2.8.6, 2017-12-10 https://www.retrobrewcomputers.org/ RomWBW is a ROM-based implementation of CP/M-80 2.2 and Z-System for @@ -74,7 +74,7 @@ the new ROM chip and boot your system. At the boot loader "Boot:" prompt, select either CP/M or Z-System to load the OS from ROM. If you have spare rom chips for your system, it is always safest to -keep your existing, work rom chip and program a new one so that you +keep your existing, working ROM chip and program a new one so that you can return to the old one if the new one does not work properly. If you use a customized ROM image, it is recommended that you first @@ -114,6 +114,7 @@ ROM version: - TALK.COM - FDU.COM - XM.COM + - RTC.COM UNA Hardware BIOS ----------------- diff --git a/Source/CBIOS/ver.inc b/Source/CBIOS/ver.inc index aa039e90..45b2b5c7 100644 --- a/Source/CBIOS/ver.inc +++ b/Source/CBIOS/ver.inc @@ -2,4 +2,4 @@ #DEFINE RMN 8 #DEFINE RUP 6 #DEFINE RTP 0 -#DEFINE BIOSVER "2.8.6-pre.1" +#DEFINE BIOSVER "2.8.6" diff --git a/Source/HBIOS/fd.asm b/Source/HBIOS/fd.asm index 7dc17831..9b521900 100644 --- a/Source/HBIOS/fd.asm +++ b/Source/HBIOS/fd.asm @@ -9,68 +9,68 @@ ; PORTS ; #IF ((FDMODE == FDMODE_DIO) | (FDMODE == FDMODE_ZETA) | (FDMODE == FDMODE_DIO3)) -FDC_MSR: .EQU 036H ; 8272 MAIN STATUS REGISTER -FDC_DATA: .EQU 037H ; 8272 DATA PORT -FDC_DIR: .EQU 038H ; DATA INPUT REGISTER -FDC_DOR: .EQU 03AH ; DIGITAL OUTPUT REGISTER (LATCH) -FDC_DMA: .EQU 03CH ; PSEUDO DMA DATA PORT -#ENDIF -#IF (FDMODE = FDMODE_ZETA2) -FDC_MSR: .EQU 030H ; 8272 MAIN STATUS REGISTER -FDC_DATA: .EQU 031H ; 8272 DATA PORT -FDC_DOR: .EQU 038H ; DIGITAL OUTPUT REGISTER -FDC_DCR: .EQU 028H ; CONFIGURATION CONTROL REGISTER -FDC_TC .EQU 038H ; TERMINAL COUNT (W/ DACK) -#ENDIF -#IF (FDMODE == FDMODE_DIDE) -FDC_BID: .EQU 00100000B ; IO RANGE 20H-3FH -FDC_MSR: .EQU FDC_BID | 01010B ; 8272 MAIN STATUS REGISTER -FDC_DATA: .EQU FDC_BID | 01011B ; 8272 DATA PORT -FDC_DOR: .EQU FDC_BID | 01100B ; DOR -FDC_DCR: .EQU FDC_BID | 01101B ; DCR -FDC_DACK: .EQU FDC_BID | 11100B ; DACK -FDC_TC .EQU FDC_BID | 11101B ; TERMINAL COUNT (W/ DACK) -FDC_DMA: .EQU 03CH ; NOT USED BY DIDE +FDC_MSR .EQU $36 ; 8272 MAIN STATUS REGISTER +FDC_DATA .EQU $37 ; 8272 DATA PORT +FDC_DIR .EQU $38 ; DATA INPUT REGISTER +FDC_DOR .EQU $3A ; DIGITAL OUTPUT REGISTER (LATCH) +FDC_DMA .EQU $3C ; PSEUDO DMA DATA PORT +#ENDIF +#IF (FDMODE = FDMODE_ZETA2) +FDC_MSR .EQU $30 ; 8272 MAIN STATUS REGISTER +FDC_DATA .EQU $31 ; 8272 DATA PORT +FDC_DOR .EQU $38 ; DIGITAL OUTPUT REGISTER +FDC_DCR .EQU $28 ; CONFIGURATION CONTROL REGISTER +FDC_TC .EQU $38 ; TERMINAL COUNT (W/ DACK) +#ENDIF +#IF (FDMODE == FDMODE_DIDE) +FDC_BID .EQU $20 ; IO RANGE 20H-3FH +FDC_MSR .EQU $2A ; 8272 MAIN STATUS REGISTER +FDC_DATA .EQU $2B ; 8272 DATA PORT +FDC_DOR .EQU $2C ; DOR +FDC_DCR .EQU $2D ; DCR +FDC_DACK .EQU $3C ; DACK +FDC_TC .EQU $3D ; TERMINAL COUNT (W/ DACK) +FDC_DMA .EQU $3C ; NOT USED BY DIDE #ENDIF #IF (FDMODE == FDMODE_N8) -FDC_MSR: .EQU 08CH ; 8272 MAIN STATUS REGISTER -FDC_DATA: .EQU 08DH ; 8272 DATA PORT -FDC_DOR: .EQU 092H ; DOR -FDC_DCR: .EQU 091H ; DCR -FDC_DACK: .EQU 090H ; DACK -FDC_TC .EQU 093H ; TERMINAL COUNT (W/ DACK) -FDC_DMA: .EQU 03CH ; NOT USED BY N8 +FDC_MSR .EQU $8C ; 8272 MAIN STATUS REGISTER +FDC_DATA .EQU $8D ; 8272 DATA PORT +FDC_DOR .EQU $92 ; DOR +FDC_DCR .EQU $91 ; DCR +FDC_DACK .EQU $90 ; DACK +FDC_TC .EQU $93 ; TERMINAL COUNT (W/ DACK) +FDC_DMA .EQU $3C ; NOT USED BY N8 #ENDIF ; ; DISK OPERATIONS ; -DOP_READ .EQU 0 ; READ OPERATION -DOP_WRITE .EQU 1 ; WRITE OPERATION -DOP_FORMAT .EQU 2 ; FORMAT OPERATION -DOP_READID .EQU 3 ; READ ID OPERATION +DOP_READ .EQU 0 ; READ OPERATION +DOP_WRITE .EQU 1 ; WRITE OPERATION +DOP_FORMAT .EQU 2 ; FORMAT OPERATION +DOP_READID .EQU 3 ; READ ID OPERATION ; ; FDC RESULT CODES ; -FRC_OK .EQU 0 ; 00 -FRC_NOTIMPL .EQU -01H ; FF -FRC_CMDERR .EQU -02H ; FE -FRC_ERROR .EQU -03H ; FD -FRC_ABORT .EQU -04H ; FC -FRC_BUFMAX .EQU -05H ; FB -FRC_ABTERM .EQU -08H ; F8 -FRC_INVCMD .EQU -09H ; F7 -FRC_DSKCHG .EQU -0AH ; F6 -FRC_ENDCYL .EQU -0BH ; F5 -FRC_DATAERR .EQU -0CH ; F4 -FRC_OVERRUN .EQU -0DH ; F3 -FRC_NODATA .EQU -0EH ; F2 -FRC_NOTWRIT .EQU -0FH ; F1 -FRC_MISADR .EQU -10H ; F0 -FRC_TOFDCRDY .EQU -11H ; EF -FRC_TOSNDCMD .EQU -12H ; EE -FRC_TOGETRES .EQU -13H ; ED -FRC_TOEXEC .EQU -14H ; EC -FRC_TOSEEKWT .EQU -15H ; EB +FRC_OK .EQU 0 ; 00 +FRC_NOTIMPL .EQU -01H ; FF +FRC_CMDERR .EQU -02H ; FE +FRC_ERROR .EQU -03H ; FD +FRC_ABORT .EQU -04H ; FC +FRC_BUFMAX .EQU -05H ; FB +FRC_ABTERM .EQU -08H ; F8 +FRC_INVCMD .EQU -09H ; F7 +FRC_DSKCHG .EQU -0AH ; F6 +FRC_ENDCYL .EQU -0BH ; F5 +FRC_DATAERR .EQU -0CH ; F4 +FRC_OVERRUN .EQU -0DH ; F3 +FRC_NODATA .EQU -0EH ; F2 +FRC_NOTWRIT .EQU -0FH ; F1 +FRC_MISADR .EQU -10H ; F0 +FRC_TOFDCRDY .EQU -11H ; EF +FRC_TOSNDCMD .EQU -12H ; EE +FRC_TOGETRES .EQU -13H ; ED +FRC_TOEXEC .EQU -14H ; EC +FRC_TOSEEKWT .EQU -15H ; EB ; #IF (FDTRACE > 0) ; diff --git a/Source/HBIOS/ide.asm b/Source/HBIOS/ide.asm index cc32f20f..13b0ff07 100644 --- a/Source/HBIOS/ide.asm +++ b/Source/HBIOS/ide.asm @@ -228,29 +228,6 @@ IDE_TOFAST .EQU 10 ; FAST TIMEOUT IS 0.5 SECS IDE_INIT: CALL NEWLINE ; FORMATTING PRTS("IDE:$") - CALL IDE_DETECT ; CHECK FOR HARDWARE - JR Z,IDE_INIT00 ; CONTINUE IF PRESENT -; - ; HARDWARE NOT PRESENT - PRTS(" NOT PRESENT$") - OR $FF ; SIGNAL FAILURE - RET -; -IDE_INIT00: -; -; SETUP THE DISPATCH TABLE ENTRIES -; - LD B,IDE_UNITCNT ; LOOP CONTROL - LD C,0 ; PHYSICAL UNIT INDEX -IDE_INIT0: - PUSH BC ; SAVE LOOP CONTROL - LD B,C ; PHYSICAL UNIT - LD C,DIODEV_IDE ; DEVICE TYPE - LD DE,0 ; UNIT DATA BLOB ADDRESS - CALL DIO_ADDENT ; ADD ENTRY, BC IS NOT DESTROYED - POP BC ; RESTORE LOOP CONTROL - INC C ; NEXT PHYSICAL UNIT - DJNZ IDE_INIT0 ; LOOP UNTIL DONE ; ; COMPUTE CPU SPEED COMPENSATED TIMEOUT SCALER ; AT 1MHZ, THE SCALER IS 961 (50000US / 52TS = 961) @@ -278,6 +255,30 @@ IDE_INIT0: PRTS(" UNITS=$") ; PRINT LABEL FOR UNIT COUNT LD A,IDE_UNITCNT ; GET UNIT COUNT CALL PRTDECB ; PRINT IT IN DECIMAL +; + CALL IDE_DETECT ; CHECK FOR HARDWARE + JR Z,IDE_INIT00 ; CONTINUE IF PRESENT +; + ; HARDWARE NOT PRESENT + PRTS(" NOT PRESENT$") + OR $FF ; SIGNAL FAILURE + RET +; +IDE_INIT00: +; +; SETUP THE DISPATCH TABLE ENTRIES +; + LD B,IDE_UNITCNT ; LOOP CONTROL + LD C,0 ; PHYSICAL UNIT INDEX +IDE_INIT0: + PUSH BC ; SAVE LOOP CONTROL + LD B,C ; PHYSICAL UNIT + LD C,DIODEV_IDE ; DEVICE TYPE + LD DE,0 ; UNIT DATA BLOB ADDRESS + CALL DIO_ADDENT ; ADD ENTRY, BC IS NOT DESTROYED + POP BC ; RESTORE LOOP CONTROL + INC C ; NEXT PHYSICAL UNIT + DJNZ IDE_INIT0 ; LOOP UNTIL DONE ; ; INITIALIZE THE IDE INTERFACE NOW CALL IDE_RESET ; DO HARDWARE SETUP/INIT @@ -457,6 +458,7 @@ IDE_MEDIA: ; USE IDENTIFY COMMAND TO CHECK DEVICE LD HL,IDE_TIMEOUT ; POINT TO TIMEOUT LD (HL),IDE_TOFAST ; USE FAST TIMEOUT DURING IDENTIFY COMMAND + CALL IDE_SELUNIT ; HARDWARE SELECTION OF TARGET UNIT CALL IDE_IDENTIFY ; EXECUTE IDENTIFY COMMAND LD HL,IDE_TIMEOUT ; POINT TO TIMEOUT LD (HL),IDE_TONORM ; BACK TO NORMAL TIMEOUT @@ -832,14 +834,17 @@ IDE_INITUNIT: CALL IDE_SELUNIT ; SELECT UNIT RET NZ ; ABORT IF ERROR + ;LD HL,IDE_TIMEOUT ; POINT TO TIMEOUT + ;LD (HL),IDE_TOFAST ; USE FAST TIMEOUT DURING INIT + LD HL,IDE_TIMEOUT ; POINT TO TIMEOUT - LD (HL),IDE_TOFAST ; USE FAST TIMEOUT DURING INIT + LD (HL),IDE_TONORM ; SET NORMAL TIMEOUT CALL IDE_PROBE ; DO PROBE CALL Z,IDE_INITDEV ; IF FOUND, ATTEMPT TO INIT DEVICE - LD HL,IDE_TIMEOUT ; POINT TO TIMEOUT - LD (HL),IDE_TONORM ; BACK TO NORMAL TIMEOUT + ;LD HL,IDE_TIMEOUT ; POINT TO TIMEOUT + ;LD (HL),IDE_TONORM ; BACK TO NORMAL TIMEOUT RET ; @@ -883,6 +888,15 @@ IDE_PROBE: DCALL PRTHEXBYTE CALL DELAY ; DELAY ~16US +; + LD C,IDE_IO_STAT + IN A,(C) + DCALL PC_SPACE + DCALL PRTHEXBYTE + CP $FF + JP Z,IDE_NOMEDIA + CP $78 + JP Z,IDE_NOMEDIA ; DCALL IDE_REGDUMP ; diff --git a/Source/HBIOS/ppide.asm b/Source/HBIOS/ppide.asm index 870ba161..9ace1157 100644 --- a/Source/HBIOS/ppide.asm +++ b/Source/HBIOS/ppide.asm @@ -239,20 +239,6 @@ PPIDE_TOFAST .EQU 10 ; FAST TIMEOUT IS 0.5 SECS PPIDE_INIT: CALL NEWLINE ; FORMATTING PRTS("PPIDE:$") ; LABEL FOR IO ADDRESS -; -; SETUP THE DISPATCH TABLE ENTRIES -; - LD B,PPIDE_UNITCNT ; LOOP CONTROL - LD C,0 ; PHYSICAL UNIT INDEX -PPIDE_INIT0: - PUSH BC ; SAVE LOOP CONTROL - LD B,C ; PHYSICAL UNIT - LD C,DIODEV_PPIDE ; DEVICE TYPE - LD DE,0 ; UNIT DATA BLOB ADDRESS - CALL DIO_ADDENT ; ADD ENTRY, BC IS NOT DESTROYED - POP BC ; RESTORE LOOP CONTROL - INC C ; NEXT PHYSICAL UNIT - DJNZ PPIDE_INIT0 ; LOOP UNTIL DONE ; ; COMPUTE CPU SPEED COMPENSATED TIMEOUT SCALER ; AT 1MHZ, THE SCALER IS 218 (50000US / 229TS = 218) @@ -272,6 +258,30 @@ PPIDE_INIT0: PRTS(" UNITS=$") LD A,PPIDE_UNITCNT CALL PRTDECB +; + CALL PPIDE_DETECT ; CHECK FOR HARDWARE + JR Z,PPIDE_INIT00 ; CONTINUE IF PRESENT +; + ; HARDWARE NOT PRESENT + PRTS(" NOT PRESENT$") + OR $FF ; SIGNAL FAILURE + RET +; +PPIDE_INIT00: +; +; SETUP THE DISPATCH TABLE ENTRIES +; + LD B,PPIDE_UNITCNT ; LOOP CONTROL + LD C,0 ; PHYSICAL UNIT INDEX +PPIDE_INIT0: + PUSH BC ; SAVE LOOP CONTROL + LD B,C ; PHYSICAL UNIT + LD C,DIODEV_PPIDE ; DEVICE TYPE + LD DE,0 ; UNIT DATA BLOB ADDRESS + CALL DIO_ADDENT ; ADD ENTRY, BC IS NOT DESTROYED + POP BC ; RESTORE LOOP CONTROL + INC C ; NEXT PHYSICAL UNIT + DJNZ PPIDE_INIT0 ; LOOP UNTIL DONE ; ; INITIALIZE THE PPIDE INTERFACE NOW CALL PPIDE_RESET ; DO HARDWARE SETUP/INIT @@ -331,6 +341,31 @@ PPIDE_INIT2: XOR A ; SIGNAL SUCCESS RET ; RETURN WITH A=0, AND Z SET ; +;---------------------------------------------------------------------- +; PROBE FOR PPIDE HARDWARE +;---------------------------------------------------------------------- +; +; ON RETURN, ZF SET INDICATES HARDWARE FOUND +; +PPIDE_DETECT: +; + ; TEST FOR PPI EXISTENCE + ; WE SETUP THE PPI TO WRITE, THEN WRITE A VALUE OF ZERO + ; TO PORT A (DATALO), THEN READ IT BACK. IF THE PPI IS THERE + ; THEN THE BUS HOLD CIRCUITRY WILL READ BACK THE ZERO. SINCE + ; WE ARE IN WRITE MODE, AN IDE CONTROLLER WILL NOT BE ABLE TO + ; INTERFERE WITH THE VALUE BEING READ. + LD A,PPIDE_DIR_WRITE ; SET DATA BUS DIRECTION TO WRITE + OUT (PPIDE_IO_PPI),A ; OUTPUT TO CONTROL WORD + LD C,PPIDE_IO_DATALO ; PPI PORT A + XOR A ; VALUE ZERO + OUT (C),A ; PUSH VALUE TO PORT + IN A,(C) ; GET PORT VALUE + DCALL PC_SPACE + DCALL PRTHEXBYTE + OR A ; SET FLAGS + RET ; AND RETURN +; ;============================================================================= ; FUNCTION DISPATCH ENTRY POINT ;============================================================================= @@ -457,6 +492,7 @@ PPIDE_MEDIA: ; USE IDENTIFY COMMAND TO CHECK DEVICE LD HL,PPIDE_TIMEOUT ; POINT TO TIMEOUT LD (HL),PPIDE_TOFAST ; USE FAST TIMEOUT DURING IDENTIFY COMMAND + CALL PPIDE_SELUNIT ; HARDWARE SELECTION OF TARGET UNIT CALL PPIDE_IDENTIFY ; EXECUTE IDENTIFY COMMAND LD HL,PPIDE_TIMEOUT ; POINT TO TIMEOUT LD (HL),PPIDE_TONORM ; BACK TO NORMAL TIMEOUT @@ -816,13 +852,14 @@ PPIDE_RESET: LD A,PPIDE_DIR_READ ; SET DATA BUS DIRECTION TO READ OUT (PPIDE_IO_PPI),A ; DO IT ; + ; PULSE IDE RESET LINE LD A,PPIDE_CTL_RESET OUT (PPIDE_IO_CTL),A - LD DE,2 + LD DE,20 CALL VDELAY XOR A OUT (PPIDE_IO_CTL),A - LD DE,2 + LD DE,20 CALL VDELAY ; LD A,%00001010 ; SET ~IEN, NO INTERRUPTS @@ -874,19 +911,21 @@ PPIDE_INITUNIT: CALL PPIDE_SELUNIT ; SELECT UNIT RET NZ ; ABORT IF ERROR + ;LD HL,PPIDE_TIMEOUT ; POINT TO TIMEOUT + ;LD (HL),PPIDE_TOFAST ; USE FAST TIMEOUT DURING INIT + LD HL,PPIDE_TIMEOUT ; POINT TO TIMEOUT - LD (HL),PPIDE_TOFAST ; USE FAST TIMEOUT DURING INIT + LD (HL),PPIDE_TONORM ; SET NORMAL TIMEOUT CALL PPIDE_PROBE ; DO PROBE CALL Z,PPIDE_INITDEV ; IF FOUND, ATTEMPT TO INIT DEVICE - LD HL,PPIDE_TIMEOUT ; POINT TO TIMEOUT - LD (HL),PPIDE_TONORM ; BACK TO NORMAL TIMEOUT + ;LD HL,PPIDE_TIMEOUT ; POINT TO TIMEOUT + ;LD (HL),PPIDE_TONORM ; BACK TO NORMAL TIMEOUT RET ; ; TAKE ANY ACTIONS REQUIRED TO SELECT DESIRED PHYSICAL UNIT -; UNIT IS SPECIFIED IN A ; PPIDE_SELUNIT: LD A,(PPIDE_UNIT) ; GET UNIT @@ -921,6 +960,26 @@ PPIDE_PROBE: DCALL PRTHEXBYTE CALL DELAY ; DELAY ~16US +; +; IN A,(PPIDE_REG_STAT) ; GET STATUS + ; BELOW TESTS FOR EXISTENCE OF AN IDE CONTROLLER ON THE + ; PPIDE INTERFACE. WE WRITE A VALUE OF ZERO FIRST SO THAT + ; THE PPI BUS HOLD WILL RETURN A VALUE OF ZERO IF THERE IS + ; NOTHING CONNECTED TO PPI PORT A. THEN WE READ THE STATUS + ; REGISTER. IF AN IDE CONTROLLER IS THERE, IT SHOULD ALWAYS + ; RETURN SOMETHING OTHER THAN ZERO. NOTE THAT REG_STAT IS + ; ALSO THE COMMAND REGISTER FOR THE IDE CONTOLLER, BUT A + ; COMMAND VALUE OF ZERO IS A NOP, SO IT DOES NO HARM IF AN + ; IDE CONTOLLER IS THERE AND SEES IT. + XOR A + CALL PPIDE_OUT + .DB PPIDE_REG_STAT + CALL PPIDE_IN + .DB PPIDE_REG_STAT + DCALL PC_SPACE + DCALL PRTHEXBYTE + OR A + JP Z,PPIDE_NOMEDIA ; DCALL PPIDE_REGDUMP ; @@ -1140,7 +1199,11 @@ PPIDE_IN: OUT (C),B ; SET ADDRESS LINES ; 12TS SET 6,B ; TURN ON WRITE BIT ; 8TS OUT (C),B ; ASSERT WRITE LINE ; 12TS + ;NOP + ;NOP IN A,(PPIDE_IO_DATALO) ; GET DATA VALUE FROM DEVICE ; 11TS + ;NOP + ;NOP RES 6,B ; CLEAR WRITE BIT ; 8TS OUT (C),B ; DEASSERT WRITE LINE ; 12TS POP BC ; RECOVER INCOMING BC ; 10TS @@ -1162,7 +1225,11 @@ PPIDE_OUT: OUT (C),B ; SET ADDRESS LINES SET 5,B ; TURN ON WRITE BIT OUT (C),B ; ASSERT WRITE LINE + ;NOP + ;NOP OUT (PPIDE_IO_DATALO),A ; SEND DATA VALUE TO DEVICE + ;NOP + ;NOP RES 5,B ; CLEAR WRITE BIT OUT (C),B ; DEASSERT WRITE LINE POP BC ; RECOVER INCOMING BC diff --git a/Source/HBIOS/ver.inc b/Source/HBIOS/ver.inc index aa039e90..45b2b5c7 100644 --- a/Source/HBIOS/ver.inc +++ b/Source/HBIOS/ver.inc @@ -2,4 +2,4 @@ #DEFINE RMN 8 #DEFINE RUP 6 #DEFINE RTP 0 -#DEFINE BIOSVER "2.8.6-pre.1" +#DEFINE BIOSVER "2.8.6"