CPU: Fixed BRK/COP instructions (read + ignore the signature byte)
This commit is contained in:
parent
3cfb3f7f25
commit
25837e5c71
5 changed files with 40 additions and 41 deletions
|
@ -29,9 +29,9 @@ void Cpu::Exec()
|
||||||
_immediateMode = false;
|
_immediateMode = false;
|
||||||
|
|
||||||
switch(GetOpCode()) {
|
switch(GetOpCode()) {
|
||||||
case 0x00: BRK(); break;
|
case 0x00: AddrMode_Imm8(); BRK(); break;
|
||||||
case 0x01: AddrMode_DirIdxIndX(); ORA(); break;
|
case 0x01: AddrMode_DirIdxIndX(); ORA(); break;
|
||||||
case 0x02: COP(); break;
|
case 0x02: AddrMode_Imm8(); COP(); break;
|
||||||
case 0x03: AddrMode_StkRel(); ORA(); break;
|
case 0x03: AddrMode_StkRel(); ORA(); break;
|
||||||
case 0x04: AddrMode_Dir(); TSB(); break;
|
case 0x04: AddrMode_Dir(); TSB(); break;
|
||||||
case 0x05: AddrMode_Dir(); ORA(); break;
|
case 0x05: AddrMode_Dir(); ORA(); break;
|
||||||
|
|
|
@ -40,9 +40,6 @@ private:
|
||||||
bool _nmiFlag;
|
bool _nmiFlag;
|
||||||
uint8_t _irqSource;
|
uint8_t _irqSource;
|
||||||
|
|
||||||
Func _opTable[256];
|
|
||||||
AddrMode _addrMode[256];
|
|
||||||
|
|
||||||
uint32_t GetProgramAddress(uint16_t addr);
|
uint32_t GetProgramAddress(uint16_t addr);
|
||||||
uint32_t GetDataAddress(uint16_t addr);
|
uint32_t GetDataAddress(uint16_t addr);
|
||||||
|
|
||||||
|
|
|
@ -52,40 +52,6 @@ namespace ProcFlags
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
enum class AddrMode : uint8_t
|
|
||||||
{
|
|
||||||
Imm8,
|
|
||||||
Imm16,
|
|
||||||
ImmX,
|
|
||||||
ImmM,
|
|
||||||
Abs,
|
|
||||||
AbsIdxXInd, //JMP/JSR only
|
|
||||||
AbsIdxX,
|
|
||||||
AbsIdxY,
|
|
||||||
AbsInd, //JMP only
|
|
||||||
AbsIndLng, //JML only
|
|
||||||
AbsLngIdxX,
|
|
||||||
AbsLng,
|
|
||||||
AbsJmp, //JSR/JMP only
|
|
||||||
AbsLngJmp, //JSL/JMP only
|
|
||||||
Acc,
|
|
||||||
BlkMov,
|
|
||||||
DirIdxIndX,
|
|
||||||
DirIdxX,
|
|
||||||
DirIdxY,
|
|
||||||
DirIndIdxY,
|
|
||||||
DirIndLngIdxY,
|
|
||||||
DirIndLng,
|
|
||||||
DirInd,
|
|
||||||
Dir,
|
|
||||||
Imp,
|
|
||||||
RelLng,
|
|
||||||
Rel,
|
|
||||||
Stk,
|
|
||||||
StkRel,
|
|
||||||
StkRelIndIdxY
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class MemoryOperationType
|
enum class MemoryOperationType
|
||||||
{
|
{
|
||||||
Read = 0,
|
Read = 0,
|
||||||
|
|
|
@ -75,7 +75,8 @@ void DisassemblyInfo::GetDisassembly(string &out, uint32_t memoryAddr)
|
||||||
str.Write('#', operand);
|
str.Write('#', operand);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case AddrMode::Imp: break;;
|
case AddrMode::Sig8: //BRK/COP signature, ignore them
|
||||||
|
case AddrMode::Imp: break;
|
||||||
case AddrMode::RelLng: str.Write(operand);
|
case AddrMode::RelLng: str.Write(operand);
|
||||||
case AddrMode::Rel: str.Write(operand);
|
case AddrMode::Rel: str.Write(operand);
|
||||||
case AddrMode::Stk: break;
|
case AddrMode::Stk: break;
|
||||||
|
@ -131,6 +132,7 @@ uint8_t DisassemblyInfo::GetOperandSize(AddrMode addrMode, uint8_t flags)
|
||||||
case AddrMode::DirIndLng:
|
case AddrMode::DirIndLng:
|
||||||
case AddrMode::DirInd:
|
case AddrMode::DirInd:
|
||||||
case AddrMode::Dir:
|
case AddrMode::Dir:
|
||||||
|
case AddrMode::Sig8:
|
||||||
case AddrMode::Imm8:
|
case AddrMode::Imm8:
|
||||||
case AddrMode::Rel:
|
case AddrMode::Rel:
|
||||||
case AddrMode::StkRel:
|
case AddrMode::StkRel:
|
||||||
|
@ -238,7 +240,7 @@ string DisassemblyInfo::OpName[256] = {
|
||||||
typedef AddrMode M;
|
typedef AddrMode M;
|
||||||
AddrMode DisassemblyInfo::OpMode[256] = {
|
AddrMode DisassemblyInfo::OpMode[256] = {
|
||||||
//0 1 2 3 4 5 6 7 8 9 A B C D E F
|
//0 1 2 3 4 5 6 7 8 9 A B C D E F
|
||||||
M::Stk, M::DirIdxIndX, M::Stk, M::StkRel, M::Dir, M::Dir, M::Dir, M::DirIndLng, M::Stk, M::ImmM, M::Acc, M::Stk, M::Abs, M::Abs, M::Abs, M::AbsLng, // 0
|
M::Sig8, M::DirIdxIndX, M::Sig8, M::StkRel, M::Dir, M::Dir, M::Dir, M::DirIndLng, M::Stk, M::ImmM, M::Acc, M::Stk, M::Abs, M::Abs, M::Abs, M::AbsLng, // 0
|
||||||
M::Rel, M::DirIndIdxY, M::DirInd, M::StkRelIndIdxY, M::Dir, M::DirIdxX, M::DirIdxX, M::DirIndLngIdxY, M::Imp, M::AbsIdxY, M::Acc, M::Imp, M::Abs, M::AbsIdxX, M::AbsIdxX, M::AbsLngIdxX, // 1
|
M::Rel, M::DirIndIdxY, M::DirInd, M::StkRelIndIdxY, M::Dir, M::DirIdxX, M::DirIdxX, M::DirIndLngIdxY, M::Imp, M::AbsIdxY, M::Acc, M::Imp, M::Abs, M::AbsIdxX, M::AbsIdxX, M::AbsLngIdxX, // 1
|
||||||
M::Abs, M::DirIdxIndX, M::AbsLng, M::StkRel, M::Dir, M::Dir, M::Dir, M::DirIndLng, M::Stk, M::ImmM, M::Acc, M::Stk, M::Abs, M::Abs, M::Abs, M::AbsLng, // 2
|
M::Abs, M::DirIdxIndX, M::AbsLng, M::StkRel, M::Dir, M::Dir, M::Dir, M::DirIndLng, M::Stk, M::ImmM, M::Acc, M::Stk, M::Abs, M::Abs, M::Abs, M::AbsLng, // 2
|
||||||
M::Rel, M::DirIndIdxY, M::DirInd, M::StkRelIndIdxY, M::DirIdxX, M::DirIdxX, M::DirIdxX, M::DirIndLngIdxY, M::Imp, M::AbsIdxY, M::Acc, M::Imp, M::AbsIdxX, M::AbsIdxX, M::AbsIdxX, M::AbsLngIdxX, // 3
|
M::Rel, M::DirIndIdxY, M::DirInd, M::StkRelIndIdxY, M::DirIdxX, M::DirIdxX, M::DirIdxX, M::DirIndLngIdxY, M::Imp, M::AbsIdxY, M::Acc, M::Imp, M::AbsIdxX, M::AbsIdxX, M::AbsIdxX, M::AbsLngIdxX, // 3
|
||||||
|
|
|
@ -41,3 +41,37 @@ public:
|
||||||
uint16_t GetMemoryValue(uint32_t effectiveAddress, MemoryManager *memoryManager, uint8_t &valueSize);
|
uint16_t GetMemoryValue(uint32_t effectiveAddress, MemoryManager *memoryManager, uint8_t &valueSize);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class AddrMode : uint8_t
|
||||||
|
{
|
||||||
|
Sig8,
|
||||||
|
Imm8,
|
||||||
|
Imm16,
|
||||||
|
ImmX,
|
||||||
|
ImmM,
|
||||||
|
Abs,
|
||||||
|
AbsIdxXInd, //JMP/JSR only
|
||||||
|
AbsIdxX,
|
||||||
|
AbsIdxY,
|
||||||
|
AbsInd, //JMP only
|
||||||
|
AbsIndLng, //JML only
|
||||||
|
AbsLngIdxX,
|
||||||
|
AbsLng,
|
||||||
|
AbsJmp, //JSR/JMP only
|
||||||
|
AbsLngJmp, //JSL/JMP only
|
||||||
|
Acc,
|
||||||
|
BlkMov,
|
||||||
|
DirIdxIndX,
|
||||||
|
DirIdxX,
|
||||||
|
DirIdxY,
|
||||||
|
DirIndIdxY,
|
||||||
|
DirIndLngIdxY,
|
||||||
|
DirIndLng,
|
||||||
|
DirInd,
|
||||||
|
Dir,
|
||||||
|
Imp,
|
||||||
|
RelLng,
|
||||||
|
Rel,
|
||||||
|
Stk,
|
||||||
|
StkRel,
|
||||||
|
StkRelIndIdxY
|
||||||
|
};
|
Loading…
Add table
Reference in a new issue