NINTV-DS/arm9/source/emucore/CP1610.h
2021-09-02 17:32:31 -04:00

160 lines
5.0 KiB
C++

#ifndef CP1610_H
#define CP1610_H
#include "Processor.h"
#include "SignalLine.h"
#include "MemoryBus.h"
#define CP1610_PIN_IN_INTRM 0
#define CP1610_PIN_IN_BUSRQ 1
#define CP1610_PIN_OUT_BUSAK 0
TYPEDEF_STRUCT_PACK( _CP1610State
{
INT8 S;
INT8 Z;
INT8 O;
INT8 C;
INT8 I;
INT8 D;
INT8 interruptible;
INT8 ext;
UINT16 interruptAddress;
UINT16 resetAddress;
UINT16 r[8];
} CP1610State; )
extern UINT8 interruptible;
class CP1610 : public Processor
{
public:
CP1610(MemoryBus* m, UINT16 resetAddress,
UINT16 interruptAddress);
//PowerConsumer functions
void resetProcessor();
//Processor functions
INT32 getClockSpeed();
INT32 tick(INT32);
BOOL isIdle() {
if (!pinIn[CP1610_PIN_IN_BUSRQ]->isHigh && interruptible) {
pinOut[CP1610_PIN_OUT_BUSAK]->isHigh = FALSE;
return TRUE;
}
else {
pinOut[CP1610_PIN_OUT_BUSAK]->isHigh = TRUE;
return FALSE;
}
}
#ifdef DEVELOPER_VERSION
UINT32 getDebugItemCount();
const CHAR* getDebugItemName(UINT32 i);
const UINT32 getDebugItemValue(UINT32 i);
//other debugging stuff
BOOL isCentralProcessor() { return TRUE; }
UINT32 decode(CHAR description[256], UINT32 memoryLocation);
UINT32 getProgramCounter();
#endif
CP1610State getState();
void setState(CP1610State state);
private:
void setIndirect(UINT16 register, UINT16 value);
UINT16 getIndirect(UINT16 register);
INT32 HLT();
INT32 SDBD();
INT32 EIS();
INT32 DIS();
INT32 TCI();
INT32 CLRC();
INT32 SETC();
INT32 J(UINT16 target);
INT32 JSR(UINT16 register, UINT16 target);
INT32 JE(UINT16 target);
INT32 JSRE(UINT16 register, UINT16 target);
INT32 JD(UINT16 target);
INT32 JSRD(UINT16 register, UINT16 target);
INT32 INCR(UINT16 register);
INT32 DECR(UINT16 register);
INT32 COMR(UINT16 register);
INT32 NEGR(UINT16 register);
INT32 ADCR(UINT16 register);
INT32 RSWD(UINT16 register);
INT32 GSWD(UINT16 register);
INT32 NOP(UINT16 twoOption);
INT32 SIN(UINT16 twoOption);
INT32 SWAP_1(UINT16 register);
INT32 SWAP_2(UINT16 register);
INT32 SLL_1(UINT16 register);
INT32 SLL_2(UINT16 register);
INT32 RLC_1(UINT16 register);
INT32 RLC_2(UINT16 register);
INT32 SLLC_1(UINT16 register);
INT32 SLLC_2(UINT16 register);
INT32 SLR_1(UINT16 register);
INT32 SLR_2(UINT16 register);
INT32 SAR_1(UINT16 register);
INT32 SAR_2(UINT16 register);
INT32 RRC_1(UINT16 register);
INT32 RRC_2(UINT16 register);
INT32 SARC_1(UINT16 register);
INT32 SARC_2(UINT16 register);
INT32 MOVR(UINT16 sourceReg, UINT16 destReg);
INT32 ADDR(UINT16 sourceReg, UINT16 destReg);
INT32 SUBR(UINT16 sourceReg, UINT16 destReg);
INT32 CMPR(UINT16 sourceReg, UINT16 destReg);
INT32 ANDR(UINT16 sourceReg, UINT16 destReg);
INT32 XORR(UINT16 sourceReg, UINT16 destReg);
INT32 BEXT(UINT16 condition, INT16 displacement);
INT32 B(INT16 displacement);
INT32 NOPP(INT16 displacement);
INT32 BC(INT16 displacement);
INT32 BNC(INT16 displacement);
INT32 BOV(INT16 displacement);
INT32 BNOV(INT16 displacement);
INT32 BPL(INT16 displacement);
INT32 BMI(INT16 displacement);
INT32 BEQ(INT16 displacement);
INT32 BNEQ(INT16 displacement);
INT32 BLT(INT16 displacement);
INT32 BGE(INT16 displacement);
INT32 BLE(INT16 displacement);
INT32 BGT(INT16 displacement);
INT32 BUSC(INT16 displacement);
INT32 BESC(INT16 displacement);
INT32 MVO(UINT16 register, UINT16 address);
INT32 MVO_ind(UINT16 registerWithAddress, UINT16 registerToMove);
INT32 MVI(UINT16 address, UINT16 register);
INT32 MVI_ind(UINT16 registerWithAddress, UINT16 registerToReceive);
INT32 ADD(UINT16 address, UINT16 register);
INT32 ADD_ind(UINT16 registerWithAddress, UINT16 registerToReceive);
INT32 SUB(UINT16 address, UINT16 register);
INT32 SUB_ind(UINT16 registerWithAddress, UINT16 registerToReceive);
INT32 CMP(UINT16 address, UINT16 register);
INT32 CMP_ind(UINT16 registerWithAddress, UINT16 registerToReceive);
INT32 AND(UINT16 address, UINT16 register);
INT32 AND_ind(UINT16 registerWithAddress, UINT16 registerToReceive);
INT32 XOR(UINT16 address, UINT16 register);
INT32 XOR_ind(UINT16 registerWithAddress, UINT16 registerToReceive);
INT32 decode(void);
//the mory bus
MemoryBus* memoryBus;
//interrupt address
UINT16 interruptAddress;
//reset address
UINT16 resetAddress;
};
#endif