File Allocation Table (CPU6) - Nakazoto/CenturionComputer GitHub Wiki
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!
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).
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.
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.
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
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
- Free Sector
- 7411 @ 15ad
Manual scan confirms FAL entries
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
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
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
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
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
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
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
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
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
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
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
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 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.
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
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.
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