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