bsnes-plus/bsnes/snes/chip/cx4/cx4.hpp
2018-11-24 00:24:43 -05:00

125 lines
2.5 KiB
C++

#include "bus.hpp"
class Cx4 : public Coprocessor, public Memory {
public:
unsigned frequency;
static void Enter();
void enter();
//memory.cpp
uint8 read(unsigned addr);
void write(unsigned addr, uint8 data);
uint8 rom_read(unsigned addr);
uint8 ram_read(unsigned addr);
void ram_write(unsigned addr, uint8 data);
void init();
void enable();
void power();
void reset();
void serialize(serializer&);
//data.cpp
static const uint24 dataROM[1024];
protected:
void add_clocks(unsigned);
//memory.cpp
uint8 op_read(unsigned addr);
void op_write(unsigned addr, uint8 data);
uint8 dsp_read(unsigned addr);
void dsp_write(unsigned addr, uint8 data);
void push();
void pull();
unsigned sa();
unsigned ri();
unsigned np();
void instruction();
void nextpc();
void change_page();
void load_page(uint8 cachePage, uint16 programPage);
//registers.cpp
uint24 register_read(uint8 addr);
void register_write(uint8 addr, uint24 data);
uint8 dataRAM[3072];
struct Registers {
bool halt;
uint8 cachePage;
bool irqPending;
uint24 rwbusaddr;
uint8 rwbustime;
bool writebus;
uint24 writebusdata;
uint23 pc;
uint15 p;
bool n;
bool z;
bool v;
bool c;
uint24 a;
uint24 acch;
uint24 accl;
uint24 busdata;
uint24 romdata;
uint24 ramdata;
uint24 busaddr;
uint24 ramaddr;
uint24 gpr[16];
uint24 mdr;
} regs;
uint23 stack[8];
uint16 opcode;
struct MMIO {
bool dma; //true during DMA transfers
bool suspend;
bool cacheLoading;
uint24 dmaSource; //$1f40-$1f42
uint24 dmaLength; //$1f43-$1f44
uint24 dmaTarget; //$1f45-$1f47
uint8 cachePreload; //$1f48
uint24 programOffset; //$1f49-$1f4b
uint16 pageNumber; //$1f4d-$1f4e
uint8 programCounter; //$1f4f
uint8 romSpeed; //$1f50
uint8 ramSpeed; //$1f50
uint8 irqDisable; //$1f51
uint8 r1f52; //$1f52
uint8 suspendCycles; //$1f55-$1f5c
uint8 vector[32]; //$1f60-$1f7f
} mmio;
struct CachePage {
bool lock;
uint15 pageNumber;
uint16 data[256];
} cache[2];
alwaysinline bool bus_access() {
// cartridge bus in use
return mmio.dma || mmio.cacheLoading || regs.rwbustime > 0;
}
alwaysinline bool busy() {
// performing DMA, cache preload, or running code
return mmio.dma || mmio.cacheLoading || !regs.halt;
}
};
extern Cx4 cx4;
extern Cx4Bus cx4bus;