|
|
| version 1.7, 2005/02/04 05:32:23 | version 1.11, 2007/11/03 00:00:19 |
|---|---|
| Line 30 enum { | Line 30 enum { |
| enum { | enum { |
| MIDIE_STEP = 0x01, | MIDIE_STEP = 0x01, |
| MIDIE_EVENT = 0x02, | MIDIE_EVENT = 0x02, |
| MIDIE_DATA = 0x04, | MIDIE_DATA = 0x04 |
| }; | }; |
| enum { | enum { |
| Line 123 static void setdefaultcondition(void) { | Line 123 static void setdefaultcondition(void) { |
| mpu98.recvevent = 0; | mpu98.recvevent = 0; |
| mpu98.remainstep = 0; | mpu98.remainstep = 0; |
| mpu98.intphase = 0; | |
| mpu98.intreq = 0; | mpu98.intreq = 0; |
| ZeroMemory(&mpu98.cmd, sizeof(mpu98.cmd)); | ZeroMemory(&mpu98.cmd, sizeof(mpu98.cmd)); |
| Line 160 static void setrecvdata(REG8 data) { | Line 161 static void setrecvdata(REG8 data) { |
| static void sendmpushortmsg(const UINT8 *dat, UINT count) { | static void sendmpushortmsg(const UINT8 *dat, UINT count) { |
| UINT i; | UINT i; |
| COMMNG cm; | |
| #if 0 | #if 0 |
| if (!(mpu98.flag1 & MPUFLAG1_BENDERTOHOST)) { | if (!(mpu98.flag1 & MPUFLAG1_BENDERTOHOST)) { |
| Line 177 static void sendmpushortmsg(const UINT8 | Line 179 static void sendmpushortmsg(const UINT8 |
| } | } |
| } | } |
| #endif | #endif |
| cm = cm_mpu98; | |
| for (i=0; i<count; i++) { | for (i=0; i<count; i++) { |
| cm_mpu98->write(cm_mpu98, dat[i]); | cm->write(cm, dat[i]); |
| } | } |
| } | } |
| static void sendmpulongmsg(const UINT8 *dat, UINT count) { | static void sendmpulongmsg(const UINT8 *dat, UINT count) { |
| UINT i; | UINT i; |
| COMMNG cm; | |
| cm = cm_mpu98; | |
| for (i=0; i<count; i++) { | for (i=0; i<count; i++) { |
| cm_mpu98->write(cm_mpu98, dat[i]); | cm->write(cm, dat[i]); |
| } | |
| } | |
| static void sendmpureset(void) { | |
| UINT i; | |
| UINT8 sMessage[3]; | |
| for (i=0; i<0x10; i++) { | |
| sMessage[0] = (UINT8)(0xb0 + i); | |
| sMessage[1] = 0x7b; | |
| sMessage[2] = 0x00; | |
| sendmpushortmsg(sMessage, 3); | |
| } | } |
| } | } |
| static void mpu98ii_int(void) { | static void mpu98ii_int(void) { |
| TRACEOUT(("int!")); | |
| pic_setirq(mpu98.irqnum); | pic_setirq(mpu98.irqnum); |
| } | } |
| Line 221 static BOOL tr_nextsearch(void) { | Line 240 static BOOL tr_nextsearch(void) { |
| REG8 bit; | REG8 bit; |
| tr_nextsearch_more: | tr_nextsearch_more: |
| if (mpu98.intreq == 9) { | if (mpu98.intphase == 1) { |
| if (mpu98.flag1 & MPUFLAG1_CONDUCTOR) { | if (mpu98.flag1 & MPUFLAG1_CONDUCTOR) { |
| if (!mpu98.cond.step) { | if (!mpu98.cond.step) { |
| setrecvdata(MPUMSG_REQCOND); | mpu98.intreq = MPUMSG_REQCOND; |
| mpu98ii_int(); | |
| mpu98.cond.phase |= MPUCMDP_STEP | MPUCMDP_CMD; | mpu98.cond.phase |= MPUCMDP_STEP | MPUCMDP_CMD; |
| mpu98ii_int(); | |
| return(TRUE); | return(TRUE); |
| } | } |
| } | } |
| mpu98.intreq = 7; | mpu98.intphase = 2; |
| } | } |
| bit = 1 << mpu98.intreq; | if (mpu98.intphase) { |
| for (; bit; bit>>=1) { | bit = 1 << (mpu98.intphase - 2); |
| if (mpu98.acttr & bit) { | do { |
| MPUTR *tr; | if (mpu98.acttr & bit) { |
| tr = mpu98.tr + mpu98.intreq; | MPUTR *tr; |
| if (!tr->step) { | tr = mpu98.tr + (mpu98.intphase - 2); |
| if ((tr->datas) && (tr->remain == 0)) { | if (!tr->step) { |
| if (cm_mpu98 == NULL) { | if ((tr->datas) && (tr->remain == 0)) { |
| cm_mpu98 = commng_create(COMCREATE_MPU98II); | if (cm_mpu98 == NULL) { |
| } | cm_mpu98 = commng_create(COMCREATE_MPU98II); |
| if (tr->data[0] == MIDI_STOP) { | } |
| if (tr->data[0] == MIDI_STOP) { | |
| tr->datas = 0; | |
| cm_mpu98->write(cm_mpu98, MIDI_STOP); | |
| setrecvdata(MIDI_STOP); | |
| mpu98ii_int(); | |
| return(TRUE); | |
| } | |
| for (i=0; i<tr->datas; i++) { | |
| cm_mpu98->write(cm_mpu98, tr->data[i]); | |
| } | |
| tr->datas = 0; | tr->datas = 0; |
| cm_mpu98->write(cm_mpu98, MIDI_STOP); | |
| setrecvdata(MIDI_STOP); | |
| mpu98ii_int(); | |
| return(TRUE); | |
| } | |
| for (i=0; i<tr->datas; i++) { | |
| cm_mpu98->write(cm_mpu98, tr->data[i]); | |
| } | } |
| tr->datas = 0; | mpu98.intreq = 0xf0 + (mpu98.intphase - 2); |
| mpu98.recvevent |= MIDIE_STEP; | |
| mpu98ii_int(); | |
| return(TRUE); | |
| } | } |
| setrecvdata((REG8)(0xf0 + mpu98.intreq)); | |
| mpu98ii_int(); | |
| mpu98.recvevent |= MIDIE_STEP; | |
| return(TRUE); | |
| } | } |
| } | bit <<= 1; |
| mpu98.intreq--; | mpu98.intphase++; |
| } while(mpu98.intphase < 10); | |
| mpu98.intphase = 0; | |
| } | } |
| mpu98.remainstep--; | mpu98.remainstep--; |
| if (mpu98.remainstep) { | if (mpu98.remainstep) { |
| tr_step(); | tr_step(); |
| mpu98.intreq = 9; | mpu98.intphase = 1; |
| goto tr_nextsearch_more; | goto tr_nextsearch_more; |
| } | } |
| return(FALSE); | return(FALSE); |
| Line 289 void midiint(NEVENTITEM item) { | Line 312 void midiint(NEVENTITEM item) { |
| if (mpu98.flag1 & MPUFLAG1_PLAY) { | if (mpu98.flag1 & MPUFLAG1_PLAY) { |
| if (!mpu98.remainstep++) { | if (!mpu98.remainstep++) { |
| tr_step(); | tr_step(); |
| mpu98.intreq = 9; | mpu98.intphase = 1; |
| tr_nextsearch(); | tr_nextsearch(); |
| } | } |
| } | } |
| Line 325 static REG8 mpucmd_xx(REG8 cmd) { | Line 348 static REG8 mpucmd_xx(REG8 cmd) { |
| static REG8 mpucmd_md(REG8 cmd) { // 00-2F: Mode | static REG8 mpucmd_md(REG8 cmd) { // 00-2F: Mode |
| TRACEOUT(("mpucmd_md %.2x", cmd)); | |
| #if 0 | #if 0 |
| switch((cmd >> 0) & 3) { | switch((cmd >> 0) & 3) { |
| case 1: // MIDI Stop | case 1: // MIDI Stop |
| Line 337 static REG8 mpucmd_md(REG8 cmd) { // 0 | Line 361 static REG8 mpucmd_md(REG8 cmd) { // 0 |
| case 1: // Stop Play | case 1: // Stop Play |
| mpu98.flag1 &= ~MPUFLAG1_PLAY; | mpu98.flag1 &= ~MPUFLAG1_PLAY; |
| mpu98.recvevent = 0; | mpu98.recvevent = 0; |
| mpu98.intphase = 0; | |
| mpu98.intreq = 0; | mpu98.intreq = 0; |
| ZeroMemory(mpu98.tr, sizeof(mpu98.tr)); | ZeroMemory(mpu98.tr, sizeof(mpu98.tr)); |
| ZeroMemory(&mpu98.cond, sizeof(mpu98.cond)); | ZeroMemory(&mpu98.cond, sizeof(mpu98.cond)); |
| Line 367 static REG8 mpucmd_md(REG8 cmd) { // 0 | Line 392 static REG8 mpucmd_md(REG8 cmd) { // 0 |
| static REG8 mpucmd_3f(REG8 cmd) { // 3F: UART | static REG8 mpucmd_3f(REG8 cmd) { // 3F: UART |
| mpu98.mode = 1; | mpu98.mode = 1; |
| cm_mpu98->msg(cm_mpu98, COMMSG_MIDIRESET, 0); | sendmpureset(); |
| (void)cmd; | (void)cmd; |
| return(MPUCMDP_IDLE); | return(MPUCMDP_IDLE); |
| } | } |
| Line 522 static REG8 mpucmd_fo(REG8 cmd) { // E | Line 547 static REG8 mpucmd_fo(REG8 cmd) { // E |
| static REG8 mpucmd_ff(REG8 cmd) { // FF: Reset | static REG8 mpucmd_ff(REG8 cmd) { // FF: Reset |
| cm_mpu98->msg(cm_mpu98, COMMSG_MIDIRESET, 0); | sendmpureset(); |
| nevent_reset(NEVENT_MIDIINT); | nevent_reset(NEVENT_MIDIINT); |
| setdefaultcondition(); | setdefaultcondition(); |
| (void)cmd; | (void)cmd; |
| Line 771 static BRESULT sendmpucmd(MPUCMDS *cmd, | Line 796 static BRESULT sendmpucmd(MPUCMDS *cmd, |
| static BRESULT sendmpucond(MPUCMDS *cmd, REG8 data) { | static BRESULT sendmpucond(MPUCMDS *cmd, REG8 data) { |
| if (cmd->phase & (MPUCMDP_SHORT | MPUCMDP_LONG)) { | if (cmd->phase & (MPUCMDP_SHORT | MPUCMDP_LONG)) { |
| // if (mpu98.intreq == 0xf9) { | |
| // mpu98.intreq = 0; | |
| // } | |
| sendmpumsg(cmd, data); | sendmpumsg(cmd, data); |
| return(SUCCESS); | return(SUCCESS); |
| } | } |
| Line 796 static BRESULT sendmpucond(MPUCMDS *cmd, | Line 824 static BRESULT sendmpucond(MPUCMDS *cmd, |
| reqmpucmdgroupd(data); | reqmpucmdgroupd(data); |
| } | } |
| cmd->phase = phase; | cmd->phase = phase; |
| if (!(phase & MPUCMDP_FOLLOWBYTE)) { | if (phase & MPUCMDP_FOLLOWBYTE) { |
| tr_nextsearch(); | return(SUCCESS); |
| } | } |
| } | } |
| else { | else { |
| Line 807 static BRESULT sendmpucond(MPUCMDS *cmd, | Line 835 static BRESULT sendmpucond(MPUCMDS *cmd, |
| setrecvdata(MIDI_STOP); | setrecvdata(MIDI_STOP); |
| mpu98ii_int(); | mpu98ii_int(); |
| } | } |
| tr_nextsearch(); | |
| } | } |
| return(SUCCESS); | |
| } | } |
| else if (cmd->phase & MPUCMDP_FOLLOWBYTE) { | else if (cmd->phase & MPUCMDP_FOLLOWBYTE) { |
| cmd->phase &= ~MPUCMDP_FOLLOWBYTE; | cmd->phase &= ~MPUCMDP_FOLLOWBYTE; |
| setmpucmdgroupe(cmd->cmd, data); | setmpucmdgroupe(cmd->cmd, data); |
| tr_nextsearch(); | |
| return(SUCCESS); | |
| } | } |
| else { | else { |
| cmd->phase = 0; | cmd->phase = 0; |
| return(FAILURE); | return(FAILURE); |
| } | } |
| tr_nextsearch(); | |
| return(SUCCESS); | |
| } | } |
| static void sendmpudata(REG8 data) { | static void sendmpudata(REG8 data) { |
| Line 833 static void sendmpudata(REG8 data) { | Line 860 static void sendmpudata(REG8 data) { |
| if (mpu98.recvevent & MIDIE_STEP) { | if (mpu98.recvevent & MIDIE_STEP) { |
| MPUTR *tr; | MPUTR *tr; |
| mpu98.recvevent ^= MIDIE_STEP; | mpu98.recvevent ^= MIDIE_STEP; |
| tr = mpu98.tr + mpu98.intreq; | tr = mpu98.tr + (mpu98.intphase - 2); |
| tr->datas = 0; | tr->datas = 0; |
| if (data < 0xf0) { | if (data < 0xf0) { |
| mpu98.recvevent ^= MIDIE_EVENT; | mpu98.recvevent ^= MIDIE_EVENT; |
| Line 851 static void sendmpudata(REG8 data) { | Line 878 static void sendmpudata(REG8 data) { |
| MPUTR *tr; | MPUTR *tr; |
| mpu98.recvevent ^= MIDIE_EVENT; | mpu98.recvevent ^= MIDIE_EVENT; |
| mpu98.recvevent |= MIDIE_DATA; | mpu98.recvevent |= MIDIE_DATA; |
| tr = mpu98.tr + mpu98.intreq; | tr = mpu98.tr + (mpu98.intphase - 2); |
| switch(data & 0xf0) { | switch(data & 0xf0) { |
| case 0xc0: | case 0xc0: |
| case 0xd0: | case 0xd0: |
| Line 884 static void sendmpudata(REG8 data) { | Line 911 static void sendmpudata(REG8 data) { |
| } | } |
| if (mpu98.recvevent & MIDIE_DATA) { | if (mpu98.recvevent & MIDIE_DATA) { |
| MPUTR *tr; | MPUTR *tr; |
| tr = mpu98.tr + mpu98.intreq; | tr = mpu98.tr + (mpu98.intphase - 2); |
| if (tr->remain) { | if (tr->remain) { |
| tr->data[tr->datas] = data; | tr->data[tr->datas] = data; |
| tr->datas++; | tr->datas++; |
| Line 912 static void IOOUTCALL mpu98ii_o0(UINT po | Line 939 static void IOOUTCALL mpu98ii_o0(UINT po |
| UINT sent; | UINT sent; |
| TRACEOUT(("mpu98ii out %.4x %.2x", port, dat)); | |
| if (cm_mpu98 == NULL) { | if (cm_mpu98 == NULL) { |
| cm_mpu98 = commng_create(COMCREATE_MPU98II); | cm_mpu98 = commng_create(COMCREATE_MPU98II); |
| } | } |
| Line 933 static void IOOUTCALL mpu98ii_o0(UINT po | Line 961 static void IOOUTCALL mpu98ii_o0(UINT po |
| static void IOOUTCALL mpu98ii_o2(UINT port, REG8 dat) { | static void IOOUTCALL mpu98ii_o2(UINT port, REG8 dat) { |
| TRACEOUT(("mpu98ii out %.4x %.2x", port, dat)); | |
| if (cm_mpu98 == NULL) { | if (cm_mpu98 == NULL) { |
| cm_mpu98 = commng_create(COMCREATE_MPU98II); | cm_mpu98 = commng_create(COMCREATE_MPU98II); |
| } | } |
| Line 969 static REG8 IOINPCALL mpu98ii_i0(UINT po | Line 998 static REG8 IOINPCALL mpu98ii_i0(UINT po |
| if (cm_mpu98->connect != COMCONNECT_OFF) { | if (cm_mpu98->connect != COMCONNECT_OFF) { |
| if (mpu98.r.cnt) { | if (mpu98.r.cnt) { |
| mpu98.r.cnt--; | mpu98.r.cnt--; |
| #if 0 | |
| if (mpu98.r.cnt) { | if (mpu98.r.cnt) { |
| mpu98ii_int(); | mpu98ii_int(); |
| } | } |
| else { | else { |
| pic_resetirq(mpu98.irqnum); | pic_resetirq(mpu98.irqnum); |
| } | } |
| #endif | |
| mpu98.data = mpu98.r.buf[mpu98.r.pos]; | mpu98.data = mpu98.r.buf[mpu98.r.pos]; |
| mpu98.r.pos = (mpu98.r.pos + 1) & (MPU98_RECVBUFS - 1); | mpu98.r.pos = (mpu98.r.pos + 1) & (MPU98_RECVBUFS - 1); |
| } | } |
| else if (mpu98.intreq) { | |
| mpu98.data = mpu98.intreq; | |
| mpu98.intreq = 0; | |
| } | |
| if ((mpu98.r.cnt) || (mpu98.intreq)) { | |
| mpu98ii_int(); | |
| } | |
| else { | |
| pic_resetirq(mpu98.irqnum); | |
| } | |
| // TRACEOUT(("recv data->%.2x", mpu98.data)); | // TRACEOUT(("recv data->%.2x", mpu98.data)); |
| TRACEOUT(("mpu98ii inp %.4x %.2x", port, mpu98.data)); | |
| return(mpu98.data); | return(mpu98.data); |
| } | } |
| (void)port; | (void)port; |
| Line 994 static REG8 IOINPCALL mpu98ii_i2(UINT po | Line 1037 static REG8 IOINPCALL mpu98ii_i2(UINT po |
| } | } |
| if (cm_mpu98->connect != COMCONNECT_OFF) { | if (cm_mpu98->connect != COMCONNECT_OFF) { |
| ret = mpu98.status; | ret = mpu98.status; |
| if (!mpu98.r.cnt) { | if ((mpu98.r.cnt == 0) && (mpu98.intreq == 0)) { |
| ret |= MIDIIN_AVAIL; | ret |= MIDIIN_AVAIL; |
| } | } |
| // TRACEOUT(("mpu98ii inp %.4x %.2x", port, ret)); | |
| return(ret); | return(ret); |
| } | } |
| (void)port; | (void)port; |
| Line 1017 void mpu98ii_destruct(void) { | Line 1061 void mpu98ii_destruct(void) { |
| cm_mpu98 = NULL; | cm_mpu98 = NULL; |
| } | } |
| void mpu98ii_reset(void) { | void mpu98ii_reset(const NP2CFG *pConfig) { |
| commng_destroy(cm_mpu98); | commng_destroy(cm_mpu98); |
| cm_mpu98 = NULL; | cm_mpu98 = NULL; |
| ZeroMemory(&mpu98, sizeof(mpu98)); | ZeroMemory(&mpu98, sizeof(mpu98)); |
| mpu98.data = MPUMSG_ACK; | mpu98.data = MPUMSG_ACK; |
| mpu98.port = 0xc0d0 | ((np2cfg.mpuopt & 0xf0) << 6); | mpu98.port = 0xc0d0 | ((pConfig->mpuopt & 0xf0) << 6); |
| mpu98.irqnum = mpuirqnum[np2cfg.mpuopt & 3]; | mpu98.irqnum = mpuirqnum[pConfig->mpuopt & 3]; |
| setdefaultcondition(); | setdefaultcondition(); |
| // pic_registext(mpu98.irqnum); | // pic_registext(mpu98.irqnum); |
| (void)pConfig; | |
| } | } |
| void mpu98ii_bind(void) { | void mpu98ii_bind(void) { |