diff --git a/Doc/RomWBW Applications.pdf b/Doc/RomWBW Applications.pdf index 6287994b..f81a8fba 100644 Binary files a/Doc/RomWBW Applications.pdf and b/Doc/RomWBW Applications.pdf differ diff --git a/Doc/RomWBW Disk Catalog.pdf b/Doc/RomWBW Disk Catalog.pdf index b282d0b9..fc1ed6d3 100644 Binary files a/Doc/RomWBW Disk Catalog.pdf and b/Doc/RomWBW Disk Catalog.pdf differ diff --git a/Doc/RomWBW Errata.pdf b/Doc/RomWBW Errata.pdf index e2f32db7..1471eb0e 100644 Binary files a/Doc/RomWBW Errata.pdf and b/Doc/RomWBW Errata.pdf differ diff --git a/Doc/RomWBW ROM Applications.pdf b/Doc/RomWBW ROM Applications.pdf index f3c3ecdf..eae81f18 100644 Binary files a/Doc/RomWBW ROM Applications.pdf and b/Doc/RomWBW ROM Applications.pdf differ diff --git a/Doc/RomWBW System Guide.pdf b/Doc/RomWBW System Guide.pdf index 96cffc1d..894d9121 100644 Binary files a/Doc/RomWBW System Guide.pdf and b/Doc/RomWBW System Guide.pdf differ diff --git a/Doc/RomWBW User Guide.pdf b/Doc/RomWBW User Guide.pdf index e3c525ec..af9d8ef7 100644 Binary files a/Doc/RomWBW User Guide.pdf and b/Doc/RomWBW User Guide.pdf differ diff --git a/ReadMe.md b/ReadMe.md index 3ddc1dd5..3727f082 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -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 diff --git a/ReadMe.txt b/ReadMe.txt index a409cd8a..fa0649e6 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -1,6 +1,6 @@ RomWBW ReadMe Wayne Warthen (wwarthen@gmail.com) -23 May 2023 +02 Jun 2023 diff --git a/Source/Doc/UserGuide.md b/Source/Doc/UserGuide.md index d6acd606..78378edb 100644 --- a/Source/Doc/UserGuide.md +++ b/Source/Doc/UserGuide.md @@ -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 | diff --git a/Source/HBIOS/imm.asm b/Source/HBIOS/imm.asm index 079bf9af..7e59d1db 100644 --- a/Source/HBIOS/imm.asm +++ b/Source/HBIOS/imm.asm @@ -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 diff --git a/Source/HBIOS/ppa.asm b/Source/HBIOS/ppa.asm index d10b88ab..94bc5243 100644 --- a/Source/HBIOS/ppa.asm +++ b/Source/HBIOS/ppa.asm @@ -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 diff --git a/Source/HBIOS/syq.asm b/Source/HBIOS/syq.asm index 737c4fbf..a503c808 100644 --- a/Source/HBIOS/syq.asm +++ b/Source/HBIOS/syq.asm @@ -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 ; diff --git a/Source/ver.inc b/Source/ver.inc index 70dd66c9..0ee41555 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -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 diff --git a/Source/ver.lib b/Source/ver.lib index 70d1d5ed..9bc8f615 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -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