Atom Nieuws 2002 nummer 1
../../../images/back.gif ../../../images/exit.gif ../../../images/forward.gif
pagina 9
Floppy Disc Controller: FDC - Hij Doet 'T!

En opeens had ik het weer even, dat speciale gevoel ... dat gevoel dat optrad wanneer ik een programma had ingetikt en een RUN commando gaf: HIJ DOET 'T! Deze keer betrof het geen zelf ingetikt programma, maar een bestand, waar ik al eens terloops iets over opgemerkt had:

FDC =gebaseerd op John Wilson's FDCDEMO (version 12-Sep-1995), april 1996/nov 1998, verbeterd door W.H.Scholten. Leest BBC diskettes op een PC, alleen echter indien de PC beschikt over een oude disk controller OF een hele nieuwe. En nu, na vervanging van het moederbord, werkt het ook bij mij!

Hoe werkt het?

FDC is een DOS programma, maar doet het ook in de DOS-box van Win95/98. Het kan BBC diskettes lezen, schrijven en formatteren. De diskette wordt als image weggeschreven zodat die in een BBC emulator gebruikt kan worden.

Tik in :
FDC en al gauw verschijnt de DOS prompt:

PC FDC program, version 0.13
Improved version of FDCDEMO by WHS
FDC> -

Maar al ziet u dit op uw scherm, het wil nog niet zeggen dat FDC het ook doet ....

Wat doet het?

Het programma FDC configureert en bestuurt de disk controller -via de daarvoor bestemde I/O poorten -zodanig dat de PC diskdrive in staat is BBC diskettes in diverse formaten (DFS, ADFS, DOS+, 800k) te lezen, te schrijven en te formatteren. De standaard instellingen voor de DOS formaten (360Kb, 720Kb, 1.2Mb en 1.4Mb ) worden onder normale omstandigheden vanuit het BIOS naar de disk controller gestuurd. FDC omzeilt dat en stuurt de gegevens voor bovengenoemde formaten -zonder tussenkomst van het BIOS - rechtstreeks naar de controller.

Een disk controller is niets anders dan een chip, het belangrijkste onderdeel van een diskinterface, die de diskdrive (motor en stappenmotor) aanstuurt. Deze aansturing omvat het starten en stoppen van de motor, het plaatsen van de kop op de juiste positie. Het lezen en schrijven van gegevens van en naar de diskette.

Die diskcontroller kan een specifiek IC zijn (bijvoorbeeld i8271 of WD1770), danwel de complete printplaat met een controller-ic, geheugen, ROM en buffers.

Mensen die opgegroeid zijn met het 8Bit gebeuren, kennen ze ongetwijfeld nog wel, deze diskcontrollers:

de 8271 van Intel aangestuurd door het DFS van Acorn, tevens gebruikt in de Atom.
de 1770 van Western Digital met het DFS/ADFS van Acorn
de 1772 van Western Digital met software van Watford

In de begintijd van de homecomputer een zeldzaamheid (de Electron had geen diskdrive, alleen tapebesturing; de BBC was al wel voorbereid op een diskdrive aansluiting), tegenwoordig dreigt het weer een zeldzaamheid te worden...

Zoals er verschillende diskcontrollers zijn, zijn er verschillende diskdrives met de daarbij behorende standaarden door de fabrikant aangeleverd en dan nog de verschillende diskettes, plus de diverse systemen.

Het gebruik van FDC hangt dan ook van vele factoren af.

Waarvoor gebruik je FDC?

Met FDC kan men, gebruik makend van een PC diskdrive:

-BBC diskettes inlezen en wegschrijven als een BBC diskimage.
-BBC diskimages terugschrijven naar. een BBC diskette.
-BBC diskettes formatteren.

*BBC diskettes inlezen en wegschrijven als een BBC diskimage.

Niet iedere diskdrive is geschikt voor gebruik met FDC, daar sommige niet over programmeerbare I/0 registers beschikken en dus niet ingesteld kunnen worden op andere dan DOS waardes. Jammer genoeg is er geen regel voor om dit van te voren te bekijken, gewoon proberen.

Instellingen worden automatisch gezet zodra je BBCxxx hebt ingetikt.

Wat moet en kun je allemaal intikken?

Allereerst (natuurlijk) FDC om het programma te starten, daarna BBC om de parameters voor BBC te zetten.

Voor een floppy is er keus uit:
enkelzijdig / dubbelzijdig; single density / double density; 40/80 tracks en dan nog de verschillende systemen DFS, ADFS en DOS+ (=800K).

De standaard BBC parameters zijn:

DS (double sided), SD (single density), 40-tracks cn een 10 sectoren floppy, te lezen in een 360K PC drive.

Ook standaard is de diskdrive op fd1. Er is keuze uit 4, van fd0 t/m fd3 (fd0 = drive A, fd1 = drive B). Een PC kon vroeger 4 diskdrives aan, maar daar de harde schijf drive C is geworden, zul je de twee laatste niet gebruiken. Met het intikken van S(tatus) zijn de instellingen te zien:

G:\> fdc.com
PC FDC program, version 0.13
Improved version of FDCDEMO by WHS
FDC>s
  DRIVE fd1
  CYLINDERS 40 HEADS 1 SECTORS 10 BYTES 256 SD SINGLESTEP
  MINSECTOR 0 GAP3 10 GAP3FORMAT 14 FILL E5 DDinDD (250 kHz, 300 RPM)
  DOUBLESIDED HEAD0ALIAS 0 HEAD1ALIAS 0
  Af ter a read/verify error: STOP
FDC>

Elk commando moet op een nieuwe regel staan en het maakt niet uit of je hoofdletters, dan wel kleine letters gebruikt. De diskettes mogen niet copieerbeveiligd zijn.

Voeg voor een 40 tracks diskette cyl40 toe, voor een 80 tracks diskette cyl 80 (denk om de spatie!). Een fout intikken is niet zo erg, er volgt een foutmelding en dan kun je het commando overnieuw intikken.

Indien je gebruik maakt van een 1.2 Mb PC diskdrive (High Density), is nog het commando 'DDINHD' nodig, eventueel DOUBLESTEP als de diskette 360K is en altijd in een 40 tracks diskdrive is gebruikt; gebruik je daarentegen een 360Kb PC diskdrive kun je volstaan met 'DDINDD' (= standaard) en eventueel SINGLESTEP voor een 360K diskette in een 40 tracks diskdrive.

Zo, nog even repeteren:

Om een 80 tracks DFS diskette in een 1.2 MB PC diskdrive (drive B) te kunnen lezen, tikt u in:

FDl BBC
CYL 80
DDINHD

Vervolgens
READ0 <naam.img> =>van diskette naar image, 1 kant van de schijf of
READ1 <naam.img> => van diskette naar image. 2e kant van de schijf. of
READ <naam.dsd>

Het laatste commando leest een dubbelzijdige diskette in zijn geheel in, twee kanten van de schijf dus, en schrijft die weg als een interleaved image: de diskette wordt in een keer gelezen en in stukjes weggeschreven, eerst track 0 van kant 0, dan track 0 van kant 1, daarna track1 van kant 0, enz. De parameter HEADS 2 wordt automatisch gezet.

De naam is de naam die u aan het image geeft + extensie. Als u een DFS diskette inleest dmv READ gebruik dan .dsd, als U een ADFS disk inleest gebruik dan .adl als extensie. Kan voor een enkelzijdige DFS diskette .ssd of .img zijn, voor een enkelzijdige ADFS diskette .adf. Dit opdat de verschillende emulatoren het image op de juiste manier zullen herkennen.

BBC80
Met dit commando worden de BBC parameters voor een 80 tracks diskette gezet, vergeet het DDINHD commando niet als u een 1.2 Mb diskdrive gebruikt.

BBC640
Hiermee leest u een ADFS L 640 K (= Master) formaat diskette met een head1alias =1 in. Als dit niet werkt, probeer dan head1alias =0.

Voor ADFS M (= BBC) dezelfde parameters, maar gebruik READO <filenaam> daar de diskettes singlesided zijn.

Voor ADFS S (= Electron) dezelfde parameters, maar gebruik ook CYL 40 en READO <filenaam> daar de diskettes singlesided zijn.

BBC800
De 800K diskette voor DOS+ en ADFS (Archimedes). De parameters worden automatisch gezet als u BBC800 intikt:
sectors 5, bytes 1024, m1of m0, dd, cyl 80, head1 of head1 0

*BBC diskimages terugschrijven naar een BBC diskette.

Om een image terug te zetten naar diskette, gebruik je dezelfde commando's, maar i.p.v. READ tik je WRITE WRITE0 (naam) => van image naar diskette, 1 kant van de schijf, of
WRITE1 (naam) => van image naar diskette, Ze kant van de schijf, of
WRITE (naam)

De naam is de naam die het image heeft + extensie. Het laatste commando schrijft in een keer een dubbelzijdige diskette. Meer bedoeld voor ADFS en DOS+ diskettes, bij DFS diskettes heeft kant voor kant de voorkeur (write0, write1). Controleer altijd door middel van S(tatus) of de juiste instellingen gemaakt zijn.

*BBC diskettes formatteren.

Eerst het gewenste formaat opgeven en controleren dmv S(tatus).

FORMAT -formatteert een gehele diskette met de ingestelde gegevens.
FORMAT0 -formatteert 1 kant van de schijf
FORMAT1 -formatteert de tweede kant van de schijf.

Je kunt door de BBC geformatteerde diskettes gebruiken, maar in sommige gevallen is het beter FDC vooraf een diskette te laten formatteren. Dat is vooral aan te raden bij het terugzetten van een 800K Image naar een 800K diskette (DOS+). Tik In:

FD1
BBC800
DDINHD FORMAT

En daarna WRITE (naam van het image + extensie)

Denk eraan dat de gemaakte 800K diskettes niet te lezen zijn op de PC!

Q=Quit

Dit waren slechts een paar veel gebruikte commando's, alle commando's staan uitgebreid beschreven in FDC zelf. (zie ook hieronder H.)

Mocht dit allemaal niet werken, helaas, probeer dan een andere diskdrive.

Janny Looyenga.
Voor vragen en/of opmerkingen:
janny @catslair .org

Nawoord redactie: bij dit nummer hebben we geen regio schijf. Het programma FDC98 zal binnenkort via de website van Henk van der Heijden beschikbaar gesteld worden. Of U vraagt het even aan bij roland.leurs@t-syslems.nl en ik stuur het U per kerende e-mail.
Hieronder staat de Engelse tekst van m.b.t. de achtergrond en commando-overzicht.
FDCDEMO is a program demonstrating how to program the floppy disk controller
found in the IBM PCs and clones (based on the NEC 765 chip and its successors).
FDCDEMO.ASM contains the assembly language source code (MASM or TASM) of both
the public-domain FDC driver code, and a simple command line interpreter which
demonstrates how to call the FDC driver, and allows the user to set all disk
parameters and read, write, and format disks using keyboard commands. This may
in itself be useful for making image files of disks for emulators etc., or
writing boot images to disks for Linux etc. (replacing RAWRITE.EXE). Note
that Beebwin and some other programs expect disk image files to have the
sectors in logical order instead of physical order; you will need to write a
small program to correct the order in this case, or if you can find out the
required order drop me a line and maybe I can help.
Note that most PC floppy controllers have broken single density modes. They
may still be able to read single density disks with a few retries, but they
can't write or format them. However, FDCs based on the 37C65 series of chips
appear to work OK; this chip is normally in a 40-pin DIP or 44-pin PLCC
package and has one 9.6 MHz crystal and one 16 or 32 MHz crystal (as opposed to
the more common chips that use a single 24 MHz crystal). The bottom-
of-the-line ISA IDE/FDC controller from JDR Micro Devices was based on this
chip when I ordered mine, you might want to try them but of course nothing is
guaranteed, they might have changed the circuit since then.
The syntax of each command is given below. More than one command may be on a
line if the commands are separated by blanks or tabs. Commands may be
abbreviated to any unique abbreviation, except for FORMAT, PUT, and WRITE,
which must be spelled out in full (for safety, such as it is). There are
commands to set each parameter individually, and then there are "macro"
commands to set all parameters for the standard DOS disk types, as well as a
few DEC and BBC types.
This program is not intended to be a sector editor, it
is only able to read and write either one sector at a time or one disk at a
time, and there is no way provided to edit the sector buffer contents. If
necessary you can use SAVE and LOAD to move data between the sector buffer and
files (one sector at a time), and then use DEBUG.COM to edit the disk files,
but that would be hellish for a big job. The SHOW command is a little
cumbersome, since all it can do is dump out the whole sector, which is more
than a screenful for 512- and 1024-byte sectors, so you need to be ready with
the Pause key.
I'm a little proud of the logic used by READ and WRITE to
figure out sector interleave (using the SECZER/SECINI/SECNXT routines), if
you're in a position where you need to read or write large sections of a disk
quickly using only a one-sector buffer you may want to take a look at that
code. Otherwise the command-line front-end is basically throwaway fluff
intended simply to demonstrate the FDC code and help with testing disk
parameters.
John Wilson
11 Bank Street
Troy, NY 12180-4303
+1 (518) 271-1982
<wilsonj@alumni.rpi.edu>
Note from me (WHS): 
newer computers seem to have better single density support than older ones. Many people have reported singly density started working after getting a new computer/mainboard! COMMAND SUMMARY, updated for FDC by whs (wouters@cistron.nl), minimum abbreviations are shown with brackets. ------------------------------------------------------------------------- 180KB Set up all disk parameters for 180KB 40-track 9-sector SS DD floppies. This command sets DOUBLESTEP on the assumption that you are using a 1.2MB (i.e. 80-track) drive, if you're really using a 180KB or 360KB (i.e. 40-track) drive you must issue a SINGLESTEP command afterwards. 360KB Set up all disk parameters for 360KB 40-track 9-sector DS DD floppies. This command sets DOUBLESTEP on the assumption that you are using a 1.2MB (i.e. 80-track) drive, if you're really using a 180KB or 360KB (i.e. 40-track) drive you must issue a SINGLESTEP command afterwards. 720KB Set up all disk parameters for 720KB 80-track 9-sector DS DD floppies. 1.2MB Set up all disk parameters for 1.2MB 80-track 15-sector DS HD floppies. 1.44MB Set up all disk parameters for 1.44MB 80-track 18-sector DS HD floppies. 2.88MB Set up some disk parameters for 2.88MB 80-track 36-sector DS ED floppies. Since I have no 2.88MB drive the support is incomplete. fd0, fd1, fd2, fd3 Select which floppy drive to use. Default is fd1. Most systems support only two drives so fd2 and fd3 may not do anything useful. BBC Default. Set up all disk parameters for BBC DS SD 40-track 10-sector floppies on 360K PC drive. For 80 track floppies in a 1.2M drive also enter CYL 80 (and DDINHD might be needed). BBC80 Same as bbc but for 80 track disks (you may need to enter DDINHD after this). Paramters set are: 'bbc', then cyl80. BBC640 Sets 3.5" ADFS L 640 K format with a head1alias =1. If it doesn't work, try head1alias=0. Parameters set: 'bbc', cyl 80, bytes 256, sectors 16, head1 1. BBC800 Sets 3.5" ADFS 800 K format (archimedes) with a head1alias =0. If it doesn't work, try head1alias=1. Parameters set are: BYTES n Set number of bytes per sector. "n" is 128, 256, 512, or 1024. CAT n Where n is 0 or 1. Shows files on side 0/1 for BBC DFS format. CONT Continue reading/formatting after a read/verify error. Useful to read bad disks. CYLINDERS n Set number of cylinders per disk. Usually 40 or 80, but anything up to 256 is allowed. DD Set recording method to MFM (modified frequency modulation) for double density (or HD or ED) disks. DDINDD Set data rate for double density (e.g. 360KB) disk in a double density (i.e. 360KB) drive. Note that if you are using a generic 360KB 40-track drive, you will probably want to set SINGLESTEP too. DDINHD Set data rate for double density (e.g. 360KB) disk in a high density (i.e. 1.2MB) drive. Note that if the disk comes from a machine that uses normal (e.g. 360KB) 40-track drives, you will probably want to set DOUBLESTEP too. DO[UBLESTEP] Set the seek code to double head stepping, for using 40-track disks in 80-track drives. DS Set up for double-sided disks (default). (No longer equivalent to HEADS 2) ED Set data rate for extended density vertical format disk (i.e. 2.88MB). FILL hh Set the hex value of the fill byte to be used to blank out sectors during a subsequent format operation. FORMAT, FORMAT0, FORMAT1 Format and verify the disk using the currently set parameters. GA[P3] n Set the size of gap 3 in the disk format (see any FDC chip's data sheets if you don't understand what this means). GAP3F[ORMAT] n Set the size of gap 3 written during a subsequent format operation (see any FDC chip's data sheets if you don't understand what this means). GET cyl [head] sec Get a single sector into the sector buffer, from the specified decimal cylinder, head, and sector location on the disk. The head number is (must be) omitted when using a single-sided disk (i.e. "SS"). HD Set data rate for high density disk (i.e. 1.2MB or 2.88MB). HEAD0[ALIAS] n Set head alias to use in headers on side 0. Normally 0. HEAD1[ALIAS] n Set head alias to use in headers on side 1. Normally 1. Some unusual formats (e.g., by Commodore, BBC) use values other than the physical head number for the "head" field in sector headers. REMOVED:HEADS n REMOVED:Set number of heads, 1 or 2. "SS" and "DS" commands are equivalent. heads is now only used internally during disk reading/writing LOAD filename Load the sector buffer from a file (containing data for a single sector). Size is determined by the BYTES command. M[INSECTOR] n Sets the minimum sector number on each track. Normally 1, but 0 on some variants (BBC). PUT cyl [head] sec Put a single sector from the sector buffer, onto the specified decimal cylinder, head, and sector location on the disk. The head number is (must be) omitted when using a single-sided disk (i.e. "SS"). Q[UIT] Quit to DOS. R[EAD] filename, READ0 filename, READ1 filename Read entire contents of disk into an (for double sided: interleaved) image file. All sectors appear in the file in the same order as on the disk. READ0 and READ1 only read sides 0 and 1. RX01 Set up all disk parameters for DEC RX01 SSSD 77-track 26-sector floppies (8", or 5.25" workalike disks). RX02 Set up all disk parameters for DEC RX02 SSDD 77-track 26-sector workalike floppies. RX50 Set up all disk parameters for DEC RX50 SSDD 80-track 10-sector floppies. SAVE filename Save the sector buffer to a file (which receives data for a single sector). Size is determined by the BYTES command. SD Set recording method to FM (frequency modulation) for single density disks. N.B. most PC FDC chips can't write SD disks properly, but many can read them given a few retries. SECTORS n Set number of sectors per track. SHOW Show contents of sector buffer in hex and ASCII. Sorry, the program doesn't let you edit it, you'll have to SAVE it to a file and edit it there. SI[NGLESTEP] Set the seek code to use normal head stepping, for anything other than using 40-track disks in 80-track drives. SS Set up for single-sided disks. (No longer equivalent to HEADS 1) S[TATUS] Display all disk settings. STOP Stop reading/formatting after a read/verify error. W[RITE] filename , WRITE0 filename, WRITE1 filename Write entire contents of disk from an (for double sided: interleaved) image file. All sectors appear in the same order on the disk as in the file. WRITE0 and WRITE1 write the imagefile to side 0,1.
../../../images/back.gif ../../../images/exit.gif ../../../images/forward.gif