1 // license:BSD-3-Clause
2 // copyright-holders:Nicola Salmoria
3 /***************************************************************************
4 
5     Gradius 3 (GX945) (c) 1989 Konami
6 
7     driver by Nicola Salmoria
8 
9     This board uses the well known 052109 051962 custom gfx chips, however unlike
10     all other games they fetch gfx data from RAM. The gfx ROMs are memory mapped
11     on cpu B and the needed parts are copied to RAM at run time.
12 
13     There's also something wrong in the way tile banks are implemented in
14     k052109.c. They don't seem to be used by this game.
15 
16     2009-03:
17     Added dsw locations and verified factory setting based on Guru's notes
18 
19     2015-05:
20     gradius3js set added, same as normal gradius3j set in content but with
21     some ROMs split and populated differently.
22 
23 ***************************************************************************/
24 
25 #include "emu.h"
26 #include "includes/gradius3.h"
27 #include "includes/konamipt.h"
28 
29 #include "cpu/m68000/m68000.h"
30 #include "cpu/z80/z80.h"
31 #include "machine/gen_latch.h"
32 #include "machine/watchdog.h"
33 #include "sound/ym2151.h"
34 
35 #include "emupal.h"
36 #include "speaker.h"
37 
38 
k052109_halfword_r(offs_t offset)39 uint16_t gradius3_state::k052109_halfword_r(offs_t offset)
40 {
41 	return m_k052109->read(offset);
42 }
43 
k052109_halfword_w(offs_t offset,uint16_t data,uint16_t mem_mask)44 void gradius3_state::k052109_halfword_w(offs_t offset, uint16_t data, uint16_t mem_mask)
45 {
46 	if (ACCESSING_BITS_0_7)
47 		m_k052109->write(offset, data & 0xff);
48 
49 	/* is this a bug in the game or something else? */
50 	if (!ACCESSING_BITS_0_7)
51 		m_k052109->write(offset, (data >> 8) & 0xff);
52 //      logerror("%s half %04x = %04x\n",machine().describe_context(),offset,data);
53 }
54 
cpuA_ctrl_w(offs_t offset,uint16_t data,uint16_t mem_mask)55 void gradius3_state::cpuA_ctrl_w(offs_t offset, uint16_t data, uint16_t mem_mask)
56 {
57 	if (ACCESSING_BITS_8_15)
58 	{
59 		data >>= 8;
60 
61 		/* bits 0-1 are coin counters */
62 		machine().bookkeeping().coin_counter_w(0, data & 0x01);
63 		machine().bookkeeping().coin_counter_w(1, data & 0x02);
64 
65 		/* bit 2 selects layer priority */
66 		m_priority = data & 0x04;
67 
68 		/* bit 3 enables cpu B */
69 		m_subcpu->set_input_line(INPUT_LINE_RESET, (data & 0x08) ? CLEAR_LINE : ASSERT_LINE);
70 
71 		/* bit 5 enables irq */
72 		m_irqAen = data & 0x20;
73 
74 		/* other bits unknown */
75 		//logerror("%s: write %04x to c0000\n",machine().describe_context(),data);
76 	}
77 }
78 
cpuB_irqenable_w(offs_t offset,uint16_t data,uint16_t mem_mask)79 void gradius3_state::cpuB_irqenable_w(offs_t offset, uint16_t data, uint16_t mem_mask)
80 {
81 	if (ACCESSING_BITS_8_15)
82 		m_irqBmask = (data >> 8) & 0x07;
83 }
84 
INTERRUPT_GEN_MEMBER(gradius3_state::cpuA_interrupt)85 INTERRUPT_GEN_MEMBER(gradius3_state::cpuA_interrupt)
86 {
87 	if (m_irqAen)
88 		device.execute().set_input_line(2, HOLD_LINE);
89 }
90 
91 
TIMER_DEVICE_CALLBACK_MEMBER(gradius3_state::gradius3_sub_scanline)92 TIMER_DEVICE_CALLBACK_MEMBER(gradius3_state::gradius3_sub_scanline)
93 {
94 	int scanline = param;
95 
96 	if(scanline == 240 && m_irqBmask & 1) // vblank-out irq
97 		m_subcpu->set_input_line(1, HOLD_LINE);
98 
99 	if(scanline ==  16 && m_irqBmask & 2) // sprite end DMA irq
100 		m_subcpu->set_input_line(2, HOLD_LINE);
101 }
102 
cpuB_irqtrigger_w(uint16_t data)103 void gradius3_state::cpuB_irqtrigger_w(uint16_t data)
104 {
105 	if (m_irqBmask & 4)
106 	{
107 		logerror("%04x trigger cpu B irq 4 %02x\n",m_maincpu->pc(),data);
108 		m_subcpu->set_input_line(4, HOLD_LINE);
109 	}
110 	else
111 		logerror("%04x MISSED cpu B irq 4 %02x\n",m_maincpu->pc(),data);
112 }
113 
sound_irq_w(uint16_t data)114 void gradius3_state::sound_irq_w(uint16_t data)
115 {
116 	m_audiocpu->set_input_line_and_vector(0, HOLD_LINE, 0xff); // Z80
117 }
118 
sound_bank_w(uint8_t data)119 void gradius3_state::sound_bank_w(uint8_t data)
120 {
121 	int bank_A, bank_B;
122 
123 	/* banks # for the 007232 (chip 1) */
124 	bank_A = ((data >> 0) & 0x03);
125 	bank_B = ((data >> 2) & 0x03);
126 	m_k007232->set_bank(bank_A, bank_B);
127 }
128 
129 
130 
gradius3_map(address_map & map)131 void gradius3_state::gradius3_map(address_map &map)
132 {
133 	map(0x000000, 0x03ffff).rom();
134 	map(0x040000, 0x043fff).ram();
135 	map(0x080000, 0x080fff).ram().w("palette", FUNC(palette_device::write16)).share("palette");
136 	map(0x0c0000, 0x0c0001).w(FUNC(gradius3_state::cpuA_ctrl_w));  /* halt cpu B, irq enable, priority, coin counters, other? */
137 	map(0x0c8000, 0x0c8001).portr("SYSTEM");
138 	map(0x0c8002, 0x0c8003).portr("P1");
139 	map(0x0c8004, 0x0c8005).portr("P2");
140 	map(0x0c8006, 0x0c8007).portr("DSW3");
141 	map(0x0d0000, 0x0d0001).portr("DSW1");
142 	map(0x0d0002, 0x0d0003).portr("DSW2");
143 	map(0x0d8000, 0x0d8001).w(FUNC(gradius3_state::cpuB_irqtrigger_w));
144 	map(0x0e0000, 0x0e0001).w("watchdog", FUNC(watchdog_timer_device::reset16_w));
145 	map(0x0e8000, 0x0e8000).w("soundlatch", FUNC(generic_latch_8_device::write));
146 	map(0x0f0000, 0x0f0001).w(FUNC(gradius3_state::sound_irq_w));
147 	map(0x100000, 0x103fff).ram().share("share1");
148 	map(0x14c000, 0x153fff).rw(FUNC(gradius3_state::k052109_halfword_r), FUNC(gradius3_state::k052109_halfword_w));
149 	map(0x180000, 0x19ffff).ram().w(FUNC(gradius3_state::gradius3_gfxram_w)).share("k052109");
150 }
151 
152 
gradius3_map2(address_map & map)153 void gradius3_state::gradius3_map2(address_map &map)
154 {
155 	map(0x000000, 0x0fffff).rom();
156 	map(0x100000, 0x103fff).ram();
157 	map(0x140000, 0x140001).w(FUNC(gradius3_state::cpuB_irqenable_w));
158 	map(0x200000, 0x203fff).ram().share("share1");
159 	map(0x24c000, 0x253fff).rw(FUNC(gradius3_state::k052109_halfword_r), FUNC(gradius3_state::k052109_halfword_w));
160 	map(0x280000, 0x29ffff).ram().w(FUNC(gradius3_state::gradius3_gfxram_w)).share("k052109");
161 	map(0x2c0000, 0x2c000f).rw(m_k051960, FUNC(k051960_device::k051937_r), FUNC(k051960_device::k051937_w)).umask16(0x00ff);
162 	map(0x2c0800, 0x2c0fff).rw(m_k051960, FUNC(k051960_device::k051960_r), FUNC(k051960_device::k051960_w)).umask16(0x00ff);
163 	map(0x400000, 0x5fffff).r(FUNC(gradius3_state::gradius3_gfxrom_r));     /* gfx ROMs are mapped here, and copied to RAM */
164 }
165 
166 
gradius3_s_map(address_map & map)167 void gradius3_state::gradius3_s_map(address_map &map)
168 {
169 	map(0x0000, 0xefff).rom();
170 	map(0xf000, 0xf000).w(FUNC(gradius3_state::sound_bank_w));             /* 007232 bankswitch */
171 	map(0xf010, 0xf010).r("soundlatch", FUNC(generic_latch_8_device::read));
172 	map(0xf020, 0xf02d).rw(m_k007232, FUNC(k007232_device::read), FUNC(k007232_device::write));
173 	map(0xf030, 0xf031).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write));
174 	map(0xf800, 0xffff).ram();
175 }
176 
177 
178 
179 static INPUT_PORTS_START( gradius3 )
180 	PORT_START("SYSTEM")
181 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
182 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
183 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
184 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START1 )
185 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START2 )
186 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
187 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN3 )
188 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
189 
190 	PORT_START("P1")
191 	KONAMI8_MONO_B123_UNK                       // button1 = power-up, button2 = shoot, button3 = missile
192 
193 	PORT_START("P2")
194 	KONAMI8_COCKTAIL_B123_UNK
195 
196 	PORT_START("DSW1")
DEF_STR(Free_Play)197 	KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "Invalid", SW1)
198 	/* "Invalid" = both coin slots disabled */
199 
200 	PORT_START("DSW2")
201 	PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) )            PORT_DIPLOCATION("SW2:1,2")
202 	PORT_DIPSETTING(    0x03, "2" )
203 	PORT_DIPSETTING(    0x02, "3" )
204 	PORT_DIPSETTING(    0x01, "5" )
205 	PORT_DIPSETTING(    0x00, "7" )
206 	PORT_DIPNAME( 0x04, 0x00, DEF_STR( Cabinet ) )          PORT_DIPLOCATION("SW2:3")
207 	PORT_DIPSETTING(    0x00, DEF_STR( Upright ) )
208 	PORT_DIPSETTING(    0x04, DEF_STR( Cocktail ) )
209 	PORT_DIPNAME( 0x18, 0x18, DEF_STR( Bonus_Life ) )       PORT_DIPLOCATION("SW2:4,5")
210 	PORT_DIPSETTING(    0x18, "20k and every 70k" )
211 	PORT_DIPSETTING(    0x10, "100k and every 100k" )
212 	PORT_DIPSETTING(    0x08, "50k only" )
213 	PORT_DIPSETTING(    0x00, "100k only" )
214 	PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) )       PORT_DIPLOCATION("SW2:6,7")
215 	PORT_DIPSETTING(    0x60, DEF_STR( Easy ) )
216 	PORT_DIPSETTING(    0x40, DEF_STR( Normal ) )
217 	PORT_DIPSETTING(    0x20, DEF_STR( Hard ) )
218 	PORT_DIPSETTING(    0x00, DEF_STR( Hardest ) )
219 	PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) )      PORT_DIPLOCATION("SW2:8")
220 	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
221 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
222 
223 	PORT_START("DSW3")
224 	PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) )      PORT_DIPLOCATION("SW3:1")
225 	PORT_DIPSETTING(    0x01, DEF_STR( Off ) )
226 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
227 	PORT_DIPNAME( 0x02, 0x02, "Upright Controls" )          PORT_DIPLOCATION("SW3:2")
228 	PORT_DIPSETTING(    0x02, DEF_STR( Single ) )
229 	PORT_DIPSETTING(    0x00, DEF_STR( Dual ) )
230 	PORT_SERVICE_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW3:3" )
231 	PORT_DIPUNKNOWN_DIPLOC( 0x08, 0x08, "SW3:4" )           /* Manual says it's unused */
232 	PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED )
233 INPUT_PORTS_END
234 
235 
236 void gradius3_state::volume_callback(uint8_t data)
237 {
238 	m_k007232->set_volume(0, (data >> 4) * 0x11, 0);
239 	m_k007232->set_volume(1, 0, (data & 0x0f) * 0x11);
240 }
241 
machine_start()242 void gradius3_state::machine_start()
243 {
244 	save_item(NAME(m_irqAen));
245 	save_item(NAME(m_irqBmask));
246 	save_item(NAME(m_priority));
247 }
248 
machine_reset()249 void gradius3_state::machine_reset()
250 {
251 	/* start with cpu B halted */
252 	m_subcpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
253 	m_irqAen = 0;
254 	m_irqBmask = 0;
255 	m_priority = 0;
256 
257 }
258 
gradius3(machine_config & config)259 void gradius3_state::gradius3(machine_config &config)
260 {
261 	/* basic machine hardware */
262 	M68000(config, m_maincpu, XTAL(10'000'000));
263 	m_maincpu->set_addrmap(AS_PROGRAM, &gradius3_state::gradius3_map);
264 	m_maincpu->set_vblank_int("screen", FUNC(gradius3_state::cpuA_interrupt));
265 
266 	M68000(config, m_subcpu, XTAL(10'000'000));
267 	m_subcpu->set_addrmap(AS_PROGRAM, &gradius3_state::gradius3_map2);
268 	TIMER(config, "scantimer").configure_scanline(FUNC(gradius3_state::gradius3_sub_scanline), "screen", 0, 1);
269 	/* 4 is triggered by cpu A, the others are unknown but required for the game to run. */
270 
271 	Z80(config, m_audiocpu, 3579545);
272 	m_audiocpu->set_addrmap(AS_PROGRAM, &gradius3_state::gradius3_s_map);
273 
274 	config.set_maximum_quantum(attotime::from_hz(6000));
275 
276 	WATCHDOG_TIMER(config, "watchdog");
277 
278 	/* video hardware */
279 	screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
280 	screen.set_refresh_hz(60);
281 	screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
282 	screen.set_size(64*8, 32*8);
283 	screen.set_visarea(12*8, (64-12)*8-1, 2*8, 30*8-1);
284 	screen.set_screen_update(FUNC(gradius3_state::screen_update_gradius3));
285 	screen.set_palette("palette");
286 
287 	PALETTE(config, "palette").set_format(palette_device::xRGB_555, 2048).enable_shadows();
288 
289 	K052109(config, m_k052109, 0);
290 	m_k052109->set_palette("palette");
291 	m_k052109->set_screen(nullptr);
292 	m_k052109->set_tile_callback(FUNC(gradius3_state::tile_callback));
293 	m_k052109->set_char_ram(true);
294 
295 	K051960(config, m_k051960, 0);
296 	m_k051960->set_palette("palette");
297 	m_k051960->set_screen("screen");
298 	m_k051960->set_sprite_callback(FUNC(gradius3_state::sprite_callback));
299 	m_k051960->set_plane_order(K051960_PLANEORDER_GRADIUS3);
300 
301 	/* sound hardware */
302 	SPEAKER(config, "lspeaker").front_left();
303 	SPEAKER(config, "rspeaker").front_right();
304 
305 	GENERIC_LATCH_8(config, "soundlatch");
306 
307 	YM2151(config, "ymsnd", 3579545).add_route(0, "lspeaker", 1.0).add_route(0, "rspeaker", 1.0);
308 
309 	K007232(config, m_k007232, 3579545);
310 	m_k007232->port_write().set(FUNC(gradius3_state::volume_callback));
311 	m_k007232->add_route(0, "lspeaker", 0.20);
312 	m_k007232->add_route(0, "rspeaker", 0.20);
313 	m_k007232->add_route(1, "lspeaker", 0.20);
314 	m_k007232->add_route(1, "rspeaker", 0.20);
315 }
316 
317 
318 
319 /***************************************************************************
320 
321   Game driver(s)
322 
323 ***************************************************************************/
324 
325 ROM_START( gradius3 )
326 	ROM_REGION( 0x40000, "maincpu", 0 )
327 	ROM_LOAD16_BYTE( "945_r13.f15", 0x00000, 0x20000, CRC(cffd103f) SHA1(6bd15e8c2e6e5223d7de9b0b375f36f3e81f60ba) )
328 	ROM_LOAD16_BYTE( "945_r12.e15", 0x00001, 0x20000, CRC(0b968ef6) SHA1(ba28d16d94b13aac791b11d3d91df26f78e2e477) )
329 
330 	ROM_REGION( 0x100000, "sub", 0 )
331 	ROM_LOAD16_BYTE( "945_m09.r17",  0x000000, 0x20000, CRC(b4a6df25) SHA1(85533cf140d28f6f81c0b49b8061bda0924a613a) )
332 	ROM_LOAD16_BYTE( "945_m08.n17",  0x000001, 0x20000, CRC(74e981d2) SHA1(e7b47a2da01ff73293d2100c48fdf00b33125af5) )
333 	ROM_LOAD16_BYTE( "945_l06b.r11", 0x040000, 0x20000, CRC(83772304) SHA1(a90c75a3de670b6ec5e0fc201876d463b4a76766) )
334 	ROM_LOAD16_BYTE( "945_l06a.n11", 0x040001, 0x20000, CRC(e1fd75b6) SHA1(6160d80a2f1bf550e85d6253cf521a96f5a644cc) )
335 	ROM_LOAD16_BYTE( "945_l07c.r15", 0x080000, 0x20000, CRC(c1e399b6) SHA1(e95bd478dd3beea0175bf9ee4cededb111c4ace1) )
336 	ROM_LOAD16_BYTE( "945_l07a.n15", 0x080001, 0x20000, CRC(96222d04) SHA1(b55700f683a556b0e73dbac9c7b4ce485420d21c) )
337 	ROM_LOAD16_BYTE( "945_l07d.r13", 0x0c0000, 0x20000, CRC(4c16d4bd) SHA1(01dcf169b78a1e495214b10181401d1920b0c924) )
338 	ROM_LOAD16_BYTE( "945_l07b.n13", 0x0c0001, 0x20000, CRC(5e209d01) SHA1(0efa1bbfdc7e2ba1e0bb96245e2bfe961258b446) )
339 
340 	ROM_REGION( 0x10000, "audiocpu", 0 )
341 	ROM_LOAD( "945_r05.d9", 0x00000, 0x10000, CRC(c8c45365) SHA1(b9a7b736b52bca42c7b8c8ed64c8df73e0116158) ) /* Same as 945 M05, but different label */
342 
343 	ROM_REGION( 0x200000, "k051960", 0 )   /* graphics (addressable by the main CPU) */
344 	ROM_LOAD32_WORD( "945_a02.l3",  0x000000, 0x80000, CRC(4dfffd74) SHA1(588210bac27448240ef08961f70b714b69cb3ffd) )
345 	ROM_LOAD32_WORD( "945_a01.h3",  0x000002, 0x80000, CRC(339d6dd2) SHA1(6a52b826aba92c75fc6a5926184948735dc20812) )
346 	ROM_LOAD32_BYTE( "945_l04a.k6", 0x100000, 0x20000, CRC(884e21ee) SHA1(ce86dd3a06775e5b1aa09db010dcb674e67828e7) )
347 	ROM_LOAD32_BYTE( "945_l04c.m6", 0x100001, 0x20000, CRC(45bcd921) SHA1(e51a8a71362a6fb55124aa1dce74519c0a3c6e3f) )
348 	ROM_LOAD32_BYTE( "945_l03a.e6", 0x100002, 0x20000, CRC(a67ef087) SHA1(fd63474f3bbde5dfc53ed4c1db25d6411a8b54d2) )
349 	ROM_LOAD32_BYTE( "945_l03c.h6", 0x100003, 0x20000, CRC(a56be17a) SHA1(1d387736144c30fcb5de54235331ab1ff70c356e) )
350 	ROM_LOAD32_BYTE( "945_l04b.k8", 0x180000, 0x20000, CRC(843bc67d) SHA1(cdf8421083f24ab27867ed5d08d8949da192b2b9) )
351 	ROM_LOAD32_BYTE( "945_l04d.m8", 0x180001, 0x20000, CRC(0a98d08e) SHA1(1e0ca51a2d45c01fa3f11950ddd387f41ddae691) )
352 	ROM_LOAD32_BYTE( "945_l03b.e8", 0x180002, 0x20000, CRC(933e68b9) SHA1(f3a39446ca77d17fdbd938bd5f718ae9d5570879) )
353 	ROM_LOAD32_BYTE( "945_l03d.h8", 0x180003, 0x20000, CRC(f375e87b) SHA1(6427b966795c907c8e516244872fe52217da62c4) )
354 
355 	ROM_REGION( 0x0100, "proms", 0 )
356 	ROM_LOAD( "945l14.j28", 0x0000, 0x0100, CRC(c778c189) SHA1(847eaf379ba075c25911c6f83dd63ff390534f60) )  /* priority encoder (not used) */
357 
358 	ROM_REGION( 0x80000, "k007232", 0 ) /* 007232 samples */
359 	ROM_LOAD( "945_a10.b15",  0x00000, 0x40000, CRC(1d083e10) SHA1(b116f133a7647ef7a6c373aff00e9622d9954b61) )
360 	ROM_LOAD( "945_l11a.c18", 0x40000, 0x20000, CRC(6043f4eb) SHA1(1c2e9ace1cfdde504b7b6158e3c3f54dc5ae33d4) )
361 	ROM_LOAD( "945_l11b.c20", 0x60000, 0x20000, CRC(89ea3baf) SHA1(8edcbaa7969185cfac48c02559826d1b8b081f3f) )
362 ROM_END
363 
364 ROM_START( gradius3j )
365 	ROM_REGION( 0x40000, "maincpu", 0 )
366 	ROM_LOAD16_BYTE( "945_s13.f15", 0x00000, 0x20000, CRC(70c240a2) SHA1(82dc391572e1f61b0182cb031654d71adcdd5f6e) )
367 	ROM_LOAD16_BYTE( "945_s12.e15", 0x00001, 0x20000, CRC(bbc300d4) SHA1(e1ca98bc591575285d7bd2d4fefdf35fed10dcb6) )
368 
369 	ROM_REGION( 0x100000, "sub", 0 )
370 	ROM_LOAD16_BYTE( "945_m09.r17",  0x000000, 0x20000, CRC(b4a6df25) SHA1(85533cf140d28f6f81c0b49b8061bda0924a613a) )
371 	ROM_LOAD16_BYTE( "945_m08.n17",  0x000001, 0x20000, CRC(74e981d2) SHA1(e7b47a2da01ff73293d2100c48fdf00b33125af5) )
372 	ROM_LOAD16_BYTE( "945_l06b.r11", 0x040000, 0x20000, CRC(83772304) SHA1(a90c75a3de670b6ec5e0fc201876d463b4a76766) )
373 	ROM_LOAD16_BYTE( "945_l06a.n11", 0x040001, 0x20000, CRC(e1fd75b6) SHA1(6160d80a2f1bf550e85d6253cf521a96f5a644cc) )
374 	ROM_LOAD16_BYTE( "945_l07c.r15", 0x080000, 0x20000, CRC(c1e399b6) SHA1(e95bd478dd3beea0175bf9ee4cededb111c4ace1) )
375 	ROM_LOAD16_BYTE( "945_l07a.n15", 0x080001, 0x20000, CRC(96222d04) SHA1(b55700f683a556b0e73dbac9c7b4ce485420d21c) )
376 	ROM_LOAD16_BYTE( "945_l07d.r13", 0x0c0000, 0x20000, CRC(4c16d4bd) SHA1(01dcf169b78a1e495214b10181401d1920b0c924) )
377 	ROM_LOAD16_BYTE( "945_l07b.n13", 0x0c0001, 0x20000, CRC(5e209d01) SHA1(0efa1bbfdc7e2ba1e0bb96245e2bfe961258b446) )
378 
379 	ROM_REGION( 0x10000, "audiocpu", 0 )
380 	ROM_LOAD( "945_m05.d9", 0x00000, 0x10000, CRC(c8c45365) SHA1(b9a7b736b52bca42c7b8c8ed64c8df73e0116158) )
381 
382 	ROM_REGION( 0x200000, "k051960", 0 )   /* graphics (addressable by the main CPU) */
383 	ROM_LOAD32_WORD( "945_a02.l3",  0x000000, 0x80000, CRC(4dfffd74) SHA1(588210bac27448240ef08961f70b714b69cb3ffd) )
384 	ROM_LOAD32_WORD( "945_a01.h3",  0x000002, 0x80000, CRC(339d6dd2) SHA1(6a52b826aba92c75fc6a5926184948735dc20812) )
385 	ROM_LOAD32_BYTE( "945_l04a.k6", 0x100000, 0x20000, CRC(884e21ee) SHA1(ce86dd3a06775e5b1aa09db010dcb674e67828e7) )
386 	ROM_LOAD32_BYTE( "945_l04c.m6", 0x100001, 0x20000, CRC(45bcd921) SHA1(e51a8a71362a6fb55124aa1dce74519c0a3c6e3f) )
387 	ROM_LOAD32_BYTE( "945_l03a.e6", 0x100002, 0x20000, CRC(a67ef087) SHA1(fd63474f3bbde5dfc53ed4c1db25d6411a8b54d2) )
388 	ROM_LOAD32_BYTE( "945_l03c.h6", 0x100003, 0x20000, CRC(a56be17a) SHA1(1d387736144c30fcb5de54235331ab1ff70c356e) )
389 	ROM_LOAD32_BYTE( "945_l04b.k8", 0x180000, 0x20000, CRC(843bc67d) SHA1(cdf8421083f24ab27867ed5d08d8949da192b2b9) )
390 	ROM_LOAD32_BYTE( "945_l04d.m8", 0x180001, 0x20000, CRC(0a98d08e) SHA1(1e0ca51a2d45c01fa3f11950ddd387f41ddae691) )
391 	ROM_LOAD32_BYTE( "945_l03b.e8", 0x180002, 0x20000, CRC(933e68b9) SHA1(f3a39446ca77d17fdbd938bd5f718ae9d5570879) )
392 	ROM_LOAD32_BYTE( "945_l03d.h8", 0x180003, 0x20000, CRC(f375e87b) SHA1(6427b966795c907c8e516244872fe52217da62c4) )
393 
394 	ROM_REGION( 0x0100, "proms", 0 )
395 	ROM_LOAD( "945l14.j28", 0x0000, 0x0100, CRC(c778c189) SHA1(847eaf379ba075c25911c6f83dd63ff390534f60) )  /* priority encoder (not used) */
396 
397 	ROM_REGION( 0x80000, "k007232", 0 ) /* 007232 samples */
398 	ROM_LOAD( "945_a10.b15",  0x00000, 0x40000, CRC(1d083e10) SHA1(b116f133a7647ef7a6c373aff00e9622d9954b61) )
399 	ROM_LOAD( "945_l11a.c18", 0x40000, 0x20000, CRC(6043f4eb) SHA1(1c2e9ace1cfdde504b7b6158e3c3f54dc5ae33d4) )
400 	ROM_LOAD( "945_l11b.c20", 0x60000, 0x20000, CRC(89ea3baf) SHA1(8edcbaa7969185cfac48c02559826d1b8b081f3f) )
401 ROM_END
402 
403 ROM_START( gradius3js )
404 	ROM_REGION( 0x40000, "maincpu", 0 )
405 	ROM_LOAD16_BYTE( "945_s13.f15", 0x00000, 0x20000, CRC(70c240a2) SHA1(82dc391572e1f61b0182cb031654d71adcdd5f6e) )
406 	ROM_LOAD16_BYTE( "945_s12.e15", 0x00001, 0x20000, CRC(bbc300d4) SHA1(e1ca98bc591575285d7bd2d4fefdf35fed10dcb6) )
407 
408 	ROM_REGION( 0x100000, "sub", 0 )
409 	ROM_LOAD16_BYTE( "945_m09.r17",  0x000000, 0x20000, CRC(b4a6df25) SHA1(85533cf140d28f6f81c0b49b8061bda0924a613a) )
410 	ROM_LOAD16_BYTE( "945_m08.n17",  0x000001, 0x20000, CRC(74e981d2) SHA1(e7b47a2da01ff73293d2100c48fdf00b33125af5) )
411 	ROM_LOAD16_BYTE( "945_l06b.r11", 0x040000, 0x20000, CRC(83772304) SHA1(a90c75a3de670b6ec5e0fc201876d463b4a76766) )
412 	ROM_LOAD16_BYTE( "945_l06a.n11", 0x040001, 0x20000, CRC(e1fd75b6) SHA1(6160d80a2f1bf550e85d6253cf521a96f5a644cc) )
413 	ROM_LOAD16_BYTE( "945_l07c.r15", 0x080000, 0x20000, CRC(c1e399b6) SHA1(e95bd478dd3beea0175bf9ee4cededb111c4ace1) )
414 	ROM_LOAD16_BYTE( "945_l07a.n15", 0x080001, 0x20000, CRC(96222d04) SHA1(b55700f683a556b0e73dbac9c7b4ce485420d21c) )
415 	ROM_LOAD16_BYTE( "945_l07d.r13", 0x0c0000, 0x20000, CRC(4c16d4bd) SHA1(01dcf169b78a1e495214b10181401d1920b0c924) )
416 	ROM_LOAD16_BYTE( "945_l07b.n13", 0x0c0001, 0x20000, CRC(5e209d01) SHA1(0efa1bbfdc7e2ba1e0bb96245e2bfe961258b446) )
417 
418 	ROM_REGION( 0x10000, "audiocpu", 0 )
419 	ROM_LOAD( "945_m05.d9", 0x00000, 0x10000, CRC(c8c45365) SHA1(b9a7b736b52bca42c7b8c8ed64c8df73e0116158) )
420 
421 	ROM_REGION( 0x200000, "k051960", 0 )   /* graphics (addressable by the main CPU) */
422 	ROM_LOAD32_BYTE( "945_a02a.k2", 0x000000, 0x20000, CRC(fbb81511) SHA1(e7988d52e323e46117f5080c469daf9b119f28a0) )
423 	ROM_LOAD32_BYTE( "945_a02c.m2", 0x000001, 0x20000, CRC(031b55e8) SHA1(64ed8dee60bf012df7c1ed496af1c75263c052a6) )
424 	ROM_LOAD32_BYTE( "945_a01a.e2", 0x000002, 0x20000, CRC(bace5abb) SHA1(b32df63294c0730f463335b1b760494389c60062) )
425 	ROM_LOAD32_BYTE( "945_a01c.h2", 0x000003, 0x20000, CRC(d91b29a6) SHA1(0c3027a08996f4c2b86dd88695241b21c8dffd64) )
426 	ROM_LOAD32_BYTE( "945_a02b.k4", 0x080000, 0x20000, CRC(c0fed4ab) SHA1(f01975b13759cae7c8dfd24f9b3f4ac960d32957) )
427 	ROM_LOAD32_BYTE( "945_a02d.m4", 0x080001, 0x20000, CRC(d462817c) SHA1(00137e38454e7c3548a1a9553c5ee644916b3959) )
428 	ROM_LOAD32_BYTE( "945_a01b.e4", 0x080002, 0x20000, CRC(b426090e) SHA1(06a671a648e3255146fe0c325d5451d4f75f08aa) )
429 	ROM_LOAD32_BYTE( "945_a01d.h4", 0x080003, 0x20000, CRC(3990c09a) SHA1(1f6a089c1d03fb95d4d96fecc0379bde26ee2b9d) )
430 
431 	ROM_LOAD32_BYTE( "945_l04a.k6", 0x100000, 0x20000, CRC(884e21ee) SHA1(ce86dd3a06775e5b1aa09db010dcb674e67828e7) )
432 	ROM_LOAD32_BYTE( "945_l04c.m6", 0x100001, 0x20000, CRC(45bcd921) SHA1(e51a8a71362a6fb55124aa1dce74519c0a3c6e3f) )
433 	ROM_LOAD32_BYTE( "945_l03a.e6", 0x100002, 0x20000, CRC(a67ef087) SHA1(fd63474f3bbde5dfc53ed4c1db25d6411a8b54d2) )
434 	ROM_LOAD32_BYTE( "945_l03c.h6", 0x100003, 0x20000, CRC(a56be17a) SHA1(1d387736144c30fcb5de54235331ab1ff70c356e) )
435 	ROM_LOAD32_BYTE( "945_l04b.k8", 0x180000, 0x20000, CRC(843bc67d) SHA1(cdf8421083f24ab27867ed5d08d8949da192b2b9) )
436 	ROM_LOAD32_BYTE( "945_l04d.m8", 0x180001, 0x20000, CRC(0a98d08e) SHA1(1e0ca51a2d45c01fa3f11950ddd387f41ddae691) )
437 	ROM_LOAD32_BYTE( "945_l03b.e8", 0x180002, 0x20000, CRC(933e68b9) SHA1(f3a39446ca77d17fdbd938bd5f718ae9d5570879) )
438 	ROM_LOAD32_BYTE( "945_l03d.h8", 0x180003, 0x20000, CRC(f375e87b) SHA1(6427b966795c907c8e516244872fe52217da62c4) )
439 
440 	ROM_REGION( 0x0100, "proms", 0 )
441 	ROM_LOAD( "945l14.j28", 0x0000, 0x0100, CRC(c778c189) SHA1(847eaf379ba075c25911c6f83dd63ff390534f60) )  /* priority encoder (not used) */
442 
443 	ROM_REGION( 0x80000, "k007232", 0 ) /* 007232 samples */
444 	ROM_LOAD16_BYTE( "945_a10a.c14", 0x00000, 0x20000, CRC(ec717414) SHA1(8c63d5fe01d0833529fca91bc80cdbd8a04174c0) )
445 	ROM_LOAD16_BYTE( "945_a10b.c16", 0x00001, 0x20000, CRC(709e30e4) SHA1(27fcea720cd2498f1870c9290d30dcb3dd81d5e5) )
446 	ROM_LOAD( "945_l11a.c18", 0x40000, 0x20000, CRC(6043f4eb) SHA1(1c2e9ace1cfdde504b7b6158e3c3f54dc5ae33d4) )
447 	ROM_LOAD( "945_l11b.c20", 0x60000, 0x20000, CRC(89ea3baf) SHA1(8edcbaa7969185cfac48c02559826d1b8b081f3f) )
448 ROM_END
449 
450 ROM_START( gradius3a )
451 	ROM_REGION( 0x40000, "maincpu", 0 )
452 	ROM_LOAD16_BYTE( "945_13.f15", 0x00000, 0x20000, CRC(9974fe6b) SHA1(c18ad8d7c93bf58d886715d8e210177cf49f220b) )
453 	ROM_LOAD16_BYTE( "945_12.e15", 0x00001, 0x20000, CRC(e9771b91) SHA1(c9f4610b897c13742b44b546e2bed8ee21945f61) )
454 
455 	ROM_REGION( 0x100000, "sub", 0 )
456 	ROM_LOAD16_BYTE( "945_m09.r17",  0x000000, 0x20000, CRC(b4a6df25) SHA1(85533cf140d28f6f81c0b49b8061bda0924a613a) )
457 	ROM_LOAD16_BYTE( "945_m08.n17",  0x000001, 0x20000, CRC(74e981d2) SHA1(e7b47a2da01ff73293d2100c48fdf00b33125af5) )
458 	ROM_LOAD16_BYTE( "945_l06b.r11", 0x040000, 0x20000, CRC(83772304) SHA1(a90c75a3de670b6ec5e0fc201876d463b4a76766) )
459 	ROM_LOAD16_BYTE( "945_l06a.n11", 0x040001, 0x20000, CRC(e1fd75b6) SHA1(6160d80a2f1bf550e85d6253cf521a96f5a644cc) )
460 	ROM_LOAD16_BYTE( "945_l07c.r15", 0x080000, 0x20000, CRC(c1e399b6) SHA1(e95bd478dd3beea0175bf9ee4cededb111c4ace1) )
461 	ROM_LOAD16_BYTE( "945_l07a.n15", 0x080001, 0x20000, CRC(96222d04) SHA1(b55700f683a556b0e73dbac9c7b4ce485420d21c) )
462 	ROM_LOAD16_BYTE( "945_l07d.r13", 0x0c0000, 0x20000, CRC(4c16d4bd) SHA1(01dcf169b78a1e495214b10181401d1920b0c924) )
463 	ROM_LOAD16_BYTE( "945_l07b.n13", 0x0c0001, 0x20000, CRC(5e209d01) SHA1(0efa1bbfdc7e2ba1e0bb96245e2bfe961258b446) )
464 
465 	ROM_REGION( 0x10000, "audiocpu", 0 )
466 	ROM_LOAD( "945_m05.d9", 0x00000, 0x10000, CRC(c8c45365) SHA1(b9a7b736b52bca42c7b8c8ed64c8df73e0116158) )
467 
468 	ROM_REGION( 0x200000, "k051960", 0 )   /* graphics (addressable by the main CPU) */
469 	ROM_LOAD32_WORD( "945_a02.l3",  0x000000, 0x80000, CRC(4dfffd74) SHA1(588210bac27448240ef08961f70b714b69cb3ffd) )
470 	ROM_LOAD32_WORD( "945_a01.h3",  0x000002, 0x80000, CRC(339d6dd2) SHA1(6a52b826aba92c75fc6a5926184948735dc20812) )
471 	ROM_LOAD32_BYTE( "945_l04a.k6", 0x100000, 0x20000, CRC(884e21ee) SHA1(ce86dd3a06775e5b1aa09db010dcb674e67828e7) )
472 	ROM_LOAD32_BYTE( "945_l04c.m6", 0x100001, 0x20000, CRC(45bcd921) SHA1(e51a8a71362a6fb55124aa1dce74519c0a3c6e3f) )
473 	ROM_LOAD32_BYTE( "945_l03a.e6", 0x100002, 0x20000, CRC(a67ef087) SHA1(fd63474f3bbde5dfc53ed4c1db25d6411a8b54d2) )
474 	ROM_LOAD32_BYTE( "945_l03c.h6", 0x100003, 0x20000, CRC(a56be17a) SHA1(1d387736144c30fcb5de54235331ab1ff70c356e) )
475 	ROM_LOAD32_BYTE( "945_l04b.k8", 0x180000, 0x20000, CRC(843bc67d) SHA1(cdf8421083f24ab27867ed5d08d8949da192b2b9) )
476 	ROM_LOAD32_BYTE( "945_l04d.m8", 0x180001, 0x20000, CRC(0a98d08e) SHA1(1e0ca51a2d45c01fa3f11950ddd387f41ddae691) )
477 	ROM_LOAD32_BYTE( "945_l03b.e8", 0x180002, 0x20000, CRC(933e68b9) SHA1(f3a39446ca77d17fdbd938bd5f718ae9d5570879) )
478 	ROM_LOAD32_BYTE( "945_l03d.h8", 0x180003, 0x20000, CRC(f375e87b) SHA1(6427b966795c907c8e516244872fe52217da62c4) )
479 
480 	ROM_REGION( 0x0100, "proms", 0 )
481 	ROM_LOAD( "945l14.j28", 0x0000, 0x0100, CRC(c778c189) SHA1(847eaf379ba075c25911c6f83dd63ff390534f60) )  /* priority encoder (not used) */
482 
483 	ROM_REGION( 0x80000, "k007232", 0 ) /* 007232 samples */
484 	ROM_LOAD( "945_a10.b15",  0x00000, 0x40000, CRC(1d083e10) SHA1(b116f133a7647ef7a6c373aff00e9622d9954b61) )
485 	ROM_LOAD( "945_l11a.c18", 0x40000, 0x20000, CRC(6043f4eb) SHA1(1c2e9ace1cfdde504b7b6158e3c3f54dc5ae33d4) )
486 	ROM_LOAD( "945_l11b.c20", 0x60000, 0x20000, CRC(89ea3baf) SHA1(8edcbaa7969185cfac48c02559826d1b8b081f3f) )
487 ROM_END
488 
489 
490 
491 GAME( 1989, gradius3,   0,        gradius3, gradius3, gradius3_state, empty_init, ROT0, "Konami", "Gradius III (World, program code R)",        MACHINE_SUPPORTS_SAVE )
492 GAME( 1989, gradius3j,  gradius3, gradius3, gradius3, gradius3_state, empty_init, ROT0, "Konami", "Gradius III (Japan, program code S)",        MACHINE_SUPPORTS_SAVE )
493 GAME( 1989, gradius3js, gradius3, gradius3, gradius3, gradius3_state, empty_init, ROT0, "Konami", "Gradius III (Japan, program code S, split)", MACHINE_SUPPORTS_SAVE )
494 GAME( 1989, gradius3a,  gradius3, gradius3, gradius3, gradius3_state, empty_init, ROT0, "Konami", "Gradius III (Asia)",                         MACHINE_SUPPORTS_SAVE )
495