1 // license:BSD-3-Clause
2 // copyright-holders:Aaron Giles
3 /***************************************************************************
4 
5     Bally/Sente SAC-1 system
6 
7     driver by Aaron Giles
8 
9 ***************************************************************************/
10 #ifndef MAME_INCLUDES_BALSENTE_H
11 #define MAME_INCLUDES_BALSENTE_H
12 
13 #pragma once
14 
15 #include "machine/6850acia.h"
16 #include "machine/timer.h"
17 #include "machine/x2212.h"
18 #include "machine/74259.h"
19 #include "emupal.h"
20 #include "screen.h"
21 
22 #define BALSENTE_MASTER_CLOCK   (20000000)
23 #define BALSENTE_CPU_CLOCK      (BALSENTE_MASTER_CLOCK / 16)
24 #define BALSENTE_PIXEL_CLOCK    (BALSENTE_MASTER_CLOCK / 4)
25 #define BALSENTE_HTOTAL         (0x140)
26 #define BALSENTE_HBEND          (0x000)
27 #define BALSENTE_HBSTART        (0x100)
28 #define BALSENTE_VTOTAL         (0x108)
29 #define BALSENTE_VBEND          (0x010)
30 #define BALSENTE_VBSTART        (0x100)
31 
32 
33 class balsente_state : public driver_device
34 {
35 	static constexpr unsigned POLY17_BITS = 17;
36 	static constexpr size_t POLY17_SIZE = (1 << POLY17_BITS) - 1;
37 	static constexpr unsigned POLY17_SHL = 7;
38 	static constexpr unsigned POLY17_SHR = 10;
39 	static constexpr uint32_t POLY17_ADD = 0x18000;
40 
41 public:
balsente_state(const machine_config & mconfig,device_type type,const char * tag)42 	balsente_state(const machine_config &mconfig, device_type type, const char *tag)
43 		: driver_device(mconfig, type, tag)
44 		, m_scanline_timer(*this, "scan_timer")
45 		, m_spriteram(*this, "spriteram")
46 		, m_videoram(*this, "videoram")
47 		, m_shrike_io(*this, "shrike_io")
48 		, m_shrike_shared(*this, "shrike_shared")
49 		, m_maincpu(*this, "maincpu")
50 		, m_audiocpu(*this, "audiocpu")
51 		, m_68k(*this, "68k")
52 		, m_screen(*this, "screen")
53 		, m_palette(*this, "palette")
54 		, m_outlatch(*this, "outlatch")
55 		, m_novram(*this, "nov%u", 0U)
56 		, m_acia(*this, "acia")
57 		, m_generic_paletteram_8(*this, "paletteram")
58 		, m_bankab(*this, "bankab")
59 		, m_bankcd(*this, "bankcd")
60 		, m_bankef(*this, "bankef")
61 	{ }
62 
63 	void shrike(machine_config &config);
64 	void rescraid(machine_config &config);
65 	void balsente(machine_config &config);
66 	void teamht(machine_config &config);
67 	void grudge(machine_config &config);
68 	void st1002(machine_config &config);
69 	void spiker(machine_config &config);
70 	void triviamb(machine_config &config);
71 	DECLARE_CUSTOM_INPUT_MEMBER(nstocker_bits_r);
72 	void init_otwalls();
73 	void init_triviaes();
74 	void init_triviaes2();
75 	void init_nstocker();
76 	void init_sentetst();
77 	void init_rescraid();
78 	void init_minigolf();
79 	void init_stompin();
80 	void init_snakepit();
81 	void init_spiker();
82 	void init_hattrick();
83 	void init_toggle();
84 	void init_snakjack();
85 	void init_grudge();
86 	void init_sfootbal();
87 	void init_triviag2();
88 	void init_cshift();
89 	void init_gimeabrk();
90 	void init_stocker();
91 	void init_triviag1();
92 	void init_shrike();
93 	void init_minigolf2();
94 	void init_nametune();
95 	void init_gghost();
96 
97 private:
98 	void random_reset_w(uint8_t data);
99 	uint8_t random_num_r();
100 	void rombank_select_w(uint8_t data);
101 	void rombank2_select_w(uint8_t data);
102 	DECLARE_WRITE_LINE_MEMBER(out0_w);
103 	DECLARE_WRITE_LINE_MEMBER(out1_w);
104 	DECLARE_WRITE_LINE_MEMBER(out2_w);
105 	DECLARE_WRITE_LINE_MEMBER(out3_w);
106 	DECLARE_WRITE_LINE_MEMBER(out4_w);
107 	DECLARE_WRITE_LINE_MEMBER(out5_w);
108 	DECLARE_WRITE_LINE_MEMBER(out6_w);
109 	DECLARE_WRITE_LINE_MEMBER(nvrecall_w);
110 	uint8_t novram_8bit_r(address_space &space, offs_t offset);
111 	void novram_8bit_w(offs_t offset, uint8_t data);
112 	void acia_w(offs_t offset, uint8_t data);
113 	uint8_t adc_data_r();
114 	void adc_select_w(offs_t offset, uint8_t data);
115 	void spiker_expand_w(offs_t offset, uint8_t data);
116 	uint8_t spiker_expand_r();
117 	uint8_t grudge_steering_r();
118 	uint8_t shrike_shared_6809_r(offs_t offset);
119 	void shrike_shared_6809_w(offs_t offset, uint8_t data);
120 	void shrike_io_68k_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
121 	uint16_t shrike_io_68k_r(offs_t offset, uint16_t mem_mask = ~0);
122 	uint8_t teamht_extra_r();
123 	void teamht_multiplex_select_w(offs_t offset, uint8_t data);
124 
125 	void videoram_w(offs_t offset, uint8_t data);
126 	void palette_select_w(uint8_t data);
127 	void paletteram_w(offs_t offset, uint8_t data);
128 	void shrike_sprite_select_w(uint8_t data);
129 
130 	virtual void machine_start() override;
131 	virtual void machine_reset() override;
132 	virtual void video_start() override;
133 	uint32_t screen_update_balsente(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
134 	INTERRUPT_GEN_MEMBER(update_analog_inputs);
135 	TIMER_CALLBACK_MEMBER(irq_off);
136 	TIMER_CALLBACK_MEMBER(adc_finished);
137 	TIMER_DEVICE_CALLBACK_MEMBER(interrupt_timer);
138 	void draw_one_sprite(bitmap_ind16 &bitmap, const rectangle &cliprect, uint8_t *sprite);
139 	void poly17_init();
140 	void update_grudge_steering();
141 	void expand_roms(uint8_t cd_rom_mask);
142 	inline void config_shooter_adc(uint8_t shooter, uint8_t adc_shift);
143 
144 	void cpu1_base_map(address_map &map);
145 	void cpu1_map(address_map &map);
146 	void cpu1_teamht_map(address_map &map);
147 	void cpu1_grudge_map(address_map &map);
148 	void cpu1_st1002_map(address_map &map);
149 	void cpu1_spiker_map(address_map &map);
150 	void cpu1_shrike_map(address_map &map);
151 	void cpu1_smudge_map(address_map &map);
152 	void cpu1_triviamb_map(address_map &map);
153 	void cpu2_triviamb_io_map(address_map &map);
154 	void cpu2_triviamb_map(address_map &map);
155 	void shrike68k_map(address_map &map);
156 
157 	required_device<timer_device> m_scanline_timer;
158 
159 
160 	/* global data */
161 	uint8_t m_shooter;
162 	uint8_t m_shooter_x;
163 	uint8_t m_shooter_y;
164 	uint8_t m_adc_shift;
165 
166 	/* random number generator states */
167 	uint8_t m_rand17[POLY17_SIZE + 1];
168 
169 	/* ADC I/O states */
170 	int8_t m_analog_input_data[4];
171 	uint8_t m_adc_value;
172 
173 	/* game-specific states */
174 	uint8_t m_nstocker_bits;
175 	uint8_t m_spiker_expand_color;
176 	uint8_t m_spiker_expand_bgcolor;
177 	uint8_t m_spiker_expand_bits;
178 	uint8_t m_grudge_steering_result;
179 	uint8_t m_grudge_last_steering[3];
180 	uint8_t m_teamht_input;
181 
182 	/* video data */
183 	uint8_t m_expanded_videoram[256*256];
184 	uint8_t *m_sprite_data;
185 	uint32_t m_sprite_mask;
186 	uint8_t *m_sprite_bank[2];
187 
188 	uint8_t m_palettebank_vis;
189 
190 	required_shared_ptr<uint8_t> m_spriteram;
191 	required_shared_ptr<uint8_t> m_videoram;
192 	optional_shared_ptr<uint16_t> m_shrike_io;
193 	optional_shared_ptr<uint16_t> m_shrike_shared;
194 	required_device<cpu_device> m_maincpu;
195 	optional_device<cpu_device> m_audiocpu;
196 	optional_device<cpu_device> m_68k;
197 	required_device<screen_device> m_screen;
198 	required_device<palette_device> m_palette;
199 	optional_device<ls259_device> m_outlatch;
200 	optional_device_array<x2212_device, 2> m_novram;
201 	optional_device<acia6850_device> m_acia;
202 	optional_shared_ptr<uint8_t> m_generic_paletteram_8;
203 
204 	required_memory_bank m_bankab;
205 	required_memory_bank m_bankcd;
206 	required_memory_bank m_bankef;
207 };
208 
209 #endif // MAME_INCLUDES_BALSENTE_H
210