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) Wayne Warthen (wwarthen@gmail.com)
Version 2.8.6, 2017-10-09
Version 2.8.6, 2017-12-10
https://www.retrobrewcomputers.org/ https://www.retrobrewcomputers.org/
RomWBW is a ROM-based implementation of CP/M-80 2.2 and Z-System for 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. 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 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. 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 If you use a customized ROM image, it is recommended that you first
@ -114,6 +114,7 @@ ROM version:
- TALK.COM - TALK.COM
- FDU.COM - FDU.COM
- XM.COM - XM.COM
- RTC.COM
UNA Hardware BIOS UNA Hardware BIOS
----------------- -----------------

2
Source/CBIOS/ver.inc

@ -2,4 +2,4 @@
#DEFINE RMN 8 #DEFINE RMN 8
#DEFINE RUP 6 #DEFINE RUP 6
#DEFINE RTP 0 #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 ; PORTS
; ;
#IF ((FDMODE == FDMODE_DIO) | (FDMODE == FDMODE_ZETA) | (FDMODE == FDMODE_DIO3)) #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 #ENDIF
#IF (FDMODE == FDMODE_N8) #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 #ENDIF
; ;
; DISK OPERATIONS ; 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 ; 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) #IF (FDTRACE > 0)
; ;

66
Source/HBIOS/ide.asm

@ -228,29 +228,6 @@ IDE_TOFAST .EQU 10 ; FAST TIMEOUT IS 0.5 SECS
IDE_INIT: IDE_INIT:
CALL NEWLINE ; FORMATTING CALL NEWLINE ; FORMATTING
PRTS("IDE:$") 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 ; COMPUTE CPU SPEED COMPENSATED TIMEOUT SCALER
; AT 1MHZ, THE SCALER IS 961 (50000US / 52TS = 961) ; AT 1MHZ, THE SCALER IS 961 (50000US / 52TS = 961)
@ -278,6 +255,30 @@ IDE_INIT0:
PRTS(" UNITS=$") ; PRINT LABEL FOR UNIT COUNT PRTS(" UNITS=$") ; PRINT LABEL FOR UNIT COUNT
LD A,IDE_UNITCNT ; GET UNIT COUNT LD A,IDE_UNITCNT ; GET UNIT COUNT
CALL PRTDECB ; PRINT IT IN DECIMAL 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 ; INITIALIZE THE IDE INTERFACE NOW
CALL IDE_RESET ; DO HARDWARE SETUP/INIT CALL IDE_RESET ; DO HARDWARE SETUP/INIT
@ -457,6 +458,7 @@ IDE_MEDIA:
; USE IDENTIFY COMMAND TO CHECK DEVICE ; USE IDENTIFY COMMAND TO CHECK DEVICE
LD HL,IDE_TIMEOUT ; POINT TO TIMEOUT LD HL,IDE_TIMEOUT ; POINT TO TIMEOUT
LD (HL),IDE_TOFAST ; USE FAST TIMEOUT DURING IDENTIFY COMMAND LD (HL),IDE_TOFAST ; USE FAST TIMEOUT DURING IDENTIFY COMMAND
CALL IDE_SELUNIT ; HARDWARE SELECTION OF TARGET UNIT
CALL IDE_IDENTIFY ; EXECUTE IDENTIFY COMMAND CALL IDE_IDENTIFY ; EXECUTE IDENTIFY COMMAND
LD HL,IDE_TIMEOUT ; POINT TO TIMEOUT LD HL,IDE_TIMEOUT ; POINT TO TIMEOUT
LD (HL),IDE_TONORM ; BACK TO NORMAL TIMEOUT LD (HL),IDE_TONORM ; BACK TO NORMAL TIMEOUT
@ -832,14 +834,17 @@ IDE_INITUNIT:
CALL IDE_SELUNIT ; SELECT UNIT CALL IDE_SELUNIT ; SELECT UNIT
RET NZ ; ABORT IF ERROR 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_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 IDE_PROBE ; DO PROBE
CALL Z,IDE_INITDEV ; IF FOUND, ATTEMPT TO INIT DEVICE 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 RET
; ;
@ -883,6 +888,15 @@ IDE_PROBE:
DCALL PRTHEXBYTE DCALL PRTHEXBYTE
CALL DELAY ; DELAY ~16US 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 DCALL IDE_REGDUMP
; ;

107
Source/HBIOS/ppide.asm

@ -239,20 +239,6 @@ PPIDE_TOFAST .EQU 10 ; FAST TIMEOUT IS 0.5 SECS
PPIDE_INIT: PPIDE_INIT:
CALL NEWLINE ; FORMATTING CALL NEWLINE ; FORMATTING
PRTS("PPIDE:$") ; LABEL FOR IO ADDRESS 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 ; COMPUTE CPU SPEED COMPENSATED TIMEOUT SCALER
; AT 1MHZ, THE SCALER IS 218 (50000US / 229TS = 218) ; AT 1MHZ, THE SCALER IS 218 (50000US / 229TS = 218)
@ -272,6 +258,30 @@ PPIDE_INIT0:
PRTS(" UNITS=$") PRTS(" UNITS=$")
LD A,PPIDE_UNITCNT LD A,PPIDE_UNITCNT
CALL PRTDECB 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 ; INITIALIZE THE PPIDE INTERFACE NOW
CALL PPIDE_RESET ; DO HARDWARE SETUP/INIT CALL PPIDE_RESET ; DO HARDWARE SETUP/INIT
@ -331,6 +341,31 @@ PPIDE_INIT2:
XOR A ; SIGNAL SUCCESS XOR A ; SIGNAL SUCCESS
RET ; RETURN WITH A=0, AND Z SET 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 ; FUNCTION DISPATCH ENTRY POINT
;============================================================================= ;=============================================================================
@ -457,6 +492,7 @@ PPIDE_MEDIA:
; USE IDENTIFY COMMAND TO CHECK DEVICE ; USE IDENTIFY COMMAND TO CHECK DEVICE
LD HL,PPIDE_TIMEOUT ; POINT TO TIMEOUT LD HL,PPIDE_TIMEOUT ; POINT TO TIMEOUT
LD (HL),PPIDE_TOFAST ; USE FAST TIMEOUT DURING IDENTIFY COMMAND LD (HL),PPIDE_TOFAST ; USE FAST TIMEOUT DURING IDENTIFY COMMAND
CALL PPIDE_SELUNIT ; HARDWARE SELECTION OF TARGET UNIT
CALL PPIDE_IDENTIFY ; EXECUTE IDENTIFY COMMAND CALL PPIDE_IDENTIFY ; EXECUTE IDENTIFY COMMAND
LD HL,PPIDE_TIMEOUT ; POINT TO TIMEOUT LD HL,PPIDE_TIMEOUT ; POINT TO TIMEOUT
LD (HL),PPIDE_TONORM ; BACK TO NORMAL 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 LD A,PPIDE_DIR_READ ; SET DATA BUS DIRECTION TO READ
OUT (PPIDE_IO_PPI),A ; DO IT OUT (PPIDE_IO_PPI),A ; DO IT
; ;
; PULSE IDE RESET LINE
LD A,PPIDE_CTL_RESET LD A,PPIDE_CTL_RESET
OUT (PPIDE_IO_CTL),A OUT (PPIDE_IO_CTL),A
LD DE,2
LD DE,20
CALL VDELAY CALL VDELAY
XOR A XOR A
OUT (PPIDE_IO_CTL),A OUT (PPIDE_IO_CTL),A
LD DE,2
LD DE,20
CALL VDELAY CALL VDELAY
; ;
LD A,%00001010 ; SET ~IEN, NO INTERRUPTS LD A,%00001010 ; SET ~IEN, NO INTERRUPTS
@ -874,19 +911,21 @@ PPIDE_INITUNIT:
CALL PPIDE_SELUNIT ; SELECT UNIT CALL PPIDE_SELUNIT ; SELECT UNIT
RET NZ ; ABORT IF ERROR 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_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 PPIDE_PROBE ; DO PROBE
CALL Z,PPIDE_INITDEV ; IF FOUND, ATTEMPT TO INIT DEVICE 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 RET
; ;
; TAKE ANY ACTIONS REQUIRED TO SELECT DESIRED PHYSICAL UNIT ; TAKE ANY ACTIONS REQUIRED TO SELECT DESIRED PHYSICAL UNIT
; UNIT IS SPECIFIED IN A
; ;
PPIDE_SELUNIT: PPIDE_SELUNIT:
LD A,(PPIDE_UNIT) ; GET UNIT LD A,(PPIDE_UNIT) ; GET UNIT
@ -921,6 +960,26 @@ PPIDE_PROBE:
DCALL PRTHEXBYTE DCALL PRTHEXBYTE
CALL DELAY ; DELAY ~16US 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 DCALL PPIDE_REGDUMP
; ;
@ -1140,7 +1199,11 @@ PPIDE_IN:
OUT (C),B ; SET ADDRESS LINES ; 12TS OUT (C),B ; SET ADDRESS LINES ; 12TS
SET 6,B ; TURN ON WRITE BIT ; 8TS SET 6,B ; TURN ON WRITE BIT ; 8TS
OUT (C),B ; ASSERT WRITE LINE ; 12TS OUT (C),B ; ASSERT WRITE LINE ; 12TS
;NOP
;NOP
IN A,(PPIDE_IO_DATALO) ; GET DATA VALUE FROM DEVICE ; 11TS IN A,(PPIDE_IO_DATALO) ; GET DATA VALUE FROM DEVICE ; 11TS
;NOP
;NOP
RES 6,B ; CLEAR WRITE BIT ; 8TS RES 6,B ; CLEAR WRITE BIT ; 8TS
OUT (C),B ; DEASSERT WRITE LINE ; 12TS OUT (C),B ; DEASSERT WRITE LINE ; 12TS
POP BC ; RECOVER INCOMING BC ; 10TS POP BC ; RECOVER INCOMING BC ; 10TS
@ -1162,7 +1225,11 @@ PPIDE_OUT:
OUT (C),B ; SET ADDRESS LINES OUT (C),B ; SET ADDRESS LINES
SET 5,B ; TURN ON WRITE BIT SET 5,B ; TURN ON WRITE BIT
OUT (C),B ; ASSERT WRITE LINE OUT (C),B ; ASSERT WRITE LINE
;NOP
;NOP
OUT (PPIDE_IO_DATALO),A ; SEND DATA VALUE TO DEVICE OUT (PPIDE_IO_DATALO),A ; SEND DATA VALUE TO DEVICE
;NOP
;NOP
RES 5,B ; CLEAR WRITE BIT RES 5,B ; CLEAR WRITE BIT
OUT (C),B ; DEASSERT WRITE LINE OUT (C),B ; DEASSERT WRITE LINE
POP BC ; RECOVER INCOMING BC POP BC ; RECOVER INCOMING BC

2
Source/HBIOS/ver.inc

@ -2,4 +2,4 @@
#DEFINE RMN 8 #DEFINE RMN 8
#DEFINE RUP 6 #DEFINE RUP 6
#DEFINE RTP 0 #DEFINE RTP 0
#DEFINE BIOSVER "2.8.6-pre.1"
#DEFINE BIOSVER "2.8.6"

Loading…
Cancel
Save