|
|
| version 1.9, 2005/02/07 14:46:10 | version 1.11, 2007/10/28 16:01:34 |
|---|---|
| Line 56 typedef struct { | Line 56 typedef struct { |
| UINT8 keymax; | UINT8 keymax; |
| UINT8 fmmax; | UINT8 fmmax; |
| UINT8 psgmax; | UINT8 psgmax; |
| UINT8 fmpos[KEYDISP_FMMAX]; | UINT8 fmpos[KEYDISP_FMCHMAX]; |
| UINT8 psgpos[KEYDISP_PSGMAX]; | UINT8 psgpos[KEYDISP_PSGMAX]; |
| UINT fmreg[KEYDISP_FMMAX]; | const UINT8 *pfmreg[KEYDISP_FMCHMAX]; |
| KDDELAY delay; | KDDELAY delay; |
| KDCHANNEL ch[KEYDISP_CHMAX]; | KDCHANNEL ch[KEYDISP_CHMAX]; |
| KDFMCTRL fmctl[KEYDISP_FMMAX]; | KDFMCTRL fmctl[KEYDISP_FMCHMAX]; |
| KDPSGCTRL psgctl[KEYDISP_PSGMAX]; | KDPSGCTRL psgctl[KEYDISP_PSGMAX]; |
| UINT8 pal8[KEYDISP_PALS]; | UINT8 pal8[KEYDISP_PALS]; |
| UINT16 pal16[KEYDISP_LEVEL*2]; | UINT16 pal16[KEYDISP_LEVEL*2]; |
| Line 295 static void fmkeyoff(UINT8 ch, KDFMCTRL | Line 295 static void fmkeyoff(UINT8 ch, KDFMCTRL |
| static void fmkeyon(UINT8 ch, KDFMCTRL *k) { | static void fmkeyon(UINT8 ch, KDFMCTRL *k) { |
| UINT reg; | const UINT8 *pReg; |
| fmkeyoff(ch, k); | fmkeyoff(ch, k); |
| reg = keydisp.fmreg[ch] + 0xa0; | pReg = keydisp.pfmreg[ch]; |
| k->fnum[0] = ((opn.reg[reg + 4] & 0x3f) << 8) + opn.reg[reg]; | if (pReg) |
| k->lastnote[0] = getfmnote(k->fnum[0]); | { |
| delaysetevent(keydisp.fmpos[ch], (UINT8)(k->lastnote[0] | 0x80)); | pReg = pReg + 0xa0; |
| k->fnum[0] = ((pReg[4] & 0x3f) << 8) + pReg[0]; | |
| k->lastnote[0] = getfmnote(k->fnum[0]); | |
| delaysetevent(keydisp.fmpos[ch], (UINT8)(k->lastnote[0] | 0x80)); | |
| } | |
| } | } |
| static void fmkeyreset(void) { | static void fmkeyreset(void) { |
| Line 335 static void fmkeysync(void) { | Line 339 static void fmkeysync(void) { |
| UINT8 ch; | UINT8 ch; |
| KDFMCTRL *k; | KDFMCTRL *k; |
| UINT16 reg; | const UINT8 *pReg; |
| UINT16 fnum; | UINT16 fnum; |
| for (ch=0, k=keydisp.fmctl; ch<keydisp.fmmax; ch++, k++) { | for (ch=0, k=keydisp.fmctl; ch<keydisp.fmmax; ch++, k++) { |
| if (k->flag) { | if (k->flag) { |
| reg = keydisp.fmreg[ch] + 0xa0; | pReg = keydisp.pfmreg[ch]; |
| fnum = ((opn.reg[reg + 4] & 0x3f) << 8) + opn.reg[reg]; | if (pReg) |
| if (k->fnum[0] != fnum) { | { |
| UINT8 n; | pReg = pReg + 0xa0; |
| k->fnum[0] = fnum; | fnum = ((pReg[4] & 0x3f) << 8) + pReg[0]; |
| n = getfmnote(fnum); | if (k->fnum[0] != fnum) { |
| if (k->lastnote[0] != n) { | UINT8 n; |
| fmkeyoff(ch, k); | k->fnum[0] = fnum; |
| } | n = getfmnote(fnum); |
| k->lastnote[0] = n; | if (k->lastnote[0] != n) { |
| delaysetevent(keydisp.fmpos[ch], | fmkeyoff(ch, k); |
| } | |
| k->lastnote[0] = n; | |
| delaysetevent(keydisp.fmpos[ch], | |
| (UINT8)(k->lastnote[0] | 0x80)); | (UINT8)(k->lastnote[0] | 0x80)); |
| } | |
| } | } |
| } | } |
| } | } |
| Line 517 static void setfmhdl(UINT8 items, UINT b | Line 525 static void setfmhdl(UINT8 items, UINT b |
| while(items--) { | while(items--) { |
| if ((keydisp.keymax < KEYDISP_CHMAX) && | if ((keydisp.keymax < KEYDISP_CHMAX) && |
| (keydisp.fmmax < KEYDISP_FMMAX)) { | (keydisp.fmmax < KEYDISP_FMCHMAX)) { |
| keydisp.fmpos[keydisp.fmmax] = keydisp.keymax++; | keydisp.fmpos[keydisp.fmmax] = keydisp.keymax++; |
| keydisp.fmreg[keydisp.fmmax] = base; | keydisp.pfmreg[keydisp.fmmax] = opn.reg + base; |
| keydisp.fmmax++; | keydisp.fmmax++; |
| base++; | base++; |
| if ((base & 3) == 3) { | if ((base & 3) == 3) { |
| Line 529 static void setfmhdl(UINT8 items, UINT b | Line 537 static void setfmhdl(UINT8 items, UINT b |
| } | } |
| } | } |
| static void setfmhdlex(const OPN_T *pOpn, UINT nItems, UINT nBase) { | |
| while(nItems--) { | |
| if ((keydisp.keymax < KEYDISP_CHMAX) && | |
| (keydisp.fmmax < KEYDISP_FMCHMAX)) { | |
| keydisp.fmpos[keydisp.fmmax] = keydisp.keymax++; | |
| keydisp.pfmreg[keydisp.fmmax] = pOpn->reg + nBase; | |
| keydisp.fmmax++; | |
| nBase++; | |
| if ((nBase & 3) == 3) { | |
| nBase += 0x100 - 3; | |
| } | |
| } | |
| } | |
| } | |
| static void setpsghdl(UINT8 items) { | static void setpsghdl(UINT8 items) { |
| while(items--) { | while(items--) { |
| Line 546 void keydisp_setfmboard(UINT b) { | Line 570 void keydisp_setfmboard(UINT b) { |
| keydisp.fmmax = 0; | keydisp.fmmax = 0; |
| keydisp.psgmax = 0; | keydisp.psgmax = 0; |
| #if defined(SUPPORT_PX) | |
| if (b == 0x30) | |
| { | |
| setfmhdlex(&opn, 12, 0); | |
| setfmhdlex(&opn2, 12, 0); | |
| setpsghdl(2); | |
| b = 0; | |
| } | |
| if (b == 0x50) | |
| { | |
| setfmhdlex(&opn, 12, 0); | |
| setfmhdlex(&opn2, 12, 0); | |
| setfmhdlex(&opn3, 6, 0); | |
| setpsghdl(3); | |
| b = 0; | |
| } | |
| #endif // defined(SUPPORT_PX) | |
| if (b & 0x02) { | if (b & 0x02) { |
| if (!(b & 0x04)) { | if (!(b & 0x04)) { |
| setfmhdl(3, 0); | setfmhdl(3, 0); |
| Line 606 void keydisp_midi(const UINT8 *cmd) { | Line 649 void keydisp_midi(const UINT8 *cmd) { |
| break; | break; |
| case 0xb0: | case 0xb0: |
| if ((cmd[1] == 0x7b) || (cmd[1] == 0x78)) { | if ((cmd[1] == 0x78) || (cmd[1] == 0x79) || (cmd[1] == 0x7b)) { |
| chkeyoff(cmd[0] & 0x0f); | chkeyoff(cmd[0] & 0x0f); |
| } | } |
| break; | break; |