dmolony-DiskBrowser/src/com/bytezone/diskbrowser/applefile/BootSector.java

92 lines
2.8 KiB
Java
Raw Normal View History

2015-06-01 09:35:51 +00:00
package com.bytezone.diskbrowser.applefile;
import java.util.List;
2015-06-01 09:35:51 +00:00
import com.bytezone.diskbrowser.disk.AbstractSector;
import com.bytezone.diskbrowser.disk.Disk;
import com.bytezone.diskbrowser.disk.DiskAddress;
2016-07-31 02:14:48 +00:00
import com.bytezone.diskbrowser.utilities.HexFormatter;
2015-06-01 09:35:51 +00:00
public class BootSector extends AbstractSector
{
2016-07-31 02:14:48 +00:00
private static final byte[] skew =
{ 0x00, 0x0D, 0x0B, 0x09, 0x07, 0x05, 0x03, 0x01, 0x0E, 0x0C, 0x0A, 0x08, 0x06,
0x04, 0x02, 0x0F, 0x00 };
AssemblerProgram assembler1;
AssemblerProgram assembler2;
String name; // DOS or Prodos
public BootSector (Disk disk, byte[] buffer, String name, DiskAddress diskAddress)
{
super (disk, buffer, diskAddress);
this.name = name;
}
2015-06-01 09:35:51 +00:00
public BootSector (Disk disk, byte[] buffer, String name,
List<DiskAddress> diskAddressList)
2015-06-01 09:35:51 +00:00
{
super (disk, buffer, diskAddressList);
2015-06-01 09:35:51 +00:00
this.name = name;
}
@Override
public String createText ()
{
StringBuilder text = new StringBuilder ();
2016-07-31 02:14:48 +00:00
if (assembler1 == null)
2015-06-01 09:35:51 +00:00
{
2015-12-16 02:14:05 +00:00
int flag = buffer[0] & 0xFF;
if (flag == 1) // apple II
2016-07-31 02:14:48 +00:00
{
if (matches (buffer, 0x4D, skew))
{
int newLen = 0x100 - (0x4D + skew.length);
byte[] buf1 = new byte[0x4D];
byte[] buf2 = new byte[newLen];
System.arraycopy (buffer, 0, buf1, 0, 0x4D);
System.arraycopy (buffer, 0x4D + skew.length, buf2, 0, newLen);
assembler1 = new AssemblerProgram (name + " (first)", buf1, 0x800, 1);
assembler2 =
new AssemblerProgram (name + " (second)", buf2, 0x84D + skew.length, 0);
}
else
assembler1 = new AssemblerProgram (name + " Boot Loader", buffer, 0x00, 1);
}
else // apple III (SOS)
2015-06-01 09:35:51 +00:00
{
2015-12-16 02:14:05 +00:00
byte[] newBuffer = new byte[buffer.length * 2];
2015-06-01 09:35:51 +00:00
System.arraycopy (buffer, 0, newBuffer, 0, buffer.length);
2015-12-16 02:14:05 +00:00
byte[] buf = disk.readSector (1);
System.arraycopy (buf, 0, newBuffer, buf.length, buf.length);
2015-06-01 09:35:51 +00:00
buffer = newBuffer;
2016-07-31 02:14:48 +00:00
assembler1 = new AssemblerProgram (name + " Boot Loader", buffer, 0x00, 0);
2015-12-16 02:14:05 +00:00
}
2015-06-01 09:35:51 +00:00
}
2016-07-31 02:14:48 +00:00
text.append (assembler1.getText ());
if (assembler2 != null)
{
text.append ("\n\n");
text.append (HexFormatter.formatNoHeader (buffer, 0x4D, skew.length, 0x800));
text.append ("\n\n");
text.append (assembler2.getText ());
}
2015-06-01 09:35:51 +00:00
return text.toString ();
}
2016-07-31 02:14:48 +00:00
private boolean matches (byte[] buffer, int offset, byte[] test)
{
if (test.length == 0 || test.length > buffer.length - offset)
return false;
for (int i = 0; i < test.length; i++)
if (test[i] != buffer[offset++])
return false;
return true;
}
2015-06-01 09:35:51 +00:00
}