/* ** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com) ** ** ** This program is free software; you can redistribute it and/or ** modify it under the terms of version 2 of the GNU Library General ** Public License as published by the Free Software Foundation. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Library General Public License for more details. To obtain a ** copy of the GNU Library General Public License, write to the Free ** Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ** ** Any permitted reproduction of these routines, in whole or in part, ** must bear this legend. ** ** ** nes6502.h ** ** NES custom 6502 CPU definitions / prototypes ** $Id$ */ /* straitm */ #include "types.h" /* NOTE: 16-bit addresses avoided like the plague: use 32-bit values ** wherever humanly possible */ #ifndef _NES6502_H_ #define _NES6502_H_ /* Define this to enable decimal mode in ADC / SBC (not needed in NES) */ /*#define NES6502_DECIMAL*/ /* number of bank pointers the CPU emulation core handles */ #ifdef NSF_PLAYER #define NES6502_4KBANKS #endif #ifdef NES6502_4KBANKS #define NES6502_NUMBANKS 16 #define NES6502_BANKSHIFT 12 #else #define NES6502_NUMBANKS 8 #define NES6502_BANKSHIFT 13 #endif #define NES6502_BANKMASK ((0x10000 / NES6502_NUMBANKS) - 1) /* Add memory access control flags. This is a ram shadow memory that holds * for each memory bytes access flags for read, write and execute access. * The nes6502_mem_access holds all new access (all mode all location). It is * used to determine if the player has loop in playing time calculation. */ #ifdef NES6502_MEM_ACCESS_CTRL extern uint8 nes6502_mem_access; # define NES6502_READ_ACCESS 1 # define NES6502_WRITE_ACCESS 2 # define NES6502_EXE_ACCESS 4 #endif /* #ifdef NES6502_MEM_ACCESS_CTRL */ /* P (flag) register bitmasks */ #define N_FLAG 0x80 #define V_FLAG 0x40 #define R_FLAG 0x20 /* Reserved, always 1 */ #define B_FLAG 0x10 #define D_FLAG 0x08 #define I_FLAG 0x04 #define Z_FLAG 0x02 #define C_FLAG 0x01 /* Vector addresses */ #define NMI_VECTOR 0xFFFA #define RESET_VECTOR 0xFFFC #define IRQ_VECTOR 0xFFFE /* cycle counts for interrupts */ #define INT_CYCLES 7 #define RESET_CYCLES 6 #define NMI_MASK 0x01 #define IRQ_MASK 0x02 /* Stack is located on 6502 page 1 */ #define STACK_OFFSET 0x0100 typedef struct { uint32 min_range, max_range; uint8 (*read_func)(uint32 address); } nes6502_memread; typedef struct { uint32 min_range, max_range; void (*write_func)(uint32 address, uint8 value); } nes6502_memwrite; typedef struct { uint8 * mem_page[NES6502_NUMBANKS]; /* memory page pointers */ #ifdef NES6502_MEM_ACCESS_CTRL uint8 * acc_mem_page[NES6502_NUMBANKS]; /* memory access page pointer */ #endif nes6502_memread *read_handler; nes6502_memwrite *write_handler; int dma_cycles; uint32 pc_reg; uint8 a_reg, p_reg, x_reg, y_reg, s_reg; uint8 int_pending; } nes6502_context; #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /* Functions which govern the 6502's execution */ extern void nes6502_init(void); extern void nes6502_reset(void); extern int nes6502_execute(int total_cycles); extern void nes6502_nmi(void); extern void nes6502_irq(void); extern uint8 nes6502_getbyte(uint32 address); extern uint32 nes6502_getcycles(boolean reset_flag); extern void nes6502_setdma(int cycles); #ifdef NES6502_MEM_ACCESS_CTRL extern void nes6502_chk_mem_access(uint8 * access, int flags); #else #define nes6502_chk_mem_access(access,flags) #endif /* Context get/set */ extern void nes6502_setcontext(nes6502_context *cpu); extern void nes6502_getcontext(nes6502_context *cpu); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* _NES6502_H_ */ /* ** $Log$ ** Revision 1.2 2008/03/25 15:56:12 slomo ** Patch by: Andreas Henriksson ** * gst/nsf/Makefile.am: ** * gst/nsf/dis6502.h: ** * gst/nsf/fds_snd.c: ** * gst/nsf/fds_snd.h: ** * gst/nsf/fmopl.c: ** * gst/nsf/fmopl.h: ** * gst/nsf/gstnsf.c: ** * gst/nsf/log.c: ** * gst/nsf/log.h: ** * gst/nsf/memguard.c: ** * gst/nsf/memguard.h: ** * gst/nsf/mmc5_snd.c: ** * gst/nsf/mmc5_snd.h: ** * gst/nsf/nes6502.c: ** * gst/nsf/nes6502.h: ** * gst/nsf/nes_apu.c: ** * gst/nsf/nes_apu.h: ** * gst/nsf/nsf.c: ** * gst/nsf/nsf.h: ** * gst/nsf/osd.h: ** * gst/nsf/types.h: ** * gst/nsf/vrc7_snd.c: ** * gst/nsf/vrc7_snd.h: ** * gst/nsf/vrcvisnd.c: ** * gst/nsf/vrcvisnd.h: ** Update our internal nosefart to nosefart-2.7-mls to fix segfaults ** on some files. Fixes bug #498237. ** Remove some // comments, fix some compiler warnings and use pow() ** instead of a slow, selfmade implementation. ** ** Revision 1.2 2003/05/01 22:34:19 benjihan ** New NSF plugin ** ** Revision 1.1 2003/04/08 20:53:00 ben ** Adding more files... ** ** Revision 1.4 2000/06/09 15:12:25 matt ** initial revision ** */