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

82 lines
2.9 KiB
Java

package com.bytezone.diskbrowser.cpm;
import com.bytezone.diskbrowser.disk.AbstractSector;
import com.bytezone.diskbrowser.disk.Disk;
import com.bytezone.diskbrowser.disk.DiskAddress;
// -----------------------------------------------------------------------------------//
class CPMCatalogSector extends AbstractSector
// -----------------------------------------------------------------------------------//
{
private static int CATALOG_ENTRY_SIZE = 32;
// ---------------------------------------------------------------------------------//
CPMCatalogSector (Disk disk, byte[] buffer, DiskAddress diskAddress)
// ---------------------------------------------------------------------------------//
{
super (disk, buffer, diskAddress);
}
// ---------------------------------------------------------------------------------//
@Override
public String createText ()
// ---------------------------------------------------------------------------------//
{
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)
break;
int userNumber = buffer[i] & 0xFF;
if (userNumber > 31 && userNumber != (byte) 0xE5)
break;
boolean readOnly = (buffer[i + 9] & 0x80) != 0;
boolean systemFile = (buffer[i + 10] & 0x80) != 0;
boolean unknown = (buffer[i + 11] & 0x80) != 0;
String type;
String extra;
if (readOnly || systemFile || unknown)
{
byte[] typeBuffer = new byte[3];
typeBuffer[0] = (byte) (buffer[i + 9] & 0x7F);
typeBuffer[1] = (byte) (buffer[i + 10] & 0x7F);
typeBuffer[2] = (byte) (buffer[i + 11] & 0x7F);
type = new String (typeBuffer).trim ();
extra = String.format (" (%s%s%s)", readOnly ? "read only" : "",
systemFile ? "system file" : "", unknown ? "unknown" : "");
}
else
{
type = new String (buffer, i + 9, 3).trim ();
extra = "";
}
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));
addText (text, buffer, i + 5, 4, "");
addText (text, buffer, i + 9, 3, "File type : " + type + extra);
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");
for (int j = 0; j < 4; j++)
addText (text, buffer, i + 16 + j * 4, 4, "");
text.append ("\n");
}
text.deleteCharAt (text.length () - 1);
return text.toString ();
}
}