comparison cdcnv.c @ 1:05cc06e88a57

modified to make use of libhid to access the device
author Yoshiki Yazawa <yaz@honeyplanet.jp>
date Fri, 24 Dec 2010 15:28:04 +0900
parents e1a1a181c0d7
children b16b82dbfe87
comparison
equal deleted inserted replaced
0:e1a1a181c0d7 1:05cc06e88a57
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 ------------------------------------------------------*/ 11 ------------------------------------------------------*/
12 12
13 #include <string.h> 13 #include <string.h>
14 #include <stdio.h>
14 #if defined(__FreeBSD__)||defined(linux) 15 #if defined(__FreeBSD__)||defined(linux)
15 #define stricmp(s, c) strcasecmp(s, c) 16 #define stricmp(s, c) strcasecmp(s, c)
16 #endif 17 #endif
17 18
18 const char *mks = "XUGJHBPDSNKMALZTCI"; 19 const char mks[] = "XUGJHBPDSNKMALZTCI";
19 #define M_X2 0 /* X2000 */ 20 #define M_X2 0 /* X2000 */
20 #define M_UK 1 /* U-kara */ 21 #define M_UK 1 /* U-kara */
21 #define M_GI 2 /* GIGA */ 22 #define M_GI 2 /* GIGA */
22 #define M_JO 3 /* JOYSOUND */ 23 #define M_JO 3 /* JOYSOUND */
23 #define M_HJ 4 /* HyperJOY */ 24 #define M_HJ 4 /* HyperJOY */
76 0x0d, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0e, 0x0f }, 77 0x0d, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0e, 0x0f },
77 {0x30, 0x87, 0x56, 0x12, 0x43, 0x47, 0x11, -1, 0x42, /* ALISA3 */ 78 {0x30, 0x87, 0x56, 0x12, 0x43, 0x47, 0x11, -1, 0x42, /* ALISA3 */
78 0x0d, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0e, 0x0f }, 79 0x0d, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0e, 0x0f },
79 {0x30, 0x00, 0xff, 0x41, 0x08, 0x09, 0x4c, 0x45, 0x44, /* TOEI sys */ 80 {0x30, 0x00, 0xff, 0x41, 0x08, 0x09, 0x4c, 0x45, 0x44, /* TOEI sys */
80 0x13, 0x0f, 0x4f, 0x4e, 0x07, 0x47, 0x46, 0x03, 0x43, 0x42, 0x53, 0x52 }, 81 0x13, 0x0f, 0x4f, 0x4e, 0x07, 0x47, 0x46, 0x03, 0x43, 0x42, 0x53, 0x52 },
82
81 {0x10, 0x55, 0xaa, 0x3e, 0x08, 0x09, 0x5c, -1, -1, /* Σ System */ 83 {0x10, 0x55, 0xaa, 0x3e, 0x08, 0x09, 0x5c, -1, -1, /* Σ System */
82 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 },
85
83 {0x40, 0xae, 0x51, 0xdc, 0x03, 0x02, 0x96, -1, 0xdd, /* 鉄人 */ 86 {0x40, 0xae, 0x51, 0xdc, 0x03, 0x02, 0x96, -1, 0xdd, /* 鉄人 */
84 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0xda, 0xdb } 87 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0xda, 0xdb }
85 }; 88 };
86 89
87 int tsc[] = {0x00, 0x04, 0x0c, 0x10, 0x01, 0x05, 0x0d, 0x11}; 90 int tsc[] = {0x00, 0x04, 0x0c, 0x10, 0x01, 0x05, 0x0d, 0x11};
93 "Invalid function code." 96 "Invalid function code."
94 }; 97 };
95 98
96 int cdcnv(int buf[], char *mak, char *cod) 99 int cdcnv(int buf[], char *mak, char *cod)
97 { 100 {
98 int maker, i, c, n, *q; 101 int maker, i, c, n, *q;
99 102 char *tmp = NULL;
100 if ((maker = (int)strchr(mks, *mak & 0xdf)) == NULL) 103
101 return -1; 104 #ifdef DEBUG
102 maker -= (int)mks; 105 fprintf(stderr, "mak=%s cod=%s\n", mak, cod);
103 106 #endif
104 q = buf; 107
105 108 tmp = strchr(mks, *mak & 0xdf);
106 *q++ = 0x80; /* wake-up code */ 109 if(!tmp)
107 *q++ = cvt[maker][0]; 110 return -1;
108 *q++ = cvt[maker][1]; 111 maker = (int)(tmp - mks);
109 *q++ = cvt[maker][2]; 112 #ifdef DEBUG
110 113 fprintf(stderr, "maker=%d\n", maker);
111 /* 統合機種等でのメーカー名指定 */ 114 #endif
112 if ((c = *++mak) != 0) { 115 q = buf;
113 if ((maker == M_A3)&&('0' <= c)&&(c <= '4')) 116
114 cvt[maker][K_SE] = 0x12 + (c - '0'); 117 *q++ = 0x80; /* wake-up code */
115 else if ((maker == M_AZ)&&('1' <= c)&&(c <= '4')) 118 *q++ = cvt[maker][0];
116 *q++ = 0x13 + (c - '1'); 119 *q++ = cvt[maker][1];
117 else if ((maker == M_AL)&&('0' <= c)&&(c <= '9')) { 120 *q++ = cvt[maker][2];
118 *q++ = cvt[maker][K_NM + (c - '0')]; 121
119 *q++ = 0x10; 122 /* 統合機種等でのメーカー名指定 */
123 if ((c = *++mak) != 0) {
124 if ((maker == M_A3)&&('0' <= c)&&(c <= '4'))
125 cvt[maker][K_SE] = 0x12 + (c - '0');
126 else if ((maker == M_AZ)&&('1' <= c)&&(c <= '4'))
127 *q++ = 0x13 + (c - '1');
128 else if ((maker == M_AL)&&('0' <= c)&&(c <= '9')) {
129 *q++ = cvt[maker][K_NM + (c - '0')];
130 *q++ = 0x10;
131 }
132 else if ((maker == M_TS)&&('1' <= c)&&(c <= '8'))
133 *q++ = tsc[c - '1'];
134 else if ((maker == M_TJ)&&('0' <= c)&&(c <= '9'))
135 *q++ = tjc[c - '1'];
136 else if ((maker == M_UK)&&('2' == c)) {
137 buf[1] = 0x70;
138 *q++ = 0xf0;
139 }
120 } 140 }
121 else if ((maker == M_TS)&&('1' <= c)&&(c <= '8')) 141 if (maker == M_BK)
122 *q++ = tsc[c - '1']; 142 *q++ = 0xf0;
123 else if ((maker == M_TJ)&&('0' <= c)&&(c <= '9')) 143
124 *q++ = tjc[c - '1']; 144 if (('0' <= *cod)&&(*cod <= '9')) {
125 else if ((maker == M_UK)&&('2' == c)) { 145 if (maker == M_DA)
126 buf[1] = 0x70; 146 *q++ = 0x08;
127 *q++ = 0xf0; 147 else if (maker == M_MA)
148 *q++ = 0x10; /* Req.1 */
149 else if (maker == M_SI) {
150 /* [1-9A-F] -> '01','02',...,'15' , NULL -> '00' */
151 if (*mak == 0) {
152 *q++ = cvt[maker][K_NM + 0];
153 *q++ = cvt[maker][K_NM + 0];
154 }
155 else {
156 if (mak[1] != 0)
157 *q++ = cvt[maker][K_NM + (*mak++ - '0')];
158 else
159 *q++ = cvt[maker][K_NM + ((*mak >= 'A')? 1: 0)];
160 *q++ = cvt[maker][K_NM + ((*mak % 0x41) & 0x0f)];
161 }
162 }
163
164 /* 曲コード変換 */
165 while((c = *cod++) != '\0') {
166 if (('0' <= c)&&(c <= '9'))
167 *q = cvt[maker][c - '0' + K_NM];
168 else if ((c == 'A')||(c == 'a'))
169 *q = cvt[maker][10 + K_NM];
170 else if ((c == 'B')||(c == 'b'))
171 *q = cvt[maker][11 + K_NM];
172 else if (c == '-') {
173 if (maker == M_TJ)
174 *q = cvt[maker][K_SE];
175 else
176 continue;
177 }
178 else
179 *q = -1;
180 if (*q++ == -1)
181 return -2;
182 }
183
184 /* 送信直前処理 */
185 switch(maker) {
186 case M_X2:
187 /* X2000: 曲コードの末尾 2 桁の直前にも SET を送信 */
188 q -= 2;
189 q[3] = cvt[maker][K_SE];
190 q[2] = q[1];
191 q[1] = q[0];
192 q[0] = cvt[maker][K_SE];
193 q += 4;
194 break;
195
196 case M_GI:
197 /* GIGA: 曲コードが 6 桁以下の場合は最後に'0'を埋める */
198 while(q < &buf[10])
199 *q++ = cvt[maker][K_NM];
200 break;
201
202 case M_PR:
203 /* Prologue21: */
204 for( i=0; i<3; i++ ) {
205 buf[10-i] = 0;
206 if (q > &buf[4])
207 buf[10-i] = *--q << 4;
208 if (q > &buf[4])
209 buf[10-i] |= *--q;
210 }
211 q = &buf[11];
212 *q++ = 0x33;
213 buf[4] = buf[8];
214 buf[5] = buf[9];
215 buf[6] = buf[10];
216 buf[7] = buf[11];
217 break; /* q=&buf[8] にしないとバグのような… */
218
219 case M_SI:
220 /* Σシステム: コード長 10 バイト(<Maker[2]>,<Code[7]>,<SET>)固定 */
221 case M_DA:
222 /* DAM: コード長 9 バイト(0x08,<Code[7]>,<SET>)固定 */
223 case M_BK:
224 /* B-kara: コード長 9 バイト(0xf0,<Code[7]>,<SET>)固定 */
225 n = (maker == M_SI)? 12: 11; /* 数字の最終桁を buf[n] とした値 */
226 for( i=0; i<7; i++ ) {
227 c = *(q-1);
228 if ((i == 1)&&((c == cvt[maker][K_NM+10])||(c == cvt[maker][K_NM+11])))
229 /* 曲コード中の'A','B'以降の桁数が1桁なら'0'を挿入 */
230 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 /* 曲コードの末尾 3 文字めが'A','B'でなければ'-'を設定 */
233 buf[n-i] = (maker == M_BK)? 0x3d: ((maker == M_SI)? 0x51: 0x3c);
234 else if (q > &buf[n-6])
235 buf[n-i] = *--q;
236 else
237 /* 桁数の足らない部分には'0'を設定 */
238 buf[n-i] = cvt[maker][K_NM + 0];
239 }
240 q = &buf[n+1];
241 default:
242 *q++ = cvt[maker][K_SE];
243 break;
244 }
128 } 245 }
129 } 246 /* 制御コードの処理 */
130 if (maker == M_BK) 247 else {
131 *q++ = 0xf0; 248 *q = -1;
132 249 if (!stricmp(cod, "SE"))
133 if (('0' <= *cod)&&(*cod <= '9')) { 250 *q = cvt[maker][K_SE];
134 if (maker == M_DA) 251 else if (!stricmp(cod, "KU"))
135 *q++ = 0x08; 252 *q = cvt[maker][K_KU];
136 else if (maker == M_MA) 253 else if (!stricmp(cod, "KD"))
137 *q++ = 0x10; /* Req.1 */ 254 *q = cvt[maker][K_KD];
138 else if (maker == M_SI) { 255 else if (!stricmp(cod, "SP"))
139 /* [1-9A-F] -> '01','02',...,'15' , NULL -> '00' */ 256 *q = cvt[maker][K_SP];
140 if (*mak == 0) { 257 else if (!stricmp(cod, "ST"))
141 *q++ = cvt[maker][K_NM + 0]; 258 *q = cvt[maker][K_ST];
142 *q++ = cvt[maker][K_NM + 0]; 259 else if (!stricmp(cod, "CL"))
143 } 260 *q = cvt[maker][K_CL];
144 else { 261 if (*q == -1)
145 if (mak[1] != 0) 262 return -3;
146 *q++ = cvt[maker][K_NM + (*mak++ - '0')]; 263 q++;
147 else
148 *q++ = cvt[maker][K_NM + ((*mak >= 'A')? 1: 0)];
149 *q++ = cvt[maker][K_NM + ((*mak % 0x41) & 0x0f)];
150 }
151 } 264 }
152 265
153 /* 曲コード変換 */ 266 if ((maker == M_BK)||((maker == M_UK)&&('2' == *mak)))
154 while((c = *cod++) != '\0') { 267 *q++ = 0xf7;
155 if (('0' <= c)&&(c <= '9')) 268
156 *q = cvt[maker][c - '0' + K_NM]; 269 buf[1] |= q-buf-2; /* 実送信バイト数(PIC 制御用)を埋め込み */
157 else if ((c == 'A')||(c == 'a')) 270 return q-buf;
158 *q = cvt[maker][10 + K_NM];
159 else if ((c == 'B')||(c == 'b'))
160 *q = cvt[maker][11 + K_NM];
161 else if (c == '-') {
162 if (maker == M_TJ)
163 *q = cvt[maker][K_SE];
164 else
165 continue;
166 }
167 else
168 *q = -1;
169 if (*q++ == -1)
170 return -2;
171 }
172
173 /* 送信直前処理 */
174 switch(maker) {
175 case M_X2:
176 /* X2000: 曲コードの末尾 2 桁の直前にも SET を送信 */
177 q -= 2;
178 q[3] = cvt[maker][K_SE];
179 q[2] = q[1];
180 q[1] = q[0];
181 q[0] = cvt[maker][K_SE];
182 q += 4;
183 break;
184
185 case M_GI:
186 /* GIGA: 曲コードが 6 桁以下の場合は最後に'0'を埋める */
187 while(q < &buf[10])
188 *q++ = cvt[maker][K_NM];
189 break;
190
191 case M_PR:
192 /* Prologue21: */
193 for( i=0; i<3; i++ ) {
194 buf[10-i] = 0;
195 if (q > &buf[4])
196 buf[10-i] = *--q << 4;
197 if (q > &buf[4])
198 buf[10-i] |= *--q;
199 }
200 q = &buf[11];
201 *q++ = 0x33;
202 buf[4] = buf[8];
203 buf[5] = buf[9];
204 buf[6] = buf[10];
205 buf[7] = buf[11];
206 break; /* q=&buf[8] にしないとバグのような… */
207
208 case M_SI:
209 /* Σシステム: コード長 10 バイト(<Maker[2]>,<Code[7]>,<SET>)固定 */
210 case M_DA:
211 /* DAM: コード長 9 バイト(0x08,<Code[7]>,<SET>)固定 */
212 case M_BK:
213 /* B-kara: コード長 9 バイト(0xf0,<Code[7]>,<SET>)固定 */
214 n = (maker == M_SI)? 12: 11; /* 数字の最終桁を buf[n] とした値 */
215 for( i=0; i<7; i++ ) {
216 c = *(q-1);
217 if ((i == 1)&&((c == cvt[maker][K_NM+10])||(c == cvt[maker][K_NM+11])))
218 /* 曲コード中の'A','B'以降の桁数が1桁なら'0'を挿入 */
219 buf[n-i] = cvt[maker][K_NM + 0];
220 else if ((i == 2)&&(c!=cvt[maker][K_NM+10])&&(c!=cvt[maker][K_NM+11]))
221 /* 曲コードの末尾 3 文字めが'A','B'でなければ'-'を設定 */
222 buf[n-i] = (maker == M_BK)? 0x3d: ((maker == M_SI)? 0x51: 0x3c);
223 else if (q > &buf[n-6])
224 buf[n-i] = *--q;
225 else
226 /* 桁数の足らない部分には'0'を設定 */
227 buf[n-i] = cvt[maker][K_NM + 0];
228 }
229 q = &buf[n+1];
230 default:
231 *q++ = cvt[maker][K_SE];
232 break;
233 }
234 }
235 /* 制御コードの処理 */
236 else {
237 *q = -1;
238 if (!stricmp(cod, "SE"))
239 *q = cvt[maker][K_SE];
240 else if (!stricmp(cod, "KU"))
241 *q = cvt[maker][K_KU];
242 else if (!stricmp(cod, "KD"))
243 *q = cvt[maker][K_KD];
244 else if (!stricmp(cod, "SP"))
245 *q = cvt[maker][K_SP];
246 else if (!stricmp(cod, "ST"))
247 *q = cvt[maker][K_ST];
248 else if (!stricmp(cod, "CL"))
249 *q = cvt[maker][K_CL];
250 if (*q == -1)
251 return -3;
252 q++;
253 }
254
255 if ((maker == M_BK)||((maker == M_UK)&&('2' == *mak)))
256 *q++ = 0xf7;
257
258 buf[1] |= q-buf-2; /* 実送信バイト数(PIC 制御用)を埋め込み */
259 return q-buf;
260 } 271 }