1 // license:BSD-3-Clause
2 // copyright-holders:Nicola Salmoria
3 /*************************************************************************
4 
5     Atari Centipede hardware
6 
7 *************************************************************************/
8 #ifndef MAME_INCLUDES_CENTIPED_H
9 #define MAME_INCLUDES_CENTIPED_H
10 
11 #pragma once
12 
13 #include "machine/74259.h"
14 #include "machine/eepromser.h"
15 #include "machine/er2055.h"
16 #include "machine/timer.h"
17 #include "sound/ay8910.h"
18 #include "emupal.h"
19 #include "screen.h"
20 #include "tilemap.h"
21 
22 class centiped_state : public driver_device
23 {
24 public:
centiped_state(const machine_config & mconfig,device_type type,const char * tag)25 	centiped_state(const machine_config &mconfig, device_type type, const char *tag) :
26 		driver_device(mconfig, type, tag),
27 		m_rambase(*this, "rambase"),
28 		m_videoram(*this, "videoram"),
29 		m_spriteram(*this, "spriteram"),
30 		m_paletteram(*this, "paletteram"),
31 		m_bullsdrt_tiles_bankram(*this, "bullsdrt_bank"),
32 		m_maincpu(*this, "maincpu"),
33 		m_outlatch(*this, "outlatch"),
34 		m_earom(*this, "earom"),
35 		m_eeprom(*this, "eeprom"),
36 		m_gfxdecode(*this, "gfxdecode"),
37 		m_screen(*this, "screen"),
38 		m_palette(*this, "palette"),
39 		m_aysnd(*this, "aysnd")
40 	{ }
41 
42 	void centiped_base(machine_config &config);
43 	void milliped(machine_config &config);
44 	void bullsdrt(machine_config &config);
45 	void centipdb(machine_config &config);
46 	void magworm(machine_config &config);
47 	void caterplr(machine_config &config);
48 	void centiped(machine_config &config);
49 	void centipedj(machine_config &config);
50 	void mazeinv(machine_config &config);
51 	void warlords(machine_config &config);
52 	void multiped(machine_config &config);
53 
54 	void init_multiped();
55 	void init_bullsdrt();
56 
57 private:
58 	optional_shared_ptr<uint8_t> m_rambase;
59 	required_shared_ptr<uint8_t> m_videoram;
60 	required_shared_ptr<uint8_t> m_spriteram;
61 	optional_shared_ptr<uint8_t> m_paletteram;
62 	optional_shared_ptr<uint8_t> m_bullsdrt_tiles_bankram;
63 
64 	required_device<cpu_device> m_maincpu;
65 	required_device<ls259_device> m_outlatch;
66 	optional_device<er2055_device> m_earom;
67 	optional_device<eeprom_serial_93cxx_device> m_eeprom;
68 	required_device<gfxdecode_device> m_gfxdecode;
69 	required_device<screen_device> m_screen;
70 	required_device<palette_device> m_palette;
71 	optional_device<ay8910_device> m_aysnd;
72 
73 	uint8_t m_oldpos[4];
74 	uint8_t m_sign[4];
75 	uint8_t m_dsw_select;
76 	uint8_t m_control_select;
77 	uint8_t m_flipscreen;
78 	uint8_t m_prg_bank;
79 	uint8_t m_gfx_bank;
80 	uint8_t m_bullsdrt_sprites_bank;
81 	uint8_t m_penmask[64];
82 	tilemap_t *m_bg_tilemap;
83 
84 	// drivers/centiped.cpp
85 	void irq_ack_w(uint8_t data);
86 	uint8_t centiped_IN0_r();
87 	uint8_t centiped_IN2_r();
88 	uint8_t milliped_IN1_r();
89 	uint8_t milliped_IN2_r();
90 	DECLARE_WRITE_LINE_MEMBER(input_select_w);
91 	DECLARE_WRITE_LINE_MEMBER(control_select_w);
92 	uint8_t mazeinv_input_r();
93 	void mazeinv_input_select_w(offs_t offset, uint8_t data);
94 	uint8_t bullsdrt_data_port_r();
95 	DECLARE_WRITE_LINE_MEMBER(coin_counter_left_w);
96 	DECLARE_WRITE_LINE_MEMBER(coin_counter_center_w);
97 	DECLARE_WRITE_LINE_MEMBER(coin_counter_right_w);
98 	DECLARE_WRITE_LINE_MEMBER(bullsdrt_coin_count_w);
99 	uint8_t earom_read();
100 	void earom_write(offs_t offset, uint8_t data);
101 	void earom_control_w(uint8_t data);
102 	uint8_t caterplr_unknown_r();
103 	void caterplr_AY8910_w(offs_t offset, uint8_t data);
104 	uint8_t caterplr_AY8910_r(offs_t offset);
105 	uint8_t multiped_eeprom_r();
106 	void multiped_eeprom_w(offs_t offset, uint8_t data);
107 	void multiped_prgbank_w(uint8_t data);
108 
109 	// video/centiped.cpp
110 	void centiped_videoram_w(offs_t offset, uint8_t data);
111 	DECLARE_WRITE_LINE_MEMBER(flip_screen_w);
112 	void multiped_gfxbank_w(uint8_t data);
113 	void bullsdrt_tilesbank_w(offs_t offset, uint8_t data);
114 	void bullsdrt_sprites_bank_w(uint8_t data);
115 	void centiped_paletteram_w(offs_t offset, uint8_t data);
116 	void milliped_paletteram_w(offs_t offset, uint8_t data);
117 	void mazeinv_paletteram_w(offs_t offset, uint8_t data);
118 	TILE_GET_INFO_MEMBER(centiped_get_tile_info);
119 	TILE_GET_INFO_MEMBER(warlords_get_tile_info);
120 	TILE_GET_INFO_MEMBER(milliped_get_tile_info);
121 	TILE_GET_INFO_MEMBER(bullsdrt_get_tile_info);
122 	DECLARE_MACHINE_START(centiped);
123 	DECLARE_MACHINE_RESET(centiped);
124 	DECLARE_VIDEO_START(centiped);
125 	DECLARE_VIDEO_START(bullsdrt);
126 	DECLARE_MACHINE_RESET(magworm);
127 	DECLARE_VIDEO_START(milliped);
128 	DECLARE_VIDEO_START(warlords);
129 	void warlords_palette(palette_device &palette) const;
130 	uint32_t screen_update_centiped(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
131 	uint32_t screen_update_bullsdrt(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
132 	uint32_t screen_update_milliped(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
133 	uint32_t screen_update_warlords(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
134 	TIMER_DEVICE_CALLBACK_MEMBER(generate_interrupt);
135 	void init_penmask();
136 	void init_common();
137 	void milliped_set_color(offs_t offset, uint8_t data);
138 	inline int read_trackball(int idx, int switch_port);
139 	void bullsdrt_data_map(address_map &map);
140 	void bullsdrt_map(address_map &map);
141 	void bullsdrt_port_map(address_map &map);
142 	void caterplr_map(address_map &map);
143 	void centipdb_map(address_map &map);
144 	void centiped_base_map(address_map &map);
145 	void centiped_map(address_map &map);
146 	void centipedj_map(address_map &map);
147 	void magworm_map(address_map &map);
148 	void mazeinv_map(address_map &map);
149 	void milliped_map(address_map &map);
150 	void multiped_map(address_map &map);
151 	void warlords_map(address_map &map);
152 };
153 
154 #endif // MAME_INCLUDES_CENTIPED_H
155