Skip to content

Latest commit

 

History

History
81 lines (63 loc) · 3.62 KB

File metadata and controls

81 lines (63 loc) · 3.62 KB

Floppy

The floppy controller emulates an Intel 82077AA CHMOS single-chip floppy disk controller. It connects to the storage stack through Disk — the same backend abstraction used by NVMe and SCSI. Data transfers use ISA DMA channel 2; interrupts use IRQ 6.

Two variants exist:

Supported media

The controller auto-detects the floppy format from the disk image byte size. See Wikipedia's list of floppy disk formats for background on these formats.

Format Capacity Sectors/track Notes
Low density (SS) 360 KB 9 Single-sided (one head)
Low density 720 KB 9
Medium density 1.2 MB 15
High density 1.44 MB 18 Most common format
DMF 1.68 MB 21 Microsoft Distribution Media Format
XDF 1.72 MB 23 Extended density (fixed 23 SPT variant)

All formats use 512-byte sectors, 80 cylinders, CHS addressing. The controller rejects images that don't match a known format size.

I/O port layout

Register offsets from base (typically 0x3F0):

Offset Read Write Purpose
+0 STATUS_A Fixed 0xFF (not emulated)
+1 STATUS_B Fixed 0xFC (no tape drives)
+2 DOR DOR Motor control, drive select, DMA gate, reset
+4 MSR DSR Main status (busy, direction, RQM) / data rate select
+5 DATA DATA Command/parameter/result FIFO (16-byte)
+7 DIR CCR Disk change signal / config control

The controller claims port 0x3F7 for DIR/CCR separately from the 6-byte base region, because 0x3F6 is shared with the IDE controller's alternate status register.

Limitations and deviations

The real 82077AA supports four drives; OpenVMM supports one. The emulator implements a pragmatic subset of the command set — enough for MS-DOS, Windows, and Linux floppy drivers to detect the controller, identify media, and perform read/write/format operations. Commands that interact with physical media timing (perpendicular recording mode, power management) are accepted but largely no-op'd.

Key differences from real hardware:

  • No multi-drive support (real hardware supports drives 0–3).
  • Physical media timing (step rate, head load/unload from SPECIFY) is accepted but doesn't affect I/O timing.
  • CHS-to-LBA translation is straightforward — the controller doesn't emulate track-level interleave or skew.
  • STATUS_A and STATUS_B registers return fixed values rather than reflecting physical drive state.

Crates

Crate Purpose Rustdoc
floppy Full 82077AA emulator rustdoc
floppy_pcat_stub Stub controller (no drives) rustdoc
floppy_resources Config types (Resource-based instantiation not yet implemented) rustdoc

The storage pipeline page covers how the floppy controller connects to the broader disk backend abstraction.