| version 1.3, 2003/10/24 14:16:54 | version 1.11, 2007/11/11 07:11:28 | 
| Line 2 | Line 2 | 
 | #include        "strres.h" | #include        "strres.h" | 
 | #include        "resource.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        "dialog.h" | #include        "dialog.h" | 
 | #include        "dialogs.h" | #include        "dialogs.h" | 
 | #include        "bit2res.h" |  | 
 | #include        "pccore.h" | #include        "pccore.h" | 
 |  | #include        "dipswbmp.h" | 
 |  |  | 
 |  |  | 
 | #ifdef __cplusplus | #ifdef __cplusplus | 
| Line 20  extern COMMNG cm_mpu98; | Line 21  extern COMMNG cm_mpu98; | 
 | } | } | 
 | #endif | #endif | 
 |  |  | 
| static const char *mpuinterrupt[4] = {str_int0, str_int1, str_int2, str_int5}; | static const CBPARAM cpInt[] = | 
|  | { | 
|  | {MAKEINTRESOURCE(IDS_INT0),             0}, | 
|  | {MAKEINTRESOURCE(IDS_INT1),             1}, | 
|  | {MAKEINTRESOURCE(IDS_INT2),             2}, | 
|  | {MAKEINTRESOURCE(IDS_INT5),             3}, | 
|  | }; | 
 |  |  | 
| static  BYTE                    mpu = 0; | static  UINT8   mpu = 0; | 
| static  SUBCLASSPROC    oldidc_mpujmp = NULL; |  | 
 |  |  | 
|  | static void setmpuio(HWND hWnd, UINT8 cValue) | 
| static void setmpuiopara(HWND hWnd, WORD res, BYTE value) { | { | 
|  | dlgs_setcbcur(hWnd, IDC_MPUIO, (cValue & 0xf0)); | 
| SendDlgItemMessage(hWnd, res, CB_SETCURSEL, |  | 
| (WPARAM)((value >> 4) & 15), (LPARAM)0); |  | 
 | } | } | 
 |  |  | 
| 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_setcbitem(hWnd, IDC_MPUINT, cpInt, NELEMENTS(cpInt)); | 
|  | setmpuint(hWnd, mpu); | 
| dlgs_setjumpery(image, px + 3 - (mpu & 3), py, align); |  | 
| } |  | 
 |  |  | 
| 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 151  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; | 
 | } | } | 
 |  |  | 
| Line 171  static void updatempu(HWND hWnd) { | Line 138  static void updatempu(HWND hWnd) { | 
 | if (cm_mpu98) { | if (cm_mpu98) { | 
 | cm_mpu98->msg(cm_mpu98, COMMSG_MIMPIDEFEN, np2oscfg.mpu.def_en); | cm_mpu98->msg(cm_mpu98, COMMSG_MIMPIDEFEN, np2oscfg.mpu.def_en); | 
 | } | } | 
| GetDlgItemText(hWnd, IDC_MPU98DEFF, s.mdef, sizeof(s.mdef)); | 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)); | 
 | if (cm_mpu98) { | if (cm_mpu98) { | 
 | cm_mpu98->msg(cm_mpu98, COMMSG_MIMPIDEFFILE, (long)s.mdef); | cm_mpu98->msg(cm_mpu98, COMMSG_MIMPIDEFFILE, (long)s.mdef); | 
 | } | } | 
| Line 182  static void updatempu(HWND hWnd) { | Line 149  static void updatempu(HWND hWnd) { | 
 | 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 229  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 279  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; |