/* Pcsx - Pc Psx Emulator * Copyright (C) 1999-2002 Pcsx Team * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include #include #include "resource.h" #include "AboutDlg.h" #include "PsxCommon.h" #include "plugin.h" #include "Debug.h" #include "Win32.h" int AccBreak=0; int ConfPlug=0; int StatesC=0; int NeedReset=1; int cdOpenCase=0; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { gApp.hInstance = hInstance; Running=0; GetCurrentDirectory(256, PcsxDir); memset(&Config, 0, sizeof(PcsxConfig)); if (LoadConfig() == -1) { Config.PsxAuto = 1; strcpy(Config.PluginsDir, "Plugin\\"); strcpy(Config.BiosDir, "Bios\\"); SysMessage("Pcsx needs to be configured"); ConfPlug=1; ConfigurePlugins(gApp.hWnd); DialogBox(gApp.hInstance, MAKEINTRESOURCE(IDD_MCDCONF), gApp.hWnd, (DLGPROC)ConfigureMcdsDlgProc); SysMessage("Pcsx now will quit, restart it"); return 0; } if (SysInit() == -1) return 1; CreateMainWindow(nCmdShow); RunGui(); return 0; } void RunGui() { MSG msg; PeekMessage(&msg, NULL, 0U, 0U, PM_NOREMOVE); for (;;) { if(PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } } } void OpenConsole() { if (hConsole) return; AllocConsole(); SetConsoleTitle("Psx Output"); hConsole = GetStdHandle(STD_OUTPUT_HANDLE); } void CloseConsole() { FreeConsole(); hConsole = NULL; } LRESULT WINAPI MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { char File[256]; switch (msg) { case WM_COMMAND: switch (LOWORD(wParam)) { case ID_FILE_EXIT: SysClose(); PostQuitMessage(0); exit(0); return TRUE; case ID_FILE_RUN_CD: LoadCdBios = 0; SetMenu(hWnd, NULL); OpenPlugins(hWnd); SysReset(); NeedReset = 0; CheckCdrom(); if (LoadCdrom() == -1) { ClosePlugins(); AccBreak = 1; DestroyWindow(gApp.hWnd); CreateMainWindow(SW_SHOWNORMAL); SetMenu(gApp.hWnd, gApp.hMenu); SetCursor(LoadCursor(gApp.hInstance, IDC_ARROW)); ShowCursor(TRUE); SysMessage("Could not load Cdrom\n"); return TRUE; } ShowCursor(FALSE); Running = 1; psxCpu->Execute(); return TRUE; case ID_FILE_RUNCDBIOS: LoadCdBios = 1; SetMenu(hWnd, NULL); OpenPlugins(hWnd); ShowCursor(FALSE); CheckCdrom(); SysReset(); NeedReset = 0; Running = 1; psxCpu->Execute(); return TRUE; case ID_FILE_RUN_EXE: if (!Open_File_Proc(File)) return TRUE; SetMenu(hWnd, NULL); OpenPlugins(hWnd); SysReset(); NeedReset = 0; Load(File); Running = 1; psxCpu->Execute(); return TRUE; case ID_EMULATOR_RUN: SetMenu(hWnd, NULL); OpenPlugins(hWnd); ShowCursor(FALSE); if (NeedReset) { SysReset(); NeedReset = 0; } Running = 1; psxCpu->Execute(); return TRUE; case ID_EMULATOR_RESET: NeedReset = 1; return TRUE; case ID_CONFIGURATION_GRAPHICS: GPU_configure(); return TRUE; case ID_CONFIGURATION_SOUND: SPU_configure(); return TRUE; case ID_CONFIGURATION_CONTROLLERS: PAD1_configure(); if (strcmp(Config.Pad1, Config.Pad2)) PAD2_configure(); return TRUE; case ID_CONFIGURATION_CDROM: CDR_configure(); return TRUE; case ID_CONFIGURATION_MEMORYCARDMANAGER: DialogBox(gApp.hInstance, MAKEINTRESOURCE(IDD_MCDCONF), hWnd, (DLGPROC)ConfigureMcdsDlgProc); return TRUE; case ID_CONFIGURATION_CPU: DialogBox(gApp.hInstance, MAKEINTRESOURCE(IDD_CPUCONF), hWnd, (DLGPROC)ConfigureCpuDlgProc); return TRUE; case ID_CONFIGURATION: ConfigurePlugins(hWnd); return TRUE; case ID_HELP_HELP: ShellExecute(NULL, "open", "Readme.txt", NULL, NULL, SW_SHOWNORMAL); return TRUE; case ID_HELP_ABOUT: DialogBox(gApp.hInstance, MAKEINTRESOURCE(ABOUT_DIALOG), hWnd, (DLGPROC)AboutDlgProc); return TRUE; } break; case WM_SYSKEYDOWN: if (wParam != VK_F10) return DefWindowProc(hWnd, msg, wParam, lParam); case WM_KEYDOWN: PADhandleKey(wParam); return TRUE; case WM_DESTROY: if (!AccBreak) { if (Running) ClosePlugins(); SysClose(); PostQuitMessage(0); exit(0); } else AccBreak = 0; return TRUE; case WM_CREATE: gApp.hMenu = LoadMenu(gApp.hInstance, MAKEINTRESOURCE(IDR_MENU1)); SetMenu(hWnd, gApp.hMenu); break; case WM_QUIT: exit(0); break; default: return DefWindowProc(hWnd, msg, wParam, lParam); } return FALSE; } HWND mcdDlg; McdBlock Blocks[2][15]; int IconC[2][15]; HIMAGELIST Iiml[2]; HICON eICON; void CreateListView(int idc) { HWND List; LV_COLUMN col; List = GetDlgItem(mcdDlg, idc); col.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; col.fmt = LVCFMT_LEFT; col.pszText = "Title"; col.cx = 170; col.iSubItem = 0; ListView_InsertColumn(List, 0, &col); col.pszText = "Status"; col.cx = 50; col.iSubItem = 1; ListView_InsertColumn(List, 1, &col); col.pszText = "Game ID"; col.cx = 90; col.iSubItem = 2; ListView_InsertColumn(List, 2, &col); col.pszText = "Game"; col.cx = 80; col.iSubItem = 3; ListView_InsertColumn(List, 3, &col); } int GetRGB() { HDC scrDC, memDC; HBITMAP oldBmp = NULL; HBITMAP curBmp = NULL; COLORREF oldColor; COLORREF curColor = RGB(255,255,255); int i, R, G, B; R = G = B = 1; scrDC = CreateDC("DISPLAY", NULL, NULL, NULL); memDC = CreateCompatibleDC(NULL); curBmp = CreateCompatibleBitmap(scrDC, 1, 1); oldBmp = (HBITMAP)SelectObject(memDC, curBmp); for (i = 255; i >= 0; --i) { oldColor = curColor; curColor = SetPixel(memDC, 0, 0, RGB(i, i, i)); if (GetRValue(curColor) < GetRValue(oldColor)) ++R; if (GetGValue(curColor) < GetGValue(oldColor)) ++G; if (GetBValue(curColor) < GetBValue(oldColor)) ++B; } DeleteObject(oldBmp); DeleteObject(curBmp); DeleteDC(scrDC); DeleteDC(memDC); return (R * G * B); } HICON GetIcon(short *icon) { ICONINFO iInfo; HDC hDC; char mask[16*16]; int x, y, c, Depth; hDC = CreateIC("DISPLAY",NULL,NULL,NULL); Depth=GetDeviceCaps(hDC, BITSPIXEL); DeleteDC(hDC); if (Depth == 16) { if (GetRGB() == (32 * 32 * 32)) Depth = 15; } for (y=0; y<16; y++) { for (x=0; x<16; x++) { c = icon[y*16+x]; if (Depth == 15) c = ((c&0x001f) << 10) | ((c&0x7c00) >> 10) | (c&0x03e0); else c = (c&0x001f) | ((c&0x7c00) << 1) | ((c&0x03e0) << 1); icon[y*16+x] = c; } } iInfo.fIcon = TRUE; memset(mask, 0, 16*16); iInfo.hbmMask = CreateBitmap(16, 16, 1, 1, mask); iInfo.hbmColor = CreateBitmap(16, 16, 1, 16, icon); return CreateIconIndirect(&iInfo); } HICON hICON[2][3][15]; int aIover[2]; int ani[2]; void LoadMcdItems(int mcd, int idc) { HWND List = GetDlgItem(mcdDlg, idc); LV_ITEM item; HIMAGELIST iml = Iiml[mcd-1]; int i, j; HICON hIcon; McdBlock *Info; aIover[mcd-1]=0; ani[mcd-1]=0; ListView_DeleteAllItems(List); for (i=0; i<15; i++) { item.mask = LVIF_TEXT | LVIF_IMAGE; item.iItem = i; item.iImage = i; item.pszText = LPSTR_TEXTCALLBACK; item.iSubItem = 0; IconC[mcd-1][i] = 0; Info = &Blocks[mcd-1][i]; if ((Info->Flags & 0xF) == 1 && Info->IconCount != 0) { hIcon = GetIcon(Info->Icon); if (Info->IconCount > 1) { for(j = 0; j < 3; j++) hICON[mcd-1][j][i]=hIcon; } } else { hIcon = eICON; } ImageList_ReplaceIcon(iml, -1, hIcon); ListView_InsertItem(List, &item); } } void UpdateMcdItems(int mcd, int idc) { HWND List = GetDlgItem(mcdDlg, idc); LV_ITEM item; HIMAGELIST iml = Iiml[mcd-1]; int i, j; McdBlock *Info; HICON hIcon; aIover[mcd-1]=0; ani[mcd-1]=0; for (i=0; i<15; i++) { item.mask = LVIF_TEXT | LVIF_IMAGE; item.iItem = i; item.iImage = i; item.pszText = LPSTR_TEXTCALLBACK; item.iSubItem = 0; IconC[mcd-1][i] = 0; Info = &Blocks[mcd-1][i]; if ((Info->Flags & 0xF) == 1 && Info->IconCount != 0) { hIcon = GetIcon(Info->Icon); if (Info->IconCount > 1) { for(j = 0; j < 3; j++) hICON[mcd-1][j][i]=hIcon; } } else { hIcon = eICON; } ImageList_ReplaceIcon(iml, i, hIcon); ListView_SetItem(List, &item); } ListView_Update(List, -1); } void McdListGetDispInfo(int mcd, int idc, LPNMHDR pnmh) { LV_DISPINFO *lpdi = (LV_DISPINFO *)pnmh; McdBlock *Info; Info = &Blocks[mcd-1][lpdi->item.iItem]; switch (lpdi->item.iSubItem) { case 0: switch (Info->Flags & 0xF) { case 1: lpdi->item.pszText = Info->Title; break; case 2: lpdi->item.pszText = "mid link block"; break; case 3: lpdi->item.pszText = "terminiting link block"; break; } break; case 1: if ((Info->Flags & 0xF0) == 0xA0) { if ((Info->Flags & 0xF) >= 1 && (Info->Flags & 0xF) <= 3) { lpdi->item.pszText = "Deleted"; } else lpdi->item.pszText = "Free"; } else if ((Info->Flags & 0xF0) == 0x50) lpdi->item.pszText = "Used"; else { lpdi->item.pszText = "Free"; } break; case 2: if((Info->Flags & 0xF)==1) lpdi->item.pszText = Info->ID; break; case 3: if((Info->Flags & 0xF)==1) lpdi->item.pszText = Info->Name; break; } } void McdListNotify(int mcd, int idc, LPNMHDR pnmh) { switch (pnmh->code) { case LVN_GETDISPINFO: McdListGetDispInfo(mcd, idc, pnmh); break; } } void UpdateMcdDlg() { int i; for (i=1; i<16; i++) GetMcdBlockInfo(1, i, &Blocks[0][i-1]); for (i=1; i<16; i++) GetMcdBlockInfo(2, i, &Blocks[1][i-1]); UpdateMcdItems(1, IDC_LIST1); UpdateMcdItems(2, IDC_LIST2); } void LoadMcdDlg() { int i; for (i=1; i<16; i++) GetMcdBlockInfo(1, i, &Blocks[0][i-1]); for (i=1; i<16; i++) GetMcdBlockInfo(2, i, &Blocks[1][i-1]); LoadMcdItems(1, IDC_LIST1); LoadMcdItems(2, IDC_LIST2); } void UpdateMcdIcon(int mcd, int idc) { HWND List = GetDlgItem(mcdDlg, idc); HIMAGELIST iml = Iiml[mcd-1]; int i; McdBlock *Info; int *count; if(!aIover[mcd-1]) { ani[mcd-1]++; for (i=0; i<15; i++) { Info = &Blocks[mcd-1][i]; count = &IconC[mcd-1][i]; if ((Info->Flags & 0xF) != 1) continue; if (Info->IconCount <= 1) continue; if (*count < Info->IconCount) { (*count)++; aIover[mcd-1]=0; if(ani[mcd-1] <= (Info->IconCount-1)) // last frame and below... hICON[mcd-1][ani[mcd-1]][i] = GetIcon(&Info->Icon[(*count)*16*16]); } else { aIover[mcd-1]=1; } } } else { if (ani[mcd-1] > 1) ani[mcd-1] = 0; // 1st frame else ani[mcd-1]++; // 2nd, 3rd frame for(i=0;i<15;i++) { // RECT rect, hrect; Info = &Blocks[mcd-1][i]; if (((Info->Flags & 0xF) == 1) && (Info->IconCount > 1)) ImageList_ReplaceIcon(iml, i, hICON[mcd-1][ani[mcd-1]][i]); /* GetWindowRect(List, &hrect); ListView_GetItemRect(List, i, &rect, LVIR_ICON); rect.left+= hrect.left; rect.right+= hrect.left; rect.top+= hrect.top; rect.bottom+= hrect.top; // rect.left-= 12; rect.right-= 12; // quick fix InvalidateRect(mcdDlg, &rect, FALSE);*/ } ListView_Update(List, 0); } } static int copy = 0, copymcd = 0; static int listsel = 0; BOOL CALLBACK ConfigureMcdsDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) { char str[256]; LPBYTE lpAND, lpXOR; LPBYTE lpA, lpX; int i, j; switch(uMsg) { case WM_INITDIALOG: mcdDlg = hW; lpA=lpAND=(LPBYTE)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(16*16)); lpX=lpXOR=(LPBYTE)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(16*16)); for(i=0;i<16;i++) { for(j=0;j<16;j++) { *lpA++=0xff; *lpX++=0; } } eICON=CreateIcon(gApp.hInstance,16,16,1,1,lpAND,lpXOR); HeapFree(GetProcessHeap(),0,lpAND); HeapFree(GetProcessHeap(),0,lpXOR); if (!strlen(Config.Mcd1)) strcpy(Config.Mcd1, "memcards\\Mcd001.mcr"); if (!strlen(Config.Mcd2)) strcpy(Config.Mcd2, "memcards\\Mcd002.mcr"); Edit_SetText(GetDlgItem(hW,IDC_MCD1), Config.Mcd1); Edit_SetText(GetDlgItem(hW,IDC_MCD2), Config.Mcd2); CreateListView(IDC_LIST1); CreateListView(IDC_LIST2); Iiml[0] = ImageList_Create(16, 16, ILC_COLOR16, 0, 0); Iiml[1] = ImageList_Create(16, 16, ILC_COLOR16, 0, 0); ListView_SetImageList(GetDlgItem(mcdDlg, IDC_LIST1), Iiml[0], LVSIL_SMALL); ListView_SetImageList(GetDlgItem(mcdDlg, IDC_LIST2), Iiml[1], LVSIL_SMALL); Button_Enable(GetDlgItem(hW, IDC_PASTE), FALSE); LoadMcdDlg(); SetTimer(hW, 1, 250, NULL); return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_COPYTO1: copy = ListView_GetSelectionMark(GetDlgItem(mcdDlg, IDC_LIST2)); copymcd = 1; Button_Enable(GetDlgItem(hW, IDC_PASTE), TRUE); return TRUE; case IDC_COPYTO2: copy = ListView_GetSelectionMark(GetDlgItem(mcdDlg, IDC_LIST1)); copymcd = 2; Button_Enable(GetDlgItem(hW, IDC_PASTE), TRUE); return TRUE; case IDC_PASTE: if (MessageBox(hW, "Are you sure you want to paste this selection?", "Confirmation", MB_YESNO) == IDNO) return TRUE; if (copymcd == 1) { Edit_GetText(GetDlgItem(hW,IDC_MCD1), str, 256); i = ListView_GetSelectionMark(GetDlgItem(mcdDlg, IDC_LIST1)); // save dir data + save data memcpy(Mcd1Data + (i+1) * 128, Mcd2Data + (copy+1) * 128, 128); SaveMcd(str, Mcd1Data, (i+1) * 128, 128); memcpy(Mcd1Data + (i+1) * 1024 * 8, Mcd2Data + (copy+1) * 1024 * 8, 1024 * 8); SaveMcd(str, Mcd1Data, (i+1) * 1024 * 8, 1024 * 8); } else { // 2 Edit_GetText(GetDlgItem(hW,IDC_MCD2), str, 256); i = ListView_GetSelectionMark(GetDlgItem(mcdDlg, IDC_LIST2)); // save dir data + save data memcpy(Mcd2Data + (i+1) * 128, Mcd1Data + (copy+1) * 128, 128); SaveMcd(str, Mcd2Data, (i+1) * 128, 128); memcpy(Mcd2Data + (i+1) * 1024 * 8, Mcd1Data + (copy+1) * 1024 * 8, 1024 * 8); SaveMcd(str, Mcd2Data, (i+1) * 1024 * 8, 1024 * 8); } UpdateMcdDlg(); return TRUE; case IDC_DELETE1: { McdBlock *Info; int mcd = 1; int i, xor = 0, j; unsigned char *data, *ptr; Edit_GetText(GetDlgItem(hW,IDC_MCD1), str, 256); i = ListView_GetSelectionMark(GetDlgItem(mcdDlg, IDC_LIST1)); data = Mcd1Data; i++; ptr = data + i * 128; Info = &Blocks[mcd-1][i-1]; if ((Info->Flags & 0xF0) == 0xA0) { if ((Info->Flags & 0xF) >= 1 && (Info->Flags & 0xF) <= 3) { // deleted *ptr = 0x50 | (Info->Flags & 0xF); } else return TRUE; } else if ((Info->Flags & 0xF0) == 0x50) { // used *ptr = 0xA0 | (Info->Flags & 0xF); } else { return TRUE; } for (j=0; j<127; j++) xor^=*ptr++; *ptr = xor; SaveMcd(str, data, i * 128, 128); UpdateMcdDlg(); } return TRUE; case IDC_DELETE2: { McdBlock *Info; int mcd = 2; int i, xor = 0, j; unsigned char *data, *ptr; Edit_GetText(GetDlgItem(hW,IDC_MCD2), str, 256); i = ListView_GetSelectionMark(GetDlgItem(mcdDlg, IDC_LIST2)); data = Mcd2Data; i++; ptr = data + i * 128; Info = &Blocks[mcd-1][i-1]; if ((Info->Flags & 0xF0) == 0xA0) { if ((Info->Flags & 0xF) >= 1 && (Info->Flags & 0xF) <= 3) { // deleted *ptr = 0x50 | (Info->Flags & 0xF); } else return TRUE; } else if ((Info->Flags & 0xF0) == 0x50) { // used *ptr = 0xA0 | (Info->Flags & 0xF); } else { return TRUE; } for (j=0; j<127; j++) xor^=*ptr++; *ptr = xor; SaveMcd(str, data, i * 128, 128); UpdateMcdDlg(); } return TRUE; case IDC_MCDSEL1: Open_Mcd_Proc(hW, 1); return TRUE; case IDC_MCDSEL2: Open_Mcd_Proc(hW, 2); return TRUE; case IDC_RELOAD1: Edit_GetText(GetDlgItem(hW,IDC_MCD1), str, 256); LoadMcd(1, str); UpdateMcdDlg(); return TRUE; case IDC_RELOAD2: Edit_GetText(GetDlgItem(hW,IDC_MCD2), str, 256); LoadMcd(2, str); UpdateMcdDlg(); return TRUE; case IDC_FORMAT1: if (MessageBox(hW, "Are you sure you want to format this Memory Card?", "Confirmation", MB_YESNO) == IDNO) return TRUE; Edit_GetText(GetDlgItem(hW,IDC_MCD1), str, 256); CreateMcd(str); LoadMcd(1, str); UpdateMcdDlg(); return TRUE; case IDC_FORMAT2: if (MessageBox(hW, "Are you sure you want to format this Memory Card?", "Confirmation", MB_YESNO) == IDNO) return TRUE; Edit_GetText(GetDlgItem(hW,IDC_MCD2), str, 256); CreateMcd(str); LoadMcd(2, str); UpdateMcdDlg(); return TRUE; case IDCANCEL: LoadMcds(Config.Mcd1, Config.Mcd2); EndDialog(hW,FALSE); return TRUE; case IDOK: Edit_GetText(GetDlgItem(hW,IDC_MCD1), Config.Mcd1, 256); Edit_GetText(GetDlgItem(hW,IDC_MCD2), Config.Mcd2, 256); LoadMcds(Config.Mcd1, Config.Mcd2); SaveConfig(); EndDialog(hW,TRUE); return TRUE; } case WM_NOTIFY: switch (wParam) { case IDC_LIST1: McdListNotify(1, IDC_LIST1, (LPNMHDR)lParam); break; case IDC_LIST2: McdListNotify(2, IDC_LIST2, (LPNMHDR)lParam); break; } return TRUE; case WM_TIMER: UpdateMcdIcon(1, IDC_LIST1); UpdateMcdIcon(2, IDC_LIST2); return TRUE; case WM_DESTROY: DestroyIcon(eICON); //KillTimer(hW, 1); return TRUE; } return FALSE; } BOOL CALLBACK ConfigureCpuDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam) { long tmp; switch(uMsg) { case WM_INITDIALOG: Button_SetCheck(GetDlgItem(hW,IDC_XA), Config.Xa); Button_SetCheck(GetDlgItem(hW,IDC_SIO), Config.Sio); Button_SetCheck(GetDlgItem(hW,IDC_MDEC), Config.Mdec); Button_SetCheck(GetDlgItem(hW,IDC_QKEYS), Config.QKeys); Button_SetCheck(GetDlgItem(hW,IDC_CDDA), Config.Cdda); Button_SetCheck(GetDlgItem(hW,IDC_PSXAUTO), Config.PsxAuto); Button_SetCheck(GetDlgItem(hW,IDC_CPU), Config.Cpu); Button_SetCheck(GetDlgItem(hW,IDC_PSXOUT), Config.PsxOut); Button_SetCheck(GetDlgItem(hW,IDC_SPUIRQ), Config.SpuIrq); Button_SetCheck(GetDlgItem(hW,IDC_CDTIMING),Config.CdTiming); ComboBox_AddString(GetDlgItem(hW,IDC_PSXTYPES),"NTSC"); ComboBox_AddString(GetDlgItem(hW,IDC_PSXTYPES),"PAL"); ComboBox_SetCurSel(GetDlgItem(hW,IDC_PSXTYPES),Config.PsxType); case WM_COMMAND: { switch (LOWORD(wParam)) { case IDCANCEL: EndDialog(hW,FALSE); return TRUE; case IDOK: tmp = ComboBox_GetCurSel(GetDlgItem(hW,IDC_PSXTYPES)); if (tmp == 0) Config.PsxType = 0; else Config.PsxType = 1; Config.Xa = Button_GetCheck(GetDlgItem(hW,IDC_XA)); Config.Sio = Button_GetCheck(GetDlgItem(hW,IDC_SIO)); Config.Mdec = Button_GetCheck(GetDlgItem(hW,IDC_MDEC)); Config.QKeys = Button_GetCheck(GetDlgItem(hW,IDC_QKEYS)); Config.Cdda = Button_GetCheck(GetDlgItem(hW,IDC_CDDA)); Config.PsxAuto = Button_GetCheck(GetDlgItem(hW,IDC_PSXAUTO)); tmp = Config.Cpu; Config.Cpu = Button_GetCheck(GetDlgItem(hW,IDC_CPU)); if (tmp != Config.Cpu) { psxCpu->Shutdown(); if (Config.Cpu) psxCpu = &psxInt; else psxCpu = &psxRec; if (psxCpu->Init() == -1) { SysClose(); exit(1); } psxCpu->Reset(); } Config.PsxOut = Button_GetCheck(GetDlgItem(hW,IDC_PSXOUT)); Config.SpuIrq = Button_GetCheck(GetDlgItem(hW,IDC_SPUIRQ)); Config.CdTiming= Button_GetCheck(GetDlgItem(hW,IDC_CDTIMING)); SaveConfig(); EndDialog(hW,TRUE); if (Config.PsxOut) OpenConsole(); else CloseConsole(); return TRUE; } } } return FALSE; } #define MAXFILENAME 256 void Open_Mcd_Proc(HWND hW, int mcd) { OPENFILENAME ofn; char szFileName[MAXFILENAME]; char szFileTitle[MAXFILENAME]; memset(&szFileName, 0, sizeof(szFileName)); memset(&szFileTitle, 0, sizeof(szFileTitle)); ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hW; ofn.lpstrFilter = "Psx Mcd Format (*.mcr;*.mc;*.mem;*.vgs;*.mcd;*.gme;*.ddf)\0*.mcr;*.mcd;*.mem;*.gme;*.mc;*.ddf\0Psx Memory Card (*.mcr;*.mc)\0*.mcr;0*.mc\0CVGS Memory Card (*.mem;*.vgs)\0*.mem;*.vgs\0Bleem Memory Card (*.mcd)\0*.mcd\0DexDrive Memory Card (*.gme)\0*.gme\0DataDeck Memory Card (*.ddf)\0*.ddf\0";; ofn.lpstrCustomFilter = NULL; ofn.nMaxCustFilter = 0; ofn.nFilterIndex = 1; ofn.lpstrFile = szFileName; ofn.nMaxFile = MAXFILENAME; ofn.lpstrInitialDir = "memcards"; ofn.lpstrFileTitle = szFileTitle; ofn.nMaxFileTitle = MAXFILENAME; ofn.lpstrTitle = NULL; ofn.lpstrDefExt = "MCR"; ofn.Flags = OFN_HIDEREADONLY | OFN_NOCHANGEDIR; if (GetOpenFileName ((LPOPENFILENAME)&ofn)) { Edit_SetText(GetDlgItem(hW,mcd == 1 ? IDC_MCD1 : IDC_MCD2), szFileName); LoadMcd(mcd, szFileName); UpdateMcdDlg(); } } int Open_File_Proc(char *file) { OPENFILENAME ofn; char szFileName[MAXFILENAME]; char szFileTitle[MAXFILENAME]; memset(&szFileName, 0, sizeof(szFileName)); memset(&szFileTitle, 0, sizeof(szFileTitle)); ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = gApp.hWnd; ofn.lpstrFilter = "Psx Exe Format\0*.*;*.*\0"; ofn.lpstrCustomFilter = NULL; ofn.nMaxCustFilter = 0; ofn.nFilterIndex = 1; ofn.lpstrFile = szFileName; ofn.nMaxFile = MAXFILENAME; ofn.lpstrInitialDir = NULL; ofn.lpstrFileTitle = szFileTitle; ofn.nMaxFileTitle = MAXFILENAME; ofn.lpstrTitle = NULL; ofn.lpstrDefExt = "EXE"; ofn.Flags = OFN_HIDEREADONLY | OFN_NOCHANGEDIR; if (GetOpenFileName ((LPOPENFILENAME)&ofn)) { strcpy(file, szFileName); return 1; } else return 0; } void CreateMainWindow(int nCmdShow) { char strTitle[20]; WNDCLASS wc; HWND hWnd; HDC hdc; HPEN hpen; LoadString(gApp.hInstance, IDS_TITLE, strTitle, 20); wc.lpszClassName = "P©SX Main"; wc.lpfnWndProc = MainWndProc; wc.style = 0; wc.hInstance = gApp.hInstance; wc.hIcon = LoadIcon(gApp.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); wc.hCursor = NULL; wc.hbrBackground = (HBRUSH)(COLOR_MENUTEXT); wc.lpszMenuName = 0; wc.cbClsExtra = 0; wc.cbWndExtra = 0; RegisterClass(&wc); hWnd = CreateWindow("P©SX Main", strTitle, WS_OVERLAPPED | WS_SYSMENU, 20, 20, 320, 240, NULL, NULL, gApp.hInstance, NULL); gApp.hWnd = hWnd; hdc = GetDC(hWnd); hpen = CreatePen(PS_SOLID, 0, 0xffffff); SelectObject(hdc, hpen); ShowWindow(hWnd, nCmdShow); } int SysInit() { if (Config.PsxOut) OpenConsole(); if (psxInit() == -1) return -1; #ifdef GTE_DUMP gteLog = fopen("gteLog.txt","w"); #endif #ifdef EMU_LOG emuLog = fopen("emuLog.txt","w"); setvbuf(emuLog, NULL, _IONBF, 0); #endif LoadPlugins(); LoadMcds(Config.Mcd1, Config.Mcd2); return 0; } void SysReset() { psxReset(); } void SysClose() { psxShutdown(); ReleasePlugins(); if (Config.PsxOut) CloseConsole(); if (emuLog != NULL) fclose(emuLog); #ifdef GTE_DUMP if (gteLog != NULL) fclose(gteLog); #endif } void SysPrintf(char *fmt, ...) { va_list list; char msg[512]; DWORD tmp; if (!hConsole) return; va_start(list,fmt); vsprintf(msg,fmt,list); va_end(list); WriteConsole(hConsole, msg, (DWORD)strlen(msg), &tmp, 0); #ifdef EMU_LOG #ifndef LOG_STDOUT fprintf(emuLog, "%s", msg); #endif #endif } void SysMessage(char *fmt, ...) { va_list list; char tmp[512]; va_start(list,fmt); vsprintf(tmp,fmt,list); va_end(list); MessageBox(0, tmp, "Pcsx Msg", 0); } static char *err = "Error Loading Symbol"; static int errval; void *SysLoadLibrary(char *lib) { return LoadLibrary(lib); } void *SysLoadSym(void *lib, char *sym) { void *tmp = GetProcAddress((HINSTANCE)lib, sym); if (tmp == NULL) errval = 1; else errval = 0; return tmp; } char *SysLibError() { if (errval) { errval = 0; return err; } return NULL; } void SysCloseLibrary(void *lib) { FreeLibrary((HINSTANCE)lib); } void SysUpdate() { MSG msg; PeekMessage(&msg, NULL, 0U, 0U, PM_NOREMOVE); while (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } } void SysRunGui() { RunGui(); }