From bfe9929dd1688ad9462ebf71a1d9e849d462dfa8 Mon Sep 17 00:00:00 2001 From: David Given Date: Tue, 22 Sep 2026 22:44:47 +0200 Subject: [PATCH 1/2] Add an extremely prototype Epson QX-10 format. --- README.md | 1 + doc/disk-epsonqx10.md | 88 ++++++++ .../cowlark/fluxengine/arch/epsonqx10.textpb | 188 ++++++++++++++++++ .../cowlark/fluxengine/data/FormatsTest.java | 2 +- 4 files changed, 278 insertions(+), 1 deletion(-) create mode 100644 doc/disk-epsonqx10.md create mode 100644 java/com/cowlark/fluxengine/arch/epsonqx10.textpb diff --git a/README.md b/README.md index 13cd7b93..e14e0a35 100644 --- a/README.md +++ b/README.md @@ -128,6 +128,7 @@ choices because they can store multiple types of file system. | [`commodore`](doc/disk-commodore.md) | Commodore: 1541, 1581, 8050 and variations | 🦄 | 🦄 | CBMFS | | [`eco1`](doc/disk-eco1.md) | VDS Eco1: CP/M; 1210kB 77-track mixed format DSHD | 🦖 | | CPMFS | | [`epsonpf10`](doc/disk-epsonpf10.md) | Epson PF-10: CP/M; 3.5" 40-track DSDD | 🦖 | | CPMFS | +| [`epsonqx10`](doc/disk-epsonqx10.md) | Epson QX-10: CP/M; 5.25" 40-track DSDD | 🦖 | 🦖 | CPMFS | | [`f85`](doc/disk-f85.md) | Durango F85: 461kB 5.25" 77-track SS | 🦖 | | | | [`fb100`](doc/disk-fb100.md) | Brother FB-100: 100kB 3.5" 40-track SSSD | 🦖 | | | | [`hplif`](doc/disk-hplif.md) | Hewlett-Packard LIF: a variety of disk formats used by HP | 🦄 | 🦄 | LIF | diff --git a/doc/disk-epsonqx10.md b/doc/disk-epsonqx10.md new file mode 100644 index 00000000..0e5524c9 --- /dev/null +++ b/doc/disk-epsonqx10.md @@ -0,0 +1,88 @@ +Epson QX-10 +==== +## CP/M; 5.25" 40-track DSDD + + +The Epson QX-10 is a Z80-based CP/M microcomputer with two internal 5.25" +double-sided drives. The drives are 48 TPI, soft-sectored, double-density +MFM at 250 kbit/s and 300 RPM, with 40 usable tracks per side (tracks +0-39). The hardware lists 80 physical tracks, but the standard formats use +only 40 per side at 48 TPI. + +The QX-10 shipped with CP/M and also with Epson's Valdocs environment; +different operating system distributions used different logical geometries on +otherwise identical media, so "QX-10 format" is not a single layout. +FluxEngine distinguishes three variants found in the wild and documented in +Epson's CP/M External Reference Spec (B2.20, 24 Feb 84) and the QX-10 +User's Guide (James Hansen copy), and in the QX-10 Technical Manual +Troubleshooting guide (May 83). + +All variants are 5.25" DSDD, soft-sectored (single index hole), MFM, +250 kbit/s, 300 RPM, 48 TPI, 40 cylinders, 2 sides. Sector numbering is +1-based and the controller uses the normal IBM scheme. + +## Options + + - Format variants: + - `300`: 300kB 5.25" 40-track DSDD, 16 sectors x 256 bytes + - `380`: 380kB 5.25" 40-track DSDD, 10 sectors x 512 bytes + - `320`: 320kB 5.25" 40-track DSDD mixed bootable + +## Examples + +To read: + + - `fluxengine read -c epsonqx10 --300 -s drive:0 -o epsonqx10.img` + - `fluxengine read -c epsonqx10 --380 -s drive:0 -o epsonqx10.img` + - `fluxengine read -c epsonqx10 --320 -s drive:0 -o epsonqx10.img` + +## 320kB conventional variant (16 x 256 bytes) + +The layout most commonly meant by "Epson QX-10 format" in disk-imaging and +CP/M transfer utilities: + + * 40 tracks x 2 sides x 16 sectors x 256 bytes = 327,680 bytes + * Formatted capacity listed as 328 kbyte in the QX-10 Technical Manual + Troubleshooting guide; nominal CP/M capacity ~300 kB after reserving + 2 system tracks. + +Use this for a typical QX-10 CP/M data disk if you do not know which +variant you have. + +## 400kB alternate / Valdocs-associated variant (10 x 512 bytes) + +Identical physical geometry and rotation speed, but each track holds +10 sectors of 512 bytes (5,120 bytes/track) instead of 16 x 256 +(4,096 bytes/track): + + * 40 tracks x 2 sides x 10 sectors x 512 bytes = 409,600 bytes raw + * Nominal CP/M capacity ~380 kB after 2 system tracks. + +The Epson CP/M External Reference Spec identifies both this and the +16 x 256 layout as QX-10 formats; the BIOS listing notes the standard +implementation as 512-byte sectors with 10 sectors per track. + +## 396kB mixed-format bootable variant + +Some QX-10 system/boot media use a mixed organisation: early tracks use +256-byte sectors while later tracks use 512-byte sectors. The operating +system, directory and boot code occupy the early tracks. + +FluxEngine's profile for this is: + + * tracks 0-1 (cylinders 0-1, both sides): 16 sectors x 256 bytes + * tracks 2-39: 10 sectors x 512 bytes + +Raw capacity with that split is 4 tracks x 4,096 + 76 tracks x 5,120 = +405,504 bytes; however, this also gives the same ~380 kB of user space, +as for the 400kB format, but with less reserved operating system space. + +## References + + * [QX-10 Technical Manual Troubleshooting, May 83 (bitsavers)](http://www.bitsavers.org/pdf/epson/QX-10/QX-10_Technical_Manual_Troubleshooting_May83.pdf) + * [QX-10 Operations u1 (bitsavers)](http://www.bitsavers.org/pdf/epson/QX-10/QX-10_Operations_u1.pdf) + * [CP/M-80 Epson QX-10 External Reference Spec B2.20, 24 Feb 84 (vtda)](https://vtda.org/docs/computing/Epson/QX-10/CPM-80_Epson_QX-10_External_Reference_Spec_B2.20_24Feb84.pdf) + * [Epson QX-10 User's Guide, James Hansen (bad copy 2) (vtda)](https://vtda.org/docs/computing/Epson/QX-10/Epson_QX-10_Users_Guide_JamesHansen(bad_copy2).pdf) - mixed layout + * [QX-10 detail page](https://www.vintagecomputer.net/fjkraan/comp/qx10/detail.html) + * [PF-10 vs QX-10 note: PF-10 is 3.5" 512 bytes/sector](https://github.com/davidgiven/fluxengine/blob/master/java/com/cowlark/fluxengine/arch/epsonpf10.textpb) + diff --git a/java/com/cowlark/fluxengine/arch/epsonqx10.textpb b/java/com/cowlark/fluxengine/arch/epsonqx10.textpb new file mode 100644 index 00000000..a62d6ca5 --- /dev/null +++ b/java/com/cowlark/fluxengine/arch/epsonqx10.textpb @@ -0,0 +1,188 @@ +shortname: 'Epson QX-10' +comment: 'CP/M; 5.25" 40-track DSDD' +read_support_status: DINOSAUR +write_support_status: DINOSAUR + +documentation: +<<< +The Epson QX-10 is a Z80-based CP/M microcomputer with two internal 5.25" +double-sided drives. The drives are 48 TPI, soft-sectored, double-density +MFM at 250 kbit/s and 300 RPM, with 40 usable tracks per side (tracks +0-39). The hardware lists 80 physical tracks, but the standard formats use +only 40 per side at 48 TPI. + +The QX-10 shipped with CP/M and also with Epson's Valdocs environment; +different operating system distributions used different logical geometries on +otherwise identical media, so "QX-10 format" is not a single layout. +FluxEngine distinguishes three variants found in the wild and documented in +Epson's CP/M External Reference Spec (B2.20, 24 Feb 84) and the QX-10 +User's Guide (James Hansen copy), and in the QX-10 Technical Manual +Troubleshooting guide (May 83). + +All variants are 5.25" DSDD, soft-sectored (single index hole), MFM, +250 kbit/s, 300 RPM, 48 TPI, 40 cylinders, 2 sides. Sector numbering is +1-based and the controller uses the normal IBM scheme. +>>> + +documentation: +<<< +## 320kB conventional variant (16 x 256 bytes) + +The layout most commonly meant by "Epson QX-10 format" in disk-imaging and +CP/M transfer utilities: + + * 40 tracks x 2 sides x 16 sectors x 256 bytes = 327,680 bytes + * Formatted capacity listed as 328 kbyte in the QX-10 Technical Manual + Troubleshooting guide; nominal CP/M capacity ~300 kB after reserving + 2 system tracks. + +Use this for a typical QX-10 CP/M data disk if you do not know which +variant you have. +>>> + +documentation: +<<< +## 400kB alternate / Valdocs-associated variant (10 x 512 bytes) + +Identical physical geometry and rotation speed, but each track holds +10 sectors of 512 bytes (5,120 bytes/track) instead of 16 x 256 +(4,096 bytes/track): + + * 40 tracks x 2 sides x 10 sectors x 512 bytes = 409,600 bytes raw + * Nominal CP/M capacity ~380 kB after 2 system tracks. + +The Epson CP/M External Reference Spec identifies both this and the +16 x 256 layout as QX-10 formats; the BIOS listing notes the standard +implementation as 512-byte sectors with 10 sectors per track. +>>> + +documentation: +<<< +## 396kB mixed-format bootable variant + +Some QX-10 system/boot media use a mixed organisation: early tracks use +256-byte sectors while later tracks use 512-byte sectors. The operating +system, directory and boot code occupy the early tracks. + +FluxEngine's profile for this is: + + * tracks 0-1 (cylinders 0-1, both sides): 16 sectors x 256 bytes + * tracks 2-39: 10 sectors x 512 bytes + +Raw capacity with that split is 4 tracks x 4,096 + 76 tracks x 5,120 = +405,504 bytes; however, this also gives the same ~380 kB of user space, +as for the 400kB format, but with less reserved operating system space. +>>> + +documentation: +<<< +## References + + * [QX-10 Technical Manual Troubleshooting, May 83 (bitsavers)](http://www.bitsavers.org/pdf/epson/QX-10/QX-10_Technical_Manual_Troubleshooting_May83.pdf) + * [QX-10 Operations u1 (bitsavers)](http://www.bitsavers.org/pdf/epson/QX-10/QX-10_Operations_u1.pdf) + * [CP/M-80 Epson QX-10 External Reference Spec B2.20, 24 Feb 84 (vtda)](https://vtda.org/docs/computing/Epson/QX-10/CPM-80_Epson_QX-10_External_Reference_Spec_B2.20_24Feb84.pdf) + * [Epson QX-10 User's Guide, James Hansen (bad copy 2) (vtda)](https://vtda.org/docs/computing/Epson/QX-10/Epson_QX-10_Users_Guide_JamesHansen(bad_copy2).pdf) - mixed layout + * [QX-10 detail page](https://www.vintagecomputer.net/fjkraan/comp/qx10/detail.html) + * [PF-10 vs QX-10 note: PF-10 is 3.5" 512 bytes/sector](https://github.com/davidgiven/fluxengine/blob/master/java/com/cowlark/fluxengine/arch/epsonpf10.textpb) +>>> + +image_reader { + filename: "epsonqx10.img" + type: IMAGETYPE_IMG +} + +image_writer { + filename: "epsonqx10.img" + type: IMAGETYPE_IMG +} + +decoder { + ibm {} +} + +filesystem { + type: CPMFS + cpmfs { + filesystem_start { + track: 2 + } + block_size: 2048 + dir_entries: 64 + } +} + +option_group { + comment: "$formats" + + option { + name: "300" + comment: '300kB 5.25" 40-track DSDD, 16 sectors x 256 bytes' + set_by_default: true + + config { + layout { + format_type: FORMATTYPE_40TRACK + tracks: 40 + sides: 2 + layoutdata { + sector_size: 256 + physical { + start_sector: 1 + count: 16 + } + } + } + } + } + + option { + name: "380" + comment: '380kB 5.25" 40-track DSDD, 10 sectors x 512 bytes' + + config { + layout { + format_type: FORMATTYPE_40TRACK + tracks: 40 + sides: 2 + layoutdata { + sector_size: 512 + physical { + start_sector: 1 + count: 10 + } + } + } + } + } + + option { + name: "320" + comment: '320kB 5.25" 40-track DSDD mixed bootable' + + config { + layout { + format_type: FORMATTYPE_40TRACK + tracks: 40 + sides: 2 + layoutdata { + track: 0 + up_to_track: 1 + sector_size: 256 + physical { + start_sector: 1 + count: 16 + } + } + layoutdata { + track: 2 + up_to_track: 39 + sector_size: 512 + physical { + start_sector: 1 + count: 10 + } + } + } + } + } +} diff --git a/javatests/com/cowlark/fluxengine/data/FormatsTest.java b/javatests/com/cowlark/fluxengine/data/FormatsTest.java index 31307f0a..1c8ce3d9 100644 --- a/javatests/com/cowlark/fluxengine/data/FormatsTest.java +++ b/javatests/com/cowlark/fluxengine/data/FormatsTest.java @@ -35,7 +35,7 @@ public void returnsNullForUnknownName() @Test public void returnsAllConfigNames() { - assertThat(Formats.all()).hasSize(38); + assertThat(Formats.all()).hasSize(39); assertThat(Formats.all()).contains("ibm"); assertThat(Formats.all()).contains("_global_options"); } From 7b3baaa995ca0f1c42a0c4ee094979faa4bab91c Mon Sep 17 00:00:00 2001 From: David Given Date: Tue, 22 Sep 2026 22:59:40 +0200 Subject: [PATCH 2/2] Shrink the visualiser just a little. --- java/com/cowlark/fluxengine/gui/VisualiserPanel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/com/cowlark/fluxengine/gui/VisualiserPanel.java b/java/com/cowlark/fluxengine/gui/VisualiserPanel.java index afa5b3a4..68810dd5 100644 --- a/java/com/cowlark/fluxengine/gui/VisualiserPanel.java +++ b/java/com/cowlark/fluxengine/gui/VisualiserPanel.java @@ -42,7 +42,7 @@ public VisualiserPanel(ImageViewModel model) { this.model = model; - setPreferredSize(dimensionPts(300, 600)); + setPreferredSize(dimensionPts(250, 500)); Viewable.cast(model.getDisk()).onChange(From.ALL, it -> diskChanged()); }