Files
docs/ADFS.txt

1 line
6.6 KiB
Plaintext
Raw Permalink Normal View History

2014-06-08 01:31:21 +01:00
Acorn 8-Bit ADFS Filesystem Structure ===================================== mdfs.net/Docs/Comp/Disk/Format/ADFS Acorn 8-bit ADFS is often refered to as ADFS-S, ADFS-M and ADFS-L, but these refer to the size of formatted floppy disks. The filesystem is identical, and is the same regardless of the media the data is on. Acorn ADFS uses 256-byte logical disk sectors. Logical sectors are counted with 24-bit numbers starting from &000000 at the start of the filesystem, so the largest possible ADFS disk system is 4G. Acorn ADFS uses 32-bit file lengths, so the largest possible file is 4G-1. However, the ADFS API uses the top three bits of the sector address to specify the drive, leaving 21 bits to specify the logical sector, so in practice the largest possible filesystem is 512M. Floppy disks are formatted to 2 sides, 80 tracks, 16 sectors, 256 bytes for ADFS-L, 1 side for ADFS-M, and 1 side 40 tracks for ADFS-S. Tracks are sequential, that is logical_sector=sector+track*16+side*1280. Logical sector zero is zero bytes from the start of the physical disk (ie, sector &000000). Hard drives have 256-byte sectors. Logical sector zero is 0 bytes from the start of the physical disk (ie sector &000000). Sector 0,1 - Free Space Map --------------------------- The first two sectors contain the free space map and disk identifier. Sector 0 contains the start sectors of the free space blocks, sector 1 contains the length of each free space block. 000-002 Start sector of first free space 003-005 Start sector of second free space 006-008 Start sector of third free space ... 0F6-0F8 Sector of Level 3 fileserver partition 'sec1', or zero 0F9-0FB Reserved (set to zero) (RISC OS stores half the disk name at 0F7-0FB, interleaved with the even characters at 1F6-1FA) 0FC-0FE Total number of sectors on disk 0FF Checksum of sector 0 100-102 Length of first free space 103-105 Length of second free space 106-108 Length of third free space ... 1F6-1F8 Sector of Level 3 fileserver partition 'sec2', or zero 1F9-1FA Reserved (set to zero) (RISC OS stores half the disk name at 1F6-1FA, interleaved with the odd characters at 0F7-0FB) 1FB-1FC Disk identifier 1FD Boot option, set with *OPT 4 1FE Pointer to end of free space list ie, 3*(number of free space blocks) 1FF Checksum of sector 1 The checksums are calculated by starting with 255, then adding with carry the 255 bytes of data, adding the bytes counting downwards from byte 254 to byte 0. The following BASIC code will do this. DEFFNadfs_sum(mem%):LOCAL sum%:sum%=255 FOR A%=254 TO 0 STEP -1 IF sum%>255:sum%=(sum%+1)AND255 sum%=sum%+mem%?A%:NEXT:=sum%AND255 Note that a lot of documentation (including earlier versions of this document) gets this wrong, often starting from 0 instead of 255, and adding upwards instead of downwards. The Disk Identifier is set to a random 16-bit number on initialisation. A 'Bad map' error is generated if the checksums are wrong, or if bits 29-31 of any start sector are nonzero, or if bits 29-31 of any length are nonzero. Sector 2-6 - Root Directory --------------------------- The five sectors following the Free Space Map contain the '$' root directory. The parent of the root directory is again the root directory. Directories ----------- Directories occupy five logical sectors - &500 bytes - in the following layout. 000 Directory Header 005 First directory entry 01F Second directory entry 039 Third directory entry ... 4B1 47th directory entry 4CB Directory Footer Directory Header ---------------- 0 1 2 3 4 +--+--+--+--+--+ |Sq| H u g o| +--+--+--+--+--+ 000 Directory Master Sequence Number in BCD 001-004 Directory identifier - "Hugo" Directory Entries ----------------- 0 1 2 3 4 5 6 7 8 9 A B C D E F 10 11 12 13 14 15 16 17 18 19 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | Object name and attributes | Load Addr | Exec Addr | Length | Sector |Sq| +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 000-009