lsnes/target-debugger/tracer/tracer.cpp
2013-05-03 17:47:44 +03:00

55 lines
1.3 KiB
C++
Executable file

#include "../base.hpp"
Tracer *tracer = nullptr;
void Tracer::resetMask() {
memset(cpuMask, 0, 0x200000);
memset(smpMask, 0, 0x2000);
}
bool Tracer::maskCPU(uint24 addr) {
if(mask == false) return false;
if(cpuMask[addr >> 3] & (1 << (addr & 7))) return true;
cpuMask[addr >> 3] |= 1 << (addr & 7);
return false;
}
bool Tracer::maskSMP(uint16 addr) {
if(mask == false) return false;
if(smpMask[addr >> 3] & (1 << (addr & 7))) return true;
smpMask[addr >> 3] |= 1 << (addr & 7);
return false;
}
bool Tracer::enabled() {
return fp.open();
}
void Tracer::enable(bool state) {
if(state == false) {
debugger->print("Tracer disabled\n");
fp.close();
return;
}
//try not to overwrite existing traces: scan from 001-999.
//if all files exist, use 000, even if it overwrites another log.
unsigned n = 1;
do {
if(file::exists({ interface->pathName, "debug/trace-", decimal<3, '0'>(n), ".log" }) == false) break;
} while(++n <= 999);
string filename = { interface->pathName, "debug/trace-", decimal<3, '0'>(n), ".log" };
if(fp.open(filename, file::mode::write) == false) return;
debugger->print("Tracing to ", filename, "\n");
}
Tracer::Tracer() {
mask = false;
cpuMask = new uint8_t[0x200000]();
smpMask = new uint8_t[0x2000]();
}
Tracer::~Tracer() {
delete[] cpuMask;
delete[] smpMask;
}