-
Notifications
You must be signed in to change notification settings - Fork 18
/
vgm_lib.h
115 lines (108 loc) · 2.66 KB
/
vgm_lib.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#define DELAY_60HZ 735
#define DELAY_50HZ 882
// checks if Dly is in range from (From + 0x00) to (From + Range)
#define DELAY_CHECK(Dly, From, Range) ((Dly >= (From)) && (Dly <= (From + Range)))
void VGMLib_WriteDelay(UINT8* DstData, UINT32* Pos, UINT32 Delay, bool* WroteCmd80)
{
UINT32 DstPos;
UINT16 CurDly;
UINT32 TempLng;
bool WrtCmdPCM;
DstPos = *Pos;
WrtCmdPCM = (WroteCmd80 == NULL) ? false : *WroteCmd80;
while(Delay)
{
if (Delay <= 0xFFFF)
CurDly = (UINT16)Delay;
else
CurDly = 0xFFFF;
if (WrtCmdPCM)
{
// highest delay compression - Example:
// Delay 39 -> 8F 7F 77
// Delay 1485 -> 8F 62 62 (instead of 80 61 CD 05)
// Delay 910 -> 8F 63 7D (instead of 80 61 8E 03)
if (DELAY_CHECK(CurDly, 0x20, 0x0F)) // 8F 7x
CurDly -= 0x10;
else if (DELAY_CHECK(CurDly, DELAY_60HZ, 0x1F)) // 8F 62 [7x]
CurDly -= DELAY_60HZ;
else if (DELAY_CHECK(CurDly, 2 * DELAY_60HZ, 0x0F)) // 8F 62 62
CurDly -= 2 * DELAY_60HZ;
else if (DELAY_CHECK(CurDly, DELAY_50HZ, 0x1F)) // 8F 63 [7x]
CurDly -= DELAY_50HZ;
else if (DELAY_CHECK(CurDly, 2 * DELAY_50HZ, 0x0F)) // 8F 63 63
CurDly -= 2 * DELAY_50HZ;
else if (DELAY_CHECK(CurDly, // 8F 62 63
DELAY_60HZ + DELAY_50HZ, 0x0F))
CurDly -= DELAY_60HZ + DELAY_50HZ;
/*if (CurDly >= 0x10 && CurDly <= 0x1F)
CurDly = 0x0F;
else if (CurDly >= 0x20)
CurDly = 0x00;*/
if (CurDly >= 0x10)
CurDly = 0x0F;
DstData[DstPos - 1] |= CurDly;
*WroteCmd80 = WrtCmdPCM = false;
}
else if (! CurDly)
{
// don't do anything - I just want to be safe
}
else if (CurDly <= 0x20)
{
if (CurDly <= 0x10)
{
DstData[DstPos] = 0x70 | (CurDly - 0x01);
DstPos ++;
}
else
{
DstData[DstPos] = 0x7F;
DstPos ++;
DstData[DstPos] = 0x70 | (CurDly - 0x11);
DstPos ++;
}
}
else if (DELAY_CHECK(CurDly, DELAY_60HZ, 0x10) ||
CurDly == 2 * DELAY_60HZ)
{
TempLng = CurDly;
while(TempLng >= DELAY_60HZ)
{
DstData[DstPos] = 0x62;
DstPos ++;
TempLng -= DELAY_60HZ;
}
CurDly -= (UINT16)TempLng;
}
else if (DELAY_CHECK(CurDly, DELAY_50HZ, 0x10) ||
CurDly == 2 * DELAY_50HZ)
{
TempLng = CurDly;
while(TempLng >= DELAY_50HZ)
{
DstData[DstPos] = 0x63;
DstPos ++;
TempLng -= DELAY_50HZ;
}
CurDly -= (UINT16)TempLng;
}
else if (CurDly == (DELAY_60HZ + DELAY_50HZ))
{
DstData[DstPos] = 0x63;
DstPos ++;
DstData[DstPos] = 0x62;
DstPos ++;
}
else
{
DstData[DstPos + 0x00] = 0x61;
DstData[DstPos + 0x01] = (CurDly & 0x00FF) >> 0;
DstData[DstPos + 0x02] = (CurDly & 0xFF00) >> 8;
DstPos += 0x03;
}
Delay -= CurDly;
}
*Pos = DstPos;
return;
}