📄 infones_system_win.cpp
字号:
case IDC_BTN_FAST:
/*-------------------------------------------------------------------*/
/* Fast & Slow button */
/*-------------------------------------------------------------------*/
// Increment Frameskip Counter
FrameSkip++;
break;
case IDC_BTN_SLOW:
// Decrement Frameskip Counter
if (FrameSkip <= 0)
break;
FrameSkip--;
break;
case IDC_BTN_SINGLE:
/*-------------------------------------------------------------------*/
/* Screen Size x1, x2, x3 button */
/*-------------------------------------------------------------------*/
SetWindowSize( 1 );
// Check x1 button
CheckMenuItem( GetMenu( hWndMain ), IDC_BTN_SINGLE, MF_CHECKED );
CheckMenuItem( GetMenu( hWndMain ), IDC_BTN_DOUBLE, MF_UNCHECKED );
CheckMenuItem( GetMenu( hWndMain ), IDC_BTN_TRIPLE, MF_UNCHECKED );
// Clear FrameSkip
FrameSkip = 0;
break;
case IDC_BTN_DOUBLE:
SetWindowSize( 2 );
// Check x2 button
CheckMenuItem( GetMenu( hWndMain ), IDC_BTN_SINGLE, MF_UNCHECKED );
CheckMenuItem( GetMenu( hWndMain ), IDC_BTN_DOUBLE, MF_CHECKED );
CheckMenuItem( GetMenu( hWndMain ), IDC_BTN_TRIPLE, MF_UNCHECKED );
// Clear FrameSkip
FrameSkip = 0;
break;
case IDC_BTN_TRIPLE:
SetWindowSize( 3 );
// Check x3 button
CheckMenuItem( GetMenu( hWndMain ), IDC_BTN_SINGLE, MF_UNCHECKED );
CheckMenuItem( GetMenu( hWndMain ), IDC_BTN_DOUBLE, MF_UNCHECKED );
CheckMenuItem( GetMenu( hWndMain ), IDC_BTN_TRIPLE, MF_CHECKED );
// Clear FrameSkip
FrameSkip = 0;
break;
case IDC_BTN_CLIP_VERTICAL:
/*-------------------------------------------------------------------*/
/* Screen Clip Up and Down button */
/*-------------------------------------------------------------------*/
PPU_UpDown_Clip = ( PPU_UpDown_Clip ? 0 : 1 );
// Check or Uncheck it
if ( PPU_UpDown_Clip )
{
CheckMenuItem( GetMenu( hWndMain ), IDC_BTN_CLIP_VERTICAL, MF_CHECKED );
} else {
CheckMenuItem( GetMenu( hWndMain ), IDC_BTN_CLIP_VERTICAL, MF_UNCHECKED );
}
break;
case IDC_BTN_FRAMESKIP:
/*-------------------------------------------------------------------*/
/* Auto Frameskip button */
/*-------------------------------------------------------------------*/
bAutoFrameskip = ( bAutoFrameskip ? 0 : 1 );
// Check or Uncheck it
if ( bAutoFrameskip )
{
CheckMenuItem( GetMenu( hWndMain ), IDC_BTN_FRAMESKIP, MF_CHECKED );
} else {
CheckMenuItem( GetMenu( hWndMain ), IDC_BTN_FRAMESKIP, MF_UNCHECKED );
}
break;
case IDC_BTN_MUTE:
/*-------------------------------------------------------------------*/
/* APU Mute button */
/*-------------------------------------------------------------------*/
APU_Mute = ( APU_Mute ? 0 : 1 );
if (!lpSndDevice->SoundMute( APU_Mute ) )
{
InfoNES_MessageBox( "SoundMute() Failed." );
exit(0);
}
// Check or Uncheck it
if ( APU_Mute )
{
CheckMenuItem( GetMenu( hWndMain ), IDC_BTN_MUTE, MF_CHECKED );
} else {
CheckMenuItem( GetMenu( hWndMain ), IDC_BTN_MUTE, MF_UNCHECKED );
}
break;
case IDC_BTN_ABOUT:
/*-------------------------------------------------------------------*/
/* About button */
/*-------------------------------------------------------------------*/
DialogBox(wc.hInstance,
MAKEINTRESOURCE(IDD_DIALOG),
hWndMain,
(DLGPROC)AboutDlgProc);
break;
}
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
/*===================================================================*/
/* */
/* AboutDlgProc() : The About Dialog Box Procedure */
/* */
/*===================================================================*/
LRESULT CALLBACK AboutDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch (uMsg)
{
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
switch ( LOWORD(wParam) )
{
case IDOK:
EndDialog(hDlg, TRUE);
return TRUE;
}
break;
}
return FALSE;
}
/*===================================================================*/
/* */
/* ShowTitle() : Show Title Screen Procedure */
/* */
/*===================================================================*/
void ShowTitle( HWND hWnd )
{
HDC hDC = GetDC( hWnd );
HDC hMemDC = CreateCompatibleDC( hDC );
HBITMAP hTitleBmp = LoadBitmap( wc.hInstance, MAKEINTRESOURCE( IDB_BITMAP ) );
// Blt Title Bitmap
SelectObject( hMemDC, hTitleBmp );
StretchBlt( hDC, 0, 0, NES_DISP_WIDTH * wScreenMagnification,
NES_DISP_HEIGHT * wScreenMagnification, hMemDC,
0, 0, NES_DISP_WIDTH, NES_DISP_HEIGHT, SRCCOPY );
SelectObject( hMemDC, hTitleBmp );
DeleteDC( hMemDC );
ReleaseDC( hWnd, hDC );
}
/*===================================================================*/
/* */
/* LoadSRAM() : Load a SRAM */
/* */
/*===================================================================*/
int LoadSRAM()
{
/*
* Load a SRAM
*
* Return values
* 0 : Normally
* -1 : SRAM data couldn't be read
*/
FILE *fp;
unsigned char pSrcBuf[ SRAM_SIZE ];
unsigned char chData;
unsigned char chTag;
int nRunLen;
int nDecoded;
int nDecLen;
int nIdx;
// It doesn't need to save it
nSRAM_SaveFlag = 0;
// It is finished if the ROM doesn't have SRAM
if ( !ROM_SRAM )
return 0;
// There is necessity to save it
nSRAM_SaveFlag = 1;
// The preparation of the SRAM file name
strcpy( szSaveName, szRomName );
strcpy( strrchr( szSaveName, '.' ) + 1, "srm" );
/*-------------------------------------------------------------------*/
/* Read a SRAM data */
/*-------------------------------------------------------------------*/
// Open SRAM file
fp = fopen( szSaveName, "rb" );
if ( fp == NULL )
return -1;
// Read SRAM data
fread( pSrcBuf, SRAM_SIZE, 1, fp );
// Close SRAM file
fclose( fp );
/*-------------------------------------------------------------------*/
/* Extract a SRAM data */
/*-------------------------------------------------------------------*/
nDecoded = 0;
nDecLen = 0;
chTag = pSrcBuf[ nDecoded++ ];
while ( nDecLen < 8192 )
{
chData = pSrcBuf[ nDecoded++ ];
if ( chData == chTag )
{
chData = pSrcBuf[ nDecoded++ ];
nRunLen = pSrcBuf[ nDecoded++ ];
for ( nIdx = 0; nIdx < nRunLen + 1; ++nIdx )
{
SRAM[ nDecLen++ ] = chData;
}
}
else
{
SRAM[ nDecLen++ ] = chData;
}
}
// Successful
return 0;
}
/*===================================================================*/
/* */
/* SaveSRAM() : Save a SRAM */
/* */
/*===================================================================*/
int SaveSRAM()
{
/*
* Save a SRAM
*
* Return values
* 0 : Normally
* -1 : SRAM data couldn't be written
*/
FILE *fp;
int nUsedTable[ 256 ];
unsigned char chData;
unsigned char chPrevData;
unsigned char chTag;
int nIdx;
int nEncoded;
int nEncLen;
int nRunLen;
unsigned char pDstBuf[ SRAM_SIZE ];
if ( !nSRAM_SaveFlag )
return 0; // It doesn't need to save it
/*-------------------------------------------------------------------*/
/* Compress a SRAM data */
/*-------------------------------------------------------------------*/
memset( nUsedTable, 0, sizeof nUsedTable );
for ( nIdx = 0; nIdx < SRAM_SIZE; ++nIdx )
{
++nUsedTable[ SRAM[ nIdx++ ] ];
}
for ( nIdx = 1, chTag = 0; nIdx < 256; ++nIdx )
{
if ( nUsedTable[ nIdx ] < nUsedTable[ chTag ] )
chTag = nIdx;
}
nEncoded = 0;
nEncLen = 0;
nRunLen = 1;
pDstBuf[ nEncLen++ ] = chTag;
chPrevData = SRAM[ nEncoded++ ];
while ( nEncoded < SRAM_SIZE && nEncLen < SRAM_SIZE - 133 )
{
chData = SRAM[ nEncoded++ ];
if ( chPrevData == chData && nRunLen < 256 )
++nRunLen;
else
{
if ( nRunLen >= 4 || chPrevData == chTag )
{
pDstBuf[ nEncLen++ ] = chTag;
pDstBuf[ nEncLen++ ] = chPrevData;
pDstBuf[ nEncLen++ ] = nRunLen - 1;
}
else
{
for ( nIdx = 0; nIdx < nRunLen; ++nIdx )
pDstBuf[ nEncLen++ ] = chPrevData;
}
chPrevData = chData;
nRunLen = 1;
}
}
if ( nRunLen >= 4 || chPrevData == chTag )
{
pDstBuf[ nEncLen++ ] = chTag;
pDstBuf[ nEncLen++ ] = chPrevData;
pDstBuf[ nEncLen++ ] = nRunLen - 1;
}
else
{
for ( nIdx = 0; nIdx < nRunLen; ++nIdx )
pDstBuf[ nEncLen++ ] = chPrevData;
}
/*-------------------------------------------------------------------*/
/* Write a SRAM data */
/*-------------------------------------------------------------------*/
// Open SRAM file
fp = fopen( szSaveName, "wb" );
if ( fp == NULL )
return -1;
// Write SRAM data
fwrite( pDstBuf, nEncLen, 1, fp );
// Close SRAM file
fclose( fp );
// Successful
return 0;
}
/*===================================================================*/
/* */
/* InfoNES_Menu() : Menu screen */
/* */
/*===================================================================*/
int InfoNES_Menu()
{
/*
* Menu screen
*
* Return values
* 0 : Normally
* -1 : Exit InfoNES
*/
// Nothing to do here
return 0;
}
/*===================================================================*/
/* */
/* InfoNES_ReadRom() : Read ROM image file */
/* */
/*===================================================================*/
int InfoNES_ReadRom( const char *pszFileName )
{
/*
* Read ROM image file
*
* Parameters
* const char *pszFileName (Read)
*
* Return values
* 0 : Normally
* -1 : Error
*/
FILE *fp;
/* Open ROM file */
fp = fopen( pszFileName, "rb" );
if ( fp == NULL )
return -1;
/* Read ROM Header */
fread( &NesHeader, sizeof NesHeader, 1, fp );
if ( memcmp( NesHeader.byID, "NES\x1a", 4 ) != 0 )
{
/* not .nes file */
fclose( fp );
return -1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -