|
|
|
@ -9,7 +9,7 @@ |
|
|
|
; INTENDED TO CO-EXIST WITH LPT DRIVER. |
|
|
|
; |
|
|
|
; CREATED BY WAYNE WARTHEN FOR ROMWBW HBIOS. |
|
|
|
; MUCH OF THE CODE IS DERIVED FROM FUZIX (ALAN COX). |
|
|
|
; MUCH OF THE CODE IS DERIVED FROM LINUX AND FUZIX (ALAN COX). |
|
|
|
; |
|
|
|
; 5/23/2023 WBW - INITIAL RELEASE |
|
|
|
; 5/26/3023 WBW - CLEAN UP, LED ACTIVITY |
|
|
|
@ -71,8 +71,6 @@ |
|
|
|
; |
|
|
|
; TODO: |
|
|
|
; |
|
|
|
; - CURRENTLY HAS ONLY DETECTION LOGIC. NEED TO WRITE THE REST!!! |
|
|
|
; |
|
|
|
; - OPTIMIZE READ/WRITE LOOPS |
|
|
|
; |
|
|
|
; NOTES: |
|
|
|
@ -137,6 +135,9 @@ PPA_LBA .EQU 8 ; OFFSET OF LBA (DWORD) |
|
|
|
#DEFINE PPA_WCTL(VAL) LD A,VAL \ CALL PPA_WRITECTRL |
|
|
|
#DEFINE PPA_WDATA(VAL) LD A,VAL \ CALL PPA_WRITEDATA |
|
|
|
; |
|
|
|
#DEFINE PPA_DPUL(VAL) LD A,VAL \ CALL PPA_DPULSE |
|
|
|
#DEFINE PPA_CPUL(VAL) LD A,VAL \ CALL PPA_CPULSE |
|
|
|
; |
|
|
|
;============================================================================= |
|
|
|
; INITIALIZATION ENTRY POINT |
|
|
|
;============================================================================= |
|
|
|
@ -192,7 +193,7 @@ PPA_INIT4: |
|
|
|
CALL DIO_ADDENT ; ADD ENTRY TO GLOBAL DISK DEV TABLE |
|
|
|
; |
|
|
|
CALL PPA_RESET ; RESET/INIT THE INTERFACE |
|
|
|
#IF (PPATRACE == 0) |
|
|
|
#IF (PPATRACE <= 1) |
|
|
|
CALL PPA_PRTSTAT |
|
|
|
#ENDIF |
|
|
|
JR NZ,PPA_INIT6 |
|
|
|
@ -227,6 +228,9 @@ PPA_INIT6: |
|
|
|
; ON RETURN, ZF SET INDICATES HARDWARE FOUND |
|
|
|
; |
|
|
|
PPA_DETECT: |
|
|
|
#IF (PPATRACE >= 3) |
|
|
|
PRTS("\r\nDETECT:$") |
|
|
|
#ENDIF |
|
|
|
; INITIALIZE 8255 |
|
|
|
LD A,(IY+PPA_IOBASE) ; BASE PORT |
|
|
|
ADD A,PPA_IOSETUP ; BUMP TO SETUP PORT |
|
|
|
@ -235,34 +239,37 @@ PPA_DETECT: |
|
|
|
OUT (C),A ; DO IT |
|
|
|
CALL DELAY ; BRIEF DELAY FOR GOOD MEASURE |
|
|
|
; |
|
|
|
LD A,$AA \ CALL PPA_WRITEDATA |
|
|
|
PPA_WDATA($AA) |
|
|
|
CALL PPA_DISCONNECT |
|
|
|
CALL PPA_CONNECT |
|
|
|
LD A,$06 \ CALL PPA_WRITECTRL |
|
|
|
PPA_WCTL($0E) |
|
|
|
CALL PPA_READSTATUS |
|
|
|
; |
|
|
|
#IF (PPATRACE >= 3) |
|
|
|
CALL PC_SPACE |
|
|
|
CALL PRTHEXBYTE |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
AND $F0 |
|
|
|
CP $F0 |
|
|
|
AND $08 |
|
|
|
CP $08 |
|
|
|
JR NZ,PPA_DETECT_FAIL |
|
|
|
LD A,$04 \ CALL PPA_WRITECTRL |
|
|
|
; |
|
|
|
PPA_WCTL($0C) |
|
|
|
CALL PPA_READSTATUS |
|
|
|
; |
|
|
|
#IF (PPATRACE >= 3) |
|
|
|
CALL PC_SPACE |
|
|
|
CALL PRTHEXBYTE |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
AND $F0 |
|
|
|
CP $80 |
|
|
|
AND $08 |
|
|
|
CP $00 |
|
|
|
JR NZ,PPA_DETECT_FAIL |
|
|
|
LD A,$AA \ CALL PPA_WRITEDATA |
|
|
|
LD A,$0C \ CALL PPA_WRITECTRL |
|
|
|
CALL PPA_CONNECT |
|
|
|
LD A,$40 \ CALL PPA_WRITEDATA |
|
|
|
LD A,$08 \ CALL PPA_WRITECTRL |
|
|
|
LD A,$0C \ CALL PPA_WRITECTRL |
|
|
|
; |
|
|
|
CALL PPA_DISCONNECT |
|
|
|
; |
|
|
|
PPA_WDATA($AA) |
|
|
|
PPA_WCTL($0C) |
|
|
|
; |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET ; AND RETURN |
|
|
|
@ -270,7 +277,6 @@ PPA_DETECT: |
|
|
|
PPA_DETECT_FAIL: |
|
|
|
OR $FF ; SIGNAL FAILURE |
|
|
|
RET NZ |
|
|
|
|
|
|
|
; |
|
|
|
;============================================================================= |
|
|
|
; DRIVER FUNCTION TABLE |
|
|
|
@ -447,32 +453,6 @@ PPA_GEOM: |
|
|
|
; FUNCTION SUPPORT ROUTINES |
|
|
|
;============================================================================= |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
PPA_DELAY: |
|
|
|
PUSH AF |
|
|
|
CALL DELAY |
|
|
|
CALL DELAY |
|
|
|
CALL DELAY |
|
|
|
CALL DELAY |
|
|
|
POP AF |
|
|
|
RET |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
PPA_WAITDONE: |
|
|
|
LD HL,0 ; TIMEOUT COUNTER |
|
|
|
PPA_WAITDONE1: |
|
|
|
CALL PPA_READSTATUS |
|
|
|
AND $F0 |
|
|
|
BIT 7,A |
|
|
|
RET NZ |
|
|
|
DEC HL |
|
|
|
LD A,H |
|
|
|
OR L |
|
|
|
;JP Z,PPA_CMD_TIMEOUT ; TIMEOUT |
|
|
|
JR PPA_WAITDONE1 |
|
|
|
; |
|
|
|
; OUTPUT BYTE IN A TO THE DATA PORT |
|
|
|
; |
|
|
|
PPA_WRITEDATA: |
|
|
|
@ -548,64 +528,92 @@ PPA_READSTATUS5: |
|
|
|
; |
|
|
|
PPA_DPULSE: |
|
|
|
CALL PPA_WRITEDATA |
|
|
|
LD A,$0C \ CALL PPA_WRITECTRL |
|
|
|
LD A,$0E \ CALL PPA_WRITECTRL |
|
|
|
LD A,$0C \ CALL PPA_WRITECTRL |
|
|
|
LD A,$04 \ CALL PPA_WRITECTRL |
|
|
|
LD A,$0C \ CALL PPA_WRITECTRL |
|
|
|
PPA_WCTL($0C) |
|
|
|
PPA_WCTL($0E) |
|
|
|
PPA_WCTL($0C) |
|
|
|
PPA_WCTL($04) |
|
|
|
PPA_WCTL($0C) |
|
|
|
RET |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
PPA_CPULSE: |
|
|
|
CALL PPA_WRITEDATA |
|
|
|
LD A,$04 \ CALL PPA_WRITECTRL |
|
|
|
LD A,$06 \ CALL PPA_WRITECTRL |
|
|
|
LD A,$04 \ CALL PPA_WRITECTRL |
|
|
|
LD A,$0C \ CALL PPA_WRITECTRL |
|
|
|
PPA_WCTL($04) |
|
|
|
PPA_WCTL($06) |
|
|
|
PPA_WCTL($04) |
|
|
|
PPA_WCTL($0C) |
|
|
|
RET |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
PPA_CONNECT: |
|
|
|
LD A,$00 \ CALL PPA_CPULSE |
|
|
|
LD A,$3C \ CALL PPA_CPULSE |
|
|
|
LD A,$20 \ CALL PPA_CPULSE |
|
|
|
LD A,$8F \ CALL PPA_CPULSE |
|
|
|
PPA_CPUL($00) |
|
|
|
PPA_CPUL($3C) |
|
|
|
PPA_CPUL($20) |
|
|
|
PPA_CPUL($8F) |
|
|
|
RET |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
PPA_DISCONNECT: |
|
|
|
LD A,$00 \ CALL PPA_DPULSE |
|
|
|
LD A,$3C \ CALL PPA_DPULSE |
|
|
|
LD A,$20 \ CALL PPA_DPULSE |
|
|
|
LD A,$0F \ CALL PPA_DPULSE |
|
|
|
PPA_DPUL($00) |
|
|
|
PPA_DPUL($3C) |
|
|
|
PPA_DPUL($20) |
|
|
|
PPA_DPUL($0F) |
|
|
|
; |
|
|
|
; TURNS OFF MG014 LED |
|
|
|
PPA_WCTL($8C) |
|
|
|
; |
|
|
|
RET |
|
|
|
; |
|
|
|
; SCSI SELECT PROCESS |
|
|
|
; INITIATE A SCSI BUS RESET. |
|
|
|
; |
|
|
|
PPA_RESETPULSE: |
|
|
|
PPA_WDATA($40) |
|
|
|
PPA_WCTL($08) |
|
|
|
CALL DELAY ; 32 US, IDEALLY 30 US |
|
|
|
PPA_WCTL($0C) |
|
|
|
RET |
|
|
|
; |
|
|
|
; SCSI SELECT PROCESS |
|
|
|
; |
|
|
|
PPA_SELECT: |
|
|
|
#IF (PPATRACE >= 3) |
|
|
|
PRTS("\r\nSELECT: $") |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF (PPATRACE >= 3) |
|
|
|
CALL PPA_READSTATUS |
|
|
|
CALL PC_SPACE |
|
|
|
CALL PRTHEXBYTE |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
LD A,1 << PPA_TGT |
|
|
|
CALL PPA_WRITEDATA |
|
|
|
LD A,$0E \ CALL PPA_WRITECTRL |
|
|
|
LD A,$0C \ CALL PPA_WRITECTRL |
|
|
|
PPA_WCTL($0E) |
|
|
|
PPA_WCTL($0C) |
|
|
|
LD A,1 << PPA_SELF |
|
|
|
CALL PPA_WRITEDATA |
|
|
|
LD A,$08 \ CALL PPA_WRITECTRL |
|
|
|
PPA_WCTL($08) |
|
|
|
; |
|
|
|
LD HL,0 ; TIMEOUT COUNTER |
|
|
|
LD HL,500 ; TIMEOUT COUNTER |
|
|
|
; |
|
|
|
PPA_SELECT1: |
|
|
|
#IF (PPATRACE >= 3) |
|
|
|
CALL PPA_READSTATUS |
|
|
|
OR $F0 |
|
|
|
RET NZ |
|
|
|
CALL PC_SPACE |
|
|
|
CALL PRTHEXBYTE |
|
|
|
#ENDIF |
|
|
|
AND $40 |
|
|
|
CP $40 |
|
|
|
RET Z |
|
|
|
DEC HL |
|
|
|
LD A,H |
|
|
|
OR L |
|
|
|
RET Z ; TIMEOUT |
|
|
|
JR PPA_SELECT1 |
|
|
|
JR NZ,PPA_SELECT1 |
|
|
|
JP PPA_CMD_TIMEOUT |
|
|
|
; |
|
|
|
; SEND SCSI CMD BYTE STRING. AT ENTRY, HL POINTS TO START OF |
|
|
|
; COMMAND BYTES. THE LENGTH OF THE COMMAND STRING MUST PRECEED |
|
|
|
@ -615,7 +623,313 @@ PPA_SELECT1: |
|
|
|
; DATA OUTPOUT IS BURSTED (NO CHECK FOR BUSY). SEEMS TO WORK FINE. |
|
|
|
; |
|
|
|
PPA_SENDCMD: |
|
|
|
JP PPA_ERR ; NOW DO STANDARD ERR PROCESSING |
|
|
|
; |
|
|
|
#IF (PPATRACE >= 3) |
|
|
|
PRTS("\r\nSENDCMD:$") |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
DEC HL ; BACKUP TO LENGTH BYTE |
|
|
|
LD B,(HL) ; PUT IN B FOR LOOP COUNTER |
|
|
|
; |
|
|
|
#IF (PPATRACE >= 3) |
|
|
|
LD A,B |
|
|
|
CALL PC_SPACE |
|
|
|
CALL PRTHEXBYTE |
|
|
|
PRTS(" BYTES$") |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
INC HL ; BACK TO FIRST CMD BYTE |
|
|
|
; |
|
|
|
PPA_SENDCMD1: |
|
|
|
;PPA_WCTL($0C) |
|
|
|
LD A,(HL) ; LOAD CMD BYTE |
|
|
|
; |
|
|
|
#IF (PPATRACE >= 3) |
|
|
|
CALL PC_SPACE |
|
|
|
CALL PRTHEXBYTE |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
CALL PPA_WRITEDATA ; PUT IT ON THE BUS |
|
|
|
INC HL ; BUMP TO NEXT BYTE |
|
|
|
PPA_WCTL($0E) |
|
|
|
PPA_WCTL($0C) |
|
|
|
DJNZ PPA_SENDCMD1 ; LOOP TILL DONE |
|
|
|
; |
|
|
|
RET |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
; WAIT FOR SCSI BUS TO BECOME READY WITH A TIMEOUT. |
|
|
|
; |
|
|
|
PPA_WAITLOOP: |
|
|
|
CALL PPA_READSTATUS |
|
|
|
BIT 7,A |
|
|
|
RET NZ ; DONE, STATUS IN A |
|
|
|
DEC HL |
|
|
|
LD A,H |
|
|
|
OR L |
|
|
|
RET Z ; TIMEOUT |
|
|
|
JR PPA_WAITLOOP |
|
|
|
; |
|
|
|
PPA_WAIT: |
|
|
|
LD HL,500 ; GOOD VALUE??? |
|
|
|
PPA_WCTL($0C) |
|
|
|
CALL PPA_WAITLOOP |
|
|
|
|
|
|
|
;CALL PC_SPACE |
|
|
|
;CALL PRTHEXBYTE |
|
|
|
|
|
|
|
JP Z,PPA_CMD_TIMEOUT ; HANDLE TIMEOUT |
|
|
|
;PUSH AF |
|
|
|
;PPA_WCTL($04) |
|
|
|
;POP AF |
|
|
|
AND $F0 |
|
|
|
RET ; RETURN W/ RESULT IN A |
|
|
|
; |
|
|
|
; MAX OBSERVED PPA_WAITLOOP ITERATIONS IS $0116B3 |
|
|
|
; |
|
|
|
PPA_LONGWAIT: |
|
|
|
LD B,3 ; VALUE??? |
|
|
|
PPA_WCTL($0C) |
|
|
|
PPA_LONGWAIT1: |
|
|
|
LD HL,0 |
|
|
|
CALL PPA_WAITLOOP |
|
|
|
JR NZ,PPA_LONGWAIT2 ; HANDLE SUCCESS |
|
|
|
DJNZ PPA_LONGWAIT1 ; LOOP TILL COUNTER EXHAUSTED |
|
|
|
|
|
|
|
;CALL PC_SPACE |
|
|
|
;CALL PRTHEXBYTE |
|
|
|
|
|
|
|
JP PPA_CMD_TIMEOUT ; HANDLE TIMEOUT |
|
|
|
; |
|
|
|
PPA_LONGWAIT2: |
|
|
|
;PUSH AF |
|
|
|
;PPA_WCTL($04) |
|
|
|
; |
|
|
|
#IF 0 |
|
|
|
PUSH AF |
|
|
|
CALL PC_GT |
|
|
|
LD A,B |
|
|
|
CALL PRTHEXBYTE |
|
|
|
CALL PC_COLON |
|
|
|
CALL PRTHEXWORDHL |
|
|
|
POP AF |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
;POP AF |
|
|
|
|
|
|
|
;CALL PC_SPACE |
|
|
|
;CALL PRTHEXBYTE |
|
|
|
|
|
|
|
AND $F0 |
|
|
|
RET ; RETURN W/ RESULT IN A |
|
|
|
; |
|
|
|
; GET A BYTE OF DATA FROM THE SCSI DEVICE. THIS IS A NIBBLE READ. |
|
|
|
; BYTE RETURNED IN A. |
|
|
|
; |
|
|
|
PPA_GETBYTE: |
|
|
|
CALL PPA_WAIT |
|
|
|
PPA_WCTL($04) |
|
|
|
CALL PPA_READSTATUS |
|
|
|
AND $F0 |
|
|
|
PUSH AF |
|
|
|
PPA_WCTL($06) |
|
|
|
CALL PPA_READSTATUS |
|
|
|
AND $F0 |
|
|
|
RRCA |
|
|
|
RRCA |
|
|
|
RRCA |
|
|
|
RRCA |
|
|
|
POP HL |
|
|
|
OR H |
|
|
|
PUSH AF |
|
|
|
PPA_WCTL($0C) |
|
|
|
POP AF |
|
|
|
RET |
|
|
|
; |
|
|
|
; GET A CHUNK OF DATA FROM SCSI BUS. THIS IS SPECIFICALLY FOR |
|
|
|
; READ PHASE. IF A LENGTH IS SPECIFIED (NON-ZERO HL), THEN THE |
|
|
|
; DATA IS BURST READ. IF NO LENGTH SPECIFIED, DATA IS READ AS |
|
|
|
; LONG AS SCSI DEVICE WANTS TO CONTINUE SENDING (NO OVERRUN |
|
|
|
; CHECK IN THIS CASE). |
|
|
|
; |
|
|
|
; THIS IS A NIBBLE READ. |
|
|
|
; |
|
|
|
; DE=BUFFER |
|
|
|
; HL=LENGTH (0 FOR VARIABLE) |
|
|
|
; |
|
|
|
PPA_GETDATA: |
|
|
|
; BRANCH TO CORRECT ROUTINE |
|
|
|
LD A,H |
|
|
|
OR L ; IF ZERO |
|
|
|
JR NZ,PPA_GETDATALEN ; DO BURST READ |
|
|
|
; |
|
|
|
#IF (PPATRACE >= 3) |
|
|
|
PRTS("\r\nGETDATA:$") |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
PPA_GETDATA1: |
|
|
|
PUSH HL ; SAVE BYTE COUNTER |
|
|
|
CALL PPA_WAIT ; WAIT FOR BUS READY |
|
|
|
POP HL ; RESTORE BYTE COUNTER |
|
|
|
CP $D0 ; CHECK FOR READ PHASE |
|
|
|
JR NZ,PPA_GETDATA2 ; IF NOT, ASSUME WE ARE DONE |
|
|
|
PPA_WCTL($04) |
|
|
|
CALL PPA_READSTATUS ; GET FIRST NIBBLE |
|
|
|
AND $F0 ; ISOLATE BITS |
|
|
|
PUSH AF ; SAVE WORKING VALUE |
|
|
|
PPA_WCTL($06) |
|
|
|
CALL PPA_READSTATUS ; GET SECOND NIBBLE |
|
|
|
AND $F0 ; ISOLATE BITS |
|
|
|
RRCA ; AND SHIFT TO LOW NIBBLE |
|
|
|
RRCA |
|
|
|
RRCA |
|
|
|
RRCA |
|
|
|
POP BC ; RECOVER LOW NIBBLE |
|
|
|
OR B ; COMBINE |
|
|
|
LD (DE),A ; AND SAVE THE FULL BYTE VALUE |
|
|
|
INC DE ; NEXT BUFFER POS |
|
|
|
INC HL ; INCREMENT BYTES COUNTER |
|
|
|
JR PPA_GETDATA1 ; LOOP TILL DONE |
|
|
|
; |
|
|
|
PPA_GETDATA2: |
|
|
|
; |
|
|
|
#IF (PPATRACE >= 3) |
|
|
|
CALL PC_SPACE |
|
|
|
CALL PRTHEXWORDHL |
|
|
|
PRTS(" BYTES$") |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
PPA_WCTL($0C) |
|
|
|
RET |
|
|
|
; |
|
|
|
PPA_GETDATALEN: |
|
|
|
; |
|
|
|
#IF (PPATRACE >= 3) |
|
|
|
PRTS("\r\nGETDLEN:$") |
|
|
|
CALL PC_SPACE |
|
|
|
CALL PRTHEXWORDHL |
|
|
|
PRTS(" BYTES$") |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
PPA_GETDATALEN1: |
|
|
|
PPA_WCTL($04) |
|
|
|
CALL PPA_READSTATUS ; GET FIRST NIBBLE |
|
|
|
AND $F0 ; ISOLATE BITS |
|
|
|
PUSH AF ; SAVE WORKING VALUE |
|
|
|
PPA_WCTL($06) |
|
|
|
CALL PPA_READSTATUS ; GET SECOND NIBBLE |
|
|
|
AND $F0 ; ISOLATE BITS |
|
|
|
RRCA ; MOVE TO LOW NIBBLE |
|
|
|
RRCA |
|
|
|
RRCA |
|
|
|
RRCA |
|
|
|
POP BC ; RECOVER FIRST NIBBLE |
|
|
|
OR B ; COMBINE |
|
|
|
LD (DE),A ; SAVE FINAL BYTE VALUE |
|
|
|
INC DE ; NEXT BUFFER POS |
|
|
|
DEC HL ; DEC LOOP COUNTER |
|
|
|
LD A,H ; CHECK LOOP COUNTER |
|
|
|
OR L |
|
|
|
JR NZ,PPA_GETDATALEN1 ; LOOP IF NOT DONE |
|
|
|
PPA_WCTL($0C) |
|
|
|
RET |
|
|
|
; |
|
|
|
; PUT A CHUNK OF DATA TO THE SCSI BUS. THIS IS SPECIFICALLY FOR |
|
|
|
; WRITE PHASE. IF A LENGTH IS SPECIFIED (NON-ZERO HL), THEN THE |
|
|
|
; DATA IS BURST WRITTEN. IF NO LENGTH SPECIFIED, DATA IS WRITTEN AS |
|
|
|
; LONG AS SCSI DEVICE WANTS TO CONTINUE RECEIVING (NO OVERRUN |
|
|
|
; CHECK IN THIS CASE). |
|
|
|
; |
|
|
|
; READS ARE DONE AS BYTE PAIRS. EACH LOOP READS 2 BYTES. |
|
|
|
; |
|
|
|
; DE=BUFFER |
|
|
|
; HL=LENGTH (0 FOR VARIABLE) |
|
|
|
; |
|
|
|
PPA_PUTDATA: |
|
|
|
LD A,H |
|
|
|
OR L |
|
|
|
JR NZ,PPA_PUTDATALEN |
|
|
|
; |
|
|
|
#IF (PPATRACE >= 3) |
|
|
|
PRTS("\r\nPUTDATA:$") |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
PPA_PUTDATA1: |
|
|
|
PUSH HL ; SAVE BYTE COUNTER |
|
|
|
CALL PPA_WAIT ; WAIT FOR BUS READY |
|
|
|
POP HL ; RESTORE BYTE COUNTER |
|
|
|
CP $C0 ; CHECK FOR WRITE PHASE |
|
|
|
JR NZ,PPA_PUTDATA2 ; IF NOT, ASSUME WE ARE DONE |
|
|
|
LD A,(DE) ; GET NEXT BYTE TO WRITE (FIRST OF PAIR) |
|
|
|
CALL PPA_WRITEDATA ; PUT ON BUS |
|
|
|
INC DE ; BUMP TO NEXT BUF POS |
|
|
|
INC HL ; INCREMENT COUNTER |
|
|
|
PPA_WCTL($0E) |
|
|
|
PPA_WCTL($0C) |
|
|
|
LD A,(DE) ; GET NEXT BYTE TO WRITE (SECOND OF PAIR) |
|
|
|
JR PPA_PUTDATA1 ; LOOP TILL DONE |
|
|
|
; |
|
|
|
PPA_PUTDATA2: |
|
|
|
; |
|
|
|
#IF (PPATRACE >= 3) |
|
|
|
CALL PC_SPACE |
|
|
|
CALL PRTHEXWORDHL |
|
|
|
PRTS(" BYTES$") |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
RET |
|
|
|
; |
|
|
|
PPA_PUTDATALEN: |
|
|
|
; |
|
|
|
#IF (PPATRACE >= 3) |
|
|
|
PRTS("\r\nPUTDLEN:$") |
|
|
|
CALL PC_SPACE |
|
|
|
CALL PRTHEXWORDHL |
|
|
|
PRTS(" BYTES$") |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
PPA_PUTDATALEN1: |
|
|
|
LD A,(DE) ; GET NEXT BYTE (FIRST OF PAIR) |
|
|
|
CALL PPA_WRITEDATA ; PUT ON BUS |
|
|
|
INC DE ; INCREMENT BUF POS |
|
|
|
DEC HL ; DEC LOOP COUNTER |
|
|
|
PPA_WCTL($0E) |
|
|
|
PPA_WCTL($0C) |
|
|
|
LD A,H ; CHECK LOOP COUNTER |
|
|
|
OR L |
|
|
|
JR NZ,PPA_PUTDATALEN1 ; LOOP TILL DONE |
|
|
|
RET |
|
|
|
; |
|
|
|
; READ SCSI COMMAND STATUS |
|
|
|
; |
|
|
|
PPA_GETSTATUS: |
|
|
|
; |
|
|
|
#IF (PPATRACE >= 3) |
|
|
|
PRTS("\r\nSTATUS:$") |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
CALL PPA_GETBYTE ; GET ONE BYTE |
|
|
|
LD (PPA_CMDSTAT),A ; SAVE AS FIRST STATUS BYTE |
|
|
|
; |
|
|
|
#IF (PPATRACE >= 3) |
|
|
|
CALL PC_SPACE |
|
|
|
CALL PRTHEXBYTE |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
CALL PPA_WAIT ; CHECK FOR OPTIONAL SECOND BYTE |
|
|
|
CP $F0 ; STILL IN STATUS PHASE? |
|
|
|
RET NZ ; IF NOT, DONE |
|
|
|
CALL PPA_GETBYTE ; ELSE, GET THE SECOND BYTE |
|
|
|
LD (PPA_CMDSTAT+1),A ; AND SAVE IT |
|
|
|
; |
|
|
|
#IF (PPATRACE >= 3) |
|
|
|
CALL PC_SPACE |
|
|
|
CALL PRTHEXBYTE |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
RET |
|
|
|
; |
|
|
|
; THIS IS THE MAIN SCSI ENGINE. BASICALLY, IT SELECTS THE DEVICE |
|
|
|
; ON THE BUS, SENDS THE COMMAND, THEN PROCESSES THE RESULT. |
|
|
|
@ -625,6 +939,83 @@ PPA_SENDCMD: |
|
|
|
; BC: TRANSFER LENGTH (0=VARIABLE) |
|
|
|
; |
|
|
|
PPA_RUNCMD: |
|
|
|
; THERE ARE MANY PLACES NESTED WITHIN THE ROUTINES THAT |
|
|
|
; ARE CALLED HERE. HERE WE SAVE THE STACK SO THAT WE CAN |
|
|
|
; EASILY AND QUICKLY ABORT OUT OF ANY NESTED ROUTINE. |
|
|
|
; SEE PPA_CMD_ERR BELOW. |
|
|
|
LD (PPA_CMDSTK),SP ; FOR ERROR ABORTS |
|
|
|
LD (PPA_DSKBUF),DE ; SAVE BUF PTR |
|
|
|
LD (PPA_XFRLEN),BC ; SAVE XFER LEN |
|
|
|
PUSH HL |
|
|
|
CALL PPA_CONNECT ; PARALLEL PORT BUS CONNECT |
|
|
|
CALL PPA_SELECT ; SELECT TARGET DEVICE |
|
|
|
CALL PPA_WAIT ; WAIT TILL READY |
|
|
|
POP HL |
|
|
|
CALL PPA_SENDCMD ; SEND THE COMMAND |
|
|
|
; |
|
|
|
PPA_RUNCMD_PHASE: |
|
|
|
; WAIT FOR THE BUS TO BE READY. WE USE AN EXTRA LONG WAIT |
|
|
|
; TIMEOUT HERE BECAUSE THIS IS WHERE WE WILL WAIT FOR LONG |
|
|
|
; OPERATIONS TO COMPLETE. IT CAN TAKE SOME TIME IF THE |
|
|
|
; DEVICE HAS GONE TO SLEEP BECAUSE IT WILL NEED TO WAKE UP |
|
|
|
; AND SPIN UP BEFORE PROCESSING AN I/O COMMAND. |
|
|
|
CALL PPA_LONGWAIT ; WAIT TILL READY |
|
|
|
; |
|
|
|
#IF (PPATRACE >= 3) |
|
|
|
PRTS("\r\nPHASE: $") |
|
|
|
CALL PRTHEXBYTE |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
CP $C0 ; DEVICE WANTS TO RCV DATA |
|
|
|
JR Z,PPA_RUNCMD_WRITE |
|
|
|
CP $D0 ; DEVICE WANTS TO SEND DATA |
|
|
|
JR Z,PPA_RUNCMD_READ |
|
|
|
CP $F0 ; DEVICE WANTS TO BE DONE |
|
|
|
JR Z,PPA_RUNCMD_END |
|
|
|
JR PPA_CMD_IOERR |
|
|
|
; |
|
|
|
PPA_RUNCMD_WRITE: |
|
|
|
LD DE,(PPA_DSKBUF) ; XFER BUFFER |
|
|
|
LD HL,(PPA_XFRLEN) ; XFER LENGTH |
|
|
|
CALL PPA_PUTDATA ; SEND DATA NOW |
|
|
|
JR PPA_RUNCMD_PHASE ; BACK TO DISPATCH |
|
|
|
; |
|
|
|
PPA_RUNCMD_READ: |
|
|
|
;CALL PPA_NEGOTIATE ; NEGOTIATE FOR READ |
|
|
|
;CALL PPA_WAIT ; WAIT TILL READY |
|
|
|
LD DE,(PPA_DSKBUF) ; XFER BUFFER |
|
|
|
LD HL,(PPA_XFRLEN) ; XFER LENGTH |
|
|
|
CALL PPA_GETDATA ; GET THE DATA NOW |
|
|
|
;CALL PPA_ENDREAD ; TERMINATE THE READ |
|
|
|
JR PPA_RUNCMD_PHASE ; BACK TO DISPATCH |
|
|
|
; |
|
|
|
PPA_RUNCMD_END: |
|
|
|
;CALL PPA_NEGOTIATE ; NEGOTIATE FOR READ (STATUS) |
|
|
|
;CALL PPA_WAIT ; WAIT TILL READY |
|
|
|
CALL PPA_GETSTATUS ; READ STATUS BYTES |
|
|
|
;CALL PPA_ENDREAD ; TERMINATE THE READ |
|
|
|
CALL PPA_DISCONNECT ; PARALLEL PORT BUS DISCONNECT |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET |
|
|
|
; |
|
|
|
PPA_CMD_IOERR: |
|
|
|
LD A,PPA_STIOERR ; ERROR VALUE TO A |
|
|
|
JR PPA_CMD_ERR ; CONTINUE |
|
|
|
; |
|
|
|
PPA_CMD_TIMEOUT: |
|
|
|
LD A,PPA_STTO ; ERROR VALUE TO A |
|
|
|
JR PPA_CMD_ERR ; CONTINUE |
|
|
|
; |
|
|
|
PPA_CMD_ERR: |
|
|
|
LD SP,(PPA_CMDSTK) ; UNWIND STACK |
|
|
|
PUSH AF ; SAVE STATUS |
|
|
|
;CALL PPA_RESETPULSE ; CLEAN UP THE MESS??? |
|
|
|
LD DE,62 ; DELAY AFTER RESET PULSE |
|
|
|
CALL VDELAY |
|
|
|
CALL PPA_DISCONNECT ; PARALLEL PORT BUS DISCONNECT |
|
|
|
LD DE,62 ; DELAY AFTER DISCONNECT |
|
|
|
CALL VDELAY |
|
|
|
POP AF ; RECOVER STATUS |
|
|
|
JP PPA_ERR ; NOW DO STANDARD ERR PROCESSING |
|
|
|
; |
|
|
|
; ERRORS SHOULD GENERALLY NOT CAUSE SCSI PROCESSING TO FAIL. IF A |
|
|
|
@ -656,7 +1047,8 @@ PPA_CHKCMD1: |
|
|
|
; |
|
|
|
; REQ SENSE CMD COMPLETED |
|
|
|
#IF (PPATRACE >= 3) |
|
|
|
LD A,16 |
|
|
|
PRTS("\r\nSENSE:$") |
|
|
|
LD A,$19 |
|
|
|
LD DE,HB_WRKBUF |
|
|
|
CALL Z,PRTHEXBUF |
|
|
|
#ENDIF |
|
|
|
@ -693,7 +1085,86 @@ PPA_INITDEV: |
|
|
|
OUT (C),A ; DO IT |
|
|
|
CALL DELAY ; SHORT DELAY FOR BUS SETTLE |
|
|
|
; |
|
|
|
JP PPA_NOTSUP |
|
|
|
; BUS RESET |
|
|
|
CALL PPA_CONNECT |
|
|
|
CALL PPA_RESETPULSE |
|
|
|
LD DE,62 ; 1000 US |
|
|
|
CALL VDELAY |
|
|
|
CALL PPA_DISCONNECT |
|
|
|
LD DE,62 ; 1000 US |
|
|
|
CALL VDELAY |
|
|
|
; |
|
|
|
; INITIALLY, THE DEVICE MAY REQUIRE MULTIPLE REQUEST SENSE |
|
|
|
; COMMANDS BEFORE IT WILL ACCEPT I/O COMMANDS. THIS IS DUE |
|
|
|
; TO THINGS LIKE BUS RESET NOTIFICATION, MEDIA CHANGE, ETC. |
|
|
|
; HERE, WE RUN A FEW REQUEST SENSE COMMANDS. AS SOON AS ONE |
|
|
|
; INDICATES NO ERRORS, WE CAN CONTINUE. |
|
|
|
LD B,4 ; TRY UP TO 4 TIMES |
|
|
|
PPA_INITDEV1: |
|
|
|
PUSH BC ; SAVE LOOP COUNTER |
|
|
|
; |
|
|
|
; REQUEST SENSE COMMAND |
|
|
|
LD DE,HB_WRKBUF ; BUFFER FOR SENSE DATA |
|
|
|
LD BC,0 ; READ WHATEVER IS SENT |
|
|
|
LD HL,PPA_CMD_SENSE ; POINT TO CMD BUFFER |
|
|
|
CALL PPA_RUNCMD ; RUN THE SCSI ENGINE |
|
|
|
JR NZ,PPA_INITDEV2 ; CMD PROC ERROR |
|
|
|
; |
|
|
|
#IF (PPATRACE >= 3) |
|
|
|
PRTS("\r\nSENSE:$") |
|
|
|
LD A,$19 |
|
|
|
LD DE,HB_WRKBUF |
|
|
|
CALL PRTHEXBUF |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
; CHECK SENSE KEY |
|
|
|
LD A,(HB_WRKBUF + 2) ; GET SENSE KEY |
|
|
|
OR A ; SET FLAGS |
|
|
|
; |
|
|
|
PPA_INITDEV2: |
|
|
|
POP BC ; RESTORE LOOP COUNTER |
|
|
|
JR Z,PPA_INITDEV3 ; IF NO ERROR, MOVE ON |
|
|
|
DJNZ PPA_INITDEV1 ; TRY UNTIL COUNTER EXHAUSTED |
|
|
|
JP PPA_IOERR ; BAIL OUT WITH ERROR |
|
|
|
; |
|
|
|
PPA_INITDEV3: |
|
|
|
; READ & RECORD DEVICE CAPACITY |
|
|
|
LD DE,HB_WRKBUF ; BUFFER TO CAPACITY RESPONSE |
|
|
|
LD BC,0 ; READ WHATEVER IS SENT |
|
|
|
LD HL,PPA_CMD_RDCAP ; POINT TO READ CAPACITY CMD |
|
|
|
CALL PPA_RUNCMD ; RUN THE SCSI ENGINE |
|
|
|
CALL Z,PPA_CHKCMD ; CHECK AND RECORD ANY ERRORS |
|
|
|
RET NZ ; BAIL OUT ON ERROR |
|
|
|
; |
|
|
|
#IF (PPATRACE >= 3) |
|
|
|
PRTS("\r\nRDCAP:$") |
|
|
|
LD A,8 |
|
|
|
LD DE,HB_WRKBUF |
|
|
|
CALL PRTHEXBUF |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
; CAPACITY IS RETURNED IN A 4 BYTE, BIG ENDIAN FIELD AND |
|
|
|
; INDICATES THE LAST LBA VALUE. WE NEED TO CONVERT THIS TO |
|
|
|
; LITTLE ENDIAN AND INCREMENT THE VALUE TO MAKE IT A CAPACITY |
|
|
|
; COUNT INSTEAD OF A LAST LBA VALUE. |
|
|
|
LD A,PPA_MEDCAP ; OFFSET IN CFG FOR CAPACITY |
|
|
|
CALL LDHLIYA ; POINTER TO HL |
|
|
|
PUSH HL ; SAVE IT |
|
|
|
LD HL,HB_WRKBUF ; POINT TO VALUE IN CMD RESULT |
|
|
|
CALL LD32 ; LOAD IT TO DE:HL |
|
|
|
LD A,L ; FLIP BYTES |
|
|
|
LD L,D ; ... BIG ENDIAN |
|
|
|
LD D,A ; ... TO LITTLE ENDIAN |
|
|
|
LD A,H |
|
|
|
LD H,E |
|
|
|
LD E,A |
|
|
|
CALL INC32 ; INCREMENT TO FINAL VALUE |
|
|
|
POP BC ; RECOVER SAVE LOCATION |
|
|
|
CALL ST32 ; STORE VALUE |
|
|
|
; |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
LD (IY+PPA_STAT),A ; RECORD IT |
|
|
|
RET |
|
|
|
; |
|
|
|
;============================================================================= |
|
|
|
; ERROR HANDLING AND DIAGNOSTICS |
|
|
|
@ -726,7 +1197,7 @@ PPA_ERR: |
|
|
|
LD (IY+PPA_STAT),A ; SAVE NEW STATUS |
|
|
|
; |
|
|
|
PPA_ERR2: |
|
|
|
#IF (PPATRACE >= 1) |
|
|
|
#IF (PPATRACE >= 2) |
|
|
|
CALL PPA_PRTSTAT |
|
|
|
#ENDIF |
|
|
|
OR A ; SET FLAGS |
|
|
|
|