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