comparison Plugins/Input/adplug/core/rix.cpp @ 637:2b06eb5e472d trunk

[svn] Sync with upstream. Drop hardware OPL2/3 support, it throws warnings and is not used on most modern machines. Added var inits where GCC 4.0 thought it was a good idea.
author chainsaw
date Sat, 18 Feb 2006 08:23:30 -0800
parents 0a73d1faeb4e
children 1cd8716972df
comparison
equal deleted inserted replaced
636:aa6914ee37ab 637:2b06eb5e472d
1 /* 1 /*
2 * Adplug - Replayer for many OPL2/OPL3 audio file formats. 2 * Adplug - Replayer for many OPL2/OPL3 audio file formats.
3 * Copyright (C) 1999 - 2005 Simon Peter, <dn.tlp@gmx.net>, et al. 3 * Copyright (C) 1999 - 2006 Simon Peter, <dn.tlp@gmx.net>, et al.
4 * 4 *
5 * This library is free software; you can redistribute it and/or 5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public 6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either 7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version. 8 * version 2.1 of the License, or (at your option) any later version.
24 24
25 const unsigned char CrixPlayer::adflag[] = {0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1}; 25 const unsigned char CrixPlayer::adflag[] = {0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1};
26 const unsigned char CrixPlayer::reg_data[] = {0,1,2,3,4,5,8,9,10,11,12,13,16,17,18,19,20,21}; 26 const unsigned char CrixPlayer::reg_data[] = {0,1,2,3,4,5,8,9,10,11,12,13,16,17,18,19,20,21};
27 const unsigned char CrixPlayer::ad_C0_offs[] = {0,1,2,0,1,2,3,4,5,3,4,5,6,7,8,6,7,8}; 27 const unsigned char CrixPlayer::ad_C0_offs[] = {0,1,2,0,1,2,3,4,5,3,4,5,6,7,8,6,7,8};
28 const unsigned char CrixPlayer::modify[] = {0,3,1,4,2,5,6,9,7,10,8,11,12,15,13,16,14,17,12,\ 28 const unsigned char CrixPlayer::modify[] = {0,3,1,4,2,5,6,9,7,10,8,11,12,15,13,16,14,17,12,\
29 15,16,0,14,0,17,0,13,0}; 29 15,16,0,14,0,17,0,13,0};
30 const unsigned char CrixPlayer::bd_reg_data[] = {\ 30 const unsigned char CrixPlayer::bd_reg_data[] = {
31 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x08,0x04,0x02,0x01,\ 31 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x08,0x04,0x02,0x01,
32 0x00,0x01,0x01,0x03,0x0F,0x05,0x00,0x01,0x03,0x0F,0x00,\ 32 0x00,0x01,0x01,0x03,0x0F,0x05,0x00,0x01,0x03,0x0F,0x00,
33 0x00,0x00,0x01,0x00,0x00,0x01,0x01,0x0F,0x07,0x00,0x02,\ 33 0x00,0x00,0x01,0x00,0x00,0x01,0x01,0x0F,0x07,0x00,0x02,
34 0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x0A,\ 34 0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x0A,
35 0x04,0x00,0x08,0x0C,0x0B,0x00,0x00,0x00,0x01,0x00,0x00,\ 35 0x04,0x00,0x08,0x0C,0x0B,0x00,0x00,0x00,0x01,0x00,0x00,
36 0x00,0x00,0x0D,0x04,0x00,0x06,0x0F,0x00,0x00,0x00,0x00,\ 36 0x00,0x00,0x0D,0x04,0x00,0x06,0x0F,0x00,0x00,0x00,0x00,
37 0x01,0x00,0x00,0x0C,0x00,0x0F,0x0B,0x00,0x08,0x05,0x00,\ 37 0x01,0x00,0x00,0x0C,0x00,0x0F,0x0B,0x00,0x08,0x05,0x00,
38 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0F,0x0B,0x00,\ 38 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0F,0x0B,0x00,
39 0x07,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,\ 39 0x07,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,
40 0x0F,0x0B,0x00,0x05,0x05,0x00,0x00,0x00,0x00,0x00,0x00,\ 40 0x0F,0x0B,0x00,0x05,0x05,0x00,0x00,0x00,0x00,0x00,0x00,
41 0x00,0x01,0x00,0x0F,0x0B,0x00,0x07,0x05,0x00,0x00,0x00,\ 41 0x00,0x01,0x00,0x0F,0x0B,0x00,0x07,0x05,0x00,0x00,0x00,
42 0x00,0x00,0x00}; 42 0x00,0x00,0x00};
43 unsigned char CrixPlayer::for40reg[] = {0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,\ 43 unsigned char CrixPlayer::for40reg[] = {0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,
44 0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F}; 44 0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F};
45 unsigned short CrixPlayer::mus_time = 0x4268; 45 unsigned short CrixPlayer::mus_time = 0x4268;
46
46 /*** public methods *************************************/ 47 /*** public methods *************************************/
48
47 CPlayer *CrixPlayer::factory(Copl *newopl) 49 CPlayer *CrixPlayer::factory(Copl *newopl)
48 { 50 {
49 return new CrixPlayer(newopl); 51 return new CrixPlayer(newopl);
50 } 52 }
51 53
54 CrixPlayer::CrixPlayer(Copl *newopl)
55 : CPlayer(newopl),I(0),T(0),mus_block(0),ins_block(0),rhythm(0),mutex(0),
56 music_on(0),pause_flag(0),band(0),band_low(0),e0_reg_flag(0),bd_modify(0),
57 sustain(0),dro_end(0), mstotal(0), opl3_mode(0)
58 {
59 memset(dro, 0, 64000);
60 memset(buf_addr, 0, 655360);
61 memset(buffer, 0, sizeof(unsigned short) * 300);
62 memset(a0b0_data2, 0, sizeof(unsigned short) * 11);
63 memset(a0b0_data3, 0, 18);
64 memset(a0b0_data4, 0, 18);
65 memset(a0b0_data5, 0, 96);
66 memset(addrs_head, 0, 96);
67 memset(insbuf, 0, 28 * sizeof(unsigned short));
68 memset(displace, 0, 11 * sizeof(unsigned short));
69 memset(reg_bufs, 0, 18 * sizeof(ADDT));
70 memset(for40reg, 0, 18);
71
72 if(opl->gettype() == Copl::TYPE_OPL2)
73 opl3_mode = 0;
74 else
75 opl3_mode = 1;
76 };
77
52 bool CrixPlayer::load(const std::string &filename, const CFileProvider &fp) 78 bool CrixPlayer::load(const std::string &filename, const CFileProvider &fp)
53 { 79 {
54 binistream *f = fp.open(filename); if(!f) return false; 80 binistream *f = fp.open(filename); if(!f) return false;
55 unsigned long i=0; 81 unsigned long i=0;
56 82
57 if(f->readInt(2)!=0x55aa) {fp.close(f);return false; } 83 if(f->readInt(2)!=0x55aa) {fp.close(f);return false; }
58 buf_addr[i++]=0xaa;buf_addr[i++]=0x55; 84 buf_addr[i++]=0xaa;buf_addr[i++]=0x55;
59 while(!f->eof()) 85 while(!f->eof())
60 buf_addr[i++]=f->readInt(1); 86 buf_addr[i++]=f->readInt(1);
61 length=i; 87 length=i;
62 fp.close(f); 88 fp.close(f);
63 set_new_int(); 89 set_new_int();
64 data_initial(); 90 data_initial();
65 while(!dro_end) 91 while(!dro_end)
66 int_08h_entry(); 92 int_08h_entry();
67 93
68 length=T; 94 length=T;
69 mode = (OplMode)1; // Type of opl data this can contain 95 mode = (OplMode)1; // Type of opl data this can contain
70 96
71 // binofstream *g=new binofstream(filename+string(".dro")); 97 // binofstream *g=new binofstream(filename+string(".dro"));
72 // g->writeString("DBRAWOPL",8); 98 // g->writeString("DBRAWOPL",8);
73 // g->writeInt(mstotal,4); 99 // g->writeInt(mstotal,4);
74 // g->writeInt(length+1,4); 100 // g->writeInt(length+1,4);
75 // g->writeInt(1,1); 101 // g->writeInt(1,1);
76 // for(int t=0;t<length;t++) 102 // for(int t=0;t<length;t++)
77 // g->writeInt(dro[t],1); 103 // g->writeInt(dro[t],1);
78 // g->close(); 104 // g->close();
79 // delete g; 105 // delete g;
80 106
81 rewind(0); 107 rewind(0);
108 return true;
109 }
110
111 bool CrixPlayer::update()
112 {
113 if (delay>500) {
114 delay-=500;
115 return true;
116 } else delay=1;
117 while (pos < length)
118 {
119 unsigned char cmd = dro[pos++];
120 switch(cmd) {
121 case 0:
122 delay = 1 + dro[pos++];
82 return true; 123 return true;
83 } 124 case 1:
84 125 delay = 1 + dro[pos] + (dro[pos+1]<<8);
85 bool CrixPlayer::update() 126 pos+=2;
86 { 127 return true;
87 if (delay>500) { 128 case 2:
88 delay-=500; 129 index = 0;
89 return true; 130 opl->setchip(0);
90 } else delay=1; 131 break;
91 while (pos < length) 132 case 3:
92 { 133 index = 1;
93 unsigned char cmd = dro[pos++]; 134 opl->setchip(1);
94 switch(cmd) { 135 break;
95 case 0: 136 default:
96 delay = 1 + dro[pos++]; 137 if(index == 0 || opl3_mode)
97 return true; 138 opl->write(cmd,dro[pos++]);
98 case 1: 139 break;
99 delay = 1 + dro[pos] + (dro[pos+1]<<8); 140 }
100 pos+=2; 141 }
101 return true; 142 return pos<length;
102 case 2:
103 index = 0;
104 opl->setchip(0);
105 break;
106 case 3:
107 index = 1;
108 opl->setchip(1);
109 break;
110 default:
111 if(index == 0 || opl3_mode)
112 opl->write(cmd,dro[pos++]);
113 break;
114 }
115 }
116 return pos<length;
117 } 143 }
118 144
119 void CrixPlayer::rewind(int subsong) 145 void CrixPlayer::rewind(int subsong)
120 { 146 {
121 delay=1; 147 delay=1;
122 pos = index = 0; 148 pos = index = 0;
123 opl->init(); 149 opl->init();
124 opl->write(1,32); // go to OPL2 mode 150 opl->write(1,32); // go to OPL2 mode
125 } 151 }
126 152
127 float CrixPlayer::getrefresh() 153 float CrixPlayer::getrefresh()
128 { 154 {
129 if (delay > 500) return 1000 / 500; 155 if (delay > 500) return 1000 / 500;
130 else return 1000 / (double)delay; 156 else return 1000 / (double)delay;
131 } 157 }
132 158
133 /*------------------Implemention----------------------------*/ 159 /*------------------Implemention----------------------------*/
134 inline void CrixPlayer::set_new_int() 160 inline void CrixPlayer::set_new_int()
135 { 161 {
136 if(!ad_initial()) exit(1); 162 if(!ad_initial()) exit(1);
137 prep_int(); 163 prep_int();
138 } 164 }
139 /*----------------------------------------------------------*/ 165 /*----------------------------------------------------------*/
140 inline void CrixPlayer::Pause() 166 inline void CrixPlayer::Pause()
141 { 167 {
142 register unsigned short i; 168 register unsigned short i;
143 pause_flag = 1; 169 pause_flag = 1;
144 for(i=0;i<11;i++) 170 for(i=0;i<11;i++)
145 switch_ad_bd(i); 171 switch_ad_bd(i);
146 } 172 }
147 /*----------------------------------------------------------*/ 173 /*----------------------------------------------------------*/
148 inline void CrixPlayer::ad_a0b0l_reg_(unsigned short index,unsigned short p2,unsigned short p3) 174 inline void CrixPlayer::ad_a0b0l_reg_(unsigned short index,unsigned short p2,unsigned short p3)
149 { 175 {
150 unsigned short i = p2+a0b0_data2[index]; 176 // unsigned short i = p2+a0b0_data2[index];
151 a0b0_data4[index] = p3; 177 a0b0_data4[index] = p3;
152 a0b0_data3[index] = p2; 178 a0b0_data3[index] = p2;
153 } 179 }
154 inline void CrixPlayer::data_initial() 180 inline void CrixPlayer::data_initial()
155 { 181 {
156 rhythm = buf_addr[2]; 182 rhythm = buf_addr[2];
157 mus_block = (buf_addr[0x0D]<<8)+buf_addr[0x0C]; 183 mus_block = (buf_addr[0x0D]<<8)+buf_addr[0x0C];
158 ins_block = (buf_addr[0x09]<<8)+buf_addr[0x08]; 184 ins_block = (buf_addr[0x09]<<8)+buf_addr[0x08];
159 I = mus_block+1; 185 I = mus_block+1;
160 if(rhythm != 0) 186 if(rhythm != 0)
161 { 187 {
162 // ad_a0b0_reg(6); 188 // ad_a0b0_reg(6);
163 // ad_a0b0_reg(7); 189 // ad_a0b0_reg(7);
164 // ad_a0b0_reg(8); 190 // ad_a0b0_reg(8);
165 ad_a0b0l_reg_(8,0x18,0); 191 ad_a0b0l_reg_(8,0x18,0);
166 ad_a0b0l_reg_(7,0x1F,0); 192 ad_a0b0l_reg_(7,0x1F,0);
167 } 193 }
168 bd_modify = 0; 194 bd_modify = 0;
169 // ad_bd_reg(); 195 // ad_bd_reg();
170 band = 0; music_on = 1; 196 band = 0; music_on = 1;
171 } 197 }
172 /*----------------------------------------------------------*/ 198 /*----------------------------------------------------------*/
173 inline unsigned short CrixPlayer::ad_initial() 199 inline unsigned short CrixPlayer::ad_initial()
174 { 200 {
175 register unsigned short i,j,k = 0; 201 register unsigned short i,j,k = 0;
176 for(i=0;i<25;i++) crc_trans(i,i*4); 202 for(i=0;i<25;i++) crc_trans(i,i*4);
177 for(i=0;i<8;i++) 203 for(i=0;i<8;i++)
178 for(j=0;j<12;j++) 204 for(j=0;j<12;j++)
179 { 205 {
180 a0b0_data5[k] = i; 206 a0b0_data5[k] = i;
181 addrs_head[k] = j; 207 addrs_head[k] = j;
182 k++; 208 k++;
183 } 209 }
184 //ad_bd_reg(); 210 //ad_bd_reg();
185 //ad_08_reg(); 211 //ad_08_reg();
186 //for(i=0;i<9;i++) ad_a0b0_reg(i); 212 //for(i=0;i<9;i++) ad_a0b0_reg(i);
187 e0_reg_flag = 0x20; 213 e0_reg_flag = 0x20;
188 //for(i=0;i<18;i++) ad_bop(0xE0+reg_data[i],0); 214 //for(i=0;i<18;i++) ad_bop(0xE0+reg_data[i],0);
190 return 1;//ad_test(); 216 return 1;//ad_test();
191 } 217 }
192 /*----------------------------------------------------------*/ 218 /*----------------------------------------------------------*/
193 inline void CrixPlayer::crc_trans(unsigned short index,unsigned short v) 219 inline void CrixPlayer::crc_trans(unsigned short index,unsigned short v)
194 { 220 {
195 register unsigned short i; 221 register unsigned short i;
196 unsigned int res; unsigned short low; 222 unsigned int res; unsigned short low;
197 res = strm_and_fr(v); 223 res = strm_and_fr(v);
198 low = res; 224 low = res;
199 buffer[index*12] = (low+4)>>3; 225 buffer[index*12] = (low+4)>>3;
200 for(i=1;i<=11;i++) 226 for(i=1;i<=11;i++)
201 { 227 {
202 res = (unsigned int)((double)res * 1.06); 228 res = (unsigned int)((double)res * 1.06);
203 buffer[index*12+i] = res>>3; 229 buffer[index*12+i] = res>>3;
204 } 230 }
205 } 231 }
206 232
207 /*----------------------------------------------------------*/ 233 /*----------------------------------------------------------*/
208 inline void CrixPlayer::prep_int() 234 inline void CrixPlayer::prep_int()
209 { 235 {
210 mutex = 0; 236 mutex = 0;
211 } 237 }
212 /*----------------------------------------------------------*/ 238 /*----------------------------------------------------------*/
213 inline void CrixPlayer::ad_bop(unsigned short reg,unsigned short value) 239 inline void CrixPlayer::ad_bop(unsigned short reg,unsigned short value)
214 { 240 {
215 dro[T++]=reg;dro[T++]=value; 241 dro[T++]=reg;dro[T++]=value;
216 } 242 }
217 /*------------------------------------------------------*/ 243 /*------------------------------------------------------*/
218 inline unsigned short CrixPlayer::ad_test() /* Test the SoundCard */ 244 inline unsigned short CrixPlayer::ad_test() /* Test the SoundCard */
219 { 245 {
220 ad_bop(0x04,0x60); 246 ad_bop(0x04,0x60);
221 ad_bop(0x04,0x80); 247 ad_bop(0x04,0x80);
222 ad_bop(0x02,0xFF); 248 ad_bop(0x02,0xFF);
223 ad_bop(0x04,0x21); 249 ad_bop(0x04,0x21);
224 ad_bop(0x04,0x60); 250 ad_bop(0x04,0x60);
225 ad_bop(0x04,0x80); 251 ad_bop(0x04,0x80);
226 return 1; 252 return 1;
227 } 253 }
228 /*--------------------------------------------------------------*/ 254 /*--------------------------------------------------------------*/
229 inline void CrixPlayer::int_08h_entry() 255 inline void CrixPlayer::int_08h_entry()
230 { 256 {
231 unsigned short band_sus = 1; 257 unsigned short band_sus = 1;
232 while(band_sus) 258 while(band_sus)
233 { 259 {
234 if(sustain <= 0 && mutex == 0) 260 if(sustain <= 0 && mutex == 0)
235 { 261 {
236 mutex++; 262 mutex++;
237 band_sus = rix_proc(); 263 band_sus = rix_proc();
238 if(band_sus) sustain += (int)((double)band_sus * 1.06); 264 if(band_sus) sustain += (int)((double)band_sus * 1.06);
239 mstotal+=sustain; 265 mstotal+=sustain;
240 dro[T++]=(sustain>=0x100?1:0); 266 dro[T++]=(sustain>=0x100?1:0);
241 dro[T++]=sustain&0xff; 267 dro[T++]=sustain&0xff;
242 if(sustain>=0x100) 268 if(sustain>=0x100)
243 dro[T++]=(sustain>>8)&0xff; 269 dro[T++]=(sustain>>8)&0xff;
244 mutex--; 270 mutex--;
245 if(band_sus == 0) 271 if(band_sus == 0)
246 { 272 {
247 dro_end=1; 273 dro_end=1;
248 break; 274 break;
249 } 275 }
250 } 276 }
251 else 277 else
252 { 278 {
253 if(band_sus) sustain -= 14; /* aging */ 279 if(band_sus) sustain -= 14; /* aging */
254 break; 280 break;
255 } 281 }
256 } 282 }
257 } 283 }
258 /*--------------------------------------------------------------*/ 284 /*--------------------------------------------------------------*/
259 inline unsigned short CrixPlayer::rix_proc() 285 inline unsigned short CrixPlayer::rix_proc()
260 { 286 {
261 unsigned char ctrl = 0; 287 unsigned char ctrl = 0;
262 if(music_on == 0||pause_flag == 1) return 0; 288 if(music_on == 0||pause_flag == 1) return 0;
263 band = 0; 289 band = 0;
264 while(buf_addr[I] != 0x80 && I<length-1) 290 while(buf_addr[I] != 0x80 && I<length-1)
291 {
292 band_low = buf_addr[I-1];
293 ctrl = buf_addr[I]; I+=2;
294 switch(ctrl&0xF0)
265 { 295 {
266 band_low = buf_addr[I-1]; 296 case 0x90: rix_get_ins(); rix_90_pro(ctrl&0x0F); break;
267 ctrl = buf_addr[I]; I+=2; 297 case 0xA0: rix_A0_pro(ctrl&0x0F,((unsigned short)band_low)<<6); break;
268 switch(ctrl&0xF0) 298 case 0xB0: rix_B0_pro(ctrl&0x0F,band_low); break;
269 { 299 case 0xC0: switch_ad_bd(ctrl&0x0F);
270 case 0x90: rix_get_ins(); rix_90_pro(ctrl&0x0F); break; 300 if(band_low != 0) rix_C0_pro(ctrl&0x0F,band_low);
271 case 0xA0: rix_A0_pro(ctrl&0x0F,((unsigned short)band_low)<<6); break; 301 break;
272 case 0xB0: rix_B0_pro(ctrl&0x0F,band_low); break; 302 default: band = (ctrl<<8)+band_low; break;
273 case 0xC0: switch_ad_bd(ctrl&0x0F);
274 if(band_low != 0) rix_C0_pro(ctrl&0x0F,band_low);
275 break;
276 default: band = (ctrl<<8)+band_low; break;
277 }
278 if(band != 0) return band;
279 } 303 }
280 music_ctrl(); 304 if(band != 0) return band;
281 I = mus_block+1; 305 }
282 band = 0; music_on = 1; 306 music_ctrl();
283 return 0; 307 I = mus_block+1;
308 band = 0; music_on = 1;
309 return 0;
284 } 310 }
285 /*--------------------------------------------------------------*/ 311 /*--------------------------------------------------------------*/
286 inline void CrixPlayer::rix_get_ins() 312 inline void CrixPlayer::rix_get_ins()
287 { 313 {
288 memcpy(insbuf,(&buf_addr[ins_block])+(band_low<<6),56); 314 memcpy(insbuf,(&buf_addr[ins_block])+(band_low<<6),56);
289 } 315 }
290 /*--------------------------------------------------------------*/ 316 /*--------------------------------------------------------------*/
291 inline void CrixPlayer::rix_90_pro(unsigned short ctrl_l) 317 inline void CrixPlayer::rix_90_pro(unsigned short ctrl_l)
292 { 318 {
293 if(rhythm == 0 || ctrl_l < 6) 319 if(rhythm == 0 || ctrl_l < 6)
320 {
321 ins_to_reg(modify[ctrl_l*2],insbuf,insbuf[26]);
322 ins_to_reg(modify[ctrl_l*2+1],insbuf+13,insbuf[27]);
323 return;
324 }
325 else
326 {
327 if(ctrl_l > 6)
294 { 328 {
295 ins_to_reg(modify[ctrl_l*2],insbuf,insbuf[26]); 329 ins_to_reg(modify[ctrl_l*2+6],insbuf,insbuf[26]);
296 ins_to_reg(modify[ctrl_l*2+1],insbuf+13,insbuf[27]); 330 return;
297 return;
298 } 331 }
299 else 332 else
300 { 333 {
301 if(ctrl_l > 6) 334 ins_to_reg(12,insbuf,insbuf[26]);
302 { 335 ins_to_reg(15,insbuf+13,insbuf[27]);
303 ins_to_reg(modify[ctrl_l*2+6],insbuf,insbuf[26]); 336 return;
304 return;
305 }
306 else
307 {
308 ins_to_reg(12,insbuf,insbuf[26]);
309 ins_to_reg(15,insbuf+13,insbuf[27]);
310 return;
311 }
312 } 337 }
338 }
313 } 339 }
314 /*--------------------------------------------------------------*/ 340 /*--------------------------------------------------------------*/
315 inline void CrixPlayer::rix_A0_pro(unsigned short ctrl_l,unsigned short index) 341 inline void CrixPlayer::rix_A0_pro(unsigned short ctrl_l,unsigned short index)
316 { 342 {
317 if(rhythm == 0 || ctrl_l <= 6) 343 if(rhythm == 0 || ctrl_l <= 6)
344 {
345 prepare_a0b0(ctrl_l,index>0x3FFF?0x3FFF:index);
346 ad_a0b0l_reg(ctrl_l,a0b0_data3[ctrl_l],a0b0_data4[ctrl_l]);
347 }
348 else return;
349 }
350 /*--------------------------------------------------------------*/
351 inline void CrixPlayer::prepare_a0b0(unsigned short index,unsigned short v) /* important !*/
352 {
353 short high = 0,low = 0; unsigned int res;
354 low = ((unsigned short)(v-0x2000))*0x19;
355 high = ((short)v)<0x2000?0xFFFF:0;
356 if(low == 0xFF && high == 0) return;
357 res = ((((unsigned int)high)<<16)|low)/0x2000;
358 low = res&0xFFFF;
359 if(low < 0)
360 {
361 low = 0x18-low; high = (signed short)low<0?0xFFFF:0;
362 res = high; res<<=16; res+=low;
363 low = ((signed short)res)/(signed short)0xFFE7;
364 a0b0_data2[index] = low;
365 low = res;
366 res = low - 0x18;
367 high = (signed short)res%0x19;
368 low = (signed short)res/0x19;
369 if(high != 0) {low = 0x19; low = low-high;}
370 }
371 else
372 {
373 res = high = low;
374 low = (signed short)res/(signed short)0x19;
375 a0b0_data2[index] = low;
376 res = high;
377 low = (signed short)res%(signed short)0x19;
378 }
379 low = (signed short)low*(signed short)0x18;
380 displace[index] = low;
381 }
382 /*--------------------------------------------------------------*/
383 inline void CrixPlayer::ad_a0b0l_reg(unsigned short index,unsigned short p2,unsigned short p3)
384 {
385 unsigned short data; unsigned short i = p2+a0b0_data2[index];
386 a0b0_data4[index] = p3;
387 a0b0_data3[index] = p2;
388 i = ((signed short)i<=0x5F?i:0x5F);
389 i = ((signed short)i>=0?i:0);
390 data = buffer[addrs_head[i]+displace[index]/2];
391 ad_bop(0xA0+index,data);
392 data = a0b0_data5[i]*4+(p3<1?0:0x20)+((data>>8)&3);
393 ad_bop(0xB0+index,data);
394 }
395 /*--------------------------------------------------------------*/
396 inline void CrixPlayer::rix_B0_pro(unsigned short ctrl_l,unsigned short index)
397 {
398 register int temp = 0;
399 if(rhythm == 0 || ctrl_l < 6) temp = modify[ctrl_l*2+1];
400 else
401 {
402 temp = ctrl_l > 6?ctrl_l*2:ctrl_l*2+1;
403 temp = modify[temp+6];
404 }
405 for40reg[temp] = index>0x7F?0x7F:index;
406 ad_40_reg(temp);
407 }
408 /*--------------------------------------------------------------*/
409 inline void CrixPlayer::rix_C0_pro(unsigned short ctrl_l,unsigned short index)
410 {
411 register unsigned short i = index>=12?index-12:0;
412 if(ctrl_l < 6 || rhythm == 0)
413 {
414 ad_a0b0l_reg(ctrl_l,i,1);
415 return;
416 }
417 else
418 {
419 if(ctrl_l != 6)
318 { 420 {
319 prepare_a0b0(ctrl_l,index>0x3FFF?0x3FFF:index); 421 if(ctrl_l == 8)
320 ad_a0b0l_reg(ctrl_l,a0b0_data3[ctrl_l],a0b0_data4[ctrl_l]); 422 {
423 ad_a0b0l_reg(ctrl_l,i,0);
424 ad_a0b0l_reg(7,i+7,0);
425 }
321 } 426 }
322 else return; 427 else ad_a0b0l_reg(ctrl_l,i,0);
323 } 428 bd_modify |= bd_reg_data[ctrl_l];
324 /*--------------------------------------------------------------*/ 429 ad_bd_reg();
325 inline void CrixPlayer::prepare_a0b0(unsigned short index,unsigned short v) /* important !*/ 430 return;
326 { 431 }
327 short high = 0,low = 0; unsigned int res;
328 low = ((unsigned short)(v-0x2000))*0x19;
329 high = ((short)v)<0x2000?0xFFFF:0;
330 if(low == 0xFF && high == 0) return;
331 res = ((((unsigned int)high)<<16)|low)/0x2000;
332 low = res&0xFFFF;
333 if(low < 0)
334 {
335 low = 0x18-low; high = (signed short)low<0?0xFFFF:0;
336 res = high; res<<=16; res+=low;
337 low = ((signed short)res)/(signed short)0xFFE7;
338 a0b0_data2[index] = low;
339 low = res;
340 res = low - 0x18;
341 high = (signed short)res%0x19;
342 low = (signed short)res/0x19;
343 if(high != 0) {low = 0x19; low = low-high;}
344 }
345 else
346 {
347 res = high = low;
348 low = (signed short)res/(signed short)0x19;
349 a0b0_data2[index] = low;
350 res = high;
351 low = (signed short)res%(signed short)0x19;
352 }
353 low = (signed short)low*(signed short)0x18;
354 displace[index] = low;
355 }
356 /*--------------------------------------------------------------*/
357 inline void CrixPlayer::ad_a0b0l_reg(unsigned short index,unsigned short p2,unsigned short p3)
358 {
359 unsigned short data; unsigned short i = p2+a0b0_data2[index];
360 a0b0_data4[index] = p3;
361 a0b0_data3[index] = p2;
362 i = ((signed short)i<=0x5F?i:0x5F);
363 i = ((signed short)i>=0?i:0);
364 data = buffer[addrs_head[i]+displace[index]/2];
365 ad_bop(0xA0+index,data);
366 data = a0b0_data5[i]*4+(p3<1?0:0x20)+((data>>8)&3);
367 ad_bop(0xB0+index,data);
368 }
369 /*--------------------------------------------------------------*/
370 inline void CrixPlayer::rix_B0_pro(unsigned short ctrl_l,unsigned short index)
371 {
372 register int temp = 0;
373 if(rhythm == 0 || ctrl_l < 6) temp = modify[ctrl_l*2+1];
374 else
375 {
376 temp = ctrl_l > 6?ctrl_l*2:ctrl_l*2+1;
377 temp = modify[temp+6];
378 }
379 for40reg[temp] = index>0x7F?0x7F:index;
380 ad_40_reg(temp);
381 }
382 /*--------------------------------------------------------------*/
383 inline void CrixPlayer::rix_C0_pro(unsigned short ctrl_l,unsigned short index)
384 {
385 register unsigned short i = index>=12?index-12:0;
386 if(ctrl_l < 6 || rhythm == 0)
387 {
388 ad_a0b0l_reg(ctrl_l,i,1);
389 return;
390 }
391 else
392 {
393 if(ctrl_l != 6)
394 {
395 if(ctrl_l == 8)
396 {
397 ad_a0b0l_reg(ctrl_l,i,0);
398 ad_a0b0l_reg(7,i+7,0);
399 }
400 }
401 else ad_a0b0l_reg(ctrl_l,i,0);
402 bd_modify |= bd_reg_data[ctrl_l];
403 ad_bd_reg();
404 return;
405 }
406 } 432 }
407 /*--------------------------------------------------------------*/ 433 /*--------------------------------------------------------------*/
408 inline void CrixPlayer::switch_ad_bd(unsigned short index) 434 inline void CrixPlayer::switch_ad_bd(unsigned short index)
409 { 435 {
410 436
411 if(rhythm == 0 || index < 6) ad_a0b0l_reg(index,a0b0_data3[index],0); 437 if(rhythm == 0 || index < 6) ad_a0b0l_reg(index,a0b0_data3[index],0);
412 else 438 else
413 { 439 {
414 bd_modify &= (~bd_reg_data[index]), 440 bd_modify &= (~bd_reg_data[index]),
415 ad_bd_reg(); 441 ad_bd_reg();
416 } 442 }
417 } 443 }
418 /*--------------------------------------------------------------*/ 444 /*--------------------------------------------------------------*/
419 inline void CrixPlayer::ins_to_reg(unsigned short index,unsigned short* insb,unsigned short value) 445 inline void CrixPlayer::ins_to_reg(unsigned short index,unsigned short* insb,unsigned short value)
420 { 446 {
421 register unsigned short i; 447 register unsigned short i;
422 for(i=0;i<13;i++) reg_bufs[index].v[i] = insb[i]; 448 for(i=0;i<13;i++) reg_bufs[index].v[i] = insb[i];
423 reg_bufs[index].v[13] = value&3; 449 reg_bufs[index].v[13] = value&3;
424 ad_bd_reg(),ad_08_reg(), 450 ad_bd_reg(),ad_08_reg(),
425 ad_40_reg(index),ad_C0_reg(index),ad_60_reg(index), 451 ad_40_reg(index),ad_C0_reg(index),ad_60_reg(index),
426 ad_80_reg(index),ad_20_reg(index),ad_E0_reg(index); 452 ad_80_reg(index),ad_20_reg(index),ad_E0_reg(index);
427 } 453 }
428 /*--------------------------------------------------------------*/ 454 /*--------------------------------------------------------------*/
429 inline void CrixPlayer::ad_E0_reg(unsigned short index) 455 inline void CrixPlayer::ad_E0_reg(unsigned short index)
430 { 456 {
431 unsigned short data = e0_reg_flag == 0?0:(reg_bufs[index].v[13]&3); 457 unsigned short data = e0_reg_flag == 0?0:(reg_bufs[index].v[13]&3);
432 ad_bop(0xE0+reg_data[index],data); 458 ad_bop(0xE0+reg_data[index],data);
433 } 459 }
434 /*--------------------------------------------------------------*/ 460 /*--------------------------------------------------------------*/
435 inline void CrixPlayer::ad_20_reg(unsigned short index) 461 inline void CrixPlayer::ad_20_reg(unsigned short index)
436 { 462 {
437 unsigned short data = (reg_bufs[index].v[9] < 1?0:0x80); 463 unsigned short data = (reg_bufs[index].v[9] < 1?0:0x80);
438 data += (reg_bufs[index].v[10] < 1?0:0x40); 464 data += (reg_bufs[index].v[10] < 1?0:0x40);
439 data += (reg_bufs[index].v[5] < 1?0:0x20); 465 data += (reg_bufs[index].v[5] < 1?0:0x20);
440 data += (reg_bufs[index].v[11] < 1?0:0x10); 466 data += (reg_bufs[index].v[11] < 1?0:0x10);
441 data += (reg_bufs[index].v[1]&0x0F); 467 data += (reg_bufs[index].v[1]&0x0F);
442 ad_bop(0x20+reg_data[index],data); 468 ad_bop(0x20+reg_data[index],data);
443 } 469 }
444 /*--------------------------------------------------------------*/ 470 /*--------------------------------------------------------------*/
445 inline void CrixPlayer::ad_80_reg(unsigned short index) 471 inline void CrixPlayer::ad_80_reg(unsigned short index)
446 { 472 {
447 unsigned short data = (reg_bufs[index].v[7]&0x0F),temp = reg_bufs[index].v[4]; 473 unsigned short data = (reg_bufs[index].v[7]&0x0F),temp = reg_bufs[index].v[4];
448 data |= (temp << 4); 474 data |= (temp << 4);
449 ad_bop(0x80+reg_data[index],data); 475 ad_bop(0x80+reg_data[index],data);
450 } 476 }
451 /*--------------------------------------------------------------*/ 477 /*--------------------------------------------------------------*/
452 inline void CrixPlayer::ad_60_reg(unsigned short index) 478 inline void CrixPlayer::ad_60_reg(unsigned short index)
453 { 479 {
454 unsigned short data = reg_bufs[index].v[6]&0x0F,temp = reg_bufs[index].v[3]; 480 unsigned short data = reg_bufs[index].v[6]&0x0F,temp = reg_bufs[index].v[3];
455 data |= (temp << 4); 481 data |= (temp << 4);
456 ad_bop(0x60+reg_data[index],data); 482 ad_bop(0x60+reg_data[index],data);
457 } 483 }
458 /*--------------------------------------------------------------*/ 484 /*--------------------------------------------------------------*/
459 inline void CrixPlayer::ad_C0_reg(unsigned short index) 485 inline void CrixPlayer::ad_C0_reg(unsigned short index)
460 { 486 {
461 unsigned short data = reg_bufs[index].v[2]; 487 unsigned short data = reg_bufs[index].v[2];
462 if(adflag[index] == 1) return; 488 if(adflag[index] == 1) return;
463 data *= 2, 489 data *= 2,
464 data |= (reg_bufs[index].v[12] < 1?1:0); 490 data |= (reg_bufs[index].v[12] < 1?1:0);
465 ad_bop(0xC0+ad_C0_offs[index],data); 491 ad_bop(0xC0+ad_C0_offs[index],data);
466 } 492 }
467 /*--------------------------------------------------------------*/ 493 /*--------------------------------------------------------------*/
468 inline void CrixPlayer::ad_40_reg(unsigned short index) 494 inline void CrixPlayer::ad_40_reg(unsigned short index)
469 { 495 {
470 unsigned int res = 0; 496 unsigned int res = 0;
471 unsigned short data = 0,temp = reg_bufs[index].v[0]; 497 unsigned short data = 0,temp = reg_bufs[index].v[0];
472 data = 0x3F - (0x3F & reg_bufs[index].v[8]), 498 data = 0x3F - (0x3F & reg_bufs[index].v[8]),
473 data *= for40reg[index], 499 data *= for40reg[index],
474 data *= 2, 500 data *= 2,
475 data += 0x7F, 501 data += 0x7F,
476 res = data; 502 res = data;
477 data = res/0xFE, 503 data = res/0xFE,
478 data -= 0x3F, 504 data -= 0x3F,
479 data = -data, 505 data = -data,
480 data |= temp<<6; 506 data |= temp<<6;
481 ad_bop(0x40+reg_data[index],data); 507 ad_bop(0x40+reg_data[index],data);
482 } 508 }
483 /*--------------------------------------------------------------*/ 509 /*--------------------------------------------------------------*/
484 inline void CrixPlayer::ad_bd_reg() 510 inline void CrixPlayer::ad_bd_reg()
485 { 511 {
486 unsigned short data = rhythm < 1? 0:0x20; 512 unsigned short data = rhythm < 1? 0:0x20;
487 data |= bd_modify; 513 data |= bd_modify;
488 ad_bop(0xBD,data); 514 ad_bop(0xBD,data);
489 } 515 }
490 /*--------------------------------------------------------------*/ 516 /*--------------------------------------------------------------*/
491 inline void CrixPlayer::ad_a0b0_reg(unsigned short index) 517 inline void CrixPlayer::ad_a0b0_reg(unsigned short index)
492 { 518 {
493 ad_bop(0xA0+index,0); 519 ad_bop(0xA0+index,0);
494 ad_bop(0xB0+index,0); 520 ad_bop(0xB0+index,0);
495 } 521 }
496 /*--------------------------------------------------------------*/ 522 /*--------------------------------------------------------------*/
497 inline void CrixPlayer::music_ctrl() 523 inline void CrixPlayer::music_ctrl()
498 { 524 {
499 register int i; 525 register int i;
500 music_on = 0; 526 music_on = 0;
501 for(i=0;i<11;i++) 527 for(i=0;i<11;i++)
502 switch_ad_bd(i); 528 switch_ad_bd(i);
503 } 529 }
504 /*----------------------------------------------------------------------*/ 530 /*----------------------------------------------------------------------*/
505 inline unsigned int CrixPlayer::strm_and_fr(unsigned short parm) 531 inline unsigned int CrixPlayer::strm_and_fr(unsigned short parm)
506 { 532 {
507 return (int)(((unsigned int)parm*6+10000)*0.27461678223); 533 return (int)(((unsigned int)parm*6+10000)*0.27461678223);
508 } 534 }
509