summaryrefslogblamecommitdiffstatshomepage
path: root/src/mess/includes/sms.h
blob: f9d2a6f24204f2337dc6c7bd33a23e4e8bccd529 (plain) (tree)






















































































































































































































                                                                                                 
/*****************************************************************************
 *
 * includes/sms.h
 *
 ****************************************************************************/

#ifndef SMS_H_
#define SMS_H_

#define LOG_REG
#define LOG_PAGING
#define LOG_COLOR

#define NVRAM_SIZE             (0x08000)
#define CPU_ADDRESSABLE_SIZE   (0x10000)

#define MAX_CARTRIDGES        16

class sms_state : public driver_device
{
public:
	void map_cart_16k( UINT16 address, UINT16 bank );
	void map_cart_8k( UINT16 address, UINT16 bank );
	void map_bios_16k( UINT16 address, UINT16 bank );
	void map_bios_8k( UINT16 address, UINT16 bank );

public:
	sms_state(const machine_config &mconfig, device_type type, const char *tag)
	: driver_device(mconfig, type, tag) { }

	// device_ts
	device_t *m_main_cpu;
	device_t *m_control_cpu;
	sega315_5124_device *m_vdp;
	eeprom_device *m_eeprom;
	device_t *m_ym;
	device_t *m_main_scr;
	device_t *m_left_lcd;
	device_t *m_right_lcd;
	address_space *m_space;

	UINT8 m_bios_page_count;
	UINT8 m_fm_detect;
	UINT8 m_ctrl_reg;
	int m_paused;
	UINT8 m_bios_port;
	UINT8 *m_BIOS;
	UINT8 *m_mapper_ram;
	UINT8 m_mapper[4];
	// we are going to use 1-6, same as bank numbers. Notice, though, that most mappers
	// only work on 16K banks and, hence, banks 4-6 are not always directly set
	// (they often use bank3 + 0x2000 and bank5 + 0x2000)
	UINT8 *m_banking_bios[8];
	UINT8 *m_banking_cart[8];
	UINT8 *m_banking_none;
	UINT8 m_gg_sio[5];
	UINT8 m_store_control;
	UINT8 m_input_port0;
	UINT8 m_input_port1;

	// for gamegear LCD persistence hack
	bitmap_rgb32 m_prev_bitmap;

	// for 3D glass binocular hack
	bitmap_rgb32 m_prevleft_bitmap;
	bitmap_rgb32 m_prevright_bitmap;

	/* Model identifiers */
	UINT8 m_is_gamegear;
	UINT8 m_is_region_japan;
	UINT8 m_has_bios_0400;
	UINT8 m_has_bios_2000;
	UINT8 m_has_bios_full;
	UINT8 m_has_bios;
	UINT8 m_has_fm;

	/* Data needed for Rapid Fire Unit support */
	emu_timer *m_rapid_fire_timer;
	UINT8 m_rapid_fire_state_1;
	UINT8 m_rapid_fire_state_2;

	/* Data needed for Paddle Control controller */
	UINT32 m_last_paddle_read_time;
	UINT8 m_paddle_read_state;

	/* Data needed for Sports Pad controller */
	UINT32 m_last_sports_pad_time_1;
	UINT32 m_last_sports_pad_time_2;
	UINT8 m_sports_pad_state_1;
	UINT8 m_sports_pad_state_2;
	UINT8 m_sports_pad_last_data_1;
	UINT8 m_sports_pad_last_data_2;
	UINT8 m_sports_pad_1_x;
	UINT8 m_sports_pad_1_y;
	UINT8 m_sports_pad_2_x;
	UINT8 m_sports_pad_2_y;

	/* Data needed for Light Phaser */
	emu_timer *m_lphaser_1_timer;
	emu_timer *m_lphaser_2_timer;
	UINT8 m_lphaser_1_latch;
	UINT8 m_lphaser_2_latch;
	int m_lphaser_x_offs;	/* Needed to 'calibrate' lphaser; set at cart loading */

	/* Data needed for SegaScope (3D glasses) */
	UINT8 m_sscope_state;

	/* Cartridge slot info */
	UINT8 m_current_cartridge;
	struct
	{
		UINT8 *ROM;        /* Pointer to ROM image data */
		UINT32 size;       /* Size of the ROM image */
		UINT32 features;   /* on-cartridge special hardware */
		UINT8 *cartSRAM;   /* on-cartridge SRAM */
		UINT8 sram_save;   /* should be the contents of the on-cartridge SRAM be saved */
		UINT8 *cartRAM;    /* additional on-cartridge RAM (64KB for Ernie Els Golf) */
		UINT32 ram_size;   /* size of the on-cartridge RAM */
		UINT8 ram_page;    /* currently swapped in cartridge RAM */

		/* Data needed for Terebi Oekaki (TV Draw) */
		UINT8 m_tvdraw_data;

		/* Data needed for 4pak mapper */
		UINT8 m_4pak_page0;
		UINT8 m_4pak_page1;
		UINT8 m_4pak_page2;

		/* Data needed for 93c46 */
		bool m_93c46_enabled;
		UINT8 m_93c46_lines;
	} m_cartridge[MAX_CARTRIDGES];
	DECLARE_WRITE8_MEMBER(sms_input_write);
	DECLARE_WRITE8_MEMBER(sms_fm_detect_w);
	DECLARE_READ8_MEMBER(sms_fm_detect_r);
	DECLARE_WRITE8_MEMBER(sms_io_control_w);
	DECLARE_READ8_MEMBER(sms_count_r);
	DECLARE_READ8_MEMBER(sms_input_port_0_r);
	DECLARE_READ8_MEMBER(sms_input_port_1_r);
	DECLARE_WRITE8_MEMBER(sms_ym2413_register_port_0_w);
	DECLARE_WRITE8_MEMBER(sms_ym2413_data_port_0_w);
	DECLARE_READ8_MEMBER(gg_input_port_2_r);
	DECLARE_READ8_MEMBER(sms_sscope_r);
	DECLARE_WRITE8_MEMBER(sms_sscope_w);
	DECLARE_READ8_MEMBER(sms_mapper_r);
	DECLARE_WRITE8_MEMBER(sms_tvdraw_axis_w);
	DECLARE_READ8_MEMBER(sms_tvdraw_status_r);
	DECLARE_READ8_MEMBER(sms_tvdraw_data_r);
	DECLARE_WRITE8_MEMBER(sms_93c46_w);
	DECLARE_READ8_MEMBER(sms_93c46_r);
	DECLARE_WRITE8_MEMBER(sms_mapper_w);
	DECLARE_WRITE8_MEMBER(sms_korean_zemina_banksw_w);
	DECLARE_WRITE8_MEMBER(sms_codemasters_page0_w);
	DECLARE_WRITE8_MEMBER(sms_codemasters_page1_w);
	DECLARE_WRITE8_MEMBER(sms_4pak_page0_w);
	DECLARE_WRITE8_MEMBER(sms_4pak_page1_w);
	DECLARE_WRITE8_MEMBER(sms_4pak_page2_w);
	DECLARE_WRITE8_MEMBER(sms_janggun_bank0_w);
	DECLARE_WRITE8_MEMBER(sms_janggun_bank1_w);
	DECLARE_WRITE8_MEMBER(sms_janggun_bank2_w);
	DECLARE_WRITE8_MEMBER(sms_janggun_bank3_w);
	DECLARE_WRITE8_MEMBER(sms_bios_w);
	DECLARE_WRITE8_MEMBER(sms_cartram2_w);
	DECLARE_WRITE8_MEMBER(sms_cartram_w);
	DECLARE_WRITE8_MEMBER(gg_sio_w);
	DECLARE_READ8_MEMBER(gg_sio_r);
	DECLARE_READ8_MEMBER(sms_store_cart_select_r);
	DECLARE_WRITE8_MEMBER(sms_store_cart_select_w);
	DECLARE_READ8_MEMBER(sms_store_select1);
	DECLARE_READ8_MEMBER(sms_store_select2);
	DECLARE_READ8_MEMBER(sms_store_control_r);
	DECLARE_WRITE8_MEMBER(sms_store_control_w);
	DECLARE_DRIVER_INIT(sg1000m3);
	DECLARE_DRIVER_INIT(gamegear);
	DECLARE_DRIVER_INIT(gamegeaj);
	DECLARE_DRIVER_INIT(sms2kr);
	DECLARE_DRIVER_INIT(smsj);
	DECLARE_DRIVER_INIT(sms1);
	DECLARE_DRIVER_INIT(smssdisp);
};


/*----------- defined in machine/sms.c -----------*/

/* Function prototypes */

INPUT_CHANGED( lgun1_changed );
INPUT_CHANGED( lgun2_changed );

WRITE_LINE_DEVICE_HANDLER( sms_pause_callback );
WRITE_LINE_DEVICE_HANDLER( sms_store_int_callback );

DEVICE_START( sms_cart );
DEVICE_IMAGE_LOAD( sms_cart );

MACHINE_START( sms );
MACHINE_RESET( sms );


#define IO_EXPANSION    (0x80)	/* Expansion slot enable (1= disabled, 0= enabled) */
#define IO_CARTRIDGE    (0x40)	/* Cartridge slot enable (1= disabled, 0= enabled) */
#define IO_CARD         (0x20)	/* Card slot disabled (1= disabled, 0= enabled) */
#define IO_WORK_RAM     (0x10)	/* Work RAM disabled (1= disabled, 0= enabled) */
#define IO_BIOS_ROM     (0x08)	/* BIOS ROM disabled (1= disabled, 0= enabled) */
#define IO_CHIP         (0x04)	/* I/O chip disabled (1= disabled, 0= enabled) */



VIDEO_START( sms1 );
VIDEO_START( gamegear );
SCREEN_UPDATE_RGB32( sms1 );
SCREEN_UPDATE_RGB32( sms );
SCREEN_UPDATE_RGB32( gamegear );

#endif /* SMS_H_ */