File Allocation Table (CPU6) - Nakazoto/CenturionComputer GitHub Wiki

File Allocation for the CPU6 File System

This insanely good analysis of how File Allocation works was done by the very talented Rick Hole on the Discord. If you're on the Discord, give him a virtual high five, because this is amazing!

Brief

This report compares the file organization of a typical Centurion Hawk drive image file using Centurion_File_Tool (free-ware available from this author). Data produced by this tool has been carefully verified against ren14500’s fsscan.

With an eye toward making the CEN emulator capable of uploading files from host to the emulator’s disk image, it is necessary to discover how the FAL (Free-space allocation list) files work. To aid in the discovery, an external sector allocation table is generated by the tool, one for each directory (Root and all Libraries).

How Allocation Tables Work

This table is entirely generated from the UAL files and is a “thing” of the Tool, not as far as I can detect, found anywhere on the actual disk image. It is used as a way of constructing a map of the disk without any reference to the FAL file, in order to use it to explain how the FAL file works.

A byte array is constructed with one byte representing every sector on the disk. The file system directories are scanned and the sectors allocated for each file (the information to do this is stored in the UAT files) and each array entry is recorded with a character indicating the type of allocation (see Legend at the top of each Allocation table printout). It could have been done with characters for “allocated”, “not allocated”, and for the Libraries all sectors outside their scope marked as blanks for “out of bounds”. It seemed useful to mark the system files (LOD, DIR, UAL and FAL) distinctly.

ROOT directory: The byte array is initialized to all unallocated. The directory, not surprisingly, holds the allocation for each Library directory. ROOT is considered to have authority for all sectors on the disk, though it cannot allocate a new file into any Library allocation as they are shown as allocated to the ROOT directory.

LIBRARY directories: have the scope only of sectors allocated to them in the ROOT directory. Everywhere is is out of bounds. Libraries are treated as independent file systems. Note that is is possible that the sectors assigned to the directory may not be contiguous. Note the gap in USAGI directory.

Generating the Allocation Tables

The tables for one disk image are copies below. Those tables were examined manually and a chart was made for each showing the beginning sector number and length of each string of unallocated sectors.

Centurion_File_Tool then produced a similar table using data from the FAL files for each directory. The documentation for the FAL lists is lacking, so the scheme is discerned by observation, trial and error. The latest assumptions of FAL format are listed at the close of this report. The generated tables have the headers:

“=== List INDIR File Contents ===” These tables match the manual lists exactly so it is confirmed the “high likelihood” that FAL format has been determined.

Allocation for ROOT directory

Legend:

  • L => System Loader
  • F => FAL Freespace Allocation List
  • D => Directory
  • X => User file allocation
  • U => UAL Allocation List
  • . => Free space (unallocated)
  • => Sector not allocated to this LIB

Allocation for ROOT directory

Sector +00............0f  +10............1f  +20............2f  +30............3f
0000:  LLLLLLLL LLLLLLLL  DDDDDDDD DDDDDDDD  DDDDDDDD DDDDDDDD  UUUUUUUU UUUUUUUU  
0040:  UUUUUUUU UUUUUUUU  FFFFFFFF FFFFFFFF  FFFFFFFF FFFFFFFF  XXXXXXXX XXXXXXXX  
0080:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
00c0:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0100:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0140:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0180:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
01c0:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0200:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0240:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0280:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
02c0:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0300:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0340:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0380:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
03c0:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0400:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0440:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0480:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
04c0:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0500:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0540:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0580:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
05c0:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0600:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0640:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0680:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
06c0:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  	
0700:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0740:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0780:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
07c0:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0800:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0840:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0880:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
08c0:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0900:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0940:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0980:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
09c0:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0a00:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0a40:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0a80:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0ac0:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0b00:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0b40:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0b80:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0bc0:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0c00:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0c40:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0c80:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0cc0:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0d00:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0d40:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0d80:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0dc0:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0e00:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0e40:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  .XXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0e80:  X....... ........  .XXXXXXX XXXXXXXX  X....... ........  ........ ........  
0ec0:  .XXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  X....... ........  ........ ........  
0f00:  .XXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  X....... ........  ........ ........  
0f40:  ........ ........  ........ ........  ........ ........  ........ ........  
0f80:  .XXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  X....... ........  
0fc0:  ........ ........  ........ ........  .....XXX XXXXXXXX  XXXXXXXX XXXXXXXX  
1000:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
1040:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
1080:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
10c0:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
1100:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
1140:  XXXXX... ........  XXXXXXXX XXXX.XXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
1180:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
11c0:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
1200:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
1240:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
1280:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
12c0:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
1300:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
1340:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
1380:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
13c0:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
1400:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
1440:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
1480:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
14c0:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
1500:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
1540:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
1580:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXX...  ........ ........  
  • 15c0 – 333f are all unallocated sectors
    • Sectors Used= 5308
    • Sectors Total= 13120 40%

List INDIR File Contents: @SFAL0 00a000

FAL Type Len xx Start Free Sectors +offset 0000
000000: 00 0001 00 0e60 @ 0e60: 1 S @ 0e60
000006: 00 0010 00 0e81 @ 0e81: 16 S @ 0e81
00000c: 00 0020 00 0ea1 @ 0ea1: 32 S @ 0ea1
000012: 00 0020 00 0ee1 @ 0ee1: 32 S @ 0ee1
000018: 00 0060 00 0f21 @ 0f21: 96 S @ 0f21
00001e: 00 0034 00 0fb1 @ 0fb1: 52 S @ 0fb1
000024: 00 000b 00 1145 @ 1145: 11 S @ 1145
00002a: 00 0001 00 115c @ 115c: 1 S @ 115c
000030: 00 1cf3 00 15ad @ 15ad: 7411 S @ 15ad
000036: ff ffff c4 0004 .End of List.
  • Manual scan ROOT:
    • Free Sector
      • 1 @ 0e60
      • 16 @ 0e81
      • 32 @ 0ea1
      • 32 @ 0ee1
      • 96 @ 0f21
      • 52 @ 0fb1
      • 11 @ 1145
      • 1 @ 115c
  • 7411 @ 15ad

Manual scan confirms FAL entries

Allocation for Library @SYS

Legend:

  • L => System Loader
  • F => FAL Freespace Allocation List
  • D => Directory
  • X => User file allocation
  • U => UAL Allocation List
  • . => Free space (unallocated)
  • => Sector not allocated to this LIB

Allocation for Library @SYS

Sector +00............0f  +10............1f  +20............2f  +30............3f
0040:                                                           DDDDDDUU UUUUUUFX  
0080:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
00c0:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0100:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0140:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0180:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
01c0:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0200:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0240:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0280:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
02c0:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXX.. ........  ........ ........  
0300:  ........ ........  ........ ........  ........ ........  ........ ........  
0340:  ........ ........  ........ ........  ........ ........  ........ ........  
0380:  ........ ........  ........ ........  ........ ........  ........ ........  
03c0:  ........ ........  ........ ........  ........ ........  ........ ........  
0400:  ........ ........  ........ ........  ........ ........  ........ ........  
0440:  ........ ........  ........ ........  ........ ........                     
  • Sectors Used= 630
  • Sectors Total= 1024 61%

List INDIR File Contents: @PFAL0 00fc00

FAL Type Len xx Start Free Sectors +offset 0070
000000: fe ffff 00 0276 @ 0276: to end @ 02e6

Manual scan confirms FAL entry

Allocation for Library S

Legend:

  • L => System Loader
  • F => FAL Freespace Allocation List
  • D => Directory
  • X => User file allocation
  • U => UAL Allocation List
  • . => Free space (unallocated)
  • => Sector not allocated to this LIB

Allocation for Library S

Sector +00............0f  +10............1f  +20............2f  +30............3f
04c0:                                                           DDDDDDDD UUUUUUUU  
0500:  FFFFXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0540:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0580:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
05c0:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0600:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0640:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0680:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
06c0:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  ........ ........                     
  • Sectors Used= 496
  • Sectors Total= 512 96%

List INDIR File Contents: @PFAL0 0a0000

FAL Type Len xx Start ....Parsed...
000000: fe ffff 00 01f0 65535S @ 01f0 at 04f0+01f0=06e0

Manual scan confirms FAL entry

Allocation for Library P

Legend:

  • L => System Loader
  • F => FAL Freespace Allocation List
  • D => Directory
  • X => User file allocation
  • U => UAL Allocation List
  • . => Free space (unallocated)
  • => Sector not allocated to this LIB

Allocation for Library P

Sector +00............0f  +10............1f  +20............2f  +30............3f
06c0:                                                           DDDDDDUU UUUUFFFF  
0700:  FFFFFFFF FFFFFFFF  FFFFFFFF FFFFFFFF  FFFFFFFF FFFFFFFF  FFFFFFFF FFFFXXXX  
0740:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0780:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
07c0:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0800:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0840:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0880:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
08c0:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0900:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0940:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0980:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
09c0:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0a00:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0a40:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0a80:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0ac0:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0b00:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXX.. ........                     
  • Sectors Used= 1078
  • Sectors Total= 1088 99%

List INDIR File Contents: @PFAL0 0df800

FAL Type Len xx Start Free Sectors +offset 06f0
000000: fe ffff 00 0436 @ 0436: to end @ 0b26

Manual scan confirms FAL entry

Allocation for Library ?

Legend:

  • L => System Loader
  • F => FAL Freespace Allocation List
  • D => Directory
  • X => User file allocation
  • U => UAL Allocation List
  • . => Free space (unallocated)
  • => Sector not allocated to this LIB

Allocation for Library ?

Sector +00............0f  +10............1f  +20............2f  +30............3f
0b00:                                                           DDDDDDDD UUUUUUUU  
0b40:  FFFFXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0b80:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0bc0:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0c00:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0c40:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0c80:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0cc0:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0d00:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0d40:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0d80:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0dc0:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0e00:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
0e40:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXX....                                        
  • Sectors Used= 812
  • Sectors Total= 816 99%

List INDIR File Contents: @PFAL0 168000

FAL Type Len xx Start Free Sectors +offset 0b30
000006: fe ffff 00 032c @ 032c: to end @ 0e5c

Manual scan confirms FAL entry

Allocation for Library PC

Legend:

  • L => System Loader
  • F => FAL Freespace Allocation List
  • D => Directory
  • X => User file allocation
  • U => UAL Allocation List
  • . => Free space (unallocated)
  • => Sector not allocated to this LIB

Allocation for Library PC

Sector +00............0f  +10............1f  +20............2f  +30............3f
1140:                                   DDD  DDDDDUUU UUUUUFFF  FFFFFXXX XXXXXXXX  
1180:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXX.....  
11c0:  ........ ........  ........ ........  ........ .....XXX  XXXXXXXX XXXXXXXX  
1200:  XXXXXXXX XXXXXXXX  XXXXXXXX XXX..XXX  XXXXXXXX XXXXXXXX  XXXXXXXX X.......  
1240:  ........ ........  ........ .....                                           
  • Sectors Used= 168
  • Sectors Total= 256 65%

List INDIR File Contents: @PFAL0 22da00

FAL Type Len xx Start Free Sectors +offset 115d
000000: 00 0032 00 005e @ 005e: 50 S @ 11bb
000006: 00 0002 00 00be @ 00be: 2 S @ 121b
00000c: fe ffff 00 00dc @ 00dc: to end @ 1239

Manual scan confirms FAL entry

Allocation for Library USAGI

Legend:

  • L => System Loader
  • F => FAL Freespace Allocation List
  • D => Directory
  • X => User file allocation
  • U => UAL Allocation List
  • . => Free space (unallocated)
  • => Sector not allocated to this LIB

Allocation for Library USAGI

Sector +00............0f  +10............1f  +20............2f  +30............3f
0fc0:                                             DDD DDDDDUUU  UUUUUFFF FFFFFXXX  
1000:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
1040:  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  XXXXXXXX XXXXXXXX  
1080:  XXXXXXXX XXXXXXXX  XXXXXXXX XX......  .....XXX XXXXXXXX  XXXXX... ........  
10c0:  ........ ........  ........ ........  ........ ........  ........ ........  
1100:  ........ ........  ........ ........  ........ ........  ........ ........  
1140:  .....                                                                       
1240:                                   ...  ........ ........  ........ ........  
1280:  ........ ........  ........ ........  ........ ........  ........ ........  
12c0:  ........ ........  ........ ........  ........ ........  ........ ........  
1300:  ........ ........  ........ ........  ........ ........  ........ ........  
1340:  ........ ........  ........ ........  ........ ........  ........ ........  
1380:  ........ ........  ........ ........  ........ ........  ........ ........  
13c0:  ........ ........  ........ ........  ........ ........  ........ ........  
1400:  ........ ........  ........ ........  ........ ........  ........ ........  
1440:  ........ ........  ........ ........  ........ ........  ........ ........  
1480:  ........ ........  ........ ........  ........ ........  ........ ........  
14c0:  ........ ........  ........ ........  ........ ........  ........ ........  
1500:  ........ ........  ........ ........  ........ ........  ........ ........  
1540:  ........ ........  ........ ........  ........ ........  ........ ........  
1580:  ........ ........  ........ ........  ........ .....                        
  • Sectors Used= 197
  • Sectors Total= 1200 16%

List INDIR File Contents: @PFAL0 1fea00

FAL Type Len xx Start Free Sectors +offset 0fe5
000000: 00 000b 00 00b5 @ 00b5: 11 S @ 109a
000006: fe ffff 00 00d0 @ 00d0: to end @ 10b5

Manual scan confirms FAL entry

FAL List Format

FAL list is contain in file @SFAL0 for the Root directory and @PFAL0 for each Librarydirectory.

Each entry consists of six bytes:

For example:

byte[0] byte[1]-byte[2] byte[3] byte[4]-byte[5]
00 00 - 0b 00 00 - b5
Byte Cat. Type Note
Byte[0] TYPE uint8_t value 00 for free space entry designated sector count and start sector number
Byte[1]-[2] COUNT uint16_t Number of free sectors for this entry
Byte[3] ?? uint8_t unused (see speculation below)
Byte[4]-[5] START uint16_t Sector address of the first sector in this unassigned block
Byte Value Note
Bytes[0]-[1]-[2] ff ff ff Designates the end-of -list (optional)
fe ff ff Designates that the remainder of the sectors beginning with START are all unassigned. This also serves as enf-of-list.
00 00 00 Designates a null entry, to be ignored
  • If there is no end-of-list all zeroes will follow and the scan terminates at the end of the FAL file sector list.

SPECULATION:

  • It may be that Byte[0]-[1][2] are a 3 byte uint24_t COUNT whenever it is not 00 00 00, fe ff ff, or ff ff ff.
  • It may be that byte[3]-[4]-[5] are a 3 byte uint24_t START.

This could be for compatibility with the tape system, or in anticipation of then-future disks with greater capacity. It is not necessary to finalize this with the Hawk images we are now using.  

How to Allocate a New File

For emulator use, for example, to drag and drop a file from host computer onto the emulated file system.

To be reported after I have demonstrated this. For now, consider this section as speculation.

  • Specify file name, library (if any), file size increment, file size, file type
  • Calculate initial file size in sectors
  • Examine FAL list in destination directory. Find a starting sector with enough sectors.
    • If necessary due to fragmentation, use several existing FAL entries to get the sectors needed
    • Alternatively, use the fe ff ff entry, modify its starting sector to follow the new allocation
    • Generate a new FAL with the changes or additional entries made, write it to the .IMG file
  • Create a new directory entry
    • Find an all-zero entry in the DIR file
    • Format the entry, including the entry for UAL file
    • Write new DIR entry
    • Merge new UAL entry into UAL list and write to UAL file

Decoding the FAL table

These (modified for development) FAL listings detect end-of-list only by ff ff ff. All-zero entries are not printed.

List INDIR File Contents: @PFAL0 0df800

FAL Type Len xx Start Free Sectors +offset 06f0
000000: fe ffff 00 0436 @ 0436: to end @ 0b26
000006: fe ffff 00 0436 @ 0436: to end @ 0b26
  • The first entry is valid as confirmed by the UAL derived allocation table.
  • The second entry duplicates the first. Assuming FE FF FF also functions as end-of-list, the second entry is left-over meaningless data and to be ignored.

List INDIR File Contents: ?.@PFAL0 FAL @168000 (From Rick.IMG)

FAL Type Len xx Start Free Sectors +offset 0b30
000000: 00 0000 00 0245 @ 0245: 0 S @ 0d75
000006: fe ffff 00 032c @ 032c: to end @ 0e5c
00000c: fe ffff 00 032c @ 032c: to end @ 0e5c
000012: fe ffff 00 031e @ 031e: to end @ 0e4e
000018: fe ffff 00 031e @ 031e: to end @ 0e4e
00001e: fe ffff 00 0338 @ 0338: to end @ 0e68
  • The first entry, at 000000 is a zero-length free-space, possibly a previous entry which was used to allocate a new file, it could be used now to store a newly unassigned block of sectors.
  • Entries after 00000c appear to be obsolete, left-overs to be ignored. 00000c duplicates 000006. 000018 duplicates 000012 and points to a currently allocated block so is invalid. Entry 00001e also points to a currently allocated block so is invalid.
  • The best consideration is that the first fe ff ff is the only one to be considered. It should be treated as giving an allocation of free space AND as end-of-list.

Differences between ROOT FAL and LIB FAL

ROOT uses 0000 as directory base address. There is no sectorMap list for ROOT as the whole disk is considered “in-bounds”. ROOT does not appear to use the fe ff ff “here to end of sectorlist” entry, but uses a normal free-space entry followed by ff ff ff for end-of-list. LIBs appear always to end with fe ff ff instead. I see no instance of a LIB file with FF FF FF used.

fe ff ff must be used for allocating a new file with caution as it is necessary to use the root directory recored entry for the sector map and the sectors from the offset given to the end of the list may not be contiguous.

Author:

  • Richard Hole
  • July 3, 2023
⚠️ **GitHub.com Fallback** ⚠️