mirror of
https://github.com/davidgiven/fluxengine.git
synced 2025-10-31 11:17:01 -07:00
Fix the broken AppleDOS double-sided disks. Allow access to side 1 on AppleDOS
volumes.
This commit is contained in:
@@ -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.
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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 {}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user