#pragma once
#include <cstdint>
struct memoryMap
{
uint8_t *address;
uint32_t mask;
};
union reg_pair
{
struct
{
#ifdef WORDS_BIGENDIAN
uint8_t B3;
uint8_t B2;
uint8_t B1;
uint8_t B0;
#else
uint8_t B0;
uint8_t B1;
uint8_t B2;
uint8_t B3;
#endif
} B;
struct
{
#ifdef WORDS_BIGENDIAN
uint16_t W1;
uint16_t W0;
#else
uint16_t W0;
uint16_t W1;
#endif
} W;
#ifdef WORDS_BIGENDIAN
volatile uint32_t I;
#else
uint32_t I;
#endif
};
extern memoryMap map[256];
extern reg_pair reg[45];
extern uint8_t biosProtected[4];
extern bool N_FLAG;
extern bool Z_FLAG;
extern bool C_FLAG;
extern bool V_FLAG;
extern bool armIrqEnable;
extern bool armState;
extern int armMode;
int CPULoadRom();
void CPUUpdateRegister(uint32_t, uint16_t);
void CPUInit();
void CPUReset();
void CPULoop(int);
void CPUCheckDMA(int, int);
enum
{
R13_IRQ = 18,
R14_IRQ,
SPSR_IRQ,
R13_USR = 26,
R14_USR,
R13_SVC,
R14_SVC,
SPSR_SVC,
R13_ABT,
R14_ABT,
SPSR_ABT,
R13_UND,
R14_UND,
SPSR_UND,
R8_FIQ,
R9_FIQ,
R10_FIQ,
R11_FIQ,
R12_FIQ,
R13_FIQ,
R14_FIQ,
SPSR_FIQ
};
#include "Globals.h"