The version is the big-endian word at +04. Each version keeps everything of
the one before and adds to it, so a reader that knows version 5 reads every file. The format
document (SID_file_format.txt, last updated 9 October 2026) describes them
together; this page separates them. The names “PSID v2NG” (“next generation”) and
“RSID” belong to version 2 and later: a version 2 file can be an old PlaySID file or
a v2NG one, and nothing in the header tells them apart except the flag bits that old
players ignored.
What each version added
| Version | Header size | Data offset | Added |
|---|---|---|---|
| 1 | 118 bytes ($76) | $0076 | The magic PSID, the data offset, the load, init and play addresses, the number of songs, the start song, the speed word, and the three 32-byte strings. No flags: every tune is for a PAL or NTSC machine and the SID model are not stated. |
| 2 | 124 bytes ($7C) | $007C | The flags word (built-in or MUS player, PlaySID-specific, video clock, SID model), the start page and page length of free memory, and two bytes that must be 0. PSID v2NG and RSID are version 2 and later: RSID (the magic RSID) is for tunes that need a real C64 environment. |
| 3 | 124 bytes | $007C | The second SID: its address at +7A and its model in flag bits 6 and 7. |
| 4 | 124 bytes | $007C | The third SID: its address at +7B and its model in flag bits 8 and 9. |
| 5 | 124 bytes | $007C | Up to 15 SID chips through an address configuration (+7A and +7B mean something else), stereo panning (flag bits 6 to 9 mean something else), the three strings as one 96-byte run of null-terminated strings, an optional song length table after the data (flag bit 10), and the FM OPL flag (bit 11). |
RSID is valid only from version 2: its load address, play address and speed must be 0. A
header with a version outside 1 to 5, or with the magic neither PSID nor
RSID, is not a SID file.
Telling them apart
- Read the magic:
PSIDorRSID. - Read the version word at
+04. 1 means the 118-byte header with no flags. The data offset at+06repeats this:$0076for version 1,$007Cfor the rest. - For version 3 and 4 the bytes at
+7Aand+7Bare SID addresses ($42to$7E,$E0to$FE, even); for version 5 they are the multi-SID configuration (bits 0 to 3 the number of chips, bits 4 to 7 the address configuration) and the start of the second SID. - For version 5, the flag word’s bits 6 to 9 are the panning, not SID models, and bit 10 says a length table follows.
Fields that an older version does not have are reserved in the newer layout: a version 2
file must have 0 at +7A and +7B, a version 3 file 0 at
+7B, and a version 3 file’s flag bits 8 and 9 are 0. The explorer notes each of
these when it finds them set.
Examples from real files
Version 2: Rob Hubbard’s “Commando” from the HVSC. The load address in the header is 0, so
the first two bytes of the data (00 50, little-endian $5000) give it.
Init is $5FB2, play $5012, 19 songs, start song 1; the speed word is 0,
so every song is called by the vertical blank. The flags are $0014: the built-in
player, C64 compatible, PAL, a MOS 6581.
00000000 50 53 49 44 00 02 00 7C 00 00 5F B2 50 12 00 13 PSID..|.._.P...
00000010 00 01 00 00 00 00 43 6F 6D 6D 61 6E 64 6F 00 00 ......Commando..
00000070 00 00 00 00 00 00 00 14 00 00 00 00 00 50 .............P
$007C, the addresses, the songs and start song, the speed, the name; then at +76 the flags $0014, start page 0, page length 0, two reserved bytes, and the dataVersion 3: “Mega Power Man” by Owen Crowley has a second SID. The byte at +7A
is $42, so the second chip is at $D420; the flags are
$00A4 (PAL, MOS 8580, and an 8580 for the second chip too). Version 4: “A Walk in
the Countryside” by Gaetano Chiummo has three: +7A is $42 and
+7B is $44 ($D420 and $D440), flags
$02A4.
00000070 00 00 00 00 00 00 00 A4 00 00 42 00 00 10 ...........B...
00000070 00 00 00 00 00 00 02 A4 00 00 42 44 00 10 ...........BD..
Version 1 has no flags: the data (and in a typical file, the two-byte load address) starts at
+76. Version 5 files are written by new tools; the format document’s own example
gives the song lengths of Rob Hubbard’s “Human Race” as 02 44 05 54 - 01 16 08 10 …
(2:44.554, 1:16.810 …) at the end of such a file.
RSID against PSID
RSID is PSID v2NG with limits: the version is 2 to 5, the load address, play address and
speed are 0, and the effective load address is at least $07E8. A PSID tune is
called by the player through its play address; an RSID tune is started once and sets up its
own interrupts. See C64 environment for
what each gets before it starts, and flags
for bit 1 (PlaySID-specific for a PSID file, C64 BASIC for an RSID one).