Class CpmFileEntry

java.lang.Object
com.webcodepro.applecommander.storage.os.cpm.CpmFileEntry
All Implemented Interfaces:
FileEntry

public class CpmFileEntry extends Object implements FileEntry
Support the CP/M file entry. Note that this may actually contain references to multiple file entries via the extent counter.

  • Field Details

    • ENTRY_LENGTH

      public static final int ENTRY_LENGTH
      The standard CP/M file entry length.
      See Also:
    • MAX_EXTENTS_PER_ENTRY

      public static final int MAX_EXTENTS_PER_ENTRY
      The maximum number of extents per file entry record.
      See Also:
    • ALL_RECORDS_FILLED_SIZE

      public static final int ALL_RECORDS_FILLED_SIZE
      The number of bytes used if all records in an extent are filled. (MAX_EXTENTS_PER_ENTRY * CPM_SECTOR_SIZE)
      See Also:
    • USER_NUMBER_OFFSET

      public static final int USER_NUMBER_OFFSET
      The user number (UU) field is to distinguish multiple files with the same filename. This appears to be primarily with deleted files?
      See Also:
    • FILENAME_OFFSET

      public static final int FILENAME_OFFSET
      Offset to beginning of the filename.
      See Also:
    • FILENAME_LENGTH

      public static final int FILENAME_LENGTH
      Filename length (excluding extension).
      See Also:
    • FILETYPE_OFFSET

      public static final int FILETYPE_OFFSET
      Offset to beginning of the filetype.
      See Also:
    • FILETYPE_LENGTH

      public static final int FILETYPE_LENGTH
      Filetype length.
      See Also:
    • FILETYPE_T1_OFFSET

      public static final int FILETYPE_T1_OFFSET
      Offset to the filetype "T1" entry. Indicates read-only.
      See Also:
    • FILETYPE_T2_OFFSET

      public static final int FILETYPE_T2_OFFSET
      Offset to the filetype "T2" entry. Indicates system or hidden file.
      See Also:
    • FILETYPE_T3_OFFSET

      public static final int FILETYPE_T3_OFFSET
      Offset to the filetype "T3" entry. Backup bit (CP/M 3.1 and later).
      See Also:
    • EXTENT_COUNTER_OFFSET

      public static final int EXTENT_COUNTER_OFFSET
      Offset to the extent counter (EX) field.
      See Also:
    • RECORD_COUNT_OFFSET

      public static final int RECORD_COUNT_OFFSET
      Offset to the record count (RC) field.
      See Also:
    • ALLOCATION_OFFSET

      public static final int ALLOCATION_OFFSET
      Beginning of block allocations.
      See Also:
    • TEXT_FILETYPES

      public static final String[] TEXT_FILETYPES
      A short collection of known text-type files.
  • Constructor Details

    • CpmFileEntry

      public CpmFileEntry(CpmFormatDisk disk, int offset)
      Construct a CP/M file entry.
  • Method Details

    • addOffset

      public void addOffset(int offset)
      Add another directory offset to this file entry.
    • readFileEntry

      protected byte[] readFileEntry(int number)
      Read the fileEntry bytes from the disk image.
    • writeFileEntry

      protected void writeFileEntry(int number, byte[] entry)
      Write the fileEntry bytes back to the disk image.
    • getFilename

      public String getFilename()
      Answer with the name of the file.
      Specified by:
      getFilename in interface FileEntry
      See Also:
    • setFilename

      public void setFilename(String filename)
      Set the filename. Note that this assumes the file extension is completely separate and does not validate characters that are being set!
      Specified by:
      setFilename in interface FileEntry
      See Also:
    • getFiletype

      public String getFiletype()
      Answer with the filetype.
      Specified by:
      getFiletype in interface FileEntry
      See Also:
    • setFiletype

      public void setFiletype(String filetype)
      Set the filetype. Note that the highbits need to be preserved.
      Specified by:
      setFiletype in interface FileEntry
      See Also:
    • isLocked

      public boolean isLocked()
      Indicates if this file is locked.
      Specified by:
      isLocked in interface FileEntry
      See Also:
    • getFileTypeT1

      public byte getFileTypeT1(int entryNumber)
      Read the file type T1 entry. This is the 1st character of the file type and the high bit indicates read-only.
    • setFileTypeT1

      public void setFileTypeT1(int entryNumber, int t1)
      Write the file type T1 entry.
    • getFileTypeT2

      public byte getFileTypeT2(int entryNumber)
      Read the file type T2 entry. This is the 2nd character of the file type and the high bit indicates a system or hidden file.
    • setFileTypeT2

      public void setFileTypeT2(int entryNumber, int t2)
      Write the file type T2 entry.
    • getFileTypeT3

      public byte getFileTypeT3(int entryNumber)
      Read the file type T3 entry. This is the 3rd character of the file type and the high bit is the backup bit (CP/M 3.1 and later).
    • setFileTypeT3

      public void setFileTypeT3(int entryNumber, int t3)
      Write the file type T3 entry.
    • setLocked

      public void setLocked(boolean lock)
      Set the locked status. This is interpreted as read-only.
      Specified by:
      setLocked in interface FileEntry
      See Also:
    • getExtentCounterLow

      public int getExtentCounterLow(int entryNumber)
      Read the extent number, low byte.
    • getSize

      public int getSize()
      Compute the size of this file (in bytes).
      Specified by:
      getSize in interface FileEntry
      See Also:
    • findLargestExtent

      protected int findLargestExtent()
      Locate the largest extent for this file.
    • getBlocksUsed

      public int getBlocksUsed()
      Compute the number of blocks used.
    • getNumberOfRecordsUsed

      public int getNumberOfRecordsUsed(int entryNumber)
      Return the number of records used in this extent, low byte. 1 record = 128 bytes.
    • isDirectory

      public boolean isDirectory()
      Apple CP/M does not support directories.
      Specified by:
      isDirectory in interface FileEntry
      See Also:
    • isDeleted

      public boolean isDeleted()
      Indicates if this fileEntry is a deleted file.
      Specified by:
      isDeleted in interface FileEntry
      See Also:
    • getUserNumber

      public int getUserNumber(int entryNumber)
      Return the user number (UU). 0-15 on Apple CP/M (can range to 31 on some systems). The user number allows multiple files with the same name to coexist on the disk. Apparently, this is used in conjunction with deleted files.
    • setUserNumber

      public void setUserNumber(int entryNumber, int userNumber)
      Write the user number (UU).
    • delete

      public void delete()
      There appears to be no disk map involved, so deleting a file consists of writing a 0xe5 to the user number.
      Specified by:
      delete in interface FileEntry
      See Also:
    • getFileColumnData

      public List<String> getFileColumnData(int displayMode)
      Get the standard file column header information. This default implementation is intended only for standard mode. displayMode is specified in FormattedDisk.
      Specified by:
      getFileColumnData in interface FileEntry
    • getFileData

      public byte[] getFileData()
      Get file data. This handles any operating-system specific issues.
      Specified by:
      getFileData in interface FileEntry
      See Also:
    • setFileData

      public void setFileData(byte[] data) throws DiskFullException
      Set file data. This, essentially, is saving data to disk using this file entry.
      Specified by:
      setFileData in interface FileEntry
      Throws:
      DiskFullException
      See Also:
    • getSuggestedFilter

      public FileFilter getSuggestedFilter()
      Get the suggested FileFilter. This is a guess based on what appears to be text-based files.
      Specified by:
      getSuggestedFilter in interface FileEntry
      See Also:
    • getFormattedDisk

      public FormattedDisk getFormattedDisk()
      Answer with the formatted disk.
      Specified by:
      getFormattedDisk in interface FileEntry
      See Also:
    • getMaximumFilenameLength

      public int getMaximumFilenameLength()
      Answer with the maximum filename length.
      Specified by:
      getMaximumFilenameLength in interface FileEntry
      See Also:
    • needsAddress

      public boolean needsAddress()
      Indicates if this filetype requires an address component.
      Specified by:
      needsAddress in interface FileEntry
      See Also:
    • setAddress

      public void setAddress(int address)
      Set the address that this file loads at.
      Specified by:
      setAddress in interface FileEntry
      See Also:
    • getAddress

      public int getAddress()
      Get the address that this file loads at.
      Specified by:
      getAddress in interface FileEntry
    • isEmpty

      public boolean isEmpty()
      Indicates if this is an empty file entry. An empty file entry contains all 0xE5.
    • getAllocations

      public int[] getAllocations()
      Answer with a list of blocks allocated to this file.