mirror of
https://github.com/dmolony/DiskBrowser.git
synced 2024-06-14 12:29:34 +00:00
62c09af14f
user to save the current file buffer to the local file system.
144 lines
5.3 KiB
Java
144 lines
5.3 KiB
Java
package com.bytezone.diskbrowser.prodos.write;
|
|
|
|
import static com.bytezone.diskbrowser.prodos.ProdosConstants.BLOCK_SIZE;
|
|
import static com.bytezone.diskbrowser.prodos.ProdosConstants.ENTRIES_PER_BLOCK;
|
|
import static com.bytezone.diskbrowser.prodos.ProdosConstants.ENTRY_SIZE;
|
|
import static com.bytezone.diskbrowser.utilities.Utility.getAppleDate;
|
|
import static com.bytezone.diskbrowser.utilities.Utility.getShort;
|
|
import static com.bytezone.diskbrowser.utilities.Utility.putAppleDate;
|
|
import static com.bytezone.diskbrowser.utilities.Utility.writeShort;
|
|
|
|
import java.time.LocalDateTime;
|
|
|
|
// -----------------------------------------------------------------------------------//
|
|
public class DirectoryHeader
|
|
// -----------------------------------------------------------------------------------//
|
|
{
|
|
static final String UNDERLINE = "--------------------------------------------";
|
|
ProdosDisk disk;
|
|
byte[] buffer;
|
|
int ptr;
|
|
|
|
String fileName;
|
|
byte storageType;
|
|
LocalDateTime creationDate;
|
|
byte version = 0x00;
|
|
byte minVersion = 0x00;
|
|
byte access = (byte) 0xE3;
|
|
byte entryLength = ENTRY_SIZE;
|
|
byte entriesPerBlock = ENTRIES_PER_BLOCK;
|
|
int fileCount;
|
|
|
|
// ---------------------------------------------------------------------------------//
|
|
public DirectoryHeader (ProdosDisk disk, int ptr)
|
|
// ---------------------------------------------------------------------------------//
|
|
{
|
|
this.disk = disk;
|
|
this.buffer = disk.getBuffer ();
|
|
this.ptr = ptr;
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------//
|
|
void read ()
|
|
// ---------------------------------------------------------------------------------//
|
|
{
|
|
storageType = (byte) ((buffer[ptr] & 0xF0) >>> 4);
|
|
int nameLength = buffer[ptr] & 0x0F;
|
|
fileName = new String (buffer, ptr + 1, nameLength);
|
|
|
|
creationDate = getAppleDate (buffer, ptr + 0x18);
|
|
version = buffer[ptr + 0x1C];
|
|
minVersion = buffer[ptr + 0x1D];
|
|
access = buffer[ptr + 0x1E];
|
|
entryLength = buffer[ptr + 0x1F];
|
|
entriesPerBlock = buffer[ptr + 0x20];
|
|
fileCount = getShort (buffer, ptr + 0x21);
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------//
|
|
void write ()
|
|
// ---------------------------------------------------------------------------------//
|
|
{
|
|
buffer[ptr] = (byte) ((storageType << 4) | fileName.length ());
|
|
System.arraycopy (fileName.getBytes (), 0, buffer, ptr + 1, fileName.length ());
|
|
|
|
putAppleDate (buffer, ptr + 0x18, creationDate);
|
|
buffer[ptr + 0x1C] = version;
|
|
buffer[ptr + 0x1D] = minVersion;
|
|
buffer[ptr + 0x1E] = access;
|
|
buffer[ptr + 0x1F] = entryLength;
|
|
buffer[ptr + 0x20] = entriesPerBlock;
|
|
writeShort (buffer, ptr + 0x21, fileCount);
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------//
|
|
void list ()
|
|
// ---------------------------------------------------------------------------------//
|
|
{
|
|
System.out.println (UNDERLINE);
|
|
System.out.println (toText ());
|
|
System.out.println (UNDERLINE);
|
|
|
|
int blockNo = ptr / BLOCK_SIZE;
|
|
|
|
do
|
|
{
|
|
int offset = blockNo * BLOCK_SIZE;
|
|
int ptr = offset + 4;
|
|
for (int i = 0; i < ENTRIES_PER_BLOCK; i++)
|
|
{
|
|
int storageType = (buffer[ptr] & 0xF0) >>> 4;
|
|
int nameLength = buffer[ptr] & 0x0F;
|
|
if (nameLength != 0 && storageType < 0x0E)
|
|
{
|
|
FileEntry fileEntry = new FileEntry (disk, ptr);
|
|
fileEntry.read ();
|
|
System.out.println (fileEntry.toText ());
|
|
}
|
|
|
|
ptr += ENTRY_SIZE;
|
|
}
|
|
blockNo = getShort (buffer, offset + 2);
|
|
} while (blockNo > 0);
|
|
System.out.println ();
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------//
|
|
String toText ()
|
|
// ---------------------------------------------------------------------------------//
|
|
{
|
|
int block = ptr / BLOCK_SIZE;
|
|
int entry = ((ptr % BLOCK_SIZE) - 4) / 39 + 1;
|
|
|
|
return String.format ("%04X:%02X %-15s %02X %04X", block, entry, fileName,
|
|
storageType, fileCount);
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------//
|
|
@Override
|
|
public String toString ()
|
|
// ---------------------------------------------------------------------------------//
|
|
{
|
|
StringBuilder text = new StringBuilder ();
|
|
|
|
int blockNo = ptr / BLOCK_SIZE;
|
|
text.append (String.format ("Block ............ %04X%n", blockNo));
|
|
text.append (
|
|
String.format ("Entry ............ %02X%n", ((ptr % BLOCK_SIZE) - 4) / 39 + 1));
|
|
|
|
text.append (String.format ("Storage type ..... %02X %s%n", storageType,
|
|
ProdosDisk.storageTypes[storageType]));
|
|
text.append (String.format ("Name length ...... %02X%n", fileName.length ()));
|
|
text.append (String.format ("File name ........ %s%n", fileName));
|
|
text.append (String.format ("Version .......... %02X%n", version));
|
|
text.append (String.format ("Min version ...... %02X%n", minVersion));
|
|
text.append (String.format ("Created .......... %s%n", creationDate));
|
|
text.append (String.format ("Access ........... %02X%n", access));
|
|
text.append (String.format ("Entry length ..... %02X%n", entryLength));
|
|
text.append (String.format ("Entries per blk .. %02X%n", entriesPerBlock));
|
|
text.append (String.format ("File count ....... %d%n", fileCount));
|
|
|
|
return text.toString ();
|
|
}
|
|
}
|