mirror of https://github.com/bsnes-emu/bsnes.git
154 lines
4.8 KiB
C++
154 lines
4.8 KiB
C++
//Hudson Soft HuC6280
|
|
|
|
#pragma once
|
|
|
|
namespace Processor {
|
|
|
|
struct HuC6280 {
|
|
virtual auto step(uint clocks) -> void = 0;
|
|
virtual auto read(uint8 bank, uint13 addr) -> uint8 = 0;
|
|
virtual auto write(uint8 bank, uint13 addr, uint8 data) -> void = 0;
|
|
virtual auto store(uint2 addr, uint8 data) -> void = 0;
|
|
virtual auto lastCycle() -> void = 0;
|
|
|
|
//huc6280.cpp
|
|
auto power() -> void;
|
|
|
|
//memory.cpp
|
|
inline auto load8(uint8) -> uint8;
|
|
inline auto load16(uint16) -> uint8;
|
|
inline auto store8(uint8, uint8) -> void;
|
|
inline auto store16(uint16, uint8) -> void;
|
|
|
|
auto io() -> void;
|
|
auto opcode() -> uint8;
|
|
auto operand() -> uint8;
|
|
|
|
auto push(uint8) -> void;
|
|
auto pull() -> uint8;
|
|
|
|
//instructions.cpp
|
|
using fp = auto (HuC6280::*)(uint8) -> uint8;
|
|
auto algorithmADC(uint8) -> uint8;
|
|
auto algorithmAND(uint8) -> uint8;
|
|
auto algorithmASL(uint8) -> uint8;
|
|
auto algorithmBIT(uint8) -> uint8;
|
|
auto algorithmCMP(uint8) -> uint8;
|
|
auto algorithmCPX(uint8) -> uint8;
|
|
auto algorithmCPY(uint8) -> uint8;
|
|
auto algorithmDEC(uint8) -> uint8;
|
|
auto algorithmEOR(uint8) -> uint8;
|
|
auto algorithmINC(uint8) -> uint8;
|
|
auto algorithmLD (uint8) -> uint8;
|
|
auto algorithmLSR(uint8) -> uint8;
|
|
auto algorithmORA(uint8) -> uint8;
|
|
auto algorithmROL(uint8) -> uint8;
|
|
auto algorithmROR(uint8) -> uint8;
|
|
auto algorithmSBC(uint8) -> uint8;
|
|
auto algorithmTRB(uint8) -> uint8;
|
|
auto algorithmTSB(uint8) -> uint8;
|
|
|
|
using bp = auto (HuC6280::*)(uint16&, uint16&, bool) -> void;
|
|
auto algorithmTAI(uint16&, uint16&, bool) -> void;
|
|
auto algorithmTDD(uint16&, uint16&, bool) -> void;
|
|
auto algorithmTIA(uint16&, uint16&, bool) -> void;
|
|
auto algorithmTII(uint16&, uint16&, bool) -> void;
|
|
auto algorithmTIN(uint16&, uint16&, bool) -> void;
|
|
|
|
//instruction.cpp
|
|
auto interrupt(uint16 vector) -> void;
|
|
auto instruction() -> void;
|
|
|
|
//instructions.cpp
|
|
auto instructionAbsoluteModify(fp, uint8 = 0) -> void;
|
|
auto instructionAbsoluteRead(fp, uint8&, uint8 = 0) -> void;
|
|
auto instructionAbsoluteWrite(uint8, uint8 = 0) -> void;
|
|
auto instructionBlockMove(bp) -> void;
|
|
auto instructionBranch(bool) -> void;
|
|
auto instructionBranchIfBitReset(uint3) -> void;
|
|
auto instructionBranchIfBitSet(uint3) -> void;
|
|
auto instructionBranchSubroutine() -> void;
|
|
auto instructionBreak() -> void;
|
|
auto instructionCallAbsolute() -> void;
|
|
auto instructionChangeSpeedLow() -> void;
|
|
auto instructionChangeSpeedHigh() -> void;
|
|
auto instructionClear(uint8&) -> void;
|
|
auto instructionClear(bool&) -> void;
|
|
auto instructionImmediate(fp, uint8&) -> void;
|
|
auto instructionImplied(fp, uint8&) -> void;
|
|
auto instructionIndirectRead(fp, uint8&, uint8 = 0) -> void;
|
|
auto instructionIndirectWrite(uint8, uint8 = 0) -> void;
|
|
auto instructionIndirectYRead(fp, uint8&) -> void;
|
|
auto instructionIndirectYWrite(uint8) -> void;
|
|
auto instructionJumpAbsolute() -> void;
|
|
auto instructionJumpIndirect(uint8 = 0) -> void;
|
|
auto instructionMemory(fp) -> void;
|
|
auto instructionNoOperation() -> void;
|
|
auto instructionPull(uint8&) -> void;
|
|
auto instructionPullP() -> void;
|
|
auto instructionPush(uint8) -> void;
|
|
auto instructionResetMemoryBit(uint3) -> void;
|
|
auto instructionReturnInterrupt() -> void;
|
|
auto instructionReturnSubroutine() -> void;
|
|
auto instructionSet(bool&) -> void;
|
|
auto instructionSetMemoryBit(uint3) -> void;
|
|
auto instructionStoreImplied(uint2) -> void;
|
|
auto instructionSwap(uint8&, uint8&) -> void;
|
|
auto instructionTestAbsolute(uint8 = 0) -> void;
|
|
auto instructionTestZeroPage(uint8 = 0) -> void;
|
|
auto instructionTransfer(uint8&, uint8&) -> void;
|
|
auto instructionTransferAccumulatorToMPR() -> void;
|
|
auto instructionTransferMPRToAccumulator() -> void;
|
|
auto instructionTransferXS() -> void;
|
|
auto instructionZeroPageModify(fp, uint8 = 0) -> void;
|
|
auto instructionZeroPageRead(fp, uint8&, uint8 = 0) -> void;
|
|
auto instructionZeroPageWrite(uint8, uint8 = 0) -> void;
|
|
|
|
//disassembler.cpp
|
|
auto disassemble(uint16 pc) -> string;
|
|
|
|
//serialization.cpp
|
|
auto serialize(serializer&) -> void;
|
|
|
|
struct Flags {
|
|
bool c; //carry
|
|
bool z; //zero
|
|
bool i; //interrupt disable
|
|
bool d; //decimal mode
|
|
bool b; //break
|
|
bool t; //memory operation
|
|
bool v; //overflow
|
|
bool n; //negative
|
|
|
|
inline operator uint8() const {
|
|
return c << 0 | z << 1 | i << 2 | d << 3 | b << 4 | t << 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);
|
|
b = data.bit(4);
|
|
t = data.bit(5);
|
|
v = data.bit(6);
|
|
n = data.bit(7);
|
|
return *this;
|
|
}
|
|
};
|
|
|
|
struct Registers {
|
|
uint8 a;
|
|
uint8 x;
|
|
uint8 y;
|
|
uint8 s;
|
|
uint16 pc;
|
|
uint8 mpr[8];
|
|
uint8 mdr;
|
|
Flags p;
|
|
uint8 cs; //code speed (3 = fast, 12 = slow)
|
|
} r;
|
|
};
|
|
|
|
}
|