dmolony-DiskBrowser/src/com/bytezone/diskbrowser/pascal/FileEntry.java

145 lines
4.7 KiB
Java
Raw Permalink Normal View History

2016-02-25 09:23:08 +00:00
package com.bytezone.diskbrowser.pascal;
2016-08-09 04:15:44 +00:00
import javax.swing.tree.DefaultMutableTreeNode;
2020-02-09 13:13:33 +00:00
import com.bytezone.diskbrowser.applefile.AbstractFile;
import com.bytezone.diskbrowser.applefile.AssemblerProgram;
import com.bytezone.diskbrowser.applefile.Charset;
import com.bytezone.diskbrowser.applefile.DefaultAppleFile;
import com.bytezone.diskbrowser.applefile.PascalCode;
import com.bytezone.diskbrowser.applefile.PascalInfo;
import com.bytezone.diskbrowser.applefile.PascalSegment;
import com.bytezone.diskbrowser.applefile.PascalText;
2016-08-04 12:00:53 +00:00
import com.bytezone.diskbrowser.utilities.FileFormatException;
import com.bytezone.diskbrowser.utilities.Utility;
2016-02-25 09:23:08 +00:00
2020-02-09 13:13:33 +00:00
// -----------------------------------------------------------------------------------//
2016-08-08 04:53:29 +00:00
public class FileEntry extends CatalogEntry
2020-02-09 13:13:33 +00:00
// -----------------------------------------------------------------------------------//
2016-02-25 09:23:08 +00:00
{
2016-08-09 04:15:44 +00:00
private DefaultMutableTreeNode node;
2016-02-25 09:23:08 +00:00
2020-02-09 13:13:33 +00:00
// ---------------------------------------------------------------------------------//
2016-08-09 04:15:44 +00:00
public FileEntry (PascalDisk parent, byte[] buffer)
2020-02-09 13:13:33 +00:00
// ---------------------------------------------------------------------------------//
2016-02-25 09:23:08 +00:00
{
super (parent, buffer);
bytesUsedInLastBlock = Utility.getShort (buffer, 22);
2022-05-11 00:09:27 +00:00
localDate = Utility.getPascalLocalDate (buffer, 24);
2016-02-25 09:23:08 +00:00
2016-08-14 08:41:19 +00:00
int max = Math.min (lastBlock, parent.getDisk ().getTotalBlocks ());
for (int i = firstBlock; i < max; i++)
2016-08-02 10:37:27 +00:00
{
2017-04-26 08:04:48 +00:00
if (fileType < parent.sectors.length)
parent.sectorTypes[i] = parent.sectors[fileType];
else
2016-02-25 09:23:08 +00:00
{
2017-04-26 08:04:48 +00:00
System.out.println ("Unknown pascal file type : " + fileType);
parent.sectorTypes[i] = parent.dataSector;
2016-02-25 09:23:08 +00:00
}
2016-08-02 10:37:27 +00:00
}
2016-02-25 09:23:08 +00:00
}
2020-02-09 13:13:33 +00:00
// ---------------------------------------------------------------------------------//
2016-08-09 04:15:44 +00:00
void setNode (DefaultMutableTreeNode node)
2020-02-09 13:13:33 +00:00
// ---------------------------------------------------------------------------------//
2016-08-09 04:15:44 +00:00
{
this.node = node;
}
2020-02-09 13:13:33 +00:00
// ---------------------------------------------------------------------------------//
2016-08-09 04:15:44 +00:00
public void setFile (AbstractFile file)
2020-02-09 13:13:33 +00:00
// ---------------------------------------------------------------------------------//
2016-08-09 04:15:44 +00:00
{
this.file = file;
}
2020-02-09 13:13:33 +00:00
// ---------------------------------------------------------------------------------//
2016-02-25 09:23:08 +00:00
@Override
public AbstractFile getDataSource ()
2020-02-09 13:13:33 +00:00
// ---------------------------------------------------------------------------------//
2016-02-25 09:23:08 +00:00
{
2020-10-28 08:26:29 +00:00
if (file != null) // previously built
2016-02-25 09:23:08 +00:00
return file;
2020-10-28 08:26:29 +00:00
// check for empty file (e.g. see DC16.dsk)
if (firstBlock == lastBlock)
2020-10-28 05:42:48 +00:00
{
2020-10-28 08:26:29 +00:00
file = new DefaultAppleFile (name, new byte[0]);
node.setAllowsChildren (false);
2020-10-28 05:42:48 +00:00
return file;
}
2016-02-25 09:23:08 +00:00
2020-10-28 08:26:29 +00:00
byte[] buffer = getExactBuffer ();
2016-02-25 10:49:10 +00:00
switch (fileType)
2016-02-25 09:23:08 +00:00
{
2016-08-04 12:00:53 +00:00
case 2: // code (6502 or Pascal)
try
{
2016-08-09 04:15:44 +00:00
file = new PascalCode (name, buffer, firstBlock);
node.removeAllChildren ();
for (PascalSegment pascalSegment : (PascalCode) file)
{
DefaultMutableTreeNode segmentNode = new DefaultMutableTreeNode (
new PascalCodeObject (parent, pascalSegment, firstBlock));
segmentNode.setAllowsChildren (false);
2016-08-09 09:09:11 +00:00
node.add (segmentNode);
2016-08-09 04:15:44 +00:00
}
2016-08-04 12:00:53 +00:00
}
catch (FileFormatException e)
{
if (name.equals ("SYSTEM.INTERP"))
file = new AssemblerProgram (name, buffer, 0xD000);
else
file = new AssemblerProgram (name, buffer, 0);
2016-08-09 09:09:11 +00:00
node.setAllowsChildren (false);
2016-08-04 12:00:53 +00:00
}
2016-02-25 10:49:10 +00:00
break;
2016-08-02 10:37:27 +00:00
case 3:
file = new PascalText (name, buffer);
2016-02-25 10:49:10 +00:00
break;
2016-08-02 10:37:27 +00:00
case 4:
file = new PascalInfo (name, buffer);
2016-02-25 10:49:10 +00:00
break;
case 5: // data
if (name.equals ("SYSTEM.CHARSET"))
file = new Charset (name, buffer);
else
2016-02-25 09:23:08 +00:00
file = new DefaultAppleFile (name, buffer);
2016-02-25 10:49:10 +00:00
break;
2016-08-02 10:37:27 +00:00
case 0: // volume
break;
2016-02-25 10:49:10 +00:00
default: // unknown
file = new DefaultAppleFile (name, buffer);
2016-02-25 09:23:08 +00:00
}
2016-02-25 10:49:10 +00:00
2016-02-25 09:23:08 +00:00
return file;
}
2020-02-09 13:13:33 +00:00
// ---------------------------------------------------------------------------------//
2016-02-25 09:23:08 +00:00
private byte[] getExactBuffer ()
2020-02-09 13:13:33 +00:00
// ---------------------------------------------------------------------------------//
2016-02-25 09:23:08 +00:00
{
2020-04-10 23:47:52 +00:00
byte[] buffer = parent.getDisk ().readBlocks (blocks);
2016-02-25 09:23:08 +00:00
byte[] exactBuffer;
2016-02-25 10:49:10 +00:00
2016-08-06 07:17:16 +00:00
if (buffer.length > 0 && bytesUsedInLastBlock < 512)
2016-02-25 09:23:08 +00:00
{
int exactLength = buffer.length - 512 + bytesUsedInLastBlock;
exactBuffer = new byte[exactLength];
System.arraycopy (buffer, 0, exactBuffer, 0, exactLength);
}
else
exactBuffer = buffer;
2016-02-25 10:49:10 +00:00
2016-02-25 09:23:08 +00:00
return exactBuffer;
}
}