diff --git a/README.md b/README.md
index 484b5935..f02797ec 100644
--- a/README.md
+++ b/README.md
@@ -136,7 +136,7 @@ choices because they can store multiple types of file system.
| [`rolandd20`](doc/disk-rolandd20.md) | Roland D20: 3.5" electronic synthesiser disks | 🦄 | 🦖 | ROLAND |
| [`rx50`](doc/disk-rx50.md) | Digital RX50: 400kB 5.25" 80-track 10-sector SSDD | 🦖 | 🦖 | |
| [`smaky6`](doc/disk-smaky6.md) | Smaky 6: 308kB 5.25" 77-track 16-sector SSDD, hard sectored | 🦖 | | SMAKY6 |
-| [`tartu`](doc/disk-tartu.md) | Tartu: The Palivere and variations | 🦄 | | CPMFS |
+| [`tartu`](doc/disk-tartu.md) | Tartu: The Palivere and variations | 🦄 | 🦖 | CPMFS |
| [`tids990`](doc/disk-tids990.md) | Texas Instruments DS990: 1126kB 8" DSSD | 🦖 | 🦖 | |
| [`tiki`](doc/disk-tiki.md) | Tiki 100: CP/M | | | CPMFS |
| [`victor9k`](doc/disk-victor9k.md) | Victor 9000 / Sirius One: 1224kB 5.25" DSDD GCR | 🦖 | 🦖 | |
diff --git a/doc/disk-tartu.md b/doc/disk-tartu.md
index ddfecbfb..4831d4db 100644
--- a/doc/disk-tartu.md
+++ b/doc/disk-tartu.md
@@ -22,7 +22,7 @@ density, using MFM and with up to 780kB on a double-sided 80 track disk.
-FluxEngine supports reading Tartu disks with CP/M filesystem access.
+FluxEngine supports reading and writing Tartu disks with CP/M filesystem access.
## Options
diff --git a/scripts/build.py b/scripts/build.py
index 652d52aa..4cfc2116 100644
--- a/scripts/build.py
+++ b/scripts/build.py
@@ -1,11 +1,11 @@
-from build.ab import Rule, normalrule, Targets
+from build.ab import Rule, normalrule, Targets, TargetsMap
from build.c import cxxprogram, HostToolchain
encoders = {}
@Rule
-def protoencode(self, name, srcs: Targets, proto, symbol):
+def protoencode_single(self, name, srcs: Targets, proto, symbol):
if proto not in encoders:
r = cxxprogram(
name="protoencode_" + proto,
@@ -34,6 +34,27 @@ def protoencode(self, name, srcs: Targets, proto, symbol):
)
+@Rule
+def protoencode(self, name, proto, srcs: TargetsMap, symbol):
+ encoded = [
+ protoencode_single(
+ name=f"{k}_cc",
+ srcs=[v],
+ proto=proto,
+ symbol=f"{symbol}_{k}_pb",
+ )
+ for k, v in srcs.items()
+ ]
+
+ normalrule(
+ replaces=self,
+ ins=encoded,
+ outs=[name + ".cc"],
+ commands=["cat {ins} > {outs}"],
+ label="CONCAT",
+ )
+
+
cxxprogram(
name="mkdoc",
srcs=["./mkdoc.cc"],
diff --git a/scripts/protoencode.cc b/scripts/protoencode.cc
index 48343441..bd81f0e6 100644
--- a/scripts/protoencode.cc
+++ b/scripts/protoencode.cc
@@ -121,11 +121,12 @@ int main(int argc, const char* argv[])
}
auto data = message.SerializeAsString();
+ auto name = argv[3];
output << "#include \"lib/globals.h\"\n"
<< "#include \"lib/proto.h\"\n"
<< "#include \n"
- << "static const uint8_t rawData[] = {";
+ << "static const uint8_t " << name << "_rawData[] = {";
int count = 0;
for (char c : data)
@@ -140,12 +141,12 @@ int main(int argc, const char* argv[])
}
output << "\n};\n";
- output << "extern const std::string_view " << argv[3] << "_data;\n";
- output << "const std::string_view " << argv[3]
- << "_data = std::string_view((const char*)rawData, " << data.size()
+ output << "extern const std::string_view " << name << "_data;\n";
+ output << "const std::string_view " << name
+ << "_data = std::string_view((const char*)" << name << "_rawData, " << data.size()
<< ");\n";
- output << "extern const ConfigProto " << argv[3] << ";\n";
- output << "const ConfigProto " << argv[3] << " = parseConfigBytes("
+ output << "extern const ConfigProto " << name << ";\n";
+ output << "const ConfigProto " << name << " = parseConfigBytes("
<< argv[3] << "_data);\n";
return 0;
diff --git a/src/formats/build.py b/src/formats/build.py
index 02412d6a..06284aea 100644
--- a/src/formats/build.py
+++ b/src/formats/build.py
@@ -52,19 +52,16 @@
label="MKTABLE",
)
-encoded = [
- protoencode(
- name=f"{name}_cc",
- srcs=[f"./{name}.textpb"],
- proto="ConfigProto",
- symbol=f"formats_{name}_pb",
- )
- for name in formats
-]
+protoencode(
+ name="formats_cc",
+ srcs={name: f"./{name}.textpb" for name in formats},
+ proto="ConfigProto",
+ symbol="formats",
+)
cxxlibrary(
name="formats",
- srcs=[".+table_cc"] + encoded,
+ srcs=[".+formats_cc", ".+table_cc"],
deps=["+lib", "lib+config_proto_lib"],
)
diff --git a/src/gui/drivetypes/build.py b/src/gui/drivetypes/build.py
index 5e82721d..4e5eb360 100644
--- a/src/gui/drivetypes/build.py
+++ b/src/gui/drivetypes/build.py
@@ -9,7 +9,7 @@
]
normalrule(
- name="drivetypes_cc",
+ name="drivetypes_table_cc",
ins=[f"./{name}.textpb" for name in drivetypes],
deps=["scripts/mktable.sh"],
outs=["table.cc"],
@@ -21,14 +21,16 @@
label="MKTABLE",
)
-encoded = [
- protoencode(
- name=f"{name}_cc",
- srcs=[f"./{name}.textpb"],
- proto="ConfigProto",
- symbol=f"drivetypes_{name}_pb",
- )
- for name in drivetypes
-]
-cxxlibrary(name="drivetypes", srcs=[".+drivetypes_cc"] + encoded, deps=["+lib"])
+protoencode(
+ name="drivetypes_cc",
+ srcs={name: f"./{name}.textpb" for name in drivetypes},
+ proto="ConfigProto",
+ symbol="drivetypes",
+)
+
+cxxlibrary(
+ name="drivetypes",
+ srcs=[".+drivetypes_cc", ".+drivetypes_table_cc"],
+ deps=["+lib"],
+)
diff --git a/tests/build.py b/tests/build.py
index 1daea37e..2ca8d10f 100644
--- a/tests/build.py
+++ b/tests/build.py
@@ -2,7 +2,7 @@
from build.c import cxxprogram
from build.protobuf import proto, protocc
from build.utils import test
-from scripts.build import protoencode
+from scripts.build import protoencode_single
proto(
@@ -49,7 +49,7 @@
name="proto_test_exe",
srcs=[
"./proto.cc",
- protoencode(
+ protoencode_single(
name="testproto_cc",
srcs=["./testproto.textpb"],
proto="TestProto",