S98v2 draft 


[HEADER FORMAT]

0000 3BYTE	MAGIC 'S98'
0003 1BYTE	FORMAT VERSION '2'
0004 DWORD(LE)	TIMER INFO1 If value is 0, use 0000000A(10).
0008 DWORD(LE)	TIMER INFO2 If value is 0, use 000003E8(1000).
000C DWORD(LE)	DUMP DATA COMPRESSING 'Inflate' size in byte, if value is not 0.
0010 DWORD(LE)	FILE OFFSET TO SONG NAME If value is 0, not exist.
0014 DWORD(LE)	FILE OFFSET TO DUMP DATA
0018 DWORD(LE)	FILE OFFSET TO LOOP POINT DUMP DATA
001C DWORD(LE)	FILE OFFSET TO COMPRESSED DATA If value is 0, use TO DUMP DATA
0020 16BYTES	1ST DEVICE INFO
0030 16BYTES	2ND DEVICE INFO
0040 16BYTES	3RD DEVICE INFO
0050 16BYTES	4TH DEVICE INFO
...


[DEVICE INFO FORMAT]

If 1ST DEVICE info not defined, use  OPNA(7.9872MHz) for copmpatibility

0000 DWORD(LE)	DEVICE TYPE
  00000000:END MARKER OF DEVICE INFO
  00000001:PSG
  00000002:OPN
  00000003:OPN2
  00000004:OPNA
0004 DWORD(LE)	CLOCK
0008 8BYTES	RESERVE


[DUMP DATA FORMAT]

00 aa dd  1st device out1
01 aa dd  1st device out2
02 aa dd  2nd device out1
03 aa dd  2nd device out2
04 aa dd  3rd device out1
05 aa dd  3rd device out2
06 aa dd  4th device out1
07 aa dd  4th device out2
...

FF        1SYNC(TIMER INFO2/TIMER INFO1 syncs per sec)
FE vv...  nSYNC
FD        END/LOOP
80-FC     ABORT(RESERVE)
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 + 2;
}
