1#ifndef YAZE_APP_EMU_CPU_H_
2#define YAZE_APP_EMU_CPU_H_
15class DisassemblyViewer;
22 const std::string& instr)
40 void Reset(
bool hard =
false);
52 bool immediate,
bool accumulator_mode);
69 uint32_t address, uint8_t opcode,
const std::vector<uint8_t>& operands,
70 const std::string& mnemonic,
const std::string& operand_str)>
130 void SetZN(uint16_t value,
bool byte) {
183 uint8_t high =
ReadByte(address + 1);
184 return low | (high << 8);
189 uint16_t
ReadWord(uint32_t address, uint32_t address_high,
190 bool int_check =
false) {
194 uint8_t value2 =
ReadByte(address_high);
195 return value | (value2 << 8);
199 uint8_t value2 =
ReadByte(address + 1);
200 uint8_t value3 =
ReadByte(address + 2);
201 return value | (value2 << 8) | (value3 << 16);
208 void WriteWord(uint32_t address, uint32_t address_high, uint16_t value,
209 bool reversed =
false,
bool int_check =
false) {
234 void PushWord(uint16_t value,
bool int_check =
false) {
260 return (high << 16) | low;
292 uint32_t
AdrAbx(uint32_t* low,
bool write);
301 uint32_t
AdrAby(uint32_t* low,
bool write);
304 uint32_t
AdrIdx(uint32_t* low);
306 uint32_t
AdrIdp(uint32_t* low);
307 uint32_t
AdrIdy(uint32_t* low,
bool write);
308 uint32_t
AdrIdl(uint32_t* low);
309 uint32_t
AdrIly(uint32_t* low);
310 uint32_t
AdrIsy(uint32_t* low);
311 uint32_t
Immediate(uint32_t* low,
bool xFlag);
344 uint32_t
AdrAbl(uint32_t* low);
351 uint32_t
AdrAlx(uint32_t* low);
365 void BlockMove(uint16_t source, uint16_t dest, uint16_t length);
373 uint32_t
AdrDp(uint32_t* low);
382 uint32_t
AdrDpx(uint32_t* low);
390 uint32_t
AdrDpy(uint32_t* low);
448 uint32_t
AdrSr(uint32_t* low);
464 void ADC(uint16_t operand);
467 void AND(uint32_t address,
bool immediate =
false);
471 void ASL(uint16_t address);
483 void BIT(uint16_t address);
522 void CMP(uint32_t address,
bool immediate =
false);
528 void CPX(uint32_t address,
bool immediate =
false);
531 void CPY(uint32_t address,
bool immediate =
false);
534 void DEC(uint32_t address,
bool accumulator =
false);
543 void EOR(uint32_t address,
bool immediate =
false);
546 void INC(uint32_t address,
bool accumulator =
false);
555 void JMP(uint16_t address);
558 void JML(uint16_t address);
561 void JSR(uint16_t address);
564 void JSL(uint16_t address);
567 void LDA(uint16_t address,
bool immediate =
false,
bool direct_page =
false,
568 bool data_bank =
false);
571 void LDX(uint16_t address,
bool immediate =
false);
574 void LDY(uint16_t address,
bool immediate =
false);
577 void LSR(uint16_t address,
bool accumulator =
false);
589 void ORA(uint32_t low, uint32_t high);
643 void ROL(uint32_t address,
bool accumulator =
false);
646 void ROR(uint32_t address,
bool accumulator =
false);
658 void SBC(uint32_t operand,
bool immediate =
false);
673 void STA(uint32_t address);
679 void STX(uint16_t address);
682 void STY(uint16_t address);
685 void STZ(uint16_t address);
703 void TRB(uint16_t address);
706 void TSB(uint16_t address);
741 void And(uint32_t low, uint32_t high);
742 void Eor(uint32_t low, uint32_t high);
743 void Adc(uint32_t low, uint32_t high);
744 void Sbc(uint32_t low, uint32_t high);
745 void Cmp(uint32_t low, uint32_t high);
746 void Cpx(uint32_t low, uint32_t high);
747 void Cpy(uint32_t low, uint32_t high);
748 void Bit(uint32_t low, uint32_t high);
749 void Lda(uint32_t low, uint32_t high);
750 void Ldx(uint32_t low, uint32_t high);
751 void Ldy(uint32_t low, uint32_t high);
752 void Sta(uint32_t low, uint32_t high);
753 void Stx(uint32_t low, uint32_t high);
754 void Sty(uint32_t low, uint32_t high);
755 void Stz(uint32_t low, uint32_t high);
756 void Ror(uint32_t low, uint32_t high);
757 void Rol(uint32_t low, uint32_t high);
758 void Lsr(uint32_t low, uint32_t high);
759 void Asl(uint32_t low, uint32_t high);
760 void Inc(uint32_t low, uint32_t high);
761 void Dec(uint32_t low, uint32_t high);
762 void Tsb(uint32_t low, uint32_t high);
763 void Trb(uint32_t low, uint32_t high);
796 void compare(uint16_t register_value, uint16_t memory_value) {
800 uint8_t result8 =
static_cast<uint8_t
>(register_value) -
801 static_cast<uint8_t
>(memory_value);
806 result = register_value - memory_value;
const auto & callbacks() const
void Stx(uint32_t low, uint32_t high)
debug::DisassemblyViewer & disassembly_viewer()
bool GetNegativeFlag() const
uint32_t AdrAby(uint32_t *low, bool write)
void WriteWord(uint32_t address, uint32_t address_high, uint16_t value, bool reversed=false, bool int_check=false)
void JML(uint16_t address)
uint32_t DirectPageIndirectLongIndexedY()
bool GetInterruptFlag() const
std::function< void(uint32_t address, uint8_t opcode, const std::vector< uint8_t > &operands, const std::string &mnemonic, const std::string &operand_str) on_instruction_executed_)
uint32_t AdrAbl(uint32_t *low)
void JSR(uint16_t address)
void Asl(uint32_t low, uint32_t high)
void STA(uint32_t address)
uint32_t AdrIdy(uint32_t *low, bool write)
void Inc(uint32_t low, uint32_t high)
uint16_t DirectPageIndirectIndexedY()
void SBC(uint32_t operand, bool immediate=false)
uint32_t AdrSr(uint32_t *low)
void SetZN(uint16_t value, bool byte)
void Ldy(uint32_t low, uint32_t high)
uint32_t Immediate(uint32_t *low, bool xFlag)
uint16_t ReadWord(uint32_t address)
void LSR(uint16_t address, bool accumulator=false)
uint16_t DirectPageIndexedY()
uint16_t AbsoluteIndexedIndirect()
void Sta(uint32_t low, uint32_t high)
uint8_t ReadByte(uint32_t address)
uint32_t AdrIdl(uint32_t *low)
void BlockMove(uint16_t source, uint16_t dest, uint16_t length)
uint32_t AbsoluteLongIndexedX()
uint32_t DirectPageIndirectLong()
bool GetFlag(uint8_t mask) const
void Cpy(uint32_t low, uint32_t high)
uint16_t ReadWord(uint32_t address, uint32_t address_high, bool int_check=false)
void SetDecimalFlag(bool set)
uint32_t AdrAbx(uint32_t *low, bool write)
void STY(uint16_t address)
void SaveState(std::ostream &stream)
void CPX(uint32_t address, bool immediate=false)
uint32_t AdrDp(uint32_t *low)
void Bit(uint32_t low, uint32_t high)
void set_int_delay(bool delay)
std::function< bool(uint32_t pc)> on_breakpoint_hit_
void LoadState(std::istream &stream)
void And(uint32_t low, uint32_t high)
void SetZeroFlag(bool set)
void WriteByte(uint32_t address, uint8_t value)
void INC(uint32_t address, bool accumulator=false)
void ORA(uint32_t low, uint32_t high)
uint32_t AdrIdp(uint32_t *low)
void Sbc(uint32_t low, uint32_t high)
void CMP(uint32_t address, bool immediate=false)
void Trb(uint32_t low, uint32_t high)
void Lda(uint32_t low, uint32_t high)
void Cpx(uint32_t low, uint32_t high)
void EOR(uint32_t address, bool immediate=false)
void Rol(uint32_t low, uint32_t high)
uint32_t AdrDpy(uint32_t *low)
void ASL(uint16_t address)
void Tsb(uint32_t low, uint32_t high)
void Dec(uint32_t low, uint32_t high)
void SetAccumulatorSize(bool set)
void TRB(uint16_t address)
void SetFlag(uint8_t mask, bool set)
void SetFlags(uint8_t val)
void TSB(uint16_t address)
void Ldx(uint32_t low, uint32_t high)
uint16_t DirectPageIndexedX()
uint16_t Immediate(bool index_size=false)
void ADC(uint16_t operand)
uint32_t AbsoluteIndexedY()
void ROL(uint32_t address, bool accumulator=false)
void PushByte(uint8_t value)
void PushWord(uint16_t value, bool int_check=false)
int GetAccumulatorSize() const
void AND(uint32_t address, bool immediate=false)
uint32_t AdrIly(uint32_t *low)
void STX(uint16_t address)
void ROR(uint32_t address, bool accumulator=false)
void LogInstructions(uint16_t PC, uint8_t opcode, uint16_t operand, bool immediate, bool accumulator_mode)
void SetOverflowFlag(bool set)
void ExecuteInstruction(uint8_t opcode)
uint16_t DirectPageIndexedIndirectX()
uint32_t ReadWordLong(uint32_t address)
uint32_t AdrIdx(uint32_t *low)
uint32_t Absolute(uint32_t *low)
uint32_t AdrAlx(uint32_t *low)
void Reset(bool hard=false)
uint16_t PopWord(bool int_check=false)
void ClearBreakpoint(uint32_t address)
void STZ(uint16_t address)
uint16_t DirectPageIndirect()
void SetCarryFlag(bool set)
void SetInterruptFlag(bool set)
bool GetCarryFlag() const
void SetBreakpoint(uint32_t address)
bool IsBreakpoint(uint32_t address)
void CPY(uint32_t address, bool immediate=false)
void DoBranch(bool check)
void Eor(uint32_t low, uint32_t high)
void SetSP(uint16_t value)
uint32_t AdrIsy(uint32_t *low)
void ANDAbsoluteLong(uint32_t address)
void DEC(uint32_t address, bool accumulator=false)
void PushLong(uint32_t value)
debug::DisassemblyViewer * disassembly_viewer_
void Stz(uint32_t low, uint32_t high)
bool GetBreakFlag() const
bool GetDecimalFlag() const
uint16_t AbsoluteIndirect()
void Cmp(uint32_t low, uint32_t high)
std::vector< uint32_t > breakpoints_
uint32_t AbsoluteIndexedX()
void BIT(uint16_t address)
uint16_t ReadOpcodeWord(bool int_check=false)
void Ror(uint32_t low, uint32_t high)
bool GetOverflowFlag() const
void SetNegativeFlag(bool set)
void SetBreakFlag(bool set)
uint32_t StackRelativeIndirectIndexedY()
void JMP(uint16_t address)
void Sty(uint32_t low, uint32_t high)
void LDX(uint16_t address, bool immediate=false)
void JSL(uint16_t address)
void Lsr(uint32_t low, uint32_t high)
uint32_t AdrDpx(uint32_t *low)
void compare(uint16_t register_value, uint16_t memory_value)
void SetIndexSize(bool set)
uint32_t AbsoluteIndirectLong()
void Adc(uint32_t low, uint32_t high)
void LDA(uint16_t address, bool immediate=false, bool direct_page=false, bool data_bank=false)
void WriteLong(uint32_t address, uint32_t value)
void LDY(uint16_t address, bool immediate=false)
InstructionEntry(uint32_t addr, uint8_t op, const std::string &ops, const std::string &instr)
uint32_t GetAddress() const
const std::string & GetInstruction() const
uint8_t GetOpcode() const
const std::string & GetOperands() const
virtual uint16_t SP() const =0
virtual void SetSP(uint16_t value)=0
Advanced disassembly viewer with sparse storage and interactive features.
std::function< void(bool waiting)> idle
std::function< uint8_t(uint32_t)> read_byte
std::function< void(uint32_t, uint8_t)> write_byte