--- np2/win9x/dialog/d_sound.cpp 2003/10/16 17:59:03 1.1.1.1 +++ np2/win9x/dialog/d_sound.cpp 2006/12/24 00:52:30 1.19 @@ -1,91 +1,114 @@ #include "compiler.h" -#include #include #include -#include "resource.h" #include "strres.h" +#include "resource.h" #include "np2.h" +#include "oemtext.h" +#include "dosio.h" #include "joymng.h" #include "sysmng.h" #include "menu.h" +#include "np2class.h" +#include "dialog.h" +#include "dialogs.h" #include "pccore.h" #include "iocore.h" #include "sound.h" #include "fmboard.h" -#include "bit2res.h" -#include "dialog.h" -#include "dialogs.h" #include "s98.h" +#include "dipswbmp.h" -static const char *sndioport[4] = {"0088", "0188", "0288", "0388"}; -static const char *sndinterrupt[4] = {str_int0, str_int4, str_int5, str_int6}; -static const char *sndromaddr[5] = {"C8000", "CC000", "D0000", "D4000", "N/C"}; -static const char *sndid[8] = {"0x", "1x", "2x", "3x", "4x", "5x", "6x", "7x"}; +static const TCHAR str_0088[] = _T("0088"); +static const TCHAR str_0188[] = _T("0188"); +static const TCHAR str_0288[] = _T("0288"); +static const TCHAR str_0388[] = _T("0388"); +static const TCHAR str_c8000[] = _T("C8000"); +static const TCHAR str_cc000[] = _T("CC000"); +static const TCHAR str_d0000[] = _T("D0000"); +static const TCHAR str_d4000[] = _T("D4000"); +static const TCHAR str_n0x[] = _T("0x"); +static const TCHAR str_n1x[] = _T("1x"); +static const TCHAR str_n2x[] = _T("2x"); +static const TCHAR str_n3x[] = _T("3x"); +static const TCHAR str_n4x[] = _T("4x"); +static const TCHAR str_n5x[] = _T("5x"); +static const TCHAR str_n6x[] = _T("6x"); +static const TCHAR str_n7x[] = _T("7x"); +static const TCHAR *sndioport[4] = + {str_0088, str_0188, str_0288, str_0388}; +static const TCHAR *sndinterrupt[4] = + {str_int0, str_int4, str_int5, str_int6}; +static const TCHAR *sndromaddr[5] = + {str_c8000, str_cc000, str_d0000, str_d4000, str_nc}; +static const TCHAR *sndid[8] = + {str_n0x, str_n1x, str_n2x, str_n3x, + str_n4x, str_n5x, str_n6x, str_n7x}; -static const char str_sndopt[] = "Sound board option"; +static const TCHAR str_sndopt[] = _T("Sound board option"); typedef struct { - int res; - int resstr; - BYTE *value; - WORD min; - WORD max; -} SLIDER_T; + UINT16 res; + UINT16 resstr; + UINT8 *value; + UINT16 min; + UINT16 max; +} SLIDERTBL; -static void slidersetvaluestr(HWND hWnd, const SLIDER_T *item, BYTE value) { +static void slidersetvaluestr(HWND hWnd, const SLIDERTBL *item, UINT8 value) { - char work[32]; + TCHAR work[32]; - wsprintf(work, str_d, value); + wsprintf(work, tchar_d, value); SetDlgItemText(hWnd, item->resstr, work); } -static void slidersetvalue(HWND hWnd, const SLIDER_T *item, BYTE value) { +static void slidersetvalue(HWND hWnd, const SLIDERTBL *item, UINT8 value) { - if (value > (BYTE)(item->max)) { - value = (BYTE)(item->max); + if (value > (UINT8)item->max) { + value = (UINT8)item->max; } - else if (value < (BYTE)(item->min)) { - value = (BYTE)(item->min); + else if (value < (UINT8)item->min) { + value = (UINT8)item->min; } SendDlgItemMessage(hWnd, item->res, TBM_SETPOS, TRUE, value); slidersetvaluestr(hWnd, item, value); } -static void sliderinit(HWND hWnd, const SLIDER_T *item) { +static void sliderinit(HWND hWnd, const SLIDERTBL *item) { SendDlgItemMessage(hWnd, item->res, TBM_SETRANGE, TRUE, MAKELONG(item->min, item->max)); slidersetvalue(hWnd, item, *(item->value)); } -static void sliderresetpos(HWND hWnd, const SLIDER_T *item) { +static void sliderresetpos(HWND hWnd, const SLIDERTBL *item) { - BYTE value; + UINT8 value; - value = (BYTE)SendDlgItemMessage(hWnd, item->res, TBM_GETPOS, 0, 0); - if (value > (BYTE)(item->max)) { - value = (BYTE)(item->max); + value = (UINT8)SendDlgItemMessage(hWnd, item->res, TBM_GETPOS, 0, 0); + if (value > (UINT8)item->max) { + value = (UINT8)item->max; } - else if (value < (BYTE)(item->min)) { - value = (BYTE)(item->min); + else if (value < (UINT8)item->min) { + value = (UINT8)item->min; } slidersetvaluestr(hWnd, item, value); } -static BYTE sliderrestore(HWND hWnd, const SLIDER_T *item) { +static UINT8 sliderrestore(HWND hWnd, const SLIDERTBL *item) { - BYTE value; - BYTE ret; + UINT8 value; + UINT8 ret; - value = (BYTE)SendDlgItemMessage(hWnd, item->res, TBM_GETPOS, 0, 0); - if (value > (BYTE)(item->max)) { - value = (BYTE)(item->max); + value = (UINT8)SendDlgItemMessage(hWnd, item->res, TBM_GETPOS, 0, 0); + if (value > (UINT8)item->max) { + value = (UINT8)item->max; } - else if (value < (BYTE)(item->min)) { - value = (BYTE)(item->min); + else if (value < (UINT8)item->min) { + value = (UINT8)item->min; } ret = (*(item->value)) - value; if (ret) { @@ -94,9 +117,9 @@ static BYTE sliderrestore(HWND hWnd, con return(ret); } -// -------------------------------------------------------- mixer +// ---- mixer -static const SLIDER_T sndmixitem[] = { +static const SLIDERTBL sndmixitem[] = { {IDC_VOLFM, IDC_VOLFMSTR, &np2cfg.vol_fm, 0,128}, {IDC_VOLPSG, IDC_VOLPSGSTR, &np2cfg.vol_ssg, 0,128}, {IDC_VOLADPCM, IDC_VOLADPCMSTR, &np2cfg.vol_adpcm, 0,128}, @@ -117,7 +140,7 @@ static LRESULT CALLBACK SndmixDlgProc(HW return(TRUE); case WM_COMMAND: - switch (LOWORD(wp)) { + switch(LOWORD(wp)) { case IDC_SNDMIXDEF: for (i=0; i<5; i++) { slidersetvalue(hWnd, &sndmixitem[i], 64); @@ -137,7 +160,7 @@ static LRESULT CALLBACK SndmixDlgProc(HW break; case WM_NOTIFY: - if ((((NMHDR *)lp)->code) == PSN_APPLY) { + if ((((NMHDR *)lp)->code) == (UINT)PSN_APPLY) { for (i=0; i<5; i++) { if (sliderrestore(hWnd, &sndmixitem[i])) { sysmng_update(SYS_UPDATECFG); @@ -159,9 +182,9 @@ static LRESULT CALLBACK SndmixDlgProc(HW } -// -------------------------------------------------------- PC-9801-14 +// ---- PC-9801-14 -const static SLIDER_T snd14item[] = { +static const SLIDERTBL snd14item[] = { {IDC_VOL14L, IDC_VOL14LSTR, np2cfg.vol14+0, 0,15}, {IDC_VOL14R, IDC_VOL14RSTR, np2cfg.vol14+1, 0,15}, {IDC_VOLF2, IDC_VOLF2STR, np2cfg.vol14+2, 0,15}, @@ -193,7 +216,7 @@ static LRESULT CALLBACK Snd14optDlgProc( break; case WM_NOTIFY: - if ((((NMHDR *)lp)->code) == PSN_APPLY) { + if ((((NMHDR *)lp)->code) == (UINT)PSN_APPLY) { for (i=0; i<6; i++) { if (sliderrestore(hWnd, &snd14item[i])) { sysmng_update(SYS_UPDATECFG); @@ -207,33 +230,35 @@ static LRESULT CALLBACK Snd14optDlgProc( return(FALSE); } -// -------------------------------------------------------- 26K, SPB jumper -static void setsnd26iopara(HWND hWnd, BYTE value) { +// ---- 26K, SPB jumper + +static const UINT snd26paranum[4] = {0, 3, 1, 2}; + +static void setsnd26iopara(HWND hWnd, UINT8 value) { SendMessage(hWnd, CB_SETCURSEL, (WPARAM)((value >> 4) & 1), (LPARAM)0); } -static BYTE getsnd26io(HWND hWnd, WORD res) { +static UINT8 getsnd26io(HWND hWnd, UINT16 res) { - char work[8]; + TCHAR work[8]; - GetDlgItemText(hWnd, res, work, sizeof(work)); - return((BYTE)((work[1] == '1')?0x10:0x00)); + GetDlgItemText(hWnd, res, work, NELEMENTS(work)); + return((UINT8)((work[1] == '1')?0x10:0x00)); } -static void setsnd26intpara(HWND hWnd, BYTE value) { - -static WPARAM paranum[4] = {(WPARAM)0, (WPARAM)3, (WPARAM)1, (WPARAM)2}; +static void setsnd26intpara(HWND hWnd, UINT8 value) { - SendMessage(hWnd, CB_SETCURSEL, paranum[(value >> 6) & 3], (LPARAM)0); + SendMessage(hWnd, CB_SETCURSEL, + (WPARAM)snd26paranum[(value >> 6) & 3], (LPARAM)0); } -static BYTE getsnd26int(HWND hWnd, WORD res) { +static UINT8 getsnd26int(HWND hWnd, UINT16 res) { - char work[8]; + TCHAR work[8]; - GetDlgItemText(hWnd, res, work, sizeof(work)); + GetDlgItemText(hWnd, res, work, NELEMENTS(work)); switch(work[3]) { case '0': return(0x00); @@ -247,7 +272,7 @@ static BYTE getsnd26int(HWND hWnd, WORD return(0xc0); } -static void setsnd26rompara(HWND hWnd, BYTE value) { +static void setsnd26rompara(HWND hWnd, UINT8 value) { int para; @@ -258,111 +283,102 @@ static void setsnd26rompara(HWND hWnd, B SendMessage(hWnd, CB_SETCURSEL, (WPARAM)para, (LPARAM)0); } -static BYTE getsnd26rom(HWND hWnd, WORD res) { +static UINT8 getsnd26rom(HWND hWnd, UINT16 res) { - char work[8]; - DWORD adrs; + TCHAR work[8]; + UINT32 adrs; - GetDlgItemText(hWnd, res, work, sizeof(work)); - adrs = ((DWORD)milstr_solveHEX(work) - 0xc8000) >> 14; + GetDlgItemText(hWnd, res, work, NELEMENTS(work)); + adrs = ((UINT32)miltchar_solveHEX(work) - 0xc8000) >> 14; if (adrs < 4) { - return((BYTE)adrs); + return((UINT8)adrs); } return(4); } -void setsnd26iodip(BYTE *image, int px, int py, int align, BYTE v) { - if (v & 0x10) { - px++; - } - dlgs_setjumpery(image, px, py, align); -} +// ---- PC-9801-26 -void setsnd26intdip(BYTE *image, int px, int py, int align, BYTE v) { +static UINT8 snd26 = 0; - dlgs_setjumperx(image, px + ((v & 0x80)?0:1), py, align); - dlgs_setjumperx(image, px + ((v & 0x40)?0:1), py + 1, align); -} - -void setsnd26romdip(BYTE *image, int px, int py, int align, BYTE v) { +static void set26jmp(HWND hWnd, UINT8 value, UINT8 bit) { - v &= 7; - if (v >= 4) { - v = 4; + if ((snd26 ^ value) & bit) { + snd26 &= ~bit; + snd26 |= value; + InvalidateRect(GetDlgItem(hWnd, IDC_SND26JMP), NULL, TRUE); } - dlgs_setjumpery(image, px + v, py, align); } -// -------------------------------------------------------- PC-9801-26 - -static BYTE snd26 = 0; -static SUBCLASSPROC oldidc_snd26jmp = NULL; - -static LRESULT CALLBACK Snd26jmp(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { +static void snd26cmdjmp(HWND hWnd) { - PAINTSTRUCT ps; - HDC hdc; - HBITMAP hBitmap; - HDC hMemDC; - BYTE *image; - HANDLE hwork; - BITMAPINFO *work; - BYTE *imgbtm; - int align; + RECT rect1; + RECT rect2; + POINT p; + BOOL redraw; + UINT8 b; + UINT8 bit; + + GetWindowRect(GetDlgItem(hWnd, IDC_SND26JMP), &rect1); + GetClientRect(GetDlgItem(hWnd, IDC_SND26JMP), &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 < 7)) { + b = (UINT8)(p.x - 2); + if ((snd26 ^ b) & 7) { + snd26 &= ~0x07; + snd26 |= b; + setsnd26rompara(GetDlgItem(hWnd, IDC_SND26ROM), b); + redraw = TRUE; + } + } + else if ((p.x >= 9) && (p.x < 12)) { + b = snd26; + bit = 0x40 << (2 - p.y); + switch(p.x) { + case 9: + b |= bit; + break; - switch(msg) { - case WM_PAINT: - hdc = BeginPaint(hWnd, &ps); - if ((hwork = GlobalAlloc(GPTR, bit2res_getsize(&snd26dip))) - == NULL) { + case 10: + b ^= bit; break; - } - if ((work = (BITMAPINFO *)GlobalLock(hwork)) == NULL) { - GlobalFree(hwork); + + case 11: + b &= ~bit; break; - } - bit2res_sethead(work, &snd26dip); - hBitmap = CreateDIBSection(hdc, work, DIB_RGB_COLORS, - (void **)&image, NULL, 0); - bit2res_setdata(image, &snd26dip); - align = ((snd26dip.x + 7) / 2) & ~3; - imgbtm = image + align * (snd26dip.y - 1); - setsnd26iodip(imgbtm, 15, 1, align, snd26); - setsnd26intdip(imgbtm, 9, 1, align, snd26); - setsnd26romdip(imgbtm, 2, 1, align, snd26); - if ((hMemDC = CreateCompatibleDC(hdc)) != NULL) { - SelectObject(hMemDC, hBitmap); - StretchBlt(hdc, 0, 0, snd26dip.x, snd26dip.y, hMemDC, - 0, 0, snd26dip.x, snd26dip.y, SRCCOPY); - DeleteDC(hMemDC); - } - DeleteObject(hBitmap); - EndPaint(hWnd, &ps); - GlobalUnlock(hwork); - GlobalFree(hwork); - break; - default: - return(CallWindowProc(oldidc_snd26jmp, hWnd, msg, wp, lp)); + } + if (snd26 != b) { + snd26 = b; + setsnd26intpara(GetDlgItem(hWnd, IDC_SND26INT), b); + redraw = TRUE; + } + } + else if ((p.x >= 15) && (p.x < 17)) { + b = (UINT8)((p.x - 15) << 4); + if ((snd26 ^ b) & 0x10) { + snd26 &= ~0x10; + snd26 |= b; + setsnd26iopara(GetDlgItem(hWnd, IDC_SND26IO), b); + redraw = TRUE; + } } - return(FALSE); -} - -static void set26jmp(HWND hWnd, BYTE value, BYTE bit) { - - if ((snd26 ^ value) & bit) { - snd26 &= ~bit; - snd26 |= value; + if (redraw) { InvalidateRect(GetDlgItem(hWnd, IDC_SND26JMP), NULL, TRUE); } } static LRESULT CALLBACK Snd26optDlgProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { - BYTE b, bit; - RECT rect1; - RECT rect2; - POINT p; + + HWND sub; switch(msg) { case WM_INITDIALOG: @@ -373,23 +389,25 @@ static LRESULT CALLBACK Snd26optDlgProc( setsnd26intpara(GetDlgItem(hWnd, IDC_SND26INT), snd26); SETLISTSTR(hWnd, IDC_SND26ROM, sndromaddr); setsnd26rompara(GetDlgItem(hWnd, IDC_SND26ROM), snd26); - oldidc_snd26jmp = (SUBCLASSPROC)GetWindowLong(GetDlgItem(hWnd, - IDC_SND26JMP), GWL_WNDPROC); - SetWindowLong(GetDlgItem(hWnd, IDC_SND26JMP), GWL_WNDPROC, - (LONG)Snd26jmp); + sub = GetDlgItem(hWnd, IDC_SND26JMP); + SetWindowLong(sub, GWL_STYLE, SS_OWNERDRAW + + (GetWindowLong(sub, GWL_STYLE) & (~SS_TYPEMASK))); return(TRUE); case WM_COMMAND: - switch (LOWORD(wp)) { + switch(LOWORD(wp)) { case IDC_SND26IO: set26jmp(hWnd, getsnd26io(hWnd, IDC_SND26IO), 0x10); break; + case IDC_SND26INT: set26jmp(hWnd, getsnd26int(hWnd, IDC_SND26INT), 0xc0); break; + case IDC_SND26ROM: set26jmp(hWnd, getsnd26rom(hWnd, IDC_SND26ROM), 0x07); break; + case IDC_SND26DEF: snd26 = 0xd1; setsnd26iopara(GetDlgItem(hWnd, IDC_SND26IO), snd26); @@ -397,66 +415,15 @@ static LRESULT CALLBACK Snd26optDlgProc( setsnd26rompara(GetDlgItem(hWnd, IDC_SND26ROM), snd26); InvalidateRect(GetDlgItem(hWnd, IDC_SND26JMP), NULL, TRUE); break; + case IDC_SND26JMP: - GetWindowRect(GetDlgItem(hWnd, IDC_SND26JMP), &rect1); - GetClientRect(GetDlgItem(hWnd, IDC_SND26JMP), &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)) { - break; - } - if ((p.x >= 2) && (p.x < 7)) { - b = (BYTE)(p.x - 2); - if ((snd26 ^ b) & 7) { - snd26 &= ~0x07; - snd26 |= b; - setsnd26rompara(GetDlgItem(hWnd, IDC_SND26ROM), - b); - InvalidateRect(GetDlgItem(hWnd, IDC_SND26JMP), - NULL, TRUE); - } - } - else if ((p.x >= 9) && (p.x < 12)) { - b = snd26; - bit = 0x40 << (2 - p.y); - switch(p.x) { - case 9: - b |= bit; - break; - case 10: - b ^= bit; - break; - case 11: - b &= ~bit; - break; - } - if (snd26 != b) { - snd26 = b; - setsnd26intpara(GetDlgItem(hWnd, IDC_SND26INT), - b); - InvalidateRect(GetDlgItem(hWnd, IDC_SND26JMP), - NULL, TRUE); - } - } - else if ((p.x >= 15) && (p.x < 17)) { - b = (BYTE)((p.x - 15) << 4); - if ((snd26 ^ b) & 0x10) { - snd26 &= ~0x10; - snd26 |= b; - setsnd26iopara(GetDlgItem(hWnd, IDC_SND26IO), b); - InvalidateRect(GetDlgItem(hWnd, IDC_SND26JMP), - NULL, TRUE); - } - } + snd26cmdjmp(hWnd); break; } break; case WM_NOTIFY: - if ((((NMHDR *)lp)->code) == PSN_APPLY) { + if ((((NMHDR *)lp)->code) == (UINT)PSN_APPLY) { if (np2cfg.snd26opt != snd26) { np2cfg.snd26opt = snd26; sysmng_update(SYS_UPDATECFG); @@ -464,121 +431,76 @@ static LRESULT CALLBACK Snd26optDlgProc( return(TRUE); } break; + + case WM_DRAWITEM: + if (LOWORD(wp) == IDC_SND26JMP) { + dlgs_drawbmp(((LPDRAWITEMSTRUCT)lp)->hDC, + dipswbmp_getsnd26(snd26)); + } + return(FALSE); } return(FALSE); } -// ------------------------------------------------------ PC-9801-86 -static BYTE snd86 = 0; -static SUBCLASSPROC oldidc_snd86dip = NULL; +// ---- PC-9801-86 -static LRESULT CALLBACK snd86jmp(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { +static UINT8 snd86 = 0; - PAINTSTRUCT ps; - HDC hdc; - HBITMAP hBitmap; - HDC hMemDC; - BYTE *image; - HANDLE hwork; - BITMAPINFO *work; - BYTE *imgbtm; - int align; - int i; - int x, y, yl; +static const UINT snd86paranum[4] = {0, 1, 3, 2}; - switch(msg) { - case WM_PAINT: - hdc = BeginPaint(hWnd, &ps); - if ((hwork = GlobalAlloc(GPTR, bit2res_getsize(&snd86dip))) - == NULL) { - break; - } - if ((work = (BITMAPINFO *)GlobalLock(hwork)) == NULL) { - GlobalFree(hwork); - break; - } - bit2res_sethead(work, &snd86dip); - hBitmap = CreateDIBSection(hdc, work, DIB_RGB_COLORS, - (void **)&image, NULL, 0); - bit2res_setdata(image, &snd86dip); - align = ((snd86dip.x + 7) / 2) & ~3; - imgbtm = image + align * (snd86dip.y - 1); - for (i=0; i<8; i++) { - x = i * 8 + 17; - y = ((snd86&(1<> 2) & 3], (LPARAM)0); + SendMessage(hWnd, CB_SETCURSEL, + (WPARAM)snd86paranum[(value >> 2) & 3], (LPARAM)0); } -static BYTE getsnd86int(HWND hWnd) { +static UINT8 getsnd86int(HWND hWnd) { - char work[8]; + TCHAR work[8]; - Edit_GetText(hWnd, work, sizeof(work)); + GetWindowText(hWnd, work, NELEMENTS(work)); switch(work[3]) { case '0': return(0x00); + case '4': return(0x04); + case '6': return(0x08); } return(0x0c); } -static void setsnd86idpara(HWND hWnd, BYTE value) { +static void setsnd86idpara(HWND hWnd, UINT8 value) { SendMessage(hWnd, CB_SETCURSEL, (WPARAM)(((~value) >> 5) & 7), (LPARAM)0); } -static BYTE getsnd86id(HWND hWnd) { +static UINT8 getsnd86id(HWND hWnd) { - char work[8]; + TCHAR work[8]; - Edit_GetText(hWnd, work, sizeof(work)); + GetWindowText(hWnd, work, NELEMENTS(work)); return((~work[0] & 7) << 5); } -static void set86jmp(HWND hWnd, BYTE value, BYTE bit) { +static void set86jmp(HWND hWnd, UINT8 value, UINT8 bit) { if ((snd86 ^ value) & bit) { snd86 &= ~bit; @@ -587,39 +509,83 @@ static void set86jmp(HWND hWnd, BYTE val } } -static LRESULT CALLBACK Snd86optDlgProc(HWND hWnd, UINT msg, - WPARAM wp, LPARAM lp) { +static void snd86cmddipsw(HWND hWnd) { RECT rect1; RECT rect2; POINT p; + GetWindowRect(GetDlgItem(hWnd, IDC_SND86DIP), &rect1); + GetClientRect(GetDlgItem(hWnd, IDC_SND86DIP), &rect2); + GetCursorPos(&p); + p.x += rect2.left - rect1.left; + p.y += rect2.top - rect1.top; + p.x /= 8; + p.y /= 8; + if ((p.x < 2) || (p.x >= 10) || + (p.y < 1) || (p.y >= 3)) { + return; + } + p.x -= 2; + snd86 ^= (1 << p.x); + switch(p.x) { + case 0: + setsnd86iopara(GetDlgItem(hWnd, IDC_SND86IO), snd86); + break; + + case 1: + SetDlgItemCheck(hWnd, IDC_SND86ROM, snd86 & 2); + break; + + case 2: + case 3: + setsnd86intpara(GetDlgItem(hWnd, IDC_SND86INTA), snd86); + break; + + case 4: + SetDlgItemCheck(hWnd, IDC_SND86INT, snd86 & 0x10); + break; + + case 5: + case 6: + case 7: + setsnd86idpara(GetDlgItem(hWnd, IDC_SND86ID), snd86); + break; + } + InvalidateRect(GetDlgItem(hWnd, IDC_SND86DIP), NULL, TRUE); +} + +static LRESULT CALLBACK Snd86optDlgProc(HWND hWnd, UINT msg, + WPARAM wp, LPARAM lp) { + + HWND sub; + switch(msg) { case WM_INITDIALOG: snd86 = np2cfg.snd86opt; SETnLISTSTR(hWnd, IDC_SND86IO, sndioport+1, 2); setsnd86iopara(GetDlgItem(hWnd, IDC_SND86IO), snd86); - Button_SetCheck(GetDlgItem(hWnd, IDC_SND86INT), snd86 & 0x10); + SetDlgItemCheck(hWnd, IDC_SND86INT, snd86 & 0x10); SETLISTSTR(hWnd, IDC_SND86INTA, sndinterrupt); setsnd86intpara(GetDlgItem(hWnd, IDC_SND86INTA), snd86); SETLISTSTR(hWnd, IDC_SND86ID, sndid); setsnd86idpara(GetDlgItem(hWnd, IDC_SND86ID), snd86); - Button_SetCheck(GetDlgItem(hWnd, IDC_SND86ROM), snd86 & 2); - oldidc_snd86dip = (SUBCLASSPROC)GetWindowLong(GetDlgItem(hWnd, - IDC_SND86DIP), GWL_WNDPROC); - SetWindowLong(GetDlgItem(hWnd, IDC_SND86DIP), GWL_WNDPROC, - (LONG)snd86jmp); + SetDlgItemCheck(hWnd, IDC_SND86ROM, snd86 & 2); + + sub = GetDlgItem(hWnd, IDC_SND86DIP); + SetWindowLong(sub, GWL_STYLE, SS_OWNERDRAW + + (GetWindowLong(sub, GWL_STYLE) & (~SS_TYPEMASK))); return(TRUE); case WM_COMMAND: - switch (LOWORD(wp)) { + switch(LOWORD(wp)) { case IDC_SND86IO: set86jmp(hWnd, getsnd86io(hWnd, IDC_SND86IO), 0x01); break; case IDC_SND86INT: set86jmp(hWnd, - ((Button_GetCheck(GetDlgItem(hWnd, IDC_SND86INT))) - ?0x10:0x00), 0x10); + (GetDlgItemCheck(hWnd, IDC_SND86INT))?0x10:0x00, + 0x10); break; case IDC_SND86INTA: set86jmp(hWnd, @@ -627,69 +593,32 @@ static LRESULT CALLBACK Snd86optDlgProc( break; case IDC_SND86ROM: set86jmp(hWnd, - ((Button_GetCheck(GetDlgItem(hWnd, IDC_SND86ROM))) - ?0x02:0x00), 0x02); + (GetDlgItemCheck(hWnd, IDC_SND86ROM))?0x02:0x00, + 0x02); break; case IDC_SND86ID: set86jmp(hWnd, getsnd86id(GetDlgItem(hWnd, IDC_SND86ID)), 0xe0); break; + case IDC_SND86DEF: snd86 = 0x7f; setsnd86iopara(GetDlgItem(hWnd, IDC_SND86IO), snd86); - Button_SetCheck(GetDlgItem(hWnd, IDC_SND86INT), TRUE); + SetDlgItemCheck(hWnd, IDC_SND86INT, TRUE); setsnd86intpara(GetDlgItem(hWnd, IDC_SND86INTA), snd86); setsnd86idpara(GetDlgItem(hWnd, IDC_SND86ID), snd86); - Button_SetCheck(GetDlgItem(hWnd, IDC_SND86ROM), TRUE); + SetDlgItemCheck(hWnd, IDC_SND86ROM, TRUE); InvalidateRect(GetDlgItem(hWnd, IDC_SND86DIP), NULL, TRUE); break; + case IDC_SND86DIP: - GetWindowRect(GetDlgItem(hWnd, IDC_SND86DIP), &rect1); - GetClientRect(GetDlgItem(hWnd, IDC_SND86DIP), &rect2); - GetCursorPos(&p); - p.x += rect2.left - rect1.left; - p.y += rect2.top - rect1.top; - p.x /= 8; - p.y /= 8; - if ((p.x < 2) || (p.x >= 10) || - (p.y < 1) || (p.y >= 3)) { - break; - } - p.x -= 2; - snd86 ^= (1 << p.x); - switch(p.x) { - case 0: - setsnd86iopara(GetDlgItem(hWnd, IDC_SND86IO), - snd86); - break; - case 1: - Button_SetCheck(GetDlgItem(hWnd, IDC_SND86ROM), - snd86 & 2); - break; - case 2: - case 3: - setsnd86intpara(GetDlgItem(hWnd, IDC_SND86INTA), - snd86); - break; - case 4: - Button_SetCheck(GetDlgItem(hWnd, IDC_SND86INT), - snd86 & 0x10); - break; - case 5: - case 6: - case 7: - setsnd86idpara(GetDlgItem(hWnd, IDC_SND86ID), - snd86); - break; - } - InvalidateRect(GetDlgItem(hWnd, IDC_SND86DIP), - NULL, TRUE); + snd86cmddipsw(hWnd); break; } break; case WM_NOTIFY: - if ((((NMHDR *)lp)->code) == PSN_APPLY) { + if ((((NMHDR *)lp)->code) == (UINT)PSN_APPLY) { if (np2cfg.snd86opt != snd86) { np2cfg.snd86opt = snd86; sysmng_update(SYS_UPDATECFG); @@ -697,72 +626,128 @@ static LRESULT CALLBACK Snd86optDlgProc( return(TRUE); } break; + + case WM_DRAWITEM: + if (LOWORD(wp) == IDC_SND86DIP) { + dlgs_drawbmp(((LPDRAWITEMSTRUCT)lp)->hDC, + dipswbmp_getsnd86(snd86)); + } + return(FALSE); } return(FALSE); } -// ------------------------------------------------------ Speak board -static BYTE spb = 0; -static BYTE spbvrc = 0; -static SUBCLASSPROC oldidc_spbjmp = NULL; - - -static LRESULT CALLBACK spbjmp(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { - - PAINTSTRUCT ps; - HDC hdc; - HBITMAP hBitmap; - HDC hMemDC; - BYTE *image; - HANDLE hwork; - BITMAPINFO *work; - BYTE *imgbtm; - int align; +// ---- Speak board - switch(msg) { - case WM_PAINT: - hdc = BeginPaint(hWnd, &ps); - if ((hwork = GlobalAlloc(GPTR, bit2res_getsize(&spbdip))) - == NULL) { +static UINT8 spb = 0; +static UINT8 spbvrc = 0; + +static void setspbVRch(HWND hWnd) { + + SetDlgItemCheck(hWnd, IDC_SPBVRL, spbvrc & 1); + SetDlgItemCheck(hWnd, IDC_SPBVRR, spbvrc & 2); +} + +static void spbcreate(HWND hWnd) { + + HWND sub; + + spb = np2cfg.spbopt; + SETnLISTSTR(hWnd, IDC_SPBIO, sndioport, 2); + setsnd26iopara(GetDlgItem(hWnd, IDC_SPBIO), spb); + SETLISTSTR(hWnd, IDC_SPBINT, sndinterrupt); + setsnd26intpara(GetDlgItem(hWnd, IDC_SPBINT), spb); + SETLISTSTR(hWnd, IDC_SPBROM, sndromaddr); + setsnd26rompara(GetDlgItem(hWnd, IDC_SPBROM), spb); + spbvrc = np2cfg.spb_vrc; // ver0.30 + setspbVRch(hWnd); + SendDlgItemMessage(hWnd, IDC_SPBVRLEVEL, TBM_SETRANGE, TRUE, + MAKELONG(0, 24)); + SendDlgItemMessage(hWnd, IDC_SPBVRLEVEL, TBM_SETPOS, TRUE, + np2cfg.spb_vrl); + SetDlgItemCheck(hWnd, IDC_SPBREVERSE, np2cfg.spb_x); + + sub = GetDlgItem(hWnd, IDC_SPBJMP); + SetWindowLong(sub, GWL_STYLE, SS_OWNERDRAW + + (GetWindowLong(sub, GWL_STYLE) & (~SS_TYPEMASK))); +} + +static void spbcmdjmp(HWND hWnd) { + + RECT rect1; + RECT rect2; + POINT p; + BOOL redraw; + UINT8 b; + UINT8 bit; + + GetWindowRect(GetDlgItem(hWnd, IDC_SPBJMP), &rect1); + GetClientRect(GetDlgItem(hWnd, IDC_SPBJMP), &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 < 5)) { + b = spb; + bit = 0x40 << (2 - p.y); + switch(p.x) { + case 2: + b |= bit; break; - } - if ((work = (BITMAPINFO *)GlobalLock(hwork)) == NULL) { - GlobalFree(hwork); + + case 3: + b ^= bit; break; - } - bit2res_sethead(work, &spbdip); - hBitmap = CreateDIBSection(hdc, work, DIB_RGB_COLORS, - (void **)&image, NULL, 0); - bit2res_setdata(image, &spbdip); - align = ((spbdip.x + 7) / 2) & ~3; - imgbtm = image + align * (spbdip.y - 1); - setsnd26intdip(imgbtm, 2, 1, align, spb); - setsnd26iodip(imgbtm, 10, 1, align, spb); - setsnd26romdip(imgbtm, 14, 1, align, spb); - if (spb & 0x20) { - dlgs_setjumpery(imgbtm, 7, 1, align); - } - dlgs_setjumperx(imgbtm, ((spbvrc&2)?21:22), 1, align); - dlgs_setjumperx(imgbtm, ((spbvrc&1)?21:22), 2, align); - if ((hMemDC = CreateCompatibleDC(hdc)) != NULL) { - SelectObject(hMemDC, hBitmap); - StretchBlt(hdc, 0, 0, spbdip.x, spbdip.y, hMemDC, - 0, 0, spbdip.x, spbdip.y, SRCCOPY); - DeleteDC(hMemDC); - } - DeleteObject(hBitmap); - EndPaint(hWnd, &ps); - GlobalUnlock(hwork); - GlobalFree(hwork); - break; - default: - return(CallWindowProc(oldidc_spbjmp, hWnd, msg, wp, lp)); + + case 4: + b &= ~bit; + break; + } + if (spb != b) { + spb = b; + setsnd26intpara(GetDlgItem(hWnd, IDC_SPBINT), b); + redraw = TRUE; + } + } + else if (p.x == 7) { + spb ^= 0x20; + redraw = TRUE; + } + else if ((p.x >= 10) && (p.x < 12)) { + b = (UINT8)((p.x - 10) << 4); + if ((spb ^ b) & 0x10) { + spb &= ~0x10; + spb |= b; + setsnd26iopara(GetDlgItem(hWnd, IDC_SPBIO), b); + redraw = TRUE; + } + } + else if ((p.x >= 14) && (p.x < 19)) { + b = (UINT8)(p.x - 14); + if ((spb ^ b) & 7) { + spb &= ~0x07; + spb |= b; + setsnd26rompara(GetDlgItem(hWnd, IDC_SPBROM), b); + redraw = TRUE; + } + } + else if ((p.x >= 21) && (p.x < 24)) { + spbvrc ^= (UINT8)(3 - p.y); + setspbVRch(hWnd); + redraw = TRUE; + } + if (redraw) { + InvalidateRect(GetDlgItem(hWnd, IDC_SPBJMP), NULL, TRUE); } - return(FALSE); } -static void setspbjmp(HWND hWnd, BYTE value, BYTE bit) { +static void setspbjmp(HWND hWnd, UINT8 value, UINT8 bit) { if ((spb ^ value) & bit) { spb &= ~bit; @@ -771,68 +756,44 @@ static void setspbjmp(HWND hWnd, BYTE va } } -static void setspbVRch(HWND hWnd) { - - Button_SetCheck(GetDlgItem(hWnd, IDC_SPBVRL), spbvrc & 1); - Button_SetCheck(GetDlgItem(hWnd, IDC_SPBVRR), spbvrc & 2); -} +static UINT8 getspbVRch(HWND hWnd) { -static BYTE getspbVRch(HWND hWnd) { + UINT8 ret; - BYTE ret = 0; - - if (Button_GetCheck(GetDlgItem(hWnd, IDC_SPBVRL))) { - ret++; + ret = 0; + if (GetDlgItemCheck(hWnd, IDC_SPBVRL)) { + ret += 1; } - if (Button_GetCheck(GetDlgItem(hWnd, IDC_SPBVRR))) { + if (GetDlgItemCheck(hWnd, IDC_SPBVRR)) { ret += 2; } return(ret); } - static LRESULT CALLBACK SPBoptDlgProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { - BYTE b, bit; - RECT rect1; - RECT rect2; - POINT p; + UINT8 b; UINT update; switch(msg) { case WM_INITDIALOG: - spb = np2cfg.spbopt; - SETnLISTSTR(hWnd, IDC_SPBIO, sndioport, 2); - setsnd26iopara(GetDlgItem(hWnd, IDC_SPBIO), spb); - SETLISTSTR(hWnd, IDC_SPBINT, sndinterrupt); - setsnd26intpara(GetDlgItem(hWnd, IDC_SPBINT), spb); - SETLISTSTR(hWnd, IDC_SPBROM, sndromaddr); - setsnd26rompara(GetDlgItem(hWnd, IDC_SPBROM), spb); - spbvrc = np2cfg.spb_vrc; // ver0.30 - setspbVRch(hWnd); - SendDlgItemMessage(hWnd, IDC_SPBVRLEVEL, TBM_SETRANGE, TRUE, - MAKELONG(0, 24)); - SendDlgItemMessage(hWnd, IDC_SPBVRLEVEL, TBM_SETPOS, TRUE, - np2cfg.spb_vrl); - Button_SetCheck(GetDlgItem(hWnd, IDC_SPBREVERSE), np2cfg.spb_x); - - oldidc_spbjmp = (SUBCLASSPROC)GetWindowLong(GetDlgItem(hWnd, - IDC_SPBJMP), GWL_WNDPROC); - SetWindowLong(GetDlgItem(hWnd, IDC_SPBJMP), GWL_WNDPROC, - (LONG)spbjmp); + spbcreate(hWnd); return(TRUE); case WM_COMMAND: - switch (LOWORD(wp)) { + switch(LOWORD(wp)) { case IDC_SPBIO: setspbjmp(hWnd, getsnd26io(hWnd, IDC_SPBIO), 0x10); break; + case IDC_SPBINT: setspbjmp(hWnd, getsnd26int(hWnd, IDC_SPBINT), 0xc0); break; + case IDC_SPBROM: setspbjmp(hWnd, getsnd26rom(hWnd, IDC_SPBROM), 0x07); break; + case IDC_SPBDEF: spb = 0xd1; setsnd26iopara(GetDlgItem(hWnd, IDC_SPBIO), spb); @@ -842,6 +803,7 @@ static LRESULT CALLBACK SPBoptDlgProc(HW setspbVRch(hWnd); InvalidateRect(GetDlgItem(hWnd, IDC_SPBJMP), NULL, TRUE); break; + case IDC_SPBVRL: case IDC_SPBVRR: b = getspbVRch(hWnd); @@ -851,75 +813,15 @@ static LRESULT CALLBACK SPBoptDlgProc(HW NULL, TRUE); } break; + case IDC_SPBJMP: - GetWindowRect(GetDlgItem(hWnd, IDC_SPBJMP), &rect1); - GetClientRect(GetDlgItem(hWnd, IDC_SPBJMP), &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)) { - break; - } - if ((p.x >= 2) && (p.x < 5)) { - b = spb; - bit = 0x40 << (2 - p.y); - switch(p.x) { - case 2: - b |= bit; - break; - case 3: - b ^= bit; - break; - case 4: - b &= ~bit; - break; - } - if (spb != b) { - spb = b; - setsnd26intpara(GetDlgItem(hWnd, IDC_SPBINT), b); - InvalidateRect(GetDlgItem(hWnd, IDC_SPBJMP), - NULL, TRUE); - } - } - else if (p.x == 7) { - spb ^= 0x20; - InvalidateRect(GetDlgItem(hWnd, IDC_SPBJMP), - NULL, TRUE); - } - else if ((p.x >= 10) && (p.x < 12)) { - b = (BYTE)((p.x - 10) << 4); - if ((spb ^ b) & 0x10) { - spb &= ~0x10; - spb |= b; - setsnd26iopara(GetDlgItem(hWnd, IDC_SPBIO), b); - InvalidateRect(GetDlgItem(hWnd, IDC_SPBJMP), - NULL, TRUE); - } - } - else if ((p.x >= 14) && (p.x < 19)) { - b = (BYTE)(p.x - 14); - if ((spb ^ b) & 7) { - spb &= ~0x07; - spb |= b; - setsnd26rompara(GetDlgItem(hWnd, IDC_SPBROM), b); - InvalidateRect(GetDlgItem(hWnd, IDC_SPBJMP), - NULL, TRUE); - } - } - else if ((p.x >= 21) && (p.x < 24)) { - spbvrc ^= (BYTE)(3 - p.y); - setspbVRch(hWnd); - InvalidateRect(GetDlgItem(hWnd, IDC_SPBJMP), - NULL, TRUE); - } + spbcmdjmp(hWnd); break; } break; case WM_NOTIFY: - if ((((NMHDR *)lp)->code) == PSN_APPLY) { + if ((((NMHDR *)lp)->code) == (UINT)PSN_APPLY) { update = 0; if (np2cfg.spbopt != spb) { np2cfg.spbopt = spb; @@ -929,14 +831,14 @@ static LRESULT CALLBACK SPBoptDlgProc(HW np2cfg.spb_vrc = spbvrc; update |= SYS_UPDATECFG; } - b = (BYTE)SendDlgItemMessage(hWnd, IDC_SPBVRLEVEL, + b = (UINT8)SendDlgItemMessage(hWnd, IDC_SPBVRLEVEL, TBM_GETPOS, 0, 0); if (np2cfg.spb_vrl != b) { np2cfg.spb_vrl = b; update |= SYS_UPDATECFG; } -// FM_setVR(np2cfg.spb_vrc, np2cfg.spb_vrl); - b = (BYTE)(Button_GetCheck(GetDlgItem(hWnd, IDC_SPBREVERSE))? 1:0); + opngen_setVR(np2cfg.spb_vrc, np2cfg.spb_vrl); + b = (UINT8)GetDlgItemCheck(hWnd, IDC_SPBREVERSE); if (np2cfg.spb_x != b) { np2cfg.spb_x = b; update |= SYS_UPDATECFG; @@ -945,48 +847,55 @@ static LRESULT CALLBACK SPBoptDlgProc(HW return(TRUE); } break; + + case WM_DRAWITEM: + if (LOWORD(wp) == IDC_SPBJMP) { + dlgs_drawbmp(((LPDRAWITEMSTRUCT)lp)->hDC, + dipswbmp_getsndspb(spb, spbvrc)); + } + return(FALSE); } return(FALSE); } -// ----------------------------------------------------------- JOYPAD - // ver0.28 + +// ---- JOYPAD + typedef struct { - int res; - BYTE *ptr; - DWORD bit; -} CHKBTN_RES; - -const static CHKBTN_RES pad1opt[13] = { - {IDC_JOYPAD1, &np2oscfg.JOYPAD1, 0}, - {IDC_PAD1_1A, np2oscfg.JOY1BTN + 0, 0}, - {IDC_PAD1_1B, np2oscfg.JOY1BTN + 1, 0}, - {IDC_PAD1_1C, np2oscfg.JOY1BTN + 2, 0}, - {IDC_PAD1_1D, np2oscfg.JOY1BTN + 3, 0}, - {IDC_PAD1_2A, np2oscfg.JOY1BTN + 0, 1}, - {IDC_PAD1_2B, np2oscfg.JOY1BTN + 1, 1}, - {IDC_PAD1_2C, np2oscfg.JOY1BTN + 2, 1}, - {IDC_PAD1_2D, np2oscfg.JOY1BTN + 3, 1}, - {IDC_PAD1_RA, np2oscfg.JOY1BTN + 0, 2}, - {IDC_PAD1_RB, np2oscfg.JOY1BTN + 1, 2}, - {IDC_PAD1_RC, np2oscfg.JOY1BTN + 2, 2}, - {IDC_PAD1_RD, np2oscfg.JOY1BTN + 3, 2}}; - - -static void checkbtnres_load(HWND hWnd, const CHKBTN_RES *item) { - - Button_SetCheck(GetDlgItem(hWnd, item->res), - (*(item->ptr)) & (1 << (item->bit))); -} - -static BYTE checkbtnres_store(HWND hWnd, const CHKBTN_RES *item) { - - BYTE value; - BYTE bit; - BYTE ret; + UINT16 res; + UINT16 bit; + UINT8 *ptr; +} CHECKTBL; + +static const CHECKTBL pad1opt[13] = { + {IDC_JOYPAD1, 0, &np2oscfg.JOYPAD1}, + {IDC_PAD1_1A, 0, np2oscfg.JOY1BTN + 0}, + {IDC_PAD1_1B, 0, np2oscfg.JOY1BTN + 1}, + {IDC_PAD1_1C, 0, np2oscfg.JOY1BTN + 2}, + {IDC_PAD1_1D, 0, np2oscfg.JOY1BTN + 3}, + {IDC_PAD1_2A, 1, np2oscfg.JOY1BTN + 0}, + {IDC_PAD1_2B, 1, np2oscfg.JOY1BTN + 1}, + {IDC_PAD1_2C, 1, np2oscfg.JOY1BTN + 2}, + {IDC_PAD1_2D, 1, np2oscfg.JOY1BTN + 3}, + {IDC_PAD1_RA, 2, np2oscfg.JOY1BTN + 0}, + {IDC_PAD1_RB, 2, np2oscfg.JOY1BTN + 1}, + {IDC_PAD1_RC, 2, np2oscfg.JOY1BTN + 2}, + {IDC_PAD1_RD, 2, np2oscfg.JOY1BTN + 3}}; + + +static void checkbtnres_load(HWND hWnd, const CHECKTBL *item) { + + SetDlgItemCheck(hWnd, item->res, (*(item->ptr)) & (1 << (item->bit))); +} + +static UINT8 checkbtnres_store(HWND hWnd, const CHECKTBL *item) { + + UINT8 value; + UINT8 bit; + UINT8 ret; bit = 1 << (item->bit); - value = ((Button_GetCheck(GetDlgItem(hWnd, item->res)))?0xff:0) & bit; + value = GetDlgItemCheck(hWnd, item->res)?bit:0; ret = ((*(item->ptr)) ^ value) & bit; if (ret) { (*(item->ptr)) ^= bit; @@ -994,12 +903,11 @@ static BYTE checkbtnres_store(HWND hWnd, return(ret); } - static LRESULT CALLBACK PAD1optDlgProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { int i; - BYTE renewal; + UINT8 renewal; switch(msg) { case WM_INITDIALOG: @@ -1007,18 +915,18 @@ static LRESULT CALLBACK PAD1optDlgProc(H checkbtnres_load(hWnd, pad1opt + i); } if (np2oscfg.JOYPAD1 & 2) { - Button_Enable(GetDlgItem(hWnd, IDC_JOYPAD1), FALSE); + EnableWindow(GetDlgItem(hWnd, IDC_JOYPAD1), FALSE); } return(TRUE); case WM_NOTIFY: - if ((((NMHDR *)lp)->code) == PSN_APPLY) { + if ((((NMHDR *)lp)->code) == (UINT)PSN_APPLY) { renewal = 0; for (i=0; i<13; i++) { renewal |= checkbtnres_store(hWnd, pad1opt + i); } if (renewal) { - joy_init(); + joymng_initialize(); sysmng_update(SYS_UPDATECFG); } return(TRUE); @@ -1029,16 +937,16 @@ static LRESULT CALLBACK PAD1optDlgProc(H } -// -------------------------------------------------------------------------- +// ---- void dialog_sndopt(HWND hWnd) { HINSTANCE hinst; PROPSHEETPAGE psp; PROPSHEETHEADER psh; - HPROPSHEETPAGE hpsp[6]; // ver0.29 + HPROPSHEETPAGE hpsp[6]; - hinst = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE); + hinst = GetWindowInst(hWnd); ZeroMemory(&psp, sizeof(psp)); psp.dwSize = sizeof(PROPSHEETPAGE); @@ -1071,37 +979,75 @@ void dialog_sndopt(HWND hWnd) { ZeroMemory(&psh, sizeof(psh)); psh.dwSize = sizeof(PROPSHEETHEADER); - psh.dwFlags = PSH_NOAPPLYNOW; + psh.dwFlags = PSH_NOAPPLYNOW | PSH_USEHICON | PSH_USECALLBACK; psh.hwndParent = hWnd; psh.hInstance = hinst; - psh.nPages = 6; // ver0.29 + psh.hIcon = LoadIcon(hinst, MAKEINTRESOURCE(IDI_ICON2)); + psh.nPages = 6; psh.phpage = hpsp; psh.pszCaption = str_sndopt; + psh.pfnCallback = np2class_propetysheet; PropertySheet(&psh); - InvalidateRect(hWndMain, NULL, TRUE); + InvalidateRect(hWnd, NULL, TRUE); } // ---- -static const char s98ui_file[] = "NP2_%04d.S98"; -static const char s98ui_title[] = "Save as S98 log"; -static const char s98ui_ext[] = "s98"; -static const char s98ui_filter[] = "S98 log (*.s98)\0*.s98\0"; +#if defined(SUPPORT_S98) +static const OEMCHAR s98ui_file[] = OEMTEXT("NP2_%04d.S98"); +static const TCHAR s98ui_title[] = _T("Save as S98 log"); +static const TCHAR s98ui_ext[] = _T("s98"); +static const TCHAR s98ui_filter[] = _T("S98 log (*.s98)\0*.s98\0"); static const FILESEL s98ui = {s98ui_title, s98ui_ext, s98ui_filter, 1}; void dialog_s98(HWND hWnd) { BOOL check; -const char *p; + OEMCHAR path[MAX_PATH]; S98_close(); check = FALSE; - p = dlgs_selectwritenum(hWnd, &s98ui, s98ui_file, - bmpfilefolder, sizeof(bmpfilefolder)); - if ((p != NULL) && (S98_open(p) == SUCCESS)) { + file_cpyname(path, bmpfilefolder, NELEMENTS(path)); + file_cutname(path); + file_catname(path, s98ui_file, NELEMENTS(path)); + if ((dlgs_selectwritenum(hWnd, &s98ui, path, NELEMENTS(path))) && + (S98_open(path) == SUCCESS)) { + file_cpyname(bmpfilefolder, path, NELEMENTS(bmpfilefolder)); + sysmng_update(SYS_UPDATEOSCFG); check = TRUE; } xmenu_sets98logging(check); } +#endif + + +// ---- + +#if defined(SUPPORT_WAVEREC) +static const OEMCHAR wrui_file[] = OEMTEXT("NP2_%04d.WAV"); +static const TCHAR wrui_title[] = _T("Save as Sound"); +static const TCHAR wrui_ext[] = _T("WAV"); +static const TCHAR wrui_filter[] = _T("Wave files (*.wav)\0*.wav\0"); +static const FILESEL wrui = {wrui_title, wrui_ext, wrui_filter, 1}; + +void dialog_waverec(HWND hWnd) { + + UINT8 check; + OEMCHAR path[MAX_PATH]; + + check = FALSE; + sound_recstop(); + file_cpyname(path, bmpfilefolder, NELEMENTS(path)); + file_cutname(path); + file_catname(path, wrui_file, NELEMENTS(path)); + if ((dlgs_selectwritenum(hWnd, &wrui, path, NELEMENTS(path))) && + (sound_recstart(path) == SUCCESS)) { + file_cpyname(bmpfilefolder, path, NELEMENTS(bmpfilefolder)); + sysmng_update(SYS_UPDATEOSCFG); + check = TRUE; + } + xmenu_setwaverec(check); +} +#endif