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);
49 bool immediate,
bool accumulator_mode);
65 std::function<void(uint32_t address, uint8_t opcode,
const std::vector<uint8_t>& operands,
125 void SetZN(uint16_t value,
bool byte) {
177 uint8_t high =
ReadByte(address + 1);
178 return low | (high << 8);
182 uint16_t
ReadWord(uint32_t address, uint32_t address_high,
183 bool int_check =
false) {
186 uint8_t value2 =
ReadByte(address_high);
187 return value | (value2 << 8);
191 uint8_t value2 =
ReadByte(address + 1);
192 uint8_t value3 =
ReadByte(address + 2);
193 return value | (value2 << 8) | (value3 << 16);
200 void WriteWord(uint32_t address, uint32_t address_high, uint16_t value,
201 bool reversed =
false,
bool int_check =
false) {
221 if (
E)
SetSP((
SP() & 0xff) | 0x100);
223 void PushWord(uint16_t value,
bool int_check =
false) {
235 if (
E)
SetSP((
SP() & 0xff) | 0x100);
246 return (high << 16) | low;
278 uint32_t
AdrAbx(uint32_t* low,
bool write);
287 uint32_t
AdrAby(uint32_t* low,
bool write);
290 uint32_t
AdrIdx(uint32_t* low);
292 uint32_t
AdrIdp(uint32_t* low);
293 uint32_t
AdrIdy(uint32_t* low,
bool write);
294 uint32_t
AdrIdl(uint32_t* low);
295 uint32_t
AdrIly(uint32_t* low);
296 uint32_t
AdrIsy(uint32_t* low);
297 uint32_t
Immediate(uint32_t* low,
bool xFlag);
330 uint32_t
AdrAbl(uint32_t* low);
337 uint32_t
AdrAlx(uint32_t* low);
351 void BlockMove(uint16_t source, uint16_t dest, uint16_t length);
359 uint32_t
AdrDp(uint32_t* low);
368 uint32_t
AdrDpx(uint32_t* low);
376 uint32_t
AdrDpy(uint32_t* low);
434 uint32_t
AdrSr(uint32_t* low);
450 void ADC(uint16_t operand);
453 void AND(uint32_t address,
bool immediate =
false);
457 void ASL(uint16_t address);
469 void BIT(uint16_t address);
508 void CMP(uint32_t address,
bool immediate =
false);
514 void CPX(uint32_t address,
bool immediate =
false);
517 void CPY(uint32_t address,
bool immediate =
false);
520 void DEC(uint32_t address,
bool accumulator =
false);
529 void EOR(uint32_t address,
bool immediate =
false);
532 void INC(uint32_t address,
bool accumulator =
false);
541 void JMP(uint16_t address);
544 void JML(uint16_t address);
547 void JSR(uint16_t address);
550 void JSL(uint16_t address);
553 void LDA(uint16_t address,
bool immediate =
false,
bool direct_page =
false,
554 bool data_bank =
false);
557 void LDX(uint16_t address,
bool immediate =
false);
560 void LDY(uint16_t address,
bool immediate =
false);
563 void LSR(uint16_t address,
bool accumulator =
false);
575 void ORA(uint32_t low, uint32_t high);
629 void ROL(uint32_t address,
bool accumulator =
false);
632 void ROR(uint32_t address,
bool accumulator =
false);
644 void SBC(uint32_t operand,
bool immediate =
false);
659 void STA(uint32_t address);
665 void STX(uint16_t address);
668 void STY(uint16_t address);
671 void STZ(uint16_t address);
689 void TRB(uint16_t address);
692 void TSB(uint16_t address);
727 void And(uint32_t low, uint32_t high);
728 void Eor(uint32_t low, uint32_t high);
729 void Adc(uint32_t low, uint32_t high);
730 void Sbc(uint32_t low, uint32_t high);
731 void Cmp(uint32_t low, uint32_t high);
732 void Cpx(uint32_t low, uint32_t high);
733 void Cpy(uint32_t low, uint32_t high);
734 void Bit(uint32_t low, uint32_t high);
735 void Lda(uint32_t low, uint32_t high);
736 void Ldx(uint32_t low, uint32_t high);
737 void Ldy(uint32_t low, uint32_t high);
738 void Sta(uint32_t low, uint32_t high);
739 void Stx(uint32_t low, uint32_t high);
740 void Sty(uint32_t low, uint32_t high);
741 void Stz(uint32_t low, uint32_t high);
742 void Ror(uint32_t low, uint32_t high);
743 void Rol(uint32_t low, uint32_t high);
744 void Lsr(uint32_t low, uint32_t high);
745 void Asl(uint32_t low, uint32_t high);
746 void Inc(uint32_t low, uint32_t high);
747 void Dec(uint32_t low, uint32_t high);
748 void Tsb(uint32_t low, uint32_t high);
749 void Trb(uint32_t low, uint32_t high);
782 void compare(uint16_t register_value, uint16_t memory_value) {
786 uint8_t result8 =
static_cast<uint8_t
>(register_value) -
787 static_cast<uint8_t
>(memory_value);
792 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
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 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 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)
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_
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.
Main namespace for the application.
std::function< void(bool waiting)> idle
std::function< uint8_t(uint32_t)> read_byte
std::function< void(uint32_t, uint8_t)> write_byte