mirror of https://github.com/wwarthen/RomWBW.git
committed by
GitHub
16 changed files with 135 additions and 469 deletions
@ -1,429 +0,0 @@ |
|||
================================================================ |
|||
FDTST v3.1 for N8VEM DISKIO / DISKIO V3 / ZETA / DIDE / N8 |
|||
================================================================ |
|||
|
|||
Updated JuLY 1, 2012 |
|||
by Wayne Warthen (wwarthen@gmail.com) |
|||
|
|||
Application to test the hardware functionality of the Floppy Disk |
|||
Controller (FDC) on the ECB DISK I/O, DISK I/O V3, ZETA SBC, |
|||
Dual IDE w/ Floppy, or N8 board. |
|||
|
|||
The intent is to provide a testbed that allows direct testing |
|||
of all possible media types and modes of access. The application |
|||
supports read, write, and format by sector, track, and disk as |
|||
well as a random read/write test. |
|||
|
|||
The application supports access modes of polling, interrupt, |
|||
INT/WAIT, and DRQ/WAIT. At present, it supports 3.5" media at DD (720KB) and |
|||
HD (1.44MB) capacities. It also now supports 5.25" media (720KB and 1.2MB) |
|||
and 8" media (1.11MB) as well. Additonal media will be added when I have |
|||
time and access to required hardware. Not all modes are supported |
|||
on all platforms and some modes are experimental in all cases. |
|||
|
|||
In many ways this application is merely reinventing the wheel and |
|||
performs functionality similer to existing applications, but I have |
|||
not seen any other applications for DISK I/O that provide this range |
|||
of functionality. |
|||
|
|||
While the application is now almost entirely new code, I would like to |
|||
acknowledge that much was derived from the previous work of Andrew Lynch |
|||
and Dan Werner. I also want to credit Sergio Gimenez with testing the 5.25" |
|||
drive support and Jim Harre with testing the 8" drive support. Thanks! |
|||
|
|||
General Usage |
|||
------------- |
|||
|
|||
In general, usage is self explanatory. The main menu allows you to set |
|||
the unit, media, and mode to test. These settings MUST match your |
|||
situation. Read, write, format, and verify functions are provided. A sub-menu |
|||
will allow you to choose sector, track, disk, or random tests. |
|||
|
|||
The verify function requires a little explanation. It will take the contents |
|||
of the buffer, save it, and compare it to the selected sectors. So, you |
|||
must ensure that the sectors to be verified already have been written |
|||
with the same pattern as the buffer contains. I typically init the buffer |
|||
to a pattern, write the pattern to the entire disk, then verify the entire |
|||
disk. |
|||
|
|||
Another submenu is provided for FDC commands. This sub-menu allows you to |
|||
send low-level commands directly to FDC. You MUST know what you are doing |
|||
to use this sub-menu. For example, in order to read a sector using this |
|||
sub-menu, you will need to perform specify, seek, sense int, and read |
|||
commands specifying correct values (nothing is value checked in this menu). |
|||
|
|||
Required Hardware/BIOS |
|||
---------------------- |
|||
|
|||
Of course, the starting point is one of the support hardware platforms. |
|||
You need to start with either an N8VEM SBC, backplane, and ECB DISK I/O |
|||
card or a Zeta SBC. Additionally, a floppy drive connected via an |
|||
appropriate cable: |
|||
|
|||
DISKIO - no twist in cable, drive unit 0/1 must be selected by jumper on drive |
|||
ZETA - cable with twist, unit 0 after twist, unit 1 before twist |
|||
DIDE/N8 - cable with twist, unit 0 before twist, unit 1 after twist |
|||
|
|||
|
|||
It is preferable that the BIOS you use does not have DISK I/O support |
|||
enabled since the application assumes it has complete control of the |
|||
DISK I/O hardware. |
|||
|
|||
The DISK I/O should be jumpered as follows: |
|||
|
|||
J1: depends on use of interrupt modes (see interrupt modes below) |
|||
J2: pins 1-2, & 3-4 jumpered |
|||
J3: hardware dependent timing for DMA mode (see DMA modes below) |
|||
J4: pins 2-3 jumpered |
|||
J5: off |
|||
J6: pins 2-3 jumpered |
|||
J7: pins 2-3 jumpered |
|||
J8: off |
|||
J9: off |
|||
J10: off |
|||
J11: off |
|||
J12: off |
|||
|
|||
Note that J1 can be left on even when not using interrupt modes. As |
|||
long as the BIOS is OK with it, that is fine. Note also that J3 is |
|||
only relevant for DMA modes, but also can be left in place when |
|||
using other modes. |
|||
|
|||
The DISK I/O V3 should be jumpered at the default settings: |
|||
|
|||
JP2: 3-4 |
|||
JP3: 1-2 for int mode support, otherwise no jumper |
|||
JP4: 1-2, 3-4 |
|||
JP5: 1-2 |
|||
JP6: 1-2 |
|||
JP7: 1-2, 3-4 |
|||
|
|||
Zeta does not have any relevant jumper settings. |
|||
|
|||
DIDE should be jumpered as follows: |
|||
|
|||
K3 (DT/R or /RD): /RD |
|||
P5 (bd ID): 1-2, 3-4 (for $20-$3F port range) |
|||
|
|||
There are no specific N8 jumper settings, but the default |
|||
I/O range starting at $80 is assumed in the published code. |
|||
|
|||
|
|||
Modes of Operation |
|||
------------------ |
|||
|
|||
You can select the following test modes. Please refer to the chart |
|||
that follows to determine which modes should work with combinations |
|||
of Z80 CPU speed and media format. |
|||
|
|||
Polling: Traditional polled input/output. Works well and very reliable |
|||
including timeouts and good error recovery. Also, the slowest performance |
|||
which precludes it from being used with 1.44MB floppy on a 4MHz Z80. |
|||
This is definitely the mode you want to get working before any others. |
|||
It does not require J1 (interrupt enable) on DISK I/O and does not care about |
|||
the setting of J3. |
|||
|
|||
Interrupt: Input/output is interrupt driven. Works pretty well, but |
|||
is not able to recover from some errors. For example, if there is |
|||
no disk in the drive, this mode will just hang until a disk is inserted. |
|||
This mode REQUIRES that interrupts be enabled on the DISK I/O via |
|||
jumper at J1. On Zeta it requires the INT/NMI jumper be set for |
|||
INT. Mode not supported on DIDE or N8. Some BIOS variants will not |
|||
handle interrupts during boot. |
|||
|
|||
Fast Interrupt: As above, but sacrifices additional reliability for |
|||
faster operation. This mode will allow a 1.44MB floppy to work |
|||
with a 4MHz Z80 CPU. However, if any errors occur (even a transient |
|||
read error which is not unusual), this mode will hang. As above |
|||
you MUST have the appropriate jumpers for DISKIO and Zeta. DIDE |
|||
does not support this mode. |
|||
|
|||
INT/WAIT: Same as Fast Interrupt, but uses CPU wait instead of |
|||
actual interrupt. Subject to all the same issues as Fast |
|||
Interrupt, but does not need J1 shorted. J3 is irrelevant. |
|||
This mode is available on only on DISKIO (and not DISKIO V3). |
|||
|
|||
DRQ/WAIT: Uses pseudo DMA to handle input/output. Does not require that |
|||
interrupts (J1) be enabled on the DISK I/O. However, it is subject to |
|||
all of the same reliability issues as "Fast Interrupt". This |
|||
mode is known to not work on N8VEM DISKIO!!! It is included |
|||
for testing only. It is dependent on setting of J3. This |
|||
mode is NOT available on Zeta, DIDE, N8, or DISKIO V3. |
|||
|
|||
The chart below attempts to describe the combinations that |
|||
work for me. By far, the most reliable mode is Polling, |
|||
but it requires 8MHz CPU for HD disks. |
|||
|
|||
DRQ/WAIT --------------------------------+ |
|||
INT/WAIT -----------------------------+ | |
|||
Fast Interrupt --------------------+ | | |
|||
Interrupt ----------------------+ | | | |
|||
Polling ---------------------+ | | | | |
|||
| | | | | |
|||
CPU Speed --------------+ | | | | | |
|||
| | | | | | |
|||
| | | | | | |
|||
|
|||
3.5" DD (720K) ------ 4MHz Y Y Y Y X |
|||
8MHz+ Y Y Y Y X |
|||
|
|||
3.5" HD (1.44M) ----- 4MHz N N Y Y X |
|||
8MHz+ Y Y Y Y X |
|||
|
|||
5.25" DD (360K) ----- 4MHz Y Y Y Y X |
|||
8MHz+ Y Y Y Y X |
|||
|
|||
5.25" HD (1.2M) ----- 4MHz N N Y Y X |
|||
8MHz+ Y Y Y Y X |
|||
|
|||
8" DD (1.11M) ------- 4MHz N N Y Y X |
|||
8MHz+ Y Y Y Y X |
|||
|
|||
Y = Yes, works |
|||
N = No, does not work |
|||
X = Experimental, probably won't work |
|||
|
|||
Tracing |
|||
------- |
|||
|
|||
Command/result activity to/from the FDC will be written out |
|||
if the trace setting is changed from '00' to '01' in setup. |
|||
Additionally, if a command failure is detected on any |
|||
command, that specific comand and results are written |
|||
regardless of the trace setting. |
|||
|
|||
The format of the line written is: |
|||
<OPERATION>: <COMMAND BYTES> --> <RESULT BYTES> [<RESULT>] |
|||
|
|||
For example, this is the output of a normal read operation: |
|||
READ: 46 01 00 00 01 02 09 1B FF --> 01 00 00 00 00 02 02 [OK] |
|||
|
|||
Please refer to the i8272 data sheet for information on the |
|||
command and result bytes. |
|||
|
|||
Note that the sense interrupt command can return a non-OK |
|||
result. This is completely normal in some cases. It is |
|||
necessary to "poll" the drive for seek status using |
|||
sense interrupt. If there is nothing to report, then |
|||
the result will be INVALID COMMAND. Additionally, |
|||
during a recalibrate operation, it may be necessary to |
|||
issue the command twice because the command will only step |
|||
the drive 77 times looking for track 0, but the head may be |
|||
up to 80 tracks away. In this case, the first recalibrate |
|||
fails, but the second should succeed. Here is what this |
|||
would look like if trace is turned on: |
|||
|
|||
RECALIBRATE: 07 01 --> <EMPTY> [OK] |
|||
SENSE INTERRUPT: 08 --> 80 [INVALID COMMAND] |
|||
... |
|||
... |
|||
... |
|||
SENSE INTERRUPT: 08 --> 80 [INVALID COMMAND] |
|||
SENSE INTERRUPT: 08 --> 71 00 [ABNORMAL TERMINATION] |
|||
RECALIBRATE: 07 01 --> <EMPTY> [OK] |
|||
SENSE INTERRUPT: 08 --> 21 00 [OK] |
|||
|
|||
Another example is when the FDC has just been reset. In |
|||
this case, you will see up to 4 disk change errors. Again |
|||
these are not a real problem and to be expected. |
|||
|
|||
When tracing is turned off, the application tries to be |
|||
intelligent about error reporting. The specific errors |
|||
from sense interrupt documented above will be suppressed |
|||
because they are not a real problem. All other |
|||
errors will be displayed. |
|||
|
|||
Error Handling |
|||
-------------- |
|||
|
|||
There is no automated error retry logic. This is very |
|||
intentional since the point is to expose the controller |
|||
and drive activity. Any error detected will result in |
|||
a prompt to abort, retry, or continue. Note that some |
|||
number of errors is considered normal for this |
|||
technology. An occasional error would not necessarily |
|||
be considered a problem. |
|||
|
|||
CPU Speed |
|||
--------- |
|||
|
|||
I distribute the binary version of the application optimized for |
|||
20MHz CPUs. There is a configuration variable called CPUFREQ |
|||
at the top of the source file. Ideally, you should build |
|||
with that set appropriately. However, I have found that the |
|||
default build setting of 20MHz seems to work for 4-20MHz CPUs. |
|||
|
|||
Interleave |
|||
---------- |
|||
|
|||
The format command now allows the specification of a sector |
|||
interleave. It is almost always the case that the optimal |
|||
interleave will be 2 (meaning 2:1). |
|||
|
|||
360K Media |
|||
---------- |
|||
|
|||
The 360K media definition should work well for true 360K |
|||
drives. However, it will generally not work |
|||
with 1.2M drives. This is because these drives spin at 360RPM |
|||
instead of the 300RPM speed of true 360K drives. Additionally, |
|||
1.2M drives are 80 tracks and 360K drives are 40 tracks and, so |
|||
far, there is no mechanism in FDTST to "double step" as a way |
|||
to use 40 track media in 80 track drives. |
|||
|
|||
With this said, it is possible to configure some 1.2M 5.25" drives |
|||
to automatically spin down to 300RPM based on a density select |
|||
signal (DENSEL). This signal is asserted by FDTST for 360K |
|||
media, so IF you have configured your drive to react to this |
|||
signal correctly, you will be able to use the 360K media defintion. |
|||
Most 1.2M 5.25" drives are NOT configured this way by default. |
|||
TEAC drives are generally easy to modify and have been tested by |
|||
the author and do work in this manner. Note that this does not |
|||
address the issue of double stepping above; you will just be |
|||
using the first 40 of 80 tracks. |
|||
|
|||
Support |
|||
------- |
|||
|
|||
I am happy to answer questions as fast and well as I am able. |
|||
Best contact is wwarthen@gmail.com or post something on the |
|||
N8VEM Google Group https://groups.google.com/forum/#!forum/n8vem. |
|||
|
|||
Changes |
|||
------- |
|||
|
|||
WW 8/12/2011 |
|||
|
|||
Removed call to pulse TC in the FDC initialization |
|||
after determining that it periodically caused the FDC to write |
|||
bad sectors. I am mystified by this, but definitely found it |
|||
to be true. Will revisit at some point -- probably a timing |
|||
issue between puslsing TC and whatever happens next. |
|||
|
|||
Non-DMA mode was being set incorrectly for FAST-DMA mode. |
|||
It was set for non-DMA even though we were doing DMA. It is |
|||
interesting that it worked fine anyway. Fixed it anyway. |
|||
|
|||
DIO_SETMEDIA was not clearing DCD_DSKRDY as it should. Fixed. |
|||
|
|||
WW 8/26/2011: v1.1 |
|||
|
|||
Added support for Zeta. Note that INT/WAIT and DRQ/WAIT are |
|||
not available on Zeta. Note that Zeta provides the ability |
|||
to perform a reset of the FDC independent of a full CPU |
|||
reset. This is VERY useful and the FDC is reset anytime |
|||
a drive reset is required. |
|||
|
|||
Added INT/WAIT support. |
|||
|
|||
WW 8/28/2011: V1.2 |
|||
|
|||
All changes in this version are Zeta specific. Fixed FDC reset |
|||
logic and motor status display for Zeta (code from Sergey). |
|||
|
|||
Modified Zeta disk change display to include it in the |
|||
command output line. This makes more sense because a command |
|||
must be issued to select the desired drive first. You can |
|||
use the SENSE INT command id you want to check the disk |
|||
change value at any time. It will also be displayed with |
|||
any other command output display. |
|||
|
|||
WW 9/1/2011: V1.3 |
|||
|
|||
Added CPUFREQ configuration setting to tune |
|||
delays based on cpu speed. The build app |
|||
is set for 8MHz which also seems to work well |
|||
for 4MHz CPU's. Faster CPU speeds will |
|||
probably require tuning this setting. |
|||
|
|||
WW 9/5/2011: V1.4 |
|||
|
|||
Changed the polling execution routines to utilize CPUFREQ |
|||
variable to optimize timeout counter. Most importantly, |
|||
this should allow the use of faster CPUs (like 20MHz). |
|||
|
|||
WW 9/19/2011: V1.5 |
|||
|
|||
Zeta changes only. Added a call to FDC RESET after any |
|||
command failure. This solves an issue where the drive |
|||
remains selected if a command error occurs. Also |
|||
added FDC RESET to FDC CONTROL menu. |
|||
|
|||
WW 10/7/2011: V2.0 |
|||
|
|||
Added support for DIDE. Only supports polling IO and it |
|||
does not appear any other modes are possible given the |
|||
hardware constraints. |
|||
|
|||
WW 10/13/2011: V2.1 |
|||
|
|||
Modified to support N8. N8 is essentially identical to |
|||
Dual IDE. The only real change is the IO addresses. In |
|||
theory, I should be able to support true DMA on N8 and |
|||
will work on that. |
|||
|
|||
WW 10/20/2011: v2.2 |
|||
|
|||
I had some problems with the results being read were |
|||
sometimes missing a byte. Fixed this by taking a more |
|||
strict approach to watching the MSR for the exact |
|||
bits that are expected. |
|||
|
|||
WW 10/22/2011: V2.3 |
|||
|
|||
After spending a few days trying to track down an |
|||
intermittent data corruption issue with my Dual IDE |
|||
board, I added a verify function. This helped |
|||
me isolate the problem very nicely (turned out to |
|||
be interference from the bus monitor). |
|||
|
|||
WW 11/25/2011: V2.4 |
|||
|
|||
Preliminary support for DISKIO V3. Basically just |
|||
assumed that it operates just like the Zeta. Needs |
|||
to be verified with real hardware as soon as I can. |
|||
|
|||
WW 1/9/2012: V2.5 |
|||
|
|||
Modified program termination to use CP/M reset |
|||
call so that a warm start is done and all |
|||
drives are logged out. This is important |
|||
because media may have been formatted during |
|||
the program execution. |
|||
|
|||
WW 2/6/2012: v2.6 |
|||
|
|||
Added support for 5.25" drives as tested by |
|||
Sergio. |
|||
|
|||
WW 4/5/2012: v2.7 |
|||
|
|||
Added support for 8" drives as tested by |
|||
Jim Harre. |
|||
|
|||
WW 4/6/2012: v2.7a |
|||
|
|||
Fixed issue with media selection menu to remove |
|||
duplicate entries. |
|||
|
|||
WW 4/8/2012: v2.7b |
|||
|
|||
Corrected the handling of the density select |
|||
signal. |
|||
|
|||
WW 5/22/2012: v2.8 |
|||
|
|||
Added new media definitions (5.25", 320K) |
|||
|
|||
WW 6/1/2012: v2.9 |
|||
|
|||
Added interleave capability on format |
|||
|
|||
WW 6/5/2012: v3.0 |
|||
|
|||
Documentation cleanup |
|||
|
|||
WW 7/1/2012: v3.1 |
|||
|
|||
Modified head load time (HLT) for 8" media based on |
|||
YD-180 spec. Now set to 50ms. |
|||
Binary file not shown.
Loading…
Reference in new issue