1 // license:BSD-3-Clause
2 // copyright-holders:Alex Pasadyn, Zsolt Vasvari, Ernesto Corvi, Aaron Giles
3 // thanks-to:Kurt Mahan
4 /*************************************************************************
5 
6     Williams/Midway Y/Z-unit system
7 
8 **************************************************************************/
9 #ifndef MAME_INCLUDES_MIDYUNIT_H
10 #define MAME_INCLUDES_MIDYUNIT_H
11 
12 #pragma once
13 
14 #include "audio/williams.h"
15 
16 #include "cpu/tms34010/tms34010.h"
17 #include "machine/adc0844.h"
18 #include "machine/gen_latch.h"
19 #include "machine/nvram.h"
20 #include "sound/okim6295.h"
21 #include "emupal.h"
22 
23 
24 class midyunit_state : public driver_device
25 {
26 public:
midyunit_state(const machine_config & mconfig,device_type type,const char * tag)27 	midyunit_state(const machine_config &mconfig, device_type type, const char *tag)
28 		: driver_device(mconfig, type, tag)
29 		, m_maincpu(*this, "maincpu")
30 		, m_audiocpu(*this, "audiocpu")
31 		, m_oki(*this, "oki")
32 		, m_palette(*this, "palette")
33 		, m_narc_sound(*this, "narcsnd")
34 		, m_cvsd_sound(*this, "cvsd")
35 		, m_adpcm_sound(*this, "adpcm")
36 		, m_soundlatch(*this, "soundlatch")
37 		, m_term2_adc(*this, "adc")
38 		, m_nvram(*this, "nvram")
39 		, m_generic_paletteram_16(*this, "paletteram")
40 		, m_gfx_rom(*this, "gfx_rom", 16)
41 		, m_mainram(*this, "mainram")
42 		, m_ports(*this, { { "IN0", "IN1", "IN2", "DSW", "UNK0", "UNK1" } })
43 	{
44 	}
45 
46 	void term2(machine_config &config);
47 	void yunit_cvsd_4bit_fast(machine_config &config);
48 	void yunit_adpcm_6bit_fast(machine_config &config);
49 	void yunit_cvsd_6bit_slow(machine_config &config);
50 	void yunit_cvsd_4bit_slow(machine_config &config);
51 	void mkyawdim(machine_config &config);
52 	void yunit_core(machine_config &config);
53 	void zunit(machine_config &config);
54 	void yunit_adpcm_6bit_faster(machine_config &config);
55 
56 	void init_smashtv();
57 	void init_strkforc();
58 	void init_narc();
59 	void init_term2();
60 	void init_term2la1();
61 	void init_term2la3();
62 	void init_mkyunit();
63 	void init_trog();
64 	void init_totcarn();
65 	void init_mkyawdim();
66 	void init_mkyawdim2();
67 	void init_shimpact();
68 	void init_hiimpact();
69 	void init_mkyturbo();
70 	void init_term2la2();
71 
72 	DECLARE_READ_LINE_MEMBER(narc_talkback_strobe_r);
73 	DECLARE_CUSTOM_INPUT_MEMBER(narc_talkback_data_r);
74 	DECLARE_READ_LINE_MEMBER(adpcm_irq_state_r);
75 
76 private:
77 	/* protection data types */
78 	struct protection_data
79 	{
80 		uint16_t  reset_sequence[3];
81 		uint16_t  data_sequence[100];
82 	};
83 
84 	struct dma_state_t
85 	{
86 		uint32_t      offset;         // source offset, in bits
87 		int32_t       rowbytes;       // source bytes to skip each row
88 		int32_t       xpos;           // x position, clipped
89 		int32_t       ypos;           // y position, clipped
90 		int32_t       width;          // horizontal pixel count
91 		int32_t       height;         // vertical pixel count
92 		uint16_t      palette;        // palette base
93 		uint16_t      color;          // current foreground color with palette
94 	};
95 
96 	enum
97 	{
98 		TIMER_DMA,
99 		TIMER_AUTOERASE_LINE
100 	};
101 
102 	required_device<tms34010_device> m_maincpu;
103 	optional_device<cpu_device> m_audiocpu;
104 	optional_device<okim6295_device> m_oki;
105 	required_device<palette_device> m_palette;
106 	optional_device<williams_narc_sound_device> m_narc_sound;
107 	optional_device<williams_cvsd_sound_device> m_cvsd_sound;
108 	optional_device<williams_adpcm_sound_device> m_adpcm_sound;
109 	optional_device<generic_latch_8_device> m_soundlatch;
110 	optional_device<adc0844_device> m_term2_adc;
111 	required_device<nvram_device> m_nvram;
112 
113 	required_shared_ptr<uint16_t> m_generic_paletteram_16;
114 	optional_shared_ptr<uint8_t> m_gfx_rom;
115 	required_shared_ptr<uint16_t> m_mainram;
116 	optional_ioport_array<6> m_ports;
117 
118 	std::unique_ptr<uint16_t[]> m_cmos_ram;
119 	uint32_t m_cmos_page;
120 	uint16_t m_prot_result;
121 	uint16_t m_prot_sequence[3];
122 	uint8_t m_prot_index;
123 	const struct protection_data *m_prot_data;
124 	uint8_t m_cmos_w_enable;
125 	uint8_t m_chip_type;
126 	uint16_t *m_t2_hack_mem;
127 	uint8_t *m_cvsd_protection_base;
128 	uint8_t m_autoerase_enable;
129 	uint32_t m_palette_mask;
130 	std::unique_ptr<pen_t[]> m_pen_map;
131 	std::unique_ptr<uint16_t[]>   m_local_videoram;
132 	uint8_t m_videobank_select;
133 	uint8_t m_yawdim_dma;
134 	uint16_t m_dma_register[16];
135 	dma_state_t m_dma_state;
136 	emu_timer *m_dma_timer;
137 	emu_timer *m_autoerase_line_timer;
138 	void midyunit_cmos_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
139 	uint16_t midyunit_cmos_r(offs_t offset);
140 	void midyunit_cmos_enable_w(address_space &space, uint16_t data);
141 	uint16_t midyunit_protection_r();
142 	uint16_t midyunit_input_r(offs_t offset);
143 	void midyunit_sound_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
144 	uint16_t term2_input_r(offs_t offset);
145 	void term2_sound_w(offs_t offset, uint16_t data);
146 	void term2_hack_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
147 	void term2la3_hack_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
148 	void term2la2_hack_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
149 	void term2la1_hack_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
150 	void cvsd_protection_w(offs_t offset, uint8_t data);
151 	uint16_t mkturbo_prot_r();
152 	uint16_t midyunit_gfxrom_r(offs_t offset);
153 	void midyunit_vram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
154 	uint16_t midyunit_vram_r(offs_t offset);
155 	void midyunit_control_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
156 	void midyunit_paletteram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
157 	uint16_t midyunit_dma_r(offs_t offset);
158 	void midyunit_dma_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
159 	void yawdim_oki_bank_w(uint8_t data);
160 	void yawdim2_oki_bank_w(uint8_t data);
161 	uint8_t yawdim2_soundlatch_r();
162 	TMS340X0_TO_SHIFTREG_CB_MEMBER(to_shiftreg);
163 	TMS340X0_FROM_SHIFTREG_CB_MEMBER(from_shiftreg);
164 	TMS340X0_SCANLINE_IND16_CB_MEMBER(scanline_update);
165 	DECLARE_MACHINE_RESET(midyunit);
166 	DECLARE_VIDEO_START(midzunit);
167 	DECLARE_VIDEO_START(midyunit_4bit);
168 	DECLARE_VIDEO_START(midyunit_6bit);
169 	DECLARE_VIDEO_START(mkyawdim);
170 	DECLARE_VIDEO_START(common);
171 	TIMER_CALLBACK_MEMBER(dma_callback);
172 	TIMER_CALLBACK_MEMBER(autoerase_line);
173 
174 	void main_map(address_map &map);
175 	void yawdim_sound_map(address_map &map);
176 
177 	virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
178 	void dma_draw(uint16_t command);
179 	void init_generic(int bpp, int sound, int prot_start, int prot_end);
180 	void term2_init_common(write16s_delegate hack_w);
181 };
182 
183 #endif // MAME_INCLUDES_MIDYUNIT_H
184