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