rendered paste body/*Copyright (C) 1997-2005 ZSNES Team ( zsKnight, _Demo_, pagefault, Nach )http://www.zsnes.comhttp://sourceforge.net/projects/zsnesThis program is free software; you can redistribute it and/ormodify it under the terms of the GNU General Public Licenseas published by the Free Software Foundation; eitherversion 2 of the License, or (at your option) any laterversion.This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with this program; if not, write to the Free SoftwareFoundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.*/#define DIRECTINPUT_VERSION 0x0800#define DIRECTSOUND_VERSION 0x0800extern "C" { #include <windows.h> #include <stdio.h> #include <ddraw.h> //#include <initguid.h> #include <mmsystem.h> #include <time.h> #include "gl_draw.h" }#include <math.h>#include <dsound.h>#include <dinput.h>#include <winuser.h>#include "resource.h"/*December 17 2004 -NachI added some macros for inline assembly to keep compatibility between GCC and MSVCASM_BEGIN is to start an assembly sectionASM_END is to end itASM_COMMAND is for any simple command without a , in it example: dec eaxASM_COMMAND2 is when a command has a , for example: add ebx, 5ASM_COMMAND3 is when the parameter after the , is a variable example: mov eax, my_variableASM_CALL is for calling another function inside assembly sectionasm_call() can be treated like any C function, use it to call an assembly function from any normal C code.*/#ifdef __GNUC__ //MinGW//Simple start and end structure, set as volatile so perhaps we can use -O1+ later#define ASM_BEGIN asm volatile (#define ASM_END );//All commands need quotes and a newline and tab. C vars are _ prefixed#define ASM_COMMAND(line) #line"\n\t"#define ASM_COMMAND2(line, part2) #line", "#part2"\n\t"#define ASM_COMMAND3(line, var) #line", _"#var"\n\t"//Just for the prefix#define ASM_CALL(func) ASM_COMMAND(call _ ## func)//A function call is a simple register backup, call, restore#define asm_call(func) ASM_BEGIN \ASM_COMMAND(pushad) \ASM_CALL(func) \ASM_COMMAND(popad) \ASM_END#else //MSVC#define ASM_BEGIN _asm {#define ASM_END };//MSVC is all straight foward about these#define ASM_COMMAND(line) line#define ASM_COMMAND2(line, part2) line, part2#define ASM_COMMAND3(line, var) ASM_COMMAND2(line, var)//Next is not really special either#define ASM_CALL(func) ASM_COMMAND(call func)//Using this weird style because of MSVCs bad parsing#define asm_call(func) _asm pushad \_asm call func \_asm popad#endifDWORD WindowWidth = 256;DWORD WindowHeight = 224;DWORD FullScreen=0;DWORD Moving=0;DWORD SoundBufferSize=1024*18;DWORD FirstSound=1;int SoundEnabled=1;int UsePrimaryBuffer=0;DWORD FirstActivate = 1;#define BYTE unsigned char#define WORD unsigned short#define DWORD unsigned longHWND hMainWindow;HANDLE debugWindow = 0;/*gl needed*/HDC hDC;HGLRC hRC;BOOL opengl = 1;extern "C"{HINSTANCE hInst;unsigned char KitchenSync = 0;unsigned char Force60hz = 0;}LPDIRECTSOUND8 lpDirectSound = NULL;LPDIRECTSOUNDBUFFER8 lpSoundBuffer = NULL;LPDIRECTSOUNDBUFFER lpPrimaryBuffer = NULL;DSBUFFERDESC dsbd;LPVOID lpvPtr1;DWORD dwBytes1;LPVOID lpvPtr2;DWORD dwBytes2;LPDIRECTDRAW BasiclpDD = NULL;LPDIRECTDRAW7 lpDD = NULL;LPDIRECTDRAWSURFACE7 DD_Primary = NULL;LPDIRECTDRAWSURFACE7 DD_CFB = NULL;LPDIRECTDRAWSURFACE7 DD_CFB16 = NULL;LPDIRECTDRAWSURFACE7 DD_BackBuffer = NULL;LPDIRECTDRAWCLIPPER lpDDClipper = NULL;RECT rcWindow;LPDIRECTINPUT8 DInput = NULL;LPDIRECTINPUTDEVICE8 MouseInput = NULL;LPDIRECTINPUTDEVICE8 KeyboardInput = NULL;LPDIRECTINPUTDEVICE8 JoystickInput[5];DIJOYSTATE js[5];DWORD X1Disable[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};DWORD X2Disable[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};DWORD Y1Disable[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};DWORD Y2Disable[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};DWORD Z1Disable[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};DWORD Z2Disable[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};DWORD RX1Disable[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};DWORD RX2Disable[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};DWORD RY1Disable[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};DWORD RY2Disable[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};DWORD RZ1Disable[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};DWORD RZ2Disable[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};DWORD S01Disable[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};DWORD S02Disable[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};DWORD S11Disable[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};DWORD S12Disable[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};DWORD POVDisable[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};DWORD NumPOV[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};DWORD NumBTN[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};DWORD CurrentJoy=0;DWORD BitDepth;DWORD GBitMask;BYTE BackColor=0;DEVMODE mode;float MouseMinX=0;float MouseMaxX=256;float MouseMinY=0;float MouseMaxY=223;float MouseX;float MouseY;float MouseMoveX;float MouseMoveY;int MouseMove2X;int MouseMove2Y;BYTE MouseButtonPressed;BYTE IsActivated=1;WORD PrevRes=0;RECT BlitArea;BYTE AltSurface=0;extern "C" {DWORD MouseButton;DWORD SurfaceX=0;DWORD SurfaceY=0;}HANDLE hLock, hThread;DWORD dwThreadId, dwThreadParam, semaphore_run;extern "C" {int SemaphoreMax = 5;void InitSemaphore();void ShutdownSemaphore();void InitDebugger();}static char dinput8_dll[] = {"dinput8.dll\0"};static char dinput8_imp[] = {"DirectInput8Create\0"};static char ddraw_dll[] = {"ddraw.dll\0"};static char ddraw_imp[] = {"DirectDrawCreateEx\0"};static char dsound_dll[] = {"dsound.dll\0"};static char dsound_imp[] = {"DirectSoundCreate8\0"};static HMODULE hM_ddraw = NULL, hM_dsound = NULL,hM_dinput8 = NULL;typedef HRESULT (WINAPI* lpDirectInput8Create)(HINSTANCE hinst, DWORD dwVersion, REFIID riidltf, LPVOID *ppvOut, LPUNKNOWN punkOuter);static lpDirectInput8Create pDirectInput8Create;typedef HRESULT (WINAPI* lpDirectDrawCreateEx)( GUID FAR * lpGuid, LPVOID *lplpDD, REFIID iid,IUnknown FAR *pUnkOuter );static lpDirectDrawCreateEx pDirectDrawCreateEx;typedef HRESULT (WINAPI* lpDirectSoundCreate8)(LPCGUID pcGuidDevice, LPDIRECTSOUND8 *ppDS8, LPUNKNOWN pUnkOuter);static lpDirectSoundCreate8 pDirectSoundCreate8;extern "C" void FreeDirectX(){ FreeLibrary(hM_dsound); FreeLibrary(hM_ddraw); FreeLibrary(hM_dinput8); exit(0);}extern "C" void DXLoadError(){ if (MessageBox(NULL, "Sorry, you need to install or reinstall DirectX v8.0 or higher\nto use ZSNESW.\nWould you like to go to the DirectX homepage?", "Error", MB_ICONINFORMATION | MB_YESNO) == IDYES) { ShellExecute(NULL, NULL, "http://www.microsoft.com/directx/", NULL, NULL, 0); } FreeDirectX();}extern "C" void ImportDirectX(){ hM_dinput8 = LoadLibrary(dinput8_dll); if (hM_dinput8 == NULL) { DXLoadError(); } pDirectInput8Create = (lpDirectInput8Create) GetProcAddress(hM_dinput8, dinput8_imp); if (pDirectInput8Create == NULL) { char err[256]; wsprintf(err,"Failed to import %s:%s", dinput8_dll, dinput8_imp); MessageBox(NULL, err, "Error", MB_ICONERROR); DXLoadError(); } hM_ddraw = LoadLibrary(ddraw_dll); if (hM_ddraw == NULL) { char err[256]; wsprintf(err,"Failed to import %s",ddraw_dll); MessageBox(NULL, err,"Error",MB_ICONERROR); DXLoadError(); } pDirectDrawCreateEx = (lpDirectDrawCreateEx) GetProcAddress(hM_ddraw, ddraw_imp); if (pDirectDrawCreateEx == NULL) { char err[256]; wsprintf(err,"Failed to import %s:%s", ddraw_dll, ddraw_imp); MessageBox(NULL, err, "Error", MB_ICONERROR); DXLoadError(); } hM_dsound = LoadLibrary(dsound_dll); if (hM_dsound == NULL) { char err[256]; wsprintf(err,"Failed to import %s",dsound_dll); MessageBox(NULL, err,"Error",MB_ICONERROR); DXLoadError(); } pDirectSoundCreate8 = (lpDirectSoundCreate8) GetProcAddress(hM_dsound, dsound_imp); if (pDirectSoundCreate8 == NULL) { char err[256]; wsprintf(err,"Failed to import %s:%s", dsound_dll, dsound_imp); MessageBox(NULL, err, "Error", MB_ICONERROR); DXLoadError(); }}// milliseconds per world update#define UPDATE_TICKS_GAME (1000.855001760297741789468390082/60.0)#define UPDATE_TICKS_GAMEPAL (20.0)#define UPDATE_TICKS_GUI (1000.0/36.0)#define UPDATE_TICKS_UDP (1000.0/60.0)double start, end, freq, update_ticks_pc, start2, end2, update_ticks_pc2;void ReleaseDirectDraw();void ReleaseDirectSound();void ReleaseDirectInput();int InitDirectDraw();int ReInitSound();extern "C"{ void drawscreenwin(void); DWORD LastUsedPos=0; DWORD CurMode=~0; void initDirectDraw() { InitDirectDraw(); } void reInitSound() { ReInitSound(); }}void DDrawError(){ char message1[256]; sprintf(message1,"Error drawing to the screen\nMake sure the device is not being used by another process \0"); MessageBox (NULL, message1, "DirectDraw Error" , MB_ICONERROR );}extern "C" BYTE vsyncon;extern "C" BYTE KitchenSync;extern "C" BYTE TripleBufferWin;void DrawScreen(){ if (FullScreen == 1) { if (TripleBufferWin == 1 || KitchenSync == 1) { if (DD_BackBuffer->Blt(&rcWindow, DD_CFB, &BlitArea, DDBLT_WAIT, NULL) == DDERR_SURFACELOST) DD_Primary->Restore(); if (DD_Primary->Flip(NULL, DDFLIP_WAIT) == DDERR_SURFACELOST) DD_Primary->Restore(); if (KitchenSync == 1) { if (DD_BackBuffer->Blt(&rcWindow, DD_CFB, &BlitArea, DDBLT_WAIT, NULL) == DDERR_SURFACELOST) DD_Primary->Restore(); if (DD_Primary->Flip(NULL, DDFLIP_WAIT) == DDERR_SURFACELOST) DD_Primary->Restore(); } } else { if (vsyncon == 1) { if (lpDD->WaitForVerticalBlank(DDWAITVB_BLOCKBEGIN, NULL) != DD_OK) { DDrawError(); } } DD_Primary->Blt(&rcWindow, DD_CFB, &BlitArea, DDBLT_WAIT, NULL); DD_Primary->Restore(); } } else { if (vsyncon == 1) { if (lpDD->WaitForVerticalBlank(DDWAITVB_BLOCKBEGIN, NULL) != DD_OK) { DDrawError(); } } DD_Primary->Blt(&rcWindow, AltSurface == 0 ? DD_CFB : DD_CFB16, &BlitArea, DDBLT_WAIT, NULL); }} DWORD InputEn=0;BOOL InputAcquire(void){ if (JoystickInput[0]) JoystickInput[0]->Acquire(); if (JoystickInput[1]) JoystickInput[1]->Acquire(); if (JoystickInput[2]) JoystickInput[2]->Acquire(); if (JoystickInput[3]) JoystickInput[3]->Acquire(); if (JoystickInput[4]) JoystickInput[4]->Acquire(); if (MouseInput) MouseInput->Acquire(); if (KeyboardInput) KeyboardInput->Acquire(); InputEn = 1; return TRUE;}BOOL InputDeAcquire(void){ if (MouseInput) { MouseInput->Unacquire(); } if (KeyboardInput) KeyboardInput->Unacquire(); if (JoystickInput[0]) JoystickInput[0]->Unacquire(); if (JoystickInput[1]) JoystickInput[1]->Unacquire(); if (JoystickInput[2]) JoystickInput[2]->Unacquire(); if (JoystickInput[3]) JoystickInput[3]->Unacquire(); if (JoystickInput[4]) JoystickInput[4]->Unacquire(); InputEn = 0; return TRUE;}extern "C" {void initwinvideo();void DosExit(void);extern BYTE GUIOn;extern BYTE GUIOn2;extern BYTE cfgsoundon;extern BYTE StereoSound;extern DWORD SoundQuality;extern BYTE HighPriority;extern BYTE AlwaysOnTop;extern BYTE SaveMainWindowPos;extern BYTE AllowMultipleInst;extern BYTE DisableScreenSaver;extern BYTE TrapMouseCursor;extern signed short int MainWindowX;extern signed short int MainWindowY;extern int CurKeyPos;extern int CurKeyReadPos;extern int KeyBuffer[16];extern BYTE debugger;}extern "C" void CheckPriority(){ if (HighPriority == 1) SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS); else SetPriorityClass(GetCurrentProcess(), NORMAL_PRIORITY_CLASS);}extern "C" void CheckAlwaysOnTop(){ if (AlwaysOnTop == 1) SetWindowPos(hMainWindow, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); else SetWindowPos(hMainWindow, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);}extern "C" void MinimizeWindow(){ ShowWindow(hMainWindow, SW_MINIMIZE); IsActivated = 0;}extern "C" BYTE MouseWheel;BOOL InputRead(void){ static int PrevZ=0; MouseMoveX=0; MouseMoveY=0; if (MouseInput&&InputEn==1) { DIMOUSESTATE dims; HRESULT hr;aquireagain:; hr=MouseInput->GetDeviceState(sizeof(DIMOUSESTATE),&dims); if (hr==DIERR_INPUTLOST) { hr=MouseInput->Acquire(); if (SUCCEEDED(hr)) { goto aquireagain; } } if (SUCCEEDED(hr)) { MouseMoveX=(float)dims.lX; MouseMoveY=(float)dims.lY; if (MouseWheel == 1) { long zDelta = dims.lZ-PrevZ; if (!dims.lZ) zDelta=0; while (zDelta>0){ zDelta-=40; if (!((CurKeyPos+1==CurKeyReadPos) || ((CurKeyPos+1==16) && (CurKeyReadPos==0)))){ KeyBuffer[CurKeyPos]=72+256; CurKeyPos++; if (CurKeyPos==16) CurKeyPos=0; } } while (zDelta<0){ zDelta+=40; if (!((CurKeyPos+1==CurKeyReadPos) || ((CurKeyPos+1==16) && (CurKeyReadPos==0)))){ KeyBuffer[CurKeyPos]=80+256; CurKeyPos++; if (CurKeyPos==16) CurKeyPos=0; } } PrevZ=dims.lZ; } MouseButton=(dims.rgbButtons[0]>>7)|(dims.rgbButtons[1]>>6)|(dims.rgbButtons[2]>>5)|(dims.rgbButtons[3]>>4); } else { return FALSE; } } return TRUE;}extern "C" void SaveSramData(void);extern "C" void GUISaveVars(void);void ExitFunction(){ if (GUIOn2 == 0) { asm_call(SaveSramData); asm_call(GUISaveVars); } // We need to clean up the debug window if it's running if (debugWindow) FreeConsole(); IsActivated = 0; ReleaseDirectInput(); ReleaseDirectSound(); ReleaseDirectDraw(); FreeLibrary(hM_dsound); FreeLibrary(hM_ddraw); FreeLibrary(hM_dinput8); DestroyWindow(hMainWindow);}LRESULT CALLBACK Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){ static bool shiftpr; bool accept; int vkeyval; switch (uMsg) { case WM_KEYDOWN: // sent when user presses a key if (!((CurKeyPos+1==CurKeyReadPos) || ((CurKeyPos+1==16) && (CurKeyReadPos==0)))){ accept=false; if (wParam==16) shiftpr=true; if (((wParam>='A') && (wParam<='Z')) || ((wParam>='a') && (wParam<='z')) || (wParam==27) || (wParam==32) || (wParam==8) || (wParam==13) || (wParam==9)) { accept=true; vkeyval=wParam; } if ((wParam>='0') && (wParam<='9')) { accept=true; vkeyval=wParam; if (shiftpr) { switch (wParam) { case '1': vkeyval='!'; break; case '2': vkeyval='@'; break; case '3': vkeyval='#'; break; case '4': vkeyval='$'; break; case '5': vkeyval='%'; break; case '6': vkeyval='^'; break; case '7': vkeyval='&'; break; case '8': vkeyval='*'; break; case '9': vkeyval='('; break; case '0': vkeyval=')'; break; } } } if ((wParam>=VK_NUMPAD0) && (wParam<=VK_NUMPAD9)) { accept=true; vkeyval=wParam-VK_NUMPAD0+'0'; } if (!shiftpr){ switch (wParam) { case 189: vkeyval='-'; accept=true; break; case 187: vkeyval='='; accept=true; break; case 219: vkeyval='['; accept=true; break; case 221: vkeyval=']'; accept=true; break; case 186: vkeyval=';'; accept=true; break; case 222: vkeyval=39; accept=true; break; case 188: vkeyval=','; accept=true; break; case 190: vkeyval='.'; accept=true; break; case 191: vkeyval='/'; accept=true; break; case 192: vkeyval='`'; accept=true; break; case 220: vkeyval=92; accept=true; break; } } else { switch (wParam) { case 189: vkeyval='_'; accept=true; break; case 187: vkeyval='+'; accept=true; break; case 219: vkeyval='{'; accept=true; break; case 221: vkeyval='}'; accept=true; break; case 186: vkeyval=':'; accept=true; break; case 222: vkeyval='"'; accept=true; break; case 188: vkeyval='<'; accept=true; break; case 190: vkeyval='>'; accept=true; break; case 191: vkeyval='?'; accept=true; break; case 192: vkeyval='~'; accept=true; break; case 220: vkeyval='|'; accept=true; break; } } switch (wParam) { case 33: vkeyval=256+73; accept=true; break; case 38: vkeyval=256+72; accept=true; break; case 36: vkeyval=256+71; accept=true; break; case 39: vkeyval=256+77; accept=true; break; case 12: vkeyval=256+76; accept=true; break; case 37: vkeyval=256+75; accept=true; break; case 34: vkeyval=256+81; accept=true; break; case 40: vkeyval=256+80; accept=true; break; case 35: vkeyval=256+79; accept=true; break; case 107: vkeyval='+'; accept=true; break; case 109: vkeyval='-'; accept=true; break; case 106: vkeyval='*'; accept=true; break; case 111: vkeyval='/'; accept=true; break; case 110: vkeyval='.'; accept=true; break; } if (accept){ KeyBuffer[CurKeyPos]=vkeyval; CurKeyPos++; if (CurKeyPos==16) CurKeyPos=0; } } break; case WM_KEYUP: // sent when user releases a key if (wParam==16) shiftpr=false; break; case WM_MOUSEMOVE: if (MouseInput) MouseInput->Acquire(); break; case WM_MOVE: break; case WM_PAINT: ValidateRect(hWnd,NULL); break; case WM_ACTIVATE: if (LOWORD(wParam) != WA_INACTIVE) { IsActivated = 1; if (FirstActivate == 0) initwinvideo(); InputAcquire(); if (FirstActivate == 1) FirstActivate = 0; CheckPriority(); } if (LOWORD(wParam) == WA_INACTIVE) { IsActivated = 0; InputDeAcquire(); if (GUIOn || GUIOn2) SetPriorityClass(GetCurrentProcess(), IDLE_PRIORITY_CLASS); } break; case WM_SETFOCUS: if (FullScreen == 0) ShowWindow(hMainWindow, SW_SHOWNORMAL); CheckPriority(); InputAcquire(); break; case WM_KILLFOCUS: InputDeAcquire(); IsActivated = 0; if (GUIOn || GUIOn2) SetPriorityClass(GetCurrentProcess(), IDLE_PRIORITY_CLASS); break; case WM_DESTROY: break; case WM_CLOSE: break; case WM_SYSCOMMAND: if (DisableScreenSaver) { switch (wParam) { case SC_MONITORPOWER: return 0; } } break; } return DefWindowProc(hWnd,uMsg,wParam,lParam);;}int RegisterWinClass(void){ if (AllowMultipleInst == 0) { HWND hFindWindow; hFindWindow = FindWindow("ZSNESWIN", NULL); if (hFindWindow != NULL) { ShowWindow(hFindWindow, SW_SHOWNORMAL); SetForegroundWindow(hFindWindow); DosExit(); } } WNDCLASS wcl; wcl.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW | CS_NOCLOSE; wcl.cbClsExtra = 0; wcl.cbWndExtra = 0; wcl.hIcon = LoadIcon(NULL,"ZSNESW.ICO"); wcl.hCursor = NULL; wcl.hInstance = hInst; wcl.lpfnWndProc = (WNDPROC)Main_Proc; wcl.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); wcl.lpszMenuName = NULL; wcl.lpszClassName = "ZSNESWIN"; if (RegisterClass(&wcl) == 0) return FALSE; return TRUE;}BYTE PrevStereoSound;DWORD PrevSoundQuality;BOOL InitSound(){ WAVEFORMATEX wfx; DSBCAPS dsbcaps; if (cfgsoundon == 0) return FALSE; SoundEnabled = 0; PrevSoundQuality=SoundQuality; PrevStereoSound=StereoSound; if (DS_OK == pDirectSoundCreate8(NULL, &lpDirectSound,NULL)) { lpDirectSound->Initialize(NULL); if (DS_OK != lpDirectSound->SetCooperativeLevel(hMainWindow, DSSCL_NORMAL)) //DSSCL_WRITEPRIMARY, fix this StatMat - make a toggle { if (DS_OK != lpDirectSound->SetCooperativeLevel(hMainWindow, DSSCL_EXCLUSIVE)) return FALSE; } else UsePrimaryBuffer=0; //1, fix this StatMat - make a toggle } else { return FALSE; } wfx.wFormatTag = WAVE_FORMAT_PCM; switch (SoundQuality) { case 0: wfx.nSamplesPerSec = 8000; SoundBufferSize=1024*2; break; case 1: wfx.nSamplesPerSec = 11025; SoundBufferSize=1024*2; break; case 2: wfx.nSamplesPerSec = 22050; SoundBufferSize=1024*4; break; case 3: wfx.nSamplesPerSec = 44100; SoundBufferSize=1024*8; break; case 4: wfx.nSamplesPerSec = 16000; SoundBufferSize=1024*4; break; case 5: wfx.nSamplesPerSec = 32000; SoundBufferSize=1024*8; break; case 6: wfx.nSamplesPerSec = 48000; SoundBufferSize=1024*8; break; default: wfx.nSamplesPerSec = 11025; SoundBufferSize=1024*2; } if (StereoSound==1) { wfx.nChannels = 2; wfx.nBlockAlign = 4; SoundBufferSize*=2; } else { wfx.nChannels = 1; wfx.nBlockAlign = 2; } wfx.wBitsPerSample = 16; wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign; wfx.cbSize=0; memset(&dsbd, 0, sizeof(DSBUFFERDESC)); dsbd.dwSize = sizeof(DSBUFFERDESC); dsbd.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_STICKYFOCUS; if(UsePrimaryBuffer) dsbd.dwFlags |= DSBCAPS_PRIMARYBUFFER; dsbd.dwBufferBytes = UsePrimaryBuffer ? 0 : SoundBufferSize; dsbd.lpwfxFormat = UsePrimaryBuffer ? NULL : &wfx; if (DS_OK == lpDirectSound->CreateSoundBuffer(&dsbd, &lpPrimaryBuffer, NULL)) { if(!UsePrimaryBuffer) { if (DS_OK == lpPrimaryBuffer->QueryInterface(IID_IDirectSoundBuffer8, (LPVOID *) &lpSoundBuffer)) { if (DS_OK != lpSoundBuffer->Play(0,0,DSBPLAY_LOOPING)) { return FALSE; } } else return FALSE; } else { lpPrimaryBuffer->SetFormat(&wfx); dsbcaps.dwSize=sizeof(DSBCAPS); lpPrimaryBuffer->GetCaps(&dsbcaps); SoundBufferSize=dsbcaps.dwBufferBytes; if (DS_OK != lpPrimaryBuffer->Play(0,0,DSBPLAY_LOOPING)) { return FALSE; } } SoundEnabled=1; FirstSound=0; return TRUE; } else { return FALSE; }}BOOL ReInitSound(){ WAVEFORMATEX wfx; DSBCAPS dsbcaps; if (lpSoundBuffer) { lpSoundBuffer->Stop(); lpSoundBuffer->Release(); lpSoundBuffer = NULL; } if (lpPrimaryBuffer) { lpPrimaryBuffer->Stop(); lpPrimaryBuffer->Release(); lpPrimaryBuffer = NULL; } if (cfgsoundon == 0) { SoundEnabled = 0; ReleaseDirectSound(); return FALSE; } else if (SoundEnabled == 0) return InitSound(); SoundEnabled = 0; PrevSoundQuality=SoundQuality; PrevStereoSound=StereoSound; wfx.wFormatTag = WAVE_FORMAT_PCM; switch (SoundQuality) { case 0: wfx.nSamplesPerSec = 8000; SoundBufferSize=1024*2; break; case 1: wfx.nSamplesPerSec = 11025; SoundBufferSize=1024*2; break; case 2: wfx.nSamplesPerSec = 22050; SoundBufferSize=1024*4; break; case 3: wfx.nSamplesPerSec = 44100; SoundBufferSize=1024*8; break; case 4: wfx.nSamplesPerSec = 16000; SoundBufferSize=1024*4; break; case 5: wfx.nSamplesPerSec = 32000; SoundBufferSize=1024*8; break; case 6: wfx.nSamplesPerSec = 48000; SoundBufferSize=1024*8; break; default: wfx.nSamplesPerSec = 11025; SoundBufferSize=1024*2; } if (StereoSound==1) { wfx.nChannels = 2; wfx.nBlockAlign = 4; SoundBufferSize*=2; } else { wfx.nChannels = 1; wfx.nBlockAlign = 2; } wfx.wBitsPerSample = 16; wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign; wfx.cbSize=0; memset(&dsbd, 0, sizeof(DSBUFFERDESC)); dsbd.dwSize = sizeof(DSBUFFERDESC); dsbd.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_STICKYFOCUS; if(UsePrimaryBuffer) dsbd.dwFlags |= DSBCAPS_PRIMARYBUFFER; dsbd.dwBufferBytes = UsePrimaryBuffer ? 0 : SoundBufferSize; dsbd.lpwfxFormat = UsePrimaryBuffer ? NULL : &wfx; if (DS_OK == lpDirectSound->CreateSoundBuffer(&dsbd, &lpPrimaryBuffer, NULL)) { if(!UsePrimaryBuffer) { if (DS_OK == lpPrimaryBuffer->QueryInterface(IID_IDirectSoundBuffer8, (LPVOID *) &lpSoundBuffer)) { if (DS_OK != lpSoundBuffer->Play(0,0,DSBPLAY_LOOPING)) { return FALSE; } } else return FALSE; } else { lpPrimaryBuffer->SetFormat(&wfx); dsbcaps.dwSize=sizeof(DSBCAPS); lpPrimaryBuffer->GetCaps(&dsbcaps); SoundBufferSize=dsbcaps.dwBufferBytes; if (DS_OK != lpPrimaryBuffer->Play(0,0,DSBPLAY_LOOPING)) { return FALSE; } } SoundEnabled=1; FirstSound=0; return TRUE; } else { return FALSE; }}BOOL FAR PASCAL InitJoystickInput(LPCDIDEVICEINSTANCE pdinst, LPVOID pvRef){ LPDIRECTINPUT8 pdi = (LPDIRECTINPUT8)pvRef; GUID DeviceGuid = pdinst->guidInstance; if (CurrentJoy>4) return DIENUM_CONTINUE; // Create the DirectInput joystick device. if (pdi->CreateDevice(DeviceGuid,&JoystickInput[CurrentJoy], NULL) != DI_OK) { return DIENUM_CONTINUE; } if (JoystickInput[CurrentJoy]->SetDataFormat(&c_dfDIJoystick) != DI_OK) { JoystickInput[CurrentJoy]->Release(); return DIENUM_CONTINUE; } if (JoystickInput[CurrentJoy]->SetCooperativeLevel(hMainWindow, DISCL_NONEXCLUSIVE | DISCL_FOREGROUND) != DI_OK) { JoystickInput[CurrentJoy]->Release(); return DIENUM_CONTINUE; } DIPROPRANGE diprg; diprg.diph.dwSize = sizeof(diprg); diprg.diph.dwHeaderSize = sizeof(diprg.diph); diprg.diph.dwObj = DIJOFS_X; diprg.diph.dwHow = DIPH_BYOFFSET; diprg.lMin = -1000; diprg.lMax = +1000; if FAILED(JoystickInput[CurrentJoy]->SetProperty(DIPROP_RANGE, &diprg.diph)) { X1Disable[CurrentJoy]=1; X2Disable[CurrentJoy]=1; } diprg.diph.dwObj = DIJOFS_Y; if FAILED(JoystickInput[CurrentJoy]->SetProperty(DIPROP_RANGE, &diprg.diph)) { Y1Disable[CurrentJoy]=1; Y2Disable[CurrentJoy]=1; } diprg.diph.dwObj = DIJOFS_Z; if (FAILED(JoystickInput[CurrentJoy]->SetProperty(DIPROP_RANGE, &diprg.diph))) { Z1Disable[CurrentJoy]=1; Z2Disable[CurrentJoy]=1; } diprg.diph.dwObj = DIJOFS_RX; if (FAILED(JoystickInput[CurrentJoy]->SetProperty(DIPROP_RANGE, &diprg.diph))) { RX1Disable[CurrentJoy]=1; RX2Disable[CurrentJoy]=1; } diprg.diph.dwObj = DIJOFS_RY; if (FAILED(JoystickInput[CurrentJoy]->SetProperty(DIPROP_RANGE, &diprg.diph))) { RY1Disable[CurrentJoy]=1; RY2Disable[CurrentJoy]=1; } diprg.diph.dwObj = DIJOFS_RZ; if (FAILED(JoystickInput[CurrentJoy]->SetProperty(DIPROP_RANGE, &diprg.diph))) { RZ1Disable[CurrentJoy]=1; RZ2Disable[CurrentJoy]=1; } diprg.diph.dwObj = DIJOFS_SLIDER(0); if (FAILED(JoystickInput[CurrentJoy]->SetProperty(DIPROP_RANGE, &diprg.diph))) { S01Disable[CurrentJoy]=1; S02Disable[CurrentJoy]=1; } diprg.diph.dwObj = DIJOFS_SLIDER(1); if (FAILED(JoystickInput[CurrentJoy]->SetProperty(DIPROP_RANGE, &diprg.diph))) { S11Disable[CurrentJoy]=1; S12Disable[CurrentJoy]=1; } DIDEVCAPS didc; didc.dwSize = sizeof(DIDEVCAPS); if (JoystickInput[CurrentJoy]->GetCapabilities(&didc) != DI_OK) { JoystickInput[CurrentJoy]->Release(); return DIENUM_CONTINUE; } if (didc.dwButtons <= 16) NumBTN[CurrentJoy] = didc.dwButtons; else NumBTN[CurrentJoy] = 16; if (didc.dwPOVs) NumPOV[CurrentJoy] = didc.dwPOVs; else POVDisable[CurrentJoy] = 1; DIPROPDWORD dipdw; dipdw.diph.dwSize = sizeof(DIPROPDWORD); dipdw.diph.dwHeaderSize = sizeof(dipdw.diph); dipdw.diph.dwHow = DIPH_BYOFFSET; dipdw.dwData = 2500; dipdw.diph.dwObj = DIJOFS_X; JoystickInput[CurrentJoy]->SetProperty(DIPROP_DEADZONE, &dipdw.diph); dipdw.diph.dwObj = DIJOFS_Y; JoystickInput[CurrentJoy]->SetProperty(DIPROP_DEADZONE, &dipdw.diph); dipdw.diph.dwObj = DIJOFS_Z; JoystickInput[CurrentJoy]->SetProperty(DIPROP_DEADZONE, &dipdw.diph); dipdw.diph.dwObj = DIJOFS_RX; JoystickInput[CurrentJoy]->SetProperty(DIPROP_DEADZONE, &dipdw.diph); dipdw.diph.dwObj = DIJOFS_RY; JoystickInput[CurrentJoy]->SetProperty(DIPROP_DEADZONE, &dipdw.diph); dipdw.diph.dwObj = DIJOFS_RZ; JoystickInput[CurrentJoy]->SetProperty(DIPROP_DEADZONE, &dipdw.diph); dipdw.diph.dwObj = DIJOFS_SLIDER(0); JoystickInput[CurrentJoy]->SetProperty(DIPROP_DEADZONE, &dipdw.diph); dipdw.diph.dwObj = DIJOFS_SLIDER(1); JoystickInput[CurrentJoy]->SetProperty(DIPROP_DEADZONE, &dipdw.diph); dipdw.diph.dwSize = sizeof(DIPROPDWORD); dipdw.diph.dwHeaderSize = sizeof(dipdw.diph); dipdw.diph.dwHow = DIPH_DEVICE; dipdw.dwData = DIPROPAXISMODE_ABS; dipdw.diph.dwObj = 0; JoystickInput[CurrentJoy]->SetProperty(DIPROP_AXISMODE, &dipdw.diph); CurrentJoy+=1; return DIENUM_CONTINUE;}void ReleaseDirectInput(){ if (MouseInput) { MouseInput->Release(); MouseInput = NULL; } if (KeyboardInput) { KeyboardInput->Release(); KeyboardInput = NULL; } for (int i=0; i<5; i++) if (JoystickInput[i]) { JoystickInput[i]->Release(); JoystickInput[i] = NULL; } if (DInput) { DInput->Release(); DInput = NULL; }}void ReleaseDirectSound(){ if (lpSoundBuffer) { lpSoundBuffer->Release(); lpSoundBuffer = NULL; } if (lpPrimaryBuffer) { lpPrimaryBuffer->Release(); lpPrimaryBuffer = NULL; } if (lpDirectSound) { lpDirectSound->Release(); lpDirectSound = NULL; }}void ReleaseDirectDraw(){ if (DD_CFB) { DD_CFB->Release(); DD_CFB = NULL; } if (DD_CFB16) { DD_CFB16->Release(); DD_CFB16 = NULL; } if (lpDDClipper) { lpDDClipper->Release(); lpDDClipper = NULL; } if (DD_Primary) { DD_Primary->Release(); DD_Primary = NULL; } if (lpDD) { lpDD->Release(); lpDD = NULL; }}void DInputError(){ char message1[256]; sprintf(message1,"Error initializing DirectInput\nYou may need to install DirectX 8.0a or higher located at www.microsoft.com/directx \0"); MessageBox (NULL, message1, "DirectInput Error" , MB_ICONERROR );}bool InitInput(){ char message1[256]; HRESULT hr; if (FAILED(hr=pDirectInput8Create(hInst,DIRECTINPUT_VERSION,IID_IDirectInput8A,(void **) &DInput,NULL))) { sprintf(message1,"Error initializing DirectInput\nYou may need to install DirectX 8.0a or higher located at www.microsoft.com/directx \0"); MessageBox (NULL, message1, "DirectInput Error" , MB_ICONERROR ); switch (hr) { case DIERR_BETADIRECTINPUTVERSION: sprintf(message1,"Beta %X\n\0",hr); MessageBox (NULL, message1, "Init", MB_ICONERROR ); break; case DIERR_INVALIDPARAM: sprintf(message1,"Invalid %X\n\0",hr); MessageBox (NULL, message1, "Init", MB_ICONERROR ); break; case DIERR_OLDDIRECTINPUTVERSION: sprintf(message1,"OLDDIRECTINPUTVERSION %X\n\0",hr); MessageBox (NULL, message1, "Init", MB_ICONERROR ); break; case DIERR_OUTOFMEMORY: sprintf(message1,"OUTOFMEMORY %X\n\0",hr); MessageBox (NULL, message1, "Init", MB_ICONERROR ); break; default: sprintf(message1,"UNKNOWN %X\n\0",hr); MessageBox (NULL, message1, "Init", MB_ICONERROR ); break; } return FALSE; } hr=DInput->CreateDevice(GUID_SysKeyboard, &KeyboardInput,NULL); if (FAILED(hr)) {DInputError();return FALSE;} hr=KeyboardInput->SetDataFormat(&c_dfDIKeyboard); if (FAILED(hr)) {DInputError();return FALSE;} hr=KeyboardInput->SetCooperativeLevel(hMainWindow,DISCL_NONEXCLUSIVE | DISCL_FOREGROUND ); hr=DInput->CreateDevice(GUID_SysMouse, &MouseInput,NULL); if (FAILED(hr)) {DInputError();return FALSE;} hr=MouseInput->SetDataFormat(&c_dfDIMouse); if (FAILED(hr)) {DInputError();return FALSE;} hr=MouseInput->SetCooperativeLevel(hMainWindow,DISCL_EXCLUSIVE|DISCL_FOREGROUND); if (FAILED(hr)) {DInputError();return FALSE;} JoystickInput[0]=NULL;JoystickInput[1]=NULL;JoystickInput[2]=NULL;JoystickInput[3]=NULL; hr=DInput->EnumDevices(DI8DEVCLASS_GAMECTRL, InitJoystickInput, DInput, DIEDFL_ATTACHEDONLY); if (FAILED(hr)) {DInputError(); return FALSE;} InputAcquire(); return TRUE;}void TestJoy(){ int i; for(i=0;i<5;i++) { if (JoystickInput[i]) { JoystickInput[i]->Poll(); if (JoystickInput[i]->GetDeviceState(sizeof(DIJOYSTATE), &js[i])==DIERR_INPUTLOST) { if (JoystickInput[i]) JoystickInput[i]->Acquire(); if (FAILED(JoystickInput[i]->GetDeviceState(sizeof(DIJOYSTATE), &js[i]))) return; } if (!X1Disable[i]) { if (js[i].lX>0) X1Disable[i]=1; } if (!X2Disable[i]) { if (js[i].lX<0) X2Disable[i]=1; } if (!Y1Disable[i]) { if (js[i].lY>0) Y1Disable[i]=1; } if (!Y2Disable[i]) { if (js[i].lY<0) Y2Disable[i]=1; } if (!Z1Disable[i]) { if (js[i].lZ>0) Z1Disable[i]=1; } if (!Z2Disable[i]) { if (js[i].lZ<0) Z2Disable[i]=1; } if (!RY1Disable[i]) { if (js[i].lRy>0) RY1Disable[i]=1; } if (!RY2Disable[i]) { if (js[i].lRy<0) RY2Disable[i]=1; } if (!RZ1Disable[i]) { if (js[i].lRz>0) RZ1Disable[i]=1; } if (!RZ2Disable[i]) { if (js[i].lRz<0) RZ2Disable[i]=1; } if (!S01Disable[i]) { if (js[i].rglSlider[0]>0) S01Disable[i]=1; } if (!S02Disable[i]) { if (js[i].rglSlider[0]<0) S02Disable[i]=1; } if (!S11Disable[i]) { if (js[i].rglSlider[1]>0) S11Disable[i]=1; } if (!S12Disable[i]) { if (js[i].rglSlider[1]<0) S12Disable[i]=1; } } } }extern "C" DWORD converta;extern "C" unsigned int BitConv32Ptr;extern "C" unsigned int RGBtoYUVPtr;extern "C" unsigned char cvidmode;extern "C" unsigned char hqFilter;extern "C" unsigned short resolutn;extern "C" unsigned short scanlines;DWORD FirstVid=1;DWORD FirstFull=1;DWORD DMode=0;DWORD SMode=0;DWORD DSMode=0;DWORD prevHQMode=~0;DWORD prevScanlines=~0;WORD Refresh = 0;extern "C" BYTE GUIWFVID[];extern "C" BYTE GUIDSIZE[];extern "C" BYTE GUISMODE[];extern "C" BYTE GUIDSMODE[];extern "C" BYTE GUIHQ2X[];extern "C" BYTE GUIHQ3X[];extern "C" BYTE GUIHQ4X[];int InitDirectDraw(){ DDSURFACEDESC2 ddsd2; DDPIXELFORMAT format; //MK: unused 2003/08/31 //HRESULT hr; //char message1[256]; unsigned int color32,ScreenPtr2; int i, j, k, r, g, b, Y, u, v; ScreenPtr2=BitConv32Ptr; for(i=0;i<65536;i++) { color32=((i&0xF800)<<8)+ ((i&0x07E0)<<5)+ ((i&0x001F)<<3)+0xFF000000; (*(unsigned int *)(ScreenPtr2))=color32; ScreenPtr2+=4; } for (i=0; i<32; i++) for (j=0; j<64; j++) for (k=0; k<32; k++) { r = i << 3; g = j << 2; b = k << 3; Y = (r + g + b) >> 2; u = 128 + ((r - b) >> 2); v = 128 + ((-r + 2*g -b)>>3); *(((unsigned int *)RGBtoYUVPtr) + (i << 11) + (j << 5) + k) = (Y<<16) + (u<<8) + v; } if (!hMainWindow) { exit(1); } ReleaseDirectDraw(); GetClientRect(hMainWindow, &rcWindow); ClientToScreen(hMainWindow, ( LPPOINT )&rcWindow); ClientToScreen(hMainWindow, ( LPPOINT )&rcWindow + 1); FullScreen=GUIWFVID[cvidmode]; DSMode=GUIDSMODE[cvidmode]; DWORD HQMode=0; if ( hqFilter != 0 ) { if ( GUIHQ2X[cvidmode] != 0 ) HQMode=2; if ( GUIHQ3X[cvidmode] != 0 ) HQMode=3; if ( GUIHQ4X[cvidmode] != 0 ) HQMode=4; } if (FullScreen == 1) { if (HQMode && !DSMode) { int marginx = (rcWindow.right - rcWindow.left - BlitArea.right + BlitArea.left)/2; int marginy = (rcWindow.bottom - rcWindow.top - BlitArea.bottom + BlitArea.top)/2; if (marginx>0) { rcWindow.left += marginx; rcWindow.right -= marginx; } if (marginy>0) { rcWindow.top += marginy; rcWindow.bottom -= marginy; } } if ((DSMode == 1) && (scanlines != 0)) { int OldHeight = rcWindow.bottom - rcWindow.top; if ((OldHeight % 240) == 0) { int NewHeight = (OldHeight/240)*resolutn; rcWindow.top += (OldHeight - NewHeight)/2; rcWindow.bottom = rcWindow.top + NewHeight; } } } if (pDirectDrawCreateEx(NULL, (void **)&lpDD, IID_IDirectDraw7, NULL) != DD_OK) { MessageBox(NULL, "DirectDrawCreateEx failed.", "DirectDraw Error", MB_ICONERROR); return FALSE; } if (FullScreen == 1) { if (lpDD->SetCooperativeLevel(hMainWindow, DDSCL_FULLSCREEN | DDSCL_EXCLUSIVE | DDSCL_ALLOWREBOOT) != DD_OK) { MessageBox(NULL, "IDirectDraw7::SetCooperativeLevel failed.", "DirectDraw Error", MB_ICONERROR); return FALSE; } if (lpDD->SetDisplayMode(WindowWidth, WindowHeight, 16, Refresh, 0) != DD_OK) { if (lpDD->SetDisplayMode(WindowWidth, WindowHeight, 16, 0, 0) != DD_OK) { MessageBox(NULL, "IDirectDraw7::SetDisplayMode failed.\nMake sure your video card supports this mode.", "DirectDraw Error", MB_ICONERROR); return FALSE; } else { KitchenSync = 0; Refresh = 0; } } } else { if (lpDD->SetCooperativeLevel(hMainWindow, DDSCL_NORMAL) != DD_OK) { MessageBox(NULL, "IDirectDraw7::SetCooperativeLevel failed.", "DirectDraw Error", MB_ICONERROR); return FALSE; } CheckAlwaysOnTop(); } ZeroMemory(&ddsd2, sizeof(DDSURFACEDESC2)); ddsd2.dwSize = sizeof(DDSURFACEDESC2); ddsd2.dwFlags = DDSD_CAPS; ddsd2.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; if (FullScreen == 1) { ddsd2.dwFlags |= DDSD_BACKBUFFERCOUNT; ddsd2.dwBackBufferCount = 2; ddsd2.ddsCaps.dwCaps |= DDSCAPS_FLIP | DDSCAPS_COMPLEX; } HRESULT hRes = lpDD->CreateSurface(&ddsd2, &DD_Primary, NULL); if (FullScreen == 1) { if ((hRes == DDERR_OUTOFMEMORY) || (hRes == DDERR_OUTOFVIDEOMEMORY)) { ddsd2.dwBackBufferCount = 1; hRes = lpDD->CreateSurface(&ddsd2, &DD_Primary, NULL); } } if (hRes != DD_OK) { MessageBox(NULL, "IDirectDraw7::CreateSurface failed.", "DirectDraw Error", MB_ICONERROR); return FALSE; } if (FullScreen == 1) { ddsd2.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER; if (DD_Primary->GetAttachedSurface(&ddsd2.ddsCaps, &DD_BackBuffer) != DD_OK) { MessageBox(NULL, "IDirectDrawSurface7::GetAttachedSurface failed.", "DirectDraw Error", MB_ICONERROR); return FALSE; } } else { if (lpDD->CreateClipper(0,&lpDDClipper,NULL) != DD_OK) { lpDD->Release(); lpDD=NULL; return FALSE; } if (lpDDClipper->SetHWnd(0,hMainWindow) != DD_OK) { lpDD->Release(); lpDD=NULL; return FALSE; } if (DD_Primary->SetClipper(lpDDClipper) != DD_OK) { return FALSE; } } format.dwSize = sizeof(DDPIXELFORMAT); if (DD_Primary->GetPixelFormat(&format) != DD_OK) { MessageBox(NULL, "IDirectDrawSurface7::GetPixelFormat failed.", "DirectDraw Error", MB_ICONERROR); return FALSE; } BitDepth=format.dwRGBBitCount; GBitMask=format.dwGBitMask; // 0x07E0 or not if (BitDepth==24) { MessageBox(NULL,"ZSNESw does not support 24bit color.\nPlease change your resolution to either 16bit or 32bit color","Error",MB_OK); exit(0); } converta = (BitDepth==16 && GBitMask!=0x07E0); ddsd2.dwSize = sizeof(ddsd2); ddsd2.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; ddsd2.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; ddsd2.dwWidth = SurfaceX; ddsd2.dwHeight = SurfaceY; // create drawing surface if (lpDD->CreateSurface(&ddsd2, &DD_CFB, NULL) != DD_OK) { MessageBox(NULL, "IDirectDraw7::CreateSurface failed.", "DirectDraw Error", MB_ICONERROR); return FALSE; } AltSurface = 0; // create alt. drawing surface if ( BitDepth == 32 ) { ddsd2.dwFlags |= DDSD_PIXELFORMAT; ddsd2.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); ddsd2.ddpfPixelFormat.dwFlags = DDPF_RGB; ddsd2.ddpfPixelFormat.dwRGBBitCount = 16; ddsd2.ddpfPixelFormat.dwRBitMask = 0xF800; ddsd2.ddpfPixelFormat.dwGBitMask = 0x07E0; ddsd2.ddpfPixelFormat.dwBBitMask = 0x001F; if (lpDD->CreateSurface(&ddsd2, &DD_CFB16, NULL) != DD_OK) { MessageBox(NULL, "IDirectDraw7::CreateSurface failed.", "DirectDraw Error", MB_ICONERROR); return FALSE; } if (((SurfaceX==512) || (SurfaceX==640)) && (HQMode==0)) AltSurface = 1; } return TRUE;}BYTE* SurfBuf;DDSURFACEDESC2 ddsd;DWORD LockSurface(){ HRESULT hRes; if (AltSurface == 0) { if (DD_CFB != NULL) { memset(&ddsd,0,sizeof(ddsd)); ddsd.dwSize = sizeof( ddsd ); ddsd.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; hRes = DD_CFB->Lock(NULL,&ddsd,DDLOCK_WAIT,NULL); if (hRes == DD_OK) { SurfBuf = (BYTE*)ddsd.lpSurface; return(ddsd.lPitch); } else { if (hRes == DDERR_SURFACELOST) DD_CFB->Restore(); return(0); } } else return(0); } else { if (DD_CFB16 != NULL) { memset(&ddsd,0,sizeof(ddsd)); ddsd.dwSize = sizeof( ddsd ); ddsd.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; hRes = DD_CFB16->Lock(NULL,&ddsd,DDLOCK_WAIT,NULL); if (hRes == DD_OK) { SurfBuf = (BYTE*)ddsd.lpSurface; return(ddsd.lPitch); } else { if (hRes == DDERR_SURFACELOST) DD_CFB16->Restore(); return(0); } } else return(0); } }void UnlockSurface(){ if (AltSurface == 0) DD_CFB->Unlock((struct tagRECT *)ddsd.lpSurface); else DD_CFB16->Unlock((struct tagRECT *)ddsd.lpSurface);}extern "C" {void WinUpdateDevices();short Buffer[1800*2];int X, Y;DWORD pitch;MSG msg;DWORD SurfBufD;int count, x,count2;HRESULT hr;int i;short *Sound;DWORD CurrentPos;DWORD WritePos;DWORD T60HZEnabled=0;DWORD T36HZEnabled=0;DWORD WINAPI SemaphoreThread( LPVOID lpParam ){ while(semaphore_run) { if (T60HZEnabled) { ReleaseSemaphore(hLock, 1, NULL); Sleep(1); } else Sleep(20); } return 0;}void InitSemaphore(){ if (hLock) return; hLock = CreateSemaphore(NULL, 1, SemaphoreMax, NULL); semaphore_run = 1; hThread = CreateThread(NULL, 0, SemaphoreThread, &dwThreadParam, 0, &dwThreadId);}void ShutdownSemaphore(){ if (!hLock) return; semaphore_run = 0; WaitForSingleObject(hThread, INFINITE); CloseHandle(hThread); CloseHandle(hLock); hLock = NULL;}extern unsigned int pressed;extern unsigned char romispal;void Start60HZ(void){ update_ticks_pc2 = UPDATE_TICKS_UDP * freq / 1000.0; if (romispal==1) { update_ticks_pc = UPDATE_TICKS_GAMEPAL * freq / 1000.0; } else { update_ticks_pc = UPDATE_TICKS_GAME * freq / 1000.0; } QueryPerformanceCounter((LARGE_INTEGER*)&start); QueryPerformanceCounter((LARGE_INTEGER*)&start2); T36HZEnabled=0; T60HZEnabled=1; InitSemaphore();}void Stop60HZ(void){ T60HZEnabled=0; ShutdownSemaphore();}void Start36HZ(void){ update_ticks_pc2 = UPDATE_TICKS_UDP * freq / 1000.0; update_ticks_pc = UPDATE_TICKS_GUI * freq / 1000.0; QueryPerformanceCounter((LARGE_INTEGER*)&start); QueryPerformanceCounter((LARGE_INTEGER*)&start2); T60HZEnabled=0; T36HZEnabled=1;}void Stop36HZ(void){ T36HZEnabled=0;}char WinMessage[256];void clearwin();void Clear2xSaIBuffer();void clear_display();char WinName[]={"ZSNESW\0"};void initwinvideo(void){ WINDOWPLACEMENT wndpl; RECT rc1; DWORD newmode=0; DWORD HQMode=0; if ( hqFilter != 0 ) { if ( GUIHQ2X[cvidmode] != 0 ) HQMode=2; if ( GUIHQ3X[cvidmode] != 0 ) HQMode=3; if ( GUIHQ4X[cvidmode] != 0 ) HQMode=4; } if ((CurMode!=cvidmode) || (prevHQMode!=HQMode)) { CurMode=cvidmode; prevHQMode=HQMode; newmode=1; SurfaceX=256; SurfaceY=240; X=0; Y=0; FullScreen=GUIWFVID[cvidmode]; DMode=GUIDSIZE[cvidmode]; SMode=GUISMODE[cvidmode]; DSMode=GUIDSMODE[cvidmode]; switch (cvidmode) { case 0: WindowWidth=256; WindowHeight=224; break; case 1: WindowWidth=640; WindowHeight=480; break; case 2: case 3: WindowWidth=512; WindowHeight=448; break; case 4: case 5: case 6: case 7: case 8: WindowWidth=640; WindowHeight=480; break; case 9: case 10: WindowWidth=768; WindowHeight=672; break; case 11: case 12: case 13: case 14: case 15: WindowWidth=800; WindowHeight=600; break; case 16: case 17: case 18: case 19: case 20: WindowWidth=1024; WindowHeight=768; break; case 21: case 22: WindowWidth=1024; WindowHeight=896; break; case 23: case 24: case 25: case 26: case 27: WindowWidth=1280; WindowHeight=960; break; case 28: case 29: case 30: case 31: case 32: WindowWidth=1280; WindowHeight=1024; break; default: WindowWidth=256; WindowHeight=224; break; } if (DMode == 1) { if ((DSMode == 1) || (FullScreen == 0)) SurfaceX = 512; else SurfaceX = 640; SurfaceY=480; } else { if ((SMode == 0) && (FullScreen == 1)) SurfaceX=320; else SurfaceX=256; SurfaceY=240; } switch ( HQMode ) { case 2: SurfaceX=512; SurfaceY=480; break; case 3: SurfaceX=768; SurfaceY=720; break; case 4: SurfaceX=1024; SurfaceY=960; break; } BlitArea.top = 0; BlitArea.left = 0; BlitArea.right = SurfaceX; if ((SurfaceX == 640) || (SurfaceX == 320)) BlitArea.bottom = SurfaceY; else BlitArea.bottom = (SurfaceY/240)*resolutn; if (PrevRes == 0) PrevRes = resolutn; } if (((PrevStereoSound!=StereoSound)||(PrevSoundQuality!=SoundQuality))&&FirstSound!=1) ReInitSound(); if (!FirstVid) { if (X<0)X=0; if (X>(int)(GetSystemMetrics(SM_CXSCREEN) - WindowWidth)) X=(GetSystemMetrics(SM_CXSCREEN) - WindowWidth); if (Y<0)Y=0; if (Y>(int)(GetSystemMetrics(SM_CYSCREEN) - WindowHeight)) Y=(GetSystemMetrics(SM_CYSCREEN) - WindowHeight); if (FullScreen==1) {X=0; Y=0;} if (FullScreen==0 && newmode == 1) { X = MainWindowX; Y = MainWindowY; } else if (FullScreen==0) { MainWindowX = X; MainWindowY = Y; } MoveWindow(hMainWindow, X, Y, WindowWidth, WindowHeight, TRUE); wndpl.length = sizeof(wndpl); GetWindowPlacement(hMainWindow, &wndpl); SetRect(&rc1, 0, 0, WindowWidth, WindowHeight); AdjustWindowRectEx(&rc1,GetWindowLong(hMainWindow, GWL_STYLE), GetMenu(hMainWindow) != NULL, GetWindowLong(hMainWindow, GWL_EXSTYLE)); GetClientRect(hMainWindow, &rcWindow); ClientToScreen(hMainWindow, (LPPOINT) &rcWindow); ClientToScreen(hMainWindow, (LPPOINT) &rcWindow + 1); if (FullScreen == 1) { if (HQMode && !DSMode) { int marginx = (rcWindow.right - rcWindow.left - BlitArea.right + BlitArea.left)/2; int marginy = (rcWindow.bottom - rcWindow.top - BlitArea.bottom + BlitArea.top)/2; if (marginx>0) { rcWindow.left += marginx; rcWindow.right -= marginx; } if (marginy>0) { rcWindow.top += marginy; rcWindow.bottom -= marginy; } } if ((DSMode == 1) && (scanlines != 0)) { int OldHeight = rcWindow.bottom - rcWindow.top; if ((OldHeight % 240) == 0) { int NewHeight = (OldHeight/240)*resolutn; rcWindow.top += (OldHeight - NewHeight)/2; rcWindow.bottom = rcWindow.top + NewHeight; clear_display(); } } } } else { atexit(ExitFunction); if (!QueryPerformanceFrequency((LARGE_INTEGER*)&freq)) return; if (!RegisterWinClass()) { exit(1); } X=(GetSystemMetrics(SM_CXSCREEN) - WindowWidth) / 2; Y=(GetSystemMetrics(SM_CYSCREEN) - WindowHeight) / 2; if (FullScreen==1) {X=0; Y=0;} if (hMainWindow) { CloseWindow(hMainWindow); } if (SaveMainWindowPos == 1 && MainWindowX != -1 && FullScreen == 0) { X = MainWindowX; Y = MainWindowY; } hMainWindow = CreateWindow( "ZSNESWIN", WinName, WS_VISIBLE|WS_POPUP,X,Y, //WS_OVERLAPPED "ZSNESWIN" WindowWidth,WindowHeight,NULL,NULL,hInst,NULL); CheckPriority(); CheckAlwaysOnTop(); if(opengl) gl_start(1024, 768, 16,0); if (!hMainWindow) { return; } ShowWindow(hMainWindow, SW_SHOWNORMAL); SetWindowText(hMainWindow,"ZSNESWIN"); InitInput(); InitSound(); TestJoy(); if (debugger) InitDebugger(); // Start debugger } if (FirstVid == 1) { FirstVid = 0; if (Force60hz) Refresh = 60; InitDirectDraw(); clearwin(); asm_call(Clear2xSaIBuffer); clear_display(); return; } if (Moving == 1) return; if (newmode == 1) { ReleaseDirectDraw(); InitDirectDraw(); clearwin(); asm_call(Clear2xSaIBuffer); clear_display(); return; }}extern unsigned int vidbuffer;extern void SoundProcess();extern int DSPBuffer;int * DSPBuffer1;DWORD ScreenPtr;DWORD ScreenPtr2;extern void GUI36hzcall(void);extern void Game60hzcall(void);extern int packettimeleft[256];extern int PacketCounter;extern int CounterA;extern int CounterB;void CheckTimers(void){ // Lame fix for GUI using 100% CPU if (GUIOn || GUIOn2) Sleep(1); QueryPerformanceCounter((LARGE_INTEGER*)&end2); while ((end2 - start2) >= update_ticks_pc2) { if (CounterA>0) CounterA--; if (CounterB>0) CounterB--; if (PacketCounter){ for (int i=0;i<256;i++){ if (packettimeleft[i]>0) packettimeleft[i]--; } } start2 += update_ticks_pc2; } if (T60HZEnabled == 1) { QueryPerformanceCounter((LARGE_INTEGER*)&end); while ((end - start) >= update_ticks_pc) { Game60hzcall(); start += update_ticks_pc; } } if (T36HZEnabled == 1) { QueryPerformanceCounter((LARGE_INTEGER*)&end); while ((end - start) >= update_ticks_pc) { GUI36hzcall(); start += update_ticks_pc; } }}extern unsigned char MMXSupport;extern "C" {volatile int SPCSize;volatile int buffer_ptr;}void UpdateVFrame(void){ int DataNeeded; SPCSize=256; if (StereoSound==1) SPCSize=256; while (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } WinUpdateDevices(); CheckTimers(); if (SoundEnabled == 0) return; if(!UsePrimaryBuffer) lpSoundBuffer->GetCurrentPosition(&CurrentPos,&WritePos); else lpPrimaryBuffer->GetCurrentPosition(&CurrentPos,&WritePos); if (LastUsedPos <= CurrentPos) { DataNeeded=CurrentPos-LastUsedPos; } else { DataNeeded=SoundBufferSize - LastUsedPos + CurrentPos; } DataNeeded/=(SPCSize*2); DataNeeded*=(SPCSize*2); while (DataNeeded>0) { asm_call(SoundProcess); DSPBuffer1=(int *)&DSPBuffer; buffer_ptr = (int)&Buffer[0]; if (T36HZEnabled == 1) { if (MMXSupport == 1) { ASM_BEGIN ASM_COMMAND3(mov edi,buffer_ptr) ASM_COMMAND3(mov ecx,SPCSize) ASM_COMMAND2(shr ecx,2) ASM_COMMAND2(pxor mm0,mm0)ASM_COMMAND(_blank_top_fpu:) ASM_COMMAND2(movq [edi],mm0) ASM_COMMAND2(add edi,8) ASM_COMMAND(dec ecx) ASM_COMMAND(jne _blank_top_fpu) ASM_COMMAND(emms) ASM_END } else { ASM_BEGIN ASM_COMMAND3(mov edi,buffer_ptr) ASM_COMMAND3(mov ecx,SPCSize) ASM_COMMAND2(shr ecx,1) ASM_COMMAND2(xor eax,eax)ASM_COMMAND(_blank_top:) ASM_COMMAND2(mov [edi],eax) ASM_COMMAND2(add edi,4) ASM_COMMAND(dec ecx) ASM_COMMAND(jne _blank_top) ASM_END } } else { if (MMXSupport == 1) { ASM_BEGIN ASM_COMMAND3(mov esi,DSPBuffer1) ASM_COMMAND3(mov edi,buffer_ptr) ASM_COMMAND3(mov ecx,SPCSize) ASM_COMMAND2(shr ecx,2)ASM_COMMAND(_top_mmx:) ASM_COMMAND2(movq mm0,[esi]) ASM_COMMAND2(packssdw mm0,[esi+8]) ASM_COMMAND2(movq [edi],mm0) ASM_COMMAND2(add esi,16) ASM_COMMAND2(add edi,8) ASM_COMMAND(dec ecx) ASM_COMMAND(jne _top_mmx) ASM_COMMAND(emms) ASM_END } else { for(i=0;i<SPCSize;i++) { Buffer[i]=DSPBuffer1[i]; if (DSPBuffer1[i]>32767)Buffer[i]=32767; if (DSPBuffer1[i]<-32767)Buffer[i]=-32767; } } } if(!UsePrimaryBuffer) { if (DS_OK!=lpSoundBuffer->Lock(LastUsedPos, SPCSize*2, &lpvPtr1, &dwBytes1, &lpvPtr2, &dwBytes2, 0)) { return; } } else { if (DS_OK!=lpPrimaryBuffer->Lock(LastUsedPos, SPCSize*2, &lpvPtr1, &dwBytes1, &lpvPtr2, &dwBytes2, 0)) { return; } } Sound=(short *)lpvPtr1; CopyMemory(lpvPtr1, &Buffer[0], dwBytes1); if (NULL != lpvPtr2) { CopyMemory(lpvPtr2, &Buffer[0]+dwBytes1, dwBytes2); } if(!UsePrimaryBuffer) { if (DS_OK != lpSoundBuffer->Unlock(lpvPtr1, dwBytes1, lpvPtr2, dwBytes2)) { return; } } else { if (DS_OK != lpPrimaryBuffer->Unlock(lpvPtr1, dwBytes1, lpvPtr2, dwBytes2)) { return; } } LastUsedPos+=SPCSize*2; if (LastUsedPos==SoundBufferSize) LastUsedPos=0; DataNeeded-=(SPCSize*2); }}extern unsigned char curblank;extern DWORD AddEndBytes;extern DWORD NumBytesPerLine;extern unsigned char * WinVidMemStart;extern void copy640x480x16bwin(void);extern void hq2x_16b(void);extern void hq2x_32b(void);extern void hq3x_16b(void);extern void hq3x_32b(void);extern void hq4x_16b(void);extern void hq4x_32b(void);extern unsigned char NGNoTransp;extern unsigned char newengen;extern void ClearWin16();extern void ClearWin32();void clearwin(){ pitch=LockSurface(); if (pitch==0) { return; } SurfBufD=(DWORD) &SurfBuf[0]; if (AltSurface == 0) { switch (BitDepth) { case 16: ClearWin16(); break; case 32: ClearWin32(); break; } } else ClearWin16(); UnlockSurface();}void clear_display(){ if (FullScreen == 1) { DDBLTFX ddbltfx; ddbltfx.dwSize = sizeof(ddbltfx); ddbltfx.dwFillColor = 0; if (TripleBufferWin == 1) { if ((DD_Primary != NULL) && (DD_BackBuffer != NULL)) { if (DD_BackBuffer->Blt( NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &ddbltfx ) == DDERR_SURFACELOST) DD_Primary->Restore(); if (DD_Primary->Flip(NULL, DDFLIP_WAIT) == DDERR_SURFACELOST) DD_Primary->Restore(); if (DD_BackBuffer->Blt( NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &ddbltfx ) == DDERR_SURFACELOST) DD_Primary->Restore(); if (DD_Primary->Flip(NULL, DDFLIP_WAIT) == DDERR_SURFACELOST) DD_Primary->Restore(); if (DD_BackBuffer->Blt( NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &ddbltfx ) == DDERR_SURFACELOST) DD_Primary->Restore(); } } else { if (DD_Primary != NULL) { if (vsyncon == 1) { if (lpDD->WaitForVerticalBlank(DDWAITVB_BLOCKBEGIN, NULL) != DD_OK) { DDrawError(); } } if (DD_Primary->Blt( NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &ddbltfx ) == DDERR_SURFACELOST) DD_Primary->Restore(); } } }}extern void DrawWin256x224x16();extern void DrawWin256x224x32();extern void DrawWin320x240x16();volatile __int64 copymaskRB = 0x001FF800001FF800LL;volatile __int64 copymaskG = 0x0000FC000000FC00LL;volatile __int64 copymagic = 0x0008010000080100LL;volatile __int64 coef = 0x0066009a0066009aLL;//extern BYTE MotionBlur;extern WORD totlines;void drawscreenwin(void){ DWORD i,j,color32; DWORD *SURFDW; NGNoTransp = 0; // Set this value to 1 within the appropriate // video mode if you want to add a custom // transparency routine or hardware // transparency. This only works if // the value of newengen is equal to 1. // (see ProcessTransparencies in newgfx16.asm // for ZSNES' current transparency code) UpdateVFrame(); if (curblank!=0) return; if (!(pitch = LockSurface())) return; ScreenPtr=vidbuffer; ScreenPtr+=16*2+32*2+256*2; DWORD HQMode=0; if (MMXSupport == 0) hqFilter=0; if ( hqFilter != 0 ) { if ( GUIHQ2X[cvidmode] != 0 ) HQMode=2; if ( GUIHQ3X[cvidmode] != 0 ) HQMode=3; if ( GUIHQ4X[cvidmode] != 0 ) HQMode=4; } if (PrevRes != resolutn) { if ((SurfaceX == 640) || (SurfaceX == 320)) BlitArea.bottom = SurfaceY; else BlitArea.bottom = (SurfaceY/240)*resolutn; if ((FullScreen == 0) && (SMode == 0) && (DSMode == 0)) WindowHeight = (WindowHeight/224)*resolutn; initwinvideo(); PrevRes = resolutn; } if (prevHQMode!=HQMode) initwinvideo(); if (prevScanlines != scanlines) { initwinvideo(); prevScanlines = scanlines; } SurfBufD=(DWORD) &SurfBuf[0]; SURFDW=(DWORD *) &SurfBuf[0]; if (!KitchenSync && Refresh !=0 && !Force60hz) { Refresh = 0; InitDirectDraw(); } if (KitchenSync && Refresh != 120 && totlines == 263) { Refresh = 120; InitDirectDraw(); } if (KitchenSync && Refresh != 100 && totlines == 314) { Refresh = 100; InitDirectDraw(); } if ( HQMode == 0 ) { if (SurfaceX == 256 && SurfaceY == 240) { switch (BitDepth) { case 16: { DrawWin256x224x16(); break; } case 32: { DrawWin256x224x32(); break; } SURFDW=(DWORD *) &SurfBuf[(resolutn-1)*pitch]; color32=0x7F000000; for(i=0;i<256;i++) { SURFDW[i]=color32; } SURFDW=(DWORD *) &SurfBuf[resolutn*pitch]; color32=0x7F000000; for(i=0;i<256;i++) { SURFDW[i]=color32; } break; case 24: MessageBox (NULL, "Sorry. ZSNESw does not work in windowed 24 bit color modes. \nClick 'OK' to switch to a full screen mode.", "DDRAW Error" , MB_ICONERROR ); cvidmode=3; initwinvideo(); Sleep(1000); if(!opengl)drawscreenwin(); break; default: UnlockSurface(); MessageBox (NULL, "Mode only available in 16 and 32 bit color", "DDRAW Error" , MB_ICONERROR ); cvidmode=2; initwinvideo(); Sleep(1000); if(!opengl)drawscreenwin(); break; } } if (SurfaceX == 320 && SurfaceY == 240) { switch (BitDepth) { case 16: { DrawWin320x240x16(); break; } case 32: for(j=0;j<8;j++) { SURFDW=(DWORD *) &SurfBuf[j*pitch]; color32=0x7F000000; for(i=0;i<320;i++) { SURFDW[i]=color32; } } for(j=8;(int)j<(resolutn-1)+8;j++) { color32=0x7F000000; for(i=0;i<32;i++) { SURFDW[i]=color32; } for(i=32;i<(256+32);i++) { color32=(((*(WORD *)(ScreenPtr))&0xF800)<<8)+ (((*(WORD *)(ScreenPtr))&0x07E0)<<5)+ (((*(WORD *)(ScreenPtr))&0x001F)<<3)+0xFF000000;// SURFDW[i]=color32; ScreenPtr+=2; } color32=0x7F000000; for(i=(256+32);i<320;i++) { SURFDW[i]=color32; } ScreenPtr=ScreenPtr+576-512; SURFDW=(DWORD *) &SurfBuf[(j)*pitch]; } for(j=((resolutn-1)+8);j<240;j++) { SURFDW=(DWORD *) &SurfBuf[j*pitch]; color32=0x7F000000; for(i=0;i<320;i++) { SURFDW[i]=color32; } } break; default: UnlockSurface(); MessageBox (NULL, "Mode only available in 16 and 32 bit color", "DDRAW Error" , MB_ICONERROR ); cvidmode=2; initwinvideo(); Sleep(1000); if(!opengl)drawscreenwin(); break; } } if (SurfaceX==512 && SurfaceY==480) { switch (BitDepth) { case 16: case 32: // using 16bpp AltSurface AddEndBytes=pitch-1024; NumBytesPerLine=pitch; WinVidMemStart=&SurfBuf[0]; asm_call(copy640x480x16bwin); break; default: UnlockSurface(); MessageBox (NULL, "Mode only available in 16 and 32 bit color", "DDRAW Error" , MB_ICONERROR ); cvidmode=2; initwinvideo(); Sleep(1000); if(!opengl)drawscreenwin(); } } if (SurfaceX == 640 && SurfaceY == 480) { switch (BitDepth) { case 16: case 32: // using 16bpp AltSurface AddEndBytes=pitch-1024; NumBytesPerLine=pitch; WinVidMemStart=&SurfBuf[(240-resolutn)*pitch+64*2]; asm_call(copy640x480x16bwin); break; default: UnlockSurface(); MessageBox (NULL, "Mode only available in 16 and 32 bit color", "DDRAW Error" , MB_ICONERROR ); cvidmode=2; initwinvideo(); Sleep(1000); if(!opengl)drawscreenwin(); } } } else { // HQMode != 0 NumBytesPerLine = pitch; AddEndBytes = pitch - SurfaceX*(BitDepth/8); WinVidMemStart=&SurfBuf[0]; switch (BitDepth) { case 16: { switch (HQMode) { case 2: hq2x_16b(); break; case 3: hq3x_16b(); break; case 4: hq4x_16b(); break; } break; } case 32: { switch (HQMode) { case 2: hq2x_32b(); break; case 3: hq3x_32b(); break; case 4: hq4x_32b(); break; } break; } default: { UnlockSurface(); MessageBox (NULL, "Mode only available in 16 and 32 bit color", "DDRAW Error" , MB_ICONERROR ); cvidmode=2; initwinvideo(); Sleep(1000); if(!opengl)drawscreenwin(); } } } UnlockSurface(); if(opengl)gl_drawwin(); else DrawScreen();}extern void SwitchFullScreen(void);void WinUpdateDevices(){ int i,j; unsigned char * keys; unsigned char keys2[256]; //MK: unused 2003/08/31 //HRESULT hRes; for (i = 0; i<256; i++) keys2[i] = 0; keys = (unsigned char *)&pressed; if (KeyboardInput&&InputEn==1) { KeyboardInput->GetDeviceState(256, keys2); } else { return; } if (keys2[0x38] != 0 && keys2[0x3E] != 0) exit(0); if (keys2[0xB8] != 0 && keys2[0x1C] != 0 || keys2[0x38] != 0 && keys2[0x1C] != 0) { asm_call(SwitchFullScreen); return; } for(i=0; i<256; i++) { if (keys2[i] == 0) keys[i] = 0; if (keys2[i] != 0 && keys[i] == 0) keys[i] = 1; } keys[0] = 0; for(i=0; i<5; i++) { if (JoystickInput[i]) { for(j=0; j<32; j++) { keys[0x100 + i * 32 + j] = 0; } JoystickInput[i]->Poll(); if (JoystickInput[i]->GetDeviceState(sizeof(DIJOYSTATE), &js[i])==DIERR_INPUTLOST) { if (JoystickInput[i]) JoystickInput[i]->Acquire(); if (FAILED(JoystickInput[i]->GetDeviceState(sizeof(DIJOYSTATE), &js[i]))) return; } if (!X1Disable[i]) { if (js[i].lX>0) keys[0x100 + i * 32 + 0] = 1; } if (!X2Disable[i]) { if (js[i].lX<0) keys[0x100 + i * 32 + 1] = 1; } if (!Y1Disable[i]) { if (js[i].lY>0) keys[0x100 + i * 32 + 2] = 1; } if (!Y2Disable[i]) { if (js[i].lY<0) keys[0x100 + i * 32 + 3] = 1; } if (!Z1Disable[i]) { if (js[i].lZ>0) keys[0x100 + i * 32 + 4] = 1; } if (!Z2Disable[i]) { if (js[i].lZ<0) keys[0x100 + i * 32 + 5] = 1; } if (!RY1Disable[i]) { if (js[i].lRy>0) keys[0x100 + i * 32 + 6] = 1; } if (!RY2Disable[i]) { if (js[i].lRy<0) keys[0x100 + i * 32 + 7] = 1; } if (!RZ1Disable[i]) { if (js[i].lRz>0) keys[0x100 + i * 32 + 8] = 1; } if (!RZ2Disable[i]) { if (js[i].lRz<0) keys[0x100 + i * 32 + 9] = 1; } if (!S01Disable[i]) { if (js[i].rglSlider[0]>0) keys[0x100 + i * 32 + 10] = 1; } if (!S02Disable[i]) { if (js[i].rglSlider[0]<0) keys[0x100 + i * 32 + 11] = 1; } if (!S11Disable[i]) { if (js[i].rglSlider[1]>0) keys[0x100 + i * 32 + 12] = 1; } if (!S12Disable[i]) { if (js[i].rglSlider[1]<0) keys[0x100 + i * 32 + 13] = 1; } if (!POVDisable[i]) { for (int p=0; (unsigned long)p<NumPOV[i]; p++) { switch (js[i].rgdwPOV[p]) { case 0: keys[0x100 + i * 32 + 3] = 1; break; case 4500: keys[0x100 + i * 32 + 0] = 1; keys[0x100 + i * 32 + 3] = 1; break; case 9000: keys[0x100 + i * 32 + 0] = 1; break; case 13500: keys[0x100 + i * 32 + 0] = 1; keys[0x100 + i * 32 + 2] = 1; break; case 18000: keys[0x100 + i * 32 + 2] = 1; break; case 22500: keys[0x100 + i * 32 + 1] = 1; keys[0x100 + i * 32 + 2] = 1; break; case 27000: keys[0x100 + i * 32 + 1] = 1; break; case 31500: keys[0x100 + i * 32 + 1] = 1; keys[0x100 + i * 32 + 3] = 1; break; } } } if (NumBTN[i]) for (j=0; (unsigned long)j<NumBTN[i]; j++) if (js[i].rgbButtons[j]) keys[0x100 + i * 32 + 16 + j] = 1; } else { for(j=0; j<32; j++) { keys[0x100 + i * 32 + j] = 0; } } } }extern BYTE snesmouse;int GetMouseX(void){ InputRead(); MouseX += MouseMoveX; if (MouseX > MouseMaxX) { MouseX = MouseMaxX; if (TrapMouseCursor == 1) { if (abs((int)MouseMoveX) > 10 && T36HZEnabled == 1 && FullScreen == 0 && MouseButtonPressed == 0) { MouseInput->Unacquire(); SetCursorPos(X + WindowWidth + 32, (int)(Y + (MouseY * WindowHeight / 224))); } } else if (FullScreen == 0 && snesmouse == 0 && MouseButtonPressed == 0 && GUIOn2 == 1) { MouseInput->Unacquire(); SetCursorPos(X + WindowWidth + 1, (int)(Y + (MouseY * WindowHeight / 224))); } } if (MouseX < MouseMinX) { MouseX = MouseMinX; if (TrapMouseCursor == 1) { if (abs((int)MouseMoveX) > 10 && T36HZEnabled == 1 && FullScreen == 0 && MouseButtonPressed == 0) { MouseInput->Unacquire(); SetCursorPos(X - 32, (int)(Y + (MouseY * WindowHeight / 224))); } } else if (FullScreen == 0 && snesmouse == 0 && MouseButtonPressed == 0 && GUIOn2 == 1) { MouseInput->Unacquire(); SetCursorPos(X - 1, (int)(Y + (MouseY * WindowHeight / 224))); } } return((int) MouseX);}int GetMouseY(void){ MouseY += MouseMoveY; if (MouseY > MouseMaxY) { MouseY = MouseMaxY; if (TrapMouseCursor == 1) { if (abs((int)MouseMoveY) > 10 && T36HZEnabled == 1 && FullScreen == 0 && MouseButtonPressed == 0) { MouseInput->Unacquire(); SetCursorPos((int)(X+(MouseX * WindowWidth / 256)), Y + WindowHeight + 32); } } else if (FullScreen == 0 && snesmouse == 0 && MouseButtonPressed == 0 && GUIOn2 == 1) { MouseInput->Unacquire(); SetCursorPos((int)(X+(MouseX * WindowWidth / 256)), Y + WindowHeight + 1); } } if (MouseY < MouseMinY) { MouseY = MouseMinY; if (TrapMouseCursor == 1) { if (abs((int)MouseMoveY) > 10 && T36HZEnabled == 1 && FullScreen == 0 && MouseButtonPressed == 0) { MouseInput->Unacquire(); SetCursorPos((int)(X + (MouseX * WindowWidth / 256)), Y - 32); } } else if (FullScreen == 0 && snesmouse == 0 && MouseButtonPressed == 0 && GUIOn2 == 1) { MouseInput->Unacquire(); SetCursorPos((int)(X + (MouseX * WindowWidth / 256)), Y - 1); } } return((int) MouseY);}int GetMouseMoveX(void){ MouseMove2X=(int)MouseMoveX; return(MouseMove2X);}int GetMouseMoveY(void){ MouseMove2Y=(int)MouseMoveY; return(MouseMove2Y);}int GetMouseButton(void){ //MK: unused 2003/08/31 //RECT rc1; if (MouseButton == 1) MouseButtonPressed = 1; else MouseButtonPressed = 0; if (MouseButton&2) { while (MouseButton != 0 && T36HZEnabled && FullScreen == 0) { Moving = 1; X += (int) MouseMoveX; Y += (int) MouseMoveY; if (X < 0)X = 0; if (X > (int)(GetSystemMetrics(SM_CXSCREEN) - WindowWidth)) X = (GetSystemMetrics(SM_CXSCREEN) - WindowWidth); if (Y < 0)Y=0; if (Y > (int)(GetSystemMetrics(SM_CYSCREEN) - WindowHeight)) Y = (GetSystemMetrics(SM_CYSCREEN) - WindowHeight); InputRead(); initwinvideo(); } } if (Moving == 1) { Moving = 0; initwinvideo(); } return((int) MouseButton);}void SetMouseMinX(int MinX){ MouseMinX = (float) MinX;}void SetMouseMaxX(int MaxX){ MouseMaxX = (float) MaxX;}void SetMouseMinY(int MinY){ MouseMinY = (float) MinY;}void SetMouseMaxY(int MaxY){ MouseMaxY = (float) MaxY;}void SetMouseX(int X){ MouseX = (float) X;}void SetMouseY(int Y){ MouseY = (float) Y;}void FrameSemaphore(){ if (T60HZEnabled) { double delay; QueryPerformanceCounter((LARGE_INTEGER*)&end); delay = ((update_ticks_pc - (end - start)) * 1000.0 / freq) - 3.0; if (delay>0.0) WaitForSingleObject(hLock, (unsigned int)delay); }}void ZsnesPage(){ ShellExecute(NULL, NULL, "http://www.zsnes.com/", NULL, NULL, 0); MouseX = 0; MouseY = 0;}// This function creates the debug consolevoid InitDebugger(){ if(AllocConsole()) { debugWindow = GetStdHandle(STD_OUTPUT_HANDLE); WriteConsole(debugWindow, "Welcome to the ZSNES Debugger v0.01\n", sizeof("Welcome to the ZSNES Debugger v0.01\n"), NULL, NULL); }}}