1 #include "tracer.moc"
2 Tracer *tracer;
3
stepCpu()4 void Tracer::stepCpu() {
5 if(traceCpu) {
6 unsigned addr = SNES::cpu.regs.pc;
7 if(!traceMask || !(traceMaskCPU[addr >> 3] & (0x80 >> (addr & 7)))) {
8 char text[256];
9 SNES::cpu.disassemble_opcode(text, addr);
10 tracefile.print(string() << text << "\n");
11 }
12 traceMaskCPU[addr >> 3] |= 0x80 >> (addr & 7);
13 }
14 }
15
stepSmp()16 void Tracer::stepSmp() {
17 if(traceSmp) {
18 unsigned addr = SNES::smp.regs.pc;
19 if(!traceMask || !(traceMaskSMP[addr >> 3] & (0x80 >> (addr & 7)))) {
20 char text[256];
21 SNES::smp.disassemble_opcode(text, addr);
22 tracefile.print(string() << text << "\n");
23 }
24 traceMaskSMP[addr >> 3] |= 0x80 >> (addr & 7);
25 }
26 }
27
setCpuTraceState(int state)28 void Tracer::setCpuTraceState(int state) {
29 traceCpu = (state == Qt::Checked);
30
31 if(traceCpu && !tracefile.open()) {
32 tracefile.open(string() << config().path.data << "trace.log", file::mode_write);
33 } else if(!traceCpu && !traceSmp && tracefile.open()) {
34 tracefile.close();
35 }
36 }
37
setSmpTraceState(int state)38 void Tracer::setSmpTraceState(int state) {
39 traceSmp = (state == Qt::Checked);
40
41 if(traceSmp && !tracefile.open()) {
42 tracefile.open(string() << config().path.data << "trace.log", file::mode_write);
43 } else if(!traceCpu && !traceSmp && tracefile.open()) {
44 tracefile.close();
45 }
46 }
47
setTraceMaskState(int state)48 void Tracer::setTraceMaskState(int state) {
49 traceMask = (state == Qt::Checked);
50
51 if(traceMask) {
52 //flush all bitmasks once enabled
53 memset(traceMaskCPU, 0x00, (1 << 24) >> 3);
54 memset(traceMaskSMP, 0x00, (1 << 16) >> 3);
55 }
56 }
57
Tracer()58 Tracer::Tracer() {
59 traceCpu = false;
60 traceSmp = false;
61 traceMask = false;
62
63 traceMaskCPU = new uint8[(1 << 24) >> 3]();
64 traceMaskSMP = new uint8[(1 << 16) >> 3]();
65
66 SNES::cpu.step_event = bind(&Tracer::stepCpu, this);
67 SNES::smp.step_event = bind(&Tracer::stepSmp, this);
68 }
69
~Tracer()70 Tracer::~Tracer() {
71 delete[] traceMaskCPU;
72 delete[] traceMaskSMP;
73 if(tracefile.open()) tracefile.close();
74 }
75