| Byte | Use |
| | First block (program, code, memory created by !SAVE) |
| 0 | Track pointer to next block |
| 1 | Sector pointer to next block |
| 2 | #FF = suitable for !LOAD |
| 3 | 00 |
| 4 - 5 | Start address for !LOAD - 2 bytes |
| 6 - 7 | End address for !LOAD - 2 bytes |
| 8 | T address / program type - 2 bytes: |
| 9 | 0000 = code no T, 0001 = basic, 0002 = basic AUTO, ABCD = code T address |
| A | Number of bytes in this block. #F5 = full |
| B | Data bytes from here on |
| | Subsequent blocks created by !SAVE |
| 0 | Track pointer to next block. Null if no more |
| 1 | Sector pointer to next block. Null if no more |
| 2 | Number of bytes in this block. #FD = full |
| 3 | Data bytes from here on |
| | Blocks created by !OPEN / !PUT |
| 0 | Track pointer to next block. Null if no more |
| 1 | Sector pointer to next block. Null if no more |
| 2 | Data - for single byte data. For $ - length of $ (e.g. 3) followed by |
| | string |
| 3 | Data - for single byte data. For $ - string character |
| 4 | Data - for single byte data. For $ - string character |
| 5 | Data - for single byte data. For $ - string character (last) |
| 6 | Data - for single byte data. For $ - length of $ followed by string |
| 7 | Data - for single byte data. For $ - string character |
| 8 | etc. |
| | Blocks created by !STORE |
| 0 | Track pointer to next block. Null if no more |
| 1 | Sector pointer to next block. Null if no more |
| 2 - 3 | End address + 1 from which data was saved - 2 bytes |
| 4 - 5 | Start address from which array was saved - 2 bytes |
| 6 | Bit 7 set for % integers |
| 7 | #FF for strings |
| 8 | Array block copied from memory. For $ - Length of $ followed by $. |