From c438158a004e0a1ed0cd8a4321c0695b2261e460 Mon Sep 17 00:00:00 2001 From: zeromus Date: Mon, 9 Jun 2008 08:15:20 +0000 Subject: [PATCH] changed fourscore to exclude other control options. (this is still not as clean as it could be. more work should be done in both input.cpp files to make sure that only gamepads can be used with fourscore. also properly implemented zapper logging. and now, finally, I can log anything if I add in a little bit of code. --- src/driver.h | 13 +- src/drivers/win/common.h | 2 +- src/drivers/win/input.cpp | 764 ++++++++-------- src/drivers/win/input.h | 2 +- src/drivers/win/res.rc | 88 +- src/drivers/win/resource.h | 1 + src/drivers/win/video.cpp | 1698 ++++++++++++++++++------------------ src/fceu.cpp | 12 +- src/git.h | 54 +- src/input.cpp | 21 +- src/input/zapper.cpp | 2 +- src/input/zapper.h | 2 - src/movie.cpp | 265 +++--- src/movie.h | 29 +- src/utils/memorystream.h | 16 +- src/video.cpp | 4 +- 16 files changed, 1556 insertions(+), 1417 deletions(-) diff --git a/src/driver.h b/src/driver.h index 415029ba..eb1eb19f 100644 --- a/src/driver.h +++ b/src/driver.h @@ -67,7 +67,12 @@ void FCEUI_SetNTSCTH(int n, int tint, int hue); void FCEUI_SetInput(int port, ESI type, void *ptr, int attrib); void FCEUI_SetInputFC(ESIFC type, void *ptr, int attrib); -void FCEUI_DisableFourScore(bool disabled); + +//tells the emulator whether a fourscore is attached +void FCEUI_SetInputFourscore(bool attachFourscore); +//tells whether a fourscore is attached +bool FCEUI_GetInputFourscore(); + void FCEUI_UseInputPreset(int preset); @@ -143,6 +148,10 @@ void FCEUI_LoadState(char *fname); void FCEUD_SaveStateAs(void); void FCEUD_LoadStateFrom(void); +//at the minimum, you should call FCEUI_SetInput, FCEUI_SetInputFC, and FCEUI_SetInputFourscore +//you may also need to maintain your own internal state +void FCEUD_SetInput(bool fourscore, ESI port0, ESI port1, ESIFC fcexp); + //movie was recorded from poweron. the alternative is from a savestate (or from reset) #define MOVIE_FLAG_FROM_POWERON (1<<3) @@ -179,7 +188,7 @@ void FCEUI_LoadMovie(char *fname, bool read_only, int _stopframe); void FCEUI_MoviePlayFromBeginning(void); void FCEUI_StopMovie(void); //int FCEUI_IsMovieActive(void); -int FCEUI_MovieGetInfo(const char* fname, MOVIE_INFO* /* [in, out] */ info); +bool FCEUI_MovieGetInfo(const char* fname, MOVIE_INFO* /* [in, out] */ info); char* FCEUI_MovieGetCurrentName(int addSlotNumber); void FCEUI_MovieToggleReadOnly(void); bool FCEUI_GetMovieToggleReadOnly(); diff --git a/src/drivers/win/common.h b/src/drivers/win/common.h index d617c15f..412753e6 100644 --- a/src/drivers/win/common.h +++ b/src/drivers/win/common.h @@ -59,7 +59,7 @@ extern int eoptions; #define EO_HIGHPRIO 4096 #define EO_FORCEASPECT 8192 #define EO_FORCEISCALE 16384 -#define EO_NOFOURSCORE 32768 +#define EO_FOURSCORE 32768 bool directoryExists(const char* dirname); #endif diff --git a/src/drivers/win/input.cpp b/src/drivers/win/input.cpp index 91099a05..cafc0b70 100644 --- a/src/drivers/win/input.cpp +++ b/src/drivers/win/input.cpp @@ -351,8 +351,19 @@ void FCEUD_UpdateInput() } } +void FCEUD_SetInput(bool fourscore, ESI port0, ESI port1, ESIFC fcexp) +{ + eoptions &= ~EO_FOURSCORE; + if(fourscore) eoptions |= EO_FOURSCORE; + + InputType[0]=port0; + InputType[1]=port1; + InputType[2]=fcexp; + InitInputPorts(); +} + //Initializes the emulator with the current input port configuration -void InitInputPorts(void) +void InitInputPorts() { void *InputDPtr; @@ -396,7 +407,7 @@ void InitInputPorts(void) } FCEUI_SetInputFC((ESIFC)InputType[2],InputDPtr,attrib); - FCEUI_DisableFourScore((eoptions&EO_NOFOURSCORE)!=0); + FCEUI_SetInputFourscore((eoptions&EO_FOURSCORE)!=0); } ButtConfig fkbmap[0x48]= @@ -725,13 +736,13 @@ static BOOL CALLBACK DWBCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa bc->DeviceNum[wc]=0; bc->ButtonNum[wc]=lParam&255; - /* Stop config if the user pushes the same button twice in a row. */ + //Stop config if the user pushes the same button twice in a row. if(wc && bc->ButtType[wc]==bc->ButtType[wc-1] && bc->DeviceNum[wc]==bc->DeviceNum[wc-1] && bc->ButtonNum[wc]==bc->ButtonNum[wc-1]) goto gornk; bc->NumC++; - /* Stop config if we reached our maximum button limit. */ + //Stop config if we reached our maximum button limit. if(bc->NumC >= MAXBUTTCONFIG) goto gornk; @@ -743,12 +754,15 @@ static BOOL CALLBACK DWBCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa case WM_INITDIALOG: SetWindowText(hwndDlg, (char*)DWBText); //mbg merge 7/17/06 added cast BeginJoyWait(hwndDlg); - SetTimer(hwndDlg,666,25,0); /* Every 25ms.*/ + SetTimer(hwndDlg,666,25,0); //Every 25ms. { char *nstr = MakeButtString(DWBButtons); SetDlgItemText(hwndDlg, LBL_DWBDIALOG_TEXT, nstr); free(nstr); } + + + break; case WM_CLOSE: case WM_QUIT: goto gornk; @@ -883,8 +897,6 @@ static BOOL CALLBACK DoTBCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lP sprintf(buf,"Virtual Gamepad %d",DoTBPort+3); SetDlgItemText(hwndDlg, GRP_GAMEPAD2, buf); - - CheckDlgButton(hwndDlg,CHECK_DISABLE_FOURSCORE,(eoptions & EO_NOFOURSCORE)?BST_CHECKED:BST_UNCHECKED); } SetWindowText(hwndDlg, DoTBTitle); break; @@ -907,19 +919,12 @@ static BOOL CALLBACK DoTBCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lP case BTN_CLOSE: gornk: - if(DoTBType == SI_GAMEPAD) - { - eoptions &= ~EO_NOFOURSCORE; - if(IsDlgButtonChecked(hwndDlg,CHECK_DISABLE_FOURSCORE)==BST_CHECKED) - eoptions|=EO_NOFOURSCORE; - } EndDialog(hwndDlg,0); break; } } } return 0; - } static void DoTBConfig(HWND hParent, const char *text, char *_template, ButtConfig *buttons, int max) @@ -930,391 +935,402 @@ static void DoTBConfig(HWND hParent, const char *text, char *_template, ButtConf DialogBox(fceu_hInstance,_template,hParent,DoTBCallB); } -/** -* Callback function of the input configuration dialog. -**/ + +const unsigned int NUMBER_OF_PORTS = 2; +const unsigned int NUMBER_OF_NES_DEVICES = SI_COUNT; +const static unsigned int NUMBER_OF_FAMICOM_DEVICES = SIFC_COUNT; +//these are unfortunate lists. they match the ESI and ESIFC enums +static const int configurable_nes[6]= { 0, 1, 0, 1, 1, 0 }; +static const int configurable_fam[14]= { 0,0,0,0, 1,1,0,1, 1,1,1,0, 0,0 }; +const unsigned int FAMICOM_POSITION = 2; + +static void UpdateComboPad(HWND hwndDlg, WORD id) +{ + unsigned int sel_input = id - COMBO_PAD1; + + // Update the user input type + InputType[sel_input] = + SendDlgItemMessage( + hwndDlg, + id, + CB_GETCURSEL, + 0, + (LPARAM)(LPSTR)0 + ); + + // Enable or disable the configuration button + EnableWindow( + GetDlgItem(hwndDlg, id + 2), + configurable_nes[InputType[sel_input]] + ); + + // Update the text field + SetDlgItemText( + hwndDlg, + TXT_PAD1 + sel_input, + (LPTSTR)ESI_Name((ESI)InputType[sel_input]) + ); +} + +static void UpdateComboFam(HWND hwndDlg) +{ +// Update the user input type of the famicom + InputType[FAMICOM_POSITION] = + SendDlgItemMessage( + hwndDlg, + COMBO_FAM, + CB_GETCURSEL, + 0, + (LPARAM)(LPSTR)0 + ); + + // Enable or disable the configuration button + EnableWindow( + GetDlgItem(hwndDlg, BTN_FAM), + configurable_fam[InputType[FAMICOM_POSITION]] + ); + + // Update the text field + SetDlgItemText( + hwndDlg, + TXT_FAM, + (LPTSTR)ESIFC_Name((ESIFC)InputType[FAMICOM_POSITION]) + ); +} + + +static void UpdateFourscoreState(HWND dlg) +{ + //(inverse logic:) + BOOL enable = (eoptions & EO_FOURSCORE)?FALSE:TRUE; + + EnableWindow(GetDlgItem(dlg,BTN_PORT1),enable); + EnableWindow(GetDlgItem(dlg,BTN_PORT2),enable); + EnableWindow(GetDlgItem(dlg,COMBO_PAD1),enable); + EnableWindow(GetDlgItem(dlg,COMBO_PAD2),enable); + EnableWindow(GetDlgItem(dlg,TXT_PAD1),enable); + EnableWindow(GetDlgItem(dlg,TXT_PAD2),enable); + + //change the inputs to gamepad + if(!enable) + { + SendMessage(GetDlgItem(dlg,COMBO_PAD1),CB_SETCURSEL,SI_GAMEPAD,0); + SendMessage(GetDlgItem(dlg,COMBO_PAD2),CB_SETCURSEL,SI_GAMEPAD,0); + UpdateComboPad(dlg,COMBO_PAD1); + UpdateComboPad(dlg,COMBO_PAD2); + SetDlgItemText(dlg,TXT_PAD1,ESI_Name(SI_GAMEPAD)); + SetDlgItemText(dlg,TXT_PAD2,ESI_Name(SI_GAMEPAD)); + } +} + +//Callback function of the input configuration dialog. BOOL CALLBACK InputConCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { - const unsigned int NUMBER_OF_PORTS = 2; - - const char * const nes_description[6] = { - "", - "Gamepad", - "Zapper", - "Power Pad A", - "Power Pad B", - "Arkanoid Paddle" - }; - - const unsigned int NUMBER_OF_NES_DEVICES = sizeof(nes_description) / sizeof(*nes_description); - - const char * const famicom_description[14] = + switch(uMsg) { - "", - "Arkanoid Paddle", - "Hyper Shot gun", - "4-Player Adapter", - "Family Keyboard", - "Subor Keyboard", - "HyperShot Pads", - "Mahjong", - "Quiz King Buzzers", - "Family Trainer A", - "Family Trainer B", - "Oeka Kids Tablet", - "Barcode World", - "Top Rider"}; + case WM_INITDIALOG: + // Update the disable UDLR checkbox based on the current value + CheckDlgButton(hwndDlg,BTN_ALLOW_LRUD,allowUDLR?BST_CHECKED:BST_UNCHECKED); - const static unsigned int NUMBER_OF_FAMICOM_DEVICES = sizeof(famicom_description) / sizeof(*famicom_description); + //update the fourscore checkbox + CheckDlgButton(hwndDlg,CHECK_ENABLE_FOURSCORE,(eoptions & EO_FOURSCORE)?BST_CHECKED:BST_UNCHECKED); - static const int configurable_nes[6]= { 0, 1, 0, 1, 1, 0 }; - - static const int configurable_fam[14]= { 0,0,0,0, 1,1,0,1, 1,1,1,0, 0,0 }; - - const unsigned int FAMICOM_POSITION = 2; - - switch(uMsg) + // Initialize the controls for the input ports + for(unsigned int port = 0; port < NUMBER_OF_PORTS; port++) { - case WM_INITDIALOG: - // Update the disable UDLR checkbox based on the current value - CheckDlgButton(hwndDlg,BTN_ALLOW_LRUD,allowUDLR?BST_CHECKED:BST_UNCHECKED); - - // Initialize the controls for the input ports - for(unsigned int port = 0; port < NUMBER_OF_PORTS; port++) + // Initialize the combobox + for(unsigned int current_device = 0; current_device < NUMBER_OF_NES_DEVICES; current_device++) { - // Initialize the combobox - for(unsigned int current_device = 0; current_device < NUMBER_OF_NES_DEVICES; current_device++) - { - SendDlgItemMessage(hwndDlg, - COMBO_PAD1 + port, - CB_ADDSTRING, 0, - (LPARAM)(LPSTR)nes_description[current_device] - ); - } - - // Update the combobox selection according to the - // currently selected input mode. SendDlgItemMessage(hwndDlg, COMBO_PAD1 + port, - CB_SETCURSEL, - InputType[port], - (LPARAM)(LPSTR)0 - ); - - // Enable the configuration button if necessary. - EnableWindow( - GetDlgItem(hwndDlg, BTN_PORT1 + port), - configurable_nes[InputType[port]] - ); - - // Update the label that displays the input device. - SetDlgItemText( - hwndDlg, - TXT_PAD1 + port, - (LPTSTR)nes_description[InputType[port]] - ); - } - - // Initialize the Famicom combobox - for(unsigned current_device = 0; current_device < NUMBER_OF_FAMICOM_DEVICES; current_device++) - { - SendDlgItemMessage( - hwndDlg, - COMBO_FAM, - CB_ADDSTRING, - 0, - (LPARAM)(LPSTR)famicom_description[current_device] + CB_ADDSTRING, 0, + (LPARAM)(LPSTR)ESI_Name((ESI)current_device) ); } // Update the combobox selection according to the // currently selected input mode. - SendDlgItemMessage( - hwndDlg, - COMBO_FAM, + SendDlgItemMessage(hwndDlg, + COMBO_PAD1 + port, CB_SETCURSEL, - InputType[FAMICOM_POSITION], + InputType[port], (LPARAM)(LPSTR)0 ); // Enable the configuration button if necessary. EnableWindow( - GetDlgItem(hwndDlg, BTN_FAM), - configurable_fam[InputType[FAMICOM_POSITION]] + GetDlgItem(hwndDlg, BTN_PORT1 + port), + configurable_nes[InputType[port]] ); // Update the label that displays the input device. SetDlgItemText( hwndDlg, - TXT_FAM, - (LPTSTR)famicom_description[InputType[FAMICOM_POSITION]] + TXT_PAD1 + port, + (LPTSTR)ESI_Name((ESI)InputType[port]) ); - - // Initialize the auto key controls - - extern int autoHoldKey, autoHoldClearKey; - char btext[128]; - - if(autoHoldKey) - { - if(!GetKeyNameText(autoHoldKey << 16, btext, 128)) - { - sprintf(btext, "KB: %d", autoHoldKey); - } - } - else - { - sprintf(btext, "not assigned"); - } - - SetDlgItemText(hwndDlg, LBL_AUTO_HOLD, btext); - - if(autoHoldClearKey) - { - if(!GetKeyNameText(autoHoldClearKey << 16, btext, 128)) - { - sprintf(btext, "KB: %d", autoHoldClearKey); - } - } - else - { - sprintf(btext, "not assigned"); - } - - SetDlgItemText(hwndDlg, LBL_CLEAR_AH, btext); - - CenterWindowOnScreen(hwndDlg); - - break; - - case WM_CLOSE: - case WM_QUIT: - EndDialog(hwndDlg, 0); - - case WM_COMMAND: - // Handle disable UD/LR option - if(HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == BTN_ALLOW_LRUD) - { - FCEU_printf("Allow UDLR toggled.\n"); - allowUDLR = !allowUDLR; - } - - if(HIWORD(wParam) == CBN_SELENDOK) - { - switch(LOWORD(wParam)) - { - case COMBO_PAD1: - case COMBO_PAD2: - { - unsigned int sel_input = LOWORD(wParam) - COMBO_PAD1; - - // Update the user input type - InputType[sel_input] = - SendDlgItemMessage( - hwndDlg, - LOWORD(wParam), - CB_GETCURSEL, - 0, - (LPARAM)(LPSTR)0 - ); - - // Enable or disable the configuration button - EnableWindow( - GetDlgItem(hwndDlg, LOWORD(wParam) + 2), - configurable_nes[InputType[sel_input]] - ); - - // Update the text field - SetDlgItemText( - hwndDlg, - TXT_PAD1 + sel_input, - (LPTSTR)nes_description[InputType[sel_input]] - ); - } - - break; - - case COMBO_FAM: - - // Update the user input type of the famicom - InputType[FAMICOM_POSITION] = - SendDlgItemMessage( - hwndDlg, - COMBO_FAM, - CB_GETCURSEL, - 0, - (LPARAM)(LPSTR)0 - ); - - // Enable or disable the configuration button - EnableWindow( - GetDlgItem(hwndDlg, BTN_FAM), - configurable_fam[InputType[FAMICOM_POSITION]] - ); - - // Update the text field - SetDlgItemText( - hwndDlg, - TXT_FAM, - (LPTSTR)famicom_description[InputType[FAMICOM_POSITION]] - ); - - break; - - } - - } - - if( !(wParam >> 16) ) - { - switch(wParam & 0xFFFF) - { - case BTN_FAM: - { - const char *text = famicom_description[InputType[FAMICOM_POSITION]]; - - DoTBType = DoTBPort = 0; - - switch(InputType[FAMICOM_POSITION]) - { - case SIFC_FTRAINERA: - case SIFC_FTRAINERB: - DoTBConfig(hwndDlg, text, "POWERPADDIALOG", FTrainerButtons, 12); - break; - case SIFC_FKB: - DoTBConfig(hwndDlg, text, "FKBDIALOG", fkbmap, 0x48); - break; - case SIFC_SUBORKB: - DoTBConfig(hwndDlg, text, "SUBORKBDIALOG", suborkbmap, 0x60); - break; - case SIFC_MAHJONG: - DoTBConfig(hwndDlg, text, "MAHJONGDIALOG", MahjongButtons, 21); - break; - case SIFC_QUIZKING: - DoTBConfig(hwndDlg, text, "QUIZKINGDIALOG", QuizKingButtons, 6); - break; - } - } - - break; - - case BTN_PORT2: - case BTN_PORT1: - { - int which = (wParam & 0xFFFF) - BTN_PORT1; - const char *text = nes_description[InputType[which]]; - - DoTBType = DoTBPort = 0; - - switch(InputType[which]) - { - case SI_GAMEPAD: - { - ButtConfig tmp[10 + 10]; - - memcpy(tmp, GamePadConfig[which], 10 * sizeof(ButtConfig)); - memcpy(&tmp[10], GamePadConfig[which + 2], 10 * sizeof(ButtConfig)); - - DoTBType = SI_GAMEPAD; - DoTBPort = which; - DoTBConfig(hwndDlg, text, "GAMEPADDIALOG", tmp, 10 + 10); - - memcpy(GamePadConfig[which], tmp, 10 * sizeof(ButtConfig)); - memcpy(GamePadConfig[which + 2], &tmp[10], 10 * sizeof(ButtConfig)); - } - break; - - case SI_POWERPADA: - case SI_POWERPADB: - DoTBConfig(hwndDlg, text, "POWERPADDIALOG", powerpadsc[which], 12); - break; - } - } - - break; - - case BTN_PRESET_SET1: - MessageBox(0, "Current input configuration has been set as Preset 1.", "FCE Ultra Message", MB_ICONINFORMATION | MB_OK | MB_SETFOREGROUND | MB_TOPMOST); - memcpy(GamePadPreset1, GamePadConfig, sizeof(GamePadConfig)); - break; - case BTN_PRESET_SET2: - MessageBox(0, "Current input configuration has been set as Preset 2.", "FCE Ultra Message", MB_ICONINFORMATION | MB_OK | MB_SETFOREGROUND | MB_TOPMOST); - memcpy(GamePadPreset2, GamePadConfig, sizeof(GamePadConfig)); - break; - case BTN_PRESET_SET3: - MessageBox(0, "Current input configuration has been set as Preset 3.", "FCE Ultra Message", MB_ICONINFORMATION | MB_OK | MB_SETFOREGROUND | MB_TOPMOST); - memcpy(GamePadPreset3, GamePadConfig, sizeof(GamePadConfig)); - break; - - case BTN_PRESET_EXPORT1: PresetExport(1); break; - case BTN_PRESET_EXPORT2: PresetExport(2); break; - case BTN_PRESET_EXPORT3: PresetExport(3); break; - - case BTN_PRESET_IMPORT1: PresetImport(1); break; - case BTN_PRESET_IMPORT2: PresetImport(2); break; - case BTN_PRESET_IMPORT3: PresetImport(3); break; - - case BTN_AUTO_HOLD: // auto-hold button - { - char btext[128] = { 0 }; - - GetDlgItemText(hwndDlg, BTN_AUTO_HOLD, btext, sizeof(btext) ); - - int button = DWaitSimpleButton(hwndDlg, (uint8*)btext); //mbg merge 7/17/06 - - if(button) - { - if(!GetKeyNameText(button << 16, btext, 128)) - { - sprintf(btext, "KB: %d", button); - } - } - else - { - sprintf(btext, "not assigned"); - } - - extern int autoHoldKey; - autoHoldKey = button; - SetDlgItemText(hwndDlg, LBL_AUTO_HOLD, btext); - } - break; - - case BTN_CLEAR_AH: // auto-hold clear button - { - char btext[128] = { 0 }; - - GetDlgItemText(hwndDlg, BTN_CLEAR_AH, btext, 128); - - int button = DWaitSimpleButton(hwndDlg, (uint8*)btext); //mbg merge 7/17/06 added cast - - if(button) - { - if( !GetKeyNameText(button << 16, btext, sizeof(btext))) - { - sprintf(btext, "KB: %d", button); - } - } - else - { - sprintf(btext, "not assigned"); - } - - extern int autoHoldClearKey; - autoHoldClearKey = button; - - SetDlgItemText(hwndDlg, LBL_CLEAR_AH, btext); - } - break; - - case BTN_CLOSE: - EndDialog(hwndDlg, 0); - break; - } - } } - return 0; + // Initialize the Famicom combobox + for(unsigned current_device = 0; current_device < NUMBER_OF_FAMICOM_DEVICES; current_device++) + { + SendDlgItemMessage( + hwndDlg, + COMBO_FAM, + CB_ADDSTRING, + 0, + (LPARAM)(LPSTR)ESIFC_Name((ESIFC)current_device) + ); + } + + // Update the combobox selection according to the + // currently selected input mode. + SendDlgItemMessage( + hwndDlg, + COMBO_FAM, + CB_SETCURSEL, + InputType[FAMICOM_POSITION], + (LPARAM)(LPSTR)0 + ); + + // Enable the configuration button if necessary. + EnableWindow( + GetDlgItem(hwndDlg, BTN_FAM), + configurable_fam[InputType[FAMICOM_POSITION]] + ); + + // Update the label that displays the input device. + SetDlgItemText( + hwndDlg, + TXT_FAM, + (LPTSTR)ESIFC_Name((ESIFC)InputType[FAMICOM_POSITION]) + ); + + // Initialize the auto key controls + + extern int autoHoldKey, autoHoldClearKey; + char btext[128]; + + if(autoHoldKey) + { + if(!GetKeyNameText(autoHoldKey << 16, btext, 128)) + { + sprintf(btext, "KB: %d", autoHoldKey); + } + } + else + { + sprintf(btext, "not assigned"); + } + + SetDlgItemText(hwndDlg, LBL_AUTO_HOLD, btext); + + if(autoHoldClearKey) + { + if(!GetKeyNameText(autoHoldClearKey << 16, btext, 128)) + { + sprintf(btext, "KB: %d", autoHoldClearKey); + } + } + else + { + sprintf(btext, "not assigned"); + } + + SetDlgItemText(hwndDlg, LBL_CLEAR_AH, btext); + + CenterWindowOnScreen(hwndDlg); + + UpdateFourscoreState(hwndDlg); + + break; + + case WM_CLOSE: + case WM_QUIT: + EndDialog(hwndDlg, 0); + + case WM_COMMAND: + // Handle disable UD/LR option + if(HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == BTN_ALLOW_LRUD) + { + FCEU_printf("Allow UDLR toggled.\n"); + allowUDLR = !allowUDLR; + } + + //Handle the fourscore button + if(HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == CHECK_ENABLE_FOURSCORE) + { + eoptions ^= EO_FOURSCORE; + FCEU_printf("Fourscore toggled to \n",(eoptions & EO_FOURSCORE)?"ON":"OFF"); + UpdateFourscoreState(hwndDlg); + } + + if(HIWORD(wParam) == CBN_SELENDOK) + { + switch(LOWORD(wParam)) + { + case COMBO_PAD1: + case COMBO_PAD2: + UpdateComboPad(hwndDlg, LOWORD(wParam)); + break; + + case COMBO_FAM: + UpdateComboFam(hwndDlg); + break; + } + + } + + if( !(wParam >> 16) ) + { + switch(wParam & 0xFFFF) + { + case BTN_FAM: + { + const char *text = ESI_Name((ESI)InputType[FAMICOM_POSITION]); + + DoTBType = DoTBPort = 0; + + switch(InputType[FAMICOM_POSITION]) + { + case SIFC_FTRAINERA: + case SIFC_FTRAINERB: + DoTBConfig(hwndDlg, text, "POWERPADDIALOG", FTrainerButtons, 12); + break; + case SIFC_FKB: + DoTBConfig(hwndDlg, text, "FKBDIALOG", fkbmap, 0x48); + break; + case SIFC_SUBORKB: + DoTBConfig(hwndDlg, text, "SUBORKBDIALOG", suborkbmap, 0x60); + break; + case SIFC_MAHJONG: + DoTBConfig(hwndDlg, text, "MAHJONGDIALOG", MahjongButtons, 21); + break; + case SIFC_QUIZKING: + DoTBConfig(hwndDlg, text, "QUIZKINGDIALOG", QuizKingButtons, 6); + break; + } + } + + break; + + case BTN_PORT2: + case BTN_PORT1: + { + int which = (wParam & 0xFFFF) - BTN_PORT1; + const char *text = ESI_Name((ESI)InputType[which]); + + DoTBType = DoTBPort = 0; + + switch(InputType[which]) + { + case SI_GAMEPAD: + { + ButtConfig tmp[10 + 10]; + + memcpy(tmp, GamePadConfig[which], 10 * sizeof(ButtConfig)); + memcpy(&tmp[10], GamePadConfig[which + 2], 10 * sizeof(ButtConfig)); + + DoTBType = SI_GAMEPAD; + DoTBPort = which; + DoTBConfig(hwndDlg, text, "GAMEPADDIALOG", tmp, 10 + 10); + + memcpy(GamePadConfig[which], tmp, 10 * sizeof(ButtConfig)); + memcpy(GamePadConfig[which + 2], &tmp[10], 10 * sizeof(ButtConfig)); + } + break; + + case SI_POWERPADA: + case SI_POWERPADB: + DoTBConfig(hwndDlg, text, "POWERPADDIALOG", powerpadsc[which], 12); + break; + } + } + + break; + + case BTN_PRESET_SET1: + MessageBox(0, "Current input configuration has been set as Preset 1.", "FCE Ultra Message", MB_ICONINFORMATION | MB_OK | MB_SETFOREGROUND | MB_TOPMOST); + memcpy(GamePadPreset1, GamePadConfig, sizeof(GamePadConfig)); + break; + case BTN_PRESET_SET2: + MessageBox(0, "Current input configuration has been set as Preset 2.", "FCE Ultra Message", MB_ICONINFORMATION | MB_OK | MB_SETFOREGROUND | MB_TOPMOST); + memcpy(GamePadPreset2, GamePadConfig, sizeof(GamePadConfig)); + break; + case BTN_PRESET_SET3: + MessageBox(0, "Current input configuration has been set as Preset 3.", "FCE Ultra Message", MB_ICONINFORMATION | MB_OK | MB_SETFOREGROUND | MB_TOPMOST); + memcpy(GamePadPreset3, GamePadConfig, sizeof(GamePadConfig)); + break; + + case BTN_PRESET_EXPORT1: PresetExport(1); break; + case BTN_PRESET_EXPORT2: PresetExport(2); break; + case BTN_PRESET_EXPORT3: PresetExport(3); break; + + case BTN_PRESET_IMPORT1: PresetImport(1); break; + case BTN_PRESET_IMPORT2: PresetImport(2); break; + case BTN_PRESET_IMPORT3: PresetImport(3); break; + + case BTN_AUTO_HOLD: // auto-hold button + { + char btext[128] = { 0 }; + + GetDlgItemText(hwndDlg, BTN_AUTO_HOLD, btext, sizeof(btext) ); + + int button = DWaitSimpleButton(hwndDlg, (uint8*)btext); //mbg merge 7/17/06 + + if(button) + { + if(!GetKeyNameText(button << 16, btext, 128)) + { + sprintf(btext, "KB: %d", button); + } + } + else + { + sprintf(btext, "not assigned"); + } + + extern int autoHoldKey; + autoHoldKey = button; + SetDlgItemText(hwndDlg, LBL_AUTO_HOLD, btext); + } + break; + + case BTN_CLEAR_AH: // auto-hold clear button + { + char btext[128] = { 0 }; + + GetDlgItemText(hwndDlg, BTN_CLEAR_AH, btext, 128); + + int button = DWaitSimpleButton(hwndDlg, (uint8*)btext); //mbg merge 7/17/06 added cast + + if(button) + { + if( !GetKeyNameText(button << 16, btext, sizeof(btext))) + { + sprintf(btext, "KB: %d", button); + } + } + else + { + sprintf(btext, "not assigned"); + } + + extern int autoHoldClearKey; + autoHoldClearKey = button; + + SetDlgItemText(hwndDlg, LBL_CLEAR_AH, btext); + } + break; + + case BTN_CLOSE: + EndDialog(hwndDlg, 0); + break; + } + } + } + + return 0; } //Shows the input configuration dialog. @@ -1431,9 +1447,9 @@ void FCEUI_UseInputPreset(int preset) { switch(preset) { - case 0: memcpy(GamePadConfig, GamePadPreset1, sizeof(GamePadPreset1)); break; - case 1: memcpy(GamePadConfig, GamePadPreset2, sizeof(GamePadPreset2)); break; - case 2: memcpy(GamePadConfig, GamePadPreset3, sizeof(GamePadPreset3)); break; + case 0: memcpy(GamePadConfig, GamePadPreset1, sizeof(GamePadPreset1)); break; + case 1: memcpy(GamePadConfig, GamePadPreset2, sizeof(GamePadPreset2)); break; + case 2: memcpy(GamePadConfig, GamePadPreset3, sizeof(GamePadPreset3)); break; } FCEU_DispMessage("Using input preset %d.",preset+1); } diff --git a/src/drivers/win/input.h b/src/drivers/win/input.h index 14e7d28c..1ed3057b 100644 --- a/src/drivers/win/input.h +++ b/src/drivers/win/input.h @@ -58,7 +58,7 @@ void ParseGIInput(FCEUGI *GameInfo); #define FCFGD_HYPERSHOT 3 #define FCFGD_QUIZKING 4 -void InitInputPorts(void); +void InitInputPorts(); void SetEmulationSpeed(int type); int FCEUD_TestCommandState(int c); void FCEUD_UpdateInput(); diff --git a/src/drivers/win/res.rc b/src/drivers/win/res.rc index b8a68ed8..a88831aa 100644 --- a/src/drivers/win/res.rc +++ b/src/drivers/win/res.rc @@ -7,8 +7,7 @@ // // Generated from the TEXTINCLUDE 2 resource. // -#include "afxres.h" - +#include "afxres.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS @@ -325,8 +324,6 @@ BEGIN PUSHBUTTON "A",310,195,138,16,12 PUSHBUTTON "Turbo B",319,154,122,32,12 PUSHBUTTON "Turbo A",318,195,122,32,12 - CONTROL "Disable four-score emulation.",CHECK_DISABLE_FOURSCORE, - "Button",BS_AUTOCHECKBOX,9,193,106,12 END GUICONFIG DIALOGEX 16, 123, 184, 90 @@ -344,48 +341,50 @@ BEGIN "Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,53,164,12 END -INPUTCONFIG DIALOGEX 122, 105, 349, 187 +INPUTCONFIG DIALOGEX 122, 105, 349, 199 STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Input Configuration" FONT 8, "MS Sans Serif", 0, 0, 0x0 BEGIN - GROUPBOX "Port 1:",102,20,19,152,50 - COMBOBOX COMBO_PAD1,27,47,71,60,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "Configure",BTN_PORT1,109,33,56,14 - GROUPBOX "Port 2:",103,176,19,152,50 - COMBOBOX COMBO_PAD2,183,47,71,60,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "Configure",BTN_PORT2,265,33,56,14 - GROUPBOX "NES-style Input Ports",108,10,8,328,71 - GROUPBOX "Famicom Expansion Port:",109,176,82,162,50 - COMBOBOX COMBO_FAM,183,111,84,60,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - DEFPUSHBUTTON "Configure",BTN_FAM,275,98,56,14 - CONTROL "",65487,"Static",SS_BLACKFRAME,27,31,71,12 - CONTROL "",65486,"Static",SS_BLACKFRAME,183,31,71,12 - CONTROL "",65485,"Static",SS_BLACKFRAME,183,95,84,12 - CTEXT "",TXT_PAD1,30,32,65,10 - CTEXT "",TXT_PAD2,186,32,65,10 - CTEXT "",TXT_FAM,186,96,78,10 - PUSHBUTTON "Set",BTN_AUTO_HOLD,19,146,45,13 - LTEXT "not assigned",LBL_AUTO_HOLD,71,148,87,8 - PUSHBUTTON "Clear",BTN_CLEAR_AH,19,161,45,13 - LTEXT "not assigned",LBL_CLEAR_AH,71,163,87,8 - DEFPUSHBUTTON "Close",BTN_CLOSE,282,166,56,14 - GROUPBOX "Input Presets",113,10,82,162,50 - CONTROL "Allow Left+Right / Up+Down",BTN_ALLOW_LRUD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,183,146,107,10 - PUSHBUTTON "Set",BTN_PRESET_SET1,34,92,37,11 - PUSHBUTTON "Set",BTN_PRESET_SET2,34,104,37,11 - PUSHBUTTON "Set",BTN_PRESET_SET3,34,116,37,11 - PUSHBUTTON "Import",BTN_PRESET_IMPORT1,84,92,37,11 - PUSHBUTTON "Import",BTN_PRESET_IMPORT2,84,104,37,11 - PUSHBUTTON "Import",BTN_PRESET_IMPORT3,84,116,37,11 - PUSHBUTTON "Export",BTN_PRESET_EXPORT1,123,92,37,11 - PUSHBUTTON "Export",BTN_PRESET_EXPORT2,123,104,37,11 - PUSHBUTTON "Export",BTN_PRESET_EXPORT3,123,116,37,11 - GROUPBOX "Auto-Hold",118,10,135,162,44 - GROUPBOX "Emulation",119,176,135,162,25 - CTEXT "1",IDC_STATIC,18,94,8,8 - CTEXT "2",IDC_STATIC,18,105,8,8 - CTEXT "3",IDC_STATIC,18,117,8,8 + GROUPBOX "Port 1:",102,20,31,152,50 + COMBOBOX COMBO_PAD1,27,57,71,60,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + DEFPUSHBUTTON "Configure",BTN_PORT1,109,43,56,14 + GROUPBOX "Port 2:",103,176,31,152,50 + COMBOBOX COMBO_PAD2,183,57,71,60,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + DEFPUSHBUTTON "Configure",BTN_PORT2,265,41,56,14 + GROUPBOX "NES-style Input Ports",108,10,8,328,83 + GROUPBOX "Famicom Expansion Port:",109,176,93,162,50 + COMBOBOX COMBO_FAM,183,122,84,60,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + DEFPUSHBUTTON "Configure",BTN_FAM,275,105,56,14 + CONTROL "",65487,"Static",SS_BLACKFRAME,27,41,71,12 + CONTROL "",65486,"Static",SS_BLACKFRAME,183,41,71,12 + CONTROL "",65485,"Static",SS_BLACKFRAME,183,106,84,12 + CTEXT "",TXT_PAD1,30,42,65,10 + CTEXT "",TXT_PAD2,186,42,65,10 + CTEXT "",TXT_FAM,186,107,78,10 + PUSHBUTTON "Set",BTN_AUTO_HOLD,19,157,45,13 + LTEXT "not assigned",LBL_AUTO_HOLD,71,159,87,8 + PUSHBUTTON "Clear",BTN_CLEAR_AH,19,172,45,13 + LTEXT "not assigned",LBL_CLEAR_AH,71,174,87,8 + DEFPUSHBUTTON "Close",BTN_CLOSE,282,177,56,14 + GROUPBOX "Input Presets",113,10,93,162,50 + CONTROL "Allow Left+Right / Up+Down",BTN_ALLOW_LRUD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,183,157,107,10 + PUSHBUTTON "Set",BTN_PRESET_SET1,34,103,37,11 + PUSHBUTTON "Set",BTN_PRESET_SET2,34,115,37,11 + PUSHBUTTON "Set",BTN_PRESET_SET3,34,127,37,11 + PUSHBUTTON "Import",BTN_PRESET_IMPORT1,84,103,37,11 + PUSHBUTTON "Import",BTN_PRESET_IMPORT2,84,115,37,11 + PUSHBUTTON "Import",BTN_PRESET_IMPORT3,84,127,37,11 + PUSHBUTTON "Export",BTN_PRESET_EXPORT1,123,103,37,11 + PUSHBUTTON "Export",BTN_PRESET_EXPORT2,123,115,37,11 + PUSHBUTTON "Export",BTN_PRESET_EXPORT3,123,127,37,11 + GROUPBOX "Auto-Hold",118,10,146,162,44 + GROUPBOX "Emulation",119,176,146,162,25 + CTEXT "1",IDC_STATIC,18,105,8,8 + CTEXT "2",IDC_STATIC,18,116,8,8 + CTEXT "3",IDC_STATIC,18,128,8,8 + CONTROL "Attach four-score (implies four gamepads)",CHECK_ENABLE_FOURSCORE, + "Button",BS_AUTOCHECKBOX,18,18,142,12 END MAHJONGDIALOG DIALOG 65510, 106, 340, 110 @@ -1261,7 +1260,7 @@ BEGIN LEFTMARGIN, 10 RIGHTMARGIN, 338 TOPMARGIN, 8 - BOTTOMMARGIN, 179 + BOTTOMMARGIN, 191 END "NETMOO", DIALOG @@ -1603,8 +1602,7 @@ IDB_TE_ARROW BITMAP "res/te_arrow.bmp" // // Generated from the TEXTINCLUDE 3 resource. // - - + ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED diff --git a/src/drivers/win/resource.h b/src/drivers/win/resource.h index 7c7ec2db..9b202026 100644 --- a/src/drivers/win/resource.h +++ b/src/drivers/win/resource.h @@ -252,6 +252,7 @@ #define IDC_WINSIZE_MUL_X 400 #define IDC_CHEAT_CHECK_NE_BY 401 #define IDC_WINSIZE_MUL_Y 401 +#define CHECK_ENABLE_FOURSCORE 401 #define IDC_CHEAT_CHECK_GT_BY 402 #define IDC_FORCE_INT_VIDEO_SCALARS 402 #define IDC_CHEAT_CHECK_LT_BY 403 diff --git a/src/drivers/win/video.cpp b/src/drivers/win/video.cpp index 829192a3..b278e16b 100644 --- a/src/drivers/win/video.cpp +++ b/src/drivers/win/video.cpp @@ -1,22 +1,22 @@ /* FCE Ultra - NES/Famicom Emulator - * - * Copyright notice for this file: - * Copyright (C) 2002 Xodnizel - * - * 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 - */ +* +* Copyright notice for this file: +* Copyright (C) 2002 Xodnizel +* +* 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 "video.h" #include "../../drawing.h" @@ -44,18 +44,18 @@ int winspecial = 0; int vmod = 0; vmdef vmodes[11]={ - {320,240,8,0,1,1,0}, //0 - {320,240,8,0,1,1,0}, //1 - {512,384,8,0,1,1,0}, //2 - {640,480,8,0,1,1,0}, //3 - {640,480,8,0,1,1,0}, //4 - {640,480,8,0,1,1,0}, //5 - {640,480,8,VMDF_DXBLT,2,2,0}, //6 - {1024,768,8,VMDF_DXBLT,4,3,0}, //7 - {1280,1024,8,VMDF_DXBLT,5,4,0}, //8 - {1600,1200,8,VMDF_DXBLT,6,5,0}, //9 - {800,600,8,VMDF_DXBLT|VMDF_STRFS,0,0} //10 - }; + {320,240,8,0,1,1,0}, //0 + {320,240,8,0,1,1,0}, //1 + {512,384,8,0,1,1,0}, //2 + {640,480,8,0,1,1,0}, //3 + {640,480,8,0,1,1,0}, //4 + {640,480,8,0,1,1,0}, //5 + {640,480,8,VMDF_DXBLT,2,2,0}, //6 + {1024,768,8,VMDF_DXBLT,4,3,0}, //7 + {1280,1024,8,VMDF_DXBLT,5,4,0}, //8 + {1600,1200,8,VMDF_DXBLT,6,5,0}, //9 + {800,600,8,VMDF_DXBLT|VMDF_STRFS,0,0} //10 +}; PALETTEENTRY *color_palette; @@ -79,40 +79,40 @@ LPDIRECTDRAWSURFACE7 lpDDSBack=0; static void ShowDDErr(char *s) { - char tempo[512]; - sprintf(tempo,"DirectDraw: %s",s); - FCEUD_PrintError(tempo); + char tempo[512]; + sprintf(tempo,"DirectDraw: %s",s); + FCEUD_PrintError(tempo); } int RestoreDD(int w) { - if(w) - { - if(!lpDDSBack) return 0; - if(IDirectDrawSurface7_Restore(lpDDSBack)!=DD_OK) return 0; - } - else - { - if(!lpDDSPrimary) return 0; - if(IDirectDrawSurface7_Restore(lpDDSPrimary)!=DD_OK) return 0; - } - veflags|=1; - return 1; + if(w) + { + if(!lpDDSBack) return 0; + if(IDirectDrawSurface7_Restore(lpDDSBack)!=DD_OK) return 0; + } + else + { + if(!lpDDSPrimary) return 0; + if(IDirectDrawSurface7_Restore(lpDDSPrimary)!=DD_OK) return 0; + } + veflags|=1; + return 1; } void FCEUD_SetPalette(unsigned char index, unsigned char r, unsigned char g, unsigned char b) { - color_palette[index].peRed=r; - color_palette[index].peGreen=g; - color_palette[index].peBlue=b; - PaletteChanged=1; + color_palette[index].peRed=r; + color_palette[index].peGreen=g; + color_palette[index].peBlue=b; + PaletteChanged=1; } void FCEUD_GetPalette(unsigned char i, unsigned char *r, unsigned char *g, unsigned char *b) { - *r=color_palette[i].peRed; - *g=color_palette[i].peGreen; - *b=color_palette[i].peBlue; + *r=color_palette[i].peRed; + *g=color_palette[i].peGreen; + *b=color_palette[i].peBlue; } static bool firstInitialize = true; @@ -121,307 +121,307 @@ static int InitializeDDraw(int fs) //only init the palette the first time through if(firstInitialize) { firstInitialize = false; - #ifdef _USE_SHARED_MEMORY_ - mapColorPalette = CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE, 0, 256 * sizeof(PALETTEENTRY),"fceu.ColorPalette"); - if(mapColorPalette == NULL || GetLastError() == ERROR_ALREADY_EXISTS) - { - CloseHandle(mapColorPalette); - mapColorPalette = NULL; - color_palette = (PALETTEENTRY*)malloc(256 * sizeof(PALETTEENTRY)); //mbg merge 7/18/06 added cast - } - else - color_palette = (PALETTEENTRY *)MapViewOfFile(mapColorPalette, FILE_MAP_WRITE, 0, 0, 0); - #endif +#ifdef _USE_SHARED_MEMORY_ + mapColorPalette = CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE, 0, 256 * sizeof(PALETTEENTRY),"fceu.ColorPalette"); + if(mapColorPalette == NULL || GetLastError() == ERROR_ALREADY_EXISTS) + { + CloseHandle(mapColorPalette); + mapColorPalette = NULL; + color_palette = (PALETTEENTRY*)malloc(256 * sizeof(PALETTEENTRY)); //mbg merge 7/18/06 added cast + } + else + color_palette = (PALETTEENTRY *)MapViewOfFile(mapColorPalette, FILE_MAP_WRITE, 0, 0, 0); +#endif } //(disvaccel&(1<<(fs?1:0)))?(GUID FAR *)DDCREATE_EMULATIONONLY: - ddrval = DirectDrawCreate((disvaccel&(1<<(fs?1:0)))?(GUID FAR *)DDCREATE_EMULATIONONLY:NULL, &lpDD, NULL); - if (ddrval != DD_OK) - { - ShowDDErr("Error creating DirectDraw object."); - return 0; - } + ddrval = DirectDrawCreate((disvaccel&(1<<(fs?1:0)))?(GUID FAR *)DDCREATE_EMULATIONONLY:NULL, &lpDD, NULL); + if (ddrval != DD_OK) + { + ShowDDErr("Error creating DirectDraw object."); + return 0; + } - //mbg merge 7/17/06 changed: - ddrval = IDirectDraw_QueryInterface(lpDD,IID_IDirectDraw7,(LPVOID *)&lpDD7); - //ddrval = IDirectDraw_QueryInterface(lpDD,&IID_IDirectDraw7,(LPVOID *)&lpDD7); - IDirectDraw_Release(lpDD); + //mbg merge 7/17/06 changed: + ddrval = IDirectDraw_QueryInterface(lpDD,IID_IDirectDraw7,(LPVOID *)&lpDD7); + //ddrval = IDirectDraw_QueryInterface(lpDD,&IID_IDirectDraw7,(LPVOID *)&lpDD7); + IDirectDraw_Release(lpDD); - if (ddrval != DD_OK) - { - ShowDDErr("Error querying interface."); - return 0; - } + if (ddrval != DD_OK) + { + ShowDDErr("Error querying interface."); + return 0; + } - caps.dwSize=sizeof(caps); - if(IDirectDraw7_GetCaps(lpDD7,&caps,0)!=DD_OK) - { - ShowDDErr("Error getting capabilities."); - return 0; - } - return 1; + caps.dwSize=sizeof(caps); + if(IDirectDraw7_GetCaps(lpDD7,&caps,0)!=DD_OK) + { + ShowDDErr("Error getting capabilities."); + return 0; + } + return 1; } static int GetBPP(void) { - DDPIXELFORMAT ddpix; + DDPIXELFORMAT ddpix; - memset(&ddpix,0,sizeof(ddpix)); - ddpix.dwSize=sizeof(ddpix); + memset(&ddpix,0,sizeof(ddpix)); + ddpix.dwSize=sizeof(ddpix); - ddrval=IDirectDrawSurface7_GetPixelFormat(lpDDSPrimary,&ddpix); - if (ddrval != DD_OK) - { - ShowDDErr("Error getting primary surface pixel format."); - return 0; - } + ddrval=IDirectDrawSurface7_GetPixelFormat(lpDDSPrimary,&ddpix); + if (ddrval != DD_OK) + { + ShowDDErr("Error getting primary surface pixel format."); + return 0; + } - if(ddpix.dwFlags&DDPF_RGB) - { - //mbg merge 7/17/06 removed silly dummy union stuff now that we have c++ - bpp=ddpix.dwRGBBitCount; - CBM[0]=ddpix.dwRBitMask; - CBM[1]=ddpix.dwGBitMask; - CBM[2]=ddpix.dwBBitMask; - } - else - { - ShowDDErr("RGB data not valid."); - return 0; - } - if(bpp==15) bpp=16; + if(ddpix.dwFlags&DDPF_RGB) + { + //mbg merge 7/17/06 removed silly dummy union stuff now that we have c++ + bpp=ddpix.dwRGBBitCount; + CBM[0]=ddpix.dwRBitMask; + CBM[1]=ddpix.dwGBitMask; + CBM[2]=ddpix.dwBBitMask; + } + else + { + ShowDDErr("RGB data not valid."); + return 0; + } + if(bpp==15) bpp=16; - return 1; + return 1; } static int InitBPPStuff(int fs) { - if(bpp >= 16) - { - InitBlitToHigh(bpp >> 3, CBM[0], CBM[1], CBM[2], 0, fs?vmodes[vmod].special:winspecial); - } - else if(bpp==8) - { - ddrval=IDirectDraw7_CreatePalette( lpDD7, DDPCAPS_8BIT|DDPCAPS_ALLOW256|DDPCAPS_INITIALIZE,color_palette,&lpddpal,NULL); - if (ddrval != DD_OK) - { - ShowDDErr("Error creating palette object."); - return 0; - } - ddrval=IDirectDrawSurface7_SetPalette(lpDDSPrimary, lpddpal); - if (ddrval != DD_OK) - { - ShowDDErr("Error setting palette object."); - return 0; - } - } - return 1; + if(bpp >= 16) + { + InitBlitToHigh(bpp >> 3, CBM[0], CBM[1], CBM[2], 0, fs?vmodes[vmod].special:winspecial); + } + else if(bpp==8) + { + ddrval=IDirectDraw7_CreatePalette( lpDD7, DDPCAPS_8BIT|DDPCAPS_ALLOW256|DDPCAPS_INITIALIZE,color_palette,&lpddpal,NULL); + if (ddrval != DD_OK) + { + ShowDDErr("Error creating palette object."); + return 0; + } + ddrval=IDirectDrawSurface7_SetPalette(lpDDSPrimary, lpddpal); + if (ddrval != DD_OK) + { + ShowDDErr("Error setting palette object."); + return 0; + } + } + return 1; } int SetVideoMode(int fs) { - int specmul; // Special scaler size multiplier + int specmul; // Special scaler size multiplier - if(fs) - if(!vmod) - if(!RecalcCustom()) - return(0); + if(fs) + if(!vmod) + if(!RecalcCustom()) + return(0); - vflags=0; - veflags=1; - PaletteChanged=1; + vflags=0; + veflags=1; + PaletteChanged=1; - ResetVideo(); + ResetVideo(); - if(!InitializeDDraw(fs)) return(1); // DirectDraw not initialized + if(!InitializeDDraw(fs)) return(1); // DirectDraw not initialized - if(!fs) - { - if(winspecial == 2 || winspecial == 1) - specmul = 2; - else if(winspecial == 3 || winspecial == 4) - specmul = 3; - else - specmul = 1; + if(!fs) + { + if(winspecial == 2 || winspecial == 1) + specmul = 2; + else if(winspecial == 3 || winspecial == 4) + specmul = 3; + else + specmul = 1; - ShowCursorAbs(1); - windowedfailed=1; - HideFWindow(0); + ShowCursorAbs(1); + windowedfailed=1; + HideFWindow(0); - ddrval = IDirectDraw7_SetCooperativeLevel ( lpDD7, hAppWnd, DDSCL_NORMAL); - if (ddrval != DD_OK) - { - ShowDDErr("Error setting cooperative level."); - return 1; - } + ddrval = IDirectDraw7_SetCooperativeLevel ( lpDD7, hAppWnd, DDSCL_NORMAL); + if (ddrval != DD_OK) + { + ShowDDErr("Error setting cooperative level."); + return 1; + } - //Beginning - memset(&ddsd,0,sizeof(ddsd)); - ddsd.dwSize = sizeof(ddsd); - ddsd.dwFlags = DDSD_CAPS; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; + //Beginning + memset(&ddsd,0,sizeof(ddsd)); + ddsd.dwSize = sizeof(ddsd); + ddsd.dwFlags = DDSD_CAPS; + ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; - ddrval = IDirectDraw7_CreateSurface ( lpDD7, &ddsd, &lpDDSPrimary,(IUnknown FAR*)NULL); - if (ddrval != DD_OK) - { - void FCEU_PrintError(char *format, ...); - FCEU_PrintError("%08x, %d\n",ddrval,lpDD7); - ShowDDErr("Error creating primary surface."); - return 1; - } + ddrval = IDirectDraw7_CreateSurface ( lpDD7, &ddsd, &lpDDSPrimary,(IUnknown FAR*)NULL); + if (ddrval != DD_OK) + { + void FCEU_PrintError(char *format, ...); + FCEU_PrintError("%08x, %d\n",ddrval,lpDD7); + ShowDDErr("Error creating primary surface."); + return 1; + } - memset(&ddsdback,0,sizeof(ddsdback)); - ddsdback.dwSize=sizeof(ddsdback); - ddsdback.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; - ddsdback.ddsCaps.dwCaps= DDSCAPS_OFFSCREENPLAIN; + memset(&ddsdback,0,sizeof(ddsdback)); + ddsdback.dwSize=sizeof(ddsdback); + ddsdback.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; + ddsdback.ddsCaps.dwCaps= DDSCAPS_OFFSCREENPLAIN; - ddsdback.dwWidth=256 * specmul; - ddsdback.dwHeight=FSettings.TotalScanlines() * specmul; - - //If the blit hardware can't stretch, assume it's cheap(and slow) - //and create the buffer in system memory. - - if(!(caps.dwCaps&DDCAPS_BLTSTRETCH)) - ddsdback.ddsCaps.dwCaps|=DDSCAPS_SYSTEMMEMORY; - - ddrval = IDirectDraw7_CreateSurface ( lpDD7, &ddsdback, &lpDDSBack, (IUnknown FAR*)NULL); - if (ddrval != DD_OK) - { - ShowDDErr("Error creating secondary surface."); - return 0; - } - - if(!GetBPP()) - return 0; + ddsdback.dwWidth=256 * specmul; + ddsdback.dwHeight=FSettings.TotalScanlines() * specmul; - if(bpp!=16 && bpp!=24 && bpp!=32) - { - ShowDDErr("Current bit depth not supported!"); - return 0; - } + //If the blit hardware can't stretch, assume it's cheap(and slow) + //and create the buffer in system memory. - if(!InitBPPStuff(fs)) - return 0; + if(!(caps.dwCaps&DDCAPS_BLTSTRETCH)) + ddsdback.ddsCaps.dwCaps|=DDSCAPS_SYSTEMMEMORY; - ddrval=IDirectDraw7_CreateClipper(lpDD7,0,&lpClipper,0); - if (ddrval != DD_OK) - { - ShowDDErr("Error creating clipper."); - return 0; - } + ddrval = IDirectDraw7_CreateSurface ( lpDD7, &ddsdback, &lpDDSBack, (IUnknown FAR*)NULL); + if (ddrval != DD_OK) + { + ShowDDErr("Error creating secondary surface."); + return 0; + } - ddrval=IDirectDrawClipper_SetHWnd(lpClipper,0,hAppWnd); - if (ddrval != DD_OK) - { - ShowDDErr("Error setting clipper window."); - return 0; - } - ddrval=IDirectDrawSurface7_SetClipper(lpDDSPrimary,lpClipper); - if (ddrval != DD_OK) - { - ShowDDErr("Error attaching clipper to primary surface."); - return 0; - } + if(!GetBPP()) + return 0; - windowedfailed=0; - SetMainWindowStuff(); - } - else //Following is full-screen - { - if(vmod == 0) - { - if(vmodes[0].special == 2 || vmodes[0].special == 1) - specmul = 2; - else if(vmodes[0].special == 3 || vmodes[0].special == 4) - specmul = 3; - else - specmul = 1; - } - HideFWindow(1); + if(bpp!=16 && bpp!=24 && bpp!=32) + { + ShowDDErr("Current bit depth not supported!"); + return 0; + } - ddrval = IDirectDraw7_SetCooperativeLevel ( lpDD7, hAppWnd,DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_ALLOWREBOOT); - if (ddrval != DD_OK) - { - ShowDDErr("Error setting cooperative level."); - return 0; - } + if(!InitBPPStuff(fs)) + return 0; - ddrval = IDirectDraw7_SetDisplayMode(lpDD7, vmodes[vmod].x, vmodes[vmod].y,vmodes[vmod].bpp,0,0); - if (ddrval != DD_OK) - { - ShowDDErr("Error setting display mode."); - return 0; - } - if(vmodes[vmod].flags&VMDF_DXBLT) - { - memset(&ddsdback,0,sizeof(ddsdback)); - ddsdback.dwSize=sizeof(ddsdback); - ddsdback.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; - ddsdback.ddsCaps.dwCaps= DDSCAPS_OFFSCREENPLAIN; + ddrval=IDirectDraw7_CreateClipper(lpDD7,0,&lpClipper,0); + if (ddrval != DD_OK) + { + ShowDDErr("Error creating clipper."); + return 0; + } - ddsdback.dwWidth=256 * specmul; //vmodes[vmod].srect.right; - ddsdback.dwHeight=FSettings.TotalScanlines() * specmul; //vmodes[vmod].srect.bottom; + ddrval=IDirectDrawClipper_SetHWnd(lpClipper,0,hAppWnd); + if (ddrval != DD_OK) + { + ShowDDErr("Error setting clipper window."); + return 0; + } + ddrval=IDirectDrawSurface7_SetClipper(lpDDSPrimary,lpClipper); + if (ddrval != DD_OK) + { + ShowDDErr("Error attaching clipper to primary surface."); + return 0; + } - if(!(caps.dwCaps&DDCAPS_BLTSTRETCH)) - ddsdback.ddsCaps.dwCaps|=DDSCAPS_SYSTEMMEMORY; + windowedfailed=0; + SetMainWindowStuff(); + } + else //Following is full-screen + { + if(vmod == 0) + { + if(vmodes[0].special == 2 || vmodes[0].special == 1) + specmul = 2; + else if(vmodes[0].special == 3 || vmodes[0].special == 4) + specmul = 3; + else + specmul = 1; + } + HideFWindow(1); - ddrval = IDirectDraw7_CreateSurface ( lpDD7, &ddsdback, &lpDDSBack, (IUnknown FAR*)NULL); - if(ddrval!=DD_OK) - { - ShowDDErr("Error creating secondary surface."); - return 0; - } - } + ddrval = IDirectDraw7_SetCooperativeLevel ( lpDD7, hAppWnd,DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_ALLOWREBOOT); + if (ddrval != DD_OK) + { + ShowDDErr("Error setting cooperative level."); + return 0; + } - // create foreground surface - - memset(&ddsd,0,sizeof(ddsd)); - ddsd.dwSize = sizeof(ddsd); - - ddsd.dwFlags = DDSD_CAPS; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; + ddrval = IDirectDraw7_SetDisplayMode(lpDD7, vmodes[vmod].x, vmodes[vmod].y,vmodes[vmod].bpp,0,0); + if (ddrval != DD_OK) + { + ShowDDErr("Error setting display mode."); + return 0; + } + if(vmodes[vmod].flags&VMDF_DXBLT) + { + memset(&ddsdback,0,sizeof(ddsdback)); + ddsdback.dwSize=sizeof(ddsdback); + ddsdback.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; + ddsdback.ddsCaps.dwCaps= DDSCAPS_OFFSCREENPLAIN; - if(fssync==3) // Double buffering. - { - ddsd.dwFlags |= DDSD_BACKBUFFERCOUNT; - ddsd.dwBackBufferCount = 1; - ddsd.ddsCaps.dwCaps |= DDSCAPS_COMPLEX | DDSCAPS_FLIP; - } + ddsdback.dwWidth=256 * specmul; //vmodes[vmod].srect.right; + ddsdback.dwHeight=FSettings.TotalScanlines() * specmul; //vmodes[vmod].srect.bottom; - ddrval = IDirectDraw7_CreateSurface ( lpDD7, &ddsd, &lpDDSPrimary,(IUnknown FAR*)NULL); - if (ddrval != DD_OK) - { - ShowDDErr("Error creating primary surface."); - return 0; - } + if(!(caps.dwCaps&DDCAPS_BLTSTRETCH)) + ddsdback.ddsCaps.dwCaps|=DDSCAPS_SYSTEMMEMORY; - if(fssync==3) - { - DDSCAPS2 tmp; + ddrval = IDirectDraw7_CreateSurface ( lpDD7, &ddsdback, &lpDDSBack, (IUnknown FAR*)NULL); + if(ddrval!=DD_OK) + { + ShowDDErr("Error creating secondary surface."); + return 0; + } + } - memset(&tmp,0,sizeof(tmp)); - tmp.dwCaps=DDSCAPS_BACKBUFFER; + // create foreground surface - if(IDirectDrawSurface7_GetAttachedSurface(lpDDSPrimary,&tmp,&lpDDSDBack)!=DD_OK) - { - ShowDDErr("Error getting attached surface."); - return 0; - } - } + memset(&ddsd,0,sizeof(ddsd)); + ddsd.dwSize = sizeof(ddsd); - if(!GetBPP()) - return 0; - if(!InitBPPStuff(fs)) - return 0; + ddsd.dwFlags = DDSD_CAPS; + ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; - mustrestore=1; - ShowCursorAbs(0); - } + if(fssync==3) // Double buffering. + { + ddsd.dwFlags |= DDSD_BACKBUFFERCOUNT; + ddsd.dwBackBufferCount = 1; + ddsd.ddsCaps.dwCaps |= DDSCAPS_COMPLEX | DDSCAPS_FLIP; + } - fullscreen=fs; - return 1; + ddrval = IDirectDraw7_CreateSurface ( lpDD7, &ddsd, &lpDDSPrimary,(IUnknown FAR*)NULL); + if (ddrval != DD_OK) + { + ShowDDErr("Error creating primary surface."); + return 0; + } + + if(fssync==3) + { + DDSCAPS2 tmp; + + memset(&tmp,0,sizeof(tmp)); + tmp.dwCaps=DDSCAPS_BACKBUFFER; + + if(IDirectDrawSurface7_GetAttachedSurface(lpDDSPrimary,&tmp,&lpDDSDBack)!=DD_OK) + { + ShowDDErr("Error getting attached surface."); + return 0; + } + } + + if(!GetBPP()) + return 0; + if(!InitBPPStuff(fs)) + return 0; + + mustrestore=1; + ShowCursorAbs(0); + } + + fullscreen=fs; + return 1; } //draw input aids if we are fullscreen @@ -435,671 +435,675 @@ static void BlitScreenFull(uint8 *XBuf); //static uint8 *XBSave; void FCEUD_BlitScreen(uint8 *XBuf) { - xbsave = XBuf; - if(!NoWaiting) - { - int ws; + xbsave = XBuf; + if(!NoWaiting) + { + int ws; - if(fullscreen) ws=fssync; - else ws = winsync; + if(fullscreen) ws=fssync; + else ws = winsync; - if(ws==1) - IDirectDraw7_WaitForVerticalBlank(lpDD7,DDWAITVB_BLOCKBEGIN,0); - else if(ws == 2) - { - BOOL invb = 0; + if(ws==1) + IDirectDraw7_WaitForVerticalBlank(lpDD7,DDWAITVB_BLOCKBEGIN,0); + else if(ws == 2) + { + BOOL invb = 0; - while((DD_OK == IDirectDraw7_GetVerticalBlankStatus(lpDD7,&invb)) && !invb) - Sleep(0); - } - } + while((DD_OK == IDirectDraw7_GetVerticalBlankStatus(lpDD7,&invb)) && !invb) + Sleep(0); + } + } - if(fullscreen) - { - BlitScreenFull(XBuf); - } - else - { - if(!windowedfailed) - BlitScreenWindow(XBuf); - } + if(fullscreen) + { + BlitScreenFull(XBuf); + } + else + { + if(!windowedfailed) + BlitScreenWindow(XBuf); + } } static void FixPaletteHi(void) { - SetPaletteBlitToHigh((uint8*)color_palette); //mbg merge 7/17/06 added cast + SetPaletteBlitToHigh((uint8*)color_palette); //mbg merge 7/17/06 added cast } static void BlitScreenWindow(unsigned char *XBuf) { - int pitch; - unsigned char *ScreenLoc; - static RECT srect; - RECT drect; - int specialmul; + int pitch; + unsigned char *ScreenLoc; + static RECT srect; + RECT drect; + int specialmul; - if(winspecial == 2 || winspecial == 1) - specialmul = 2; - else if(winspecial == 4 || winspecial == 3) - specialmul = 3; - else specialmul = 1; + if(winspecial == 2 || winspecial == 1) + specialmul = 2; + else if(winspecial == 4 || winspecial == 3) + specialmul = 3; + else specialmul = 1; - srect.top=srect.left=0; - srect.right=VNSWID * specialmul; - srect.bottom=FSettings.TotalScanlines() * specialmul; + srect.top=srect.left=0; + srect.right=VNSWID * specialmul; + srect.bottom=FSettings.TotalScanlines() * specialmul; - if(PaletteChanged==1) - { - FixPaletteHi(); - PaletteChanged=0; - } + if(PaletteChanged==1) + { + FixPaletteHi(); + PaletteChanged=0; + } - if(!GetClientAbsRect(&drect)) return; + if(!GetClientAbsRect(&drect)) return; - ddrval=IDirectDrawSurface7_Lock(lpDDSBack,NULL,&ddsdback, 0, NULL); - if(ddrval!=DD_OK) - { - if(ddrval==DDERR_SURFACELOST) RestoreDD(1); - return; - } + ddrval=IDirectDrawSurface7_Lock(lpDDSBack,NULL,&ddsdback, 0, NULL); + if(ddrval!=DD_OK) + { + if(ddrval==DDERR_SURFACELOST) RestoreDD(1); + return; + } - //mbg merge 7/17/06 removing dummyunion stuff - pitch=ddsdback.lPitch; - ScreenLoc=(unsigned char*)ddsdback.lpSurface; //mbg merge 7/17/06 added cst - if(veflags&1) - { - memset(ScreenLoc,0,pitch*ddsdback.dwHeight); - veflags&=~1; - } - Blit8ToHigh(XBuf+FSettings.FirstSLine*256+VNSCLIP,ScreenLoc, VNSWID, FSettings.TotalScanlines(), pitch,specialmul,specialmul); + //mbg merge 7/17/06 removing dummyunion stuff + pitch=ddsdback.lPitch; + ScreenLoc=(unsigned char*)ddsdback.lpSurface; //mbg merge 7/17/06 added cst + if(veflags&1) + { + memset(ScreenLoc,0,pitch*ddsdback.dwHeight); + veflags&=~1; + } + Blit8ToHigh(XBuf+FSettings.FirstSLine*256+VNSCLIP,ScreenLoc, VNSWID, FSettings.TotalScanlines(), pitch,specialmul,specialmul); - IDirectDrawSurface7_Unlock(lpDDSBack, NULL); + IDirectDrawSurface7_Unlock(lpDDSBack, NULL); - if(IDirectDrawSurface7_Blt(lpDDSPrimary, &drect,lpDDSBack,&srect,DDBLT_ASYNC,0)!=DD_OK) - { - ddrval=IDirectDrawSurface7_Blt(lpDDSPrimary, &drect,lpDDSBack,&srect,DDBLT_WAIT,0); - if(ddrval!=DD_OK) - { - if(ddrval==DDERR_SURFACELOST) {RestoreDD(1);RestoreDD(0);} - return; - } - } + if(IDirectDrawSurface7_Blt(lpDDSPrimary, &drect,lpDDSBack,&srect,DDBLT_ASYNC,0)!=DD_OK) + { + ddrval=IDirectDrawSurface7_Blt(lpDDSPrimary, &drect,lpDDSBack,&srect,DDBLT_WAIT,0); + if(ddrval!=DD_OK) + { + if(ddrval==DDERR_SURFACELOST) {RestoreDD(1);RestoreDD(0);} + return; + } + } } static void BlitScreenFull(uint8 *XBuf) { - static int pitch; - char *ScreenLoc; - //unsigned long x; //mbg merge 7/17/06 removed - //uint8 y; //mbg merge 7/17/06 removed - RECT srect,drect; - LPDIRECTDRAWSURFACE7 lpDDSVPrimary; - int specmul; // Special scaler size multiplier - if(vmodes[0].special == 2 || vmodes[0].special == 1) - specmul = 2; - else if(vmodes[0].special == 3 || vmodes[0].special == 4) - specmul = 3; - else - specmul = 1; + static int pitch; + char *ScreenLoc; + //unsigned long x; //mbg merge 7/17/06 removed + //uint8 y; //mbg merge 7/17/06 removed + RECT srect,drect; + LPDIRECTDRAWSURFACE7 lpDDSVPrimary; + int specmul; // Special scaler size multiplier + if(vmodes[0].special == 2 || vmodes[0].special == 1) + specmul = 2; + else if(vmodes[0].special == 3 || vmodes[0].special == 4) + specmul = 3; + else + specmul = 1; - if(fssync==3) - lpDDSVPrimary=lpDDSDBack; - else - lpDDSVPrimary=lpDDSPrimary; + if(fssync==3) + lpDDSVPrimary=lpDDSDBack; + else + lpDDSVPrimary=lpDDSPrimary; - if(PaletteChanged==1) - { - if(bpp>=16) - FixPaletteHi(); - else - { - ddrval=IDirectDrawPalette_SetEntries(lpddpal,0,0,256,color_palette); - if(ddrval!=DD_OK) - { - if(ddrval==DDERR_SURFACELOST) RestoreDD(0); - return; - } - } - PaletteChanged=0; - } + if(PaletteChanged==1) + { + if(bpp>=16) + FixPaletteHi(); + else + { + ddrval=IDirectDrawPalette_SetEntries(lpddpal,0,0,256,color_palette); + if(ddrval!=DD_OK) + { + if(ddrval==DDERR_SURFACELOST) RestoreDD(0); + return; + } + } + PaletteChanged=0; + } - if(vmodes[vmod].flags&VMDF_DXBLT) - { - ddrval=IDirectDrawSurface7_Lock(lpDDSBack,NULL,&ddsdback, 0, NULL); - if(ddrval!=DD_OK) - { - if(ddrval==DDERR_SURFACELOST) RestoreDD(1); - return; - } - ScreenLoc=(char *)ddsdback.lpSurface; //mbg merge 7/17/06 added cast - pitch=ddsdback.lPitch; //mbg merge 7/17/06 removed dummyunion stuff + if(vmodes[vmod].flags&VMDF_DXBLT) + { + ddrval=IDirectDrawSurface7_Lock(lpDDSBack,NULL,&ddsdback, 0, NULL); + if(ddrval!=DD_OK) + { + if(ddrval==DDERR_SURFACELOST) RestoreDD(1); + return; + } + ScreenLoc=(char *)ddsdback.lpSurface; //mbg merge 7/17/06 added cast + pitch=ddsdback.lPitch; //mbg merge 7/17/06 removed dummyunion stuff - srect.top=0; - srect.left=0; - srect.right=VNSWID * specmul; - srect.bottom=FSettings.TotalScanlines() * specmul; + srect.top=0; + srect.left=0; + srect.right=VNSWID * specmul; + srect.bottom=FSettings.TotalScanlines() * specmul; - if(vmodes[vmod].flags&VMDF_STRFS) - { - drect.top=0; - drect.left=0; - drect.right=vmodes[vmod].x; - drect.bottom=vmodes[vmod].y; - } - else - { - drect.top=(vmodes[vmod].y-(FSettings.TotalScanlines()*vmodes[vmod].yscale))>>1; - drect.bottom=drect.top+(FSettings.TotalScanlines()*vmodes[vmod].yscale); - drect.left=(vmodes[vmod].x-VNSWID*vmodes[vmod].xscale)>>1; - drect.right=drect.left+VNSWID*vmodes[vmod].xscale; - } - } - else - { - ddrval=IDirectDrawSurface7_Lock(lpDDSVPrimary,NULL,&ddsd, 0, NULL); - if(ddrval!=DD_OK) - { - if(ddrval==DDERR_SURFACELOST) RestoreDD(0); - return; - } + if(vmodes[vmod].flags&VMDF_STRFS) + { + drect.top=0; + drect.left=0; + drect.right=vmodes[vmod].x; + drect.bottom=vmodes[vmod].y; + } + else + { + drect.top=(vmodes[vmod].y-(FSettings.TotalScanlines()*vmodes[vmod].yscale))>>1; + drect.bottom=drect.top+(FSettings.TotalScanlines()*vmodes[vmod].yscale); + drect.left=(vmodes[vmod].x-VNSWID*vmodes[vmod].xscale)>>1; + drect.right=drect.left+VNSWID*vmodes[vmod].xscale; + } + } + else + { + ddrval=IDirectDrawSurface7_Lock(lpDDSVPrimary,NULL,&ddsd, 0, NULL); + if(ddrval!=DD_OK) + { + if(ddrval==DDERR_SURFACELOST) RestoreDD(0); + return; + } - ScreenLoc=(char*)ddsd.lpSurface; //mbg merge 7/17/06 added cast - pitch=ddsd.lPitch; //mbg merge 7/17/06 removing dummyunion stuff - } + ScreenLoc=(char*)ddsd.lpSurface; //mbg merge 7/17/06 added cast + pitch=ddsd.lPitch; //mbg merge 7/17/06 removing dummyunion stuff + } - if(veflags&1) - { - if(vmodes[vmod].flags&VMDF_DXBLT) - { - veflags|=2; - memset((char *)ScreenLoc,0,pitch*srect.bottom); - } - else - { - memset((char *)ScreenLoc,0,pitch*vmodes[vmod].y); - } - PaletteChanged=1; - veflags&=~1; - } + if(veflags&1) + { + if(vmodes[vmod].flags&VMDF_DXBLT) + { + veflags|=2; + memset((char *)ScreenLoc,0,pitch*srect.bottom); + } + else + { + memset((char *)ScreenLoc,0,pitch*vmodes[vmod].y); + } + PaletteChanged=1; + veflags&=~1; + } - //mbg 6/29/06 merge + //mbg 6/29/06 merge #ifndef MSVC - if(vmod==5) - { - if(eoptions&EO_CLIPSIDES) - { - asm volatile( - "xorl %%edx, %%edx\n\t" - "akoop1:\n\t" - "movb $120,%%al \n\t" - "akoop2:\n\t" - "movb 1(%%esi),%%dl\n\t" - "shl $16,%%edx\n\t" - "movb (%%esi),%%dl\n\t" - "movl %%edx,(%%edi)\n\t" - "addl $2,%%esi\n\t" - "addl $4,%%edi\n\t" - "decb %%al\n\t" - "jne akoop2\n\t" - "addl $16,%%esi\n\t" - "addl %%ecx,%%edi\n\t" - "decb %%bl\n\t" - "jne akoop1\n\t" - : - : "S" (XBuf+FSettings.FirstSLine*256+VNSCLIP), "D" (ScreenLoc+((240-FSettings.TotalScanlines())/2)*pitch+(640-(VNSWID<<1))/2),"b" (FSettings.TotalScanlines()), "c" ((pitch-VNSWID)<<1) - : "%al", "%edx", "%cc" ); - } - else - { - asm volatile( - "xorl %%edx, %%edx\n\t" - "koop1:\n\t" - "movb $128,%%al \n\t" - "koop2:\n\t" - "movb 1(%%esi),%%dl\n\t" - "shl $16,%%edx\n\t" - "movb (%%esi),%%dl\n\t" - "movl %%edx,(%%edi)\n\t" - "addl $2,%%esi\n\t" - "addl $4,%%edi\n\t" - "decb %%al\n\t" - "jne koop2\n\t" - "addl %%ecx,%%edi\n\t" - "decb %%bl\n\t" - "jne koop1\n\t" - : - : "S" (XBuf+FSettings.FirstSLine*256), "D" (ScreenLoc+((240-FSettings.TotalScanlines())/2)*pitch+(640-512)/2),"b" (FSettings.TotalScanlines()), "c" (pitch-512+pitch) - : "%al", "%edx", "%cc" ); - } - } - else if(vmod==4) - { - if(eoptions&EO_CLIPSIDES) - { - asm volatile( - "ayoop1:\n\t" - "movb $120,%%al \n\t" - "ayoop2:\n\t" - "movb 1(%%esi),%%dh\n\t" - "movb %%dh,%%dl\n\t" - "shl $16,%%edx\n\t" - "movb (%%esi),%%dl\n\t" - "movb %%dl,%%dh\n\t" // Ugh - "movl %%edx,(%%edi)\n\t" - "addl $2,%%esi\n\t" - "addl $4,%%edi\n\t" - "decb %%al\n\t" - "jne ayoop2\n\t" - "addl $16,%%esi\n\t" - "addl %%ecx,%%edi\n\t" - "decb %%bl\n\t" - "jne ayoop1\n\t" - : - : "S" (XBuf+FSettings.FirstSLine*256+VNSCLIP), "D" (ScreenLoc+((240-FSettings.TotalScanlines())/2)*pitch+(640-(VNSWID<<1))/2),"b" (FSettings.TotalScanlines()), "c" ((pitch-VNSWID)<<1) - : "%al", "%edx", "%cc" ); - } - else - { - asm volatile( - "yoop1:\n\t" - "movb $128,%%al \n\t" - "yoop2:\n\t" - "movb 1(%%esi),%%dh\n\t" - "movb %%dh,%%dl\n\t" - "shl $16,%%edx\n\t" - "movb (%%esi),%%dl\n\t" - "movb %%dl,%%dh\n\t" // Ugh - "movl %%edx,(%%edi)\n\t" - "addl $2,%%esi\n\t" - "addl $4,%%edi\n\t" - "decb %%al\n\t" - "jne yoop2\n\t" - "addl %%ecx,%%edi\n\t" - "decb %%bl\n\t" - "jne yoop1\n\t" - : - : "S" (XBuf+FSettings.FirstSLine*256), "D" (ScreenLoc+((240-FSettings.TotalScanlines())/2)*pitch+(640-512)/2),"b" (FSettings.TotalScanlines()), "c" (pitch-512+pitch) - : "%al", "%edx", "%cc" ); - } - } - else - #endif - //mbg 6/29/06 merge - { - if(!(vmodes[vmod].flags&VMDF_DXBLT)) - { - if(vmodes[vmod].special) - ScreenLoc += (vmodes[vmod].drect.left*(bpp>>3)) + ((vmodes[vmod].drect.top)*pitch); - else - ScreenLoc+=((vmodes[vmod].x-VNSWID)>>1)*(bpp>>3)+(((vmodes[vmod].y-FSettings.TotalScanlines())>>1))*pitch; - } + if(vmod==5) + { + if(eoptions&EO_CLIPSIDES) + { + asm volatile( + "xorl %%edx, %%edx\n\t" + "akoop1:\n\t" + "movb $120,%%al \n\t" + "akoop2:\n\t" + "movb 1(%%esi),%%dl\n\t" + "shl $16,%%edx\n\t" + "movb (%%esi),%%dl\n\t" + "movl %%edx,(%%edi)\n\t" + "addl $2,%%esi\n\t" + "addl $4,%%edi\n\t" + "decb %%al\n\t" + "jne akoop2\n\t" + "addl $16,%%esi\n\t" + "addl %%ecx,%%edi\n\t" + "decb %%bl\n\t" + "jne akoop1\n\t" + : + : "S" (XBuf+FSettings.FirstSLine*256+VNSCLIP), "D" (ScreenLoc+((240-FSettings.TotalScanlines())/2)*pitch+(640-(VNSWID<<1))/2),"b" (FSettings.TotalScanlines()), "c" ((pitch-VNSWID)<<1) + : "%al", "%edx", "%cc" ); + } + else + { + asm volatile( + "xorl %%edx, %%edx\n\t" + "koop1:\n\t" + "movb $128,%%al \n\t" + "koop2:\n\t" + "movb 1(%%esi),%%dl\n\t" + "shl $16,%%edx\n\t" + "movb (%%esi),%%dl\n\t" + "movl %%edx,(%%edi)\n\t" + "addl $2,%%esi\n\t" + "addl $4,%%edi\n\t" + "decb %%al\n\t" + "jne koop2\n\t" + "addl %%ecx,%%edi\n\t" + "decb %%bl\n\t" + "jne koop1\n\t" + : + : "S" (XBuf+FSettings.FirstSLine*256), "D" (ScreenLoc+((240-FSettings.TotalScanlines())/2)*pitch+(640-512)/2),"b" (FSettings.TotalScanlines()), "c" (pitch-512+pitch) + : "%al", "%edx", "%cc" ); + } + } + else if(vmod==4) + { + if(eoptions&EO_CLIPSIDES) + { + asm volatile( + "ayoop1:\n\t" + "movb $120,%%al \n\t" + "ayoop2:\n\t" + "movb 1(%%esi),%%dh\n\t" + "movb %%dh,%%dl\n\t" + "shl $16,%%edx\n\t" + "movb (%%esi),%%dl\n\t" + "movb %%dl,%%dh\n\t" // Ugh + "movl %%edx,(%%edi)\n\t" + "addl $2,%%esi\n\t" + "addl $4,%%edi\n\t" + "decb %%al\n\t" + "jne ayoop2\n\t" + "addl $16,%%esi\n\t" + "addl %%ecx,%%edi\n\t" + "decb %%bl\n\t" + "jne ayoop1\n\t" + : + : "S" (XBuf+FSettings.FirstSLine*256+VNSCLIP), "D" (ScreenLoc+((240-FSettings.TotalScanlines())/2)*pitch+(640-(VNSWID<<1))/2),"b" (FSettings.TotalScanlines()), "c" ((pitch-VNSWID)<<1) + : "%al", "%edx", "%cc" ); + } + else + { + asm volatile( + "yoop1:\n\t" + "movb $128,%%al \n\t" + "yoop2:\n\t" + "movb 1(%%esi),%%dh\n\t" + "movb %%dh,%%dl\n\t" + "shl $16,%%edx\n\t" + "movb (%%esi),%%dl\n\t" + "movb %%dl,%%dh\n\t" // Ugh + "movl %%edx,(%%edi)\n\t" + "addl $2,%%esi\n\t" + "addl $4,%%edi\n\t" + "decb %%al\n\t" + "jne yoop2\n\t" + "addl %%ecx,%%edi\n\t" + "decb %%bl\n\t" + "jne yoop1\n\t" + : + : "S" (XBuf+FSettings.FirstSLine*256), "D" (ScreenLoc+((240-FSettings.TotalScanlines())/2)*pitch+(640-512)/2),"b" (FSettings.TotalScanlines()), "c" (pitch-512+pitch) + : "%al", "%edx", "%cc" ); + } + } + else +#endif + //mbg 6/29/06 merge + { + if(!(vmodes[vmod].flags&VMDF_DXBLT)) + { + if(vmodes[vmod].special) + ScreenLoc += (vmodes[vmod].drect.left*(bpp>>3)) + ((vmodes[vmod].drect.top)*pitch); + else + ScreenLoc+=((vmodes[vmod].x-VNSWID)>>1)*(bpp>>3)+(((vmodes[vmod].y-FSettings.TotalScanlines())>>1))*pitch; + } - if(bpp>=16) - { - Blit8ToHigh(XBuf+FSettings.FirstSLine*256+VNSCLIP,(uint8*)ScreenLoc, VNSWID, FSettings.TotalScanlines(), pitch,specmul,specmul); //mbg merge 7/17/06 added cast - } - else - { - XBuf+=FSettings.FirstSLine*256+VNSCLIP; - if(vmodes[vmod].special) - Blit8To8(XBuf,(uint8*)ScreenLoc, VNSWID, FSettings.TotalScanlines(), pitch,vmodes[vmod].xscale,vmodes[vmod].yscale,0,vmodes[vmod].special); //mbg merge 7/17/06 added cast - else - Blit8To8(XBuf,(uint8*)ScreenLoc, VNSWID, FSettings.TotalScanlines(), pitch,1,1,0,0); //mbg merge 7/17/06 added cast - } - } + if(bpp>=16) + { + Blit8ToHigh(XBuf+FSettings.FirstSLine*256+VNSCLIP,(uint8*)ScreenLoc, VNSWID, FSettings.TotalScanlines(), pitch,specmul,specmul); //mbg merge 7/17/06 added cast + } + else + { + XBuf+=FSettings.FirstSLine*256+VNSCLIP; + if(vmodes[vmod].special) + Blit8To8(XBuf,(uint8*)ScreenLoc, VNSWID, FSettings.TotalScanlines(), pitch,vmodes[vmod].xscale,vmodes[vmod].yscale,0,vmodes[vmod].special); //mbg merge 7/17/06 added cast + else + Blit8To8(XBuf,(uint8*)ScreenLoc, VNSWID, FSettings.TotalScanlines(), pitch,1,1,0,0); //mbg merge 7/17/06 added cast + } + } - if(vmodes[vmod].flags&VMDF_DXBLT) - { - IDirectDrawSurface7_Unlock(lpDDSBack, NULL); + if(vmodes[vmod].flags&VMDF_DXBLT) + { + IDirectDrawSurface7_Unlock(lpDDSBack, NULL); - if(veflags&2) - { - if(IDirectDrawSurface7_Lock(lpDDSVPrimary,NULL,&ddsd, 0, NULL)==DD_OK) - { - memset(ddsd.lpSurface,0,ddsd.lPitch*vmodes[vmod].y); //mbg merge 7/17/06 removing dummyunion stuff - IDirectDrawSurface7_Unlock(lpDDSVPrimary, NULL); - veflags&=~2; - } - } + if(veflags&2) + { + if(IDirectDrawSurface7_Lock(lpDDSVPrimary,NULL,&ddsd, 0, NULL)==DD_OK) + { + memset(ddsd.lpSurface,0,ddsd.lPitch*vmodes[vmod].y); //mbg merge 7/17/06 removing dummyunion stuff + IDirectDrawSurface7_Unlock(lpDDSVPrimary, NULL); + veflags&=~2; + } + } - - if(IDirectDrawSurface7_Blt(lpDDSVPrimary, &drect,lpDDSBack,&srect,DDBLT_ASYNC,0)!=DD_OK) - { - ddrval=IDirectDrawSurface7_Blt(lpDDSVPrimary, &drect,lpDDSBack,&srect,DDBLT_WAIT,0); - if(ddrval!=DD_OK) - { - if(ddrval==DDERR_SURFACELOST) - { - RestoreDD(0); - RestoreDD(1); - } - return; - } - } - } - else - IDirectDrawSurface7_Unlock(lpDDSVPrimary, NULL); - if(fssync==3) - { - IDirectDrawSurface7_Flip(lpDDSPrimary,0,0); + if(IDirectDrawSurface7_Blt(lpDDSVPrimary, &drect,lpDDSBack,&srect,DDBLT_ASYNC,0)!=DD_OK) + { + ddrval=IDirectDrawSurface7_Blt(lpDDSVPrimary, &drect,lpDDSBack,&srect,DDBLT_WAIT,0); + if(ddrval!=DD_OK) + { + if(ddrval==DDERR_SURFACELOST) + { + RestoreDD(0); + RestoreDD(1); + } + return; + } - } + } + } + else + IDirectDrawSurface7_Unlock(lpDDSVPrimary, NULL); + if(fssync==3) + { + IDirectDrawSurface7_Flip(lpDDSPrimary,0,0); + + } } +#define RELEASE(x) if(x) { x->Release(); x = 0; } + void ResetVideo(void) { - ShowCursorAbs(1); - KillBlitToHigh(); - if(lpDD7) - if(mustrestore) - {IDirectDraw7_RestoreDisplayMode(lpDD7);mustrestore=0;} - if(lpddpal) {IDirectDrawPalette_Release(lpddpal); lpddpal = 0;} - if(lpDDSBack) {IDirectDrawSurface7_Release(lpDDSBack);lpDDSBack=0;} - if(lpDDSPrimary) {IDirectDrawSurface7_Release(lpDDSPrimary);lpDDSPrimary=0;} - if(lpClipper) {IDirectDrawClipper_Release(lpClipper);lpClipper=0;} - if(lpDD7) - { IDirectDraw_Release(lpDD7); lpDD7 = NULL; } + ShowCursorAbs(1); + KillBlitToHigh(); + if(lpDD7) + if(mustrestore) + { + IDirectDraw7_RestoreDisplayMode(lpDD7); + mustrestore=0; + } + RELEASE(lpddpal); + RELEASE(lpDDSBack); + RELEASE(lpDDSPrimary); + RELEASE(lpClipper); + RELEASE(lpDD7); } int specialmlut[5] = {1,2,2,3,3}; static int RecalcCustom(void) { - vmdef *cmode = &vmodes[0]; + vmdef *cmode = &vmodes[0]; - cmode->flags&=~VMDF_DXBLT; + cmode->flags&=~VMDF_DXBLT; - if(cmode->flags&VMDF_STRFS) - { - cmode->flags|=VMDF_DXBLT; - } - else if(cmode->xscale!=1 || cmode->yscale!=1 || cmode->special) - { - if(cmode->special) - { - int mult = specialmlut[cmode->special]; + if(cmode->flags&VMDF_STRFS) + { + cmode->flags|=VMDF_DXBLT; + } + else if(cmode->xscale!=1 || cmode->yscale!=1 || cmode->special) + { + if(cmode->special) + { + int mult = specialmlut[cmode->special]; - if(cmode->xscale < mult) - cmode->xscale = mult; - if(cmode->yscale < mult) - cmode->yscale = mult; + if(cmode->xscale < mult) + cmode->xscale = mult; + if(cmode->yscale < mult) + cmode->yscale = mult; - if(cmode->xscale != mult || cmode->yscale != mult) - cmode->flags|=VMDF_DXBLT; - } - else - cmode->flags|=VMDF_DXBLT; + if(cmode->xscale != mult || cmode->yscale != mult) + cmode->flags|=VMDF_DXBLT; + } + else + cmode->flags|=VMDF_DXBLT; - if(VNSWID*cmode->xscale>cmode->x) - { - if(cmode->special) - { - FCEUD_PrintError("Scaled width is out of range."); - return(0); - } - else - { - FCEUD_PrintError("Scaled width is out of range. Reverting to no horizontal scaling."); - cmode->xscale=1; - } - } - if(FSettings.TotalScanlines()*cmode->yscale>cmode->y) - { - if(cmode->special) - { - FCEUD_PrintError("Scaled height is out of range."); - return(0); - } - else - { - FCEUD_PrintError("Scaled height is out of range. Reverting to no vertical scaling."); - cmode->yscale=1; - } - } + if(VNSWID*cmode->xscale>cmode->x) + { + if(cmode->special) + { + FCEUD_PrintError("Scaled width is out of range."); + return(0); + } + else + { + FCEUD_PrintError("Scaled width is out of range. Reverting to no horizontal scaling."); + cmode->xscale=1; + } + } + if(FSettings.TotalScanlines()*cmode->yscale>cmode->y) + { + if(cmode->special) + { + FCEUD_PrintError("Scaled height is out of range."); + return(0); + } + else + { + FCEUD_PrintError("Scaled height is out of range. Reverting to no vertical scaling."); + cmode->yscale=1; + } + } - cmode->srect.left=VNSCLIP; - cmode->srect.top=FSettings.FirstSLine; - cmode->srect.right=256-VNSCLIP; - cmode->srect.bottom=FSettings.LastSLine+1; + cmode->srect.left=VNSCLIP; + cmode->srect.top=FSettings.FirstSLine; + cmode->srect.right=256-VNSCLIP; + cmode->srect.bottom=FSettings.LastSLine+1; - cmode->drect.top=(cmode->y-(FSettings.TotalScanlines()*cmode->yscale))>>1; - cmode->drect.bottom=cmode->drect.top+FSettings.TotalScanlines()*cmode->yscale; - - cmode->drect.left=(cmode->x-(VNSWID*cmode->xscale))>>1; - cmode->drect.right=cmode->drect.left+VNSWID*cmode->xscale; - } + cmode->drect.top=(cmode->y-(FSettings.TotalScanlines()*cmode->yscale))>>1; + cmode->drect.bottom=cmode->drect.top+FSettings.TotalScanlines()*cmode->yscale; - if((cmode->special == 1 || cmode->special == 3) && cmode->bpp == 8) - { - cmode->bpp = 32; - //FCEUD_PrintError("HQ2x/HQ3x requires 16bpp or 32bpp(best)."); - //return(0); - } + cmode->drect.left=(cmode->x-(VNSWID*cmode->xscale))>>1; + cmode->drect.right=cmode->drect.left+VNSWID*cmode->xscale; + } - if(cmode->xyflags&VMDF_STRFS)) - { - FCEUD_PrintError("Vertical resolution must not be less than the total number of drawn scanlines."); - return(0); - } + if((cmode->special == 1 || cmode->special == 3) && cmode->bpp == 8) + { + cmode->bpp = 32; + //FCEUD_PrintError("HQ2x/HQ3x requires 16bpp or 32bpp(best)."); + //return(0); + } - return(1); + if(cmode->xyflags&VMDF_STRFS)) + { + FCEUD_PrintError("Vertical resolution must not be less than the total number of drawn scanlines."); + return(0); + } + + return(1); } BOOL SetDlgItemDouble(HWND hDlg, int item, double value) { - char buf[9]; //mbg merge 7/19/06 changed to 9 to leave room for \0 - sprintf(buf,"%.6f",value); - return SetDlgItemText(hDlg, item, buf); //mbg merge 7/17/06 added this return value + char buf[9]; //mbg merge 7/19/06 changed to 9 to leave room for \0 + sprintf(buf,"%.6f",value); + return SetDlgItemText(hDlg, item, buf); //mbg merge 7/17/06 added this return value } double GetDlgItemDouble(HWND hDlg, int item) { - char buf[8]; - double ret = 0; + char buf[8]; + double ret = 0; - GetDlgItemText(hDlg, item, buf, 8); - sscanf(buf,"%lf",&ret); - return(ret); + GetDlgItemText(hDlg, item, buf, 8); + sscanf(buf,"%lf",&ret); + return(ret); } BOOL CALLBACK VideoConCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { - static char *vmstr[11]={ - "Custom", - "320x240 Full Screen", - "512x384 Centered", - "640x480 Centered", - "640x480 Scanlines", - "640x480 \"4 per 1\"", - "640x480 2x,2y", - "1024x768 4x,3y", - "1280x1024 5x,4y", - "1600x1200 6x,5y", - "800x600 Stretched" - }; - int x; + static char *vmstr[11]={ + "Custom", + "320x240 Full Screen", + "512x384 Centered", + "640x480 Centered", + "640x480 Scanlines", + "640x480 \"4 per 1\"", + "640x480 2x,2y", + "1024x768 4x,3y", + "1280x1024 5x,4y", + "1600x1200 6x,5y", + "800x600 Stretched" + }; + int x; - switch(uMsg) - { - case WM_INITDIALOG: - for(x=0;x<11;x++) - SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_MODE,CB_ADDSTRING,0,(LPARAM)(LPSTR)vmstr[x]); - SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_MODE,CB_SETCURSEL,vmod,(LPARAM)(LPSTR)0); + switch(uMsg) + { + case WM_INITDIALOG: + for(x=0;x<11;x++) + SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_MODE,CB_ADDSTRING,0,(LPARAM)(LPSTR)vmstr[x]); + SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_MODE,CB_SETCURSEL,vmod,(LPARAM)(LPSTR)0); - SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_BPP,CB_ADDSTRING,0,(LPARAM)(LPSTR)"8"); - SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_BPP,CB_ADDSTRING,0,(LPARAM)(LPSTR)"16"); - SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_BPP,CB_ADDSTRING,0,(LPARAM)(LPSTR)"24"); - SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_BPP,CB_ADDSTRING,0,(LPARAM)(LPSTR)"32"); - SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_BPP,CB_SETCURSEL,(vmodes[0].bpp>>3)-1,(LPARAM)(LPSTR)0); + SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_BPP,CB_ADDSTRING,0,(LPARAM)(LPSTR)"8"); + SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_BPP,CB_ADDSTRING,0,(LPARAM)(LPSTR)"16"); + SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_BPP,CB_ADDSTRING,0,(LPARAM)(LPSTR)"24"); + SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_BPP,CB_ADDSTRING,0,(LPARAM)(LPSTR)"32"); + SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_BPP,CB_SETCURSEL,(vmodes[0].bpp>>3)-1,(LPARAM)(LPSTR)0); - SetDlgItemInt(hwndDlg,IDC_VIDEOCONFIG_XRES,vmodes[0].x,0); - SetDlgItemInt(hwndDlg,IDC_VIDEOCONFIG_YRES,vmodes[0].y,0); + SetDlgItemInt(hwndDlg,IDC_VIDEOCONFIG_XRES,vmodes[0].x,0); + SetDlgItemInt(hwndDlg,IDC_VIDEOCONFIG_YRES,vmodes[0].y,0); - SetDlgItemInt(hwndDlg,IDC_VIDEOCONFIG_XSCALE,vmodes[0].xscale,0); - SetDlgItemInt(hwndDlg,IDC_VIDEOCONFIG_YSCALE,vmodes[0].yscale,0); - CheckRadioButton(hwndDlg,IDC_RADIO_SCALE,IDC_RADIO_STRETCH,(vmodes[0].flags&VMDF_STRFS)?IDC_RADIO_STRETCH:IDC_RADIO_SCALE); + SetDlgItemInt(hwndDlg,IDC_VIDEOCONFIG_XSCALE,vmodes[0].xscale,0); + SetDlgItemInt(hwndDlg,IDC_VIDEOCONFIG_YSCALE,vmodes[0].yscale,0); + CheckRadioButton(hwndDlg,IDC_RADIO_SCALE,IDC_RADIO_STRETCH,(vmodes[0].flags&VMDF_STRFS)?IDC_RADIO_STRETCH:IDC_RADIO_SCALE); - { - char *str[]={"","hq2x","Scale2x","hq3x","Scale3x"}; - int x; - for(x=0;x<5;x++) - { - SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SCALER_FS,CB_ADDSTRING,0,(LPARAM)(LPSTR)str[x]); - SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SCALER_WIN,CB_ADDSTRING,0,(LPARAM)(LPSTR)str[x]); - } - } - SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SCALER_FS,CB_SETCURSEL,vmodes[0].special,(LPARAM)(LPSTR)0); - SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SCALER_WIN,CB_SETCURSEL,winspecial,(LPARAM)(LPSTR)0); + { + char *str[]={"","hq2x","Scale2x","hq3x","Scale3x"}; + int x; + for(x=0;x<5;x++) + { + SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SCALER_FS,CB_ADDSTRING,0,(LPARAM)(LPSTR)str[x]); + SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SCALER_WIN,CB_ADDSTRING,0,(LPARAM)(LPSTR)str[x]); + } + } + SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SCALER_FS,CB_SETCURSEL,vmodes[0].special,(LPARAM)(LPSTR)0); + SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SCALER_WIN,CB_SETCURSEL,winspecial,(LPARAM)(LPSTR)0); - if(eoptions&EO_FSAFTERLOAD) - CheckDlgButton(hwndDlg,IDC_VIDEOCONFIG_AUTO_FS,BST_CHECKED); + if(eoptions&EO_FSAFTERLOAD) + CheckDlgButton(hwndDlg,IDC_VIDEOCONFIG_AUTO_FS,BST_CHECKED); - if(eoptions&EO_CLIPSIDES) - CheckDlgButton(hwndDlg,IDC_VIDEOCONFIG_CLIPSIDES,BST_CHECKED); + if(eoptions&EO_CLIPSIDES) + CheckDlgButton(hwndDlg,IDC_VIDEOCONFIG_CLIPSIDES,BST_CHECKED); - if(disvaccel&1) - CheckDlgButton(hwndDlg,IDC_DISABLE_HW_ACCEL_WIN,BST_CHECKED); + if(disvaccel&1) + CheckDlgButton(hwndDlg,IDC_DISABLE_HW_ACCEL_WIN,BST_CHECKED); - if(disvaccel&2) - CheckDlgButton(hwndDlg,IDC_DISABLE_HW_ACCEL_FS,BST_CHECKED); + if(disvaccel&2) + CheckDlgButton(hwndDlg,IDC_DISABLE_HW_ACCEL_FS,BST_CHECKED); - if(eoptions&EO_FORCEISCALE) - CheckDlgButton(hwndDlg,IDC_FORCE_INT_VIDEO_SCALARS,BST_CHECKED); + if(eoptions&EO_FORCEISCALE) + CheckDlgButton(hwndDlg,IDC_FORCE_INT_VIDEO_SCALARS,BST_CHECKED); - if(eoptions&EO_FORCEASPECT) - CheckDlgButton(hwndDlg,IDC_FORCE_ASPECT_CORRECTION,BST_CHECKED); + if(eoptions&EO_FORCEASPECT) + CheckDlgButton(hwndDlg,IDC_FORCE_ASPECT_CORRECTION,BST_CHECKED); - SetDlgItemInt(hwndDlg,IDC_SCANLINE_FIRST_NTSC,srendlinen,0); - SetDlgItemInt(hwndDlg,IDC_SCANLINE_LAST_NTSC,erendlinen,0); + SetDlgItemInt(hwndDlg,IDC_SCANLINE_FIRST_NTSC,srendlinen,0); + SetDlgItemInt(hwndDlg,IDC_SCANLINE_LAST_NTSC,erendlinen,0); - SetDlgItemInt(hwndDlg,IDC_SCANLINE_FIRST_PAL,srendlinep,0); - SetDlgItemInt(hwndDlg,IDC_SCANLINE_LAST_PAL,erendlinep,0); + SetDlgItemInt(hwndDlg,IDC_SCANLINE_FIRST_PAL,srendlinep,0); + SetDlgItemInt(hwndDlg,IDC_SCANLINE_LAST_PAL,erendlinep,0); - SetDlgItemDouble(hwndDlg, IDC_WINSIZE_MUL_X, winsizemulx); - SetDlgItemDouble(hwndDlg, IDC_WINSIZE_MUL_Y, winsizemuly); - SetDlgItemDouble(hwndDlg, IDC_VIDEOCONFIG_ASPECT_X, saspectw); - SetDlgItemDouble(hwndDlg, IDC_VIDEOCONFIG_ASPECT_Y, saspecth); + SetDlgItemDouble(hwndDlg, IDC_WINSIZE_MUL_X, winsizemulx); + SetDlgItemDouble(hwndDlg, IDC_WINSIZE_MUL_Y, winsizemuly); + SetDlgItemDouble(hwndDlg, IDC_VIDEOCONFIG_ASPECT_X, saspectw); + SetDlgItemDouble(hwndDlg, IDC_VIDEOCONFIG_ASPECT_Y, saspecth); - SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SYNC_METHOD_WIN,CB_ADDSTRING,0,(LPARAM)(LPSTR)""); - SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SYNC_METHOD_FS,CB_ADDSTRING,0,(LPARAM)(LPSTR)""); + SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SYNC_METHOD_WIN,CB_ADDSTRING,0,(LPARAM)(LPSTR)""); + SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SYNC_METHOD_FS,CB_ADDSTRING,0,(LPARAM)(LPSTR)""); - SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SYNC_METHOD_WIN,CB_ADDSTRING,0,(LPARAM)(LPSTR)"Wait for VBlank"); - SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SYNC_METHOD_WIN,CB_ADDSTRING,0,(LPARAM)(LPSTR)"Lazy wait for VBlank"); + SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SYNC_METHOD_WIN,CB_ADDSTRING,0,(LPARAM)(LPSTR)"Wait for VBlank"); + SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SYNC_METHOD_WIN,CB_ADDSTRING,0,(LPARAM)(LPSTR)"Lazy wait for VBlank"); - SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SYNC_METHOD_FS,CB_ADDSTRING,0,(LPARAM)(LPSTR)"Wait for VBlank"); - SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SYNC_METHOD_FS,CB_ADDSTRING,0,(LPARAM)(LPSTR)"Lazy wait for VBlank"); - SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SYNC_METHOD_FS,CB_ADDSTRING,0,(LPARAM)(LPSTR)"Double Buffering"); + SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SYNC_METHOD_FS,CB_ADDSTRING,0,(LPARAM)(LPSTR)"Wait for VBlank"); + SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SYNC_METHOD_FS,CB_ADDSTRING,0,(LPARAM)(LPSTR)"Lazy wait for VBlank"); + SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SYNC_METHOD_FS,CB_ADDSTRING,0,(LPARAM)(LPSTR)"Double Buffering"); - SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SYNC_METHOD_WIN,CB_SETCURSEL,winsync,(LPARAM)(LPSTR)0); - SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SYNC_METHOD_FS,CB_SETCURSEL,fssync,(LPARAM)(LPSTR)0); + SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SYNC_METHOD_WIN,CB_SETCURSEL,winsync,(LPARAM)(LPSTR)0); + SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SYNC_METHOD_FS,CB_SETCURSEL,fssync,(LPARAM)(LPSTR)0); - if(eoptions&EO_NOSPRLIM) - CheckDlgButton(hwndDlg,IDC_VIDEOCONFIG_NO8LIM,BST_CHECKED); + if(eoptions&EO_NOSPRLIM) + CheckDlgButton(hwndDlg,IDC_VIDEOCONFIG_NO8LIM,BST_CHECKED); - break; - case WM_CLOSE: - case WM_QUIT: goto gornk; - case WM_COMMAND: - if(!(wParam>>16)) - switch(wParam&0xFFFF) - { - case BTN_CLOSE: - gornk: - - if(IsDlgButtonChecked(hwndDlg,IDC_VIDEOCONFIG_CLIPSIDES)==BST_CHECKED) - eoptions|=EO_CLIPSIDES; - else - eoptions&=~EO_CLIPSIDES; + break; + case WM_CLOSE: + case WM_QUIT: goto gornk; + case WM_COMMAND: + if(!(wParam>>16)) + switch(wParam&0xFFFF) + { + case BTN_CLOSE: +gornk: - if(IsDlgButtonChecked(hwndDlg,IDC_VIDEOCONFIG_NO8LIM)==BST_CHECKED) - eoptions|=EO_NOSPRLIM; - else - eoptions&=~EO_NOSPRLIM; + if(IsDlgButtonChecked(hwndDlg,IDC_VIDEOCONFIG_CLIPSIDES)==BST_CHECKED) + eoptions|=EO_CLIPSIDES; + else + eoptions&=~EO_CLIPSIDES; - srendlinen=GetDlgItemInt(hwndDlg,IDC_SCANLINE_FIRST_NTSC,0,0); - erendlinen=GetDlgItemInt(hwndDlg,IDC_SCANLINE_LAST_NTSC,0,0); - srendlinep=GetDlgItemInt(hwndDlg,IDC_SCANLINE_FIRST_PAL,0,0); - erendlinep=GetDlgItemInt(hwndDlg,IDC_SCANLINE_LAST_PAL,0,0); + if(IsDlgButtonChecked(hwndDlg,IDC_VIDEOCONFIG_NO8LIM)==BST_CHECKED) + eoptions|=EO_NOSPRLIM; + else + eoptions&=~EO_NOSPRLIM; + + srendlinen=GetDlgItemInt(hwndDlg,IDC_SCANLINE_FIRST_NTSC,0,0); + erendlinen=GetDlgItemInt(hwndDlg,IDC_SCANLINE_LAST_NTSC,0,0); + srendlinep=GetDlgItemInt(hwndDlg,IDC_SCANLINE_FIRST_PAL,0,0); + erendlinep=GetDlgItemInt(hwndDlg,IDC_SCANLINE_LAST_PAL,0,0); - if(erendlinen>239) erendlinen=239; - if(srendlinen>erendlinen) srendlinen=erendlinen; + if(erendlinen>239) erendlinen=239; + if(srendlinen>erendlinen) srendlinen=erendlinen; - if(erendlinep>239) erendlinep=239; - if(srendlinep>erendlinen) srendlinep=erendlinep; + if(erendlinep>239) erendlinep=239; + if(srendlinep>erendlinen) srendlinep=erendlinep; - UpdateRendBounds(); + UpdateRendBounds(); - if(IsDlgButtonChecked(hwndDlg,IDC_RADIO_STRETCH)==BST_CHECKED) - vmodes[0].flags|=VMDF_STRFS; - else - vmodes[0].flags&=~VMDF_STRFS; + if(IsDlgButtonChecked(hwndDlg,IDC_RADIO_STRETCH)==BST_CHECKED) + vmodes[0].flags|=VMDF_STRFS; + else + vmodes[0].flags&=~VMDF_STRFS; - vmod=SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_MODE,CB_GETCURSEL,0,(LPARAM)(LPSTR)0); - vmodes[0].x=GetDlgItemInt(hwndDlg,IDC_VIDEOCONFIG_XRES,0,0); - vmodes[0].y=GetDlgItemInt(hwndDlg,IDC_VIDEOCONFIG_YRES,0,0); - vmodes[0].bpp=(SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_BPP,CB_GETCURSEL,0,(LPARAM)(LPSTR)0)+1)<<3; + vmod=SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_MODE,CB_GETCURSEL,0,(LPARAM)(LPSTR)0); + vmodes[0].x=GetDlgItemInt(hwndDlg,IDC_VIDEOCONFIG_XRES,0,0); + vmodes[0].y=GetDlgItemInt(hwndDlg,IDC_VIDEOCONFIG_YRES,0,0); + vmodes[0].bpp=(SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_BPP,CB_GETCURSEL,0,(LPARAM)(LPSTR)0)+1)<<3; - vmodes[0].xscale=GetDlgItemInt(hwndDlg,IDC_VIDEOCONFIG_XSCALE,0,0); - vmodes[0].yscale=GetDlgItemInt(hwndDlg,IDC_VIDEOCONFIG_YSCALE,0,0); - vmodes[0].special=SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SCALER_FS,CB_GETCURSEL,0,(LPARAM)(LPSTR)0); + vmodes[0].xscale=GetDlgItemInt(hwndDlg,IDC_VIDEOCONFIG_XSCALE,0,0); + vmodes[0].yscale=GetDlgItemInt(hwndDlg,IDC_VIDEOCONFIG_YSCALE,0,0); + vmodes[0].special=SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SCALER_FS,CB_GETCURSEL,0,(LPARAM)(LPSTR)0); - winspecial = SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SCALER_WIN,CB_GETCURSEL,0,(LPARAM)(LPSTR)0); - disvaccel = 0; + winspecial = SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SCALER_WIN,CB_GETCURSEL,0,(LPARAM)(LPSTR)0); + disvaccel = 0; - if(IsDlgButtonChecked(hwndDlg,IDC_DISABLE_HW_ACCEL_WIN)==BST_CHECKED) - disvaccel |= 1; - if(IsDlgButtonChecked(hwndDlg,IDC_DISABLE_HW_ACCEL_FS)==BST_CHECKED) - disvaccel |= 2; + if(IsDlgButtonChecked(hwndDlg,IDC_DISABLE_HW_ACCEL_WIN)==BST_CHECKED) + disvaccel |= 1; + if(IsDlgButtonChecked(hwndDlg,IDC_DISABLE_HW_ACCEL_FS)==BST_CHECKED) + disvaccel |= 2; - if(IsDlgButtonChecked(hwndDlg,IDC_VIDEOCONFIG_FS)==BST_CHECKED) - fullscreen=1; - else - fullscreen=0; - if(IsDlgButtonChecked(hwndDlg,IDC_VIDEOCONFIG_AUTO_FS)==BST_CHECKED) - eoptions|=EO_FSAFTERLOAD; - else - eoptions&=~EO_FSAFTERLOAD; + if(IsDlgButtonChecked(hwndDlg,IDC_VIDEOCONFIG_FS)==BST_CHECKED) + fullscreen=1; + else + fullscreen=0; + if(IsDlgButtonChecked(hwndDlg,IDC_VIDEOCONFIG_AUTO_FS)==BST_CHECKED) + eoptions|=EO_FSAFTERLOAD; + else + eoptions&=~EO_FSAFTERLOAD; - eoptions &= ~(EO_FORCEISCALE | EO_FORCEASPECT); - if(IsDlgButtonChecked(hwndDlg,IDC_FORCE_INT_VIDEO_SCALARS)==BST_CHECKED) - eoptions|=EO_FORCEISCALE; - if(IsDlgButtonChecked(hwndDlg,IDC_FORCE_ASPECT_CORRECTION)==BST_CHECKED) - eoptions|=EO_FORCEASPECT; + eoptions &= ~(EO_FORCEISCALE | EO_FORCEASPECT); + if(IsDlgButtonChecked(hwndDlg,IDC_FORCE_INT_VIDEO_SCALARS)==BST_CHECKED) + eoptions|=EO_FORCEISCALE; + if(IsDlgButtonChecked(hwndDlg,IDC_FORCE_ASPECT_CORRECTION)==BST_CHECKED) + eoptions|=EO_FORCEASPECT; - winsizemulx=GetDlgItemDouble(hwndDlg, IDC_WINSIZE_MUL_X); - winsizemuly=GetDlgItemDouble(hwndDlg, IDC_WINSIZE_MUL_Y); - saspectw=GetDlgItemDouble(hwndDlg, IDC_VIDEOCONFIG_ASPECT_X); - saspecth=GetDlgItemDouble(hwndDlg, IDC_VIDEOCONFIG_ASPECT_Y); - FixWXY(0); + winsizemulx=GetDlgItemDouble(hwndDlg, IDC_WINSIZE_MUL_X); + winsizemuly=GetDlgItemDouble(hwndDlg, IDC_WINSIZE_MUL_Y); + saspectw=GetDlgItemDouble(hwndDlg, IDC_VIDEOCONFIG_ASPECT_X); + saspecth=GetDlgItemDouble(hwndDlg, IDC_VIDEOCONFIG_ASPECT_Y); + FixWXY(0); - winsync=SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SYNC_METHOD_WIN,CB_GETCURSEL,0,(LPARAM)(LPSTR)0); - fssync=SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SYNC_METHOD_FS,CB_GETCURSEL,0,(LPARAM)(LPSTR)0); - EndDialog(hwndDlg,0); - break; - } - } - return 0; + winsync=SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SYNC_METHOD_WIN,CB_GETCURSEL,0,(LPARAM)(LPSTR)0); + fssync=SendDlgItemMessage(hwndDlg,IDC_VIDEOCONFIG_SYNC_METHOD_FS,CB_GETCURSEL,0,(LPARAM)(LPSTR)0); + EndDialog(hwndDlg,0); + break; + } + } + return 0; } void SetFSVideoMode() { - changerecursive=1; - if(!SetVideoMode(1)) - SetVideoMode(0); - changerecursive=0; + changerecursive=1; + if(!SetVideoMode(1)) + SetVideoMode(0); + changerecursive=0; } diff --git a/src/fceu.cpp b/src/fceu.cpp index c99d1ba3..1c6fb188 100644 --- a/src/fceu.cpp +++ b/src/fceu.cpp @@ -594,12 +594,12 @@ void RestartMovieOrReset(unsigned int do_power_off) void ResetNES(void) { - FCEUMOV_AddCommand(FCEUNPCMD_RESET); - if(!GameInfo) return; - GameInterface(GI_RESETM2); - FCEUSND_Reset(); - FCEUPPU_Reset(); - X6502_Reset(); + FCEUMOV_AddCommand(FCEUNPCMD_RESET); + if(!GameInfo) return; + GameInterface(GI_RESETM2); + FCEUSND_Reset(); + FCEUPPU_Reset(); + X6502_Reset(); // clear back baffer extern uint8 *XBackBuf; diff --git a/src/git.h b/src/git.h index 0e46fadc..9af60ca2 100644 --- a/src/git.h +++ b/src/git.h @@ -35,9 +35,29 @@ enum ESI SI_POWERPADA = 3, SI_POWERPADB = 4, SI_ARKANOID = 5, - SI_MOUSE = 6 //mbg merge 7/17/06 added + SI_MOUSE = 6, + + SI_COUNT = SI_MOUSE }; +inline const char* ESI_Name(ESI esi) +{ + static const char * const names[] = + { + "", + "Gamepad", + "Zapper", + "Power Pad A", + "Power Pad B", + "Arkanoid Paddle" + }; + + if(esi >= SI_NONE && esi < SI_COUNT) + return names[esi]; + else return ""; +} + + //input device types for the expansion port enum ESIFC { @@ -56,11 +76,41 @@ enum ESIFC SIFC_OEKAKIDS = 11, SIFC_BWORLD = 12, SIFC_TOPRIDER = 13, + + SIFC_COUNT = SIFC_TOPRIDER }; + +inline const char* ESIFC_Name(ESIFC esifc) +{ + static const char * const names[] = + { + "", + "Arkanoid Paddle", + "Hyper Shot gun", + "4-Player Adapter", + "Family Keyboard", + "Subor Keyboard", + "HyperShot Pads", + "Mahjong", + "Quiz King Buzzers", + "Family Trainer A", + "Family Trainer B", + "Oeka Kids Tablet", + "Barcode World", + "Top Rider" + }; + + if(esifc >= SIFC_NONE && esifc < SIFC_COUNT) + return names[esifc]; + else return ""; +} + + #include "utils/md5.h" -typedef struct { +typedef struct +{ uint8 *name; //Game name, UTF8 encoding EGIT type; diff --git a/src/input.cpp b/src/input.cpp index 6532303e..05512040 100644 --- a/src/input.cpp +++ b/src/input.cpp @@ -82,7 +82,8 @@ uint8 FCEU_GetJoyJoy(void) extern uint8 coinon; -static bool FSDisable=false; // Set to true if NES-style four-player adapter is disabled. +//set to true if the fourscore is attached +static bool FSAttached = false; JOYPORT joyports[2] = { JOYPORT(0), JOYPORT(1) }; FCPORT portFC; @@ -93,6 +94,11 @@ static DECLFR(JPRead) ret|=joyports[A&1].driver->Read(A&1); + if(!(A&1) && ret) + { + int zzz=9; + } + if(portFC.driver) ret = portFC.driver->Read(A&1,ret); @@ -120,7 +126,7 @@ static DECLFW(B4016) //mbg 6/7/08 - I guess he means that the input drivers could track the strobing themselves //I dont see why it is unreasonable here. for(int i=0;i<2;i++) - joyports[i].driver->Strobe(0); + joyports[i].driver->Strobe(i); if(portFC.driver) portFC.driver->Strobe(); } @@ -225,7 +231,7 @@ static uint8 ReadGP(int w) else ret = ((joy[w]>>(joy_readbit[w]))&1); if(joy_readbit[w]>=16) ret=0; - if(FSDisable) + if(!FSAttached) { if(joy_readbit[w]>=8) ret|=1; } @@ -486,10 +492,13 @@ void InitializeInput(void) } - -void FCEUI_DisableFourScore(bool disabled) +bool FCEUI_GetInputFourscore() { - FSDisable = disabled; + return FSAttached; +} +void FCEUI_SetInputFourscore(bool attachFourscore) +{ + FSAttached = attachFourscore; } SFORMAT FCEUCTRL_STATEINFO[]={ diff --git a/src/input/zapper.cpp b/src/input/zapper.cpp index cc2a4cbd..ae1d12e5 100644 --- a/src/input/zapper.cpp +++ b/src/input/zapper.cpp @@ -25,7 +25,7 @@ #include "zapper.h" #include "../movie.h" -extern ZAPPER ZD[2]; +static ZAPPER ZD[2]; static void ZapperFrapper(int w, uint8 *bg, uint8 *spr, uint32 linets, int final) { diff --git a/src/input/zapper.h b/src/input/zapper.h index c28b6dc9..13ccde16 100644 --- a/src/input/zapper.h +++ b/src/input/zapper.h @@ -10,6 +10,4 @@ struct ZAPPER uint64 zaphit; }; -static ZAPPER ZD[2]; - #endif diff --git a/src/movie.cpp b/src/movie.cpp index 0289a2bf..52c1ce6e 100644 --- a/src/movie.cpp +++ b/src/movie.cpp @@ -93,41 +93,105 @@ void MovieData::TryDumpIncremental() } const char MovieRecord::mnemonics[8] = {'A','B','S','T','U','D','L','R'}; -void MovieRecord::dump(std::ostream* os, int index) +void MovieRecord::dumpJoy(std::ostream* os, uint8 joystate) +{ + //these are mnemonics for each joystick bit. + //since we usually use the regular joypad, these will be more helpful. + //but any character other than ' ' should count as a set bit + //maybe other input types will need to be encoded another way.. + for(int bit=7;bit>=0;bit--) + { + int bitmask = (1<put(mnemonic); + else //otherwise write a space + os->put(' '); + } +} + +void MovieRecord::parseJoy(std::istream* is, uint8& joystate) +{ + joystate = 0; + for(int bit=7;bit>=0;bit--) + { + int c = is->get(); + if(c == -1) + return; + if(c != ' ') + joystate |= (1<fourscore) + { + parseJoy(is,joysticks[0]); is->get(); //eat the pipe + parseJoy(is,joysticks[1]); is->get(); //eat the pipe + parseJoy(is,joysticks[2]); is->get(); //eat the pipe + parseJoy(is,joysticks[3]); is->get(); //eat the pipe + } + else + { + for(int port=0;port<2;port++) + { + if(md->ports[port] == SI_GAMEPAD) + parseJoy(is, joysticks[port]); + else if(md->ports[port] == SI_ZAPPER) + { + int x,y,b; + *is >> x >> y >> b; + zappers[port].x = x; + zappers[port].y = y; + zappers[port].b = b; + } + + is->get(); //eat the pipe + } + } + + //(no fcexp data is logged right now) + is->get(); //eat the pipe + + //should be left at a newline +} + +void MovieRecord::dump(MovieData* md, std::ostream* os, int index) { //todo: if we want frame numbers in the output (which we dont since we couldnt cut and paste in movies) //but someone would need to change the parser to ignore it //fputc('|',fp); //fprintf(fp,"%08d",index); - os->put('|'); - - //for each joystick - for(int i=0;i<4;i++) + //a special case: if fourscore is enabled, dump four gamepads + if(md->fourscore) { - //these are mnemonics for each joystick bit. - //since we usually use the regular joypad, these will be more helpful. - //but any character other than ' ' should count as a set bit - //maybe other input types will need to be encoded another way.. - for(int bit=7;bit>=0;bit--) + os->put('|'); + dumpJoy(os,joysticks[0]); os->put('|'); + dumpJoy(os,joysticks[1]); os->put('|'); + dumpJoy(os,joysticks[2]); os->put('|'); + dumpJoy(os,joysticks[3]); os->put('|'); + } + else + { + for(int port=0;port<2;port++) { - uint8 &joystate = joysticks[i]; - int bitmask = (1<put(mnemonic); - else //otherwise write a space - os->put(' '); + os->put('|'); + if(md->ports[port] == SI_GAMEPAD) + dumpJoy(os, joysticks[port]); + else if(md->ports[port] == SI_ZAPPER) + *os << setw(3) << setfill('0') << (int)zappers[port].x << ' ' << setw(3) << setfill('0') << (int)zappers[port].y << setw(1) << ' ' << (int)zappers[port].b; } - - //separate the joysticks os->put('|'); } - - //write the zapper state - *os << setw(3) << setfill('0') << (int)zappers[0].x << ' ' << setw(3) << setfill('0') << (int)zappers[0].y << setw(1) << ' ' << (int)zappers[0].b << '|'; - *os << setw(3) << setfill('0') << (int)zappers[1].x << ' ' << setw(3) << setfill('0') << (int)zappers[1].y << setw(1) << ' ' << (int)zappers[1].b; + + //(no fcexp data is logged right now) + os->put('|'); //each frame is on a new line os->put('\n'); @@ -150,27 +214,42 @@ void MovieData::truncateAt(int frame) records.resize(frame); } -void MovieData::installDictionary(TDictionary& dictionary) +void MovieData::installValue(std::string& key, std::string& val) { - dictionary.tryInstallInt("version",version); - dictionary.tryInstallInt("emuVersion",emuVersion); - dictionary.tryInstallInt("recordCount",recordCount); - dictionary.tryInstallBool("palFlag",palFlag); - dictionary.tryInstallBool("poweronFlag",poweronFlag); - dictionary.tryInstallBool("resetFlag",resetFlag); - dictionary.tryInstallString("romFilename",romFilename); - if(dictionary.containsKey("romChecksum")) - StringToBytes(dictionary["romChecksum"],&romChecksum,MD5DATA::size); - if(dictionary.containsKey("guid")) - guid = FCEU_Guid::fromString(dictionary["guid"]); - if(dictionary.containsKey("savestate")) + //todo - use another config system, or drive this from a little data structure. because this is gross + if(key == "version") + installInt(val,version); + else if(key == "emuVersion") + installInt(val,emuVersion); + else if(key == "recordCount") + installInt(val,recordCount); + else if(key == "palFlag") + installBool(val,palFlag); + else if(key == "poweronFlag") + installBool(val,poweronFlag); + else if(key == "resetFlag") + installBool(val,resetFlag); + else if(key == "romFilename") + romFilename = val; + else if(key == "romChecksum") + StringToBytes(val,&romChecksum,MD5DATA::size); + else if(key == "guid") + guid = FCEU_Guid::fromString(val); + else if(key == "fourscore") + installBool(val,fourscore); + else if(key == "port0") + installInt(val,ports[0]); + else if(key == "port1") + installInt(val,ports[1]); + else if(key == "port2") + installInt(val,ports[2]); + else if(key == "savestate") { - std::string& str = dictionary["savestate"]; - int len = HexStringToBytesLength(str); + int len = HexStringToBytesLength(val); if(len >= 1) { savestate.resize(len); - StringToBytes(str,&savestate[0],len); + StringToBytes(val,&savestate[0],len); } } } @@ -186,11 +265,15 @@ void MovieData::dump(std::ostream *os) *os << "romFilename " << romFilename << endl; *os << "romChecksum " << BytesToString(romChecksum.data,MD5DATA::size) << endl; *os << "guid " << guid.toString() << endl; + *os << "fourscore " << (fourscore?1:0) << endl; + *os << "port0 " << ports[0] << endl; + *os << "port1 " << ports[1] << endl; + *os << "port2 " << ports[2] << endl; if(savestate.size() != 0) *os << "savestate " << BytesToString(&savestate[0],savestate.size()) << endl; for(int i=0;i<(int)records.size();i++) - records[i].dump(os,i); + records[i].dump(this,os,i); } int MovieData::dumpLen() @@ -235,10 +318,8 @@ bool FCEUMOV_Mode(int modemask) } //yuck... another custom text parser. -void LoadFM2(MovieData& movieData, FILE *fp) +void LoadFM2(MovieData& movieData, std::istream* fp) { - MovieData::TDictionary dictionary; - std::string key,value; enum { NEWLINE, KEY, SEPARATOR, VALUE, RECORD, COMMENT @@ -247,7 +328,7 @@ void LoadFM2(MovieData& movieData, FILE *fp) for(;;) { bool iswhitespace, isrecchar, isnewline; - int c = fgetc(fp); + int c = fp->get(); if(c == -1) goto bail; iswhitespace = (c==' '||c=='\t'); @@ -269,33 +350,7 @@ void LoadFM2(MovieData& movieData, FILE *fp) { dorecord: MovieRecord record; - //for each joystick - for(int i=0;i<4;i++) - { - uint8& joystate = record.joysticks[i]; - joystate = 0; - for(int bit=7;bit>=0;bit--) - { - int c = fgetc(fp); - if(c == -1) - goto bail; - if(c != ' ') - joystate |= (1<cspecial; -// gametype=GameInfo->type; -// -// InitOtherInput(); -//#endif -} - - static void poweron(bool shouldDisableBatteryLoading) { // make a for-movie-recording power-on clear the game's save data, too @@ -435,7 +466,7 @@ void FCEUMOV_EnterTasEdit() poweron(false); //todo - think about this - ResetInputTypes(); + //ResetInputTypes(); //pause the emulator FCEUI_SetEmulationPaused(1); @@ -485,10 +516,11 @@ void FCEUI_LoadMovie(char *fname, bool _read_only, int _pauseframe) currMovieData = MovieData(); strcpy(curMovieFilename, fname); - FILE* fp = FCEUD_UTF8fopen(fname, "rb"); + std::fstream* fp = FCEUD_UTF8_fstream(fname, "rb"); if (!fp) return; LoadFM2(currMovieData, fp); - fclose(fp); + fp->close(); + delete fp; // fully reload the game to reinitialize everything before playing any movie // to try fixing nondeterministic playback of some games @@ -514,8 +546,8 @@ void FCEUI_LoadMovie(char *fname, bool _read_only, int _pauseframe) else FCEUI_SetVidSystem(0); - //we really need to research this... - ResetInputTypes(); + //force the input configuration stored in the movie to apply + FCEUD_SetInput(currMovieData.fourscore,(ESI)currMovieData.ports[0],(ESI)currMovieData.ports[1],(ESIFC)currMovieData.ports[2]); //stuff that should only happen when we're ready to positively commit to the replay currFrameCounter = 0; @@ -577,6 +609,10 @@ void FCEUI_SaveMovie(char *fname, uint8 flags) currMovieData.resetFlag = (flags & MOVIE_FLAG_FROM_RESET)!=0; currMovieData.romChecksum = GameInfo->MD5; currMovieData.romFilename = FileBase; + currMovieData.fourscore = FCEUI_GetInputFourscore(); + currMovieData.ports[0] = joyports[0].type; + currMovieData.ports[1] = joyports[1].type; + currMovieData.ports[2] = portFC.type; if(currMovieData.poweronFlag) { @@ -591,7 +627,7 @@ void FCEUI_SaveMovie(char *fname, uint8 flags) currMovieData.dump(osRecordingMovie); //todo - think about this - ResetInputTypes(); + //ResetInputTypes(); //todo - think about this // trigger a reset @@ -653,7 +689,7 @@ void FCEUMOV_AddInputState() joyports[0].log(&mr); joyports[1].log(&mr); - mr.dump(osRecordingMovie,currMovieData.records.size()); + mr.dump(&currMovieData, osRecordingMovie,currMovieData.records.size()); currMovieData.records.push_back(mr); } @@ -715,20 +751,17 @@ bool FCEUMOV_ReadState(FILE* st, uint32 size) load_successful = false; //write the state to disk so we can reload - std::vector buf(size); + std::vector buf(size); fread(&buf[0],1,size,st); - FILE* tmp = tmpfile(); - fwrite(&buf[0],1,size,tmp); //--------- //(debug) //FILE* wtf = fopen("d:\\wtf.txt","wb"); //fwrite(&buf[0],1,size,wtf); //fclose(wtf); //--------- - fseek(tmp,0,SEEK_SET); + memorystream mstemp(&buf); MovieData tempMovieData = MovieData(); - LoadFM2(tempMovieData, tmp); - fclose(tmp); + LoadFM2(tempMovieData, &mstemp); //complex TAS logic for when a savestate is loaded: //---------------- @@ -867,15 +900,17 @@ void FCEUI_MoviePlayFromBeginning(void) } -int FCEUI_MovieGetInfo(const char* fname, MOVIE_INFO* info) +bool FCEUI_MovieGetInfo(const char* fname, MOVIE_INFO* info) { memset(info,0,sizeof(MOVIE_INFO)); MovieData md; - FILE* fp = FCEUD_UTF8fopen(fname, "rb"); - if(!fp) return 0; + std::fstream* fp = FCEUD_UTF8_fstream(fname, "rb"); + if(!fp) return false; LoadFM2(md, fp); - fclose(fp); + fp->close(); + delete fp; + info->movie_version = md.version; info->poweron = md.poweronFlag; @@ -889,7 +924,7 @@ int FCEUI_MovieGetInfo(const char* fname, MOVIE_INFO* info) info->name_of_rom_used = md.romFilename; info->rerecord_count = md.recordCount; - return 1; + return true; } diff --git a/src/movie.h b/src/movie.h index 14b0b1c9..ded4bcc1 100644 --- a/src/movie.h +++ b/src/movie.h @@ -27,7 +27,6 @@ bool FCEUMOV_Mode(int modemask); bool FCEUMOV_ShouldPause(void); int FCEUMOV_GetFrame(void); -//int FCEUMOV_WriteState(FILE* st); int FCEUMOV_WriteState(std::ostream* os); bool FCEUMOV_ReadState(FILE* st, uint32 size); void FCEUMOV_PreLoad(); @@ -36,9 +35,10 @@ bool FCEUMOV_PostLoad(); void FCEUMOV_EnterTasEdit(); void FCEUMOV_ExitTasEdit(); - +class MovieData; class MovieRecord { + public: ValueArray joysticks; @@ -79,8 +79,11 @@ public: //a waste of memory in lots of cases.. maybe make it a pointer later? std::vector savestate; - void dump(std::ostream* os, int index); - + void parse(MovieData* md, std::istream* is); + void dump(MovieData* md, std::ostream* os, int index); + void parseJoy(std::istream* is, uint8& joystate); + void dumpJoy(std::ostream* os, uint8 joystate); + static const char mnemonics[8]; private: @@ -106,6 +109,11 @@ public: //this is the RERECORD COUNT. please rename variable. int recordCount; FCEU_Guid guid; + + //which ports are defined for the movie + int ports[3]; + //whether fourscore is enabled + bool fourscore; //----TasEdit stuff--- int greenZoneCount; @@ -142,7 +150,7 @@ public: }; void truncateAt(int frame); - void installDictionary(TDictionary& dictionary); + void installValue(std::string& key, std::string& val); void dump(std::ostream* os); int dumpLen(); void clearRecordRange(int start, int len); @@ -150,6 +158,17 @@ public: static bool loadSavestateFrom(std::vector* buf); static void dumpSavestateTo(std::vector* buf, int compressionLevel); void TryDumpIncremental(); + +private: + void installInt(std::string& val, int& var) + { + var = atoi(val.c_str()); + } + + void installBool(std::string& val, bool& var) + { + var = atoi(val.c_str())!=0; + } }; extern MovieData currMovieData; diff --git a/src/utils/memorystream.h b/src/utils/memorystream.h index ffce93c6..c5c38425 100644 --- a/src/utils/memorystream.h +++ b/src/utils/memorystream.h @@ -31,9 +31,9 @@ private: public: memory_streambuf() - : buf(new T[capacity = 128]) + : buf(new T[capacity = 128]) , myBuf(true) - , length(0) + , length(0) , ww(0) , usevec(0) { @@ -42,8 +42,8 @@ public: //constructs a non-expandable streambuf around the provided buffer memory_streambuf(T* usebuf, int buflength) - : buf(usebuf) - , myBuf(false) + : buf(usebuf) + , myBuf(false) , length(buflength) , ww(0) , usevec(0) @@ -53,10 +53,10 @@ public: //constructs an expandable streambuf around the provided buffer memory_streambuf(std::vector* _usevec) - : capacity(_usevec->size()) - , myBuf(false) - , length(_usevec->size()) - , ww(0) + : capacity(_usevec->size()) + , myBuf(false) + , length(_usevec->size()) + , ww(0) , usevec(_usevec) { if(length>0) diff --git a/src/video.cpp b/src/video.cpp index ed84760b..263a192d 100644 --- a/src/video.cpp +++ b/src/video.cpp @@ -44,7 +44,7 @@ #include "nsf.h" #include "input.h" #include "vsuni.h" -#include "drawing.h" +#include "drawing.h" #include "driver.h" uint8 *XBuf=NULL; @@ -60,7 +60,7 @@ extern uint32 cur_input_display; #ifdef _USE_SHARED_MEMORY_ HANDLE mapXBuf; #endif - + void FCEU_KillVirtualVideo(void) { //mbg merge TODO 7/17/06 temporarily removed