Browse Source

Finalize 2.8.6

- Support for RC2014
- Handle IDE disk spinup without timing out
pull/5/head v2.8.6
Wayne Warthen 8 years ago
parent
commit
feee56990a
  1. 5
      ReadMe.txt
  2. 2
      Source/CBIOS/ver.inc
  3. 106
      Source/HBIOS/fd.asm
  4. 66
      Source/HBIOS/ide.asm
  5. 107
      Source/HBIOS/ppide.asm
  6. 2
      Source/HBIOS/ver.inc

5
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
-----------------

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

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

66
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
;

107
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

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

Loading…
Cancel
Save