AppleSAWS/src/binaryfile/disassembler.h

94 lines
2.3 KiB
C
Raw Normal View History

2015-12-01 16:24:51 +00:00
#ifndef DISASSEMBLER_H
#define DISASSEMBLER_H
#include <QByteArray>
#include <QStringList>
2016-02-04 21:52:16 +00:00
#include <QHash>
enum AddressMode {
AM_InvalidOp,
AM_Absolute, // a
AM_AbsoluteIndexedIndirect, // (a,x)
AM_AbsoluteIndexedWithX, // a,x
AM_AbsoluteIndexedWithY, // a,y
AM_AbsoluteIndirect, // (a)
AM_Immediate, // #
AM_Implied, // i
AM_Accumulator, // A
AM_ProgramCounterRelative, // r
AM_ZeroPage, // zp
AM_ZeroPageIndexedIndirect, // (zp,x)
AM_ZeroPageIndexedWithX, // zp,x
AM_ZeroPageIndexedWithY, // zp,y
AM_ZeroPageIndirect, // (zp)
AM_ZeroPageIndectIndexedWithY // (zp),y
};
struct AssyInstruction {
public:
AssyInstruction(quint8 opcode = 0x00, QString mnemonic = "???", AddressMode am = AM_InvalidOp) {
m_opcode = opcode;
m_mnemonic = mnemonic;
m_addressMode = am;
}
QString mnemonic() { return m_mnemonic; }
quint8 opcode() { return m_opcode; }
quint8 numArgs() {
switch (m_addressMode) {
case AM_Absolute:
case AM_AbsoluteIndexedIndirect:
case AM_AbsoluteIndexedWithX:
case AM_AbsoluteIndexedWithY:
case AM_AbsoluteIndirect:
return 2;
case AM_ProgramCounterRelative:
case AM_ZeroPage:
case AM_ZeroPageIndectIndexedWithY:
case AM_ZeroPageIndexedIndirect:
case AM_ZeroPageIndexedWithX:
case AM_ZeroPageIndexedWithY:
case AM_ZeroPageIndirect:
return 1;
case AM_InvalidOp:
case AM_Implied:
case AM_Accumulator:
default:
return 0;
}
}
private:
QString m_mnemonic;
quint8 m_opcode;
AddressMode m_addressMode;
};
//////////////////////////////////////////////////////////////////////////////
2015-12-01 16:24:51 +00:00
class Disassembler
{
public:
2016-02-04 21:52:16 +00:00
Disassembler(QByteArray memimage) { m_memimage = memimage, makeOpcodeTable(); }
enum ProcessorType {
P6502,
P65C02
};
QStringList disassemble(quint16 address);
private:
void makeOpcodeTable();
QHash<quint8,AssyInstruction> m_opcodeinfo;
QByteArray m_memimage;
2015-12-01 16:24:51 +00:00
};
#endif // DISASSEMBLER_H