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. 9
      Doc/FDU.txt
  2. 237
      Source/Apps/FDU/FDU.asm
  3. 9
      Source/Apps/FDU/FDU.txt
  4. 40
      Source/HBIOS/hbios.asm

9
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 Disk IO / Zeta / Dual-IDE / N8
================================================================ ================================================================
Updated September 2, 2017
Updated December 16, 2017
by Wayne Warthen (wwarthen@gmail.com) by Wayne Warthen (wwarthen@gmail.com)
Application to test the hardware functionality of the Floppy Application to test the hardware functionality of the Floppy
@ -470,4 +470,7 @@ WW 9/2/2017: v5.0
Renamed from FD to FDU. Renamed from FD to FDU.
Added runtime selection of FDC hardware. Added runtime selection of FDC hardware.
Added runtime timing adjustment.
Added runtime timing adjustment.
WW 12/16/2017: v5.1
Improved polling version of read/write to fix occasional overrun errors.

237
Source/Apps/FDU/FDU.asm

@ -37,12 +37,13 @@
; 2017-09-02: V5.0 RENAMED APP TO FDU (FLOPPY DISK UTILITY) ; 2017-09-02: V5.0 RENAMED APP TO FDU (FLOPPY DISK UTILITY)
; DYNAMIC FDC SELECTION AT STARTUP ; DYNAMIC FDC SELECTION AT STARTUP
; DYNAMIC CPU SPEED ADJUSTMENT ; DYNAMIC CPU SPEED ADJUSTMENT
; 2017-12-16: V5.1 IMPROVED POLLING READ/WRITE PERFORMANCE
; ;
;_______________________________________________________________________________ ;_______________________________________________________________________________
; ;
; BUILDING: ; BUILDING:
; CAN BE BUILT WITH TASM LIKE THIS: ; 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: ; TODO:
; 1) CURRENT TRACK IS UPDATED EVEN IF SEEK FAILS! (DEFER, RECOVERS AUTOMATICALLY) ; 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_DIO .EQU 0
FDC_DIO3 .EQU 1 FDC_DIO3 .EQU 1
FDC_ZETA .EQU 2 FDC_ZETA .EQU 2
@ -198,7 +197,7 @@ INIT5:
XOR A XOR A
RET 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_BANNER2 .DB "Copyright (C) 2017, Wayne Warthen, GNU GPL v3","$"
STR_HBIOS .DB " [HBIOS]$" STR_HBIOS .DB " [HBIOS]$"
STR_UBIOS .DB " [UBIOS]$" STR_UBIOS .DB " [UBIOS]$"
@ -2067,8 +2066,9 @@ FCP_XFRCNT .DW 00H ; BYTES TRANSFERRED DURING COMMAND PHASE
; FDC EXECUTION PHASE ; FDC EXECUTION PHASE
; ;
FXP_XR .DW 00H ; INPUT: ADDRESS OF EXECUTION ROUTINE TO INVOKE 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_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_A .DB 00H ; LAST VALUE OF REG A RECORDED DURING EXECUTION
FXP_BC .DW 00H ; LAST VALUE OF REG BC 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 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 LD HL,(FXP_XR) ; LOAD THE EXECUTION ROUTINE ADDRESS
CALL JPHL ; CALL INDIRECTLY VIA HL 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 ; JP FOP_RES ; CONTINUE WITH GETRESULTS
; ;
; RESULTS PHASE ; RESULTS PHASE
; ;
FOP_RES: FOP_RES:
LD B,0 ; D = BYTES RECEIVED
LD B,0 ; B = BYTES RECEIVED
LD HL,FRB_LEN ; POINT TO BUFFER LENGTH 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 LD HL,FRB ; POINT TO RECEIVE BUFFER
FOP_RES0: FOP_RES0:
@ -2903,11 +2904,13 @@ FOP_RES1:
CALL DELAY ; FDC MAY TAKE UP TO 12us TO UPDATE MSR CALL DELAY ; FDC MAY TAKE UP TO 12us TO UPDATE MSR
IN A,(C) ; READ MAIN STATUS REGISTER IN A,(C) ; READ MAIN STATUS REGISTER
LD (FST_MSR),A ; SAVE IT FOR POTENTIAL LATER DIAGNOSIS 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) 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 DEC DE
LD A,D LD A,D
OR E OR E
@ -3156,45 +3159,45 @@ FXRX1:
JR NZ,FXRX1 ; NOT ZERO YET, KEEP CHECKING JR NZ,FXRX1 ; NOT ZERO YET, KEEP CHECKING
JP FXR_TO ; OTHERWISE, TIMEOUT ERROR JP FXR_TO ; OTHERWISE, TIMEOUT ERROR
RET RET
; ;
; READ DATA ; 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 ; INT READ DATA - SAFE VERSION
@ -3265,42 +3268,42 @@ WFXRR2:
; ;
; WRITE DATA ; 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 ; INT WRITE DATA - SAFE VERSION
@ -3369,34 +3372,41 @@ WFXRW2:
; ;
FXR_TO: FXR_TO:
; SET ERROR AND GET OUT W/O PULSING TC
LD A,FRC_TOEXEC LD A,FRC_TOEXEC
JP FXR_ERR
LD (FST_RC),A
JR FXR_END2
FXR_ABORT: 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: 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) LD A,(FCP_CMD)
CP CMD_FMTTRK CP CMD_FMTTRK
JR Z,FXR_END2 JR Z,FXR_END2
; DO NOT PULSE TC AT END OF READID
CP CMD_READID CP CMD_READID
JR Z,FXR_END2 JR Z,FXR_END2
CALL FC_PULSETC CALL FC_PULSETC
FXR_END2: FXR_END2:
#IF 0
LD (FXP_A),A LD (FXP_A),A
LD (FXP_BC),BC LD (FXP_BC),BC
LD (FXP_DE),DE LD (FXP_DE),DE
LD (FXP_HL),HL 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 EI ; I/O FINISHED, INTS BACK ON
RET RET
@ -3562,6 +3572,12 @@ FXR_DUMP:
CALL WRITESTR CALL WRITESTR
LD A,(FST_MSR) LD A,(FST_MSR)
CALL PRTHEXBYTE CALL PRTHEXBYTE
LD DE,STR_A
CALL WRITESTR
LD A,(FXP_A)
CALL PRTHEXBYTE
LD DE,STR_BC LD DE,STR_BC
CALL WRITESTR CALL WRITESTR
LD BC,(FXP_BC) LD BC,(FXP_BC)
@ -3569,6 +3585,7 @@ FXR_DUMP:
CALL PRTHEXBYTE CALL PRTHEXBYTE
LD A,C LD A,C
CALL PRTHEXBYTE CALL PRTHEXBYTE
LD DE,STR_DE LD DE,STR_DE
CALL WRITESTR CALL WRITESTR
LD BC,(FXP_DE) LD BC,(FXP_DE)
@ -3576,6 +3593,7 @@ FXR_DUMP:
CALL PRTHEXBYTE CALL PRTHEXBYTE
LD A,C LD A,C
CALL PRTHEXBYTE CALL PRTHEXBYTE
LD DE,STR_HL LD DE,STR_HL
CALL WRITESTR CALL WRITESTR
LD BC,(FXP_HL) LD BC,(FXP_HL)
@ -3583,6 +3601,17 @@ FXR_DUMP:
CALL PRTHEXBYTE CALL PRTHEXBYTE
LD A,C LD A,C
CALL PRTHEXBYTE 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 RET
; ;
; DOR BITS (3AH) ; DOR BITS (3AH)
@ -3823,17 +3852,16 @@ COPYSTR:
; PRINT CONTENTS OF A ; PRINT CONTENTS OF A
;________________________________________________________________________________________________________________________________ ;________________________________________________________________________________________________________________________________
; ;
COUT_BUFFER .TEXT " $"
;
COUT: COUT:
PUSH BC ; PUSH BC ;
PUSH AF ; PUSH AF ;
PUSH HL ; PUSH HL ;
PUSH DE ; 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 DE ;
POP HL ; POP HL ;
POP AF ; POP AF ;
@ -4403,9 +4431,12 @@ STR_SN .TEXT " SN=$"
STR_NCN .TEXT " NCN=$" STR_NCN .TEXT " NCN=$"
STR_PCN .TEXT " PCN=$" STR_PCN .TEXT " PCN=$"
STR_MSR .TEXT " MSR=$" STR_MSR .TEXT " MSR=$"
STR_A .TEXT " A=$"
STR_BC .TEXT " BC=$" STR_BC .TEXT " BC=$"
STR_DE .TEXT " DE=$" STR_DE .TEXT " DE=$"
STR_HL .TEXT " HL=$" STR_HL .TEXT " HL=$"
STR_TO .TEXT " TO=$"
STR_ITER .TEXT " ITER=$"
STR_DSKCHG .TEXT " DC=$" STR_DSKCHG .TEXT " DC=$"
; ;
KEYBUFLEN .EQU 80 KEYBUFLEN .EQU 80

9
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 Disk IO / Zeta / Dual-IDE / N8
================================================================ ================================================================
Updated September 2, 2017
Updated December 16, 2017
by Wayne Warthen (wwarthen@gmail.com) by Wayne Warthen (wwarthen@gmail.com)
Application to test the hardware functionality of the Floppy Application to test the hardware functionality of the Floppy
@ -470,4 +470,7 @@ WW 9/2/2017: v5.0
Renamed from FD to FDU. Renamed from FD to FDU.
Added runtime selection of FDC hardware. Added runtime selection of FDC hardware.
Added runtime timing adjustment.
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 XOR A
OUT0 (Z180_CCR),A OUT0 (Z180_CCR),A
OUT0 (Z180_CMR),A OUT0 (Z180_CMR),A
CALL DLY8 ; SETTLE
; SET DEFAULT WAIT STATES ; SET DEFAULT WAIT STATES
LD A,$F0 LD A,$F0
OUT0 (Z180_DCNTL),A OUT0 (Z180_DCNTL),A
CALL DLY8 ; SETTLE
; MMU SETUP ; MMU SETUP
LD A,$80 LD A,$80
@ -622,12 +624,14 @@ HB_START:
; SET CLOCK DIVIDE TO 1 RESULTING IN FULL XTAL SPEED ; SET CLOCK DIVIDE TO 1 RESULTING IN FULL XTAL SPEED
LD A,$80 LD A,$80
OUT0 (Z180_CCR),A OUT0 (Z180_CCR),A
CALL DLY8 ; SETTLE
#ENDIF #ENDIF
#IF (Z180_CLKDIV >= 2) #IF (Z180_CLKDIV >= 2)
; SET CPU MULTIPLIER TO 1 RESULTING IN XTAL * 2 SPEED ; SET CPU MULTIPLIER TO 1 RESULTING IN XTAL * 2 SPEED
LD A,$80 LD A,$80
OUT0 (Z180_CMR),A OUT0 (Z180_CMR),A
CALL DLY8 ; SETTLE
#ENDIF #ENDIF
#ENDIF #ENDIF
@ -651,10 +655,29 @@ HB_START:
; ;
; INSTALL PROXY IN UPPER MEMORY ; 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 HL,HBX_IMG
LD DE,HBX_LOC LD DE,HBX_LOC
LD BC,HBX_SIZ LD BC,HBX_SIZ
LDIR LDIR
; LD HL,(HBX_IMG)
; LD (X3),HL
; LD HL,(HBX_LOC)
; LD (X4),HL
; ;
; IF ALREADY EXECUTING IN RAM, BYPASS RAM BANK INSTALLATION ; 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 CALL NEWLINE2
PRTX(STR_BANNER) 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 ; IO PORT SCAN
; ;

Loading…
Cancel
Save