Browse Source

FDU App Updates

- Improve read/write sector performance in FDU to avoid spurious overrun
errors.
- Fix boot loader under UNA
pull/5/head
Wayne Warthen 8 years ago
parent
commit
05376b6173
  1. 7
      Doc/FDU.txt
  2. 231
      Source/Apps/FDU/FDU.asm
  3. 7
      Source/Apps/FDU/FDU.txt
  4. 40
      Source/HBIOS/hbios.asm

7
Doc/FDU.txt

@ -1,9 +1,9 @@
================================================================
Floppy Disk Utility (FDU) v5.0 for RetroBrew Computers
Floppy Disk Utility (FDU) v5.1 for RetroBrew Computers
Disk IO / Zeta / Dual-IDE / N8
================================================================
Updated September 2, 2017
Updated December 16, 2017
by Wayne Warthen (wwarthen@gmail.com)
Application to test the hardware functionality of the Floppy
@ -471,3 +471,6 @@ WW 9/2/2017: v5.0
Renamed from FD to FDU.
Added runtime selection of FDC hardware.
Added runtime timing adjustment.
WW 12/16/2017: v5.1
Improved polling version of read/write to fix occasional overrun errors.

231
Source/Apps/FDU/FDU.asm

@ -37,12 +37,13 @@
; 2017-09-02: V5.0 RENAMED APP TO FDU (FLOPPY DISK UTILITY)
; DYNAMIC FDC SELECTION AT STARTUP
; DYNAMIC CPU SPEED ADJUSTMENT
; 2017-12-16: V5.1 IMPROVED POLLING READ/WRITE PERFORMANCE
;
;_______________________________________________________________________________
;
; BUILDING:
; CAN BE BUILT WITH TASM LIKE THIS:
; TASM -t80 -b -fFF FD.ASM FD.COM FD.LST
; TASM -t80 -b -fFF FDU.ASM FDU.COM FDU.LST
;
; TODO:
; 1) CURRENT TRACK IS UPDATED EVEN IF SEEK FAILS! (DEFER, RECOVERS AUTOMATICALLY)
@ -56,8 +57,6 @@
;_______________________________________________________________________________
;
;
CPUFREQ .EQU 20 ; IN MHZ, USED TO COMPUTE DELAY FACTORS
;
FDC_DIO .EQU 0
FDC_DIO3 .EQU 1
FDC_ZETA .EQU 2
@ -198,7 +197,7 @@ INIT5:
XOR A
RET
STR_BANNER .DB "Floppy Disk Utility (FDU) v5.0, 02-Sep-2017$"
STR_BANNER .DB "Floppy Disk Utility (FDU) v5.1, 16-Dec-2017$"
STR_BANNER2 .DB "Copyright (C) 2017, Wayne Warthen, GNU GPL v3","$"
STR_HBIOS .DB " [HBIOS]$"
STR_UBIOS .DB " [UBIOS]$"
@ -2067,8 +2066,9 @@ FCP_XFRCNT .DW 00H ; BYTES TRANSFERRED DURING COMMAND PHASE
; FDC EXECUTION PHASE
;
FXP_XR .DW 00H ; INPUT: ADDRESS OF EXECUTION ROUTINE TO INVOKE
FXP_TO .DW 00H ; TIMEOUT COUNTDOWN TIMER USED IN SOME VARIATIONS
FXP_TO .DB 00H ; TIMEOUT COUNTDOWN TIMER USED IN SOME VARIATIONS
FXP_XFRCNT .DW 00H ; BYTES TRANSFERRED DURING EXECUTION
FXP_ITER .DB 00H ; LOOP ITERATION WORKING COUNTER
FXP_A .DB 00H ; LAST VALUE OF REG A RECORDED DURING EXECUTION
FXP_BC .DW 00H ; LAST VALUE OF REG BC RECORDED DURING EXECUTION
FXP_DE .DW 00H ; LAST VALUE OF REG DE RECORDED DURING EXECUTION
@ -2881,8 +2881,9 @@ FOP_X1:
LD HL,(FXP_XR) ; LOAD THE EXECUTION ROUTINE ADDRESS
CALL JPHL ; CALL INDIRECTLY VIA HL
; FIX: NEED TO CHECK REG A FOR STATUS, DEPENDING ON STATUS
; IT MAY BE NECESSARY TO DO SOMETHING SPECIAL?
LD A,(FST_RC) ; CURRENT RESULT CODE
CP FRC_OK ; ERROR?
RET NZ ; IF SO, ALL DONE
; JP FOP_RES ; CONTINUE WITH GETRESULTS
@ -2890,9 +2891,9 @@ FOP_X1:
; RESULTS PHASE
;
FOP_RES:
LD B,0 ; D = BYTES RECEIVED
LD B,0 ; B = BYTES RECEIVED
LD HL,FRB_LEN ; POINT TO BUFFER LENGTH
LD (HL),D ; UPDATE NUMBER OF BYTES RECEIVED
LD (HL),B ; UPDATE NUMBER OF BYTES RECEIVED
LD HL,FRB ; POINT TO RECEIVE BUFFER
FOP_RES0:
@ -2903,11 +2904,13 @@ FOP_RES1:
CALL DELAY ; FDC MAY TAKE UP TO 12us TO UPDATE MSR
IN A,(C) ; READ MAIN STATUS REGISTER
LD (FST_MSR),A ; SAVE IT FOR POTENTIAL LATER DIAGNOSIS
AND 0F0H ; ISOLATE RQM/DIO
AND 0F0H ; REMOVE SEEK BITS
CP 0D0H ; LOOKING FOR RQM=1, DIO=1, BUSY=1 (FDC BYTE PENDING)
JP Z,FOP_RES2 ; GOOD, GO TO RECEIVE BYTE
CP 080H ; CHECK FOR RQM=1, DIO=0 (NOTHING LEFT)
JP Z,FOP_EVAL ; IF NOTHING, ALL DONE, LEFT GO TO EOD/EXIT
JR Z,FOP_RES2 ; GOOD, GO TO RECEIVE BYTE
CP $80 ; DONE?
JR Z,FOP_EVAL ; IF SO, GO TO EVAL
;CALL PC_SPACE
;CALL PRTHEXBYTE
DEC DE
LD A,D
OR E
@ -3156,45 +3159,45 @@ FXRX1:
JR NZ,FXRX1 ; NOT ZERO YET, KEEP CHECKING
JP FXR_TO ; OTHERWISE, TIMEOUT ERROR
RET
;
; READ DATA
;
FXRR:
DI ; DISABLE INTERRUPTS TO AVOID TIMEOUTS
LD A,(CPUFREQ + 3) / 4 ; HIGH BYTE OF OUTER LOOP COUNTER
LD (FXP_TO+1),A ; SAVE HIGH BYTE OF COUNTER
XOR A ; LOW BYTE IS ZERO
LD (FXP_TO),A ; SAVE LOW BYTE
LD B,A ; INIT INNER LOOP COUNTER
LD C,(IY+CFG_MSR) ; SET C TO MSR PORT
FXRR1: LD B,0 ; SETUP FOR 256 ITERATIONS (INNER LOOP)
; INNER LOOP
FXRR2: IN A,(C) ; GET MSR
CP 0F0H ; WE WANT RQM=1,DIO=1,EXM=1,BUSY=1 (READY TO RECEIVE A BYTE W/ EXEC ACTIVE)
JP Z,FXRR3 ; GOT IT, DO BYTE READ
DJNZ FXRR2 ; NOT READY, LOOP IF COUNTER NOT ZERO
; OUTER LOOP
AND 0E0H ; MASK TO ISOLATE RQM, DIO, EXM
CP 0C0H ; IF RQM=1, DIO=1, EXM=0 (EXECUTION ABORTED)
JP Z,FXR_ABORT ; IF ZERO, BAIL OUT TO ERR ROUTINE, FIX: GO TO SPECIFIC ROUTINE FOR THIS???
PUSH HL ; SAVE HL
LD HL,(FXP_TO) ; GET DOWN COUNTER
DEC HL ; DECREMENT
LD (FXP_TO),HL ; SAVE IT
LD A,L ; CHECK COUNTER
OR H ; ... FOR ZERO
POP HL ; RESTORE HL
JR NZ,FXRR1 ; LOOP IF NOT ZERO
JP FXR_TO ; OTHERWISE, TIMEOUT
FXRR3: ; READ A PENDING BYTE
INC C ; SET C TO DATA PORT
INI ; READ PORT C TO (HL) AND INC HL
DEC C ; SET C BACK TO STATUS PORT
DEC DE ; DECREMENT BYTE COUNT
LD A,D ; TEST COUNTER
OR E ; ... FOR ZERO
JP NZ,FXRR1 ; IF NOT ZERO, REPEAT LOOP
JP FXR_END ; CLEAN EXIT
FXRR: LD A,E ; LOW BYTE OF COUNT TO ACCUM
OR A ; TEST FOR ZERO
JR Z,FXRR1 ; IF ZERO, DO NOT ADJUST ITERATIONS
INC D ; OTHERWISE, ITERATIONS IS ONE MORE THAN HIGH BYTE
FXRR1: LD B,E ; LOW BYTE OF COUNT TO B
LD A,D ; HIGH BYTE OF COUNT
LD (FXP_ITER),A ; ... IS ITERATION COUNT
LD IX,FXP_ITER ; SETUP IX AS POINTER TO ITERATION COUNT
LD A,(CPUSPD) ; CPU SPEED SCALER
LD (FXP_TO),A ; SAVE IT AS OUTER LOOP TIMEOUT
LD C,(IY+CFG_DATA) ; SET C TO DATA PORT
DI ; DISABLE INTERRUPTS TO AVOID OVERRUN
FXRR2: DEC C ; [04] SET C TO MSR PORT
FXRR3: LD DE,0 ; [10] TIMEOUT COUNTER
FXRR4: IN A,(C) ; [12] GET MSR
CP $F0 ; [07] BYTE READY?
JR Z,FXRR5 ; [12/7] GET IT
;LD (FST_MSR),A ; [13] *DEBUG* SAVE MSR FOR LATER
DEC E ; [04] DEC LSB OF INNER TIMEOUT COUNTER
JR NZ,FXRR4 ; [12/7] LOOP IF LSB IS NOT EXHAUSTED
CP $D0 ; [07] IF RQM=1, DIO=1, EXM=0, CB=1, EXECUTION ABORTED
JP Z,FXR_ABORT ; [10] IF NOT SET, EXECUTION ABORTED
DEC D ; [04] DEC MSB OF INNER TIMEOUT COUNTER
JR NZ,FXRR4 ; [12/7] LOOP IF MSB IS NOT EXHAUSTED
LD A,(FXP_TO) ; [13] GET OUTER LOOP COUNTER
DEC A ; [04] DECREMENT
LD (FXP_TO),A ; [13] SAVE NEW COUNTER VALUE
JR NZ,FXRR3 ; [12/7] LOOP IF NOT EXHAUSTED
JP FXR_TO ; [10] OTHERWISE, HANDLE TIMEOUT
FXRR5: INC C ; [04] POINT TO DATA PORT
INI ; [16] (HL) := (C), HL++, B--
JR NZ,FXRR2 ; [12/7] LOOP
DEC (IX) ; [23] DECREMENT ITERATION COUNT
JR NZ,FXRR2 ; [12] IF MORE ITERATIONS, GO DO IT
JP FXR_END ; [10] ELSE DONE
;
; INT READ DATA - SAFE VERSION
@ -3265,42 +3268,42 @@ WFXRR2:
;
; WRITE DATA
;
FXRW:
DI ; DISABLE INTERRUPTS TO AVOID TIMEOUTS
LD A,(CPUFREQ + 3) / 4 ; HIGH BYTE OF OUTER LOOP COUNTER
LD (FXP_TO+1),A ; SAVE HIGH BYTE OF COUNTER
XOR A ; LOW BYTE IS ZERO
LD (FXP_TO),A ; SAVE LOW BYTE
LD B,A ; INIT INNER LOOP COUNTER
LD C,(IY+CFG_MSR) ; SET C TO MSR PORT
FXRW1: LD B,0 ; SETUP FOR 256 ITERATIONS
; INNER LOOP
FXRW2: IN A,(C) ; GET MSR
CP 0B0H ; WE WANT RQM=1,DIO=0,EXM=1,BUSY=1 (READY TO SEND A BYTE W/ EXEC ACTIVE)
JR Z,FXRW3 ; GOT IT, DO BYTE WRITE
DJNZ FXRW2 ; NOT READY, LOOP IF COUNTER NOT ZERO
; OUTER LOOP
AND 0E0H ; MASK TO ISOLATE RQM, DIO, EXM
CP 0C0H ; IF RQM=1, DIO=1, EXM=0 (EXECUTION ABORTED)
JP Z,FXR_ABORT ; IF ZERO, BAIL OUT TO ERR ROUTINE, FIX: GO TO SPECIFIC ROUTINE FOR THIS???
PUSH HL ; SAVE HL
LD HL,(FXP_TO) ; GET DOWN COUNTER
DEC HL ; DECREMENT
LD (FXP_TO),HL ; SAVE IT
LD A,L ; CHECK COUNTER
OR H ; ... FOR ZERO
POP HL ; RESTORE HL
JR NZ,FXRW1 ; LOOP IF NOT ZERO
JP FXR_TO ; OTHERWISE, TIMEOUT
FXRW3: ; READ A PENDING BYTE
INC C ; SET C TO DATA PORT
OUTI ; WRITE (HL) TO PORT C AND INC HL
DEC C ; SET C BACK TO STATUS PORT
DEC DE ; DECREMENT LOOP COUNTER
LD A,D ; TEST COUNTER
OR E ; ... FOR ZERO
JP NZ,FXRW1 ; IF NOT ZERO, REPEAT LOOP
JP FXR_END ; CLEAN EXIT
FXRW: LD A,E ; LOW BYTE OF COUNT TO ACCUM
OR A ; TEST FOR ZERO
JR Z,FXRW1 ; IF ZERO, DO NOT ADJUST ITERATIONS
INC D ; OTHERWISE, ITERATIONS IS ONE MORE THAN HIGH BYTE
FXRW1: LD B,E ; LOW BYTE OF COUNT TO B
LD A,D ; HIGH BYTE OF COUNT
LD (FXP_ITER),A ; ... IS ITERATION COUNT
LD IX,FXP_ITER ; SETUP IX AS POINTER TO ITERATION COUNT
LD A,(CPUSPD) ; CPU SPEED SCALER
LD (FXP_TO),A ; SAVE IT AS OUTER LOOP TIMEOUT
LD C,(IY+CFG_DATA) ; SET C TO DATA PORT
DI ; DISABLE INTERRUPTS TO AVOID OVERRUN
FXRW2: DEC C ; [04] SET C TO MSR PORT
FXRW3: LD DE,0 ; [10] TIMEOUT COUNTER
FXRW4: IN A,(C) ; [12] GET MSR
CP $B0 ; [07] BYTE READY?
JR Z,FXRW5 ; [12/7] GET IT
;LD (FST_MSR),A ; [13] *DEBUG* SAVE MSR FOR LATER
DEC E ; [04] DEC LSB OF INNER TIMEOUT COUNTER
JR NZ,FXRW4 ; [12/7] LOOP IF LSB IS NOT EXHAUSTED
CP $D0 ; [07] IF RQM=1, DIO=1, EXM=0, CB=1, EXECUTION ABORTED
JP Z,FXR_ABORT ; [10] IF NOT SET, EXECUTION ABORTED
DEC D ; [04] DEC MSB OF INNER TIMEOUT COUNTER
JR NZ,FXRW4 ; [12/7] LOOP IF MSB IS NOT EXHAUSTED
LD A,(FXP_TO) ; [13] GET OUTER LOOP COUNTER
DEC A ; [04] DECREMENT
LD (FXP_TO),A ; [13] SAVE NEW COUNTER VALUE
JR NZ,FXRW3 ; [12/7] LOOP IF NOT EXHAUSTED
JP FXR_TO ; [10] OTHERWISE, HANDLE TIMEOUT
FXRW5: INC C ; [04] POINT TO DATA PORT
OUTI ; [16] (C) := (HL), HL++, B--
JR NZ,FXRW2 ; [12/7] LOOP
DEC (IX) ; [23] DECREMENT ITERATION COUNT
JR NZ,FXRW2 ; [12] IF MORE ITERATIONS, GO DO IT
JP FXR_END ; [10] ELSE DONE
;
; INT WRITE DATA - SAFE VERSION
@ -3369,34 +3372,41 @@ WFXRW2:
;
FXR_TO:
; SET ERROR AND GET OUT W/O PULSING TC
LD A,FRC_TOEXEC
JP FXR_ERR
LD (FST_RC),A
JR FXR_END2
FXR_ABORT:
LD A,FRC_ABORT
JP FXR_ERR
FXR_ERR:
LD (FST_RC),A
JP FXR_END2
; LET RESULTS PHASE HANDLE ERROR, DO NOT PULSE TC, COMMAND ALREADY TERMINATED
;LD A,FRC_ABORT
;LD (FST_RC),A
JR FXR_END2
FXR_END:
; DO NOT PULSE TC AT END OF FORMAT
; DO NOT PULSE TC AT END OF FORMAT OR READID, THOSE COMMANDS SELF-TERMINATE
LD A,(FCP_CMD)
CP CMD_FMTTRK
JR Z,FXR_END2
; DO NOT PULSE TC AT END OF READID
CP CMD_READID
JR Z,FXR_END2
CALL FC_PULSETC
FXR_END2:
#IF 0
LD (FXP_A),A
LD (FXP_BC),BC
LD (FXP_DE),DE
LD (FXP_HL),HL
LD C,(IY+CFG_MSR) ; SET C TO MSR PORT
IN A,(C)
LD (FST_MSR),A
CALL FXR_DUMP
#ENDIF
EI ; I/O FINISHED, INTS BACK ON
RET
@ -3562,6 +3572,12 @@ FXR_DUMP:
CALL WRITESTR
LD A,(FST_MSR)
CALL PRTHEXBYTE
LD DE,STR_A
CALL WRITESTR
LD A,(FXP_A)
CALL PRTHEXBYTE
LD DE,STR_BC
CALL WRITESTR
LD BC,(FXP_BC)
@ -3569,6 +3585,7 @@ FXR_DUMP:
CALL PRTHEXBYTE
LD A,C
CALL PRTHEXBYTE
LD DE,STR_DE
CALL WRITESTR
LD BC,(FXP_DE)
@ -3576,6 +3593,7 @@ FXR_DUMP:
CALL PRTHEXBYTE
LD A,C
CALL PRTHEXBYTE
LD DE,STR_HL
CALL WRITESTR
LD BC,(FXP_HL)
@ -3583,6 +3601,17 @@ FXR_DUMP:
CALL PRTHEXBYTE
LD A,C
CALL PRTHEXBYTE
LD DE,STR_ITER
CALL WRITESTR
LD A,(FXP_ITER)
CALL PRTHEXBYTE
LD DE,STR_TO
CALL WRITESTR
LD A,(FXP_TO)
CALL PRTHEXBYTE
RET
;
; DOR BITS (3AH)
@ -3823,17 +3852,16 @@ COPYSTR:
; PRINT CONTENTS OF A
;________________________________________________________________________________________________________________________________
;
COUT_BUFFER .TEXT " $"
;
COUT:
PUSH BC ;
PUSH AF ;
PUSH HL ;
PUSH DE ;
LD (COUT_BUFFER),A ;
LD DE,COUT_BUFFER ;
LD C,09H ; CP/M WRITE START STRING TO CONSOLE CALL
CALL 0005H
LD C,2 ; BDOS FUNC: CONSOLE WRITE CHAR
LD E,A ; CHARACTER TO E
CALL $0005 ; CALL BDOS
POP DE ;
POP HL ;
POP AF ;
@ -4403,9 +4431,12 @@ STR_SN .TEXT " SN=$"
STR_NCN .TEXT " NCN=$"
STR_PCN .TEXT " PCN=$"
STR_MSR .TEXT " MSR=$"
STR_A .TEXT " A=$"
STR_BC .TEXT " BC=$"
STR_DE .TEXT " DE=$"
STR_HL .TEXT " HL=$"
STR_TO .TEXT " TO=$"
STR_ITER .TEXT " ITER=$"
STR_DSKCHG .TEXT " DC=$"
;
KEYBUFLEN .EQU 80

7
Source/Apps/FDU/FDU.txt

@ -1,9 +1,9 @@
================================================================
Floppy Disk Utility (FDU) v5.0 for RetroBrew Computers
Floppy Disk Utility (FDU) v5.1 for RetroBrew Computers
Disk IO / Zeta / Dual-IDE / N8
================================================================
Updated September 2, 2017
Updated December 16, 2017
by Wayne Warthen (wwarthen@gmail.com)
Application to test the hardware functionality of the Floppy
@ -471,3 +471,6 @@ WW 9/2/2017: v5.0
Renamed from FD to FDU.
Added runtime selection of FDC hardware.
Added runtime timing adjustment.
WW 12/16/2017: v5.1
Improved polling version of read/write to fix occasional overrun errors.

40
Source/HBIOS/hbios.asm

@ -603,10 +603,12 @@ HB_START:
XOR A
OUT0 (Z180_CCR),A
OUT0 (Z180_CMR),A
CALL DLY8 ; SETTLE
; SET DEFAULT WAIT STATES
LD A,$F0
OUT0 (Z180_DCNTL),A
CALL DLY8 ; SETTLE
; MMU SETUP
LD A,$80
@ -622,12 +624,14 @@ HB_START:
; SET CLOCK DIVIDE TO 1 RESULTING IN FULL XTAL SPEED
LD A,$80
OUT0 (Z180_CCR),A
CALL DLY8 ; SETTLE
#ENDIF
#IF (Z180_CLKDIV >= 2)
; SET CPU MULTIPLIER TO 1 RESULTING IN XTAL * 2 SPEED
LD A,$80
OUT0 (Z180_CMR),A
CALL DLY8 ; SETTLE
#ENDIF
#ENDIF
@ -651,10 +655,29 @@ HB_START:
;
; INSTALL PROXY IN UPPER MEMORY
;
;X1 .EQU $8000
;X2 .EQU X1 + 2
;X3 .EQU X2 + 2
;X4 .EQU X3 + 2
; LD HL,(HBX_IMG)
; LD (X1),HL
; LD HL,(HBX_IMG)
; LD (X2),HL
LD HL,HBX_IMG
LD DE,HBX_LOC
LD BC,HBX_SIZ
LDIR
; LD HL,(HBX_IMG)
; LD (X3),HL
; LD HL,(HBX_LOC)
; LD (X4),HL
;
; IF ALREADY EXECUTING IN RAM, BYPASS RAM BANK INSTALLATION
;
@ -747,6 +770,23 @@ HB_START1: ; BNKCALL ARRIVES HERE, BUT NOW RUNNING IN RAM BANK
;
CALL NEWLINE2
PRTX(STR_BANNER)
; CALL PC_SPACE
; LD BC,(X1)
; CALL PRTHEXWORD
; CALL PC_SPACE
; LD BC,(X2)
; CALL PRTHEXWORD
; CALL PC_SPACE
; LD BC,(X3)
; CALL PRTHEXWORD
; CALL PC_SPACE
; LD BC,(X4)
; CALL PRTHEXWORD
;
; IO PORT SCAN
;

Loading…
Cancel
Save