Browse Source

SCSI and ESPSD Driver Cleaning

- Improved error handling flow
- Simplified ESPSD I/O timeout handling
pull/640/head
Wayne Warthen 2 months ago
parent
commit
5014a47a64
No known key found for this signature in database GPG Key ID: 8B34ED29C07EEB0A
  1. 245
      Source/HBIOS/espsd.asm
  2. 87
      Source/HBIOS/scsi.asm
  3. 2
      Source/ver.inc
  4. 2
      Source/ver.lib

245
Source/HBIOS/espsd.asm

@ -288,8 +288,9 @@ ESPSD_INIT5:
CALL ESPSD_INITDEV ; INITIALIZE DEVICE CALL ESPSD_INITDEV ; INITIALIZE DEVICE
#IF (ESPSDTRACE < 2) #IF (ESPSDTRACE < 2)
JP NZ,ESPSD_PRTSTAT JP NZ,ESPSD_PRTSTAT
#ENDIF
#ELSE
RET NZ RET NZ
#ENDIF
; ;
CALL ESPSD_PRTPREFIX ; TAG FOR ACTIVE DEVICE CALL ESPSD_PRTPREFIX ; TAG FOR ACTIVE DEVICE
; ;
@ -345,7 +346,7 @@ ESPSD_READ:
;;;LD A,'R' ;;;LD A,'R'
;;;CALL COUT ;;;CALL COUT
;;;CALL PRTHEXWORDHL ;;;CALL PRTHEXWORDHL
LD A,ESPSD_CMD_READ ; SETUP FOR BLOCK READ CMD
LD E,ESPSD_CMD_READ ; SETUP FOR BLOCK READ CMD
JP ESPSD_IO ; CONTINUE TO GENERIC IO ROUTINE JP ESPSD_IO ; CONTINUE TO GENERIC IO ROUTINE
; ;
; ;
@ -356,7 +357,7 @@ ESPSD_WRITE:
;;;LD A,'W' ;;;LD A,'W'
;;;CALL COUT ;;;CALL COUT
;;;CALL PRTHEXWORDHL ;;;CALL PRTHEXWORDHL
LD A,ESPSD_CMD_WRITE ; SETUP FOR BLOCK WRITE CMD
LD E,ESPSD_CMD_WRITE ; SETUP FOR BLOCK WRITE CMD
JP ESPSD_IO ; CONTINUE TO GENERIC IO ROUTINE JP ESPSD_IO ; CONTINUE TO GENERIC IO ROUTINE
; ;
; ;
@ -501,15 +502,23 @@ ESPSD_INITDEV1:
; COMMON SECTOR I/O ; COMMON SECTOR I/O
; ;
ESPSD_IO: ESPSD_IO:
LD (ESPSD_CMDVAL),A ; SAVE THE COMMAND
LD (ESPSD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
;
; CHECK FOR ERROR STATUS AND REINIT?
; ;
#IF (ESPSDTRACE == 1) #IF (ESPSDTRACE == 1)
LD HL,ESPSD_PRTERR ; SET UP SD_PRTERR
PUSH HL ; ... TO FILTER ALL EXITS
PUSH HL
LD HL,ESPSD_PRTERR ; SET UP ESPSD_PRTERR
EX (SP),HL ; ... TO FILTER ALL EXITS
#ENDIF #ENDIF
;
PUSH DE
PUSH HL
CALL ESPSD_CHKERR ; CHECK FOR ERR STATUS AND RESET IF SO
POP HL
POP DE
RET NZ ; BAIL OUT ON ERROR
;
LD A,E ; COMMAND TO ACCUM
LD (ESPSD_CMDVAL),A ; SAVE THE COMMAND
LD (ESPSD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
; ;
; SELECT PRI/SEC DEVICE ; SELECT PRI/SEC DEVICE
CALL ESPSD_SELECT ; SELECT DEVICE CALL ESPSD_SELECT ; SELECT DEVICE
@ -532,7 +541,7 @@ ESPSD_IO:
ESPSD_IO2: ESPSD_IO2:
CALL ESPSD_BLKWRITE ; DO THE WRITE CALL ESPSD_BLKWRITE ; DO THE WRITE
ESPSD_IO3: ESPSD_IO3:
JP NZ,ESPSD_ERR ; ON ERROR, RECORD AND BAIL OUT
JR NZ,ESPSD_IO4 ; IF ERROR, SKIP INCREMENT
; ;
; INCREMENT LBA ; INCREMENT LBA
LD A,ESPSD_LBA ; LBA OFFSET LD A,ESPSD_LBA ; LBA OFFSET
@ -544,11 +553,24 @@ ESPSD_IO3:
INC (HL) ; BUMP DMA BY INC (HL) ; BUMP DMA BY
INC (HL) ; ... 512 BYTES INC (HL) ; ... 512 BYTES
; ;
; CLEAN UP
LD HL,(ESPSD_DSKBUF) ; CURRENT DMA TO HL
XOR A ; SIGNAL SUCCESS XOR A ; SIGNAL SUCCESS
ESPSD_IO4:
LD HL,(ESPSD_DSKBUF) ; CURRENT DMA TO HL
OR A ; SET FLAGS
RET Z ; DONE IF NO ERROR
LD A,ERR_IO ; SIGNAL IO ERROR
OR A ; SET FLAGS
RET ; AND DONE RET ; AND DONE
; ;
; CHECK CURRENT DEVICE FOR ERROR STATUS AND ATTEMPT TO RECOVER
; VIA RESET IF DEVICE IS IN ERROR.
;
ESPSD_CHKERR:
LD A,(IY+ESPSD_STAT) ; GET STATUS
OR A ; SET FLAGS
CALL NZ,ESPSD_RESET ; IF ERROR STATUS, RESET BUS
RET
;
;============================================================================= ;=============================================================================
; COMMAND PROCESSING ; COMMAND PROCESSING
;============================================================================= ;=============================================================================
@ -568,11 +590,9 @@ ESPSD_INITCARD:
; ;
; GET CAPACITY ; GET CAPACITY
LD E,ESPSD_CMD_CAP ; GET CAPACITY COMMAND LD E,ESPSD_CMD_CAP ; GET CAPACITY COMMAND
CALL ESPSD_CMD_SLOW ; SEND IT
CALL ESPSD_CMD ; SEND IT
RET NZ ; HANDLE ERROR RET NZ ; HANDLE ERROR
; ;
LD A,ESPSD_MEDCAP ; OFFSET TO CAPACITY FIELD LD A,ESPSD_MEDCAP ; OFFSET TO CAPACITY FIELD
CALL LDHLIYA ; HL := IY + A, REG A TRASHED CALL LDHLIYA ; HL := IY + A, REG A TRASHED
LD A,4 ; START AT END FOR LITTLE ENDIAN LD A,4 ; START AT END FOR LITTLE ENDIAN
@ -582,7 +602,7 @@ ESPSD_INITCARD:
ESPSD_INITCARD1: ESPSD_INITCARD1:
DEC HL ; DEC POINTER DEC HL ; DEC POINTER
PUSH BC ; SAVE LOOP CONTROL PUSH BC ; SAVE LOOP CONTROL
CALL ESPSD_GETBYTE_SLOW ; FIRST BYTE (MSB)
CALL ESPSD_GETBYTE ; FIRST BYTE (MSB)
POP BC ; RESTORE LOOP CONTROL POP BC ; RESTORE LOOP CONTROL
RET NZ ; HANDLE ERROR RET NZ ; HANDLE ERROR
LD (HL),E ; SAVE IT LD (HL),E ; SAVE IT
@ -594,18 +614,18 @@ ESPSD_INITCARD1:
; ;
ESPSD_FWVER: ESPSD_FWVER:
LD E,ESPSD_CMD_FWVER ; FWVER COMMAND LD E,ESPSD_CMD_FWVER ; FWVER COMMAND
CALL ESPSD_CMD_SLOW ; SEND IT
CALL ESPSD_CMD ; SEND IT
RET NZ ; HANDLE ERROR RET NZ ; HANDLE ERROR
CALL ESPSD_GETBYTE_SLOW ; GET BOARD ID
CALL ESPSD_GETBYTE ; GET BOARD ID
RET NZ ; HANDLE ERROR RET NZ ; HANDLE ERROR
LD D,E ; SAVE IN D LD D,E ; SAVE IN D
CALL ESPSD_GETBYTE_SLOW ; GET VER MAJOR
CALL ESPSD_GETBYTE ; GET VER MAJOR
RET NZ ; HANDLE ERROR RET NZ ; HANDLE ERROR
LD H,E ; PUT IN H LD H,E ; PUT IN H
CALL ESPSD_GETBYTE_SLOW ; GET VER MINOR
CALL ESPSD_GETBYTE ; GET VER MINOR
RET NZ ; HANDLE ERROR RET NZ ; HANDLE ERROR
LD L,E ; PUT IN H LD L,E ; PUT IN H
CALL ESPSD_GETBYTE_SLOW ; GET RESULT
CALL ESPSD_GETBYTE ; GET RESULT
RET NZ ; HANDLE ERROR RET NZ ; HANDLE ERROR
LD A,E ; RESULT TO ACCUM LD A,E ; RESULT TO ACCUM
LD E,D ; BOARD ID BACK TO E LD E,D ; BOARD ID BACK TO E
@ -626,10 +646,10 @@ ESPSD_SELECT:
; ;
ESPSD_RUNCMD: ESPSD_RUNCMD:
LD E,A ; PUT IN E LD E,A ; PUT IN E
CALL ESPSD_CMD_SLOW ; SEND COMMAND
CALL ESPSD_CMD ; SEND COMMAND
RET NZ ; HANDLE ERROR RET NZ ; HANDLE ERROR
ESPSD_GETRESULT: ESPSD_GETRESULT:
CALL ESPSD_GETBYTE_SLOW ; GET RESULT
CALL ESPSD_GETBYTE ; GET RESULT
RET NZ ; HANDLE ERROR RET NZ ; HANDLE ERROR
LD A,E ; RESULT TO ACCUM LD A,E ; RESULT TO ACCUM
OR A ; SET FLAGS OR A ; SET FLAGS
@ -644,7 +664,7 @@ ESPSD_GETRESULT:
; ;
ESPSD_SETLBA: ESPSD_SETLBA:
LD E,ESPSD_CMD_SETLBA ; SETLBA COMMAND LD E,ESPSD_CMD_SETLBA ; SETLBA COMMAND
CALL ESPSD_CMD_SLOW ; SEND IT
CALL ESPSD_CMD ; SEND IT
RET NZ ; HANDLE ERROR RET NZ ; HANDLE ERROR
LD A,4 ; LITTLE ENDIAN LD A,4 ; LITTLE ENDIAN
CALL ADDHLA ; BUMP TO END OF LBA BYTES CALL ADDHLA ; BUMP TO END OF LBA BYTES
@ -654,12 +674,12 @@ ESPSD_SETLBA1:
DEC HL ; DEC POINTER DEC HL ; DEC POINTER
LD E,(HL) ; GET NEXT BYTE TO SEND LD E,(HL) ; GET NEXT BYTE TO SEND
PUSH BC ; SAVE LOOP CONTROL PUSH BC ; SAVE LOOP CONTROL
CALL ESPSD_PUTBYTE_SLOW ; SEND BYTE
CALL ESPSD_PUTBYTE ; SEND BYTE
POP BC ; RESTORE LOOP CONTROL POP BC ; RESTORE LOOP CONTROL
RET NZ ; HANDLE ERROR RET NZ ; HANDLE ERROR
DJNZ ESPSD_SETLBA1 ; LOOP AS NEEDED DJNZ ESPSD_SETLBA1 ; LOOP AS NEEDED
; ;
CALL ESPSD_GETBYTE_SLOW ; GET RESULT
CALL ESPSD_GETBYTE ; GET RESULT
RET NZ ; HANDLE ERROR RET NZ ; HANDLE ERROR
LD A,E ; RESULT TO ACCUM LD A,E ; RESULT TO ACCUM
OR A ; SET FLAGS OR A ; SET FLAGS
@ -672,7 +692,7 @@ ESPSD_SETLBA1:
; ;
ESPSD_BLKREAD: ESPSD_BLKREAD:
LD E,ESPSD_CMD_READ LD E,ESPSD_CMD_READ
CALL ESPSD_CMD_SLOW
CALL ESPSD_CMD
RET NZ RET NZ
; ;
LD B,0 ; LOOP COUNTER LD B,0 ; LOOP COUNTER
@ -680,13 +700,13 @@ ESPSD_BLKREAD:
#IF FALSE #IF FALSE
ESPSD_BLKREAD1: ESPSD_BLKREAD1:
PUSH BC PUSH BC
CALL ESPSD_GETBYTE_SLOW
CALL ESPSD_GETBYTE
POP BC POP BC
RET NZ RET NZ
LD (HL),E LD (HL),E
INC HL INC HL
PUSH BC PUSH BC
CALL ESPSD_GETBYTE_SLOW
CALL ESPSD_GETBYTE
POP BC POP BC
RET NZ RET NZ
LD (HL),E LD (HL),E
@ -699,14 +719,13 @@ ESPSD_BLKREAD1:
CALL ESPSD_BLKREAD2 ; DO SECOND 256 BYTES CALL ESPSD_BLKREAD2 ; DO SECOND 256 BYTES
#ENDIF #ENDIF
; ;
CALL ESPSD_GETBYTE_SLOW ; GET RESULT
CALL ESPSD_GETBYTE ; GET RESULT
RET NZ ; HANDLE ERROR RET NZ ; HANDLE ERROR
LD A,E ; RESULT TO ACCUM LD A,E ; RESULT TO ACCUM
OR A ; SET FLAGS OR A ; SET FLAGS
RET Z ; GOOD RETURN
LD A,ESPSD_STIOERR ; CALL THIS AN IO ERROR
OR A ; SET FLAGS
RET ; DONE
JP NZ,ESPSD_IOERR ; HANDLE AS IO ERROR
XOR A ; SIGNAL SUCCESS
RET ; AND DONE
; ;
ESPSD_BLKREAD2: ESPSD_BLKREAD2:
; READ BYTES FAST (NO TIMEOUT CHECK) ; READ BYTES FAST (NO TIMEOUT CHECK)
@ -726,7 +745,7 @@ ESPSD_BLKREAD2A:
; ;
ESPSD_BLKWRITE: ESPSD_BLKWRITE:
LD E,ESPSD_CMD_WRITE LD E,ESPSD_CMD_WRITE
CALL ESPSD_CMD_SLOW
CALL ESPSD_CMD
RET NZ RET NZ
; ;
LD B,0 ; LOOP COUNTER LD B,0 ; LOOP COUNTER
@ -736,13 +755,13 @@ ESPSD_BLKWRITE1:
LD E,(HL) LD E,(HL)
INC HL INC HL
PUSH BC PUSH BC
CALL ESPSD_PUTBYTE_SLOW
CALL ESPSD_PUTBYTE
POP BC POP BC
RET NZ RET NZ
LD E,(HL) LD E,(HL)
INC HL INC HL
PUSH BC PUSH BC
CALL ESPSD_PUTBYTE_SLOW
CALL ESPSD_PUTBYTE
POP BC POP BC
RET NZ RET NZ
DJNZ ESPSD_BLKWRITE1 DJNZ ESPSD_BLKWRITE1
@ -753,14 +772,13 @@ ESPSD_BLKWRITE1:
CALL ESPSD_BLKWRITE2 ; DO SECOND 256 BYTES CALL ESPSD_BLKWRITE2 ; DO SECOND 256 BYTES
#ENDIF #ENDIF
; ;
CALL ESPSD_GETBYTE_SLOW ; GET RESULT
CALL ESPSD_GETBYTE ; GET RESULT
RET NZ ; HANDLE ERROR RET NZ ; HANDLE ERROR
LD A,E ; RESULT TO ACCUM LD A,E ; RESULT TO ACCUM
OR A ; SET FLAGS OR A ; SET FLAGS
RET Z ; GOOD RETURN
LD A,ESPSD_STIOERR ; CALL THIS AN IO ERROR
OR A ; SET FLAGS
RET ; DONE
JP NZ,ESPSD_IOERR ; HANDLE AS IO ERROR
XOR A ; SIGNAL SUCCESS
RET ; AND DONE
; ;
ESPSD_BLKWRITE2: ESPSD_BLKWRITE2:
; WRITE BYTES FAST (NO TIMEOUT CHECK) ; WRITE BYTES FAST (NO TIMEOUT CHECK)
@ -791,126 +809,103 @@ ESPSD_CMD:
RET NZ RET NZ
JR ESPSD_PUTBYTE JR ESPSD_PUTBYTE
; ;
; SEND COMMAND BYTE IN E TO ESP32
;
ESPSD_CMD_SLOW:
PUSH DE
LD E,$33 ; COMMAND PREFIX BYTE
CALL ESPSD_PUTBYTE_SLOW
POP DE
RET NZ
JR ESPSD_PUTBYTE_SLOW
;
; WRITE BYTE IN E TO ESP32 ; WRITE BYTE IN E TO ESP32
; RETURN STATUS IN A (0=SUCCESS) ; RETURN STATUS IN A (0=SUCCESS)
; BC IS DESTROYED
; ;
ESPSD_PUTBYTE: ESPSD_PUTBYTE:
#IF (ESPSDTRACE >= 3) #IF (ESPSDTRACE >= 3)
CALL PC_GT CALL PC_GT
#ENDIF #ENDIF
LD B,0
PUSH HL ; PRESERVE HL
LD C,(IY+ESPSD_IOBASE) LD C,(IY+ESPSD_IOBASE)
ESPSD_PUTBYTE1:
LD HL,100 * CPUMHZ ; SETUP OUTER LOOP COUNTER
;
ESPSD_PUTBYTE1: ; OUTER LOOP
LD B,0 ; SETUP INNER LOOP COUNTER
;
ESPSD_PUTBYTE2: ; INNER LOOP
#IF (PLATFORM == PLT_SZ180) #IF (PLATFORM == PLT_SZ180)
IN A,(C) ; EXTRA READ FOR Z180 STABILITY IN A,(C) ; EXTRA READ FOR Z180 STABILITY
#ENDIF #ENDIF
IN A,(C)
BIT 0,A
JR Z,ESPSD_PUTBYTE2
DJNZ ESPSD_PUTBYTE1
LD A,ESPSD_STTO
OR A
RET
ESPSD_PUTBYTE2:
; NOPS NEEDED FOR RELIABILITY
IN A,(C) ; READ STATUS
BIT 0,A ; ISOLATE SENDACT (TXF)
JR Z,ESPSD_PUTBYTE3 ; IF NOT ACTIVE, GO TO SEND BYTE
DJNZ ESPSD_PUTBYTE2 ; LOOP SOME MORE
;
DEC HL ; DEC OUTER LOOP COUNTER
LD A,H ; TEST COUNTER
OR L ; ... FOR ZERO
JR NZ,ESPSD_PUTBYTE1 ; IF NOT ZERO, LOOP MORE
;
; HANDLE TIMEOUT
POP HL ; RECOVER HL
JP ESPSD_TO ; RETURN VIA ERROR HANDLER
;
ESPSD_PUTBYTE3:
POP HL ; RECOVER HL
; SEND THE DATA BYTE
; NOPS NEEDED FOR RELIABILITY???
;NOP \ NOP \ NOP \ NOP \ NOP \ NOP ;NOP \ NOP \ NOP \ NOP \ NOP \ NOP
INC C
OUT (C),E
INC C ; BUMP TO DATA PORT
OUT (C),E ; SEND IT
; ;
#IF (ESPSDTRACE >= 3) #IF (ESPSDTRACE >= 3)
LD A,E LD A,E
CALL PRTHEXBYTE CALL PRTHEXBYTE
#ENDIF #ENDIF
; ;
XOR A
RET
;
; WRITE BYTE TO ESP32 FROM E WITH EXTRA LONG TIMEOUT
;
ESPSD_PUTBYTE_SLOW:
PUSH HL
LD HL,100 * CPUMHZ ; CPU SPEED SCALED TIMEOUT
ESPSD_PUTBYTE_SLOW1:
PUSH HL
CALL ESPSD_PUTBYTE
POP HL
JR Z,ESPSD_PUTBYTE_SLOW_Z
DEC HL
LD A,H
OR L
JR NZ,ESPSD_PUTBYTE_SLOW1
LD A,ESPSD_STTO
ESPSD_PUTBYTE_SLOW_Z:
;CALL PC_SPACE ; *DEBUG*
;CALL PRTHEXWORDHL ; *DEBUG*
POP HL
OR A ; SET FLAGS
RET
XOR A ; SIGNAL SUCCESS
RET ; DONE
; ;
; READ BYTE FROM ESP32 INTO E ; READ BYTE FROM ESP32 INTO E
; RETURN STATUS IN A (0=SUCCESS) ; RETURN STATUS IN A (0=SUCCESS)
; BC IS DESTROYED
; ;
ESPSD_GETBYTE: ESPSD_GETBYTE:
#IF (ESPSDTRACE >= 3) #IF (ESPSDTRACE >= 3)
CALL PC_LT CALL PC_LT
#ENDIF #ENDIF
LD B,0
PUSH HL ; PRESERVE HL
LD C,(IY+ESPSD_IOBASE) LD C,(IY+ESPSD_IOBASE)
ESPSD_GETBYTE1:
LD HL,100 * CPUMHZ ; SETUP OUTER LOOP COUNTER
;
ESPSD_GETBYTE1: ; OUTER LOOP
LD B,0 ; SETUP INNER LOOP COUNTER
;
ESPSD_GETBYTE2: ; INNER LOOP
#IF (PLATFORM == PLT_SZ180) #IF (PLATFORM == PLT_SZ180)
IN A,(C) ; EXTRA READ FOR Z180 STABILITY IN A,(C) ; EXTRA READ FOR Z180 STABILITY
#ENDIF #ENDIF
IN A,(C)
JP M,ESPSD_GETBYTE2
DJNZ ESPSD_GETBYTE1
LD A,ESPSD_STTO
OR A
RET
ESPSD_GETBYTE2:
; NOPS NEEDED FOR RELIABILITY
IN A,(C) ; READ STATUS
JP M,ESPSD_GETBYTE3 ; IF RCV READY, GO TO GET BYTE
DJNZ ESPSD_GETBYTE2 ; LOOP SOME MORE
;
DEC HL ; DEC OUTER LOOP COUNTER
LD A,H ; TEST COUNTER
OR L ; ... FOR ZERO
JR NZ,ESPSD_GETBYTE1 ; IF NOT ZERO, LOOP MORE
;
; HANDLE TIMEOUT
POP HL ; RECOVER HL
JP ESPSD_TO ; RETURN VIA ERROR HANDLER
;
ESPSD_GETBYTE3:
POP HL ; RECOVER HL
; NOPS NEEDED FOR RELIABILITY???
;NOP \ NOP \ NOP \ NOP \ NOP \ NOP ;NOP \ NOP \ NOP \ NOP \ NOP \ NOP
INC C
IN E,(C)
INC C ; BUMP TO DATA PORT
IN E,(C) ; GET DATA BYTE
; ;
#IF (ESPSDTRACE >= 3) #IF (ESPSDTRACE >= 3)
LD A,E LD A,E
CALL PRTHEXBYTE CALL PRTHEXBYTE
#ENDIF #ENDIF
; ;
XOR A
RET
;
; READ BYTE FROM ESP32 INTO E WITH EXTRA LONG TIMEOUT
;
ESPSD_GETBYTE_SLOW:
PUSH HL
LD HL,100 * CPUMHZ ; CPU SPEED SCALED TIMEOUT
ESPSD_GETBYTE_SLOW1:
PUSH HL
CALL ESPSD_GETBYTE
POP HL
JR Z,ESPSD_GETBYTE_SLOW_Z
DEC HL
LD A,H
OR L
JR NZ,ESPSD_GETBYTE_SLOW1
LD A,ESPSD_STTO
ESPSD_GETBYTE_SLOW_Z:
;CALL PC_SPACE ; *DEBUG*
;CALL PRTHEXWORDHL ; *DEBUG*
POP HL
OR A ; SET FLAGS
RET
XOR A ; SIGNAL SUCCESS
RET ; DONE
; ;
;============================================================================= ;=============================================================================
; ERROR HANDLING AND DIAGNOSTICS ; ERROR HANDLING AND DIAGNOSTICS

87
Source/HBIOS/scsi.asm

@ -167,7 +167,11 @@ SCSI_INIT3:
CALL PRTDEC8 ; DISPLAY IT CALL PRTDEC8 ; DISPLAY IT
; ;
CALL SCSI_INITDEV ; INITIALIZE DEVICE CALL SCSI_INITDEV ; INITIALIZE DEVICE
#IF (SCSITRACE < 2)
JP NZ,SCSI_PRTSTATSTR ; IF ERROR, EXIT VIA PRINT JP NZ,SCSI_PRTSTATSTR ; IF ERROR, EXIT VIA PRINT
#ELSE
RET NZ
#ENDIF
; ;
; PRINT STORAGE CAPACITY (BLOCK COUNT) ; PRINT STORAGE CAPACITY (BLOCK COUNT)
PRTS(" BLOCKS=0x$") ; PRINT FIELD LABEL PRTS(" BLOCKS=0x$") ; PRINT FIELD LABEL
@ -230,14 +234,14 @@ SCSI_DEFMED:
; ;
SCSI_READ: SCSI_READ:
CALL HB_DSKREAD ; HOOK HBIOS DISK READ SUPERVISOR CALL HB_DSKREAD ; HOOK HBIOS DISK READ SUPERVISOR
LD A,SCSI_CMD_READ ; SETUP READ COMMAND
LD E,SCSI_CMD_READ ; SETUP READ COMMAND
JP SCSI_IO ; DO THE IO JP SCSI_IO ; DO THE IO
; ;
; ;
; ;
SCSI_WRITE: SCSI_WRITE:
CALL HB_DSKWRITE ; HOOK HBIOS DISK WRITE SUPERVISOR CALL HB_DSKWRITE ; HOOK HBIOS DISK WRITE SUPERVISOR
LD A,SCSI_CMD_WRITE ; SETUP WRITE COMMAND
LD E,SCSI_CMD_WRITE ; SETUP WRITE COMMAND
JP SCSI_IO ; DO THE IO JP SCSI_IO ; DO THE IO
; ;
; ;
@ -362,8 +366,23 @@ SCSI_INITDEV:
; ;
; ;
SCSI_IO: SCSI_IO:
;
#IF (ESPSDTRACE == 1)
PUSH HL
LD HL,SCSI_PRTERR ; SET UP ESPSD_PRTERR
EX (SP),HL ; ... TO FILTER ALL EXITS
#ENDIF
;
LD (SCSI_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS LD (SCSI_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
PUSH DE ; SAVE COMMAND BYTE
PUSH HL ; SAVE BUFFER ADDRESS
CALL SCSI_CHKERR ; CHECK FOR ERR STATUS AND RESET IF SO
POP HL ; RESTORE BUFFER ADDRESS
POP DE ; RESTORE COMMAND BYTE
RET NZ ; BAIL OUT ON ERROR
;
; SETUP SCSI COMMAND ; SETUP SCSI COMMAND
LD A,E
LD (SCSI_S_CDB),A ; SET SCSI COMMAND LD (SCSI_S_CDB),A ; SET SCSI COMMAND
; SETUP DISK BUFFER POINTERS ; SETUP DISK BUFFER POINTERS
LD (SCSI_BUF_OUT),HL ; INPUT BUFFER LD (SCSI_BUF_OUT),HL ; INPUT BUFFER
@ -386,12 +405,7 @@ SCSI_IO:
LD A,(IY+SCSI_LBA+0) ; LBA MID LD A,(IY+SCSI_LBA+0) ; LBA MID
LD (SCSI_CUR_LBN+1),A ; PUT IN CDB LD (SCSI_CUR_LBN+1),A ; PUT IN CDB
; DO THE SCSI TRANSACTION ; DO THE SCSI TRANSACTION
PUSH IX ; SAVE IX
LD IX,SCSI_S_IOT ; SET POINTER
CALL SCSI_GO ; DO THE SCSI TRANSACTION CALL SCSI_GO ; DO THE SCSI TRANSACTION
POP IX ; RESTORE IX
AND %00111110 ; IGNORE RESERVED BITS OF STATUS
CALL NZ,SCSI_IOERR ; DIAGNOSE/RECORD ERRORS
JR NZ,SCSI_IO1 ; IF ERROR, SKIP INCREMENT JR NZ,SCSI_IO1 ; IF ERROR, SKIP INCREMENT
; INCREMENT LBA ; INCREMENT LBA
LD A,SCSI_LBA ; LBA OFFSET LD A,SCSI_LBA ; LBA OFFSET
@ -410,12 +424,14 @@ SCSI_IO1:
OR A ; SET FLAGS OR A ; SET FLAGS
RET ; AND DONE RET ; AND DONE
; ;
; CHECK FOR DEVICE EXISTENCE
; CHECK CURRENT DEVICE FOR ERROR STATUS AND ATTEMPT TO RECOVER
; VIA RESET IF DEVICE IS IN ERROR.
; ;
SCSI_TSTRDY:
XOR A ; SIGNAL SUCCESS
SCSI_CHKERR:
LD A,(IY+SCSI_STAT) ; GET STATUS
OR A ; SET FLAGS
CALL NZ,SCSI_RESET ; IF ERROR STATUS, RESET BUS
RET RET
; ;
; ISSUE SCSI INQUIRY COMMAND ; ISSUE SCSI INQUIRY COMMAND
; ON INPUT, HL POINTS TO OUTPUT DATA BUFFER ; ON INPUT, HL POINTS TO OUTPUT DATA BUFFER
@ -434,13 +450,7 @@ SCSI_INQUIRY:
RRCA ; ... RRCA ; ...
LD (SCSI_INQ_LUN),A ; PUT IN INQ CDB LD (SCSI_INQ_LUN),A ; PUT IN INQ CDB
; DO THE SCSI TRANSACTION ; DO THE SCSI TRANSACTION
PUSH IX ; SAVE IX
LD IX,SCSI_S_IOT ; SET POINTER
CALL SCSI_GO ; DO THE SCSI TRANSACTION
POP IX ; RESTORE IX
AND %00111110 ; IGNORE RESERVED BITS OF STATUS
JP NZ,SCSI_IOERR ; HANDLE ERROR
RET ; DONE
JP SCSI_GO ; DO THE SCSI TRANSACTION
; ;
; ISSUE SCSI CAPACITY COMMAND AND CAPTURE ; ISSUE SCSI CAPACITY COMMAND AND CAPTURE
; RESULTS AS DEVICE CAPACITY ; RESULTS AS DEVICE CAPACITY
@ -460,12 +470,8 @@ SCSI_CAPACITY:
RRCA ; ... RRCA ; ...
LD (SCSI_CAP_LUN),A ; PUT IN INQ CDB LD (SCSI_CAP_LUN),A ; PUT IN INQ CDB
; DO THE SCSI TRANSACTION ; DO THE SCSI TRANSACTION
PUSH IX ; SAVE IX
LD IX,SCSI_S_IOT ; SET POINTER
CALL SCSI_GO ; DO THE SCSI TRANSACTION CALL SCSI_GO ; DO THE SCSI TRANSACTION
POP IX ; RESTORE IX
AND %00111110 ; IGNORE RESERVED BITS OF STATUS
JP NZ,SCSI_IOERR ; HANDLE ERROR
RET NZ ; ABORT ON ERROR
; ;
; RETURNED LBA IS BIG ENDIAN. CONVERT TO A STANDARD 32-BIT ; RETURNED LBA IS BIG ENDIAN. CONVERT TO A STANDARD 32-BIT
; INTEGER IN DE:HL ; INTEGER IN DE:HL
@ -501,35 +507,22 @@ SCSI_CAPACITY:
; COMMAND PROCESSING ; COMMAND PROCESSING
;============================================================================= ;=============================================================================
; ;
;----------------------------------------------------------------
;WRITE LOGICAL BLOCK TO DISK
;CUR_TID,CUR_LUN,CUR_LBN ALREADY SET
;EXIT WITH ZERO STATUS IF OK
;----------------------------------------------------------------
; WRAPPER FOR HBIOS INVOCATION
; ;
WR_PHY:
LD A,0AH ;WRITE COMMAND
JR PHY_COM ;FINISH SAME AS READ
;----------------------------------------------------------------
;READ LOGICAL BLOCK FROM DISK
;CUR_TID,CUR_LUN,CUR_LBN ALREADY SET
;EXIT WITH ZERO STATUS IF OK
;----------------------------------------------------------------
SCSI_GO:
PUSH IX ; PRESERVE IX
LD IX,SCSI_S_IOT ; POINT TO IO TABLE
CALL SCSI_GO1 ; RUN THE TRANSACTION
POP IX ; RESTORE IX
AND %00111110 ; IGNORE RESERVED BITS OF STATUS
JP NZ,SCSI_IOERR ; HANDLE ERROR
RET ; DONE
; ;
RD_PHY:
LD A,8 ;READ COMMAND
PHY_COM:
LD (SCSI_S_CDB),A ;SET IN COMMAND BLOCK
LD IX,SCSI_S_IOT ;POINT TO IO TABLE
CALL SCSI_GO
AND 02H ;MASK TO ERROR BIT
RET
;------------------------------------------------------------------------------- ;-------------------------------------------------------------------------------
;DO SCSI TRANSACTION ;DO SCSI TRANSACTION
; IX=SCSI IO BLOCK
;------------------------------------------------------------------------------- ;-------------------------------------------------------------------------------
SCSI_GO:
;
SCSI_GO1:
LD A,$FF ;PRESET ERROR STATUS LD A,$FF ;PRESET ERROR STATUS
LD L,(IX+4) ;POINT TO STATUS ADDRESS LD L,(IX+4) ;POINT TO STATUS ADDRESS
LD H,(IX+5) ;POINT TO STATUS ADDRESS LD H,(IX+5) ;POINT TO STATUS ADDRESS

2
Source/ver.inc

@ -2,7 +2,7 @@
#DEFINE RMN 6 #DEFINE RMN 6
#DEFINE RUP 0 #DEFINE RUP 0
#DEFINE RTP 0 #DEFINE RTP 0
#DEFINE BIOSVER "3.6.0-dev.46"
#DEFINE BIOSVER "3.6.0-dev.47"
#define rmj RMJ #define rmj RMJ
#define rmn RMN #define rmn RMN
#define rup RUP #define rup RUP

2
Source/ver.lib

@ -3,5 +3,5 @@ rmn equ 6
rup equ 0 rup equ 0
rtp equ 0 rtp equ 0
biosver macro biosver macro
db "3.6.0-dev.46"
db "3.6.0-dev.47"
endm endm

Loading…
Cancel
Save