/*
** msx.h : part of MSX emulation.
**
*/

#define MSX_MAX_CARTS	(2)

typedef struct {
	/* PSG */
	int psg_b;
	int opll_active;
	/* printer */
	UINT8 prn_data, prn_strobe;
	/* mouse */
	UINT16 mouse[2];
	int mouse_stat[2];
	/* rtc */
	int rtc_latch;
	/* disk */
	UINT8 dsk_stat;
	/* kanji */
	UINT8 *kanji_mem;
	int kanji_latch;
	/* memory */
	msx_slot_layout *layout;
	slot_state *cart_state[MSX_MAX_CARTS];
	slot_state *state[4];
	const msx_slot *slot[4];
	UINT8 *ram_pages[4];
	UINT8 *empty, ram_mapper[4];
	UINT8 ramio_set_bits;
	slot_state *all_state[4][4][4];
	int slot_expanded[4];
	UINT8 primary_slot;
	UINT8 secondary_slot[4];
	UINT8 superloadrunner_bank;
	UINT8 korean90in1_bank;
	UINT8 *top_page;
} MSX;

/* start/stop functions */
extern DRIVER_INIT( msx );
extern DRIVER_INIT( msx2 );
extern MACHINE_INIT( msx );
extern MACHINE_INIT( msx2 );
extern INTERRUPT_GEN( msx_interrupt );
extern INTERRUPT_GEN( msx2_interrupt );
extern NVRAM_HANDLER( msx2 );

DEVICE_LOAD( msx_cart );
DEVICE_UNLOAD( msx_cart );

void msx_vdp_interrupt (int);

/* I/O functions */
WRITE8_HANDLER ( msx_printer_w );
 READ8_HANDLER ( msx_printer_r );
WRITE8_HANDLER ( msx_psg_w );
WRITE8_HANDLER ( msx_dsk_w );
 READ8_HANDLER ( msx_psg_r );
WRITE8_HANDLER ( msx_psg_port_a_w );
 READ8_HANDLER ( msx_psg_port_a_r );
WRITE8_HANDLER ( msx_psg_port_b_w );
 READ8_HANDLER ( msx_psg_port_b_r );
WRITE8_HANDLER ( msx_fmpac_w );
 READ8_HANDLER ( msx_rtc_reg_r );
WRITE8_HANDLER ( msx_rtc_reg_w );
WRITE8_HANDLER ( msx_rtc_latch_w );
WRITE8_HANDLER ( msx_90in1_w );

/* cassette functions */
DEVICE_LOAD( msx_cassette );

/* disk functions */
DEVICE_LOAD( msx_floppy );

/* new memory emulation */
WRITE8_HANDLER (msx_superloadrunner_w);
WRITE8_HANDLER (msx_page0_w);
WRITE8_HANDLER (msx_page1_w);
WRITE8_HANDLER (msx_page2_w);
WRITE8_HANDLER (msx_page3_w);
WRITE8_HANDLER (msx_sec_slot_w);
 READ8_HANDLER (msx_sec_slot_r);
WRITE8_HANDLER (msx_ram_mapper_w);
 READ8_HANDLER (msx_ram_mapper_r);
 READ8_HANDLER (msx_kanji_r);
WRITE8_HANDLER (msx_kanji_w);

void msx_memory_map_all (void);
void msx_memory_map_page (int page);
void msx_memory_init (void);
void msx_memory_set_carts (void);
void msx_memory_reset (void);

