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

128 lines
3.2 KiB
Java
Raw Normal View History

2016-02-25 09:23:08 +00:00
package com.bytezone.diskbrowser.pascal;
import com.bytezone.diskbrowser.applefile.*;
2016-08-04 12:00:53 +00:00
import com.bytezone.diskbrowser.utilities.FileFormatException;
2016-02-25 09:23:08 +00:00
import com.bytezone.diskbrowser.utilities.HexFormatter;
class FileEntry extends CatalogEntry
{
int bytesUsedInLastBlock;
2016-08-05 08:40:32 +00:00
private final Relocator relocator;
2016-02-25 09:23:08 +00:00
2016-08-05 08:40:32 +00:00
public FileEntry (PascalDisk parent, byte[] buffer, Relocator relocator)
2016-02-25 09:23:08 +00:00
{
super (parent, buffer);
2016-08-05 08:40:32 +00:00
this.relocator = relocator;
2016-02-25 09:23:08 +00:00
bytesUsedInLastBlock = HexFormatter.intValue (buffer[22], buffer[23]);
date = HexFormatter.getPascalDate (buffer, 24);
for (int i = firstBlock; i < lastBlock; i++)
2016-08-02 10:37:27 +00:00
{
if (i >= 280)
break;
2016-02-25 09:23:08 +00:00
switch (fileType)
{
case 2:
parent.sectorTypes[i] = parent.codeSector;
break;
2016-02-29 01:54:44 +00:00
2016-02-25 09:23:08 +00:00
case 3:
parent.sectorTypes[i] = parent.textSector;
break;
2016-02-29 01:54:44 +00:00
2016-02-25 09:23:08 +00:00
case 4:
parent.sectorTypes[i] = parent.infoSector;
break;
2016-02-29 01:54:44 +00:00
2016-02-25 09:23:08 +00:00
case 5:
parent.sectorTypes[i] = parent.dataSector;
break;
2016-02-29 01:54:44 +00:00
2016-02-25 09:23:08 +00:00
case 6:
parent.sectorTypes[i] = parent.grafSector;
break;
2016-02-29 01:54:44 +00:00
2016-02-25 09:23:08 +00:00
case 7:
parent.sectorTypes[i] = parent.fotoSector;
break;
2016-02-29 01:54:44 +00:00
2016-02-25 09:23:08 +00:00
default:
System.out.println ("Unknown pascal file type : " + fileType);
parent.sectorTypes[i] = parent.dataSector;
break;
}
2016-08-02 10:37:27 +00:00
}
2016-02-25 09:23:08 +00:00
}
@Override
public AbstractFile getDataSource ()
{
if (file != null)
return file;
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-05 08:40:32 +00:00
file = new PascalCode (name, buffer, firstBlock, relocator);
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-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);
2016-08-02 10:37:27 +00:00
// else if (name.equals ("WT")) // only testing
// file = new WizardryTitle (name, buffer);
else if (name.equals ("SYSTEM.RELOC"))
file = new Relocator (name, buffer);
2016-02-25 10:49:10 +00:00
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;
}
private byte[] getExactBuffer ()
{
byte[] buffer = parent.getDisk ().readSectors (blocks);
byte[] exactBuffer;
2016-02-25 10:49:10 +00:00
2016-02-25 09:23:08 +00:00
if (bytesUsedInLastBlock < 512)
{
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;
}
}