1#ifndef YAZE_APP_EMU_CPU_H_
2#define YAZE_APP_EMU_CPU_H_
17 const std::string& instr)
36 void Reset(
bool hard =
false);
42 bool immediate,
bool accumulator_mode);
100 void SetZN(uint16_t value,
bool byte) {
148 uint16_t
ReadWord(uint32_t address, uint32_t address_high,
149 bool int_check =
false) {
152 uint8_t value2 =
ReadByte(address_high);
153 return value | (value2 << 8);
157 uint8_t value2 =
ReadByte(address + 1);
158 uint8_t value3 =
ReadByte(address + 2);
159 return value | (value2 << 8) | (value3 << 16);
166 void WriteWord(uint32_t address, uint32_t address_high, uint16_t value,
167 bool reversed =
false,
bool int_check =
false) {
169 callbacks_.write_byte(address_high, value >> 8);
175 callbacks_.write_byte(address_high, value >> 8);
180 callbacks_.write_byte(address + 1, (value >> 8) & 0xFF);
181 callbacks_.write_byte(address + 2, value >> 16);
187 if (
E)
SetSP((
SP() & 0xff) | 0x100);
189 void PushWord(uint16_t value,
bool int_check =
false) {
201 if (
E)
SetSP((
SP() & 0xff) | 0x100);
212 return (high << 16) | low;
245 uint32_t
AdrAbx(uint32_t* low,
bool write);
254 uint32_t
AdrAby(uint32_t* low,
bool write);
257 uint32_t
AdrIdx(uint32_t* low);
259 uint32_t
AdrIdp(uint32_t* low);
260 uint32_t
AdrIdy(uint32_t* low,
bool write);
261 uint32_t
AdrIdl(uint32_t* low);
262 uint32_t
AdrIly(uint32_t* low);
263 uint32_t
AdrIsy(uint32_t* low);
264 uint32_t
Immediate(uint32_t* low,
bool xFlag);
297 uint32_t
AdrAbl(uint32_t* low);
304 uint32_t
AdrAlx(uint32_t* low);
318 void BlockMove(uint16_t source, uint16_t dest, uint16_t length);
326 uint32_t
AdrDp(uint32_t* low);
335 uint32_t
AdrDpx(uint32_t* low);
343 uint32_t
AdrDpy(uint32_t* low);
401 uint32_t
AdrSr(uint32_t* low);
417 void ADC(uint16_t operand);
420 void AND(uint32_t address,
bool immediate =
false);
424 void ASL(uint16_t address);
436 void BIT(uint16_t address);
475 void CMP(uint32_t address,
bool immediate =
false);
481 void CPX(uint32_t address,
bool immediate =
false);
484 void CPY(uint32_t address,
bool immediate =
false);
487 void DEC(uint32_t address,
bool accumulator =
false);
496 void EOR(uint32_t address,
bool immediate =
false);
499 void INC(uint32_t address,
bool accumulator =
false);
508 void JMP(uint16_t address);
511 void JML(uint16_t address);
514 void JSR(uint16_t address);
517 void JSL(uint16_t address);
520 void LDA(uint16_t address,
bool immediate =
false,
bool direct_page =
false,
521 bool data_bank =
false);
524 void LDX(uint16_t address,
bool immediate =
false);
527 void LDY(uint16_t address,
bool immediate =
false);
530 void LSR(uint16_t address,
bool accumulator =
false);
542 void ORA(uint32_t low, uint32_t high);
596 void ROL(uint32_t address,
bool accumulator =
false);
599 void ROR(uint32_t address,
bool accumulator =
false);
611 void SBC(uint32_t operand,
bool immediate =
false);
626 void STA(uint32_t address);
632 void STX(uint16_t address);
635 void STY(uint16_t address);
638 void STZ(uint16_t address);
656 void TRB(uint16_t address);
659 void TSB(uint16_t address);
694 void And(uint32_t low, uint32_t high);
695 void Eor(uint32_t low, uint32_t high);
696 void Adc(uint32_t low, uint32_t high);
697 void Sbc(uint32_t low, uint32_t high);
698 void Cmp(uint32_t low, uint32_t high);
699 void Cpx(uint32_t low, uint32_t high);
700 void Cpy(uint32_t low, uint32_t high);
701 void Bit(uint32_t low, uint32_t high);
702 void Lda(uint32_t low, uint32_t high);
703 void Ldx(uint32_t low, uint32_t high);
704 void Ldy(uint32_t low, uint32_t high);
705 void Sta(uint32_t low, uint32_t high);
706 void Stx(uint32_t low, uint32_t high);
707 void Sty(uint32_t low, uint32_t high);
708 void Stz(uint32_t low, uint32_t high);
709 void Ror(uint32_t low, uint32_t high);
710 void Rol(uint32_t low, uint32_t high);
711 void Lsr(uint32_t low, uint32_t high);
712 void Asl(uint32_t low, uint32_t high);
713 void Inc(uint32_t low, uint32_t high);
714 void Dec(uint32_t low, uint32_t high);
715 void Tsb(uint32_t low, uint32_t high);
716 void Trb(uint32_t low, uint32_t high);
746 void compare(uint16_t register_value, uint16_t memory_value) {
750 uint8_t result8 =
static_cast<uint8_t
>(register_value) -
751 static_cast<uint8_t
>(memory_value);
756 result = register_value - memory_value;
void Stx(uint32_t low, uint32_t high)
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)
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::vector< InstructionEntry > instruction_log_
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)
Cpu(Memory &mem, CpuCallbacks &callbacks)
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)
auto mutable_log_instructions() -> bool *
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)
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
SNES Emulation and debugging tools.
Main namespace for the application.