Browse Source

IDE and PPIDE driver refactoring

pull/3/head
Wayne Warthen 10 years ago
parent
commit
099172e44e
  1. 2
      Source/HBIOS/hbios.asm
  2. 272
      Source/HBIOS/ide.asm
  3. 331
      Source/HBIOS/ppide.asm

2
Source/HBIOS/hbios.asm

@ -1769,6 +1769,8 @@ STR_BANNER .DB "SBC HBIOS v", BIOSVER, ", ", TIMESTAMP, "$"
STR_PLATFORM .DB PLATFORM_NAME, "$"
STR_SWITCH .DB "*** Console switch to CRT device ***$"
;
HB_TMPBUF .FILL 512,0 ; INTERNAL DISK BUFFER
;
HB_BUF .EQU $ ; PHYSICAL DISK BUFFER
HB_END .EXPORT HB_END ; EXPORT ENDING ADDRESS
;

272
Source/HBIOS/ide.asm

@ -219,62 +219,41 @@ IDE_INIT:
PRTS(" IO=0x$") ; LABEL FOR IO ADDRESS
LD A,IDE_IO_DATA ; GET IO ADDRESS
CALL PRTHEXBYTE ; PRINT IT
;
; CLEAR OUT ALL DATA (FOR ALL UNITS)
LD HL,IDE_UDATA
LD BC,IDE_UDLEN
XOR A
CALL FILL
;
; INITIALIZE THE IDE INTERFACE NOW
CALL IDE_RESET ; DO HARDWARE SETUP/INIT
JR NZ,IDE_INIT2 ; SKIP PROBING IF INTERFACE SETUP FAILS
;
; INITIAL DEVICE PROBING (CHECKING SIGNATURES)
LD B,IDE_UNITCNT ; NUMBER OF UNITS TO TRY
LD C,0 ; UNIT INDEX FOR LOOP
IDE_INIT1:
LD A,C ; UNIT NUMBER TO A
DCALL PC_SPACE ; IF DEBUGGING, PRINT A SPACE
DCALL PC_LBKT ; IF DEBUGGING, PRINT LEFT BRACKET
PUSH BC
CALL IDE_PROBE ; PROBE FOR DEVICE PRESENCE
POP BC
DCALL PC_RBKT ; IF DEBUGGING, PRINT A RIGHT BRACKET
INC C ; NEXT UNIT
DJNZ IDE_INIT1 ; LOOP AS NEEDED
;
; PRINT UNIT COUNT
PRTS(" UNITS=$") ; PRINT LABEL FOR UNIT COUNT
LD A,IDE_UNITCNT ; GET UNIT COUNT
CALL PRTDECB ; PRINT IT IN DECIMAL
;
IDE_INIT2:
; CHECK FOR ZERO UNITS AND GET OUT IF SO!
; INITIALIZE THE IDE INTERFACE NOW
CALL IDE_RESET ; DO HARDWARE SETUP/INIT
RET NZ ; ABORT IF RESET FAILS
;
; DEVICE SETUP LOOP
LD B,A ; LOOP ONCE PER UNIT
; DEVICE DISPLAY LOOP
LD B,IDE_UNITCNT ; LOOP ONCE PER UNIT
LD C,0 ; C IS UNIT INDEX
IDE_INIT3:
PUSH BC ; SAVE LOOP CONTROL
IDE_INIT1:
LD A,C ; UNIT NUM TO ACCUM
CALL IDE_INITUNIT ; IF EXISTS (NZ), INIT UNIT
PUSH BC ; SAVE LOOP CONTROL
CALL IDE_INIT2 ; DISPLAY UNIT INFO
#IF (IDETRACE < 2)
CALL NZ,IDE_PRTSTAT ; IF ERROR, NOTIFY USER IF NOT DONE PREVIOUSLY
#ENDIF
POP BC ; RESTORE LOOP CONTROL
INC C ; INCREMENT UNIT INDEX
DJNZ IDE_INIT3 ; LOOP UNTIL DONE
RET ; INIT FINISHED
DJNZ IDE_INIT1 ; LOOP UNTIL DONE
RET ; DONE
;
; INITIALIZE UNIT DESIGNATED IN ACCUM
;
IDE_INITUNIT:
IDE_INIT2:
; DISPLAY DEVICE INFO
CALL IDE_SELUNIT ; SELECT UNIT
RET NZ ; ABORT ON ERROR
;
CALL IDE_INITDEV ; INIT DEVICE; FILL DIOBUF W/ IDENTIFY RESULTS
RET NZ ; ABORT ON ERROR
; CHECK FOR BAD STATUS
IDE_DPTR(IDE_STAT) ; GET STATUS ADR IN HL, AF TRASHED
LD A,(HL)
OR A
JP NZ,IDE_PRTSTAT
;
CALL IDE_PRTPREFIX ; PRINT DEVICE PREFIX
;
@ -284,7 +263,7 @@ IDE_INITUNIT:
;
; PRINT LBA/NOLBA
CALL PC_SPACE ; FORMATTING
LD HL,(DIOBUF) ; POINT TO BUFFER START
LD HL,HB_TMPBUF ; POINT TO BUFFER START
LD DE,98+1 ; OFFSET OF BYTE CONTAINING LBA FLAG
ADD HL,DE ; POINT TO FINAL BUFFER ADDRESS
LD A,(HL) ; GET THE BYTE
@ -355,7 +334,14 @@ IDE_STATUS:
; IDE_MEDIA
;
IDE_MEDIA:
CALL IDE_INITDEV ; RE-INIT SELECTED UNIT
LD A,(IDE_UNIT) ; GET UNIT SELECTION
PUSH AF ; SAVE UNIT SELECTION
CALL IDE_RESET ; RESET ALL DEVICES ON BUS
POP AF ; RECOVER UNIT SELECTION
CALL IDE_SELUNIT ; RESELECT DESIRED UNIT
IDE_DPTR(IDE_STAT) ; POINT TO UNIT STATUS
LD A,(HL) ; GET STATUS
OR A ; SET FLAGS
LD A,MID_HD ; ASSUME WE ARE OK
RET Z ; RETURN IF GOOD INIT
LD A,MID_NONE ; SIGNAL NO MEDA
@ -388,59 +374,6 @@ IDE_GEOM:
; FUNCTION SUPPORT ROUTINES
;=============================================================================
;
; (RE)INITIALIZE DEVICE
;
IDE_INITDEV:
;
IDE_DPTR(IDE_TYPE) ; POINT HL TO UNIT TYPE FIELD, A IS TRASHED
LD A,(HL) ; GET THE DEVICE TYPE
OR A ; SET FLAGS
JP Z,IDE_NOMEDIA ; EXIT SETTING NO MEDIA STATUS
;
; CLEAR OUT UNIT SPECIFIC DATA, BUT PRESERVE THE EXISTING
; VALUE OF THE UNIT TYPE WHICH WAS ESTABLISHED BY THE DEVICE
; PROBES WHEN THE IDE BUS WAS RESET
PUSH AF ; SAVE UNIT TYPE VALUE FROM ABOVE
PUSH HL ; SAVE UNIT TYPE FIELD POINTER
IDE_DPTR(0) ; SET HL TO START OF UNIT DATA
LD BC,IDE_UDLEN
XOR A
CALL FILL
POP HL ; RECOVER UNIT TYPE FIELD POINTER
POP AF ; RECOVER UNIT TYPE VALUE
LD (HL),A ; AND PUT IT BACK
;
#IF (IDE8BIT)
LD A,IDE_FEAT_ENABLE8BIT ; FEATURE VALUE = ENABLE 8-BIT PIO
CALL IDE_SETFEAT ; SET FEATURE
RET NZ ; BAIL OUT ON ERROR
#ENDIF
;
CALL IDE_IDENTIFY ; EXECUTE IDENTIFY COMMAND
RET NZ ; BAIL OUT ON ERROR
;
LD DE,(DIOBUF) ; POINT TO BUFFER
CALL DUMP_BUFFER ; DUMP IT IF DEBUGGING
;
; GET DEVICE CAPACITY AND SAVE IT
IDE_DPTR(IDE_CAPACITY) ; POINT HL TO UNIT CAPACITY FIELD
PUSH HL ; SAVE POINTER
LD HL,(DIOBUF) ; POINT TO BUFFER START
LD A,120 ; OFFSET OF SECTOR COUNT
CALL ADDHLA ; POINT TO ADDRESS OF SECTOR COUNT
CALL LD32 ; LOAD IT TO DE:HL
POP BC ; RECOVER POINTER TO CAPACITY ENTRY
CALL ST32 ; SAVE CAPACITY
;
; RESET CARD STATUS TO 0 (OK)
IDE_DPTR(IDE_STAT) ; HL := ADR OF STATUS, AF TRASHED
XOR A ; A := 0 (STATUS = OK)
LD (HL),A ; SAVE IT
;
RET ; RETURN, A=0, Z SET
;
;
;
IDE_SETFEAT:
PUSH AF
#IF (IDETRACE >= 3)
@ -474,6 +407,7 @@ IDE_IDENTIFY:
LD (IDE_CMD),A
CALL IDE_RUNCMD
RET NZ
LD HL,HB_TMPBUF
JP IDE_GETBUF ; EXIT THRU BUFRD
;
;
@ -495,6 +429,7 @@ IDE_RDSEC:
LD (IDE_CMD),A
CALL IDE_RUNCMD
RET NZ
LD HL,(DIOBUF)
JP IDE_GETBUF
;
;
@ -516,6 +451,7 @@ IDE_WRSEC:
LD (IDE_CMD),A
CALL IDE_RUNCMD
RET NZ
LD HL,(DIOBUF)
JP IDE_PUTBUF
;
;
@ -590,25 +526,21 @@ IDE_GETBUF:
CALL IDE_WAITDRQ ; WAIT FOR BUFFER READY
RET NZ ; BAIL OUT IF TIMEOUT
LD HL,(DIOBUF)
;LD HL,(DIOBUF)
LD B,0
#IF (IDE8BIT | (IDEMODE == IDEMODE_DIDE))
LD C,IDE_IO_DATA
; INIR
; INIR
IDE_GETBUF1:
;IN A,(IDE_IO_DATA)
;CALL PRTHEXBYTE
CALL DELAY
INI
JR NZ,IDE_GETBUF1
IDE_GETBUF2:
;IN A,(IDE_IO_DATA)
;CALL PRTHEXBYTE
CALL DELAY
INI
JR NZ,IDE_GETBUF2
INIR
INIR
;X1:
; NOP
; INI
; JR NZ,X1
;X2:
; NOP
; INI
; JR NZ,X2
#ELSE
LD C,IDE_IO_DATAHI
IDE_GETBUF1:
@ -618,6 +550,7 @@ IDE_GETBUF1:
INI ; READ AND SAVE HI BYTE, INC HL, DEC B
JP NZ,IDE_GETBUF1 ; LOOP AS NEEDED
#ENDIF
CALL IDE_WAITRDY ; PROBLEMS IF THIS IS REMOVED!
CALL IDE_GETRES
JP NZ,IDE_IOERR
RET
@ -631,8 +564,8 @@ IDE_PUTBUF:
CALL IDE_WAITDRQ ; WAIT FOR BUFFER READY
RET NZ ; BAIL OUT IF TIMEOUT
LD HL,(DIOBUF)
;
;LD HL,(DIOBUF)
LD B,0
#IF (IDE8BIT | (IDEMODE == IDEMODE_DIDE))
@ -648,6 +581,7 @@ IDE_PUTBUF1:
OUT (IDE_IO_DATALO),A ; NOW WRITE THE SAVED LO BYTE TO LO BYTE
JP NZ,IDE_PUTBUF1 ; LOOP AS NEEDED
#ENDIF
CALL IDE_WAITRDY ; PROBLEMS IF THIS IS REMOVED!
CALL IDE_GETRES
JP NZ,IDE_IOERR
RET
@ -671,7 +605,7 @@ IDE_GETRES:
; HARDWARE INTERFACE ROUTINES
;=============================================================================
;
; SOFT RESET OF ALL DEVICES ON BUS
; RESET ALL DEVICES ON BUS
;
IDE_RESET:
;
@ -689,12 +623,44 @@ IDE_RESET:
;
LD DE,16 ; DELAY ~250US
CALL VDELAY
;
LD A,%00001010 ; NO INTERRUPTS, DEASSERT RESET
OUT (IDE_IO_CTRL),A
LD DE,16 ; DELAY ~250US
;
;CALL LDELAY
LD DE,$2000 ; DELAY N * 16US (~128MS)
CALL VDELAY
;
; CLEAR OUT ALL DATA (FOR ALL UNITS)
LD HL,IDE_UDATA
LD BC,IDE_UDLEN
XOR A
CALL FILL
;
; PROBE / INITIALIZE ALL UNITS
LD B,IDE_UNITCNT ; NUMBER OF UNITS TO TRY
LD C,0 ; UNIT INDEX FOR LOOP
IDE_RESET1:
LD A,C ; UNIT NUMBER TO A
PUSH BC
CALL IDE_INITUNIT ; PROBE/INIT UNIT
POP BC
INC C ; NEXT UNIT
DJNZ IDE_RESET1 ; LOOP AS NEEDED
;
XOR A ; SIGNAL SUCCESS
RET ; RETURN
RET ; AND DONE
;
;
;
IDE_INITUNIT:
CALL IDE_SELUNIT ; SELECT UNIT
RET NZ ; ABORT IF ERROR
CALL IDE_PROBE ; DO PROBE
RET NZ ; ABORT IF ERROR
JP IDE_INITDEV ; INIT DEVICE AND RETURN
;
; TAKE ANY ACTIONS REQUIRED TO SELECT DESIRED PHYSICAL UNIT
; UNIT IS SPECIFIED IN A
@ -730,24 +696,17 @@ IDE_SELUNIT:
;
;
IDE_PROBE:
CALL IDE_SELUNIT ; SELECT UNIT
RET NZ ; ABORT ON ERROR
;
;CALL LDELAY
LD DE,$2000 ; DELAY N * 16US (~128MS)
CALL VDELAY
;
;; WAIT FOR READY...
;CALL PPIDE_WAITBSY ; WAIT FOR BUSY TO CLEAR
;RET NZ ; ABORT ON TIMEOUT
#IF (IDETRACE >= 3)
CALL IDE_PRTPREFIX
PRTS(" PROBE$") ; LABEL FOR IO ADDRESS
#ENDIF
;
; CHECK STATUS
IN A,(IDE_IO_STAT) ; GET STATUS
DCALL PC_SPACE
DCALL PRTHEXBYTE ; IF DEBUG, PRINT STATUS
OR A ; SET FLAGS TO TEST FOR ZERO
JR NZ,IDE_PROBE0 ; CONTINUE IF NON-ZERO
DEC A ; ZERO MEANS NO MEDIA, SIGNAL ERROR
RET ; AND DONE
JP Z,IDE_NOMEDIA
;
IDE_PROBE0:
;CALL IDE_WAITBSY ; WAIT FOR BUSY TO CLEAR
@ -767,22 +726,22 @@ IDE_PROBE1:
IN A,(IDE_IO_COUNT)
DCALL PRTHEXBYTE
CP $01
RET NZ
JP NZ,IDE_NOMEDIA
DCALL PC_SPACE
IN A,(IDE_IO_SECT)
DCALL PRTHEXBYTE
CP $01
RET NZ
JP NZ,IDE_NOMEDIA
DCALL PC_SPACE
IN A,(IDE_IO_CYLLO)
DCALL PRTHEXBYTE
CP $00
RET NZ
JP NZ,IDE_NOMEDIA
DCALL PC_SPACE
IN A,(IDE_IO_CYLHI)
DCALL PRTHEXBYTE
CP $00
RET NZ
JP NZ,IDE_NOMEDIA
;
; SIGNATURE MATCHES ATA DEVICE, RECORD TYPE AND RETURN SUCCESS
IDE_DPTR(IDE_TYPE) ; POINT HL TO UNIT TYPE FIELD, A IS TRASHED
@ -790,6 +749,59 @@ IDE_PROBE1:
XOR A ; SIGNAL SUCCESS
RET ; DONE, NOTE THAT A=0 AND Z IS SET
;
; (RE)INITIALIZE DEVICE
;
IDE_INITDEV:
;
IDE_DPTR(IDE_TYPE) ; POINT HL TO UNIT TYPE FIELD, A IS TRASHED
LD A,(HL) ; GET THE DEVICE TYPE
OR A ; SET FLAGS
JP Z,IDE_NOMEDIA ; EXIT SETTING NO MEDIA STATUS
;
; CLEAR OUT UNIT SPECIFIC DATA, BUT PRESERVE THE EXISTING
; VALUE OF THE UNIT TYPE WHICH WAS ESTABLISHED BY THE DEVICE
; PROBES WHEN THE IDE BUS WAS RESET
PUSH AF ; SAVE UNIT TYPE VALUE FROM ABOVE
PUSH HL ; SAVE UNIT TYPE FIELD POINTER
IDE_DPTR(0) ; SET HL TO START OF UNIT DATA
LD BC,IDE_UDLEN
XOR A
CALL FILL
POP HL ; RECOVER UNIT TYPE FIELD POINTER
POP AF ; RECOVER UNIT TYPE VALUE
LD (HL),A ; AND PUT IT BACK
;
#IF (IDE8BIT)
LD A,IDE_FEAT_ENABLE8BIT ; FEATURE VALUE = ENABLE 8-BIT PIO
#ELSE
LD A,IDE_FEAT_DISABLE8BIT ; FEATURE VALUE = DISABLE 8-BIT PIO
#ENDIF
CALL IDE_SETFEAT ; SET FEATURE
RET NZ ; BAIL OUT ON ERROR
;
CALL IDE_IDENTIFY ; EXECUTE IDENTIFY COMMAND
RET NZ ; BAIL OUT ON ERROR
;
LD DE,HB_TMPBUF ; POINT TO BUFFER
DCALL DUMP_BUFFER ; DUMP IT IF DEBUGGING
;
; GET DEVICE CAPACITY AND SAVE IT
IDE_DPTR(IDE_CAPACITY) ; POINT HL TO UNIT CAPACITY FIELD
PUSH HL ; SAVE POINTER
LD HL,HB_TMPBUF ; POINT TO BUFFER START
LD A,120 ; OFFSET OF SECTOR COUNT
CALL ADDHLA ; POINT TO ADDRESS OF SECTOR COUNT
CALL LD32 ; LOAD IT TO DE:HL
POP BC ; RECOVER POINTER TO CAPACITY ENTRY
CALL ST32 ; SAVE CAPACITY
;
; RESET CARD STATUS TO 0 (OK)
IDE_DPTR(IDE_STAT) ; HL := ADR OF STATUS, AF TRASHED
XOR A ; A := 0 (STATUS = OK)
LD (HL),A ; SAVE IT
;
RET ; RETURN, A=0, Z SET
;
;
;
IDE_CHKDEVICE:

331
Source/HBIOS/ppide.asm

@ -152,7 +152,7 @@ PPIDE_REG_DRVADR .EQU PPIDE_CTL_CS3FX | $07 ; DRIVE ADDRESS REGISTER (R)
; PPIDE2: SECONDARY MASTER
; PPIDE3: SECONDARY SLAVE
;
PPIDE_UNITCNT .EQU 2 ; ASSUME ONLY PRIMARY INTERFACE
PPIDE_UNITCNT .EQU 2 ; ASSUME ONLY PRIMARY INTERFACE
;
; COMMAND BYTES
;
@ -215,62 +215,36 @@ PPIDE_INIT:
PRTS(" UNITS=$")
LD A,PPIDE_UNITCNT
CALL PRTDECB
;
; CLEAR OUT ALL DATA (FOR ALL UNITS)
LD HL,PPIDE_UDATA
LD BC,PPIDE_UDLEN
XOR A
CALL FILL
;
; INITIALIZE THE PPIDE INTERFACE NOW
CALL PPIDE_RESET ; DO HARDWARE SETUP/INIT
JR NZ,PPIDE_INIT2 ; SKIP PROBING IF INTERFACE SETUP FAILS
;
; INITIAL DEVICE PROBING (CHECKING SIGNATURES)
LD B,PPIDE_UNITCNT ; NUMBER OF UNITS TO TRY
LD C,0 ; UNIT INDEX FOR LOOP
PPIDE_INIT1:
LD A,C ; UNIT NUMBER TO A
DCALL PC_SPACE ; IF DEBUGGING, PRINT A SPACE
DCALL PC_LBKT ; IF DEBUGGING, PRINT LEFT BRACKET
PUSH BC
CALL PPIDE_PROBE ; PROBE FOR DEVICE PRESENCE
POP BC
DCALL PC_RBKT ; IF DEBUGGING, PRINT A RIGHT BRACKET
INC C ; NEXT UNIT
DJNZ PPIDE_INIT1 ; LOOP AS NEEDED
;
; PRINT UNIT COUNT
PRTS(" UNITS=$") ; PRINT LABEL FOR UNIT COUNT
LD A,PPIDE_UNITCNT ; GET UNIT COUNT
CALL PRTDECB ; PRINT IT IN DECIMAL
RET NZ ; ABORT IF RESET FAILS
;
PPIDE_INIT2:
; CHECK FOR ZERO UNITS AND GET OUT IF SO!
;
; DEVICE SETUP LOOP
LD B,A ; LOOP ONCE PER UNIT
; DEVICE DISPLAY LOOP
LD B,PPIDE_UNITCNT ; LOOP ONCE PER UNIT
LD C,0 ; C IS UNIT INDEX
PPIDE_INIT3:
PUSH BC ; SAVE LOOP CONTROL
PPIDE_INIT1:
LD A,C ; UNIT NUM TO ACCUM
CALL PPIDE_INITUNIT ; IF EXISTS (NZ), INIT UNIT
#IF (PPIDETRACE < 2)
CALL NZ,PPIDE_PRTSTAT ; IF ERROR, NOTIFY USER IF NOT DONE PREVIOUSLY
PUSH BC ; SAVE LOOP CONTROL
CALL PPIDE_INIT2 ; DISPLAY UNIT INFO
#IF (IDETRACE < 2)
CALL NZ,PPIDE_PRTSTAT ; IF ERROR, NOTIFY USER IF NOT DONE PREVIOUSLY
#ENDIF
POP BC ; RESTORE LOOP CONTROL
INC C ; INCREMENT UNIT INDEX
DJNZ PPIDE_INIT3 ; LOOP UNTIL DONE
RET ; INIT FINISHED
;
; INITIALIZE UNIT DESIGNATED IN ACCUM
DJNZ PPIDE_INIT1 ; LOOP UNTIL DONE
RET ; DONE
;
PPIDE_INITUNIT:
PPIDE_INIT2:
; DISPLAY DEVICE INFO
CALL PPIDE_SELUNIT ; SELECT UNIT
RET NZ ; ABORT ON ERROR
;
CALL PPIDE_INITDEV ; INIT DEVICE; FILL DIOBUF W/ IDENTIFY RESULTS
RET NZ ; ABORT ON ERROR
; CHECK FOR BAD STATUS
PPIDE_DPTR(PPIDE_STAT) ; GET STATUS ADR IN HL, AF TRASHED
LD A,(HL)
OR A
JP NZ,PPIDE_PRTSTAT
;
CALL PPIDE_PRTPREFIX ; PRINT DEVICE PREFIX
;
@ -280,7 +254,7 @@ PPIDE_INITUNIT:
;
; PRINT LBA/NOLBA
CALL PC_SPACE ; FORMATTING
LD HL,(DIOBUF) ; POINT TO BUFFER START
LD HL,HB_TMPBUF ; POINT TO BUFFER START
LD DE,98+1 ; OFFSET OF BYTE CONTAINING LBA FLAG
ADD HL,DE ; POINT TO FINAL BUFFER ADDRESS
LD A,(HL) ; GET THE BYTE
@ -291,7 +265,7 @@ PPIDE_INITUNIT:
;
; PRINT STORAGE CAPACITY (BLOCK COUNT)
PRTS(" BLOCKS=0x$") ; PRINT FIELD LABEL
PPIDE_DPTR(PPIDE_CAPACITY) ; SET HL TO ADR OF DEVICE CAPACITY
PPIDE_DPTR(PPIDE_CAPACITY) ; SET HL TO ADR OF DEVICE CAPACITY
CALL LD32 ; GET THE CAPACITY VALUE
CALL PRTHEX32 ; PRINT HEX VALUE
;
@ -351,7 +325,14 @@ PPIDE_STATUS:
; PPIDE_MEDIA
;
PPIDE_MEDIA:
CALL PPIDE_INITDEV ; RE-INIT SELECTED UNIT
LD A,(PPIDE_UNIT) ; GET UNIT SELECTION
PUSH AF ; SAVE UNIT SELECTION
CALL PPIDE_RESET ; RESET ALL DEVICES ON BUS
POP AF ; RECOVER UNIT SELECTION
CALL PPIDE_SELUNIT ; RESELECT DESIRED UNIT
PPIDE_DPTR(PPIDE_STAT) ; POINT TO UNIT STATUS
LD A,(HL) ; GET STATUS
OR A ; SET FLAGS
LD A,MID_HD ; ASSUME WE ARE OK
RET Z ; RETURN IF GOOD INIT
LD A,MID_NONE ; SIGNAL NO MEDA
@ -361,7 +342,7 @@ PPIDE_MEDIA:
;
;
PPIDE_CAP:
PPIDE_DPTR(PPIDE_CAPACITY) ; POINT HL TO CAPACITY OF CUR UNIT
PPIDE_DPTR(PPIDE_CAPACITY) ; POINT HL TO CAPACITY OF CUR UNIT
CALL LD32 ; GET THE CURRENT CAPACITY DO DE:HL
LD BC,512 ; 512 BYTES PER BLOCK
XOR A ; SIGNAL SUCCESS
@ -372,7 +353,7 @@ PPIDE_CAP:
PPIDE_GEOM:
; FOR LBA, WE SIMULATE CHS ACCESS USING 16 HEADS AND 16 SECTORS
; RETURN HS:CC -> DE:HL, SET HIGH BIT OF D TO INDICATE LBA CAPABLE
CALL PPIDE_CAP ; GET TOTAL BLOCKS IN DE:HL, BLOCK SIZE TO BC
CALL PPIDE_CAP ; GET TOTAL BLOCKS IN DE:HL, BLOCK SIZE TO BC
LD L,H ; DIVPPIDE BY 256 FOR # TRACKS
LD H,E ; ... HIGH BYTE DISCARDED, RESULT IN HL
LD D,16 | $80 ; HEADS / CYL = 16, SET LBA CAPABILITY BIT
@ -384,59 +365,6 @@ PPIDE_GEOM:
; FUNCTION SUPPORT ROUTINES
;=============================================================================
;
; (RE)INITIALIZE DEVICE
;
PPIDE_INITDEV:
;
PPIDE_DPTR(PPIDE_TYPE) ; POINT HL TO UNIT TYPE FIELD, A IS TRASHED
LD A,(HL) ; GET THE DEVICE TYPE
OR A ; SET FLAGS
JP Z,PPIDE_NOMEDIA ; EXIT SETTING NO MEDIA STATUS
;
; CLEAR OUT UNIT SPECIFIC DATA, BUT PRESERVE THE EXISTING
; VALUE OF THE UNIT TYPE WHICH WAS ESTABLISHED BY THE DEVICE
; PROBES WHEN THE PPIDE BUS WAS RESET
PUSH AF ; SAVE UNIT TYPE VALUE FROM ABOVE
PUSH HL ; SAVE UNIT TYPE FIELD POINTER
PPIDE_DPTR(0) ; SET HL TO START OF UNIT DATA
LD BC,PPIDE_UDLEN
XOR A
CALL FILL
POP HL ; RECOVER UNIT TYPE FIELD POINTER
POP AF ; RECOVER UNIT TYPE VALUE
LD (HL),A ; AND PUT IT BACK
;
#IF (PPIDE8BIT)
LD A,PPIDE_FEAT_ENABLE8BIT ; FEATURE VALUE = ENABLE 8-BIT PIO
#ELSE
LD A,PPIDE_FEAT_DISABLE8BIT ; FEATURE VALUE = DISABLE 8-BIT PIO
#ENDIF
CALL PPIDE_SETFEAT ; SET FEATURE
RET NZ ; BAIL OUT ON ERROR
;
CALL PPIDE_IDENTIFY ; EXECUTE PPIDENTIFY COMMAND
RET NZ ; BAIL OUT ON ERROR
;
LD DE,(DIOBUF) ; POINT TO BUFFER
DCALL DUMP_BUFFER ; DUMP IT IF DEBUGGING
;
; GET DEVICE CAPACITY AND SAVE IT
PPIDE_DPTR(PPIDE_CAPACITY) ; POINT HL TO UNIT CAPACITY FIELD
PUSH HL ; SAVE POINTER
LD HL,(DIOBUF) ; POINT TO BUFFER START
LD A,120 ; OFFSET OF SECTOR COUNT
CALL ADDHLA ; POINT TO ADDRESS OF SECTOR COUNT
CALL LD32 ; LOAD IT TO DE:HL
POP BC ; RECOVER POINTER TO CAPACITY ENTRY
CALL ST32 ; SAVE CAPACITY
;
; RESET CARD STATUS TO 0 (OK)
PPIDE_DPTR(PPIDE_STAT) ; HL := ADR OF STATUS, AF TRASHED
XOR A ; A := 0 (STATUS = OK)
LD (HL),A ; SAVE IT
;
RET ; RETURN, A=0, Z SET
;
;
;
PPIDE_SETFEAT:
@ -452,7 +380,7 @@ PPIDE_SETFEAT:
DCALL PC_SPACE
DCALL PRTHEXBYTE
POP AF
;OUT (PPIDE_REG_FEAT),A ; SET THE FEATURE VALUE
;OUT (PPIDE_REG_FEAT),A ; SET THE FEATURE VALUE
CALL PPIDE_OUT
.DB PPIDE_REG_FEAT
DCALL PC_SPACE
@ -478,6 +406,7 @@ PPIDE_IDENTIFY:
LD (PPIDE_CMD),A
CALL PPIDE_RUNCMD
RET NZ
LD HL,HB_TMPBUF
JP PPIDE_GETBUF ; EXIT THRU BUFRD
;
;
@ -496,26 +425,12 @@ PPIDE_RDSEC:
.DB PPIDE_REG_DRVHD
DCALL PC_SPACE
DCALL PRTHEXBYTE
;LD HL,HSTLBA
;CALL LD32
;CALL PRTHEX32
CALL PPIDE_SETADDR ; SETUP CYL, TRK, HEAD
LD A,PPIDE_CMD_READ
LD (PPIDE_CMD),A
CALL PPIDE_RUNCMD
RET NZ
;CALL NEWLINE
;CALL PPIDE_REGDUMP
;CALL PPIDE_GETBUF
;LD DE,(DIOBUF) ; POINT TO BUFFER
;CALL DUMP_BUFFER ; DUMP IT IF DEBUGGING
;CALL NEWLINE
;CALL PPIDE_REGDUMP
;CALL PANIC
LD HL,(DIOBUF)
JP PPIDE_GETBUF
;
;
@ -537,6 +452,7 @@ PPIDE_WRSEC:
LD (PPIDE_CMD),A
CALL PPIDE_RUNCMD
RET NZ
LD HL,(DIOBUF)
JP PPIDE_PUTBUF
;
;
@ -583,7 +499,7 @@ PPIDE_RUNCMD:
LD A,(PPIDE_CMD) ; GET THE COMMAND
DCALL PC_SPACE
DCALL PRTHEXBYTE
;OUT (PPIDE_REG_CMD),A ; SEND IT (STARTS EXECUTION)
;OUT (PPIDE_REG_CMD),A ; SEND IT (STARTS EXECUTION)
CALL PPIDE_OUT
.DB PPIDE_REG_CMD
#IF (PPIDETRACE >= 3)
@ -620,7 +536,7 @@ PPIDE_GETBUF:
LD D,A ; D := READ ASSERTED
;
; LOOP SETUP
LD HL,(DIOBUF) ; LOCATION OF BUFFER
;LD HL,(DIOBUF) ; LOCATION OF BUFFER
LD B,0 ; 256 ITERATIONS
LD C,PPIDE_IO_DATALO ; SETUP C WITH IO PORT (LSB)
;
@ -635,6 +551,8 @@ PPIDE_GETBUF:
;XOR A ; ZERO A
;OUT (PPIDE_IO_CTL),A ; RELEASE ALL BUS SIGNALS
;
CALL PPIDE_WAITRDY ; PROBLEMS IF THIS IS REMOVED!
RET NZ
CALL PPIDE_GETRES
JP NZ,PPIDE_IOERR
RET
@ -664,7 +582,6 @@ PPIDE_PUTBUF:
; WAIT FOR BUFFER
CALL PPIDE_WAITDRQ ; WAIT FOR BUFFER READY
RET NZ ; BAIL OUT IF TIMEOUT
;
; SETUP PPI TO WRITE
LD A,PPIDE_DIR_WRITE ; SET DATA BUS DIRECTION TO WRITE
@ -678,7 +595,7 @@ PPIDE_PUTBUF:
LD D,A ; D := WRITE ASSERTED
;
; LOOP SETUP
LD HL,(DIOBUF) ; LOCATION OF BUFFER
;LD HL,(DIOBUF) ; LOCATION OF BUFFER
LD B,0 ; 256 ITERATIONS
LD C,PPIDE_IO_DATALO ; SETUP C WITH IO PORT (LSB)
;
@ -693,6 +610,8 @@ PPIDE_PUTBUF:
;XOR A ; ZERO A
;OUT (PPIDE_IO_CTL),A ; RELEASE ALL BUS SIGNALS
;
CALL PPIDE_WAITRDY ; PROBLEMS IF THIS IS REMOVED!
RET NZ
CALL PPIDE_GETRES
JP NZ,PPIDE_IOERR
RET
@ -715,7 +634,7 @@ PPIDE_PUTBUF1: ; START OF READ LOOP
;
;
PPIDE_GETRES:
;IN A,(PPIDE_REG_STAT) ; READ STATUS
;IN A,(PPIDE_REG_STAT) ; READ STATUS
CALL PPIDE_IN
.DB PPIDE_REG_STAT
DCALL PC_SPACE
@ -723,7 +642,7 @@ PPIDE_GETRES:
AND %00000001 ; ERROR BIT SET?
RET Z ; NOPE, RETURN WITH ZF
;
;IN A,(PPIDE_REG_ERR) ; READ ERROR REGISTER
;IN A,(PPIDE_REG_ERR) ; READ ERROR REGISTER
CALL PPIDE_IN
.DB PPIDE_REG_ERR
DCALL PC_SPACE
@ -738,10 +657,11 @@ PPIDE_GETRES:
; SOFT RESET OF ALL DEVICES ON BUS
;
PPIDE_RESET:
;
; SETUP PPI TO READ
LD A,PPIDE_DIR_READ ; SET DATA BUS DIRECTION TO READ
OUT (PPIDE_IO_PPI),A ; DO IT
;
LD A,PPIDE_CTL_RESET
OUT (PPIDE_IO_CTL),A
LD DE,16
@ -752,32 +672,46 @@ PPIDE_RESET:
LD DE,16
;LD DE,1024
CALL VDELAY
;
LD A,%00001010 ; SET ~IEN, NO INTERRUPTS
;OUT (PPIDE_REG_CTRL),A
CALL PPIDE_OUT
.DB PPIDE_REG_CTRL
;
;CALL LDELAY
LD DE,$2000 ; DELAY N * 16US (~128MS)
CALL VDELAY
;
; CLEAR OUT ALL DATA (FOR ALL UNITS)
LD HL,PPIDE_UDATA
LD BC,PPIDE_UDLEN
XOR A
RET
CALL FILL
;
; PROBE / INITIALIZE ALL UNITS
LD B,PPIDE_UNITCNT ; NUMBER OF UNITS TO TRY
LD C,0 ; UNIT INDEX FOR LOOP
PPIDE_RESET1:
LD A,C ; UNIT NUMBER TO A
PUSH BC
CALL PPIDE_INITUNIT ; PROBE/INIT UNIT
POP BC
INC C ; NEXT UNIT
DJNZ PPIDE_RESET1 ; LOOP AS NEEDED
;
XOR A ; SIGNAL SUCCESS
RET ; AND DONE
;
;LD A,%00001110 ; NO INTERRUPTS, ASSERT RESET BOTH DRIVES
;;OUT (PPIDE_REG_CTRL),A
;CALL PPIDE_OUT
;.DB PPIDE_REG_CTRL
;LD DE,16 ; DELAY ~250US
;CALL VDELAY
;;LD DE,1024
;;CALL VDELAY
;LD A,%00001010 ; NO INTERRUPTS, DEASSERT RESET
;;OUT (PPIDE_REG_CTRL),A
;CALL PPIDE_OUT
;.DB PPIDE_REG_CTRL
;CALL DELAY ; SMALL DELAY
;;LD DE,1024
;;CALL VDELAY
;XOR A ; SIGNAL SUCCESS
;RET ; RETURN
;
;
PPIDE_INITUNIT:
CALL PPIDE_SELUNIT ; SELECT UNIT
RET NZ ; ABORT IF ERROR
CALL PPIDE_PROBE ; DO PROBE
RET NZ ; ABORT IF ERROR
JP PPIDE_INITDEV ; INIT DEVICE AND RETURN
;
; TAKE ANY ACTIONS REQUIRED TO SELECT DESIRED PHYSICAL UNIT
; UNIT IS SPECIFIED IN A
@ -788,7 +722,7 @@ PPIDE_SELUNIT:
;RET Z ; IF SO, NOTHING MORE TO DO
CP PPIDE_UNITCNT ; CHECK VALIDITY (EXCEED UNIT COUNT?)
JP NC,PPIDE_INVUNIT ; HANDLE INVALID UNIT
JP NC,PPIDE_INVUNIT ; HANDLE INVALID UNIT
;
; NEW UNIT SELECTED, IMPLEMENT IT
LD (PPIDE_UNIT),A ; RECORD NEW UNIT NUMBER
@ -811,33 +745,26 @@ PPIDE_SELUNIT:
;
;
PPIDE_PROBE:
CALL PPIDE_SELUNIT ; SELECT UNIT
RET NZ ; ABORT ON ERROR
;
;CALL LDELAY
LD DE,$2000 ; DELAY N * 16US (~128MS)
CALL VDELAY
;
;; WAIT FOR READY...
;CALL PPIDE_WAITBSY ; WAIT FOR BUSY TO CLEAR
;RET NZ ; ABORT ON TIMEOUT
#IF (PPIDETRACE >= 3)
CALL PPIDE_PRTPREFIX
PRTS(" PROBE$") ; LABEL FOR IO ADDRESS
#ENDIF
;
; CHECK STATUS
; IN A,(PPIDE_REG_STAT) ; GET STATUS
CALL PPIDE_IN
.DB PPIDE_REG_STAT
DCALL PC_SPACE
DCALL PRTHEXBYTE ; IF DEBUG, PRINT STATUS
OR A ; SET FLAGS TO TEST FOR ZERO
JR NZ,PPIDE_PROBE0 ; CONTINUE IF NON-ZERO
DEC A ; ZERO MEANS NO MEDIA, SIGNAL ERROR
RET ; AND DONE
JP Z,PPIDE_NOMEDIA ; CONTINUE IF NON-ZERO
;
PPIDE_PROBE0:
;CALL PPIDE_WAITBSY ; WAIT FOR BUSY TO CLEAR
;RET NZ ; ABORT ON TIMEOUT
;
;; CHECK STATUS
;IN A,(PPIDE_REG_STAT) ; GET STATUS
;IN A,(PPIDE_REG_STAT) ; GET STATUS
;DCALL PRTHEXBYTE ; IF DEBUG, PRINT STATUS
;OR A ; SET FLAGS TO TEST FOR ZERO
;JR NZ,PPIDE_PROBE1 ; CONTINUE IF NON-ZERO
@ -852,28 +779,28 @@ PPIDE_PROBE1:
.DB PPIDE_REG_COUNT
DCALL PRTHEXBYTE
CP $01
RET NZ
JP NZ,PPIDE_NOMEDIA
DCALL PC_SPACE
;IN A,(PPIDE_REG_SECT)
CALL PPIDE_IN
.DB PPIDE_REG_SECT
DCALL PRTHEXBYTE
CP $01
RET NZ
JP NZ,PPIDE_NOMEDIA
DCALL PC_SPACE
;IN A,(PPIDE_REG_CYLLO)
CALL PPIDE_IN
.DB PPIDE_REG_CYLLO
DCALL PRTHEXBYTE
CP $00
RET NZ
JP NZ,PPIDE_NOMEDIA
DCALL PC_SPACE
;IN A,(PPIDE_REG_CYLHI)
CALL PPIDE_IN
.DB PPIDE_REG_CYLHI
DCALL PRTHEXBYTE
CP $00
RET NZ
JP NZ,PPIDE_NOMEDIA
;
; SIGNATURE MATCHES ATA DEVICE, RECORD TYPE AND RETURN SUCCESS
PPIDE_DPTR(PPIDE_TYPE) ; POINT HL TO UNIT TYPE FIELD, A IS TRASHED
@ -881,6 +808,59 @@ PPIDE_PROBE1:
XOR A ; SIGNAL SUCCESS
RET ; DONE, NOTE THAT A=0 AND Z IS SET
;
; (RE)INITIALIZE DEVICE
;
PPIDE_INITDEV:
;
PPIDE_DPTR(PPIDE_TYPE) ; POINT HL TO UNIT TYPE FIELD, A IS TRASHED
LD A,(HL) ; GET THE DEVICE TYPE
OR A ; SET FLAGS
JP Z,PPIDE_NOMEDIA ; EXIT SETTING NO MEDIA STATUS
;
; CLEAR OUT UNIT SPECIFIC DATA, BUT PRESERVE THE EXISTING
; VALUE OF THE UNIT TYPE WHICH WAS ESTABLISHED BY THE DEVICE
; PROBES WHEN THE PPIDE BUS WAS RESET
PUSH AF ; SAVE UNIT TYPE VALUE FROM ABOVE
PUSH HL ; SAVE UNIT TYPE FIELD POINTER
PPIDE_DPTR(0) ; SET HL TO START OF UNIT DATA
LD BC,PPIDE_UDLEN
XOR A
CALL FILL
POP HL ; RECOVER UNIT TYPE FIELD POINTER
POP AF ; RECOVER UNIT TYPE VALUE
LD (HL),A ; AND PUT IT BACK
;
#IF (PPIDE8BIT)
LD A,PPIDE_FEAT_ENABLE8BIT ; FEATURE VALUE = ENABLE 8-BIT PIO
#ELSE
LD A,PPIDE_FEAT_DISABLE8BIT ; FEATURE VALUE = DISABLE 8-BIT PIO
#ENDIF
CALL PPIDE_SETFEAT ; SET FEATURE
RET NZ ; BAIL OUT ON ERROR
;
CALL PPIDE_IDENTIFY ; EXECUTE PPIDENTIFY COMMAND
RET NZ ; BAIL OUT ON ERROR
;
LD DE,HB_TMPBUF ; POINT TO BUFFER
DCALL DUMP_BUFFER ; DUMP IT IF DEBUGGING
;
; GET DEVICE CAPACITY AND SAVE IT
PPIDE_DPTR(PPIDE_CAPACITY) ; POINT HL TO UNIT CAPACITY FIELD
PUSH HL ; SAVE POINTER
LD HL,HB_TMPBUF ; POINT TO BUFFER START
LD A,120 ; OFFSET OF SECTOR COUNT
CALL ADDHLA ; POINT TO ADDRESS OF SECTOR COUNT
CALL LD32 ; LOAD IT TO DE:HL
POP BC ; RECOVER POINTER TO CAPACITY ENTRY
CALL ST32 ; SAVE CAPACITY
;
; RESET CARD STATUS TO 0 (OK)
PPIDE_DPTR(PPIDE_STAT) ; HL := ADR OF STATUS, AF TRASHED
XOR A ; A := 0 (STATUS = OK)
LD (HL),A ; SAVE IT
;
RET ; RETURN, A=0, Z SET
;
;
;
PPIDE_CHKDEVICE:
@ -900,7 +880,7 @@ PPIDE_WAITRDY:
PPIDE_WAITRDY1:
LD DE,-1 ; ~1 SECOND INNER LOOP
PPIDE_WAITRDY2:
;IN A,(PPIDE_REG_STAT) ; READ STATUS
;IN A,(PPIDE_REG_STAT) ; READ STATUS
CALL PPIDE_IN
.DB PPIDE_REG_STAT
LD C,A ; SAVE IT
@ -911,7 +891,7 @@ PPIDE_WAITRDY2:
DEC DE
LD A,D
OR E
JR NZ,PPIDE_WAITRDY2 ; INNER LOOP RETURN
JR NZ,PPIDE_WAITRDY2 ; INNER LOOP RETURN
DJNZ PPIDE_WAITRDY1 ; OUTER LOOP RETURN
JP PPIDE_RDYTO ; EXIT WITH RDYTO ERR
;
@ -922,7 +902,7 @@ PPIDE_WAITDRQ:
PPIDE_WAITDRQ1:
LD DE,-1 ; ~1 SECOND INNER LOOP
PPIDE_WAITDRQ2:
;IN A,(PPIDE_REG_STAT) ; READ STATUS
;IN A,(PPIDE_REG_STAT) ; READ STATUS
CALL PPIDE_IN
.DB PPIDE_REG_STAT
LD C,A ; SAVE IT
@ -944,7 +924,7 @@ PPIDE_WAITBSY:
PPIDE_WAITBSY1:
LD DE,-1 ; ~1 SECOND INNER LOOP
PPIDE_WAITBSY2:
;IN A,(PPIDE_REG_STAT) ; READ STATUS
;IN A,(PPIDE_REG_STAT) ; READ STATUS
CALL PPIDE_IN
.DB PPIDE_REG_STAT
LD C,A ; SAVE IT
@ -1023,6 +1003,7 @@ PPIDE_IOERR:
JR PPIDE_ERR
;
PPIDE_RDYTO:
CALL PC_COLON
LD A,PPIDE_STRDYTO
JR PPIDE_ERR
;
@ -1060,7 +1041,7 @@ PPIDE_PRTSTAT:
JR Z,PPIDE_PRTSTAT1
INC A
LD DE,PPIDE_STR_STINVUNIT
JR Z,PPIDE_PRTSTAT2 ; INVALID UNIT IS SPECIAL CASE
JR Z,PPIDE_PRTSTAT2 ; INVALID UNIT IS SPECIAL CASE
INC A
LD DE,PPIDE_STR_STNOMEDIA
JR Z,PPIDE_PRTSTAT1
@ -1164,10 +1145,10 @@ PPIDE_STR_STOK .TEXT "OK$"
PPIDE_STR_STINVUNIT .TEXT "INVALID UNIT$"
PPIDE_STR_STNOMEDIA .TEXT "NO MEDIA$"
PPIDE_STR_STCMDERR .TEXT "COMMAND ERROR$"
PPIDE_STR_STIOERR .TEXT "IO ERROR$"
PPIDE_STR_STRDYTO .TEXT "READY TIMEOUT$"
PPIDE_STR_STDRQTO .TEXT "DRQ TIMEOUT$"
PPIDE_STR_STBSYTO .TEXT "BUSY TIMEOUT$"
PPIDE_STR_STIOERR .TEXT "IO ERROR$"
PPIDE_STR_STRDYTO .TEXT "READY TIMEOUT$"
PPIDE_STR_STDRQTO .TEXT "DRQ TIMEOUT$"
PPIDE_STR_STBSYTO .TEXT "BUSY TIMEOUT$"
PPIDE_STR_STUNK .TEXT "UNKNOWN ERROR$"
;
PPIDE_STR_NO .TEXT "NO$"
@ -1176,14 +1157,14 @@ PPIDE_STR_NO .TEXT "NO$"
; DATA STORAGE
;=============================================================================
;
PPIDE_CMD .DB 0 ; PENDING COMMAND TO PROCESS
PPIDE_CMD .DB 0 ; PENDING COMMAND TO PROCESS
PPIDE_DRVHD .DB 0 ; CURRENT DRIVE/HEAD MASK
;
PPIDE_UNIT .DB 0 ; ACTIVE UNIT, DEFAULT TO ZERO
;
; UNIT SPECIFIC DATA STORAGE
;
PPIDE_UDATA .FILL PPIDE_UNITCNT*8,0 ; PER UNIT DATA, 8 BYTES
PPIDE_UDATA .FILL PPIDE_UNITCNT*8,0 ; PER UNIT DATA, 8 BYTES
PPIDE_DLEN .EQU $ - PPIDE_UDATA ; LENGTH OF ENTIRE DATA STORAGE FOR ALL UNITS
PPIDE_UDLEN .EQU PPIDE_DLEN / PPIDE_UNITCNT ; LENGTH OF PER UNIT DATA
;

Loading…
Cancel
Save