Crates.io | fluxfox |
lib.rs | fluxfox |
version | |
source | src |
created_at | 2024-11-07 22:33:59.223986 |
updated_at | 2024-11-07 22:33:59.223986 |
description | A library crate for working with floppy disk images for the IBM PC and compatibles. |
homepage | |
repository | https://github.com/dbalsom/fluxfox |
max_upload_size | |
id | 1440372 |
Cargo.toml error: | TOML parse error at line 18, column 1 | 18 | autolib = false | ^^^^^^^ unknown field `autolib`, expected one of `name`, `version`, `edition`, `authors`, `description`, `readme`, `license`, `repository`, `homepage`, `documentation`, `build`, `resolver`, `links`, `default-run`, `default_dash_run`, `rust-version`, `rust_dash_version`, `rust_version`, `license-file`, `license_dash_file`, `license_file`, `licenseFile`, `license_capital_file`, `forced-target`, `forced_dash_target`, `autobins`, `autotests`, `autoexamples`, `autobenches`, `publish`, `metadata`, `keywords`, `categories`, `exclude`, `include` |
size | 0 |
A floppy disk image library for PC emulators
This library is under heavy initial development. The API is incredibly unstable, the internal disk representation is not final, and there are probably a million bugs. I do not recommend using this library until it reaches a more stable state.
Arac (1988, Digital Leisure Corporation) showing the signature of MINDER copy protection
There are a dizzying array of floppy disk image formats - formats often arise to meet the specific needs of certain hardware platforms and the disk controllers and software protection methods that were common to such platforms. At least initially, this library will focus on disk image formats that are commonly associated with the IBM PC platform.
At least partial support for the following disk images is under development:
Sector-based images encode byte data for each sector, typically with metadata about the sector's id markers and CRC
status.
These images can support many copy-protected titles, but may fail to encode more advanced protections, sometimes produce
impossible track encodings, and are not ideal for archival purposes or research. Due to limitations of these formats,
fluxfox treats them as a special MetaSector
track type.
Bitstream images store the low-level FM or MFM encoded bit stream of each track on a diskette. These images typically can encode most protection types seen on the PC, given the appropriate metadata (weak and damaged bits), but are more complex than sector images to manipulate and write back to.
Some Bitstream-level formats, such as MFM and HFE, do not support specifying an absolute bit length. This can cause problems when emulating certain copy-protection schemes that involve precise handling of reading across the index (track wrapping).
These images are created with specialized hardware that records the raw flux transitions reported by a disk drive. This is the lowest possible level of disk image, and is ideal for archival purposes.
Flux images can be divided into two basic types, solved and unsolved flux.
Unsolved flux images are the most difficult of the three types of format to read and manipulate. Generally a lengthy conversion process is required to analyze and combine the 3-5 revolutions of each track that is typically captured with a flux capture device. This makes them less than ideal for the purposes of emulation. Unsolved images cannot really be written to in a sensible way - nor should you want to.
Solved flux images represent a post-processed flux capture where multiple revolutions have already been analyzed and combined. The resulting flux stream should represent a correct, clean read of each track. Metadata may need to be provided along with solved flux images as detection of weak bits, etc., is only possible by comparing multiple revolutions which are no longer present in a solved image. Solved flux images can technically be written to - but doing so is a complicated process.
SuperCardPro Image (SCP)
KryoFlux Stream Files (RAW)
.raw
extension, one file per track.Most floppy images used on the IBM PC used MFM encoding. Some early, 8-inch floppies used FM encoding instead, however certain disk duplicators or copy protection methods may have included FM-encoded tracks on otherwise MFM-encoded diskettes. FM-encoded tracks are not currently supported, but are planned.
Other common encodings, such as Apple's GCR encoding, are not supported as this library concentrates on support for the IBM PC.
fluxfox uses env_logger for logging output. If your application also uses
env_logger, you will see fluxfox's messages along with your own. If fluxfox's output is too noisy,
you can add fluxfox=error
to your RUST_LOG
environment variable to limit output to only critical error messages.
I'm working on a basic disk editor, called ffedit, powered by fluxfox's API. ffedit is a TUI application, using Ratatui for its interface. This editor is in very early stages.
fluxfox can produce a graphical visualization of a disk image if the image is of bitstream resolution or higher and includes MFM-encoded data. This currently encompasses PRI, MFM and HFE disk image formats.
Visualization requires the viz
feature to be specified.
An included example, imgviz
, is a command-line utility that can produce a visualization and save it to PNG.
The following command will run imgviz
and produce a 1024x1024 (or 2048x1024) resolution visualization with 4x
supersampling named output.png
:
cargo run -r -p imgviz -- -i "input.pri" -o="output.png" --angle=2.88 --hole_ratio=0.66 --index_hole --data --metadata --decode --resolution=2048 --ss=4
angle
parameter determines the angle of the index mark on the unit circle for head #0. An angle of 0 is default
and will place the index mark on the right side (the 3 o'clock position, similar to HxC)hole_ratio
parameter determines the relative size of the inner radius to the outer radius. A ratio of 0.66 is
approximately accurate for a 5.25" diskette, mapping to 22mm of servo travel. You may prefer to reduce this factor for
visualization purposes.index_hole
will render a circle representing the position of the index hole on the diskette.data
will render the data contained in the disk image, either as MFM-encoded or decoded stream, depending on whether
decode
is specified.metadata
will overlay colored regions representing sector headers and sector data.
data
or metadata
must be supplied, or no image will be drawn!decode
will decode the MFM-encoded data, showing a representation of the actual data on disk (usually more visually
interesting)resolution
determines the final output height of the resulting image. If an image is two-sided, it may be double
this width or more.ss
specifies a supersampling factor. The image will be rendered at this multiple of the specified resolution
and
down-sampled using the fast_image_resize crate.Be sure to provide the -r
parameter to cargo run, to run imgviz in release mode. Debug mode will be very slow and use
a lot more memory!
The image will be square with a single disk surface if the image is single-sided. Otherwise, both sides of the disk will be rendered side by side.
When working with Kryoflux file sets, any file in a set may be used as an input filename.
Run with the -h
parameter to see more command-line options.
An example visualization is shown at the top of this README.