fluxhead 0.1.0

A library to decode g64 images
Documentation
<p align="center">
  <img src="fluxhead.png" alt="Fluxhead" width="100%" />
</p>

# Fluxhead


A Rust library and toolkit for parsing and inspecting Commodore 1541/CBM DOS GCR data from G64 disk images. It provides helpers to read G64 headers, track locations, and decode GCR-encoded track headers and data into their binary representation.

## Contents

- Overview
- Features
- Limitations
- Getting Started
  - Requirements
  - Installation
  - Build
  - Run tests
- Usage
  - Quick example
  - Working with tracks
- API Overview
- Project Structure
- Development
- Contributing
- License
- Acknowledgments

## Overview

Fluxhead focuses on reading and parsing G64 disk images:
- Parse G64 headers and track location tables
- Identify CBM DOS track headers and track data markers in GCR streams
- Decode GCR into raw bytes using cbm_dos::GCR
- Provide simple structs to represent parsed header/data pairs per track

This is useful for experimental disk analysis, visualization, or building higher-level tooling for Commodore 1541 disk formats.

## Features

- G64 header parsing (tag, revision, track count, track size)
- Track location decoding (full and half tracks)
- Track scanning for CBM DOS header and data patterns (0xFF sync and identifiers)
- GCR decoding via the cbm_dos crate
- Minimal, extensible Rust API aimed at experimentation

## Limitations

- Error handling is currently limited. The parser assumes relatively well-formed inputs and may return None or skip content when encountering unexpected structures. Comprehensive error reporting and recovery are planned but not yet implemented.
- Tracks without sync marks (no 0xFF sync bytes) are currently not handled. The parser relies on sync marks to locate CBM DOS headers and data; tracks lacking sync are not decoded at this time.

## Getting Started


### Requirements

- Rust (stable). Install via https://rustup.rs
- A G64 image file if you want to run the included parsing example/tests

### Installation

Add to your Cargo.toml if using as a dependency:

```toml
[dependencies]
fluxhead = { path = "." }
```

Or, if published on crates.io in the future:

```toml
[dependencies]
fluxhead = "0.x"
```

### Build

From the repository root:

```bash
cargo build
```

### Run tests

```bash
cargo test
```

## Usage


### Quick example

The library provides a simple Fluxhead type to parse in-memory buffers and print debug details:

```rust
use fluxhead::Fluxhead;

fn main() {
    // Load a G64 file into memory and parse it
    let data = std::fs::read("path/to/disk.g64").expect("read g64");
    let mut flux = Fluxhead::new();
    flux.parse_from_buffer(&data);
}
```

If you have a path on disk and want to use the convenience method in tests (as demonstrated in the repo tests):

```rust
use fluxhead::Fluxhead;

fn parse_file(path: &str) {
    let mut flux = Fluxhead::new();
    // Parses the file and returns an optional ParsedData
    let _parsed = flux.parse_from_file(path);
}
```

### Working with tracks

Internally, the parser scans for sync patterns (0xFF bytes) and known identifiers:
- 0x52 indicates a track header (CBM DOS header block)
- 0x55 indicates a track data block

When found, it decodes the GCR-encoded segments using cbm_dos::GCR and populates simple structures:

```rust
pub struct SectorHeader {
    pub gcr_encoded_data: Vec<u8>,
    pub gcr_decoded_data: Vec<u8>,
}

pub struct SectorData {
    pub gcr_encoded_data: Vec<u8>,
    pub gcr_decoded_data: Vec<u8>,
}

pub struct Sector {
    pub header: SectorHeader,
    pub data: SectorData,
}

pub struct Track {
    pub tracks: Option<Vec<Sector>>,
    pub speed_zone: i32,
}
```

You can adapt the parsing to collect all tracks and use them downstream (e.g., integrity checks, metadata extraction).

## API Overview

Key types (see src/lib.rs):
- G64HeaderInfo: basic G64 header
- TrackLocation: offsets for full and half tracks (internal)
- G64TrackData: per-track size metadata (internal)
- Fluxhead: orchestrates loading, parsing, and decoding (currently internal)

Public items exposed for consumers:
- G64HeaderInfo
- SectorHeader, SectorData, Sector, Track
- ParsedData

The implementation uses the endian_codec and cbm_dos crates for binary and GCR decoding.

## Project Structure

- src/lib.rs: core types and parsing logic
- fluxhead.png: project banner image (displayed above)
- Cargo.toml: crate metadata and dependencies

## Development

- Format: `cargo fmt`
- Lint: `cargo clippy`
- Test: `cargo test`
- Run examples or add your own under examples/

Tips:
- Use small G64 images for quick iteration
- Enable logging/printlns as needed when exploring new disks

## Contributing

Contributions are welcome! Please open an issue or pull request. When contributing code:
- Include tests when possible
- Keep changes minimal and focused
- Adhere to Rust style guidelines

## License

Specify your preferred license here (e.g., MIT/Apache-2.0). Add the corresponding LICENSE files to the repository.

## Acknowledgments

- cbm_dos crate for GCR encoding/decoding utilities
- Commodore community documentation around G64 and CBM DOS formats