Mesen-X/Core/Console.cpp

104 lines
2.2 KiB
C++
Raw Normal View History

2014-06-14 11:27:55 -04:00
#include "stdafx.h"
#include "Console.h"
2014-06-14 18:20:56 -04:00
#include "Timer.h"
2014-06-14 11:27:55 -04:00
2014-06-14 18:20:56 -04:00
Console::Console(string filename)
2014-06-14 11:27:55 -04:00
{
_mapper = MapperFactory::InitializeFromFile(filename);
_memoryManager.RegisterIODevice(_mapper.get());
_memoryManager.RegisterIODevice(&_ppu);
_cpu.reset(new CPU(&_memoryManager));
}
Console::~Console()
{
2014-06-15 09:35:17 -04:00
_cpu.release();
2014-06-14 11:27:55 -04:00
}
void Console::Reset()
{
_cpu->Reset();
}
void Console::Run()
{
2014-06-14 18:20:56 -04:00
while(true) {
_cpu->Exec();
_ppu.Exec();
}
2014-06-14 11:27:55 -04:00
}
2014-06-14 18:20:56 -04:00
void Console::RunTest(bool callback(Console*))
2014-06-14 11:27:55 -04:00
{
2014-06-14 18:20:56 -04:00
while(true) {
_cpu->Exec();
_ppu.Exec();
if(callback(this)) {
break;
}
}
}
void Console::RunTests()
{
/*Console *console = new Console("mario.nes");
console->Run();
delete console;*/
vector<std::string> testROMs = { {
"01-basics",
"02-implied",
//"03-immediate",
//"04-zero_page",
//"05-zp_xy",
//"06-absolute",
//"07-abs_xy",
"08-ind_x",
"09-ind_y",
"10-branches",
"11-stack",
"12-jmp_jsr",
"13-rts",
"14-rti",
//"15-brk",
"16-special"
} };
2014-06-14 18:20:56 -04:00
for(string testROM : testROMs) {
Console *console = new Console(string("TestSuite/") + testROM + ".nes");
if(testROM == "nestest") {
console->RunTest([] (Console *console) {
auto state = console->_cpu->GetState();
std::stringstream ss;
ss << std::hex << (short)state.PC << " A:" << (short)state.A << " X:" << (short)state.X << " Y:" << (short)state.Y << std::endl;
OutputDebugStringA(ss.str().c_str());
return false;
});
} else {
console->RunTest([] (Console *console) {
//static std::ofstream output("test.log", ios::out | ios::binary);
2014-06-14 18:20:56 -04:00
static bool testStarted = false;
uint8_t testStatus = console->_memoryManager.Read(0x6000);
State state = console->_cpu->GetState();
//output << std::hex << (short)state.PC << " A:" << (short)state.A << " X:" << (short)state.X << " Y:" << (short)state.Y << std::endl;
2014-06-14 18:20:56 -04:00
if(testStatus == 0x81) {
//need reset
std::cout << "reset needed";
2014-06-14 18:20:56 -04:00
} else if(testStatus == 0x80) {
testStarted = true;
} else if(testStatus < 0x80 && testStarted) {
char *result = console->_memoryManager.GetTestResult();
std::cout << result;
2014-06-14 18:20:56 -04:00
delete[] result;
testStarted = false;
return true;
}
return false;
});
}
delete console;
}
2014-06-14 11:27:55 -04:00
}