Browse Source

Storage Driver Refactoring

pull/3/head
Wayne Warthen 10 years ago
parent
commit
25974843e3
  1. 3
      Source/CBIOS/cbios.asm
  2. 211
      Source/HBIOS/fd.asm
  3. 285
      Source/HBIOS/hbios.asm
  4. 11
      Source/HBIOS/hbios.inc
  5. 130
      Source/HBIOS/hdsk.asm
  6. 143
      Source/HBIOS/ide.asm
  7. 78
      Source/HBIOS/md.asm
  8. 119
      Source/HBIOS/ppide.asm
  9. 145
      Source/HBIOS/ppp.asm
  10. 92
      Source/HBIOS/prp.asm
  11. 87
      Source/HBIOS/rf.asm
  12. 102
      Source/HBIOS/sd.asm

3
Source/CBIOS/cbios.asm

@ -1602,13 +1602,12 @@ DPB_RAM:
; ;
; 4MB RAM FLOPPY DRIVE, 32 TRKS, 1024 SECS/TRK, 128 BYTES/SEC ; 4MB RAM FLOPPY DRIVE, 32 TRKS, 1024 SECS/TRK, 128 BYTES/SEC
; BLOCKSIZE (BLS) = 2K, DIRECTORY ENTRIES = 256 ; BLOCKSIZE (BLS) = 2K, DIRECTORY ENTRIES = 256
; SEC/TRK ENGINEERED SO THAT AFTER DEBLOCKING, SECTOR NUMBER OCCUPIES 1 BYTE (0-255)
; ;
.DW CKS_HD .DW CKS_HD
.DW ALS_HD .DW ALS_HD
.DB (2048 / 128) ; RECORDS PER BLOCK (BLS / 128) .DB (2048 / 128) ; RECORDS PER BLOCK (BLS / 128)
DPB_RF: DPB_RF:
.DW 1024 ; SPT: SECTORS PER TRACK
.DW 64 ; SPT: SECTORS PER TRACK
.DB 4 ; BSH: BLOCK SHIFT FACTOR .DB 4 ; BSH: BLOCK SHIFT FACTOR
.DB 15 ; BLM: BLOCK MASK .DB 15 ; BLM: BLOCK MASK
.DB 0 ; EXM: EXTENT MASK .DB 0 ; EXM: EXTENT MASK

211
Source/HBIOS/fd.asm

@ -125,22 +125,22 @@ FSST_COUNT .EQU (($ - FSST) / FSST_ENTSIZ) ; # ENTRIES IN TABLE
; ;
; FDC COMMANDS ; FDC COMMANDS
; ;
CMD_READ .EQU 00000110B ; CMD,HDS/DS,C,H,R,N,EOT,GPL,DTL --> ST0,ST1,ST2,C,H,R,N
CMD_READDEL .EQU 00001100B ; CMD,HDS/DS,C,H,R,N,EOT,GPL,DTL --> ST0,ST1,ST2,C,H,R,N
CMD_WRITE .EQU 00000101B ; CMD,HDS/DS,C,H,R,N,EOT,GPL,DTL --> ST0,ST1,ST2,C,H,R,N
CMD_WRITEDEL .EQU 00001001B ; CMD,HDS/DS,C,H,R,N,EOT,GPL,DTL --> ST0,ST1,ST2,C,H,R,N
CMD_READTRK .EQU 00000010B ; CMD,HDS/DS,C,H,R,N,EOT,GPL,DTL --> ST0,ST1,ST2,C,H,R,N
CMD_READID .EQU 00001010B ; CMD,HDS/DS --> ST0,ST1,ST2,C,H,R,N
CMD_FMTTRK .EQU 00001101B ; CMD,HDS/DS,N,SC,GPL,D --> ST0,ST1,ST2,C,H,R,N
CMD_SCANEQ .EQU 00010001B ; CMD,HDS/DS,C,H,R,N,EOT,GPL,STP --> ST0,ST1,ST2,C,H,R,N
CMD_SCANLOEQ .EQU 00011001B ; CMD,HDS/DS,C,H,R,N,EOT,GPL,STP --> ST0,ST1,ST2,C,H,R,N
CMD_SCANHIEQ .EQU 00011101B ; CMD,HDS/DS,C,H,R,N,EOT,GPL,STP --> ST0,ST1,ST2,C,H,R,N
CMD_RECAL .EQU 00000111B ; CMD,DS --> <EMPTY>
CMD_SENSEINT .EQU 00001000B ; CMD --> ST0,PCN
CMD_SPECIFY .EQU 00000011B ; CMD,SRT/HUT,HLT/ND --> <EMPTY>
CMD_DRVSTAT .EQU 00000100B ; CMD,HDS/DS --> ST3
CMD_SEEK .EQU 00001111B ; CMD,HDS/DS --> <EMPTY>
CMD_VERSION .EQU 00010000B ; CMD --> ST0
CFD_READ .EQU 00000110B ; CMD,HDS/DS,C,H,R,N,EOT,GPL,DTL --> ST0,ST1,ST2,C,H,R,N
CFD_READDEL .EQU 00001100B ; CMD,HDS/DS,C,H,R,N,EOT,GPL,DTL --> ST0,ST1,ST2,C,H,R,N
CFD_WRITE .EQU 00000101B ; CMD,HDS/DS,C,H,R,N,EOT,GPL,DTL --> ST0,ST1,ST2,C,H,R,N
CFD_WRITEDEL .EQU 00001001B ; CMD,HDS/DS,C,H,R,N,EOT,GPL,DTL --> ST0,ST1,ST2,C,H,R,N
CFD_READTRK .EQU 00000010B ; CMD,HDS/DS,C,H,R,N,EOT,GPL,DTL --> ST0,ST1,ST2,C,H,R,N
CFD_READID .EQU 00001010B ; CMD,HDS/DS --> ST0,ST1,ST2,C,H,R,N
CFD_FMTTRK .EQU 00001101B ; CMD,HDS/DS,N,SC,GPL,D --> ST0,ST1,ST2,C,H,R,N
CFD_SCANEQ .EQU 00010001B ; CMD,HDS/DS,C,H,R,N,EOT,GPL,STP --> ST0,ST1,ST2,C,H,R,N
CFD_SCANLOEQ .EQU 00011001B ; CMD,HDS/DS,C,H,R,N,EOT,GPL,STP --> ST0,ST1,ST2,C,H,R,N
CFD_SCANHIEQ .EQU 00011101B ; CMD,HDS/DS,C,H,R,N,EOT,GPL,STP --> ST0,ST1,ST2,C,H,R,N
CFD_RECAL .EQU 00000111B ; CMD,DS --> <EMPTY>
CFD_SENSEINT .EQU 00001000B ; CMD --> ST0,PCN
CFD_SPECIFY .EQU 00000011B ; CMD,SRT/HUT,HLT/ND --> <EMPTY>
CFD_DRVSTAT .EQU 00000100B ; CMD,HDS/DS --> ST3
CFD_SEEK .EQU 00001111B ; CMD,HDS/DS --> <EMPTY>
CFD_VERSION .EQU 00010000B ; CMD --> ST0
; ;
; ;
; Specify Command: ; Specify Command:
@ -347,48 +347,73 @@ FCS_VERSION .DB "VER$"
; ;
; FDC COMMAND TABLE ; FDC COMMAND TABLE
; ;
FCT .DB CMD_READ \ .DW FCS_READ
FCT .DB CFD_READ \ .DW FCS_READ
FCT_ENTSIZ .EQU $ - FCT FCT_ENTSIZ .EQU $ - FCT
.DB CMD_READDEL \ .DW FCS_READDEL
.DB CMD_WRITE \ .DW FCS_WRITE
.DB CMD_WRITEDEL \ .DW FCS_WRITEDEL
.DB CMD_READTRK \ .DW FCS_READTRK
.DB CMD_READID \ .DW FCS_READID
.DB CMD_FMTTRK \ .DW FCS_FMTTRK
.DB CMD_SCANEQ \ .DW FCS_SCANEQ
.DB CMD_SCANLOEQ \ .DW FCS_SCANLOEQ
.DB CMD_SCANHIEQ \ .DW FCS_SCANHIEQ
.DB CMD_RECAL \ .DW FCS_RECAL
.DB CMD_SENSEINT \ .DW FCS_SENSEINT
.DB CMD_SPECIFY \ .DW FCS_SPECIFY
.DB CMD_DRVSTAT \ .DW FCS_DRVSTAT
.DB CMD_SEEK \ .DW FCS_SEEK
.DB CMD_VERSION \ .DW FCS_VERSION
.DB CFD_READDEL \ .DW FCS_READDEL
.DB CFD_WRITE \ .DW FCS_WRITE
.DB CFD_WRITEDEL \ .DW FCS_WRITEDEL
.DB CFD_READTRK \ .DW FCS_READTRK
.DB CFD_READID \ .DW FCS_READID
.DB CFD_FMTTRK \ .DW FCS_FMTTRK
.DB CFD_SCANEQ \ .DW FCS_SCANEQ
.DB CFD_SCANLOEQ \ .DW FCS_SCANLOEQ
.DB CFD_SCANHIEQ \ .DW FCS_SCANHIEQ
.DB CFD_RECAL \ .DW FCS_RECAL
.DB CFD_SENSEINT \ .DW FCS_SENSEINT
.DB CFD_SPECIFY \ .DW FCS_SPECIFY
.DB CFD_DRVSTAT \ .DW FCS_DRVSTAT
.DB CFD_SEEK \ .DW FCS_SEEK
.DB CFD_VERSION \ .DW FCS_VERSION
FCT_COUNT .EQU (($ - FCT) / FCT_ENTSIZ) ; # ENTRIES IN TABLE FCT_COUNT .EQU (($ - FCT) / FCT_ENTSIZ) ; # ENTRIES IN TABLE
#ENDIF #ENDIF
; ;
; ;
; ;
FD_DISPATCH: FD_DISPATCH:
CALL FD_SELECTUNIT
RET NZ
;
; DISPATCH ACCORDING TO DISK SUB-FUNCTION
LD A,B ; GET REQUESTED FUNCTION LD A,B ; GET REQUESTED FUNCTION
AND $0F
JP Z,FD_READ
AND $0F ; ISOLATE SUB-FUNCTION
JP Z,FD_SEEK ; SUB-FUNC 0: SEEK
DEC A DEC A
JP Z,FD_WRITE
JP Z,FD_READ ; SUB-FUNC 1: READ
DEC A DEC A
JP Z,FD_STATUS
JP Z,FD_WRITE ; SUB-FUNC 2: WRITE
DEC A DEC A
JP Z,FD_MEDIA
JP Z,FD_STATUS ; SUB-FUNC 3: STATUS
DEC A DEC A
JP Z,FD_CAP
JP Z,FD_RESET ; SUB-FUNC 4: RESET
DEC A DEC A
JP Z,FD_GEOM
CALL PANIC
;
; FD_MEDIA
;
FD_MEDIA:
CALL FD_SELECTUNIT
JP Z,FD_CAP ; SUB-FUNC 5: GET CAPACITY
DEC A
JP Z,FD_GEOM ; SUB-FUNC 6: GET GEOMETRY
DEC A
JP Z,FD_GETPAR ; SUB-FUNC 7: GET PARAMETERS
DEC A
JP Z,FD_SETPAR ; SUB-FUNC 8: SET PARAMETERS
CALL PANIC ; INVALID SUB-FUNCTION
;;
; LD A,B ; GET REQUESTED FUNCTION
; AND $0F
; JP Z,FD_READ
; DEC A
; JP Z,FD_WRITE
; DEC A
; JP Z,FD_STATUS
; DEC A
; JP Z,FD_MEDIA
; DEC A
; JP Z,FD_CAP
; DEC A
; JP Z,FD_GEOM
; CALL PANIC
;
; FD_GETPAR
;
FD_GETPAR:
;CALL FD_SELECTUNIT
#IF (FDMAUTO) #IF (FDMAUTO)
; SETUP TO READ TRK 0, HD 0, SEC 0 ; SETUP TO READ TRK 0, HD 0, SEC 0
@ -425,7 +450,8 @@ FD_MEDIARETRY:
DJNZ FD_MEDIARETRY DJNZ FD_MEDIARETRY
; NO JOY, RETURN WITH A=0 (NO MEDIA) ; NO JOY, RETURN WITH A=0 (NO MEDIA)
XOR A
LD E,0
OR $FF ; SIGNAL ERROR
RET RET
FD_TESTMEDIA: FD_TESTMEDIA:
@ -461,6 +487,15 @@ FD_MEDIA3:
CALL PC_SPACE CALL PC_SPACE
CALL PRTHEXBYTE CALL PRTHEXBYTE
#ENDIF #ENDIF
LD E,A ; MOVE MEDIA VALUE TO E
XOR A ; SIGNAL SUCCESS
RET
;
;
;
FD_SETPAR:
; NOT IMPLEMENTED
XOR A
RET RET
; ;
; ;
@ -482,8 +517,10 @@ FD_CAP:
; ;
; ;
FD_GEOM: FD_GEOM:
LD A,C ; GET DEVICE/UNIT
OR $0F ; ISOLATE UNIT
;LD A,C ; GET DEVICE/UNIT
;OR $0F ; ISOLATE UNIT
LD A,(FD_UNIT) ; GET DEVICE/UNIT
OR A ; SET FLAGS
JR Z,FD_GEOM0 ; UNIT 0 JR Z,FD_GEOM0 ; UNIT 0
DEC A ; NOPE, TRY UNIT 1 DEC A ; NOPE, TRY UNIT 1
JR Z,FD_GEOM1 ; UNIT 1 JR Z,FD_GEOM1 ; UNIT 1
@ -567,7 +604,7 @@ FD_IDLE:
; FD_STATUS ; FD_STATUS
; ;
FD_STATUS: FD_STATUS:
CALL FD_SELECTUNIT
;CALL FD_SELECTUNIT
LD HL,(FDDS_TRKADR) LD HL,(FDDS_TRKADR)
LD A,(HL) ; A = CURRENT TRACK LD A,(HL) ; A = CURRENT TRACK
@ -581,6 +618,12 @@ FD_STATUS1:
OR A ; A ALREADY = $FF, JUST SET FLAGS OR A ; A ALREADY = $FF, JUST SET FLAGS
RET RET
; ;
;
;
FD_RESET:
XOR A ; ALWAYS OK
RET
;
; FD_CLRDSKCHG ; FD_CLRDSKCHG
; ;
FD_CLRDSKCHG: FD_CLRDSKCHG:
@ -674,8 +717,12 @@ FD_DRIVERESET:
; ;
; ;
FD_SELECTUNIT: FD_SELECTUNIT:
PUSH HL
PUSH DE
LD A,C LD A,C
AND 0FH ; ISOLATE THE UNIT NIBBLE AND 0FH ; ISOLATE THE UNIT NIBBLE
LD (FD_UNIT),A ; SAVE IT
; GOOD PLACE FOR AN INTEGRITY CHECK ; GOOD PLACE FOR AN INTEGRITY CHECK
CP 2 CP 2
@ -691,14 +738,30 @@ FD_SELECTUNIT:
LD (FDDS_TRKADR),HL ; LOAD TRKADR LD (FDDS_TRKADR),HL ; LOAD TRKADR
INC HL ; SKIP TRK INC HL ; SKIP TRK
LD (FDDS_MEDIAADR),HL ; LOAD MEDIAADR LD (FDDS_MEDIAADR),HL ; LOAD MEDIAADR
POP DE
POP HL
XOR A
RET RET
;
;
;
FD_SEEK:
LD (HSTSEC),DE ; RECORD HEAD/SECTOR
LD (HSTTRK),HL ; RECORD TRACK
XOR A ; SIGNAL SUCCESS
RET
;
;
;
FD_READ: FD_READ:
LD (FD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
LD A,DOP_READ LD A,DOP_READ
JR FD_RUN JR FD_RUN
; ;
FD_WRITE: FD_WRITE:
LD (FD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
LD A,DOP_WRITE LD A,DOP_WRITE
JR FD_RUN JR FD_RUN
; ;
@ -706,11 +769,12 @@ FD_RUN:
LD (FCD_DOP),A LD (FCD_DOP),A
; UPDATE DRIVE SELECTION ; UPDATE DRIVE SELECTION
LD A,(HSTDSK) ; GET THE NEW DRIVE SELECTION
AND 0FH
;LD A,(HSTDSK) ; GET THE NEW DRIVE SELECTION
;AND 0FH
LD A,(FD_UNIT) ; GET UNIT
LD (FCD_DS),A ; UPDATE FCD_DS TO NEW VALUE LD (FCD_DS),A ; UPDATE FCD_DS TO NEW VALUE
LD C,A
CALL FD_SELECTUNIT
;LD C,A
;CALL FD_SELECTUNIT
; MAP HSTTRK TO FCD_H, FCD_C ; MAP HSTTRK TO FCD_H, FCD_C
LD BC,(HSTTRK) LD BC,(HSTTRK)
@ -798,7 +862,7 @@ FD_RUN0:
; INITIATE SEEK TO NEW TRACK ; INITIATE SEEK TO NEW TRACK
CALL FC_SEEK CALL FC_SEEK
JR NZ,FD_RUNERR JR NZ,FD_RUNERR
; WAIT FOR SEEK TO COMPLETE ; WAIT FOR SEEK TO COMPLETE
CALL FD_WTSEEK CALL FD_WTSEEK
JR NZ,FD_RUNERR JR NZ,FD_RUNERR
@ -872,44 +936,44 @@ FD_DSKY:
; ENTRY POINTS FOR FDC COMMANDS ; ENTRY POINTS FOR FDC COMMANDS
; ;
FC_READ: FC_READ:
LD A,CMD_READ | 11100000B
LD A,CFD_READ | 11100000B
CALL FC_SETUPIO CALL FC_SETUPIO
JP FOP JP FOP
FC_WRITE: FC_WRITE:
LD A,CMD_WRITE | 11000000B
LD A,CFD_WRITE | 11000000B
CALL FC_SETUPIO CALL FC_SETUPIO
JP FOP JP FOP
FC_READID: FC_READID:
LD A,CMD_READID | 01000000B
LD A,CFD_READID | 01000000B
CALL FC_SETUPCMD CALL FC_SETUPCMD
JP FOP JP FOP
FC_RECAL: FC_RECAL:
LD A,CMD_RECAL | 00000000B
LD A,CFD_RECAL | 00000000B
CALL FC_SETUPCMD CALL FC_SETUPCMD
JP FOP ; FIX: DO WE NEED TO REMOVE HDS BITS FROM SECOND BYTE? JP FOP ; FIX: DO WE NEED TO REMOVE HDS BITS FROM SECOND BYTE?
FC_SENSEINT: FC_SENSEINT:
LD A,CMD_SENSEINT | 00000000B
LD A,CFD_SENSEINT | 00000000B
CALL FC_SETUPCMD CALL FC_SETUPCMD
LD A,1 ; GENERIC COMMAND, BUT JUST FIRST COMMAND CODE LD A,1 ; GENERIC COMMAND, BUT JUST FIRST COMMAND CODE
LD (FCP_LEN),A LD (FCP_LEN),A
JP FOP JP FOP
FC_SPECIFY: FC_SPECIFY:
LD A,CMD_SPECIFY | 00000000B
LD A,CFD_SPECIFY | 00000000B
CALL FC_SETUPSPECIFY CALL FC_SETUPSPECIFY
JP FOP JP FOP
FC_DRVSTAT: FC_DRVSTAT:
LD A,CMD_DRVSTAT | 00000000B
LD A,CFD_DRVSTAT | 00000000B
CALL FC_SETUPCMD CALL FC_SETUPCMD
JP FOP JP FOP
FC_SEEK: FC_SEEK:
LD A,CMD_SEEK | 00000000B
LD A,CFD_SEEK | 00000000B
CALL FC_SETUPSEEK CALL FC_SETUPSEEK
JP FOP JP FOP
; ;
@ -1229,11 +1293,11 @@ FOP_X1:
LD HL,FOP_RES LD HL,FOP_RES
PUSH HL PUSH HL
CP CMD_READ
CP CFD_READ
JP Z,FXR_READ JP Z,FXR_READ
CP CMD_WRITE
CP CFD_WRITE
JP Z,FXR_WRITE JP Z,FXR_WRITE
CP CMD_READID
CP CFD_READID
JP Z,FXR_NULL JP Z,FXR_NULL
RET ; RET ACTUALLY JUST JUMPS RIGHT TO FOP_RES RET ; RET ACTUALLY JUST JUMPS RIGHT TO FOP_RES
; ;
@ -1318,7 +1382,7 @@ FOP_ERR:
FOP_EVAL: FOP_EVAL:
LD A,(FCP_CMD) LD A,(FCP_CMD)
; DRVSTAT IS WEIRD, HAS ONLY ST3, NOTHING TO EVAL ; DRVSTAT IS WEIRD, HAS ONLY ST3, NOTHING TO EVAL
CP CMD_DRVSTAT
CP CFD_DRVSTAT
JR Z,FOP_EXIT JR Z,FOP_EXIT
; DO WE HAVE ST0? ; DO WE HAVE ST0?
LD A,(FRB_LEN) LD A,(FRB_LEN)
@ -1339,7 +1403,7 @@ FOP_EVALST0:
FOP_ABTERM: FOP_ABTERM:
; SENSEINT DOES NOT USE ST1 ; SENSEINT DOES NOT USE ST1
LD A,(FCP_CMD) LD A,(FCP_CMD)
CP CMD_SENSEINT
CP CFD_SENSEINT
JR Z,FOP_ABTERM1 JR Z,FOP_ABTERM1
; DO WE HAVE ST1? ; DO WE HAVE ST1?
LD A,(FRB_LEN) LD A,(FRB_LEN)
@ -1425,7 +1489,7 @@ FXR_NULL1:
; READ DATA ; READ DATA
; ;
FXR_READ: FXR_READ:
LD HL,(DIOBUF) ; POINT TO SECTOR BUFFER START
LD HL,(FD_DSKBUF) ; POINT TO SECTOR BUFFER START
LD DE,(FCD_SECSZ) LD DE,(FCD_SECSZ)
; TIMEOUT COUNTER IS CPU MHZ / 4 (MAKING SURE IT IS AT LEAST 1) ; TIMEOUT COUNTER IS CPU MHZ / 4 (MAKING SURE IT IS AT LEAST 1)
; LD A,(CPUMHZ + 3) / 4 ; LD A,(CPUMHZ + 3) / 4
@ -1465,7 +1529,7 @@ FXRR5: ; OUTER LOOP, REALLY ONLY HAPPENS WHEN WAITING FOR FIRST BYTE OR ABOR
; WRITE DATA ; WRITE DATA
; ;
FXR_WRITE: FXR_WRITE:
LD HL,(DIOBUF) ; POINT TO SECTOR BUFFER START
LD HL,(FD_DSKBUF) ; POINT TO SECTOR BUFFER START
LD DE,(FCD_SECSZ) LD DE,(FCD_SECSZ)
; TIMEOUT COUNTER IS CPU MHZ / 4 (MAKING SURE IT IS AT LEAST 1) ; TIMEOUT COUNTER IS CPU MHZ / 4 (MAKING SURE IT IS AT LEAST 1)
; LD A,(CPUMHZ + 3) / 4 ; LD A,(CPUMHZ + 3) / 4
@ -1628,7 +1692,7 @@ FC_PRTRESULTS:
; SPECIAL CASE, DON'T PRINT IF SENSEINT & INVCMD/DSK CHG/ABTERM ; SPECIAL CASE, DON'T PRINT IF SENSEINT & INVCMD/DSK CHG/ABTERM
LD A,(FCP_CMD) LD A,(FCP_CMD)
CP CMD_SENSEINT
CP CFD_SENSEINT
JR NZ,FCPR2 JR NZ,FCPR2
LD A,(FST_RC) LD A,(FST_RC)
@ -1769,3 +1833,8 @@ FCD_U1MEDIA .DB FDMEDIA ; MEDIA BYTE
; ;
FDDS_TRKADR .DW 0 ; POINTER TO FDCUXTRK ABOVE FDDS_TRKADR .DW 0 ; POINTER TO FDCUXTRK ABOVE
FDDS_MEDIAADR .DW 0 ; POINTER TO FDCUXMEDIA ABOVE FDDS_MEDIAADR .DW 0 ; POINTER TO FDCUXMEDIA ABOVE
;
; GENERAL WORKING STORAGE
;
FD_UNIT .DB 0
FD_DSKBUF .DW 0

285
Source/HBIOS/hbios.asm

@ -674,7 +674,7 @@ HB_DISPATCH:
LD A,B ; REQUESTED FUNCTION IS IN B LD A,B ; REQUESTED FUNCTION IS IN B
CP BF_CIO + $10 ; $00-$0F: CHARACTER I/O CP BF_CIO + $10 ; $00-$0F: CHARACTER I/O
JP C,CIO_DISPATCH JP C,CIO_DISPATCH
CP BF_DIO + $10 ; $10-$1F: DISK I/O
CP BF_DIO + $10 ; $10-$1F: OLD DISK I/O
JP C,DIO_DISPATCH JP C,DIO_DISPATCH
CP BF_RTC + $10 ; $20-$2F: REAL TIME CLOCK (RTC) CP BF_RTC + $10 ; $20-$2F: REAL TIME CLOCK (RTC)
JP C,RTC_DISPATCH JP C,RTC_DISPATCH
@ -682,6 +682,8 @@ HB_DISPATCH:
JP C,EMU_DISPATCH JP C,EMU_DISPATCH
CP BF_VDA + $10 ; $40-$4F: VIDEO DISPLAY ADAPTER CP BF_VDA + $10 ; $40-$4F: VIDEO DISPLAY ADAPTER
JP C,VDA_DISPATCH JP C,VDA_DISPATCH
CP BF_NDIO + $10 ; $50-$5F: NEW DISK I/O
JP C,VDA_DISPATCH
CP BF_SYS ; SKIP TO BF_SYS VALUE AT $F0 CP BF_SYS ; SKIP TO BF_SYS VALUE AT $F0
CALL C,PANIC ; PANIC IF LESS THAN BF_SYS CALL C,PANIC ; PANIC IF LESS THAN BF_SYS
@ -791,86 +793,135 @@ CIO_GETINF1:
RET ; RETURN RET ; RETURN
; ;
;================================================================================================== ;==================================================================================================
; DISK I/O DEVICE DISPATCHER
; OLD STYLE DISK I/O DEVICE DISPATCHER
;================================================================================================== ;==================================================================================================
; ;
; ROUTE CALL TO SPECIFIED DISK I/O DRIVER ; ROUTE CALL TO SPECIFIED DISK I/O DRIVER
; B: FUNCTION ; B: FUNCTION
; C: DEVICE/UNIT ; C: DEVICE/UNIT
; H:7: INDICATES LBA MODE
; CHS MODE: DE:HL==TT:HS
; LBA MODE: HL:DE==NN:NN (32 BIT ADDRESS)
; ;
DIO_DISPATCH: DIO_DISPATCH:
; GET THE REQUESTED FUNCTION TO SEE IF SPECIAL HANDLING ; GET THE REQUESTED FUNCTION TO SEE IF SPECIAL HANDLING
; IS NEEDED ; IS NEEDED
LD A,B LD A,B
CP BF_DIORD ; READ
JR Z,DIO_READ ; GO TO READ SHIM
CP BF_DIOWR ; WRITE
JR Z,DIO_WRITE ; GO TO WRITE SHIM
CP BF_DIOST ; STATUS
JR Z,DIO_STAT ; GO TO STATUS SHIM
CP BF_DIOMED ; MEDIA
JR Z,DIO_MEDIA ; GO TO MEDIA SHIM
;CP BF_DIOID ; IDENTIFY
;CALL Z,DIOID ; WAS NEVER REALLY SUPPORTED
CP BF_DIOGETBUF ; GET BUF
JR Z,DIO_GETBUF ; GO TO GET BUF SHIM
CP BF_DIOSETBUF ; SET BUF
JR Z,DIO_SETBUF ; GO TO SET BUF SHIM
CP BF_DIOGETCNT ; FUNCTION = DIOGETCNT?
JR Z,DIO_GETCNT ; YES, HANDLE IT
CP BF_DIOGETINF ; FUNCTION = DIOGETINF?
JR Z,DIO_GETINF ; YES, HANDLE IT
CALL PANIC ; UNSUPPORTED FUNCTION REQUEST
;
; DISK: SHIM FOR OLD STYLE READ CALL
;
DIO_READ:
LD B,BF_NDIOREAD ; OVERLAY OLD FUNCTION ID WITH NEW ONE
JR DIO_RW ; ... AND GO TO COMMON R/W ROUTINE
;
; DISK: SHIM FOR OLD STYLE WRITE CALL
;
DIO_WRITE:
LD B,BF_NDIOWRITE ; OVERLAY OLD FUNCTION ID WITH NEW ONE
JR DIO_RW ; ... AND GO TO COMMON R/W ROUTINE
;
; DISK: COMMON ROUTINE USED BY READ/WRITE SHIMS ABOVE
; NEW FUNCTION ID IS EXPECTED TO BE IN B (NDIO_READ OR NDIO_WRITE)
; THIS ROUTINE WILL TAKE THE OLD STYLE CALL AND PERFORM TWO CALLS TO
; THE NEW INTERFACE (SEEK, THEN READ OR WRITE) WHICH EFFECTIVELY
; REPLICATES THE FUNCTIONALITY OF THE OLD CALL.
;
DIO_RW:
PUSH BC ; SAVE INCOMING FUNCTION, DEVICE/UNIT
EX DE,HL ; SWAP DE/HL TO XLAT FROM OLD TO NEW CALL
LD B,BF_NDIOSEEK ; SETUP FOR NEW SEEK CALL
CALL NDIO_DISPATCH ; DO IT
POP BC ; RESTORE INCOMING FUNCTION, DEVICE/UNIT
RET NZ ; ABORT IF SEEK RETURNED AN ERROR W/ ERROR IN A
LD HL,(DIOBUF) ; GET BUFFER ADDRESS
LD DE,1 ; TRANSFER ONE SECTOR
JR NDIO_DISPATCH ; RETURN VIA DISPATCHER
; ;
; DIO FUNCTIONS STARTING AT DIOGETBUF ARE COMMON FUNCTIONS
; AND DO NOT DISPATCH TO DRIVERS (HANDLED GLOBALLY)
CP BF_DIOGETBUF ; TEST FOR FIRST OF THE COMMON FUNCTIONS
JR NC,DIO_COMMON ; IF >= DIOGETBUF HANDLE AS COMMON DIO FUNCTION
;
; HACK TO FILL IN HSTTRK AND HSTSEC
; BUT ONLY FOR READ/WRITE FUNCTION CALLS
; ULTIMATELY, HSTTRK AND HSTSEC ARE TO BE REMOVED
CP BF_DIOST ; BEYOND READ/WRITE FUNCTIONS ?
JR NC,DIO_DISPATCH1 ; YES, BYPASS
LD (HSTSEC),HL ; RECORD HEAD/SECTOR (OR LBA HIGH)
LD (HSTTRK),DE ; RECORD TRACK (OR LBA LOW)
;
; PUSH BC
; CALL NEWLINE
; PUSH DE
; POP BC
; CALL PRTHEXWORD
; CALL PC_COLON
; PUSH HL
; POP BC
; CALL PRTHEXWORD
; POP BC
;
; HACK TO CONVERT INCOMING CHS TO LBA IFF HD ACCESS (NOT FLOPPY)
; FIRST CHECK FOR FLOPPY DEVICE AND BYPASS IF SO
LD A,C ; GET REQUEST DEVICE/UNIT FROM C
AND $F0 ; ISOLATE THE DEVICE PORTION
CP DIODEV_FD ; FLOPPY?
JR Z,DIO_DISPATCH1 ; YES, BYPASS
;
; NOW CHECK IF INCOMING IS ALREADY LBA AND BYPASS IF SO
BIT 7,H ; TEST HIGH BIT OF HEAD/LBA
RES 7,H ; CLEAR LBA INDICATOR BIT
JR NZ,DIO_DISPATCH1 ; IF NZ, ALREADY LBA, BYPASS
; DISK: SHIM FOR OLD STYLE STATUS CALL
; ;
; WE HAVE INCOMING HARDDISK CHS, CONVERT TO LBA
; DE=TRACK (0..N), H=HEAD (0..15), L=SECTOR (0..15)
; XLAT DE:HL (TT:HS) --> 32 BIT LBA (LBAHI:LBALO)
LD A,H ; HEAD TO A
RLCA ; LEFT SHIFT TO HIGH NIBBLE
RLCA ; ... DEPENDS ON HIGH
RLCA ; ... NIBBLE BEING 0 SINCE
RLCA ; ... IT ROTATES INTO LOW NIBBLE
OR L ; COMBINE WITH SECTOR (HIGH NIBBLE MUST BE ZERO)
LD L,A ; THIS IS LBA LOW LSB
LD H,E ; LBA LOW MSB, E -> H
LD (HSTLBALO),HL ; SAVE FINAL LBA LOW
LD L,D ; LBA HIGH LSB, D -> L
LD H,0 ; LBA HIGH MSB, ZERO FILL
LD (HSTLBAHI),HL ; SAVE FINAL LBA HIGH
;
; PUSH BC
; CALL PC_SPACE
; LD BC,(HSTLBAHI)
; CALL PRTHEXWORD
; CALL PC_COLON
; LD BC,(HSTLBALO)
; CALL PRTHEXWORD
; POP BC
;
DIO_DISPATCH1:
DIO_STAT:
LD B,BF_NDIOSTAT
JR NDIO_DISPATCH
;
; DISK: SHIM FOR OLD STYLE MEDIA CALL
;
DIO_MEDIA:
LD B,BF_NDIOGETPAR
CALL NDIO_DISPATCH
LD A,E
OR A
RET
;
; DISK: GET BUFFER ADDRESS
;
DIO_GETBUF:
LD HL,(DIOBUF) ; HL = DISK BUFFER ADDRESS
XOR A ; SIGNALS SUCCESS
RET
;
; DISK: SET BUFFER ADDRESS
;
DIO_SETBUF:
LD A,H ; TEST HL
OR L ; ... FOR ZERO
JR NZ,DIO_SETBUF1 ; IF NOT, PROCEED TO SET BUF ADR
LD HL,HB_BUF ; IF ZERO, SET TO DEFAULT ADR
DIO_SETBUF1:
LD (DIOBUF),HL ; RECORD NEW DISK BUFFER ADDRESS
XOR A ; SIGNALS SUCCESS
RET
;
; DISK: GET DEVICE COUNT
;
DIO_GETCNT:
LD A,(HCB + HCB_DDL - 1) ; GET DEVICE COUNT (FIRST BYTE OF LIST)
LD B,A ; PUT IT IN B
XOR A ; SIGNALS SUCCESS
RET
;
; DISK: GET DEVICE INFO
;
DIO_GETINF:
LD HL,HCB + HCB_DDL - 1 ; POINT TO DEVICE MAP ENTRY COUNT (FIRST BYTE OF LIST)
LD B,(HL) ; ENTRY COUNT TO B
LD A,C ; INDEX TO A
CP B ; CHECK INDEX AGAINST MAX VALUE (INDEX - COUNT)
JR NC,DIO_GETINF1 ; IF INDEX TOO HIGH, ERR
INC HL ; BUMP TO START OF DEV MAP ENTRIES
CALL ADDHLA ; AND POINT TO REQUESTED INDEX
LD C,(HL) ; DEVICE/UNIT TO C
XOR A ; SIGNAL SUCCESS
RET ; DONE
DIO_GETINF1:
OR $FF ; SIGNAL ERROR
RET ; RETURN
;
;==================================================================================================
; DISK I/O DEVICE DISPATCHER
;==================================================================================================
;
NDIO_DISPATCH:
; START OF THE ACTUAL DRIVER DISPATCHING LOGIC ; START OF THE ACTUAL DRIVER DISPATCHING LOGIC
LD A,C ; GET REQUESTED DEVICE/UNIT FROM C LD A,C ; GET REQUESTED DEVICE/UNIT FROM C
LD (HSTDSK),A ; TEMP HACK TO FILL IN HSTDSK
;LD (HSTDSK),A ; TEMP HACK TO FILL IN HSTDSK
AND $F0 ; ISOLATE THE DEVICE PORTION AND $F0 ; ISOLATE THE DEVICE PORTION
; ;
#IF (MDENABLE) #IF (MDENABLE)
@ -911,64 +962,62 @@ DIO_DISPATCH1:
#ENDIF #ENDIF
CALL PANIC CALL PANIC
; ;
; HANDLE COMMON DISK FUNCTIONS (NOT DEVICE DRIVER SPECIFIC)
; CONVERT AN HBIOS STANDARD HARD DISK CHS ADDRESS TO
; AN LBA ADDRESS. A STANDARD HBIOS HARD DISK IS ASSUMED
; TO HAVE 16 SECTORS PER TRACK AND 16 HEADS PER CYLINDER.
; ;
DIO_COMMON:
SUB BF_DIOGETBUF ; FUNCTION = DIOGETBUF?
JR Z,DIO_GETBUF ; YES, HANDLE IT
DEC A ; FUNCTION = DIOSETBUF?
JR Z,DIO_SETBUF ; YES, HANDLE IT
DEC A ; FUNCTION = DIOGETCNT?
JR Z,DIO_GETCNT ; YES, HANDLE IT
DEC A ; FUNCTION = DIOGETINF?
JR Z,DIO_GETINF ; YES, HANDLE IT
CALL PANIC ; INVALID FUNCTION SPECFIED
; INPUT: HL=TRACK, D=HEAD, E=SECTOR
; OUTPUT: DE:HL=32 BIT LBA ADDRESS (D:7 IS NOT SET IN THE RESULT)
; ;
; DISK: GET BUFFER ADDRESS
;
DIO_GETBUF:
LD HL,(DIOBUF) ; HL = DISK BUFFER ADDRESS
XOR A ; SIGNALS SUCCESS
RET
HB_CHS2LBA:
; ;
; DISK: SET BUFFER ADDRESS
;; DEBUG: DUMP INCOMING TRACK:HEAD/SEC
;CALL NEWLINE
;PUSH BC
;PUSH HL
;POP BC
;CALL PRTHEXWORD
;CALL PC_COLON
;PUSH DE
;POP BC
;CALL PRTHEXWORD
;POP BC
; ;
DIO_SETBUF:
LD A,H ; TEST HL
OR L ; ... FOR ZERO
JR NZ,DIO_SETBUF1 ; IF NOT, PROCEED TO SET BUF ADR
LD HL,HB_BUF ; IF ZERO, SET TO DEFAULT ADR
DIO_SETBUF1:
LD (DIOBUF),HL ; RECORD NEW DISK BUFFER ADDRESS
XOR A ; SIGNALS SUCCESS
RET
; WE HAVE INCOMING HARDDISK CHS, CONVERT TO LBA
; HL=TRACK (0..N), D=HEAD (0..15), E=SECTOR (0..15)
; XLAT HL:DE (TT:HS) --> 32 BIT LBA (LBAHI:LBALO)
;
; D/E -> A (COMBINE HEAD/SEC AND SAVE IN A)
; 0 -> D
; H -> E
; L -> H
; A -> L
;
LD A,D ; HEAD TO A
RLCA ; LEFT SHIFT TO HIGH NIBBLE
RLCA ; ... DEPENDS ON HIGH
RLCA ; ... NIBBLE BEING 0 SINCE
RLCA ; ... IT ROTATES INTO LOW NIBBLE
OR E ; COMBINE WITH SECTOR (HIGH NIBBLE MUST BE ZERO)
LD D,0
LD E,H
LD H,L
LD L,A
; ;
; DISK: GET DEVICE COUNT
;; DEBUG: DUMP RESULTING LBA (32 BIT)
;PRTS("-->$")
;PUSH BC
;PUSH DE
;POP BC
;CALL PRTHEXWORD
;PUSH HL
;POP BC
;CALL PRTHEXWORD
;POP BC
; ;
DIO_GETCNT:
LD A,(HCB + HCB_DDL - 1) ; GET DEVICE COUNT (FIRST BYTE OF LIST)
LD B,A ; PUT IT IN B
XOR A ; SIGNALS SUCCESS
XOR A
RET RET
; ;
; DISK: GET DEVICE INFO
;
DIO_GETINF:
LD HL,HCB + HCB_DDL - 1 ; POINT TO DEVICE MAP ENTRY COUNT (FIRST BYTE OF LIST)
LD B,(HL) ; ENTRY COUNT TO B
LD A,C ; INDEX TO A
CP B ; CHECK INDEX AGAINST MAX VALUE (INDEX - COUNT)
JR NC,DIO_GETINF1 ; IF INDEX TOO HIGH, ERR
INC HL ; BUMP TO START OF DEV MAP ENTRIES
CALL ADDHLA ; AND POINT TO REQUESTED INDEX
LD C,(HL) ; DEVICE/UNIT TO C
XOR A ; SIGNAL SUCCESS
RET ; DONE
DIO_GETINF1:
OR $FF ; SIGNAL ERROR
RET ; RETURN
;
;================================================================================================== ;==================================================================================================
; REAL TIME CLOCK DEVICE DISPATCHER ; REAL TIME CLOCK DEVICE DISPATCHER
;================================================================================================== ;==================================================================================================
@ -1747,7 +1796,7 @@ IDLECOUNT .DB 0
; .DW 0 ; LBA HIGH WORD ; .DW 0 ; LBA HIGH WORD
; ;
; DISK DEVICE/UNIT ID ; DISK DEVICE/UNIT ID
HSTDSK .DB 0 ; DISK DEVICE/UNIT ID
;HSTDSK .DB 0 ; DISK DEVICE/UNIT ID
; FULL 32 BIT LBA ; FULL 32 BIT LBA
HSTLBA .EQU $ ; REFERS TO START OF 32-BIT LBA HSTLBA .EQU $ ; REFERS TO START OF 32-BIT LBA
; LBA LOW WORD -OR- TRACK ; LBA LOW WORD -OR- TRACK

11
Source/HBIOS/hbios.inc

@ -22,6 +22,17 @@ BF_DIOSETBUF .EQU BF_DIO + 9 ; DISK SET BUFFER ADR
BF_DIOGETCNT .EQU BF_DIO + 10 ; DISK DEVICE COUNT BF_DIOGETCNT .EQU BF_DIO + 10 ; DISK DEVICE COUNT
BF_DIOGETINF .EQU BF_DIO + 11 ; DISK DEVICE INFO BF_DIOGETINF .EQU BF_DIO + 11 ; DISK DEVICE INFO
; ;
BF_NDIO .EQU $50
BF_NDIOSEEK .EQU BF_DIO + 0 ; DISK SEEK
BF_NDIOREAD .EQU BF_DIO + 1 ; DISK READ
BF_NDIOWRITE .EQU BF_DIO + 2 ; DISK WRITE
BF_NDIOSTAT .EQU BF_DIO + 3 ; DISK STATUS
BF_NDIORESET .EQU BF_DIO + 4 ; DISK RESET
BF_NDIOCAP .EQU BF_DIO + 5 ; GET DISK CAPACITY
BF_NDIOGEOM .EQU BF_DIO + 6 ; GET DISK GEOMETRY
BF_NDIOGETPAR .EQU BF_DIO + 7 ; GET DISK PARAMS
BF_NDIOSETPAR .EQU BF_DIO + 8 ; SET DISK PARAMS
;
BF_RTC .EQU $20 BF_RTC .EQU $20
BF_RTCGETTIM .EQU BF_RTC + 0 ; GET TIME BF_RTCGETTIM .EQU BF_RTC + 0 ; GET TIME
BF_RTCSETTIM .EQU BF_RTC + 1 ; SET TIME BF_RTCSETTIM .EQU BF_RTC + 1 ; SET TIME

130
Source/HBIOS/hdsk.asm

@ -20,35 +20,6 @@ HDSKRC_OK .EQU 0
; ;
; ;
; ;
HDSK_DISPATCH:
LD A,B ; GET REQUESTED FUNCTION
AND $0F
JR Z,HDSK_READ
DEC A
JR Z,HDSK_WRITE
DEC A
JR Z,HDSK_STATUS
DEC A
JR Z,HDSK_MEDIA
DEC A
JR Z,HDSK_CAP
DEC A
JR Z,HDSK_GEOM
CALL PANIC
;
; HDSK_MEDIA
;
HDSK_MEDIA:
LD A,C ; GET THE DEVICE/UNIT
AND $0F ; ISOLATE UNIT
CP HDSKCNT ; NUM UNITS
LD A,MID_HD ; ASSUME WE ARE OK
RET C ; RETURN
XOR A ; NO MEDIA
RET ; AND RETURN
;
;
;
HDSK_INIT: HDSK_INIT:
PRTS("HDSK: UNITS=$") PRTS("HDSK: UNITS=$")
LD A,HDSKCNT LD A,HDSKCNT
@ -62,11 +33,49 @@ HDSK_INIT:
; ;
; ;
; ;
HDSK_DISPATCH:
; SAVE THE TARGET DEVICE/UNIT LOCALLY IN DRIVER
LD A,C ; DEVICE/UNIT FROM C
AND $0F ; ISOLATE UNIT NUM
CP 2 ; CHECK FOR MAX UNIT EXCEEDED
LD (HDSK_UNIT),A ; SAVE IT
CALL NC,PANIC ; PANIC IF TOO HIGH
;
; DISPATCH ACCORDING TO DISK SUB-FUNCTION
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JP Z,HDSK_SEEK ; SUB-FUNC 0: SEEK, USE HBIOS FOR NOW
DEC A
JP Z,HDSK_READ ; SUB-FUNC 1: READ
DEC A
JP Z,HDSK_WRITE ; SUB-FUNC 2: WRITE
DEC A
JP Z,HDSK_STATUS ; SUB-FUNC 3: STATUS
DEC A
JP Z,HDSK_RESET ; SUB-FUNC 4: RESET
DEC A
JP Z,HDSK_CAP ; SUB-FUNC 5: GET CAPACITY
DEC A
JP Z,HDSK_GEOM ; SUB-FUNC 6: GET GEOMETRY
DEC A
JP Z,HDSK_GETPAR ; SUB-FUNC 7: GET PARAMETERS
DEC A
JP Z,HDSK_SETPAR ; SUB-FUNC 8: SET PARAMETERS
CALL PANIC ; INVALID SUB-FUNCTION
;
;
;
HDSK_STATUS: HDSK_STATUS:
LD A,(HDSK_STAT) ; LOAD STATUS LD A,(HDSK_STAT) ; LOAD STATUS
OR A ; SET FLAGS OR A ; SET FLAGS
RET RET
; ;
;
;
HDSK_RESET:
XOR A ; ALWAYS OK
RET
;
; GET DISK CAPACITY ; GET DISK CAPACITY
; RETURN DE:HL=BLOCK COUNT, BC=BLOCK SIZE ; RETURN DE:HL=BLOCK COUNT, BC=BLOCK SIZE
; SLICE C/H/S = 65/16/16 OR 16,640 TOTAL SECTORS ; SLICE C/H/S = 65/16/16 OR 16,640 TOTAL SECTORS
@ -79,26 +88,56 @@ HDSK_CAP:
XOR A ; SIGNAL SUCCESS XOR A ; SIGNAL SUCCESS
RET RET
; ;
;
;
HDSK_GEOM: HDSK_GEOM:
; FOR LBA, WE SIMULATE CHS ACCESS USING 16 HEADS AND 16 SECTORS ; FOR LBA, WE SIMULATE CHS ACCESS USING 16 HEADS AND 16 SECTORS
; RETURN HS:CC -> DE:HL, SET HIGH BIT OF D TO INDICATE LBA CAPABLE ; RETURN HS:CC -> DE:HL, SET HIGH BIT OF D TO INDICATE LBA CAPABLE
CALL HDSK_CAP ; GET TOTAL BLOCKS IN DE:HL, BLOCK SIZE TO BC
LD L,H ; DIVIDE BY 256 FOR # TRACKS
LD H,E ; ... HIGH BYTE DISCARDED, RESULT IN HL
LD D,$80 | 16 ; HEADS / CYL = 16, SET LBA BIT
LD E,16 ; SECTORS / TRACK = 16
XOR A ; SIGNAL SUCCESS
CALL HDSK_CAP ; GET TOTAL BLOCKS IN DE:HL, BLOCK SIZE TO BC
LD L,H ; DIVIDE BY 256 FOR # TRACKS
LD H,E ; ... HIGH BYTE DISCARDED, RESULT IN HL
LD D,$80 | 16 ; HEADS / CYL = 16, SET LBA BIT
LD E,16 ; SECTORS / TRACK = 16
XOR A ; SIGNAL SUCCESS
RET
;
;
;
HDSK_GETPAR:
LD A,MID_HD ; HARD DISK MEDIA
LD E,A ; VALUE TO E
XOR A ; SIGNAL SUCCESS
RET
;
;
;
HDSK_SETPAR:
; NOT IMPLEMENTED
XOR A
RET RET
; ;
; ;
; ;
HDSK_SEEK:
BIT 7,D ; CHECK FOR LBA FLAG
CALL Z,HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA
RES 7,D ; CLEAR FLAG REGARDLESS (DOES NO HARM IF ALREADY LBA)
LD BC,HSTLBA ; POINT TO LBA STORAGE
CALL ST32 ; SAVE LBA ADDRESS
XOR A ; SIGNAL SUCCESS
RET ; AND RETURN
;
;
;
HDSK_READ: HDSK_READ:
LD (HDSK_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
LD A,HDSK_CMDREAD LD A,HDSK_CMDREAD
JR HDSK_RW JR HDSK_RW
; ;
; ;
; ;
HDSK_WRITE: HDSK_WRITE:
LD (HDSK_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
LD A,HDSK_CMDWRITE LD A,HDSK_CMDWRITE
JR HDSK_RW JR HDSK_RW
; ;
@ -114,11 +153,11 @@ HDSK_RW:
; INIT IF NEEDED ; INIT IF NEEDED
LD A,(HDSK_STAT) ; GET CURRENT STATUS LD A,(HDSK_STAT) ; GET CURRENT STATUS
OR A ; SET FLAGS OR A ; SET FLAGS
CALL NZ,HDSK_RESET ; RESET IF NOT READY
CALL NZ,HDSK_DSKRESET ; RESET IF NOT READY
; SET DEVICE ; SET DEVICE
LD A,(HSTDSK)
AND $0F
LD A,(HDSK_UNIT)
;AND $0F
LD (HDSK_DEVICE),A LD (HDSK_DEVICE),A
; ; INCOMING TRK:SEC ACTUALLY REPRESENTS 32 BIT LBA ; ; INCOMING TRK:SEC ACTUALLY REPRESENTS 32 BIT LBA
@ -142,7 +181,7 @@ HDSK_RW:
LD (HDSK_SEC),A ; MAPS TO LSB OF HDSK SEC LD (HDSK_SEC),A ; MAPS TO LSB OF HDSK SEC
; SET TRANSFER ADDRESS ; SET TRANSFER ADDRESS
LD BC,(DIOBUF)
LD BC,(HDSK_DSKBUF)
LD (HDSK_DMA),BC LD (HDSK_DMA),BC
; EXECUTE COMMAND ; EXECUTE COMMAND
@ -180,12 +219,12 @@ HDSK_OK:
; ;
; ;
; ;
HDSK_RESET:
HDSK_DSKRESET:
LD B,32 LD B,32
LD A,HDSK_CMDRESET LD A,HDSK_CMDRESET
HDSK_RESET1:
HDSK_DSKRESET1:
OUT ($FD),A OUT ($FD),A
DJNZ HDSK_RESET1
DJNZ HDSK_DSKRESET1
XOR A ; STATUS = OK XOR A ; STATUS = OK
LD (HDSK_STAT),A ; SAVE IT LD (HDSK_STAT),A ; SAVE IT
@ -256,7 +295,7 @@ HDSK_PRTRW:
LD A,(HDSK_SEC) LD A,(HDSK_SEC)
CALL PRTHEXBYTE CALL PRTHEXBYTE
CALL PC_SPACE CALL PC_SPACE
LD BC,(HDSK_DMA)
LD BC,(HDSK_DSKBUF)
CALL PRTHEXWORD CALL PRTHEXWORD
CALL PC_SPACE CALL PC_SPACE
@ -305,9 +344,12 @@ HDSKSTR_RCUNK .TEXT "UNKNOWN ERROR$"
HDSK_STAT .DB 0 HDSK_STAT .DB 0
HDSK_RC .DB 0 HDSK_RC .DB 0
; ;
HDSK_UNIT .DB 0
HDSK_DSKBUF .DW 0
;
HDSK_PARMBLK: HDSK_PARMBLK:
HDSK_CMD .DB 0 ; COMMAND (HDSK_READ, HDSK_WRITE, ...) HDSK_CMD .DB 0 ; COMMAND (HDSK_READ, HDSK_WRITE, ...)
HDSK_DEVICE .DB 0 ; 0..7, HARD DISK UNIT HDSK_DEVICE .DB 0 ; 0..7, HARD DISK UNIT
HDSK_SEC .DB 0 ; 0..255 SECTOR HDSK_SEC .DB 0 ; 0..255 SECTOR
HDSK_TRK .DW 0 ; 0..2047 TRACK HDSK_TRK .DW 0 ; 0..2047 TRACK
HDSK_DMA .DW 0 ; DEFINES WHERE RESULT IS PLACED IN MEMORY
HDSK_DMA .DW 0 ; DEFINES WHERE RESULT IS PLACED IN MEMORY

143
Source/HBIOS/ide.asm

@ -106,7 +106,7 @@
; IDE2: SECONDARY MASTER ; IDE2: SECONDARY MASTER
; IDE3: SECONDARY SLAVE ; IDE3: SECONDARY SLAVE
; ;
IDE_UNITCNT .EQU 2 ; ASSUME ONLY PRIMARY INTERFACE
IDE_UNITCNT .EQU 2 ; ASSUME ONLY PRIMARY INTERFACE
; ;
#IF (IDEMODE == IDEMODE_MK4) #IF (IDEMODE == IDEMODE_MK4)
IDE_IO_BASE .EQU MK4_IDE IDE_IO_BASE .EQU MK4_IDE
@ -154,11 +154,11 @@ IDE_IO_DRVADR .EQU $IDE_IO_BASE + $0F ; DRIVE ADDRESS REGISTER (R)
; ;
; COMMAND BYTES ; COMMAND BYTES
; ;
IDE_CMD_RECAL .EQU $10
IDE_CMD_READ .EQU $20
IDE_CMD_WRITE .EQU $30
IDE_CMD_IDDEV .EQU $EC
IDE_CMD_SETFEAT .EQU $EF
IDE_CIDE_RECAL .EQU $10
IDE_CIDE_READ .EQU $20
IDE_CIDE_WRITE .EQU $30
IDE_CIDE_IDDEV .EQU $EC
IDE_CIDE_SETFEAT .EQU $EF
; ;
; FEATURE BYTES ; FEATURE BYTES
; ;
@ -242,9 +242,11 @@ IDE_INIT1:
RET ; DONE RET ; DONE
; ;
IDE_INIT2: IDE_INIT2:
; DISPLAY DEVICE INFO
CALL IDE_SELUNIT ; SELECT UNIT
RET NZ ; ABORT ON ERROR
; ; DISPLAY DEVICE INFO
; CALL IDE_SELUNIT ; SELECT UNIT
; RET NZ ; ABORT ON ERROR
;
LD (IDE_UNIT),A ; SET CURRENT UNIT
; ;
; CHECK FOR BAD STATUS ; CHECK FOR BAD STATUS
IDE_DPTR(IDE_STAT) ; GET STATUS ADR IN HL, AF TRASHED IDE_DPTR(IDE_STAT) ; GET STATUS ADR IN HL, AF TRASHED
@ -290,41 +292,56 @@ IDE_INIT2:
;============================================================================= ;=============================================================================
; ;
IDE_DISPATCH: IDE_DISPATCH:
LD A,C ; DEVICE/UNIT TO A
AND $0F ; REMOVE DEVICE BITS LEAVING JUST UNIT ID
CALL IDE_SELUNIT ; SELECT DESIRED UNIT
RET NZ ; ABORT ON ERROR
; VERIFY AND SAVE THE TARGET DEVICE/UNIT LOCALLY IN DRIVER
LD A,C ; DEVICE/UNIT FROM C
AND $0F ; ISOLATE UNIT NUM
CP IDE_UNITCNT
CALL NC,PANIC ; PANIC IF TOO HIGH
LD (IDE_UNIT),A ; SAVE IT
;CALL IDE_SELUNIT ; SELECT DESIRED UNIT
;
; DISPATCH ACCORDING TO DISK SUB-FUNCTION
LD A,B ; GET REQUESTED FUNCTION LD A,B ; GET REQUESTED FUNCTION
AND $0F
JR Z,IDE_READ
DEC A
JR Z,IDE_WRITE
DEC A
JR Z,IDE_STATUS
DEC A
JR Z,IDE_MEDIA
DEC A
JR Z,IDE_CAP
DEC A
JR Z,IDE_GEOM
CALL PANIC
AND $0F ; ISOLATE SUB-FUNCTION
JP Z,IDE_SEEK ; SUB-FUNC 0: SEEK, USE HBIOS FOR NOW
DEC A
JP Z,IDE_READ ; SUB-FUNC 1: READ
DEC A
JP Z,IDE_WRITE ; SUB-FUNC 2: WRITE
DEC A
JP Z,IDE_STATUS ; SUB-FUNC 3: STATUS
DEC A
JP Z,IDE_RESET ; SUB-FUNC 4: RESET
DEC A
JP Z,IDE_CAP ; SUB-FUNC 5: GET CAPACITY
DEC A
JP Z,IDE_GEOM ; SUB-FUNC 6: GET GEOMETRY
DEC A
JP Z,IDE_GETPAR ; SUB-FUNC 7: GET PARAMETERS
DEC A
JP Z,IDE_SETPAR ; SUB-FUNC 8: SET PARAMETERS
CALL PANIC ; INVALID SUB-FUNCTION
; ;
; ;
; ;
IDE_READ: IDE_READ:
LD (IDE_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
#IF (IDETRACE == 1) #IF (IDETRACE == 1)
LD HL,IDE_PRTERR ; SET UP IDE_PRTERR LD HL,IDE_PRTERR ; SET UP IDE_PRTERR
PUSH HL ; ... TO FILTER ALL EXITS PUSH HL ; ... TO FILTER ALL EXITS
#ENDIF #ENDIF
CALL IDE_SELUNIT ; HARDWARE SELECTION OF TARGET UNIT
JP IDE_RDSEC JP IDE_RDSEC
; ;
; ;
; ;
IDE_WRITE: IDE_WRITE:
LD (IDE_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
#IF (IDETRACE == 1) #IF (IDETRACE == 1)
LD HL,IDE_PRTERR ; SET UP IDE_PRTERR LD HL,IDE_PRTERR ; SET UP IDE_PRTERR
PUSH HL ; ... TO FILTER ALL EXITS PUSH HL ; ... TO FILTER ALL EXITS
#ENDIF #ENDIF
CALL IDE_SELUNIT ; HARDWARE SELECTION OF TARGET UNIT
JP IDE_WRSEC JP IDE_WRSEC
; ;
; ;
@ -338,12 +355,17 @@ IDE_STATUS:
; ;
; IDE_MEDIA ; IDE_MEDIA
; ;
IDE_MEDIA:
IDE_GETPAR:
; THE ONLY WAY TO RESET AN IDE DEVICE IS TO RESET
; THE ENTIRE INTERFACE. SO, TO HANDLE POSSIBLE HOT
; SWAP WE DO THAT, THEN RESELECT THE DESIRED UNIT AND
; CONTINUE.
LD A,(IDE_UNIT) ; GET UNIT SELECTION LD A,(IDE_UNIT) ; GET UNIT SELECTION
PUSH AF ; SAVE UNIT SELECTION PUSH AF ; SAVE UNIT SELECTION
CALL IDE_RESET ; RESET ALL DEVICES ON BUS CALL IDE_RESET ; RESET ALL DEVICES ON BUS
POP AF ; RECOVER UNIT SELECTION POP AF ; RECOVER UNIT SELECTION
CALL IDE_SELUNIT ; RESELECT DESIRED UNIT
LD (IDE_UNIT),A ; RESTORE UNIT SELECTION
;CALL IDE_SELUNIT ; RESELECT DESIRED UNIT
; ;
IDE_DPTR(IDE_STAT) ; POINT TO UNIT STATUS IDE_DPTR(IDE_STAT) ; POINT TO UNIT STATUS
LD A,(HL) ; GET STATUS LD A,(HL) ; GET STATUS
@ -351,14 +373,31 @@ IDE_MEDIA:
#IF (IDETRACE == 1) #IF (IDETRACE == 1)
CALL IDE_PRTERR ; PRINT ANY ERRORS CALL IDE_PRTERR ; PRINT ANY ERRORS
#ENDIF #ENDIF
LD A,MID_HD ; ASSUME WE ARE OK
LD E,MID_HD ; ASSUME WE ARE OK
RET Z ; RETURN IF GOOD INIT RET Z ; RETURN IF GOOD INIT
LD A,MID_NONE ; SIGNAL NO MEDA
OR A ; SET FLAGS
LD E,MID_NONE ; SIGNAL NO MEDA
RET ; AND RETURN RET ; AND RETURN
; ;
; ;
; ;
IDE_SETPAR:
; NOT IMPLEMENTED
XOR A
RET
;
;
;
IDE_SEEK:
BIT 7,D ; CHECK FOR LBA FLAG
CALL Z,HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA
RES 7,D ; CLEAR FLAG REGARDLESS (DOES NO HARM IF ALREADY LBA)
LD BC,HSTLBA ; POINT TO LBA STORAGE
CALL ST32 ; SAVE LBA ADDRESS
XOR A ; SIGNAL SUCCESS
RET ; AND RETURN
;
;
;
IDE_CAP: IDE_CAP:
IDE_DPTR(IDE_CAPACITY) ; POINT HL TO CAPACITY OF CUR UNIT IDE_DPTR(IDE_CAPACITY) ; POINT HL TO CAPACITY OF CUR UNIT
CALL LD32 ; GET THE CURRENT CAPACITY DO DE:HL CALL LD32 ; GET THE CURRENT CAPACITY DO DE:HL
@ -397,7 +436,7 @@ IDE_SETFEAT:
OUT (IDE_IO_FEAT),A ; SET THE FEATURE VALUE OUT (IDE_IO_FEAT),A ; SET THE FEATURE VALUE
DCALL PC_SPACE DCALL PC_SPACE
DCALL PRTHEXBYTE DCALL PRTHEXBYTE
LD A,IDE_CMD_SETFEAT ; CMD = SETFEAT
LD A,IDE_CIDE_SETFEAT ; CMD = SETFEAT
LD (IDE_CMD),A ; SAVE IT LD (IDE_CMD),A ; SAVE IT
JP IDE_RUNCMD ; RUN COMMAND AND EXIT JP IDE_RUNCMD ; RUN COMMAND AND EXIT
; ;
@ -412,7 +451,7 @@ IDE_IDENTIFY:
OUT (IDE_IO_DRVHD),A OUT (IDE_IO_DRVHD),A
DCALL PC_SPACE DCALL PC_SPACE
DCALL PRTHEXBYTE DCALL PRTHEXBYTE
LD A,IDE_CMD_IDDEV
LD A,IDE_CIDE_IDDEV
LD (IDE_CMD),A LD (IDE_CMD),A
CALL IDE_RUNCMD CALL IDE_RUNCMD
RET NZ RET NZ
@ -434,11 +473,11 @@ IDE_RDSEC:
DCALL PC_SPACE DCALL PC_SPACE
DCALL PRTHEXBYTE DCALL PRTHEXBYTE
CALL IDE_SETADDR ; SETUP CYL, TRK, HEAD CALL IDE_SETADDR ; SETUP CYL, TRK, HEAD
LD A,IDE_CMD_READ
LD A,IDE_CIDE_READ
LD (IDE_CMD),A LD (IDE_CMD),A
CALL IDE_RUNCMD CALL IDE_RUNCMD
RET NZ RET NZ
LD HL,(DIOBUF)
LD HL,(IDE_DSKBUF)
JP IDE_GETBUF JP IDE_GETBUF
; ;
; ;
@ -456,11 +495,11 @@ IDE_WRSEC:
DCALL PC_SPACE DCALL PC_SPACE
DCALL PRTHEXBYTE DCALL PRTHEXBYTE
CALL IDE_SETADDR ; SETUP CYL, TRK, HEAD CALL IDE_SETADDR ; SETUP CYL, TRK, HEAD
LD A,IDE_CMD_WRITE
LD A,IDE_CIDE_WRITE
LD (IDE_CMD),A LD (IDE_CMD),A
CALL IDE_RUNCMD CALL IDE_RUNCMD
RET NZ RET NZ
LD HL,(DIOBUF)
LD HL,(IDE_DSKBUF)
JP IDE_PUTBUF JP IDE_PUTBUF
; ;
; ;
@ -535,7 +574,7 @@ IDE_GETBUF:
CALL IDE_WAITDRQ ; WAIT FOR BUFFER READY CALL IDE_WAITDRQ ; WAIT FOR BUFFER READY
RET NZ ; BAIL OUT IF TIMEOUT RET NZ ; BAIL OUT IF TIMEOUT
;LD HL,(DIOBUF)
;LD HL,(IDE_DSKBUF)
LD B,0 LD B,0
#IF (IDE8BIT | (IDEMODE == IDEMODE_DIDE)) #IF (IDE8BIT | (IDEMODE == IDEMODE_DIDE))
@ -574,7 +613,7 @@ IDE_PUTBUF:
CALL IDE_WAITDRQ ; WAIT FOR BUFFER READY CALL IDE_WAITDRQ ; WAIT FOR BUFFER READY
RET NZ ; BAIL OUT IF TIMEOUT RET NZ ; BAIL OUT IF TIMEOUT
; ;
;LD HL,(DIOBUF)
;LD HL,(IDE_DSKBUF)
LD B,0 LD B,0
#IF (IDE8BIT | (IDEMODE == IDEMODE_DIDE)) #IF (IDE8BIT | (IDEMODE == IDEMODE_DIDE))
@ -646,6 +685,9 @@ IDE_RESET:
XOR A XOR A
CALL FILL CALL FILL
; ;
LD A,(IDE_UNIT) ; GET THE CURRENT UNIT SELECTION
PUSH AF ; AND SAVE IT
; PROBE / INITIALIZE ALL UNITS ; PROBE / INITIALIZE ALL UNITS
LD B,IDE_UNITCNT ; NUMBER OF UNITS TO TRY LD B,IDE_UNITCNT ; NUMBER OF UNITS TO TRY
LD C,0 ; UNIT INDEX FOR LOOP LD C,0 ; UNIT INDEX FOR LOOP
@ -656,6 +698,9 @@ IDE_RESET1:
POP BC POP BC
INC C ; NEXT UNIT INC C ; NEXT UNIT
DJNZ IDE_RESET1 ; LOOP AS NEEDED DJNZ IDE_RESET1 ; LOOP AS NEEDED
;
POP AF ; RECOVER ORIGINAL UNIT NUMBER
CALL IDE_SELUNIT ; ... AND SELECT IT
; ;
XOR A ; SIGNAL SUCCESS XOR A ; SIGNAL SUCCESS
RET ; AND DONE RET ; AND DONE
@ -663,12 +708,20 @@ IDE_RESET1:
; ;
; ;
IDE_INITUNIT: IDE_INITUNIT:
LD (IDE_UNIT),A ; SET ACTIVE UNIT
CALL IDE_SELUNIT ; SELECT UNIT CALL IDE_SELUNIT ; SELECT UNIT
RET NZ ; ABORT IF ERROR RET NZ ; ABORT IF ERROR
CALL IDE_PROBE ; DO PROBE CALL IDE_PROBE ; DO PROBE
RET NZ ; ABORT IF ERROR RET NZ ; ABORT IF ERROR
OR $FF
OUT (IDE_IO_COUNT),A ; ZERO KEY REGISTERS IN TESTED DEVICE
OUT (IDE_IO_SECT),A ; ZERO KEY REGISTERS IN TESTED DEVICE
;RET
JP IDE_INITDEV ; INIT DEVICE AND RETURN JP IDE_INITDEV ; INIT DEVICE AND RETURN
; ;
; TAKE ANY ACTIONS REQUIRED TO SELECT DESIRED PHYSICAL UNIT ; TAKE ANY ACTIONS REQUIRED TO SELECT DESIRED PHYSICAL UNIT
@ -682,17 +735,20 @@ IDE_SELUNIT:
CP IDE_UNITCNT ; CHECK VALIDITY (EXCEED UNIT COUNT?) CP IDE_UNITCNT ; CHECK VALIDITY (EXCEED UNIT COUNT?)
JP NC,IDE_INVUNIT ; HANDLE INVALID UNIT JP NC,IDE_INVUNIT ; HANDLE INVALID UNIT
; ;
; NEW UNIT SELECTED, IMPLEMENT IT
LD (IDE_UNIT),A ; RECORD NEW UNIT NUMBER
; ; NEW UNIT SELECTED, IMPLEMENT IT
; LD (IDE_UNIT),A ; RECORD NEW UNIT NUMBER
;
; ;
#IF (IDEMODE == IDEMODE_DIDE) #IF (IDEMODE == IDEMODE_DIDE)
; SELECT PRIMARY/SECONDARY INTERFACE FOR DIDE HARDWARE ; SELECT PRIMARY/SECONDARY INTERFACE FOR DIDE HARDWARE
#ENDIF #ENDIF
; ;
PUSH HL ; SAVE HL
AND $01 ; LS BIT DETERMINES MASTER/SLAVE AND $01 ; LS BIT DETERMINES MASTER/SLAVE
LD HL,IDE_DRVSEL LD HL,IDE_DRVSEL
CALL ADDHLA CALL ADDHLA
LD A,(HL) ; LOAD DRIVE/HEAD VALUE LD A,(HL) ; LOAD DRIVE/HEAD VALUE
POP HL ; RECOVER HL
; ;
OUT (IDE_IO_DRVHD),A ; SELECT DRIVE OUT (IDE_IO_DRVHD),A ; SELECT DRIVE
LD (IDE_DRVHD),A ; UPDATE SHADOW REGISTER LD (IDE_DRVHD),A ; UPDATE SHADOW REGISTER
@ -1060,6 +1116,7 @@ IDE_CMD .DB 0 ; PENDING COMMAND TO PROCESS
IDE_DRVHD .DB 0 ; CURRENT DRIVE/HEAD MASK IDE_DRVHD .DB 0 ; CURRENT DRIVE/HEAD MASK
; ;
IDE_UNIT .DB 0 ; ACTIVE UNIT, DEFAULT TO ZERO IDE_UNIT .DB 0 ; ACTIVE UNIT, DEFAULT TO ZERO
IDE_DSKBUF .DW 0 ; ACTIVE DISK BUFFER
; ;
; UNIT SPECIFIC DATA STORAGE ; UNIT SPECIFIC DATA STORAGE
; ;

78
Source/HBIOS/md.asm

@ -3,6 +3,8 @@
; MD DISK DRIVER (MEMORY DISK) ; MD DISK DRIVER (MEMORY DISK)
;================================================================================================== ;==================================================================================================
; ;
MD_UNITCNT .EQU 2
;
; ;
; ;
MD_INIT: MD_INIT:
@ -20,34 +22,44 @@ MD_INIT:
; ;
; ;
MD_DISPATCH: MD_DISPATCH:
; VERIFY AND SAVE THE TARGET DEVICE/UNIT LOCALLY IN DRIVER
LD A,C ; DEVICE/UNIT FROM C
AND $0F ; ISOLATE UNIT NUM
CP MD_UNITCNT
CALL NC,PANIC ; PANIC IF TOO HIGH
LD (MD_UNIT),A ; SAVE IT
;
; DISPATCH ACCORDING TO DISK SUB-FUNCTION
LD A,B ; GET REQUESTED FUNCTION LD A,B ; GET REQUESTED FUNCTION
AND $0F
JP Z,MD_READ
AND $0F ; ISOLATE SUB-FUNCTION
JP Z,MD_SEEK ; SUB-FUNC 0: SEEK, USE HBIOS FOR NOW
DEC A
JP Z,MD_READ ; SUB-FUNC 1: READ
DEC A
JP Z,MD_WRITE ; SUB-FUNC 2: WRITE
DEC A
JP Z,MD_STATUS ; SUB-FUNC 3: STATUS
DEC A DEC A
JP Z,MD_WRITE
JP Z,MD_RESET ; SUB-FUNC 4: RESET
DEC A DEC A
JP Z,MD_STATUS
JP Z,MD_CAP ; SUB-FUNC 5: GET CAPACITY
DEC A DEC A
JP Z,MD_MEDIA
JP Z,MD_GEOM ; SUB-FUNC 6: GET GEOMETRY
DEC A DEC A
JP Z,MD_CAP
JP Z,MD_GETPAR ; SUB-FUNC 7: GET PARAMETERS
DEC A DEC A
JP Z,MD_GEOM
CALL PANIC
JP Z,MD_SETPAR ; SUB-FUNC 8: SET PARAMETERS
CALL PANIC ; INVALID SUB-FUNCTION
; ;
; ;
; ;
MD_MEDIA:
LD A,C ; DEVICE/UNIT IS IN C
AND $0F ; ISOLATE UNIT NUM
CP 2 ; CHECK FOR MAX UNIT EXCEEDED
CALL NC,PANIC ; PANIC IF TOO HIGH
ADD A,MID_MDROM ; SET CORRECT MEDIA VALUE
MD_STATUS:
XOR A ; ALWAYS OK
RET RET
; ;
; ;
; ;
MD_STATUS:
MD_RESET:
XOR A ; ALWAYS OK XOR A ; ALWAYS OK
RET RET
; ;
@ -92,7 +104,35 @@ MD_GEOM1:
; ;
; ;
; ;
MD_GETPAR:
LD A,C ; DEVICE/UNIT IS IN C
ADD A,MID_MDROM ; SET CORRECT MEDIA VALUE
LD E,A ; VALUE TO E
XOR A ; SIGNAL SUCCESS
RET
;
;
;
MD_SETPAR:
; NOT IMPLEMENTED
XOR A
RET
;
;
;
MD_SEEK:
BIT 7,D ; CHECK FOR LBA FLAG
CALL Z,HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA
RES 7,D ; CLEAR FLAG REGARDLESS (DOES NO HARM IF ALREADY LBA)
LD BC,HSTLBA ; POINT TO LBA STORAGE
CALL ST32 ; SAVE LBA ADDRESS
XOR A ; SIGNAL SUCCESS
RET ; AND RETURN
;
;
;
MD_READ: MD_READ:
LD (MD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
CALL MD_IOSETUP ; SETUP FOR MEMORY COPY CALL MD_IOSETUP ; SETUP FOR MEMORY COPY
#IF (MDTRACE >= 2) #IF (MDTRACE >= 2)
LD (MD_SRC),HL LD (MD_SRC),HL
@ -118,6 +158,7 @@ MD_READ:
; ;
; ;
MD_WRITE: MD_WRITE:
LD (MD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
LD A,C ; DEVICE/UNIT IS IN C LD A,C ; DEVICE/UNIT IS IN C
AND $0F ; ISOLATE UNIT NUM AND $0F ; ISOLATE UNIT NUM
LD A,1 ; PREPARE TO RETURN FALSE LD A,1 ; PREPARE TO RETURN FALSE
@ -186,7 +227,7 @@ MD_IOSETUP:
RL H ; FULL WORD RL H ; FULL WORD
LD C,H ; BANK NUMBER FROM H TO C LD C,H ; BANK NUMBER FROM H TO C
; GET BANK NUM TO A AND SET FLAG Z=ROM, NZ=RAM ; GET BANK NUM TO A AND SET FLAG Z=ROM, NZ=RAM
LD A,(HSTDSK) ; DEVICE/UNIT TO A
LD A,(MD_UNIT) ; DEVICE/UNIT TO A
AND $01 ; ISOLATE LOW BIT, SET ZF AND $01 ; ISOLATE LOW BIT, SET ZF
LD A,C ; BANK VALUE INTO A LD A,C ; BANK VALUE INTO A
PUSH AF ; SAVE IT FOR NOW PUSH AF ; SAVE IT FOR NOW
@ -195,7 +236,7 @@ MD_IOSETUP:
LD H,L ; MOVE MSB TO H WHERE IT BELONGS LD H,L ; MOVE MSB TO H WHERE IT BELONGS
LD L,0 ; AND ZERO L SO HL IS NOW BYTE OFFSET LD L,0 ; AND ZERO L SO HL IS NOW BYTE OFFSET
; LOAD DESTINATION AND COUNT ; LOAD DESTINATION AND COUNT
LD DE,(DIOBUF) ; DMA ADDRESS IS DESTINATION
LD DE,(MD_DSKBUF) ; DMA ADDRESS IS DESTINATION
LD BC,512 ; ALWAYS COPY ONE SECTOR LD BC,512 ; ALWAYS COPY ONE SECTOR
; FINISH UP ; FINISH UP
POP AF ; GET BANK AND FLAGS BACK POP AF ; GET BANK AND FLAGS BACK
@ -255,6 +296,9 @@ MD_PRT:
; ;
; ;
; ;
MD_UNIT .DB 0
MD_DSKBUF .DW 0
;
MD_SRCBNK .DB 0 MD_SRCBNK .DB 0
MD_DSTBNK .DB 0 MD_DSTBNK .DB 0
MD_SRC .DW 0 MD_SRC .DW 0

119
Source/HBIOS/ppide.asm

@ -152,7 +152,7 @@ PPIDE_REG_DRVADR .EQU PPIDE_CTL_CS3FX | $07 ; DRIVE ADDRESS REGISTER (R)
; PPIDE2: SECONDARY MASTER ; PPIDE2: SECONDARY MASTER
; PPIDE3: SECONDARY SLAVE ; PPIDE3: SECONDARY SLAVE
; ;
PPIDE_UNITCNT .EQU 2 ; ASSUME ONLY PRIMARY INTERFACE
PPIDE_UNITCNT .EQU 2 ; ASSUME ONLY PRIMARY INTERFACE
; ;
; COMMAND BYTES ; COMMAND BYTES
; ;
@ -233,9 +233,11 @@ PPIDE_INIT1:
RET ; DONE RET ; DONE
; ;
PPIDE_INIT2: PPIDE_INIT2:
; DISPLAY DEVICE INFO
CALL PPIDE_SELUNIT ; SELECT UNIT
RET NZ ; ABORT ON ERROR
; ; DISPLAY DEVICE INFO
; CALL PPIDE_SELUNIT ; SELECT UNIT
; RET NZ ; ABORT ON ERROR
;
LD (PPIDE_UNIT),A ; SET CURRENT UNIT
; ;
; CHECK FOR BAD STATUS ; CHECK FOR BAD STATUS
PPIDE_DPTR(PPIDE_STAT) ; GET STATUS ADR IN HL, AF TRASHED PPIDE_DPTR(PPIDE_STAT) ; GET STATUS ADR IN HL, AF TRASHED
@ -281,28 +283,40 @@ PPIDE_INIT2:
;============================================================================= ;=============================================================================
; ;
PPIDE_DISPATCH: PPIDE_DISPATCH:
LD A,C ; DEVICE/UNIT TO A
AND $0F ; REMOVE DEVICE BITS LEAVING JUST UNIT ID
CALL PPIDE_SELUNIT ; SELECT DESIRED UNIT
RET NZ ; ABORT ON ERROR
; VERIFY AND SAVE THE TARGET DEVICE/UNIT LOCALLY IN DRIVER
LD A,C ; DEVICE/UNIT FROM C
AND $0F ; ISOLATE UNIT NUM
CP PPIDE_UNITCNT
CALL NC,PANIC ; PANIC IF TOO HIGH
LD (PPIDE_UNIT),A ; SAVE IT
;CALL PPIDE_SELUNIT ; SELECT DESIRED UNIT
;
; DISPATCH ACCORDING TO DISK SUB-FUNCTION
LD A,B ; GET REQUESTED FUNCTION LD A,B ; GET REQUESTED FUNCTION
AND $0F
JR Z,PPIDE_READ
DEC A
JR Z,PPIDE_WRITE
DEC A
JR Z,PPIDE_STATUS
DEC A
JR Z,PPIDE_MEDIA
DEC A
JR Z,PPIDE_CAP
DEC A
JR Z,PPIDE_GEOM
CALL PANIC
AND $0F ; ISOLATE SUB-FUNCTION
JP Z,PPIDE_SEEK ; SUB-FUNC 0: SEEK, USE HBIOS FOR NOW
DEC A
JP Z,PPIDE_READ ; SUB-FUNC 1: READ
DEC A
JP Z,PPIDE_WRITE ; SUB-FUNC 2: WRITE
DEC A
JP Z,PPIDE_STATUS ; SUB-FUNC 3: STATUS
DEC A
JP Z,PPIDE_RESET ; SUB-FUNC 4: RESET
DEC A
JP Z,PPIDE_CAP ; SUB-FUNC 5: GET CAPACITY
DEC A
JP Z,PPIDE_GEOM ; SUB-FUNC 6: GET GEOMETRY
DEC A
JP Z,PPIDE_GETPAR ; SUB-FUNC 7: GET PARAMETERS
DEC A
JP Z,PPIDE_SETPAR ; SUB-FUNC 8: SET PARAMETERS
CALL PANIC ; INVALID SUB-FUNCTION
; ;
; ;
; ;
PPIDE_READ: PPIDE_READ:
LD (PPIDE_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
#IF (PPIDETRACE == 1) #IF (PPIDETRACE == 1)
LD HL,PPIDE_PRTERR ; SET UP PPIDE_PRTERR LD HL,PPIDE_PRTERR ; SET UP PPIDE_PRTERR
PUSH HL ; ... TO FILTER ALL EXITS PUSH HL ; ... TO FILTER ALL EXITS
@ -312,6 +326,7 @@ PPIDE_READ:
; ;
; ;
PPIDE_WRITE: PPIDE_WRITE:
LD (PPIDE_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
#IF (PPIDETRACE == 1) #IF (PPIDETRACE == 1)
LD HL,PPIDE_PRTERR ; SET UP PPIDE_PRTERR LD HL,PPIDE_PRTERR ; SET UP PPIDE_PRTERR
PUSH HL ; ... TO FILTER ALL EXITS PUSH HL ; ... TO FILTER ALL EXITS
@ -329,7 +344,7 @@ PPIDE_STATUS:
; ;
; PPIDE_MEDIA ; PPIDE_MEDIA
; ;
PPIDE_MEDIA:
PPIDE_GETPAR:
; THE ONLY WAY TO RESET AN IDE DEVICE IS TO RESET ; THE ONLY WAY TO RESET AN IDE DEVICE IS TO RESET
; THE ENTIRE INTERFACE. SO, TO HANDLE POSSIBLE HOT ; THE ENTIRE INTERFACE. SO, TO HANDLE POSSIBLE HOT
; SWAP WE DO THAT, THEN RESELECT THE DESIRED UNIT AND ; SWAP WE DO THAT, THEN RESELECT THE DESIRED UNIT AND
@ -338,7 +353,8 @@ PPIDE_MEDIA:
PUSH AF ; SAVE UNIT SELECTION PUSH AF ; SAVE UNIT SELECTION
CALL PPIDE_RESET ; RESET ALL DEVICES ON BUS CALL PPIDE_RESET ; RESET ALL DEVICES ON BUS
POP AF ; RECOVER UNIT SELECTION POP AF ; RECOVER UNIT SELECTION
CALL PPIDE_SELUNIT ; RESELECT DESIRED UNIT
LD (PPIDE_UNIT),A ; RESTORE UNIT SELECTION
;CALL PPIDE_SELUNIT ; RESELECT DESIRED UNIT
; ;
PPIDE_DPTR(PPIDE_STAT) ; POINT TO UNIT STATUS PPIDE_DPTR(PPIDE_STAT) ; POINT TO UNIT STATUS
LD A,(HL) ; GET STATUS LD A,(HL) ; GET STATUS
@ -346,14 +362,31 @@ PPIDE_MEDIA:
#IF (PPIDETRACE == 1) #IF (PPIDETRACE == 1)
CALL PPIDE_PRTERR ; PRINT ANY ERRORS CALL PPIDE_PRTERR ; PRINT ANY ERRORS
#ENDIF #ENDIF
LD A,MID_HD ; ASSUME WE ARE OK
LD E,MID_HD ; ASSUME WE ARE OK
RET Z ; RETURN IF GOOD INIT RET Z ; RETURN IF GOOD INIT
LD A,MID_NONE ; SIGNAL NO MEDA
OR A ; SET FLAGS
LD E,MID_NONE ; SIGNAL NO MEDA
RET ; AND RETURN RET ; AND RETURN
; ;
; ;
; ;
PPIDE_SETPAR:
; NOT IMPLEMENTED
XOR A
RET
;
;
;
PPIDE_SEEK:
BIT 7,D ; CHECK FOR LBA FLAG
CALL Z,HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA
RES 7,D ; CLEAR FLAG REGARDLESS (DOES NO HARM IF ALREADY LBA)
LD BC,HSTLBA ; POINT TO LBA STORAGE
CALL ST32 ; SAVE LBA ADDRESS
XOR A ; SIGNAL SUCCESS
RET ; AND RETURN
;
;
;
PPIDE_CAP: PPIDE_CAP:
PPIDE_DPTR(PPIDE_CAPACITY) ; POINT HL TO CAPACITY OF CUR UNIT PPIDE_DPTR(PPIDE_CAPACITY) ; POINT HL TO CAPACITY OF CUR UNIT
CALL LD32 ; GET THE CURRENT CAPACITY DO DE:HL CALL LD32 ; GET THE CURRENT CAPACITY DO DE:HL
@ -443,7 +476,7 @@ PPIDE_RDSEC:
LD (PPIDE_CMD),A LD (PPIDE_CMD),A
CALL PPIDE_RUNCMD CALL PPIDE_RUNCMD
RET NZ RET NZ
LD HL,(DIOBUF)
LD HL,(PPIDE_DSKBUF)
JP PPIDE_GETBUF JP PPIDE_GETBUF
; ;
; ;
@ -465,7 +498,7 @@ PPIDE_WRSEC:
LD (PPIDE_CMD),A LD (PPIDE_CMD),A
CALL PPIDE_RUNCMD CALL PPIDE_RUNCMD
RET NZ RET NZ
LD HL,(DIOBUF)
LD HL,(PPIDE_DSKBUF)
JP PPIDE_PUTBUF JP PPIDE_PUTBUF
; ;
; ;
@ -549,7 +582,7 @@ PPIDE_GETBUF:
LD D,A ; D := READ ASSERTED LD D,A ; D := READ ASSERTED
; ;
; LOOP SETUP ; LOOP SETUP
;LD HL,(DIOBUF) ; LOCATION OF BUFFER
;LD HL,(PPIDE_DSKBUF) ; LOCATION OF BUFFER
LD B,0 ; 256 ITERATIONS LD B,0 ; 256 ITERATIONS
LD C,PPIDE_IO_DATALO ; SETUP C WITH IO PORT (LSB) LD C,PPIDE_IO_DATALO ; SETUP C WITH IO PORT (LSB)
; ;
@ -608,7 +641,7 @@ PPIDE_PUTBUF:
LD D,A ; D := WRITE ASSERTED LD D,A ; D := WRITE ASSERTED
; ;
; LOOP SETUP ; LOOP SETUP
;LD HL,(DIOBUF) ; LOCATION OF BUFFER
;LD HL,(PPIDE_DSKBUF) ; LOCATION OF BUFFER
LD B,0 ; 256 ITERATIONS LD B,0 ; 256 ITERATIONS
LD C,PPIDE_IO_DATALO ; SETUP C WITH IO PORT (LSB) LD C,PPIDE_IO_DATALO ; SETUP C WITH IO PORT (LSB)
; ;
@ -700,6 +733,9 @@ PPIDE_RESET:
LD BC,PPIDE_UDLEN LD BC,PPIDE_UDLEN
XOR A XOR A
CALL FILL CALL FILL
;
LD A,(PPIDE_UNIT) ; GET THE CURRENT UNIT SELECTION
PUSH AF ; AND SAVE IT
; ;
; PROBE / INITIALIZE ALL UNITS ; PROBE / INITIALIZE ALL UNITS
LD B,PPIDE_UNITCNT ; NUMBER OF UNITS TO TRY LD B,PPIDE_UNITCNT ; NUMBER OF UNITS TO TRY
@ -711,6 +747,9 @@ PPIDE_RESET1:
POP BC POP BC
INC C ; NEXT UNIT INC C ; NEXT UNIT
DJNZ PPIDE_RESET1 ; LOOP AS NEEDED DJNZ PPIDE_RESET1 ; LOOP AS NEEDED
;
POP AF ; RECOVER ORIGINAL UNIT NUMBER
CALL PPIDE_SELUNIT ; ... AND RESELECT IT
; ;
XOR A ; SIGNAL SUCCESS XOR A ; SIGNAL SUCCESS
RET ; AND DONE RET ; AND DONE
@ -718,12 +757,22 @@ PPIDE_RESET1:
; ;
; ;
PPIDE_INITUNIT: PPIDE_INITUNIT:
LD (PPIDE_UNIT),A ; SET ACTIVE UNIT
CALL PPIDE_SELUNIT ; SELECT UNIT CALL PPIDE_SELUNIT ; SELECT UNIT
RET NZ ; ABORT IF ERROR RET NZ ; ABORT IF ERROR
CALL PPIDE_PROBE ; DO PROBE CALL PPIDE_PROBE ; DO PROBE
RET NZ ; ABORT IF ERROR RET NZ ; ABORT IF ERROR
OR $FF
CALL PPIDE_OUT
.DB PPIDE_REG_COUNT
CALL PPIDE_OUT
.DB PPIDE_REG_SECT
;RET
JP PPIDE_INITDEV ; INIT DEVICE AND RETURN JP PPIDE_INITDEV ; INIT DEVICE AND RETURN
; ;
; TAKE ANY ACTIONS REQUIRED TO SELECT DESIRED PHYSICAL UNIT ; TAKE ANY ACTIONS REQUIRED TO SELECT DESIRED PHYSICAL UNIT
@ -738,7 +787,9 @@ PPIDE_SELUNIT:
JP NC,PPIDE_INVUNIT ; HANDLE INVALID UNIT JP NC,PPIDE_INVUNIT ; HANDLE INVALID UNIT
; ;
; NEW UNIT SELECTED, IMPLEMENT IT ; NEW UNIT SELECTED, IMPLEMENT IT
LD (PPIDE_UNIT),A ; RECORD NEW UNIT NUMBER
;LD (PPIDE_UNIT),A ; RECORD NEW UNIT NUMBER
;
PUSH HL ; SAVE HL, IT IS DESTROYED BELOW
; ;
AND $01 ; LS BIT DETERMINES MASTER/SLAVE AND $01 ; LS BIT DETERMINES MASTER/SLAVE
LD HL,PPIDE_DRVSEL LD HL,PPIDE_DRVSEL
@ -752,6 +803,7 @@ PPIDE_SELUNIT:
; ;
; SPEC REQUIRES 400NS DELAY BEFORE CHECKING STATUS REGISTER ; SPEC REQUIRES 400NS DELAY BEFORE CHECKING STATUS REGISTER
; ;
POP HL ; RECOVER HL
XOR A XOR A
RET RET
; ;
@ -1180,6 +1232,7 @@ PPIDE_CMD .DB 0 ; PENDING COMMAND TO PROCESS
PPIDE_DRVHD .DB 0 ; CURRENT DRIVE/HEAD MASK PPIDE_DRVHD .DB 0 ; CURRENT DRIVE/HEAD MASK
; ;
PPIDE_UNIT .DB 0 ; ACTIVE UNIT, DEFAULT TO ZERO PPIDE_UNIT .DB 0 ; ACTIVE UNIT, DEFAULT TO ZERO
PPIDE_DSKBUF .DW 0 ; ACTIVE DISK BUFFER
; ;
; UNIT SPECIFIC DATA STORAGE ; UNIT SPECIFIC DATA STORAGE
; ;

145
Source/HBIOS/ppp.asm

@ -121,11 +121,18 @@ PPP_INITPPP:
; ;
; ;
PPP_DETECT: PPP_DETECT:
LD BC,4000 ; TRY FOR ABOUT 4 SECONDS
LD BC,6000 ; TRY FOR ABOUT 6 SECONDS
PPP_DETECT1: PPP_DETECT1:
LD DE,64 ; 1 MS LD DE,64 ; 1 MS
CALL VDELAY CALL VDELAY
IN A,(PPP_CTL)
BIT 5,A
JR Z,PPP_DETECT1
IN A,(PPP_IO) IN A,(PPP_IO)
;CALL PC_SPACE
;CALL PRTHEXBYTE
CP $AA CP $AA
RET Z ; RETURN IF MATCH RET Z ; RETURN IF MATCH
DEC BC DEC BC
@ -198,9 +205,10 @@ PPP_SNDCMD1:
; ;
PPP_PUTBYTE: PPP_PUTBYTE:
PUSH AF PUSH AF
PPP_PUTBYTE1:
IN A,(PPP_CTL) IN A,(PPP_CTL)
BIT 7,A BIT 7,A
JR Z,PPP_PUTBYTE
JR Z,PPP_PUTBYTE1
POP AF POP AF
OUT (PPP_IO),A OUT (PPP_IO),A
RET RET
@ -262,6 +270,7 @@ PPPCON_IN:
LD D,PPP_CMDKBDRD ; CMD = KEYBOARD READ LD D,PPP_CMDKBDRD ; CMD = KEYBOARD READ
CALL PPP_SNDCMD ; SEND COMMAND CALL PPP_SNDCMD ; SEND COMMAND
CALL PPP_GETBYTE ; GET CHARACTER READ CALL PPP_GETBYTE ; GET CHARACTER READ
LD E,A ; PUT IN E
XOR A ; CLEAR A (SUCCESS) XOR A ; CLEAR A (SUCCESS)
RET ; AND RETURN RET ; AND RETURN
; ;
@ -284,7 +293,7 @@ PPPCON_OUT:
JR Z,PPPCON_OUT ; WAIT IF NECESSARY JR Z,PPPCON_OUT ; WAIT IF NECESSARY
LD D,PPP_CMDVIDOUT ; CMD = VIDEO OUTPUT LD D,PPP_CMDVIDOUT ; CMD = VIDEO OUTPUT
CALL PPP_SNDCMD ; SEND COMMAND CALL PPP_SNDCMD ; SEND COMMAND
LD A,E
LD A,E ; MOVE TO A
CALL PPP_PUTBYTE ; SEND IT CALL PPP_PUTBYTE ; SEND IT
RET ; RETURN RET ; RETURN
; ;
@ -330,7 +339,9 @@ PPPSD_STWRTPROT .EQU -10 ; ATTEMPT TO WRITE TO WRITE PROTECTED MEDIA
PPPSD_INIT: PPPSD_INIT:
; REINITIALIZE THE CARD HERE ; REINITIALIZE THE CARD HERE
CALL PPPSD_INITCARD CALL PPPSD_INITCARD
RET NZ
#IF (PPPSDTRACE < 2)
JP NZ,PPPSD_PRTSTAT ; IF ERROR, SHOW IT
#ENDIF
; ;
CALL NEWLINE CALL NEWLINE
PRTS("PPPSD:$") PRTS("PPPSD:$")
@ -358,28 +369,40 @@ PPPSD_INIT:
; ;
; ;
PPPSD_DISPATCH: PPPSD_DISPATCH:
LD A,C ; DEVICE/UNIT TO A
AND $0F ; REMOVE DEVICE BITS LEAVING JUST UNIT ID
CALL PPPSD_SELUNIT ; SELECT DESIRED UNIT
RET NZ ; ABORT ON ERROR
LD A,B ; GET REQUESTED FUNCTION
AND $0F
JP Z,PPPSD_READ ; READ
DEC A
JP Z,PPPSD_WRITE ; WRITE
DEC A
JP Z,PPPSD_STATUS ; STATUS
DEC A
JP Z,PPPSD_MEDIA ; MEDIA ID
; VERIFY AND SAVE THE TARGET DEVICE/UNIT LOCALLY IN DRIVER
LD A,C ; DEVICE/UNIT FROM C
AND $0F ; ISOLATE UNIT NUM
CP PPPSD_UNITCNT
CALL NC,PANIC ; PANIC IF TOO HIGH
LD (PPPSD_UNIT),A ; SAVE IT
;
; DISPATCH ACCORDING TO DISK SUB-FUNCTION
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JP Z,PPPSD_SEEK ; SUB-FUNC 0: SEEK, USE HBIOS FOR NOW
DEC A
JP Z,PPPSD_READ ; SUB-FUNC 1: READ
DEC A
JP Z,PPPSD_WRITE ; SUB-FUNC 2: WRITE
DEC A
JP Z,PPPSD_STATUS ; SUB-FUNC 3: STATUS
DEC A
JP Z,PPPSD_RESET ; SUB-FUNC 4: RESET
DEC A
JP Z,PPPSD_CAP ; SUB-FUNC 5: GET CAPACITY
DEC A DEC A
JP Z,PPPSD_CAP
JP Z,PPPSD_GEOM ; SUB-FUNC 6: GET GEOMETRY
DEC A DEC A
JP Z,PPPSD_GEOM
CALL PANIC
JP Z,PPPSD_GETPAR ; SUB-FUNC 7: GET PARAMETERS
DEC A
JP Z,PPPSD_SETPAR ; SUB-FUNC 8: SET PARAMETERS
CALL PANIC ; INVALID SUB-FUNCTION
; ;
; READ AN LBA BLOCK FROM THE SD CARD ; READ AN LBA BLOCK FROM THE SD CARD
; ;
PPPSD_READ: PPPSD_READ:
LD (PPPSD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
#IF (PPPSDTRACE == 1) #IF (PPPSDTRACE == 1)
LD HL,PPPSD_PRTERR ; SET UP PPPSD_PRTERR LD HL,PPPSD_PRTERR ; SET UP PPPSD_PRTERR
PUSH HL ; ... TO FILTER ALL EXITS PUSH HL ; ... TO FILTER ALL EXITS
@ -401,17 +424,15 @@ PPPSD_READ:
CALL PPP_SNDCMD ; SEND COMMAND CALL PPP_SNDCMD ; SEND COMMAND
RET NZ RET NZ
LD DE,$FFFF
LD HL,$FFFF
LD BC,HSTLBA
CALL ST32
CALL PPPSD_SENDBLK ; SEND THE LBA BLOCK NUMBER CALL PPPSD_SENDBLK ; SEND THE LBA BLOCK NUMBER
CALL PPP_GETBYTE ; GET READ RESULT CALL PPP_GETBYTE ; GET READ RESULT
LD (PPPSD_DSKSTAT),A ; SAVE IT
#IF (PPPSDTRACE >= 3) #IF (PPPSDTRACE >= 3)
CALL PC_SPACE CALL PC_SPACE
CALL PRTHEXBYTE CALL PRTHEXBYTE
#ENDIF #ENDIF
OR A ; SET FLAGS OR A ; SET FLAGS
JR Z,PPPSD_READ1 JR Z,PPPSD_READ1
@ -427,7 +448,7 @@ PPPSD_READ1:
; READ THE SECTOR DATA ; READ THE SECTOR DATA
LD BC,512 LD BC,512
LD HL,(DIOBUF)
LD HL,(PPPSD_DSKBUF)
PPPSD_READ2: PPPSD_READ2:
CALL PPP_GETBYTE CALL PPP_GETBYTE
LD (HL),A LD (HL),A
@ -443,6 +464,8 @@ PPPSD_READ2:
; WRITE AN LBA BLOCK TO THE SD CARD ; WRITE AN LBA BLOCK TO THE SD CARD
; ;
PPPSD_WRITE: PPPSD_WRITE:
LD (PPPSD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
#IF (PPPSDTRACE == 1) #IF (PPPSDTRACE == 1)
LD HL,PPPSD_PRTERR ; SET UP PPPSD_PRTERR LD HL,PPPSD_PRTERR ; SET UP PPPSD_PRTERR
PUSH HL ; ... TO FILTER ALL EXITS PUSH HL ; ... TO FILTER ALL EXITS
@ -466,7 +489,7 @@ PPPSD_WRITE:
; SEND OVER THE SECTOR CONTENTS ; SEND OVER THE SECTOR CONTENTS
LD BC,512 LD BC,512
LD HL,(DIOBUF)
LD HL,(PPPSD_DSKBUF)
PPPSD_WRITE1: PPPSD_WRITE1:
LD A,(HL) LD A,(HL)
INC HL INC HL
@ -482,10 +505,13 @@ PPPSD_WRITE1:
RET NZ RET NZ
CALL PPPSD_SENDBLK ; SEND THE LBA BLOCK NUMBER CALL PPPSD_SENDBLK ; SEND THE LBA BLOCK NUMBER
CALL PPP_GETBYTE CALL PPP_GETBYTE
LD (PPPSD_DSKSTAT),A ; SAVE IT
#IF (PPPSDTRACE >= 3) #IF (PPPSDTRACE >= 3)
CALL PC_SPACE CALL PC_SPACE
CALL PRTHEXBYTE CALL PRTHEXBYTE
#ENDIF #ENDIF
OR A ; SET FLAGS OR A ; SET FLAGS
RET Z ; DONE IF NO ERRORS RET Z ; DONE IF NO ERRORS
@ -500,23 +526,46 @@ PPPSD_STATUS:
OR A OR A
RET RET
; ;
;
;
PPPSD_RESET:
XOR A ; ALWAYS OK
RET
;
; SETUP FOR SUBSEQUENT ACCESS ; SETUP FOR SUBSEQUENT ACCESS
; INIT CARD IF NOT READY OR ON DRIVE LOG IN ; INIT CARD IF NOT READY OR ON DRIVE LOG IN
; ;
PPPSD_MEDIA:
PPPSD_GETPAR:
; REINITIALIZE THE CARD HERE TO DETERMINE PRESENCE ; REINITIALIZE THE CARD HERE TO DETERMINE PRESENCE
CALL PPPSD_INITCARD CALL PPPSD_INITCARD
#IF (PPPSDTRACE == 1) #IF (PPPSDTRACE == 1)
CALL PPPSD_PRTERR ; PRINT ANY ERRORS CALL PPPSD_PRTERR ; PRINT ANY ERRORS
#ENDIF #ENDIF
LD A,MID_HD ; ASSUME SUCCESS, SETUP MEDIA ID
LD E,MID_HD ; ASSUME WE ARE OK
RET Z ; RETURN IF GOOD INIT RET Z ; RETURN IF GOOD INIT
LD A,MID_NONE ; SIGNAL NO MEDA
OR A ; SET FLAGS
LD E,MID_NONE ; SIGNAL NO MEDA
RET ; AND RETURN RET ; AND RETURN
; ;
; ;
; ;
PPPSD_SETPAR:
; NOT IMPLEMENTED
XOR A
RET
;
;
;
PPPSD_SEEK:
BIT 7,D ; CHECK FOR LBA FLAG
CALL Z,HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA
RES 7,D ; CLEAR FLAG REGARDLESS (DOES NO HARM IF ALREADY LBA)
LD BC,HSTLBA ; POINT TO LBA STORAGE
CALL ST32 ; SAVE LBA ADDRESS
XOR A ; SIGNAL SUCCESS
RET ; AND RETURN
;
;
;
PPPSD_CAP: PPPSD_CAP:
LD HL,PPPSD_BLKCNT ; GET BLOCK COUNT LD HL,PPPSD_BLKCNT ; GET BLOCK COUNT
CALL LD32 ; GET THE CURRENT CAPACITY DO DE:HL CALL LD32 ; GET THE CURRENT CAPACITY DO DE:HL
@ -541,8 +590,6 @@ PPPSD_GEOM:
; UNIT IS SPECIFIED IN A ; UNIT IS SPECIFIED IN A
; ;
PPPSD_SELUNIT: PPPSD_SELUNIT:
CP PPPSD_UNITCNT ; CHECK VALIDITY (EXCEED UNIT COUNT?)
JP NC,PPPSD_INVUNIT ; HANDLE INVALID UNIT
XOR A ; SIGNAL SUCCESS XOR A ; SIGNAL SUCCESS
RET ; DONE RET ; DONE
; ;
@ -554,15 +601,32 @@ PPPSD_INITCARD:
LD BC,PPPSD_UNITDATALEN LD BC,PPPSD_UNITDATALEN
XOR A XOR A
CALL FILL CALL FILL
;
#IF (PPPSDTRACE >= 3)
CALL PPPSD_PRTPREFIX
PRTS(" RESET$")
#ENDIF
; RESET & STATUS DISK ; RESET & STATUS DISK
LD D,PPP_CMDDSKRES ; COMMAND = DSKRESET LD D,PPP_CMDDSKRES ; COMMAND = DSKRESET
CALL PPP_SNDCMD CALL PPP_SNDCMD
RET NZ RET NZ
CALL PPP_GETBYTE
LD (PPPSD_STAT),A ; SAVE UPDATED STATUS
CALL PPP_GETBYTE ; GET STATUS
LD (PPPSD_DSKSTAT),A ; SAVE STATUS
#IF (PPPSDTRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
OR A OR A
RET NZ ; BAIL OUT ON ERROR
JR Z,PPPSD_INITCARD1
; HANDLE ERROR
CALL PPPSD_GETDSKSTAT ; GET FULL ERROR CODE
JP PPPSD_ERRCMD ; HANDLE ERRORS
PPPSD_INITCARD1:
#IF (PPPSDTRACE >= 3) #IF (PPPSDTRACE >= 3)
; GET CSD IF DEBUGGING ; GET CSD IF DEBUGGING
@ -720,6 +784,10 @@ PPPSD_SENDBLK:
LD B,4 LD B,4
PPPSD_SENDBLK1: PPPSD_SENDBLK1:
LD A,(HL) LD A,(HL)
;CALL PC_SPACE
;CALL PRTHEXBYTE
INC HL INC HL
CALL PPP_PUTBYTE CALL PPP_PUTBYTE
DJNZ PPPSD_SENDBLK1 DJNZ PPPSD_SENDBLK1
@ -913,6 +981,9 @@ PPPSD_STR_TYPESDXC .TEXT "SDXC$"
; DATA STORAGE ; DATA STORAGE
;============================================================================= ;=============================================================================
; ;
PPPSD_UNIT .DB 0
PPPSD_DSKBUF .DW 0
;
PPPSD_UNITDATA: PPPSD_UNITDATA:
PPPSD_STAT .DB 0 PPPSD_STAT .DB 0
PPPSD_DSKSTAT .DB 0 PPPSD_DSKSTAT .DB 0

92
Source/HBIOS/prp.asm

@ -226,8 +226,8 @@ PRPSD_STINVUNIT .EQU -1 ; INVALID UNIT
PRPSD_STRDYTO .EQU -2 ; TIMEOUT WAITING FOR CARD TO BE READY PRPSD_STRDYTO .EQU -2 ; TIMEOUT WAITING FOR CARD TO BE READY
PRPSD_STINITTO .EQU -3 ; INITIALIZATOIN TIMEOUT PRPSD_STINITTO .EQU -3 ; INITIALIZATOIN TIMEOUT
PRPSD_STCMDTO .EQU -4 ; TIMEOUT WAITING FOR COMMAND RESPONSE PRPSD_STCMDTO .EQU -4 ; TIMEOUT WAITING FOR COMMAND RESPONSE
PRPSD_STCMDERR .EQU -5 ; COMMAND ERROR OCCURRED (REF SD_RC)
PRPSD_STDATAERR .EQU -6 ; DATA ERROR OCCURRED (REF SD_TOK)
PRPSD_STCMDERR .EQU -5 ; COMMAND ERROR OCCURRED (REF PRPSD_RC)
PRPSD_STDATAERR .EQU -6 ; DATA ERROR OCCURRED (REF PRPSD_TOK)
PRPSD_STDATATO .EQU -7 ; DATA TRANSFER TIMEOUT PRPSD_STDATATO .EQU -7 ; DATA TRANSFER TIMEOUT
PRPSD_STCRCERR .EQU -8 ; CRC ERROR ON RECEIVED DATA PACKET PRPSD_STCRCERR .EQU -8 ; CRC ERROR ON RECEIVED DATA PACKET
PRPSD_STNOMEDIA .EQU -9 ; NO MEDIA IN CONNECTOR PRPSD_STNOMEDIA .EQU -9 ; NO MEDIA IN CONNECTOR
@ -238,7 +238,9 @@ PRPSD_STWRTPROT .EQU -10 ; ATTEMPT TO WRITE TO WRITE PROTECTED MEDIA
PRPSD_INIT: PRPSD_INIT:
; REINITIALIZE THE CARD HERE ; REINITIALIZE THE CARD HERE
CALL PRPSD_INITCARD CALL PRPSD_INITCARD
RET NZ
#IF (PRPSDTRACE < 2)
JP NZ,PRPSD_PRTSTAT ; IF ERROR, SHOW IT
#ENDIF
; ;
CALL PRPSD_PRTPREFIX CALL PRPSD_PRTPREFIX
; ;
@ -265,28 +267,40 @@ PRPSD_INIT:
; ;
; ;
PRPSD_DISPATCH: PRPSD_DISPATCH:
LD A,C ; DEVICE/UNIT TO A
AND $0F ; REMOVE DEVICE BITS LEAVING JUST UNIT ID
CALL PRPSD_SELUNIT ; SELECT DESIRED UNIT
RET NZ ; ABORT ON ERROR
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION BITS
JP Z,PRPSD_READ
; VERIFY AND SAVE THE TARGET DEVICE/UNIT LOCALLY IN DRIVER
LD A,C ; DEVICE/UNIT FROM C
AND $0F ; ISOLATE UNIT NUM
CP PRPSD_UNITCNT
CALL NC,PANIC ; PANIC IF TOO HIGH
LD (PRPSD_UNIT),A ; SAVE IT
;
; DISPATCH ACCORDING TO DISK SUB-FUNCTION
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JP Z,PRPSD_SEEK ; SUB-FUNC 0: SEEK, USE HBIOS FOR NOW
DEC A DEC A
JP Z,PRPSD_WRITE
JP Z,PRPSD_READ ; SUB-FUNC 1: READ
DEC A DEC A
JP Z,PRPSD_STATUS
JP Z,PRPSD_WRITE ; SUB-FUNC 2: WRITE
DEC A DEC A
JP Z,PRPSD_MEDIA
JP Z,PRPSD_STATUS ; SUB-FUNC 3: STATUS
DEC A DEC A
JP Z,PRPSD_CAP
JP Z,PRPSD_RESET ; SUB-FUNC 4: RESET
DEC A DEC A
JP Z,PRPSD_GEOM
CALL PANIC
JP Z,PRPSD_CAP ; SUB-FUNC 5: GET CAPACITY
DEC A
JP Z,PRPSD_GEOM ; SUB-FUNC 6: GET GEOMETRY
DEC A
JP Z,PRPSD_GETPAR ; SUB-FUNC 7: GET PARAMETERS
DEC A
JP Z,PRPSD_SETPAR ; SUB-FUNC 8: SET PARAMETERS
CALL PANIC ; INVALID SUB-FUNCTION
; ;
; ;
; ;
PRPSD_READ: PRPSD_READ:
LD (PRPSD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
#IF (PRPSDTRACE == 1) #IF (PRPSDTRACE == 1)
LD HL,PRPSD_PRTERR ; SET UP PRPSD_PRTERR LD HL,PRPSD_PRTERR ; SET UP PRPSD_PRTERR
PUSH HL ; ... TO FILTER ALL EXITS PUSH HL ; ... TO FILTER ALL EXITS
@ -316,7 +330,7 @@ PRPSD_READ:
LD C,PRPSD_DSKIO LD C,PRPSD_DSKIO
LD B,0 LD B,0
LD HL,(DIOBUF)
LD HL,(PRPSD_DSKBUF)
INIR INIR
INIR INIR
@ -326,8 +340,10 @@ PRPSD_READ:
; ;
; ;
PRPSD_WRITE: PRPSD_WRITE:
LD (PRPSD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
#IF (PRPSDTRACE == 1) #IF (PRPSDTRACE == 1)
LD HL,PRPSD_PRTERR ; SET UP SD_PRTERR
LD HL,PRPSD_PRTERR ; SET UP PRPSD_PRTERR
PUSH HL ; ... TO FILTER ALL EXITS PUSH HL ; ... TO FILTER ALL EXITS
#ENDIF #ENDIF
@ -350,7 +366,7 @@ PRPSD_WRITE:
LD C,PRPSD_DSKIO LD C,PRPSD_DSKIO
LD B,0 LD B,0
LD HL,(DIOBUF)
LD HL,(PRPSD_DSKBUF)
OTIR OTIR
OTIR OTIR
@ -372,22 +388,45 @@ PRPSD_STATUS:
OR A OR A
RET RET
; ;
; PRPSD_MEDIA
; ;
PRPSD_MEDIA:
;
PRPSD_RESET:
XOR A ; ALWAYS OK
RET
;
; PRPSD_GETPAR
;
PRPSD_GETPAR:
; REINITIALIZE THE CARD HERE ; REINITIALIZE THE CARD HERE
CALL PRPSD_INITCARD CALL PRPSD_INITCARD
#IF (PRPSDTRACE == 1) #IF (PRPSDTRACE == 1)
CALL PRPSD_PRTERR ; PRINT ANY ERRORS CALL PRPSD_PRTERR ; PRINT ANY ERRORS
#ENDIF #ENDIF
LD A,MID_HD ; ASSUME SUCCESS, SETUP MEDIA ID
LD E,MID_HD ; ASSUME WE ARE OK
RET Z ; RETURN IF GOOD INIT RET Z ; RETURN IF GOOD INIT
LD A,MID_NONE ; SIGNAL NO MEDA
OR A ; SET FLAGS
LD E,MID_NONE ; SIGNAL NO MEDA
RET ; AND RETURN RET ; AND RETURN
; ;
; ;
; ;
PRPSD_SETPAR:
; NOT IMPLEMENTED
XOR A
RET
;
;
;
PRPSD_SEEK:
BIT 7,D ; CHECK FOR LBA FLAG
CALL Z,HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA
RES 7,D ; CLEAR FLAG REGARDLESS (DOES NO HARM IF ALREADY LBA)
LD BC,HSTLBA ; POINT TO LBA STORAGE
CALL ST32 ; SAVE LBA ADDRESS
XOR A ; SIGNAL SUCCESS
RET ; AND RETURN
;
;
;
PRPSD_CAP: PRPSD_CAP:
LD HL,PRPSD_BLKCNT ; POINT TO BLOCK COUNT LD HL,PRPSD_BLKCNT ; POINT TO BLOCK COUNT
CALL LD32 ; GET THE CURRENT CAPACITY TO DE:HL CALL LD32 ; GET THE CURRENT CAPACITY TO DE:HL
@ -412,8 +451,6 @@ PRPSD_GEOM:
; UNIT IS SPECIFIED IN A ; UNIT IS SPECIFIED IN A
; ;
PRPSD_SELUNIT: PRPSD_SELUNIT:
CP PRPSD_UNITCNT ; CHECK VALIDITY (EXCEED UNIT COUNT?)
JP NC,PRPSD_INVUNIT ; HANDLE INVALID UNIT
XOR A ; SIGNAL SUCCESS XOR A ; SIGNAL SUCCESS
RET ; DONE RET ; DONE
; ;
@ -884,6 +921,9 @@ PRPSD_STR_TYPESDXC .TEXT "SDXC$"
; ;
PRP_FWVER .DB $00, $00, $00, $00 ; MMNNBBB (M=MAJOR, N=MINOR, B=BUILD) PRP_FWVER .DB $00, $00, $00, $00 ; MMNNBBB (M=MAJOR, N=MINOR, B=BUILD)
; ;
PRPSD_UNIT .DB 0
PRPSD_DSKBUF .DW 0
;
PRPSD_UNITDATA: PRPSD_UNITDATA:
PRPSD_STAT .DB 0 PRPSD_STAT .DB 0
PRPSD_DSKSTAT .DB 0 PRPSD_DSKSTAT .DB 0

87
Source/HBIOS/rf.asm

@ -28,31 +28,50 @@ RF_INIT:
; ;
; ;
RF_DISPATCH: RF_DISPATCH:
; VERIFY AND SAVE THE TARGET DEVICE/UNIT LOCALLY IN DRIVER
LD A,C ; DEVICE/UNIT FROM C
AND $0F ; ISOLATE UNIT NUM
CP 2 ; CHECK FOR MAX UNIT EXCEEDED
LD (RF_UNIT),A ; SAVE IT
CALL NC,PANIC ; PANIC IF TOO HIGH
;
; DISPATCH ACCORDING TO DISK SUB-FUNCTION
LD A,B ; GET REQUESTED FUNCTION LD A,B ; GET REQUESTED FUNCTION
AND $0F
JR Z,RF_READ
AND $0F ; ISOLATE SUB-FUNCTION
JP Z,RF_SEEK ; SUB-FUNC 0: SEEK, USE HBIOS FOR NOW
DEC A DEC A
JR Z,RF_WRITE
JP Z,RF_READ ; SUB-FUNC 1: READ
DEC A DEC A
JR Z,RF_STATUS
JP Z,RF_WRITE ; SUB-FUNC 2: WRITE
DEC A DEC A
JR Z,RF_MEDIA
JP Z,RF_STATUS ; SUB-FUNC 3: STATUS
DEC A DEC A
JP Z,RF_CAP
JP Z,RF_RESET ; SUB-FUNC 4: RESET
DEC A DEC A
JP Z,RF_GEOM
CALL PANIC
;
; RF_MEDIA
;
RF_MEDIA:
LD A,C ; GET THE DEVICE/UNIT
AND $0F ; ISOLATE UNIT
CP RFCNT ; NUM UNITS
LD A,MID_RF ; ASSUME WE ARE OK
RET C ; RETURN
XOR A ; NO MEDIA
RET ; AND RETURN
JP Z,RF_CAP ; SUB-FUNC 5: GET CAPACITY
DEC A
JP Z,RF_GEOM ; SUB-FUNC 6: GET GEOMETRY
DEC A
JP Z,RF_GETPAR ; SUB-FUNC 7: GET PARAMETERS
DEC A
JP Z,RF_SETPAR ; SUB-FUNC 8: SET PARAMETERS
CALL PANIC ; INVALID SUB-FUNCTION
;
;
;
RF_GETPAR:
LD A,C ; DEVICE/UNIT IS IN C
ADD A,MID_RF ; SET CORRECT MEDIA VALUE
LD E,A ; VALUE TO E
XOR A ; SIGNAL SUCCESS
RET
;
;
;
RF_SETPAR:
; NOT IMPLEMENTED
XOR A
RET
; ;
; ;
; ;
@ -62,6 +81,12 @@ RF_STATUS:
; ;
; ;
; ;
RF_RESET:
XOR A ; ALWAYS OK
RET
;
;
;
RF_CAP: RF_CAP:
LD A,C ; DEVICE/UNIT IS IN C LD A,C ; DEVICE/UNIT IS IN C
AND $0F ; ISOLATE UNIT NUM AND $0F ; ISOLATE UNIT NUM
@ -88,10 +113,22 @@ RF_GEOM:
; ;
; ;
; ;
RF_SEEK:
BIT 7,D ; CHECK FOR LBA FLAG
CALL Z,HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA
RES 7,D ; CLEAR FLAG REGARDLESS (DOES NO HARM IF ALREADY LBA)
LD BC,HSTLBA ; POINT TO LBA STORAGE
CALL ST32 ; SAVE LBA ADDRESS
XOR A ; SIGNAL SUCCESS
RET ; AND RETURN
;
;
;
RF_READ: RF_READ:
LD (RF_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
CALL RF_SETIO CALL RF_SETIO
CALL RF_SETADR CALL RF_SETADR
LD HL,(DIOBUF)
LD HL,(RF_DSKBUF)
LD B,0 LD B,0
LD A,(RF_IO) LD A,(RF_IO)
OR RF_DAT OR RF_DAT
@ -104,6 +141,7 @@ RF_READ:
; ;
; ;
RF_WRITE: RF_WRITE:
LD (RF_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
CALL RF_SETIO CALL RF_SETIO
LD A,(RF_IO) LD A,(RF_IO)
OR RF_ST OR RF_ST
@ -113,7 +151,7 @@ RF_WRITE:
LD A,1 ; PREPARE TO RETURN FALSE (ERROR) LD A,1 ; PREPARE TO RETURN FALSE (ERROR)
RET NZ ; WRITE PROTECTED! RET NZ ; WRITE PROTECTED!
CALL RF_SETADR CALL RF_SETADR
LD HL,(DIOBUF)
LD HL,(RF_DSKBUF)
LD B,0 LD B,0
LD A,(RF_IO) LD A,(RF_IO)
OR RF_DAT OR RF_DAT
@ -126,7 +164,7 @@ RF_WRITE:
; ;
; ;
RF_SETIO: RF_SETIO:
LD A,(HSTDSK) ; GET DEVICE/UNIT
LD A,(RF_UNIT) ; GET DEVICE/UNIT
AND $0F ; ISOLATE UNIT NUM AND $0F ; ISOLATE UNIT NUM
JR NZ,RF_SETIO1 JR NZ,RF_SETIO1
LD A,RF_U0IO LD A,RF_U0IO
@ -157,4 +195,7 @@ RF_SETADR:
; ;
; ;
; ;
RF_IO .DB 0
RF_IO .DB 0
;
RF_UNIT .DB 0
RF_DSKBUF .DW 0

102
Source/HBIOS/sd.asm

@ -321,7 +321,9 @@ SD_INIT1:
; ;
; INITIALIZE UNIT DESIGNATED IN ACCUM ; INITIALIZE UNIT DESIGNATED IN ACCUM
; ;
SD_INITUNIT:
SD_INITUNIT
LD (SD_UNIT),A ; SET CURRENT UNIT
;
CALL SD_SELUNIT ; SELECT UNIT CALL SD_SELUNIT ; SELECT UNIT
RET NZ ; ABORT ON ERROR RET NZ ; ABORT ON ERROR
; ;
@ -404,42 +406,61 @@ SD_INITUNIT2:
;============================================================================= ;=============================================================================
; ;
SD_DISPATCH: SD_DISPATCH:
LD A,C ; DEVICE/UNIT TO A
AND $0F ; REMOVE DEVICE BITS LEAVING JUST UNIT ID
CALL SD_SELUNIT ; SELECT DESIRED UNIT
RET NZ ; ABORT ON ERROR
; VERIFY AND SAVE THE TARGET DEVICE/UNIT LOCALLY IN DRIVER
LD A,C ; DEVICE/UNIT FROM C
AND $0F ; ISOLATE UNIT NUM
CP SD_UNITCNT
CALL NC,PANIC ; PANIC IF TOO HIGH
LD (SD_UNIT),A ; SAVE IT
;CALL SD_SELUNIT ; SELECT DESIRED UNIT
;
; DISPATCH ACCORDING TO DISK SUB-FUNCTION
LD A,B ; GET REQUESTED FUNCTION LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION BITS
JP Z,SD_READ
DEC A
JP Z,SD_WRITE
DEC A
JP Z,SD_STATUS
DEC A
JP Z,SD_MEDIA
DEC A
JR Z,SD_CAP
DEC A
JR Z,SD_GEOM
CALL PANIC
AND $0F ; ISOLATE SUB-FUNCTION
JP Z,SD_SEEK ; SUB-FUNC 0: SEEK, USE HBIOS FOR NOW
DEC A
JP Z,SD_READ ; SUB-FUNC 1: READ
DEC A
JP Z,SD_WRITE ; SUB-FUNC 2: WRITE
DEC A
JP Z,SD_STATUS ; SUB-FUNC 3: STATUS
DEC A
JP Z,SD_RESET ; SUB-FUNC 4: RESET
DEC A
JP Z,SD_CAP ; SUB-FUNC 5: GET CAPACITY
DEC A
JP Z,SD_GEOM ; SUB-FUNC 6: GET GEOMETRY
DEC A
JP Z,SD_GETPAR ; SUB-FUNC 7: GET PARAMETERS
DEC A
JP Z,SD_SETPAR ; SUB-FUNC 8: SET PARAMETERS
CALL PANIC ; INVALID SUB-FUNCTION
;
;
; ;
SD_READ: SD_READ:
LD (SD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
#IF (SDTRACE == 1) #IF (SDTRACE == 1)
LD HL,SD_PRTERR ; SET UP SD_PRTERR LD HL,SD_PRTERR ; SET UP SD_PRTERR
PUSH HL ; ... TO FILTER ALL EXITS PUSH HL ; ... TO FILTER ALL EXITS
#ENDIF #ENDIF
CALL SD_SELUNIT
; READ A SECTOR ; READ A SECTOR
LD C,SD_CMD_READ_SNGL_BLK ; SET READ_SINGLE_BLOCK COMMAND LD C,SD_CMD_READ_SNGL_BLK ; SET READ_SINGLE_BLOCK COMMAND
JP SD_SECTIO ; DO SECTOR I/O JP SD_SECTIO ; DO SECTOR I/O
; ;
;
;
SD_WRITE: SD_WRITE:
LD (SD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
#IF (SDTRACE == 1) #IF (SDTRACE == 1)
LD HL,SD_PRTERR ; SET UP SD_PRTERR LD HL,SD_PRTERR ; SET UP SD_PRTERR
PUSH HL ; ... TO FILTER ALL EXITS PUSH HL ; ... TO FILTER ALL EXITS
#ENDIF #ENDIF
; WRITE A SECTOR
CALL SD_SELUNIT
CALL SD_CHKWP ; CHECK FOR WRITE PROTECT CALL SD_CHKWP ; CHECK FOR WRITE PROTECT
JP NZ,SD_WRTPROT ; HANDLE IT IF SO JP NZ,SD_WRTPROT ; HANDLE IT IF SO
; WRITE A SECTOR
LD C,SD_CMD_WRITE_BLOCK ; SET WRITE_BLOCK COMMAND LD C,SD_CMD_WRITE_BLOCK ; SET WRITE_BLOCK COMMAND
JP SD_SECTIO ; DO SECTOR I/O JP SD_SECTIO ; DO SECTOR I/O
; ;
@ -450,18 +471,46 @@ SD_STATUS:
OR A ; SET FLAGS OR A ; SET FLAGS
RET ; AND RETURN RET ; AND RETURN
; ;
SD_MEDIA:
;
;
SD_RESET:
XOR A ; ALWAYS OK
RET
;
;
;
SD_GETPAR:
CALL SD_SELUNIT ; SET CUR UNIT
; RE-INITIALIZE THE SD CARD TO ACCOMMODATE HOT SWAPPING ; RE-INITIALIZE THE SD CARD TO ACCOMMODATE HOT SWAPPING
CALL SD_INITCARD ; RE-INIT SELECTED UNIT CALL SD_INITCARD ; RE-INIT SELECTED UNIT
#IF (SDTRACE == 1) #IF (SDTRACE == 1)
CALL SD_PRTERR ; PRINT ANY ERRORS CALL SD_PRTERR ; PRINT ANY ERRORS
#ENDIF #ENDIF
LD A,MID_HD ; ASSUME SUCCESS, SETUP MEDIA ID
LD E,MID_HD ; ASSUME WE ARE OK
RET Z ; RETURN IF GOOD INIT RET Z ; RETURN IF GOOD INIT
LD A,MID_NONE ; SIGNAL NO MEDA
OR A ; SET FLAGS
LD E,MID_NONE ; SIGNAL NO MEDA
RET ; AND RETURN RET ; AND RETURN
; ;
;
;
SD_SETPAR:
; NOT IMPLEMENTED
XOR A
RET
;
;
;
SD_SEEK:
BIT 7,D ; CHECK FOR LBA FLAG
CALL Z,HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA
RES 7,D ; CLEAR FLAG REGARDLESS (DOES NO HARM IF ALREADY LBA)
LD BC,HSTLBA ; POINT TO LBA STORAGE
CALL ST32 ; SAVE LBA ADDRESS
XOR A ; SIGNAL SUCCESS
RET ; AND RETURN
;
;
;
SD_CAP: SD_CAP:
SD_DPTR(SD_CAPACITY) ; POINT HL TO CAPACITY OF CUR UNIT SD_DPTR(SD_CAPACITY) ; POINT HL TO CAPACITY OF CUR UNIT
CALL LD32 ; GET THE CURRENT CAPACITY DO DE:HL CALL LD32 ; GET THE CURRENT CAPACITY DO DE:HL
@ -469,6 +518,8 @@ SD_CAP:
XOR A ; SIGNAL SUCCESS XOR A ; SIGNAL SUCCESS
RET ; AND DONE RET ; AND DONE
; ;
;
;
SD_GEOM: SD_GEOM:
; FOR LBA, WE SIMULATE CHS ACCESS USING 16 HEADS AND 16 SECTORS ; FOR LBA, WE SIMULATE CHS ACCESS USING 16 HEADS AND 16 SECTORS
; RETURN HS:CC -> DE:HL, SET HIGH BIT OF D TO INDICATE LBA CAPABLE ; RETURN HS:CC -> DE:HL, SET HIGH BIT OF D TO INDICATE LBA CAPABLE
@ -794,7 +845,7 @@ SD_SECTIO:
CALL SD_EXECCMD ; EXECUTE COMMAND CALL SD_EXECCMD ; EXECUTE COMMAND
RET NZ ; ABORT ON ERROR RET NZ ; ABORT ON ERROR
LD HL,(DIOBUF)
LD HL,(SD_DSKBUF)
LD BC,512 ; LENGTH TO READ LD BC,512 ; LENGTH TO READ
LD A,(SD_CMD) ; GET THE COMMAND LD A,(SD_CMD) ; GET THE COMMAND
CP SD_CMD_READ_SNGL_BLK ; READ_SINGLE_BLOCK? CP SD_CMD_READ_SNGL_BLK ; READ_SINGLE_BLOCK?
@ -1156,7 +1207,7 @@ SD_SELUNIT:
JP NC,SD_INVUNIT ; HANDLE INVALID UNIT JP NC,SD_INVUNIT ; HANDLE INVALID UNIT
; ;
; NEW UNIT SELECTED, IMPLEMENT IT ; NEW UNIT SELECTED, IMPLEMENT IT
LD (SD_UNIT),A ; SAVE CURRENT UNIT NUMBER
;LD (SD_UNIT),A ; SAVE CURRENT UNIT NUMBER
#IF (SDMODE == SDMODE_DSD) #IF (SDMODE == SDMODE_DSD)
; SELECT REQUESTED UNIT ; SELECT REQUESTED UNIT
OUT (SD_SELREG),A ; ACTUALLY SELECT THE CARD OUT (SD_SELREG),A ; ACTUALLY SELECT THE CARD
@ -1559,6 +1610,7 @@ SD_RC .DB 0 ; RETURN CODE FROM CMD
SD_TOK .DB 0 ; TOKEN FROM DATA XFR SD_TOK .DB 0 ; TOKEN FROM DATA XFR
; ;
SD_UNIT .DB 0 ; ACTIVE UNIT, DEFAULT TO ZERO SD_UNIT .DB 0 ; ACTIVE UNIT, DEFAULT TO ZERO
SD_DSKBUF .DW 0 ; ACTIVE DISK BUFFER
; ;
; UNIT SPECIFIC DATA STORAGE ; UNIT SPECIFIC DATA STORAGE
; ;

Loading…
Cancel
Save