mirror of https://github.com/bsnes-emu/bsnes.git
253 lines
8.5 KiB
C++
253 lines
8.5 KiB
C++
#pragma once
|
|
|
|
//Zilog Z80
|
|
|
|
namespace Processor {
|
|
|
|
struct Z80 {
|
|
struct Bus {
|
|
virtual auto requested() -> bool { return _requested; }
|
|
virtual auto granted() -> bool { return _granted; }
|
|
|
|
virtual auto request(bool value) -> void { _requested = value; }
|
|
virtual auto grant(bool value) -> void { _granted = value; }
|
|
|
|
virtual auto read(uint16 addr) -> uint8 = 0;
|
|
virtual auto write(uint16 addr, uint8 data) -> void = 0;
|
|
|
|
virtual auto in(uint8 addr) -> uint8 = 0;
|
|
virtual auto out(uint8 addr, uint8 data) -> void = 0;
|
|
|
|
//serialization.cpp
|
|
virtual auto serialize(serializer&) -> void;
|
|
|
|
private:
|
|
bool _requested;
|
|
bool _granted;
|
|
};
|
|
|
|
virtual auto step(uint clocks) -> void = 0;
|
|
virtual auto synchronizing() const -> bool = 0;
|
|
|
|
//z80.cpp
|
|
auto power() -> void;
|
|
|
|
auto irq(bool maskable, uint16 vector = 0x0000, uint8 extbus = 0xff) -> bool;
|
|
auto parity(uint8) const -> bool;
|
|
|
|
//memory.cpp
|
|
auto yield() -> void;
|
|
auto wait(uint clocks = 1) -> void;
|
|
auto opcode() -> uint8;
|
|
auto operand() -> uint8;
|
|
auto operands() -> uint16;
|
|
auto push(uint16) -> void;
|
|
auto pop() -> uint16;
|
|
auto displace(uint16&) -> uint16;
|
|
auto read(uint16 addr) -> uint8;
|
|
auto write(uint16 addr, uint8 data) -> void;
|
|
auto in(uint8 addr) -> uint8;
|
|
auto out(uint8 addr, uint8 data) -> void;
|
|
|
|
//instruction.cpp
|
|
auto instruction() -> void;
|
|
auto instruction(uint8 code) -> void;
|
|
auto instructionCB(uint8 code) -> void;
|
|
auto instructionCBd(uint16 addr, uint8 code) -> void;
|
|
auto instructionED(uint8 code) -> void;
|
|
|
|
//algorithms.cpp
|
|
auto ADD(uint8, uint8, bool = false) -> uint8;
|
|
auto AND(uint8, uint8) -> uint8;
|
|
auto BIT(uint3, uint8) -> uint8;
|
|
auto DEC(uint8) -> uint8;
|
|
auto INC(uint8) -> uint8;
|
|
auto OR (uint8, uint8) -> uint8;
|
|
auto RES(uint3, uint8) -> uint8;
|
|
auto RL (uint8) -> uint8;
|
|
auto RLC(uint8) -> uint8;
|
|
auto RR (uint8) -> uint8;
|
|
auto RRC(uint8) -> uint8;
|
|
auto SET(uint3, uint8) -> uint8;
|
|
auto SLA(uint8) -> uint8;
|
|
auto SLL(uint8) -> uint8;
|
|
auto SRA(uint8) -> uint8;
|
|
auto SRL(uint8) -> uint8;
|
|
auto SUB(uint8, uint8, bool = false) -> uint8;
|
|
auto XOR(uint8, uint8) -> uint8;
|
|
|
|
//instructions.cpp
|
|
auto instructionADC_a_irr(uint16&) -> void;
|
|
auto instructionADC_a_n() -> void;
|
|
auto instructionADC_a_r(uint8&) -> void;
|
|
auto instructionADC_hl_rr(uint16&) -> void;
|
|
auto instructionADD_a_irr(uint16&) -> void;
|
|
auto instructionADD_a_n() -> void;
|
|
auto instructionADD_a_r(uint8&) -> void;
|
|
auto instructionADD_hl_rr(uint16&) -> void;
|
|
auto instructionAND_a_irr(uint16&) -> void;
|
|
auto instructionAND_a_n() -> void;
|
|
auto instructionAND_a_r(uint8&) -> void;
|
|
auto instructionBIT_o_irr(uint3, uint16&) -> void;
|
|
auto instructionBIT_o_irr_r(uint3, uint16&, uint8&) -> void;
|
|
auto instructionBIT_o_r(uint3, uint8&) -> void;
|
|
auto instructionCALL_c_nn(bool c) -> void;
|
|
auto instructionCALL_nn() -> void;
|
|
auto instructionCCF() -> void;
|
|
auto instructionCP_a_irr(uint16& x) -> void;
|
|
auto instructionCP_a_n() -> void;
|
|
auto instructionCP_a_r(uint8& x) -> void;
|
|
auto instructionCPD() -> void;
|
|
auto instructionCPDR() -> void;
|
|
auto instructionCPI() -> void;
|
|
auto instructionCPIR() -> void;
|
|
auto instructionCPL() -> void;
|
|
auto instructionDAA() -> void;
|
|
auto instructionDEC_irr(uint16&) -> void;
|
|
auto instructionDEC_r(uint8&) -> void;
|
|
auto instructionDEC_rr(uint16&) -> void;
|
|
auto instructionDI() -> void;
|
|
auto instructionDJNZ_e() -> void;
|
|
auto instructionEI() -> void;
|
|
auto instructionEX_irr_rr(uint16&, uint16&) -> void;
|
|
auto instructionEX_rr_rr(uint16&, uint16&) -> void;
|
|
auto instructionEXX() -> void;
|
|
auto instructionHALT() -> void;
|
|
auto instructionIM_o(uint2) -> void;
|
|
auto instructionIN_a_in() -> void;
|
|
auto instructionIN_r_ic(uint8&) -> void;
|
|
auto instructionINC_irr(uint16&) -> void;
|
|
auto instructionINC_r(uint8&) -> void;
|
|
auto instructionINC_rr(uint16&) -> void;
|
|
auto instructionIND() -> void;
|
|
auto instructionINDR() -> void;
|
|
auto instructionINI() -> void;
|
|
auto instructionINIR() -> void;
|
|
auto instructionJP_c_nn(bool) -> void;
|
|
auto instructionJP_rr(uint16&) -> void;
|
|
auto instructionJR_c_e(bool) -> void;
|
|
auto instructionLD_a_inn() -> void;
|
|
auto instructionLD_a_irr(uint16& x) -> void;
|
|
auto instructionLD_inn_a() -> void;
|
|
auto instructionLD_inn_rr(uint16&) -> void;
|
|
auto instructionLD_irr_a(uint16&) -> void;
|
|
auto instructionLD_irr_n(uint16&) -> void;
|
|
auto instructionLD_irr_r(uint16&, uint8&) -> void;
|
|
auto instructionLD_r_n(uint8&) -> void;
|
|
auto instructionLD_r_irr(uint8&, uint16&) -> void;
|
|
auto instructionLD_r_r(uint8&, uint8&) -> void;
|
|
auto instructionLD_r_r1(uint8&, uint8&) -> void;
|
|
auto instructionLD_rr_inn(uint16&) -> void;
|
|
auto instructionLD_rr_nn(uint16&) -> void;
|
|
auto instructionLD_sp_rr(uint16&) -> void;
|
|
auto instructionLDD() -> void;
|
|
auto instructionLDDR() -> void;
|
|
auto instructionLDI() -> void;
|
|
auto instructionLDIR() -> void;
|
|
auto instructionNEG() -> void;
|
|
auto instructionNOP() -> void;
|
|
auto instructionOR_a_irr(uint16&) -> void;
|
|
auto instructionOR_a_n() -> void;
|
|
auto instructionOR_a_r(uint8&) -> void;
|
|
auto instructionOTDR() -> void;
|
|
auto instructionOTIR() -> void;
|
|
auto instructionOUT_ic_r(uint8&) -> void;
|
|
auto instructionOUT_n_a() -> void;
|
|
auto instructionOUTD() -> void;
|
|
auto instructionOUTI() -> void;
|
|
auto instructionPOP_rr(uint16&) -> void;
|
|
auto instructionPUSH_rr(uint16&) -> void;
|
|
auto instructionRES_o_irr(uint3, uint16&) -> void;
|
|
auto instructionRES_o_irr_r(uint3, uint16&, uint8&) -> void;
|
|
auto instructionRES_o_r(uint3, uint8&) -> void;
|
|
auto instructionRET() -> void;
|
|
auto instructionRET_c(bool c) -> void;
|
|
auto instructionRETI() -> void;
|
|
auto instructionRETN() -> void;
|
|
auto instructionRL_irr(uint16&) -> void;
|
|
auto instructionRL_irr_r(uint16&, uint8&) -> void;
|
|
auto instructionRL_r(uint8&) -> void;
|
|
auto instructionRLA() -> void;
|
|
auto instructionRLC_irr(uint16&) -> void;
|
|
auto instructionRLC_irr_r(uint16&, uint8&) -> void;
|
|
auto instructionRLC_r(uint8&) -> void;
|
|
auto instructionRLCA() -> void;
|
|
auto instructionRLD() -> void;
|
|
auto instructionRR_irr(uint16&) -> void;
|
|
auto instructionRR_irr_r(uint16&, uint8&) -> void;
|
|
auto instructionRR_r(uint8&) -> void;
|
|
auto instructionRRA() -> void;
|
|
auto instructionRRC_irr(uint16&) -> void;
|
|
auto instructionRRC_irr_r(uint16&, uint8&) -> void;
|
|
auto instructionRRC_r(uint8&) -> void;
|
|
auto instructionRRCA() -> void;
|
|
auto instructionRRD() -> void;
|
|
auto instructionRST_o(uint3) -> void;
|
|
auto instructionSBC_a_irr(uint16&) -> void;
|
|
auto instructionSBC_a_n() -> void;
|
|
auto instructionSBC_a_r(uint8&) -> void;
|
|
auto instructionSBC_hl_rr(uint16&) -> void;
|
|
auto instructionSCF() -> void;
|
|
auto instructionSET_o_irr(uint3, uint16&) -> void;
|
|
auto instructionSET_o_irr_r(uint3, uint16&, uint8&) -> void;
|
|
auto instructionSET_o_r(uint3, uint8&) -> void;
|
|
auto instructionSLA_irr(uint16&) -> void;
|
|
auto instructionSLA_irr_r(uint16&, uint8&) -> void;
|
|
auto instructionSLA_r(uint8&) -> void;
|
|
auto instructionSLL_irr(uint16&) -> void;
|
|
auto instructionSLL_irr_r(uint16&, uint8&) -> void;
|
|
auto instructionSLL_r(uint8&) -> void;
|
|
auto instructionSRA_irr(uint16&) -> void;
|
|
auto instructionSRA_irr_r(uint16&, uint8&) -> void;
|
|
auto instructionSRA_r(uint8&) -> void;
|
|
auto instructionSRL_irr(uint16&) -> void;
|
|
auto instructionSRL_irr_r(uint16&, uint8&) -> void;
|
|
auto instructionSRL_r(uint8&) -> void;
|
|
auto instructionSUB_a_irr(uint16&) -> void;
|
|
auto instructionSUB_a_n() -> void;
|
|
auto instructionSUB_a_r(uint8&) -> void;
|
|
auto instructionXOR_a_irr(uint16&) -> void;
|
|
auto instructionXOR_a_n() -> void;
|
|
auto instructionXOR_a_r(uint8&) -> void;
|
|
|
|
//serialization.cpp
|
|
auto serialize(serializer&) -> void;
|
|
|
|
//disassembler.cpp
|
|
auto disassemble(uint16 pc) -> string;
|
|
auto disassemble(uint16 pc, uint8 prefix, uint8 code) -> string;
|
|
auto disassembleCB(uint16 pc, uint8 prefix, uint8 code) -> string;
|
|
auto disassembleCBd(uint16 pc, uint8 prefix, int8 d, uint8 code) -> string;
|
|
auto disassembleED(uint16 pc, uint8 prefix, uint8 code) -> string;
|
|
|
|
struct Registers {
|
|
union Pair {
|
|
Pair() : word(0) {}
|
|
uint16 word;
|
|
struct Byte { uint8 order_msb2(hi, lo); } byte;
|
|
};
|
|
|
|
Pair af, af_;
|
|
Pair bc, bc_;
|
|
Pair de, de_;
|
|
Pair hl, hl_;
|
|
Pair ix;
|
|
Pair iy;
|
|
Pair ir;
|
|
uint16 sp;
|
|
uint16 pc;
|
|
|
|
bool ei; //EI instruction executed
|
|
bool halt; //HALT instruction executed
|
|
bool iff1; //interrupt flip-flop 1
|
|
bool iff2; //interrupt flip-flop 2
|
|
uint2 im; //interrupt mode (0-2)
|
|
} r;
|
|
|
|
enum class Prefix : uint { hl, ix, iy } prefix = Prefix::hl;
|
|
|
|
Bus* bus = nullptr;
|
|
};
|
|
|
|
}
|