📄 winlink.cpp
字号:
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 (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<4;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;
int InitDirectDraw()
{
DDSURFACEDESC2 ddsd2;
DDPIXELFORMAT format;
HRESULT hr;
char message1[256];
unsigned int color32,ScreenPtr2;
int i;
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;
}
if (!hMainWindow)
{
exit(1);
}
ReleaseDirectDraw();
GetClientRect(hMainWindow, &rcWindow);
ClientToScreen(hMainWindow, ( LPPOINT )&rcWindow);
ClientToScreen(hMainWindow, ( LPPOINT )&rcWindow + 1);
if (pDirectDrawCreateEx(NULL, (void **)&lpDD, IID_IDirectDraw7, NULL) != DD_OK)
{
MessageBox(NULL, "DirectDrawCreateEx failed.", "DirectDraw Error", MB_ICONERROR);
}
if (FullScreen == 1)
{
if (lpDD->SetCooperativeLevel(hMainWindow, DDSCL_FULLSCREEN | DDSCL_EXCLUSIVE | DDSCL_ALLOWREBOOT) != DD_OK)
{
MessageBox(NULL, "IDirectDraw7::SetCooperativeLevel failed.", "DirectDraw Error", MB_ICONERROR);
}
if (lpDD->SetDisplayMode(WindowWidth, WindowHeight, 16, 0, 0) != DD_OK)
{
MessageBox(NULL, "IDirectDraw7::SetDisplayMode failed.", "DirectDraw Error", MB_ICONERROR);
}
}
else
{
if (lpDD->SetCooperativeLevel(hMainWindow, DDSCL_NORMAL) != DD_OK)
{
MessageBox(NULL, "IDirectDraw7::SetCooperativeLevel failed.", "DirectDraw Error", MB_ICONERROR);
}
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;
}
if (lpDD->CreateSurface(&ddsd2, &DD_Primary, NULL) != DD_OK)
{
MessageBox(NULL, "IDirectDraw7::CreateSurface failed.", "DirectDraw Error", MB_ICONERROR);
}
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);
}
}
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);
}
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 TRUE;
}
BYTE* SurfBuf;
DDSURFACEDESC2 ddsd;
DWORD LockSurface()
{
if (DD_CFB == NULL) return(0);
memset(&ddsd,0,sizeof(ddsd));
ddsd.dwSize = sizeof( ddsd );
ddsd.dwFlags = DDSD_LPSURFACE | DDSD_PITCH;
if (DD_CFB->Lock(NULL,&ddsd,DDLOCK_WAIT,NULL) != DD_OK)
{
return(0);
}
SurfBuf = (BYTE*)ddsd.lpSurface;
return(ddsd.lPitch);
}
void UnlockSurface()
{
DD_CFB->Unlock((struct tagRECT *)ddsd.lpSurface);
DrawScreen();
}
extern "C" {
void WinUpdateDevices();
DWORD NeedBuffer=1;
short Buffer[1800*2];
int Running=0;
unsigned char Noise[]={ 27,232,234,138,187,246,176,81,25,241,1,127,154,190,195,103,231,165,220,238,
232,189,57,201,123,75,63,143,145,159,13,236,191,142,56,164,222,80,88,13,
148,118,162,212,157,146,176,0,241,88,244,238,51,235,149,50,77,212,186,241,
88,32,23,206,1,24,48,244,248,210,253,77,19,100,83,222,108,68,11,58,
152,161,223,245,4,105,3,82,15,130,171,242,141,2,172,218,152,97,223,157,
93,75,83,238,104,238,131,70,22,252,180,82,110,123,106,133,183,209,48,230,
157,205,27,21,107,63,85,164};
int X, Y;
DWORD Temp1;
MSG msg;
DWORD SurfBufD;
int count, x,count2;
HRESULT hr;
int i;
short *Sound;
DWORD CurrentPos;
DWORD WritePos;
DWORD SoundBufD;
DWORD SoundBufD2;
DWORD T60HZEnabled=0;
DWORD T36HZEnabled=0;
extern unsigned int pressed;
extern unsigned char romispal;
void Start60HZ(void)
{
update_ticks_pc2 = UPDATE_TICKS_UDP * freq / 1000;
if (romispal==1)
{
update_ticks_pc = UPDATE_TICKS_GAMEPAL * freq / 1000;
}
else
{
update_ticks_pc = UPDATE_TICKS_GAME * freq / 1000;
}
if (AltTimer == 0)
{
QueryPerformanceCounter((LARGE_INTEGER*)&start);
QueryPerformanceCounter((LARGE_INTEGER*)&start2);
}
else
{
start = timeGetTime();
start2 = timeGetTime();
}
T36HZEnabled=0;
T60HZEnabled=1;
}
void Stop60HZ(void)
{
T60HZEnabled=0;
}
void Start36HZ(void)
{
update_ticks_pc2 = UPDATE_TICKS_UDP * freq / 1000;
update_ticks_pc = UPDATE_TICKS_GUI * freq / 1000;
if (AltTimer == 0)
{
QueryPerformanceCounter((LARGE_INTEGER*)&start);
QueryPerformanceCounter((LARGE_INTEGER*)&start2);
}
else
{
start = timeGetTime();
start2 = timeGetTime();
}
T60HZEnabled=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -