@ -109,7 +109,7 @@ FRC_TOSEEKWT .EQU -15H ; EB
; FD DEVICE CONFIGURATION
;
FD_DEVCNT .EQU FDCNT ; 2 DEVICES SUPPORTED
FD_CFGSIZ .EQU 8 ; SIZE OF CFG TBL ENTRIES
FD_CFGSIZ .EQU 9 ; SIZE OF CFG TBL ENTRIES
;
; PER DEVICE DATA OFFSETS
; ; OFFSET OF...
@ -121,25 +121,28 @@ FD_HST .EQU 4 ; HOSTS SEEK POSITION
FD_HSTTRK .EQU FD_HST + 0 ; HOST TRACK (WORD)
FD_HSTSEC .EQU FD_HST + 2 ; HOST SECTOR (BYTE)
FD_HSTHD .EQU FD_HST + 3 ; HOST HEAD (BYTE)
FD_TYPE .EQU 8 ; FLOPPY DSIK TYPE (BYTE)
;
FD_CFGTBL:
; DEVICE 0, PRIMARY MASTER
.DB 0 ; DEVICE NUMBER
.DB 0 ; DEVICE STATUS
.DB FDMEDIA ; MEDIA TYPE
.DB $ FF ; CURRENT MEDIA TYPE (INIT TO NONE)
.DB $ FF ; CURRENT TRACK
.DW 0 ; HOST TRACK
.DB 0 ; HOST SECTOR
.DB 0 ; HOST HEAD
.DB FD0TYPE ; DRIVE TYPE
# IF ( FD_DEVCNT > = 2 )
; DEVICE 1, PRIMARY SLAVE
.DB 1 ; DRIVER DEVICE NUMBER
.DB 0 ; DEVICE STATUS
.DB FDMEDIA ; MEDIA TYPE
.DB $ FF ; CURRENT MEDIA TYPE (INIT TO NONE)
.DB $ FF ; CURRENT TRACK
.DW 0 ; HOST TRACK
.DB 0 ; HOST SECTOR
.DB 0 ; HOST HEAD
.DB FD1TYPE ; DRIVE TYPE
# ENDIF
;
# IF ( $ - FD_CFGTBL ) ! = ( FD_DEVCNT * FD_CFGSIZ )
@ -199,6 +202,42 @@ FSST_ENTSIZ .EQU $ - FSST
FSST_COUNT .EQU (( $ - FS ST ) / FS ST_ENTSIZ ) ; # ENTRIES IN TABLE
# ENDIF
;
; FDC DRIVE TYPE MEDIA OPTIONS
;
; THIS TABLE LISTS THE TYPES OF MEDIA THAT SHOULD BE ATTEMPTED
; FOR EACH POSSIBLE DRIVE TYPE. THE ENTRIES MATCH THE ORDER OF THE
; FDT_ VALUES DEFINED IN STD.ASM
;
FD_MEDIAMAP:
.DW FDMM_NONE ; NO DRIVE TYPE
.DW FDMM_3DD
.DW FDMM_3HD
.DW FDMM_5DD
.DW FDMM_5HD
.DW FDMM_8
;
FDMM_NONE .DB $ FF
FDMM_3DD .DB FDM720 , $ FF
FDMM_3HD .DB FDM144 , FDM720 , $ FF
FDMM_5DD .DB FDM360 , $ FF
FDMM_5HD .DB FDM120 , FDM360 , $ FF
FDMM_8 .DB FDM111 , $ FF
;
; FDC DRIVE TYPE ATTRIBUTES
;
; LOOKUP TABLE TO MAP THE DEVICE ATTRIBUTES BYTE RETURNED
; BY THE FD_DEVICE FUNCTION BASED ON THE DRIVE TYPE.
; THE ENTRIES MATCH THE ORDER OF THE
; FDT_ VALUES DEFINED IN STD.ASM
;
FD_DEVATTR:
.DB % 11100000 ; DRIVE TYPE NONE
.DB % 11010100 ; DRIVE TYPE 3.5 DD
.DB % 11011000 ; DRIVE TYPE 3.5 HD
.DB % 10110100 ; DRIVE TYPE 5.25 DD
.DB % 10111000 ; DRIVE TYPE 5.25 HD
.DB % 10010100 ; DRIVE TYPE 8
;
; FDC COMMANDS
;
CFD_READ .EQU 00000110B ; CMD,HDS/DS,C,H,R,N,EOT,GPL,DTL --> ST0,ST1,ST2,C,H,R,N
@ -498,21 +537,11 @@ FD_DEFMED:
FD_DEVICE:
LD D , DI ODEV_FD ; D := DEVICE TYPE
LD E ,( IY + FD_DEV ) ; E := PHYSICAL DEVICE NUMBER
# IF ( FDMEDIA = = FDM720 )
LD C , % 11010100 ; 3.5" DS/DD
# ENDIF
# IF ( FDMEDIA = = FDM144 )
LD C , % 11011000 ; 3.5" DS/HD
# ENDIF
# IF ( FDMEDIA = = FDM360 )
LD C , % 10110100 ; 5.25" DS/DD
# ENDIF
# IF ( FDMEDIA = = FDM120 )
LD C , % 10111000 ; 5.25" DS/HD
# ENDIF
# IF ( FDMEDIA = = FDM111 )
LD C , % 10010100 ; 8" DS/DD
# ENDIF
LD A ,( IY + FD_TYPE ) ; DRIVE TYPE
LD HL , FD_DEVATTR ; DEVICE ATTR TABLE
CALL ADDHLA ; POINT TO ENTRY
LD C ,( HL ) ; GET IT
LD H , FDMODE ; H := MODE
LD L , FDC_MSR ; L := BASE I/O ADDRESS
XOR A ; SIGNAL SUCCESS
@ -527,9 +556,7 @@ FD_MEDIA:
# IF ( FDMAUTO )
; SETUP TO READ TRK 0, HD 0, SEC 0
;LD A,C ; C STILL HAS REQUESTED DRIVE
LD A ,( IY + FD_DEV ) ; GET DRIVE UNIT
;AND 0FH
LD ( FCD_DS ), A
LD A , 0
LD ( FCD_C ), A
@ -538,53 +565,77 @@ FD_MEDIA:
LD ( FCD_R ), A
LD A , DOP_READID
LD ( FCD_DOP ), A
# ENDIF
LD A ,( IY + FD_TYPE ) ; GET DRIVE TYPE VALUE
;CALL PRTHEXBYTE ; *DEBUG*
LD HL , FD_MEDIAMAP ; POINT TO MEDIA MAP TABLE
ADD A , A ; TABLE IS WORD SIZED
CALL ADDHLA ; LOOKUP ENTRY
LD A ,( HL ) ; DEREFERENCE
INC HL
LD H ,( HL )
LD L , A
# IF ( FDTRACE < 3 )
# IF ( FDMAUTO )
# IF ( FDTRACE < 3 )
; SUPPRESS TRACING FOR MEDIA TESTS
LD A , 0
LD ( FCD_TRACE ), A
# ENDIF
LD B , 5
# ENDIF
LD B , 5 ; 5 ATTEMPTS
FD_MEDIARETRY:
; TRY PRIMARY MEDIA CHOICE FIRST
LD A , FDMEDIA
CALL FD_TESTMEDIA
JR Z , FD_MEDIA3 ; IF SUCCESS, WE ARE DONE
; TRY ALTERNATE MEDIA CHOICE
LD A , FDMEDIAALT
CALL FD_TESTMEDIA
JR Z , FD_MEDIA3 ; IF SUCCESS, WE ARE DONE
DJNZ FD_MEDIARETRY
PUSH HL ; SAVE MEDIA MAP PTR
CALL FD_MEDIALOOP ; TRY IT
POP HL ; RECOVER MEDIA MAP PTR
JR Z , FD_MEDIA3 ; CONTINUE ON SUCCESS
DJNZ FD_MEDIARETRY ; LOOP TILL DONE
FD_MEDIARETRY1:
; NO JOY, RETURN WITH E=0 (NO MEDIA)
;LD HL,(FDDS_MEDIAADR)
;LD (HL),0 ; SET TO NO MEDIA
LD ( IY + FD_MEDTYP ), 0 ; SET DRIVE = NO MEDIA
LD E , 0
LD ( IY + FD_MEDTYP ), $ FF ; SET MEDIA TYPE TO UNDEFINED
LD E , 0 ; NO MEDIA FLAG
LD A , ERR_NOMEDIA ; SIGNAL ERROR
OR A ; SET FLAGS
RET
FD_MEDIALOOP:
LD A ,( HL ) ; LOAD NEXT MEDIA TYPE TO TRY
CP $ FF ; END OF MEDIA TYPES TO TRY?
JR Z , FD_MEDIALOOP1 ; NO MORE TO TRY, LOOP EXIT
CALL FD_TESTMEDIA ; TRY IT
RET Z ; RETURN ON SUCCESS
INC HL ; NEXT MEDIA TYPE TO TRY
JR FD_MEDIALOOP ; LOOP
FD_MEDIALOOP1:
OR $ FF ; SIGNAL FAILURE
RET ; RETURN
FD_TESTMEDIA:
;LD HL,(FDDS_MEDIAADR)
;LD (HL),A
;CALL PRTHEXBYTE ; *DEBUG*
LD ( IY + FD_MEDTYP ), A
PUSH HL
PUSH BC
CALL FD_START
POP BC
POP HL
;CALL PRTHEXBYTE ; *DEBUG*
RET
FD_MEDIA3:
# IF ( FDTRACE < 3 )
# IF ( FDTRACE < 3 )
; RESTORE TRACING FOR MEDIA TESTS
LD A , FDTRACE
LD ( FCD_TRACE ), A
# ENDIF
# ENDIF
# ELSE
LD A ,( HL )
LD ( IY + FD_MEDTYP ), A
# ENDIF
FD_MEDIA4:
@ -778,7 +829,7 @@ FD_DETECT1:
;
FD_INITUNIT:
LD ( IY + FD_STAT ), 0 ; CLEAR STATUS
LD ( IY + FD_MEDTYP ), FDMEDIA ; SET DEFAULT MEDIA TYPE
LD ( IY + FD_MEDTYP ), $ FF ; SET UNKNOWN MEDIA TYPE
LD ( IY + FD_CURTRK ), $ FE ; SPECIAL VALUE FOR CURTRK
RET
;
@ -1285,7 +1336,8 @@ FC_SETUPIO:
LD ( DE ), A
INC DE
LD A ,( FCD_EOT )
;LD A,(FCD_EOT)
LD A ,( FCD_R ) ; READ ONLY ONE SECTOR
LD ( DE ), A
INC DE
@ -1397,15 +1449,17 @@ FC_RESETFDC:
; PULSE TERMCT TO TERMINATE ANY ACTIVE EXECUTION PHASE
;
FC_PULSETC:
# IF (( FDMODE = = FDMODE_DIDE ) | ( FDMODE = = FDMODE_N8 ) | ( FDMODE = = FDMODE_ZETA2 ) | ( FDMODE = = FDMODE_RCWDC ) | ( FDMODE = = FDMODE_DYNO ) | ( FDMODE = = FDMODE_EPFDC ) | ( FDMODE = = FDMODE_MBC ))
IN A ,( FDC_TC )
# ELSE
LD A ,( FS T_DOR )
SET 0 , A
OUT ( FDC_DOR ), A
RES 0 , A
OUT ( FDC_DOR ), A
# ENDIF
; PULSING TC NO LONGER REQUIRED BECAUSE WE ONLY READ A SINGLE SECTOR
;
;#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_RCWDC) | (FDMODE == FDMODE_DYNO) | (FDMODE == FDMODE_EPFDC) | (FDMODE == FDMODE_MBC))
; IN A,(FDC_TC)
;#ELSE
; LD A,(FST_DOR)
; SET 0,A
; OUT (FDC_DOR),A
; RES 0,A
; OUT (FDC_DOR),A
;#ENDIF
RET
;
; SET FST_DOR FOR MOTOR CONTROL ON
@ -1694,7 +1748,7 @@ FXR_TO: ; TIMEOUT
;
FXR_ABORT: ; EXECUTION ABORTED
HB_EI ; INTERRUPTS OK AGAIN
JR FOP_RES ; GET RS EULTS, NO NEED TO PULSE TC
JR FOP_RES ; GET RES ULTS, NO NEED TO PULSE TC
;
FXR_END: ; EXECUTION COMPLETED NORMALLY
CALL FC_PULSETC ; PULSE TC TO END EXECUTION
@ -1828,7 +1882,9 @@ FOP_EVALST1:
LD C , FRC_ENDCYL
BIT 7 , A
JR NZ , FOP_SETFST
; THI IS NORMAL BECAUSE WE NOW READ ONLY A SINGLE SECTOR
;JR NZ,FOP_SETFST
JR NZ , FOP_EXIT
LD C , FRC_DATAERR
BIT 5 , A