1 // license:BSD-3-Clause
2 // copyright-holders:Carlos A. Lozano, Rob Rosenbrock, Phil Stroffolino
3 #ifndef MAME_INCLUDES_XAIN_H
4 #define MAME_INCLUDES_XAIN_H
5 
6 #pragma once
7 
8 #include "machine/taito68705interface.h"
9 
10 #include "machine/gen_latch.h"
11 #include "machine/timer.h"
12 #include "emupal.h"
13 #include "screen.h"
14 #include "tilemap.h"
15 
16 class xain_state : public driver_device
17 {
18 public:
xain_state(const machine_config & mconfig,device_type type,const char * tag)19 	xain_state(const machine_config &mconfig, device_type type, const char *tag)
20 		: driver_device(mconfig, type, tag)
21 		, m_maincpu(*this, "maincpu")
22 		, m_audiocpu(*this, "audiocpu")
23 		, m_subcpu(*this, "sub")
24 		, m_mcu(*this, "mcu")
25 		, m_gfxdecode(*this, "gfxdecode")
26 		, m_screen(*this, "screen")
27 		, m_palette(*this, "palette")
28 		, m_soundlatch(*this, "soundlatch")
29 		, m_charram(*this, "charram")
30 		, m_bgram(*this, "bgram%u", 0U)
31 		, m_spriteram(*this, "spriteram")
32 		, m_char_tilemap(nullptr)
33 		, m_bg_tilemaps{ nullptr, nullptr }
34 		, m_rom_banks(*this, { "mainbank", "subbank" })
35 	{
36 	}
37 
38 	void xsleena(machine_config &config);
39 	void xsleenab(machine_config &config);
40 
41 	DECLARE_READ_LINE_MEMBER(vblank_r);
42 	DECLARE_CUSTOM_INPUT_MEMBER(mcu_status_r);
43 
44 protected:
45 	virtual void machine_start() override;
46 	virtual void video_start() override;
47 
48 private:
49 	void cpuA_bankswitch_w(uint8_t data);
50 	void cpuB_bankswitch_w(uint8_t data);
51 	void main_irq_w(offs_t offset, uint8_t data);
52 	void irqA_assert_w(uint8_t data);
53 	void irqB_clear_w(uint8_t data);
54 	uint8_t mcu_comm_reset_r();
55 	template <unsigned N> void bgram_w(offs_t offset, uint8_t data);
56 	void charram_w(offs_t offset, uint8_t data);
57 	template <unsigned N> void scrollx_w(offs_t offset, uint8_t data);
58 	template <unsigned N> void scrolly_w(offs_t offset, uint8_t data);
59 	void flipscreen_w(uint8_t data);
60 
61 	TILEMAP_MAPPER_MEMBER(back_scan);
62 	template <unsigned N> TILE_GET_INFO_MEMBER(get_bg_tile_info);
63 	TILE_GET_INFO_MEMBER(get_char_tile_info);
64 
65 	TIMER_DEVICE_CALLBACK_MEMBER(scanline);
66 
67 	uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
68 
69 	void bootleg_map(address_map &map);
70 	void main_map(address_map &map);
71 	void cpu_map_B(address_map &map);
72 	void sound_map(address_map &map);
73 
74 	int scanline_to_vcount(int scanline);
75 
76 	void draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect);
77 
78 	required_device<cpu_device>             m_maincpu;
79 	required_device<cpu_device>             m_audiocpu;
80 	required_device<cpu_device>             m_subcpu;
81 	optional_device<taito68705_mcu_device>  m_mcu;
82 	required_device<gfxdecode_device>       m_gfxdecode;
83 	required_device<screen_device>          m_screen;
84 	required_device<palette_device>         m_palette;
85 	required_device<generic_latch_8_device> m_soundlatch;
86 
87 	required_shared_ptr<u8> m_charram;
88 	required_shared_ptr_array<u8, 2> m_bgram;
89 	required_shared_ptr<u8> m_spriteram;
90 
91 	tilemap_t   *m_char_tilemap;
92 	tilemap_t   *m_bg_tilemaps[2];
93 
94 	required_memory_bank_array<2> m_rom_banks;
95 
96 	int     m_vblank;
97 
98 	u8      m_pri;
99 	u8      m_scrollx[2][2];
100 	u8      m_scrolly[2][2];
101 };
102 
103 #endif // MAME_INCLUDES_XAIN_H
104