From 9abfa3726e04163ffe2debe4de47eaf52711844e Mon Sep 17 00:00:00 2001 From: David Given Date: Fri, 9 Sep 2022 23:11:05 +0200 Subject: [PATCH] Add documentation. --- README.md | 11 +++--- doc/filebrowser.jpg | Bin 0 -> 58342 bytes doc/filesystem.md | 86 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 93 insertions(+), 4 deletions(-) create mode 100644 doc/filebrowser.jpg create mode 100644 doc/filesystem.md diff --git a/README.md b/README.md index 5c13ee7a..3e3c41e3 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,9 @@ FluxEngine (If you're reading this on GitHub, the formatting's a bit messed up. [Try the version on cowlark.com instead.](http://cowlark.com/fluxengine/)) -**Breaking news!** As of 2021-05-21, the command line environment has changed -_substantially_ (to make it more consistent and flexible, and allow some new -backend features like multi-format IBM scheme disks, which are popular with -CP/M). If things don't work the way you expect, please check the documentation. +**Breaking news!** As of 2022-09-09, there's new filesystem support. Read (and +sometimes write) files directly from (and to) your disks! It works in the GUI, +too. See the details below. What? ----- @@ -67,6 +66,10 @@ following friendly articles: - [Configuring for your drive](doc/drives.md) ∾ but I don't have a 80 track drive! ∾ reading and writing 40 track disks ∾ Shugart and Apple II + - [Direct filesystem access](doc/filesystem.md) ∾ imaging files is a pain + ∾ accessing files directly ∾ features and limitation ∾ it works on disk + images too, you say? + - [Troubleshooting dubious disks](doc/problems.md) ∾ it's not an exact science ∾ the sector map ∾ clock detection and the histogram diff --git a/doc/filebrowser.jpg b/doc/filebrowser.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a307f0d5d3b4bd85a2d36c946b5d301816863353 GIT binary patch literal 58342 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 F{|)}B*iHZd literal 0 HcmV?d00001 diff --git a/doc/filesystem.md b/doc/filesystem.md new file mode 100644 index 00000000..d84d6e85 --- /dev/null +++ b/doc/filesystem.md @@ -0,0 +1,86 @@ +Direct filesystem access +======================== + +FluxEngine will let you read and write files directly, in many cases. This will +allow you to pull files directly off a disk, or flux image, or disk image, +without needing to image it first. You can also write, and make other +modifications, including formatting blank disks, if the filesystem supports it. +The GUI even has a reasonably competent file manager. + +
+screenshot of the GUI in action +
+ +The following file systems are supported so far. + +| Filesystem | Read? | Write? | Notes | +|:-----------------------------------------|:-----:|:------:|-------| +| Acorn DFS | Y | | | +| Amiga FFS | Y | Y | Both OFS and FFS | +| Brother 120kB | Y | | | +| Commodore CbmFS | Y | | Only 1541 disks so far | +| CP/M | Y | | For selected formats | +| FatFS (a.k.a. MS-DOS) | Y | Y | FAT12, FAT16, FAT32, but only SFN; not Atari | +| Macintosh HFS | Y | Y | Only AppleDouble files may be written | + +Please not that Atari disks do _not_ use standard FatFS, and the library I'm +using for the heavy lifting (ChaN's +[FatFS](http://elm-chan.org/fsw/ff/00index_e.html) doesn't seem to support it. +If you know different, please [get in +touch](https://github.com/davidgiven/fluxengine/issues/new). + +Using it +-------- + +To use, try syntax like this: + +``` +fluxengine ls ibm180 -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). + +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 +``` + +This will copy the file `z.pcx` onto the disk and call it `ONDISK.PCX`. + +The directory separator character is _always_ `/`, even if you're using +Macintosh HFS, where it's usually `:`. + +The command line interface is pretty clunky, and is intended for scripts. For +everyday use, I'd suggest using the GUI (see the screenshot above). + +The supported commands are: + + - **ls**: list files (including in a directory) + - **getfile**: pull a file off a disk + - **putfile**: put a file onto a disk + - **format**: create a new filesystem and format a disk + - **getfileinfo**: retrieves metadata about a file. + - **getdiskinfo**: retrieves metadata about the file system. + +There are commands missing here; this is all a work in progress. + +Overriding the filesystem type +------------------------------ + +Sometimes you might want to use a different filesystem on the disk than the +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.machfs= +``` + +Some filesystems won't work on some disks --- don't try this with Amiga FFS, for +example. + +