This commit is contained in:
Denis Molony 2017-06-12 19:09:19 +10:00
parent 77cb5336e0
commit f782427d74
8 changed files with 69 additions and 40 deletions

View File

@ -139,12 +139,22 @@ public class BasicProgram extends AbstractFile
// (see SEA BATTLE on DISK283.DSK)
if (subline.is (TOKEN_REM) && lineText.length () > wrapRemAt + 4)
{
// System.out.println (lineText.length ());
String copy = lineText.substring (4);
text.append ("REM ");
int inset = text.length ();
int inset = text.length () + 1;
List<String> remarks = splitRemark (copy, wrapRemAt);
boolean first = true;
for (String remark : remarks)
text.append (" ".substring (0, inset) + remark);
{
if (first)
{
first = false;
text.append (remark);
}
else
text.append ("\n ".substring (0, inset) + remark);
}
}
else
text.append (lineText);
@ -268,14 +278,12 @@ public class BasicProgram extends AbstractFile
int max = Math.min (wrapLength, remark.length () - 1);
while (max > 0 && remark.charAt (max) != ' ')
--max;
// System.out.println (remark.substring (0, max));
remarks.add (remark.substring (0, max) + "\n");
if (max == 0)
break;
remark = remark.substring (max + 1);
remarks.add (remark.substring (0, max));
remark = remark.substring (max);
}
remarks.add (remark);
// System.out.println (remark);
return remarks;
}

View File

@ -7,11 +7,6 @@ public class OriginalHiResImage extends HiResImage
{
private static final int WHITE = 0xFFFFFF;
private static final int BLACK = 0x000000;
// private static final int RED = 0xFF0000;
// private static final int GREEN = 0x00CC00;
// private static final int BLUE = 0x0000FF;
// private static final int VIOLET = 0xBB66FF;
// private static final int[][] palette = { { VIOLET, GREEN }, { BLUE, RED } };
private static final int[][] paletteTable = { { 9, 6 }, { 12, 3 } };
private static boolean matchColourBits = false;
@ -42,6 +37,9 @@ public class OriginalHiResImage extends HiResImage
// createImage ();
}
// https://github.com/Michaelangel007/apple2_hgr_font_tutorial
// hgr[ y ] = 0x2000 + (y/64)*0x28 + (y%8)*0x400 + ((y/8)&7)*0x80;
@Override
protected void createMonochromeImage ()
{

View File

@ -83,31 +83,30 @@ public abstract class AbstractSector implements DataSource
return panel;
}
protected void addText (StringBuilder text, byte[] b, int offset, int size, String desc)
protected void addText (StringBuilder text, byte[] buffer, int offset, int size,
String desc)
{
if ((offset + size - 1) > b.length)
{
// System.out.printf ("Offset : %d, Size : %d, Buffer : %d%n", offset, size, buffer.length);
if ((offset + size - 1) > buffer.length)
return;
}
switch (size)
{
case 1:
text.append (
String.format ("%03X %02X %s%n", offset, b[offset], desc));
text.append (String.format ("%03X %02X %s%n", offset,
buffer[offset], desc));
break;
case 2:
text.append (String.format ("%03X-%03X %02X %02X %s%n", offset,
offset + 1, b[offset], b[offset + 1], desc));
offset + 1, buffer[offset], buffer[offset + 1], desc));
break;
case 3:
text.append (String.format ("%03X-%03X %02X %02X %02X %s%n", offset,
offset + 2, b[offset], b[offset + 1], b[offset + 2], desc));
offset + 2, buffer[offset], buffer[offset + 1], buffer[offset + 2], desc));
break;
case 4:
text.append (String.format ("%03X-%03X %02X %02X %02X %02X %s%n", offset,
offset + 3, b[offset], b[offset + 1], b[offset + 2], b[offset + 3], desc));
offset + 3, buffer[offset], buffer[offset + 1], buffer[offset + 2],
buffer[offset + 3], desc));
break;
default:
System.out.println ("Invalid length : " + size);

View File

@ -533,13 +533,14 @@ public class DiskFactory
private static FormattedDisk check2mgDisk (File file)
{
if (debug)
System.out.println ("Checking Prodos 2mg disk");
System.out.println ("Checking 2mg disk");
try
{
AppleDisk disk = new AppleDisk (file, 0, 0);
if (disk.getTotalBlocks () > 0 && ProdosDisk.isCorrectFormat (disk))
return new ProdosDisk (disk);
// should check for DOS, but AppleDisk assumes 2mg has 512 byte blocks
}
catch (Exception e)
{

View File

@ -45,6 +45,14 @@ class DosVTOCSector extends AbstractSector
addText (text, buffer, 3, 1, "DOS release number");
addText (text, buffer, 4, 2, "Not used");
addTextAndDecimal (text, buffer, 6, 1, "Diskette volume");
addText (text, buffer, 7, 4, "Not used");
addText (text, buffer, 11, 4, "Not used");
addText (text, buffer, 15, 4, "Not used");
addText (text, buffer, 19, 4, "Not used");
addText (text, buffer, 23, 4, "Not used");
addText (text, buffer, 27, 4, "Not used");
addText (text, buffer, 31, 4, "Not used");
addText (text, buffer, 35, 4, "Not used");
addTextAndDecimal (text, buffer, 39, 1, "Maximum TS pairs");
addText (text, buffer, 40, 4, "Not used");
addText (text, buffer, 44, 4, "Not used");

View File

@ -18,7 +18,7 @@ import com.bytezone.diskbrowser.gui.DiskLayoutPanel.LayoutDetails;
class DiskLegendPanel extends JPanel
{
private static final int LEFT = 10;
private static final int LEFT = 3;
private static final int TOP = 10;
private FormattedDisk disk;
@ -69,7 +69,7 @@ class DiskLegendPanel extends JPanel
for (SectorType type : disk.getSectorTypeList ())
{
int x = LEFT + (count % 2 == 0 ? 0 : 145);
int x = LEFT + (count % 2 == 0 ? 0 : 155);
int y = TOP + count++ / 2 * lineHeight;
// draw border

View File

@ -128,6 +128,9 @@ public class PascalDisk extends AbstractFormattedDisk
public static boolean isCorrectFormat (AppleDisk disk, boolean debug)
{
disk.setInterleave (1); // should only ever be Prodos
if (checkFormat (disk, debug))
return true;
disk.setInterleave (0); // SANE Disk 2.po
if (checkFormat (disk, debug))
return true;
return false;

View File

@ -74,20 +74,7 @@ class FileEntry extends CatalogEntry implements ProdosConstants
break;
case GSOS_EXTENDED_FILE:
parentDisk.setSectorType (keyPtr, parentDisk.extendedKeySector);
indexBlocks.add (disk.getDiskAddress (keyPtr));
byte[] buffer2 = disk.readSector (keyPtr); // data fork and resource fork
// read 2 mini entries (data fork / resource fork)
for (int i = 0; i < 512; i += 256)
{
int storageType = buffer2[i] & 0x0F;
int keyBlock = HexFormatter.unsignedShort (buffer2, i + 1);
int eof =
HexFormatter.intValue (buffer2[i + 3], buffer2[i + 4], buffer2[i + 5]);
addDataBlocks (storageType, keyBlock);
}
readForks ();
break;
case SUBDIRECTORY:
@ -102,6 +89,8 @@ class FileEntry extends CatalogEntry implements ProdosConstants
case PASCAL_ON_PROFILE:
indexBlocks.add (disk.getDiskAddress (keyPtr));
System.out.println ("PASCAL on PROFILE: " + name);
// are these blocks guaranteed to be contiguous?
break;
default:
@ -109,6 +98,23 @@ class FileEntry extends CatalogEntry implements ProdosConstants
}
}
private void readForks ()
{
parentDisk.setSectorType (keyPtr, parentDisk.extendedKeySector);
indexBlocks.add (disk.getDiskAddress (keyPtr));
byte[] buffer2 = disk.readSector (keyPtr); // data fork and resource fork
// read 2 mini entries (data fork / resource fork)
for (int i = 0; i < 512; i += 256)
{
int storageType = buffer2[i] & 0x0F;
int keyBlock = HexFormatter.unsignedShort (buffer2, i + 1);
int eof = HexFormatter.intValue (buffer2[i + 3], buffer2[i + 4], buffer2[i + 5]);
addDataBlocks (storageType, keyBlock);
}
}
private void addDataBlocks (int storageType, int keyPtr)
{
DiskAddress emptyDiskAddress = disk.getDiskAddress (0);
@ -188,7 +194,10 @@ class FileEntry extends CatalogEntry implements ProdosConstants
// should be removed
private boolean isGSOSFile ()
{
return ((fileType & 0xF0) == 0x80);
// return ((fileType & 0xF0) == 0x80);
if ((fileType & 0xF0) == 0x80)
System.out.println ("GS/OS file: " + name);
return false;
}
// should be removed
@ -508,6 +517,7 @@ class FileEntry extends CatalogEntry implements ProdosConstants
}
}
// should be removed
private byte[] getGEOSBuffer ()
{
switch (storageType)
@ -525,6 +535,7 @@ class FileEntry extends CatalogEntry implements ProdosConstants
}
}
// should be removed
private byte[] getMasterIndexFile (int keyPtr)
{
byte[] buffer = disk.readSector (keyPtr);
@ -545,6 +556,7 @@ class FileEntry extends CatalogEntry implements ProdosConstants
return fileBuffer;
}
// should be removed
private byte[] getIndexFile (int keyPtr)
{
byte[] buffer = disk.readSector (keyPtr);