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;
|
2020-06-26 03:29:46 +00:00
|
|
|
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);
|
|
|
|
|
2021-05-19 08:13:17 +00:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
}
|