mirror of
https://github.com/dmolony/DiskBrowser.git
synced 2024-06-12 15:29:28 +00:00
131 lines
5.6 KiB
Java
131 lines
5.6 KiB
Java
package com.bytezone.diskbrowser.nufx;
|
|
|
|
import static com.bytezone.diskbrowser.prodos.ProdosConstants.fileTypes;
|
|
|
|
import java.time.LocalDateTime;
|
|
import java.time.format.DateTimeFormatter;
|
|
|
|
import com.bytezone.diskbrowser.prodos.write.ProdosDisk;
|
|
import com.bytezone.diskbrowser.utilities.HexFormatter;
|
|
import com.bytezone.diskbrowser.utilities.Utility;
|
|
|
|
// -----------------------------------------------------------------------------------//
|
|
public class Binary2Header
|
|
// -----------------------------------------------------------------------------------//
|
|
{
|
|
static DateTimeFormatter formatter = DateTimeFormatter.ofPattern ("dd-LLL-yy HH:mm");
|
|
static String[] osTypes = { "Prodos", "DOS 3.3", "Reserved", "DOS 3.2 or 3.1", "Pascal",
|
|
"Macintosh MFS", "Macintosh HFS", "Lisa", "CPM", "Reserved", "MS-DOS", "High Sierra (CD-ROM)",
|
|
"ISO 9660 (CD-ROM)", "AppleShare" };
|
|
|
|
int ptr;
|
|
byte[] buffer;
|
|
|
|
int accessCode;
|
|
byte fileType;
|
|
int auxType;
|
|
int storageType;
|
|
int totalBlocks;
|
|
LocalDateTime modified;
|
|
LocalDateTime created;
|
|
int id; // always 0x02
|
|
int eof;
|
|
String fileName;
|
|
String nativeFileName;
|
|
int prodos16accessCode;
|
|
int prodos16fileType;
|
|
int prodos16storageType;
|
|
int prodos16totalBlocks;
|
|
int prodos16eof;
|
|
long diskSpaceRequired;
|
|
int osType;
|
|
int nativeFileType;
|
|
int phantomFileFlag;
|
|
int dataFlags;
|
|
int version;
|
|
int filesToFollow;
|
|
|
|
boolean compressed;
|
|
boolean encrypted;
|
|
boolean sparsePacked;
|
|
|
|
// ---------------------------------------------------------------------------------//
|
|
public Binary2Header (byte[] buffer, int ptr)
|
|
// ---------------------------------------------------------------------------------//
|
|
{
|
|
this.ptr = ptr;
|
|
this.buffer = buffer;
|
|
|
|
accessCode = buffer[ptr + 3] & 0xFF;
|
|
fileType = buffer[ptr + 4];
|
|
auxType = Utility.getShort (buffer, ptr + 5);
|
|
storageType = buffer[ptr + 7] & 0xFF;
|
|
totalBlocks = Utility.getShort (buffer, ptr + 8);
|
|
modified = Utility.getAppleDate (buffer, ptr + 10);
|
|
created = Utility.getAppleDate (buffer, ptr + 14);
|
|
id = buffer[ptr + 18] & 0xFF;
|
|
eof = Utility.readTriple (buffer, ptr + 20);
|
|
fileName = HexFormatter.getPascalString (buffer, ptr + 23);
|
|
prodos16accessCode = buffer[ptr + 111] & 0xFF;
|
|
prodos16fileType = buffer[ptr + 112] & 0xFF;
|
|
prodos16storageType = buffer[113] & 0xFF;
|
|
prodos16totalBlocks = Utility.getShort (buffer, ptr + 114);
|
|
prodos16eof = buffer[ptr + 116] & 0xFF;
|
|
diskSpaceRequired = Utility.getLong (buffer, ptr + 117);
|
|
osType = buffer[ptr + 121] & 0xFF;
|
|
nativeFileType = Utility.getShort (buffer, ptr + 122);
|
|
phantomFileFlag = buffer[ptr + 124] & 0xFF;
|
|
dataFlags = buffer[ptr + 125] & 0xFF;
|
|
version = buffer[ptr + 126] & 0xFF;
|
|
filesToFollow = buffer[ptr + 127] & 0xFF;
|
|
|
|
compressed = (dataFlags & 0x80) != 0;
|
|
encrypted = (dataFlags & 0x40) != 0;
|
|
sparsePacked = (dataFlags & 0x01) != 0;
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------//
|
|
public String getLine ()
|
|
// ---------------------------------------------------------------------------------//
|
|
{
|
|
return String.format (" %-33s %3s $%04X %s unc %7d", fileName, fileTypes[fileType],
|
|
auxType, modified.format (formatter), eof);
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------------//
|
|
@Override
|
|
public String toString ()
|
|
// ---------------------------------------------------------------------------------//
|
|
{
|
|
StringBuilder text = new StringBuilder ();
|
|
|
|
text.append ("Binary2 Header\n==============\n");
|
|
text.append (String.format ("Access ................ %02X%n", accessCode));
|
|
text.append (String.format ("File type ............. %02X%n", fileType));
|
|
text.append (String.format ("Aux type .............. %04X%n", auxType));
|
|
text.append (String.format ("Storage type .......... %02X %s%n", storageType,
|
|
ProdosDisk.storageTypes[storageType]));
|
|
text.append (String.format ("Total blocks .......... %04X %<,d%n", totalBlocks));
|
|
text.append (String.format ("Modified .............. %s%n", modified));
|
|
text.append (String.format ("Created ............... %s%n", created));
|
|
text.append (String.format ("ID (0x02) ............. %02X%n", id));
|
|
text.append (String.format ("End of file ........... %06X %<,d%n", eof));
|
|
text.append (String.format ("File name ............. %s%n", fileName));
|
|
text.append (String.format ("Prodos access ......... %02X%n", prodos16accessCode));
|
|
text.append (String.format ("Prodos file type ...... %02X%n", prodos16fileType));
|
|
text.append (String.format ("Prodos storage type ... %02X%n", prodos16storageType));
|
|
text.append (String.format ("Prodos total blocks ... %02X%n", prodos16totalBlocks));
|
|
text.append (String.format ("Prodos eof ............ %06X %<,d%n", prodos16eof));
|
|
text.append (String.format ("Disk space needed ..... %08X %<,d%n", diskSpaceRequired));
|
|
text.append (String.format ("OS type ............... %02X %s%n", osType, osTypes[osType]));
|
|
text.append (String.format ("Native file type ...... %02X%n", nativeFileType));
|
|
text.append (String.format ("Data flags ............ %02X%n", dataFlags));
|
|
text.append (String.format (" compressed .......... %s%n", compressed));
|
|
text.append (String.format (" encrypted ........... %s%n", encrypted));
|
|
text.append (String.format (" sparse .............. %s%n", sparsePacked));
|
|
text.append (String.format ("Version ............... %02X%n", version));
|
|
text.append (String.format ("Following files ....... %02X%n", filesToFollow));
|
|
|
|
return text.toString ();
|
|
}
|
|
} |