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