1 // license:GPL-2.0+
2 // copyright-holders:David Graves, Jarek Burczynski
3 /*************************************************************************
4 
5     Darius
6 
7 *************************************************************************/
8 #ifndef MAME_INCLUDES_DARIUS_H
9 #define MAME_INCLUDES_DARIUS_H
10 
11 #pragma once
12 
13 #include "sound/flt_vol.h"
14 #include "sound/msm5205.h"
15 #include "video/pc080sn.h"
16 #include "emupal.h"
17 #include "tilemap.h"
18 
19 #define VOL_MAX    (3 * 2 + 2)
20 #define PAN_MAX    (2 + 2 + 1)   /* FM 2port + PSG 2port + DA 1port */
21 
22 class darius_state : public driver_device
23 {
24 public:
darius_state(const machine_config & mconfig,device_type type,const char * tag)25 	darius_state(const machine_config &mconfig, device_type type, const char *tag) :
26 		driver_device(mconfig, type, tag),
27 		m_spriteram(*this, "spriteram"),
28 		m_fg_ram(*this, "fg_ram"),
29 		m_audiobank(*this, "audiobank"),
30 		m_maincpu(*this, "maincpu"),
31 		m_audiocpu(*this, "audiocpu"),
32 		m_msm(*this, "msm"),
33 		m_cpub(*this, "cpub"),
34 		m_adpcm(*this, "adpcm"),
35 		m_pc080sn(*this, "pc080sn"),
36 		m_filter_l{{*this, "filter0.%ul", 0U},
37 					{*this, "filter1.%ul", 0U}},
38 		m_filter_r{{*this, "filter0.%ur", 0U},
39 					{*this, "filter1.%ur", 0U}},
40 		m_msm5205_l(*this, "msm5205.l"),
41 		m_msm5205_r(*this, "msm5205.r"),
42 		m_gfxdecode(*this, "gfxdecode"),
43 		m_palette(*this, "palette")
44 	{ }
45 
46 	void darius(machine_config &config);
47 
48 protected:
49 	virtual void device_post_load() override;
50 	virtual void machine_start() override;
51 	virtual void machine_reset() override;
52 	virtual void video_start() override;
53 
54 private:
55 	/* memory pointers */
56 	required_shared_ptr<u16> m_spriteram;
57 	required_shared_ptr<u16> m_fg_ram;
58 	required_memory_bank m_audiobank;
59 
60 	/* video-related */
61 	tilemap_t  *m_fg_tilemap;
62 
63 	/* misc */
64 	u16     m_cpua_ctrl;
65 	u16     m_coin_word;
66 	u8      m_adpcm_command;
67 	u8      m_nmi_enable;
68 	u32     m_def_vol[0x10];
69 	u8      m_vol[VOL_MAX];
70 	u8      m_pan[PAN_MAX];
71 
72 	/* devices */
73 	required_device<cpu_device> m_maincpu;
74 	required_device<cpu_device> m_audiocpu;
75 	required_device<msm5205_device> m_msm;
76 	required_device<cpu_device> m_cpub;
77 	required_device<cpu_device> m_adpcm;
78 	required_device<pc080sn_device> m_pc080sn;
79 
80 	required_device_array<filter_volume_device, 4> m_filter_l[2];
81 	required_device_array<filter_volume_device, 4> m_filter_r[2];
82 	required_device<filter_volume_device> m_msm5205_l;
83 	required_device<filter_volume_device> m_msm5205_r;
84 	required_device<gfxdecode_device> m_gfxdecode;
85 	required_device<palette_device> m_palette;
86 
87 	void cpua_ctrl_w(u16 data);
88 	u16 coin_r();
89 	void coin_w(u16 data);
90 	void sound_bankswitch_w(u8 data);
91 	void adpcm_command_w(u8 data);
92 	void fm0_pan_w(u8 data);
93 	void fm1_pan_w(u8 data);
94 	void psg0_pan_w(u8 data);
95 	void psg1_pan_w(u8 data);
96 	void da_pan_w(u8 data);
97 	u8 adpcm_command_r();
98 	u8 readport2();
99 	u8 readport3();
100 	void adpcm_nmi_disable(u8 data);
101 	void adpcm_nmi_enable(u8 data);
102 	void fg_layer_w(offs_t offset, u16 data, u16 mem_mask = ~0);
103 	void write_portA0(u8 data);
104 	void write_portA1(u8 data);
105 	void write_portB0(u8 data);
106 	void write_portB1(u8 data);
107 	void adpcm_data_w(u8 data);
108 	TILE_GET_INFO_MEMBER(get_fg_tile_info);
109 	u32 screen_update_left(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
110 	u32 screen_update_middle(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
111 	u32 screen_update_right(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
112 	void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int x_offs, int y_offs);
113 	u32 update_screen(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int xoffs);
114 	void parse_control();   // assumes Z80 sandwiched between 68Ks
115 	void update_fm0();
116 	void update_fm1();
117 	void update_psg0(int port);
118 	void update_psg1(int port);
119 	void update_da();
120 	DECLARE_WRITE_LINE_MEMBER(adpcm_int);
121 	void darius_cpub_map(address_map &map);
122 	void darius_map(address_map &map);
123 	void darius_sound2_io_map(address_map &map);
124 	void darius_sound2_map(address_map &map);
125 	void darius_sound_map(address_map &map);
126 };
127 
128 #endif // MAME_INCLUDES_DARIUS_H
129