trunk/src/mame/drivers/gbusters.c
| r244691 | r244692 | |
| 1 | | /*************************************************************************** |
| 2 | | |
| 3 | | Gangbusters (GX878) (c) 1988 Konami |
| 4 | | |
| 5 | | Preliminary driver by: |
| 6 | | Manuel Abadia <manu@teleline.es> |
| 7 | | |
| 8 | | ***************************************************************************/ |
| 9 | | |
| 10 | | #include "emu.h" |
| 11 | | #include "cpu/z80/z80.h" |
| 12 | | #include "cpu/m6809/konami.h" /* for the callback and the firq irq definition */ |
| 13 | | |
| 14 | | #include "sound/2151intf.h" |
| 15 | | #include "includes/konamipt.h" |
| 16 | | #include "includes/gbusters.h" |
| 17 | | |
| 18 | | INTERRUPT_GEN_MEMBER(gbusters_state::gbusters_interrupt) |
| 19 | | { |
| 20 | | if (m_k052109->is_irq_enabled()) |
| 21 | | device.execute().set_input_line(KONAMI_IRQ_LINE, HOLD_LINE); |
| 22 | | } |
| 23 | | |
| 24 | | READ8_MEMBER(gbusters_state::bankedram_r) |
| 25 | | { |
| 26 | | if (m_palette_selected) |
| 27 | | return m_paletteram[offset]; |
| 28 | | else |
| 29 | | return m_ram[offset]; |
| 30 | | } |
| 31 | | |
| 32 | | WRITE8_MEMBER(gbusters_state::bankedram_w) |
| 33 | | { |
| 34 | | if (m_palette_selected) |
| 35 | | m_palette->write(space, offset, data); |
| 36 | | else |
| 37 | | m_ram[offset] = data; |
| 38 | | } |
| 39 | | |
| 40 | | WRITE8_MEMBER(gbusters_state::gbusters_1f98_w) |
| 41 | | { |
| 42 | | /* bit 0 = enable char ROM reading through the video RAM */ |
| 43 | | m_k052109->set_rmrd_line((data & 0x01) ? ASSERT_LINE : CLEAR_LINE); |
| 44 | | |
| 45 | | /* bit 7 used (during gfx rom tests), but unknown */ |
| 46 | | |
| 47 | | /* other bits unused/unknown */ |
| 48 | | if (data & 0xfe) |
| 49 | | { |
| 50 | | //logerror("%04x: (1f98) write %02x\n",space.device().safe_pc(), data); |
| 51 | | //popmessage("$1f98 = %02x", data); |
| 52 | | } |
| 53 | | } |
| 54 | | |
| 55 | | WRITE8_MEMBER(gbusters_state::gbusters_coin_counter_w) |
| 56 | | { |
| 57 | | /* bit 0 select palette RAM or work RAM at 5800-5fff */ |
| 58 | | m_palette_selected = ~data & 0x01; |
| 59 | | |
| 60 | | /* bits 1 & 2 = coin counters */ |
| 61 | | coin_counter_w(machine(), 0, data & 0x02); |
| 62 | | coin_counter_w(machine(), 1, data & 0x04); |
| 63 | | |
| 64 | | /* bits 3 selects tilemap priority */ |
| 65 | | m_priority = data & 0x08; |
| 66 | | |
| 67 | | /* bit 7 is used but unknown */ |
| 68 | | |
| 69 | | /* other bits unused/unknown */ |
| 70 | | if (data & 0xf8) |
| 71 | | { |
| 72 | | #if 0 |
| 73 | | char baf[40]; |
| 74 | | sprintf(baf, "ccnt = %02x", data); |
| 75 | | popmessage(baf); |
| 76 | | #endif |
| 77 | | logerror("%04x: (ccount) write %02x\n", space.device().safe_pc(), data); |
| 78 | | } |
| 79 | | } |
| 80 | | |
| 81 | | WRITE8_MEMBER(gbusters_state::gbusters_unknown_w) |
| 82 | | { |
| 83 | | logerror("%04x: write %02x to 0x1f9c\n",space.device().safe_pc(), data); |
| 84 | | |
| 85 | | { |
| 86 | | char baf[40]; |
| 87 | | sprintf(baf,"??? = %02x", data); |
| 88 | | // popmessage(baf); |
| 89 | | } |
| 90 | | } |
| 91 | | |
| 92 | | WRITE8_MEMBER(gbusters_state::gbusters_sh_irqtrigger_w) |
| 93 | | { |
| 94 | | m_audiocpu->set_input_line_and_vector(0, HOLD_LINE, 0xff); |
| 95 | | } |
| 96 | | |
| 97 | | WRITE8_MEMBER(gbusters_state::gbusters_snd_bankswitch_w) |
| 98 | | { |
| 99 | | int bank_B = BIT(data, 2); /* ?? */ |
| 100 | | int bank_A = BIT(data, 0); /* ?? */ |
| 101 | | m_k007232->set_bank(bank_A, bank_B ); |
| 102 | | |
| 103 | | #if 0 |
| 104 | | { |
| 105 | | char baf[40]; |
| 106 | | sprintf(baf,"snd_bankswitch = %02x", data); |
| 107 | | popmessage(baf); |
| 108 | | } |
| 109 | | #endif |
| 110 | | } |
| 111 | | |
| 112 | | /* special handlers to combine 052109 & 051960 */ |
| 113 | | READ8_MEMBER(gbusters_state::k052109_051960_r) |
| 114 | | { |
| 115 | | if (m_k052109->get_rmrd_line() == CLEAR_LINE) |
| 116 | | { |
| 117 | | if (offset >= 0x3800 && offset < 0x3808) |
| 118 | | return m_k051960->k051937_r(space, offset - 0x3800); |
| 119 | | else if (offset < 0x3c00) |
| 120 | | return m_k052109->read(space, offset); |
| 121 | | else |
| 122 | | return m_k051960->k051960_r(space, offset - 0x3c00); |
| 123 | | } |
| 124 | | else |
| 125 | | return m_k052109->read(space, offset); |
| 126 | | } |
| 127 | | |
| 128 | | WRITE8_MEMBER(gbusters_state::k052109_051960_w) |
| 129 | | { |
| 130 | | if (offset >= 0x3800 && offset < 0x3808) |
| 131 | | m_k051960->k051937_w(space, offset - 0x3800, data); |
| 132 | | else if (offset < 0x3c00) |
| 133 | | m_k052109->write(space, offset, data); |
| 134 | | else |
| 135 | | m_k051960->k051960_w(space, offset - 0x3c00, data); |
| 136 | | } |
| 137 | | |
| 138 | | |
| 139 | | static ADDRESS_MAP_START( gbusters_map, AS_PROGRAM, 8, gbusters_state ) |
| 140 | | AM_RANGE(0x1f80, 0x1f80) AM_WRITE(gbusters_coin_counter_w) /* coin counters */ |
| 141 | | AM_RANGE(0x1f84, 0x1f84) AM_WRITE(soundlatch_byte_w) /* sound code # */ |
| 142 | | AM_RANGE(0x1f88, 0x1f88) AM_WRITE(gbusters_sh_irqtrigger_w) /* cause interrupt on audio CPU */ |
| 143 | | AM_RANGE(0x1f8c, 0x1f8c) AM_WRITE(watchdog_reset_w) /* watchdog reset */ |
| 144 | | AM_RANGE(0x1f90, 0x1f90) AM_READ_PORT("SYSTEM") |
| 145 | | AM_RANGE(0x1f91, 0x1f91) AM_READ_PORT("P1") |
| 146 | | AM_RANGE(0x1f92, 0x1f92) AM_READ_PORT("P2") |
| 147 | | AM_RANGE(0x1f93, 0x1f93) AM_READ_PORT("DSW3") |
| 148 | | AM_RANGE(0x1f94, 0x1f94) AM_READ_PORT("DSW1") |
| 149 | | AM_RANGE(0x1f95, 0x1f95) AM_READ_PORT("DSW2") |
| 150 | | AM_RANGE(0x1f98, 0x1f98) AM_WRITE(gbusters_1f98_w) /* enable gfx ROM read through VRAM */ |
| 151 | | AM_RANGE(0x1f9c, 0x1f9c) AM_WRITE(gbusters_unknown_w) /* ??? */ |
| 152 | | AM_RANGE(0x0000, 0x3fff) AM_READWRITE(k052109_051960_r, k052109_051960_w) /* tiles + sprites (RAM H21, G21 & H6) */ |
| 153 | | AM_RANGE(0x4000, 0x57ff) AM_RAM /* RAM I12 */ |
| 154 | | AM_RANGE(0x5800, 0x5fff) AM_READWRITE(bankedram_r, bankedram_w) AM_SHARE("ram") /* palette + work RAM (RAM D16 & C16) */ |
| 155 | | AM_RANGE(0x6000, 0x7fff) AM_ROMBANK("bank1") /* banked ROM */ |
| 156 | | AM_RANGE(0x8000, 0xffff) AM_ROM /* ROM 878n02.rom */ |
| 157 | | ADDRESS_MAP_END |
| 158 | | |
| 159 | | static ADDRESS_MAP_START( gbusters_sound_map, AS_PROGRAM, 8, gbusters_state ) |
| 160 | | AM_RANGE(0x0000, 0x7fff) AM_ROM /* ROM 878h01.rom */ |
| 161 | | AM_RANGE(0x8000, 0x87ff) AM_RAM /* RAM */ |
| 162 | | AM_RANGE(0xa000, 0xa000) AM_READ(soundlatch_byte_r) /* soundlatch_byte_r */ |
| 163 | | AM_RANGE(0xb000, 0xb00d) AM_DEVREADWRITE("k007232", k007232_device, read, write) /* 007232 registers */ |
| 164 | | AM_RANGE(0xc001, 0xc001) AM_DEVREAD("ymsnd", ym2151_device, status_r) /* YM 2151 */ |
| 165 | | AM_RANGE(0xc000, 0xc001) AM_DEVREADWRITE("ymsnd", ym2151_device, read, write) /* YM 2151 */ |
| 166 | | AM_RANGE(0xf000, 0xf000) AM_WRITE(gbusters_snd_bankswitch_w) /* 007232 bankswitch? */ |
| 167 | | ADDRESS_MAP_END |
| 168 | | |
| 169 | | /*************************************************************************** |
| 170 | | |
| 171 | | Input Ports |
| 172 | | |
| 173 | | ***************************************************************************/ |
| 174 | | |
| 175 | | static INPUT_PORTS_START( gbusters ) |
| 176 | | PORT_START("DSW1") |
| 177 | | KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "No Coin B", SW1) |
| 178 | | /* "No Coin B" = coins produce sound, but no effect on coin counter */ |
| 179 | | |
| 180 | | PORT_START("DSW2") |
| 181 | | PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") |
| 182 | | PORT_DIPSETTING( 0x03, "2" ) |
| 183 | | PORT_DIPSETTING( 0x02, "3" ) |
| 184 | | PORT_DIPSETTING( 0x01, "5" ) |
| 185 | | PORT_DIPSETTING( 0x00, "7" ) |
| 186 | | PORT_DIPNAME( 0x04, 0x04, "Bullets" ) PORT_DIPLOCATION("SW2:3") |
| 187 | | PORT_DIPSETTING( 0x04, "50" ) |
| 188 | | PORT_DIPSETTING( 0x00, "60" ) |
| 189 | | PORT_DIPNAME( 0x18, 0x10, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4,5") |
| 190 | | PORT_DIPSETTING( 0x18, "50k, 200k, Every 400k" ) |
| 191 | | PORT_DIPSETTING( 0x10, "70k, 250k, Every 500k" ) |
| 192 | | PORT_DIPSETTING( 0x08, "50k Only" ) |
| 193 | | PORT_DIPSETTING( 0x00, "70k Only" ) |
| 194 | | PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7") |
| 195 | | PORT_DIPSETTING( 0x60, DEF_STR( Easy ) ) |
| 196 | | PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) |
| 197 | | PORT_DIPSETTING( 0x20, DEF_STR( Difficult ) ) |
| 198 | | PORT_DIPSETTING( 0x00, DEF_STR( Very_Difficult ) ) |
| 199 | | PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") |
| 200 | | PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) |
| 201 | | PORT_DIPSETTING( 0x00, DEF_STR( On ) ) |
| 202 | | |
| 203 | | PORT_START("DSW3") |
| 204 | | PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW3:1") |
| 205 | | PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) |
| 206 | | PORT_DIPSETTING( 0x00, DEF_STR( On ) ) |
| 207 | | PORT_DIPUNUSED_DIPLOC( 0x02, 0x02, "SW3:2" ) /* Listed as "Unused" */ |
| 208 | | PORT_SERVICE_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW3:3" ) |
| 209 | | PORT_DIPUNUSED_DIPLOC( 0x08, 0x08, "SW3:4" ) /* Listed as "Unused" */ |
| 210 | | PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED ) |
| 211 | | |
| 212 | | PORT_START("SYSTEM") |
| 213 | | KONAMI8_SYSTEM_UNK |
| 214 | | |
| 215 | | PORT_START("P1") |
| 216 | | KONAMI8_B12_UNK(1) |
| 217 | | |
| 218 | | PORT_START("P2") |
| 219 | | KONAMI8_B12_UNK(2) |
| 220 | | INPUT_PORTS_END |
| 221 | | |
| 222 | | |
| 223 | | /*************************************************************************** |
| 224 | | |
| 225 | | Machine Driver |
| 226 | | |
| 227 | | ***************************************************************************/ |
| 228 | | |
| 229 | | WRITE8_MEMBER(gbusters_state::volume_callback) |
| 230 | | { |
| 231 | | m_k007232->set_volume(0, (data >> 4) * 0x11, 0); |
| 232 | | m_k007232->set_volume(1, 0, (data & 0x0f) * 0x11); |
| 233 | | } |
| 234 | | |
| 235 | | void gbusters_state::machine_start() |
| 236 | | { |
| 237 | | UINT8 *ROM = memregion("maincpu")->base(); |
| 238 | | |
| 239 | | membank("bank1")->configure_entries(0, 16, &ROM[0x10000], 0x2000); |
| 240 | | membank("bank1")->set_entry(0); |
| 241 | | |
| 242 | | m_paletteram.resize(0x800); |
| 243 | | m_palette->basemem().set(m_paletteram, ENDIANNESS_BIG, 2); |
| 244 | | |
| 245 | | save_item(NAME(m_paletteram)); |
| 246 | | save_item(NAME(m_palette_selected)); |
| 247 | | save_item(NAME(m_priority)); |
| 248 | | } |
| 249 | | |
| 250 | | void gbusters_state::machine_reset() |
| 251 | | { |
| 252 | | UINT8 *RAM = memregion("maincpu")->base(); |
| 253 | | |
| 254 | | /* mirror address for banked ROM */ |
| 255 | | memcpy(&RAM[0x18000], &RAM[0x10000], 0x08000); |
| 256 | | |
| 257 | | m_palette_selected = 0; |
| 258 | | m_priority = 0; |
| 259 | | } |
| 260 | | |
| 261 | | WRITE8_MEMBER( gbusters_state::banking_callback ) |
| 262 | | { |
| 263 | | /* bits 0-3 ROM bank */ |
| 264 | | membank("bank1")->set_entry(data & 0x0f); |
| 265 | | |
| 266 | | if (data & 0xf0) |
| 267 | | { |
| 268 | | //logerror("%04x: (lines) write %02x\n",device->safe_pc(), data); |
| 269 | | //popmessage("lines = %02x", data); |
| 270 | | } |
| 271 | | |
| 272 | | /* other bits unknown */ |
| 273 | | } |
| 274 | | |
| 275 | | static MACHINE_CONFIG_START( gbusters, gbusters_state ) |
| 276 | | |
| 277 | | /* basic machine hardware */ |
| 278 | | MCFG_CPU_ADD("maincpu", KONAMI, 3000000) /* Konami custom 052526 */ |
| 279 | | MCFG_CPU_PROGRAM_MAP(gbusters_map) |
| 280 | | MCFG_CPU_VBLANK_INT_DRIVER("screen", gbusters_state, gbusters_interrupt) |
| 281 | | MCFG_KONAMICPU_LINE_CB(WRITE8(gbusters_state, banking_callback)) |
| 282 | | |
| 283 | | MCFG_CPU_ADD("audiocpu", Z80, 3579545) /* ? */ |
| 284 | | MCFG_CPU_PROGRAM_MAP(gbusters_sound_map) |
| 285 | | |
| 286 | | /* video hardware */ |
| 287 | | MCFG_SCREEN_ADD("screen", RASTER) |
| 288 | | MCFG_SCREEN_REFRESH_RATE(60) |
| 289 | | MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) |
| 290 | | MCFG_SCREEN_SIZE(64*8, 32*8) |
| 291 | | MCFG_SCREEN_VISIBLE_AREA(14*8, (64-14)*8-1, 2*8, 30*8-1 ) |
| 292 | | MCFG_SCREEN_UPDATE_DRIVER(gbusters_state, screen_update_gbusters) |
| 293 | | MCFG_SCREEN_PALETTE("palette") |
| 294 | | |
| 295 | | MCFG_PALETTE_ADD("palette", 1024) |
| 296 | | MCFG_PALETTE_ENABLE_SHADOWS() |
| 297 | | MCFG_PALETTE_FORMAT(xBBBBBGGGGGRRRRR) |
| 298 | | |
| 299 | | MCFG_DEVICE_ADD("k052109", K052109, 0) |
| 300 | | MCFG_GFX_PALETTE("palette") |
| 301 | | MCFG_K052109_CB(gbusters_state, tile_callback) |
| 302 | | |
| 303 | | MCFG_DEVICE_ADD("k051960", K051960, 0) |
| 304 | | MCFG_GFX_PALETTE("palette") |
| 305 | | MCFG_K051960_CB(gbusters_state, sprite_callback) |
| 306 | | |
| 307 | | /* sound hardware */ |
| 308 | | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 309 | | |
| 310 | | MCFG_YM2151_ADD("ymsnd", 3579545) |
| 311 | | MCFG_SOUND_ROUTE(0, "mono", 0.60) |
| 312 | | MCFG_SOUND_ROUTE(1, "mono", 0.60) |
| 313 | | |
| 314 | | MCFG_SOUND_ADD("k007232", K007232, 3579545) |
| 315 | | MCFG_K007232_PORT_WRITE_HANDLER(WRITE8(gbusters_state, volume_callback)) |
| 316 | | MCFG_SOUND_ROUTE(0, "mono", 0.30) |
| 317 | | MCFG_SOUND_ROUTE(1, "mono", 0.30) |
| 318 | | MACHINE_CONFIG_END |
| 319 | | |
| 320 | | |
| 321 | | /*************************************************************************** |
| 322 | | |
| 323 | | Game ROMs |
| 324 | | |
| 325 | | ***************************************************************************/ |
| 326 | | |
| 327 | | ROM_START( gbusters ) |
| 328 | | ROM_REGION( 0x30000, "maincpu", 0 ) /* code + banked roms + space for banked RAM */ |
| 329 | | ROM_LOAD( "878n02.k13", 0x10000, 0x08000, CRC(51697aaa) SHA1(1e6461e2e5e871d44085623a890158a4c1c4c404) ) |
| 330 | | ROM_CONTINUE( 0x08000, 0x08000 ) |
| 331 | | ROM_LOAD( "878j03.k15", 0x20000, 0x10000, CRC(3943a065) SHA1(6b0863f4182e6c973adfaa618f096bd4cc9b7b6d) ) |
| 332 | | |
| 333 | | ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the sound CPU */ |
| 334 | | ROM_LOAD( "878h01.f8", 0x00000, 0x08000, CRC(96feafaa) SHA1(8b6547e610cb4fa1c1f5bf12cb05e9a12a353903) ) |
| 335 | | |
| 336 | | ROM_REGION( 0x80000, "k052109", 0 ) /* tiles */ |
| 337 | | ROM_LOAD32_WORD( "878c07.h27", 0x00000, 0x40000, CRC(eeed912c) SHA1(b2e27610b38f3fc9c2cdad600b03c8bae4fb9138) ) |
| 338 | | ROM_LOAD32_WORD( "878c08.k27", 0x00002, 0x40000, CRC(4d14626d) SHA1(226b1d83fb82586302be0a67737a427475856537) ) |
| 339 | | |
| 340 | | ROM_REGION( 0x80000, "k051960", 0 ) /* sprites */ |
| 341 | | ROM_LOAD32_WORD( "878c05.h5", 0x00000, 0x40000, CRC(01f4aea5) SHA1(124123823be6bd597805484539d821aaaadde2c0) ) |
| 342 | | ROM_LOAD32_WORD( "878c06.k5", 0x00002, 0x40000, CRC(edfaaaaf) SHA1(67468c4ce47e8d43d58de8d3b50b048c66508156) ) |
| 343 | | |
| 344 | | ROM_REGION( 0x0100, "proms", 0 ) |
| 345 | | ROM_LOAD( "878a09.f20", 0x0000, 0x0100, CRC(e2d09a1b) SHA1(a9651e137486b2df367c39eb43f52d0833589e87) ) /* priority encoder (not used) */ |
| 346 | | |
| 347 | | ROM_REGION( 0x40000, "k007232", 0 ) /* samples for 007232 */ |
| 348 | | ROM_LOAD( "878c04.d5", 0x00000, 0x40000, CRC(9e982d1c) SHA1(a5b611c67b0f2ac50c679707931ee12ebbf72ebe) ) |
| 349 | | ROM_END |
| 350 | | |
| 351 | | ROM_START( gbustersa ) |
| 352 | | ROM_REGION( 0x30000, "maincpu", 0 ) /* code + banked roms + space for banked RAM */ |
| 353 | | ROM_LOAD( "878_02.k13", 0x10000, 0x08000, CRC(57178414) SHA1(89b1403158f6ce18706c8a941109554d03cf77d9) ) /* unknown region/version leter */ |
| 354 | | ROM_CONTINUE( 0x08000, 0x08000 ) |
| 355 | | ROM_LOAD( "878_03.k15", 0x20000, 0x10000, CRC(6c59e660) SHA1(66a92eb8a93c9f542489fa31bec6ed1819d174da) ) /* unknown region/version leter */ |
| 356 | | |
| 357 | | ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the sound CPU */ |
| 358 | | ROM_LOAD( "878h01.f8", 0x00000, 0x08000, CRC(96feafaa) SHA1(8b6547e610cb4fa1c1f5bf12cb05e9a12a353903) ) |
| 359 | | |
| 360 | | ROM_REGION( 0x80000, "k052109", 0 ) /* tiles */ |
| 361 | | ROM_LOAD32_WORD( "878c07.h27", 0x00000, 0x40000, CRC(eeed912c) SHA1(b2e27610b38f3fc9c2cdad600b03c8bae4fb9138) ) |
| 362 | | ROM_LOAD32_WORD( "878c08.k27", 0x00002, 0x40000, CRC(4d14626d) SHA1(226b1d83fb82586302be0a67737a427475856537) ) |
| 363 | | |
| 364 | | ROM_REGION( 0x80000, "k051960", 0 ) /* sprites */ |
| 365 | | ROM_LOAD32_WORD( "878c05.h5", 0x00000, 0x40000, CRC(01f4aea5) SHA1(124123823be6bd597805484539d821aaaadde2c0) ) |
| 366 | | ROM_LOAD32_WORD( "878c06.k5", 0x00002, 0x40000, CRC(edfaaaaf) SHA1(67468c4ce47e8d43d58de8d3b50b048c66508156) ) |
| 367 | | |
| 368 | | ROM_REGION( 0x0100, "proms", 0 ) |
| 369 | | ROM_LOAD( "878a09.f20", 0x0000, 0x0100, CRC(e2d09a1b) SHA1(a9651e137486b2df367c39eb43f52d0833589e87) ) /* priority encoder (not used) */ |
| 370 | | |
| 371 | | ROM_REGION( 0x40000, "k007232", 0 ) /* samples for 007232 */ |
| 372 | | ROM_LOAD( "878c04.d5", 0x00000, 0x40000, CRC(9e982d1c) SHA1(a5b611c67b0f2ac50c679707931ee12ebbf72ebe) ) |
| 373 | | ROM_END |
| 374 | | |
| 375 | | ROM_START( crazycop ) |
| 376 | | ROM_REGION( 0x30000, "maincpu", 0 ) /* code + banked roms + space for banked RAM */ |
| 377 | | ROM_LOAD( "878m02.k13", 0x10000, 0x08000, CRC(9c1c9f52) SHA1(7a60ad20aac92da8258b43b04f8c7f27bb71f1df) ) |
| 378 | | ROM_CONTINUE( 0x08000, 0x08000 ) |
| 379 | | ROM_LOAD( "878j03.k15", 0x20000, 0x10000, CRC(3943a065) SHA1(6b0863f4182e6c973adfaa618f096bd4cc9b7b6d) ) |
| 380 | | |
| 381 | | ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the sound CPU */ |
| 382 | | ROM_LOAD( "878h01.f8", 0x00000, 0x08000, CRC(96feafaa) SHA1(8b6547e610cb4fa1c1f5bf12cb05e9a12a353903) ) |
| 383 | | |
| 384 | | ROM_REGION( 0x80000, "k052109", 0 ) /* tiles */ |
| 385 | | ROM_LOAD32_WORD( "878c07.h27", 0x00000, 0x40000, CRC(eeed912c) SHA1(b2e27610b38f3fc9c2cdad600b03c8bae4fb9138) ) |
| 386 | | ROM_LOAD32_WORD( "878c08.k27", 0x00002, 0x40000, CRC(4d14626d) SHA1(226b1d83fb82586302be0a67737a427475856537) ) |
| 387 | | |
| 388 | | ROM_REGION( 0x80000, "k051960", 0 ) /* sprites */ |
| 389 | | ROM_LOAD32_WORD( "878c05.h5", 0x00000, 0x40000, CRC(01f4aea5) SHA1(124123823be6bd597805484539d821aaaadde2c0) ) |
| 390 | | ROM_LOAD32_WORD( "878c06.k5", 0x00002, 0x40000, CRC(edfaaaaf) SHA1(67468c4ce47e8d43d58de8d3b50b048c66508156) ) |
| 391 | | |
| 392 | | ROM_REGION( 0x0100, "proms", 0 ) |
| 393 | | ROM_LOAD( "878a09.f20", 0x0000, 0x0100, CRC(e2d09a1b) SHA1(a9651e137486b2df367c39eb43f52d0833589e87) ) /* priority encoder (not used) */ |
| 394 | | |
| 395 | | ROM_REGION( 0x40000, "k007232", 0 ) /* samples for 007232 */ |
| 396 | | ROM_LOAD( "878c04.d5", 0x00000, 0x40000, CRC(9e982d1c) SHA1(a5b611c67b0f2ac50c679707931ee12ebbf72ebe) ) |
| 397 | | ROM_END |
| 398 | | |
| 399 | | |
| 400 | | |
| 401 | | GAME( 1988, gbusters, 0, gbusters, gbusters, driver_device, 0, ROT90, "Konami", "Gang Busters (set 1)", GAME_SUPPORTS_SAVE ) /* N02 & J03 program roms */ |
| 402 | | GAME( 1988, gbustersa, gbusters, gbusters, gbusters, driver_device, 0, ROT90, "Konami", "Gang Busters (set 2)", GAME_SUPPORTS_SAVE ) /* unknown region program roms */ |
| 403 | | GAME( 1988, crazycop, gbusters, gbusters, gbusters, driver_device, 0, ROT90, "Konami", "Crazy Cop (Japan)", GAME_SUPPORTS_SAVE ) /* M02 & J03 program roms */ |
trunk/src/mame/drivers/thunderx.c
| r244691 | r244692 | |
| 1 | 1 | /*************************************************************************** |
| 2 | 2 | |
| 3 | | Super Contra / Thunder Cross |
| 3 | Super Contra (GX775) (c) 1988 Konami |
| 4 | Thunder Cross (GX873) (c) 1988 Konami |
| 5 | Gang Busters (GX878) (c) 1988 Konami |
| 4 | 6 | |
| 5 | 7 | driver by Bryan McPhail, Manuel Abadia |
| 6 | 8 | |
| 7 | 9 | K052591 emulation by Eddie Edwards |
| 8 | 10 | |
| 11 | These three games run on very similar boards, to the extent that |
| 12 | Thunder Cross and Gang Busters share the same schematics with |
| 13 | callouts ("USED ONLY GX873" or "USED ONLY GX878") to indicate the |
| 14 | per-game differences. |
| 15 | |
| 16 | Super Contra uses an external latch for program ROM banking |
| 17 | instead of the builtin banking of the Konami custom CPU, |
| 18 | and is the only one of the three games that uses sprite shadows. |
| 19 | |
| 20 | Thunder Cross has no 007232 sound chip, and has a 052591 PMC, |
| 21 | a programmable custom chip also used by S.P.Y. and Hexion. |
| 22 | Here it's used for collision detection. |
| 23 | |
| 24 | Gang Busters uses the 052526 custom CPU instead of 052001, and |
| 25 | has slightly different tile ROM addressing. |
| 26 | |
| 9 | 27 | - There was a set in MAME at one time that was given the setname (thndrxja) |
| 10 | 28 | which is supposedly a later revision of the japanese set currently in MAME. |
| 11 | 29 | No roms were ever sourced for this set, so the GAME macro no longer exists. |
| r244691 | r244692 | |
| 21 | 39 | #include "includes/thunderx.h" |
| 22 | 40 | |
| 23 | 41 | |
| 24 | | INTERRUPT_GEN_MEMBER(thunderx_state::scontra_interrupt) |
| 42 | INTERRUPT_GEN_MEMBER(thunderx_state::vblank_interrupt) |
| 25 | 43 | { |
| 26 | 44 | if (m_k052109->is_irq_enabled()) |
| 27 | 45 | device.execute().set_input_line(KONAMI_IRQ_LINE, HOLD_LINE); |
| r244691 | r244692 | |
| 39 | 57 | } |
| 40 | 58 | } |
| 41 | 59 | |
| 42 | | READ8_MEMBER(thunderx_state::scontra_bankedram_r) |
| 43 | | { |
| 44 | | if (m_palette_selected) |
| 45 | | return m_paletteram[offset]; |
| 46 | | else |
| 47 | | return m_ram[offset]; |
| 48 | | } |
| 60 | #define VERBOSE 0 |
| 61 | #define LOG(x) do { if (VERBOSE) logerror x; } while (0) |
| 62 | #define PMC_BK (m_1f98_latch & 0x02) |
| 49 | 63 | |
| 50 | | WRITE8_MEMBER(thunderx_state::scontra_bankedram_w) |
| 64 | READ8_MEMBER(thunderx_state::pmc_r) |
| 51 | 65 | { |
| 52 | | if (m_palette_selected) |
| 53 | | m_palette->write(space, offset, data); |
| 66 | if (PMC_BK) |
| 67 | { |
| 68 | // logerror("%04x read pmcram %04x\n",space.device().safe_pc(),offset); |
| 69 | return m_pmcram[offset]; |
| 70 | } |
| 54 | 71 | else |
| 55 | | m_ram[offset] = data; |
| 72 | { |
| 73 | LOG(("%04x read pmc internal ram %04x\n",space.device().safe_pc(),offset)); |
| 74 | return 0; |
| 75 | } |
| 56 | 76 | } |
| 57 | 77 | |
| 58 | | READ8_MEMBER(thunderx_state::thunderx_bankedram_r) |
| 78 | WRITE8_MEMBER(thunderx_state::pmc_w) |
| 59 | 79 | { |
| 60 | | if (m_rambank & 0x01) |
| 61 | | return m_ram[offset]; |
| 62 | | else if (m_rambank & 0x10) |
| 80 | if (PMC_BK) |
| 63 | 81 | { |
| 64 | | if (m_pmcbank) |
| 65 | | { |
| 66 | | // logerror("%04x read pmcram %04x\n",space.device().safe_pc(),offset); |
| 67 | | return m_pmcram[offset]; |
| 68 | | } |
| 69 | | else |
| 70 | | { |
| 71 | | logerror("%04x read pmc internal ram %04x\n",space.device().safe_pc(),offset); |
| 72 | | return 0; |
| 73 | | } |
| 82 | LOG(("%04x pmcram %04x = %02x\n",space.device().safe_pc(),offset,data)); |
| 83 | m_pmcram[offset] = data; |
| 74 | 84 | } |
| 75 | 85 | else |
| 76 | | return m_paletteram[offset]; |
| 77 | | } |
| 78 | | |
| 79 | | WRITE8_MEMBER(thunderx_state::thunderx_bankedram_w) |
| 80 | | { |
| 81 | | if (m_rambank & 0x01) |
| 82 | | m_ram[offset] = data; |
| 83 | | else if (m_rambank & 0x10) |
| 84 | 86 | { |
| 85 | | if (m_pmcbank) |
| 86 | | { |
| 87 | | logerror("%04x pmcram %04x = %02x\n",space.device().safe_pc(),offset,data); |
| 88 | | m_pmcram[offset] = data; |
| 89 | | } |
| 90 | | else |
| 91 | | logerror("%04x pmc internal ram %04x = %02x\n",space.device().safe_pc(),offset,data); |
| 87 | LOG(("%04x pmc internal ram %04x = %02x\n",space.device().safe_pc(),offset,data)); |
| 92 | 88 | } |
| 93 | | else |
| 94 | | m_palette->write(space, offset, data); |
| 95 | 89 | } |
| 96 | 90 | |
| 97 | 91 | /* |
| r244691 | r244692 | |
| 283 | 277 | run_collisions(X0, Y0, X1, Y1, CM, HM); |
| 284 | 278 | } |
| 285 | 279 | |
| 286 | | READ8_MEMBER(thunderx_state::thunderx_1f98_r) |
| 280 | WRITE8_MEMBER(thunderx_state::scontra_1f98_w) |
| 287 | 281 | { |
| 288 | | return m_1f98_data; |
| 282 | // bit 0 = enable char ROM reading through the video RAM |
| 283 | m_k052109->set_rmrd_line((data & 0x01) ? ASSERT_LINE : CLEAR_LINE); |
| 284 | |
| 285 | m_1f98_latch = data; |
| 289 | 286 | } |
| 290 | 287 | |
| 288 | READ8_MEMBER(thunderx_state::_1f98_r) |
| 289 | { |
| 290 | // thunderx and gbusters read from here during the gfx rom test... |
| 291 | // though it doesn't look like it should be readable based on the schematics |
| 292 | return m_1f98_latch; |
| 293 | } |
| 294 | |
| 291 | 295 | WRITE8_MEMBER(thunderx_state::thunderx_1f98_w) |
| 292 | 296 | { |
| 293 | 297 | // logerror("%04x: 1f98_w %02x\n", space.device().safe_pc(),data); |
| 294 | 298 | |
| 295 | | /* bit 0 = enable char ROM reading through the video RAM */ |
| 299 | // bit 0 = enable char ROM reading through the video RAM |
| 296 | 300 | m_k052109->set_rmrd_line((data & 0x01) ? ASSERT_LINE : CLEAR_LINE); |
| 297 | 301 | |
| 298 | | /* bit 1 = PMC-BK */ |
| 299 | | m_pmcbank = (data & 0x02) >> 1; |
| 302 | // bit 1 = PMC BK (select PMC program or data RAM) |
| 303 | // handled in pmc_r() and pmc_w() |
| 300 | 304 | |
| 301 | | /* bit 2 = do collision detection when 0->1 */ |
| 302 | | if ((data & 4) && !(m_1f98_data & 4)) |
| 305 | // bit 2 = PMC START (do collision detection when 0->1) |
| 306 | if ((data & 4) && !(m_1f98_latch & 4)) |
| 303 | 307 | { |
| 304 | 308 | calculate_collisions(); |
| 305 | 309 | |
| r244691 | r244692 | |
| 307 | 311 | timer_set(downcast<cpu_device *>(&space.device())->cycles_to_attotime(100), TIMER_THUNDERX_FIRQ); |
| 308 | 312 | } |
| 309 | 313 | |
| 310 | | m_1f98_data = data; |
| 314 | m_1f98_latch = data; |
| 311 | 315 | } |
| 312 | 316 | |
| 313 | 317 | WRITE8_MEMBER(thunderx_state::scontra_bankswitch_w) |
| 314 | 318 | { |
| 315 | | // logerror("%04x: bank switch %02x\n", space.device().safe_pc(), data & 0x0f); |
| 316 | | membank("bank1")->set_entry(data & 0x0f); |
| 319 | // bits 0-3 select ROM bank at 6000-7fff |
| 320 | m_rombank->set_entry(data & 0x0f); |
| 317 | 321 | |
| 318 | | /* bit 4 select work RAM or palette RAM at 5800-5fff */ |
| 319 | | m_palette_selected = ~data & 0x10; |
| 322 | // bit 4 selects work RAM or palette RAM at 5800-5fff |
| 323 | m_bank5800->set_bank((data & 0x10) >> 4); |
| 320 | 324 | |
| 321 | | /* bits 5/6 coin counters */ |
| 325 | // bits 5-6 coin counters |
| 322 | 326 | coin_counter_w(machine(), 0, data & 0x20); |
| 323 | 327 | coin_counter_w(machine(), 1, data & 0x40); |
| 324 | 328 | |
| 325 | | /* bit 7 controls layer priority */ |
| 329 | // bit 7 controls layer priority |
| 326 | 330 | m_priority = data & 0x80; |
| 327 | 331 | } |
| 328 | 332 | |
| 329 | 333 | WRITE8_MEMBER(thunderx_state::thunderx_videobank_w) |
| 330 | 334 | { |
| 331 | | //logerror("%04x: select video ram bank %02x\n",space.device().safe_pc(),data); |
| 332 | | /* 0x01 = work RAM at 4000-5fff */ |
| 333 | | /* 0x00 = palette at 5800-5fff */ |
| 334 | | /* 0x10 = unknown RAM at 5800-5fff */ |
| 335 | | m_rambank = data; |
| 335 | // 0x01 = work RAM at 4000-5fff |
| 336 | // 0x00 = palette at 5800-5fff |
| 337 | // 0x10 = PMC at 5800-5fff |
| 338 | m_bank5800->set_bank(data & 0x10 ? 2 : (data & 0x1)); |
| 336 | 339 | |
| 337 | | /* bits 1/2 coin counters */ |
| 340 | /* bits 1-2 coin counters */ |
| 338 | 341 | coin_counter_w(machine(), 0, data & 0x02); |
| 339 | 342 | coin_counter_w(machine(), 1, data & 0x04); |
| 340 | 343 | |
| 341 | | /* bit 3 controls layer priority (seems to be always 1) */ |
| 344 | /* bit 3 controls layer priority */ |
| 342 | 345 | m_priority = data & 0x08; |
| 343 | 346 | } |
| 344 | 347 | |
| 345 | | WRITE8_MEMBER(thunderx_state::thunderx_sh_irqtrigger_w) |
| 348 | WRITE8_MEMBER(thunderx_state::gbusters_videobank_w) |
| 346 | 349 | { |
| 350 | // same as thunderx without the PMC |
| 351 | m_bank5800->set_bank(data & 0x1); |
| 352 | |
| 353 | coin_counter_w(machine(), 0, data & 0x02); |
| 354 | coin_counter_w(machine(), 1, data & 0x04); |
| 355 | |
| 356 | m_priority = data & 0x08; |
| 357 | } |
| 358 | |
| 359 | WRITE8_MEMBER(thunderx_state::sh_irqtrigger_w) |
| 360 | { |
| 347 | 361 | m_audiocpu->set_input_line_and_vector(0, HOLD_LINE, 0xff); |
| 348 | 362 | } |
| 349 | 363 | |
| 350 | | WRITE8_MEMBER(thunderx_state::scontra_snd_bankswitch_w) |
| 364 | WRITE8_MEMBER(thunderx_state::k007232_bankswitch_w) |
| 351 | 365 | { |
| 352 | | /* b3-b2: bank for chanel B */ |
| 353 | | /* b1-b0: bank for chanel A */ |
| 354 | | |
| 366 | /* b3-b2: bank for channel B */ |
| 367 | /* b1-b0: bank for channel A */ |
| 355 | 368 | int bank_A = (data & 0x03); |
| 356 | 369 | int bank_B = ((data >> 2) & 0x03); |
| 357 | 370 | m_k007232->set_bank(bank_A, bank_B); |
| r244691 | r244692 | |
| 387 | 400 | static ADDRESS_MAP_START( scontra_map, AS_PROGRAM, 8, thunderx_state ) |
| 388 | 401 | AM_RANGE(0x1f80, 0x1f80) AM_WRITE(scontra_bankswitch_w) /* bankswitch control + coin counters */ |
| 389 | 402 | AM_RANGE(0x1f84, 0x1f84) AM_WRITE(soundlatch_byte_w) |
| 390 | | AM_RANGE(0x1f88, 0x1f88) AM_WRITE(thunderx_sh_irqtrigger_w) /* cause interrupt on audio CPU */ |
| 403 | AM_RANGE(0x1f88, 0x1f88) AM_WRITE(sh_irqtrigger_w) /* cause interrupt on audio CPU */ |
| 391 | 404 | AM_RANGE(0x1f8c, 0x1f8c) AM_WRITE(watchdog_reset_w) |
| 392 | 405 | AM_RANGE(0x1f90, 0x1f90) AM_READ_PORT("SYSTEM") |
| 393 | 406 | AM_RANGE(0x1f91, 0x1f91) AM_READ_PORT("P1") |
| r244691 | r244692 | |
| 395 | 408 | AM_RANGE(0x1f93, 0x1f93) AM_READ_PORT("DSW3") |
| 396 | 409 | AM_RANGE(0x1f94, 0x1f94) AM_READ_PORT("DSW1") |
| 397 | 410 | AM_RANGE(0x1f95, 0x1f95) AM_READ_PORT("DSW2") |
| 398 | | AM_RANGE(0x1f98, 0x1f98) AM_WRITE(thunderx_1f98_w) |
| 411 | AM_RANGE(0x1f98, 0x1f98) AM_READWRITE(_1f98_r, scontra_1f98_w) |
| 399 | 412 | AM_RANGE(0x0000, 0x3fff) AM_READWRITE(k052109_051960_r, k052109_051960_w) /* video RAM + sprite RAM */ |
| 400 | 413 | |
| 401 | 414 | AM_RANGE(0x4000, 0x57ff) AM_RAM |
| 402 | | AM_RANGE(0x5800, 0x5fff) AM_READWRITE(scontra_bankedram_r, scontra_bankedram_w) AM_SHARE("ram") /* palette + work RAM */ |
| 403 | | AM_RANGE(0x6000, 0x7fff) AM_ROMBANK("bank1") |
| 415 | AM_RANGE(0x5800, 0x5fff) AM_DEVICE("bank5800", address_map_bank_device, amap8) /* palette + work RAM + PMC */ |
| 416 | AM_RANGE(0x6000, 0x7fff) AM_ROMBANK("rombank") |
| 404 | 417 | AM_RANGE(0x8000, 0xffff) AM_ROM |
| 405 | 418 | ADDRESS_MAP_END |
| 406 | 419 | |
| 407 | 420 | static ADDRESS_MAP_START( thunderx_map, AS_PROGRAM, 8, thunderx_state ) |
| 408 | 421 | AM_RANGE(0x1f80, 0x1f80) AM_WRITE(thunderx_videobank_w) |
| 409 | | AM_RANGE(0x1f84, 0x1f84) AM_WRITE(soundlatch_byte_w) |
| 410 | | AM_RANGE(0x1f88, 0x1f88) AM_WRITE(thunderx_sh_irqtrigger_w) /* cause interrupt on audio CPU */ |
| 411 | | AM_RANGE(0x1f8c, 0x1f8c) AM_WRITE(watchdog_reset_w) |
| 412 | | AM_RANGE(0x1f90, 0x1f90) AM_READ_PORT("SYSTEM") |
| 413 | | AM_RANGE(0x1f91, 0x1f91) AM_READ_PORT("P1") |
| 414 | | AM_RANGE(0x1f92, 0x1f92) AM_READ_PORT("P2") |
| 415 | | AM_RANGE(0x1f93, 0x1f93) AM_READ_PORT("DSW3") |
| 416 | | AM_RANGE(0x1f94, 0x1f94) AM_READ_PORT("DSW1") |
| 417 | | AM_RANGE(0x1f95, 0x1f95) AM_READ_PORT("DSW2") |
| 418 | | AM_RANGE(0x1f98, 0x1f98) AM_READWRITE(thunderx_1f98_r, thunderx_1f98_w) /* registers */ |
| 419 | | AM_RANGE(0x0000, 0x3fff) AM_READWRITE(k052109_051960_r, k052109_051960_w) |
| 422 | AM_RANGE(0x1f98, 0x1f98) AM_READWRITE(_1f98_r, thunderx_1f98_w) /* registers */ |
| 423 | AM_IMPORT_FROM(scontra_map) |
| 424 | ADDRESS_MAP_END |
| 420 | 425 | |
| 421 | | AM_RANGE(0x4000, 0x57ff) AM_RAM |
| 422 | | AM_RANGE(0x5800, 0x5fff) AM_READWRITE(thunderx_bankedram_r, thunderx_bankedram_w) AM_SHARE("ram") /* palette + work RAM + unknown RAM */ |
| 423 | | AM_RANGE(0x6000, 0x7fff) AM_ROMBANK("bank1") |
| 424 | | AM_RANGE(0x8000, 0xffff) AM_ROM |
| 426 | static ADDRESS_MAP_START( gbusters_map, AS_PROGRAM, 8, thunderx_state ) |
| 427 | AM_RANGE(0x1f80, 0x1f80) AM_WRITE(gbusters_videobank_w) |
| 428 | AM_IMPORT_FROM(scontra_map) |
| 425 | 429 | ADDRESS_MAP_END |
| 426 | 430 | |
| 427 | | static ADDRESS_MAP_START( scontra_sound_map, AS_PROGRAM, 8, thunderx_state ) |
| 428 | | AM_RANGE(0x0000, 0x7fff) AM_ROM /* ROM */ |
| 429 | | AM_RANGE(0x8000, 0x87ff) AM_RAM /* RAM */ |
| 430 | | AM_RANGE(0xa000, 0xa000) AM_READ(soundlatch_byte_r) /* soundlatch_byte_r */ |
| 431 | | AM_RANGE(0xb000, 0xb00d) AM_DEVREADWRITE("k007232", k007232_device, read, write) /* 007232 registers */ |
| 432 | | AM_RANGE(0xc000, 0xc001) AM_DEVREADWRITE("ymsnd", ym2151_device, read, write) /* YM2151 */ |
| 433 | | AM_RANGE(0xf000, 0xf000) AM_WRITE(scontra_snd_bankswitch_w) /* 007232 bank select */ |
| 431 | |
| 432 | static ADDRESS_MAP_START( scontra_bank5800_map, AS_PROGRAM, 8, thunderx_state ) |
| 433 | AM_RANGE(0x0000, 0x07ff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette") |
| 434 | AM_RANGE(0x0800, 0x0fff) AM_RAM |
| 434 | 435 | ADDRESS_MAP_END |
| 435 | 436 | |
| 437 | static ADDRESS_MAP_START( thunderx_bank5800_map, AS_PROGRAM, 8, thunderx_state ) |
| 438 | AM_RANGE(0x0000, 0x07ff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette") |
| 439 | AM_RANGE(0x0800, 0x0fff) AM_RAM |
| 440 | AM_RANGE(0x1000, 0x17ff) AM_READWRITE(pmc_r, pmc_w) AM_SHARE("pmcram") |
| 441 | ADDRESS_MAP_END |
| 442 | |
| 443 | |
| 436 | 444 | static ADDRESS_MAP_START( thunderx_sound_map, AS_PROGRAM, 8, thunderx_state ) |
| 437 | 445 | AM_RANGE(0x0000, 0x7fff) AM_ROM |
| 438 | 446 | AM_RANGE(0x8000, 0x87ff) AM_RAM |
| r244691 | r244692 | |
| 440 | 448 | AM_RANGE(0xc000, 0xc001) AM_DEVREADWRITE("ymsnd", ym2151_device, read, write) |
| 441 | 449 | ADDRESS_MAP_END |
| 442 | 450 | |
| 451 | static ADDRESS_MAP_START( scontra_sound_map, AS_PROGRAM, 8, thunderx_state ) |
| 452 | AM_RANGE(0xb000, 0xb00d) AM_DEVREADWRITE("k007232", k007232_device, read, write) |
| 453 | AM_RANGE(0xf000, 0xf000) AM_WRITE(k007232_bankswitch_w) |
| 454 | AM_IMPORT_FROM(thunderx_sound_map) |
| 455 | ADDRESS_MAP_END |
| 456 | |
| 443 | 457 | /*************************************************************************** |
| 444 | 458 | |
| 445 | 459 | Input Ports |
| r244691 | r244692 | |
| 494 | 508 | INPUT_PORTS_END |
| 495 | 509 | |
| 496 | 510 | static INPUT_PORTS_START( thunderx ) |
| 497 | | PORT_START("SYSTEM") |
| 498 | | KONAMI8_SYSTEM_10 |
| 499 | | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) |
| 500 | | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) |
| 501 | | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) |
| 511 | PORT_INCLUDE( scontra ) |
| 502 | 512 | |
| 503 | | PORT_START("P1") |
| 504 | | KONAMI8_B12_UNK(1) |
| 505 | | |
| 506 | | PORT_START("P2") |
| 507 | | KONAMI8_B12_UNK(2) |
| 508 | | |
| 509 | | PORT_START("DSW1") |
| 510 | | KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "No Coin B", SW1) |
| 511 | | /* "No Coin B" = coins produce sound, but no effect on coin counter */ |
| 512 | | |
| 513 | | PORT_START("DSW2") |
| 513 | PORT_MODIFY("DSW2") |
| 514 | 514 | PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") |
| 515 | 515 | PORT_DIPSETTING( 0x03, "2" ) |
| 516 | 516 | PORT_DIPSETTING( 0x02, "3" ) |
| r244691 | r244692 | |
| 533 | 533 | PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) |
| 534 | 534 | PORT_DIPSETTING( 0x00, DEF_STR( On ) ) |
| 535 | 535 | |
| 536 | | PORT_START("DSW3") |
| 536 | PORT_MODIFY("DSW3") |
| 537 | 537 | PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW3:1") |
| 538 | 538 | PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) |
| 539 | 539 | PORT_DIPSETTING( 0x00, DEF_STR( On ) ) |
| r244691 | r244692 | |
| 555 | 555 | PORT_DIPSETTING( 0x00, "50000" ) |
| 556 | 556 | INPUT_PORTS_END |
| 557 | 557 | |
| 558 | static INPUT_PORTS_START( gbusters ) |
| 559 | PORT_INCLUDE( scontra ) |
| 558 | 560 | |
| 561 | PORT_MODIFY("DSW2") |
| 562 | PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") |
| 563 | PORT_DIPSETTING( 0x03, "2" ) |
| 564 | PORT_DIPSETTING( 0x02, "3" ) |
| 565 | PORT_DIPSETTING( 0x01, "5" ) |
| 566 | PORT_DIPSETTING( 0x00, "7" ) |
| 567 | PORT_DIPNAME( 0x04, 0x04, "Bullets" ) PORT_DIPLOCATION("SW2:3") |
| 568 | PORT_DIPSETTING( 0x04, "50" ) |
| 569 | PORT_DIPSETTING( 0x00, "60" ) |
| 570 | PORT_DIPNAME( 0x18, 0x10, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:4,5") |
| 571 | PORT_DIPSETTING( 0x18, "50k, 200k, Every 400k" ) |
| 572 | PORT_DIPSETTING( 0x10, "70k, 250k, Every 500k" ) |
| 573 | PORT_DIPSETTING( 0x08, "50k Only" ) |
| 574 | PORT_DIPSETTING( 0x00, "70k Only" ) |
| 575 | PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:6,7") |
| 576 | PORT_DIPSETTING( 0x60, DEF_STR( Easy ) ) |
| 577 | PORT_DIPSETTING( 0x40, DEF_STR( Normal ) ) |
| 578 | PORT_DIPSETTING( 0x20, DEF_STR( Difficult ) ) |
| 579 | PORT_DIPSETTING( 0x00, DEF_STR( Very_Difficult ) ) |
| 580 | PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8") |
| 581 | PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) |
| 582 | PORT_DIPSETTING( 0x00, DEF_STR( On ) ) |
| 583 | |
| 584 | PORT_MODIFY("DSW3") |
| 585 | PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW3:1") |
| 586 | PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) |
| 587 | PORT_DIPSETTING( 0x00, DEF_STR( On ) ) |
| 588 | PORT_DIPUNUSED_DIPLOC( 0x02, 0x02, "SW3:2" ) /* Listed as "Unused" */ |
| 589 | PORT_SERVICE_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW3:3" ) |
| 590 | PORT_DIPUNUSED_DIPLOC( 0x08, 0x08, "SW3:4" ) /* Listed as "Unused" */ |
| 591 | PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED ) |
| 592 | INPUT_PORTS_END |
| 593 | |
| 594 | |
| 559 | 595 | /*************************************************************************** |
| 560 | 596 | |
| 561 | 597 | Machine Driver |
| r244691 | r244692 | |
| 568 | 604 | m_k007232->set_volume(1, 0, (data & 0x0f) * 0x11); |
| 569 | 605 | } |
| 570 | 606 | |
| 571 | | MACHINE_START_MEMBER(thunderx_state,scontra) |
| 607 | void thunderx_state::machine_start() |
| 572 | 608 | { |
| 573 | | m_paletteram.resize(0x800); |
| 574 | | m_palette->basemem().set(m_paletteram, ENDIANNESS_BIG, 2); |
| 575 | | |
| 576 | | save_item(NAME(m_paletteram)); |
| 609 | save_item(NAME(m_1f98_latch)); |
| 577 | 610 | save_item(NAME(m_priority)); |
| 578 | | save_item(NAME(m_1f98_data)); |
| 579 | | save_item(NAME(m_palette_selected)); |
| 580 | | save_item(NAME(m_rambank)); |
| 581 | | save_item(NAME(m_pmcbank)); |
| 582 | 611 | |
| 583 | | membank("bank1")->configure_entries(0, 16, memregion("maincpu")->base(), 0x2000); |
| 612 | // verified from both scontra and thunderx/gbusters schematics |
| 613 | // banks 4-7 must mirror banks 0-3 for gbusters rom test to pass |
| 614 | UINT8 *ROM = memregion("maincpu")->base(); |
| 615 | m_rombank->configure_entries(0, 4, &ROM[0], 0x2000); |
| 616 | m_rombank->configure_entries(4, 4, &ROM[0], 0x2000); |
| 617 | m_rombank->configure_entries(8, 8, &ROM[0x10000], 0x2000); |
| 584 | 618 | } |
| 585 | 619 | |
| 586 | | MACHINE_START_MEMBER(thunderx_state,thunderx) |
| 620 | void thunderx_state::machine_reset() |
| 587 | 621 | { |
| 588 | | MACHINE_START_CALL_MEMBER(scontra); |
| 589 | | memset(m_pmcram, 0, sizeof(m_pmcram)); |
| 590 | | save_item(NAME(m_pmcram)); |
| 591 | | } |
| 592 | | |
| 593 | | MACHINE_RESET_MEMBER(thunderx_state, scontra) |
| 594 | | { |
| 622 | m_rombank->set_entry(0); |
| 623 | m_bank5800->set_bank(0); |
| 624 | m_1f98_latch = 0; |
| 595 | 625 | m_priority = 0; |
| 596 | | m_1f98_data = 0; |
| 597 | | m_palette_selected = 0; |
| 598 | | m_rambank = 0; |
| 599 | | m_pmcbank = 0; |
| 600 | 626 | } |
| 601 | 627 | |
| 602 | 628 | static MACHINE_CONFIG_START( scontra, thunderx_state ) |
| r244691 | r244692 | |
| 604 | 630 | /* basic machine hardware */ |
| 605 | 631 | MCFG_CPU_ADD("maincpu", KONAMI, XTAL_24MHz/2/4) /* 052001 (verified on pcb) */ |
| 606 | 632 | MCFG_CPU_PROGRAM_MAP(scontra_map) |
| 607 | | MCFG_CPU_VBLANK_INT_DRIVER("screen", thunderx_state, scontra_interrupt) |
| 633 | MCFG_CPU_VBLANK_INT_DRIVER("screen", thunderx_state, vblank_interrupt) |
| 608 | 634 | |
| 609 | 635 | MCFG_CPU_ADD("audiocpu", Z80, XTAL_3_579545MHz) /* verified on pcb */ |
| 610 | 636 | MCFG_CPU_PROGRAM_MAP(scontra_sound_map) |
| 611 | 637 | |
| 612 | | MCFG_MACHINE_START_OVERRIDE(thunderx_state, scontra) |
| 613 | | MCFG_MACHINE_RESET_OVERRIDE(thunderx_state, scontra) |
| 638 | MCFG_DEVICE_ADD("bank5800", ADDRESS_MAP_BANK, 0) |
| 639 | MCFG_DEVICE_PROGRAM_MAP(scontra_bank5800_map) |
| 640 | MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_BIG) |
| 641 | MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(8) |
| 642 | MCFG_ADDRESS_MAP_BANK_ADDRBUS_WIDTH(12) |
| 643 | MCFG_ADDRESS_MAP_BANK_STRIDE(0x0800) |
| 614 | 644 | |
| 615 | 645 | /* video hardware */ |
| 616 | 646 | MCFG_SCREEN_ADD("screen", RASTER) |
| r244691 | r244692 | |
| 618 | 648 | MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) |
| 619 | 649 | MCFG_SCREEN_SIZE(64*8, 32*8) |
| 620 | 650 | MCFG_SCREEN_VISIBLE_AREA(14*8, (64-14)*8-1, 2*8, 30*8-1 ) |
| 621 | | MCFG_SCREEN_UPDATE_DRIVER(thunderx_state, screen_update_scontra) |
| 651 | MCFG_SCREEN_UPDATE_DRIVER(thunderx_state, screen_update) |
| 622 | 652 | MCFG_SCREEN_PALETTE("palette") |
| 623 | 653 | |
| 624 | 654 | MCFG_PALETTE_ADD("palette", 1024) |
| r244691 | r244692 | |
| 647 | 677 | MACHINE_CONFIG_END |
| 648 | 678 | |
| 649 | 679 | |
| 650 | | WRITE8_MEMBER( thunderx_state::thunderx_banking_callback ) |
| 680 | WRITE8_MEMBER( thunderx_state::banking_callback ) |
| 651 | 681 | { |
| 652 | 682 | //logerror("thunderx %04x: bank select %02x\n", machine().device("maincpu")->safe_pc(), data); |
| 653 | | membank("bank1")->set_entry(data & 0x0f); |
| 683 | m_rombank->set_entry(data & 0x0f); |
| 654 | 684 | } |
| 655 | 685 | |
| 656 | | static MACHINE_CONFIG_START( thunderx, thunderx_state ) |
| 686 | static MACHINE_CONFIG_DERIVED( thunderx, scontra ) |
| 657 | 687 | |
| 658 | 688 | /* basic machine hardware */ |
| 659 | | MCFG_CPU_ADD("maincpu", KONAMI, XTAL_24MHz/2/4) /* 052001 (verified on pcb) */ |
| 689 | MCFG_DEVICE_MODIFY("maincpu") /* 052001 (verified on pcb) */ |
| 660 | 690 | MCFG_CPU_PROGRAM_MAP(thunderx_map) |
| 661 | | MCFG_CPU_VBLANK_INT_DRIVER("screen", thunderx_state, scontra_interrupt) |
| 662 | | MCFG_KONAMICPU_LINE_CB(WRITE8(thunderx_state, thunderx_banking_callback)) |
| 691 | MCFG_KONAMICPU_LINE_CB(WRITE8(thunderx_state, banking_callback)) |
| 663 | 692 | |
| 664 | | MCFG_CPU_ADD("audiocpu", Z80, XTAL_3_579545MHz) /* verified on pcb */ |
| 693 | MCFG_DEVICE_MODIFY("audiocpu") |
| 665 | 694 | MCFG_CPU_PROGRAM_MAP(thunderx_sound_map) |
| 666 | 695 | |
| 667 | | MCFG_MACHINE_START_OVERRIDE(thunderx_state, thunderx) |
| 668 | | MCFG_MACHINE_RESET_OVERRIDE(thunderx_state, scontra) |
| 696 | MCFG_DEVICE_MODIFY("bank5800") |
| 697 | MCFG_DEVICE_PROGRAM_MAP(thunderx_bank5800_map) |
| 698 | MCFG_ADDRESS_MAP_BANK_ADDRBUS_WIDTH(13) |
| 669 | 699 | |
| 670 | | /* video hardware */ |
| 671 | | MCFG_SCREEN_ADD("screen", RASTER) |
| 672 | | MCFG_SCREEN_REFRESH_RATE(60) |
| 673 | | MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) |
| 674 | | MCFG_SCREEN_SIZE(64*8, 32*8) |
| 675 | | MCFG_SCREEN_VISIBLE_AREA(14*8, (64-14)*8-1, 2*8, 30*8-1 ) |
| 676 | | MCFG_SCREEN_UPDATE_DRIVER(thunderx_state, screen_update_scontra) |
| 677 | | MCFG_SCREEN_PALETTE("palette") |
| 700 | MCFG_DEVICE_REMOVE("k007232") |
| 701 | MACHINE_CONFIG_END |
| 678 | 702 | |
| 679 | | MCFG_PALETTE_ADD("palette", 1024) |
| 680 | | MCFG_PALETTE_ENABLE_SHADOWS() |
| 681 | | MCFG_PALETTE_FORMAT(xBBBBBGGGGGRRRRR) |
| 703 | static MACHINE_CONFIG_DERIVED( gbusters, scontra ) |
| 682 | 704 | |
| 683 | | MCFG_DEVICE_ADD("k052109", K052109, 0) |
| 684 | | MCFG_GFX_PALETTE("palette") |
| 685 | | MCFG_K052109_CB(thunderx_state, tile_callback) |
| 705 | /* basic machine hardware */ |
| 706 | MCFG_DEVICE_MODIFY("maincpu") /* 052526 */ |
| 707 | MCFG_CPU_PROGRAM_MAP(gbusters_map) |
| 708 | MCFG_KONAMICPU_LINE_CB(WRITE8(thunderx_state, banking_callback)) |
| 686 | 709 | |
| 687 | | MCFG_DEVICE_ADD("k051960", K051960, 0) |
| 688 | | MCFG_GFX_PALETTE("palette") |
| 689 | | MCFG_K051960_CB(thunderx_state, sprite_callback) |
| 690 | | |
| 691 | | /* sound hardware */ |
| 692 | | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 693 | | |
| 694 | | MCFG_YM2151_ADD("ymsnd", 3579545) |
| 695 | | MCFG_SOUND_ROUTE(0, "mono", 1.0) |
| 696 | | MCFG_SOUND_ROUTE(1, "mono", 1.0) |
| 710 | MCFG_DEVICE_MODIFY("k052109") |
| 711 | MCFG_K052109_CB(thunderx_state, gbusters_tile_callback) |
| 697 | 712 | MACHINE_CONFIG_END |
| 698 | 713 | |
| 699 | 714 | |
| r244691 | r244692 | |
| 939 | 954 | ROM_LOAD( "873a08.f20", 0x0000, 0x0100, CRC(e2d09a1b) SHA1(a9651e137486b2df367c39eb43f52d0833589e87) ) /* priority encoder (not used) */ |
| 940 | 955 | ROM_END |
| 941 | 956 | |
| 957 | ROM_START( gbusters ) |
| 958 | ROM_REGION( 0x20000, "maincpu", 0 ) /* banked program ROMs */ |
| 959 | ROM_LOAD( "878n02.k13", 0x00000, 0x10000, CRC(51697aaa) SHA1(1e6461e2e5e871d44085623a890158a4c1c4c404) ) /* banked + fixed ROM */ |
| 960 | ROM_LOAD( "878j03.k15", 0x10000, 0x10000, CRC(3943a065) SHA1(6b0863f4182e6c973adfaa618f096bd4cc9b7b6d) ) /* banked ROM */ |
| 961 | |
| 962 | ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the sound CPU */ |
| 963 | ROM_LOAD( "878h01.f8", 0x00000, 0x08000, CRC(96feafaa) SHA1(8b6547e610cb4fa1c1f5bf12cb05e9a12a353903) ) |
| 964 | |
| 965 | ROM_REGION( 0x80000, "k052109", 0 ) /* tiles */ |
| 966 | ROM_LOAD32_WORD( "878c07.h27", 0x00000, 0x40000, CRC(eeed912c) SHA1(b2e27610b38f3fc9c2cdad600b03c8bae4fb9138) ) |
| 967 | ROM_LOAD32_WORD( "878c08.k27", 0x00002, 0x40000, CRC(4d14626d) SHA1(226b1d83fb82586302be0a67737a427475856537) ) |
| 968 | |
| 969 | ROM_REGION( 0x80000, "k051960", 0 ) /* sprites */ |
| 970 | ROM_LOAD32_WORD( "878c05.h5", 0x00000, 0x40000, CRC(01f4aea5) SHA1(124123823be6bd597805484539d821aaaadde2c0) ) |
| 971 | ROM_LOAD32_WORD( "878c06.k5", 0x00002, 0x40000, CRC(edfaaaaf) SHA1(67468c4ce47e8d43d58de8d3b50b048c66508156) ) |
| 972 | |
| 973 | ROM_REGION( 0x40000, "k007232", 0 ) /* samples for 007232 */ |
| 974 | ROM_LOAD( "878c04.d5", 0x00000, 0x40000, CRC(9e982d1c) SHA1(a5b611c67b0f2ac50c679707931ee12ebbf72ebe) ) |
| 975 | |
| 976 | ROM_REGION( 0x0100, "proms", 0 ) |
| 977 | ROM_LOAD( "878a09.f20", 0x0000, 0x0100, CRC(e2d09a1b) SHA1(a9651e137486b2df367c39eb43f52d0833589e87) ) /* priority encoder (not used) */ |
| 978 | ROM_END |
| 979 | |
| 980 | ROM_START( gbustersa ) |
| 981 | ROM_REGION( 0x20000, "maincpu", 0 ) /* banked program ROMs */ |
| 982 | ROM_LOAD( "878_02.k13", 0x00000, 0x10000, CRC(57178414) SHA1(89b1403158f6ce18706c8a941109554d03cf77d9) ) /* unknown region/version leter */ |
| 983 | ROM_LOAD( "878_03.k15", 0x10000, 0x10000, CRC(6c59e660) SHA1(66a92eb8a93c9f542489fa31bec6ed1819d174da) ) /* unknown region/version leter */ |
| 984 | |
| 985 | ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the sound CPU */ |
| 986 | ROM_LOAD( "878h01.f8", 0x00000, 0x08000, CRC(96feafaa) SHA1(8b6547e610cb4fa1c1f5bf12cb05e9a12a353903) ) |
| 987 | |
| 988 | ROM_REGION( 0x80000, "k052109", 0 ) /* tiles */ |
| 989 | ROM_LOAD32_WORD( "878c07.h27", 0x00000, 0x40000, CRC(eeed912c) SHA1(b2e27610b38f3fc9c2cdad600b03c8bae4fb9138) ) |
| 990 | ROM_LOAD32_WORD( "878c08.k27", 0x00002, 0x40000, CRC(4d14626d) SHA1(226b1d83fb82586302be0a67737a427475856537) ) |
| 991 | |
| 992 | ROM_REGION( 0x80000, "k051960", 0 ) /* sprites */ |
| 993 | ROM_LOAD32_WORD( "878c05.h5", 0x00000, 0x40000, CRC(01f4aea5) SHA1(124123823be6bd597805484539d821aaaadde2c0) ) |
| 994 | ROM_LOAD32_WORD( "878c06.k5", 0x00002, 0x40000, CRC(edfaaaaf) SHA1(67468c4ce47e8d43d58de8d3b50b048c66508156) ) |
| 995 | |
| 996 | ROM_REGION( 0x40000, "k007232", 0 ) /* samples for 007232 */ |
| 997 | ROM_LOAD( "878c04.d5", 0x00000, 0x40000, CRC(9e982d1c) SHA1(a5b611c67b0f2ac50c679707931ee12ebbf72ebe) ) |
| 998 | |
| 999 | ROM_REGION( 0x0100, "proms", 0 ) |
| 1000 | ROM_LOAD( "878a09.f20", 0x0000, 0x0100, CRC(e2d09a1b) SHA1(a9651e137486b2df367c39eb43f52d0833589e87) ) /* priority encoder (not used) */ |
| 1001 | ROM_END |
| 1002 | |
| 1003 | ROM_START( crazycop ) |
| 1004 | ROM_REGION( 0x20000, "maincpu", 0 ) /* banked program ROMs */ |
| 1005 | ROM_LOAD( "878m02.k13", 0x00000, 0x10000, CRC(9c1c9f52) SHA1(7a60ad20aac92da8258b43b04f8c7f27bb71f1df) ) /* banked + fixed ROM */ |
| 1006 | ROM_LOAD( "878j03.k15", 0x10000, 0x10000, CRC(3943a065) SHA1(6b0863f4182e6c973adfaa618f096bd4cc9b7b6d) ) /* banked ROM */ |
| 1007 | |
| 1008 | ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the sound CPU */ |
| 1009 | ROM_LOAD( "878h01.f8", 0x00000, 0x08000, CRC(96feafaa) SHA1(8b6547e610cb4fa1c1f5bf12cb05e9a12a353903) ) |
| 1010 | |
| 1011 | ROM_REGION( 0x80000, "k052109", 0 ) /* tiles */ |
| 1012 | ROM_LOAD32_WORD( "878c07.h27", 0x00000, 0x40000, CRC(eeed912c) SHA1(b2e27610b38f3fc9c2cdad600b03c8bae4fb9138) ) |
| 1013 | ROM_LOAD32_WORD( "878c08.k27", 0x00002, 0x40000, CRC(4d14626d) SHA1(226b1d83fb82586302be0a67737a427475856537) ) |
| 1014 | |
| 1015 | ROM_REGION( 0x80000, "k051960", 0 ) /* sprites */ |
| 1016 | ROM_LOAD32_WORD( "878c05.h5", 0x00000, 0x40000, CRC(01f4aea5) SHA1(124123823be6bd597805484539d821aaaadde2c0) ) |
| 1017 | ROM_LOAD32_WORD( "878c06.k5", 0x00002, 0x40000, CRC(edfaaaaf) SHA1(67468c4ce47e8d43d58de8d3b50b048c66508156) ) |
| 1018 | |
| 1019 | ROM_REGION( 0x40000, "k007232", 0 ) /* samples for 007232 */ |
| 1020 | ROM_LOAD( "878c04.d5", 0x00000, 0x40000, CRC(9e982d1c) SHA1(a5b611c67b0f2ac50c679707931ee12ebbf72ebe) ) |
| 1021 | |
| 1022 | ROM_REGION( 0x0100, "proms", 0 ) |
| 1023 | ROM_LOAD( "878a09.f20", 0x0000, 0x0100, CRC(e2d09a1b) SHA1(a9651e137486b2df367c39eb43f52d0833589e87) ) /* priority encoder (not used) */ |
| 1024 | ROM_END |
| 1025 | |
| 1026 | |
| 1027 | |
| 942 | 1028 | /***************************************************************************/ |
| 943 | 1029 | |
| 944 | 1030 | GAME( 1988, scontra, 0, scontra, scontra, driver_device, 0, ROT90, "Konami", "Super Contra", GAME_SUPPORTS_SAVE ) |
| r244691 | r244692 | |
| 947 | 1033 | GAME( 1988, thunderxa, thunderx, thunderx, thunderx, driver_device, 0, ROT0, "Konami", "Thunder Cross (set 2)", GAME_SUPPORTS_SAVE ) |
| 948 | 1034 | GAME( 1988, thunderxb, thunderx, thunderx, thunderx, driver_device, 0, ROT0, "Konami", "Thunder Cross (set 3)", GAME_SUPPORTS_SAVE ) |
| 949 | 1035 | GAME( 1988, thunderxj, thunderx, thunderx, thnderxj, driver_device, 0, ROT0, "Konami", "Thunder Cross (Japan)", GAME_SUPPORTS_SAVE ) |
| 1036 | GAME( 1988, gbusters, 0, gbusters, gbusters, driver_device, 0, ROT90, "Konami", "Gang Busters (set 1)", GAME_SUPPORTS_SAVE ) /* N02 & J03 program roms */ |
| 1037 | GAME( 1988, gbustersa, gbusters, gbusters, gbusters, driver_device, 0, ROT90, "Konami", "Gang Busters (set 2)", GAME_SUPPORTS_SAVE ) /* unknown region program roms */ |
| 1038 | GAME( 1988, crazycop, gbusters, gbusters, gbusters, driver_device, 0, ROT90, "Konami", "Crazy Cop (Japan)", GAME_SUPPORTS_SAVE ) /* M02 & J03 program roms */ |