1 // license:BSD-3-Clause
2 // copyright-holders:Aaron Giles
3 /***************************************************************************
4 
5     Sega X-Board hardware
6 
7 ***************************************************************************/
8 #ifndef MAME_INCLUDES_SEGAXBD_H
9 #define MAME_INCLUDES_SEGAXBD_H
10 
11 #pragma once
12 
13 #include "video/segaic16.h"
14 #include "video/segaic16_road.h"
15 #include "video/sega16sp.h"
16 
17 #include "cpu/m68000/m68000.h"
18 #include "cpu/mcs51/mcs51.h"
19 #include "cpu/z80/z80.h"
20 #include "machine/cxd1095.h"
21 #include "machine/i8251.h"
22 #include "machine/mb3773.h"
23 #include "machine/mb8421.h"
24 #include "machine/segaic16.h"
25 #include "video/resnet.h"
26 #include "emupal.h"
27 #include "screen.h"
28 
29 // ======================> segaxbd_state
30 
31 
32 class segaxbd_state : public device_t
33 {
34 public:
35 	// construction/destruction
36 	segaxbd_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
37 
38 	void xboard_base_mconfig(machine_config &config);
39 
40 	void install_aburner2(void);
41 	void install_loffire(void);
42 	void install_smgp(void);
43 	void install_gprider(void);
44 
45 	// devices
46 	required_device<m68000_device> m_maincpu;
47 
48 	// custom I/O
49 	uint8_t aburner2_motor_r();
50 	void aburner2_motor_w(uint8_t data);
51 	uint8_t smgp_motor_r();
52 	void smgp_motor_w(uint8_t data);
53 	uint8_t lastsurv_port_r();
54 	void lastsurv_muxer_w(uint8_t data);
55 
56 	// game-specific main CPU read/write handlers
57 	void loffire_sync0_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
58 	uint16_t smgp_excs_r(offs_t offset);
59 	void smgp_excs_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
60 
61 protected:
62 	// main CPU read/write handlers
63 	uint8_t analog_r();
64 	void iocontrol_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
65 
66 	// video updates
67 	uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
68 
69 	// palette helpers
70 	void paletteram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
71 
72 	void decrypted_opcodes_map(address_map &map);
73 	void main_map(address_map &map);
74 	void smgp_airdrive_map(address_map &map);
75 	void smgp_airdrive_portmap(address_map &map);
76 	void smgp_comm_map(address_map &map);
77 	void smgp_comm_portmap(address_map &map);
78 	void smgp_sound2_map(address_map &map);
79 	void smgp_sound2_portmap(address_map &map);
80 	void sound_map(address_map &map);
81 	void sound_portmap(address_map &map);
82 	void sub_map(address_map &map);
83 
84 	// timer IDs
85 	enum
86 	{
87 		TID_SCANLINE,
88 		TID_IRQ2_GEN
89 	};
90 
91 	segaxbd_state(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
92 
93 	// device overrides
94 //  virtual void machine_reset();
95 	virtual void video_start();
96 	virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
97 
98 	// internal helpers
99 	void update_main_irqs();
100 	DECLARE_WRITE_LINE_MEMBER(m68k_reset_callback);
101 	void generic_iochip0_lamps_w(uint8_t data);
102 
103 	// compare/timer chip callbacks
104 	DECLARE_WRITE_LINE_MEMBER(timer_irq_w);
105 
106 	void pc_0_w(uint8_t data);
107 	void pd_0_w(uint8_t data);
108 
109 	// devices
110 	required_device<m68000_device> m_subcpu;
111 	optional_device<z80_device> m_soundcpu;
112 	optional_device<z80_device> m_soundcpu2;
113 	optional_device<i8751_device> m_mcu;
114 	required_device<mb3773_device> m_watchdog;
115 	required_device_array<cxd1095_device, 2> m_iochip;
116 	required_device<sega_315_5250_compare_timer_device> m_cmptimer_1;
117 	required_device<sega_xboard_sprite_device> m_sprites;
118 	required_device<segaic16_video_device> m_segaic16vid;
119 	required_device<segaic16_road_device> m_segaic16road;
120 	required_shared_ptr<uint16_t> m_subram0;
121 
122 	// configuration
123 	bool            m_adc_reverse[8];
124 	uint8_t           m_road_priority;
125 
126 	// internal state
127 	emu_timer *     m_scanline_timer;
128 	uint8_t           m_timer_irq_state;
129 	uint8_t           m_vblank_irq_state;
130 	uint8_t           m_pc_0;
131 
132 	// game-specific state
133 	uint16_t *        m_loffire_sync;
134 	uint8_t           m_lastsurv_mux;
135 
136 	// memory pointers
137 	required_shared_ptr<uint16_t> m_paletteram;
138 	bool            m_gprider_hack;
139 
140 	void palette_init();
141 	uint32_t      m_palette_entries;          // number of palette entries
142 	uint8_t       m_palette_normal[32];       // RGB translations for normal pixels
143 	uint8_t       m_palette_shadow[32];       // RGB translations for shadowed pixels
144 	uint8_t       m_palette_hilight[32];      // RGB translations for hilighted pixels
145 	required_device<screen_device> m_screen;
146 	required_device<palette_device> m_palette;
147 	required_ioport m_io0_porta;
148 	optional_ioport_array<8> m_adc_ports;
149 	optional_ioport_array<4> m_mux_ports;
150 	output_finder<4> m_lamps;
151 
152 	virtual void device_start() override;
153 	virtual void device_reset() override;
154 };
155 
156 
157 class segaxbd_regular_state :  public segaxbd_state
158 {
159 public:
160 	segaxbd_regular_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
161 
162 protected:
163 	virtual void device_add_mconfig(machine_config &config) override;
164 };
165 
166 
167 
168 class segaxbd_fd1094_state :  public segaxbd_state
169 {
170 public:
171 	segaxbd_fd1094_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
172 
173 protected:
174 	virtual void device_add_mconfig(machine_config &config) override;
175 };
176 
177 class segaxbd_aburner2_state :  public segaxbd_state
178 {
179 public:
180 	segaxbd_aburner2_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
181 
182 protected:
183 	virtual void device_add_mconfig(machine_config &config) override;
184 //  virtual void device_start();
185 //  virtual void device_reset();
186 };
187 
188 class segaxbd_lastsurv_fd1094_state :  public segaxbd_state
189 {
190 public:
191 	segaxbd_lastsurv_fd1094_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
192 
193 protected:
194 	virtual void device_add_mconfig(machine_config &config) override;
195 };
196 
197 class segaxbd_lastsurv_state :  public segaxbd_state
198 {
199 public:
200 	segaxbd_lastsurv_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
201 
202 protected:
203 	virtual void device_add_mconfig(machine_config &config) override;
204 };
205 
206 
207 class segaxbd_smgp_fd1094_state :  public segaxbd_state
208 {
209 public:
210 	segaxbd_smgp_fd1094_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
211 
212 protected:
213 	virtual void device_add_mconfig(machine_config &config) override;
214 };
215 
216 
217 class segaxbd_smgp_state :  public segaxbd_state
218 {
219 public:
220 	segaxbd_smgp_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
221 
222 protected:
223 	virtual void device_add_mconfig(machine_config &config) override;
224 };
225 
226 
227 class segaxbd_rascot_state :  public segaxbd_state
228 {
229 public:
230 	segaxbd_rascot_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
231 
232 protected:
233 	virtual void device_add_mconfig(machine_config &config) override;
234 	virtual void device_start() override;
235 
236 private:
237 	uint8_t commram_r(offs_t offset);
238 	void commram_w(offs_t offset, uint8_t data);
239 	void commram_bank_w(uint8_t data);
240 
241 	void sub_map(address_map &map);
242 	void comm_map(address_map &map);
243 
244 	required_device<mb8421_device> m_commram;
245 	required_device<i8251_device> m_usart;
246 
247 	uint8_t m_commram_bank;
248 };
249 
250 #endif // MAME_INCLUDES_SEGAXBD_H
251