mame/src/mess/includes/nes.h
2014-03-10 08:29:46 +00:00

186 lines
4.7 KiB
C++

/*****************************************************************************
nes.h
Nintendo Entertainment System / Famicom
****************************************************************************/
#ifndef NES_H_
#define NES_H_
#include "video/ppu2c0x.h"
#include "bus/nes/nes_slot.h"
#include "bus/nes/nes_carts.h"
#include "sound/nes_apu.h"
#include "imagedev/cassette.h"
/***************************************************************************
CONSTANTS
***************************************************************************/
#define NTSC_CLOCK N2A03_DEFAULTCLOCK /* 1.789772 MHz */
#define PAL_CLOCK (26601712.0/16) /* 1.662607 MHz */
#define NES_BATTERY_SIZE 0x2000
/***************************************************************************
TYPE DEFINITIONS
***************************************************************************/
struct nes_input
{
UINT32 shift;
UINT32 i0, i1, i2;
};
/*PPU fast banking constants and structures */
#define CHRROM 0
#define CHRRAM 1
/*PPU nametable fast banking constants and structures */
#define CIRAM 0
#define ROM 1
#define EXRAM 2
#define MMC5FILL 3
#define CART_NTRAM 4
#define NES_BATTERY 0
#define NES_WRAM 1
class nes_state : public driver_device
{
public:
enum
{
TIMER_ZAPPER_TICK,
TIMER_LIGHTGUN_TICK
};
nes_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_ppu(*this, "ppu"),
m_sound(*this, "nessound"),
m_cartslot(*this, "nes_slot"),
m_cassette(*this, "tape")
{ }
/* video-related */
int m_last_frame_flip;
/* misc */
ioport_port *m_io_ctrlsel;
ioport_port *m_io_fckey[9];
ioport_port *m_io_subkey[13];
ioport_port *m_io_pad[4];
ioport_port *m_io_powerpad[2];
ioport_port *m_io_mahjong[4];
ioport_port *m_io_ftrainer[4];
ioport_port *m_io_cc_left;
ioport_port *m_io_cc_right;
ioport_port *m_io_zapper1_t;
ioport_port *m_io_zapper1_x;
ioport_port *m_io_zapper1_y;
ioport_port *m_io_zapper2_t;
ioport_port *m_io_zapper2_x;
ioport_port *m_io_zapper2_y;
ioport_port *m_io_paddle;
ioport_port *m_io_paddle_btn;
ioport_port *m_io_exp;
UINT8 *m_vram;
UINT8 *m_ciram; //PPU nametable RAM - external to PPU!
required_device<cpu_device> m_maincpu;
required_device<ppu2c0x_device> m_ppu;
required_device<nesapu_device> m_sound;
optional_device<nes_cart_slot_device> m_cartslot;
optional_device<cassette_image_device> m_cassette;
int nes_ppu_vidaccess(int address, int data);
void ppu_nmi(int *ppu_regs);
DECLARE_READ8_MEMBER(nes_in0_r);
DECLARE_READ8_MEMBER(nes_in1_r);
DECLARE_WRITE8_MEMBER(nes_in0_w);
DECLARE_WRITE8_MEMBER(nes_in1_w);
DECLARE_READ8_MEMBER(fc_in0_r);
DECLARE_READ8_MEMBER(fc_in1_r);
DECLARE_WRITE8_MEMBER(fc_in0_w);
DECLARE_WRITE8_MEMBER(nes_vh_sprite_dma_w);
virtual void machine_start();
virtual void machine_reset();
virtual void video_start();
virtual void video_reset();
DECLARE_PALETTE_INIT(nes);
UINT32 screen_update_nes(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
DECLARE_READ8_MEMBER(psg_4015_r);
DECLARE_WRITE8_MEMBER(psg_4015_w);
DECLARE_WRITE8_MEMBER(psg_4017_w);
void state_register();
/***** FDS-floppy related *****/
DECLARE_WRITE8_MEMBER(fds_chr_w);
DECLARE_READ8_MEMBER(fds_chr_r);
DECLARE_WRITE8_MEMBER(fds_nt_w);
DECLARE_READ8_MEMBER(fds_nt_r);
int m_disk_expansion;
UINT8 m_fds_sides;
UINT8 *m_fds_data; // here, we store a copy of the disk
UINT8 *m_fds_ram; // here, we emulate the RAM adapter
/* Variables which can change */
UINT8 m_fds_motor_on;
UINT8 m_fds_door_closed;
UINT8 m_fds_current_side;
UINT32 m_fds_head_position;
UINT8 m_fds_status0;
UINT8 m_fds_read_mode;
UINT8 m_fds_write_reg;
int m_fds_mirroring;
int m_IRQ_enable, m_IRQ_enable_latch;
UINT16 m_IRQ_count, m_IRQ_count_latch;
/* these are used in the mapper 20 handlers */
int m_fds_last_side;
int m_fds_count;
DECLARE_READ8_MEMBER(nes_fds_r);
DECLARE_WRITE8_MEMBER(nes_fds_w);
DECLARE_DRIVER_INIT(famicom);
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(nes_disk);
DECLARE_DEVICE_IMAGE_UNLOAD_MEMBER(nes_disk);
void fds_irq(int scanline, int vblank, int blanked);
// input related
UINT32 m_pad_latch[4];
UINT8 m_zapper_latch[2][3];
UINT8 m_paddle_latch, m_paddle_btn_latch;
UINT8 m_mjpanel_latch;
UINT8 m_fck_scan, m_fck_mode;
UINT8 m_mic_obstruct;
UINT8 m_powerpad_latch[2];
UINT8 m_ftrainer_scan;
protected:
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
private:
memory_bank *m_prg_bank_mem[5];
};
#endif /* NES_H_ */