|
|
|
@ -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: |
|
|
|
CALL FD_SELECTUNIT |
|
|
|
RET NZ |
|
|
|
; |
|
|
|
; DISPATCH ACCORDING TO DISK SUB-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 |
|
|
|
JP Z,FD_WRITE |
|
|
|
JP Z,FD_READ ; SUB-FUNC 1: READ |
|
|
|
DEC A |
|
|
|
JP Z,FD_STATUS |
|
|
|
JP Z,FD_WRITE ; SUB-FUNC 2: WRITE |
|
|
|
DEC A |
|
|
|
JP Z,FD_MEDIA |
|
|
|
JP Z,FD_STATUS ; SUB-FUNC 3: STATUS |
|
|
|
DEC A |
|
|
|
JP Z,FD_CAP |
|
|
|
JP Z,FD_RESET ; SUB-FUNC 4: RESET |
|
|
|
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) |
|
|
|
; 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 |
|
|
|
|
|
|
|
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 |