# S6 FPGA / S5 ARM release

Released September 19, 2026 after the owner's 48-hour 60 MHz hardware test.
Tag: **setup-s6-20260919**. This is the exact FPGA and ARM pair read back from
the owner's SD card; neither binary was rebuilt for publication.

FPGA **PI FMG260917S650Mhz** retains the S5 clock/OSD ABI and pairs with the
unchanged **MM2609S5** ARM firmware. Default 50 MHz and all five turbo profiles
are retained. No ARM update is required when MM2609S5 is already installed.

| Component | OSD version | Download | SHA-256 |
| --- | --- | --- | --- |
| FPGA | PI FMG260917S650Mhz | [MINIMIG1.BIN](MINIMIG1.BIN) | `14750733c8013bf55370ad2f76af5d0f8ee72e75ed1603f654c328452970b686` |
| ARM | MM2609S5 | [FIRMWARE.UPG](FIRMWARE.UPG) | `cf9d0949eacf810d34c7d66c60acf164702361aaff30bb78916a81b7d1a1afd5` |

Target: **XC3S400-4-PQ208 six-SRAM Minimig**, AT91SAM7S256 controller.

## Included setup interface and input features

The "ARM interface" is a versioned extension of the existing MIA/SPI link
between the AT91 ARM controller and FPGA; it is not a new physical connector
or electrical interface. This S6 image advertises the `MS` signature, ABI 1
and feature mask `0x001D`:

| Bit | Advertised capability | Release behaviour |
| ---: | --- | --- |
| 0 | Clock control | Normal 7 MHz and Turbo 20/30/40/50/60 MHz selection |
| 2 | Compact OSD | Centered 64×16 character/style display with the Minimig cross |
| 3 | Live clock status | Readback of the settled profile and Normal/Turbo state |
| 4 | 60 MHz profile | 60.2972184 MHz option exposed to compatible ARM firmware |

MM2609S5 discovers those capabilities from the signature, ABI and mask rather
than from a version-string comparison. The OSD shows both ARM and FPGA
versions, stages a clock choice until **Apply clock & reset**, saves the choice
in the existing 124-byte settings layout, and reports the actually applied
clock instead of assuming that a request succeeded. Old FPGA images fall back
to the legacy OSD and receive no profile commands; new FPGA images retain the
legacy OSD protocol for old ARM firmware.

The retained setup firmware also provides changed-row OSD updates (a normal
selection move drops from 2,193 to 258 SPI bytes), and FPGA metadata/status
reads do not take ownership of the Amiga memory bus. Hard-disk choices include
HDF files, the whole SD card, primary MBR partitions 1–4, and partition-backed
HDFs with generated RDB metadata. Selecting a raw mode does not format or
repartition the card; GPT and extended/logical MBR partitions are not
implemented.

S6 also includes the native **Amiga quadrature mouse** decoder on joystick/DB9
port 1. Motion or a native left click selects that input automatically; a PS/2
left click returns control to the existing PS/2 mouse. Left/right buttons,
8-bit X/Y counters, wraparound, `JOYTEST`, and the digital-joystick truth table
are preserved. The six-signal DB9 interface has no native middle-button input,
and the mouse or adapter must emit Amiga quadrature signals—it is not a USB
decoder. See the [pinout and protocol details](docs/quadrature-mouse.txt).

The released regression suite passes all 1,840 quadrature-mouse checks across
1,692 signal steps, including both axes and directions, counter wrap and
atomic reads, every digital-joystick direction combination, buttons, PS/2
switching and unchanged port 2 decoding. This is RTL/regression verification;
the 48-hour owner hardware result below qualifies the exact core at 60 MHz
with Armour-Geddon, not a separate physical mouse or storage-device test.

## Targeted changes

S5's read-completion-to-cache-write-enable path had only +0.511 ns slack at
60 MHz, crossing from a rising-edge synchronizer into falling-edge BRAM.
S6 adds a falling-edge ready register after the existing two rising-edge
synchronizer stages. Refill control then gets a full CPU cycle before BRAM
commit. The external ACK still follows the actual fill receipt. Uncached
reads take one additional CPU cycle; cache-hit timing is unchanged. The
extra stage also increases held-data settling time. Abort clearing and the
registered-word lifetime are retained.

S5's longest chipset path ran from the floppy FIFO write pointer through
DMA selection to SRAM write-enable: 19 logic levels and +0.281 ns slack.
S6 registers the post-edge full flag from both next pointers. This preserves
full/empty/count and data behaviour, including simultaneous transfers and
pointer wrap, while removing pointer comparison from the DMA output path.

CPU frequency constraints, ACK/output budgets, jitter reserve and existing
Normal-only classifications are unchanged. No new timing exception is added.
The read-capture audit now checks the ready-stage half-cycle, its full-cycle
receipt path and the longer 2.5-cycle refill/3-cycle ACK lower bounds. Source
proofs reject bypasses of the new admission/receipt stage.

## Checks

The FIFO test covers 208198 cycles, full/drain, simultaneous read/write and
wrap. CPU-return tests check aborts, release skew, ownership, data hold and
refill-before-ACK, with five mutation controls. The release-skew negative
control uses the opposite CCK parity to compensate for the extra Normal
read cycle. The late-write-strobe negative control likewise uses phase 0
and a paired unmodified-core check after the changed read latency shifted
its later write alignment. A separate stress runner performs 100000 CPU/cache reads and
writes at each of 40, 50 and 60 MHz using the existing pin-delay model.

The full FPGA regression suite, additional CPU-return/SRAM/retirement checks
at 40 and 60 MHz, and all three 100000-transfer stress runs pass. The full
suite includes the default 50 MHz, Normal mode, all profile transitions,
peripherals and source-proof negative controls. The ARM build and host tests
also pass, including reading the new S6 FPGA identity. The rebuilt ARM raw
and upgrade images are byte-for-byte identical to released MM2609S5.

The initial stress harness declared its adjustable parameters in a form
that prevented overrides; those parameters now appear in the module's
parameter list. The late-strobe negative control needed the phase adjustment
described above. Both test-only corrections were rerun successfully; their
initial logs and final results are retained. The 28 FPGA build inputs stayed
identical throughout qualification.

## Routed timing

The selected implementation is **batch B, seed 8**, built from
`07b02e051cee8a6400fd42afd2c5459de5c84b5d`. Three groups of four simultaneous
ISE compiles produced 12 routes from exactly the same FPGA inputs. Main,
Normal and component timing each have zero errors for B/8, and all seven
independent route audits pass. Failed routes and the other qualified
candidates are preserved in the evidence archive.

| Timing measure | Released S5 F/8 | S6 B/8 |
| --- | ---: | ---: |
| CPU slack, 16.584513 ns period | +0.511 ns | +2.576 ns |
| Chipset 28 MHz slack | +0.281 ns | +3.798 ns |
| Chipset 7 MHz slack | +2.783 ns | +5.777 ns |
| Read-return output slack, 16 ns budget | +1.393 ns | +1.886 ns |
| ACK output slack, 5.75 ns budget | +0.359 ns | +0.095 ns |
| Worst ACK output delay | 5.391 ns | 5.655 ns |
| 120 MHz divider slack | +2.126 ns | +1.005 ns |
| Minimum external ACK reference margin at 60 MHz | +1.079 ns | +1.040 ns |
| Clock-mux minimum margin | +3.072 ns | +3.381 ns |

CPU and chipset headroom improve substantially. ACK/output and divider
headroom are lower, so this is not an improvement to every path. The ACK
reference includes the routed forwarded clock, the existing 5 ns setup
reference and 0.5 ns reserve; its worst margin loses 0.039 ns. B/8 was chosen
for its balance of CPU/chipset margin and external bus timing. C/11's raw ACK
delay was lower, but its minimum external ACK reference margin was only
0.858 ns after accounting for its different clock route.

The S6 B/8 worst CPU path is clock-startup control to `CPU1/t_as`. The old
synchronizer-to-BRAM half-cycle refill path has been replaced by the ready
stage. Its synchronizer-to-ready setup margin is 5.982 ns and ready-to-receipt
setup margin is 13.558 ns, including the capture audit's 0.5 ns reserve.
The minimum held-data-to-refill bundle margin is 33.952 ns. Main timing
continues to check the actual BRAM controls independently.

B/8 uses 5531 LUTs, 3432 slices, 16 BRAMs, 6 multipliers and 6 global buffers.
ISE warning identifiers and counts match S5, including 61 synthesis warnings;
none were suppressed. The ARM rebuild has no compiler warnings. The package
records the exact binary/source hashes, original reports, all 12 sweep
results, functional tests and route-audit evidence.

## Hardware qualification

The owner reports **48 hours at 60.2972184 MHz testing Armour-Geddon with no
glitches** using the exact `MINIMIG1.BIN` above. That directly exceeds the
previous delayed-failure window observed with S5 for this board and workload.
It does not guarantee every processor, board, temperature or workload; the
external timing reference is not an electrical characterization of an
overclocked 68SEC000 or the PCB.

## Installation and clocks

Replace the SD-card root `MINIMIG1.BIN` with the released image and restart.
If ARM **MM2609S5** is already installed, no ARM update is needed. The package
includes that same `FIRMWARE.UPG` for boards still on older firmware; install
it through the existing ARM upgrade menu if needed. The raw
`ARM_MM2609S5.bin` is for SAM-BA, not the menu updater.

Confirm FPGA **PI FMG260917S650Mhz** and ARM **MM2609S5** in the OSD. The FPGA
version suffix is the build default; the CPU clock footer shows the applied
speed. In Settings → Chipset select Turbo and the desired speed, then
**Apply clock & reset**. Save Settings retains that selection.

Keep the same RAM configuration and the enabled slow-RAM-priority command in
User-Startup for comparable results. FAST RAM remains uncached; the additional
uncached-read cycle may reduce its throughput. Cold boots, Normal mode, speed
changes and other workloads remain useful checks beyond the reported run.

To return to S5, copy `ROLLBACK-S5.BIN` to the SD-card root as `MINIMIG1.BIN`
and restart. ARM MM2609S5 can stay installed. The package changes no disk
image or startup configuration. S5's original release remains preserved;
its reported instability is recorded in the updated hardware notes.

## Files and provenance

| File | Contents |
| --- | --- |
| [MINIMIG1.bit](MINIMIG1.bit) | Matching original Xilinx BIT |
| [ARM_MM2609S5.bin](ARM_MM2609S5.bin) | Raw ARM Flash image for SAM-BA |
| [minimig-198-software-source-s6.zip (separate download)](minimig-198-software-source-s6.zip (separate download)) | Frozen matching sources, timing evidence and test logs |
| [SOURCE-COMMIT.txt](SOURCE-COMMIT.txt) | Archived source/documentation snapshot |
| [fpga-sources.sha256](fpga-sources.sha256) | Exact 28 FPGA build-input hashes |
| [arm-sources.json](arm-sources.json) | ARM source snapshot hashes |
| [timing-comparison.json](timing-comparison.json) | All 12 S6 implementation results and S5 comparison |
| [release-receipt.json](release-receipt.json) | Promotion identity, SD-card readback and hardware result |
| [original-build-receipt.json](original-build-receipt.json) | Unmodified pre-promotion candidate receipt |
| [SHA256SUMS](SHA256SUMS) | Checksums for every published file |
| [ROLLBACK-S5.BIN](ROLLBACK-S5.BIN) | Previous released FPGA |
| [THIRD_PARTY.txt](THIRD_PARTY.txt), [COPYING](COPYING) | Attribution and license |

The FPGA was built from `07b02e051cee8a6400fd42afd2c5459de5c84b5d`.
The source archive and original receipt preserve the candidate's historical
status. Release documentation and `release-receipt.json` record the later
hardware result and promotion; production sources and all binary/evidence
files are unchanged.

```sh
(cd releases/setup-s6 && sha256sum -c SHA256SUMS)
sha256sum -c releases/setup-s6/fpga-sources.sha256
```
