summaryrefslogblamecommitdiffstatshomepage
path: root/src/mame/includes/vsmile.h
blob: 8953d343acbec2e9abe4f349e54b64583a5807cf (plain) (tree)





































                                                                                           



                                             
                                                  












                                                 
                                                 



















































































































                                                                                       
// license:BSD-3-Clause
// copyright-holders:Ryan Holtz
/******************************************************************************

    V-Tech V.Smile console emulation
    V-Tech V.Smile Baby console emulation

    Similar Systems:

        V.Smile Pocket
        V.Smile Cyber Pocket
        V.Smile PC Pal
        V-Motion Active Learning System
        V.Flash
        V.Baby
        Leapfrog Leapster

*******************************************************************************/

#ifndef MAME_INCLUDES_VSMILE_H
#define MAME_INCLUDES_VSMILE_H

#include "bus/vsmile/vsmile_ctrl.h"
#include "bus/vsmile/vsmile_slot.h"
#include "bus/vsmile/rom.h"

#include "cpu/unsp/unsp.h"

#include "machine/bankdev.h"
#include "machine/spg2xx.h"

#include "screen.h"

class vsmile_base_state : public driver_device
{
public:
	vsmile_base_state(const machine_config &mconfig, device_type type, const char *tag)
		: driver_device(mconfig, type, tag)
		, m_maincpu(*this, "maincpu")
		, m_screen(*this, "screen")
		, m_bankdev(*this, "bank")
		, m_cart(*this, "cartslot")
		, m_system_region(*this, "sysrom")
	{ }

	void vsmile_base(machine_config &config);

protected:
	virtual void machine_start() override;

	void mem_map(address_map &map);

	DECLARE_WRITE8_MEMBER(chip_sel_w);

	DECLARE_READ16_MEMBER(bank3_r);

	required_device<spg2xx_device> m_maincpu;
	required_device<screen_device> m_screen;
	required_device<address_map_bank_device> m_bankdev;
	required_device<vsmile_cart_slot_device> m_cart;
	required_memory_region m_system_region;
};

class vsmile_state : public vsmile_base_state
{
public:
	vsmile_state(const machine_config &mconfig, device_type type, const char *tag)
		: vsmile_base_state(mconfig, type, tag)
		, m_ctrl(*this, "ctrl%u", 1U)
		, m_dsw_region(*this, "REGION")
	{ }

	void vsmile(machine_config &config);
	void vsmilep(machine_config &config);

private:
	virtual void machine_start() override;
	virtual void machine_reset() override;

	void banked_map(address_map &map);

	DECLARE_WRITE8_MEMBER(ctrl_tx_w);
	template <int Which> DECLARE_WRITE_LINE_MEMBER(ctrl_rts_w);

	DECLARE_READ16_MEMBER(portb_r);
	DECLARE_WRITE16_MEMBER(portb_w);
	DECLARE_READ16_MEMBER(portc_r);
	DECLARE_WRITE16_MEMBER(portc_w);

	DECLARE_WRITE8_MEMBER(uart_rx);

	enum
	{
		VSMILE_PORTB_CS1 =      0x01,
		VSMILE_PORTB_CS2 =      0x02,
		VSMILE_PORTB_CART =     0x04,
		VSMILE_PORTB_RESET =    0x08,
		VSMILE_PORTB_FRONT24 =  0x10,
		VSMILE_PORTB_OFF =      0x20,
		VSMILE_PORTB_OFF_SW =   0x40,
		VSMILE_PORTB_ON_SW =    0x80,

		VSMILE_PORTC_VER =      0x0f,
		VSMILE_PORTC_LOGO =     0x10,
		VSMILE_PORTC_TEST =     0x20,
		VSMILE_PORTC_AMP =      0x40,
		VSMILE_PORTC_SYSRESET = 0x80,
	};

	required_device_array<vsmile_ctrl_port_device, 2> m_ctrl;
	required_ioport m_dsw_region;

	bool m_ctrl_rts[2];
	bool m_ctrl_select[2];
};

class vsmilem_state : public vsmile_state
{
public:
	vsmilem_state(const machine_config &mconfig, device_type type, const char *tag)
		: vsmile_state(mconfig, type, tag)
	{ }

	void vsmilem(machine_config &config);

protected:
	DECLARE_WRITE16_MEMBER(porta_w);
	DECLARE_READ16_MEMBER(porta_r);
};

class vsmileb_state : public vsmile_base_state
{
public:
	vsmileb_state(const machine_config &mconfig, device_type type, const char *tag)
		: vsmile_base_state(mconfig, type, tag)
		, m_io_logo(*this, "LOGO")
	{ }

	void vsmileb(machine_config &config);
	void vsmilebp(machine_config &config);

	enum : uint16_t
	{
		BUTTON_YELLOW   = 0x01fe,
		BUTTON_BLUE     = 0x03ee,
		BUTTON_ORANGE   = 0x03de,
		BUTTON_GREEN    = 0x03be,
		BUTTON_RED      = 0x02fe,
		BUTTON_CLOUD    = 0x03f6,
		BUTTON_BALL     = 0x03fa,
		BUTTON_EXIT     = 0x03fc
	};

	DECLARE_INPUT_CHANGED_MEMBER(pad_button_changed);

	// make slide switches usable on a keyboard
	template <uint16_t V> DECLARE_INPUT_CHANGED_MEMBER(sw_mode);

private:
	virtual void machine_start() override;
	virtual void machine_reset() override;

	void banked_map(address_map &map);

	DECLARE_READ16_MEMBER(porta_r);
	DECLARE_READ16_MEMBER(portb_r);

	required_ioport m_io_logo;

	uint16_t m_mode;
};

#endif // MAME_INCLUDES_VSMILE_H