10#include "PeddleDebugger.h"
13namespace vc64::peddle {
44 friend class Debugger;
55 Guard *guards =
new Guard[1];
61 virtual void setNeedsCheck(
bool value) = 0;
70 Guards(Peddle& ref) : cpu(ref) { }
78 long elements()
const {
return count; }
79 Guard *guardWithNr(
long nr)
const;
80 Guard *guardAtAddr(u32 addr)
const;
82 u32 guardAddr(
long nr)
const {
return nr < count ? guards[nr].addr : 0; }
89 bool isSet(
long nr)
const {
return guardWithNr(nr) !=
nullptr; }
90 bool isSetAt(u32 addr)
const {
return guardAtAddr(addr) !=
nullptr; }
92 void setAt(u32 addr,
long ignores = 0);
93 void moveTo(
long nr, u32 newAddr);
96 void removeAt(u32 addr);
97 void removeAll() { count = 0; setNeedsCheck(
false); }
104 bool isEnabled(
long nr)
const;
105 bool isEnabledAt(u32 addr)
const;
106 bool isDisabled(
long nr)
const;
107 bool isDisabledAt(u32 addr)
const;
109 void enable(
long nr) { setEnable(nr,
true); }
110 void enableAt(u32 addr) { setEnableAt(addr,
true); }
111 void enableAll() { setEnableAll(
true); }
113 void disable(
long nr) { setEnable(nr,
false); }
114 void disableAt(u32 addr) { setEnableAt(addr,
false); }
115 void disableAll() { setEnableAll(
false); }
117 void setEnable(
long nr,
bool val);
118 void setEnableAt(u32 addr,
bool val);
119 void setEnableAll(
bool val);
121 void ignore(
long nr,
long count);
134class Breakpoints :
public Guards {
138 Breakpoints(Peddle& ref) : Guards(ref) { }
139 void setNeedsCheck(
bool value)
override;
142class Watchpoints :
public Guards {
146 Watchpoints(Peddle& ref) : Guards(ref) { }
147 void setNeedsCheck(
bool value)
override;
160 RecordedInstruction logBuffer[LOG_BUFFER_CAPACITY];
163 Breakpoints breakpoints = Breakpoints(cpu);
166 Watchpoints watchpoints = Watchpoints(cpu);
169 i32 breakpointPC = -1;
170 i32 watchpointPC = -1;
189 u64 softStop = UINT64_MAX - 1;
198 Debugger(Peddle& ref) : cpu(ref) { };
209 void setSoftStop(u64 addr);
210 void setSoftStopAtNextInstr();
213 bool breakpointMatches(u32 addr);
216 bool watchpointMatches(u32 addr);
224 void dumpLogBuffer(std::ostream& os, isize count);
225 void dumpLogBuffer(std::ostream& os);
228 void enableLogging();
229 void disableLogging();
232 isize loggedInstructions()
const;
235 void logInstruction();
242 const RecordedInstruction &logEntryRel(isize n)
const;
243 const RecordedInstruction &logEntryAbs(isize n)
const;
244 u16 loggedPC0Rel(isize n)
const;
245 u16 loggedPC0Abs(isize n)
const;
248 isize disassRecorded(
char *dst,
const char *fmt, isize addr)
const;
251 isize disassembleRecordedInstr(isize i,
char *str)
const;
252 isize disassembleRecordedBytes(isize i,
char *str)
const;
253 void disassembleRecordedFlags(isize i,
char *str)
const;
254 void disassembleRecordedPC(isize i,
char *str)
const;
257 void clearLog() { logCnt = 0; }