Replace logger with basic disassembly in APU debugger (& fixing Absolute By X Address operand?)

This commit is contained in:
Melefo
2021-04-01 14:20:02 +02:00
parent 044aae174d
commit 06cdafbf16
7 changed files with 543 additions and 308 deletions
+302 -6
View File
@@ -11,8 +11,301 @@
namespace ComSquare::Debugger
{
class APUDebug : public APU::APU, public QObject {
//! @brief List of all types of operands used by the instructions
enum Operand
{
None,
A,
X,
Y,
SP,
PSW,
ImmediateData,
IndexXAddr,
IndexYAddr,
AbsoluteBit,
AbsoluteAddr,
AbsoluteAddrByX,
AbsoluteAddrByY,
AbsoluteByXAddr,
AbsoluteDirectByXAddr,
AbsoluteDirectAddrByY,
DirectAddr,
DirectAddrByX,
DirectAddrByY
};
//! @brief Small structure to store some values on the instructions
struct Instruction
{
std::string name;
int size;
std::tuple<Operand, Operand> operands;
};
class APUDebug : public APU::APU, public QObject
{
private:
//! @brief List of instructions and their information
std::array<Instruction, 0x100> _instructions {{
{"NOP", 1, {None, None}},
{"TCALL", 1, {None, None}},
{"SET1", 2, {DirectAddr, None}},
{"BBS", 3, {DirectAddr, ImmediateData}},
{"OR", 2, {DirectAddr, None}},
{"OR", 3, {AbsoluteAddr, None}},
{"OR", 1, {IndexXAddr, None}},
{"OR", 2, {AbsoluteDirectByXAddr, None}},
{"OR", 2, {ImmediateData, None}},
{"OR", 3, {DirectAddr, DirectAddr}},
{"OR1", 3, {AbsoluteBit, None}},
{"ASL", 2, {DirectAddr, None}},
{"ASL", 3, {AbsoluteAddr, None}},
{"PUSH", 1, {PSW, None}},
{"TSET1", 3, {AbsoluteAddr, None}},
{"BRK", 1, {None, None}},
{"BPL", 2, {ImmediateData, None}},
{"TCALL", 1, {None, None}},
{"CLR1", 2, {DirectAddr, None}},
{"BBC", 3, {DirectAddr, ImmediateData}},
{"OR", 2, {DirectAddrByX, None}},
{"OR", 3, {AbsoluteAddrByX, None}},
{"OR", 3, {AbsoluteAddrByY, None}},
{"OR", 2, {AbsoluteDirectAddrByY, None}},
{"OR", 3, {DirectAddr, ImmediateData}},
{"OR", 1, {IndexYAddr, IndexYAddr}},
{"DECW", 2, {DirectAddr, None}},
{"ASL", 2, {DirectAddrByX, None}},
{"ASL", 1, {A, None}},
{"DEC", 1, {X, None}},
{"CMP", 3, {X, AbsoluteAddr}},
{"JMP", 3, {AbsoluteByXAddr, None}},
{"CLRP", 1, {None, None}},
{"TCALL", 1, {None, None}},
{"SET1", 2, {DirectAddr, None}},
{"BBS", 3, {DirectAddr, ImmediateData}},
{"AND", 2, {DirectAddr, None}},
{"AND", 3, {AbsoluteAddr, None}},
{"AND", 1, {IndexXAddr, None}},
{"AND", 2, {AbsoluteDirectByXAddr, None}},
{"AND", 2, {ImmediateData, None}},
{"AND", 3, {DirectAddr, DirectAddr}},
{"OR1", 3, {AbsoluteBit, None}},
{"ROL", 2, {DirectAddr, None}},
{"ROL", 3, {AbsoluteAddr, None}},
{"PUSH", 1, {A, None}},
{"CBNE", 3, {ImmediateData, ImmediateData}},
{"BRA", 2, {ImmediateData, None}},
{"BMI", 2, {ImmediateData, None}},
{"TCALL", 1, {None, None}},
{"CLR1", 2, {DirectAddr, None}},
{"BBC", 3, {DirectAddr, ImmediateData}},
{"AND", 2, {DirectAddrByX, None}},
{"AND", 3, {AbsoluteAddrByX, None}},
{"AND", 3, {AbsoluteAddrByY, None}},
{"AND", 2, {AbsoluteDirectAddrByY, None}},
{"AND", 3, {DirectAddr, ImmediateData}},
{"AND", 1, {IndexXAddr, IndexYAddr}},
{"INCW", 2, {DirectAddr, None}},
{"ROL", 2, {AbsoluteAddrByX, None}},
{"ROL", 1, {A, None}},
{"INC", 1, {X, None}},
{"CMP", 2, {X, DirectAddr}},
{"CALL", 3, {AbsoluteAddr, None}},
{"SETP", 1, {None, None}},
{"TCALL", 1, {None, None}},
{"SET1", 2, {DirectAddr, None}},
{"BBS", 3, {DirectAddr, ImmediateData}},
{"EOR", 2, {DirectAddr, None}},
{"EOR", 3, {AbsoluteAddr, None}},
{"EOR", 1, {IndexXAddr, None}},
{"EOR", 2, {AbsoluteDirectByXAddr, None}},
{"EOR", 2, {ImmediateData, None}},
{"EOR", 3, {DirectAddr, DirectAddr}},
{"AND1", 3, {AbsoluteBit, None}},
{"LSR", 2, {DirectAddr, None}},
{"LSR", 3, {AbsoluteAddr, None}},
{"PUSH", 1, {X, None}},
{"TCLR1", 3, {AbsoluteAddr, None}},
{"PCALL", 3, {None, None}},
{"BVC", 2, {ImmediateData, None}},
{"TCALL", 1, {None, None}},
{"CLR1", 2, {DirectAddr, None}},
{"BBC", 3, {DirectAddr, ImmediateData}},
{"EOR", 2, {DirectAddrByX, None}},
{"EOR", 3, {AbsoluteAddrByX, None}},
{"EOR", 3, {AbsoluteAddrByY, None}},
{"EOR", 2, {AbsoluteDirectAddrByY, None}},
{"EOR", 3, {DirectAddr, ImmediateData}},
{"EOR", 1, {IndexXAddr, IndexYAddr}},
{"CMPW", 2, {DirectAddr, None}},
{"LSR", 2, {DirectAddrByX, None}},
{"LSR", 1, {A, None}},
{"MOV", 1, {A, X}},
{"CMP", 3, {Y, AbsoluteAddr}},
{"JMP", 3, {AbsoluteAddr, None}},
{"CLRC", 1, {None, None}},
{"TCALL", 1, {None, None}},
{"SET1", 2, {DirectAddr, None}},
{"BBS", 3, {DirectAddr, ImmediateData}},
{"CMP", 2, {A, DirectAddr}},
{"CMP", 3, {A, AbsoluteAddr}},
{"CMP", 1, {A, IndexXAddr,}},
{"CMP", 2, {A, AbsoluteDirectByXAddr}},
{"CMP", 2, {A, ImmediateData}},
{"CMP", 3, {DirectAddr, DirectAddr}},
{"AND1", 3, {AbsoluteBit, None}},
{"ROR", 2, {DirectAddr , None}},
{"ROR", 3, {AbsoluteAddr, None}},
{"PUSH", 1, {Y, None}},
{"DBNZ", 3, {ImmediateData, None}},
{"RET", 1, {None, None}},
{"BVS", 2, {ImmediateData, None}},
{"TCALL", 1, {None, None}},
{"CLR1", 2, {DirectAddr, None}},
{"BBC", 3, {DirectAddr, ImmediateData}},
{"CMP", 2, {A, DirectAddrByX}},
{"CMP", 3, {A, AbsoluteAddrByX}},
{"CMP", 3, {A, AbsoluteAddrByY}},
{"CMP", 2, {A, AbsoluteDirectAddrByY}},
{"CMP", 3, {DirectAddr, ImmediateData}},
{"CMP", 1, {IndexXAddr, IndexYAddr}},
{"ADDW", 2, {DirectAddr, None}},
{"ROR", 2, {DirectAddrByX, None}},
{"ROR", 1, {A, None}},
{"MOV", 1, {X, A}},
{"CMP", 3, {Y, DirectAddr}},
{"RETI", 1, {None, None}},
{"SETC", 1, {None, None}},
{"TCALL", 1, {None, None}},
{"SET1", 2, {DirectAddr, None}},
{"BBS", 3, {DirectAddr, ImmediateData}},
{"ADC", 2, {DirectAddr, None}},
{"ADC", 3, {AbsoluteAddr, None}},
{"ADC", 1, {IndexXAddr, None}},
{"ADC", 2, {AbsoluteDirectByXAddr, None}},
{"ADC", 2, {ImmediateData, None}},
{"ADC", 3, {DirectAddr, DirectAddr}},
{"EOR1", 3, {AbsoluteBit, None}},
{"DEC", 2, {DirectAddr, None}},
{"DEC", 3, {AbsoluteAddr, None}},
{"MOV", 2, {ImmediateData, Y}},
{"POP", 1, {PSW, None}},
{"MOV", 3, {DirectAddr, ImmediateData}},
{"BCC", 2, {ImmediateData, None}},
{"TCALL", 1, {None, None}},
{"CLR1", 2, {DirectAddr, None}},
{"BBC", 3, {DirectAddr, ImmediateData}},
{"ADC", 2, {DirectAddrByX, None}},
{"ADC", 3, {AbsoluteAddrByX, None}},
{"ADC", 3, {AbsoluteAddrByY, None}},
{"ADC", 2, {AbsoluteDirectAddrByY, None}},
{"ADC", 3, {DirectAddr, ImmediateData}},
{"ADC", 1, {IndexXAddr, IndexYAddr}},
{"SUBW", 2, {DirectAddr, None}},
{"DEC", 2, {DirectAddrByX, None}},
{"DEC", 1, {A, None}},
{"MOV", 1, {SP, X}},
{"DIV", 1, {None, None}},
{"XCN", 1, {None, None}},
{"EI", 1, {None, None}},
{"TCALL", 1, {None, None}},
{"SET1", 2, {DirectAddr, None}},
{"BBS", 3, {DirectAddr, ImmediateData}},
{"SBC", 2, {DirectAddr, None}},
{"SBC", 3, {AbsoluteAddr, None}},
{"SBC", 1, {IndexXAddr, None}},
{"SBC", 2, {AbsoluteDirectByXAddr, None}},
{"SBC", 2, {ImmediateData, None}},
{"SBC", 3, {DirectAddr, DirectAddr}},
{"MOV1", 3, {AbsoluteBit, None}},
{"INC", 2, {DirectAddr, None}},
{"INC", 3, {AbsoluteAddr, None}},
{"CMP", 2, {Y, ImmediateData}},
{"POP", 1, {A, None}},
{"MOV", 1, {A, IndexXAddr}},
{"BCS", 2, {ImmediateData, None}},
{"TCALL", 1, {None, None}},
{"CLR1", 2, {DirectAddr, None}},
{"BBC", 3, {DirectAddr, ImmediateData}},
{"SBC", 2, {DirectAddrByX, None}},
{"SBC", 3, {AbsoluteAddrByX, None}},
{"SBC", 3, {AbsoluteAddrByY, None}},
{"SBC", 2, {AbsoluteDirectAddrByY, None}},
{"SBC", 2, {DirectAddr, ImmediateData}},
{"SBC", 1, {IndexXAddr, IndexYAddr}},
{"MOVW", 2, {DirectAddr, None}},
{"INC", 2, {DirectAddrByX, None}},
{"INC", 1, {A, None}},
{"MOV", 1, {X, SP}},
{"DAS", 1, {None, None}},
{"MOV", 1, {IndexXAddr, A}},
{"DI", 1, {None, None}},
{"TCALL", 1, {None, None}},
{"SET1", 2, {DirectAddr, None}},
{"BBS", 3, {DirectAddr, ImmediateData}},
{"MOV", 2, {A, DirectAddr}},
{"MOV", 3, {A, AbsoluteAddr}},
{"MOV", 1, {A, IndexXAddr}},
{"MOV", 2, {A, AbsoluteDirectByXAddr}},
{"CMP", 2, {X, ImmediateData}},
{"MOV", 3, {X, AbsoluteAddr}},
{"MOV1", 3, {AbsoluteBit, None}},
{"MOV", 2, {Y, DirectAddr}},
{"MOV", 3, {Y, AbsoluteAddr}},
{"MOV", 2, {ImmediateData, X}},
{"POP", 1, {X, None}},
{"MUL", 1, {None, None}},
{"BNE", 2, {ImmediateData, None}},
{"TCALL", 1, {None, None}},
{"CLR1", 2, {DirectAddr, None}},
{"BBC", 3, {DirectAddr, ImmediateData}},
{"MOV", 2, {A, DirectAddrByX}},
{"MOV", 3, {A, AbsoluteAddrByX}},
{"MOV", 3, {A, AbsoluteAddrByY}},
{"MOV", 2, {A, AbsoluteDirectAddrByY}},
{"MOV", 2, {X, DirectAddr}},
{"MOV", 2, {X, DirectAddrByY}},
{"MOVW", 2, {DirectAddr, None}},
{"MOV", 2, {Y, DirectAddrByX}},
{"DEC", 1, {Y, None}},
{"MOV", 1, {Y, A}},
{"CBNE", 3, {DirectAddrByX, ImmediateData}},
{"DAA", 1, {None, None}},
{"CLRV", 1, {None, None}},
{"TCALL", 1, {None, None}},
{"SET1", 2, {DirectAddr, None}},
{"BBS", 3, {DirectAddr, ImmediateData}},
{"MOV", 2, {DirectAddr, A}},
{"MOV", 3, {AbsoluteAddrByX, A}},
{"MOV", 1, {IndexXAddr, A}},
{"MOV", 2, {AbsoluteDirectByXAddr, A}},
{"MOV", 2, {ImmediateData, A}},
{"MOV", 3, {AbsoluteAddr, X}},
{"NOT1", 3, {AbsoluteBit, None}},
{"MOV", 2, {DirectAddr, Y}},
{"MOV", 3, {AbsoluteAddr, Y}},
{"NOTC", 1, {None, None}},
{"POP", 1, {Y, None}},
{"SLEEP", 1, {None, None}},
{"BEQ", 2, {ImmediateData, None}},
{"TCALL", 1, {None, None}},
{"CLR1", 2, {DirectAddr, None}},
{"BBC", 3, {DirectAddr, ImmediateData}},
{"MOV", 2, {DirectAddrByX, A}},
{"MOV", 3, {AbsoluteAddrByX, A}},
{"MOV", 3, {AbsoluteAddrByY, A}},
{"MOV", 2, {AbsoluteDirectAddrByY, A}},
{"MOV", 2, {DirectAddr, X}},
{"MOV", 2, {DirectAddrByY, X}},
{"MOV", 3, {DirectAddr, DirectAddr}},
{"MOV", 2, {DirectAddrByX, Y}},
{"INC", 1, {Y, None}},
{"MOV", 1, {A, Y}},
{"DBNZ", 3, {ImmediateData, None}},
{"STOP", 1, {None, None}}
}};
//! @brief The QT window for this debugger.
ClosableWindow<APUDebug> *_window;
@@ -30,14 +323,18 @@ namespace ComSquare::Debugger
//! @brief Update the debugger panel values
void _updatePanel();
//! @brief Convert CPU APU flags to a string.
std::string _getPSWString();
//! @brief Updates the object that serves as the disassembly
void _updateLogger();
//! @brief Replace original _executeInstruction to write to the logger.
int _executeInstruction() override;
//! @brief return the mnemonic of the current instruction done.
std::string _getInstructionString();
//! @brief Retrieves the instruction from the SP location
Instruction &_getInstruction();
//! @brief Returns an operand in text format
std::string _getOperand(Operand ope);
public slots:
//! @brief Pause/Resume the APU.
void pause();
@@ -55,7 +352,6 @@ namespace ComSquare::Debugger
//! @brief Override the apu's update to disable debugging.
void update(unsigned cycles) override;
//! @brief Return true if the CPU is overloaded with debugging features.
bool isDebugger() const override;