/
s3m_it.c
187 lines (152 loc) · 5.36 KB
/
s3m_it.c
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
/*
Name:
S3M_IT.C
Description:
Commonfunctions between S3Ms and ITs (smaller .EXE! :)
Portability:
All systems - all compilers (hopefully)
*/
#include "mikmod.h"
UBYTE *poslookup=NULL;/* S3M/IT fix - removing blank patterns needs a */
/* lookup table to fix position-jump commands */
SBYTE remap[64]; /* for removing empty channels */
SBYTE isused[64]; /* for removing empty channels */
void S3MIT_ProcessCmd(UBYTE cmd,UBYTE inf,BOOL oldeffect)
{
UBYTE hi,lo;
lo=inf&0xf;
hi=inf>>4;
/* process S3M / IT specific command structure */
if(cmd!=255)
{ switch(cmd)
{ case 1: /* Axx set speed to xx */
UniWrite(UNI_S3MEFFECTA);
UniWrite(inf);
break;
case 2: /* Bxx position jump */
UniPTEffect(0xb,poslookup[inf]);
break;
case 3: /* Cxx patternbreak to row xx */
if(oldeffect & 1)
UniPTEffect(0xd,(((inf&0xf0)>>4)*10)+(inf&0xf));
else
UniPTEffect(0xd,inf);
break;
case 4: /* Dxy volumeslide */
UniWrite(UNI_S3MEFFECTD);
UniWrite(inf);
break;
case 5: /* Exy toneslide down */
UniWrite(UNI_S3MEFFECTE);
UniWrite(inf);
break;
case 6: /* Fxy toneslide up */
UniWrite(UNI_S3MEFFECTF);
UniWrite(inf);
break;
case 7: /* Gxx Tone portamento, speed xx */
UniWrite(UNI_ITEFFECTG);
UniWrite(inf);
break;
case 8: /* Hxy vibrato */
if(oldeffect & 1)
UniPTEffect(0x4,inf);
else
{ UniWrite(UNI_ITEFFECTH);
UniWrite(inf);
}
break;
case 9: /* Ixy tremor, ontime x, offtime y */
if(oldeffect & 1)
UniWrite(UNI_S3MEFFECTI);
else
UniWrite(UNI_ITEFFECTI);
UniWrite(inf);
break;
case 0xa: /* Jxy arpeggio */
UniPTEffect(0x0,inf);
break;
case 0xb: /* Kxy Dual command H00 & Dxy */
if(oldeffect & 1)
UniPTEffect(0x4,0);
else
{ UniWrite(UNI_ITEFFECTH);
UniWrite(0);
}
UniWrite(UNI_S3MEFFECTD);
UniWrite(inf);
break;
case 0xc: /* Lxy Dual command G00 & Dxy */
if(oldeffect & 1)
UniPTEffect(0x3,0);
else
{ UniWrite(UNI_ITEFFECTG);
UniWrite(0);
}
UniWrite(UNI_S3MEFFECTD);
UniWrite(inf);
break;
case 0xd: /* Mxx Set Channel Volume */
UniWrite(UNI_ITEFFECTM);
UniWrite(inf);
break;
case 0xe: /* Nxy Slide Channel Volume */
UniWrite(UNI_ITEFFECTN);
UniWrite(inf);
break;
case 0xf: /* Oxx set sampleoffset xx00h */
UniPTEffect(0x9,inf);
break;
case 0x10: /* Pxy Slide Panning Commands */
UniWrite(UNI_ITEFFECTP);
UniWrite(inf);
break;
case 0x11: /* Qxy Retrig (+volumeslide) */
UniWrite(UNI_S3MEFFECTQ);
if((inf!=0) && (lo==0) && !(oldeffect & 1))
UniWrite(1);
else
UniWrite(inf);
break;
case 0x12: /* Rxy tremolo speed x, depth y */
UniWrite(UNI_S3MEFFECTR);
UniWrite(inf);
break;
case 0x13: /* Sxx special commands */
UniWrite(UNI_ITEFFECTS0);
UniWrite(inf);
break;
case 0x14: /* Txx tempo */
if(inf>0x20)
{ UniWrite(UNI_S3MEFFECTT);
UniWrite(inf);
}
break;
case 0x15: /* Uxy Fine Vibrato speed x, depth y */
if(oldeffect & 1)
UniWrite(UNI_S3MEFFECTU);
else
UniWrite(UNI_ITEFFECTU);
UniWrite(inf);
break;
case 0x16: /* Vxx Set Global Volume */
UniWrite(UNI_XMEFFECTG);
UniWrite(inf);
break;
case 0x17: /* Wxy Global Volume Slide */
UniWrite(UNI_ITEFFECTW);
UniWrite(inf);
break;
case 0x18: /* Xxx amiga command 8xx */
if(oldeffect & 1)
UniPTEffect(0x8,((inf<<1) == 256) ? 255 : (inf<<1));
else
UniPTEffect(0x8,inf);
break;
case 0x19: /* Yxy Panbrello speed x, depth y */
UniWrite(UNI_ITEFFECTY);
UniWrite(inf);
break;
}
}
}