[HEADER FORMAT]

0000 5BYTES	MAGIC 'NESD',$1A
0005 BYTE	FORMAT VERSION(must be 0)
0006 BYTE	Reserved(must be 0)
0007 BYTE	SYNC TYPE1 0:3.5MHz, 1:60Hz, 2:50Hz
0008 DWORD(LE)	SYNC TYPE2 0:use SYNC TYPE1 1-:n/256Hz
000C BYTE	Extra Sound Device Support
000D 3BYTES	Reserved(must be 0)
0010 DWORD(LE)	FILE OFFSET TO SONG NAME If value is 0, not exist.
0014 DWORD(LE)	FILE OFFSET TO ARTIST If value is 0, not exist.
0018 DWORD(LE)	FILE OFFSET TO COPYRIGHT If value is 0, not exist.
001C DWORD(LE)	Reserved(must be 0)
0020 DWORD(LE)	SIZE OF DPCM INFO
0024 DWORD(LE)	Reserved(must be 0)
0028 DWORD(LE)	FILE OFFSET TO DPCM INFO If value is 0, not exist.
002C DWORD(LE)	Reserved(must be 0)
0030 DWORD(LE)	SIZE OF DUMP DATA
0034 DWORD(LE)	COMPRESSING 'Inflate' size in byte.If value is 0, notcompressed.
0038 DWORD(LE)	FILE OFFSET TO DUMP DATA
003C DWORD(LE)	FILE OFFSET TO LOOP POINT DUMP DATA
0040-007F	HEADER RESERVE(must be 0)

[DPCM INFO FORMAT]

[DUMP DATA FORMAT]

$00-15 dd     write $dd to APU($4000-4015)
$16 dd        write $dd to volume port of VRC6 square#0
$17 dd        write $dd to freq-l port of VRC6 square#0
$18 dd        write $dd to freq-h port of VRC6 square#0
$19 dd        write $dd to volume port of VRC6 square#1
$1A dd        write $dd to freq-l port of VRC6 square#1
$1B dd        write $dd to freq-h port of VRC6 square#1
$1C dd        write $dd to volume port of VRC6 saw
$1D dd        write $dd to freq-l port of VRC6 saw
$1E dd        write $dd to freq-h port of VRC6 saw
$1F aa dd     write $dd to address $aa of VRC7
$20-35 dd     write $dd to MMC5($5000-5015)
$36 aa dd     write $dd to address $aa of N106
$37 aa dd     write $dd to address $aa of FME7
$3C dd        write $dd to DPCM SELECT C
$3D dd        write $dd to DPCM SELECT D
$3E dd        write $dd to DPCM SELECT E
$3F dd        write $dd to DPCM SELECT F
$40-8F dd     write $dd to FDS($4040-408F)

$FF          1SYNC
$FE vv...    nSYNC
$FD          END/LOOP

vv...:variable length BYTE DATA

int getvv(byte *p)
{
    int s = 0, n = 0;
    do
    {
        n |= (*p & 0x7f) << s;
        s += 7;
    }
    while (*p++ & 0x80);
    return n + 3;
}
