Browse Source

Disk Driver Multi-Sector I/O

Added multi-sector I/O to all disk drivers.
Added SMB variant to PPIDE driver.
pull/5/head
Wayne Warthen 8 years ago
parent
commit
c9869344e2
  1. 18
      Source/HBIOS/API.txt
  2. 1
      Source/HBIOS/Config/RC_std.asm
  3. 9
      Source/HBIOS/dbgmon.asm
  4. 69
      Source/HBIOS/fd.asm
  5. 37
      Source/HBIOS/hbios.asm
  6. 141
      Source/HBIOS/hdsk.asm
  7. 58
      Source/HBIOS/ide.asm
  8. 57
      Source/HBIOS/ppide.asm
  9. 894
      Source/HBIOS/romldr.asm
  10. 70
      Source/HBIOS/sd.asm
  11. 3
      Source/HBIOS/std.asm
  12. 23
      Source/HBIOS/util.asm

18
Source/HBIOS/API.txt

@ -185,17 +185,23 @@ SEEK ($12):
CHS: D:0-6=Head,E=Sector,HL=Track
LBA: DE:HL
Update target CHS or LBA for next I/O request on designated unit.
Physical seek is typically deferred until subsequent I/O operation.
Seek function establishes current sector for next I/O function for the specified
unit and invalidates the current sector for all other units. A seek must precede
read/write/verify function calls. Physical seek is typically deferred until
subsequent I/O operation.
READ ($13) / WRITE ($14) / VERIFY ($15):
BC=Function/Unit A=Result
HL=Buffer Address
HL=Buffer Address E=Blocks Read
E=Block Count
Read, write, or verify sectors starting at current target sector. Current
target sector is incremented on each successful operation. On error,
target sector is sector where error occurred.
Read, write, or verify block count sectors to buffer address starting at current target
sector. Current sector must be established by prior seek function; however, multiple
read/write/verify function calls can be made after a seek function. Current sector is
incremented after each sector successfully read. On error, current sector is sector is
sector where error occurred. Blocks read indicates number of sectors successfully read.
Caller must ensure buffer address is large enough to contain data for all sectors
requested.
FORMAT ($16):
BC=Function/Unit A=Result

1
Source/HBIOS/Config/RC_std.asm

@ -14,3 +14,4 @@ ACIAENABLE .SET TRUE ; TRUE TO AUTO-DETECT MOTOROLA 6850 ACIA
;
IDEENABLE .SET TRUE ; TRUE FOR IDE DEVICE SUPPORT (CF MODULE)
PPIDEENABLE .SET FALSE ; TRUE FOR PPIDE DEVICE SUPPORT (PPIDE MODULE)
PPIDEMODE .SET PPIDEMODE_RC ; TYPE OF CF MODULE: PPIDEMODE_RC, PPIDEMODE_SMB

9
Source/HBIOS/dbgmon.asm

@ -48,6 +48,7 @@ BS: .EQU 08H ; ASCII BACKSPACE CHARACTER
;
DSKY_ENTRY:
LD SP,MON_STACK ; SET THE STACK POINTER
EI ; INTS OK NOW
CALL INITIALIZE ; INITIALIZE SYSTEM
;__FRONT_PANEL_STARTUP________________________________________________________
@ -542,6 +543,7 @@ DSKY_ENTRY:
;
UART_ENTRY:
LD SP,MON_STACK ; SET THE STACK POINTER
EI ; INTS OK NOW
CALL INITIALIZE ; INITIALIZE SYSTEM
XOR A ;ZERO OUT ACCUMULATOR (ADDED)
@ -1403,6 +1405,13 @@ GOCPM:
;
INITIALIZE:
; CALL CIOCON_DISP + (CF_INIT * 3)
#IF (PLATFORM == PLT_UNA)
; INSTALL UNA INVOCATION VECTOR FOR RST 08
LD A,$C3 ; JP INSTRUCTION
LD (8),A ; STORE AT 0x0008
LD HL,($FFFE) ; UNA ENTRY VECTOR
LD (9),HL ; STORE AT 0x0009
#ENDIF
RET
;

69
Source/HBIOS/fd.asm

@ -790,16 +790,72 @@ FD_SEEK:
FD_READ:
LD (FD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
LD A,DOP_READ
JR FD_RUN
JR FD_RW
;
FD_WRITE:
LD (FD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
LD A,DOP_WRITE
JR FD_RUN
JR FD_RW
;
FD_RW:
LD (FCD_DOP),A ; SAVE REQUESTED DISK OPERATION
LD A,E ; BLOCK COUNT TO A
OR A ; SET FLAGS
RET Z ; ZERO SECTOR I/O, RETURN W/ E=0 & A=0
LD B,A ; INIT SECTOR DOWNCOUNTER
LD C,0 ; INIT SECTOR READ/WRITE COUNT
PUSH BC ; SAVE COUNTERS
CALL FD_GEOM ; E := SPT, D := HDS
POP BC ; RESTORE COUNTERS
JR NZ,FD_RW4 ; BAIL OUT ON ERROR
RES 7,D ; MAKE SURE LBA BIT IS CLEARED
LD (FD_CURGEOM),DE ; SAVE AS FD_CURSPT & FD_CURHDS
FD_RW1:
PUSH BC ; SAVE COUNTERS
CALL FD_RUN ; PERFORM SECTOR READ/WRITE
JR NZ,FD_RW3 ; IF ERROR, SKIP INCREMENT
; INCREMENT SECTOR AND CHECK FOR TRACK OVERFLOW
LD HL,HSTSEC ; POINT TO CURRENT SECTOR
INC (HL) ; INCREMENT SECTOR
LD A,(FD_CURSPT) ; A := SECTORS PER TRACK
CP (HL) ; COMPARE SPT TO CURRENT SECTOR
JR NZ,FD_RW2 ; IF NO OVERFLOW, DONE
; RESET SECTOR, INCREMENT HEAD, AND CHECK FOR CYLINDER OVERFLOW
LD (HL),0 ; RESET SECTOR TO ZERO
LD HL,HSTHEAD ; POINT TO CURRENT HEAD
INC (HL) ; INCREMENT HEAD
LD A,(FD_CURHDS) ; A : = HEADS
CP (HL) ; COMPARE HEADS TO CUR HEAD
JR NZ,FD_RW2 ; IF NO OVERFLOW, DONE
; RESET HEAD AND INCREMENT TRACK
LD (HL),0 ; RESET HEAD TO ZERO
LD HL,(HSTTRK) ; GET CURRENT TRACK
INC HL ; INCREMENT
LD (HSTTRK),HL ; AND SAVE IT
FD_RW2:
LD HL,FD_DSKBUF+1 ; POINT TO MSB OF BUFFER ADR
INC (HL) ; BUMP DMA BY
INC (HL) ; ... 512 BYTES
XOR A ; SIGNAL SUCCESS
FD_RW3:
POP BC ; RECOVER COUNTERS
JR NZ,FD_RW4 ; IF ERROR, BAIL OUT
INC C ; BUMP COUNT OF SECTORS READ
DJNZ FD_RW1 ; LOOP AS NEEDED
FD_RW4:
LD E,C ; SECTOR READ COUNT TO E
LD HL,(FD_DSKBUF) ; CURRENT DMA TO HL
OR A ; SET FLAGS BASED ON RETURN CODE
RET ; AND RETURN, A HAS RETURN CODE
;
FD_RUN:
LD (FCD_DOP),A
; UPDATE DRIVE SELECTION
;LD A,(HSTDSK) ; GET THE NEW DRIVE SELECTION
;AND 0FH
@ -1868,4 +1924,7 @@ FDDS_MEDIAADR .DW 0 ; POINTER TO FDCUXMEDIA ABOVE
; GENERAL WORKING STORAGE
;
FD_UNIT .DB 0
FD_DSKBUF .DW 0
FD_DSKBUF .DW 0
FD_CURGEOM .EQU $ ; TWO BYTES BELOW
FD_CURSPT .DB 0 ; CURRENT SECTORS PER TRACK
FD_CURHDS .DB 0 ; CURRENT HEADS

37
Source/HBIOS/hbios.asm

@ -768,24 +768,6 @@ HB_START1: ; BNKCALL ARRIVES HERE, BUT NOW RUNNING IN RAM BANK
;
; ANNOUNCE HBIOS
;
CALL NEWLINE2
PRTX(STR_BANNER)
; CALL PC_SPACE
; LD BC,(X1)
; CALL PRTHEXWORD
; CALL PC_SPACE
; LD BC,(X2)
; CALL PRTHEXWORD
; CALL PC_SPACE
; LD BC,(X3)
; CALL PRTHEXWORD
; CALL PC_SPACE
; LD BC,(X4)
; CALL PRTHEXWORD
;
; IO PORT SCAN
@ -1007,13 +989,6 @@ INITSYS3:
;
CALL PRTSUM ; PRINT UNIT/DEVICE SUMMARY TABLE
;
;
;
; CALL TSTPT
; LD HL,($FF00 + 2)
; CALL JPHL
; CALL TSTPT
;
; CHAIN TO OS LOADER
;
#IFDEF ROMBOOT
@ -1037,17 +1012,7 @@ INITSYS3:
LD HL,0 ; ENTER AT ADDRESS 0
CALL HBX_BNKCALL ; GO THERE
HALT ; WE SHOULD NEVER COME BACK!
; ; SLIDE OS IMAGES BLOB DOWN TO $0000
; LD HL,LDR_END ; SOURCE IS LOADER END
; LD BC,HB_END ; PLUS HBIOS IMAGE SIZE
; ADD HL,BC ; FINAL SOURCE ADDRESS
; LD DE,0 ; TARGET ADDRESS IS ZERO
; LD BC,BNKTOP ; MAX SIZE OF OS IMAGES
; LDIR ; DO IT
; ; JUMP TO START
; JP 0 ; AND CHAIN
;
#ENDIF
;
RET

141
Source/HBIOS/hdsk.asm

@ -99,8 +99,7 @@ HDSK_STATUS:
;
;
HDSK_RESET:
XOR A ; ALWAYS OK
RET
JP HDSK_DSKRESET
;
; GET DISK CAPACITY
; RETURN DE:HL=BLOCK COUNT, BC=BLOCK SIZE
@ -158,92 +157,103 @@ HDSK_SEEK:
;
;
HDSK_READ:
LD (HDSK_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
LD A,HDSK_CMDREAD
JR HDSK_RW
;
;
;
HDSK_WRITE:
LD (HDSK_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
LD A,HDSK_CMDWRITE
JR HDSK_RW
;
;
;
HDSK_RW:
LD (HDSK_CMD),A
; CLEAR RESULTS
XOR A ; A = 0
LD (HDSK_RC),A ; CLEAR RETURN CODE
LD (HDSK_CMD),A ; SET COMMAND BYTE
LD (HDSK_DMA),HL ; SAVE INITIAL DMA
LD A,E ; SECTOR COUNT TO A
OR A ; SET FLAGS
RET Z ; ZERO SECTOR I/O, RETURN W/ E=0 & A=0
LD B,A ; INIT SECTOR DOWNCOUNTER
LD C,0 ; INIT SECTOR READ/WRITE COUNT
LD A,(HDSK_UNIT) ; GET UNIT
;AND $0F
LD (HDSK_DEV),A ; ... AND SAVE IT
; INIT IF NEEDED
; RESET HDSK INTERFACE IF NEEDED
LD A,(HDSK_STAT) ; GET CURRENT STATUS
OR A ; SET FLAGS
PUSH BC ; SAVE COUNTERS
CALL NZ,HDSK_DSKRESET ; RESET IF NOT READY
POP BC ; RESTORE COUNTERS
JR NZ,HDSK_RW6 ; ABORT ON FAILURE
HDSK_RW0:
PUSH BC ; SAVE COUNTERS
XOR A ; A = 0
LD (HDSK_RC),A ; CLEAR RETURN CODE
; CONVERT LBA HHHH:LLLL (4 BYTES)
; TO HDSK TRACK/SECTOR TTTT:SS (3 BYTES)
; SAVING TO HDSK PARM BLOCK
LD A,(HSTLBA) ; LSB OF LBA
LD (HDSK_SEC),A ; ... SAVED TO SECTOR
LD HL,(HSTLBA+1) ; 2 MIDDLE BYTES OF LBA
LD (HDSK_TRK),HL ; ... SAVE TO TRACK
; SET DEVICE
LD A,(HDSK_UNIT)
;AND $0F
LD (HDSK_DEV),A
; EXECUTE COMMAND
LD B,7 ; SIZE OF PARAMETER BLOCK
LD HL,HDSK_PARMBLK ; ADDRESS OF PARAMETER BLOCK
LD C,$FD ; HDSK CMD PORT
OTIR ; SEND IT
; ; INCOMING TRK:SEC ACTUALLY REPRESENTS 32 BIT LBA
; ; MAP TRK:SEC TO HDSK DRIVER AS TTSS:SS
;
; LD A,(HSTTRK) ; LSB OF TRACK
; LD (HDSK_TRK + 1),A ; MAPS TO MSB OF HDSK TRK
; LD A,(HSTSEC + 1) ; MSB OF SECTOR
; LD (HDSK_TRK),A ; MAPS TO LSB OF HDSK TRK
; LD A,(HSTSEC) ; LSB OF SECTOR
; LD (HDSK_SEC),A ; MAPS TO LSB OF HDSK SEC
; INCOMING ADDRESS IS LBA
; MAP HHHH:LLLL TO HDSK DRIVER AS HHLL:LL
; GET RESULT
IN A,(C) ; GET RESULT CODE
LD (HDSK_RC),A ; SAVE IT
OR A ; SET FLAGS
LD A,(HSTLBAHI) ; LSB OF LBA HIGH
LD (HDSK_TRK + 1),A ; MAPS TO MSB OF HDSK TRK
LD A,(HSTLBALO + 1) ; MSB OF LBA LOW
LD (HDSK_TRK),A ; MAPS TO LSB OF HDSK TRK
LD A,(HSTLBALO) ; LSB OF LBA LOW
LD (HDSK_SEC),A ; MAPS TO LSB OF HDSK SEC
#IF (HDSKTRACE > 0)
PUSH AF ; SAVE RETURN CODE
#IF (HDSKTRACE == 1)
CALL NZ,HDSK_PRT ; DIAGNOSE ERRORS ONLY
#ENDIF
#IF (HDSKTRACE >= 2)
CALL HDSK_PRT ; DISPLAY ALL READ/WRITE RESULTS
#ENDIF
POP AF ; RESTORE RETURN CODE
#ENDIF
; SET TRANSFER ADDRESS
LD BC,(HDSK_DSKBUF)
LD (HDSK_DMA),BC
JR NZ,HDSK_RW5 ; BAIL OUT ON ERROR
; EXECUTE COMMAND
LD B,7 ; SIZE OF PARAMETER BLOCK
LD HL,HDSK_PARMBLK ; START ADDRESS OF PARAMETER BLOCK
HDSK_RW1:
LD A,(HL) ; GET BYTE OF PARAMETER BLOCK
OUT ($FD),A ; SEND IT TO PORT
INC HL ; POINT TO NEXT BYTE
DJNZ HDSK_RW1
; INCREMENT LBA
LD HL,HSTLBA
PUSH HL
CALL LD32
CALL INC32
POP BC
CALL ST32
; INCREMENT DMA
LD HL,HDSK_DMA+1 ; POINT TO MSB OF DMA
INC (HL) ; BUMP DMA BY
INC (HL) ; ... 512 BYTES
XOR A ; A := 0 SIGNALS SUCCESS
IN A,($FD) ; GET RESULT CODE
LD (HDSK_RC),A
OR A
JR Z,HDSK_OK
JR HDSK_ERR
HDSK_RW5:
HDSK_ERR:
XOR A
DEC A ; A=$FF TO SIGNAL ERROR
LD (HDSK_STAT),A ; SAVE IT
#IF (HDSKTRACE >= 1)
PUSH AF
CALL HDSK_PRT
POP AF
#ENDIF
RET
POP BC ; RECOVER COUNTERS
JR NZ,HDSK_RW6 ; IF ERROR, GET OUT
INC C ; RECORD SECTOR COMPLETED
DJNZ HDSK_RW0 ; LOOP AS NEEDED
HDSK_OK:
#IF (HDSKTRACE >= 2)
CALL HDSK_PRT
#ENDIF
XOR A
RET
HDSK_RW6:
; RETURN WITH SECTORS READ IN E AND UPDATED DMA ADDRESS IN HL
LD E,C ; SECTOR READ COUNT TO E
LD HL,(HDSK_DMA) ; CURRENT DMA TO HL
OR A ; SET FLAGS BASED ON RETURN CODE
RET ; AND RETURN, A HAS RETURN CODE
;
;
;
@ -323,7 +333,7 @@ HDSK_PRTRW:
LD A,(HDSK_SEC)
CALL PRTHEXBYTE
CALL PC_SPACE
LD BC,(HDSK_DSKBUF)
LD BC,(HDSK_DMA)
CALL PRTHEXWORD
CALL PC_SPACE
@ -373,7 +383,6 @@ HDSK_STAT .DB 0
HDSK_RC .DB 0
;
HDSK_UNIT .DB 0
HDSK_DSKBUF .DW 0
;
HDSK_PARMBLK:
HDSK_CMD .DB 0 ; COMMAND (HDSK_READ, HDSK_WRITE, ...)

58
Source/HBIOS/ide.asm

@ -400,23 +400,60 @@ IDE_DEFMED:
;
IDE_READ:
LD (IDE_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
#IF (IDETRACE == 1)
LD HL,IDE_PRTERR ; SET UP IDE_PRTERR
PUSH HL ; ... TO FILTER ALL EXITS
#ENDIF
CALL IDE_SELUNIT ; HARDWARE SELECTION OF TARGET UNIT
JP IDE_RDSEC
LD HL,IDE_RDSEC ; GET ADR OF SECTOR READ FUNC
LD (IDE_IOFNADR),HL ; SAVE IT AS PENDING IO FUNC
JR IDE_IO ; CONTINUE TO GENERIC IO ROUTINE
;
;
;
IDE_WRITE:
LD (IDE_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
LD HL,IDE_WRSEC ; GET ADR OF SECTOR WRITE FUNC
LD (IDE_IOFNADR),HL ; SAVE IT AS PENDING IO FUNC
JR IDE_IO ; CONTINUE TO GENERIC IO ROUTINE
;
;
;
IDE_IO:
LD A,E ; BLOCK COUNT TO A
OR A ; SET FLAGS
RET Z ; ZERO SECTOR I/O, RETURN W/ E=0 & A=0
LD B,A ; INIT SECTOR DOWNCOUNTER
LD C,0 ; INIT SECTOR READ/WRITE COUNT
#IF (IDETRACE == 1)
LD HL,IDE_PRTERR ; SET UP IDE_PRTERR
PUSH HL ; ... TO FILTER ALL EXITS
#ENDIF
PUSH BC ; SAVE COUNTERS
CALL IDE_SELUNIT ; HARDWARE SELECTION OF TARGET UNIT
JP IDE_WRSEC
CALL IDE_CHKDEVICE ; CHECK DEVICE AND CLEAR STATUS
POP BC ; RESTORE COUNTERS
RET NZ
IDE_IO1:
PUSH BC ; SAVE COUNTERS
LD HL,(IDE_IOFNADR) ; GET PENDING IO FUNCTION ADDRESS
CALL JPHL ; ... AND CALL IT
JR NZ,IDE_IO2 ; IF ERROR, SKIP INCREMENT
LD HL,HSTLBA ; POINT TO 32-BIT CURRENT LBA
PUSH HL ; SAVE POINTER
CALL LD32 ; LOAD 32-BIT LBA INTO DE:HL
CALL INC32 ; INCREMENT LBA FOR NEXT I/O
POP BC ; RECOVER LBA POINTER INTO BC
CALL ST32 ; AND SAVE IT
LD HL,IDE_DSKBUF+1 ; POINT TO MSB OF BUFFER ADR
INC (HL) ; BUMP DMA BY
INC (HL) ; ... 512 BYTES
XOR A ; SIGNAL SUCCESS
IDE_IO2:
POP BC ; RECOVER COUNTERS
JR NZ,IDE_IO3 ; IF ERROR, BAIL OUT
INC C ; BUMP COUNT OF SECTORS READ
DJNZ IDE_IO1 ; LOOP AS NEEDED
IDE_IO3:
LD E,C ; SECTOR READ COUNT TO E
LD HL,(IDE_DSKBUF) ; CURRENT DMA TO HL
OR A ; SET FLAGS BASED ON RETURN CODE
RET ; AND RETURN, A HAS RETURN CODE
;
;
;
@ -453,7 +490,7 @@ IDE_MEDIA:
IDE_DPTR(IDE_STAT) ; POINT TO UNIT STATUS
LD A,(HL) ; GET STATUS
OR A ; SET FLAGS
JR NZ,IDE_MEDIA1 ; ERROR ACTIVE, TO RIGHT TO RESET
JR NZ,IDE_MEDIA1 ; ERROR ACTIVE, GO RIGHT TO RESET
;
; USE IDENTIFY COMMAND TO CHECK DEVICE
LD HL,IDE_TIMEOUT ; POINT TO TIMEOUT
@ -556,8 +593,6 @@ IDE_IDENTIFY:
;
;
IDE_RDSEC:
CALL IDE_CHKDEVICE
RET NZ
;
#IF (IDETRACE >= 3)
CALL IDE_PRTPREFIX
@ -578,8 +613,6 @@ IDE_RDSEC:
;
;
IDE_WRSEC:
CALL IDE_CHKDEVICE
RET NZ
;
#IF (IDETRACE >= 3)
CALL IDE_PRTPREFIX
@ -1268,6 +1301,7 @@ IDE_TIMEOUT .DB IDE_TONORM ; WAIT FUNCS TIMEOUT IN TENTHS OF SEC
IDE_TOSCALER .DW CPUMHZ * 961 ; WAIT FUNCS SCALER FOR CPU SPEED
;
IDE_CMD .DB 0 ; PENDING COMMAND TO PROCESS
IDE_IOFNADR .DW 0 ; PENDING IO FUNCTION ADDRESS
IDE_DRVHD .DB 0 ; CURRENT DRIVE/HEAD MASK
;
IDE_UNIT .DB 0 ; ACTIVE UNIT, DEFAULT TO ZERO

57
Source/HBIOS/ppide.asm

@ -17,6 +17,10 @@ PPIDE_IO_BASE .EQU $60
PPIDE_IO_BASE .EQU $20
#ENDIF
;
#IF (PPIDEMODE == PPIDEMODE_SMB)
PPIDE_IO_BASE .EQU $E0
#ENDIF
;
#IF (PPIDEMODE == PPIDEMODE_MFP)
PPIDE_IO_BASE .EQU $44
#ENDIF
@ -414,23 +418,61 @@ PPIDE_DEFMED:
;
PPIDE_READ:
LD (PPIDE_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
#IF (PPIDETRACE == 1)
LD HL,PPIDE_PRTERR ; SET UP PPIDE_PRTERR
PUSH HL ; ... TO FILTER ALL EXITS
#ENDIF
CALL PPIDE_SELUNIT ; HARDWARE SELECTION OF TARGET UNIT
JP PPIDE_RDSEC
LD HL,PPIDE_RDSEC ; GET ADR OF SECTOR READ FUNC
LD (PPIDE_IOFNADR),HL ; SAVE IT AS PENDING IO FUNC
JR PPIDE_IO ; CONTINUE TO GENERIC IO ROUTINE
;
;
;
PPIDE_WRITE:
LD (PPIDE_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
LD HL,PPIDE_WRSEC ; GET ADR OF SECTOR WRITE FUNC
LD (PPIDE_IOFNADR),HL ; SAVE IT AS PENDING IO FUNC
JR PPIDE_IO ; CONTINUE TO GENERIC IO ROUTINE
;
;
;
PPIDE_IO:
LD A,E ; BLOCK COUNT TO A
OR A ; SET FLAGS
RET Z ; ZERO SECTOR I/O, RETURN W/ E=0 & A=0
LD B,A ; INIT SECTOR DOWNCOUNTER
LD C,0 ; INIT SECTOR READ/WRITE COUNT
#IF (PPIDETRACE == 1)
LD HL,PPIDE_PRTERR ; SET UP PPIDE_PRTERR
PUSH HL ; ... TO FILTER ALL EXITS
#ENDIF
PUSH BC ; SAVE COUNTERS
CALL PPIDE_SELUNIT ; HARDWARE SELECTION OF TARGET UNIT
JP PPIDE_WRSEC
CALL PPIDE_CHKDEVICE ; CHECK DEVICE AND CLEAR STATUS
POP BC ; RESTORE COUNTERS
RET NZ
PPIDE_IO1:
PUSH BC ; SAVE COUNTERS
LD HL,(PPIDE_IOFNADR) ; GET PENDING IO FUNCTION ADDRESS
CALL JPHL ; ... AND CALL IT
CALL PPIDE_RDSEC ; READ NEXT SECTOR
JR NZ,PPIDE_IO2 ; IF ERROR, SKIP INCREMENT
LD HL,HSTLBA ; POINT TO 32-BIT CURRENT LBA
PUSH HL ; SAVE POINTER
CALL LD32 ; LOAD 32-BIT LBA INTO DE:HL
CALL INC32 ; INCREMENT LBA FOR NEXT I/O
POP BC ; RECOVER LBA POINTER INTO BC
CALL ST32 ; AND SAVE IT
LD HL,PPIDE_DSKBUF+1 ; POINT TO MSB OF BUFFER ADR
INC (HL) ; BUMP DMA BY
INC (HL) ; ... 512 BYTES
XOR A ; SIGNAL SUCCESS
PPIDE_IO2:
POP BC ; RECOVER COUNTERS
JR NZ,PPIDE_IO3 ; IF ERROR, BAIL OUT
INC C ; BUMP COUNT OF SECTORS READ
DJNZ PPIDE_IO1 ; LOOP AS NEEDED
PPIDE_IO3:
LD E,C ; SECTOR READ COUNT TO E
LD HL,(PPIDE_DSKBUF) ; CURRENT DMA TO HL
OR A ; SET FLAGS BASED ON RETURN CODE
RET ; AND RETURN, A HAS RETURN CODE
;
;
;
@ -1424,6 +1466,7 @@ PPIDE_TIMEOUT .DB PPIDE_TONORM ; WAIT FUNCS TIMEOUT IN TENTHS OF SEC
PPIDE_TOSCALER .DW CPUMHZ * 218 ; WAIT FUNCS SCALER FOR CPU SPEED
;
PPIDE_CMD .DB 0 ; PENDING COMMAND TO PROCESS
PPIDE_IOFNADR .DW 0 ; PENDING IO FUNCTION ADDRESS
PPIDE_DRVHD .DB 0 ; CURRENT DRIVE/HEAD MASK
;
PPIDE_UNIT .DB 0 ; ACTIVE UNIT, DEFAULT TO ZERO

894
Source/HBIOS/romldr.asm

File diff suppressed because it is too large

70
Source/HBIOS/sd.asm

@ -503,30 +503,66 @@ SD_DEFMED:
;
;
SD_READ:
LD (SD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
#IF (SDTRACE == 1)
LD HL,SD_PRTERR ; SET UP SD_PRTERR
PUSH HL ; ... TO FILTER ALL EXITS
#ENDIF
CALL SD_SELUNIT
; READ A SECTOR
LD C,SD_CMD_READ_SNGL_BLK ; SET READ_SINGLE_BLOCK COMMAND
JP SD_SECTIO ; DO SECTOR I/O
LD A,SD_CMD_READ_SNGL_BLK ; SETUP FOR SINGLE BLOCK READ CMD
JR SD_IO ; CONTINUE TO GENERIC IO ROUTINE
;
;
;
SD_WRITE:
LD A,SD_CMD_WRITE_BLOCK ; SETUP FOR BLOCK WRITE CMD
JR SD_IO ; CONTINUE TO GENERIC IO ROUTINE
;
;
;
SD_IO:
LD (SD_CMDVAL),A ; SAVE THE SD CARD COMMAND
LD A,E ; GET BLOCK COUNT REQUESTED
LD (SD_BLKCNT),A ; ... AND SAVE IT
LD (SD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
#IF (SDTRACE == 1)
#IF (IDETRACE == 1)
LD HL,SD_PRTERR ; SET UP SD_PRTERR
PUSH HL ; ... TO FILTER ALL EXITS
#ENDIF
CALL SD_SELUNIT
CALL SD_CHKWP ; CHECK FOR WRITE PROTECT
JP NZ,SD_WRTPROT ; HANDLE IT IF SO
; WRITE A SECTOR
LD C,SD_CMD_WRITE_BLOCK ; SET WRITE_BLOCK COMMAND
JP SD_SECTIO ; DO SECTOR I/O
CALL SD_SELUNIT ; HARDWARE SELECTION OF TARGET UNIT
RET NZ ; ABORT ON ERROR
LD A,(SD_CMDVAL) ; GET COMMAND VALUE
CP SD_CMD_READ_SNGL_BLK ; IS THIS A READ?
CALL NZ,SD_CHKWP ; CHECK FOR WRITE PROTECT IF NOT A READ
JP NZ,SD_WRTPROT ; HANDLE WRITE PROTECT ERR
LD A,(SD_BLKCNT) ; BLOCK COUNT TO A
LD E,A ; ... AND TO E IN CASE OF ZERO ERR BELOW
OR A ; SET FLAGS
RET Z ; ZERO SECTOR I/O, RETURN W/ E=0 & A=0
LD B,A ; INIT SECTOR DOWNCOUNTER
LD C,0 ; INIT SECTOR READ/WRITE COUNT
SD_IO1:
PUSH BC ; SAVE COUNTERS
LD A,(SD_CMDVAL) ; SET COMMAND
LD C,A ; ... AND PUT IN C
CALL SD_SECTIO ; DO SECTOR I/O
JR NZ,SD_IO2 ; IF ERROR, SKIP INCREMENT
LD HL,HSTLBA ; POINT TO 32-BIT CURRENT LBA
PUSH HL ; SAVE POINTER
CALL LD32 ; LOAD 32-BIT LBA INTO DE:HL
CALL INC32 ; INCREMENT LBA FOR NEXT I/O
POP BC ; RECOVER LBA POINTER INTO BC
CALL ST32 ; AND SAVE IT
LD HL,SD_DSKBUF+1 ; POINT TO MSB OF BUFFER ADR
INC (HL) ; BUMP DMA BY
INC (HL) ; ... 512 BYTES
XOR A ; SIGNAL SUCCESS
SD_IO2:
POP BC ; RECOVER COUNTERS
JR NZ,SD_IO3 ; IF ERROR, BAIL OUT
INC C ; BUMP COUNT OF SECTORS READ
DJNZ SD_IO1 ; LOOP AS NEEDED
SD_IO3:
LD E,C ; SECTOR READ COUNT TO E
LD HL,(SD_DSKBUF) ; CURRENT DMA TO HL
OR A ; SET FLAGS BASED ON RETURN CODE
RET ; AND RETURN, A HAS RETURN CODE
;
;
;
SD_STATUS:
; RETURN UNIT STATUS
@ -1692,6 +1728,8 @@ SD_STR_TYPESDXC .TEXT "SDXC$"
;
SD_OPRVAL .DB 0 ; CURRENT OPR REG VALUE
SD_LCNT .DB 0 ; LOOP COUNTER
SD_CMDVAL .DB 0 ; PENDING COMMAND FOR IO FUCNTIONS
SD_BLKCNT .DB 0 ; BLOCK COUNT REQUESTED FOR IO FUNCTIONS
;
SD_BUF .FILL 16,0 ; WORK BUFFER
;

3
Source/HBIOS/std.asm

@ -102,7 +102,8 @@ PPIDEMODE_SBC .EQU 1 ; STANDARD SBC PARALLEL PORT
PPIDEMODE_DIO3 .EQU 2 ; DISKIO V3 PARALLEL PORT
PPIDEMODE_MFP .EQU 3 ; MULTIFUNCTION / PIC
PPIDEMODE_N8 .EQU 4 ; MULTIFUNCTION / PIC
PPIDEMODE_RC .EQU 5 ; RC2014 PPIDE
PPIDEMODE_RC .EQU 5 ; RC2014 PPIDE STANDARD $20 IO BASE
PPIDEMODE_SMB .EQU 6 ; RC2014 PPIDE SMB $E0 IO BASE
;
; SD MODE SELECTIONS
;

23
Source/HBIOS/util.asm

@ -900,3 +900,26 @@ ST32:
LD (BC),A
POP AF
RET
;
; INC/ADD/DEC/SUB 32 BIT VALUE IN DE:HL
; FOR ADD/SUB, OPERAND IS IN BC
;
INC32:
LD BC,1
ADD32:
ADD HL,BC
RET NC
INC DE
RET
;
DEC32:
LD BC,1
SUB32:
OR A
SBC HL,BC
RET NC
DEC DE
RET

Loading…
Cancel
Save