1 // license:BSD-3-Clause
2 // copyright-holders:Aaron Giles
3 /***************************************************************************
4 
5     Sega Y-Board hardware
6 
7 ***************************************************************************/
8 #ifndef MAME_INCLUDES_SEGAYBD_H
9 #define MAME_INCLUDES_SEGAYBD_H
10 
11 #pragma once
12 
13 #include "cpu/m68000/m68000.h"
14 #include "cpu/z80/z80.h"
15 #include "machine/mb3773.h"
16 #include "video/segaic16.h"
17 #include "video/sega16sp.h"
18 #include "screen.h"
19 
20 
21 // ======================> segaybd_state
22 
23 class segaybd_state : public sega_16bit_common_base
24 {
25 public:
26 	// construction/destruction
segaybd_state(const machine_config & mconfig,device_type type,const char * tag)27 	segaybd_state(const machine_config &mconfig, device_type type, const char *tag)
28 		: sega_16bit_common_base(mconfig, type, tag)
29 		, m_maincpu(*this, "maincpu")
30 		, m_subx(*this, "subx")
31 		, m_suby(*this, "suby")
32 		, m_soundcpu(*this, "soundcpu")
33 		, m_linkcpu(*this, "linkcpu")
34 		, m_watchdog(*this, "watchdog")
35 		, m_screen(*this, "screen")
36 		, m_bsprites(*this, "bsprites")
37 		, m_ysprites(*this, "ysprites")
38 		, m_segaic16vid(*this, "segaic16vid")
39 		, m_adc_ports(*this, "ADC.%u", 0)
40 		, m_pdrift_bank(0)
41 		, m_scanline_timer(nullptr)
42 		, m_irq2_scanline(0)
43 		, m_timer_irq_state(0)
44 		, m_vblank_irq_state(0)
45 		, m_misc_io_data(0)
46 	{
47 	}
48 
49 	void yboard_deluxe(machine_config &config);
50 	void yboard_link(machine_config &config);
51 	void yboard(machine_config &config);
52 
53 	// game-specific driver init
54 	void init_generic();
55 	void init_pdrift();
56 	void init_r360();
57 	void init_gforce2();
58 	void init_rchase();
59 	void init_gloc();
60 
61 private:
62 	// main CPU read/write handlers
63 	void output1_w(uint8_t data);
64 	void misc_output_w(uint8_t data);
65 	void output2_w(uint8_t data);
66 
67 	// linked cabinet specific handlers
68 	DECLARE_WRITE_LINE_MEMBER(mb8421_intl);
69 	DECLARE_WRITE_LINE_MEMBER(mb8421_intr);
70 	uint16_t link_r();
71 	uint16_t link2_r();
72 	void link2_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
73 //  uint8_t link_portc0_r();
74 
75 	// input helpers
76 	ioport_value analog_mux();
77 
78 	// game-specific output handlers
79 	void gforce2_output_cb1(uint16_t data);
80 	void gforce2_output_cb2(uint16_t data);
81 	void gloc_output_cb1(uint16_t data);
82 	void gloc_output_cb2(uint16_t data);
83 	void r360_output_cb2(uint16_t data);
84 	void pdrift_output_cb1(uint16_t data);
85 	void pdrift_output_cb2(uint16_t data);
86 	void rchase_output_cb2(uint16_t data);
87 
88 	// video updates
89 	uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
90 
91 	void link_map(address_map &map);
92 	void link_portmap(address_map &map);
93 	void main_map(address_map &map);
94 	void main_map_link(address_map &map);
95 	void motor_map(address_map &map);
96 	void sound_map(address_map &map);
97 	void sound_portmap(address_map &map);
98 	void subx_map(address_map &map);
99 	void suby_map(address_map &map);
100 
101 	// internal types
102 	typedef delegate<void (uint16_t)> output_delegate;
103 
104 	// timer IDs
105 	enum
106 	{
107 		TID_IRQ2_GEN
108 	};
109 
110 	// device overrides
111 	virtual void machine_reset() override;
112 	virtual void video_start() override;
113 	virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
114 
115 	// internal helpers
116 	void update_irqs();
117 
118 	// devices
119 	required_device<m68000_device> m_maincpu;
120 	required_device<m68000_device> m_subx;
121 	required_device<m68000_device> m_suby;
122 	required_device<z80_device> m_soundcpu;
123 	optional_device<z80_device> m_linkcpu;
124 	required_device<mb3773_device> m_watchdog;
125 	required_device<screen_device> m_screen;
126 	required_device<sega_sys16b_sprite_device> m_bsprites;
127 	required_device<sega_yboard_sprite_device> m_ysprites;
128 	required_device<segaic16_video_device> m_segaic16vid;
129 
130 	// input ports
131 	optional_ioport_array<6> m_adc_ports;
132 
133 	// configuration
134 	output_delegate m_output_cb1;
135 	output_delegate m_output_cb2;
136 
137 	// internal state
138 	uint16_t          m_pdrift_bank;
139 	emu_timer *     m_scanline_timer;
140 	int             m_irq2_scanline;
141 	uint8_t           m_timer_irq_state;
142 	uint8_t           m_vblank_irq_state;
143 	uint8_t           m_misc_io_data;
144 };
145 
146 #endif // MAME_INCLUDES_SEGAYBD_H
147