From 208c5f1cd771b9de8ac2dc37bbeac348d0bc36e2 Mon Sep 17 00:00:00 2001 From: Denis Molony Date: Fri, 26 Feb 2016 22:03:29 +1100 Subject: [PATCH] exact buffer length --- src/com/bytezone/diskbrowser/cpm/CPMDisk.java | 7 +++ .../diskbrowser/cpm/DirectoryEntry.java | 14 +++++- .../bytezone/diskbrowser/cpm/TextFile.java | 44 +++++++++++++++++++ .../diskbrowser/dos/AbstractCatalogEntry.java | 1 - .../diskbrowser/dos/CatalogEntry.java | 17 +++---- src/com/bytezone/diskbrowser/dos/DosDisk.java | 21 +++------ 6 files changed, 79 insertions(+), 25 deletions(-) create mode 100644 src/com/bytezone/diskbrowser/cpm/TextFile.java diff --git a/src/com/bytezone/diskbrowser/cpm/CPMDisk.java b/src/com/bytezone/diskbrowser/cpm/CPMDisk.java index 34d2366..4fecbd4 100644 --- a/src/com/bytezone/diskbrowser/cpm/CPMDisk.java +++ b/src/com/bytezone/diskbrowser/cpm/CPMDisk.java @@ -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); } diff --git a/src/com/bytezone/diskbrowser/cpm/DirectoryEntry.java b/src/com/bytezone/diskbrowser/cpm/DirectoryEntry.java index 5cc8dfd..8421127 100644 --- a/src/com/bytezone/diskbrowser/cpm/DirectoryEntry.java +++ b/src/com/bytezone/diskbrowser/cpm/DirectoryEntry.java @@ -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; } diff --git a/src/com/bytezone/diskbrowser/cpm/TextFile.java b/src/com/bytezone/diskbrowser/cpm/TextFile.java new file mode 100644 index 0000000..08dc41b --- /dev/null +++ b/src/com/bytezone/diskbrowser/cpm/TextFile.java @@ -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 (); + } +} \ No newline at end of file diff --git a/src/com/bytezone/diskbrowser/dos/AbstractCatalogEntry.java b/src/com/bytezone/diskbrowser/dos/AbstractCatalogEntry.java index e3c45b3..9b4fa43 100644 --- a/src/com/bytezone/diskbrowser/dos/AbstractCatalogEntry.java +++ b/src/com/bytezone/diskbrowser/dos/AbstractCatalogEntry.java @@ -141,7 +141,6 @@ abstract class AbstractCatalogEntry implements AppleFileSource try { byte[] exactBuffer; - byte[] extraBuffer = new byte[0]; switch (this.fileType) { diff --git a/src/com/bytezone/diskbrowser/dos/CatalogEntry.java b/src/com/bytezone/diskbrowser/dos/CatalogEntry.java index a9a18a6..51e8d7e 100644 --- a/src/com/bytezone/diskbrowser/dos/CatalogEntry.java +++ b/src/com/bytezone/diskbrowser/dos/CatalogEntry.java @@ -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 ()); } } \ No newline at end of file diff --git a/src/com/bytezone/diskbrowser/dos/DosDisk.java b/src/com/bytezone/diskbrowser/dos/DosDisk.java index 9e7c5f2..c889407 100755 --- a/src/com/bytezone/diskbrowser/dos/DosDisk.java +++ b/src/com/bytezone/diskbrowser/dos/DosDisk.java @@ -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 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);