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