Mercurial > rcctl_linux
diff 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 |
line wrap: on
line diff
--- a/cdcnv.c Thu Dec 16 20:30:11 2010 +0900 +++ b/cdcnv.c Fri Dec 24 15:28:04 2010 +0900 @@ -11,11 +11,12 @@ ------------------------------------------------------*/ #include <string.h> +#include <stdio.h> #if defined(__FreeBSD__)||defined(linux) #define stricmp(s, c) strcasecmp(s, c) #endif -const char *mks = "XUGJHBPDSNKMALZTCI"; +const char mks[] = "XUGJHBPDSNKMALZTCI"; #define M_X2 0 /* X2000 */ #define M_UK 1 /* U-kara */ #define M_GI 2 /* GIGA */ @@ -78,8 +79,10 @@ 0x0d, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0e, 0x0f }, {0x30, 0x00, 0xff, 0x41, 0x08, 0x09, 0x4c, 0x45, 0x44, /* TOEI sys */ 0x13, 0x0f, 0x4f, 0x4e, 0x07, 0x47, 0x46, 0x03, 0x43, 0x42, 0x53, 0x52 }, + {0x10, 0x55, 0xaa, 0x3e, 0x08, 0x09, 0x5c, -1, -1, /* Σ System */ 0x13, 0x0f, 0x4f, 0x4e, 0x07, 0x47, 0x46, 0x03, 0x43, 0x42, 0x53, 0x52 }, + {0x40, 0xae, 0x51, 0xdc, 0x03, 0x02, 0x96, -1, 0xdd, /* 鉄人 */ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0xda, 0xdb } }; @@ -95,166 +98,174 @@ int cdcnv(int buf[], char *mak, char *cod) { - int maker, i, c, n, *q; + int maker, i, c, n, *q; + char *tmp = NULL; - if ((maker = (int)strchr(mks, *mak & 0xdf)) == NULL) - return -1; - maker -= (int)mks; +#ifdef DEBUG + fprintf(stderr, "mak=%s cod=%s\n", mak, cod); +#endif - q = buf; + tmp = strchr(mks, *mak & 0xdf); + if(!tmp) + return -1; + maker = (int)(tmp - mks); +#ifdef DEBUG + fprintf(stderr, "maker=%d\n", maker); +#endif + q = buf; - *q++ = 0x80; /* wake-up code */ - *q++ = cvt[maker][0]; - *q++ = cvt[maker][1]; - *q++ = cvt[maker][2]; + *q++ = 0x80; /* wake-up code */ + *q++ = cvt[maker][0]; + *q++ = cvt[maker][1]; + *q++ = cvt[maker][2]; - /* 統合機種等でのメーカー名指定 */ - if ((c = *++mak) != 0) { - if ((maker == M_A3)&&('0' <= c)&&(c <= '4')) - cvt[maker][K_SE] = 0x12 + (c - '0'); - else if ((maker == M_AZ)&&('1' <= c)&&(c <= '4')) - *q++ = 0x13 + (c - '1'); - else if ((maker == M_AL)&&('0' <= c)&&(c <= '9')) { - *q++ = cvt[maker][K_NM + (c - '0')]; - *q++ = 0x10; + /* 統合機種等でのメーカー名指定 */ + if ((c = *++mak) != 0) { + if ((maker == M_A3)&&('0' <= c)&&(c <= '4')) + cvt[maker][K_SE] = 0x12 + (c - '0'); + else if ((maker == M_AZ)&&('1' <= c)&&(c <= '4')) + *q++ = 0x13 + (c - '1'); + else if ((maker == M_AL)&&('0' <= c)&&(c <= '9')) { + *q++ = cvt[maker][K_NM + (c - '0')]; + *q++ = 0x10; + } + else if ((maker == M_TS)&&('1' <= c)&&(c <= '8')) + *q++ = tsc[c - '1']; + else if ((maker == M_TJ)&&('0' <= c)&&(c <= '9')) + *q++ = tjc[c - '1']; + else if ((maker == M_UK)&&('2' == c)) { + buf[1] = 0x70; + *q++ = 0xf0; + } } - else if ((maker == M_TS)&&('1' <= c)&&(c <= '8')) - *q++ = tsc[c - '1']; - else if ((maker == M_TJ)&&('0' <= c)&&(c <= '9')) - *q++ = tjc[c - '1']; - else if ((maker == M_UK)&&('2' == c)) { - buf[1] = 0x70; - *q++ = 0xf0; - } - } - if (maker == M_BK) - *q++ = 0xf0; + if (maker == M_BK) + *q++ = 0xf0; + + if (('0' <= *cod)&&(*cod <= '9')) { + if (maker == M_DA) + *q++ = 0x08; + else if (maker == M_MA) + *q++ = 0x10; /* Req.1 */ + else if (maker == M_SI) { + /* [1-9A-F] -> '01','02',...,'15' , NULL -> '00' */ + if (*mak == 0) { + *q++ = cvt[maker][K_NM + 0]; + *q++ = cvt[maker][K_NM + 0]; + } + else { + if (mak[1] != 0) + *q++ = cvt[maker][K_NM + (*mak++ - '0')]; + else + *q++ = cvt[maker][K_NM + ((*mak >= 'A')? 1: 0)]; + *q++ = cvt[maker][K_NM + ((*mak % 0x41) & 0x0f)]; + } + } - if (('0' <= *cod)&&(*cod <= '9')) { - if (maker == M_DA) - *q++ = 0x08; - else if (maker == M_MA) - *q++ = 0x10; /* Req.1 */ - else if (maker == M_SI) { - /* [1-9A-F] -> '01','02',...,'15' , NULL -> '00' */ - if (*mak == 0) { - *q++ = cvt[maker][K_NM + 0]; - *q++ = cvt[maker][K_NM + 0]; - } - else { - if (mak[1] != 0) - *q++ = cvt[maker][K_NM + (*mak++ - '0')]; - else - *q++ = cvt[maker][K_NM + ((*mak >= 'A')? 1: 0)]; - *q++ = cvt[maker][K_NM + ((*mak % 0x41) & 0x0f)]; - } + /* 曲コード変換 */ + while((c = *cod++) != '\0') { + if (('0' <= c)&&(c <= '9')) + *q = cvt[maker][c - '0' + K_NM]; + else if ((c == 'A')||(c == 'a')) + *q = cvt[maker][10 + K_NM]; + else if ((c == 'B')||(c == 'b')) + *q = cvt[maker][11 + K_NM]; + else if (c == '-') { + if (maker == M_TJ) + *q = cvt[maker][K_SE]; + else + continue; + } + else + *q = -1; + if (*q++ == -1) + return -2; + } + + /* 送信直前処理 */ + switch(maker) { + case M_X2: + /* X2000: 曲コードの末尾 2 桁の直前にも SET を送信 */ + q -= 2; + q[3] = cvt[maker][K_SE]; + q[2] = q[1]; + q[1] = q[0]; + q[0] = cvt[maker][K_SE]; + q += 4; + break; + + case M_GI: + /* GIGA: 曲コードが 6 桁以下の場合は最後に'0'を埋める */ + while(q < &buf[10]) + *q++ = cvt[maker][K_NM]; + break; + + case M_PR: + /* Prologue21: */ + for( i=0; i<3; i++ ) { + buf[10-i] = 0; + if (q > &buf[4]) + buf[10-i] = *--q << 4; + if (q > &buf[4]) + buf[10-i] |= *--q; + } + q = &buf[11]; + *q++ = 0x33; + buf[4] = buf[8]; + buf[5] = buf[9]; + buf[6] = buf[10]; + buf[7] = buf[11]; + break; /* q=&buf[8] にしないとバグのような… */ + + case M_SI: + /* Σシステム: コード長 10 バイト(<Maker[2]>,<Code[7]>,<SET>)固定 */ + case M_DA: + /* DAM: コード長 9 バイト(0x08,<Code[7]>,<SET>)固定 */ + case M_BK: + /* B-kara: コード長 9 バイト(0xf0,<Code[7]>,<SET>)固定 */ + n = (maker == M_SI)? 12: 11; /* 数字の最終桁を buf[n] とした値 */ + for( i=0; i<7; i++ ) { + c = *(q-1); + if ((i == 1)&&((c == cvt[maker][K_NM+10])||(c == cvt[maker][K_NM+11]))) + /* 曲コード中の'A','B'以降の桁数が1桁なら'0'を挿入 */ + buf[n-i] = cvt[maker][K_NM + 0]; + else if ((i == 2)&&(c!=cvt[maker][K_NM+10])&&(c!=cvt[maker][K_NM+11])) + /* 曲コードの末尾 3 文字めが'A','B'でなければ'-'を設定 */ + buf[n-i] = (maker == M_BK)? 0x3d: ((maker == M_SI)? 0x51: 0x3c); + else if (q > &buf[n-6]) + buf[n-i] = *--q; + else + /* 桁数の足らない部分には'0'を設定 */ + buf[n-i] = cvt[maker][K_NM + 0]; + } + q = &buf[n+1]; + default: + *q++ = cvt[maker][K_SE]; + break; + } } - - /* 曲コード変換 */ - while((c = *cod++) != '\0') { - if (('0' <= c)&&(c <= '9')) - *q = cvt[maker][c - '0' + K_NM]; - else if ((c == 'A')||(c == 'a')) - *q = cvt[maker][10 + K_NM]; - else if ((c == 'B')||(c == 'b')) - *q = cvt[maker][11 + K_NM]; - else if (c == '-') { - if (maker == M_TJ) - *q = cvt[maker][K_SE]; - else - continue; - } - else + /* 制御コードの処理 */ + else { *q = -1; - if (*q++ == -1) - return -2; + if (!stricmp(cod, "SE")) + *q = cvt[maker][K_SE]; + else if (!stricmp(cod, "KU")) + *q = cvt[maker][K_KU]; + else if (!stricmp(cod, "KD")) + *q = cvt[maker][K_KD]; + else if (!stricmp(cod, "SP")) + *q = cvt[maker][K_SP]; + else if (!stricmp(cod, "ST")) + *q = cvt[maker][K_ST]; + else if (!stricmp(cod, "CL")) + *q = cvt[maker][K_CL]; + if (*q == -1) + return -3; + q++; } - /* 送信直前処理 */ - switch(maker) { - case M_X2: - /* X2000: 曲コードの末尾 2 桁の直前にも SET を送信 */ - q -= 2; - q[3] = cvt[maker][K_SE]; - q[2] = q[1]; - q[1] = q[0]; - q[0] = cvt[maker][K_SE]; - q += 4; - break; - - case M_GI: - /* GIGA: 曲コードが 6 桁以下の場合は最後に'0'を埋める */ - while(q < &buf[10]) - *q++ = cvt[maker][K_NM]; - break; - - case M_PR: - /* Prologue21: */ - for( i=0; i<3; i++ ) { - buf[10-i] = 0; - if (q > &buf[4]) - buf[10-i] = *--q << 4; - if (q > &buf[4]) - buf[10-i] |= *--q; - } - q = &buf[11]; - *q++ = 0x33; - buf[4] = buf[8]; - buf[5] = buf[9]; - buf[6] = buf[10]; - buf[7] = buf[11]; - break; /* q=&buf[8] にしないとバグのような… */ + if ((maker == M_BK)||((maker == M_UK)&&('2' == *mak))) + *q++ = 0xf7; - case M_SI: - /* Σシステム: コード長 10 バイト(<Maker[2]>,<Code[7]>,<SET>)固定 */ - case M_DA: - /* DAM: コード長 9 バイト(0x08,<Code[7]>,<SET>)固定 */ - case M_BK: - /* B-kara: コード長 9 バイト(0xf0,<Code[7]>,<SET>)固定 */ - n = (maker == M_SI)? 12: 11; /* 数字の最終桁を buf[n] とした値 */ - for( i=0; i<7; i++ ) { - c = *(q-1); - if ((i == 1)&&((c == cvt[maker][K_NM+10])||(c == cvt[maker][K_NM+11]))) - /* 曲コード中の'A','B'以降の桁数が1桁なら'0'を挿入 */ - buf[n-i] = cvt[maker][K_NM + 0]; - else if ((i == 2)&&(c!=cvt[maker][K_NM+10])&&(c!=cvt[maker][K_NM+11])) - /* 曲コードの末尾 3 文字めが'A','B'でなければ'-'を設定 */ - buf[n-i] = (maker == M_BK)? 0x3d: ((maker == M_SI)? 0x51: 0x3c); - else if (q > &buf[n-6]) - buf[n-i] = *--q; - else - /* 桁数の足らない部分には'0'を設定 */ - buf[n-i] = cvt[maker][K_NM + 0]; - } - q = &buf[n+1]; - default: - *q++ = cvt[maker][K_SE]; - break; - } - } - /* 制御コードの処理 */ - else { - *q = -1; - if (!stricmp(cod, "SE")) - *q = cvt[maker][K_SE]; - else if (!stricmp(cod, "KU")) - *q = cvt[maker][K_KU]; - else if (!stricmp(cod, "KD")) - *q = cvt[maker][K_KD]; - else if (!stricmp(cod, "SP")) - *q = cvt[maker][K_SP]; - else if (!stricmp(cod, "ST")) - *q = cvt[maker][K_ST]; - else if (!stricmp(cod, "CL")) - *q = cvt[maker][K_CL]; - if (*q == -1) - return -3; - q++; - } - - if ((maker == M_BK)||((maker == M_UK)&&('2' == *mak))) - *q++ = 0xf7; - - buf[1] |= q-buf-2; /* 実送信バイト数(PIC 制御用)を埋め込み */ - return q-buf; + buf[1] |= q-buf-2; /* 実送信バイト数(PIC 制御用)を埋め込み */ + return q-buf; }
