diff --git a/Doc/FDU.txt b/Doc/FDU.txt index 6e13550c..3c7fcaa0 100644 --- a/Doc/FDU.txt +++ b/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 @@ -470,4 +470,7 @@ WW 9/2/2017: v5.0 Renamed from FD to FDU. Added runtime selection of FDC hardware. -Added runtime timing adjustment. \ No newline at end of file +Added runtime timing adjustment. + +WW 12/16/2017: v5.1 +Improved polling version of read/write to fix occasional overrun errors. diff --git a/Source/Apps/FDU/FDU.asm b/Source/Apps/FDU/FDU.asm index bf44ccfe..46ece7d0 100644 --- a/Source/Apps/FDU/FDU.asm +++ b/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,18 +2881,19 @@ 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 ; ; 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 diff --git a/Source/Apps/FDU/FDU.txt b/Source/Apps/FDU/FDU.txt index 6e13550c..3c7fcaa0 100644 --- a/Source/Apps/FDU/FDU.txt +++ b/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 @@ -470,4 +470,7 @@ WW 9/2/2017: v5.0 Renamed from FD to FDU. Added runtime selection of FDC hardware. -Added runtime timing adjustment. \ No newline at end of file +Added runtime timing adjustment. + +WW 12/16/2017: v5.1 +Improved polling version of read/write to fix occasional overrun errors. diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 59446b4d..d16379c4 100644 --- a/Source/HBIOS/hbios.asm +++ b/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 ;