FDS fixed for asm core
[fceu.git] / x6502.h
CommitLineData
c62d2810 1/* FCE Ultra - NES/Famicom Emulator
2 *
3 * Copyright notice for this file:
4 * Copyright (C) 2002 Ben Parnell
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 */
20
21typedef struct {
22 int32 count; /* Cycle counter */
23 int32 tcount; /* Temporary cycle counter */
24 uint16 PC; /* I'll change this to uint32 later... */
25 /* I'll need to AND PC after increments to 0xFFFF */
26 /* when I do, though. Perhaps an IPC() macro? */
92e249b1 27 uint8 A,X,Y,S,P,mooPI;
c62d2810 28 uint8 DB; /* Data bus "cache" for reads from certain areas */
29 uint8 IRQlow; /* Simulated IRQ pin held low(or is it high?). */
30 uint8 jammed;
31} X6502;
32
33extern X6502 X;
34
35#define N_FLAG 0x80
36#define V_FLAG 0x40
37#define U_FLAG 0x20
38#define B_FLAG 0x10
39#define D_FLAG 0x08
40#define I_FLAG 0x04
41#define Z_FLAG 0x02
42#define C_FLAG 0x01
43
44extern uint32 timestamp;
45extern void FP_FASTAPASS(1) (*MapIRQHook)(int a);
46
47#define NTSC_CPU 1789772.7272727272727272
48#define PAL_CPU 1662607.125
49
50#define FCEU_IQEXT 0x01
51#define FCEU_IQNMI 0x08
52#define FCEU_IQDPCM 0x10
53#define FCEU_IQFCOUNT 0x20
54#define FCEU_IQTEMP 0x80
d97315ac 55// from 0.98.15
56#define FCEU_IQEXT2 0x02
c62d2810 57
af32b6c2 58#if defined(DEBUG_ASM_6502)
59#define TriggerIRQ TriggerIRQ_d
60#define TriggerNMI TriggerNMI_d
61#define TriggerNMINSF TriggerNMINSF_d
62#define X6502_Run X6502_Run_d
63#define X6502_Reset X6502_Reset_d
64#define X6502_Power X6502_Power_d
65#define X6502_AddCycles X6502_AddCycles_d
66#define X6502_IRQBegin X6502_IRQBegin_d
67#define X6502_IRQEnd X6502_IRQEnd_d
c0bf6f9f 68#define X6502_Rebase X6502_Rebase_d
0b65fdb3 69#define X6502_GetCycleCount() g_cnt
af32b6c2 70#define X6502_C
71#define X6502_A
72#define X6502_D
73
74#elif defined(ASM_6502)
75#define TriggerIRQ TriggerIRQ_a
76#define TriggerNMI TriggerNMI_a
77#define TriggerNMINSF TriggerNMINSF_a
78#define X6502_Reset X6502_Reset_a
79#define X6502_Power X6502_Power_a
80#define X6502_AddCycles X6502_AddCycles_a
e1591a12 81//#define X6502_IRQBegin X6502_IRQBegin_a
82//#define X6502_IRQEnd X6502_IRQEnd_a
83#define X6502_IRQBegin(w) nes_registers[4]|=w<<8
84#define X6502_IRQEnd(w) nes_registers[4]&=~(w<<8)
c0bf6f9f 85#define X6502_Rebase X6502_Rebase_a
4fdfab07 86#define X6502_GetCycleCount() ((int32)nes_registers[7]>>16)
af32b6c2 87#define X6502_A
88
af32b6c2 89#define X6502_Run(c) \
90{ \
91 int32 cycles = (c) << 4; /* *16 */ \
92 if (PAL) cycles -= (c); /* *15 */ \
8fa5eb33 93 nes_registers[7]+=cycles<<16; \
94 cycles=(int32)nes_registers[7]>>16; \
95 if (cycles > 0) { \
92e249b1 96 X6502_Run_a(); \
8fa5eb33 97 cycles -= (int32)nes_registers[7]>>16; \
92e249b1 98 asmcpu_update(cycles); \
99 } \
af32b6c2 100}
101
102#else
92e249b1 103#define TriggerIRQ TriggerIRQ_c
104#define TriggerNMI TriggerNMI_c
105#define TriggerNMINSF TriggerNMINSF_c
106#define X6502_Reset X6502_Reset_c
107#define X6502_Power X6502_Power_c
108#define X6502_AddCycles X6502_AddCycles_c
109#define X6502_IRQBegin X6502_IRQBegin_c
110#define X6502_IRQEnd X6502_IRQEnd_c
c0bf6f9f 111#define X6502_Rebase(...)
4fdfab07 112#define X6502_GetCycleCount() X.count
92e249b1 113#define X6502_C
114
937bf65b 115#define X6502_Run(c) \
116{ \
117 int32 cycles = (c) << 4; /* *16 */ \
118 if (PAL) cycles -= (c); /* *15 */ \
119 X.count+=cycles; \
af32b6c2 120 if (X.count > 0) X6502_Run_c(); \
937bf65b 121}
af32b6c2 122#define X6502_C
123#endif
937bf65b 124
af32b6c2 125// c
126#ifdef X6502_C
0b65fdb3 127extern int32 g_cnt;
af32b6c2 128void TriggerIRQ_c(void);
129void TriggerNMI_c(void);
130void TriggerNMINSF_c(void);
131void X6502_Run_c(void);
132void X6502_Reset_c(void);
133void X6502_Power_c(void);
134void FASTAPASS(1) X6502_AddCycles_c(int x);
135void FASTAPASS(1) X6502_IRQBegin_c(int w);
136void FASTAPASS(1) X6502_IRQEnd_c(int w);
137#endif
c62d2810 138
af32b6c2 139// asm
140#ifdef X6502_A
92e249b1 141extern uint32 nes_registers[0x10];
142extern uint32 pc_base;
af32b6c2 143void TriggerIRQ_a(void);
144void TriggerNMI_a(void);
145void TriggerNMINSF_a(void);
146void X6502_Run_a(void);
147void X6502_Reset_a(void);
148void X6502_Power_a(void);
149void X6502_AddCycles_a(int x);
150void X6502_IRQBegin_a(int w);
151void X6502_IRQEnd_a(int w);
c0bf6f9f 152void X6502_Rebase_a(void);
af32b6c2 153#endif
c62d2810 154
af32b6c2 155// debug
156#ifdef X6502_D
157void TriggerIRQ_d(void);
158void TriggerNMI_d(void);
159void TriggerNMINSF_d(void);
160void X6502_Run_d(int32 c);
161void X6502_Reset_d(void);
162void X6502_Power_d(void);
163void X6502_AddCycles_d(int x);
164void X6502_IRQBegin_d(int w);
165void X6502_IRQEnd_d(int w);
c0bf6f9f 166void X6502_Rebase_d(void);
af32b6c2 167#endif
937bf65b 168