Convert (hopefully correctly) the IBM writables.

This commit is contained in:
David Given
2021-05-15 14:26:06 +02:00
parent f46e444aa2
commit 2632668d0e
13 changed files with 474 additions and 287 deletions

View File

@@ -366,6 +366,17 @@ WRITABLES="\
brother120 \
brother240 \
ibm1440 \
ibm720 \
commodore1581 \
hplif770 \
atarist360 \
atarist370 \
atarist400 \
atarist410 \
atarist720 \
atarist740 \
atarist800 \
atarist820 \
macintosh \
"

View File

@@ -1,287 +0,0 @@
#include "globals.h"
#include "flags.h"
#include "decoders/decoders.h"
#include "encoders/encoders.h"
#include "ibm/ibm.h"
#include "writer.h"
#include "fmt/format.h"
#include <fstream>
static FlagGroup flags { &writerFlags };
static IntFlag trackLengthMs(
{ "--ibm-track-length-ms" },
"Length of a track in milliseconds.",
0);
static IntFlag sectorSize(
{ "--ibm-sector-size" },
"Size of the sectors to write (bytes).",
0);
static BoolFlag emitIam(
{ "--ibm-emit-iam" },
"Whether to emit an IAM record at the start of the track.",
false);
static IntFlag startSectorId(
{ "--ibm-start-sector-id" },
"Sector ID of first sector.",
1);
static IntFlag clockRateKhz(
{ "--ibm-clock-rate-khz" },
"Clock rate of data to write.",
0);
static BoolFlag useFm(
{ "--ibm-use-fm" },
"Write in FM mode, rather than MFM.",
false);
static HexIntFlag idamByte(
{ "--ibm-idam-byte" },
"16-bit RAW bit pattern to use for the IDAM ID byte",
0);
static HexIntFlag damByte(
{ "--ibm-dam-byte" },
"16-bit RAW bit pattern to use for the DAM ID byte",
0);
static IntFlag gap0(
{ "--ibm-gap0-bytes" },
"Size of gap 0 (the pre-index gap)",
0);
static IntFlag gap1(
{ "--ibm-gap1-bytes" },
"Size of gap 1 (the post-index gap).",
0);
static IntFlag gap2(
{ "--ibm-gap2-bytes" },
"Size of gap 2 (the post-ID gap).",
0);
static IntFlag gap3(
{ "--ibm-gap3-bytes" },
"Size of gap 3 (the post-data or format gap).",
0);
static StringFlag sectorSkew(
{ "--ibm-sector-skew" },
"Order to emit sectors.",
"");
static BoolFlag swapSides(
{ "--ibm-swap-sides" },
"Swap sides while writing. Needed for Commodore 1581, CMD FD-2000, Thomson TO7.",
false);
/* --- IBM disks ----------------------------------------------------------- */
static void set_ibm_defaults()
{
sectorSize.setDefaultValue(512);
emitIam.setDefaultValue(true);
idamByte.setDefaultValue(0x5554);
damByte.setDefaultValue(0x5545);
gap0.setDefaultValue(80);
gap1.setDefaultValue(50);
gap2.setDefaultValue(22);
gap3.setDefaultValue(80);
swapSides.setDefaultValue(false);
}
static ActionFlag preset1440(
{ "--ibm-preset-1440" },
"Preset parameters to a PC 3.5\" 1440kB disk.",
[] {
setWriterDefaultInput(":c=80:h=2:s=18:b=512");
trackLengthMs.setDefaultValue(200);
clockRateKhz.setDefaultValue(500);
sectorSkew.setDefaultValue("0123456789abcdefgh");
set_ibm_defaults();
});
static ActionFlag preset720(
{ "--ibm-preset-720" },
"Preset parameters to a PC 3.5\" 720kB disk.",
[] {
setWriterDefaultInput(":c=80:h=2:s=9:b=512");
trackLengthMs.setDefaultValue(200);
clockRateKhz.setDefaultValue(250);
sectorSkew.setDefaultValue("012345678");
set_ibm_defaults();
});
/* --- Commodore disks ----------------------------------------------------- */
static ActionFlag presetCBM1581(
{ "--ibm-preset-commodore-1581" },
"Preset parameters to a Commodore 3.5\" 800kB 1581 disk.",
[] {
setWriterDefaultInput(":c=80:h=2:s=10:b=512");
trackLengthMs.setDefaultValue(200);
sectorSize.setDefaultValue(512);
startSectorId.setDefaultValue(1);
emitIam.setDefaultValue(false);
clockRateKhz.setDefaultValue(250);
idamByte.setDefaultValue(0x5554);
damByte.setDefaultValue(0x5545);
gap0.setDefaultValue(80);
gap1.setDefaultValue(80); //as emitIam is false this value remains unused
gap2.setDefaultValue(22);
gap3.setDefaultValue(34);
sectorSkew.setDefaultValue("0123456789");
swapSides.setDefaultValue(true);
});
/* --- HP-LIF ----------------------------------------------------- */
static ActionFlag presetHPLIF770(
{ "--ibm-preset-hp-lif-770" },
"Preset parameters to a HP-LIF 3.5\" 770kB HP disk.",
[] {
setWriterDefaultDest(":d=0:s=0-1:t=0-76");
setWriterDefaultInput(":c=77:h=2:s=5:b=1024");
trackLengthMs.setDefaultValue(200);
sectorSize.setDefaultValue(1024);
startSectorId.setDefaultValue(1);
emitIam.setDefaultValue(true);
clockRateKhz.setDefaultValue(250);
idamByte.setDefaultValue(0x5554);
damByte.setDefaultValue(0x5545);
gap0.setDefaultValue(80);
gap1.setDefaultValue(50); //as emitIam is false this value remains unused
gap2.setDefaultValue(22);
gap3.setDefaultValue(44);
sectorSkew.setDefaultValue("01234");
swapSides.setDefaultValue(false);
});
/* --- Atari ST disks ------------------------------------------------------ */
static void set_atari_defaults()
{
trackLengthMs.setDefaultValue(200);
sectorSize.setDefaultValue(512);
startSectorId.setDefaultValue(1);
emitIam.setDefaultValue(false);
clockRateKhz.setDefaultValue(250);
idamByte.setDefaultValue(0x5554);
damByte.setDefaultValue(0x5545);
gap0.setDefaultValue(80);
gap1.setDefaultValue(80); //as emitIam is false this value remains unused
gap2.setDefaultValue(22);
gap3.setDefaultValue(34);
swapSides.setDefaultValue(true);
}
static ActionFlag presetAtariST360(
{ "--ibm-preset-atarist-360" },
"Preset parameters to an Atari ST 3.5\" 360kB disk.",
[] {
setWriterDefaultDest(":d=0:s=0:t=0-79");
setWriterDefaultInput(":c=80:h=1:s=9:b=512");
sectorSkew.setDefaultValue("012345678");
set_atari_defaults();
});
static ActionFlag presetAtariST370(
{ "--ibm-preset-atarist-380" },
"Preset parameters to an Atari ST 3.5\" 370kB disk.",
[] {
setWriterDefaultDest(":d=0:s=0:t=0-81");
setWriterDefaultInput(":c=82:h=1:s=9:b=512");
sectorSkew.setDefaultValue("012345678");
set_atari_defaults();
});
static ActionFlag presetAtariST400(
{ "--ibm-preset-atarist-400" },
"Preset parameters to an Atari ST 3.5\" 400kB disk.",
[] {
setWriterDefaultDest(":d=0:s=0:t=0-79");
setWriterDefaultInput(":c=80:h=1:s=10:b=512");
sectorSkew.setDefaultValue("0123456789");
set_atari_defaults();
});
static ActionFlag presetAtariST410(
{ "--ibm-preset-atarist-410" },
"Preset parameters to an Atari ST 3.5\" 410kB disk.",
[] {
setWriterDefaultDest(":d=0:s=0:t=0-81");
setWriterDefaultInput(":c=82:h=1:s=10:b=512");
sectorSkew.setDefaultValue("0123456789");
set_atari_defaults();
});
static ActionFlag presetAtariST720(
{ "--ibm-preset-atarist-720" },
"Preset parameters to an Atari ST 3.5\" 720kB disk.",
[] {
setWriterDefaultDest(":d=0:s=0-1:t=0-79");
setWriterDefaultInput(":c=80:h=2:s=9:b=512");
sectorSkew.setDefaultValue("012345678");
set_atari_defaults();
});
static ActionFlag presetAtariST740(
{ "--ibm-preset-atarist-740" },
"Preset parameters to an Atari ST 3.5\" 740kB disk.",
[] {
setWriterDefaultDest(":d=0:s=0-1:t=0-81");
setWriterDefaultInput(":c=82:h=2:s=9:b=512");
sectorSkew.setDefaultValue("012345678");
set_atari_defaults();
});
static ActionFlag presetAtariST800(
{ "--ibm-preset-atarist-800" },
"Preset parameters to an Atari ST 3.5\" 800kB disk.",
[] {
setWriterDefaultDest(":d=0:s=0-1:t=0-79");
setWriterDefaultInput(":c=80:h=2:s=10:b=512");
sectorSkew.setDefaultValue("0123456789");
set_atari_defaults();
});
static ActionFlag presetAtariST820(
{ "--ibm-preset-atarist-820" },
"Preset parameters to an Atari ST 3.5\" 820kB disk.",
[] {
setWriterDefaultDest(":d=0:s=0-1:t=0-81");
setWriterDefaultInput(":c=82:h=2:s=10:b=512");
sectorSkew.setDefaultValue("0123456789");
set_atari_defaults();
});
int mainWriteIbm(int argc, const char* argv[])
{
setWriterDefaultDest(":d=0:t=0-79:s=0-1");
flags.parseFlags(argc, argv);
IbmParameters parameters;
parameters.trackLengthMs = trackLengthMs;
parameters.sectorSize = sectorSize;
parameters.emitIam = emitIam;
parameters.startSectorId = startSectorId;
parameters.clockRateKhz = clockRateKhz;
parameters.useFm = useFm;
parameters.idamByte = idamByte;
parameters.damByte = damByte;
parameters.gap0 = gap0;
parameters.gap1 = gap1;
parameters.gap2 = gap2;
parameters.gap3 = gap3;
parameters.sectorSkew = sectorSkew;
parameters.swapSides = swapSides;
IbmEncoder encoder(parameters);
writeDiskCommand(encoder);
return 0;
}

View File

@@ -0,0 +1,43 @@
input {
file {
filename: "atarist360.img"
img {
format {
sectors: 9
sector_size: 512
}
tracks: 80
sides: 1
}
}
}
output {
disk {
drive {}
}
}
encoder {
ibm {
track_length_ms: 200
clock_rate_khz: 250
emit_iam: false
gap0: 80
gap2: 22
gap3: 34
sector_skew: "012345678"
swap_sides: true
}
}
cylinders {
start: 0
end: 79
}
heads {
start: 0
end: 0
}

View File

@@ -0,0 +1,43 @@
input {
file {
filename: "atarist370.img"
img {
format {
sectors: 9
sector_size: 512
}
tracks: 82
sides: 1
}
}
}
output {
disk {
drive {}
}
}
encoder {
ibm {
track_length_ms: 200
clock_rate_khz: 250
emit_iam: false
gap0: 80
gap2: 22
gap3: 34
sector_skew: "012345678"
swap_sides: true
}
}
cylinders {
start: 0
end: 81
}
heads {
start: 0
end: 0
}

View File

@@ -0,0 +1,43 @@
input {
file {
filename: "atarist400.img"
img {
format {
sectors: 10
sector_size: 512
}
tracks: 80
sides: 1
}
}
}
output {
disk {
drive {}
}
}
encoder {
ibm {
track_length_ms: 200
clock_rate_khz: 250
emit_iam: false
gap0: 80
gap2: 22
gap3: 34
sector_skew: "0123456789"
swap_sides: true
}
}
cylinders {
start: 0
end: 79
}
heads {
start: 0
end: 0
}

View File

@@ -0,0 +1,43 @@
input {
file {
filename: "atarist410.img"
img {
format {
sectors: 10
sector_size: 512
}
tracks: 82
sides: 1
}
}
}
output {
disk {
drive {}
}
}
encoder {
ibm {
track_length_ms: 200
clock_rate_khz: 250
emit_iam: false
gap0: 80
gap2: 22
gap3: 34
sector_skew: "0123456789"
swap_sides: true
}
}
cylinders {
start: 0
end: 81
}
heads {
start: 0
end: 0
}

View File

@@ -0,0 +1,43 @@
input {
file {
filename: "atarist720.img"
img {
format {
sectors: 9
sector_size: 512
}
tracks: 80
sides: 2
}
}
}
output {
disk {
drive {}
}
}
encoder {
ibm {
track_length_ms: 200
clock_rate_khz: 250
emit_iam: false
gap0: 80
gap2: 22
gap3: 34
sector_skew: "012345678"
swap_sides: true
}
}
cylinders {
start: 0
end: 79
}
heads {
start: 0
end: 1
}

View File

@@ -0,0 +1,43 @@
input {
file {
filename: "atarist740.img"
img {
format {
sectors: 9
sector_size: 512
}
tracks: 82
sides: 2
}
}
}
output {
disk {
drive {}
}
}
encoder {
ibm {
track_length_ms: 200
clock_rate_khz: 250
emit_iam: false
gap0: 80
gap2: 22
gap3: 34
sector_skew: "012345678"
swap_sides: true
}
}
cylinders {
start: 0
end: 81
}
heads {
start: 0
end: 1
}

View File

@@ -0,0 +1,43 @@
input {
file {
filename: "atarist800.img"
img {
format {
sectors: 10
sector_size: 512
}
tracks: 80
sides: 2
}
}
}
output {
disk {
drive {}
}
}
encoder {
ibm {
track_length_ms: 200
clock_rate_khz: 250
emit_iam: false
gap0: 80
gap2: 22
gap3: 34
sector_skew: "0123456789"
swap_sides: true
}
}
cylinders {
start: 0
end: 79
}
heads {
start: 0
end: 1
}

View File

@@ -0,0 +1,43 @@
input {
file {
filename: "atarist820.img"
img {
format {
sectors: 10
sector_size: 512
}
tracks: 82
sides: 2
}
}
}
output {
disk {
drive {}
}
}
encoder {
ibm {
track_length_ms: 200
clock_rate_khz: 250
emit_iam: false
gap0: 80
gap2: 22
gap3: 34
sector_skew: "0123456789"
swap_sides: true
}
}
cylinders {
start: 0
end: 81
}
heads {
start: 0
end: 1
}

View File

@@ -0,0 +1,41 @@
input {
file {
filename: "commodore1581.img"
img {
format {
sectors: 10
sector_size: 512
}
}
}
}
output {
disk {
drive {}
}
}
encoder {
ibm {
track_length_ms: 200
clock_rate_khz: 250
emit_iam: false
gap0: 80
gap2: 22
gap3: 34
sector_skew: "012345678"
swap_sides: true
}
}
cylinders {
start: 0
end: 79
}
heads {
start: 0
end: 1
}

View File

@@ -0,0 +1,42 @@
input {
file {
filename: "hplif770.img"
img {
format {
sectors: 5
sector_size: 1024
}
tracks: 77
sides: 2
}
}
}
output {
disk {
drive {}
}
}
encoder {
ibm {
track_length_ms: 200
clock_rate_khz: 250
sector_size: 1024
gap0: 80
gap2: 22
gap3: 44
sector_skew: "01234"
}
}
cylinders {
start: 0
end: 76
}
heads {
start: 0
end: 1
}

View File

@@ -0,0 +1,36 @@
input {
file {
filename: "ibm720.img"
img {
format {
sectors: 9
sector_size: 512
}
}
}
}
output {
disk {
drive {}
}
}
encoder {
ibm {
track_length_ms: 200
clock_rate_khz: 250
sector_skew: "012345678"
}
}
cylinders {
start: 0
end: 79
}
heads {
start: 0
end: 1
}