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