From 69ece3ffa02a16b62fea8ee591b64a5772028ad2 Mon Sep 17 00:00:00 2001 From: David Given Date: Thu, 25 May 2023 20:07:33 +0200 Subject: [PATCH] Polish documentation. --- doc/drives.md | 2 +- doc/filesystem.md | 18 ++-- doc/greaseweazle.md | 5 +- doc/screenshot-details.png | Bin 0 -> 28420 bytes doc/technical.md | 104 +++++++++++++------- doc/using.md | 189 ++++++++++++++++++------------------- 6 files changed, 177 insertions(+), 141 deletions(-) create mode 100644 doc/screenshot-details.png diff --git a/doc/drives.md b/doc/drives.md index f162bcd0..452b69a5 100644 --- a/doc/drives.md +++ b/doc/drives.md @@ -39,7 +39,7 @@ If you actually have a forty track drive, you need to tell FluxEngine. This is done by adding the special profile `40track_drive`: ``` -fluxengine write ibm360 40track_drive -i image.img -d drive:0 +fluxengine write ibm --360 40track_drive -i image.img -d drive:0 ``` It should then Just Work. This is supported by both FluxEngine and Greaseweazle diff --git a/doc/filesystem.md b/doc/filesystem.md index a7f6ecea..b2822e71 100644 --- a/doc/filesystem.md +++ b/doc/filesystem.md @@ -17,12 +17,14 @@ The following file systems are supported so far. |:-----------------------------------------|:-----:|:------:|-------| | Acorn DFS | Y | | | | Amiga FFS | Y | Y | Both OFS and FFS | +| AppleDOS / ProDOS | Y | Y | With a choice of sector remapping | | Brother 120kB | Y | Y | | | Commodore CbmFS | Y | | Only 1541 disks so far | | CP/M | Y | | Requires configuration for each machine | | FatFS (a.k.a. MS-DOS) | Y | Y | FAT12, FAT16, FAT32; not Atari (AFAIK!) | +| Hewlett-Packard LIF | Y | | | | Macintosh HFS | Y | Y | Only AppleDouble files may be written | -| Apple ProDOS | Y | | | +| pSOS' PHILE | Y | | Probably unreliable due to lack of documentation | | Smaky 6 | Y | | | {: .datatable } @@ -38,19 +40,19 @@ Using it To use, try syntax like this: ``` -fluxengine ls ibm180 -f drive:0 +fluxengine ls ibm --180 -f drive:0 ``` -`ibm180` is the format, which selects the most common filesystem automatically. -`-f drive:0` specifies a flux source/sink, in this case a real disk. You may -also specify a flux file (read only). Disk images may be specified with `-i -disk.img` (read/write). +`ibm --180` is the format, which selects the most common filesystem +automatically. `-f drive:0` specifies a flux source/sink, in this case a real +disk. You may also specify a flux file (read only). Disk images may be +specified with `-i disk.img` (read/write). Commands which take filename paramaters typically use `-p` to indicate the path on the disk, and `-l` for the local filename. For example: ``` -fluxengine putfile ibm180 -f drive:0 -p ondisk.pcx -l z.pcx +fluxengine putfile ibm --180 -f drive:0 -p ondisk.pcx -l z.pcx ``` This will copy the file `z.pcx` onto the disk and call it `ONDISK.PCX`. @@ -83,7 +85,7 @@ default; for example, Macintosh HFS filesystems are common on 3.5" floppies. You can do this as follows: ``` -fluxengine format ibm1440 -f drive:1 --filesystem.type=MACHFS +fluxengine format ibm --1440 -f drive:1 --filesystem.type=MACHFS ``` Some filesystems won't work on some disks --- don't try this with Amiga FFS, for diff --git a/doc/greaseweazle.md b/doc/greaseweazle.md index fb75a7e1..66a39a73 100644 --- a/doc/greaseweazle.md +++ b/doc/greaseweazle.md @@ -41,8 +41,9 @@ Supported features with the Greaseweazle include: `--usb.greaseweazle.bus_type=SHUGART` or `IBMPC`; the default is `IBMPC`) - Apple 5.25 floppy interfaces (via `--usb.greaseweazle.bus_type=APPLE2`) -Which device types are supported depend on the hardware. Genuine Greaseweazle hardware supports SHUGART and IBMPC. -APPLE2 is only supported with hand wiring and the Adafruit\_Floppy greaseweazle-compatible firmware. +Which device types are supported depend on the hardware. Genuine Greaseweazle +hardware supports SHUGART and IBMPC. APPLE2 is only supported with hand wiring +and the Adafruit\_Floppy greaseweazle-compatible firmware. What doesn't work ----------------- diff --git a/doc/screenshot-details.png b/doc/screenshot-details.png new file mode 100644 index 0000000000000000000000000000000000000000..1a02039c36aa51bc056b9d352db3c09e702c0fa1 GIT binary patch literal 28420 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 +screenshot of the GUI in action + + ### Core concepts FluxEngine's job is to read magnetic data (called _flux_) off a disk, decode @@ -68,10 +75,10 @@ Here are some sample invocations: ``` # Read an PC 1440kB disk, producing a disk image with the default name # (ibm.img) -$ fluxengine read ibm1440 +$ fluxengine read ibm --1440 # Write a PC 1440kB disk to drive 1 -$ fluxengine write ibm1440 -i image.img -d drive:1 +$ fluxengine write ibm --1440 -i image.img -d drive:1 # Read a Eco1 CP/M disk, making a copy of the flux into a file $ fluxengine read eco1 --copy-flux-to copy.flux -o eco1.ldbs @@ -90,30 +97,31 @@ $ cat config.textpb encoder { ibm { trackdata { - emit_iam: false - } + emit_iam: false + } } } -$ fluxengine write ibm1440 config.textpb -i image.img +$ fluxengine write ibm --1440 config.textpb -i image.img ``` ...or you can specify them on the command line: ``` -$ fluxengine write ibm1440 -i image.img --encoder.ibm.trackdata.emit_iam=false +$ fluxengine write ibm --1440 -i image.img --encoder.ibm.trackdata.emit_iam=false ``` Both the above invocations are equivalent. The text files use [Google's protobuf syntax](https://developers.google.com/protocol-buffers), which is hierarchical, type-safe, and easy to read. -The `ibm1440` string above is actually a reference to an internal configuration -file containing all the settings for writing PC 1440kB disks. You may specify -as many profile names or textpb files as you wish; they are all merged left to -right. You can see all these settings by doing: +The `ibm` string above is actually a reference to an internal configuration file +containing all the settings for writing PC disks, and the `--1140` refers to a +specific definition inside it. You may specify as many profile names or textpb +files as you wish; they are all merged left to right. You can see all these +settings by doing: ``` -$ fluxengine write ibm1440 --config +$ fluxengine write ibm --1440 --config ``` The `--config` option will cause the current configuration to be dumped to the @@ -131,29 +139,30 @@ different task. Run each one with `--help` to get a full list of (non-configuration-setting) options; this describes only basic usage of the more common tools. - - `fluxengine read -s -o ` + - `fluxengine read -s -o ` - Reads flux (possibly from a disk) and decodes it into a file system image. - `` is a reference to an internal input configuration file - describing the format. + Reads flux (possibly from a disk) and decodes it into a file system image. + `` is a reference to an internal input configuration file + describing the format. `` may be any combination of options + defined by the profile. - `fluxengine write -i -d ` - Reads a filesystem image and encodes it into flux (possibly writing to a - disk). `` is a reference to an internal output configuration file - describing the format. + Reads a filesystem image and encodes it into flux (possibly writing to a + disk). `` is a reference to an internal output configuration file + describing the format. - `fluxengine rawread -s -d ` - Reads flux (possibly from a disk) and writes it to a flux file without - doing any decoding. You can specify a profile if you want to read a subset - of the disk. + Reads flux (possibly from a disk) and writes it to a flux file without doing + any decoding. You can specify a profile if you want to read a subset of the + disk. - `fluxengine rawwrite -s -d ` - Reads flux from a file and writes it (possibly to a disk) without doing any - encoding. You can specify a profile if you want to write a subset of the - disk. + Reads flux from a file and writes it (possibly to a disk) without doing any + encoding. You can specify a profile if you want to write a subset of the + disk. - `fluxengine merge -s -s -d -c -h -B` - Reads flux (possibly from a disk) and does various analyses of it to try - and detect the clock rate, display raw flux information, examine the - underlying data from the FluxEngine board, etc. There are lots of options - but the command above is the most useful. + Reads flux (possibly from a disk) and does various analyses of it to try and + detect the clock rate, display raw flux information, examine the underlying + data from the FluxEngine board, etc. There are lots of options but the + command above is the most useful. - `fluxengine rpm` - Measures the rotation speed of a drive. For hard-sectored disks, you - probably want to add the name of a read profile to configure the number of - sectors. + Measures the rotation speed of a drive. For hard-sectored disks, you + probably want to add the name of a read profile to configure the number of + sectors. - `fluxengine seek -c ` - Seeks a drive to a particular cylinder. + Seeks a drive to a particular cylinder. There are other tools; try `fluxengine --help`. @@ -198,19 +207,19 @@ FluxEngine supports a number of ways to get or put flux. When using the `-s` or - `drive:` - Read from or write to a specific drive. + Read from or write to a specific drive. - `` - Read from or write to a native FluxEngine flux file. + Read from or write to a native FluxEngine flux file. - `` - Read from or write to a Supercard Pro `.scp` flux file. + Read from or write to a Supercard Pro `.scp` flux file. - `` - Read from a Catweasel flux file. **Read only.** + Read from a Catweasel flux file. **Read only.** - `` @@ -218,8 +227,8 @@ FluxEngine supports a number of ways to get or put flux. When using the `-s` or - `kryoflux:` - Read from a Kryoflux stream, where `` is the directory containing the - stream files. **Read only.** + Read from a Kryoflux stream, where `` is the directory containing + the stream files. **Read only.** - `flx:` @@ -228,53 +237,54 @@ FluxEngine supports a number of ways to get or put flux. When using the `-s` or - `erase:` - Read nothing --- writing this to a disk will magnetically erase a track. - **Read only.** + Read nothing --- writing this to a disk will magnetically erase a track. + **Read only.** - `testpattern:` - Read a test pattern, which can be written to a disk to help diagnosis. - **Read only.** + Read a test pattern, which can be written to a disk to help diagnosis. + **Read only.** - `au:` - Write to a series of `.au` files, one file per track, which can be loaded - into an audio editor (such as Audacity) as a simple logic analyser. **Write - only.** + Write to a series of `.au` files, one file per track, which can be loaded + into an audio editor (such as Audacity) as a simple logic analyser. + **Write only.** - `vcd:` - Write to a series of `.vcd` files, one file per track, which can be loaded - into a logic analyser (such as Pulseview) for analysis. **Write only.** + Write to a series of `.vcd` files, one file per track, which can be loaded + into a logic analyser (such as Pulseview) for analysis. **Write only.** ### Image sources and destinations FluxEngine also supports a number of file system image formats. When using the `-i` or `-o` options (for input and output), you can use any of these strings: - - ``, ``, ``, ``, `` + - ``, ``, ``, ``, + `` - Read from or write to a simple headerless image file (all these formats are - the same). This will probably want configuration via the - `input/output.image.img.*` configuration settings to specify all the - parameters. + Read from or write to a simple headerless image file (all these formats are + the same). This will probably want configuration via the + `input/output.image.img.*` configuration settings to specify all the + parameters. - `` - Read from or write to a [DiskCopy - 4.2](https://en.wikipedia.org/wiki/Disk_Copy) image file, commonly used by - Apple Macintosh emulators. + Read from or write to a [DiskCopy + 4.2](https://en.wikipedia.org/wiki/Disk_Copy) image file, commonly used by + Apple Macintosh emulators. - `` - Read a [Sydex Teledisk TD0 - file](https://web.archive.org/web/20210420224336/http://dunfield.classiccmp.org/img47321/teledisk.htm) - image file. Note that only uncompressed images are supported (so far). + Read a [Sydex Teledisk TD0 + file](https://web.archive.org/web/20210420224336/http://dunfield.classiccmp.org/img47321/teledisk.htm) + image file. Note that only uncompressed images are supported (so far). - `` - Read from a JV3 image file, commonly used by TRS-80 emulators. **Read - only.** + Read from a JV3 image file, commonly used by TRS-80 emulators. **Read + only.** - `` @@ -382,38 +392,27 @@ behaviour. - `--drive.revolutions=X` - When reading, spin the disk X times. X - can be a floating point number. The default is usually 1.2. Some formats - default to 1. Increasing the number will sample more data, and can be - useful on dubious disks to try and get a better read. + When reading, spin the disk X times. X can be a floating point number. The + default is usually 1.2. Some formats default to 1. Increasing the number + will sample more data, and can be useful on dubious disks to try and get a + better read. - `--drive.sync_with_index=true|false` - Wait for an index pulse - before starting to read the disk. (Ignored for write operations.) By - default FluxEngine doesn't, as it makes reads faster, but when diagnosing - disk problems it's helpful to have all your data start at the same place - each time. + Wait for an index pulse before starting to read the disk. (Ignored for write + operations.) By default FluxEngine doesn't, as it makes reads faster, but + when diagnosing disk problems it's helpful to have all your data start at + the same place each time. - - `--drive.index_source=X` + - `--drive.index_mode=X` - Set the source of index pulses when reading or writing respectively. This - is for use with drives which don't produce index pulse data. `X` can be - `INDEXMODE_DRIVE` to get index pulses from the drive, `INDEXMODE_300` to - fake 300RPM pulses, or `INDEXMODE_360` to fake 360RPM pulses. Note this - has no effect on the _drive_, so it doesn't help with flippy disks, but is - useful for using very old drives with FluxEngine itself. If you use this - option, then any index marks in the sampled flux are, of course, garbage. - - - `--flux_source.rescale=X, --flux_sink.rescale=X` - - When reading or writing a floppy on a drive that doesn't match the - original drive RPM, the flux periods can be scaled to compensate. - - For example, to read or write a PC-98 1.2MB (360rpm) floppy using a 300rpm - floppy drive: - - `--flux_source.rescale=1.2 --flux_sink.rescale=1.2` + Set the source of index pulses when reading or writing respectively. This + is for use with drives which don't produce index pulse data. `X` can be + `INDEXMODE_DRIVE` to get index pulses from the drive, `INDEXMODE_300` to + fake 300RPM pulses, or `INDEXMODE_360` to fake 360RPM pulses. Note this + has no effect on the _drive_, so it doesn't help with flippy disks, but is + useful for using very old drives with FluxEngine itself. If you use this + option, then any index marks in the sampled flux are, of course, garbage. ## Visualisation @@ -439,8 +438,8 @@ wrote to do useful things. These are built alongside FluxEngine. - `brother120tool`, `brother240tool` - Does things to Brother word processor disks. These are [documented on the - Brother disk format page](disk-brother.md). + Does things to Brother word processor disks. These are [documented on the + Brother disk format page](disk-brother.md). ## The recommended workflow @@ -466,13 +465,13 @@ $ fluxengine read brother -s brother.flux -o brother.img --decoder.write_csv_to= Apart from being drastically faster, this avoids touching the (potentially physically fragile) disk. -If the disk is particularly dodgy, you can force FluxEngine not to retry -failed reads with `--retries=0`. This reduces head movement. **This is not +If the disk is particularly dodgy, you can force FluxEngine not to retry failed +reads with `--decoder.retries=0`. This reduces head movement. **This is not recommended.** Floppy disks are inherently unreliable, and the occasional bit -error is perfectly normal; FluxEngine will retry and the sector will read -fine next time. If you prevent retries, then not only do you get bad sectors -in the resulting image, but the flux file itself contains the bad read, so -attempting a decode of it will just reproduce the same bad data. +error is perfectly normal; FluxEngine will retry and the sector will read fine +next time. If you prevent retries, then not only do you get bad sectors in the +resulting image, but the flux file itself contains the bad read, so attempting a +decode of it will just reproduce the same bad data. See also the [troubleshooting page](problems.md) for more information about reading dubious disks.