exact buffer length

This commit is contained in:
Denis Molony 2016-02-26 22:03:29 +11:00
parent b5c3beda84
commit 208c5f1cd7
6 changed files with 79 additions and 25 deletions

View File

@ -19,6 +19,7 @@ public class CPMDisk extends AbstractFormattedDisk
public final SectorType dataSector = new SectorType ("Data", Color.blue);
public final SectorType docSector = new SectorType ("DOC", Color.cyan);
public final SectorType basSector = new SectorType ("BAS", Color.gray);
public final SectorType asmSector = new SectorType ("ASM", Color.orange);
private int version; // http://www.seasip.info/Cpm/format22.html
@ -32,6 +33,7 @@ public class CPMDisk extends AbstractFormattedDisk
sectorTypesList.add (dataSector);
sectorTypesList.add (basSector);
sectorTypesList.add (docSector);
sectorTypesList.add (asmSector);
getDisk ().setEmptyByte ((byte) 0xE5);
setSectorTypes ();
@ -92,6 +94,8 @@ public class CPMDisk extends AbstractFormattedDisk
return basSector;
if ("PRN".equals (type))
return prnSector;
if ("ASM".equals (type))
return asmSector;
return dataSector;
}
@ -122,6 +126,9 @@ public class CPMDisk extends AbstractFormattedDisk
if (type == catalogSector)
return new CPMCatalogSector (disk, buffer);
// if (type == asmSector)
// return new ASMSector (disk, buffer);
return super.getFormattedSector (da);
}

View File

@ -148,12 +148,24 @@ public class DirectoryEntry implements AppleFileSource
return appleFile;
byte[] buffer = disk.readSectors (blocks);
if (buffer.length == 0)
{
appleFile = new DefaultAppleFile (name, buffer);
return appleFile;
}
appleFile = new DefaultAppleFile (name, buffer);
DirectoryEntry entry = rc == 0x80 ? entries.get (entries.size () - 1) : this;
int len = (entry.ex * 128 + entry.rc) * 128;
byte[] exactBuffer = new byte[len];
System.arraycopy (buffer, 0, exactBuffer, 0, len);
if ("ASM".equals (type))
appleFile = new TextFile (name, exactBuffer);
else
appleFile = new DefaultAppleFile (name, exactBuffer, "CPM File : " + type);
return appleFile;
}

View File

@ -0,0 +1,44 @@
package com.bytezone.diskbrowser.cpm;
import com.bytezone.diskbrowser.applefile.AbstractFile;
public class TextFile extends AbstractFile
{
public TextFile (String name, byte[] buffer)
{
super (name, buffer);
}
@Override
public String getText ()
{
StringBuilder text = new StringBuilder ();
text.append ("Name : " + name + "\n\n");
int ptr = 0;
while (ptr < buffer.length && buffer[ptr] != (byte) 0x1A)
{
String line = getLine (ptr);
text.append (line + "\n");
ptr += line.length () + 2;
}
if (text.length () > 0)
text.deleteCharAt (text.length () - 1);
return text.toString ();
}
private String getLine (int ptr)
{
StringBuilder line = new StringBuilder ();
int max = buffer.length - 1;
while (ptr < max && buffer[ptr] != 0x0D && buffer[ptr + 1] != 0x0A)
line.append ((char) buffer[ptr++]);
return line.toString ();
}
}

View File

@ -141,7 +141,6 @@ abstract class AbstractCatalogEntry implements AppleFileSource
try
{
byte[] exactBuffer;
byte[] extraBuffer = new byte[0];
switch (this.fileType)
{

View File

@ -65,7 +65,8 @@ class CatalogEntry extends AbstractCatalogEntry
dosDisk.sectorTypes[da.getBlock ()] = dosDisk.dataSector;
else
{
System.out.print ("Attempt to assign Data sector to occupied sector : " + da);
System.out
.print ("Attempt to assign Data sector to occupied sector : " + da);
System.out.println (" from " + name);
}
}
@ -75,7 +76,8 @@ class CatalogEntry extends AbstractCatalogEntry
if (da == null)
{
System.out.print ("Next T/S list in sector " + da);
System.out.printf (" is invalid : %02X, %02X%n", sectorBuffer[1], sectorBuffer[2]);
System.out.printf (" is invalid : %02X, %02X%n", sectorBuffer[1],
sectorBuffer[2]);
break;
}
}
@ -104,11 +106,10 @@ class CatalogEntry extends AbstractCatalogEntry
switch (fileType)
{
case IntegerBasic:
// length = HexFormatter.intValue (buffer[0], buffer[1]);
// break;
case ApplesoftBasic:
length = HexFormatter.intValue (buffer[0], buffer[1]);
break;
default:
address = HexFormatter.intValue (buffer[0], buffer[1]);
length = HexFormatter.intValue (buffer[2], buffer[3]);
@ -127,9 +128,9 @@ class CatalogEntry extends AbstractCatalogEntry
message += "Bad size (" + reportedSize + ") ";
if (dataSectors.size () == 0)
message += "No data ";
return String.format ("%1s %1s %03d %-30.30s %-5s %-13s %2d %3d %s", lockedFlag,
getFileType (), actualSize, name, addressText, lengthText,
tsSectors.size (), (dataSectors.size () - textFileGaps),
message.trim ());
return String.format ("%1s %1s %03d %-30.30s %-5s " + "%-13s %2d %3d %s",
lockedFlag, getFileType (), actualSize, name, addressText,
lengthText, tsSectors.size (),
(dataSectors.size () - textFileGaps), message.trim ());
}
}

View File

@ -112,7 +112,7 @@ public class DosDisk extends AbstractFormattedDisk
// same loop, but now all the catalog sectors are properly flagged
da = disk.getDiskAddress (catalogStart.getBlock ());
loop: do
do
{
if (!disk.isValidAddress (da))
break;
@ -122,9 +122,8 @@ public class DosDisk extends AbstractFormattedDisk
for (int ptr = 11; ptr < 256; ptr += ENTRY_SIZE)
{
if (sectorBuffer[ptr] == 0) // empty slot, no more catalog entries
if (sectorBuffer[ptr] == 0) // empty slot, no more catalog entries
continue;
// break loop;
byte[] entry = new byte[ENTRY_SIZE];
System.arraycopy (sectorBuffer, ptr, entry, 0, ENTRY_SIZE);
@ -153,7 +152,6 @@ public class DosDisk extends AbstractFormattedDisk
if (!disk.isValidAddress (track, sector))
break;
// int thisBlock = da.getBlock ();
da = disk.getDiskAddress (sectorBuffer[1], sectorBuffer[2]);
} while (da.getBlock () != 0);
@ -337,15 +335,6 @@ public class DosDisk extends AbstractFormattedDisk
return super.getFormattedSector (da);
}
// @Override
// public String getSectorFilename (DiskAddress da)
// {
// for (AppleFileSource ce : fileEntries)
// if (((CatalogEntry) ce).contains (da))
// return ((CatalogEntry) ce).name;
// return null;
// }
@Override
public List<DiskAddress> getFileSectors (int fileNo)
{
@ -371,12 +360,14 @@ public class DosDisk extends AbstractFormattedDisk
text.append (line);
text.append (String.format (
" Free sectors: %3d Used sectors: %3d Total sectors: %3d",
" Free sectors: %3d "
+ "Used sectors: %3d Total sectors: %3d",
dosVTOCSector.freeSectors, dosVTOCSector.usedSectors,
(dosVTOCSector.freeSectors + dosVTOCSector.usedSectors)));
if (dosVTOCSector.freeSectors != freeSectors)
text.append (String.format (
"%nActual: Free sectors: %3d Used sectors: %3d Total sectors: %3d",
"%nActual: Free sectors: %3d "
+ "Used sectors: %3d Total sectors: %3d",
freeSectors, usedSectors, (usedSectors + freeSectors)));
return new DefaultAppleFileSource ("Volume " + dosVTOCSector.volume, text.toString (),
this);