diff --git a/stella/src/ui/cyberstella/CyberstellaView.cpp b/stella/src/ui/cyberstella/CyberstellaView.cpp index b7d416495..8bde2eef5 100644 --- a/stella/src/ui/cyberstella/CyberstellaView.cpp +++ b/stella/src/ui/cyberstella/CyberstellaView.cpp @@ -298,8 +298,6 @@ void CCyberstellaView::playRom(LONG gameID) pszFileName = fileName; } -//::MessageBox(*this, "got here", _T("Error"), MB_OK | MB_ICONEXCLAMATION ); - ::ShowWindow( *this, SW_HIDE ); // Create a new main instance for this cartridge @@ -309,6 +307,7 @@ void CCyberstellaView::playRom(LONG gameID) mainWin32->run(); ::ShowWindow( *this, SW_SHOW ); + ShowCursor(TRUE); delete pImage; delete mainWin32; diff --git a/stella/src/ui/cyberstella/FrameBufferWin32.cxx b/stella/src/ui/cyberstella/FrameBufferWin32.cxx index 400fb2c5f..5b3ed5d2d 100644 --- a/stella/src/ui/cyberstella/FrameBufferWin32.cxx +++ b/stella/src/ui/cyberstella/FrameBufferWin32.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: FrameBufferWin32.cxx,v 1.4 2003-11-16 19:32:52 stephena Exp $ +// $Id: FrameBufferWin32.cxx,v 1.5 2003-11-19 21:06:27 stephena Exp $ //============================================================================ #include @@ -103,8 +103,8 @@ bool FrameBufferWin32::init() HRESULT hrCoInit = ::CoInitialize( NULL ); // Get the game's width and height - mySizeGame.cx = myMediaSource->width() << 1; - mySizeGame.cy = myMediaSource->height(); + mySizeGame.cx = myWidth = myMediaSource->width() << 1; + mySizeGame.cy = myHeight = myMediaSource->height(); // Initialize the pixel data table for(uInt32 i = 0; i < 256; ++i) @@ -347,7 +347,6 @@ void FrameBufferWin32::drawMediaSource() // BUGBUG: Check for error BYTE* pbBackBytes = (BYTE*)ddsd.lpSurface; - register int y; for(y = 0; y < mySizeGame.cy; ++y) { @@ -359,7 +358,7 @@ void FrameBufferWin32::drawMediaSource() { const WORD bufofs = bufofsY + x; BYTE v = current[ bufofs ]; - if(v == previous[ bufofs ]) + if(v == previous[ bufofs ] && !theRedrawEntireFrameIndicator) continue; // x << 1 is times 2 ( doubling width ) WIDTH_FACTOR @@ -367,19 +366,23 @@ void FrameBufferWin32::drawMediaSource() pbBackBytes[ pos + 0 ] = pbBackBytes[ pos + 1 ] = myPalette[v]; } } - (void)m_piDDSBack->Unlock( ddsd.lpSurface ); + + // The frame doesn't need to be completely redrawn anymore + theRedrawEntireFrameIndicator = false; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void FrameBufferWin32::preFrameUpdate() { + // FIXME - move locking here so its only done once per frame } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void FrameBufferWin32::postFrameUpdate() { // We only send any changes to the screen once per frame + // FIXME - move unlocking here so its only done once per frame // Blit offscreen to onscreen RECT rc = { 0, 0, mySizeGame.cx, mySizeGame.cy }; @@ -404,16 +407,114 @@ void FrameBufferWin32::toggleFullscreen() // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void FrameBufferWin32::drawBoundedBox(uInt32 x, uInt32 y, uInt32 w, uInt32 h) { + // acquire pointer to linear video ram + DDSURFACEDESC ddsd; + ZeroMemory( &ddsd, sizeof(ddsd) ); + ddsd.dwSize = sizeof(ddsd); + + HRESULT hr = m_piDDSBack->Lock( NULL, + &ddsd, + /* DDLOCK_SURFACEMEMORYPTR | */ DDLOCK_WAIT, + NULL ); + // BUGBUG: Check for error + + BYTE* pbBackBytes = (BYTE*)ddsd.lpSurface; + + // First draw the background + for(uInt32 row = 0; row < h; row++) + { + for(uInt32 col = 0; col < w; col++) + { + BYTE* ptr = pbBackBytes + ((row + y) * ddsd.lPitch) + col + x; + *ptr = myPalette[myBGColor]; + } + } + + // Now draw the surrounding lines + for(uInt32 col = 0; col < w+1; col++) // Top line + { + BYTE* ptr = pbBackBytes + y * ddsd.lPitch + col + x; + *ptr = myPalette[myFGColor]; + } + + for(uInt32 col = 0; col < w+1; col++) // Bottom line + { + BYTE* ptr = pbBackBytes + (y+h) * ddsd.lPitch + col + x; + *ptr = myPalette[myFGColor]; + } + + for(uInt32 row = 0; row < h; row++) // Left line + { + BYTE* ptr = pbBackBytes + (row + y) * ddsd.lPitch + x; + *ptr = myPalette[myFGColor]; + } + + for(uInt32 row = 0; row < h; row++) // Right line + { + BYTE* ptr = pbBackBytes + (row + y) * ddsd.lPitch + x + w; + *ptr = myPalette[myFGColor]; + } + + (void)m_piDDSBack->Unlock( ddsd.lpSurface ); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void FrameBufferWin32::drawText(uInt32 xorig, uInt32 yorig, const string& message) { + // acquire pointer to linear video ram + DDSURFACEDESC ddsd; + ZeroMemory( &ddsd, sizeof(ddsd) ); + ddsd.dwSize = sizeof(ddsd); + + HRESULT hr = m_piDDSBack->Lock( NULL, + &ddsd, + /* DDLOCK_SURFACEMEMORYPTR | */ DDLOCK_WAIT, + NULL ); + + BYTE* pbBackBytes = (BYTE*)ddsd.lpSurface; + uInt8 length = message.length(); + for(uInt32 x = 0; x < length; x++) + { + for(uInt32 y = 0; y < 8; y++) + { + for(uInt32 z = 0; z < 8; z++) + { + char letter = message[x]; + if((ourFontData[(letter << 3) + y] >> z) & 1) + pbBackBytes[((x<<3) + z + xorig) + (y + yorig) * ddsd.lPitch] = + myPalette[myFGColor]; + } + } + } + + (void)m_piDDSBack->Unlock( ddsd.lpSurface ); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void FrameBufferWin32::drawChar(uInt32 xorig, uInt32 yorig, uInt32 c) { + // acquire pointer to linear video ram + DDSURFACEDESC ddsd; + ZeroMemory( &ddsd, sizeof(ddsd) ); + ddsd.dwSize = sizeof(ddsd); + + HRESULT hr = m_piDDSBack->Lock( NULL, + &ddsd, + /* DDLOCK_SURFACEMEMORYPTR | */ DDLOCK_WAIT, + NULL ); + + BYTE* pbBackBytes = (BYTE*)ddsd.lpSurface; + for(uInt32 y = 0; y < 8; y++) + { + for(uInt32 x = 0; x < 8; x++) + { + if((ourFontData[(c << 3) + y] >> x) & 1) + pbBackBytes[x + xorig + (y + yorig) * ddsd.lPitch] = + myPalette[myFGColor]; + } + } + + (void)m_piDDSBack->Unlock( ddsd.lpSurface ); } LRESULT CALLBACK FrameBufferWin32::StaticWindowProc( @@ -472,23 +573,6 @@ BOOL FrameBufferWin32::WndProc(UINT uMsg, WPARAM wParam, LPARAM lParam) ::PostQuitMessage(0); break; - case WM_KEYDOWN: - switch((int)wParam) - { - case VK_ESCAPE: - ::PostMessage(myHWND, WM_CLOSE, 0, 0); - - // For some braindead reason, the exit event must be handled - // here. Normally, an Escape event would be the same as any - // other and the Console would handle it. - // But since Windows insists on doing it this way, we have - // to make sure that the Escape event is still received by - // the core. - myConsole->eventHandler().sendEvent(Event::Quit, 1); - break; - } - break; - case WM_PAINT: PAINTSTRUCT ps; ::BeginPaint( myHWND, &ps ); diff --git a/stella/src/ui/cyberstella/MainWin32.cxx b/stella/src/ui/cyberstella/MainWin32.cxx index cf5302ba5..f175d1166 100644 --- a/stella/src/ui/cyberstella/MainWin32.cxx +++ b/stella/src/ui/cyberstella/MainWin32.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: MainWin32.cxx,v 1.3 2003-11-16 19:32:52 stephena Exp $ +// $Id: MainWin32.cxx,v 1.4 2003-11-19 21:06:27 stephena Exp $ //============================================================================ #define STRICT @@ -92,14 +92,15 @@ MainWin32::MainWin32(const uInt8* image, uInt32 size, const char* filename, // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MainWin32::~MainWin32() { + // Save the settings for this instance of the console + theConsole->settings().saveConfig(); + cleanup(); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void MainWin32::cleanup() { - ShowCursor(TRUE); - if(theDisplay) delete theDisplay; @@ -132,7 +133,7 @@ DWORD MainWin32::run() QueryPerformanceFrequency( (LARGE_INTEGER*)&uiCountsPerSecond ); const unsigned __int64 uiCountsPerFrame = - ( uiCountsPerSecond / 60);// FIXME m_rGlobalData->desiredFrameRate); + ( uiCountsPerSecond / theSettings.getInt("framerate")); unsigned __int64 uiFrameStart; unsigned __int64 uiFrameCurrent; @@ -158,8 +159,7 @@ DWORD MainWin32::run() ::QueryPerformanceCounter( (LARGE_INTEGER*)&uiFrameStart ); UpdateEvents(); - theDisplay->update(); - theSound->updateSound(*theDisplay->mediaSource()); + theConsole->update(); // waste time to to meet desired frame rate for(;;) @@ -167,38 +167,25 @@ DWORD MainWin32::run() QueryPerformanceCounter( (LARGE_INTEGER*)&uiFrameCurrent ); if((uiFrameCurrent - uiFrameStart) >= uiCountsPerFrame) break; -//FIXME else -// WaitMessage(); } } } // Main message loop done -/* - if ( m_rGlobalData->bShowFPS) - { - // get number of scanlines in last frame + if(0)// m_rGlobalData->bShowFPS) + { + // Get the final tick count + unsigned __int64 uiEndRun; + QueryPerformanceCounter( (LARGE_INTEGER*)&uiEndRun ); - uInt32 uScanLines = rMediaSource.scanlines(); + // Get number of ticks + DWORD secs = (DWORD)((uiEndRun - uiStartRun) / uiCountsPerSecond); + DWORD fps = (secs == 0) ? 0 : (uFrameCount / secs); - // Get the final tick count - - unsigned __int64 uiEndRun; - ::QueryPerformanceCounter( (LARGE_INTEGER*)&uiEndRun ); - - // Get number of ticks - - DWORD secs = (DWORD)( ( uiEndRun - uiStartRun ) / uiCountsPerSecond ); - - DWORD fps = (secs == 0) ? 0 : (uFrameCount / secs); - - TCHAR pszBuf[1024]; - wsprintf( pszBuf, _T("Frames drawn: %ld\nFPS: %ld\nScanlines in last frame: %ld\n"), - uFrameCount, - fps, - uScanLines ); - MessageBox( NULL, pszBuf, _T("Statistics"), MB_OK ); - }*/ + TCHAR pszBuf[1024]; + wsprintf(pszBuf, _T("Frames drawn: %ld\nFPS: %ld\n"), uFrameCount, fps); + MessageBox(NULL, pszBuf, _T("Statistics"), MB_OK); + } return msg.wParam; } diff --git a/stella/src/ui/cyberstella/MainWin32.hxx b/stella/src/ui/cyberstella/MainWin32.hxx index 8b106a3cb..bed124e98 100644 --- a/stella/src/ui/cyberstella/MainWin32.hxx +++ b/stella/src/ui/cyberstella/MainWin32.hxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: MainWin32.hxx,v 1.3 2003-11-16 19:32:52 stephena Exp $ +// $Id: MainWin32.hxx,v 1.4 2003-11-19 21:06:27 stephena Exp $ //============================================================================ #ifndef MAIN_WIN32_HXX @@ -41,7 +41,7 @@ class DirectInput; in the Porting.txt document @author Stephen Anthony - @version $Id: MainWin32.hxx,v 1.3 2003-11-16 19:32:52 stephena Exp $ + @version $Id: MainWin32.hxx,v 1.4 2003-11-19 21:06:27 stephena Exp $ */ class MainWin32 { @@ -100,8 +100,6 @@ class MainWin32 static StellaEvent::JoyStick joyList[StellaEvent::LastJSTICK]; static StellaEvent::JoyCode joyButtonList[StellaEvent::LastJCODE-4]; - const CGlobalData* m_rGlobalData; - // Indicates the current mouse position in the X direction Int32 theMouseX; diff --git a/stella/src/ui/cyberstella/SettingsWin32.cxx b/stella/src/ui/cyberstella/SettingsWin32.cxx index 8dd34f32f..d2f18847e 100644 --- a/stella/src/ui/cyberstella/SettingsWin32.cxx +++ b/stella/src/ui/cyberstella/SettingsWin32.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: SettingsWin32.cxx,v 1.2 2003-09-23 19:41:16 stephena Exp $ +// $Id: SettingsWin32.cxx,v 1.3 2003-11-19 21:06:27 stephena Exp $ //============================================================================ #include "bspf.hxx" @@ -29,23 +29,18 @@ SettingsWin32::SettingsWin32() // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SettingsWin32::~SettingsWin32() { - cerr << "SettingsWin32::~SettingsWin32()\n"; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - string SettingsWin32::stateFilename(uInt32 state) { - cerr << "SettingsWin32::stateFilename()\n"; - - return ""; + return ""; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - string SettingsWin32::snapshotFilename() { - cerr << "SettingsWin32::snapshotFilename()\n"; - - return ""; + return ""; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/stella/src/ui/cyberstella/SettingsWin32.hxx b/stella/src/ui/cyberstella/SettingsWin32.hxx index 56aeb83f3..ec2741100 100644 --- a/stella/src/ui/cyberstella/SettingsWin32.hxx +++ b/stella/src/ui/cyberstella/SettingsWin32.hxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: SettingsWin32.hxx,v 1.2 2003-09-23 19:41:16 stephena Exp $ +// $Id: SettingsWin32.hxx,v 1.3 2003-11-19 21:06:27 stephena Exp $ //============================================================================ #ifndef SETTINGS_WIN32_HXX @@ -31,7 +31,7 @@ class SettingsWin32 : public Settings public: virtual string stateFilename(uInt32 state); virtual string snapshotFilename(); - virtual void usage(string& message); + virtual void usage(string& message); }; #endif diff --git a/stella/src/ui/cyberstella/SoundWin32.cxx b/stella/src/ui/cyberstella/SoundWin32.cxx index 3da7a0b56..a6226fd32 100644 --- a/stella/src/ui/cyberstella/SoundWin32.cxx +++ b/stella/src/ui/cyberstella/SoundWin32.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: SoundWin32.cxx,v 1.2 2003-09-21 14:33:34 stephena Exp $ +// $Id: SoundWin32.cxx,v 1.3 2003-11-19 21:06:27 stephena Exp $ //============================================================================ #include @@ -102,12 +102,12 @@ bool SoundWin32::isSuccessfullyInitialized() const } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void SoundWin32::setSoundVolume(Int32 percent) +void SoundWin32::setVolume(Int32 percent) { } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void SoundWin32::updateSound(MediaSource& mediaSource) +void SoundWin32::update() { if(myIsInitializedFlag) { @@ -116,9 +116,9 @@ void SoundWin32::updateSound(MediaSource& mediaSource) uInt8* buffer = new uInt8[myBufferSize]; // Dequeue samples as long as full fragments are available - while(mediaSource.numberOfAudioSamples() >= myBufferSize) + while(myMediaSource->numberOfAudioSamples() >= myBufferSize) { - mediaSource.dequeueAudioSamples(buffer, myBufferSize); + myMediaSource->dequeueAudioSamples(buffer, myBufferSize); LPVOID lpvWrite; DWORD dwLength; diff --git a/stella/src/ui/cyberstella/SoundWin32.hxx b/stella/src/ui/cyberstella/SoundWin32.hxx index 7cb85f030..681d23b30 100644 --- a/stella/src/ui/cyberstella/SoundWin32.hxx +++ b/stella/src/ui/cyberstella/SoundWin32.hxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: SoundWin32.hxx,v 1.2 2003-09-21 14:33:34 stephena Exp $ +// $Id: SoundWin32.hxx,v 1.3 2003-11-19 21:06:27 stephena Exp $ //============================================================================ #ifndef SOUND_WIN32_HXX @@ -30,7 +30,7 @@ Win32 DirectSound API. @author Stephen Anthony - @version $Id: SoundWin32.hxx,v 1.2 2003-09-21 14:33:34 stephena Exp $ + @version $Id: SoundWin32.hxx,v 1.3 2003-11-19 21:06:27 stephena Exp $ */ class SoundWin32 : public Sound { @@ -72,15 +72,13 @@ class SoundWin32 : public Sound @param percent The new volume percentage level for the sound device */ - void setSoundVolume(Int32 percent); + void setVolume(Int32 percent); /** - Update the sound device using the audio sample from the specified + Update the sound device using the audio sample from the media source. - - @param mediaSource The media source to get audio samples from. */ - void updateSound(MediaSource& mediaSource); + void update(); /** Initialize the DirectSound subsystem/ @@ -114,4 +112,5 @@ class SoundWin32 : public Sound // DSP sample rate uInt32 mySampleRate; }; + #endif