A SID file is a header followed by C64 code and data. The header’s numbers are big-endian,
unlike the C64’s own. Offsets are hexadecimal, written with a + as in the
format’s own document, SID_file_format.txt from the High Voltage SID
Collection, which this page follows (the copy dated 9 October 2026). Addresses
use the C64’s $ notation. Versions 1 to 5 exist, and each adds to the one
before.
Common fields
| Offset | Size | Type | Name | Description |
|---|---|---|---|---|
| +00 | 4 | ASCII | magicID | PSID, or RSID for a tune that needs a real C64 environment. |
| +04 | 2 | u16 | version | 1 to 5. RSID, and PSID V2NG, must be 2 to 5. |
| +06 | 2 | u16 | dataOffset | 0076 for version 1, 007C for versions 2 to 5. |
| +08 | 2 | u16 | loadAddress | $0000 to $FFFF. If $0000, the first two bytes of the data give the load address, little-endian, and are not loaded. RSID must use $0000. |
| +0A | 2 | u16 | initAddress | Where to start. The accumulator holds the song number minus one. |
| +0C | 2 | u16 | playAddress | Where to call for each play step. $0000 means the program installs its own interrupt handler. RSID must use $0000. |
| +0E | 2 | u16 | songs | Number of songs, 1 to 256. |
| +10 | 2 | u16 | startSong | The default song, 1 to songs. |
| +12 | 4 | u32 | speed | RSID must be 0. |
| +16 | 32 | text | name | Windows-1252, with a zero byte at the end if shorter than 32 bytes. |
| +36 | 32 | text | author | The same encoding. |
| +56 | 32 | text | released | Formerly “copyright”. The same encoding. |
| +76 | … | bytes | data | Version 1 data starts here. |
00000000 50 53 49 44 00 02 00 7C 10 00 10 00 10 03 00 01 PSID...|........
00000010 00 01 00 00 00 00 ......
$1000, play at $1003, one song, VBI timingSpeed
One bit per song. A bit that is 0 means VBI timing (50 Hz on PAL, 60 Hz on NTSC); a bit that is 1 means CIA 1 timer A timing, which is 60 Hz by default. Bits 0 to 31 give songs 1 to 32.
| Case | Beyond song 32 |
|---|---|
| Version 1, or versions 2 to 5 with the PlaySID flag set | The pattern repeats: song 33 uses bit 0. |
| Versions 2 to 5 with the PlaySID flag clear | Bit 31 applies to song 32 and all later songs. |
Surplus bits should be 0.
Version 2 and later
| Offset | Size | Type | Name | Versions | Description |
|---|---|---|---|---|---|
| +76 | 2 | u16 | flags | 2–5 | |
| +78 | 1 | u8 | startPage | 2–5 | Start of free memory, in pages. |
| +79 | 1 | u8 | pageLength | 2–5 | Number of free pages. |
| +7A | 1 | u8 | secondSIDAddress | 3–4 (0 in 2) | Address of a second SID. |
| +7B | 1 | u8 | thirdSIDAddress | 4 (0 in 2–3) | Address of a third SID. |
| +7C | … | bytes | data | 2–5 | C64 data. |
In version 5, +7A and +7B are replaced by the multi-SID fields.
Flags (+76)
| Bits | Name | Values |
|---|---|---|
| 0 | MUS player | 0 built-in player. 1 Compute!’s Sidplayer MUS data, which needs an external player. |
| 1 | PlaySID or BASIC | PSID: 0 C64 compatible, 1 PlaySID-specific. RSID: 0 C64 machine code, 1 C64 BASIC. |
| 2–3 | Video standard | 00 unknown, 01 PAL, 10 NTSC, 11 PAL and NTSC. |
| 4–5 | SID model | 00 unknown, 01 MOS6581, 10 MOS8580, 11 both. |
| 6–7 | Versions 3–4: second SID model. Version 5: panning layout. | Model as bits 4–5; unknown means the same as the first SID. Panning values below. |
| 8–9 | Version 4: third SID model. Version 5: panning mode. | Model as bits 4–5. Panning values below. |
| 10 | Embedded lengths (v5) | 0 lengths may be stored elsewhere. 1 a length table follows the payload. |
| 11 | FM OPL (v5) | 0 not required. 1 an FM OPL chip is required; $DF00 to $DFFF is reserved and no SID may be mapped there. |
| 12–15 | Reserved, 0. |
startPage and pageLength
| startPage | Meaning |
|---|---|
00 | The tune does not write outside its data range, so the free range can be worked out from the load address and data length. |
FF | No free page exists; a driver cannot be relocated into the tune. |
| other | The first page of the largest free range. For example, 1E means $1E00. |
pageLength is the number of free pages from startPage, and must be 0 when startPage is
00 or FF. The free range should not overlap the data’s load
range. For RSID, it should not overlap the ROM areas ($A000–$BFFF,
$D000–$FFFF) or $0000–$03FF.
Extra SID addresses
In versions 3 and 4, each byte is the middle byte of an address $Dxx0. Only
even values 42 to 7E and E0 to FE are valid
(42 is $D420, FE is $DFE0). Any invalid value,
including 0, means there is no such SID. The third SID’s address must differ from the
second’s.
Version 5
Metadata
In version 5 the three text fields (+16, +36 and +56, 96 bytes in all) can be one block holding three non-empty strings, each ended by a zero byte, in Windows-1252. The name always starts at +16. Readers try this form first and fall back on the fixed 32-byte fields. When all three strings fit in 32 bytes, writers keep the author at +36 and released at +56.
Multi-SID fields
| Offset | Name | Description |
|---|---|---|
| +7A | multiSidConfig | 0 for a single SID. Bits 0–3: total SIDs including the first, 2 to 15. Bits 4–7: address configuration. |
| +7B | sidAddressConfigStart | The base address for SID 2, encoded like the extra SID addresses, or 0 for the standard start. Must be 0 for a single SID. Any invalid value is treated as 0. |
| Bits 4–7 | Steps | Max SIDs at the default start |
|---|---|---|
| 0 | +$20 | 15 |
| 1 | +$40 | 15 |
| 2 | +$80 | 12 |
| 3 | +$100 | 6 |
| 4 | Alternating +$20, +$60 | 15 |
| 5 | Alternating +$20, +$E0 | 12 |
| 6 | Alternating +$100, +$300 | 4 |
| 7–15 | Reserved |
SID 1 is always at $D400, and addresses may only be in
$D400–$D7E0 and $DE00–$DFE0. A file that
asks for more SIDs than the addresses allow must be rejected.
Panning
| Bits 6–7 (layout) | Meaning |
|---|---|
| 00 Standard | One SID is centred; several alternate left and right, starting left. |
| 01 L/C/R | One SID is centred; several alternate left, centre and right, starting left. |
| 10 Center First | The first C-count SIDs are centred; the rest alternate left and right. |
| 11 Fully Centered | Every SID is centred. |
| Bits 8–9 (mode) | Meaning |
|---|---|
| 00 Direct | Uses the layout unchanged. |
| 01 Reverse | Mirrors the layout from left to right. |
| 10 Group | Groups consecutive panning assignments. |
| 11 Spread | Distributes SIDs across the available positions. |
Song length table
When bit 10 of the flags is set, the last songs × 4 bytes of the file are
a length for each song in order, excluded from the C64 data. Each entry is two
big-endian words: BCD minutes and seconds (MM:SS), then BCD milliseconds,
whose most significant digit must be 0.