1 // license:BSD-3-Clause
2 // copyright-holders:Ernesto Corvi, Phil Stroffolino
3 /*************************************************************************
4 
5     Taito Grand Champ hardware
6 
7 *************************************************************************/
8 #ifndef MAME_INCLUDES_GRCHAMP_H
9 #define MAME_INCLUDES_GRCHAMP_H
10 
11 #pragma once
12 
13 #include "machine/input_merger.h"
14 #include "machine/watchdog.h"
15 #include "sound/discrete.h"
16 #include "emupal.h"
17 #include "screen.h"
18 #include "tilemap.h"
19 
20 class grchamp_state : public driver_device
21 {
22 public:
grchamp_state(const machine_config & mconfig,device_type type,const char * tag)23 	grchamp_state(const machine_config &mconfig, device_type type, const char *tag) :
24 		driver_device(mconfig, type, tag),
25 		m_maincpu(*this, "maincpu"),
26 		m_audiocpu(*this, "audiocpu"),
27 		m_subcpu(*this, "sub"),
28 		m_watchdog(*this, "watchdog"),
29 		m_discrete(*this, "discrete"),
30 		m_gfxdecode(*this, "gfxdecode"),
31 		m_palette(*this, "palette"),
32 		m_screen(*this, "screen"),
33 		m_soundnmi(*this, "soundnmi"),
34 		m_radarram(*this, "radarram"),
35 		m_videoram(*this, "videoram"),
36 		m_spriteram(*this, "spriteram"),
37 		m_leftram(*this, "leftram"),
38 		m_rightram(*this, "rightram"),
39 		m_centerram(*this, "centerram"),
40 		m_digits(*this, "digit%u", 0U)
41 	{ }
42 
43 	void grchamp(machine_config &config);
44 
45 protected:
46 	virtual void machine_start() override;
47 	virtual void machine_reset() override;
48 	virtual void video_start() override;
49 
50 private:
51 	void cpu0_outputs_w(offs_t offset, uint8_t data);
52 	void led_board_w(offs_t offset, uint8_t data);
53 	void cpu1_outputs_w(offs_t offset, uint8_t data);
54 	uint8_t pc3259_0_r();
55 	uint8_t pc3259_1_r();
56 	uint8_t pc3259_2_r();
57 	uint8_t pc3259_3_r();
58 	uint8_t sub_to_main_comm_r();
59 	void main_to_sub_comm_w(offs_t offset, uint8_t data);
60 	uint8_t main_to_sub_comm_r(offs_t offset);
61 	uint8_t get_pc3259_bits(int offs);
62 	void left_w(offs_t offset, uint8_t data);
63 	void center_w(offs_t offset, uint8_t data);
64 	void right_w(offs_t offset, uint8_t data);
65 	TIMER_CALLBACK_MEMBER(soundlatch_w_cb);
66 	TIMER_CALLBACK_MEMBER(soundlatch_clear7_w_cb);
67 	uint8_t soundlatch_r();
68 	void soundlatch_clear7_w(uint8_t data);
69 	uint8_t soundlatch_flags_r();
70 	void portA_0_w(uint8_t data);
71 	void portB_0_w(uint8_t data);
72 	void portA_2_w(uint8_t data);
73 	void portB_2_w(uint8_t data);
74 
75 	TILE_GET_INFO_MEMBER(get_text_tile_info);
76 	TILE_GET_INFO_MEMBER(get_left_tile_info);
77 	TILE_GET_INFO_MEMBER(get_right_tile_info);
78 	TILE_GET_INFO_MEMBER(get_center_tile_info);
79 	TILEMAP_MAPPER_MEMBER(get_memory_offset);
80 
81 	void grchamp_palette(palette_device &palette) const;
82 	INTERRUPT_GEN_MEMBER(cpu0_interrupt);
83 	INTERRUPT_GEN_MEMBER(cpu1_interrupt);
84 	TIMER_CALLBACK_MEMBER(main_to_sub_comm_sync_w);
85 
86 	uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
87 	void draw_objects(int y, uint8_t *objdata);
88 	void main_map(address_map &map);
89 	void main_portmap(address_map &map);
90 	void sound_map(address_map &map);
91 	void sub_map(address_map &map);
92 	void sub_portmap(address_map &map);
93 
94 	uint8_t       m_cpu0_out[16];
95 	uint8_t       m_cpu1_out[16];
96 
97 	uint8_t       m_comm_latch;
98 	uint8_t       m_comm_latch2[4];
99 
100 	uint16_t      m_ledlatch;
101 	uint8_t       m_ledaddr;
102 	uint16_t      m_ledram[8];
103 
104 	uint8_t       m_soundlatch_data;
105 	bool          m_soundlatch_flag;
106 
107 	uint16_t      m_collide;
108 	uint8_t       m_collmode;
109 
110 	bitmap_ind16 m_work_bitmap;
111 	tilemap_t *m_text_tilemap;
112 	tilemap_t *m_left_tilemap;
113 	tilemap_t *m_center_tilemap;
114 	tilemap_t *m_right_tilemap;
115 
116 	required_device<cpu_device> m_maincpu;
117 	required_device<cpu_device> m_audiocpu;
118 	required_device<cpu_device> m_subcpu;
119 	required_device<watchdog_timer_device> m_watchdog;
120 	required_device<discrete_device> m_discrete;
121 	required_device<gfxdecode_device> m_gfxdecode;
122 	required_device<palette_device> m_palette;
123 	required_device<screen_device> m_screen;
124 	required_device<input_merger_device> m_soundnmi;
125 
126 	required_shared_ptr<uint8_t> m_radarram;
127 	required_shared_ptr<uint8_t> m_videoram;
128 	required_shared_ptr<uint8_t> m_spriteram;
129 	required_shared_ptr<uint8_t> m_leftram;
130 	required_shared_ptr<uint8_t> m_rightram;
131 	required_shared_ptr<uint8_t> m_centerram;
132 	output_finder<8> m_digits;
133 };
134 
135 /* Discrete Sound Input Nodes */
136 #define GRCHAMP_ENGINE_CS_EN                NODE_01
137 #define GRCHAMP_SIFT_DATA                   NODE_02
138 #define GRCHAMP_ATTACK_UP_DATA              NODE_03
139 #define GRCHAMP_IDLING_EN                   NODE_04
140 #define GRCHAMP_FOG_EN                      NODE_05
141 #define GRCHAMP_PLAYER_SPEED_DATA           NODE_06
142 #define GRCHAMP_ATTACK_SPEED_DATA           NODE_07
143 #define GRCHAMP_A_DATA                      NODE_08
144 #define GRCHAMP_B_DATA                      NODE_09
145 
146 /*----------- defined in audio/grchamp.c -----------*/
147 
148 DISCRETE_SOUND_EXTERN( grchamp_discrete );
149 
150 #endif // MAME_INCLUDES_GRCHAMP_H
151