diff --git a/DiscImageChef.Filesystems/LisaFS/Dir.cs b/DiscImageChef.Filesystems/LisaFS/Dir.cs
index fbebd1248..fddd0635c 100644
--- a/DiscImageChef.Filesystems/LisaFS/Dir.cs
+++ b/DiscImageChef.Filesystems/LisaFS/Dir.cs
@@ -95,7 +95,7 @@ namespace DiscImageChef.Filesystems.LisaFS
Errno error;
- if(mddf.fsversion == LisaFSv2)
+ if(mddf.fsversion == LisaFSv2 || mddf.fsversion == LisaFSv1)
{
if(fileId != FILEID_DIRECTORY)
{
diff --git a/DiscImageChef.Filesystems/LisaFS/Extent.cs b/DiscImageChef.Filesystems/LisaFS/Extent.cs
index ec139ee49..830507a0f 100644
--- a/DiscImageChef.Filesystems/LisaFS/Extent.cs
+++ b/DiscImageChef.Filesystems/LisaFS/Extent.cs
@@ -62,7 +62,7 @@ namespace DiscImageChef.Filesystems.LisaFS
if(!mounted)
return Errno.AccessDenied;
- if(fileId < 4 || (fileId == 4 && mddf.fsversion != LisaFSv2))
+ if(fileId < 4 || (fileId == 4 && (mddf.fsversion != LisaFSv2 && mddf.fsversion != LisaFSv1)))
return Errno.InvalidArgument;
if(extentCache.TryGetValue(fileId, out file))
@@ -105,7 +105,12 @@ namespace DiscImageChef.Filesystems.LisaFS
if(extTag.fileID == ((short)(-1 * fileId)))
{
- byte[] sector = device.ReadSector(ptr);
+ byte[] sector;
+
+ if(mddf.fsversion == LisaFSv1)
+ sector = device.ReadSectors(ptr, 2);
+ else
+ sector = device.ReadSector(ptr);
if(sector[0] >= 32 || sector[0] == 0)
return Errno.InvalidArgument;
@@ -147,17 +152,29 @@ namespace DiscImageChef.Filesystems.LisaFS
file.overhead = BigEndianBitConverter.ToUInt16(sector, 0x6E);
file.unknown8 = new byte[16];
Array.Copy(sector, 0x70, file.unknown8, 0, 16);
- file.length = BigEndianBitConverter.ToInt32(sector, 0x80);
- file.unknown9 = BigEndianBitConverter.ToInt32(sector, 0x84);
file.unknown10 = BigEndianBitConverter.ToInt16(sector, 0x17E);
file.LisaInfo = new byte[128];
Array.Copy(sector, 0x180, file.LisaInfo, 0, 128);
int extentsCount = 0;
+ int extentsOffset;
+ if(mddf.fsversion == LisaFSv1)
+ {
+ file.length = BigEndianBitConverter.ToInt32(sector, 0x200);
+ file.unknown9 = BigEndianBitConverter.ToInt32(sector, 0x204);
+ extentsOffset = 0x208;
+ }
+ else
+ {
+ file.length = BigEndianBitConverter.ToInt32(sector, 0x80);
+ file.unknown9 = BigEndianBitConverter.ToInt32(sector, 0x84);
+ extentsOffset = 0x88;
+ }
+
for(int j = 0; j < 41; j++)
{
- if(BigEndianBitConverter.ToInt16(sector, 0x88 + j * 6 + 4) == 0)
+ if(BigEndianBitConverter.ToInt16(sector, extentsOffset + j * 6 + 4) == 0)
break;
extentsCount++;
@@ -168,8 +185,8 @@ namespace DiscImageChef.Filesystems.LisaFS
for(int j = 0; j < extentsCount; j++)
{
file.extents[j] = new Extent();
- file.extents[j].start = BigEndianBitConverter.ToInt32(sector, 0x88 + j * 6);
- file.extents[j].length = BigEndianBitConverter.ToInt16(sector, 0x88 + j * 6 + 4);
+ file.extents[j].start = BigEndianBitConverter.ToInt32(sector, extentsOffset + j * 6);
+ file.extents[j].length = BigEndianBitConverter.ToInt16(sector, extentsOffset + j * 6 + 4);
}
extentCache.Add(fileId, file);
diff --git a/DiscImageChef.Filesystems/LisaFS/File.cs b/DiscImageChef.Filesystems/LisaFS/File.cs
index f6851d626..2cdd7ce68 100644
--- a/DiscImageChef.Filesystems/LisaFS/File.cs
+++ b/DiscImageChef.Filesystems/LisaFS/File.cs
@@ -390,7 +390,7 @@ namespace DiscImageChef.Filesystems.LisaFS
tags &= debug;
- if(fileId < 4 || (fileId == 4 && mddf.fsversion != LisaFSv2))
+ if(fileId < 4 || (fileId == 4 && (mddf.fsversion != LisaFSv2 && mddf.fsversion != LisaFSv1)))
return Errno.InvalidArgument;
if(!tags && fileCache.TryGetValue(fileId, out buf))
diff --git a/DiscImageChef.Filesystems/LisaFS/Structs.cs b/DiscImageChef.Filesystems/LisaFS/Structs.cs
index e4ff3b7f5..bdb014c4d 100644
--- a/DiscImageChef.Filesystems/LisaFS/Structs.cs
+++ b/DiscImageChef.Filesystems/LisaFS/Structs.cs
@@ -346,11 +346,11 @@ namespace DiscImageChef.Filesystems.LisaFS
public ushort overhead;
/// 0x70, 16 bytes, unknown
public byte[] unknown8;
- /// 0x80, file length in blocks
+ /// 0x80, 0x200 in v1, file length in blocks
public Int32 length;
- /// 0x84, unknown
+ /// 0x84, 0x204 in v1, unknown
public Int32 unknown9;
- /// 0x88, extents, can contain up to 41 extents, dunno LisaOS maximum (never seen more than 3)
+ /// 0x88, 0x208 in v1, extents, can contain up to 41 extents (85 in v1), dunno LisaOS maximum (never seen more than 3)
public Extent[] extents;
/// 0x17E, unknown, empty, padding?
public short unknown10;
diff --git a/DiscImageChef.Filesystems/LisaFS/Super.cs b/DiscImageChef.Filesystems/LisaFS/Super.cs
index 8139ac010..a62dfa06f 100644
--- a/DiscImageChef.Filesystems/LisaFS/Super.cs
+++ b/DiscImageChef.Filesystems/LisaFS/Super.cs
@@ -191,13 +191,13 @@ namespace DiscImageChef.Filesystems.LisaFS
switch(mddf.fsversion)
{
case LisaFSv1:
- DicConsole.ErrorWriteLine("Cannot mount LisaFS v1");
- return Errno.NotSupported;
+ DicConsole.DebugWriteLine("LisaFS plugin", "Mounting LisaFS v1");
+ break;
case LisaFSv2:
DicConsole.DebugWriteLine("LisaFS plugin", "Mounting LisaFS v2");
break;
case LisaFSv3:
- DicConsole.DebugWriteLine("LisaFS plugin", "Mounting LisaFS v2");
+ DicConsole.DebugWriteLine("LisaFS plugin", "Mounting LisaFS v3");
break;
default:
DicConsole.ErrorWriteLine("Cannot mount LisaFS version {0}", mddf.fsversion.ToString());