mirror of https://github.com/bsnes-emu/bsnes.git
164 lines
5.6 KiB
C++
164 lines
5.6 KiB
C++
#pragma once
|
|
|
|
namespace Processor {
|
|
|
|
struct SPC700 {
|
|
virtual auto idle() -> void = 0;
|
|
virtual auto read(uint16 address) -> uint8 = 0;
|
|
virtual auto write(uint16 addessr, uint8 data) -> void = 0;
|
|
virtual auto synchronizing() const -> bool = 0;
|
|
|
|
virtual auto readDisassembler(uint16 address) -> uint8 { return 0; }
|
|
|
|
//spc700.cpp
|
|
auto power() -> void;
|
|
|
|
//memory.cpp
|
|
inline auto fetch() -> uint8;
|
|
inline auto load(uint8 address) -> uint8;
|
|
inline auto store(uint8 address, uint8 data) -> void;
|
|
inline auto pull() -> uint8;
|
|
inline auto push(uint8 data) -> void;
|
|
|
|
//instruction.cpp
|
|
auto instruction() -> void;
|
|
|
|
//algorithms.cpp
|
|
auto algorithmADC(uint8, uint8) -> uint8;
|
|
auto algorithmAND(uint8, uint8) -> uint8;
|
|
auto algorithmASL(uint8) -> uint8;
|
|
auto algorithmCMP(uint8, uint8) -> uint8;
|
|
auto algorithmDEC(uint8) -> uint8;
|
|
auto algorithmEOR(uint8, uint8) -> uint8;
|
|
auto algorithmINC(uint8) -> uint8;
|
|
auto algorithmLD (uint8, uint8) -> uint8;
|
|
auto algorithmLSR(uint8) -> uint8;
|
|
auto algorithmOR (uint8, uint8) -> uint8;
|
|
auto algorithmROL(uint8) -> uint8;
|
|
auto algorithmROR(uint8) -> uint8;
|
|
auto algorithmSBC(uint8, uint8) -> uint8;
|
|
auto algorithmADW(uint16, uint16) -> uint16;
|
|
auto algorithmCPW(uint16, uint16) -> uint16;
|
|
auto algorithmLDW(uint16, uint16) -> uint16;
|
|
auto algorithmSBW(uint16, uint16) -> uint16;
|
|
|
|
//instructions.cpp
|
|
using fps = auto (SPC700::*)(uint8) -> uint8;
|
|
using fpb = auto (SPC700::*)(uint8, uint8) -> uint8;
|
|
using fpw = auto (SPC700::*)(uint16, uint16) -> uint16;
|
|
|
|
auto instructionAbsoluteBitModify(uint3) -> void;
|
|
auto instructionAbsoluteBitSet(uint3, bool) -> void;
|
|
auto instructionAbsoluteRead(fpb, uint8&) -> void;
|
|
auto instructionAbsoluteModify(fps) -> void;
|
|
auto instructionAbsoluteWrite(uint8&) -> void;
|
|
auto instructionAbsoluteIndexedRead(fpb, uint8&) -> void;
|
|
auto instructionAbsoluteIndexedWrite(uint8&) -> void;
|
|
auto instructionBranch(bool) -> void;
|
|
auto instructionBranchBit(uint3, bool) -> void;
|
|
auto instructionBranchNotDirect() -> void;
|
|
auto instructionBranchNotDirectDecrement() -> void;
|
|
auto instructionBranchNotDirectX() -> void;
|
|
auto instructionBranchNotYDecrement() -> void;
|
|
auto instructionBreak() -> void;
|
|
auto instructionCallAbsolute() -> void;
|
|
auto instructionCallPage() -> void;
|
|
auto instructionCallTable(uint4) -> void;
|
|
auto instructionComplementCarry() -> void;
|
|
auto instructionDecimalAdjustAdd() -> void;
|
|
auto instructionDecimalAdjustSub() -> void;
|
|
auto instructionDirectRead(fpb, uint8&) -> void;
|
|
auto instructionDirectModify(fps) -> void;
|
|
auto instructionDirectWrite(uint8&) -> void;
|
|
auto instructionDirectDirectCompare(fpb) -> void;
|
|
auto instructionDirectDirectModify(fpb) -> void;
|
|
auto instructionDirectDirectWrite() -> void;
|
|
auto instructionDirectImmediateCompare(fpb) -> void;
|
|
auto instructionDirectImmediateModify(fpb) -> void;
|
|
auto instructionDirectImmediateWrite() -> void;
|
|
auto instructionDirectCompareWord(fpw) -> void;
|
|
auto instructionDirectReadWord(fpw) -> void;
|
|
auto instructionDirectModifyWord(int) -> void;
|
|
auto instructionDirectWriteWord() -> void;
|
|
auto instructionDirectIndexedRead(fpb, uint8&, uint8&) -> void;
|
|
auto instructionDirectIndexedModify(fps, uint8&) -> void;
|
|
auto instructionDirectIndexedWrite(uint8&, uint8&) -> void;
|
|
auto instructionDivide() -> void;
|
|
auto instructionExchangeNibble() -> void;
|
|
auto instructionFlagSet(bool&, bool) -> void;
|
|
auto instructionImmediateRead(fpb, uint8&) -> void;
|
|
auto instructionImpliedModify(fps, uint8&) -> void;
|
|
auto instructionIndexedIndirectRead(fpb, uint8&) -> void;
|
|
auto instructionIndexedIndirectWrite(uint8&, uint8&) -> void;
|
|
auto instructionIndirectIndexedRead(fpb, uint8&) -> void;
|
|
auto instructionIndirectIndexedWrite(uint8&, uint8&) -> void;
|
|
auto instructionIndirectXRead(fpb) -> void;
|
|
auto instructionIndirectXWrite(uint8&) -> void;
|
|
auto instructionIndirectXIncrementRead(uint8&) -> void;
|
|
auto instructionIndirectXIncrementWrite(uint8&) -> void;
|
|
auto instructionIndirectXCompareIndirectY(fpb) -> void;
|
|
auto instructionIndirectXWriteIndirectY(fpb) -> void;
|
|
auto instructionJumpAbsolute() -> void;
|
|
auto instructionJumpIndirectX() -> void;
|
|
auto instructionMultiply() -> void;
|
|
auto instructionNoOperation() -> void;
|
|
auto instructionOverflowClear() -> void;
|
|
auto instructionPull(uint8&) -> void;
|
|
auto instructionPullP() -> void;
|
|
auto instructionPush(uint8) -> void;
|
|
auto instructionReturnInterrupt() -> void;
|
|
auto instructionReturnSubroutine() -> void;
|
|
auto instructionStop() -> void;
|
|
auto instructionTestSetBitsAbsolute(bool) -> void;
|
|
auto instructionTransfer(uint8&, uint8&) -> void;
|
|
auto instructionWait() -> void;
|
|
|
|
//serialization.cpp
|
|
auto serialize(serializer&) -> void;
|
|
|
|
//disassembler.cpp
|
|
auto disassemble(uint16 address, bool p) -> string;
|
|
|
|
struct Flags {
|
|
bool c; //carry
|
|
bool z; //zero
|
|
bool i; //interrupt disable
|
|
bool h; //half-carry
|
|
bool b; //break
|
|
bool p; //page
|
|
bool v; //overflow
|
|
bool n; //negative
|
|
|
|
inline operator uint() const {
|
|
return c << 0 | z << 1 | i << 2 | h << 3 | b << 4 | p << 5 | v << 6 | n << 7;
|
|
}
|
|
|
|
inline auto& operator=(uint8 data) {
|
|
c = data.bit(0);
|
|
z = data.bit(1);
|
|
i = data.bit(2);
|
|
h = data.bit(3);
|
|
b = data.bit(4);
|
|
p = data.bit(5);
|
|
v = data.bit(6);
|
|
n = data.bit(7);
|
|
return *this;
|
|
}
|
|
};
|
|
|
|
struct Registers {
|
|
union Pair {
|
|
Pair() : w(0) {}
|
|
uint16 w;
|
|
struct Byte { uint8 order_lsb2(l, h); } byte;
|
|
} pc, ya;
|
|
uint8 x, s;
|
|
Flags p;
|
|
|
|
bool wait = false;
|
|
bool stop = false;
|
|
} r;
|
|
};
|
|
|
|
}
|