|
|
|
@ -128,6 +128,34 @@ CMD_DRVSTAT .EQU 00000100B ; CMD,HDS/DS --> ST3 |
|
|
|
CMD_SEEK .EQU 00001111B ; CMD,HDS/DS --> <EMPTY> |
|
|
|
CMD_VERSION .EQU 00010000B ; CMD --> ST0 |
|
|
|
; |
|
|
|
; |
|
|
|
; Specify Command: |
|
|
|
; +-----+-----+-----+-----+-----+-----+-----+-----+-----+ |
|
|
|
; |Byte | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
|
|
|
; +-----+-----+-----+-----+-----+-----+-----+-----+-----+ |
|
|
|
; | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | |
|
|
|
; | 1 | ----- STEP RATE ----- | -- HEAD UNLOAD TIME - | |
|
|
|
; | 2 | ------------ HEAD LOAD TIME ----------- | NDM | |
|
|
|
; +-----+-----+-----+-----+-----+-----+-----+-----+-----+ |
|
|
|
; |
|
|
|
; |
|
|
|
; Step Rate (milliseconds): Head Unload Time (milliseconds): Head Load Time (milliseconds): |
|
|
|
; +------+------+------+------+------+ +------+------+------+------+------+ +------+------+------+------+------+ |
|
|
|
; | | BITRATE | | | BITRATE | | | BITRATE | |
|
|
|
; | VAL | 1.0M | 500K | 300K | 250K | | VAL | 1.0M | 500K | 300K | 250K | | VAL | 1.0M | 500K | 300K | 250K | |
|
|
|
; +------+------+------+------+------+ +------+------+------+------+------+ +------+------+------+------+------+ |
|
|
|
; | 0 | 8.0 | 16.0 | 26.7 | 32.0 | | 0 | 128 | 256 | 426 | 512 | | 0 | 128 | 256 | 426 | 512 | |
|
|
|
; | 1 | 7.5 | 15.0 | 25.0 | 30.0 | | 1 | 8 | 16 | 26.7 | 32 | | 1 | 1 | 2 | 3.3 | 4 | |
|
|
|
; | 2 | 7.0 | 14.0 | 23.3 | 28.0 | | 2 | 16 | 32 | 53.3 | 64 | | 2 | 2 | 4 | 6.7 | 8 | |
|
|
|
; | ... | ... | ... | ... | ... | | ... | ... | ... | ... | ... | | ... | ... | ... | ... | ... | |
|
|
|
; | 14 | 1.0 | 2.0 | 3.3 | 4.0 | | 14 | 112 | 224 | 373 | 448 | | 126 | 126 | 252 | 420 | 504 | |
|
|
|
; | 15 | 0.5 | 1.0 | 1.7 | 2.0 | | 15 | 120 | 240 | 400 | 480 | | 127 | 127 | 254 | 423 | 508 | |
|
|
|
; +------+------+------+------+------+ +------+------+------+------+------+ +------+------+------+------+------+ |
|
|
|
; |
|
|
|
; IBM PS/2 CALLS FOR: |
|
|
|
; STEP RATE: 3ms (6ms FOR ALL 41mm OR 720K DRIVES) |
|
|
|
; HEAD LOAD TIME: 15ms |
|
|
|
; |
|
|
|
; STATIC CONFIGURATION, NEVER CHANGES (PRIVATE) |
|
|
|
; |
|
|
|
FCD_MT .EQU 000H ; MULTI-TRACK, WE DON'T USE, SET TO 0 |
|
|
|
@ -145,8 +173,8 @@ FCD_PC720 .DB 050H ; NUMBER OF CYLINDERS |
|
|
|
.DW 200H ; SECTOR SIZE IN BYTES |
|
|
|
.DB 02AH ; GAP LENGTH (R/W) |
|
|
|
.DB 050H ; GAP LENGTH (FORMAT) |
|
|
|
.DB 0DFH ; SRT/HUT: STEP RATE, IBM PS/2 CALLS FOR 3ms, 0DH = 3ms SRT, HEAD UNLOAD TIME |
|
|
|
.DB 005H ; HLT/ND: HEAD LOAD TIME, IBM PS/2 CALLS FOR 15ms 08H = 16ms HUT |
|
|
|
.DB (13 << 4) | 0 ; SRT = 6ms, HUT = 512ms |
|
|
|
.DB (4 << 1) | 1 ; HLT = 16ms, ND = YES |
|
|
|
.DB DOR_BR250 ; DOR |
|
|
|
.DB DCR_BR250 ; DCR |
|
|
|
.IF (($ - FCD_PC720) != FCD_LEN) |
|
|
|
@ -161,8 +189,8 @@ FCD_PC144 .DB 050H ; NUMBER OF CYLINDERS |
|
|
|
.DW 200H ; SECTOR SIZE IN BYTES |
|
|
|
.DB 01BH ; GAP LENGTH (R/W) |
|
|
|
.DB 06CH ; GAP LENGTH (FORMAT) |
|
|
|
.DB 0DFH ; SRT/HUT: STEP RATE, IBM PS/2 CALLS FOR 3ms, 0DH = 3ms SRT, HEAD UNLOAD TIME |
|
|
|
.DB 009H ; HLT/ND: HEAD LOAD TIME, IBM PS/2 CALLS FOR 15ms 08H = 16ms HUT |
|
|
|
.DB (13 << 4) | 0 ; SRT = 3ms, HUT = 256ms |
|
|
|
.DB (8 << 1) | 1 ; HLT = 16ms, ND = YES |
|
|
|
.DB DOR_BR500 ; DOR |
|
|
|
.DB DCR_BR500 ; DCR |
|
|
|
.IF (($ - FCD_PC144) != FCD_LEN) |
|
|
|
@ -177,8 +205,8 @@ FCD_PC360 .DB 028H ; NUMBER OF CYLINDERS |
|
|
|
.DW 200H ; SECTOR SIZE IN BYTES |
|
|
|
.DB 02AH ; GAP LENGTH (R/W) |
|
|
|
.DB 050H ; GAP LENGTH (FORMAT) |
|
|
|
.DB 0DFH ; SRT/HUT: STEP RATE, IBM PS/2 CALLS FOR 3ms, 0DH = 3ms SRT, HEAD UNLOAD TIME |
|
|
|
.DB 005H ; HLT/ND: HEAD LOAD TIME, IBM PS/2 CALLS FOR 15ms 08H = 16ms HUT |
|
|
|
.DB (13 << 4) | 0 ; SRT = 6ms, HUT = 512ms |
|
|
|
.DB (4 << 1) | 1 ; HLT = 16ms, ND = YES |
|
|
|
.DB DOR_BR250 ; DOR |
|
|
|
.DB DCR_BR250 ; DCR |
|
|
|
.IF (($ - FCD_PC360) != FCD_LEN) |
|
|
|
@ -193,15 +221,15 @@ FCD_PC120 .DB 050H ; NUMBER OF CYLINDERS |
|
|
|
.DW 200H ; SECTOR SIZE IN BYTES |
|
|
|
.DB 01BH ; GAP LENGTH (R/W) |
|
|
|
.DB 054H ; GAP LENGTH (FORMAT) |
|
|
|
.DB 0DFH ; SRT/HUT: STEP RATE, IBM PS/2 CALLS FOR 3ms, 0DH = 3ms SRT, HEAD UNLOAD TIME |
|
|
|
.DB 009H ; HLT/ND: HEAD LOAD TIME, IBM PS/2 CALLS FOR 15ms 08H = 16ms HUT |
|
|
|
.DB (10 << 4) | 0 ; SRT = 6ms, HUT = 256ms |
|
|
|
.DB (8 << 1) | 1 ; HLT = 16ms, ND = YES |
|
|
|
.DB DOR_BR500 ; DOR |
|
|
|
.DB DCR_BR500 ; DCR |
|
|
|
.IF (($ - FCD_PC120) != FCD_LEN) |
|
|
|
.ECHO "*** FCD_PC120 SIZE ERROR!!! ***\n" |
|
|
|
.ENDIF |
|
|
|
; |
|
|
|
FCD_PC111 .DB 04AH ; NUMBER OF CYLINDERS |
|
|
|
FCD_PC111 .DB 04DH ; NUMBER OF CYLINDERS |
|
|
|
.DB 002H ; NUMBER OF HEADS |
|
|
|
.DB 00FH ; NUMBER OF SECTORS |
|
|
|
.DB 001H ; START OF TRACK (ID OF FIRST SECTOR, USUALLY 1) |
|
|
|
@ -209,8 +237,8 @@ FCD_PC111 .DB 04AH ; NUMBER OF CYLINDERS |
|
|
|
.DW 200H ; SECTOR SIZE IN BYTES |
|
|
|
.DB 01BH ; GAP LENGTH (R/W) |
|
|
|
.DB 054H ; GAP LENGTH (FORMAT) |
|
|
|
.DB 0DFH ; SRT/HUT: STEP RATE, IBM PS/2 CALLS FOR 3ms, 0DH = 3ms SRT, HEAD UNLOAD TIME |
|
|
|
.DB 009H ; HLT/ND: HEAD LOAD TIME, IBM PS/2 CALLS FOR 15ms 08H = 16ms HUT |
|
|
|
.DB (13 << 4) | 0 ; SRT = 3ms, HUT = 256ms |
|
|
|
.DB (25 << 1) | 1 ; HLT = 50ms, ND = YES |
|
|
|
.DB DOR_BR500 ; DOR |
|
|
|
.DB DCR_BR500 ; DCR |
|
|
|
.IF (($ - FCD_PC111) != FCD_LEN) |
|
|
|
@ -285,23 +313,23 @@ DCR_BR500 .EQU 00H ; 500KBPS |
|
|
|
; |
|
|
|
; FDC COMMAND STRINGS |
|
|
|
; |
|
|
|
FCS_NOP: .TEXT "NOP$" |
|
|
|
FCS_READ: .TEXT "READ$" |
|
|
|
FCS_READDEL: .TEXT "READDEL$" |
|
|
|
FCS_WRITE: .TEXT "WRITE$" |
|
|
|
FCS_WRITEDEL: .TEXT "WRITEDEL$" |
|
|
|
FCS_READTRK: .TEXT "READTRK$" |
|
|
|
FCS_READID: .TEXT "READID$" |
|
|
|
FCS_FMTTRK: .TEXT "FMTTRK$" |
|
|
|
FCS_SCANEQ: .TEXT "SCANEQ$" |
|
|
|
FCS_SCANLOEQ: .TEXT "SCANLOEQ$" |
|
|
|
FCS_SCANHIEQ: .TEXT "SCANHIEQ$" |
|
|
|
FCS_RECAL: .TEXT "RECAL$" |
|
|
|
FCS_SENSEINT: .TEXT "SENSEINT$" |
|
|
|
FCS_SPECIFY: .TEXT "SPECIFY$" |
|
|
|
FCS_DRVSTAT: .TEXT "DRVSTAT$" |
|
|
|
FCS_SEEK: .TEXT "SEEK$" |
|
|
|
FCS_VERSION: .TEXT "VER$" |
|
|
|
FCS_NOP .DB "NOP$" |
|
|
|
FCS_READ .DB "READ$" |
|
|
|
FCS_READDEL .DB "READDEL$" |
|
|
|
FCS_WRITE .DB "WRITE$" |
|
|
|
FCS_WRITEDEL .DB "WRITEDEL$" |
|
|
|
FCS_READTRK .DB "READTRK$" |
|
|
|
FCS_READID .DB "READID$" |
|
|
|
FCS_FMTTRK .DB "FMTTRK$" |
|
|
|
FCS_SCANEQ .DB "SCANEQ$" |
|
|
|
FCS_SCANLOEQ .DB "SCANLOEQ$" |
|
|
|
FCS_SCANHIEQ .DB "SCANHIEQ$" |
|
|
|
FCS_RECAL .DB "RECAL$" |
|
|
|
FCS_SENSEINT .DB "SENSEINT$" |
|
|
|
FCS_SPECIFY .DB "SPECIFY$" |
|
|
|
FCS_DRVSTAT .DB "DRVSTAT$" |
|
|
|
FCS_SEEK .DB "SEEK$" |
|
|
|
FCS_VERSION .DB "VER$" |
|
|
|
; |
|
|
|
; FDC COMMAND TABLE |
|
|
|
; |
|
|
|
@ -938,6 +966,27 @@ FC_SETDOR |
|
|
|
#ENDIF |
|
|
|
RET |
|
|
|
; |
|
|
|
; SET FST_DCR |
|
|
|
; |
|
|
|
#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8)) |
|
|
|
; |
|
|
|
FC_SETDCR |
|
|
|
LD (FST_DCR),A |
|
|
|
OUT (FDC_DCR),A |
|
|
|
#IF (FDTRACE >= 3) |
|
|
|
CALL NEWLINE |
|
|
|
LD DE,FDSTR_DCR |
|
|
|
CALL WRITESTR |
|
|
|
LD DE,FDSTR_ARROW |
|
|
|
CALL WRITESTR |
|
|
|
CALL PC_SPACE |
|
|
|
LD A,(FST_DCR) |
|
|
|
CALL PRTHEXBYTE |
|
|
|
#ENDIF |
|
|
|
RET |
|
|
|
; |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
; RESET FDC BY PULSING BIT 7 OF LATCH LOW |
|
|
|
; |
|
|
|
FC_RESETFDC: |
|
|
|
@ -1004,38 +1053,38 @@ FC_MOTORON: |
|
|
|
#ENDIF |
|
|
|
#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8)) |
|
|
|
; SETUP DCR FOR DIDE HARDWARE |
|
|
|
LD A,(FCD_DCR) |
|
|
|
OUT (FDC_DCR),A |
|
|
|
LD A,(FCD_DCR) ; GET NEW DCR VALUE |
|
|
|
CALL FC_SETDCR ; AND IMPLEMENT IT |
|
|
|
|
|
|
|
LD HL,FST_DOR ; POINT TO FDC_DOR |
|
|
|
LD A,(HL) ; START WITH CURRENT DOR |
|
|
|
LD HL,FST_DOR ; POINT TO FDC_DOR |
|
|
|
LD A,(HL) ; START WITH CURRENT DOR |
|
|
|
PUSH AF |
|
|
|
AND 11111100B ; GET RID OF ANY ACTIVE DS BITS |
|
|
|
LD C,A ; SAVE IT FOR NOW |
|
|
|
LD A,(FCD_DS) ; NOW GET CURRENT DS |
|
|
|
LD B,A ; PUT IN B FOR LATER |
|
|
|
OR C ; COMBINE WITH SAVED DOR |
|
|
|
LD C,A ; RE-SAVE IT |
|
|
|
INC B ; SET UP B AS LOOP COUNTER (DS + 1) |
|
|
|
LD A,00001000B ; STARTING BIT PATTERN FOR MOTOR |
|
|
|
AND 11111100B ; GET RID OF ANY ACTIVE DS BITS |
|
|
|
LD C,A ; SAVE IT FOR NOW |
|
|
|
LD A,(FCD_DS) ; NOW GET CURRENT DS |
|
|
|
LD B,A ; PUT IN B FOR LATER |
|
|
|
OR C ; COMBINE WITH SAVED DOR |
|
|
|
LD C,A ; RE-SAVE IT |
|
|
|
INC B ; SET UP B AS LOOP COUNTER (DS + 1) |
|
|
|
LD A,00001000B ; STARTING BIT PATTERN FOR MOTOR |
|
|
|
FC_MOTORON1: |
|
|
|
RLA ; SHIFT LEFT |
|
|
|
DJNZ FC_MOTORON1 ; DS TIMES |
|
|
|
OR C ; COMBINE WITH SAVED |
|
|
|
LD (HL),A ; COMMIT THE NEW VALUE TO FST_DOR |
|
|
|
CALL FC_SETDOR ; OUTPUT TO CONTROLLER |
|
|
|
RLA ; SHIFT LEFT |
|
|
|
DJNZ FC_MOTORON1 ; DS TIMES |
|
|
|
OR C ; COMBINE WITH SAVED |
|
|
|
LD (HL),A ; COMMIT THE NEW VALUE TO FST_DOR |
|
|
|
CALL FC_SETDOR ; OUTPUT TO CONTROLLER |
|
|
|
|
|
|
|
LD C,A |
|
|
|
POP AF |
|
|
|
CP C |
|
|
|
RET Z ; MOTOR WAS PREVIOUSLY ON |
|
|
|
RET Z ; MOTOR WAS PREVIOUSLY ON |
|
|
|
#ENDIF |
|
|
|
|
|
|
|
#IF (FDTRACE >= 3) |
|
|
|
LD DE,FDSTR_MOTDELAY |
|
|
|
CALL WRITESTR |
|
|
|
#ENDIF |
|
|
|
CALL LDELAY ; DELAY FOR MOTOR SPINUP IF NOT PREVIOUSLY ON |
|
|
|
CALL LDELAY ; DELAY FOR MOTOR SPINUP IF NOT PREVIOUSLY ON |
|
|
|
RET |
|
|
|
; |
|
|
|
; SET FST_DOR FOR MOTOR CONTROL OFF |
|
|
|
@ -1046,7 +1095,7 @@ FC_MOTOROFF: |
|
|
|
CALL NZ,FD_FDCRESET |
|
|
|
|
|
|
|
LD A,DOR_INIT |
|
|
|
CALL FC_SETDOR ; OUTPUT TO CONTROLLER |
|
|
|
CALL FC_SETDOR ; OUTPUT TO CONTROLLER |
|
|
|
|
|
|
|
#IF (FDTRACE >= 3) |
|
|
|
LD DE,FDSTR_MOTOFF |
|
|
|
@ -1104,7 +1153,7 @@ FOP_CMD4: ; START OF STATUS LOOP, WAIT FOR FDC TO BE READY FOR BYTE |
|
|
|
CP 0C0H ; HMMMM... RQM=1 & DIO=1, FDC WANTS TO SEND US DATA, UNEXPECTED |
|
|
|
JR Z,FOP_RES ; GO IMMEDIATELY TO RESULTS??? |
|
|
|
DJNZ FOP_CMD4 ; LOOP TILL COUNTER EXHAUSTED |
|
|
|
JR FOP_TOSNDCMD ; COUNTER EXHAUSTED, TIMEOUT / EXIT |
|
|
|
JP FOP_TOSNDCMD ; COUNTER EXHAUSTED, TIMEOUT / EXIT |
|
|
|
|
|
|
|
FOP_CMD6: ; SEND NEXT BYTE |
|
|
|
LD A,(HL) ; POINT TO NEXT BYTE TO SEND |
|
|
|
@ -1131,6 +1180,10 @@ FOP_X1: |
|
|
|
; |
|
|
|
; RESULTS PHASE |
|
|
|
; |
|
|
|
; 1) CHECK FST_RC AND BAIL OUT IF SET??? |
|
|
|
; 2) COMPARE MSR CHECKING TO FXR_NULL (WHICH IS RIGHT?) |
|
|
|
; 3) WHEN DUMPING FRB, USE THE RECORDED LENGTH??? |
|
|
|
; |
|
|
|
FOP_RES: |
|
|
|
LD HL,FRB ; POINT TO RECEIVE BUFFER |
|
|
|
|
|
|
|
@ -1292,8 +1345,11 @@ FXR_NOP: |
|
|
|
; |
|
|
|
; NULL EXECUTION, NO DATA TO READ/WRITE (USED BY READID) |
|
|
|
; |
|
|
|
; DO NOTHING, BUT WAIT FOR FDC READY. LOOP NEEDS TO ALLOW FOR |
|
|
|
; 2 FULL ROTATIONS OF THE DISK WHICH IS 400ms AT 300RPM |
|
|
|
; |
|
|
|
FXR_NULL: |
|
|
|
LD BC,1000H ; BC IS LOOP COUNTER, 4096 ITERATIONS |
|
|
|
LD BC,$4000 ; LOOP COUNTER, $4000 * 25us = 410ms |
|
|
|
FXR_NULL1: |
|
|
|
CALL DELAY |
|
|
|
IN A,(FDC_MSR) ; GET MSR |
|
|
|
@ -1552,6 +1608,7 @@ FDSTR_MOTON .TEXT "\r\nMOTOR ON$" |
|
|
|
FDSTR_MOTOFF .TEXT "\r\nMOTOR OFF$" |
|
|
|
FDSTR_MOTDELAY .TEXT "\r\nMOTOR DELAY$" |
|
|
|
FDSTR_DOR .TEXT "DOR$" |
|
|
|
FDSTR_DCR .TEXT "DCR$" |
|
|
|
FDSTR_RESETFDC .TEXT "\r\nRESET FDC$" |
|
|
|
FDSTR_SELECT .TEXT "\r\nSELECT: $" |
|
|
|
#ENDIF ; (FDTRACE >= 3) |
|
|
|
@ -1582,6 +1639,7 @@ FCP_BUFSIZ .EQU $-FCP_BUF |
|
|
|
; |
|
|
|
FST_RC .DB 00H |
|
|
|
FST_DOR .DB 00H |
|
|
|
FST_DCR .DB 00H |
|
|
|
; |
|
|
|
; FDC RESULTS BUFFER |
|
|
|
; |
|
|
|
|