dmolony-DiskBrowser/src/com/bytezone/diskbrowser/dos/DosCatalogSector.java

105 lines
3.4 KiB
Java
Executable File

package com.bytezone.diskbrowser.dos;
import com.bytezone.diskbrowser.HexFormatter;
import com.bytezone.diskbrowser.disk.AbstractSector;
import com.bytezone.diskbrowser.disk.Disk;
class DosCatalogSector extends AbstractSector
{
private static final String[] fileTypes = { "Text file", "Integer Basic program",
"Applesoft Basic program", "Binary file",
"SS file", "Relocatable file", "AA file",
"BB file" };
private static int CATALOG_ENTRY_SIZE = 35;
public DosCatalogSector (Disk disk, byte[] buffer)
{
super (disk, buffer);
}
@Override
public String createText ()
{
StringBuilder text = getHeader ("Catalog Sector");
addText (text, buffer, 0, 1, "Not used");
addText (text, buffer, 1, 2, "Next catalog track/sector");
addText (text, buffer, 3, 4, "Not used");
addText (text, buffer, 7, 4, "Not used");
for (int i = 11; i <= 255; i += CATALOG_ENTRY_SIZE)
{
text.append ("\n");
if (true)
{
if (buffer[i] == (byte) 0xFF)
{
addText (text,
buffer,
i + 0,
2,
"DEL: file @ " + HexFormatter.format2 (buffer[i + 32]) + " "
+ HexFormatter.format2 (buffer[i + 1]));
addText (text, buffer, i + 2, 1, "DEL: File type " + getType (buffer[i + 2]));
if (buffer[i + 3] == 0)
addText (text, buffer, i + 3, 4, "");
else
addText (text, buffer, i + 3, 4, "DEL: " + getName (buffer, i));
addTextAndDecimal (text, buffer, i + 33, 2, "DEL: Sector count");
}
else if (buffer[i] > 0)
{
addText (text, buffer, i + 0, 2, "TS list track/sector");
addText (text, buffer, i + 2, 1, "File type " + getType (buffer[i + 2]));
if (buffer[i + 3] == 0)
addText (text, buffer, i + 3, 4, "");
else
addText (text, buffer, i + 3, 4, getName (buffer, i));
addTextAndDecimal (text, buffer, i + 33, 2, "Sector count");
}
else
{
addText (text, buffer, i + 0, 2, "");
addText (text, buffer, i + 2, 1, "");
addText (text, buffer, i + 3, 4, "");
addText (text, buffer, i + 33, 2, "");
}
}
}
text.deleteCharAt (text.length () - 1);
return text.toString ();
}
private String getName (byte[] buffer, int offset)
{
StringBuilder text = new StringBuilder ();
int max = buffer[offset] == (byte) 0xFF ? 32 : 33;
for (int i = 3; i < max; i++)
{
int c = HexFormatter.intValue (buffer[i + offset]);
if (c == 136)
{
if (text.length () > 0)
text.deleteCharAt (text.length () - 1);
continue;
}
if (c > 127)
c -= c < 160 ? 64 : 128;
if (c < 32) // non-printable
text.append ("^" + (char) (c + 64));
else
text.append ((char) c); // standard ascii
}
return text.toString ();
}
private String getType (byte value)
{
int type = value & 0x7F;
boolean locked = (value & 0x80) > 0;
int val = 7;
for (int i = 64; i > type; val--, i /= 2)
;
return "(" + fileTypes[val] + (locked ? ", locked)" : ", unlocked)");
}
}