bsnes/higan/processor/lr35902/lr35902.hpp

179 lines
6.7 KiB
C++

//Sharp LR35902
#pragma once
namespace Processor {
struct LR35902 {
virtual auto idle() -> void = 0;
virtual auto read(uint16 address) -> uint8 = 0;
virtual auto write(uint16 address, uint8 data) -> void = 0;
virtual auto stop() -> bool = 0;
//lr35902.cpp
auto power() -> void;
//instruction.cpp
auto interrupt(uint16 vector) -> void;
auto instruction() -> void;
auto instructionCB() -> void;
//serialization.cpp
auto serialize(serializer&) -> void;
//disassembler.cpp
virtual auto readDebugger(uint16 address) -> uint8 { return 0; }
auto disassemble(uint16 pc) -> string;
//memory.cpp
auto operand() -> uint8;
auto operands() -> uint16;
auto load(uint16 address) -> uint16;
auto store(uint16 address, uint16 data) -> void;
auto pop() -> uint16;
auto push(uint16 data) -> void;
//algorithms.cpp
auto ADD(uint8, uint8, bool = 0) -> uint8;
auto AND(uint8, uint8) -> uint8;
auto BIT(uint3, uint8) -> void;
auto CP(uint8, uint8) -> void;
auto DEC(uint8) -> uint8;
auto INC(uint8) -> uint8;
auto OR(uint8, uint8) -> uint8;
auto RL(uint8) -> uint8;
auto RLC(uint8) -> uint8;
auto RR(uint8) -> uint8;
auto RRC(uint8) -> uint8;
auto SLA(uint8) -> uint8;
auto SRA(uint8) -> uint8;
auto SRL(uint8) -> uint8;
auto SUB(uint8, uint8, bool = 0) -> uint8;
auto SWAP(uint8) -> uint8;
auto XOR(uint8, uint8) -> uint8;
//instructions.cpp
auto instructionADC_Direct_Data(uint8&) -> void;
auto instructionADC_Direct_Direct(uint8&, uint8&) -> void;
auto instructionADC_Direct_Indirect(uint8&, uint16&) -> void;
auto instructionADD_Direct_Data(uint8&) -> void;
auto instructionADD_Direct_Direct(uint8&, uint8&) -> void;
auto instructionADD_Direct_Direct(uint16&, uint16&) -> void;
auto instructionADD_Direct_Indirect(uint8&, uint16&) -> void;
auto instructionADD_Direct_Relative(uint16&) -> void;
auto instructionAND_Direct_Data(uint8&) -> void;
auto instructionAND_Direct_Direct(uint8&, uint8&) -> void;
auto instructionAND_Direct_Indirect(uint8&, uint16&) -> void;
auto instructionBIT_Index_Direct(uint3, uint8&) -> void;
auto instructionBIT_Index_Indirect(uint3, uint16&) -> void;
auto instructionCALL_Condition_Address(bool) -> void;
auto instructionCCF() -> void;
auto instructionCP_Direct_Data(uint8&) -> void;
auto instructionCP_Direct_Direct(uint8&, uint8&) -> void;
auto instructionCP_Direct_Indirect(uint8&, uint16&) -> void;
auto instructionCPL() -> void;
auto instructionDAA() -> void;
auto instructionDEC_Direct(uint8&) -> void;
auto instructionDEC_Direct(uint16&) -> void;
auto instructionDEC_Indirect(uint16&) -> void;
auto instructionDI() -> void;
auto instructionEI() -> void;
auto instructionHALT() -> void;
auto instructionINC_Direct(uint8&) -> void;
auto instructionINC_Direct(uint16&) -> void;
auto instructionINC_Indirect(uint16&) -> void;
auto instructionJP_Condition_Address(bool) -> void;
auto instructionJP_Direct(uint16&) -> void;
auto instructionJR_Condition_Relative(bool) -> void;
auto instructionLD_Address_Direct(uint8&) -> void;
auto instructionLD_Address_Direct(uint16&) -> void;
auto instructionLD_Direct_Address(uint8&) -> void;
auto instructionLD_Direct_Data(uint8&) -> void;
auto instructionLD_Direct_Data(uint16&) -> void;
auto instructionLD_Direct_Direct(uint8&, uint8&) -> void;
auto instructionLD_Direct_Direct(uint16&, uint16&) -> void;
auto instructionLD_Direct_DirectRelative(uint16&, uint16&) -> void;
auto instructionLD_Direct_Indirect(uint8&, uint16&) -> void;
auto instructionLD_Direct_IndirectDecrement(uint8&, uint16&) -> void;
auto instructionLD_Direct_IndirectIncrement(uint8&, uint16&) -> void;
auto instructionLD_Indirect_Data(uint16&) -> void;
auto instructionLD_Indirect_Direct(uint16&, uint8&) -> void;
auto instructionLD_IndirectDecrement_Direct(uint16&, uint8&) -> void;
auto instructionLD_IndirectIncrement_Direct(uint16&, uint8&) -> void;
auto instructionLDH_Address_Direct(uint8&) -> void;
auto instructionLDH_Direct_Address(uint8&) -> void;
auto instructionLDH_Direct_Indirect(uint8&, uint8&) -> void;
auto instructionLDH_Indirect_Direct(uint8&, uint8&) -> void;
auto instructionNOP() -> void;
auto instructionOR_Direct_Data(uint8&) -> void;
auto instructionOR_Direct_Direct(uint8&, uint8&) -> void;
auto instructionOR_Direct_Indirect(uint8&, uint16&) -> void;
auto instructionPOP_Direct(uint16&) -> void;
auto instructionPUSH_Direct(uint16&) -> void;
auto instructionRES_Index_Direct(uint3, uint8&) -> void;
auto instructionRES_Index_Indirect(uint3, uint16&) -> void;
auto instructionRET() -> void;
auto instructionRET_Condition(bool) -> void;
auto instructionRETI() -> void;
auto instructionRL_Direct(uint8&) -> void;
auto instructionRL_Indirect(uint16&) -> void;
auto instructionRLA() -> void;
auto instructionRLC_Direct(uint8&) -> void;
auto instructionRLC_Indirect(uint16&) -> void;
auto instructionRLCA() -> void;
auto instructionRR_Direct(uint8&) -> void;
auto instructionRR_Indirect(uint16&) -> void;
auto instructionRRA() -> void;
auto instructionRRC_Direct(uint8&) -> void;
auto instructionRRC_Indirect(uint16&) -> void;
auto instructionRRCA() -> void;
auto instructionRST_Implied(uint8) -> void;
auto instructionSBC_Direct_Data(uint8&) -> void;
auto instructionSBC_Direct_Direct(uint8&, uint8&) -> void;
auto instructionSBC_Direct_Indirect(uint8&, uint16&) -> void;
auto instructionSCF() -> void;
auto instructionSET_Index_Direct(uint3, uint8&) -> void;
auto instructionSET_Index_Indirect(uint3, uint16&) -> void;
auto instructionSLA_Direct(uint8&) -> void;
auto instructionSLA_Indirect(uint16&) -> void;
auto instructionSRA_Direct(uint8&) -> void;
auto instructionSRA_Indirect(uint16&) -> void;
auto instructionSRL_Direct(uint8&) -> void;
auto instructionSRL_Indirect(uint16&) -> void;
auto instructionSUB_Direct_Data(uint8&) -> void;
auto instructionSUB_Direct_Direct(uint8&, uint8&) -> void;
auto instructionSUB_Direct_Indirect(uint8&, uint16&) -> void;
auto instructionSWAP_Direct(uint8& data) -> void;
auto instructionSWAP_Indirect(uint16& address) -> void;
auto instructionSTOP() -> void;
auto instructionXOR_Direct_Data(uint8&) -> void;
auto instructionXOR_Direct_Direct(uint8&, uint8&) -> void;
auto instructionXOR_Direct_Indirect(uint8&, uint16&) -> void;
struct Registers {
union Pair {
Pair() : word(0) {}
uint16 word;
struct Byte { uint8 order_msb2(hi, lo); } byte;
};
Pair af;
Pair bc;
Pair de;
Pair hl;
Pair sp;
Pair pc;
uint1 ei;
uint1 halt;
uint1 stop;
uint1 ime;
} r;
//disassembler.cpp
auto disassembleOpcode(uint16 pc) -> string;
auto disassembleOpcodeCB(uint16 pc) -> string;
};
}