Mercurial > rcctl_linux
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 } |
