path=C:\Program Files\Microsoft DirectX SDK (February 2010)\Include --compile at vc2008------------------------------------------- 1.Properties:Configuration Properties -> C/C++ -> General -> Additional Include Directories -> "C:\Program Files\Microsoft DirectX SDK (February 2010)\Include" 2.Properties:Configuration Properties -> Linker -> General -> Additional Library Directories -> "C:\Program Files\Microsoft DirectX SDK (February 2010)\Lib\x86" --fuction call-------------------------------------------------- WNDMSG CMainFrame::OnCreate( WNDMSGPARAM ) ddsd.ddpfPixelFormat.dwRGBBitCount // how many bits per pixel --------------------------------------------------CreateThread virtuanes\EmuThread.cpp:127 => if( !(m_hThread = ::CreateThread( NULL, 0, ThreadProc, 0, 0, &m_dwThreadID )) ) {} virtuanes\AviConvDlg.cpp:383 => if( !(m_hThread = ::CreateThread( NULL, 0, ThreadProc, this, CREATE_SUSPENDED, &m_dwThreadID )) ) {} --------------------------------------------------Plugin virtuanes\WinMain.cpp:82 => if( !CPlugin::FindPlugin( CApp::GetModulePath() ) ) {} virtuanes\Plugin.cpp:31 => BOOL CPlugin::FindPlugin( LPCSTR lpModulePath ) virtuanes\WinMain.cpp:103 => Config.Load(); virtuanes\Config.cpp:166 => void CConfig::Load() virtuanes\Config.cpp:412 => int luaShMax=CRegistry::GetProfileInt( keys, "luash_num", 0); virtuanes\MainFrame.cpp:1871 => WNDCMD CMainFrame::OnLanguageCfg( WNDCMDPARAM ) virtuanes\MainFrame.cpp:1913 => if( !(hPlugin = ::LoadLibrary( CPlugin::GetPluginPath() )) ) --------------------------------------------------DirectInput INT WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow ) virtuanes\DirectInput.h:32 => enum { DIJOYSTICK_MAX = 16 }; virtuanes\DirectInput.h:47 => BYTE m_Sw[256+64*DIJOYSTICK_MAX]; // 256 + 64*16 = 1280 ## debug\lua\virtuanes_int.lua ## 手柄按键情况取得 virtuanes\DirectInput.cpp:344 => void CDirectInput::Poll(){ virtuanes\DirectInput.cpp:379 => if( m_lpJoystick[i]->GetDeviceState( sizeof(DIJOYSTATE), &js ) != DI_OK ) { } virtuanes\DirectInput.cpp:452 => if( js.lX > 8000 ) m_Sw[idx + DI_XAXIS+0] = 0x80; // idx = 256+i*64; DI_XAXIS = 0 ; virtuanes\DirectInput.cpp:485 => m_Sw[idx + DI_BUTTON + j] = js.rgbButtons[j]; // idx = 256+i*64; DI_BUTTON = 16 ; INT j = 0; j < 32; j++ virtuanes\DirectInput.cpp:504 => if( data & (1<<0) ) m_Sw[idx + DI_POV0_UD+0] = 0x80; // idx = 256+i*64; DI_POV0_UD = 48 ; } ##游戏输入设定 virtuanes\DirectInput.cpp:95 virtuanes\ControllerDlg.cpp:335 => DLGMSG CControllerDlg::OnTimer( DLGMSGPARAM ) { virtuanes\ControllerDlg.cpp:393 => if( DirectInput.m_Sw[i] ) {} virtuanes\ControllerDlg.cpp:397 => Config.controller.nButton[m_PageSel][nID+nOffset] = i; } ## 快捷键设定 virtuanes\ShortcutDlg.cpp:158 => DLGMSG CShortcutDlg::OnTimer( DLGMSGPARAM ) { virtuanes\ShortcutDlg.cpp:228 => if( DirectInput.m_Sw[i]&0x80 ) {} virtuanes\ShortcutDlg.cpp:230 => str = str + DirectInput.SearchKeyName(i); virtuanes\ShortcutDlg.cpp:233 => m_ControlBuf2[m_SelectID] = keyex+i; virtuanes\ShortcutDlg.cpp:236 => m_ControlBuf [m_SelectID] = keyex+i; } virtuanes\ShortcutDlg.cpp:302 => DLGCMD CShortcutDlg::OnOK( DLGCMDPARAM ) virtuanes\ShortcutDlg.cpp:315 => Config.shortcut.nShortCut[CConfig::ShortcutKeyID[i*3+2] ] = m_ControlBuf [i]; virtuanes\EmuThread.cpp:1053 => CMainFrame::OnKeyControl(); virtuanes\MainFrame.cpp:3070 => void CMainFrame::OnKeyControl() { virtuanes\MainFrame.cpp:3130 => WORD* pShortCutKey = Config.shortcut.nShortCut; virtuanes\MainFrame.cpp:3131 => INT* pShortCutKeyID = Config.ShortcutKeyID; virtuanes\MainFrame.cpp:3156 => ::PostMessage( CApp::GetHWnd(), WM_COMMAND, (WPARAM)pShortCutKeyID[i*3+0], (LPARAM)0 ); } virtuanes\EmuThread.cpp:425 => DWORD WINAPI CEmuThread::ThreadProc( LPVOID lpParam ) virtuanes\EmuThread.cpp:475 => DirectDraw.SetMessageString( "Emulation Test start." ); // ① 模拟输入(包括手柄引脚) virtuanes\EmuThread.cpp:1037 => if( !FrameInput() ) { virtuanes\EmuThread.cpp:307 => BOOL CEmuThread::FrameInput() virtuanes\EmuThread.cpp:312 => DirectInput.Poll(); virtuanes\EmuThread.cpp:320 => g_nes->pad->Sync(); virtuanes\NES\PAD.cpp:411 => void PAD::Sync() // padbit[0] = SyncSub( 0 ); virtuanes\NES\PAD.cpp:413 => padbit[0] = SyncSub( 0 ); virtuanes\NES\PAD.cpp:462 => BYTE PAD::SyncSub( INT no ) virtuanes\NES\PAD.cpp:467 => if( Config.ButtonCheck( no, 0 ) ){} virtuanes\Config.cpp:750 => BOOL CConfig::ButtonCheck( INT nNo, INT nID ) virtuanes\Config.cpp:757 => if( Config.controller.nButton[nNo][nID+ 0] && DirectInput.m_Sw[Config.controller.nButton[nNo][nID+ 0]] } // 模拟处理 virtuanes\EmuThread.cpp:1038 => g_nes->EmulateFrame( TRUE );{ virtuanes\NES\Nes.cpp:541 => void NES::EmulateFrame( BOOL bDraw ) virtuanes\NES\Nes.cpp:636 => pad->VSync(); // padbitsync[0] = padbit[0]; virtuanes\NES\Nes.cpp:649 => EmulationCPU( nescfg->ScanlineCycles ); virtuanes\NES\Nes.cpp:476 => void NES::EmulationCPU( INT basecycles ) virtuanes\NES\Nes.cpp:522 => emul_cycles += cpu->EXEC( cycles ); virtuanes\NES\Cpu.cpp:757 => INT CPU::EXEC( INT request_cycles ) } // ③ 读取手柄数据 virtuanes\NES\Cpu.cpp:1141 => MR_AX(); LDA(); CHECK_EA(); { #define MR_AX() {ET = OP6502W( R.PC );R.PC += 2;EA = ET + R.X;DT = RD6502( EA );} virtuanes\NES\Cpu.cpp:626 => inline BYTE CPU::RD6502( WORD addr ) virtuanes\NES\Cpu.cpp:633 => return nes->Read( addr ); virtuanes\NES\Nes.cpp:890 => BYTE NES::Read( WORD addr ) virtuanes\NES\Nes.cpp:899 => return ReadReg( addr ); virtuanes\NES\Nes.cpp:948 => BYTE NES::ReadReg( WORD addr ) virtuanes\NES\Nes.cpp:970 => return pad->Read( addr ) | 0x40 | m_TapeOut; virtuanes\NES\PAD.cpp:596 => BYTE PAD::Read( WORD addr ) // data = (BYTE)pad1bit&1; } // ② 从手柄引脚 写手柄数据到内存 virtuanes\NES\Cpu.cpp:1237 => EA_AB(); STX(); MW_EA(); { #define MW_EA() WR6502(EA,DT) virtuanes\NES\Cpu.cpp:665 => inline void CPU::WR6502( WORD addr, BYTE data ) virtuanes\NES\Cpu.cpp:672 => nes->Write( addr, data ); virtuanes\NES\Nes.cpp:916 => void NES::Write( WORD addr, BYTE data ) virtuanes\NES\Nes.cpp:929 => WriteReg( addr, data ); virtuanes\NES\Nes.cpp:986 => void NES::WriteReg( WORD addr, BYTE data ) virtuanes\NES\Nes.cpp:1007 => pad->Write( addr, data ); virtuanes\NES\PAD.cpp:653 => void PAD::Write( WORD addr, BYTE data ) virtuanes\NES\PAD.cpp:661 => Strobe(); virtuanes\NES\PAD.cpp:556 => void PAD::Strobe() virtuanes\NES\PAD.cpp:605 => pad1bit = (DWORD)padbitsync[0] | ((DWORD)padbitsync[2]<<8) | 0x00080000; } virtuanes\MainFrame.cpp:1013 => OnEmulationStart( szFile, FALSE ); virtuanes\MainFrame.cpp:1151 => OnEmulationStart( CRecent::GetName( (INT)uID-ID_MRU_FILE0 ), FALSE ); --------------------------------------------------DirectDraw virtuanes\DirectDraw.cpp:1086 EmuThread ⇒ DirectDraw { // ① DirectDraw 初始化 virtuanes\MainFrame.cpp:283 => if( !DirectDraw.InitialDDraw( m_hWnd ) ) { virtuanes\DirectDraw.cpp:349 => BOOL CDirectDraw::InitialDDraw( HWND hWnd ) } virtuanes\MainFrame.cpp:310 => if( !DirectDraw.InitialSurface( FALSE ) ) { virtuanes\DirectDraw.cpp:488 => BOOL CDirectDraw::InitialSurface( BOOL bScreenMode ) } // ② EmuThread ⇒ DirectDraw // ②-1 EmuThread -> BGPAL virtuanes\EmuThread.cpp:480 => g_nes->ppu->SetScreenPtr( DirectDraw.GetRenderScreen(), DirectDraw.GetLineColormode() ); virtuanes\DirectDraw.h:169 => LPBYTE GetRenderScreen() { return m_lpRender; } // m_lpRender virtuanes\EmuThread.cpp:1012 => // g_nes->ppu->SetScreenPtr( DirectDraw.GetRenderScreen(), DirectDraw.GetLineColormode() ); virtuanes\NES\PPU.h:104 => void SetScreenPtr( LPBYTE lpScn, LPBYTE lpMode ) { lpScreen = lpScn; lpColormode = lpMode; } virtuanes\EmuThread.cpp:1038 => g_nes->EmulateFrame( TRUE ); { virtuanes\NES\Nes.cpp:541 => void NES::EmulateFrame( BOOL bDraw ) virtuanes\NES\Nes.cpp:559 virtuanes\NES\Nes.cpp:680 => ppu->SetRenderScanline( scanline ); virtuanes\NES\PPU.cpp:352 => void PPU::SetRenderScanline( INT scanline ) virtuanes\NES\PPU.cpp:356 => lpScanline = lpScreen+SCREEN_WIDTH*scanline; // lpScreen = m_lpRender virtuanes\NES\Nes.cpp:564 => EmulationCPU( nescfg->ScanlineCycles );{ virtuanes\NES\Nes.cpp:476 => void NES::EmulationCPU( INT basecycles ) virtuanes\NES\Nes.cpp:522 => emul_cycles += cpu->EXEC( cycles ); virtuanes\NES\Cpu.cpp:757 => INT CPU::EXEC( INT request_cycles ) virtuanes\NES\Cpu.cpp:1237 => EA_AB(); STX(); MW_EA(); #define MW_EA() WR6502(EA,DT) virtuanes\NES\Cpu.cpp:665 => inline void CPU::WR6502( WORD addr, BYTE data ) virtuanes\NES\Cpu.cpp:672 => nes->Write( addr, data ); virtuanes\NES\Nes.cpp:916 => void NES::Write( WORD addr, BYTE data ) virtuanes\NES\Nes.cpp:924 => ppu->Write( addr&0xE007, data ); virtuanes\NES\PPU.cpp:201 => void PPU::Write( WORD addr, BYTE data ) virtuanes\NES\PPU.cpp:292 => BGPAL[vaddr&0x000F] = data; virtuanes\NES\PPU.cpp:294 => SPPAL[vaddr&0x000F] = data; } // ②-2 BGPAL -> lpScanline:lpScreen(m_lpRender) virtuanes\NES\Nes.cpp:583 => ppu->Scanline( scanline, Config.graphics.bAllSprite, Config.graphics.bLeftClip ); virtuanes\NES\PPU.cpp:392 => void PPU::Scanline( INT scanline, BOOL bMax, BOOL bLeftClip ) virtuanes\NES\PPU.cpp:413 => LPBYTE pScn = lpScanline+(8-loopy_shift); virtuanes\NES\PPU.cpp:836 => if( SPpat&0x80 ) pScn[0] = pSPPAL[(c1>>6)]; } // ②-3 m_lpRender -> m_lpDDRender2 -> m_lpDDPrimary virtuanes\EmuThread.cpp:1064 => DirectDraw.Blt(); virtuanes\DirectDraw.cpp:1368 => void CDirectDraw::Blt() virtuanes\DirectDraw.cpp:1475 => LPBYTE lpRdr = m_lpRender+8; // m_lpRender virtuanes\DirectDraw.cpp:1504 => if( m_lpDDRender2->Lock( NULL, &ddsd, 0, NULL ) == DD_OK ) {} virtuanes\Render32bpp.h:29 => if( bFWrite ) {} virtuanes\DirectDraw.cpp:1525 => m_lpDDRender->Blt( &rcW, m_lpDDRender2, &rcW, 0, NULL ); virtuanes\EmuThread.cpp:1077 => DirectDraw.Flip(); virtuanes\DirectDraw.cpp:1595 => void CDirectDraw::Flip() virtuanes\DirectDraw.cpp:1726 => m_lpDDPrimary->Blt( &rcC, m_lpDDRender, &rcS, DDBLT_WAIT, NULL ); } -------------------------------------------------- error virtuanes/directinput.cpp:273 virtuanes/directsound.cpp:494 -------------------------------------------------- modify virtuanes\MainFrame.cpp:401 => // ::_beginthread( KeyThreadProc, 0, NULL ); virtuanes\EmuThread.cpp:849 => // CMainFrame::OnKeyControl(); virtuanes\EmuThread.cpp:1053 => // CMainFrame::OnKeyControl();