1 /*****************************************************************************
2  *
3  *	 m6502.h
4  *	 Portable 6502/65c02/65sc02/6510/n2a03 emulator interface
5  *
6  *	 Copyright (c) 1998,1999,2000 Juergen Buchmueller, all rights reserved.
7  *	 65sc02 core Copyright (c) 2000 Peter Trauner.
8  *
9  *	 - This source code is released as freeware for non-commercial purposes.
10  *	 - You are free to use and redistribute this code in modified or
11  *	   unmodified form, provided you list me in the credits.
12  *	 - If you modify this source code, you must add a notice to each modified
13  *	   source file that it has been changed.  If you're a nice person, you
14  *	   will clearly mark each change too.  :)
15  *	 - If you wish to use this for commercial purposes, please contact me at
16  *	   pullmoll@t-online.de
17  *	 - The author of this copywritten work reserves the right to change the
18  *	   terms of its usage and license at any time, including retroactively
19  *	 - This entire notice must remain in the source code.
20  *
21  *****************************************************************************/
22 /* 2.February 2000 PeT added 65sc02 subtype */
23 
24 #ifndef _M6502_H
25 #define _M6502_H
26 
27 #include "cpuintrf.h"
28 #include "osd_cpu.h"
29 
30 /* set to 1 to test cur_mrhard/cur_wmhard to avoid calls */
31 #define FAST_MEMORY 0
32 
33 #define SUBTYPE_6502	0
34 #if (HAS_M65C02)
35 #define SUBTYPE_65C02	1
36 #endif
37 #if (HAS_M6510)
38 #define SUBTYPE_6510	2
39 #endif
40 #if (HAS_N2A03)
41 #define SUBTYPE_2A03	3
42 #endif
43 #if (HAS_M65SC02)
44 #define SUBTYPE_65SC02	4
45 #endif
46 
47 enum {
48 	M6502_PC=1, M6502_S, M6502_P, M6502_A, M6502_X, M6502_Y,
49 	M6502_EA, M6502_ZP, M6502_NMI_STATE, M6502_IRQ_STATE, M6502_SO_STATE,
50 	M6502_SUBTYPE
51 };
52 
53 #define M6502_INT_NONE	0
54 #define M6502_INT_IRQ	1
55 #define M6502_INT_NMI	2
56 /* use cpu_set_irq_line(cpu, M6502_SET_OVERFLOW, level)
57    to change level of the so input line
58    positiv edge sets overflow flag */
59 #define M6502_SET_OVERFLOW 3
60 
61 #define M6502_NMI_VEC	0xfffa
62 #define M6502_RST_VEC	0xfffc
63 #define M6502_IRQ_VEC	0xfffe
64 
65 extern int m6502_ICount;				/* cycle count */
66 
67 extern void m6502_reset(void *param);
68 extern void m6502_exit(void);
69 extern int	m6502_execute(int cycles);
70 extern unsigned m6502_get_context(void *dst);
71 extern void m6502_set_context(void *src);
72 extern unsigned m6502_get_pc(void);
73 extern void m6502_set_pc(unsigned val);
74 extern unsigned m6502_get_sp(void);
75 extern void m6502_set_sp(unsigned val);
76 extern unsigned m6502_get_reg(int regnum);
77 extern void m6502_set_reg(int regnum, unsigned val);
78 extern void m6502_set_nmi_line(int state);
79 extern void m6502_set_irq_line(int irqline, int state);
80 extern void m6502_set_irq_callback(int (*callback)(int irqline));
81 extern void m6502_state_save(void *file);
82 extern void m6502_state_load(void *file);
83 extern const char *m6502_info(void *context, int regnum);
84 extern unsigned m6502_dasm(char *buffer, unsigned pc);
85 
86 /****************************************************************************
87  * The 65C02
88  ****************************************************************************/
89 #if (HAS_M65C02)
90 #define M65C02_A						M6502_A
91 #define M65C02_X						M6502_X
92 #define M65C02_Y						M6502_Y
93 #define M65C02_S						M6502_S
94 #define M65C02_PC						M6502_PC
95 #define M65C02_P						M6502_P
96 #define M65C02_EA						M6502_EA
97 #define M65C02_ZP						M6502_ZP
98 #define M65C02_NMI_STATE				M6502_NMI_STATE
99 #define M65C02_IRQ_STATE				M6502_IRQ_STATE
100 
101 #define M65C02_INT_NONE 				M6502_INT_NONE
102 #define M65C02_INT_IRQ					M6502_INT_IRQ
103 #define M65C02_INT_NMI					M6502_INT_NMI
104 
105 #define M65C02_NMI_VEC					M6502_NMI_VEC
106 #define M65C02_RST_VEC					M6502_RST_VEC
107 #define M65C02_IRQ_VEC					M6502_IRQ_VEC
108 
109 #define m65c02_ICount					m6502_ICount
110 
111 extern void m65c02_reset(void *param);
112 extern void m65c02_exit(void);
113 extern int	m65c02_execute(int cycles);
114 extern unsigned m65c02_get_context(void *dst);
115 extern void m65c02_set_context(void *src);
116 extern unsigned m65c02_get_pc(void);
117 extern void m65c02_set_pc(unsigned val);
118 extern unsigned m65c02_get_sp(void);
119 extern void m65c02_set_sp(unsigned val);
120 extern unsigned m65c02_get_reg(int regnum);
121 extern void m65c02_set_reg(int regnum, unsigned val);
122 extern void m65c02_set_nmi_line(int state);
123 extern void m65c02_set_irq_line(int irqline, int state);
124 extern void m65c02_set_irq_callback(int (*callback)(int irqline));
125 extern void m65c02_state_save(void *file);
126 extern void m65c02_state_load(void *file);
127 extern const char *m65c02_info(void *context, int regnum);
128 extern unsigned m65c02_dasm(char *buffer, unsigned pc);
129 #endif
130 
131 /****************************************************************************
132  * The 65SC02
133  ****************************************************************************/
134 #if (HAS_M65SC02)
135 #define M65SC02_A						M6502_A
136 #define M65SC02_X						M6502_X
137 #define M65SC02_Y						M6502_Y
138 #define M65SC02_S						M6502_S
139 #define M65SC02_PC						M6502_PC
140 #define M65SC02_P						M6502_P
141 #define M65SC02_EA						M6502_EA
142 #define M65SC02_ZP						M6502_ZP
143 #define M65SC02_NMI_STATE				M6502_NMI_STATE
144 #define M65SC02_IRQ_STATE				M6502_IRQ_STATE
145 
146 #define M65SC02_INT_NONE				M6502_INT_NONE
147 #define M65SC02_INT_IRQ 				M6502_INT_IRQ
148 #define M65SC02_INT_NMI 				M6502_INT_NMI
149 
150 #define M65SC02_NMI_VEC 				M6502_NMI_VEC
151 #define M65SC02_RST_VEC 				M6502_RST_VEC
152 #define M65SC02_IRQ_VEC 				M6502_IRQ_VEC
153 
154 #define m65sc02_ICount					m6502_ICount
155 
156 extern void m65sc02_reset(void *param);
157 extern void m65sc02_exit(void);
158 extern int	m65sc02_execute(int cycles);
159 extern unsigned m65sc02_get_context(void *dst);
160 extern void m65sc02_set_context(void *src);
161 extern unsigned m65sc02_get_pc(void);
162 extern void m65sc02_set_pc(unsigned val);
163 extern unsigned m65sc02_get_sp(void);
164 extern void m65sc02_set_sp(unsigned val);
165 extern unsigned m65sc02_get_reg(int regnum);
166 extern void m65sc02_set_reg(int regnum, unsigned val);
167 extern void m65sc02_set_nmi_line(int state);
168 extern void m65sc02_set_irq_line(int irqline, int state);
169 extern void m65sc02_set_irq_callback(int (*callback)(int irqline));
170 extern void m65sc02_state_save(void *file);
171 extern void m65sc02_state_load(void *file);
172 extern const char *m65sc02_info(void *context, int regnum);
173 extern unsigned m65sc02_dasm(char *buffer, unsigned pc);
174 #endif
175 
176 /****************************************************************************
177  * The 6510
178  ****************************************************************************/
179 #if (HAS_M6510)
180 #define M6510_A 						M6502_A
181 #define M6510_X 						M6502_X
182 #define M6510_Y 						M6502_Y
183 #define M6510_S 						M6502_S
184 #define M6510_PC						M6502_PC
185 #define M6510_P 						M6502_P
186 #define M6510_EA						M6502_EA
187 #define M6510_ZP						M6502_ZP
188 #define M6510_NMI_STATE 				M6502_NMI_STATE
189 #define M6510_IRQ_STATE 				M6502_IRQ_STATE
190 
191 #define M6510_INT_NONE					M6502_INT_NONE
192 #define M6510_INT_IRQ					M6502_INT_IRQ
193 #define M6510_INT_NMI					M6502_INT_NMI
194 
195 #define M6510_NMI_VEC					M6502_NMI_VEC
196 #define M6510_RST_VEC					M6502_RST_VEC
197 #define M6510_IRQ_VEC					M6502_IRQ_VEC
198 
199 #define m6510_ICount					m6502_ICount
200 
201 extern void m6510_reset(void *param);
202 extern void m6510_exit(void);
203 extern int	m6510_execute(int cycles);
204 extern unsigned m6510_get_context(void *dst);
205 extern void m6510_set_context(void *src);
206 extern unsigned m6510_get_pc(void);
207 extern void m6510_set_pc(unsigned val);
208 extern unsigned m6510_get_sp(void);
209 extern void m6510_set_sp(unsigned val);
210 extern unsigned m6510_get_reg(int regnum);
211 extern void m6510_set_reg(int regnum, unsigned val);
212 extern void m6510_set_nmi_line(int state);
213 extern void m6510_set_irq_line(int irqline, int state);
214 extern void m6510_set_irq_callback(int (*callback)(int irqline));
215 extern void m6510_state_save(void *file);
216 extern void m6510_state_load(void *file);
217 extern const char *m6510_info(void *context, int regnum);
218 extern unsigned m6510_dasm(char *buffer, unsigned pc);
219 
220 #endif
221 
222 #ifdef HAS_M6510T
223 #define M6510T_A						M6502_A
224 #define M6510T_X						M6502_X
225 #define M6510T_Y						M6502_Y
226 #define M6510T_S						M6502_S
227 #define M6510T_PC						M6502_PC
228 #define M6510T_P						M6502_P
229 #define M6510T_EA						M6502_EA
230 #define M6510T_ZP						M6502_ZP
231 #define M6510T_NMI_STATE				M6502_NMI_STATE
232 #define M6510T_IRQ_STATE				M6502_IRQ_STATE
233 
234 #define M6510T_INT_NONE 				M6502_INT_NONE
235 #define M6510T_INT_IRQ					M6502_INT_IRQ
236 #define M6510T_INT_NMI					M6502_INT_NMI
237 
238 #define M6510T_NMI_VEC					M6502_NMI_VEC
239 #define M6510T_RST_VEC					M6502_RST_VEC
240 #define M6510T_IRQ_VEC					M6502_IRQ_VEC
241 
242 #define m6510t_ICount                   m6502_ICount
243 
244 #define m6510t_reset m6510_reset
245 #define m6510t_exit m6510_exit
246 #define m6510t_execute m6510_execute
247 #define m6510t_get_context m6510_get_context
248 #define m6510t_set_context m6510_set_context
249 #define m6510t_get_pc m6510_get_pc
250 #define m6510t_set_pc m6510_set_pc
251 #define m6510t_get_sp m6510_get_sp
252 #define m6510t_set_sp m6510_set_sp
253 #define m6510t_get_reg m6510_get_reg
254 #define m6510t_set_reg m6510_set_reg
255 #define m6510t_set_nmi_line m6510_set_nmi_line
256 #define m6510t_set_irq_line m6510_set_irq_line
257 #define m6510t_set_irq_callback m6510_set_irq_callback
258 #define m6510t_state_save m6510_state_save
259 #define m6510t_state_load m6510_state_load
260 extern const char *m6510t_info(void *context, int regnum);
261 #define m6510t_dasm m6510_dasm
262 #endif
263 
264 #ifdef HAS_M7501
265 #define M7501_A 						M6502_A
266 #define M7501_X 						M6502_X
267 #define M7501_Y 						M6502_Y
268 #define M7501_S 						M6502_S
269 #define M7501_PC						M6502_PC
270 #define M7501_P 						M6502_P
271 #define M7501_EA						M6502_EA
272 #define M7501_ZP						M6502_ZP
273 #define M7501_NMI_STATE 				M6502_NMI_STATE
274 #define M7501_IRQ_STATE 				M6502_IRQ_STATE
275 
276 #define M7501_INT_NONE					M6502_INT_NONE
277 #define M7501_INT_IRQ					M6502_INT_IRQ
278 #define M7501_INT_NMI					M6502_INT_NMI
279 
280 #define M7501_NMI_VEC					M6502_NMI_VEC
281 #define M7501_RST_VEC					M6502_RST_VEC
282 #define M7501_IRQ_VEC					M6502_IRQ_VEC
283 
284 #define m7501_ICount                    m6502_ICount
285 
286 #define m7501_reset m6510_reset
287 #define m7501_exit m6510_exit
288 #define m7501_execute m6510_execute
289 #define m7501_get_context m6510_get_context
290 #define m7501_set_context m6510_set_context
291 #define m7501_get_pc m6510_get_pc
292 #define m7501_set_pc m6510_set_pc
293 #define m7501_get_sp m6510_get_sp
294 #define m7501_set_sp m6510_set_sp
295 #define m7501_get_reg m6510_get_reg
296 #define m7501_set_reg m6510_set_reg
297 #define m7501_set_nmi_line m6510_set_nmi_line
298 #define m7501_set_irq_line m6510_set_irq_line
299 #define m7501_set_irq_callback m6510_set_irq_callback
300 #define m7501_state_save m6510_state_save
301 #define m7501_state_load m6510_state_load
302 extern const char *m7501_info(void *context, int regnum);
303 #define m7501_dasm m6510_dasm
304 #endif
305 
306 #ifdef HAS_M8502
307 #define M8502_A 						M6502_A
308 #define M8502_X 						M6502_X
309 #define M8502_Y 						M6502_Y
310 #define M8502_S 						M6502_S
311 #define M8502_PC						M6502_PC
312 #define M8502_P 						M6502_P
313 #define M8502_EA						M6502_EA
314 #define M8502_ZP						M6502_ZP
315 #define M8502_NMI_STATE 				M6502_NMI_STATE
316 #define M8502_IRQ_STATE 				M6502_IRQ_STATE
317 
318 #define M8502_INT_NONE					M6502_INT_NONE
319 #define M8502_INT_IRQ					M6502_INT_IRQ
320 #define M8502_INT_NMI					M6502_INT_NMI
321 
322 #define M8502_NMI_VEC					M6502_NMI_VEC
323 #define M8502_RST_VEC					M6502_RST_VEC
324 #define M8502_IRQ_VEC					M6502_IRQ_VEC
325 
326 #define m8502_ICount                    m6502_ICount
327 
328 #define m8502_reset m6510_reset
329 #define m8502_exit m6510_exit
330 #define m8502_execute m6510_execute
331 #define m8502_get_context m6510_get_context
332 #define m8502_set_context m6510_set_context
333 #define m8502_get_pc m6510_get_pc
334 #define m8502_set_pc m6510_set_pc
335 #define m8502_get_sp m6510_get_sp
336 #define m8502_set_sp m6510_set_sp
337 #define m8502_get_reg m6510_get_reg
338 #define m8502_set_reg m6510_set_reg
339 #define m8502_set_nmi_line m6510_set_nmi_line
340 #define m8502_set_irq_line m6510_set_irq_line
341 #define m8502_set_irq_callback m6510_set_irq_callback
342 #define m8502_state_save m6510_state_save
343 #define m8502_state_load m6510_state_load
344 extern const char *m8502_info(void *context, int regnum);
345 #define m8502_dasm m6510_dasm
346 #endif
347 
348 
349 /****************************************************************************
350  * The 2A03 (NES 6502 without decimal mode ADC/SBC)
351  ****************************************************************************/
352 #if (HAS_N2A03)
353 #define N2A03_A 						M6502_A
354 #define N2A03_X 						M6502_X
355 #define N2A03_Y 						M6502_Y
356 #define N2A03_S 						M6502_S
357 #define N2A03_PC						M6502_PC
358 #define N2A03_P 						M6502_P
359 #define N2A03_EA						M6502_EA
360 #define N2A03_ZP						M6502_ZP
361 #define N2A03_NMI_STATE 				M6502_NMI_STATE
362 #define N2A03_IRQ_STATE 				M6502_IRQ_STATE
363 
364 #define N2A03_INT_NONE					M6502_INT_NONE
365 #define N2A03_INT_IRQ					M6502_INT_IRQ
366 #define N2A03_INT_NMI					M6502_INT_NMI
367 
368 #define N2A03_NMI_VEC					M6502_NMI_VEC
369 #define N2A03_RST_VEC					M6502_RST_VEC
370 #define N2A03_IRQ_VEC					M6502_IRQ_VEC
371 
372 #define n2a03_ICount					m6502_ICount
373 
374 extern void n2a03_reset(void *param);
375 extern void n2a03_exit(void);
376 extern int	n2a03_execute(int cycles);
377 extern unsigned n2a03_get_context(void *dst);
378 extern void n2a03_set_context(void *src);
379 extern unsigned n2a03_get_pc(void);
380 extern void n2a03_set_pc(unsigned val);
381 extern unsigned n2a03_get_sp(void);
382 extern void n2a03_set_sp(unsigned val);
383 extern unsigned n2a03_get_reg(int regnum);
384 extern void n2a03_set_reg (int regnum, unsigned val);
385 extern void n2a03_set_nmi_line(int state);
386 extern void n2a03_set_irq_line(int irqline, int state);
387 extern void n2a03_set_irq_callback(int (*callback)(int irqline));
388 extern void n2a03_state_save(void *file);
389 extern void n2a03_state_load(void *file);
390 extern const char *n2a03_info(void *context, int regnum);
391 extern unsigned n2a03_dasm(char *buffer, unsigned pc);
392 
393 
394 #define N2A03_DEFAULTCLOCK (21477272.724 / 12)
395 
396 /* The N2A03 is integrally tied to its PSG (they're on the same die).
397    Bit 7 of address $4011 (the PSG's DPCM control register), when set,
398    causes an IRQ to be generated.  This function allows the IRQ to be called
399    from the PSG core when such an occasion arises. */
400 extern void n2a03_irq(void);
401 #endif
402 
403 #endif /* _M6502_H */
404 
405