dmolony-DiskBrowser/src/com/bytezone/diskbrowser/cpm/CPMCatalogSector.java

82 lines
2.9 KiB
Java
Raw Normal View History

2016-02-26 03:09:14 +00:00
package com.bytezone.diskbrowser.cpm;
import com.bytezone.diskbrowser.disk.AbstractSector;
import com.bytezone.diskbrowser.disk.Disk;
import com.bytezone.diskbrowser.disk.DiskAddress;
2016-02-26 03:09:14 +00:00
2020-02-08 08:13:28 +00:00
// -----------------------------------------------------------------------------------//
class CPMCatalogSector extends AbstractSector
// -----------------------------------------------------------------------------------//
2016-02-26 03:09:14 +00:00
{
private static int CATALOG_ENTRY_SIZE = 32;
2020-02-08 08:13:28 +00:00
// ---------------------------------------------------------------------------------//
CPMCatalogSector (Disk disk, byte[] buffer, DiskAddress diskAddress)
// ---------------------------------------------------------------------------------//
2016-02-26 03:09:14 +00:00
{
super (disk, buffer, diskAddress);
2016-02-26 03:09:14 +00:00
}
2020-02-08 08:13:28 +00:00
// ---------------------------------------------------------------------------------//
2016-02-26 03:09:14 +00:00
@Override
public String createText ()
2020-02-08 08:13:28 +00:00
// ---------------------------------------------------------------------------------//
2016-02-26 03:09:14 +00:00
{
StringBuilder text = getHeader ("Catalog Sector");
for (int i = 0; i <= 255; i += CATALOG_ENTRY_SIZE)
{
if (buffer[i] == (byte) 0xE5 && buffer[i + 1] == (byte) 0xE5)
2016-02-26 03:09:14 +00:00
break;
2016-02-26 03:51:15 +00:00
2021-07-25 08:30:22 +00:00
int userNumber = buffer[i] & 0xFF;
if (userNumber > 31 && userNumber != (byte) 0xE5)
break;
2016-02-26 23:10:00 +00:00
boolean readOnly = (buffer[i + 9] & 0x80) != 0;
boolean systemFile = (buffer[i + 10] & 0x80) != 0;
2021-07-25 08:30:22 +00:00
boolean unknown = (buffer[i + 11] & 0x80) != 0;
2016-02-26 23:10:00 +00:00
String type;
String extra;
2021-07-25 08:30:22 +00:00
if (readOnly || systemFile || unknown)
2016-02-26 23:10:00 +00:00
{
byte[] typeBuffer = new byte[3];
typeBuffer[0] = (byte) (buffer[i + 9] & 0x7F);
typeBuffer[1] = (byte) (buffer[i + 10] & 0x7F);
2021-07-25 08:30:22 +00:00
typeBuffer[2] = (byte) (buffer[i + 11] & 0x7F);
2016-02-26 23:10:00 +00:00
type = new String (typeBuffer).trim ();
2021-07-25 08:30:22 +00:00
extra = String.format (" (%s%s%s)", readOnly ? "read only" : "",
systemFile ? "system file" : "", unknown ? "unknown" : "");
2016-02-26 23:10:00 +00:00
}
else
{
type = new String (buffer, i + 9, 3).trim ();
extra = "";
}
2021-06-18 00:48:38 +00:00
if (buffer[i] == (byte) 0xE5)
addText (text, buffer, i, 1, "Deleted file?");
else
addText (text, buffer, i, 1, "User number");
if (buffer[i + 1] == 0)
addText (text, buffer, i + 1, 4, "File name : ");
else
addText (text, buffer, i + 1, 4, "File name : " + new String (buffer, i + 1, 8));
2016-02-26 03:51:15 +00:00
addText (text, buffer, i + 5, 4, "");
2016-02-26 23:10:00 +00:00
addText (text, buffer, i + 9, 3, "File type : " + type + extra);
2016-02-26 03:09:14 +00:00
addText (text, buffer, i + 12, 1, "Extent counter LO");
addText (text, buffer, i + 13, 1, "Reserved");
addText (text, buffer, i + 14, 1, "Extent counter HI");
addText (text, buffer, i + 15, 1, "Record count");
2016-02-26 03:51:15 +00:00
for (int j = 0; j < 4; j++)
addText (text, buffer, i + 16 + j * 4, 4, "");
2016-02-26 03:09:14 +00:00
text.append ("\n");
}
text.deleteCharAt (text.length () - 1);
return text.toString ();
}
}