Compare commits

...

1 Commits

Author SHA1 Message Date
Wayne Warthen
1333d6a491 Functional PPA Driver 2023-06-02 15:30:10 -07:00
14 changed files with 565 additions and 85 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -3,7 +3,7 @@
**RomWBW ReadMe** \
Version 3.3 \
Wayne Warthen ([wwarthen@gmail.com](mailto:wwarthen@gmail.com)) \
23 May 2023
02 Jun 2023
# Overview

View File

@@ -1,6 +1,6 @@
RomWBW ReadMe
Wayne Warthen (wwarthen@gmail.com)
23 May 2023
02 Jun 2023

View File

@@ -3901,6 +3901,7 @@ may be discovered by RomWBW in your system.
| GDC | Video | uPD7220 Video Display Controller |
| HDSK | Disk | SIMH Simulator Hard Disk |
| IDE | Disk | IDE/ATA Hard Disk Interface |
| IMM | Disk | IMM Zip Drive on PPI |
| INTRTC | RTC | Interrupt-based Real Time Clock |
| KBD | Kbd | 8242 PS/2 Keyboard Controller |
| KIO | System | Zilog Serial/ Parallel Counter/Timer |
@@ -3910,6 +3911,7 @@ may be discovered by RomWBW in your system.
| I2C | System | I2C Interface |
| PIO | Char | Zilog Parallel Interface Controller |
| PPIDE | Disk | 8255 IDE/ATA Hard Disk Interface |
| PPA | Disk | PPA Zip Drive on PPI |
| PPK | Kbd | Matrix Keyboard |
| PPPSD | Disk | ParPortProp SD Card Interface |
| PPPCON | Serial | ParPortProp Serial Console Interface |
@@ -3922,6 +3924,7 @@ may be discovered by RomWBW in your system.
| SIO | Char | Zilog Serial Port Interface |
| SN76489 | Sound | SN76489 Programmable Sound Generator |
| SPK | Sound | Bit-bang Speaker |
| SYQ | Disk | Iomega SparQ Drive on PPI |
| TMS | Video | TMS9918/38/58 Video Display Controller |
| UART | Char | 16C550 Family Serial Interface |
| USB-FIFO | Char | FT232H-based ECB USB FIFO |

View File

@@ -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/2023 WBW - CLEAN UP, LED ACTIVITY
@@ -189,7 +189,7 @@ IMM_INIT4:
CALL DIO_ADDENT ; ADD ENTRY TO GLOBAL DISK DEV TABLE
;
CALL IMM_RESET ; RESET/INIT THE INTERFACE
#IF (IMMTRACE == 0)
#IF (IMMTRACE <= 1)
CALL IMM_PRTSTAT
#ENDIF
JR NZ,IMM_INIT6
@@ -224,6 +224,9 @@ IMM_INIT6:
; ON RETURN, ZF SET INDICATES HARDWARE FOUND
;
IMM_DETECT:
#IF (IMMTRACE >= 3)
PRTS("\r\nDETECT:$")
#ENDIF
; INITIALIZE 8255
LD A,(IY+IMM_IOBASE) ; BASE PORT
ADD A,IMM_IOSETUP ; BUMP TO SETUP PORT
@@ -1024,7 +1027,7 @@ IMM_GETSTATUS:
;
RET
;
; TERMINATE A BULD READ OPERATION
; TERMINATE A BULK READ OPERATION
;
IMM_ENDREAD:
IMM_WCTL($04)
@@ -1151,7 +1154,8 @@ IMM_CHKCMD1:
;
; REQ SENSE CMD COMPLETED
#IF (IMMTRACE >= 3)
LD A,16
PRTS("\r\nSENSE:$")
LD A,$19
LD DE,HB_WRKBUF
CALL Z,PRTHEXBUF
#ENDIF
@@ -1219,7 +1223,8 @@ IMM_INITDEV1:
JR NZ,IMM_INITDEV2 ; IF ERROR, LOOP
;
#IF (IMMTRACE >= 3)
LD A,16
PRTS("\r\nSENSE:$")
LD A,$19
LD DE,HB_WRKBUF
CALL PRTHEXBUF
#ENDIF
@@ -1241,9 +1246,10 @@ IMM_INITDEV3:
LD HL,IMM_CMD_RDCAP ; POINT TO READ CAPACITY CMD
CALL IMM_RUNCMD ; RUN THE SCSI ENGINE
CALL Z,IMM_CHKCMD ; CHECK AND RECORD ANY ERRORS
RET NZ ; BAIL ON ON ERROR
RET NZ ; BAIL OUT ON ERROR
;
#IF (IMMTRACE >= 3)
PRTS("\r\nRDCAP:$")
LD A,8
LD DE,HB_WRKBUF
CALL PRTHEXBUF
@@ -1302,7 +1308,7 @@ IMM_ERR:
LD (IY+IMM_STAT),A ; SAVE NEW STATUS
;
IMM_ERR2:
#IF (IMMTRACE >= 1)
#IF (IMMTRACE >= 2)
CALL IMM_PRTSTAT
#ENDIF
OR A ; SET FLAGS

View File

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

View File

@@ -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/29/2023 WBW - INITIAL RELEASE
;

View File

@@ -2,7 +2,7 @@
#DEFINE RMN 3
#DEFINE RUP 0
#DEFINE RTP 0
#DEFINE BIOSVER "3.3.0-dev.18"
#DEFINE BIOSVER "3.3.0-dev.19"
#define rmj RMJ
#define rmn RMN
#define rup RUP

View File

@@ -3,5 +3,5 @@ rmn equ 3
rup equ 0
rtp equ 0
biosver macro
db "3.3.0-dev.18"
db "3.3.0-dev.19"
endm