⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 DC的SEGA_GG模拟器源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
						{
						case 0:
							pFolderString = RegistryInfo.ROMPath;
							break;

						case 1:
							pFolderString = RegistryInfo.SRAMPath;
							break;

						case 2:
							pFolderString = RegistryInfo.ScreenshotPath;
							break;

						case 3:
							pFolderString = RegistryInfo.SaveStatePath;
							break;

						case 4:
							pFolderString = RegistryInfo.SoundRecordPath;
							break;
						}

						if (pFolderString[strlen(pFolderString) - 1] != '\\')
						{
							strcat(pFolderString, "\\");
						}

						SetDlgItemText(hwnd, IDC_FOLDERS_TEXT, pFolderString);
						
						break;

					case IDC_DIRECT_DRAW_MODE_COMBO:
						NewMode = Index;
						break;
					}
				}
				break;
			}
		}
		break;

	case WM_HSCROLL:
		{
			if ((HWND)lParam == GetDlgItem(hwnd, IDC_GAMMA_SLIDER))
			{
				RegistryInfo.Gamma = (float)SendMessage(GetDlgItem(hwnd, IDC_GAMMA_SLIDER), TBM_GETPOS, 0, 0) / 20.0f;
				wsprintf(GammaText, "%d.%02d", (int)(RegistryInfo.Gamma * 20.0f) / 20, ((int)(RegistryInfo.Gamma * 20.0f) % 20) * 5);
				SetDlgItemText(hwnd, IDC_GAMMA_TEXT, GammaText);
				bitmap.pal.update = 1;
				UpdatePalette();
				for(vdp.line = 0; vdp.line < LINES_PER_FRAME; vdp.line += 1)
				{
					render_line(vdp.line);
				}
				SendMessage(GetParent(hwnd), WM_PAINT, 0, 0);
			}
			else if ((HWND)lParam == GetDlgItem(hwnd, IDC_FM_VOLUME_SLIDER))
			{
				RegistryInfo.FMVolume = (float)SendMessage(GetDlgItem(hwnd, IDC_FM_VOLUME_SLIDER), TBM_GETPOS, 0, 0) / 100.0f;
				sprintf(FMVolumeText, "%.2f", RegistryInfo.FMVolume);
				SetDlgItemText(hwnd, IDC_FM_VOLUME_TEXT, FMVolumeText);
			}
		}
		break;

	case WM_CLOSE:
		EndDialog(hwnd, 0);

		if ((NewMode != RegistryInfo.FullScreenMode) && FullScreenMode())
		{
			UseDirectDraw = ChangeMode(NewMode, TRUE);
			AdjustWindowSize();
		}

		RegistryInfo.FullScreenMode = NewMode;

		if (NewDirectDrawEnable != RegistryInfo.EnableDirectDraw)
		{
			if (NewDirectDrawEnable)
			{
				UseDirectDraw = ChangeMode(RegistryInfo.FullScreenMode, RegistryInfo.FullScreen);				
			}
			else
			{
				if (FullScreenMode())
				{
					SetScreenScale(RegistryInfo.ScreenScale = 1);
				}

				SwitchInternalRenderingFormat(8);
				UseDirectDraw = FALSE;
			}

		    bitmap.pal.update = 1;
			memset(bitmap.pal.dirty, 1, PALETTE_SIZE);

			AdjustWindowSize();
			EnableMenuItem(hMenu, ID_MENU_CONFIG_SCREEN_SMOOTHING, UseDirectDraw? MF_BYCOMMAND | MF_ENABLED : MF_BYCOMMAND | MF_GRAYED);
			EnableMenuItem(hMenu, ID_MENU_CONFIG_SCREEN_FULL, UseDirectDraw? MF_BYCOMMAND | MF_ENABLED : MF_BYCOMMAND | MF_GRAYED);
		}

		RegistryInfo.EnableDirectDraw = NewDirectDrawEnable;
		break;

    default:
		return FALSE;
	}

	return TRUE;
}

LRESULT CALLBACK AboutProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	switch (msg)
	{
	case WM_INITDIALOG:
		{
			CenterWindowInParent(hwnd);
			ShowWindow(hwnd, SW_SHOW);
		}
		break;

	case WM_CLOSE:
		EndDialog(hwnd, 0);
		break;

    default:
		return FALSE;
	}

	return TRUE;
}

BOOL CreateSingleInstance(char *pCommandLine)
{
	SECURITY_ATTRIBUTES			Security;

	USER_MESSAGE = RegisterWindowMessage(SMS_INSTANCE_LOAD_NAME);

	Security.nLength			  = sizeof(SECURITY_ATTRIBUTES);
	Security.lpSecurityDescriptor = NULL;
	Security.bInheritHandle		  = FALSE;

	Mutex = CreateMutex(&Security, TRUE, SMS_MUTEX_NAME);

	if (Mutex)
	{
		int			State = WaitForSingleObject(Mutex, 0);

		if (State != WAIT_TIMEOUT) return TRUE;
	}

	SendMessage(FindWindow(SMS_CLASS_NAME, NULL), USER_MESSAGE, 0, (long)pCommandLine);

	DestroySingleInstance();

	return FALSE;
}

void DestroySingleInstance(void)
{
	if (Mutex)
	{
		CloseHandle(Mutex);
		Mutex = NULL;
	}
}

void LoadState(void)
{
	char			Filename[MAX_PATH];
	int				Found;
	int				AppendPos;

	wsprintf(Filename, "%s%s", RegistryInfo.SaveStatePath, GetGameName());

	Found = CountSaveStateFiles(Filename, &AppendPos);

	switch (Found)
	{
	case 0:
		return;

	case 1:
		wsprintf(&Filename[AppendPos], "(%04d).sta", 0);
		break;

	default:
		{
			int		SaveState;

			SaveState = DialogBox(GetSMSInstance(), MAKEINTRESOURCE(IDD_SAVESTATE), GetSMShwnd(), SaveStateProc);

			if (SaveState == -1) return;

			wsprintf(&Filename[AppendPos], "(%04d).sta", SaveState);
		}
		break;
	}

	load_state(Filename);

	// Force audio to re-sync
	Frame		  = 0;
	LastTickCount = 0;
}

int	CountSaveStateFiles(char *pFilename, int *pAppendPos)
{
	int				i;
	int				Found = 0;
	HANDLE			FileHandle;

	*pAppendPos = strlen(pFilename);

	for (i = 0 ; i < MAX_SAVE_STATES ; i++)
	{
		// Add a numbered index and the extension .sta
		wsprintf(&pFilename[*pAppendPos], "(%04d).sta", i);

		// Attempt to open a new file
		FileHandle = CreateFile(pFilename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
	
		if (FileHandle != INVALID_HANDLE_VALUE)
		{
			Found++;

			// Close the file
			CloseHandle(FileHandle);
		}
	}

	if (RegistryInfo.SingleSaveState && Found)
	{
		Found = 1;
	}

	return Found;
}

void SaveState(void)
{
	char	Filename[MAX_PATH];
	int		AppendPos;
	int		i;
	HANDLE	FileHandle;

	wsprintf(Filename, "%s%s", RegistryInfo.SaveStatePath, GetGameName());

	AppendPos = strlen(Filename);

	for (i = 0 ; i < MAX_SAVE_STATES ; i++)
	{
		// Add a numbered index and the extension .sta
		wsprintf(&Filename[AppendPos], "(%04d).sta", i);

		if (RegistryInfo.SingleSaveState)
		{
		    FileHandle = CreateFile(Filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
		}
		else
		{
			// Attempt to create a new file
		    FileHandle = CreateFile(Filename, GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
		}

		// If we're successful, stop looking for a new name
		if (FileHandle != INVALID_HANDLE_VALUE) break;
	}

	save_state(Filename, FileHandle);
}

HWND GetSMShwnd(void)
{
	return hwnd;
}

HINSTANCE GetSMSInstance(void)
{
	return hInstance;
}


LRESULT CALLBACK SaveStateProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	static int		SelectedSaveState;

	switch (msg)
	{
	case WM_INITDIALOG:
		{
			char		Filename[MAX_PATH];
			HANDLE		FileHandle;
			int			i;
			int			InsertPos;
			int			AppendPos;

			CenterWindowInParent(hwnd);

			SendMessage(GetDlgItem(hwnd, IDC_SAVESTATE_COMBO), CB_RESETCONTENT, 0, 0);

			wsprintf(Filename, "%s%s", RegistryInfo.SaveStatePath, GetGameName());

			AppendPos = strlen(Filename);

			for (i = 0 ; i < MAX_SAVE_STATES ; i++)
			{
				// Add a numbered index and the extension .sta
				wsprintf(&Filename[AppendPos], "(%04d).sta", i);

				// Attempt to open a new file
				FileHandle = CreateFile(Filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);

				// If we're successful, stop looking for a new name
				if (FileHandle != INVALID_HANDLE_VALUE)
				{
					InsertPos = SendMessage(GetDlgItem(hwnd, IDC_SAVESTATE_COMBO), CB_ADDSTRING, 0, (long)&Filename[strlen(RegistryInfo.SaveStatePath)]);
					SendMessage(GetDlgItem(hwnd, IDC_SAVESTATE_COMBO), CB_SETITEMDATA, InsertPos, i);

					// Close the file
					CloseHandle(FileHandle);
				}
			}

			SelectedSaveState = InsertPos;

			SendMessage(GetDlgItem(hwnd, IDC_SAVESTATE_COMBO), CB_SETCURSEL, SelectedSaveState, 0);

			ShowWindow(hwnd, SW_SHOW);
		}
		break;

	case WM_COMMAND:
		{
			switch (HIWORD(wParam))
			{
			case BN_CLICKED:
				switch (LOWORD(wParam))
				{
				case IDC_OK:
					EndDialog(hwnd, SelectedSaveState);
					break;

				case IDC_CANCEL:
					EndDialog(hwnd, -1);
					break;
				}
				break;
	
			case CBN_SELCHANGE:
				{
					SelectedSaveState = SendMessage(GetDlgItem(hwnd, LOWORD(wParam)), CB_GETCURSEL, 0, 0);
				}
				break;
			}
		}
		break;

	case WM_CLOSE:
		EndDialog(hwnd, -1);
		break;

    default:
		return FALSE;
	}

	return TRUE;
}

void CenterWindowInParent(HWND hwnd)
{
	RECT		ParentRect;
	RECT		OurRect;
	HWND		hParent = GetParent(hwnd);
	POINT		Pos;

	if (!hParent) hParent = GetDesktopWindow();

	GetWindowRect(hParent, &ParentRect);
	GetWindowRect(hwnd, &OurRect);
	Pos.x = (((ParentRect.right - ParentRect.left) - (OurRect.right - OurRect.left)) / 2) + ParentRect.left;
	Pos.y = (((ParentRect.bottom - ParentRect.top) - (OurRect.bottom - OurRect.top)) / 2) + ParentRect.top;

	if (Pos.x < 0) Pos.x = 0;
	if (Pos.y < 0) Pos.y = 0;
	
	SetWindowPos(hwnd, HWND_TOP, Pos.x, Pos.y, 0, 0, SWP_NOSIZE);
}

void GetConsoleScreenRect(RECT *pRect)
{
	if (cart.type == TYPE_GG)
	{
		pRect->left		= 48;
		pRect->top		= 24;
		pRect->right	= 208;
		pRect->bottom	= 168;
	}
	else
	{
		pRect->left		= 0;
		pRect->top		= 0;
		pRect->right	= 256;
		pRect->bottom	= 192;
	}
}

BOOL GetRecordSoundStatus(void)
{
	return RecordingSound;
}

RGBQUAD *GetSMSPalette(void)
{
	return Bmp.Palette;
}

void SwitchInternalRenderingFormat(int BitDepth)
{
	HDC		hDC;

	bitmap.depth					= BitDepth;
    bitmap.pitch					= (bitmap.width * (bitmap.depth >> 3));
	Bmp.BitmapInfoHeader.biBitCount	= BitDepth;

	hDC = GetDC(hwnd);
	DeleteObject(hBitmap);
	hBitmap = CreateDIBitmap(hDC, &Bmp.BitmapInfoHeader, 0, &BitmapData[0], (BITMAPINFO *)&Bmp, DIB_PAL_COLORS);
	ReleaseDC(hwnd, hDC);
}

BOOL DirectDrawAvailable(void)
{
	return UseDirectDraw;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -