Diff for /np2/cbus/mpu98ii.c between versions 1.8 and 1.9

version 1.8, 2005/02/14 06:25:30 version 1.9, 2005/03/23 08:07:48
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 193  static void sendmpulongmsg(const UINT8 * Line 194  static void sendmpulongmsg(const UINT8 *
   
 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 223  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 295  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 331  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 344  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 771  static BRESULT sendmpucmd(MPUCMDS *cmd,  Line 779  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 807  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 818  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 843  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 861  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 894  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 922  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 944  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 981  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 1020  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;

Removed from v.1.8  
changed lines
  Added in v.1.9


RetroPC.NET-CVS <cvs@retropc.net>