exact buffer length
This commit is contained in:
parent
b5c3beda84
commit
208c5f1cd7
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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 ();
|
||||
}
|
||||
}
|
|
@ -141,7 +141,6 @@ abstract class AbstractCatalogEntry implements AppleFileSource
|
|||
try
|
||||
{
|
||||
byte[] exactBuffer;
|
||||
byte[] extraBuffer = new byte[0];
|
||||
|
||||
switch (this.fileType)
|
||||
{
|
||||
|
|
|
@ -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 ());
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue