5 By: Kevin Horton khorton@iquest.net
12 Remember that I am very willing to add stuff and update this spec. If
13 you find a new sound chip or other change let me know and I will get back
14 with you. E-mail to the above address.
17 V1.61 - 06/27/2000 Updated spec a bit
18 V1.60 - 06/01/2000 Updated Sunsoft, MMC5, and Namco chip information
19 V1.50 - 05/28/2000 Updated FDS, added Sunsoft and Namco chips
20 V1.32 - 11/27/1999 Added MMC5 register locations
21 V1.30 - 11/14/1999 Added MMC5 audio bit, added some register info
22 V1.20 - 09/12/1999 VRC and FDS prelim sound info added
23 V1.00 - 05/11/1999 First official NSF specification file
27 This file encompasses a way to transfer NES music data in a small, easy to
30 The basic idea is one rips the music/sound code from an NES game and prepends
31 a small header to the data.
33 A program of some form (6502/sound emulator) then takes the data and loads
34 it into the proper place into the 6502's address space, then inits and plays
37 Here's an overview of the header:
39 offset # of bytes Function
40 ----------------------------
42 0000 5 STRING "NESM",01Ah ; denotes an NES sound format file
43 0005 1 BYTE Version number (currently 01h)
44 0006 1 BYTE Total songs (1=1 song, 2=2 songs, etc)
45 0007 1 BYTE Starting song (1= 1st song, 2=2nd song, etc)
46 0008 2 WORD (lo/hi) load address of data (8000-FFFF)
47 000a 2 WORD (lo/hi) init address of data (8000-FFFF)
48 000c 2 WORD (lo/hi) play address of data (8000-FFFF)
49 000e 32 STRING The name of the song, null terminated
50 002e 32 STRING The artist, if known, null terminated
51 004e 32 STRING The Copyright holder, null terminated
52 006e 2 WORD (lo/hi) speed, in 1/1000000th sec ticks, NTSC (see text)
53 0070 8 BYTE Bankswitch Init Values (see text, and FDS section)
54 0078 2 WORD (lo/hi) speed, in 1/1000000th sec ticks, PAL (see text)
55 007a 1 BYTE PAL/NTSC bits:
56 bit 0: if clear, this is an NTSC tune
57 bit 0: if set, this is a PAL tune
58 bit 1: if set, this is a dual PAL/NTSC tune
59 bits 2-7: not used. they *must* be 0
60 007b 1 BYTE Extra Sound Chip Support
61 bit 0: if set, this song uses VRCVI
62 bit 1: if set, this song uses VRCVII
63 bit 2: if set, this song uses FDS Sound
64 bit 3: if set, this song uses MMC5 audio
65 bit 4: if set, this song uses Namco 106
66 bit 5: if set, this song uses Sunsoft FME-07
67 bits 6,7: future expansion: they *must* be 0
68 007c 4 ---- 4 extra bytes for expansion (must be 00h)
69 0080 nnn ---- The music program/data follows
71 This may look somewhat familiar; if so that's because this is somewhat
72 sorta of based on the PSID file format for C64 music/sound.
75 Loading a tune into RAM
76 -----------------------
78 If offsets 0070h to 0077h have 00h in them, then bankswitching is *not*
79 used. If one or more bytes are something other than 00h then bankswitching
80 is used. If bankswitching is used then the load address is still used,
81 but you now use (ADDRESS AND 0FFFh) to determine where on the first bank
85 Each bank is 4K in size, and that means there are 8 of them for the
86 entire 08000h-0ffffh range in the 6502's address space. You determine where
87 in memory the data goes by setting bytes 070h thru 077h in the file.
88 These determine the inital bank values that will be used, and hence where
89 the data will be loaded into the address space.
93 METROID.NSF will be used for the following explaination.
95 The file is set up like so: (starting at 070h in the file)
98 0070: 05 05 05 05 05 05 05 05 - 00 00 00 00 00 00 00 00
99 0080: ... music data goes here...
101 Since 0070h-0077h are something other than 00h, then we know that this
102 tune uses bankswitching. The load address for the data is specified as
103 08000h. We take this AND 0fffh and get 0000h, so we will load data in
104 at byte 0 of bank 0, since data is loaded into the banks sequentially
105 starting from bank 0 up until the music data is fully loaded.
107 Metroid has 6 4K banks in it, numbered 0 through 5. The 6502's address
108 space has 8 4K bankswitchable blocks on it, starting at 08000h-08fffh,
109 09000h-09fffh, 0a000h-0afffh ... 0f000h-0ffffh. Each one of these is 4K in
110 size, and the current bank is controlled by writes to 05ff8h thru 05fffh,
111 one byte per bank. So, 05ff8h controls the 08000h-08fffh range, 05ff9h
112 controls the 09000h-09fffh range, etc. up to 05fffh which controls the
113 0f000h-0ffffh range. When the song is loaded into RAM, it is loaded into
114 the banks and not the 6502's address space. Once this is done, then the
115 bank control registers are written to set up the inital bank values.
116 To do this, the value at 0070h in the file is written to 05ff8h, 0071h
117 is written to 05ff9h, etc. all the way to 0077h is written to 05fffh.
118 This is should be done before every call to the init routine.
120 If the tune was not bankswitched, then it is simply loaded in at the
121 specified load address, until EOF
127 This is pretty simple. Load the desired song # into the accumulator,
128 minus 1 and set the X register to specify PAL (X=1) or NTSC (X=0).
129 If this is a single standard tune (i.e. PAL *or* NTSC but not both)
130 then the X register contents should not matter. Once the song # and
131 optional PAL/NTSC standard are loaded, simply call the INIT address.
132 Once init is done, it should perform an RTS.
138 Once the tune has been initalized, it can now be played. To do this,
139 simply call the play address several times a second. How many times
140 per second is determined by offsets 006eh and 006fh in the file.
141 These bytes denote the speed of playback in 1/1000000ths of a second.
142 For the "usual" 60Hz playback rate, set this to 411ah.
144 To generate a differing playback rate, use this formula:
151 Where PBRATE is the value you stick into 006e/006fh in the file, and
152 speed is the desired speed in hertz.
155 "Proper" way to load the tune
156 -----------------------------
158 1) If the tune is bankswitched, go to #3.
160 2) Load the data into the 6502's address space starting at the specified
161 load address. Go to #4.
163 3) Load the data into a RAM area, starting at (start_address AND 0fffh).
165 4) Tune load is done.
168 "Proper" way to init a tune
169 ---------------------------
171 1) Clear all RAM at 0000h-07ffh.
173 2) Clear all RAM at 6000h-7fffh.
175 3) Init the sound registers by writing 00h to 04000-0400Fh, 10h to 4010h,
176 and 00h to 4011h-4013h.
178 4) Set volume register 04015h to 00fh.
180 5) If this is a banked tune, load the bank values from the header into
183 6) Set the accumulator and X registers for the desired song.
185 7) Call the music init routine.
188 "Proper" way to play a tune
189 ---------------------------
191 1) Call the play address of the music at periodic intervals determined
192 by the speed words. Which word to use is determined by which mode
193 you are in- PAL or NTSC.
199 Byte 007bh of the file stores the sound chip flags. If a particular flag
200 is set, those sound registers should be enabled. If the flag is clear,
201 then those registers should be disabled.
203 * VRCVI Uses registers 9000-9002, A000-A002, and B000-B002, write only.
205 Caveats: 1) The above registers are *write only* and must not disrupt music
206 code that happens to be stored there.
208 2) Major caveat: The A0 and A1 lines are flipped on a few games!!
209 If you rip the music and it sounds all funny, flip around
210 the xxx1 and xxx2 register pairs. (i.e. 9001 and 9002) 9000
211 and 9003 can be left untouched. I decided to do this since it
212 would make things easier all around, and this means you only
213 will have to change the music code in a very few places (6).
214 Esper2 and Madara will need this change, while Castlevania 3j
215 will not for instance.
217 3) See my VRCVI.TXT doc for a complete register description.
219 * VRCVII Uses registers 9010 and 9030, write only.
221 Caveats: 1) Same caveat as #1, above.
223 2) See my VRCVII.TXT doc for a complete register description.
225 * FDS Sound uses registers from 4040 through 4092.
227 Caveats: 1) 6000-DFFF is assumed to be RAM, since 6000-DFFF is RAM on the
228 FDS. E000-FFFF is usually not included in FDS games because
229 it is the BIOS ROM. However, it can be used on FDS rips to help
230 the ripper (for modified play/init addresses).
232 2) Bankswitching operates slightly different on FDS tunes.
233 5FF6 and 5FF7 control the banks 6000-6FFF and 7000-7FFF
234 respectively. NSF header offsets 76h and 77h correspond to
235 *both* 6000-7FFF *AND* E000-FFFF. Keep this in mind!
237 * MMC5 Sound Uses registers 5000-5015, write only as well as 5205 and 5206,
240 Caveats: 1) Generating a proper doc file. Be patient.
242 2) 5205 and 5206 are a hardware 8*8 multiplier. The idea being
243 you write your two bytes to be multiplied into 5205 and 5206
244 and after doing so, you read the result back out. Still working
245 on what exactly triggers it (I think a write to either 5205
246 or 5206 triggers the multiply).
248 3) 5C00-5FF5 should be RAM to emulate EXRAM while in MMC5 mode.
250 Note: Thanks to Mamiya for the EXRAM info.
253 * Namco 106 Sound Uses registers 4800 and F800.
255 This works similar to VRC7. 4800 is the "data" port which is
256 readable and writable, while F800 is the "address" port and is
259 The address is 7 bits plus a "mode" bit. Bit 7 controls
260 address auto-incrementing. If bit 7 is set, the address will
261 auto-increment after a byte of data is read or written from/to
264 $40 ffffffff f:frequency L
265 $42 ffffffff f:frequency M
266 $44 ---sssff f:frequency H s:tone length (8-s)*4 in 4bit-samples
267 $46 tttttttt t:tone address(4bit-address,$41 means high-4bits of $20)
268 $47 -cccvvvv v:linear volume 1+c:number of channels in use($7F only)
269 $40-47:ch1 $48-4F:ch2 ... $78-7F:ch8
272 $00-3F(8ch)...77(1ch) hhhhllll tone data
273 h:odd address data(signed 4bit)
274 l:even address data(signed 4bit)
276 real frequency = (f * NES_BASECYCLES) / (40000h * (c+1) * (8-s)*4 * 45)
277 NES_BASECYCLES 21477270(Hz)
279 Note: Very Special thanks to Mamiya for this information!
282 * Sunsoft FME-07 Sound uses registers C000 and E000
284 This is similar to the common AY 3-8910 sound chip that is
285 used on tons of arcade machines, and in the Intellivision.
287 C000 is the address port
288 E000 is the data port
290 Both are write-only, and behave like the AY 3-8910.
292 Note: Special thanks to Mamiya for this information as well
298 1) The starting song number and maximum song numbers start counting at
299 1, while the init address of the tune starts counting at 0. To
300 "fix", simply pass the desired song number minus 1 to the init
303 2) The NTSC speed word is used *only* for NTSC tunes, or dual PAL/NTSC tunes.
304 The PAL speed word is used *only* for PAL tunes, or dual PAL/NTSC tunes.
306 3) The length of the text in the name, artist, and copyright fields must
307 be 31 characters or less! There has to be at least a single NULL byte
308 (00h) after the text, between fields.
310 4) If a field is not known (name, artist, copyright) then the field must
311 contain the string "<?>" (without quotes).
313 5) There should be 8K of RAM present at 6000-7FFFh. MMC5 tunes need RAM at
314 5C00-5FF7 to emulate its EXRAM. 8000-FFFF Should be read-only (not
315 writable) after a tune has loaded. The only time this area should be
316 writable is if an FDS tune is being played.
318 6) Do not assume the state of *anything* on entry to the init routine
319 except A and X. Y can be anything, as can the flags.
321 7) Do not assume the state of *anything* on entry to the play routine either.
322 Flags, X, A, and Y could be at any state. I've fixed about 10 tunes
323 because of this problem and the problem, above.
325 8) The stack sits at 1FFh and grows down. Make sure the tune does not
326 attempt to use 1F0h-1FFh for variables. (Armed Dragon Villigust did and
327 I had to relocate its RAM usage to 2xx)
329 9) Variables should sit in the 0000h-07FFh area *only*. If the tune writes
330 outside this range, say 1400h this is bad and should be relocated.
331 (Terminator 3 did this and I relocated it to 04xx).