1 // license:BSD-3-Clause
2 // copyright-holders:Aaron Giles
3 /***************************************************************************
4 
5     Sega System Hang On hardware
6 
7 ***************************************************************************/
8 
9 #include "cpu/m68000/m68000.h"
10 #include "cpu/mcs51/mcs51.h"
11 #include "cpu/z80/z80.h"
12 #include "machine/adc0804.h"
13 #include "machine/i8255.h"
14 #include "machine/gen_latch.h"
15 #include "video/segaic16.h"
16 #include "video/segaic16_road.h"
17 #include "video/sega16sp.h"
18 #include "screen.h"
19 
20 
21 // ======================> segahang_state
22 
23 class segahang_state : public sega_16bit_common_base
24 {
25 public:
26 	// construction/destruction
segahang_state(const machine_config & mconfig,device_type type,const char * tag)27 	segahang_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_subcpu(*this, "subcpu")
31 		, m_soundcpu(*this, "soundcpu")
32 		, m_mcu(*this, "mcu")
33 		, m_i8255_1(*this, "i8255_1")
34 		, m_i8255_2(*this, "i8255_2")
35 		, m_adc(*this, "adc")
36 		, m_screen(*this, "screen")
37 		, m_sprites(*this, "sprites")
38 		, m_segaic16vid(*this, "segaic16vid")
39 		, m_segaic16road(*this, "segaic16road")
40 		, m_soundlatch(*this, "soundlatch")
41 		, m_workram(*this, "workram")
42 		, m_sharrier_video(false)
43 		, m_adc_select(0)
44 		, m_adc_ports(*this, "ADC%u", 0U)
45 		, m_decrypted_opcodes(*this, "decrypted_opcodes")
46 		, m_lamps(*this, "lamp%u", 0U)
47 	{ }
48 
49 	void sound_board_2203(machine_config &config);
50 	void sound_board_2203x2(machine_config &config);
51 	void sound_board_2151(machine_config &config);
52 	void shared_base(machine_config &config);
53 	void hangon_base(machine_config &config);
54 	void sharrier_base(machine_config &config);
55 	void enduror_base(machine_config &config);
56 	void endurord_base(machine_config &config);
57 	void endurob2(machine_config &config);
58 	void shangupb(machine_config &config);
59 	void enduror(machine_config &config);
60 	void shangonro(machine_config &config);
61 	void enduror1d(machine_config &config);
62 	void endurord(machine_config &config);
63 	void sharrier(machine_config &config);
64 	void endurobl(machine_config &config);
65 	void enduror1(machine_config &config);
66 	void hangon(machine_config &config);
67 
68 	// game-specific driver init
69 	void init_generic();
70 	void init_sharrier();
71 	void init_enduror();
72 	void init_endurobl();
73 	void init_endurob2();
74 
75 private:
76 	// PPI read/write callbacks
77 	void video_lamps_w(uint8_t data);
78 	void tilemap_sound_w(uint8_t data);
79 	void sub_control_adc_w(uint8_t data);
80 	uint8_t adc_status_r();
81 
82 	// main CPU read/write handlers
83 	uint8_t hangon_inputs_r(offs_t offset);
84 	uint8_t sharrier_inputs_r(offs_t offset);
85 	void sync_ppi_w(offs_t offset, uint8_t data);
86 
87 	// ADC0804 read handler
88 	uint8_t analog_r();
89 
90 	// Z80 sound CPU read/write handlers
91 	uint8_t sound_data_r();
92 
93 	// I8751-related VBLANK interrupt handlers
94 	INTERRUPT_GEN_MEMBER( i8751_main_cpu_vblank );
95 
96 	// video updates
97 	uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
98 
99 	void decrypted_opcodes_map(address_map &map);
100 	void fd1094_decrypted_opcodes_map(address_map &map);
101 	void hangon_map(address_map &map);
102 	void mcu_io_map(address_map &map);
103 	void sharrier_map(address_map &map);
104 	void sound_map_2151(address_map &map);
105 	void sound_map_2203(address_map &map);
106 	void sound_portmap_2151(address_map &map);
107 	void sound_portmap_2203(address_map &map);
108 	void sound_portmap_2203x2(address_map &map);
109 	void sub_map(address_map &map);
110 
111 	// internal types
112 	typedef delegate<void ()> i8751_sim_delegate;
113 
114 	// timer IDs
115 	enum
116 	{
117 		TID_INIT_I8751,
118 		TID_PPI_WRITE
119 	};
120 
121 	// driver overrides
122 	virtual void video_start() override;
machine_start()123 	virtual void machine_start() override { m_lamps.resolve(); }
124 	virtual void machine_reset() override;
125 	virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
126 
127 	// I8751 simulations
128 	void sharrier_i8751_sim();
129 
130 	// devices
131 	required_device<m68000_device> m_maincpu;
132 	required_device<m68000_device> m_subcpu;
133 	required_device<z80_device> m_soundcpu;
134 	optional_device<i8751_device> m_mcu;
135 	required_device<i8255_device> m_i8255_1;
136 	required_device<i8255_device> m_i8255_2;
137 	required_device<adc0804_device> m_adc;
138 	required_device<screen_device> m_screen;
139 	required_device<sega_16bit_sprite_device> m_sprites;
140 	required_device<segaic16_video_device> m_segaic16vid;
141 	required_device<segaic16_road_device> m_segaic16road;
142 	required_device<generic_latch_8_device> m_soundlatch;
143 
144 	// memory pointers
145 	required_shared_ptr<uint16_t> m_workram;
146 
147 	// configuration
148 	bool                    m_sharrier_video;
149 	i8751_sim_delegate      m_i8751_vblank_hook;
150 
151 	// internal state
152 	uint8_t                   m_adc_select;
153 	optional_ioport_array<4> m_adc_ports;
154 	bool                    m_shadow;
155 	optional_shared_ptr<uint16_t> m_decrypted_opcodes;
156 	output_finder<2> m_lamps;
157 };
158