mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 14:11:48 -06:00
Storage Driver Refactoring
This commit is contained in:
@@ -1602,13 +1602,12 @@ DPB_RAM:
|
||||
;
|
||||
; 4MB RAM FLOPPY DRIVE, 32 TRKS, 1024 SECS/TRK, 128 BYTES/SEC
|
||||
; BLOCKSIZE (BLS) = 2K, DIRECTORY ENTRIES = 256
|
||||
; SEC/TRK ENGINEERED SO THAT AFTER DEBLOCKING, SECTOR NUMBER OCCUPIES 1 BYTE (0-255)
|
||||
;
|
||||
.DW CKS_HD
|
||||
.DW ALS_HD
|
||||
.DB (2048 / 128) ; RECORDS PER BLOCK (BLS / 128)
|
||||
DPB_RF:
|
||||
.DW 1024 ; SPT: SECTORS PER TRACK
|
||||
.DW 64 ; SPT: SECTORS PER TRACK
|
||||
.DB 4 ; BSH: BLOCK SHIFT FACTOR
|
||||
.DB 15 ; BLM: BLOCK MASK
|
||||
.DB 0 ; EXM: EXTENT MASK
|
||||
|
||||
@@ -125,22 +125,22 @@ FSST_COUNT .EQU (($ - FSST) / FSST_ENTSIZ) ; # ENTRIES IN TABLE
|
||||
;
|
||||
; 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:
|
||||
@@ -347,48 +347,73 @@ FCS_VERSION .DB "VER$"
|
||||
;
|
||||
; FDC COMMAND TABLE
|
||||
;
|
||||
FCT .DB CMD_READ \ .DW FCS_READ
|
||||
FCT .DB CFD_READ \ .DW FCS_READ
|
||||
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
|
||||
#ENDIF
|
||||
;
|
||||
;
|
||||
;
|
||||
FD_DISPATCH:
|
||||
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_MEDIA
|
||||
;
|
||||
FD_MEDIA:
|
||||
CALL FD_SELECTUNIT
|
||||
RET NZ
|
||||
;
|
||||
; DISPATCH ACCORDING TO DISK SUB-FUNCTION
|
||||
LD A,B ; GET REQUESTED FUNCTION
|
||||
AND $0F ; ISOLATE SUB-FUNCTION
|
||||
JP Z,FD_SEEK ; SUB-FUNC 0: SEEK
|
||||
DEC A
|
||||
JP Z,FD_READ ; SUB-FUNC 1: READ
|
||||
DEC A
|
||||
JP Z,FD_WRITE ; SUB-FUNC 2: WRITE
|
||||
DEC A
|
||||
JP Z,FD_STATUS ; SUB-FUNC 3: STATUS
|
||||
DEC A
|
||||
JP Z,FD_RESET ; SUB-FUNC 4: RESET
|
||||
DEC A
|
||||
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)
|
||||
; SETUP TO READ TRK 0, HD 0, SEC 0
|
||||
@@ -425,7 +450,8 @@ FD_MEDIARETRY:
|
||||
DJNZ FD_MEDIARETRY
|
||||
|
||||
; NO JOY, RETURN WITH A=0 (NO MEDIA)
|
||||
XOR A
|
||||
LD E,0
|
||||
OR $FF ; SIGNAL ERROR
|
||||
RET
|
||||
|
||||
FD_TESTMEDIA:
|
||||
@@ -461,6 +487,15 @@ FD_MEDIA3:
|
||||
CALL PC_SPACE
|
||||
CALL PRTHEXBYTE
|
||||
#ENDIF
|
||||
LD E,A ; MOVE MEDIA VALUE TO E
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
FD_SETPAR:
|
||||
; NOT IMPLEMENTED
|
||||
XOR A
|
||||
RET
|
||||
;
|
||||
;
|
||||
@@ -482,8 +517,10 @@ FD_CAP:
|
||||
;
|
||||
;
|
||||
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
|
||||
DEC A ; NOPE, TRY UNIT 1
|
||||
JR Z,FD_GEOM1 ; UNIT 1
|
||||
@@ -567,7 +604,7 @@ FD_IDLE:
|
||||
; FD_STATUS
|
||||
;
|
||||
FD_STATUS:
|
||||
CALL FD_SELECTUNIT
|
||||
;CALL FD_SELECTUNIT
|
||||
LD HL,(FDDS_TRKADR)
|
||||
LD A,(HL) ; A = CURRENT TRACK
|
||||
|
||||
@@ -581,6 +618,12 @@ FD_STATUS1:
|
||||
OR A ; A ALREADY = $FF, JUST SET FLAGS
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
FD_RESET:
|
||||
XOR A ; ALWAYS OK
|
||||
RET
|
||||
;
|
||||
; FD_CLRDSKCHG
|
||||
;
|
||||
FD_CLRDSKCHG:
|
||||
@@ -674,8 +717,12 @@ FD_DRIVERESET:
|
||||
;
|
||||
;
|
||||
FD_SELECTUNIT:
|
||||
PUSH HL
|
||||
PUSH DE
|
||||
|
||||
LD A,C
|
||||
AND 0FH ; ISOLATE THE UNIT NIBBLE
|
||||
LD (FD_UNIT),A ; SAVE IT
|
||||
|
||||
; GOOD PLACE FOR AN INTEGRITY CHECK
|
||||
CP 2
|
||||
@@ -691,14 +738,30 @@ FD_SELECTUNIT:
|
||||
LD (FDDS_TRKADR),HL ; LOAD TRKADR
|
||||
INC HL ; SKIP TRK
|
||||
LD (FDDS_MEDIAADR),HL ; LOAD MEDIAADR
|
||||
|
||||
RET
|
||||
|
||||
POP DE
|
||||
POP HL
|
||||
|
||||
XOR A
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
FD_SEEK:
|
||||
LD (HSTSEC),DE ; RECORD HEAD/SECTOR
|
||||
LD (HSTTRK),HL ; RECORD TRACK
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
FD_READ:
|
||||
LD (FD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
|
||||
LD A,DOP_READ
|
||||
JR FD_RUN
|
||||
;
|
||||
FD_WRITE:
|
||||
LD (FD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
|
||||
LD A,DOP_WRITE
|
||||
JR FD_RUN
|
||||
;
|
||||
@@ -706,11 +769,12 @@ FD_RUN:
|
||||
LD (FCD_DOP),A
|
||||
|
||||
; 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 C,A
|
||||
CALL FD_SELECTUNIT
|
||||
;LD C,A
|
||||
;CALL FD_SELECTUNIT
|
||||
|
||||
; MAP HSTTRK TO FCD_H, FCD_C
|
||||
LD BC,(HSTTRK)
|
||||
@@ -798,7 +862,7 @@ FD_RUN0:
|
||||
; INITIATE SEEK TO NEW TRACK
|
||||
CALL FC_SEEK
|
||||
JR NZ,FD_RUNERR
|
||||
|
||||
|
||||
; WAIT FOR SEEK TO COMPLETE
|
||||
CALL FD_WTSEEK
|
||||
JR NZ,FD_RUNERR
|
||||
@@ -872,44 +936,44 @@ FD_DSKY:
|
||||
; ENTRY POINTS FOR FDC COMMANDS
|
||||
;
|
||||
FC_READ:
|
||||
LD A,CMD_READ | 11100000B
|
||||
LD A,CFD_READ | 11100000B
|
||||
CALL FC_SETUPIO
|
||||
JP FOP
|
||||
|
||||
FC_WRITE:
|
||||
LD A,CMD_WRITE | 11000000B
|
||||
LD A,CFD_WRITE | 11000000B
|
||||
CALL FC_SETUPIO
|
||||
JP FOP
|
||||
|
||||
FC_READID:
|
||||
LD A,CMD_READID | 01000000B
|
||||
LD A,CFD_READID | 01000000B
|
||||
CALL FC_SETUPCMD
|
||||
JP FOP
|
||||
|
||||
FC_RECAL:
|
||||
LD A,CMD_RECAL | 00000000B
|
||||
LD A,CFD_RECAL | 00000000B
|
||||
CALL FC_SETUPCMD
|
||||
JP FOP ; FIX: DO WE NEED TO REMOVE HDS BITS FROM SECOND BYTE?
|
||||
|
||||
FC_SENSEINT:
|
||||
LD A,CMD_SENSEINT | 00000000B
|
||||
LD A,CFD_SENSEINT | 00000000B
|
||||
CALL FC_SETUPCMD
|
||||
LD A,1 ; GENERIC COMMAND, BUT JUST FIRST COMMAND CODE
|
||||
LD (FCP_LEN),A
|
||||
JP FOP
|
||||
|
||||
FC_SPECIFY:
|
||||
LD A,CMD_SPECIFY | 00000000B
|
||||
LD A,CFD_SPECIFY | 00000000B
|
||||
CALL FC_SETUPSPECIFY
|
||||
JP FOP
|
||||
|
||||
FC_DRVSTAT:
|
||||
LD A,CMD_DRVSTAT | 00000000B
|
||||
LD A,CFD_DRVSTAT | 00000000B
|
||||
CALL FC_SETUPCMD
|
||||
JP FOP
|
||||
|
||||
FC_SEEK:
|
||||
LD A,CMD_SEEK | 00000000B
|
||||
LD A,CFD_SEEK | 00000000B
|
||||
CALL FC_SETUPSEEK
|
||||
JP FOP
|
||||
;
|
||||
@@ -1229,11 +1293,11 @@ FOP_X1:
|
||||
LD HL,FOP_RES
|
||||
PUSH HL
|
||||
|
||||
CP CMD_READ
|
||||
CP CFD_READ
|
||||
JP Z,FXR_READ
|
||||
CP CMD_WRITE
|
||||
CP CFD_WRITE
|
||||
JP Z,FXR_WRITE
|
||||
CP CMD_READID
|
||||
CP CFD_READID
|
||||
JP Z,FXR_NULL
|
||||
RET ; RET ACTUALLY JUST JUMPS RIGHT TO FOP_RES
|
||||
;
|
||||
@@ -1318,7 +1382,7 @@ FOP_ERR:
|
||||
FOP_EVAL:
|
||||
LD A,(FCP_CMD)
|
||||
; DRVSTAT IS WEIRD, HAS ONLY ST3, NOTHING TO EVAL
|
||||
CP CMD_DRVSTAT
|
||||
CP CFD_DRVSTAT
|
||||
JR Z,FOP_EXIT
|
||||
; DO WE HAVE ST0?
|
||||
LD A,(FRB_LEN)
|
||||
@@ -1339,7 +1403,7 @@ FOP_EVALST0:
|
||||
FOP_ABTERM:
|
||||
; SENSEINT DOES NOT USE ST1
|
||||
LD A,(FCP_CMD)
|
||||
CP CMD_SENSEINT
|
||||
CP CFD_SENSEINT
|
||||
JR Z,FOP_ABTERM1
|
||||
; DO WE HAVE ST1?
|
||||
LD A,(FRB_LEN)
|
||||
@@ -1425,7 +1489,7 @@ FXR_NULL1:
|
||||
; READ DATA
|
||||
;
|
||||
FXR_READ:
|
||||
LD HL,(DIOBUF) ; POINT TO SECTOR BUFFER START
|
||||
LD HL,(FD_DSKBUF) ; POINT TO SECTOR BUFFER START
|
||||
LD DE,(FCD_SECSZ)
|
||||
; TIMEOUT COUNTER IS CPU MHZ / 4 (MAKING SURE IT IS AT LEAST 1)
|
||||
; LD A,(CPUMHZ + 3) / 4
|
||||
@@ -1465,7 +1529,7 @@ FXRR5: ; OUTER LOOP, REALLY ONLY HAPPENS WHEN WAITING FOR FIRST BYTE OR ABOR
|
||||
; WRITE DATA
|
||||
;
|
||||
FXR_WRITE:
|
||||
LD HL,(DIOBUF) ; POINT TO SECTOR BUFFER START
|
||||
LD HL,(FD_DSKBUF) ; POINT TO SECTOR BUFFER START
|
||||
LD DE,(FCD_SECSZ)
|
||||
; TIMEOUT COUNTER IS CPU MHZ / 4 (MAKING SURE IT IS AT LEAST 1)
|
||||
; LD A,(CPUMHZ + 3) / 4
|
||||
@@ -1628,7 +1692,7 @@ FC_PRTRESULTS:
|
||||
|
||||
; SPECIAL CASE, DON'T PRINT IF SENSEINT & INVCMD/DSK CHG/ABTERM
|
||||
LD A,(FCP_CMD)
|
||||
CP CMD_SENSEINT
|
||||
CP CFD_SENSEINT
|
||||
JR NZ,FCPR2
|
||||
|
||||
LD A,(FST_RC)
|
||||
@@ -1769,3 +1833,8 @@ FCD_U1MEDIA .DB FDMEDIA ; MEDIA BYTE
|
||||
;
|
||||
FDDS_TRKADR .DW 0 ; POINTER TO FDCUXTRK ABOVE
|
||||
FDDS_MEDIAADR .DW 0 ; POINTER TO FDCUXMEDIA ABOVE
|
||||
;
|
||||
; GENERAL WORKING STORAGE
|
||||
;
|
||||
FD_UNIT .DB 0
|
||||
FD_DSKBUF .DW 0
|
||||
@@ -674,7 +674,7 @@ HB_DISPATCH:
|
||||
LD A,B ; REQUESTED FUNCTION IS IN B
|
||||
CP BF_CIO + $10 ; $00-$0F: CHARACTER I/O
|
||||
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
|
||||
CP BF_RTC + $10 ; $20-$2F: REAL TIME CLOCK (RTC)
|
||||
JP C,RTC_DISPATCH
|
||||
@@ -682,6 +682,8 @@ HB_DISPATCH:
|
||||
JP C,EMU_DISPATCH
|
||||
CP BF_VDA + $10 ; $40-$4F: VIDEO DISPLAY ADAPTER
|
||||
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
|
||||
CALL C,PANIC ; PANIC IF LESS THAN BF_SYS
|
||||
@@ -791,138 +793,81 @@ CIO_GETINF1:
|
||||
RET ; RETURN
|
||||
;
|
||||
;==================================================================================================
|
||||
; DISK I/O DEVICE DISPATCHER
|
||||
; OLD STYLE DISK I/O DEVICE DISPATCHER
|
||||
;==================================================================================================
|
||||
;
|
||||
; ROUTE CALL TO SPECIFIED DISK I/O DRIVER
|
||||
; B: FUNCTION
|
||||
; 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:
|
||||
; GET THE REQUESTED FUNCTION TO SEE IF SPECIAL HANDLING
|
||||
; IS NEEDED
|
||||
LD A,B
|
||||
;
|
||||
; 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
|
||||
;
|
||||
; 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:
|
||||
; START OF THE ACTUAL DRIVER DISPATCHING LOGIC
|
||||
LD A,C ; GET REQUESTED DEVICE/UNIT FROM C
|
||||
LD (HSTDSK),A ; TEMP HACK TO FILL IN HSTDSK
|
||||
AND $F0 ; ISOLATE THE DEVICE PORTION
|
||||
;
|
||||
#IF (MDENABLE)
|
||||
CP DIODEV_MD
|
||||
JP Z,MD_DISPATCH
|
||||
#ENDIF
|
||||
#IF (FDENABLE)
|
||||
CP DIODEV_FD
|
||||
JP Z,FD_DISPATCH
|
||||
#ENDIF
|
||||
#IF (RFENABLE)
|
||||
CP DIODEV_RF
|
||||
JP Z,RF_DISPATCH
|
||||
#ENDIF
|
||||
#IF (IDEENABLE)
|
||||
CP DIODEV_IDE
|
||||
JP Z,IDE_DISPATCH
|
||||
#ENDIF
|
||||
#IF (PPIDEENABLE)
|
||||
CP DIODEV_PPIDE
|
||||
JP Z,PPIDE_DISPATCH
|
||||
#ENDIF
|
||||
#IF (SDENABLE)
|
||||
CP DIODEV_SD
|
||||
JP Z,SD_DISPATCH
|
||||
#ENDIF
|
||||
#IF (PRPENABLE & PRPSDENABLE)
|
||||
CP DIODEV_PRPSD
|
||||
JP Z,PRPSD_DISPATCH
|
||||
#ENDIF
|
||||
#IF (PPPENABLE & PPPSDENABLE)
|
||||
CP DIODEV_PPPSD
|
||||
JP Z,PPPSD_DISPATCH
|
||||
#ENDIF
|
||||
#IF (HDSKENABLE)
|
||||
CP DIODEV_HDSK
|
||||
JP Z,HDSK_DISPATCH
|
||||
#ENDIF
|
||||
CALL PANIC
|
||||
;
|
||||
; HANDLE COMMON DISK FUNCTIONS (NOT DEVICE DRIVER SPECIFIC)
|
||||
;
|
||||
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?
|
||||
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
|
||||
DEC A ; FUNCTION = DIOGETINF?
|
||||
CP BF_DIOGETINF ; FUNCTION = DIOGETINF?
|
||||
JR Z,DIO_GETINF ; YES, HANDLE IT
|
||||
CALL PANIC ; INVALID FUNCTION SPECFIED
|
||||
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
|
||||
|
||||
;
|
||||
; DISK: SHIM FOR OLD STYLE STATUS CALL
|
||||
;
|
||||
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
|
||||
;
|
||||
@@ -970,6 +915,110 @@ DIO_GETINF1:
|
||||
RET ; RETURN
|
||||
;
|
||||
;==================================================================================================
|
||||
; DISK I/O DEVICE DISPATCHER
|
||||
;==================================================================================================
|
||||
;
|
||||
NDIO_DISPATCH:
|
||||
; START OF THE ACTUAL DRIVER DISPATCHING LOGIC
|
||||
LD A,C ; GET REQUESTED DEVICE/UNIT FROM C
|
||||
;LD (HSTDSK),A ; TEMP HACK TO FILL IN HSTDSK
|
||||
AND $F0 ; ISOLATE THE DEVICE PORTION
|
||||
;
|
||||
#IF (MDENABLE)
|
||||
CP DIODEV_MD
|
||||
JP Z,MD_DISPATCH
|
||||
#ENDIF
|
||||
#IF (FDENABLE)
|
||||
CP DIODEV_FD
|
||||
JP Z,FD_DISPATCH
|
||||
#ENDIF
|
||||
#IF (RFENABLE)
|
||||
CP DIODEV_RF
|
||||
JP Z,RF_DISPATCH
|
||||
#ENDIF
|
||||
#IF (IDEENABLE)
|
||||
CP DIODEV_IDE
|
||||
JP Z,IDE_DISPATCH
|
||||
#ENDIF
|
||||
#IF (PPIDEENABLE)
|
||||
CP DIODEV_PPIDE
|
||||
JP Z,PPIDE_DISPATCH
|
||||
#ENDIF
|
||||
#IF (SDENABLE)
|
||||
CP DIODEV_SD
|
||||
JP Z,SD_DISPATCH
|
||||
#ENDIF
|
||||
#IF (PRPENABLE & PRPSDENABLE)
|
||||
CP DIODEV_PRPSD
|
||||
JP Z,PRPSD_DISPATCH
|
||||
#ENDIF
|
||||
#IF (PPPENABLE & PPPSDENABLE)
|
||||
CP DIODEV_PPPSD
|
||||
JP Z,PPPSD_DISPATCH
|
||||
#ENDIF
|
||||
#IF (HDSKENABLE)
|
||||
CP DIODEV_HDSK
|
||||
JP Z,HDSK_DISPATCH
|
||||
#ENDIF
|
||||
CALL PANIC
|
||||
;
|
||||
; 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.
|
||||
;
|
||||
; INPUT: HL=TRACK, D=HEAD, E=SECTOR
|
||||
; OUTPUT: DE:HL=32 BIT LBA ADDRESS (D:7 IS NOT SET IN THE RESULT)
|
||||
;
|
||||
HB_CHS2LBA:
|
||||
;
|
||||
;; 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
|
||||
;
|
||||
; 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
|
||||
;
|
||||
;; DEBUG: DUMP RESULTING LBA (32 BIT)
|
||||
;PRTS("-->$")
|
||||
;PUSH BC
|
||||
;PUSH DE
|
||||
;POP BC
|
||||
;CALL PRTHEXWORD
|
||||
;PUSH HL
|
||||
;POP BC
|
||||
;CALL PRTHEXWORD
|
||||
;POP BC
|
||||
;
|
||||
XOR A
|
||||
RET
|
||||
;
|
||||
;==================================================================================================
|
||||
; REAL TIME CLOCK DEVICE DISPATCHER
|
||||
;==================================================================================================
|
||||
;
|
||||
@@ -1747,7 +1796,7 @@ IDLECOUNT .DB 0
|
||||
; .DW 0 ; LBA HIGH WORD
|
||||
;
|
||||
; DISK DEVICE/UNIT ID
|
||||
HSTDSK .DB 0 ; DISK DEVICE/UNIT ID
|
||||
;HSTDSK .DB 0 ; DISK DEVICE/UNIT ID
|
||||
; FULL 32 BIT LBA
|
||||
HSTLBA .EQU $ ; REFERS TO START OF 32-BIT LBA
|
||||
; LBA LOW WORD -OR- TRACK
|
||||
|
||||
@@ -22,6 +22,17 @@ BF_DIOSETBUF .EQU BF_DIO + 9 ; DISK SET BUFFER ADR
|
||||
BF_DIOGETCNT .EQU BF_DIO + 10 ; DISK DEVICE COUNT
|
||||
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_RTCGETTIM .EQU BF_RTC + 0 ; GET TIME
|
||||
BF_RTCSETTIM .EQU BF_RTC + 1 ; SET TIME
|
||||
|
||||
@@ -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:
|
||||
PRTS("HDSK: UNITS=$")
|
||||
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:
|
||||
LD A,(HDSK_STAT) ; LOAD STATUS
|
||||
OR A ; SET FLAGS
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
HDSK_RESET:
|
||||
XOR A ; ALWAYS OK
|
||||
RET
|
||||
;
|
||||
; GET DISK CAPACITY
|
||||
; RETURN DE:HL=BLOCK COUNT, BC=BLOCK SIZE
|
||||
; SLICE C/H/S = 65/16/16 OR 16,640 TOTAL SECTORS
|
||||
@@ -79,26 +88,56 @@ HDSK_CAP:
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
HDSK_GEOM:
|
||||
; 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
|
||||
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
|
||||
;
|
||||
;
|
||||
;
|
||||
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:
|
||||
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
|
||||
;
|
||||
@@ -114,11 +153,11 @@ HDSK_RW:
|
||||
; INIT IF NEEDED
|
||||
LD A,(HDSK_STAT) ; GET CURRENT STATUS
|
||||
OR A ; SET FLAGS
|
||||
CALL NZ,HDSK_RESET ; RESET IF NOT READY
|
||||
CALL NZ,HDSK_DSKRESET ; RESET IF NOT READY
|
||||
|
||||
; SET DEVICE
|
||||
LD A,(HSTDSK)
|
||||
AND $0F
|
||||
LD A,(HDSK_UNIT)
|
||||
;AND $0F
|
||||
LD (HDSK_DEVICE),A
|
||||
|
||||
; ; INCOMING TRK:SEC ACTUALLY REPRESENTS 32 BIT LBA
|
||||
@@ -142,7 +181,7 @@ HDSK_RW:
|
||||
LD (HDSK_SEC),A ; MAPS TO LSB OF HDSK SEC
|
||||
|
||||
; SET TRANSFER ADDRESS
|
||||
LD BC,(DIOBUF)
|
||||
LD BC,(HDSK_DSKBUF)
|
||||
LD (HDSK_DMA),BC
|
||||
|
||||
; EXECUTE COMMAND
|
||||
@@ -180,12 +219,12 @@ HDSK_OK:
|
||||
;
|
||||
;
|
||||
;
|
||||
HDSK_RESET:
|
||||
HDSK_DSKRESET:
|
||||
LD B,32
|
||||
LD A,HDSK_CMDRESET
|
||||
HDSK_RESET1:
|
||||
HDSK_DSKRESET1:
|
||||
OUT ($FD),A
|
||||
DJNZ HDSK_RESET1
|
||||
DJNZ HDSK_DSKRESET1
|
||||
|
||||
XOR A ; STATUS = OK
|
||||
LD (HDSK_STAT),A ; SAVE IT
|
||||
@@ -256,7 +295,7 @@ HDSK_PRTRW:
|
||||
LD A,(HDSK_SEC)
|
||||
CALL PRTHEXBYTE
|
||||
CALL PC_SPACE
|
||||
LD BC,(HDSK_DMA)
|
||||
LD BC,(HDSK_DSKBUF)
|
||||
CALL PRTHEXWORD
|
||||
|
||||
CALL PC_SPACE
|
||||
@@ -305,9 +344,12 @@ HDSKSTR_RCUNK .TEXT "UNKNOWN ERROR$"
|
||||
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, ...)
|
||||
HDSK_DEVICE .DB 0 ; 0..7, HARD DISK UNIT
|
||||
HDSK_SEC .DB 0 ; 0..255 SECTOR
|
||||
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
|
||||
|
||||
@@ -106,7 +106,7 @@
|
||||
; IDE2: SECONDARY MASTER
|
||||
; IDE3: SECONDARY SLAVE
|
||||
;
|
||||
IDE_UNITCNT .EQU 2 ; ASSUME ONLY PRIMARY INTERFACE
|
||||
IDE_UNITCNT .EQU 2 ; ASSUME ONLY PRIMARY INTERFACE
|
||||
;
|
||||
#IF (IDEMODE == IDEMODE_MK4)
|
||||
IDE_IO_BASE .EQU MK4_IDE
|
||||
@@ -154,11 +154,11 @@ IDE_IO_DRVADR .EQU $IDE_IO_BASE + $0F ; DRIVE ADDRESS REGISTER (R)
|
||||
;
|
||||
; 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
|
||||
;
|
||||
@@ -242,9 +242,11 @@ IDE_INIT1:
|
||||
RET ; DONE
|
||||
;
|
||||
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
|
||||
IDE_DPTR(IDE_STAT) ; GET STATUS ADR IN HL, AF TRASHED
|
||||
@@ -290,41 +292,56 @@ IDE_INIT2:
|
||||
;=============================================================================
|
||||
;
|
||||
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
|
||||
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:
|
||||
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
|
||||
;
|
||||
;
|
||||
;
|
||||
IDE_WRITE:
|
||||
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_WRSEC
|
||||
;
|
||||
;
|
||||
@@ -338,12 +355,17 @@ IDE_STATUS:
|
||||
;
|
||||
; 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
|
||||
PUSH AF ; SAVE UNIT SELECTION
|
||||
CALL IDE_RESET ; RESET ALL DEVICES ON BUS
|
||||
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
|
||||
LD A,(HL) ; GET STATUS
|
||||
@@ -351,14 +373,31 @@ IDE_MEDIA:
|
||||
#IF (IDETRACE == 1)
|
||||
CALL IDE_PRTERR ; PRINT ANY ERRORS
|
||||
#ENDIF
|
||||
LD A,MID_HD ; ASSUME WE ARE OK
|
||||
LD E,MID_HD ; ASSUME WE ARE OK
|
||||
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
|
||||
;
|
||||
;
|
||||
;
|
||||
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_DPTR(IDE_CAPACITY) ; POINT HL TO CAPACITY OF CUR UNIT
|
||||
CALL LD32 ; GET THE CURRENT CAPACITY DO DE:HL
|
||||
@@ -397,7 +436,7 @@ IDE_SETFEAT:
|
||||
OUT (IDE_IO_FEAT),A ; SET THE FEATURE VALUE
|
||||
DCALL PC_SPACE
|
||||
DCALL PRTHEXBYTE
|
||||
LD A,IDE_CMD_SETFEAT ; CMD = SETFEAT
|
||||
LD A,IDE_CIDE_SETFEAT ; CMD = SETFEAT
|
||||
LD (IDE_CMD),A ; SAVE IT
|
||||
JP IDE_RUNCMD ; RUN COMMAND AND EXIT
|
||||
;
|
||||
@@ -412,7 +451,7 @@ IDE_IDENTIFY:
|
||||
OUT (IDE_IO_DRVHD),A
|
||||
DCALL PC_SPACE
|
||||
DCALL PRTHEXBYTE
|
||||
LD A,IDE_CMD_IDDEV
|
||||
LD A,IDE_CIDE_IDDEV
|
||||
LD (IDE_CMD),A
|
||||
CALL IDE_RUNCMD
|
||||
RET NZ
|
||||
@@ -434,11 +473,11 @@ IDE_RDSEC:
|
||||
DCALL PC_SPACE
|
||||
DCALL PRTHEXBYTE
|
||||
CALL IDE_SETADDR ; SETUP CYL, TRK, HEAD
|
||||
LD A,IDE_CMD_READ
|
||||
LD A,IDE_CIDE_READ
|
||||
LD (IDE_CMD),A
|
||||
CALL IDE_RUNCMD
|
||||
RET NZ
|
||||
LD HL,(DIOBUF)
|
||||
LD HL,(IDE_DSKBUF)
|
||||
JP IDE_GETBUF
|
||||
;
|
||||
;
|
||||
@@ -456,11 +495,11 @@ IDE_WRSEC:
|
||||
DCALL PC_SPACE
|
||||
DCALL PRTHEXBYTE
|
||||
CALL IDE_SETADDR ; SETUP CYL, TRK, HEAD
|
||||
LD A,IDE_CMD_WRITE
|
||||
LD A,IDE_CIDE_WRITE
|
||||
LD (IDE_CMD),A
|
||||
CALL IDE_RUNCMD
|
||||
RET NZ
|
||||
LD HL,(DIOBUF)
|
||||
LD HL,(IDE_DSKBUF)
|
||||
JP IDE_PUTBUF
|
||||
;
|
||||
;
|
||||
@@ -535,7 +574,7 @@ IDE_GETBUF:
|
||||
CALL IDE_WAITDRQ ; WAIT FOR BUFFER READY
|
||||
RET NZ ; BAIL OUT IF TIMEOUT
|
||||
|
||||
;LD HL,(DIOBUF)
|
||||
;LD HL,(IDE_DSKBUF)
|
||||
LD B,0
|
||||
|
||||
#IF (IDE8BIT | (IDEMODE == IDEMODE_DIDE))
|
||||
@@ -574,7 +613,7 @@ IDE_PUTBUF:
|
||||
CALL IDE_WAITDRQ ; WAIT FOR BUFFER READY
|
||||
RET NZ ; BAIL OUT IF TIMEOUT
|
||||
;
|
||||
;LD HL,(DIOBUF)
|
||||
;LD HL,(IDE_DSKBUF)
|
||||
LD B,0
|
||||
|
||||
#IF (IDE8BIT | (IDEMODE == IDEMODE_DIDE))
|
||||
@@ -646,6 +685,9 @@ IDE_RESET:
|
||||
XOR A
|
||||
CALL FILL
|
||||
;
|
||||
LD A,(IDE_UNIT) ; GET THE CURRENT UNIT SELECTION
|
||||
PUSH AF ; AND SAVE IT
|
||||
|
||||
; PROBE / INITIALIZE ALL UNITS
|
||||
LD B,IDE_UNITCNT ; NUMBER OF UNITS TO TRY
|
||||
LD C,0 ; UNIT INDEX FOR LOOP
|
||||
@@ -656,6 +698,9 @@ IDE_RESET1:
|
||||
POP BC
|
||||
INC C ; NEXT UNIT
|
||||
DJNZ IDE_RESET1 ; LOOP AS NEEDED
|
||||
;
|
||||
POP AF ; RECOVER ORIGINAL UNIT NUMBER
|
||||
CALL IDE_SELUNIT ; ... AND SELECT IT
|
||||
;
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET ; AND DONE
|
||||
@@ -663,12 +708,20 @@ IDE_RESET1:
|
||||
;
|
||||
;
|
||||
IDE_INITUNIT:
|
||||
LD (IDE_UNIT),A ; SET ACTIVE UNIT
|
||||
|
||||
CALL IDE_SELUNIT ; SELECT UNIT
|
||||
RET NZ ; ABORT IF ERROR
|
||||
|
||||
|
||||
CALL IDE_PROBE ; DO PROBE
|
||||
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
|
||||
;
|
||||
; TAKE ANY ACTIONS REQUIRED TO SELECT DESIRED PHYSICAL UNIT
|
||||
@@ -682,17 +735,20 @@ IDE_SELUNIT:
|
||||
CP IDE_UNITCNT ; CHECK VALIDITY (EXCEED UNIT COUNT?)
|
||||
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)
|
||||
; SELECT PRIMARY/SECONDARY INTERFACE FOR DIDE HARDWARE
|
||||
#ENDIF
|
||||
;
|
||||
PUSH HL ; SAVE HL
|
||||
AND $01 ; LS BIT DETERMINES MASTER/SLAVE
|
||||
LD HL,IDE_DRVSEL
|
||||
CALL ADDHLA
|
||||
LD A,(HL) ; LOAD DRIVE/HEAD VALUE
|
||||
POP HL ; RECOVER HL
|
||||
;
|
||||
OUT (IDE_IO_DRVHD),A ; SELECT DRIVE
|
||||
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_UNIT .DB 0 ; ACTIVE UNIT, DEFAULT TO ZERO
|
||||
IDE_DSKBUF .DW 0 ; ACTIVE DISK BUFFER
|
||||
;
|
||||
; UNIT SPECIFIC DATA STORAGE
|
||||
;
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
; MD DISK DRIVER (MEMORY DISK)
|
||||
;==================================================================================================
|
||||
;
|
||||
MD_UNITCNT .EQU 2
|
||||
;
|
||||
;
|
||||
;
|
||||
MD_INIT:
|
||||
@@ -20,30 +22,34 @@ MD_INIT:
|
||||
;
|
||||
;
|
||||
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
|
||||
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_WRITE
|
||||
JP Z,MD_READ ; SUB-FUNC 1: READ
|
||||
DEC A
|
||||
JP Z,MD_STATUS
|
||||
JP Z,MD_WRITE ; SUB-FUNC 2: WRITE
|
||||
DEC A
|
||||
JP Z,MD_MEDIA
|
||||
JP Z,MD_STATUS ; SUB-FUNC 3: STATUS
|
||||
DEC A
|
||||
JP Z,MD_CAP
|
||||
JP Z,MD_RESET ; SUB-FUNC 4: RESET
|
||||
DEC A
|
||||
JP Z,MD_GEOM
|
||||
CALL PANIC
|
||||
;
|
||||
;
|
||||
;
|
||||
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
|
||||
RET
|
||||
JP Z,MD_CAP ; SUB-FUNC 5: GET CAPACITY
|
||||
DEC A
|
||||
JP Z,MD_GEOM ; SUB-FUNC 6: GET GEOMETRY
|
||||
DEC A
|
||||
JP Z,MD_GETPAR ; SUB-FUNC 7: GET PARAMETERS
|
||||
DEC A
|
||||
JP Z,MD_SETPAR ; SUB-FUNC 8: SET PARAMETERS
|
||||
CALL PANIC ; INVALID SUB-FUNCTION
|
||||
;
|
||||
;
|
||||
;
|
||||
@@ -53,6 +59,12 @@ MD_STATUS:
|
||||
;
|
||||
;
|
||||
;
|
||||
MD_RESET:
|
||||
XOR A ; ALWAYS OK
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
MD_CAP:
|
||||
LD A,C ; DEVICE/UNIT IS IN C
|
||||
AND $0F ; ISOLATE UNIT NUM
|
||||
@@ -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:
|
||||
LD (MD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
|
||||
CALL MD_IOSETUP ; SETUP FOR MEMORY COPY
|
||||
#IF (MDTRACE >= 2)
|
||||
LD (MD_SRC),HL
|
||||
@@ -118,6 +158,7 @@ MD_READ:
|
||||
;
|
||||
;
|
||||
MD_WRITE:
|
||||
LD (MD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
|
||||
LD A,C ; DEVICE/UNIT IS IN C
|
||||
AND $0F ; ISOLATE UNIT NUM
|
||||
LD A,1 ; PREPARE TO RETURN FALSE
|
||||
@@ -186,7 +227,7 @@ MD_IOSETUP:
|
||||
RL H ; FULL WORD
|
||||
LD C,H ; BANK NUMBER FROM H TO C
|
||||
; 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
|
||||
LD A,C ; BANK VALUE INTO A
|
||||
PUSH AF ; SAVE IT FOR NOW
|
||||
@@ -195,7 +236,7 @@ MD_IOSETUP:
|
||||
LD H,L ; MOVE MSB TO H WHERE IT BELONGS
|
||||
LD L,0 ; AND ZERO L SO HL IS NOW BYTE OFFSET
|
||||
; 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
|
||||
; FINISH UP
|
||||
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_DSTBNK .DB 0
|
||||
MD_SRC .DW 0
|
||||
|
||||
@@ -152,7 +152,7 @@ PPIDE_REG_DRVADR .EQU PPIDE_CTL_CS3FX | $07 ; DRIVE ADDRESS REGISTER (R)
|
||||
; PPIDE2: SECONDARY MASTER
|
||||
; PPIDE3: SECONDARY SLAVE
|
||||
;
|
||||
PPIDE_UNITCNT .EQU 2 ; ASSUME ONLY PRIMARY INTERFACE
|
||||
PPIDE_UNITCNT .EQU 2 ; ASSUME ONLY PRIMARY INTERFACE
|
||||
;
|
||||
; COMMAND BYTES
|
||||
;
|
||||
@@ -233,9 +233,11 @@ PPIDE_INIT1:
|
||||
RET ; DONE
|
||||
;
|
||||
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
|
||||
PPIDE_DPTR(PPIDE_STAT) ; GET STATUS ADR IN HL, AF TRASHED
|
||||
@@ -281,28 +283,40 @@ PPIDE_INIT2:
|
||||
;=============================================================================
|
||||
;
|
||||
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
|
||||
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:
|
||||
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
|
||||
@@ -312,6 +326,7 @@ PPIDE_READ:
|
||||
;
|
||||
;
|
||||
PPIDE_WRITE:
|
||||
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
|
||||
@@ -329,7 +344,7 @@ PPIDE_STATUS:
|
||||
;
|
||||
; PPIDE_MEDIA
|
||||
;
|
||||
PPIDE_MEDIA:
|
||||
PPIDE_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
|
||||
@@ -338,7 +353,8 @@ PPIDE_MEDIA:
|
||||
PUSH AF ; SAVE UNIT SELECTION
|
||||
CALL PPIDE_RESET ; RESET ALL DEVICES ON BUS
|
||||
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
|
||||
LD A,(HL) ; GET STATUS
|
||||
@@ -346,14 +362,31 @@ PPIDE_MEDIA:
|
||||
#IF (PPIDETRACE == 1)
|
||||
CALL PPIDE_PRTERR ; PRINT ANY ERRORS
|
||||
#ENDIF
|
||||
LD A,MID_HD ; ASSUME WE ARE OK
|
||||
LD E,MID_HD ; ASSUME WE ARE OK
|
||||
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
|
||||
;
|
||||
;
|
||||
;
|
||||
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_DPTR(PPIDE_CAPACITY) ; POINT HL TO CAPACITY OF CUR UNIT
|
||||
CALL LD32 ; GET THE CURRENT CAPACITY DO DE:HL
|
||||
@@ -443,7 +476,7 @@ PPIDE_RDSEC:
|
||||
LD (PPIDE_CMD),A
|
||||
CALL PPIDE_RUNCMD
|
||||
RET NZ
|
||||
LD HL,(DIOBUF)
|
||||
LD HL,(PPIDE_DSKBUF)
|
||||
JP PPIDE_GETBUF
|
||||
;
|
||||
;
|
||||
@@ -465,7 +498,7 @@ PPIDE_WRSEC:
|
||||
LD (PPIDE_CMD),A
|
||||
CALL PPIDE_RUNCMD
|
||||
RET NZ
|
||||
LD HL,(DIOBUF)
|
||||
LD HL,(PPIDE_DSKBUF)
|
||||
JP PPIDE_PUTBUF
|
||||
;
|
||||
;
|
||||
@@ -549,7 +582,7 @@ PPIDE_GETBUF:
|
||||
LD D,A ; D := READ ASSERTED
|
||||
;
|
||||
; LOOP SETUP
|
||||
;LD HL,(DIOBUF) ; LOCATION OF BUFFER
|
||||
;LD HL,(PPIDE_DSKBUF) ; LOCATION OF BUFFER
|
||||
LD B,0 ; 256 ITERATIONS
|
||||
LD C,PPIDE_IO_DATALO ; SETUP C WITH IO PORT (LSB)
|
||||
;
|
||||
@@ -608,7 +641,7 @@ PPIDE_PUTBUF:
|
||||
LD D,A ; D := WRITE ASSERTED
|
||||
;
|
||||
; LOOP SETUP
|
||||
;LD HL,(DIOBUF) ; LOCATION OF BUFFER
|
||||
;LD HL,(PPIDE_DSKBUF) ; LOCATION OF BUFFER
|
||||
LD B,0 ; 256 ITERATIONS
|
||||
LD C,PPIDE_IO_DATALO ; SETUP C WITH IO PORT (LSB)
|
||||
;
|
||||
@@ -700,6 +733,9 @@ PPIDE_RESET:
|
||||
LD BC,PPIDE_UDLEN
|
||||
XOR A
|
||||
CALL FILL
|
||||
;
|
||||
LD A,(PPIDE_UNIT) ; GET THE CURRENT UNIT SELECTION
|
||||
PUSH AF ; AND SAVE IT
|
||||
;
|
||||
; PROBE / INITIALIZE ALL UNITS
|
||||
LD B,PPIDE_UNITCNT ; NUMBER OF UNITS TO TRY
|
||||
@@ -711,6 +747,9 @@ PPIDE_RESET1:
|
||||
POP BC
|
||||
INC C ; NEXT UNIT
|
||||
DJNZ PPIDE_RESET1 ; LOOP AS NEEDED
|
||||
;
|
||||
POP AF ; RECOVER ORIGINAL UNIT NUMBER
|
||||
CALL PPIDE_SELUNIT ; ... AND RESELECT IT
|
||||
;
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET ; AND DONE
|
||||
@@ -718,12 +757,22 @@ PPIDE_RESET1:
|
||||
;
|
||||
;
|
||||
PPIDE_INITUNIT:
|
||||
LD (PPIDE_UNIT),A ; SET ACTIVE UNIT
|
||||
|
||||
CALL PPIDE_SELUNIT ; SELECT UNIT
|
||||
RET NZ ; ABORT IF ERROR
|
||||
|
||||
|
||||
CALL PPIDE_PROBE ; DO PROBE
|
||||
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
|
||||
;
|
||||
; TAKE ANY ACTIONS REQUIRED TO SELECT DESIRED PHYSICAL UNIT
|
||||
@@ -738,7 +787,9 @@ PPIDE_SELUNIT:
|
||||
JP NC,PPIDE_INVUNIT ; HANDLE INVALID UNIT
|
||||
;
|
||||
; 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
|
||||
LD HL,PPIDE_DRVSEL
|
||||
@@ -752,6 +803,7 @@ PPIDE_SELUNIT:
|
||||
;
|
||||
; SPEC REQUIRES 400NS DELAY BEFORE CHECKING STATUS REGISTER
|
||||
;
|
||||
POP HL ; RECOVER HL
|
||||
XOR A
|
||||
RET
|
||||
;
|
||||
@@ -1180,6 +1232,7 @@ PPIDE_CMD .DB 0 ; PENDING COMMAND TO PROCESS
|
||||
PPIDE_DRVHD .DB 0 ; CURRENT DRIVE/HEAD MASK
|
||||
;
|
||||
PPIDE_UNIT .DB 0 ; ACTIVE UNIT, DEFAULT TO ZERO
|
||||
PPIDE_DSKBUF .DW 0 ; ACTIVE DISK BUFFER
|
||||
;
|
||||
; UNIT SPECIFIC DATA STORAGE
|
||||
;
|
||||
|
||||
@@ -121,11 +121,18 @@ PPP_INITPPP:
|
||||
;
|
||||
;
|
||||
PPP_DETECT:
|
||||
LD BC,4000 ; TRY FOR ABOUT 4 SECONDS
|
||||
LD BC,6000 ; TRY FOR ABOUT 6 SECONDS
|
||||
PPP_DETECT1:
|
||||
LD DE,64 ; 1 MS
|
||||
CALL VDELAY
|
||||
|
||||
IN A,(PPP_CTL)
|
||||
BIT 5,A
|
||||
JR Z,PPP_DETECT1
|
||||
|
||||
IN A,(PPP_IO)
|
||||
;CALL PC_SPACE
|
||||
;CALL PRTHEXBYTE
|
||||
CP $AA
|
||||
RET Z ; RETURN IF MATCH
|
||||
DEC BC
|
||||
@@ -198,9 +205,10 @@ PPP_SNDCMD1:
|
||||
;
|
||||
PPP_PUTBYTE:
|
||||
PUSH AF
|
||||
PPP_PUTBYTE1:
|
||||
IN A,(PPP_CTL)
|
||||
BIT 7,A
|
||||
JR Z,PPP_PUTBYTE
|
||||
JR Z,PPP_PUTBYTE1
|
||||
POP AF
|
||||
OUT (PPP_IO),A
|
||||
RET
|
||||
@@ -262,6 +270,7 @@ PPPCON_IN:
|
||||
LD D,PPP_CMDKBDRD ; CMD = KEYBOARD READ
|
||||
CALL PPP_SNDCMD ; SEND COMMAND
|
||||
CALL PPP_GETBYTE ; GET CHARACTER READ
|
||||
LD E,A ; PUT IN E
|
||||
XOR A ; CLEAR A (SUCCESS)
|
||||
RET ; AND RETURN
|
||||
;
|
||||
@@ -284,7 +293,7 @@ PPPCON_OUT:
|
||||
JR Z,PPPCON_OUT ; WAIT IF NECESSARY
|
||||
LD D,PPP_CMDVIDOUT ; CMD = VIDEO OUTPUT
|
||||
CALL PPP_SNDCMD ; SEND COMMAND
|
||||
LD A,E
|
||||
LD A,E ; MOVE TO A
|
||||
CALL PPP_PUTBYTE ; SEND IT
|
||||
RET ; RETURN
|
||||
;
|
||||
@@ -330,7 +339,9 @@ PPPSD_STWRTPROT .EQU -10 ; ATTEMPT TO WRITE TO WRITE PROTECTED MEDIA
|
||||
PPPSD_INIT:
|
||||
; REINITIALIZE THE CARD HERE
|
||||
CALL PPPSD_INITCARD
|
||||
RET NZ
|
||||
#IF (PPPSDTRACE < 2)
|
||||
JP NZ,PPPSD_PRTSTAT ; IF ERROR, SHOW IT
|
||||
#ENDIF
|
||||
;
|
||||
CALL NEWLINE
|
||||
PRTS("PPPSD:$")
|
||||
@@ -358,28 +369,40 @@ PPPSD_INIT:
|
||||
;
|
||||
;
|
||||
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_CAP
|
||||
JP Z,PPPSD_READ ; SUB-FUNC 1: READ
|
||||
DEC A
|
||||
JP Z,PPPSD_GEOM
|
||||
CALL PANIC
|
||||
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
|
||||
JP Z,PPPSD_GEOM ; SUB-FUNC 6: GET GEOMETRY
|
||||
DEC A
|
||||
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
|
||||
;
|
||||
PPPSD_READ:
|
||||
LD (PPPSD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
|
||||
|
||||
#IF (PPPSDTRACE == 1)
|
||||
LD HL,PPPSD_PRTERR ; SET UP PPPSD_PRTERR
|
||||
PUSH HL ; ... TO FILTER ALL EXITS
|
||||
@@ -401,17 +424,15 @@ PPPSD_READ:
|
||||
CALL PPP_SNDCMD ; SEND COMMAND
|
||||
RET NZ
|
||||
|
||||
LD DE,$FFFF
|
||||
LD HL,$FFFF
|
||||
LD BC,HSTLBA
|
||||
CALL ST32
|
||||
|
||||
CALL PPPSD_SENDBLK ; SEND THE LBA BLOCK NUMBER
|
||||
CALL PPP_GETBYTE ; GET READ RESULT
|
||||
LD (PPPSD_DSKSTAT),A ; SAVE IT
|
||||
|
||||
#IF (PPPSDTRACE >= 3)
|
||||
CALL PC_SPACE
|
||||
CALL PRTHEXBYTE
|
||||
#ENDIF
|
||||
|
||||
OR A ; SET FLAGS
|
||||
JR Z,PPPSD_READ1
|
||||
|
||||
@@ -427,7 +448,7 @@ PPPSD_READ1:
|
||||
|
||||
; READ THE SECTOR DATA
|
||||
LD BC,512
|
||||
LD HL,(DIOBUF)
|
||||
LD HL,(PPPSD_DSKBUF)
|
||||
PPPSD_READ2:
|
||||
CALL PPP_GETBYTE
|
||||
LD (HL),A
|
||||
@@ -443,6 +464,8 @@ PPPSD_READ2:
|
||||
; WRITE AN LBA BLOCK TO THE SD CARD
|
||||
;
|
||||
PPPSD_WRITE:
|
||||
LD (PPPSD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
|
||||
|
||||
#IF (PPPSDTRACE == 1)
|
||||
LD HL,PPPSD_PRTERR ; SET UP PPPSD_PRTERR
|
||||
PUSH HL ; ... TO FILTER ALL EXITS
|
||||
@@ -466,7 +489,7 @@ PPPSD_WRITE:
|
||||
|
||||
; SEND OVER THE SECTOR CONTENTS
|
||||
LD BC,512
|
||||
LD HL,(DIOBUF)
|
||||
LD HL,(PPPSD_DSKBUF)
|
||||
PPPSD_WRITE1:
|
||||
LD A,(HL)
|
||||
INC HL
|
||||
@@ -482,10 +505,13 @@ PPPSD_WRITE1:
|
||||
RET NZ
|
||||
CALL PPPSD_SENDBLK ; SEND THE LBA BLOCK NUMBER
|
||||
CALL PPP_GETBYTE
|
||||
LD (PPPSD_DSKSTAT),A ; SAVE IT
|
||||
|
||||
#IF (PPPSDTRACE >= 3)
|
||||
CALL PC_SPACE
|
||||
CALL PRTHEXBYTE
|
||||
#ENDIF
|
||||
|
||||
OR A ; SET FLAGS
|
||||
RET Z ; DONE IF NO ERRORS
|
||||
|
||||
@@ -500,23 +526,46 @@ PPPSD_STATUS:
|
||||
OR A
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
PPPSD_RESET:
|
||||
XOR A ; ALWAYS OK
|
||||
RET
|
||||
;
|
||||
; SETUP FOR SUBSEQUENT ACCESS
|
||||
; INIT CARD IF NOT READY OR ON DRIVE LOG IN
|
||||
;
|
||||
PPPSD_MEDIA:
|
||||
PPPSD_GETPAR:
|
||||
; REINITIALIZE THE CARD HERE TO DETERMINE PRESENCE
|
||||
CALL PPPSD_INITCARD
|
||||
#IF (PPPSDTRACE == 1)
|
||||
CALL PPPSD_PRTERR ; PRINT ANY ERRORS
|
||||
#ENDIF
|
||||
LD A,MID_HD ; ASSUME SUCCESS, SETUP MEDIA ID
|
||||
LD E,MID_HD ; ASSUME WE ARE OK
|
||||
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
|
||||
;
|
||||
;
|
||||
;
|
||||
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:
|
||||
LD HL,PPPSD_BLKCNT ; GET BLOCK COUNT
|
||||
CALL LD32 ; GET THE CURRENT CAPACITY DO DE:HL
|
||||
@@ -541,8 +590,6 @@ PPPSD_GEOM:
|
||||
; UNIT IS SPECIFIED IN A
|
||||
;
|
||||
PPPSD_SELUNIT:
|
||||
CP PPPSD_UNITCNT ; CHECK VALIDITY (EXCEED UNIT COUNT?)
|
||||
JP NC,PPPSD_INVUNIT ; HANDLE INVALID UNIT
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET ; DONE
|
||||
;
|
||||
@@ -554,15 +601,32 @@ PPPSD_INITCARD:
|
||||
LD BC,PPPSD_UNITDATALEN
|
||||
XOR A
|
||||
CALL FILL
|
||||
;
|
||||
|
||||
#IF (PPPSDTRACE >= 3)
|
||||
CALL PPPSD_PRTPREFIX
|
||||
PRTS(" RESET$")
|
||||
#ENDIF
|
||||
|
||||
; RESET & STATUS DISK
|
||||
LD D,PPP_CMDDSKRES ; COMMAND = DSKRESET
|
||||
CALL PPP_SNDCMD
|
||||
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
|
||||
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)
|
||||
; GET CSD IF DEBUGGING
|
||||
@@ -720,6 +784,10 @@ PPPSD_SENDBLK:
|
||||
LD B,4
|
||||
PPPSD_SENDBLK1:
|
||||
LD A,(HL)
|
||||
|
||||
;CALL PC_SPACE
|
||||
;CALL PRTHEXBYTE
|
||||
|
||||
INC HL
|
||||
CALL PPP_PUTBYTE
|
||||
DJNZ PPPSD_SENDBLK1
|
||||
@@ -913,6 +981,9 @@ PPPSD_STR_TYPESDXC .TEXT "SDXC$"
|
||||
; DATA STORAGE
|
||||
;=============================================================================
|
||||
;
|
||||
PPPSD_UNIT .DB 0
|
||||
PPPSD_DSKBUF .DW 0
|
||||
;
|
||||
PPPSD_UNITDATA:
|
||||
PPPSD_STAT .DB 0
|
||||
PPPSD_DSKSTAT .DB 0
|
||||
|
||||
@@ -226,8 +226,8 @@ PRPSD_STINVUNIT .EQU -1 ; INVALID UNIT
|
||||
PRPSD_STRDYTO .EQU -2 ; TIMEOUT WAITING FOR CARD TO BE READY
|
||||
PRPSD_STINITTO .EQU -3 ; INITIALIZATOIN TIMEOUT
|
||||
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_STCRCERR .EQU -8 ; CRC ERROR ON RECEIVED DATA PACKET
|
||||
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:
|
||||
; REINITIALIZE THE CARD HERE
|
||||
CALL PRPSD_INITCARD
|
||||
RET NZ
|
||||
#IF (PRPSDTRACE < 2)
|
||||
JP NZ,PRPSD_PRTSTAT ; IF ERROR, SHOW IT
|
||||
#ENDIF
|
||||
;
|
||||
CALL PRPSD_PRTPREFIX
|
||||
;
|
||||
@@ -265,28 +267,40 @@ PRPSD_INIT:
|
||||
;
|
||||
;
|
||||
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
|
||||
JP Z,PRPSD_WRITE
|
||||
JP Z,PRPSD_READ ; SUB-FUNC 1: READ
|
||||
DEC A
|
||||
JP Z,PRPSD_STATUS
|
||||
JP Z,PRPSD_WRITE ; SUB-FUNC 2: WRITE
|
||||
DEC A
|
||||
JP Z,PRPSD_MEDIA
|
||||
JP Z,PRPSD_STATUS ; SUB-FUNC 3: STATUS
|
||||
DEC A
|
||||
JP Z,PRPSD_CAP
|
||||
JP Z,PRPSD_RESET ; SUB-FUNC 4: RESET
|
||||
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:
|
||||
LD (PRPSD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
|
||||
|
||||
#IF (PRPSDTRACE == 1)
|
||||
LD HL,PRPSD_PRTERR ; SET UP PRPSD_PRTERR
|
||||
PUSH HL ; ... TO FILTER ALL EXITS
|
||||
@@ -316,7 +330,7 @@ PRPSD_READ:
|
||||
|
||||
LD C,PRPSD_DSKIO
|
||||
LD B,0
|
||||
LD HL,(DIOBUF)
|
||||
LD HL,(PRPSD_DSKBUF)
|
||||
INIR
|
||||
INIR
|
||||
|
||||
@@ -326,8 +340,10 @@ PRPSD_READ:
|
||||
;
|
||||
;
|
||||
PRPSD_WRITE:
|
||||
LD (PRPSD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
|
||||
|
||||
#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
|
||||
#ENDIF
|
||||
|
||||
@@ -350,7 +366,7 @@ PRPSD_WRITE:
|
||||
|
||||
LD C,PRPSD_DSKIO
|
||||
LD B,0
|
||||
LD HL,(DIOBUF)
|
||||
LD HL,(PRPSD_DSKBUF)
|
||||
OTIR
|
||||
OTIR
|
||||
|
||||
@@ -372,22 +388,45 @@ PRPSD_STATUS:
|
||||
OR A
|
||||
RET
|
||||
;
|
||||
; PRPSD_MEDIA
|
||||
;
|
||||
PRPSD_MEDIA:
|
||||
;
|
||||
PRPSD_RESET:
|
||||
XOR A ; ALWAYS OK
|
||||
RET
|
||||
;
|
||||
; PRPSD_GETPAR
|
||||
;
|
||||
PRPSD_GETPAR:
|
||||
; REINITIALIZE THE CARD HERE
|
||||
CALL PRPSD_INITCARD
|
||||
#IF (PRPSDTRACE == 1)
|
||||
CALL PRPSD_PRTERR ; PRINT ANY ERRORS
|
||||
#ENDIF
|
||||
LD A,MID_HD ; ASSUME SUCCESS, SETUP MEDIA ID
|
||||
LD E,MID_HD ; ASSUME WE ARE OK
|
||||
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
|
||||
;
|
||||
;
|
||||
;
|
||||
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:
|
||||
LD HL,PRPSD_BLKCNT ; POINT TO BLOCK COUNT
|
||||
CALL LD32 ; GET THE CURRENT CAPACITY TO DE:HL
|
||||
@@ -412,8 +451,6 @@ PRPSD_GEOM:
|
||||
; UNIT IS SPECIFIED IN A
|
||||
;
|
||||
PRPSD_SELUNIT:
|
||||
CP PRPSD_UNITCNT ; CHECK VALIDITY (EXCEED UNIT COUNT?)
|
||||
JP NC,PRPSD_INVUNIT ; HANDLE INVALID UNIT
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
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)
|
||||
;
|
||||
PRPSD_UNIT .DB 0
|
||||
PRPSD_DSKBUF .DW 0
|
||||
;
|
||||
PRPSD_UNITDATA:
|
||||
PRPSD_STAT .DB 0
|
||||
PRPSD_DSKSTAT .DB 0
|
||||
|
||||
@@ -28,31 +28,50 @@ RF_INIT:
|
||||
;
|
||||
;
|
||||
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
|
||||
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
|
||||
JR Z,RF_WRITE
|
||||
JP Z,RF_READ ; SUB-FUNC 1: READ
|
||||
DEC A
|
||||
JR Z,RF_STATUS
|
||||
JP Z,RF_WRITE ; SUB-FUNC 2: WRITE
|
||||
DEC A
|
||||
JR Z,RF_MEDIA
|
||||
JP Z,RF_STATUS ; SUB-FUNC 3: STATUS
|
||||
DEC A
|
||||
JP Z,RF_CAP
|
||||
JP Z,RF_RESET ; SUB-FUNC 4: RESET
|
||||
DEC A
|
||||
JP Z,RF_GEOM
|
||||
CALL PANIC
|
||||
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_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
|
||||
;
|
||||
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:
|
||||
LD A,C ; DEVICE/UNIT IS IN C
|
||||
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:
|
||||
LD (RF_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
|
||||
CALL RF_SETIO
|
||||
CALL RF_SETADR
|
||||
LD HL,(DIOBUF)
|
||||
LD HL,(RF_DSKBUF)
|
||||
LD B,0
|
||||
LD A,(RF_IO)
|
||||
OR RF_DAT
|
||||
@@ -104,6 +141,7 @@ RF_READ:
|
||||
;
|
||||
;
|
||||
RF_WRITE:
|
||||
LD (RF_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
|
||||
CALL RF_SETIO
|
||||
LD A,(RF_IO)
|
||||
OR RF_ST
|
||||
@@ -113,7 +151,7 @@ RF_WRITE:
|
||||
LD A,1 ; PREPARE TO RETURN FALSE (ERROR)
|
||||
RET NZ ; WRITE PROTECTED!
|
||||
CALL RF_SETADR
|
||||
LD HL,(DIOBUF)
|
||||
LD HL,(RF_DSKBUF)
|
||||
LD B,0
|
||||
LD A,(RF_IO)
|
||||
OR RF_DAT
|
||||
@@ -126,7 +164,7 @@ RF_WRITE:
|
||||
;
|
||||
;
|
||||
RF_SETIO:
|
||||
LD A,(HSTDSK) ; GET DEVICE/UNIT
|
||||
LD A,(RF_UNIT) ; GET DEVICE/UNIT
|
||||
AND $0F ; ISOLATE UNIT NUM
|
||||
JR NZ,RF_SETIO1
|
||||
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
|
||||
|
||||
@@ -321,7 +321,9 @@ SD_INIT1:
|
||||
;
|
||||
; INITIALIZE UNIT DESIGNATED IN ACCUM
|
||||
;
|
||||
SD_INITUNIT:
|
||||
SD_INITUNIT
|
||||
LD (SD_UNIT),A ; SET CURRENT UNIT
|
||||
;
|
||||
CALL SD_SELUNIT ; SELECT UNIT
|
||||
RET NZ ; ABORT ON ERROR
|
||||
;
|
||||
@@ -404,42 +406,61 @@ SD_INITUNIT2:
|
||||
;=============================================================================
|
||||
;
|
||||
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
|
||||
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:
|
||||
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
|
||||
;
|
||||
;
|
||||
;
|
||||
SD_WRITE:
|
||||
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
|
||||
; WRITE A SECTOR
|
||||
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
|
||||
;
|
||||
@@ -450,18 +471,46 @@ SD_STATUS:
|
||||
OR A ; SET FLAGS
|
||||
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
|
||||
CALL SD_INITCARD ; RE-INIT SELECTED UNIT
|
||||
#IF (SDTRACE == 1)
|
||||
CALL SD_PRTERR ; PRINT ANY ERRORS
|
||||
#ENDIF
|
||||
LD A,MID_HD ; ASSUME SUCCESS, SETUP MEDIA ID
|
||||
LD E,MID_HD ; ASSUME WE ARE OK
|
||||
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
|
||||
;
|
||||
;
|
||||
;
|
||||
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_DPTR(SD_CAPACITY) ; POINT HL TO CAPACITY OF CUR UNIT
|
||||
CALL LD32 ; GET THE CURRENT CAPACITY DO DE:HL
|
||||
@@ -469,6 +518,8 @@ SD_CAP:
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET ; AND DONE
|
||||
;
|
||||
;
|
||||
;
|
||||
SD_GEOM:
|
||||
; 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
|
||||
@@ -794,7 +845,7 @@ SD_SECTIO:
|
||||
CALL SD_EXECCMD ; EXECUTE COMMAND
|
||||
RET NZ ; ABORT ON ERROR
|
||||
|
||||
LD HL,(DIOBUF)
|
||||
LD HL,(SD_DSKBUF)
|
||||
LD BC,512 ; LENGTH TO READ
|
||||
LD A,(SD_CMD) ; GET THE COMMAND
|
||||
CP SD_CMD_READ_SNGL_BLK ; READ_SINGLE_BLOCK?
|
||||
@@ -1156,7 +1207,7 @@ SD_SELUNIT:
|
||||
JP NC,SD_INVUNIT ; HANDLE INVALID UNIT
|
||||
;
|
||||
; 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)
|
||||
; SELECT REQUESTED UNIT
|
||||
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_UNIT .DB 0 ; ACTIVE UNIT, DEFAULT TO ZERO
|
||||
SD_DSKBUF .DW 0 ; ACTIVE DISK BUFFER
|
||||
;
|
||||
; UNIT SPECIFIC DATA STORAGE
|
||||
;
|
||||
|
||||
Reference in New Issue
Block a user