S98v2 draft
OFFSET BASE IS TOP OF HEADER
[HEADER FORMAT]
0000 3BYTE MAGIC 'S98'
0003 1BYTE FORMAT VERSION '0' or '1' or '2'
0004 DWORD(LE) (V1)TIMER INFO1 If value is 0, use 0000000A(10).
0008 DWORD(LE) (V2)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) OFFSET TO SONGNAME If value is 0, not exist.
0014 DWORD(LE) OFFSET TO DUMPDATA
0018 DWORD(LE) OFFSET TO LOOP POINT OF DUMPDATA If value is 0, not exist.
001C DWORD(LE) (V2)OFFSET TO COMPRESSED DATA If value is 0, use one TO DUMPDATA
0020 16BYTES (V2)1ST DEVICE INFO
0030 16BYTES (V2)2ND DEVICE INFO
0040 16BYTES (V2)3RD DEVICE INFO
0050 16BYTES (V2)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
00000005:OPM
0004 DWORD(LE) CLOCK
0008 4BYTES RESERVE(0)
000C DWORD(LE) OFFSET TO APPLICATION-DEPENDENT DATA
[APPLICATION-DEPENDENT DATA FORMAT]
0000 DWORD(LE) LENGTH OF APPLICATION-DEPENDENT DATA
0004 (LENGTH OF APPLICATION-DEPENDENT DATA)BYTES MAGIC ID AND RAW DATA
???? DWORD(LE) LENGTH OF APPLICATION-DEPENDENT DATA2
???? (LENGTH OF APPLICATION-DEPENDENT DATA2)BYTES MAGIC ID AND RAW DATA
...
???? DWORD(LE) 00000000:END MARKER OF APPLICATION-DEPENDENT DATA
[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(IF ANY)
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;
}
Ìá¤ë