📄 winlink.cpp
字号:
T36HZEnabled=1;
}
void Stop36HZ(void)
{
T36HZEnabled=0;
}
char WinMessage[256];
extern unsigned char cvidmode;
extern BYTE GrayscaleMode;
extern BYTE V8Mode;
DWORD FirstVid=1;
DWORD FirstFull=1;
extern BYTE GUIWFVID[];
void clearwin();
char WinName[]={"ZSNESW\0"};
void initwinvideo(void)
{
RECT zwindowrect;
WINDOWPLACEMENT wndpl;
RECT rc1, swrect;
DWORD newmode=0;
V8Mode = (GrayscaleMode == 1);
if (CurMode!=cvidmode)
{
CurMode=cvidmode;
newmode=1;
SurfaceX=256;
SurfaceY=224;
X=0;
Y=0;
FullScreen=GUIWFVID[cvidmode];
switch (cvidmode)
{
case 0:
WindowWidth=64;
WindowHeight=56;
break;
case 1:
WindowWidth=128;
WindowHeight=112;
break;
case 2:
WindowWidth=256;
WindowHeight=224;
break;
case 3:
WindowWidth=640;
WindowHeight=480;
SurfaceX=320;
SurfaceY=240;
break;
case 4:
WindowWidth=512;
WindowHeight=448;
break;
case 5:
WindowWidth=512;
WindowHeight=448;
SurfaceX=512;
SurfaceY=448;
break;
case 6:
WindowWidth=640;
WindowHeight=480;
break;
case 7:
WindowWidth=640;
WindowHeight=480;
SurfaceX=640;
SurfaceY=480;
break;
case 8:
WindowWidth=640;
WindowHeight=480;
SurfaceX=512;
SurfaceY=448;
break;
case 9:
WindowWidth=640;
WindowHeight=480;
break;
case 10:
WindowWidth=800;
WindowHeight=600;
break;
case 11:
WindowWidth=800;
WindowHeight=600;
SurfaceX=512;
SurfaceY=448;
break;
case 12:
WindowWidth=800;
WindowHeight=600;
break;
case 13:
WindowWidth=800;
WindowHeight=600;
SurfaceX=512;
SurfaceY=448;
break;
case 14:
WindowWidth=1024;
WindowHeight=768;
break;
case 15:
WindowWidth=1024;
WindowHeight=768;
SurfaceX=512;
SurfaceY=448;
break;
case 16:
WindowWidth=1024;
WindowHeight=768;
break;
case 17:
WindowWidth=1024;
WindowHeight=768;
SurfaceX=512;
SurfaceY=448;
break;
case 18:
WindowWidth=768;
WindowHeight=672;
break;
case 19:
WindowWidth=768;
WindowHeight=672;
SurfaceX=512;
SurfaceY=448;
break;
case 20:
WindowWidth=1024;
WindowHeight=896;
break;
case 21:
WindowWidth=1024;
WindowHeight=896;
SurfaceX=512;
SurfaceY=448;
break;
case 22:
WindowWidth=1280;
WindowHeight=960;
SurfaceX=640;
SurfaceY=480;
break;
case 23:
WindowWidth=1280;
WindowHeight=960;
SurfaceX=512;
SurfaceY=448;
break;
case 24:
WindowWidth=800;
WindowHeight=600;
SurfaceX=640;
SurfaceY=480;
break;
default:
WindowWidth=256;
WindowHeight=224;
break;
}
}
if (((PrevStereoSound!=StereoSound)||(PrevSoundQuality!=SoundQuality))&&FirstSound!=1)
ReInitSound();
if (!FirstVid)
{
if (X<0)X=0;
if (X>(GetSystemMetrics( SM_CXSCREEN )-WindowWidth)) X=(GetSystemMetrics( SM_CXSCREEN )-WindowWidth);
if (Y<0)Y=0;
if (Y>(GetSystemMetrics( SM_CYSCREEN )-WindowHeight)) Y=(GetSystemMetrics( SM_CYSCREEN )-WindowHeight);
if (FullScreen==1) {X=0; Y=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);
}
else
{
atexit(ExitFunction);
AltTimer = AlternateTimer;
if (AltTimer == 0)
{
if (!QueryPerformanceFrequency((LARGE_INTEGER*)&freq)) return;
}
else
{
freq = CLOCKS_PER_SEC;
}
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) { 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();
CheckScreenSaver();
if (!hMainWindow)
{
return;
}
ShowWindow(hMainWindow, SW_SHOWNORMAL);
SetWindowText(hMainWindow,"ZSNESWIN");
InitInput();
InitSound();
TestJoy();
}
if (FirstVid == 1)
{
FirstVid = 0;
InitDirectDraw();
clearwin();
return;
}
if (Moving == 1) return;
if (newmode == 1)
{
ReleaseDirectDraw();
InitDirectDraw();
clearwin();
return;
}
}
extern unsigned int vidbuffer;
extern void SoundProcess();
extern int DSPBuffer;
int * DSPBuffer1;
DWORD ScreenPtr;
DWORD ScreenPtr2;
extern GUI36hzcall(void);
extern Game60hzcall(void);
extern int packettimeleft[256];
extern int PacketCounter;
extern int CounterA;
extern int CounterB;
void CheckTimers(void)
{
if (AltTimer == 0) QueryPerformanceCounter((LARGE_INTEGER*)&end2);
else end2 = timeGetTime();
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)
{
if (AltTimer == 0) QueryPerformanceCounter((LARGE_INTEGER*)&end);
else end = timeGetTime();
while ((end - start) >= update_ticks_pc)
{
_asm{
pushad
call Game60hzcall
popad
}
start += update_ticks_pc;
}
}
if (T36HZEnabled)
{
if (AltTimer == 0) QueryPerformanceCounter((LARGE_INTEGER*)&end);
else end = timeGetTime();
while ((end - start) >= update_ticks_pc)
{
_asm{
pushad
call GUI36hzcall
popad
}
start += update_ticks_pc;
}
}
}
extern BYTE GUIOn2;
void UpdateVFrame(void)
{
if (GUIOn2 == 1 && IsActivated == 0) WaitMessage();
int DataNeeded;
int 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;
lpSoundBuffer->GetCurrentPosition(&CurrentPos,&WritePos);
if (LastUsedPos <= CurrentPos)
{
DataNeeded=CurrentPos-LastUsedPos;
}
else
{
DataNeeded=SoundBufferSize - LastUsedPos + CurrentPos;
}
DataNeeded/=(SPCSize*2);
DataNeeded*=(SPCSize*2);
while (DataNeeded>0)
{
_asm
{
pushad
call SoundProcess
popad
}
DSPBuffer1=(int *)&DSPBuffer;
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 (T36HZEnabled)Buffer[i]=0;
}
if (DS_OK!=lpSoundBuffer->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 (DS_OK != lpSoundBuffer->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 unsigned char FPUCopy;
extern unsigned char NGNoTransp;
extern unsigned char newengen;
void clearwin()
{
DWORD i,j,color32;
DWORD *SURFDW;
Temp1=LockSurface();
if (Temp1==0) { return; }
SurfBufD=(DWORD) &SurfBuf[0];
SURFDW=(DWORD *) &SurfBuf[0];
switch (BitDepth)
{
case 16:
_asm {
push es
mov ax,ds
mov es,ax
xor eax,eax
mov edi,SurfBufD
xor ebx,ebx
Blank2:
xor eax,eax
mov ecx,SurfaceX
rep stosw
add edi,Temp1
sub edi,SurfaceX
sub edi,SurfaceX
add ebx,1
cmp ebx,SurfaceY
jne Blank2
pop es // BUGFIX
}
break;
case 32:
_asm {
push es
mov ax,ds
mov es,ax
xor eax,eax
mov edi,SurfBufD
xor ebx,ebx
Blank3:
xor eax,eax
mov ecx,SurfaceX
rep stosd
add edi,Temp1
sub edi,SurfaceX
sub edi,SurfaceX
sub edi,SurfaceX
sub edi,SurfaceX
add ebx,1
cmp ebx,SurfaceY
jne Blank3
pop es // BUGFIX
}
break;
}
UnlockSurface();
}
void drawscreenwin(void)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -