comparison cdcnv.c @ 2:b16b82dbfe87

massive cleanup
author Yoshiki Yazawa <yaz@honeyplanet.jp>
date Wed, 05 Jan 2011 21:41:39 +0900
parents 05cc06e88a57
children 8781bb6d488d
comparison
equal deleted inserted replaced
1:05cc06e88a57 2:b16b82dbfe87
1 /* cdcnv.c --------------------------------------------- 1 /* cdcnv.c ---------------------------------------------
2 $Id: cdcnv.c,v 1.1 2002/12/21 01:13:27 tosy Exp $ 2 $Id: cdcnv.c,v 1.1 2002/12/21 01:13:27 tosy Exp $
3 3
4 (以前の履歴は rcctl.c 参照) 4 (篁ュ絮ユ眼 rcctl.c )
5 v0.30 97.12.13 コード変換部(cdcnv.c)分離 5 v0.30 97.12.13 潟若紊(cdcnv.c)
6 v0.31 98.03.07 Mac21対応 6 v0.31 98.03.07 Mac21絲上
7 v0.31a 98.03.11 Syncom対応(要rc_send修正) 7 v0.31a 98.03.11 Syncom絲上(荀rc_send篆罩)
8 v0.31b 98.03.15 ALISA3(L)対応 8 v0.31b 98.03.15 ALISA3(L)絲上
9 v0.32 98.11.29 鉄人,Σ,NET7000対応 9 v0.32 98.11.29 篋,裡,NET7000絲上
10 v0.40 02.12.15 B-kara,HyperJOY対応,Σバグ修正 10 v0.40 02.12.15 B-kara,HyperJOY絲上,裡遺信罩
11 v0.50 11.01.06 linux吾眼 (yaz)
11 ------------------------------------------------------*/ 12 ------------------------------------------------------*/
12 13
13 #include <string.h> 14 #include <string.h>
14 #include <stdio.h> 15 #include <stdio.h>
15 #if defined(__FreeBSD__)||defined(linux) 16 #include "debug.h"
17
18 #if defined(__FreeBSD__) || defined(linux)
16 #define stricmp(s, c) strcasecmp(s, c) 19 #define stricmp(s, c) strcasecmp(s, c)
17 #endif 20 #endif
18 21
19 const char mks[] = "XUGJHBPDSNKMALZTCI"; 22 const char mks[] = "XUGJHBPDSNKMALZTCI";
20 #define M_X2 0 /* X2000 */ 23 #define M_X2 0 /* X2000 */
23 #define M_JO 3 /* JOYSOUND */ 26 #define M_JO 3 /* JOYSOUND */
24 #define M_HJ 4 /* HyperJOY */ 27 #define M_HJ 4 /* HyperJOY */
25 #define M_BT 5 /* BeMax'S(T) */ 28 #define M_BT 5 /* BeMax'S(T) */
26 #define M_PR 6 /* Prologue21 */ 29 #define M_PR 6 /* Prologue21 */
27 #define M_DA 7 /* DAM */ 30 #define M_DA 7 /* DAM */
28 #define M_SY 8 /* Syncom/孫悟空 */ 31 #define M_SY 8 /* Syncom/絖腥 */
29 #define M_N7 9 /* NET7000 */ 32 #define M_N7 9 /* NET7000 */
30 #define M_BK 10 /* B-kara */ 33 #define M_BK 10 /* B-kara */
31 #define M_MA 11 /* Mac21 */ 34 #define M_MA 11 /* Mac21 */
32 #define M_A3 12 /* ALISA3(A) */ 35 #define M_A3 12 /* ALISA3(A) */
33 #define M_AL 13 /* ALISA3(L) */ 36 #define M_AL 13 /* ALISA3(L) */
34 #define M_AZ 14 /* ALISA3(Z) */ 37 #define M_AZ 14 /* ALISA3(Z) */
35 #define M_TS 15 /* 東映システム */ 38 #define M_TS 15 /* 掩激鴻 */
36 #define M_SI 16 /* Σシステム */ 39 #define M_SI 16 /* 裡激鴻 */
37 #define M_TJ 17 /* カラオケの鉄人 */ 40 #define M_TJ 17 /* 宴篋 */
38 41
39 #define K_SE 3 42 #define K_SE 3
40 #define K_KU 4 43 #define K_KU 4
41 #define K_KD 5 44 #define K_KD 5
42 #define K_SP 6 45 #define K_SP 6
78 {0x30, 0x87, 0x56, 0x12, 0x43, 0x47, 0x11, -1, 0x42, /* ALISA3 */ 81 {0x30, 0x87, 0x56, 0x12, 0x43, 0x47, 0x11, -1, 0x42, /* ALISA3 */
79 0x0d, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0e, 0x0f }, 82 0x0d, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0e, 0x0f },
80 {0x30, 0x00, 0xff, 0x41, 0x08, 0x09, 0x4c, 0x45, 0x44, /* TOEI sys */ 83 {0x30, 0x00, 0xff, 0x41, 0x08, 0x09, 0x4c, 0x45, 0x44, /* TOEI sys */
81 0x13, 0x0f, 0x4f, 0x4e, 0x07, 0x47, 0x46, 0x03, 0x43, 0x42, 0x53, 0x52 }, 84 0x13, 0x0f, 0x4f, 0x4e, 0x07, 0x47, 0x46, 0x03, 0x43, 0x42, 0x53, 0x52 },
82 85
83 {0x10, 0x55, 0xaa, 0x3e, 0x08, 0x09, 0x5c, -1, -1, /* Σ System */ 86 {0x10, 0x55, 0xaa, 0x3e, 0x08, 0x09, 0x5c, -1, -1, /* 裡 System */
84 0x13, 0x0f, 0x4f, 0x4e, 0x07, 0x47, 0x46, 0x03, 0x43, 0x42, 0x53, 0x52 }, 87 0x13, 0x0f, 0x4f, 0x4e, 0x07, 0x47, 0x46, 0x03, 0x43, 0x42, 0x53, 0x52 },
85 88
86 {0x40, 0xae, 0x51, 0xdc, 0x03, 0x02, 0x96, -1, 0xdd, /* 鉄人 */ 89 {0x40, 0xae, 0x51, 0xdc, 0x03, 0x02, 0x96, -1, 0xdd, /* 篋 */
87 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0xda, 0xdb } 90 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0xda, 0xdb }
88 }; 91 };
89 92
90 int tsc[] = {0x00, 0x04, 0x0c, 0x10, 0x01, 0x05, 0x0d, 0x11}; 93 int tsc[] = {0x00, 0x04, 0x0c, 0x10, 0x01, 0x05, 0x0d, 0x11};
91 int tjc[] = {0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xde, 0xd0, 0xd1, 0xd2, 0xd3}; 94 int tjc[] = {0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xde, 0xd0, 0xd1, 0xd2, 0xd3};
99 int cdcnv(int buf[], char *mak, char *cod) 102 int cdcnv(int buf[], char *mak, char *cod)
100 { 103 {
101 int maker, i, c, n, *q; 104 int maker, i, c, n, *q;
102 char *tmp = NULL; 105 char *tmp = NULL;
103 106
104 #ifdef DEBUG 107 debug(1, "mak=%s cod=%s\n", mak, cod);
105 fprintf(stderr, "mak=%s cod=%s\n", mak, cod);
106 #endif
107 108
108 tmp = strchr(mks, *mak & 0xdf); 109 tmp = strchr(mks, *mak & 0xdf);
109 if(!tmp) 110 if(!tmp)
110 return -1; 111 return -1;
112
111 maker = (int)(tmp - mks); 113 maker = (int)(tmp - mks);
112 #ifdef DEBUG 114 debug(1, "maker=%d\n", maker);
113 fprintf(stderr, "maker=%d\n", maker); 115
114 #endif
115 q = buf; 116 q = buf;
116 117
117 *q++ = 0x80; /* wake-up code */ 118 *q++ = 0x80; /* wake-up code */
118 *q++ = cvt[maker][0]; 119 *q++ = cvt[maker][0];
119 *q++ = cvt[maker][1]; 120 *q++ = cvt[maker][1];
120 *q++ = cvt[maker][2]; 121 *q++ = cvt[maker][2];
121 122
122 /* 統合機種等でのメーカー名指定 */ 123 /* 腟怨罘腮膈с<若弱絎 */
123 if ((c = *++mak) != 0) { 124 if ((c = *++mak) != 0) {
124 if ((maker == M_A3)&&('0' <= c)&&(c <= '4')) 125 if ((maker == M_A3)&&('0' <= c)&&(c <= '4'))
125 cvt[maker][K_SE] = 0x12 + (c - '0'); 126 cvt[maker][K_SE] = 0x12 + (c - '0');
126 else if ((maker == M_AZ)&&('1' <= c)&&(c <= '4')) 127 else if ((maker == M_AZ)&&('1' <= c)&&(c <= '4'))
127 *q++ = 0x13 + (c - '1'); 128 *q++ = 0x13 + (c - '1');
159 *q++ = cvt[maker][K_NM + ((*mak >= 'A')? 1: 0)]; 160 *q++ = cvt[maker][K_NM + ((*mak >= 'A')? 1: 0)];
160 *q++ = cvt[maker][K_NM + ((*mak % 0x41) & 0x0f)]; 161 *q++ = cvt[maker][K_NM + ((*mak % 0x41) & 0x0f)];
161 } 162 }
162 } 163 }
163 164
164 /* 曲コード変換 */ 165 /* 蚊潟若紊 */
165 while((c = *cod++) != '\0') { 166 while((c = *cod++) != '\0') {
166 if (('0' <= c)&&(c <= '9')) 167 if (('0' <= c)&&(c <= '9'))
167 *q = cvt[maker][c - '0' + K_NM]; 168 *q = cvt[maker][c - '0' + K_NM];
168 else if ((c == 'A')||(c == 'a')) 169 else if ((c == 'A')||(c == 'a'))
169 *q = cvt[maker][10 + K_NM]; 170 *q = cvt[maker][10 + K_NM];
179 *q = -1; 180 *q = -1;
180 if (*q++ == -1) 181 if (*q++ == -1)
181 return -2; 182 return -2;
182 } 183 }
183 184
184 /* 送信直前処理 */ 185 /* 篆∞翫 */
185 switch(maker) { 186 switch(maker) {
186 case M_X2: 187 case M_X2:
187 /* X2000: 曲コードの末尾 2 桁の直前にも SET を送信 */ 188 /* X2000: 蚊潟若絨 2 罅翫 SET 篆 */
188 q -= 2; 189 q -= 2;
189 q[3] = cvt[maker][K_SE]; 190 q[3] = cvt[maker][K_SE];
190 q[2] = q[1]; 191 q[2] = q[1];
191 q[1] = q[0]; 192 q[1] = q[0];
192 q[0] = cvt[maker][K_SE]; 193 q[0] = cvt[maker][K_SE];
193 q += 4; 194 q += 4;
194 break; 195 break;
195 196
196 case M_GI: 197 case M_GI:
197 /* GIGA: 曲コードが 6 桁以下の場合は最後に'0'を埋める */ 198 /* GIGA: 蚊潟若 6 罅篁ヤ翫緇'0' */
198 while(q < &buf[10]) 199 while(q < &buf[10])
199 *q++ = cvt[maker][K_NM]; 200 *q++ = cvt[maker][K_NM];
200 break; 201 break;
201 202
202 case M_PR: 203 case M_PR:
212 *q++ = 0x33; 213 *q++ = 0x33;
213 buf[4] = buf[8]; 214 buf[4] = buf[8];
214 buf[5] = buf[9]; 215 buf[5] = buf[9];
215 buf[6] = buf[10]; 216 buf[6] = buf[10];
216 buf[7] = buf[11]; 217 buf[7] = buf[11];
217 break; /* q=&buf[8] にしないとバグのような… */ 218 break; /* q=&buf[8] 違 */
218 219
219 case M_SI: 220 case M_SI:
220 /* Σシステム: コード長 10 バイト(<Maker[2]>,<Code[7]>,<SET>)固定 */ 221 /* 裡激鴻: 潟若 10 ゃ(<Maker[2]>,<Code[7]>,<SET>)阪 */
221 case M_DA: 222 case M_DA:
222 /* DAM: コード長 9 バイト(0x08,<Code[7]>,<SET>)固定 */ 223 /* DAM: 潟若 9 ゃ(0x08,<Code[7]>,<SET>)阪 */
223 case M_BK: 224 case M_BK:
224 /* B-kara: コード長 9 バイト(0xf0,<Code[7]>,<SET>)固定 */ 225 /* B-kara: 潟若 9 ゃ(0xf0,<Code[7]>,<SET>)阪 */
225 n = (maker == M_SI)? 12: 11; /* 数字の最終桁を buf[n] とした値 */ 226 n = (maker == M_SI)? 12: 11; /* 医腟罅 buf[n] */
226 for( i=0; i<7; i++ ) { 227 for( i=0; i<7; i++ ) {
227 c = *(q-1); 228 c = *(q-1);
228 if ((i == 1)&&((c == cvt[maker][K_NM+10])||(c == cvt[maker][K_NM+11]))) 229 if ((i == 1)&&((c == cvt[maker][K_NM+10])||(c == cvt[maker][K_NM+11])))
229 /* 曲コード中の'A','B'以降の桁数が1桁なら'0'を挿入 */ 230 /* 蚊潟若筝'A','B'篁ラ罅違1罅'0'水 */
230 buf[n-i] = cvt[maker][K_NM + 0]; 231 buf[n-i] = cvt[maker][K_NM + 0];
231 else if ((i == 2)&&(c!=cvt[maker][K_NM+10])&&(c!=cvt[maker][K_NM+11])) 232 else if ((i == 2)&&(c!=cvt[maker][K_NM+10])&&(c!=cvt[maker][K_NM+11]))
232 /* 曲コードの末尾 3 文字めが'A','B'でなければ'-'を設定 */ 233 /* 蚊潟若絨 3 絖'A','B'с'-'荐絎 */
233 buf[n-i] = (maker == M_BK)? 0x3d: ((maker == M_SI)? 0x51: 0x3c); 234 buf[n-i] = (maker == M_BK)? 0x3d: ((maker == M_SI)? 0x51: 0x3c);
234 else if (q > &buf[n-6]) 235 else if (q > &buf[n-6])
235 buf[n-i] = *--q; 236 buf[n-i] = *--q;
236 else 237 else
237 /* 桁数の足らない部分には'0'を設定 */ 238 /* 罅違莇潟'0'荐絎 */
238 buf[n-i] = cvt[maker][K_NM + 0]; 239 buf[n-i] = cvt[maker][K_NM + 0];
239 } 240 }
240 q = &buf[n+1]; 241 q = &buf[n+1];
241 default: 242 default:
242 *q++ = cvt[maker][K_SE]; 243 *q++ = cvt[maker][K_SE];
243 break; 244 break;
244 } 245 }
245 } 246 }
246 /* 制御コードの処理 */ 247 /* 九勝潟若 */
247 else { 248 else {
248 *q = -1; 249 *q = -1;
249 if (!stricmp(cod, "SE")) 250 if (!stricmp(cod, "SE"))
250 *q = cvt[maker][K_SE]; 251 *q = cvt[maker][K_SE];
251 else if (!stricmp(cod, "KU")) 252 else if (!stricmp(cod, "KU"))
264 } 265 }
265 266
266 if ((maker == M_BK)||((maker == M_UK)&&('2' == *mak))) 267 if ((maker == M_BK)||((maker == M_UK)&&('2' == *mak)))
267 *q++ = 0xf7; 268 *q++ = 0xf7;
268 269
269 buf[1] |= q-buf-2; /* 実送信バイト数(PIC 制御用)を埋め込み */ 270 buf[1] |= q-buf-2; /* 絎篆<ゃ(PIC 九勝)莨若 */
270 return q-buf; 271 return q-buf;
271 } 272 }