bsnes/higan/processor/wdc65816/wdc65816.hpp

259 lines
9.0 KiB
C++

//WDC 65C816 CPU core
//* Ricoh 5A22
//* Nintendo SA-1
#pragma once
namespace Processor {
struct WDC65816 {
virtual auto idle() -> void = 0;
virtual auto read(uint24 addr) -> uint8 = 0;
virtual auto write(uint24 addr, uint8 data) -> void = 0;
virtual auto lastCycle() -> void = 0;
virtual auto interruptPending() const -> bool = 0;
virtual auto interrupt() -> void;
virtual auto synchronizing() const -> bool = 0;
virtual auto readDisassembler(uint24 addr) -> uint8 { return 0; }
//wdc65816.cpp
auto power() -> void;
//memory.cpp
inline auto idleIRQ() -> void;
inline auto idle2() -> void;
inline auto idle4(uint16 x, uint16 y) -> void;
inline auto idle6(uint16 addr) -> void;
inline auto fetch() -> uint8;
inline auto pull() -> uint8;
auto push(uint8 data) -> void;
inline auto pullN() -> uint8;
inline auto pushN(uint8 data) -> void;
inline auto readDirect(uint addr) -> uint8;
inline auto writeDirect(uint addr, uint8 data) -> void;
inline auto readDirectN(uint addr) -> uint8;
inline auto readBank(uint addr) -> uint8;
inline auto writeBank(uint addr, uint8 data) -> void;
inline auto readStack(uint addr) -> uint8;
inline auto writeStack(uint addr, uint8 data) -> void;
//algorithms.cpp
using alu8 = auto (WDC65816::*)(uint8) -> uint8;
using alu16 = auto (WDC65816::*)(uint16) -> uint16;
auto algorithmADC8(uint8) -> uint8;
auto algorithmADC16(uint16) -> uint16;
auto algorithmAND8(uint8) -> uint8;
auto algorithmAND16(uint16) -> uint16;
auto algorithmASL8(uint8) -> uint8;
auto algorithmASL16(uint16) -> uint16;
auto algorithmBIT8(uint8) -> uint8;
auto algorithmBIT16(uint16) -> uint16;
auto algorithmCMP8(uint8) -> uint8;
auto algorithmCMP16(uint16) -> uint16;
auto algorithmCPX8(uint8) -> uint8;
auto algorithmCPX16(uint16) -> uint16;
auto algorithmCPY8(uint8) -> uint8;
auto algorithmCPY16(uint16) -> uint16;
auto algorithmDEC8(uint8) -> uint8;
auto algorithmDEC16(uint16) -> uint16;
auto algorithmEOR8(uint8) -> uint8;
auto algorithmEOR16(uint16) -> uint16;
auto algorithmINC8(uint8) -> uint8;
auto algorithmINC16(uint16) -> uint16;
auto algorithmLDA8(uint8) -> uint8;
auto algorithmLDA16(uint16) -> uint16;
auto algorithmLDX8(uint8) -> uint8;
auto algorithmLDX16(uint16) -> uint16;
auto algorithmLDY8(uint8) -> uint8;
auto algorithmLDY16(uint16) -> uint16;
auto algorithmLSR8(uint8) -> uint8;
auto algorithmLSR16(uint16) -> uint16;
auto algorithmORA8(uint8) -> uint8;
auto algorithmORA16(uint16) -> uint16;
auto algorithmROL8(uint8) -> uint8;
auto algorithmROL16(uint16) -> uint16;
auto algorithmROR8(uint8) -> uint8;
auto algorithmROR16(uint16) -> uint16;
auto algorithmSBC8(uint8) -> uint8;
auto algorithmSBC16(uint16) -> uint16;
auto algorithmTRB8(uint8) -> uint8;
auto algorithmTRB16(uint16) -> uint16;
auto algorithmTSB8(uint8) -> uint8;
auto algorithmTSB16(uint16) -> uint16;
//instructions-read.cpp
auto instructionImmediateRead8(alu8) -> void;
auto instructionImmediateRead16(alu16) -> void;
auto instructionBankRead8(alu8) -> void;
auto instructionBankRead16(alu16) -> void;
auto instructionBankRead8(alu8, uint16) -> void;
auto instructionBankRead16(alu16, uint16) -> void;
auto instructionLongRead8(alu8, uint16 = 0) -> void;
auto instructionLongRead16(alu16, uint16 = 0) -> void;
auto instructionDirectRead8(alu8) -> void;
auto instructionDirectRead16(alu16) -> void;
auto instructionDirectRead8(alu8, uint16) -> void;
auto instructionDirectRead16(alu16, uint16) -> void;
auto instructionIndirectRead8(alu8) -> void;
auto instructionIndirectRead16(alu16) -> void;
auto instructionIndexedIndirectRead8(alu8) -> void;
auto instructionIndexedIndirectRead16(alu16) -> void;
auto instructionIndirectIndexedRead8(alu8) -> void;
auto instructionIndirectIndexedRead16(alu16) -> void;
auto instructionIndirectLongRead8(alu8, uint16 = 0) -> void;
auto instructionIndirectLongRead16(alu16, uint16 = 0) -> void;
auto instructionStackRead8(alu8) -> void;
auto instructionStackRead16(alu16) -> void;
auto instructionIndirectStackRead8(alu8) -> void;
auto instructionIndirectStackRead16(alu16) -> void;
//instructions-write.cpp
auto instructionBankWrite8(uint16&) -> void;
auto instructionBankWrite16(uint16&) -> void;
auto instructionBankWrite8(uint16&, uint16) -> void;
auto instructionBankWrite16(uint16&, uint16) -> void;
auto instructionLongWrite8(uint16 = 0) -> void;
auto instructionLongWrite16(uint16 = 0) -> void;
auto instructionDirectWrite8(uint16&) -> void;
auto instructionDirectWrite16(uint16&) -> void;
auto instructionDirectWrite8(uint16&, uint16) -> void;
auto instructionDirectWrite16(uint16&, uint16) -> void;
auto instructionIndirectWrite8() -> void;
auto instructionIndirectWrite16() -> void;
auto instructionIndexedIndirectWrite8() -> void;
auto instructionIndexedIndirectWrite16() -> void;
auto instructionIndirectIndexedWrite8() -> void;
auto instructionIndirectIndexedWrite16() -> void;
auto instructionIndirectLongWrite8(uint16 = 0) -> void;
auto instructionIndirectLongWrite16(uint16 = 0) -> void;
auto instructionStackWrite8() -> void;
auto instructionStackWrite16() -> void;
auto instructionIndirectStackWrite8() -> void;
auto instructionIndirectStackWrite16() -> void;
//instructions-modify.cpp
auto instructionImpliedModify8(alu8, uint16&) -> void;
auto instructionImpliedModify16(alu16, uint16&) -> void;
auto instructionBankModify8(alu8) -> void;
auto instructionBankModify16(alu16) -> void;
auto instructionBankIndexedModify8(alu8) -> void;
auto instructionBankIndexedModify16(alu16) -> void;
auto instructionDirectModify8(alu8) -> void;
auto instructionDirectModify16(alu16) -> void;
auto instructionDirectIndexedModify8(alu8) -> void;
auto instructionDirectIndexedModify16(alu16) -> void;
//instructions-pc.cpp
auto instructionBranch(bool = 1) -> void;
auto instructionBRL() -> void;
auto instructionJMPShort() -> void;
auto instructionJMPLong() -> void;
auto instructionJMPIndirect() -> void;
auto instructionJMPIndexedIndirect() -> void;
auto instructionJMPIndirectLong() -> void;
auto instructionJSRShort() -> void;
auto instructionJSRLong() -> void;
auto instructionJSRIndexedIndirect() -> void;
auto instructionRTI() -> void;
auto instructionRTS() -> void;
auto instructionRTL() -> void;
//instructions-misc.cpp
auto instructionBITImmediate8() -> void;
auto instructionBITImmediate16() -> void;
auto instructionNOP() -> void;
auto instructionWDM() -> void;
auto instructionXBA() -> void;
auto instructionBlockMove8(int) -> void;
auto instructionBlockMove16(int) -> void;
auto instructionInterrupt(uint16) -> void;
auto instructionSTP() -> void;
auto instructionWAI() -> void;
auto instructionXCE() -> void;
auto instructionSetFlag(bool&) -> void;
auto instructionClearFlag(bool&) -> void;
auto instructionREP() -> void;
auto instructionSEP() -> void;
auto instructionTransfer8(uint16&, uint16&) -> void;
auto instructionTransfer16(uint16&, uint16&) -> void;
auto instructionTCS() -> void;
auto instructionTSX8() -> void;
auto instructionTSX16() -> void;
auto instructionTXS() -> void;
auto instructionPush8(uint8) -> void;
auto instructionPush16(uint16) -> void;
auto instructionPHD() -> void;
auto instructionPull8(uint16&) -> void;
auto instructionPull16(uint16&) -> void;
auto instructionPLD() -> void;
auto instructionPLB() -> void;
auto instructionPLP() -> void;
auto instructionPEA() -> void;
auto instructionPEI() -> void;
auto instructionPER() -> void;
//instruction.cpp
auto instruction() -> void;
//serialization.cpp
auto serialize(serializer&) -> void;
//disassembler.cpp
auto disassemble() -> string;
auto disassemble(uint24 addr, bool e, bool m, bool x) -> string;
auto dreadb(uint24 addr) -> uint8;
auto dreadw(uint24 addr) -> uint16;
auto dreadl(uint24 addr) -> uint24;
auto decode(uint8 mode, uint24 addr) -> uint24;
struct Flags {
bool c; //carry
bool z; //zero
bool i; //interrupt disable
bool d; //decimal mode
bool x; //index register mode
bool m; //accumulator mode
bool v; //overflow
bool n; //negative
inline operator uint() const {
return c << 0 | z << 1 | i << 2 | d << 3 | x << 4 | m << 5 | v << 6 | n << 7;
}
inline auto& operator=(uint8 data) {
c = data.bit(0);
z = data.bit(1);
i = data.bit(2);
d = data.bit(3);
x = data.bit(4);
m = data.bit(5);
v = data.bit(6);
n = data.bit(7);
return *this;
}
};
struct Registers {
uint24 pc;
uint16 a;
uint16 x;
uint16 y;
uint16 z;
uint16 s;
uint16 d;
uint8 b;
Flags p;
bool e = false;
bool irq = false; //IRQ pin (0 = low, 1 = trigger)
bool wai = false; //raised during wai, cleared after interrupt triggered
bool stp = false; //raised during stp, never cleared
uint8 mdr; //memory data register
uint16 vector; //interrupt vector address
} r;
};
}