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