Fix the broken AppleDOS double-sided disks. Allow access to side 1 on AppleDOS

volumes.
This commit is contained in:
dg
2023-03-31 18:24:03 +00:00
parent fea62178af
commit f194392f99
4 changed files with 33 additions and 20 deletions

View File

@@ -46,9 +46,9 @@ fluxengine ls appleii140 --appledos -f image.flux
In addition, some third-party systems use 80-track double sides drives, with In addition, some third-party systems use 80-track double sides drives, with
the same underlying disk format. These are supported with the `appleii640` the same underlying disk format. These are supported with the `appleii640`
profile. The complication here is that the AppleDOS filesystem only supports up profile. The complication here is that the AppleDOS filesystem only supports up
to 50 tracks, so it needs tweaking to support larger disks. FluxEngine doesn't to 50 tracks, so it needs tweaking to support larger disks. It treats the
understand these tweaks yet but they only become important when writing to second side of the disk as a completely different volume. To access these
disks, which isn't supported yet. files, use `--appledos --side1`.
[^1]: CP/M disks use the ProDOS translation for the first three tracks and a [^1]: CP/M disks use the ProDOS translation for the first three tracks and a
different translation for all the tracks thereafter. different translation for all the tracks thereafter.

View File

@@ -103,7 +103,7 @@ public:
ByteWriter bw(bytes); ByteWriter bw(bytes);
while (tstrack) while (tstrack)
{ {
Bytes ts = getLogicalSector(tstrack * 16 + tssector); Bytes ts = getAppleSector(tstrack * 16 + tssector);
ByteReader br(ts); ByteReader br(ts);
br.seek(0x0c); br.seek(0x0c);
@@ -114,7 +114,7 @@ public:
if (!track) if (!track)
goto done; goto done;
bw += getLogicalSector(track * 16 + sector); bw += getAppleSector(track * 16 + sector);
} }
tstrack = ts[1]; tstrack = ts[1];
@@ -128,7 +128,7 @@ public:
private: private:
void mount() void mount()
{ {
_vtoc = getLogicalSector(VTOC_BLOCK); _vtoc = getAppleSector(VTOC_BLOCK);
if ((_vtoc[0x27] != 122) || (_vtoc[0x36] != 0) || (_vtoc[0x37] != 1)) if ((_vtoc[0x27] != 122) || (_vtoc[0x36] != 0) || (_vtoc[0x37] != 1))
throw BadFilesystemException(); throw BadFilesystemException();
@@ -137,7 +137,7 @@ private:
int sector = _vtoc[2]; int sector = _vtoc[2];
while (track) while (track)
{ {
Bytes dir = getLogicalSector(track * 16 + sector); Bytes dir = getAppleSector(track * 16 + sector);
ByteReader br(dir); ByteReader br(dir);
br.seek(0x0b); br.seek(0x0b);
@@ -162,6 +162,12 @@ private:
throw FileNotFoundException(); throw FileNotFoundException();
} }
Bytes getAppleSector(uint32_t number, uint32_t count = 1)
{
return getLogicalSector(
number + _config.filesystem_offset_sectors(), count);
}
private: private:
const AppledosProto& _config; const AppledosProto& _config;
Bytes _vtoc; Bytes _vtoc;

View File

@@ -59,7 +59,12 @@ message CbmfsProto
message ProdosProto {} message ProdosProto {}
message AppledosProto {} message AppledosProto {
optional uint32 filesystem_offset_sectors = 1 [
default = 0,
(help) = "offset the entire offset up the disk this many sectors"
];
}
message Smaky6FsProto {} message Smaky6FsProto {}

View File

@@ -24,17 +24,19 @@ layout {
} }
} }
decoder {
apple2 {
side_one_track_offset: 80
}
}
encoder {
apple2 {
side_one_track_offset: 80
}
}
tpi: 96 tpi: 96
option {
name: "side1"
comment: "reads the volume on side 1 of a disk"
message: "accessing volume on side 1"
config {
filesystem {
appledos {
filesystem_offset_sectors: 0x500
}
}
}
}