📄 win32.cpp
字号:
case 50:return !Joystick [j].PovDnRight; case 51:return !Joystick [j].PovUpLeft; case 52:return !Joystick [j].PovUpRight; case 41:return !Joystick [j].ZUp; case 42:return !Joystick [j].ZDown; case 43:return !Joystick [j].RUp; case 44:return !Joystick [j].RDown; case 45:return !Joystick [j].UUp; case 46:return !Joystick [j].UDown; case 47:return !Joystick [j].VUp; case 48:return !Joystick [j].VDown; default: if ((KeyIdent & 0xff) > 40) return false; return !Joystick [j].Button [(KeyIdent & 0xff) - 8]; } } return ((GetKeyState (KeyIdent) & 0x80) == 0);}uint32 S9xReadJoypad (int which1){ if (which1 > 4) return 0; if (which1 == 0 && !Settings.NetPlay) S9xWinScanJoypads ();#ifdef NETPLAY_SUPPORT if (Settings.NetPlay) return (S9xNPGetJoypad (which1));#endif return (joypads [which1]);}void CheckAxis (int val, int min, int max, bool &first, bool &second){ if (Normalize (val, min, max) < -S9X_JOY_NEUTRAL) { second = false; first = true; } else first = false; if (Normalize (val, min, max) > S9X_JOY_NEUTRAL) { first = false; second = true; } else second = false;}static void S9xWinScanJoypads (){ uint8 PadState[2]; JOYINFOEX jie; for (int C = 0; C != 16; C ++) { if (Joystick[C].Attached) { jie.dwSize = sizeof (jie); jie.dwFlags = JOY_RETURNALL; if (joyGetPosEx (JOYSTICKID1+C, &jie) != JOYERR_NOERROR) { Joystick[C].Attached = false; continue; } CheckAxis (jie.dwXpos, Joystick[C].Caps.wXmin, Joystick[C].Caps.wXmax, Joystick[C].Left, Joystick[C].Right); CheckAxis (jie.dwYpos, Joystick[C].Caps.wYmin, Joystick[C].Caps.wYmax, Joystick[C].Up, Joystick[C].Down); CheckAxis (jie.dwZpos, Joystick[C].Caps.wZmin, Joystick[C].Caps.wZmax, Joystick[C].ZUp, Joystick[C].ZDown); CheckAxis (jie.dwRpos, Joystick[C].Caps.wRmin, Joystick[C].Caps.wRmax, Joystick[C].RUp, Joystick[C].RDown); CheckAxis (jie.dwUpos, Joystick[C].Caps.wUmin, Joystick[C].Caps.wUmax, Joystick[C].UUp, Joystick[C].UDown); CheckAxis (jie.dwVpos, Joystick[C].Caps.wVmin, Joystick[C].Caps.wVmax, Joystick[C].VUp, Joystick[C].VDown); switch (jie.dwPOV) { case JOY_POVBACKWARD: Joystick[C].PovDown = true; Joystick[C].PovUp = false; Joystick[C].PovLeft = false; Joystick[C].PovRight = false; Joystick[C].PovDnLeft = false; Joystick[C].PovDnRight = false; Joystick[C].PovUpLeft = false; Joystick[C].PovUpRight = false; break; case 4500: Joystick[C].PovDown = false; Joystick[C].PovUp = false; Joystick[C].PovLeft = false; Joystick[C].PovRight = false; Joystick[C].PovDnLeft = false; Joystick[C].PovDnRight = false; Joystick[C].PovUpLeft = false; Joystick[C].PovUpRight = true; break; case 13500: Joystick[C].PovDown = false; Joystick[C].PovUp = false; Joystick[C].PovLeft = false; Joystick[C].PovRight = false; Joystick[C].PovDnLeft = false; Joystick[C].PovDnRight = true; Joystick[C].PovUpLeft = false; Joystick[C].PovUpRight = false; break; case 22500: Joystick[C].PovDown = false; Joystick[C].PovUp = false; Joystick[C].PovLeft = false; Joystick[C].PovRight = false; Joystick[C].PovDnLeft = true; Joystick[C].PovDnRight = false; Joystick[C].PovUpLeft = false; Joystick[C].PovUpRight = false; break; case 31500: Joystick[C].PovDown = false; Joystick[C].PovUp = false; Joystick[C].PovLeft = false; Joystick[C].PovRight = false; Joystick[C].PovDnLeft = false; Joystick[C].PovDnRight = false; Joystick[C].PovUpLeft = true; Joystick[C].PovUpRight = false; break; case JOY_POVFORWARD: Joystick[C].PovDown = false; Joystick[C].PovUp = true; Joystick[C].PovLeft = false; Joystick[C].PovRight = false; Joystick[C].PovDnLeft = false; Joystick[C].PovDnRight = false; Joystick[C].PovUpLeft = false; Joystick[C].PovUpRight = false; break; case JOY_POVLEFT: Joystick[C].PovDown = false; Joystick[C].PovUp = false; Joystick[C].PovLeft = true; Joystick[C].PovRight = false; Joystick[C].PovDnLeft = false; Joystick[C].PovDnRight = false; Joystick[C].PovUpLeft = false; Joystick[C].PovUpRight = false; break; case JOY_POVRIGHT: Joystick[C].PovDown = false; Joystick[C].PovUp = false; Joystick[C].PovLeft = false; Joystick[C].PovRight = true; Joystick[C].PovDnLeft = false; Joystick[C].PovDnRight = false; Joystick[C].PovUpLeft = false; Joystick[C].PovUpRight = false; break; default: Joystick[C].PovDown = false; Joystick[C].PovUp = false; Joystick[C].PovLeft = false; Joystick[C].PovRight = false; Joystick[C].PovDnLeft = false; Joystick[C].PovDnRight = false; Joystick[C].PovUpLeft = false; Joystick[C].PovUpRight = false; break; } for (int B = 0; B < 32; B ++) Joystick[C].Button[B] = (jie.dwButtons & (1 << B)) != 0; } } for (int J = 0; J < 5; J++) { if (Joypad [J].Enabled) { PadState[0] = 0; PadState[0] |= !S9xGetState (Joypad[J].R) ? 16 : 0; PadState[0] |= !S9xGetState (Joypad[J].L) ? 32 : 0; PadState[0] |= !S9xGetState (Joypad[J].X) ? 64 : 0; PadState[0] |= !S9xGetState (Joypad[J].A) ? 128 : 0; PadState[1] = 0; PadState[1] |= !S9xGetState (Joypad[J].Right) ? 1 : 0; PadState[1] |= !S9xGetState (Joypad[J].Right_Up) ? 1 + 8 : 0; PadState[1] |= !S9xGetState (Joypad[J].Right_Down)? 1 + 4 : 0; PadState[1] |= !S9xGetState (Joypad[J].Left) ? 2 : 0; PadState[1] |= !S9xGetState (Joypad[J].Left_Up)? 2 + 8 : 0; PadState[1] |= !S9xGetState (Joypad[J].Left_Down)? 2 + 4 : 0; PadState[1] |= !S9xGetState (Joypad[J].Down) ? 4 : 0; PadState[1] |= !S9xGetState (Joypad[J].Up) ? 8 : 0; PadState[1] |= !S9xGetState (Joypad[J].Start) ? 16 : 0; PadState[1] |= !S9xGetState (Joypad[J].Select) ? 32 : 0; PadState[1] |= !S9xGetState (Joypad[J].Y) ? 64 : 0; PadState[1] |= !S9xGetState (Joypad[J].B) ? 128 : 0; //handle turbo case! if((GUI.TurboMask&TURBO_A_MASK)&&(PadState[0]&128)) PadState[0]^=(joypads[J]&128); if((GUI.TurboMask&TURBO_B_MASK)&&(PadState[1]&128)) PadState[1]^=((joypads[J]&(128<<8))>>8); if((GUI.TurboMask&TURBO_Y_MASK)&&(PadState[1]&64)) PadState[1]^=((joypads[J]&(64<<8))>>8); if((GUI.TurboMask&TURBO_X_MASK)&&(PadState[0]&64)) PadState[0]^=(joypads[J]&64); if((GUI.TurboMask&TURBO_L_MASK)&&(PadState[0]&32)) PadState[0]^=(joypads[J]&32); if((GUI.TurboMask&TURBO_R_MASK)&&(PadState[0]&16)) PadState[0]^=(joypads[J]&16); if((GUI.TurboMask&TURBO_SEL_MASK)&&(PadState[1]&32)) PadState[1]^=((joypads[J]&(32<<8))>>8); if((GUI.TurboMask&TURBO_STA_MASK)&&(PadState[1]&16)) PadState[1]^=((joypads[J]&(16<<8))>>8); //end turbo case... joypads [J] = PadState [0] | (PadState [1] << 8) | 0x80000000; } else joypads [J] = 0; }}PALETTEENTRY S9xPaletteEntry[256];void S9xSetPalette( void){ LPDIRECTDRAWPALETTE lpDDTemp; uint16 Brightness = IPPU.MaxBrightness * 140; // Only update the palette structures if needed if( GUI.ScreenDepth == 8) { if (Settings.SixteenBit) { for (int i = 0; i < 256; i++) { S9xPaletteEntry[i].peRed = FixedColours [i].red; S9xPaletteEntry[i].peGreen = FixedColours [i].green; S9xPaletteEntry[i].peBlue = FixedColours [i].blue; } } else { for (int i = 0; i < 256; i ++) { S9xPaletteEntry[i].peRed = (((PPU.CGDATA [i] >> 0) & 0x1F) * Brightness) >> 8; S9xPaletteEntry[i].peGreen = (((PPU.CGDATA [i] >> 5) & 0x1F) * Brightness) >> 8; S9xPaletteEntry[i].peBlue = (((PPU.CGDATA [i] >> 10) & 0x1F) * Brightness) >> 8; } } DirectX.lpDDSPrimary2->GetPalette (&lpDDTemp); if (lpDDTemp != DirectX.lpDDPalette) DirectX.lpDDSPrimary2->SetPalette (DirectX.lpDDPalette); DirectX.lpDDPalette->SetEntries (0, 0, 256, S9xPaletteEntry); }}bool LockSurface2 (LPDIRECTDRAWSURFACE2 lpDDSurface, SSurface *lpSurface){ DDSURFACEDESC ddsd; HRESULT hResult; int retry; ddsd.dwSize = sizeof (ddsd); retry = 0; while (true) { hResult = lpDDSurface->Lock( NULL, &ddsd, DDLOCK_WAIT, NULL); if( hResult == DD_OK) { lpSurface->Width = ddsd.dwWidth; lpSurface->Height = ddsd.dwHeight; lpSurface->Pitch = ddsd.lPitch; lpSurface->Surface = (unsigned char *)ddsd.lpSurface; return (true); } if (hResult == DDERR_SURFACELOST) { retry++; if (retry > 5) return (false); hResult = lpDDSurface->Restore(); GUI.ScreenCleared = true; if (hResult != DD_OK) return (false); continue; } if (hResult != DDERR_WASSTILLDRAWING) return (false); }}BYTE *ScreenBuf1 = NULL;BYTE *ScreenBuf2 = NULL;BYTE *ScreenBuffer = NULL;BYTE *SubScreenBuffer = NULL;BYTE *ZBuffer = NULL;BYTE *SubZBuffer = NULL;static bool8 locked_surface = FALSE;static SSurface Dst;bool8 S9xInitUpdate (void){ GFX.SubScreen = SubScreenBuffer; GFX.ZBuffer = ZBuffer; GFX.SubZBuffer = SubZBuffer; if (GUI.Scale <= 1 && (GUI.Stretch || !GUI.FullScreen) && !GUI.NeedDepthConvert && ((DirectX.lpDDSOffScreen2 && LockSurface2 (DirectX.lpDDSOffScreen2, &Dst)))) { GFX.RealPitch = GFX.Pitch = GFX.Pitch2 = Dst.Pitch; GFX.Screen = Dst.Surface; DirectX.lpDDSOffScreen2->Unlock (Dst.Surface); locked_surface = TRUE; } else { locked_surface = FALSE;#ifdef USE_OPENGL // For OpenGL lock the screen buffer size width to 512 (might be // overriden in S9xStartScreenRefresh) so the buffer can be uploaded // into texture memory with a single OpenGL call. if (Settings.OpenGLEnable) GFX.RealPitch = GFX.Pitch = GFX.Pitch2 = 512 * sizeof (uint16); else#endif GFX.RealPitch = GFX.Pitch = GFX.Pitch2 = EXT_PITCH; GFX.Screen = ScreenBuffer; } GFX.Delta = (GFX.SubScreen - GFX.Screen) >> 1; if (Settings.SixteenBit) { GFX.PPL = GFX.Pitch >> 1; GFX.PPLx2 = GFX.Pitch; GFX.ZPitch = GFX.Pitch >> 1; } else { GFX.PPL = GFX.Pitch; GFX.PPLx2 = GFX.Pitch * 2; GFX.ZPitch = GFX.Pitch; } return (TRUE);}bool8 S9xDeinitUpdate (int Width, int Height, bool8 sixteen_bit){ #define BLACK BUILD_PIXEL(0,0,0) SSurface Src; LPDIRECTDRAWSURFACE2 lpDDSurface2 = NULL; LPDIRECTDRAWSURFACE2 pDDSurface = NULL; bool PrimarySurfaceLockFailed = false; RECT srcRect;#ifdef USE_DIRECTX3D HRESULT Render3DEnvironment (); Render3DEnvironment (); return true;#endif Src.Width = Width; if(Height%SNES_HEIGHT) Src.Height = Height; else { if(Height==SNES_HEIGHT) Src.Height=SNES_HEIGHT_EXTENDED; else Src.Height=SNES_HEIGHT_EXTENDED<<1; } Src.Pitch = GFX.Pitch; Src.Surface = GFX.Screen; // avi writing DoAVIVideoFrame(&Src, Width, Height, sixteen_bit); if(Settings.SixteenBit) { uint32 q; uint16* foo=(uint16*)(Src.Surface+(Height*Src.Pitch)); for(q=0; q<(((Src.Height-Height)*Src.Pitch)>>1); q++) { foo[q]=BLACK; } Height = Src.Height; } else { uint32 q; uint8* foo=(uint8*)(Src.Surface+(Height*Src.Pitch)); for(q=0; q<(((Src.Height-Height)*Src.Pitch)); q++) { foo[q]=BLACK; } Height = Src.Height; } GUI.ScreenCleared = true; SelectRenderMethod (); if (!VOODOO_MODE && !OPENGL_MODE) { if (locked_surface) { lpDDSurface2 = DirectX.lpDDSOffScreen2; PrimarySurfaceLockFailed = true; srcRect.top = 0; srcRect.bottom = Height; srcRect.left = 0; srcRect.right = Width; } else { DDSCAPS caps; caps.dwCaps = DDSCAPS_BACKBUFFER; if (DirectX.lpDDSPrimary2->GetAttachedSurface (&caps, &pDDSurface) != DD_OK || pDDSurface == NULL) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -