Files
2018-03-07 12:58:02 +01:00

184 lines
4.0 KiB
C++

/*
* Gearboy - Nintendo Game Boy Emulator
* Copyright (C) 2012 Ignacio Sanchez
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program. If not, see http://www.gnu.org/licenses/
*
*/
#include <QStandardPaths>
#include "Emulator.h"
Emulator::Emulator()
{
InitPointer(m_pGearboyCore);
InitPointer(m_pSoundQueue);
m_bAudioEnabled = true;
m_bSaveInROMFolder = false;
}
Emulator::~Emulator()
{
SaveRam();
SafeDelete(m_pSoundQueue);
SafeDelete(m_pGearboyCore);
}
void Emulator::Init()
{
m_pGearboyCore = new GearboyCore();
m_pGearboyCore->Init();
m_pSoundQueue = new Sound_Queue();
m_pSoundQueue->start(44100, 2);
}
void Emulator::LoadRom(const char* szFilePath, bool forceDMG, bool saveInROMFolder)
{
m_Mutex.lock();
m_bSaveInROMFolder = saveInROMFolder;
SaveRam();
m_pGearboyCore->LoadROM(szFilePath, forceDMG);
LoadRam();
m_Mutex.unlock();
}
void Emulator::RunToVBlank(GB_Color* pFrameBuffer)
{
m_Mutex.lock();
s16 sampleBufer[AUDIO_BUFFER_SIZE];
int sampleCount = 0;
m_pGearboyCore->RunToVBlank(pFrameBuffer, sampleBufer, &sampleCount);
if (m_bAudioEnabled && (sampleCount > 0))
{
m_pSoundQueue->write(sampleBufer, sampleCount);
}
m_Mutex.unlock();
}
void Emulator::KeyPressed(Gameboy_Keys key)
{
m_Mutex.lock();
m_pGearboyCore->KeyPressed(key);
m_Mutex.unlock();
}
void Emulator::KeyReleased(Gameboy_Keys key)
{
m_Mutex.lock();
m_pGearboyCore->KeyReleased(key);
m_Mutex.unlock();
}
void Emulator::Pause()
{
m_Mutex.lock();
m_pGearboyCore->Pause(true);
m_bAudioEnabled = false;
m_Mutex.unlock();
}
void Emulator::Resume()
{
m_Mutex.lock();
m_pGearboyCore->Pause(false);
m_bAudioEnabled = true;
m_Mutex.unlock();
}
bool Emulator::IsPaused()
{
m_Mutex.lock();
bool paused = m_pGearboyCore->IsPaused();
m_Mutex.unlock();
return paused;
}
void Emulator::Reset(bool forceDMG, bool saveInROMFolder)
{
m_Mutex.lock();
m_bSaveInROMFolder = saveInROMFolder;
SaveRam();
m_pGearboyCore->ResetROM(forceDMG);
LoadRam();
m_Mutex.unlock();
}
void Emulator::MemoryDump()
{
m_Mutex.lock();
m_pGearboyCore->GetMemory()->MemoryDump("memdump.txt");
m_Mutex.unlock();
}
void Emulator::SetSoundSettings(bool enabled, int rate)
{
m_Mutex.lock();
m_bAudioEnabled = enabled;
m_pGearboyCore->SetSoundSampleRate(rate);
m_pSoundQueue->stop();
m_pSoundQueue->start(rate, 2);
m_Mutex.unlock();
}
void Emulator::SetDMGPalette(GB_Color& color1, GB_Color& color2, GB_Color& color3,
GB_Color& color4)
{
m_Mutex.lock();
m_pGearboyCore->SetDMGPalette(color1, color2, color3, color4);
m_Mutex.unlock();
}
bool Emulator::IsCGBRom()
{
m_Mutex.lock();
bool cgb = m_pGearboyCore->GetCartridge()->IsCGB();
m_Mutex.unlock();
return cgb;
}
void Emulator::SaveRam()
{
if (m_bSaveInROMFolder)
m_pGearboyCore->SaveRam();
else
m_pGearboyCore->SaveRam(QStandardPaths::writableLocation(QStandardPaths::DataLocation).toStdString().c_str());
}
void Emulator::LoadRam()
{
if (m_bSaveInROMFolder)
m_pGearboyCore->LoadRam();
else
m_pGearboyCore->LoadRam(QStandardPaths::writableLocation(QStandardPaths::DataLocation).toStdString().c_str());
}
void Emulator::SaveState(int index)
{
m_Mutex.lock();
m_pGearboyCore->SaveState(index);
m_Mutex.unlock();
}
void Emulator::LoadState(int index)
{
m_Mutex.lock();
m_pGearboyCore->LoadState(index);
m_Mutex.unlock();
}