|

楼主 |
发表于 2016-3-17 12:13:53
|
显示全部楼层
- // == < cpu.c > ========================================================
- // easy way to emu 2a03 chip
- //
- #ifdef _MSC_VER
- #include "inttypes.h"
- #else
- #include <inttypes.h>
- #endif
- struct _2a03_cpu
- {
- uint8_t a;
- uint8_t x;
- uint8_t y;
- uint8_t p;
- uint8_t s;
- uint16_t pc;
- uint8_t unused8[8];
- uint16_t unused16[4];
- uint8_t ram[0x0800];
- int32_t dma_cycles;
- int32_t int_signal;
- int32_t int_pending;
- // IRQ_LIST irq_pending_list
- };
- static struct _2a03_cpu cpu;
- #define IRQ_FLAG 1
- #define NMI_FLAG 2
- #define A cpu.a // A
- #define X cpu.x // X
- #define Y cpu.y // Y
- #define S cpu.s // S
- #define P cpu.p // P
- #define PC cpu.pc // PC
- #define PC_LO ((uint8_t *)&cpu.pc)[0] // PC low 8 bit
- #define PC_HI ((uint8_t *)&cpu.pc)[1] // PC high 8 bit
- #define A8T cpu.unused8[0] // for ZERO X, Y. addr8_temp
- #define A8R cpu.unused8[1] // for ZERO PAGE. addr8_real
- #define ALU8V cpu.unused8[2] // for operate
- #define VALUE cpu.unused8[3] // for get value from address/imm
- #define X_FIELD cpu.unused8[4] // opcode low 4 bit
- #define Y_FIELD cpu.unused8[5] // opcode high 4 bit
- #define SX_FIELD cpu.unused8[6] // X_FIELD's sign bit
- #define SY_FIELD cpu.unused8[7] // Y_FIELD's sign bit
- // We always use the little-endian CPU, isn't it?
- #define A16T cpu.unused16[0] // for ABS X, Y, IRY. addr16_temp
- #define A16T_LO ((uint8_t *)&cpu.unused16[0])[0] // for ABS X, Y, IRY
- #define A16T_HI ((uint8_t *)&cpu.unused16[0])[1] // for ABS X, Y, IRY
- #define A16R cpu.unused16[1] // for ASB, ABS X, Y, IRY, XIR. addr16_real
- #define A16R_LO ((uint8_t *)&cpu.unused16[1])[0] // for ASB, ABS X, Y, IRY, XIR
- #define A16R_HI ((uint8_t *)&cpu.unused16[1])[1]// for ASB, ABS X, Y, IRY, XIR
- #define ALU16V cpu.unused8[2] // for operate
- #define ALU16V_LO ((uint8_t *)&cpu.unused16[2])[0] // for operate
- #define ALU16V_HI ((uint8_t *)&cpu.unused16[2])[1] // for operate
- #define FPRG ((uint8_t *)&cpu.unused16[3])[0] // first opcode
- #define RAM cpu.ram // 2k ram
- #define MMU_READ mm_read // mmu read
- #define MMU_WRITE mm_write // mmu write
- #define C_FLAG (1 << 0)
- #define Z_FLAG (1 << 1)
- #define I_FLAG (1 << 2)
- #define D_FLAG (1 << 3)
- #define B_FLAG (1 << 4)
- #define R_FLAG (1 << 5)
- #define V_FLAG (1 << 6)
- #define N_FLAG (1 << 7)
- #define NMI_VECTOR 0xFFFA // NMI
- #define RES_VECTOR 0xFFFC // Reset
- #define IRQ_VECTOR 0xFFFE // IRQ
- #define STACK(x) cpu.ram[0x100+(x)]
- #define CLR_FLAG(x) \
- do { \
- P &= ~(x); \
- } while(0)
- #define SET_FLAG(x) \
- do { \
- P |= (x); \
- } while(0)
- #define RESET_ZN(x) \
- do { \
- CLR_FLAG(N_FLAG|Z_FLAG); \
- P |= zn_table[(x)]; \
- } while(0)
-
- typedef void(*__iiq_lea)(void);
- typedef void(*__iiq_read)(void);
- // ============== < extern symbols > ====================
- extern uint8_t MMU_READ(uint16_t address);
- extern void MMU_WRITE(uint16_t address, uint8_t value);
- // ------------------- table ------------------------
- static const uint8_t zn_table[256] =
- {
- 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128
- };
- static const uint8_t cpu_cycles[256] =
- {
- /*-- 0 1 2 3 4 5 6 7 8 9 A B C D E F --*/
- /*0*/ 2, 6, 0, 8, 3, 3, 5, 5, 3, 2, 2, 2, 4, 4, 6, 6, /*0*/
- /*1*/ 2, 5, 0, 8, 4, 4, 6, 6, 2, 4, 2, 7, 4, 4, 7, 7, /*1*/
- /*2*/ 6, 6, 0, 8, 3, 3, 5, 5, 4, 2, 2, 2, 4, 4, 6, 6, /*2*/
- /*3*/ 2, 5, 0, 8, 4, 4, 6, 6, 2, 4, 2, 7, 4, 4, 7, 7, /*3*/
- /*4*/ 6, 6, 0, 8, 3, 3, 5, 5, 3, 2, 2, 2, 3, 4, 6, 6, /*4*/
- /*5*/ 2, 5, 0, 8, 4, 4, 6, 6, 2, 4, 2, 7, 4, 4, 7, 7, /*5*/
- /*6*/ 6, 6, 0, 8, 3, 3, 5, 5, 4, 2, 2, 2, 5, 4, 6, 6, /*6*/
- /*7*/ 2, 5, 0, 8, 4, 4, 6, 6, 2, 4, 2, 7, 4, 4, 7, 7, /*7*/
- /*8*/ 2, 6, 2, 6, 3, 3, 3, 3, 2, 2, 2, 2, 4, 4, 4, 4, /*8*/
- /*9*/ 2, 6, 0, 6, 4, 4, 4, 4, 2, 5, 2, 5, 5, 5, 5, 5, /*9*/
- /*A*/ 2, 6, 2, 6, 3, 3, 3, 3, 2, 2, 2, 2, 4, 4, 4, 4, /*A*/
- /*B*/ 2, 5, 0, 5, 4, 4, 4, 4, 2, 4, 2, 4, 4, 4, 4, 4, /*B*/
- /*C*/ 2, 6, 2, 8, 3, 3, 5, 5, 2, 2, 2, 2, 4, 4, 6, 6, /*C*/
- /*D*/ 2, 5, 0, 8, 4, 4, 6, 6, 2, 4, 2, 7, 4, 4, 7, 7, /*D*/
- /*E*/ 2, 6, 2, 8, 3, 3, 5, 5, 2, 2, 2, 2, 4, 4, 6, 6, /*E*/
- /*F*/ 2, 5, 0, 8, 4, 4, 6, 6, 2, 4, 2, 7, 4, 4, 7, 7 /*F*/
- /*-- 0 1 2 3 4 5 6 7 8 9 A B C D E F --*/
- };
- // ------------------ < addressing > --------------------------------
- static void L_IM(void) { }
- static void L_ZD(void) { A16R_LO = MMU_READ(PC++); A16R_HI = 0; }
- static void L_ZX(void) { A16T_LO = MMU_READ(PC++); A16R_HI = 0; A16R_LO = A16T_LO + X; }
- static void L_ZY(void) { A16T_LO = MMU_READ(PC++); A16R_HI = 0; A16R_LO = A16T_LO + Y; }
- static void L_AB(void) { A16R_LO = MMU_READ(PC++); A16R_HI = MMU_READ(PC++); }
- static void L_AX(void) { A16T_LO = MMU_READ(PC++); A16T_HI = MMU_READ(PC++); A16R = A16T + X; }
- static void L_AY(void) { A16T_LO = MMU_READ(PC++); A16T_HI = MMU_READ(PC++); A16R = A16T + Y; }
- static void L_XI(void) { A16T_LO = MMU_READ(PC++); A16T_HI = A16T_LO + X; A16R_LO = RAM[A16T_HI]; A16R_HI = RAM[A16T_HI+1]; }
- static void L_IY(void) { A16T_LO = MMU_READ(PC++); A16T_HI = RAM[A16T_LO+1]; A16T_LO = RAM[A16T_LO]; A16R = A16T + Y; }
- static void IM(void) { VALUE = MMU_READ(PC++); }
- static void ZD(void) { L_ZD(); VALUE = MMU_READ(A16R); }
- static void ZX(void) { L_ZX(); VALUE = MMU_READ(A16R); }
- static void ZY(void) { L_ZY(); VALUE = MMU_READ(A16R); }
- static void AB(void) { L_AB(); VALUE = MMU_READ(A16R); }
- static void AX(void) { L_AX(); VALUE = MMU_READ(A16R); }
- static void AY(void) { L_AY(); VALUE = MMU_READ(A16R); }
- static void XI(void) { L_XI(); VALUE = MMU_READ(A16R); }
- static void IY(void) { L_IY(); VALUE = MMU_READ(A16R); }
- static __iiq_lea call_lea[9] = { L_XI, L_ZD, L_IM, L_AB, L_IY, L_ZX, L_AY, L_AX, L_ZY };
- static __iiq_read call_read[9] = { XI, ZD, IM, AB, IY, ZX, AY, AX, ZY };
- void set_dma_cycles(int32_t cycles, int forced)
- {
- if (forced)
-
- cpu.dma_cycles = cycles;
-
- else
-
- cpu.dma_cycles+= cycles;
- }
- int _nmi_pending_status (void) { return (cpu.int_pending & NMI_FLAG); }
- int _irq_pending_status (void) { return (cpu.int_pending & IRQ_FLAG); }
- void _nmi_pending_set (void) { cpu.int_pending |= NMI_FLAG; }
- void _irq_pending_set (void) { cpu.int_pending |= IRQ_FLAG; }
- void _nmi_pending_clr (void) { cpu.int_pending &= ~NMI_FLAG; }
- void _irq_pending_clr (void) { cpu.int_pending &= ~IRQ_FLAG; }
- int _nmi_signal_status (void) { return (cpu.int_signal & NMI_FLAG); }
- int _irq_signal_status (void) { return (cpu.int_signal & IRQ_FLAG); }
- void _nmi_signal_set (void) { cpu.int_signal |= NMI_FLAG; }
- void _irq_signal_set (void) { cpu.int_signal |= IRQ_FLAG; }
- void _nmi_signal_clr (void) { cpu.int_signal &= ~NMI_FLAG; }
- void _irq_signal_clr (void) { cpu.int_signal &= ~IRQ_FLAG; }
- void fast_irq_proc (void)
- {
-
- }
- void fast_nmi_proc (void)
- {
-
- }
复制代码 |
|