Diff for /np2/win9x/dialog/d_mpu98.cpp between versions 1.1.1.1 and 1.11

version 1.1.1.1, 2003/10/16 17:58:59 version 1.11, 2007/11/11 07:11:28
Line 1 Line 1
 #include        "compiler.h"  #include        "compiler.h"
 #include        "resource.h"  
 #include        "strres.h"  #include        "strres.h"
   #include        "resource.h"
 #include        "np2.h"  #include        "np2.h"
   #include        "oemtext.h"
 #include        "commng.h"  #include        "commng.h"
 #include        "sysmng.h"  #include        "sysmng.h"
 #include        "pccore.h"  
 #include        "bit2res.h"  
 #include        "dialog.h"  #include        "dialog.h"
 #include        "dialogs.h"  #include        "dialogs.h"
   #include        "pccore.h"
   #include        "dipswbmp.h"
   
   
 #ifdef __cplusplus  #ifdef __cplusplus
 extern "C" {  extern "C" {
 #endif  #endif
   
 extern  COMMNG  cm_mpu98;  extern  COMMNG  cm_mpu98;
   
 #ifdef __cplusplus  #ifdef __cplusplus
 }  }
 #endif  #endif
   
 static const char *mpuinterrupt[4] = {str_int0, str_int1, str_int2, str_int5};  static const CBPARAM cpInt[] =
   {
 static  BYTE                    mpu = 0;          {MAKEINTRESOURCE(IDS_INT0),             0},
 static  SUBCLASSPROC    oldidc_mpujmp = NULL;          {MAKEINTRESOURCE(IDS_INT1),             1},
           {MAKEINTRESOURCE(IDS_INT2),             2},
           {MAKEINTRESOURCE(IDS_INT5),             3},
   };
   
 static void setmpuiopara(HWND hWnd, WORD res, BYTE value) {  static  UINT8   mpu = 0;
   
         SendDlgItemMessage(hWnd, res, CB_SETCURSEL,  static void setmpuio(HWND hWnd, UINT8 cValue)
                                                                         (WPARAM)((value >> 4) & 15), (LPARAM)0);  {
           dlgs_setcbcur(hWnd, IDC_MPUIO, (cValue & 0xf0));
 }  }
   
 static BYTE getmpuio(HWND hWnd, WORD res) {  static UINT8 getmpuio(HWND hWnd)
   {
         char    work[8];          return dlgs_getcbcur(hWnd, IDC_MPUIO, 0x00);
   
         GetDlgItemText(hWnd, res, work, sizeof(work));  
         return((milstr_solveHEX(work) >> 6) & 0xf0);  
 }  }
   
 static void setmpuintpara(HWND hWnd, WORD res, BYTE value) {  static void setmpuint(HWND hWnd, UINT8 cValue)
   {
         SendDlgItemMessage(hWnd, res, CB_SETCURSEL,          dlgs_setcbcur(hWnd, IDC_MPUINT, (cValue & 0x03));
                                                                         (WPARAM)(value & 3), (LPARAM)0);  
 }  }
   
 static BYTE getmpuint(HWND hWnd, WORD res) {  static UINT8 getmpuint(HWND hWnd)
   {
         char    work[8];          return dlgs_getcbcur(hWnd, IDC_MPUINT, 0x00);
         BYTE    ret;  
   
         GetDlgItemText(hWnd, res, work, sizeof(work));  
         ret = work[3] - '0';  
         if (ret >= 3) {  
                 ret = 3;  
         }  
         return(ret);  
 }  }
   
 static void setmpujmp(HWND hWnd, BYTE value, BYTE bit) {  static void setmpujmp(HWND hWnd, UINT8 cValue, UINT8 cBit)
   {
         if ((mpu ^ value) & bit) {          if ((mpu ^ cValue) & cBit)
                 mpu &= ~bit;          {
                 mpu |= value;                  mpu &= ~cBit;
                   mpu |= cValue;
                 InvalidateRect(GetDlgItem(hWnd, IDC_MPUDIP), NULL, TRUE);                  InvalidateRect(GetDlgItem(hWnd, IDC_MPUDIP), NULL, TRUE);
         }          }
 }  }
   
 static void setmpuiodip(BYTE *image, int px, int py, int align, BYTE v) {  
   
         int             i, j, y;  // ----
   
         px *= 9;  static void mpucreate(HWND hWnd)
         px++;  {
         py *= 9;          UINT    i;
         for (i=0; i<4; i++, px+=9, v<<=1) {          TCHAR   szBuf[8];
                 y = py + ((v&0x80)?5:9);          int             nIndex;
                 for (j=0; j<3; j++) {          HWND    sub;
                         dlgs_linex(image, px, y+j, 7, align, 2);  
           mpu = np2cfg.mpuopt;
           for (i=0; i<16; i++)
           {
                   wsprintf(szBuf, tchar_4X, 0xC0D0 + (i << 10));
                   nIndex = SendDlgItemMessage(hWnd, IDC_MPUIO, CB_ADDSTRING,
                                                                                                                   0, (LPARAM)szBuf);
                   if (nIndex >= 0)
                   {
                           SendDlgItemMessage(hWnd, IDC_MPUIO, CB_SETITEMDATA,
                                                                                           (WPARAM)nIndex, (LPARAM)(i << 4));
                 }                  }
         }          }
 }          setmpuio(hWnd, mpu);
   
 static void setmpuintdip(BYTE *image, int px, int py, int align, BYTE v) {  
   
         dlgs_setjumpery(image, px + 3 - (mpu & 3), py, align);          dlgs_setcbitem(hWnd, IDC_MPUINT, cpInt, NELEMENTS(cpInt));
 }          setmpuint(hWnd, mpu);
   
 static LRESULT CALLBACK mpujmp(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) {          dlgs_setlistmidiout(hWnd, IDC_MPU98MMAP, np2oscfg.mpu.mout);
           dlgs_setlistmidiin(hWnd, IDC_MPU98MDIN, np2oscfg.mpu.min);
           SETLISTSTR(hWnd, IDC_MPU98MMDL, cmmidi_mdlname);
           SetDlgItemText(hWnd, IDC_MPU98MMDL, np2oscfg.mpu.mdl);
           SetDlgItemCheck(hWnd, IDC_MPU98DEFE, np2oscfg.mpu.def_en);
           SetDlgItemText(hWnd, IDC_MPU98DEFF, np2oscfg.mpu.def);
   
         PAINTSTRUCT     ps;          // SS_OWNERDRAWにすると IDEで不都合が出るので…
         HDC                     hdc;          sub = GetDlgItem(hWnd, IDC_MPUDIP);
         HBITMAP         hBitmap;          SetWindowLong(sub, GWL_STYLE, SS_OWNERDRAW +
         HDC                     hMemDC;                                                          (GetWindowLong(sub, GWL_STYLE) & (~SS_TYPEMASK)));
         BYTE            *image;  
         HANDLE          hwork;  
         BITMAPINFO      *work;  
         BYTE            *imgbtm;  
         int                     align;  
   
         switch(msg) {          SetFocus(GetDlgItem(hWnd, IDC_MPUIO));
                 case WM_PAINT:  
                         hdc = BeginPaint(hWnd, &ps);  
                         if ((hwork = GlobalAlloc(GPTR, bit2res_getsize(&mpudip)))  
                                                                                                                                 == NULL) {  
                                 break;  
                         }  
                         if ((work = (BITMAPINFO *)GlobalLock(hwork)) == NULL) {  
                                 GlobalFree(hwork);  
                                 break;  
                         }  
                         bit2res_sethead(work, &mpudip);  
                         hBitmap = CreateDIBSection(hdc, work, DIB_RGB_COLORS,  
                                                                                                 (void **)&image, NULL, 0);  
                         bit2res_setdata(image, &mpudip);  
                         align = ((mpudip.x + 7) / 2) & ~3;  
                         imgbtm = image + align * (mpudip.y - 1);  
                         setmpuiodip(imgbtm, 2, 1, align, mpu);  
                         setmpuintdip(imgbtm, 9, 1, align, mpu);  
                         if ((hMemDC = CreateCompatibleDC(hdc)) != NULL) {  
                                 SelectObject(hMemDC, hBitmap);  
                                 StretchBlt(hdc, 0, 0, mpudip.x, mpudip.y, hMemDC,  
                                                                         0, 0, mpudip.x, mpudip.y, SRCCOPY);  
                                 DeleteDC(hMemDC);  
                         }  
                         DeleteObject(hBitmap);  
                         EndPaint(hWnd, &ps);  
                         GlobalUnlock(hwork);  
                         GlobalFree(hwork);  
                         break;  
                 default:  
                         return(CallWindowProc(oldidc_mpujmp, hWnd, msg, wp, lp));  
         }  
         return(FALSE);  
 }  }
   
 static void updatempu(HWND hWnd) {  static void mpuupdate(HWND hWnd) {
   
         union {          union {
                 char    mmap[MAXPNAMELEN];                  OEMCHAR mmap[MAXPNAMELEN];
                 char    mmdl[64];                  OEMCHAR mmdl[64];
                 char    mdef[MAX_PATH];                  OEMCHAR mdef[MAX_PATH];
                 char    mdin[MAXPNAMELEN];                  OEMCHAR mdin[MAXPNAMELEN];
         } s;          } s;
         UINT    update;          UINT    update;
   
Line 149  static void updatempu(HWND hWnd) { Line 118  static void updatempu(HWND hWnd) {
                 np2cfg.mpuopt = mpu;                  np2cfg.mpuopt = mpu;
                 update |= SYS_UPDATECFG | SYS_UPDATEMIDI;                  update |= SYS_UPDATECFG | SYS_UPDATEMIDI;
         }          }
         GetDlgItemText(hWnd, IDC_MPU98MMAP, s.mmap, sizeof(s.mmap));          GetDlgItemText(hWnd, IDC_MPU98MMAP, s.mmap, NELEMENTS(s.mmap));
         if (milstr_cmp(np2oscfg.mpu.mout, s.mmap)) {          if (milstr_cmp(np2oscfg.mpu.mout, s.mmap)) {
                 milstr_ncpy(np2oscfg.mpu.mout, s.mmap, sizeof(np2oscfg.mpu.mout));                  milstr_ncpy(np2oscfg.mpu.mout, s.mmap, NELEMENTS(np2oscfg.mpu.mout));
                 update |= SYS_UPDATEOSCFG | SYS_UPDATEMIDI;                  update |= SYS_UPDATEOSCFG | SYS_UPDATEMIDI;
         }          }
         GetDlgItemText(hWnd, IDC_MPU98MDIN, s.mdin, sizeof(s.mdin));          GetDlgItemText(hWnd, IDC_MPU98MDIN, s.mdin, NELEMENTS(s.mdin));
         if (milstr_cmp(np2oscfg.mpu.min, s.mdin)) {          if (milstr_cmp(np2oscfg.mpu.min, s.mdin)) {
                 milstr_ncpy(np2oscfg.mpu.min, s.mdin, sizeof(np2oscfg.mpu.min));                  milstr_ncpy(np2oscfg.mpu.min, s.mdin, NELEMENTS(np2oscfg.mpu.min));
                 update |= SYS_UPDATEOSCFG | SYS_UPDATEMIDI;                  update |= SYS_UPDATEOSCFG | SYS_UPDATEMIDI;
         }          }
         GetDlgItemText(hWnd, IDC_MPU98MMDL, s.mmdl, sizeof(s.mmdl));          GetDlgItemText(hWnd, IDC_MPU98MMDL, s.mmdl, NELEMENTS(s.mmdl));
         if (milstr_cmp(np2oscfg.mpu.mdl, s.mmdl)) {          if (milstr_cmp(np2oscfg.mpu.mdl, s.mmdl)) {
                 milstr_ncpy(np2oscfg.mpu.mdl, s.mmdl, sizeof(np2oscfg.mpu.mdl));                  milstr_ncpy(np2oscfg.mpu.mdl, s.mmdl, NELEMENTS(np2oscfg.mpu.mdl));
                 update |= SYS_UPDATEOSCFG | SYS_UPDATEMIDI;                  update |= SYS_UPDATEOSCFG | SYS_UPDATEMIDI;
         }          }
   
         np2oscfg.mpu.def_en = GetDlgItemCheck(hWnd, IDC_MPU98DEFE);          np2oscfg.mpu.def_en = GetDlgItemCheck(hWnd, IDC_MPU98DEFE);
         GetDlgItemText(hWnd, IDC_MPU98DEFF, s.mdef, sizeof(s.mdef));          if (cm_mpu98) {
                   cm_mpu98->msg(cm_mpu98, COMMSG_MIMPIDEFEN, np2oscfg.mpu.def_en);
           }
           GetDlgItemText(hWnd, IDC_MPU98DEFF, s.mdef, NELEMENTS(s.mdef));
         if (milstr_cmp(np2oscfg.mpu.def, s.mdef)) {          if (milstr_cmp(np2oscfg.mpu.def, s.mdef)) {
                 milstr_ncpy(np2oscfg.mpu.def, s.mdef, sizeof(np2oscfg.mpu.def));                  milstr_ncpy(np2oscfg.mpu.def, s.mdef, NELEMENTS(np2oscfg.mpu.def));
 //              commsmidi_toneload(&mpu98_comm, s.mdef);                  if (cm_mpu98) {
                           cm_mpu98->msg(cm_mpu98, COMMSG_MIMPIDEFFILE, (long)s.mdef);
                   }
                 update |= SYS_UPDATEOSCFG;                  update |= SYS_UPDATEOSCFG;
         }          }
         sysmng_update(update);          sysmng_update(update);
 }  }
   
 LRESULT CALLBACK MidiDialogProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) {  static void mpucmddipsw(HWND hWnd) {
   
         BYTE    b, bit;  
         int             i;  
         RECT    rect1;          RECT    rect1;
         RECT    rect2;          RECT    rect2;
         POINT   p;          POINT   p;
           BOOL    redraw;
           UINT8   bit;
   
           GetWindowRect(GetDlgItem(hWnd, IDC_MPUDIP), &rect1);
           GetClientRect(GetDlgItem(hWnd, IDC_MPUDIP), &rect2);
           GetCursorPos(&p);
           redraw = FALSE;
           p.x += rect2.left - rect1.left;
           p.y += rect2.top - rect1.top;
           p.x /= 9;
           p.y /= 9;
           if ((p.y < 1) || (p.y >= 3)) {
                   return;
           }
           if ((p.x >= 2) && (p.x < 6)) {
                   bit = 0x80 >> (p.x - 2);
                   mpu ^= bit;
                   setmpuio(hWnd, mpu);
                   redraw = TRUE;
           }
           else if ((p.x >= 9) && (p.x < 13)) {
                   bit = (UINT8)(12 - p.x);
                   if ((mpu ^ bit) & 3) {
                           mpu &= ~0x3;
                           mpu |= bit;
                           setmpuint(hWnd, mpu);
                           redraw = TRUE;
                   }
           }
           if (redraw) {
                   InvalidateRect(GetDlgItem(hWnd, IDC_MPUDIP), NULL, TRUE);
           }
   }
   
   LRESULT CALLBACK MidiDialogProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) {
   
         switch(msg) {          switch(msg) {
                 case WM_INITDIALOG:                  case WM_INITDIALOG:
                         mpu = np2cfg.mpuopt;                          mpucreate(hWnd);
                         for (i=0; i<16; i++) {  
                                 char buf[8];  
                                 wsprintf(buf, str_4X, 0xC0D0 + (i << 10));  
                                 SendDlgItemMessage(hWnd, IDC_MPUIO,  
                                                                         CB_INSERTSTRING, (WPARAM)i, (LPARAM)buf);  
                         }  
                         setmpuiopara(hWnd, IDC_MPUIO, mpu);  
                         SETLISTSTR(hWnd, IDC_MPUINT, mpuinterrupt);  
                         setmpuintpara(hWnd, IDC_MPUINT, mpu);  
   
                         dlgs_setlistmidiout(hWnd, IDC_MPU98MMAP, np2oscfg.mpu.mout);  
                         dlgs_setlistmidiin(hWnd, IDC_MPU98MDIN, np2oscfg.mpu.min);  
                         SETLISTSTR(hWnd, IDC_MPU98MMDL, cmmidi_mdlname);  
                         SetDlgItemText(hWnd, IDC_MPU98MMDL, np2oscfg.mpu.mdl);  
                         SetDlgItemCheck(hWnd, IDC_MPU98DEFE, np2oscfg.mpu.def_en);  
                         SetDlgItemText(hWnd, IDC_MPU98DEFF, np2oscfg.mpu.def);  
   
                         oldidc_mpujmp = (SUBCLASSPROC)GetWindowLong(GetDlgItem(hWnd,  
                                                                                                 IDC_MPUDIP), GWL_WNDPROC);  
                         SetWindowLong(GetDlgItem(hWnd, IDC_MPUDIP), GWL_WNDPROC,  
                                                                                                         (LONG)mpujmp);  
                         SetFocus(GetDlgItem(hWnd, IDC_MPUIO));                                  // ver0.30  
                         return(FALSE);                          return(FALSE);
   
                 case WM_COMMAND:                  case WM_COMMAND:
                         switch(LOWORD(wp)) {                          switch(LOWORD(wp)) {
                                 case IDOK:                                  case IDOK:
                                         updatempu(hWnd);                                          mpuupdate(hWnd);
                                         EndDialog(hWnd, IDOK);                                          EndDialog(hWnd, IDOK);
                                         break;                                          break;
   
Line 222  LRESULT CALLBACK MidiDialogProc(HWND hWn Line 207  LRESULT CALLBACK MidiDialogProc(HWND hWn
                                         break;                                          break;
   
                                 case IDC_MPUIO:                                  case IDC_MPUIO:
                                         setmpujmp(hWnd, getmpuio(hWnd, IDC_MPUIO), 0xf0);                                          setmpujmp(hWnd, getmpuio(hWnd), 0xf0);
                                         return(FALSE);                                          return(FALSE);
   
                                 case IDC_MPUINT:                                  case IDC_MPUINT:
                                         setmpujmp(hWnd, getmpuint(hWnd, IDC_MPUINT), 0x03);                                          setmpujmp(hWnd, getmpuint(hWnd), 0x03);
                                         return(FALSE);                                          return(FALSE);
   
                                 case IDC_MPUDEF:                                  case IDC_MPUDEF:
                                         mpu = 0x82;                                          mpu = 0x82;
                                         setmpuiopara(hWnd, IDC_MPUIO, mpu);                                          setmpuio(hWnd, mpu);
                                         setmpuintpara(hWnd, IDC_MPUINT, mpu);                                          setmpuint(hWnd, mpu);
                                         InvalidateRect(GetDlgItem(hWnd, IDC_MPUDIP), NULL, TRUE);                                          InvalidateRect(GetDlgItem(hWnd, IDC_MPUDIP), NULL, TRUE);
                                         return(FALSE);                                          return(FALSE);
   
                                 case IDC_MPUDIP:                                  case IDC_MPUDIP:
                                         GetWindowRect(GetDlgItem(hWnd, IDC_MPUDIP), &rect1);                                          mpucmddipsw(hWnd);
                                         GetClientRect(GetDlgItem(hWnd, IDC_MPUDIP), &rect2);  
                                         GetCursorPos(&p);  
                                         p.x += rect2.left - rect1.left;  
                                         p.y += rect2.top - rect1.top;  
                                         p.x /= 9;  
                                         p.y /= 9;  
                                         if ((p.y < 1) || (p.y >= 3)) {  
                                                 return(FALSE);  
                                         }  
                                         if ((p.x >= 2) && (p.x < 6)) {  
                                                 bit = 0x80 >> (p.x - 2);  
                                                 mpu ^= bit;  
                                                 setmpuiopara(hWnd, IDC_MPUIO, mpu);  
                                                 InvalidateRect(GetDlgItem(hWnd, IDC_MPUDIP),  
                                                                                                                         NULL, TRUE);  
                                         }  
                                         else if ((p.x >= 9) && (p.x < 13)) {  
                                                 b = (BYTE)(12 - p.x);  
                                                 if ((mpu ^ b) & 3) {  
                                                         mpu &= ~0x3;  
                                                         mpu |= b;  
                                                         setmpuintpara(hWnd, IDC_MPUINT, mpu);  
                                                         InvalidateRect(GetDlgItem(hWnd, IDC_MPUDIP),  
                                                                                                                         NULL, TRUE);  
                                                 }  
                                         }  
                                         return(FALSE);                                          return(FALSE);
   
                                 case IDC_MPU98DEFB:                                  case IDC_MPU98DEFB:
Line 272  LRESULT CALLBACK MidiDialogProc(HWND hWn Line 231  LRESULT CALLBACK MidiDialogProc(HWND hWn
                         }                          }
                         break;                          break;
   
                   case WM_DRAWITEM:
                           if (LOWORD(wp) == IDC_MPUDIP) {
                                   dlgs_drawbmp(((LPDRAWITEMSTRUCT)lp)->hDC,
                                                                                                           dipswbmp_getmpu(mpu));
                           }
                           return(FALSE);
   
                 case WM_CLOSE:                  case WM_CLOSE:
                         PostMessage(hWnd, WM_COMMAND, IDCANCEL, 0);                          PostMessage(hWnd, WM_COMMAND, IDCANCEL, 0);
                         break;                          break;

Removed from v.1.1.1.1  
changed lines
  Added in v.1.11


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