mirror of
https://github.com/holub/mame
synced 2025-04-20 15:32:45 +03:00
split monster 'toaplan2.cpp' file into smaller per-board parts + slight modernization (#13022)
* toaplan2 - splitup the big driver * move some common logic to a device * further tidyups * raizing.cpp - begin tidy * raizing.cpp cleanups * raizing tidyups * more raizing cleanups * sort mame.lst * attempt to fix CL * restore original copyright holders to files where not every line is my code (although most of these are no so distant from the files from 20 years ago due to the amount of rewriting they've undergone it's questionable they still apply) * tekipaki.cpp - remove unused shared_ram * anonymous namespaces * rename functions that still had _toaplan2 and _truxton2 in them * move all the old game specific notes to the drivers containing those games now --------- Co-authored-by: David Haywood <hazemamewip@hotmail.com>
This commit is contained in:
parent
a045468681
commit
c79d184620
@ -45232,12 +45232,100 @@ gizmondo //
|
||||
kontiki //
|
||||
tiki100 //
|
||||
|
||||
@source:toaplan/batsugun.cpp
|
||||
batsugun // TP-030 (c) 1993 Toaplan
|
||||
batsuguna // TP-030 (c) 1993 Toaplan
|
||||
batsugunb //
|
||||
batsugunc // TP-030 (c) 1993 Toaplan
|
||||
batsugunbl // bootleg
|
||||
batsugunsp // TP-030 (c) 1993 Toaplan
|
||||
|
||||
@source:toaplan/dogyuun.cpp
|
||||
dogyuun // TP-022 (c) 1992 Toaplan
|
||||
dogyuuna // TP-022 (c) 1992 Toaplan
|
||||
dogyuunb // TP-022 (c) 1992 Toaplan
|
||||
dogyuunt // TP-022 (c) 1992 Toaplan
|
||||
dogyuunto // TX-022 (c) 1992 Toaplan
|
||||
|
||||
@source:toaplan/dt7.cpp
|
||||
dt7
|
||||
|
||||
@source:toaplan/enmadaio.cpp
|
||||
enmadaio // TP-031
|
||||
|
||||
@source:toaplan/fixeight.cpp
|
||||
fixeight // TP-026 (c) 1992 + Taito license
|
||||
fixeighta // TP-026 (c) 1992 + Taito license
|
||||
fixeightat // TP-026 (c) 1992 + Taito license
|
||||
fixeightbl // bootleg
|
||||
fixeighth // TP-026 (c) 1992 + Taito license
|
||||
fixeightht // TP-026 (c) 1992 + Taito license
|
||||
fixeightj // TP-026 (c) 1992 + Taito license
|
||||
fixeightjt // TP-026 (c) 1992 + Taito license
|
||||
fixeightk // TP-026 (c) 1992 + Taito license
|
||||
fixeightkt // TP-026 (c) 1992 + Taito license
|
||||
fixeightt // TP-026 (c) 1992 + Taito license
|
||||
fixeighttw // TP-026 (c) 1992 + Taito license
|
||||
fixeighttwt // TP-026 (c) 1992 + Taito license
|
||||
fixeightu // TP-026 (c) 1992 + Taito license
|
||||
fixeightut // TP-026 (c) 1992 + Taito license
|
||||
|
||||
@source:toaplan/ghox.cpp
|
||||
ghox // TP-021 (c) 1991 Toaplan
|
||||
ghoxj // TP-021 (c) 1991 Toaplan
|
||||
ghoxjo // TP-021 (c) 1991 Toaplan
|
||||
|
||||
@source:toaplan/kbash.cpp
|
||||
kbash // TP-023 (c) 1993 Toaplan
|
||||
kbash2 // bootleg
|
||||
kbashk // TP-023 (c) 1993 Toaplan
|
||||
kbashp // TP-023 (c) 1993 Toaplan
|
||||
|
||||
@source:toaplan/mjsister.cpp
|
||||
mjsister // (c) 1986 Toaplan
|
||||
|
||||
@source:toaplan/pipibibi.cpp
|
||||
pipibibs // TP-025
|
||||
pipibibsa // TP-025
|
||||
pipibibsbl // (c) 1991 Ryouta Kikaku (bootleg)
|
||||
pipibibsbl2 // bootleg
|
||||
pipibibsbl3 // (c) 1991 Ryouta Kikaku (bootleg)
|
||||
pipibibsp // TP-025
|
||||
|
||||
@source:toaplan/raizing.cpp
|
||||
bgaregga // (c) 1996 Raizing/8ing
|
||||
bgareggabl // hack
|
||||
bgareggabla // hack
|
||||
bgareggablj // hack
|
||||
bgareggacn // (c) 1996 Raizing/8ing
|
||||
bgareggahk // (c) 1996 Raizing/8ing
|
||||
bgareggak // (c) 1996 Raizing/8ing
|
||||
bgaregganv // (c) 1996 Raizing/8ing
|
||||
bgareggat // (c) 1996 Raizing/8ing
|
||||
bgareggat2 // (c) 1996 Raizing/8ing
|
||||
bgareggatw // (c) 1996 Raizing/8ing
|
||||
kingdmgp // (c) 1994 Raizing/8ing
|
||||
mahoudai // (c) 1993 Raizing + Able license
|
||||
shippumd // (c) 1994 Raizing/8ing
|
||||
sstriker // (c) 1993 Raizing
|
||||
sstrikerk // (c) 1993 Raizing
|
||||
|
||||
@source:toaplan/raizing_batrider.cpp
|
||||
batrider // (c) 1998 Raizing/8ing
|
||||
batriderc // (c) 1998 Raizing/8ing
|
||||
batriderhk // (c) 1998 Raizing/8ing
|
||||
batriderj // (c) 1998 Raizing/8ing
|
||||
batriderja // (c) 1998 Raizing/8ing
|
||||
batriderk // (c) 1998 Raizing/8ing
|
||||
batridert // (c) 1998 Raizing/8ing
|
||||
batrideru // (c) 1998 Raizing/8ing
|
||||
bbakraid // (c) 1999 8ing
|
||||
bbakraidc // (c) 1999 8ing
|
||||
bbakraidj // (c) 1999 8ing
|
||||
bbakraidja // (c) 1999 8ing
|
||||
nprobowl // (c) 1996 Zuck + Able license
|
||||
probowl2 // (c) 1996 Zuck + Able license
|
||||
|
||||
@source:toaplan/slapfght.cpp
|
||||
alcon // A77 / TP-???
|
||||
getstarb1 // GX-006 bootleg but (c) 1986 Taito Corporation
|
||||
@ -45261,6 +45349,23 @@ tigerhj // A47 (c) 1985 Taito Corporation GX-551 [not
|
||||
@source:toaplan/slapfght_ms.cpp
|
||||
slapfighm
|
||||
|
||||
@source:toaplan/snowbro2.cpp
|
||||
snowbro2 // TP-033 (c) 1994 Hanafram
|
||||
snowbro2b //
|
||||
snowbro2b2 //
|
||||
snowbro2b3 //
|
||||
snowbro2ny // TP-033 (c) 1994 Nyanko
|
||||
|
||||
@source:toaplan/sunwise.cpp
|
||||
burgkids // (c) 1995 Sunwise
|
||||
othldrby // (c) 1995 Sunwise
|
||||
pwrkick // (c) 1994 Sunwise
|
||||
|
||||
@source:toaplan/tekipaki.cpp
|
||||
tekipaki // TP-020 (c) 1991 Toaplan
|
||||
tekipakit // TP-020 (c) 1991 Toaplan (location test)
|
||||
whoopee // TP-025 (on TP-020)
|
||||
|
||||
@source:toaplan/toaplan1.cpp
|
||||
demonwld // TP-O16 (c) 1990 Toaplan (+ Taito license when set to Japan)
|
||||
demonwld1 // TP-O16 (c) 1989 Toaplan + Taito license
|
||||
@ -45295,92 +45400,8 @@ zerowing // TP-O15 (c) 1989 Toaplan
|
||||
zerowing1 // TP-O15 (c) 1989 Toaplan
|
||||
zerowingw // TP-O15 (c) 1989 Williams Electronics
|
||||
|
||||
@source:toaplan/toaplan2.cpp
|
||||
batrider // (c) 1998 Raizing/8ing
|
||||
batriderc // (c) 1998 Raizing/8ing
|
||||
batriderhk // (c) 1998 Raizing/8ing
|
||||
batriderj // (c) 1998 Raizing/8ing
|
||||
batriderja // (c) 1998 Raizing/8ing
|
||||
batriderk // (c) 1998 Raizing/8ing
|
||||
batridert // (c) 1998 Raizing/8ing
|
||||
batrideru // (c) 1998 Raizing/8ing
|
||||
batsugun // TP-030 (c) 1993 Toaplan
|
||||
batsuguna // TP-030 (c) 1993 Toaplan
|
||||
batsugunb //
|
||||
batsugunc // TP-030 (c) 1993 Toaplan
|
||||
batsugunbl // bootleg
|
||||
batsugunsp // TP-030 (c) 1993 Toaplan
|
||||
bbakraid // (c) 1999 8ing
|
||||
bbakraidc // (c) 1999 8ing
|
||||
bbakraidj // (c) 1999 8ing
|
||||
bbakraidja // (c) 1999 8ing
|
||||
bgaregga // (c) 1996 Raizing/8ing
|
||||
bgareggabl // hack
|
||||
bgareggabla // hack
|
||||
bgareggablj // hack
|
||||
bgareggacn // (c) 1996 Raizing/8ing
|
||||
bgareggahk // (c) 1996 Raizing/8ing
|
||||
bgareggak // (c) 1996 Raizing/8ing
|
||||
bgaregganv // (c) 1996 Raizing/8ing
|
||||
bgareggat // (c) 1996 Raizing/8ing
|
||||
bgareggat2 // (c) 1996 Raizing/8ing
|
||||
bgareggatw // (c) 1996 Raizing/8ing
|
||||
burgkids // (c) 1995 Sunwise
|
||||
dogyuun // TP-022 (c) 1992 Toaplan
|
||||
dogyuuna // TP-022 (c) 1992 Toaplan
|
||||
dogyuunb // TP-022 (c) 1992 Toaplan
|
||||
dogyuunt // TP-022 (c) 1992 Toaplan
|
||||
dogyuunto // TX-022 (c) 1992 Toaplan
|
||||
fixeight // TP-026 (c) 1992 + Taito license
|
||||
fixeighta // TP-026 (c) 1992 + Taito license
|
||||
fixeightat // TP-026 (c) 1992 + Taito license
|
||||
fixeightbl // bootleg
|
||||
fixeighth // TP-026 (c) 1992 + Taito license
|
||||
fixeightht // TP-026 (c) 1992 + Taito license
|
||||
fixeightj // TP-026 (c) 1992 + Taito license
|
||||
fixeightjt // TP-026 (c) 1992 + Taito license
|
||||
fixeightk // TP-026 (c) 1992 + Taito license
|
||||
fixeightkt // TP-026 (c) 1992 + Taito license
|
||||
fixeightt // TP-026 (c) 1992 + Taito license
|
||||
fixeighttw // TP-026 (c) 1992 + Taito license
|
||||
fixeighttwt // TP-026 (c) 1992 + Taito license
|
||||
fixeightu // TP-026 (c) 1992 + Taito license
|
||||
fixeightut // TP-026 (c) 1992 + Taito license
|
||||
ghox // TP-021 (c) 1991 Toaplan
|
||||
ghoxj // TP-021 (c) 1991 Toaplan
|
||||
ghoxjo // TP-021 (c) 1991 Toaplan
|
||||
grindstm // TP-027 (c) 1993 Toaplan + Unite Trading license (Korea)
|
||||
grindstma // TP-027 (c) 1993 Toaplan + Unite Trading license (Korea)
|
||||
kbash // TP-023 (c) 1993 Toaplan
|
||||
kbash2 // bootleg
|
||||
kbashk // TP-023 (c) 1993 Toaplan
|
||||
kbashp // TP-023 (c) 1993 Toaplan
|
||||
kingdmgp // (c) 1994 Raizing/8ing
|
||||
mahoudai // (c) 1993 Raizing + Able license
|
||||
nprobowl // (c) 1996 Zuck + Able license
|
||||
othldrby // (c) 1995 Sunwise
|
||||
pipibibs // TP-025
|
||||
pipibibsa // TP-025
|
||||
pipibibsbl // (c) 1991 Ryouta Kikaku (bootleg)
|
||||
pipibibsbl2 // bootleg
|
||||
pipibibsbl3 // (c) 1991 Ryouta Kikaku (bootleg)
|
||||
pipibibsp // TP-025
|
||||
probowl2 // (c) 1996 Zuck + Able license
|
||||
pwrkick // (c) 1994 Sunwise
|
||||
shippumd // (c) 1994 Raizing/8ing
|
||||
snowbro2 // TP-033 (c) 1994 Hanafram
|
||||
snowbro2b //
|
||||
snowbro2b2 //
|
||||
snowbro2b3 //
|
||||
snowbro2ny // TP-033 (c) 1994 Nyanko
|
||||
sstriker // (c) 1993 Raizing
|
||||
sstrikerk // (c) 1993 Raizing
|
||||
tekipaki // TP-020 (c) 1991 Toaplan
|
||||
tekipakit // TP-020 (c) 1991 Toaplan (location test)
|
||||
@source:toaplan/truxton2.cpp
|
||||
truxton2 // TP-024 (c) 1992 Toaplan
|
||||
vfive // TP-027 (c) 1993 Toaplan (Japan)
|
||||
whoopee // TP-025
|
||||
enmadaio // TP-031
|
||||
|
||||
@source:toaplan/twincobr.cpp
|
||||
fnshark // bootleg
|
||||
@ -45402,6 +45423,11 @@ twincobru // B30 / TP-011 (c) 1987 Taito America Corporati
|
||||
@source:toaplan/twincobr_ms.cpp
|
||||
twincobrm // bootleg (Modular System)
|
||||
|
||||
@source:toaplan/vfive.cpp
|
||||
grindstm // TP-027 (c) 1993 Toaplan + Unite Trading license (Korea)
|
||||
grindstma // TP-027 (c) 1993 Toaplan + Unite Trading license (Korea)
|
||||
vfive // TP-027 (c) 1993 Toaplan (Japan)
|
||||
|
||||
@source:toaplan/wardner.cpp
|
||||
pyros // B25 / TP-009 (c) 1987 Taito America Corporation (US)
|
||||
wardner // B25 / TP-009 (c) 1987 Taito Corporation Japan (World)
|
||||
|
611
src/mame/toaplan/batsugun.cpp
Normal file
611
src/mame/toaplan/batsugun.cpp
Normal file
@ -0,0 +1,611 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Quench, Yochizo, David Haywood
|
||||
|
||||
#include "emu.h"
|
||||
|
||||
#include "emupal.h"
|
||||
#include "screen.h"
|
||||
#include "speaker.h"
|
||||
#include "tilemap.h"
|
||||
|
||||
#include "toaplan_coincounter.h"
|
||||
#include "toaplipt.h"
|
||||
#include "gp9001.h"
|
||||
|
||||
#include "cpu/m68000/m68000.h"
|
||||
#include "cpu/nec/v25.h"
|
||||
#include "sound/okim6295.h"
|
||||
#include "sound/ymopm.h"
|
||||
|
||||
/*
|
||||
Name Board No Maker Game name
|
||||
----------------------------------------------------------------------------
|
||||
batsugun TP-030 Toaplan Batsugun
|
||||
batsuguna TP-030 Toaplan Batsugun (older)
|
||||
batsugunsp TP-030 Toaplan Batsugun (Special Version)
|
||||
|
||||
batsugun - The Special Version has many changes to make the game easier: it adds an autofire button,
|
||||
replaces the regular bomb with the more powerful double bomb (which in the original version
|
||||
required both players in a two player game to press their bomb buttons at once), gives you
|
||||
a shield that can absorb one hit each time your ship "levels up", etc. It also changes the
|
||||
colors of the title screen, ship select screen, stages, and enemies.
|
||||
batsugun compared to batsuguna has code that looks more like the Special Version, but it
|
||||
doesn't have any of the Special Version features. All the differences between batsugun
|
||||
and batsuguna look like bug fixes that were carried over into the Special Version.
|
||||
*/
|
||||
|
||||
namespace {
|
||||
|
||||
class batsugun_state : public driver_device
|
||||
{
|
||||
public:
|
||||
batsugun_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: driver_device(mconfig, type, tag)
|
||||
, m_maincpu(*this, "maincpu")
|
||||
, m_vdp(*this, "gp9001_%u", 0U)
|
||||
, m_oki(*this, "oki")
|
||||
, m_palette(*this, "palette")
|
||||
, m_shared_ram(*this, "shared_ram")
|
||||
, m_audiocpu(*this, "audiocpu")
|
||||
, m_screen(*this, "screen")
|
||||
, m_coincounter(*this, "coincounter")
|
||||
{ }
|
||||
|
||||
void batsugun(machine_config &config);
|
||||
|
||||
protected:
|
||||
virtual void video_start() override ATTR_COLD;
|
||||
|
||||
required_device<m68000_base_device> m_maincpu;
|
||||
required_device_array<gp9001vdp_device, 2> m_vdp;
|
||||
required_device<okim6295_device> m_oki;
|
||||
required_device<palette_device> m_palette;
|
||||
|
||||
private:
|
||||
u32 screen_update_batsugun(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
|
||||
void batsugun_68k_mem(address_map &map) ATTR_COLD;
|
||||
void v25_mem(address_map &map) ATTR_COLD;
|
||||
void coin_sound_reset_w(u8 data);
|
||||
|
||||
u8 shared_ram_r(offs_t offset) { return m_shared_ram[offset]; }
|
||||
void shared_ram_w(offs_t offset, u8 data) { m_shared_ram[offset] = data; }
|
||||
|
||||
void screen_vblank(int state);
|
||||
|
||||
void sound_reset_w(u8 data);
|
||||
void reset(int state);
|
||||
|
||||
optional_shared_ptr<u8> m_shared_ram; // 8 bit RAM shared between 68K and sound CPU
|
||||
optional_device<cpu_device> m_audiocpu;
|
||||
required_device<screen_device> m_screen;
|
||||
required_device<toaplan_coincounter_device> m_coincounter;
|
||||
bitmap_ind8 m_custom_priority_bitmap;
|
||||
bitmap_ind16 m_secondary_render_bitmap;
|
||||
};
|
||||
|
||||
class batsugun_bootleg_state : public batsugun_state
|
||||
{
|
||||
public:
|
||||
batsugun_bootleg_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: batsugun_state(mconfig, type, tag)
|
||||
, m_okibank(*this, "okibank")
|
||||
{ }
|
||||
|
||||
void batsugunbl(machine_config &config);
|
||||
|
||||
void init_batsugunbl();
|
||||
|
||||
protected:
|
||||
virtual void video_start() override ATTR_COLD;
|
||||
|
||||
private:
|
||||
void batsugunbl_oki_bankswitch_w(u8 data);
|
||||
void batsugunbl_68k_mem(address_map &map) ATTR_COLD;
|
||||
void cpu_space_batsugunbl_map(address_map &map);
|
||||
void fixeightbl_oki(address_map &map) ATTR_COLD;
|
||||
|
||||
required_memory_bank m_okibank;
|
||||
};
|
||||
|
||||
|
||||
void batsugun_bootleg_state::video_start()
|
||||
{
|
||||
batsugun_state::video_start();
|
||||
|
||||
// This bootleg has additional layer offsets. TODO: further refinement needed
|
||||
m_vdp[0]->set_tm_extra_offsets(0, 0, 0, 0, 0);
|
||||
m_vdp[0]->set_tm_extra_offsets(1, 0, 0, 0, 0);
|
||||
m_vdp[0]->set_tm_extra_offsets(2, 0, 0, 0, 0);
|
||||
m_vdp[0]->set_sp_extra_offsets(0x37, 0x07, 0, 0);
|
||||
|
||||
m_vdp[1]->set_tm_extra_offsets(0, -0x05, 0x07, 0, 0);
|
||||
m_vdp[1]->set_tm_extra_offsets(1, -0x05, 0x07, 0, 0);
|
||||
m_vdp[1]->set_tm_extra_offsets(2, 0, 0, 0, 0);
|
||||
m_vdp[1]->set_sp_extra_offsets(0x39, 0x12, 0, 0);
|
||||
|
||||
m_vdp[0]->init_scroll_regs();
|
||||
m_vdp[1]->init_scroll_regs();
|
||||
}
|
||||
|
||||
// renders to 2 bitmaps, and mixes output
|
||||
u32 batsugun_state::screen_update_batsugun(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
bitmap.fill(0, cliprect);
|
||||
m_custom_priority_bitmap.fill(0, cliprect);
|
||||
m_vdp[0]->render_vdp(bitmap, cliprect);
|
||||
|
||||
m_secondary_render_bitmap.fill(0, cliprect);
|
||||
m_custom_priority_bitmap.fill(0, cliprect);
|
||||
m_vdp[1]->render_vdp(m_secondary_render_bitmap, cliprect);
|
||||
|
||||
for (int y = cliprect.min_y; y <= cliprect.max_y; y++)
|
||||
{
|
||||
u16 *const src_vdp0 = &bitmap.pix(y);
|
||||
u16 const *const src_vdp1 = &m_secondary_render_bitmap.pix(y);
|
||||
|
||||
for (int x = cliprect.min_x; x <= cliprect.max_x; x++)
|
||||
{
|
||||
const u16 GPU0_LUTaddr = src_vdp0[x];
|
||||
const u16 GPU1_LUTaddr = src_vdp1[x];
|
||||
const bool COMPARISON = ((GPU0_LUTaddr & 0x0780) > (GPU1_LUTaddr & 0x0780));
|
||||
|
||||
if (!(GPU1_LUTaddr & 0x000f))
|
||||
{
|
||||
src_vdp0[x] = GPU0_LUTaddr;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!(GPU0_LUTaddr & 0x000f))
|
||||
{
|
||||
src_vdp0[x] = GPU1_LUTaddr; // bg pen
|
||||
}
|
||||
else
|
||||
{
|
||||
if (COMPARISON)
|
||||
{
|
||||
src_vdp0[x] = GPU1_LUTaddr;
|
||||
}
|
||||
else
|
||||
{
|
||||
src_vdp0[x] = GPU0_LUTaddr;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void batsugun_state::screen_vblank(int state)
|
||||
{
|
||||
// rising edge
|
||||
if (state)
|
||||
{
|
||||
m_vdp[0]->screen_eof();
|
||||
m_vdp[1]->screen_eof();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void batsugun_state::reset(int state)
|
||||
{
|
||||
if (m_audiocpu)
|
||||
m_audiocpu->pulse_input_line(INPUT_LINE_RESET, attotime::zero);
|
||||
}
|
||||
|
||||
void batsugun_state::sound_reset_w(u8 data)
|
||||
{
|
||||
m_audiocpu->set_input_line(INPUT_LINE_RESET, (data & 0x20) ? CLEAR_LINE : ASSERT_LINE);
|
||||
}
|
||||
|
||||
void batsugun_state::video_start()
|
||||
{
|
||||
m_screen->register_screen_bitmap(m_custom_priority_bitmap);
|
||||
m_secondary_render_bitmap.reset();
|
||||
m_vdp[0]->custom_priority_bitmap = &m_custom_priority_bitmap;
|
||||
m_screen->register_screen_bitmap(m_secondary_render_bitmap);
|
||||
m_vdp[1]->custom_priority_bitmap = &m_custom_priority_bitmap;
|
||||
}
|
||||
|
||||
void batsugun_bootleg_state::fixeightbl_oki(address_map &map)
|
||||
{
|
||||
map(0x00000, 0x2ffff).rom();
|
||||
map(0x30000, 0x3ffff).bankr(m_okibank);
|
||||
}
|
||||
|
||||
|
||||
void batsugun_state::coin_sound_reset_w(u8 data)
|
||||
{
|
||||
m_coincounter->coin_w(data & ~0x20);
|
||||
sound_reset_w(data & 0x20);
|
||||
}
|
||||
|
||||
static INPUT_PORTS_START( base )
|
||||
PORT_START("IN1")
|
||||
TOAPLAN_JOY_UDLR_3_BUTTONS( 1 )
|
||||
|
||||
PORT_START("IN2")
|
||||
TOAPLAN_JOY_UDLR_3_BUTTONS( 2 )
|
||||
|
||||
PORT_START("SYS")
|
||||
PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_SERVICE1 )
|
||||
PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_TILT )
|
||||
TOAPLAN_TEST_SWITCH( 0x04, IP_ACTIVE_HIGH )
|
||||
PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_COIN1 )
|
||||
PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_COIN2 )
|
||||
PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_START1 )
|
||||
PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_START2 )
|
||||
PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNKNOWN )
|
||||
|
||||
PORT_START("DSWA")
|
||||
TOAPLAN_MACHINE_NO_COCKTAIL_LOC(SW1)
|
||||
// Coinage on bit mask 0x00f0
|
||||
PORT_BIT( 0x00f0, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // Modified below
|
||||
|
||||
PORT_START("DSWB")
|
||||
TOAPLAN_DIFFICULTY_LOC(SW2)
|
||||
// Per-game features on bit mask 0x00fc
|
||||
PORT_BIT( 0x00fc, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // Modified below
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
static INPUT_PORTS_START( batsugun )
|
||||
PORT_INCLUDE( base )
|
||||
|
||||
PORT_MODIFY("DSWA")
|
||||
PORT_DIPNAME( 0x0001, 0x0000, DEF_STR( Continue_Price ) ) PORT_DIPLOCATION("SW1:!1")
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( Normal ) )
|
||||
PORT_DIPSETTING( 0x0001, "Discount" )
|
||||
// Various features on bit mask 0x000e - see above
|
||||
TOAPLAN_COINAGE_JAPAN_LOC(SW1) // European coinage shown in Service Mode but not actually used
|
||||
|
||||
PORT_MODIFY("DSWB")
|
||||
// Difficulty on bit mask 0x0003 - see above
|
||||
PORT_DIPNAME( 0x000c, 0x0000, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:!3,!4")
|
||||
PORT_DIPSETTING( 0x000c, DEF_STR( None ) )
|
||||
PORT_DIPSETTING( 0x0008, "1500k only" )
|
||||
PORT_DIPSETTING( 0x0000, "1000k only" )
|
||||
PORT_DIPSETTING( 0x0004, "500k and every 600k" )
|
||||
PORT_DIPNAME( 0x0030, 0x0000, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:!5,!6")
|
||||
PORT_DIPSETTING( 0x0030, "1" )
|
||||
PORT_DIPSETTING( 0x0020, "2" )
|
||||
PORT_DIPSETTING( 0x0000, "3" )
|
||||
PORT_DIPSETTING( 0x0010, "5" )
|
||||
PORT_DIPNAME( 0x0040, 0x0000, "Invulnerability (Cheat)" ) PORT_DIPLOCATION("SW2:!7")
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0040, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0080, 0x0000, DEF_STR( Allow_Continue ) ) PORT_DIPLOCATION("SW2:!8")
|
||||
PORT_DIPSETTING( 0x0080, DEF_STR( No ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( Yes ) )
|
||||
|
||||
PORT_START("JMPR")
|
||||
PORT_CONFNAME( 0x00f0, 0x0090, DEF_STR( Region ) ) //PORT_CONFLOCATION("JP:!4,!3,!2,!1")
|
||||
PORT_CONFSETTING( 0x0090, DEF_STR( Europe ) )
|
||||
PORT_CONFSETTING( 0x0080, "Europe (Taito Corp.)" )
|
||||
PORT_CONFSETTING( 0x00b0, DEF_STR( USA ) )
|
||||
PORT_CONFSETTING( 0x00a0, "USA (Taito Corp.)" )
|
||||
PORT_CONFSETTING( 0x00f0, DEF_STR( Japan ) )
|
||||
// PORT_CONFSETTING( 0x00e0, DEF_STR( Japan ) )
|
||||
PORT_CONFSETTING( 0x00d0, "Japan (Taito Corp.)" )
|
||||
// PORT_CONFSETTING( 0x00c0, "Japan (Taito Corp.)" )
|
||||
PORT_CONFSETTING( 0x0070, DEF_STR( Southeast_Asia ) )
|
||||
PORT_CONFSETTING( 0x0060, "Southeast Asia (Taito Corp.)" )
|
||||
PORT_CONFSETTING( 0x0050, DEF_STR( Taiwan ) )
|
||||
PORT_CONFSETTING( 0x0040, "Taiwan (Taito Corp.)" )
|
||||
PORT_CONFSETTING( 0x0030, DEF_STR( Hong_Kong ) )
|
||||
PORT_CONFSETTING( 0x0020, "Hong Kong (Taito Corp.)" )
|
||||
PORT_CONFSETTING( 0x0010, DEF_STR( Korea ) )
|
||||
PORT_CONFSETTING( 0x0000, "Korea (Unite Trading)" )
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
static INPUT_PORTS_START( batsugunbl )
|
||||
PORT_INCLUDE( batsugun )
|
||||
|
||||
PORT_MODIFY("JMPR")
|
||||
PORT_CONFNAME( 0x000f, 0x0009, DEF_STR( Region ) ) //PORT_CONFLOCATION("JP:!4,!3,!2,!1")
|
||||
PORT_CONFSETTING( 0x0009, DEF_STR( Europe ) )
|
||||
PORT_CONFSETTING( 0x0008, "Europe (Taito Corp.)" )
|
||||
PORT_CONFSETTING( 0x000b, DEF_STR( USA ) )
|
||||
PORT_CONFSETTING( 0x000a, "USA (Taito Corp.)" )
|
||||
PORT_CONFSETTING( 0x000f, DEF_STR( Japan ) )
|
||||
// PORT_CONFSETTING( 0x000e, DEF_STR( Japan ) )
|
||||
PORT_CONFSETTING( 0x000d, "Japan (Taito Corp.)" )
|
||||
// PORT_CONFSETTING( 0x000c, "Japan (Taito Corp.)" )
|
||||
PORT_CONFSETTING( 0x0007, DEF_STR( Southeast_Asia ) )
|
||||
PORT_CONFSETTING( 0x0006, "Southeast Asia (Taito Corp.)" )
|
||||
PORT_CONFSETTING( 0x0005, DEF_STR( Taiwan ) )
|
||||
PORT_CONFSETTING( 0x0004, "Taiwan (Taito Corp.)" )
|
||||
PORT_CONFSETTING( 0x0003, DEF_STR( Hong_Kong ) )
|
||||
PORT_CONFSETTING( 0x0002, "Hong Kong (Taito Corp.)" )
|
||||
PORT_CONFSETTING( 0x0001, DEF_STR( Korea ) )
|
||||
PORT_CONFSETTING( 0x0000, "Korea (Unite Trading)" )
|
||||
PORT_CONFNAME( 0x00f0, 0x00f0, "(null)" )
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
|
||||
void batsugun_state::batsugun_68k_mem(address_map &map)
|
||||
{
|
||||
map(0x000000, 0x07ffff).rom();
|
||||
map(0x100000, 0x10ffff).ram();
|
||||
map(0x200010, 0x200011).portr("IN1");
|
||||
map(0x200014, 0x200015).portr("IN2");
|
||||
map(0x200018, 0x200019).portr("SYS");
|
||||
map(0x20001d, 0x20001d).w(FUNC(batsugun_state::coin_sound_reset_w)); // Coin count/lock + v25 reset line
|
||||
map(0x210000, 0x21ffff).rw(FUNC(batsugun_state::shared_ram_r), FUNC(batsugun_state::shared_ram_w)).umask16(0x00ff);
|
||||
map(0x300000, 0x30000d).rw(m_vdp[0], FUNC(gp9001vdp_device::read), FUNC(gp9001vdp_device::write));
|
||||
map(0x400000, 0x400fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
|
||||
map(0x500000, 0x50000d).rw(m_vdp[1], FUNC(gp9001vdp_device::read), FUNC(gp9001vdp_device::write));
|
||||
map(0x700000, 0x700001).r(m_vdp[0], FUNC(gp9001vdp_device::vdpcount_r));
|
||||
}
|
||||
|
||||
void batsugun_bootleg_state::batsugunbl_oki_bankswitch_w(u8 data)
|
||||
{
|
||||
data &= 7;
|
||||
if (data <= 4) m_okibank->set_entry(data);
|
||||
}
|
||||
|
||||
|
||||
void batsugun_bootleg_state::batsugunbl_68k_mem(address_map &map)
|
||||
{
|
||||
map(0x000000, 0x07ffff).rom();
|
||||
map(0x100000, 0x10ffff).ram();
|
||||
// map(0x200004, 0x200005).r() // only cleared at boot?
|
||||
map(0x200005, 0x200005).w(FUNC(batsugun_bootleg_state::batsugunbl_oki_bankswitch_w)); // TODO: doesn't sound correct
|
||||
map(0x200009, 0x200009).rw(m_oki, FUNC(okim6295_device::read), FUNC(okim6295_device::write));
|
||||
map(0x200010, 0x200011).portr("IN1");
|
||||
map(0x200014, 0x200015).portr("IN2");
|
||||
map(0x200018, 0x200019).portr("SYS");
|
||||
map(0x20001c, 0x20001d).nopw(); // leftover code from the original?
|
||||
map(0x21f004, 0x21f005).portr("DSWA");
|
||||
map(0x21f006, 0x21f007).portr("DSWB");
|
||||
map(0x21f008, 0x21f009).portr("JMPR");
|
||||
map(0x300000, 0x30000d).rw(m_vdp[0], FUNC(gp9001vdp_device::read), FUNC(gp9001vdp_device::write));
|
||||
map(0x400000, 0x400fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
|
||||
map(0x500000, 0x50000d).rw(m_vdp[1], FUNC(gp9001vdp_device::read), FUNC(gp9001vdp_device::write));
|
||||
map(0x700000, 0x700001).r(m_vdp[0], FUNC(gp9001vdp_device::vdpcount_r));
|
||||
}
|
||||
|
||||
void batsugun_bootleg_state::cpu_space_batsugunbl_map(address_map &map)
|
||||
{
|
||||
map(0xfffff0, 0xffffff).m(m_maincpu, FUNC(m68000_base_device::autovectors_map));
|
||||
map(0xfffff5, 0xfffff5).lr8(NAME([this] () { m_maincpu->set_input_line(M68K_IRQ_2, CLEAR_LINE); return m68000_device::autovector(2); }));
|
||||
}
|
||||
|
||||
void batsugun_state::v25_mem(address_map &map)
|
||||
{
|
||||
map(0x00000, 0x00001).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write));
|
||||
map(0x00004, 0x00004).rw(m_oki, FUNC(okim6295_device::read), FUNC(okim6295_device::write));
|
||||
map(0x80000, 0x87fff).mirror(0x78000).ram().share(m_shared_ram);
|
||||
}
|
||||
|
||||
void batsugun_state::batsugun(machine_config &config)
|
||||
{
|
||||
/* basic machine hardware */
|
||||
M68000(config, m_maincpu, 32_MHz_XTAL/2); // 16MHz, 32MHz Oscillator
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &batsugun_state::batsugun_68k_mem);
|
||||
m_maincpu->reset_cb().set(FUNC(batsugun_state::reset));
|
||||
|
||||
v25_device &audiocpu(V25(config, m_audiocpu, 32_MHz_XTAL/2)); // NEC V25 type Toaplan marked CPU ???
|
||||
audiocpu.set_addrmap(AS_PROGRAM, &batsugun_state::v25_mem);
|
||||
audiocpu.pt_in_cb().set_ioport("DSWA").exor(0xff);
|
||||
audiocpu.p0_in_cb().set_ioport("DSWB").exor(0xff);
|
||||
audiocpu.p1_in_cb().set_ioport("JMPR").exor(0xff);
|
||||
audiocpu.p2_out_cb().set_nop(); // bit 0 is FAULT according to kbash schematic
|
||||
|
||||
TOAPLAN_COINCOUNTER(config, m_coincounter, 0);
|
||||
|
||||
/* video hardware */
|
||||
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
|
||||
m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
|
||||
m_screen->set_raw(27_MHz_XTAL/4, 432, 0, 320, 262, 0, 240);
|
||||
m_screen->set_screen_update(FUNC(batsugun_state::screen_update_batsugun));
|
||||
m_screen->screen_vblank().set(FUNC(batsugun_state::screen_vblank));
|
||||
m_screen->set_palette(m_palette);
|
||||
|
||||
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, gp9001vdp_device::VDP_PALETTE_LENGTH);
|
||||
|
||||
GP9001_VDP(config, m_vdp[0], 27_MHz_XTAL);
|
||||
m_vdp[0]->set_palette(m_palette);
|
||||
m_vdp[0]->vint_out_cb().set_inputline(m_maincpu, M68K_IRQ_4);
|
||||
|
||||
GP9001_VDP(config, m_vdp[1], 27_MHz_XTAL);
|
||||
m_vdp[1]->set_palette(m_palette);
|
||||
|
||||
/* sound hardware */
|
||||
SPEAKER(config, "mono").front_center();
|
||||
|
||||
YM2151(config, "ymsnd", 27_MHz_XTAL/8).add_route(ALL_OUTPUTS, "mono", 0.5);
|
||||
|
||||
OKIM6295(config, m_oki, 32_MHz_XTAL/8, okim6295_device::PIN7_LOW);
|
||||
m_oki->add_route(ALL_OUTPUTS, "mono", 0.5);
|
||||
}
|
||||
|
||||
void batsugun_bootleg_state::batsugunbl(machine_config &config)
|
||||
{
|
||||
batsugun(config);
|
||||
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &batsugun_bootleg_state::batsugunbl_68k_mem);
|
||||
m_maincpu->set_addrmap(m68000_base_device::AS_CPU_SPACE, &batsugun_bootleg_state::cpu_space_batsugunbl_map);
|
||||
|
||||
m_vdp[0]->vint_out_cb().set_inputline(m_maincpu, M68K_IRQ_2, ASSERT_LINE);
|
||||
|
||||
config.device_remove("audiocpu");
|
||||
config.device_remove("ymsnd");
|
||||
|
||||
m_oki->set_addrmap(0, &batsugun_bootleg_state::fixeightbl_oki);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
ROM_START( batsugun )
|
||||
ROM_REGION( 0x080000, "maincpu", 0 ) /* Main 68K code */
|
||||
ROM_LOAD16_WORD_SWAP( "tp030_1a.bin", 0x000000, 0x080000, CRC(cb1d4554) SHA1(ef31f24d77e1c13bdf5558a04a6253e2e3e6a790) )
|
||||
|
||||
/* Secondary CPU is a Toaplan marked chip, (TS-007-Spy TOA PLAN) */
|
||||
/* It's a NEC V25 (PLCC94) (program uploaded by main CPU) */
|
||||
|
||||
ROM_REGION( 0x400000, "gp9001_0", 0 )
|
||||
ROM_LOAD( "tp030_3l.bin", 0x000000, 0x100000, CRC(3024b793) SHA1(e161db940f069279356fca2c5bf2753f07773705) )
|
||||
ROM_LOAD( "tp030_3h.bin", 0x100000, 0x100000, CRC(ed75730b) SHA1(341f0f728144a049486d996c9bb14078578c6879) )
|
||||
ROM_LOAD( "tp030_4l.bin", 0x200000, 0x100000, CRC(fedb9861) SHA1(4b0917056bd359b21935358c6bcc729262be6417) )
|
||||
ROM_LOAD( "tp030_4h.bin", 0x300000, 0x100000, CRC(d482948b) SHA1(31be7dc5cff072403b783bf203b9805ffcad7284) )
|
||||
|
||||
ROM_REGION( 0x200000, "gp9001_1", 0 )
|
||||
ROM_LOAD( "tp030_5.bin", 0x000000, 0x100000, CRC(bcf5ba05) SHA1(40f98888a29cdd30cda5dfb60fdc667c69b0fdb0) )
|
||||
ROM_LOAD( "tp030_6.bin", 0x100000, 0x100000, CRC(0666fecd) SHA1(aa8f921fc51590b5b05bbe0b0ad0cce5ff359c64) )
|
||||
|
||||
ROM_REGION( 0x40000, "oki", 0 ) /* ADPCM Samples */
|
||||
ROM_LOAD( "tp030_2.bin", 0x00000, 0x40000, CRC(276146f5) SHA1(bf11d1f6782cefcad77d52af4f7e6054a8f93440) )
|
||||
|
||||
ROM_REGION( 0x1000, "plds", 0 ) /* Logic for mixing output of both GP9001 GFX controllers */
|
||||
ROM_LOAD( "tp030_u19_gal16v8b-15.bin", 0x0000, 0x117, CRC(f71669e8) SHA1(ec1fbe04605fee864af4b01f001af227938c9f21) )
|
||||
// ROM_LOAD( "tp030_u19_gal16v8b-15.jed", 0x0000, 0x991, CRC(31be54a2) SHA1(06278942a9a2ea858c0352b2ef5a65bf329b7b82) )
|
||||
ROM_END
|
||||
|
||||
ROM_START( batsuguna )
|
||||
ROM_REGION( 0x080000, "maincpu", 0 ) /* Main 68K code */
|
||||
ROM_LOAD16_WORD_SWAP( "tp030_01.bin", 0x000000, 0x080000, CRC(3873d7dd) SHA1(baf6187d7d554cfcf4a86b63f07fc30df7ef84c9) )
|
||||
|
||||
/* Secondary CPU is a Toaplan marked chip, (TS-007-Spy TOA PLAN) */
|
||||
/* It's a NEC V25 (PLCC94) (program uploaded by main CPU) */
|
||||
|
||||
ROM_REGION( 0x400000, "gp9001_0", 0 )
|
||||
ROM_LOAD( "tp030_3l.bin", 0x000000, 0x100000, CRC(3024b793) SHA1(e161db940f069279356fca2c5bf2753f07773705) )
|
||||
ROM_LOAD( "tp030_3h.bin", 0x100000, 0x100000, CRC(ed75730b) SHA1(341f0f728144a049486d996c9bb14078578c6879) )
|
||||
ROM_LOAD( "tp030_4l.bin", 0x200000, 0x100000, CRC(fedb9861) SHA1(4b0917056bd359b21935358c6bcc729262be6417) )
|
||||
ROM_LOAD( "tp030_4h.bin", 0x300000, 0x100000, CRC(d482948b) SHA1(31be7dc5cff072403b783bf203b9805ffcad7284) )
|
||||
|
||||
ROM_REGION( 0x200000, "gp9001_1", 0 )
|
||||
ROM_LOAD( "tp030_5.bin", 0x000000, 0x100000, CRC(bcf5ba05) SHA1(40f98888a29cdd30cda5dfb60fdc667c69b0fdb0) )
|
||||
ROM_LOAD( "tp030_6.bin", 0x100000, 0x100000, CRC(0666fecd) SHA1(aa8f921fc51590b5b05bbe0b0ad0cce5ff359c64) )
|
||||
|
||||
ROM_REGION( 0x40000, "oki", 0 ) /* ADPCM Samples */
|
||||
ROM_LOAD( "tp030_2.bin", 0x00000, 0x40000, CRC(276146f5) SHA1(bf11d1f6782cefcad77d52af4f7e6054a8f93440) )
|
||||
|
||||
ROM_REGION( 0x1000, "plds", 0 ) /* Logic for mixing output of both GP9001 GFX controllers */
|
||||
ROM_LOAD( "tp030_u19_gal16v8b-15.bin", 0x0000, 0x117, CRC(f71669e8) SHA1(ec1fbe04605fee864af4b01f001af227938c9f21) )
|
||||
ROM_END
|
||||
|
||||
ROM_START( batsugunb )
|
||||
ROM_REGION( 0x080000, "maincpu", 0 ) /* Main 68K code */
|
||||
ROM_LOAD16_WORD_SWAP( "large_rom1.bin", 0x000000, 0x080000, CRC(c9de8ed8) SHA1(8de9acd26e83c8ea3388137da528704116aa7bdb) )
|
||||
|
||||
/* Secondary CPU is a Toaplan marked chip, (TS-007-Spy TOA PLAN) */
|
||||
/* It's a NEC V25 (PLCC94) (program uploaded by main CPU) */
|
||||
|
||||
ROM_REGION( 0x400000, "gp9001_0", 0 )
|
||||
ROM_LOAD16_BYTE( "rom12.bin", 0x000000, 0x080000, CRC(d25affc6) SHA1(00803ae5a2bc06edbfb9ea6e3df51f195bbee8cb) )
|
||||
ROM_LOAD16_BYTE( "rom6.bin", 0x000001, 0x080000, CRC(ddd6df60) SHA1(3b46945c51e7b10b473d98916f075e8def336ce7) )
|
||||
ROM_LOAD16_BYTE( "rom11.bin", 0x100000, 0x080000, CRC(ed72fe3e) SHA1(5c0f4d5cc84b45e1924dacfa4c0b602cc1600b2f) )
|
||||
ROM_LOAD16_BYTE( "rom5.bin", 0x100001, 0x080000, CRC(fd44b33b) SHA1(791cf6056a2dbafa5f41f1dcf686947ee990647d) )
|
||||
ROM_LOAD16_BYTE( "rom10.bin", 0x200000, 0x080000, CRC(86b2c6a9) SHA1(b3f39246012c6cd9df69a6797d56479523b33bcb) )
|
||||
ROM_LOAD16_BYTE( "rom4.bin", 0x200001, 0x080000, CRC(e7c1c623) SHA1(0d8922ce901b5f74f1bd397d5d9c6ab4e918b1d1) )
|
||||
ROM_LOAD16_BYTE( "rom9.bin", 0x300000, 0x080000, CRC(fda8ee00) SHA1(d5ea617a72b2721386eb2dfc15b76de2e30f069c) )
|
||||
ROM_LOAD16_BYTE( "rom3.bin", 0x300001, 0x080000, CRC(a7c4dee8) SHA1(94e2dda067612fac810157f8cf392b685b38798b) )
|
||||
|
||||
ROM_REGION( 0x200000, "gp9001_1", 0 )
|
||||
ROM_LOAD16_BYTE( "rom8.bin", 0x000000, 0x080000, CRC(a2c6a170) SHA1(154048ddc8ca2b4e9617e142d904ad2698b0ad02) )
|
||||
ROM_LOAD16_BYTE( "rom2.bin", 0x000001, 0x080000, CRC(a457e202) SHA1(4a9f2f95c866fc9d40af1c57ce1940f0a6dc1b82) )
|
||||
ROM_LOAD16_BYTE( "rom7.bin", 0x100000, 0x080000, CRC(8644518f) SHA1(570141deeb796cfae57600d5a518d34bb6dc14d0) )
|
||||
ROM_LOAD16_BYTE( "rom1.bin", 0x100001, 0x080000, CRC(8e339897) SHA1(80e84c291f287c0783bddfcb1b7ebf78c154cadc) )
|
||||
|
||||
ROM_REGION( 0x40000, "oki", 0 ) /* ADPCM Samples */
|
||||
ROM_LOAD( "rom13.bin", 0x00000, 0x40000, CRC(276146f5) SHA1(bf11d1f6782cefcad77d52af4f7e6054a8f93440) )
|
||||
|
||||
ROM_REGION( 0x1000, "plds", 0 ) /* Logic for mixing output of both GP9001 GFX controllers */
|
||||
ROM_LOAD( "tp030_u19_gal16v8b-15.bin", 0x0000, 0x117, CRC(f71669e8) SHA1(ec1fbe04605fee864af4b01f001af227938c9f21) )
|
||||
// ROM_LOAD( "tp030_u19_gal16v8b-15.jed", 0x0000, 0x991, CRC(31be54a2) SHA1(06278942a9a2ea858c0352b2ef5a65bf329b7b82) )
|
||||
ROM_END
|
||||
|
||||
// very similar to batsuguna, same main CPU label, seems to have just a tiny bit more code
|
||||
ROM_START( batsugunc )
|
||||
ROM_REGION( 0x080000, "maincpu", 0 ) // Main 68K code
|
||||
ROM_LOAD16_WORD_SWAP( "tp-030_01.u69", 0x000000, 0x080000, CRC(545305c4) SHA1(9411ad7fe0be89a9f04b9116c9c709dc5e98c345) )
|
||||
|
||||
/* Secondary CPU is a Toaplan marked chip, (TS-007-Spy TOA PLAN) */
|
||||
/* It's a NEC V25 (PLCC94) (program uploaded by main CPU) */
|
||||
|
||||
ROM_REGION( 0x400000, "gp9001_0", 0 )
|
||||
ROM_LOAD( "tp030_rom3-l.u55", 0x000000, 0x100000, CRC(3024b793) SHA1(e161db940f069279356fca2c5bf2753f07773705) )
|
||||
ROM_LOAD( "tp030_rom3-h.u56", 0x100000, 0x100000, CRC(ed75730b) SHA1(341f0f728144a049486d996c9bb14078578c6879) )
|
||||
ROM_LOAD( "tp030_rom4-l.u54", 0x200000, 0x100000, CRC(fedb9861) SHA1(4b0917056bd359b21935358c6bcc729262be6417) )
|
||||
ROM_LOAD( "tp030_rom4-h.u57", 0x300000, 0x100000, CRC(d482948b) SHA1(31be7dc5cff072403b783bf203b9805ffcad7284) )
|
||||
|
||||
ROM_REGION( 0x200000, "gp9001_1", 0 )
|
||||
ROM_LOAD( "tp030_rom5.u32", 0x000000, 0x100000, CRC(bcf5ba05) SHA1(40f98888a29cdd30cda5dfb60fdc667c69b0fdb0) )
|
||||
ROM_LOAD( "tp030_rom6.u31", 0x100000, 0x100000, CRC(0666fecd) SHA1(aa8f921fc51590b5b05bbe0b0ad0cce5ff359c64) )
|
||||
|
||||
ROM_REGION( 0x40000, "oki", 0 )
|
||||
ROM_LOAD( "tp030_rom2.u65", 0x00000, 0x40000, CRC(276146f5) SHA1(bf11d1f6782cefcad77d52af4f7e6054a8f93440) )
|
||||
|
||||
ROM_REGION( 0x1000, "plds", 0 ) // Logic for mixing output of both GP9001 GFX controllers
|
||||
ROM_LOAD( "tp030_u19_gal16v8b-15.bin", 0x0000, 0x117, CRC(f71669e8) SHA1(ec1fbe04605fee864af4b01f001af227938c9f21) )
|
||||
// ROM_LOAD( "tp030_u19_gal16v8b-15.jed", 0x0000, 0x991, CRC(31be54a2) SHA1(06278942a9a2ea858c0352b2ef5a65bf329b7b82) )
|
||||
ROM_END
|
||||
|
||||
ROM_START( batsugunsp )
|
||||
ROM_REGION( 0x080000, "maincpu", 0 ) /* Main 68K code */
|
||||
ROM_LOAD16_WORD_SWAP( "tp-030sp.u69", 0x000000, 0x080000, CRC(8072a0cd) SHA1(3a0a9cdf894926a16800c4882a2b00383d981367) )
|
||||
|
||||
/* Secondary CPU is a Toaplan marked chip, (TS-007-Spy TOA PLAN) */
|
||||
/* It's a NEC V25 (PLCC94) (program uploaded by main CPU) */
|
||||
|
||||
ROM_REGION( 0x400000, "gp9001_0", 0 )
|
||||
ROM_LOAD( "tp030_3l.bin", 0x000000, 0x100000, CRC(3024b793) SHA1(e161db940f069279356fca2c5bf2753f07773705) )
|
||||
ROM_LOAD( "tp030_3h.bin", 0x100000, 0x100000, CRC(ed75730b) SHA1(341f0f728144a049486d996c9bb14078578c6879) )
|
||||
ROM_LOAD( "tp030_4l.bin", 0x200000, 0x100000, CRC(fedb9861) SHA1(4b0917056bd359b21935358c6bcc729262be6417) )
|
||||
ROM_LOAD( "tp030_4h.bin", 0x300000, 0x100000, CRC(d482948b) SHA1(31be7dc5cff072403b783bf203b9805ffcad7284) )
|
||||
|
||||
ROM_REGION( 0x200000, "gp9001_1", 0 )
|
||||
ROM_LOAD( "tp030_5.bin", 0x000000, 0x100000, CRC(bcf5ba05) SHA1(40f98888a29cdd30cda5dfb60fdc667c69b0fdb0) )
|
||||
ROM_LOAD( "tp030_6.bin", 0x100000, 0x100000, CRC(0666fecd) SHA1(aa8f921fc51590b5b05bbe0b0ad0cce5ff359c64) )
|
||||
|
||||
ROM_REGION( 0x40000, "oki", 0 ) /* ADPCM Samples */
|
||||
ROM_LOAD( "tp030_2.bin", 0x00000, 0x40000, CRC(276146f5) SHA1(bf11d1f6782cefcad77d52af4f7e6054a8f93440) )
|
||||
|
||||
ROM_REGION( 0x1000, "plds", 0 ) /* Logic for mixing output of both GP9001 GFX controllers */
|
||||
ROM_LOAD( "tp030_u19_gal16v8b-15.bin", 0x0000, 0x117, CRC(f71669e8) SHA1(ec1fbe04605fee864af4b01f001af227938c9f21) )
|
||||
ROM_END
|
||||
|
||||
// a cost-cutting bootleg PCB with only M68000 + OKIM6295. A pair of TPC1020 seem to do the job of the GP9001s.
|
||||
// according to the dumper 'audio is pretty garbage, and some sprites overlay the UI incorrectly'
|
||||
ROM_START( batsugunbl )
|
||||
ROM_REGION( 0x080000, "maincpu", 0 )
|
||||
ROM_LOAD16_WORD_SWAP( "27c240.bin", 0x000000, 0x080000, CRC(a34df8bb) SHA1(10d456f5437b21a95fd8018bdb19a08a110241c4) )
|
||||
|
||||
ROM_REGION( 0x400000, "gp9001_0", 0 ) // same as original
|
||||
ROM_LOAD( "27c8100-j.bin", 0x000000, 0x100000, CRC(3024b793) SHA1(e161db940f069279356fca2c5bf2753f07773705) )
|
||||
ROM_LOAD( "27c8100-k.bin", 0x100000, 0x100000, CRC(ed75730b) SHA1(341f0f728144a049486d996c9bb14078578c6879) )
|
||||
ROM_LOAD( "27c8100-l.bin", 0x200000, 0x100000, CRC(fedb9861) SHA1(4b0917056bd359b21935358c6bcc729262be6417) )
|
||||
ROM_LOAD( "27c8100-m.bin", 0x300000, 0x100000, CRC(d482948b) SHA1(31be7dc5cff072403b783bf203b9805ffcad7284) )
|
||||
|
||||
ROM_REGION( 0x200000, "gp9001_1", 0 ) // same as original
|
||||
ROM_LOAD( "27c8100-n.bin", 0x000000, 0x100000, CRC(bcf5ba05) SHA1(40f98888a29cdd30cda5dfb60fdc667c69b0fdb0) )
|
||||
ROM_LOAD( "27c8100-o.bin", 0x100000, 0x100000, CRC(0666fecd) SHA1(aa8f921fc51590b5b05bbe0b0ad0cce5ff359c64) )
|
||||
|
||||
ROM_REGION( 0x80000, "oki", 0 ) // more samples to compensate for missing YM2151
|
||||
ROM_LOAD( "27c040.bin", 0x00000, 0x80000, CRC(1f8ec1b6) SHA1(28107a90d29613ceddc001df2556543b33c1294c) )
|
||||
ROM_END
|
||||
|
||||
void batsugun_bootleg_state::init_batsugunbl()
|
||||
{
|
||||
u8 *ROM = memregion("oki")->base();
|
||||
|
||||
m_okibank->configure_entries(0, 5, &ROM[0x30000], 0x10000);
|
||||
}
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
GAME( 1993, batsugun, 0, batsugun, batsugun, batsugun_state, empty_init, ROT270, "Toaplan", "Batsugun", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1993, batsuguna, batsugun, batsugun, batsugun, batsugun_state, empty_init, ROT270, "Toaplan", "Batsugun (older, set 1)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1993, batsugunc, batsugun, batsugun, batsugun, batsugun_state, empty_init, ROT270, "Toaplan", "Batsugun (older, set 2)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1993, batsugunb, batsugun, batsugun, batsugun, batsugun_state, empty_init, ROT270, "Toaplan", "Batsugun (Korean PCB)", MACHINE_SUPPORTS_SAVE ) // cheap looking PCB (same 'TP-030' numbering as original) but without Mask ROMs. Still has original customs etc. Jumpers were set to the Korea Unite Trading license, so likely made in Korea, not a bootleg tho.
|
||||
GAME( 1993, batsugunsp, batsugun, batsugun, batsugun, batsugun_state, empty_init, ROT270, "Toaplan", "Batsugun - Special Version", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1993, batsugunbl, batsugun, batsugunbl, batsugunbl, batsugun_bootleg_state, init_batsugunbl, ROT270, "Toaplan", "Batsugun (bootleg)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // needs correct GFX offsets and oki banking fix
|
527
src/mame/toaplan/dogyuun.cpp
Normal file
527
src/mame/toaplan/dogyuun.cpp
Normal file
@ -0,0 +1,527 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Quench, Yochizo, David Haywood
|
||||
|
||||
#include "emu.h"
|
||||
|
||||
#include "emupal.h"
|
||||
#include "screen.h"
|
||||
#include "speaker.h"
|
||||
#include "tilemap.h"
|
||||
|
||||
#include "toaplan_coincounter.h"
|
||||
#include "toaplan_v25_tables.h"
|
||||
#include "toaplipt.h"
|
||||
#include "gp9001.h"
|
||||
|
||||
#include "cpu/m68000/m68000.h"
|
||||
#include "cpu/nec/v25.h"
|
||||
#include "cpu/z80/z80.h"
|
||||
#include "sound/okim6295.h"
|
||||
#include "sound/ymopm.h"
|
||||
|
||||
/*
|
||||
Name Board No Maker Game name
|
||||
----------------------------------------------------------------------------
|
||||
dogyuun TP-022 Toaplan Dogyuun
|
||||
dogyuuna TP-022 Toaplan Dogyuun (older)
|
||||
dogyuunt TP-022 Toaplan Dogyuun (location test)
|
||||
|
||||
dogyuun - In the location test version, if you are hit while you have a bomb, the bomb explodes
|
||||
automatically and saves you from dying. In the final released version, the bomb explodes
|
||||
but you die anyway.
|
||||
The only difference between the dogyuun and dogyuuna sets is some of the region jumper
|
||||
settings; see the INPUT_PORTS definitions.
|
||||
*/
|
||||
|
||||
namespace {
|
||||
|
||||
class dogyuun_base_state : public driver_device
|
||||
{
|
||||
public:
|
||||
dogyuun_base_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: driver_device(mconfig, type, tag)
|
||||
, m_maincpu(*this, "maincpu")
|
||||
, m_audiocpu(*this, "audiocpu")
|
||||
, m_shared_ram(*this, "shared_ram")
|
||||
, m_vdp(*this, "gp9001_%u", 0U)
|
||||
, m_oki(*this, "oki")
|
||||
, m_palette(*this, "palette")
|
||||
, m_coincounter(*this, "coincounter")
|
||||
, m_screen(*this, "screen")
|
||||
{ }
|
||||
|
||||
void dogyuun_base(machine_config &config);
|
||||
|
||||
protected:
|
||||
virtual void video_start() override ATTR_COLD;
|
||||
|
||||
u8 shared_ram_r(offs_t offset) { return m_shared_ram[offset]; }
|
||||
void shared_ram_w(offs_t offset, u8 data) { m_shared_ram[offset] = data; }
|
||||
|
||||
void coin_sound_reset_w(u8 data);
|
||||
|
||||
u8 m_sound_reset_bit = 0;
|
||||
|
||||
required_device<m68000_base_device> m_maincpu;
|
||||
required_device<cpu_device> m_audiocpu;
|
||||
required_shared_ptr<u8> m_shared_ram; // 8 bit RAM shared between 68K and sound CPU
|
||||
required_device_array<gp9001vdp_device, 2> m_vdp;
|
||||
required_device<okim6295_device> m_oki;
|
||||
required_device<palette_device> m_palette;
|
||||
|
||||
private:
|
||||
u32 screen_update_dogyuun(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
|
||||
void screen_vblank(int state);
|
||||
|
||||
void sound_reset_w(u8 data);
|
||||
void reset(int state);
|
||||
|
||||
required_device<toaplan_coincounter_device> m_coincounter;
|
||||
required_device<screen_device> m_screen;
|
||||
bitmap_ind8 m_custom_priority_bitmap;
|
||||
bitmap_ind16 m_secondary_render_bitmap;
|
||||
};
|
||||
|
||||
class dogyuun_state : public dogyuun_base_state
|
||||
{
|
||||
public:
|
||||
dogyuun_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: dogyuun_base_state(mconfig, type, tag)
|
||||
{
|
||||
m_sound_reset_bit = 0x20;
|
||||
}
|
||||
|
||||
void dogyuun(machine_config &config);
|
||||
|
||||
private:
|
||||
void dogyuun_68k_mem(address_map &map) ATTR_COLD;
|
||||
void v25_mem(address_map &map) ATTR_COLD;
|
||||
};
|
||||
|
||||
class dogyuunto_state : public dogyuun_base_state
|
||||
{
|
||||
public:
|
||||
dogyuunto_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: dogyuun_base_state(mconfig, type, tag)
|
||||
{
|
||||
m_sound_reset_bit = 0x10;
|
||||
}
|
||||
|
||||
void dogyuunto(machine_config &config);
|
||||
|
||||
private:
|
||||
void dogyuunto_68k_mem(address_map &map) ATTR_COLD;
|
||||
void dogyuunto_sound_z80_mem(address_map &map) ATTR_COLD;
|
||||
};
|
||||
|
||||
void dogyuun_base_state::reset(int state)
|
||||
{
|
||||
if (m_audiocpu != nullptr)
|
||||
m_audiocpu->pulse_input_line(INPUT_LINE_RESET, attotime::zero);
|
||||
}
|
||||
|
||||
void dogyuun_base_state::sound_reset_w(u8 data)
|
||||
{
|
||||
m_audiocpu->set_input_line(INPUT_LINE_RESET, (data & m_sound_reset_bit) ? CLEAR_LINE : ASSERT_LINE);
|
||||
}
|
||||
|
||||
void dogyuun_base_state::video_start()
|
||||
{
|
||||
m_screen->register_screen_bitmap(m_custom_priority_bitmap);
|
||||
m_secondary_render_bitmap.reset();
|
||||
m_vdp[0]->custom_priority_bitmap = &m_custom_priority_bitmap;
|
||||
m_screen->register_screen_bitmap(m_secondary_render_bitmap);
|
||||
m_vdp[1]->custom_priority_bitmap = &m_custom_priority_bitmap;
|
||||
}
|
||||
|
||||
void dogyuun_base_state::screen_vblank(int state)
|
||||
{
|
||||
if (state) // rising edge
|
||||
{
|
||||
m_vdp[0]->screen_eof();
|
||||
m_vdp[1]->screen_eof();
|
||||
}
|
||||
}
|
||||
|
||||
u32 dogyuun_base_state::screen_update_dogyuun(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
bitmap.fill(0, cliprect);
|
||||
m_custom_priority_bitmap.fill(0, cliprect);
|
||||
m_vdp[1]->render_vdp(bitmap, cliprect);
|
||||
m_custom_priority_bitmap.fill(0, cliprect);
|
||||
m_vdp[0]->render_vdp(bitmap, cliprect);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static INPUT_PORTS_START( base )
|
||||
PORT_START("IN1")
|
||||
TOAPLAN_JOY_UDLR_3_BUTTONS( 1 )
|
||||
|
||||
PORT_START("IN2")
|
||||
TOAPLAN_JOY_UDLR_3_BUTTONS( 2 )
|
||||
|
||||
PORT_START("SYS")
|
||||
PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_SERVICE1 )
|
||||
PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_TILT )
|
||||
TOAPLAN_TEST_SWITCH( 0x04, IP_ACTIVE_HIGH )
|
||||
PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_COIN1 )
|
||||
PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_COIN2 )
|
||||
PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_START1 )
|
||||
PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_START2 )
|
||||
PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNKNOWN )
|
||||
|
||||
PORT_START("DSWA")
|
||||
TOAPLAN_MACHINE_NO_COCKTAIL_LOC(SW1)
|
||||
// Coinage on bit mask 0x00f0
|
||||
PORT_BIT( 0x00f0, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // Modified below
|
||||
|
||||
PORT_START("DSWB")
|
||||
TOAPLAN_DIFFICULTY_LOC(SW2)
|
||||
// Per-game features on bit mask 0x00fc
|
||||
PORT_BIT( 0x00fc, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // Modified below
|
||||
INPUT_PORTS_END
|
||||
|
||||
static INPUT_PORTS_START( dogyuun )
|
||||
PORT_INCLUDE( base )
|
||||
|
||||
PORT_MODIFY("DSWA")
|
||||
PORT_DIPNAME( 0x0001, 0x0000, DEF_STR( Free_Play) ) PORT_DIPLOCATION("SW1:!1")
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0001, DEF_STR( On ) )
|
||||
// Various features on bit mask 0x000e - see above
|
||||
TOAPLAN_COINAGE_DUAL_LOC( JMPR, 0x8000, 0x8000, SW1 )
|
||||
|
||||
PORT_MODIFY("DSWB")
|
||||
// Difficulty on bit mask 0x0003 - see above
|
||||
PORT_DIPNAME( 0x000c, 0x0000, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:!3,!4")
|
||||
PORT_DIPSETTING( 0x000c, DEF_STR( None ) )
|
||||
PORT_DIPSETTING( 0x0008, "400k only" )
|
||||
PORT_DIPSETTING( 0x0000, "200k only" )
|
||||
PORT_DIPSETTING( 0x0004, "200k, 400k and 600k" )
|
||||
PORT_DIPNAME( 0x0030, 0x0000, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:!5,!6")
|
||||
PORT_DIPSETTING( 0x0030, "1" )
|
||||
PORT_DIPSETTING( 0x0020, "2" )
|
||||
PORT_DIPSETTING( 0x0000, "3" )
|
||||
PORT_DIPSETTING( 0x0010, "5" )
|
||||
PORT_DIPNAME( 0x0040, 0x0000, "Invulnerability (Cheat)" ) PORT_DIPLOCATION("SW2:!7")
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0040, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0080, 0x0000, DEF_STR( Allow_Continue ) ) PORT_DIPLOCATION("SW2:!8")
|
||||
PORT_DIPSETTING( 0x0080, DEF_STR( No ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( Yes ) )
|
||||
|
||||
PORT_START("JMPR")
|
||||
// Bit Mask 0x8000 is used here to signify European Coinage for MAME purposes - not read on the real board!
|
||||
// "No speedups": all speedup items in game are replaced with bombs
|
||||
PORT_CONFNAME( 0x80f0, 0x8030, DEF_STR( Region ) ) //PORT_CONFLOCATION("JP:!4,!3,!2,!1,FAKE:!1")
|
||||
PORT_CONFSETTING( 0x8030, DEF_STR( Europe ) )
|
||||
PORT_CONFSETTING( 0x0010, DEF_STR( USA ) )
|
||||
PORT_CONFSETTING( 0x0020, "USA (Atari Games Corp.)" )
|
||||
PORT_CONFSETTING( 0x0000, DEF_STR( Japan ) )
|
||||
PORT_CONFSETTING( 0x0040, "Hong Kong (Charterfield); no speedups" )
|
||||
PORT_CONFSETTING( 0x0050, "Korea (Unite Trading); no speedups" )
|
||||
PORT_CONFSETTING( 0x0060, "Taiwan; no speedups" )
|
||||
PORT_CONFSETTING( 0x0070, "USA; no speedups" )
|
||||
PORT_CONFSETTING( 0x0080, "Southeast Asia (Charterfield); no speedups" )
|
||||
PORT_CONFSETTING( 0x0090, "Hong Kong (Charterfield)" )
|
||||
PORT_CONFSETTING( 0x00a0, "Korea (Unite Trading)" )
|
||||
PORT_CONFSETTING( 0x00b0, DEF_STR( Taiwan ) )
|
||||
PORT_CONFSETTING( 0x00c0, "USA (Atari Games Corp.); no speedups" )
|
||||
PORT_CONFSETTING( 0x00d0, "Southeast Asia (Charterfield)" )
|
||||
PORT_CONFSETTING( 0x80e0, "Europe; no speedups" )
|
||||
PORT_CONFSETTING( 0x00f0, "Japan (Taito Corp.)" )
|
||||
INPUT_PORTS_END
|
||||
|
||||
static INPUT_PORTS_START( dogyuuna )
|
||||
PORT_INCLUDE( dogyuun )
|
||||
|
||||
PORT_MODIFY("DSWA")
|
||||
TOAPLAN_COINAGE_DUAL_LOC( JMPR, 0xf0, 0x30, SW1 )
|
||||
|
||||
PORT_MODIFY("JMPR")
|
||||
// "No speedups": all speedup items in game are replaced with bombs
|
||||
PORT_CONFNAME( 0x00f0, 0x0030, DEF_STR( Region ) ) //PORT_CONFLOCATION("JP:!4,!3,!2,!1")
|
||||
PORT_CONFSETTING( 0x0030, DEF_STR( Europe ) )
|
||||
PORT_CONFSETTING( 0x0010, DEF_STR( USA ) )
|
||||
PORT_CONFSETTING( 0x0020, "USA (Atari Games Corp.)" )
|
||||
PORT_CONFSETTING( 0x0000, DEF_STR( Japan ) )
|
||||
PORT_CONFSETTING( 0x0040, "Hong Kong (Charterfield); no speedups" )
|
||||
PORT_CONFSETTING( 0x0050, "Korea (Unite Trading); no speedups" )
|
||||
PORT_CONFSETTING( 0x0060, "Taiwan; no speedups" )
|
||||
// PORT_CONFSETTING( 0x0070, "Taiwan (Licensed to ???????); no speedups" )
|
||||
PORT_CONFSETTING( 0x0080, "Southeast Asia (Charterfield); no speedups" )
|
||||
PORT_CONFSETTING( 0x0090, "Hong Kong (Charterfield)" )
|
||||
PORT_CONFSETTING( 0x00a0, "Korea (Unite Trading)" )
|
||||
PORT_CONFSETTING( 0x00b0, DEF_STR( Taiwan ) )
|
||||
// PORT_CONFSETTING( 0x00c0, "Taiwan (Licensed to ???????)" )
|
||||
PORT_CONFSETTING( 0x00d0, "Southeast Asia (Charterfield)" )
|
||||
// PORT_CONFSETTING( 0x00e0, DEF_STR( Unused ) )
|
||||
PORT_CONFSETTING( 0x00f0, "Japan (Taito Corp.)" )
|
||||
INPUT_PORTS_END
|
||||
|
||||
static INPUT_PORTS_START( dogyuunt )
|
||||
PORT_INCLUDE( dogyuun )
|
||||
|
||||
PORT_MODIFY("DSWA")
|
||||
TOAPLAN_COINAGE_DUAL_LOC( JMPR, 0xf0, 0x20, SW1 )
|
||||
|
||||
PORT_MODIFY("JMPR")
|
||||
PORT_CONFNAME( 0x00f0, 0x0020, DEF_STR( Region ) ) //PORT_CONFLOCATION("JP:!4,!3,!2,!1")
|
||||
PORT_CONFSETTING( 0x0020, DEF_STR( Europe ) )
|
||||
PORT_CONFSETTING( 0x0010, DEF_STR( USA ) )
|
||||
PORT_CONFSETTING( 0x0000, DEF_STR( Japan ) )
|
||||
PORT_CONFSETTING( 0x0030, DEF_STR( Hong_Kong ) )
|
||||
PORT_CONFSETTING( 0x0040, DEF_STR( Korea ) )
|
||||
PORT_CONFSETTING( 0x0050, DEF_STR( Taiwan ) )
|
||||
PORT_CONFSETTING( 0x0060, "Southeast Asia (Charterfield)" )
|
||||
PORT_CONFSETTING( 0x0070, "USA (Romstar, Inc.)" )
|
||||
PORT_CONFSETTING( 0x0080, "Hong Kong (Honest Trading Co.)" )
|
||||
PORT_CONFSETTING( 0x0090, "Korea (JC Trading Corp.)" )
|
||||
PORT_CONFSETTING( 0x00a0, "USA (Fabtek)" )
|
||||
// PORT_CONFSETTING( 0x00b0, DEF_STR( Unused ) )
|
||||
// PORT_CONFSETTING( 0x00c0, DEF_STR( Unused ) )
|
||||
// PORT_CONFSETTING( 0x00d0, DEF_STR( Unused ) )
|
||||
// PORT_CONFSETTING( 0x00e0, DEF_STR( Unused ) )
|
||||
PORT_CONFSETTING( 0x00f0, "Japan (Taito Corp.)" )
|
||||
INPUT_PORTS_END
|
||||
|
||||
void dogyuun_base_state::coin_sound_reset_w(u8 data)
|
||||
{
|
||||
m_coincounter->coin_w(data & ~m_sound_reset_bit);
|
||||
sound_reset_w(data & m_sound_reset_bit);
|
||||
}
|
||||
|
||||
void dogyuun_state::dogyuun_68k_mem(address_map &map)
|
||||
{
|
||||
map(0x000000, 0x07ffff).rom();
|
||||
map(0x100000, 0x103fff).ram();
|
||||
map(0x200010, 0x200011).portr("IN1");
|
||||
map(0x200014, 0x200015).portr("IN2");
|
||||
map(0x200018, 0x200019).portr("SYS");
|
||||
map(0x20001d, 0x20001d).w(FUNC(dogyuun_state::coin_sound_reset_w)); // Coin count/lock + v25 reset line
|
||||
map(0x210000, 0x21ffff).rw(FUNC(dogyuun_state::shared_ram_r), FUNC(dogyuun_state::shared_ram_w)).umask16(0x00ff);
|
||||
map(0x300000, 0x30000d).rw(m_vdp[0], FUNC(gp9001vdp_device::read), FUNC(gp9001vdp_device::write));
|
||||
map(0x400000, 0x400fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
|
||||
map(0x500000, 0x50000d).rw(m_vdp[1], FUNC(gp9001vdp_device::read), FUNC(gp9001vdp_device::write));
|
||||
map(0x700000, 0x700001).r(m_vdp[0], FUNC(gp9001vdp_device::vdpcount_r)); // test bit 8
|
||||
}
|
||||
|
||||
|
||||
void dogyuunto_state::dogyuunto_68k_mem(address_map &map)
|
||||
{
|
||||
map(0x000000, 0x07ffff).rom();
|
||||
map(0x100000, 0x103fff).ram();
|
||||
map(0x218000, 0x218fff).rw(FUNC(dogyuunto_state::shared_ram_r), FUNC(dogyuunto_state::shared_ram_w)).umask16(0x00ff); // reads the same area as the finished game on startup, but then uses only this part
|
||||
map(0x21c01d, 0x21c01d).w(FUNC(dogyuunto_state::coin_sound_reset_w)); // Coin count/lock + Z80 reset line
|
||||
map(0x21c020, 0x21c021).portr("IN1");
|
||||
map(0x21c024, 0x21c025).portr("IN2");
|
||||
map(0x21c028, 0x21c029).portr("SYS");
|
||||
map(0x21c02c, 0x21c02d).portr("DSWA");
|
||||
map(0x21c030, 0x21c031).portr("DSWB");
|
||||
map(0x300000, 0x30000d).rw(m_vdp[0], FUNC(gp9001vdp_device::read), FUNC(gp9001vdp_device::write));
|
||||
map(0x400000, 0x400fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
|
||||
map(0x500000, 0x50000d).rw(m_vdp[1], FUNC(gp9001vdp_device::read), FUNC(gp9001vdp_device::write));
|
||||
map(0x700000, 0x700001).r(m_vdp[0], FUNC(gp9001vdp_device::vdpcount_r)); // test bit 8
|
||||
}
|
||||
|
||||
void dogyuunto_state::dogyuunto_sound_z80_mem(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x7fff).rom();
|
||||
map(0xc000, 0xc7ff).ram().share(m_shared_ram);
|
||||
map(0xe000, 0xe001).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write));
|
||||
map(0xe004, 0xe004).rw(m_oki, FUNC(okim6295_device::read), FUNC(okim6295_device::write));
|
||||
}
|
||||
|
||||
void dogyuun_state::v25_mem(address_map &map)
|
||||
{
|
||||
map(0x00000, 0x00001).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write));
|
||||
map(0x00004, 0x00004).rw(m_oki, FUNC(okim6295_device::read), FUNC(okim6295_device::write));
|
||||
map(0x80000, 0x87fff).mirror(0x78000).ram().share(m_shared_ram);
|
||||
}
|
||||
|
||||
void dogyuun_base_state::dogyuun_base(machine_config &config)
|
||||
{
|
||||
/* basic machine hardware */
|
||||
M68000(config, m_maincpu, 25_MHz_XTAL/2); /* verified on pcb */
|
||||
m_maincpu->reset_cb().set(FUNC(dogyuun_base_state::reset));
|
||||
|
||||
TOAPLAN_COINCOUNTER(config, m_coincounter, 0);
|
||||
|
||||
/* video hardware */
|
||||
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
|
||||
m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
|
||||
m_screen->set_raw(27_MHz_XTAL/4, 432, 0, 320, 262, 0, 240);
|
||||
m_screen->set_screen_update(FUNC(dogyuun_base_state::screen_update_dogyuun));
|
||||
m_screen->screen_vblank().set(FUNC(dogyuun_base_state::screen_vblank));
|
||||
m_screen->set_palette(m_palette);
|
||||
|
||||
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, gp9001vdp_device::VDP_PALETTE_LENGTH);
|
||||
|
||||
GP9001_VDP(config, m_vdp[0], 27_MHz_XTAL);
|
||||
m_vdp[0]->set_palette(m_palette);
|
||||
m_vdp[0]->vint_out_cb().set_inputline(m_maincpu, M68K_IRQ_4);
|
||||
|
||||
GP9001_VDP(config, m_vdp[1], 27_MHz_XTAL);
|
||||
m_vdp[1]->set_palette(m_palette);
|
||||
|
||||
/* sound hardware */
|
||||
SPEAKER(config, "mono").front_center();
|
||||
|
||||
YM2151(config, "ymsnd", 27_MHz_XTAL/8).add_route(ALL_OUTPUTS, "mono", 0.5); // verified on pcb
|
||||
|
||||
OKIM6295(config, m_oki, 25_MHz_XTAL/24, okim6295_device::PIN7_HIGH); // verified on PCB
|
||||
m_oki->add_route(ALL_OUTPUTS, "mono", 0.5);
|
||||
}
|
||||
|
||||
void dogyuun_state::dogyuun(machine_config& config)
|
||||
{
|
||||
dogyuun_base(config);
|
||||
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &dogyuun_state::dogyuun_68k_mem);
|
||||
|
||||
v25_device &audiocpu(V25(config, m_audiocpu, 25_MHz_XTAL/2)); /* NEC V25 type Toaplan marked CPU ??? */
|
||||
audiocpu.set_addrmap(AS_PROGRAM, &dogyuun_state::v25_mem);
|
||||
audiocpu.set_decryption_table(toaplan_v25_tables::nitro_decryption_table);
|
||||
audiocpu.pt_in_cb().set_ioport("DSWB").exor(0xff);
|
||||
audiocpu.p0_in_cb().set_ioport("DSWA").exor(0xff);
|
||||
audiocpu.p1_in_cb().set_ioport("JMPR").exor(0xff);
|
||||
audiocpu.p2_out_cb().set_nop(); // bit 0 is FAULT according to kbash schematic
|
||||
}
|
||||
|
||||
|
||||
void dogyuunto_state::dogyuunto(machine_config &config)
|
||||
{
|
||||
dogyuun_base(config);
|
||||
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &dogyuunto_state::dogyuunto_68k_mem);
|
||||
m_maincpu->set_clock(24_MHz_XTAL / 2); // 24 MHz instead of 25
|
||||
|
||||
z80_device &audiocpu(Z80(config, "audiocpu", 27_MHz_XTAL / 8)); // guessed divisor
|
||||
audiocpu.set_addrmap(AS_PROGRAM, &dogyuunto_state::dogyuunto_sound_z80_mem);
|
||||
|
||||
m_oki->set_clock(1.056_MHz_XTAL); // blue resonator 1056J
|
||||
}
|
||||
|
||||
|
||||
ROM_START( dogyuun )
|
||||
ROM_REGION( 0x080000, "maincpu", 0 ) /* Main 68K code */
|
||||
ROM_LOAD16_WORD_SWAP( "tp022_01.r16", 0x000000, 0x080000, CRC(79eb2429) SHA1(088c5ed0ed77557ab71f52cafe35028e3648ae1e) )
|
||||
|
||||
/* Secondary CPU is a Toaplan marked chip, (TS-002-MACH TOA PLAN) */
|
||||
/* It's a NEC V25 (PLCC94) (encrypted program uploaded by main CPU) */
|
||||
|
||||
ROM_REGION( 0x200000, "gp9001_0", 0 )
|
||||
ROM_LOAD16_WORD_SWAP( "tp022_3.w92", 0x000000, 0x100000, CRC(191b595f) SHA1(89344946daa18087cc83f92027cf5da659b1c7a5) )
|
||||
ROM_LOAD16_WORD_SWAP( "tp022_4.w93", 0x100000, 0x100000, CRC(d58d29ca) SHA1(90d142fef37764ef817347a2bed77892a288a077) )
|
||||
|
||||
ROM_REGION( 0x400000, "gp9001_1", 0 )
|
||||
ROM_LOAD16_WORD_SWAP( "tp022_5.w16", 0x000000, 0x200000, CRC(d4c1db45) SHA1(f5655467149ba737128c2f54c9c6cdaca6e4c35c) )
|
||||
ROM_LOAD16_WORD_SWAP( "tp022_6.w17", 0x200000, 0x200000, CRC(d48dc74f) SHA1(081b5a00a2ff2bd82b98b30aab3cb5b6ae1014d5) )
|
||||
|
||||
ROM_REGION( 0x40000, "oki", 0 ) /* ADPCM Samples */
|
||||
ROM_LOAD( "tp022_2.w30", 0x00000, 0x40000, CRC(043271b3) SHA1(c7eaa929e55dd956579b824ea9d20a1d0129a925) )
|
||||
ROM_END
|
||||
|
||||
|
||||
ROM_START( dogyuuna )
|
||||
ROM_REGION( 0x080000, "maincpu", 0 ) /* Main 68K code */
|
||||
ROM_LOAD16_WORD_SWAP( "01.u64", 0x000000, 0x080000, CRC(fe5bd7f4) SHA1(9c725466112a514c9ed0fb074422d291c175c3f4) )
|
||||
|
||||
/* Secondary CPU is a Toaplan marked chip, (TS-002-MACH TOA PLAN) */
|
||||
/* It's a NEC V25 (PLCC94) (encrypted program uploaded by main CPU) */
|
||||
|
||||
ROM_REGION( 0x200000, "gp9001_0", 0 )
|
||||
ROM_LOAD16_WORD_SWAP( "tp022_3.w92", 0x000000, 0x100000, CRC(191b595f) SHA1(89344946daa18087cc83f92027cf5da659b1c7a5) )
|
||||
ROM_LOAD16_WORD_SWAP( "tp022_4.w93", 0x100000, 0x100000, CRC(d58d29ca) SHA1(90d142fef37764ef817347a2bed77892a288a077) )
|
||||
|
||||
ROM_REGION( 0x400000, "gp9001_1", 0 )
|
||||
ROM_LOAD16_WORD_SWAP( "tp022_5.w16", 0x000000, 0x200000, CRC(d4c1db45) SHA1(f5655467149ba737128c2f54c9c6cdaca6e4c35c) )
|
||||
ROM_LOAD16_WORD_SWAP( "tp022_6.w17", 0x200000, 0x200000, CRC(d48dc74f) SHA1(081b5a00a2ff2bd82b98b30aab3cb5b6ae1014d5) )
|
||||
|
||||
ROM_REGION( 0x40000, "oki", 0 ) /* ADPCM Samples */
|
||||
ROM_LOAD( "tp022_2.w30", 0x00000, 0x40000, CRC(043271b3) SHA1(c7eaa929e55dd956579b824ea9d20a1d0129a925) )
|
||||
ROM_END
|
||||
|
||||
|
||||
// found on a standard TP-022-1 PCB, main CPU ROM had a MR sticker. It's a little closer to the location test than to the released versions (i.e region configuration).
|
||||
ROM_START( dogyuunb )
|
||||
ROM_REGION( 0x080000, "maincpu", 0 ) // Main 68K code
|
||||
ROM_LOAD16_WORD_SWAP( "mr.u64", 0x000000, 0x080000, CRC(4dc258dc) SHA1(ac2783030a8367a20bfad282942c2aa383156291) ) // M27C4002
|
||||
|
||||
// Secondary CPU is a Toaplan marked chip, (TS-002-MACH TOA PLAN)
|
||||
// It's a NEC V25 (PLCC94) (encrypted program uploaded by main CPU)
|
||||
|
||||
ROM_REGION( 0x200000, "gp9001_0", 0 )
|
||||
ROM_LOAD16_WORD_SWAP( "tp022_3.w92", 0x000000, 0x100000, CRC(191b595f) SHA1(89344946daa18087cc83f92027cf5da659b1c7a5) )
|
||||
ROM_LOAD16_WORD_SWAP( "tp022_4.w93", 0x100000, 0x100000, CRC(d58d29ca) SHA1(90d142fef37764ef817347a2bed77892a288a077) )
|
||||
|
||||
ROM_REGION( 0x400000, "gp9001_1", 0 )
|
||||
ROM_LOAD16_WORD_SWAP( "tp022_5.w16", 0x000000, 0x200000, CRC(d4c1db45) SHA1(f5655467149ba737128c2f54c9c6cdaca6e4c35c) )
|
||||
ROM_LOAD16_WORD_SWAP( "tp022_6.w17", 0x200000, 0x200000, CRC(d48dc74f) SHA1(081b5a00a2ff2bd82b98b30aab3cb5b6ae1014d5) )
|
||||
|
||||
ROM_REGION( 0x40000, "oki", 0 )
|
||||
ROM_LOAD( "tp022_2.w30", 0x00000, 0x40000, CRC(043271b3) SHA1(c7eaa929e55dd956579b824ea9d20a1d0129a925) )
|
||||
ROM_END
|
||||
|
||||
|
||||
ROM_START( dogyuunt )
|
||||
ROM_REGION( 0x080000, "maincpu", 0 ) /* Main 68K code */
|
||||
ROM_LOAD16_WORD_SWAP( "sample10.9.u64.bin", 0x000000, 0x080000, CRC(585f5016) SHA1(18d57843f33a560a3bb4b6aef176f7ef795b742d) )
|
||||
|
||||
/* Secondary CPU is a Toaplan marked chip, (TS-002-MACH TOA PLAN) */
|
||||
/* It's a NEC V25 (PLCC94) (encrypted program uploaded by main CPU) */
|
||||
|
||||
ROM_REGION( 0x200000, "gp9001_0", 0 )
|
||||
ROM_LOAD16_WORD_SWAP( "tp022_3.w92", 0x000000, 0x100000, CRC(191b595f) SHA1(89344946daa18087cc83f92027cf5da659b1c7a5) )
|
||||
ROM_LOAD16_WORD_SWAP( "tp022_4.w93", 0x100000, 0x100000, CRC(d58d29ca) SHA1(90d142fef37764ef817347a2bed77892a288a077) )
|
||||
|
||||
ROM_REGION( 0x400000, "gp9001_1", 0 )
|
||||
ROM_LOAD16_WORD_SWAP( "tp022_5.w16", 0x000000, 0x200000, CRC(d4c1db45) SHA1(f5655467149ba737128c2f54c9c6cdaca6e4c35c) )
|
||||
ROM_LOAD16_WORD_SWAP( "tp022_6.w17", 0x200000, 0x200000, CRC(d48dc74f) SHA1(081b5a00a2ff2bd82b98b30aab3cb5b6ae1014d5) )
|
||||
|
||||
ROM_REGION( 0x40000, "oki", 0 ) /* ADPCM Samples */
|
||||
ROM_LOAD( "tp022_2.w30", 0x00000, 0x40000, CRC(043271b3) SHA1(c7eaa929e55dd956579b824ea9d20a1d0129a925) )
|
||||
ROM_END
|
||||
|
||||
|
||||
/*
|
||||
This set came on a TX-022 PCB (different from the final version, TP-022).
|
||||
Seems the game is always in 'debug mode' according to the test menu (dip has no effect). Still, it has no invicibility effect.
|
||||
Couldn't find a read for the region settings jumpers.
|
||||
Hardware differences according to the dumper:
|
||||
* Two GCUs have nearly identical sections copy-pasted, one above the other.
|
||||
* Toaplan HK-1000 ceramic module is used for inputs; the final implements the logic separately.
|
||||
* Inputs mapped in the main CPU address space.
|
||||
* No NEC V25 sound CPU; instead, there is a Z80 with its own ROM.
|
||||
* Sound amp pinout is reversed; mounted to the underside as a bodge fix (this is how I received it).
|
||||
* Board is marked "TX-022" instead of "TP-022". A halfway point from the development code "GX-022"
|
||||
*/
|
||||
ROM_START( dogyuunto )
|
||||
ROM_REGION( 0x080000, "maincpu", 0 )
|
||||
ROM_LOAD16_WORD_SWAP( "8-25.u11", 0x000000, 0x080000, CRC(4d3c952f) SHA1(194f3065c513238921047ead8b425c3d0538b9a7) ) // real hand-written label is '8/25'
|
||||
|
||||
ROM_REGION( 0x08000, "audiocpu", 0 )
|
||||
ROM_LOAD( "u25", 0x00000, 0x08000, CRC(41a34a7e) SHA1(c4f7833249436fd064c7088c9776d12dee4a7d39) ) // only had a white label
|
||||
|
||||
// the GP9001 mask ROMs were not dumped for this set, but the ROM codes match so they are believed identical
|
||||
ROM_REGION( 0x200000, "gp9001_0", 0 )
|
||||
ROM_LOAD16_WORD_SWAP( "tp022_3.w92", 0x000000, 0x100000, CRC(191b595f) SHA1(89344946daa18087cc83f92027cf5da659b1c7a5) )
|
||||
ROM_LOAD16_WORD_SWAP( "tp022_4.w93", 0x100000, 0x100000, CRC(d58d29ca) SHA1(90d142fef37764ef817347a2bed77892a288a077) )
|
||||
|
||||
ROM_REGION( 0x400000, "gp9001_1", 0 )
|
||||
ROM_LOAD16_WORD_SWAP( "tp022_5.w16", 0x000000, 0x200000, CRC(d4c1db45) SHA1(f5655467149ba737128c2f54c9c6cdaca6e4c35c) )
|
||||
ROM_LOAD16_WORD_SWAP( "tp022_6.w17", 0x200000, 0x200000, CRC(d48dc74f) SHA1(081b5a00a2ff2bd82b98b30aab3cb5b6ae1014d5) )
|
||||
|
||||
// this may have some corruption (only 24, apparently random, bytes differ from the standard ROM), however preserve it for now until it has been verified.
|
||||
ROM_REGION( 0x40000, "oki", 0 )
|
||||
ROM_LOAD( "2m.u29", 0x00000, 0x40000, CRC(5e7a77d8) SHA1(da6beb5e8e015965ff42fd52f5aa0c0ae5bcee4f) ) // '2M' hand-written
|
||||
ROM_END
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
GAME( 1992, dogyuun, 0, dogyuun, dogyuun, dogyuun_state, empty_init, ROT270, "Toaplan", "Dogyuun", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1992, dogyuuna, dogyuun, dogyuun, dogyuuna, dogyuun_state, empty_init, ROT270, "Toaplan", "Dogyuun (older set)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1992, dogyuunb, dogyuun, dogyuun, dogyuunt, dogyuun_state, empty_init, ROT270, "Toaplan", "Dogyuun (oldest set)", MACHINE_SUPPORTS_SAVE ) // maybe a newer location test version, instead
|
||||
GAME( 1992, dogyuunt, dogyuun, dogyuun, dogyuunt, dogyuun_state, empty_init, ROT270, "Toaplan", "Dogyuun (10/9/1992 location test)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1992, dogyuunto, dogyuun, dogyuunto, dogyuunt, dogyuunto_state, empty_init, ROT270, "Toaplan", "Dogyuun (8/25/1992 location test)", MACHINE_SUPPORTS_SAVE )
|
@ -21,6 +21,7 @@
|
||||
|
||||
#include "emu.h"
|
||||
#include "toaplipt.h"
|
||||
#include "toaplan_v25_tables.h"
|
||||
#include "gp9001.h"
|
||||
|
||||
#include "cpu/m68000/m68000.h"
|
||||
@ -35,10 +36,12 @@
|
||||
#include "speaker.h"
|
||||
#include "tilemap.h"
|
||||
|
||||
class toaplan2_dt7_state : public driver_device
|
||||
namespace {
|
||||
|
||||
class dt7_state : public driver_device
|
||||
{
|
||||
public:
|
||||
toaplan2_dt7_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
dt7_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: driver_device(mconfig, type, tag)
|
||||
, m_maincpu(*this, "maincpu")
|
||||
, m_subcpu(*this, "subcpu")
|
||||
@ -60,7 +63,7 @@ protected:
|
||||
virtual void video_start() override;
|
||||
|
||||
private:
|
||||
void toaplan2_dt7_reset(int state);
|
||||
void dt7_reset(int state);
|
||||
|
||||
u32 screen_update_dt7_1(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
u32 screen_update_dt7_2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
@ -86,14 +89,9 @@ private:
|
||||
uint8_t read_port_2();
|
||||
void write_port_2(uint8_t data);
|
||||
|
||||
u16 video_count_r();
|
||||
|
||||
u8 dt7_shared_ram_hack_r(offs_t offset);
|
||||
void shared_ram_w(offs_t offset, u8 data);
|
||||
|
||||
// We encode priority with colour in the tilemaps, so need a larger palette
|
||||
static constexpr unsigned T2PALETTE_LENGTH = 0x10000;
|
||||
|
||||
void screen_vblank(int state);
|
||||
|
||||
tilemap_t *m_tx_tilemap[2]; /* Tilemap for extra-text-layer */
|
||||
@ -114,77 +112,7 @@ private:
|
||||
};
|
||||
|
||||
|
||||
// single byte default-opcode
|
||||
#define UNKO 0xfc
|
||||
|
||||
// complete guess, wrong, just to get correct opcode size for DASM
|
||||
|
||||
#define G_62 0xa0 // very likely wrong (or is it?)
|
||||
|
||||
// some kind of branch, not sure which
|
||||
// it's used after compares in blocks, sometimes with a 'be' then a 'br' straight after, so it must be a condition that could also fail a be and fall to the br
|
||||
//#define G_B0 0x74
|
||||
#define G_B0 0x79
|
||||
//#define G_B0 0x75
|
||||
|
||||
// 6b @ 73827
|
||||
#define G_6B 0x34 // must be a 2 byte operation on al? after an AND, 2nd byte is 0x08
|
||||
|
||||
// 59 @ 73505 and 7379B (maybe ret?, or di?)
|
||||
//#define G_59 0xfa
|
||||
#define G_59 0xc3
|
||||
|
||||
static const u8 dt7_decryption_table[256] = {
|
||||
// 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, 0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f, /* 00 */
|
||||
UNKO,0xea,0x8a,0x51,0x8b,UNKO,0x48,0x3c, 0x75,0x50,0x75,0x88,0x03,0x03,UNKO,0x36,
|
||||
|
||||
// 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, 0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f, /* 10 */
|
||||
0x8a,0x0f,0x8a,0x3c,0xe2,0xe8,0xc6,0xc7, 0x24,0x4d,0x68,0x3e,0x0c,0x33,0xbb,UNKO,
|
||||
|
||||
// 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, 0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f, /* 20 */
|
||||
0xbb,0xc6,0x1f,0x36,0x24,0xeb,0xe8,UNKO, 0x02,0x38,0x0f,0x45,0x8d,0x45,0x36,0xc6,
|
||||
|
||||
// 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, 0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f, /* 30 */
|
||||
0x53,0x8b,0x81,0x22,0xf9,0xbe,0x75,0x55, 0x45,0x51,0x5d,0x3e,0x0f,0x88,0x72,0x74,
|
||||
|
||||
// 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47, 0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f, /* 40 */
|
||||
0x1e,0xb7,0x50,0xd0,0xe2,0xb1,0x0a,0xf3, 0xc7,0xff,0x8a,0x75,0x88,0xb5,UNKO,0xb3,
|
||||
|
||||
// 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, 0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f, /* 50 */
|
||||
0xc3,0x80,0x53,0x59,0x88,UNKO,0x87,0x45, 0x03,G_59,0x0c,0x36,0x5f,0x16,0x55,UNKO,
|
||||
|
||||
// 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, 0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f, /* 60 */
|
||||
0x0a,UNKO,G_62,0x89,0x88,0x57,0x2e,0xb1, 0x75,0x43,0x3a,G_6B,0x86,0x3a,0x03,0x58,
|
||||
|
||||
// 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, 0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f, /* 70 */
|
||||
0x46,0x33,0xe8,0x0f,0x0f,0xbb,0x59,0xc7, 0x2e,0xc6,0x53,0x3a,0xc0,0xfe,0x02,0x47,
|
||||
|
||||
// 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f, /* 80 */
|
||||
0xa0,0x2c,0xeb,0x24,UNKO,0xc3,0x8a,0x8e, 0x16,0x74,0x8a,0x33,0x4b,0x05,0x89,0x79,
|
||||
|
||||
// 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, 0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f, /* 90 */
|
||||
0xb4,0xd2,0x0f,0xbd,0xfb,0x3e,0x22,0x2a, 0x47,0xfe,0x8a,0xc3,0x03,0x5e,0xb3,0x07,
|
||||
|
||||
// 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7, 0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf, /* a0 */
|
||||
0x86,0x1b,0x81,0xf3,0x86,0xe9,0x53,0x74, 0x80,0xab,0xb1,0xc3,0xd0,0x88,0x2e,0xa4,
|
||||
|
||||
// 0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7, 0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf, /* b0 */
|
||||
G_B0,0x5b,0x87,UNKO,0xc3,0x8c,0xff,0x8a, 0x50,0xeb,0x56,0x0c,UNKO,0xfc,0x83,0x74,
|
||||
|
||||
// 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7, 0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf, /* c0 */
|
||||
0x26,UNKO,0xfe,0xbd,0x03,0xfe,0xb4,0xfe, 0x06,0xb8,0xc6,UNKO,0x45,0x73,0xb5,0x51,
|
||||
|
||||
// 0xd0,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7, 0xd8,0xd9,0xda,0xdb,0xdc,0xdd,0xde,0xdf, /* d0 */
|
||||
UNKO,0xa4,0xf9,0xc0,0x5b,0xab,0xf6,UNKO, 0x32,0xd3,0xeb,0xb9,0x73,0x89,0xbd,0x4d,
|
||||
|
||||
// 0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7, 0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef, /* e0 */
|
||||
0xb8,0xb9,0x74,0x07,0x0a,0xb0,0x4f,0x0f, 0xe8,0x47,0xeb,0x50,0xd1,0xd0,0x5d,0x72,
|
||||
|
||||
// 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7, 0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff, /* f0 */
|
||||
0x2e,0xe2,0xc1,0xe8,0xa2,0x53,0x0f,0x73, 0x3a,0xbf,0xbb,0x46,0x1a,0x3c,0x1a,0xbc,
|
||||
};
|
||||
|
||||
void toaplan2_dt7_state::dt7_irq(int state)
|
||||
void dt7_state::dt7_irq(int state)
|
||||
{
|
||||
// only the first VDP gets IRQ acked, so does it trigger both CPUs, or does the main CPU then trigger sub?
|
||||
m_maincpu->set_input_line(4, state ? ASSERT_LINE : CLEAR_LINE);
|
||||
@ -200,12 +128,12 @@ void toaplan2_dt7_state::dt7_irq(int state)
|
||||
|
||||
|
||||
// this is conditional on the unknown type of branch (see #define G_B0 in the table0
|
||||
uint8_t toaplan2_dt7_state::read_port_t()
|
||||
uint8_t dt7_state::read_port_t()
|
||||
{
|
||||
logerror("%s: read port t\n", machine().describe_context()); return machine().rand();
|
||||
}
|
||||
|
||||
uint8_t toaplan2_dt7_state::read_port_2()
|
||||
uint8_t dt7_state::read_port_2()
|
||||
{
|
||||
logerror("%s: read port 2\n", machine().describe_context());
|
||||
|
||||
@ -215,7 +143,7 @@ uint8_t toaplan2_dt7_state::read_port_2()
|
||||
// it seems to attempt to read inputs (including the tilt switch?) here on startup
|
||||
// strangely all the EEPROM access code (which is otherwise very similar to FixEight
|
||||
// also has accesses to this port added, maybe something is sitting in the middle?
|
||||
void toaplan2_dt7_state::write_port_2(uint8_t data)
|
||||
void dt7_state::write_port_2(uint8_t data)
|
||||
{
|
||||
if ((m_ioport_state & 0x01) != (data & 0x01))
|
||||
{
|
||||
@ -286,7 +214,7 @@ void toaplan2_dt7_state::write_port_2(uint8_t data)
|
||||
|
||||
|
||||
// hacks because the sound CPU isn't running properly
|
||||
u8 toaplan2_dt7_state::dt7_shared_ram_hack_r(offs_t offset)
|
||||
u8 dt7_state::dt7_shared_ram_hack_r(offs_t offset)
|
||||
{
|
||||
u16 ret = m_shared_ram[offset];
|
||||
|
||||
@ -315,67 +243,67 @@ u8 toaplan2_dt7_state::dt7_shared_ram_hack_r(offs_t offset)
|
||||
return ret;
|
||||
}
|
||||
|
||||
void toaplan2_dt7_state::shared_ram_w(offs_t offset, u8 data)
|
||||
void dt7_state::shared_ram_w(offs_t offset, u8 data)
|
||||
{
|
||||
m_shared_ram[offset] = data;
|
||||
}
|
||||
|
||||
|
||||
void toaplan2_dt7_state::dt7_unk_w(u8 data)
|
||||
void dt7_state::dt7_unk_w(u8 data)
|
||||
{
|
||||
m_audiocpu->set_input_line(INPUT_LINE_RESET, (data & 0x80) ? CLEAR_LINE : ASSERT_LINE);
|
||||
}
|
||||
|
||||
|
||||
void toaplan2_dt7_state::dt7_68k_0_mem(address_map &map)
|
||||
void dt7_state::dt7_68k_0_mem(address_map &map)
|
||||
{
|
||||
map(0x000000, 0x07ffff).rom();
|
||||
map(0x100000, 0x10ffff).ram();
|
||||
|
||||
map(0x380000, 0x380001).r(FUNC(toaplan2_dt7_state::video_count_r));
|
||||
map(0x380000, 0x380001).r(m_vdp[0], FUNC(gp9001vdp_device::vdpcount_r));
|
||||
|
||||
map(0x200000, 0x200fff).ram().w(m_palette[0], FUNC(palette_device::write16)).share("palette0");
|
||||
map(0x280000, 0x280fff).ram().w(m_palette[1], FUNC(palette_device::write16)).share("palette1");
|
||||
|
||||
map(0x300000, 0x300000).w(FUNC(toaplan2_dt7_state::dt7_unk_w));
|
||||
map(0x300000, 0x300000).w(FUNC(dt7_state::dt7_unk_w));
|
||||
|
||||
map(0x400000, 0x40000d).rw(m_vdp[0], FUNC(gp9001vdp_device::read), FUNC(gp9001vdp_device::write));
|
||||
map(0x480000, 0x48000d).rw(m_vdp[1], FUNC(gp9001vdp_device::read), FUNC(gp9001vdp_device::write));
|
||||
|
||||
dt7_shared_mem(map);
|
||||
|
||||
map(0x610000, 0x61ffff).rw(FUNC(toaplan2_dt7_state::dt7_shared_ram_hack_r), FUNC(toaplan2_dt7_state::shared_ram_w)).umask16(0x00ff);
|
||||
// map(0x620000, 0x62ffff).rw(FUNC(toaplan2_dt7_state::dt7_shared_ram_hack_r), FUNC(toaplan2_dt7_state::shared_ram_w)).umask16(0x00ff);
|
||||
map(0x610000, 0x61ffff).rw(FUNC(dt7_state::dt7_shared_ram_hack_r), FUNC(dt7_state::shared_ram_w)).umask16(0x00ff);
|
||||
// map(0x620000, 0x62ffff).rw(FUNC(dt7_state::dt7_shared_ram_hack_r), FUNC(dt7_state::shared_ram_w)).umask16(0x00ff);
|
||||
}
|
||||
|
||||
void toaplan2_dt7_state::dt7_shared_mem(address_map &map)
|
||||
void dt7_state::dt7_shared_mem(address_map &map)
|
||||
{
|
||||
map(0x500000, 0x50ffff).ram().share("shared_ram2");
|
||||
// is this really in the middle of shared RAM, or is there a DMA to get it out?
|
||||
map(0x509000, 0x50afff).ram().w(FUNC(toaplan2_dt7_state::tx_videoram_dt7_w)).share("tx_videoram");
|
||||
map(0x509000, 0x50afff).ram().w(FUNC(dt7_state::tx_videoram_dt7_w)).share("tx_videoram");
|
||||
|
||||
}
|
||||
void toaplan2_dt7_state::dt7_68k_1_mem(address_map &map)
|
||||
void dt7_state::dt7_68k_1_mem(address_map &map)
|
||||
{
|
||||
map(0x000000, 0x07ffff).rom().mirror(0x80000); // mirror needed or road doesn't draw
|
||||
dt7_shared_mem(map);
|
||||
}
|
||||
|
||||
|
||||
uint8_t toaplan2_dt7_state::unmapped_v25_io1_r()
|
||||
uint8_t dt7_state::unmapped_v25_io1_r()
|
||||
{
|
||||
logerror("%s: 0x58008 unknown read\n", machine().describe_context());
|
||||
return machine().rand();
|
||||
}
|
||||
|
||||
uint8_t toaplan2_dt7_state::unmapped_v25_io2_r()
|
||||
uint8_t dt7_state::unmapped_v25_io2_r()
|
||||
{
|
||||
logerror("%s: 0x5800a unknown read\n", machine().describe_context());
|
||||
return machine().rand();
|
||||
}
|
||||
|
||||
|
||||
void toaplan2_dt7_state::dt7_v25_mem(address_map &map)
|
||||
void dt7_state::dt7_v25_mem(address_map &map)
|
||||
{
|
||||
// exact mirroring unknown, don't cover up where the inputs/sound maps
|
||||
map(0x00000, 0x07fff).ram().share("shared_ram");
|
||||
@ -390,11 +318,11 @@ void toaplan2_dt7_state::dt7_v25_mem(address_map &map)
|
||||
map(0x58002, 0x58002).rw(m_oki[0], FUNC(okim6295_device::read), FUNC(okim6295_device::write));
|
||||
map(0x58004, 0x58005).rw("ymsnd2", FUNC(ym2151_device::read), FUNC(ym2151_device::write));
|
||||
map(0x58006, 0x58006).rw(m_oki[1], FUNC(okim6295_device::read), FUNC(okim6295_device::write));
|
||||
map(0x58008, 0x58008).r(FUNC(toaplan2_dt7_state::unmapped_v25_io1_r));
|
||||
map(0x5800a, 0x5800a).r(FUNC(toaplan2_dt7_state::unmapped_v25_io2_r));
|
||||
map(0x58008, 0x58008).r(FUNC(dt7_state::unmapped_v25_io1_r));
|
||||
map(0x5800a, 0x5800a).r(FUNC(dt7_state::unmapped_v25_io2_r));
|
||||
}
|
||||
|
||||
void toaplan2_dt7_state::toaplan2_dt7_reset(int state)
|
||||
void dt7_state::dt7_reset(int state)
|
||||
{
|
||||
//if (m_audiocpu != nullptr)
|
||||
// m_audiocpu->pulse_input_line(INPUT_LINE_RESET, attotime::zero);
|
||||
@ -411,22 +339,22 @@ static GFXDECODE_START( gfx_textrom_double_1 )
|
||||
GFXDECODE_ENTRY( "text_1", 0, gfx_8x8x4_packed_msb, 0, 128 )
|
||||
GFXDECODE_END
|
||||
|
||||
void toaplan2_dt7_state::dt7(machine_config &config)
|
||||
void dt7_state::dt7(machine_config &config)
|
||||
{
|
||||
/* basic machine hardware */
|
||||
M68000(config, m_maincpu, 32_MHz_XTAL/2);
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &toaplan2_dt7_state::dt7_68k_0_mem);
|
||||
m_maincpu->reset_cb().set(FUNC(toaplan2_dt7_state::toaplan2_dt7_reset));
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &dt7_state::dt7_68k_0_mem);
|
||||
m_maincpu->reset_cb().set(FUNC(dt7_state::dt7_reset));
|
||||
|
||||
M68000(config, m_subcpu, 32_MHz_XTAL/2);
|
||||
m_subcpu->set_addrmap(AS_PROGRAM, &toaplan2_dt7_state::dt7_68k_1_mem);
|
||||
m_subcpu->set_addrmap(AS_PROGRAM, &dt7_state::dt7_68k_1_mem);
|
||||
|
||||
v25_device &audiocpu(V25(config, m_audiocpu, 32_MHz_XTAL/2));
|
||||
audiocpu.set_addrmap(AS_PROGRAM, &toaplan2_dt7_state::dt7_v25_mem);
|
||||
audiocpu.set_decryption_table(dt7_decryption_table);
|
||||
audiocpu.pt_in_cb().set(FUNC(toaplan2_dt7_state::read_port_t));
|
||||
audiocpu.p2_in_cb().set(FUNC(toaplan2_dt7_state::read_port_2));
|
||||
audiocpu.p2_out_cb().set(FUNC(toaplan2_dt7_state::write_port_2));
|
||||
audiocpu.set_addrmap(AS_PROGRAM, &dt7_state::dt7_v25_mem);
|
||||
audiocpu.set_decryption_table(toaplan_v25_tables::dt7_decryption_table);
|
||||
audiocpu.pt_in_cb().set(FUNC(dt7_state::read_port_t));
|
||||
audiocpu.p2_in_cb().set(FUNC(dt7_state::read_port_2));
|
||||
audiocpu.p2_out_cb().set(FUNC(dt7_state::write_port_2));
|
||||
//audiocpu.p1_in_cb().set_ioport("EEPROM");
|
||||
//audiocpu.p1_out_cb().set_ioport("EEPROM");
|
||||
|
||||
@ -439,24 +367,24 @@ void toaplan2_dt7_state::dt7(machine_config &config)
|
||||
SCREEN(config, m_screen[0], SCREEN_TYPE_RASTER);
|
||||
m_screen[0]->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
|
||||
m_screen[0]->set_raw(27_MHz_XTAL/4, 432, 0, 320, 262, 0, 240);
|
||||
m_screen[0]->set_screen_update(FUNC(toaplan2_dt7_state::screen_update_dt7_1));
|
||||
m_screen[0]->screen_vblank().set(FUNC(toaplan2_dt7_state::screen_vblank));
|
||||
m_screen[0]->set_screen_update(FUNC(dt7_state::screen_update_dt7_1));
|
||||
m_screen[0]->screen_vblank().set(FUNC(dt7_state::screen_vblank));
|
||||
m_screen[0]->set_palette(m_palette[0]);
|
||||
|
||||
SCREEN(config, m_screen[1], SCREEN_TYPE_RASTER);
|
||||
m_screen[1]->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
|
||||
m_screen[1]->set_raw(27_MHz_XTAL/4, 432, 0, 320, 262, 0, 240);
|
||||
m_screen[1]->set_screen_update(FUNC(toaplan2_dt7_state::screen_update_dt7_2));
|
||||
//m_screen[1]->screen_vblank().set(FUNC(toaplan2_dt7_state::screen_vblank));
|
||||
m_screen[1]->set_screen_update(FUNC(dt7_state::screen_update_dt7_2));
|
||||
//m_screen[1]->screen_vblank().set(FUNC(dt7_state::screen_vblank));
|
||||
m_screen[1]->set_palette(m_palette[1]);
|
||||
|
||||
PALETTE(config, m_palette[0]).set_format(palette_device::xBGR_555, T2PALETTE_LENGTH);
|
||||
PALETTE(config, m_palette[0]).set_format(palette_device::xBGR_555, gp9001vdp_device::VDP_PALETTE_LENGTH);
|
||||
|
||||
PALETTE(config, m_palette[1]).set_format(palette_device::xBGR_555, T2PALETTE_LENGTH);
|
||||
PALETTE(config, m_palette[1]).set_format(palette_device::xBGR_555, gp9001vdp_device::VDP_PALETTE_LENGTH);
|
||||
|
||||
GP9001_VDP(config, m_vdp[0], 27_MHz_XTAL);
|
||||
m_vdp[0]->set_palette(m_palette[0]);
|
||||
m_vdp[0]->vint_out_cb().set(FUNC(toaplan2_dt7_state::dt7_irq));
|
||||
m_vdp[0]->vint_out_cb().set(FUNC(dt7_state::dt7_irq));
|
||||
m_vdp[0]->set_screen(m_screen[0]);
|
||||
|
||||
GP9001_VDP(config, m_vdp[1], 27_MHz_XTAL);
|
||||
@ -507,31 +435,7 @@ static INPUT_PORTS_START( dt7 )
|
||||
PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", FUNC(eeprom_serial_93cxx_device::do_read))
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
u16 toaplan2_dt7_state::video_count_r()
|
||||
{
|
||||
int vpos = m_screen[0]->vpos();
|
||||
|
||||
u16 video_status = 0xff00; // Set signals inactive
|
||||
|
||||
vpos = (vpos + 15) % 262;
|
||||
|
||||
if (!m_vdp[0]->hsync_r())
|
||||
video_status &= ~0x8000;
|
||||
if (!m_vdp[0]->vsync_r())
|
||||
video_status &= ~0x4000;
|
||||
if (!m_vdp[0]->fblank_r())
|
||||
video_status &= ~0x0100;
|
||||
if (vpos < 256)
|
||||
video_status |= (vpos & 0xff);
|
||||
else
|
||||
video_status |= 0xff;
|
||||
|
||||
return video_status;
|
||||
}
|
||||
|
||||
|
||||
TILE_GET_INFO_MEMBER(toaplan2_dt7_state::get_text_dt7_tile_info)
|
||||
TILE_GET_INFO_MEMBER(dt7_state::get_text_dt7_tile_info)
|
||||
{
|
||||
const u16 attrib = m_tx_videoram[tile_index];
|
||||
const u32 tile_number = attrib & 0x3ff;
|
||||
@ -546,7 +450,7 @@ TILE_GET_INFO_MEMBER(toaplan2_dt7_state::get_text_dt7_tile_info)
|
||||
0);
|
||||
}
|
||||
|
||||
void toaplan2_dt7_state::video_start()
|
||||
void dt7_state::video_start()
|
||||
{
|
||||
/* our current VDP implementation needs this bitmap to work with */
|
||||
m_screen[0]->register_screen_bitmap(m_custom_priority_bitmap);
|
||||
@ -555,14 +459,14 @@ void toaplan2_dt7_state::video_start()
|
||||
|
||||
// a different part of this tilemap is displayed on each screen
|
||||
// each screen has a different palette and uses a ROM in a different location on the PCB
|
||||
m_tx_tilemap[0] = &machine().tilemap().create(*m_gfxdecode[0], tilemap_get_info_delegate(*this, FUNC(toaplan2_dt7_state::get_text_dt7_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 64);
|
||||
m_tx_tilemap[1] = &machine().tilemap().create(*m_gfxdecode[1], tilemap_get_info_delegate(*this, FUNC(toaplan2_dt7_state::get_text_dt7_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 64);
|
||||
m_tx_tilemap[0] = &machine().tilemap().create(*m_gfxdecode[0], tilemap_get_info_delegate(*this, FUNC(dt7_state::get_text_dt7_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 64);
|
||||
m_tx_tilemap[1] = &machine().tilemap().create(*m_gfxdecode[1], tilemap_get_info_delegate(*this, FUNC(dt7_state::get_text_dt7_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 64);
|
||||
|
||||
m_tx_tilemap[0]->set_transparent_pen(0);
|
||||
m_tx_tilemap[1]->set_transparent_pen(0);
|
||||
}
|
||||
|
||||
void toaplan2_dt7_state::tx_videoram_dt7_w(offs_t offset, u16 data, u16 mem_mask)
|
||||
void dt7_state::tx_videoram_dt7_w(offs_t offset, u16 data, u16 mem_mask)
|
||||
{
|
||||
COMBINE_DATA(&m_tx_videoram[offset]);
|
||||
if (offset < 64 * 64)
|
||||
@ -572,7 +476,7 @@ void toaplan2_dt7_state::tx_videoram_dt7_w(offs_t offset, u16 data, u16 mem_mask
|
||||
}
|
||||
}
|
||||
|
||||
u32 toaplan2_dt7_state::screen_update_dt7_1(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
u32 dt7_state::screen_update_dt7_1(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
bitmap.fill(0, cliprect);
|
||||
m_custom_priority_bitmap.fill(0, cliprect);
|
||||
@ -584,7 +488,7 @@ u32 toaplan2_dt7_state::screen_update_dt7_1(screen_device &screen, bitmap_ind16
|
||||
return 0;
|
||||
}
|
||||
|
||||
u32 toaplan2_dt7_state::screen_update_dt7_2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
u32 dt7_state::screen_update_dt7_2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
bitmap.fill(0, cliprect);
|
||||
m_custom_priority_bitmap.fill(0, cliprect);
|
||||
@ -596,7 +500,7 @@ u32 toaplan2_dt7_state::screen_update_dt7_2(screen_device &screen, bitmap_ind16
|
||||
return 0;
|
||||
}
|
||||
|
||||
void toaplan2_dt7_state::screen_vblank(int state)
|
||||
void dt7_state::screen_vblank(int state)
|
||||
{
|
||||
m_vdp[0]->screen_eof();
|
||||
m_vdp[1]->screen_eof();
|
||||
@ -650,5 +554,7 @@ ROM_START( dt7 )
|
||||
ROM_LOAD( "7adpcm.43", 0x00000, 0x40000, CRC(aefce555) SHA1(0d47190287957122fefdae17ccf6bcfaef8cd430) )
|
||||
ROM_END
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
// The region comes from the EEPROM? so will need clones like FixEight
|
||||
GAME( 1993, dt7, 0, dt7, dt7, toaplan2_dt7_state,empty_init, ROT270, "Toaplan", "DT7 (prototype)", MACHINE_NOT_WORKING )
|
||||
GAME( 1993, dt7, 0, dt7, dt7, dt7_state,empty_init, ROT270, "Toaplan", "DT7 (prototype)", MACHINE_NOT_WORKING )
|
||||
|
409
src/mame/toaplan/enmadaio.cpp
Normal file
409
src/mame/toaplan/enmadaio.cpp
Normal file
@ -0,0 +1,409 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:David Haywood
|
||||
|
||||
#include "emu.h"
|
||||
|
||||
#include "emupal.h"
|
||||
#include "screen.h"
|
||||
#include "speaker.h"
|
||||
#include "tilemap.h"
|
||||
|
||||
#include "toaplipt.h"
|
||||
#include "gp9001.h"
|
||||
|
||||
#include "cpu/m68000/m68000.h"
|
||||
#include "sound/okim6295.h"
|
||||
#include "sound/ymopm.h"
|
||||
|
||||
/*
|
||||
Name Board No Maker Game name
|
||||
----------------------------------------------------------------------------
|
||||
enmadaio TP-031 Toaplan Enma Daio
|
||||
*/
|
||||
|
||||
namespace {
|
||||
|
||||
class enmadaio_state : public driver_device
|
||||
{
|
||||
public:
|
||||
enmadaio_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: driver_device(mconfig, type, tag)
|
||||
, m_maincpu(*this, "maincpu")
|
||||
, m_vdp(*this, "gp9001")
|
||||
, m_oki(*this, "oki")
|
||||
, m_screen(*this, "screen")
|
||||
, m_palette(*this, "palette")
|
||||
, m_okibank(*this, "okibank")
|
||||
{ }
|
||||
|
||||
void enmadaio(machine_config &config);
|
||||
|
||||
void init_enmadaio();
|
||||
|
||||
protected:
|
||||
virtual void video_start() override ATTR_COLD;
|
||||
|
||||
private:
|
||||
|
||||
void enmadaio_oki_bank_w(offs_t offset, u16 data, u16 mem_mask = ~0);
|
||||
void enmadaio_68k_mem(address_map &map) ATTR_COLD;
|
||||
void enmadaio_oki(address_map &map) ATTR_COLD;
|
||||
|
||||
u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
void screen_vblank(int state);
|
||||
|
||||
required_device<m68000_base_device> m_maincpu;
|
||||
required_device<gp9001vdp_device> m_vdp;
|
||||
required_device<okim6295_device> m_oki;
|
||||
required_device<screen_device> m_screen;
|
||||
required_device<palette_device> m_palette;
|
||||
required_memory_bank m_okibank;
|
||||
bitmap_ind8 m_custom_priority_bitmap;
|
||||
};
|
||||
|
||||
void enmadaio_state::video_start()
|
||||
{
|
||||
m_screen->register_screen_bitmap(m_custom_priority_bitmap);
|
||||
m_vdp->custom_priority_bitmap = &m_custom_priority_bitmap;
|
||||
}
|
||||
|
||||
u32 enmadaio_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
bitmap.fill(0, cliprect);
|
||||
m_custom_priority_bitmap.fill(0, cliprect);
|
||||
m_vdp->render_vdp(bitmap, cliprect);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void enmadaio_state::screen_vblank(int state)
|
||||
{
|
||||
if (state) // rising edge
|
||||
{
|
||||
m_vdp->screen_eof();
|
||||
}
|
||||
}
|
||||
|
||||
static INPUT_PORTS_START( enmadaio )
|
||||
PORT_START("SYS")
|
||||
PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_SERVICE1 )
|
||||
PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_TILT )
|
||||
TOAPLAN_TEST_SWITCH( 0x04, IP_ACTIVE_HIGH )
|
||||
PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_COIN1 )
|
||||
PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_COIN2 )
|
||||
PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_START1 )
|
||||
PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_START2 )
|
||||
PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNKNOWN )
|
||||
|
||||
PORT_START("DSWA")
|
||||
PORT_DIPNAME( 0x0001, 0x0000, "Game Mode" )
|
||||
PORT_DIPSETTING( 0x0000, "Normal Game" )
|
||||
PORT_DIPSETTING( 0x0001, "Stop and Slow Mode" )
|
||||
PORT_DIPNAME( 0x0002, 0x0000, DEF_STR( Flip_Screen ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0002, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0004, 0x0000, DEF_STR( Unknown ) ) // unused
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0004, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0008, 0x0000, DEF_STR( Demo_Sounds ) )
|
||||
PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0030, 0x0030, DEF_STR( Coin_A ) )
|
||||
PORT_DIPSETTING( 0x0030, DEF_STR( 1C_1C ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( 2C_1C ) )
|
||||
PORT_DIPSETTING( 0x0010, DEF_STR( 3C_1C ) )
|
||||
PORT_DIPSETTING( 0x0020, DEF_STR( 4C_1C ) )
|
||||
PORT_DIPNAME( 0x0040, 0x0000, DEF_STR( Unknown ) ) // unused
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0040, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0080, 0x0000, DEF_STR( Unknown ) ) // unused
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0080, DEF_STR( On ) )
|
||||
|
||||
PORT_START("MISC2") // should be DSWB? but not even read in test mode display?
|
||||
PORT_DIPNAME( 0x0001, 0x0001, "2" )
|
||||
PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
|
||||
PORT_START("MISC3")
|
||||
PORT_DIPNAME( 0x0001, 0x0001, "3" )
|
||||
PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("yes")
|
||||
PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("no")
|
||||
PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
|
||||
PORT_START("MISC4")
|
||||
PORT_DIPNAME( 0x0001, 0x0001, "4" )
|
||||
PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0004, 0x0000, "Status of Something 1" ) // gives error in attract mode otherwise
|
||||
PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0040, 0x0000, "Status of Something 2" ) // turn this off and it comes up with an error
|
||||
PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
|
||||
PORT_START("UNK")
|
||||
PORT_BIT( 0xff, 0x00, IPT_DIAL ) PORT_SENSITIVITY(30) PORT_KEYDELTA(15) // this is the sensor, not sure what it measures, pulse / heartbeat?
|
||||
PORT_DIPNAME( 0x0100, 0x0100, "Freeze" ) // not sure
|
||||
PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
void enmadaio_state::enmadaio_oki_bank_w(offs_t offset, u16 data, u16 mem_mask)
|
||||
{
|
||||
data &= mem_mask;
|
||||
|
||||
if (data < 0x60)
|
||||
{
|
||||
m_okibank->set_entry(data);
|
||||
}
|
||||
else
|
||||
{
|
||||
logerror("enmadaio_oki_bank_w >=0x60 (%04x)\n",data);
|
||||
}
|
||||
}
|
||||
|
||||
void enmadaio_state::enmadaio_68k_mem(address_map &map)
|
||||
{
|
||||
map(0x000000, 0x07ffff).rom();
|
||||
map(0x100000, 0x103fff).ram(); //.share("nvram");
|
||||
map(0x104000, 0x10ffff).ram();
|
||||
|
||||
map(0x200000, 0x20000d).rw(m_vdp, FUNC(gp9001vdp_device::read), FUNC(gp9001vdp_device::write));
|
||||
map(0x300000, 0x300fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
|
||||
map(0x400000, 0x400003).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write)).umask16(0x00ff);
|
||||
map(0x500001, 0x500001).rw(m_oki, FUNC(okim6295_device::read), FUNC(okim6295_device::write));
|
||||
|
||||
map(0x700000, 0x700001).r(m_vdp, FUNC(gp9001vdp_device::vdpcount_r));
|
||||
|
||||
map(0x700004, 0x700005).portr("DSWA");
|
||||
map(0x70000c, 0x70000d).portr("MISC2");
|
||||
map(0x700010, 0x700011).portr("MISC3");
|
||||
map(0x700014, 0x700015).portr("MISC4");
|
||||
map(0x700018, 0x700019).portr("SYS");
|
||||
map(0x70001c, 0x70001d).portr("UNK"); //.portr("SYS");
|
||||
|
||||
map(0x700020, 0x700021).w(FUNC(enmadaio_state::enmadaio_oki_bank_w)); // oki bank
|
||||
|
||||
map(0x700028, 0x700029).nopw();
|
||||
map(0x70003c, 0x70003d).nopw();
|
||||
map(0x70002c, 0x70002d).nopw();
|
||||
}
|
||||
|
||||
void enmadaio_state::enmadaio_oki(address_map &map)
|
||||
{
|
||||
map(0x00000, 0x3ffff).bankr(m_okibank);
|
||||
}
|
||||
|
||||
|
||||
void enmadaio_state::enmadaio(machine_config &config)
|
||||
{
|
||||
/* basic machine hardware */
|
||||
M68000(config, m_maincpu, 20_MHz_XTAL/2);
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &enmadaio_state::enmadaio_68k_mem);
|
||||
|
||||
/* video hardware */
|
||||
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
|
||||
m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
|
||||
m_screen->set_raw(27_MHz_XTAL/4, 432, 0, 320, 262, 0, 240);
|
||||
m_screen->set_screen_update(FUNC(enmadaio_state::screen_update));
|
||||
m_screen->screen_vblank().set(FUNC(enmadaio_state::screen_vblank));
|
||||
m_screen->set_palette(m_palette);
|
||||
|
||||
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, gp9001vdp_device::VDP_PALETTE_LENGTH);
|
||||
|
||||
GP9001_VDP(config, m_vdp, 27_MHz_XTAL);
|
||||
m_vdp->set_palette(m_palette);
|
||||
m_vdp->vint_out_cb().set_inputline(m_maincpu, M68K_IRQ_4);
|
||||
|
||||
/* sound hardware */
|
||||
SPEAKER(config, "mono").front_center();
|
||||
|
||||
YM2151(config, "ymsnd", 27_MHz_XTAL/8).add_route(ALL_OUTPUTS, "mono", 0.5);
|
||||
|
||||
OKIM6295(config, m_oki, 16_MHz_XTAL/4, okim6295_device::PIN7_LOW); // pin7 not confirmed
|
||||
m_oki->set_addrmap(0, &enmadaio_state::enmadaio_oki);
|
||||
m_oki->add_route(ALL_OUTPUTS, "mono", 0.5);
|
||||
}
|
||||
|
||||
void enmadaio_state::init_enmadaio()
|
||||
{
|
||||
u8 *ROM = memregion("oki")->base();
|
||||
|
||||
m_okibank->configure_entries(0, 0x60, ROM, 0x40000);
|
||||
m_okibank->set_entry(0);
|
||||
}
|
||||
|
||||
|
||||
ROM_START( enmadaio )
|
||||
ROM_REGION( 0x080000, "maincpu", 0 )
|
||||
ROM_LOAD16_WORD_SWAP( "03n_u53.c8", 0x00000, 0x80000, CRC(1a6ca2ee) SHA1(13d34a10004ca172db7953e2be8daa90fc5b62ed) )
|
||||
|
||||
ROM_REGION( 0x200000, "gp9001", 0 )
|
||||
ROM_LOAD( "rom4_u30.c19", 0x000000, 0x100000, CRC(7a012d8b) SHA1(a33d9490573a9fd1e799d3fe567f991926851c51) )
|
||||
ROM_LOAD( "rom5_u31.c18", 0x100000, 0x100000, CRC(60b127ab) SHA1(98785dfd6a86b4bd2c9786f6f72796c023b5b73a) )
|
||||
|
||||
ROM_REGION( 0x1800000, "oki", 0 ) /* OKIM6295 samples */ // each rom contains 8 0x40000 banks, there are 12 roms, so 96 (0x60) banks here!
|
||||
ROM_LOAD( "rom6_u65.a1", 0x0000000, 0x0200000, CRC(f33c6c0b) SHA1(06d73cd5b6d27de4d68f2dde1ed4dfa72b9a9178) )
|
||||
ROM_LOAD( "rom7_u66.a3", 0x0200000, 0x0200000, CRC(1306f8b3) SHA1(21b0d3180f1f4af77074c35c66844e38a464fea0) )
|
||||
ROM_LOAD( "rom8_u61.a4", 0x0400000, 0x0200000, CRC(4f211c00) SHA1(b067de95ad595a4915effefb83789e4e3d9db6f9) )
|
||||
ROM_LOAD( "rom9_u62.a6", 0x0600000, 0x0200000, CRC(292d3ef6) SHA1(d027d4c64e57f46e444ee83b62f6c3bdf02e4eed) )
|
||||
ROM_LOAD( "rom10_u67.a8", 0x0800000, 0x0200000, CRC(5219bf86) SHA1(946c8fcf3c04a88517d1a66ccd56609d22da945f) )
|
||||
ROM_LOAD( "rom11_u68.a10", 0x0a00000, 0x0200000, CRC(56fe4b1d) SHA1(2ea0413b435dd178174eb66d38dc9f7ab3d07ba5) )
|
||||
ROM_LOAD( "rom12_u63.a11", 0x0c00000, 0x0200000, CRC(cc48ff18) SHA1(10f6d9f445c9244b797846450f0c94700ccc7367) )
|
||||
ROM_LOAD( "rom13_u64.a13", 0x0e00000, 0x0200000, CRC(a3cd181a) SHA1(6a87479c24a61f7ac940e9c9bb62a18f26c9c843) )
|
||||
ROM_LOAD( "rom14_u69.a14", 0x1000000, 0x0200000, CRC(5d8cddec) SHA1(1912850d065d4ce1a1cdfd5a704218e660b5345b) )
|
||||
ROM_LOAD( "rom15_u70.a16", 0x1200000, 0x0200000, CRC(c75012f5) SHA1(b1ba0abab3eb8e9e3778eecab4951d828c85cecb) )
|
||||
ROM_LOAD( "rom16_u71.a18", 0x1400000, 0x0200000, CRC(efd02b0d) SHA1(b23fa3298fc29086f9ab05bc58775ff47b4cb7a9) )
|
||||
ROM_LOAD( "rom17_u72.a19", 0x1600000, 0x0200000, CRC(6b8717c3) SHA1(b5b7e35deaa2f34bccd1e83844d4bc0be845d0b8) )
|
||||
ROM_END
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
GAME( 1993, enmadaio, 0, enmadaio, enmadaio, enmadaio_state, init_enmadaio, ROT0, "Toaplan / Taito", "Enma Daio (Japan)", 0 ) // TP-031
|
773
src/mame/toaplan/fixeight.cpp
Normal file
773
src/mame/toaplan/fixeight.cpp
Normal file
@ -0,0 +1,773 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Quench, Yochizo, David Haywood
|
||||
|
||||
#include "emu.h"
|
||||
|
||||
#include "emupal.h"
|
||||
#include "screen.h"
|
||||
#include "speaker.h"
|
||||
#include "tilemap.h"
|
||||
|
||||
#include "toaplan_coincounter.h"
|
||||
#include "toaplan_v25_tables.h"
|
||||
#include "toaplipt.h"
|
||||
#include "gp9001.h"
|
||||
|
||||
#include "cpu/m68000/m68000.h"
|
||||
#include "cpu/nec/v25.h"
|
||||
#include "cpu/z80/z80.h"
|
||||
#include "machine/eepromser.h"
|
||||
#include "sound/okim6295.h"
|
||||
#include "sound/ymopm.h"
|
||||
|
||||
/*
|
||||
Name Board No Maker Game name
|
||||
----------------------------------------------------------------------------
|
||||
fixeight TP-026 Toaplan FixEight
|
||||
fixeightbl bootleg Toaplan FixEight
|
||||
|
||||
|
||||
fixeight - The same program is used for all regions, and the region can be changed just by swapping
|
||||
EEPROMs. However, the V25 code also recognizes a secret input that rewrites the EEPROM to
|
||||
use any one of the 14 recognized regional licenses, using the state of the player 1 and
|
||||
player 2 button inputs held in conjunction with it as a 4-bit binary code:
|
||||
|
||||
Region Button input
|
||||
------------------------ ------------------------------------
|
||||
Korea, Taito license No buttons
|
||||
Korea P1 button 1
|
||||
Hong Kong, Taito license P1 button 2
|
||||
Hong Kong P1 buttons 1 & 2
|
||||
Taiwan, Taito license P2 button 1
|
||||
Taiwan P1 button 1 + P2 button 1
|
||||
SE Asia, Taito license P1 button 2 + P2 button 1
|
||||
Southeast Asia P1 buttons 1 & 2 + P2 button 1
|
||||
Europe, Taito license P2 button 2
|
||||
Europe P1 button 1 + P2 button 2
|
||||
USA, Taito license P1 button 2 + P2 button 2
|
||||
USA P1 buttons 1 & 2 + P2 button 2
|
||||
(Invalid) P2 buttons 1 & 2
|
||||
(Invalid) P1 button 1 + P2 buttons 1 & 2
|
||||
Japan P1 button 2 + P2 buttons 1 & 2
|
||||
Japan, Taito license P1 buttons 1 & 2 + P2 buttons 1 & 2
|
||||
|
||||
To Do / Unknowns:
|
||||
- Priority problem on 2nd player side of selection screen in Fixeight bootleg.
|
||||
- Fixeight bootleg text in sound check mode does not display properly
|
||||
with the CPU set to 10MHz (ok at 16MHz). Possible error in video_count_r routine.
|
||||
*/
|
||||
|
||||
namespace {
|
||||
|
||||
class fixeight_state : public driver_device
|
||||
{
|
||||
public:
|
||||
fixeight_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: driver_device(mconfig, type, tag)
|
||||
, m_tx_videoram(*this, "tx_videoram")
|
||||
, m_tx_lineselect(*this, "tx_lineselect")
|
||||
, m_tx_linescroll(*this, "tx_linescroll")
|
||||
, m_tx_gfxram(*this, "tx_gfxram")
|
||||
, m_shared_ram(*this, "shared_ram")
|
||||
, m_maincpu(*this, "maincpu")
|
||||
, m_audiocpu(*this, "audiocpu")
|
||||
, m_vdp(*this, "gp9001")
|
||||
, m_oki(*this, "oki")
|
||||
, m_eeprom(*this, "eeprom")
|
||||
, m_gfxdecode(*this, "gfxdecode")
|
||||
, m_screen(*this, "screen")
|
||||
, m_palette(*this, "palette")
|
||||
{ }
|
||||
|
||||
void fixeight(machine_config &config);
|
||||
void init_fixeight();
|
||||
|
||||
protected:
|
||||
virtual void video_start() override ATTR_COLD;
|
||||
|
||||
virtual void device_post_load() override;
|
||||
|
||||
void fixeight_68k_mem(address_map &map) ATTR_COLD;
|
||||
void fixeight_v25_mem(address_map &map) ATTR_COLD;
|
||||
|
||||
void create_tx_tilemap(int dx = 0, int dx_flipped = 0);
|
||||
|
||||
u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
void screen_vblank(int state);
|
||||
void tx_gfxram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
|
||||
|
||||
u8 shared_ram_r(offs_t offset) { return m_shared_ram[offset]; }
|
||||
void shared_ram_w(offs_t offset, u8 data) { m_shared_ram[offset] = data; }
|
||||
|
||||
void tx_videoram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
|
||||
void tx_linescroll_w(offs_t offset, u16 data, u16 mem_mask = ~0);
|
||||
TILE_GET_INFO_MEMBER(get_text_tile_info);
|
||||
|
||||
void sound_reset_w(u8 data);
|
||||
tilemap_t *m_tx_tilemap = nullptr; /* Tilemap for extra-text-layer */
|
||||
required_shared_ptr<u16> m_tx_videoram;
|
||||
optional_shared_ptr<u16> m_tx_lineselect; // originals only
|
||||
optional_shared_ptr<u16> m_tx_linescroll; // originals only
|
||||
optional_shared_ptr<u16> m_tx_gfxram; // originals only
|
||||
void reset(int state);
|
||||
|
||||
optional_shared_ptr<u8> m_shared_ram; // originals only - 8 bit RAM shared between 68K and sound CPU
|
||||
|
||||
required_device<m68000_base_device> m_maincpu;
|
||||
optional_device<cpu_device> m_audiocpu; // originals only
|
||||
required_device<gp9001vdp_device> m_vdp;
|
||||
required_device<okim6295_device> m_oki;
|
||||
optional_device<eeprom_serial_93cxx_device> m_eeprom; // originals only
|
||||
required_device<gfxdecode_device> m_gfxdecode;
|
||||
required_device<screen_device> m_screen;
|
||||
required_device<palette_device> m_palette;
|
||||
bitmap_ind8 m_custom_priority_bitmap;
|
||||
};
|
||||
|
||||
class fixeight_bootleg_state : public fixeight_state
|
||||
{
|
||||
public:
|
||||
fixeight_bootleg_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: fixeight_state(mconfig, type, tag)
|
||||
, m_okibank(*this, "okibank")
|
||||
{ }
|
||||
|
||||
void fixeightbl(machine_config &config);
|
||||
|
||||
void init_fixeightbl();
|
||||
|
||||
virtual void video_start() override ATTR_COLD;
|
||||
|
||||
void fixeightbl_68k_mem(address_map &map) ATTR_COLD;
|
||||
void cpu_space_fixeightbl_map(address_map &map) ATTR_COLD;
|
||||
|
||||
void fixeightbl_oki(address_map &map) ATTR_COLD;
|
||||
|
||||
void fixeightbl_oki_bankswitch_w(u8 data);
|
||||
|
||||
u32 screen_update_bootleg(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
|
||||
optional_memory_bank m_okibank;
|
||||
};
|
||||
|
||||
|
||||
void fixeight_state::reset(int state)
|
||||
{
|
||||
m_audiocpu->pulse_input_line(INPUT_LINE_RESET, attotime::zero);
|
||||
}
|
||||
|
||||
|
||||
TILE_GET_INFO_MEMBER(fixeight_state::get_text_tile_info)
|
||||
{
|
||||
const u16 attrib = m_tx_videoram[tile_index];
|
||||
const u32 tile_number = attrib & 0x3ff;
|
||||
const u32 color = attrib >> 10;
|
||||
tileinfo.set(0,
|
||||
tile_number,
|
||||
color,
|
||||
0);
|
||||
}
|
||||
|
||||
void fixeight_state::tx_videoram_w(offs_t offset, u16 data, u16 mem_mask)
|
||||
{
|
||||
COMBINE_DATA(&m_tx_videoram[offset]);
|
||||
if (offset < 64*32)
|
||||
m_tx_tilemap->mark_tile_dirty(offset);
|
||||
}
|
||||
|
||||
void fixeight_state::tx_linescroll_w(offs_t offset, u16 data, u16 mem_mask)
|
||||
{
|
||||
/*** Line-Scroll RAM for Text Layer ***/
|
||||
COMBINE_DATA(&m_tx_linescroll[offset]);
|
||||
|
||||
m_tx_tilemap->set_scrollx(offset, m_tx_linescroll[offset]);
|
||||
}
|
||||
|
||||
void fixeight_state::screen_vblank(int state)
|
||||
{
|
||||
// rising edge
|
||||
if (state)
|
||||
{
|
||||
m_vdp->screen_eof();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void fixeight_state::create_tx_tilemap(int dx, int dx_flipped)
|
||||
{
|
||||
m_tx_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(fixeight_state::get_text_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32);
|
||||
|
||||
m_tx_tilemap->set_scroll_rows(8*32); /* line scrolling */
|
||||
m_tx_tilemap->set_scroll_cols(1);
|
||||
m_tx_tilemap->set_scrolldx(dx, dx_flipped);
|
||||
m_tx_tilemap->set_transparent_pen(0);
|
||||
}
|
||||
|
||||
u32 fixeight_bootleg_state::screen_update_bootleg(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
bitmap.fill(0, cliprect);
|
||||
m_custom_priority_bitmap.fill(0, cliprect);
|
||||
m_vdp->render_vdp(bitmap, cliprect);
|
||||
m_tx_tilemap->draw(screen, bitmap, cliprect, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void fixeight_bootleg_state::video_start()
|
||||
{
|
||||
m_screen->register_screen_bitmap(m_custom_priority_bitmap);
|
||||
m_vdp->custom_priority_bitmap = &m_custom_priority_bitmap;
|
||||
|
||||
create_tx_tilemap();
|
||||
|
||||
/* This bootleg has additional layer offsets on the VDP */
|
||||
m_vdp->set_tm_extra_offsets(0, -0x1d6 - 26, -0x1ef - 15, 0, 0);
|
||||
m_vdp->set_tm_extra_offsets(1, -0x1d8 - 22, -0x1ef - 15, 0, 0);
|
||||
m_vdp->set_tm_extra_offsets(2, -0x1da - 18, -0x1ef - 15, 0, 0);
|
||||
m_vdp->set_sp_extra_offsets(8/*-0x1cc - 64*/, 8/*-0x1ef - 128*/, 0, 0);
|
||||
|
||||
m_vdp->init_scroll_regs();
|
||||
}
|
||||
|
||||
|
||||
void fixeight_state::video_start()
|
||||
{
|
||||
m_screen->register_screen_bitmap(m_custom_priority_bitmap);
|
||||
m_vdp->custom_priority_bitmap = &m_custom_priority_bitmap;
|
||||
|
||||
m_gfxdecode->gfx(0)->set_source(reinterpret_cast<u8 *>(m_tx_gfxram.target()));
|
||||
create_tx_tilemap(0x1d5, 0x16a);
|
||||
}
|
||||
|
||||
|
||||
u32 fixeight_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
bitmap.fill(0, cliprect);
|
||||
m_custom_priority_bitmap.fill(0, cliprect);
|
||||
m_vdp->render_vdp(bitmap, cliprect);
|
||||
|
||||
rectangle clip = cliprect;
|
||||
|
||||
/* it seems likely that flipx can be set per line! */
|
||||
/* however, none of the games does it, and emulating it in the */
|
||||
/* MAME tilemap system without being ultra slow would be tricky */
|
||||
m_tx_tilemap->set_flip(m_tx_lineselect[0] & 0x8000 ? 0 : TILEMAP_FLIPX);
|
||||
|
||||
/* line select is used for 'for use in' and '8ing' screen on bbakraid, 'Raizing' logo on batrider */
|
||||
for (int y = cliprect.min_y; y <= cliprect.max_y; y++)
|
||||
{
|
||||
clip.min_y = clip.max_y = y;
|
||||
m_tx_tilemap->set_scrolly(0, m_tx_lineselect[y] - y);
|
||||
m_tx_tilemap->draw(screen, bitmap, clip, 0);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void fixeight_state::tx_gfxram_w(offs_t offset, u16 data, u16 mem_mask)
|
||||
{
|
||||
/*** Dynamic GFX decoding for Truxton 2 / FixEight ***/
|
||||
|
||||
const u16 oldword = m_tx_gfxram[offset];
|
||||
|
||||
if (oldword != data)
|
||||
{
|
||||
COMBINE_DATA(&m_tx_gfxram[offset]);
|
||||
m_gfxdecode->gfx(0)->mark_dirty(offset/32);
|
||||
}
|
||||
}
|
||||
|
||||
void fixeight_state::device_post_load()
|
||||
{
|
||||
if (m_tx_gfxram != nullptr)
|
||||
m_gfxdecode->gfx(0)->mark_all_dirty();
|
||||
}
|
||||
|
||||
|
||||
static INPUT_PORTS_START( fixeight )
|
||||
// The Suicide buttons are technically P1 and P2 Button 3, but we hook
|
||||
// them up as IPT_OTHER so each player has the same number of buttons.
|
||||
PORT_START("IN1")
|
||||
PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_8WAY
|
||||
PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_8WAY
|
||||
PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_8WAY
|
||||
PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_8WAY
|
||||
PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1)
|
||||
PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1)
|
||||
PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P1 Suicide (Cheat)")
|
||||
PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNKNOWN )
|
||||
PORT_BIT( 0xff00, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // Unknown/Unused
|
||||
|
||||
PORT_START("IN2")
|
||||
PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2) PORT_8WAY
|
||||
PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) PORT_8WAY
|
||||
PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) PORT_8WAY
|
||||
PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) PORT_8WAY
|
||||
PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2)
|
||||
PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2)
|
||||
PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P2 Suicide (Cheat)")
|
||||
PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNKNOWN )
|
||||
PORT_BIT( 0xff00, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // Unknown/Unused
|
||||
|
||||
PORT_START("IN3")
|
||||
PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(3) PORT_8WAY
|
||||
PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(3) PORT_8WAY
|
||||
PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(3) PORT_8WAY
|
||||
PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(3) PORT_8WAY
|
||||
PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(3)
|
||||
PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(3)
|
||||
PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_START3 )
|
||||
PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_MEMORY_RESET ) PORT_NAME("Region Reset")
|
||||
PORT_BIT( 0xff00, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // Unknown/Unused
|
||||
|
||||
PORT_START("SYS")
|
||||
PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_COIN3 )
|
||||
PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_TILT )
|
||||
PORT_SERVICE_NO_TOGGLE(0x0004, IP_ACTIVE_HIGH) // Service input is a pushbutton marked 'Test SW'
|
||||
PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_COIN1 )
|
||||
PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_COIN2 )
|
||||
PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_START1 )
|
||||
PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_START2 )
|
||||
PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNKNOWN )
|
||||
PORT_BIT( 0xff00, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // Unknown/Unused
|
||||
|
||||
PORT_START("EEPROM")
|
||||
PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", FUNC(eeprom_serial_93cxx_device::cs_write))
|
||||
PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", FUNC(eeprom_serial_93cxx_device::clk_write))
|
||||
PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("eeprom", FUNC(eeprom_serial_93cxx_device::di_write))
|
||||
PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", FUNC(eeprom_serial_93cxx_device::do_read))
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
static INPUT_PORTS_START( 2b )
|
||||
PORT_START("IN1")
|
||||
TOAPLAN_JOY_UDLR_2_BUTTONS( 1 )
|
||||
|
||||
PORT_START("IN2")
|
||||
TOAPLAN_JOY_UDLR_2_BUTTONS( 2 )
|
||||
|
||||
PORT_START("SYS")
|
||||
PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_SERVICE1 )
|
||||
PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_TILT )
|
||||
TOAPLAN_TEST_SWITCH( 0x04, IP_ACTIVE_HIGH )
|
||||
PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_COIN1 )
|
||||
PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_COIN2 )
|
||||
PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_START1 )
|
||||
PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_START2 )
|
||||
PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNKNOWN )
|
||||
|
||||
PORT_START("DSWA")
|
||||
TOAPLAN_MACHINE_NO_COCKTAIL_LOC(SW1)
|
||||
// Coinage on bit mask 0x00f0
|
||||
PORT_BIT( 0x00f0, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // Modified below
|
||||
|
||||
PORT_START("DSWB")
|
||||
TOAPLAN_DIFFICULTY_LOC(SW2)
|
||||
// Per-game features on bit mask 0x00fc
|
||||
PORT_BIT( 0x00fc, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // Modified below
|
||||
INPUT_PORTS_END
|
||||
|
||||
static INPUT_PORTS_START( fixeightbl )
|
||||
PORT_INCLUDE( 2b )
|
||||
|
||||
PORT_MODIFY("SYS")
|
||||
PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_COIN3 )
|
||||
PORT_SERVICE_NO_TOGGLE(0x0004, IP_ACTIVE_HIGH) // Service input is a pushbutton marked 'Test SW'
|
||||
|
||||
PORT_START("IN3")
|
||||
PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(3) PORT_8WAY
|
||||
PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(3) PORT_8WAY
|
||||
PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(3) PORT_8WAY
|
||||
PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(3) PORT_8WAY
|
||||
PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(3)
|
||||
PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(3)
|
||||
PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_START3 )
|
||||
PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNKNOWN )
|
||||
PORT_BIT( 0xff00, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // Unknown/Unused
|
||||
|
||||
PORT_MODIFY("DSWA")
|
||||
PORT_DIPNAME( 0x0001, 0x0000, "Maximum Players" ) PORT_DIPLOCATION("SW1:!1")
|
||||
PORT_DIPSETTING( 0x0000, "2" )
|
||||
PORT_DIPSETTING( 0x0001, "3" )
|
||||
PORT_DIPNAME( 0x0002, 0x0000, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW1:!2") // This video HW doesn't support flip screen
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0002, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0004, 0x0004, "Shooting Style" ) PORT_DIPLOCATION("SW1:!3")
|
||||
PORT_DIPSETTING( 0x0004, "Semi-Auto" )
|
||||
PORT_DIPSETTING( 0x0000, "Full-Auto" )
|
||||
// Various features on bit mask 0x0008 - see above
|
||||
TOAPLAN_COINAGE_JAPAN_LOC(SW1)
|
||||
|
||||
PORT_MODIFY("DSWB")
|
||||
// Difficulty on bit mask 0x0003 - see above
|
||||
PORT_DIPNAME( 0x000c, 0x0000, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:!3,!4")
|
||||
PORT_DIPSETTING( 0x000c, DEF_STR( None ) )
|
||||
PORT_DIPSETTING( 0x0000, "500k and every 500k" )
|
||||
PORT_DIPSETTING( 0x0008, "300k only" )
|
||||
PORT_DIPSETTING( 0x0004, "300k and every 300k" )
|
||||
PORT_DIPNAME( 0x0030, 0x0000, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:!5,!6")
|
||||
PORT_DIPSETTING( 0x0030, "1" )
|
||||
PORT_DIPSETTING( 0x0020, "2" )
|
||||
PORT_DIPSETTING( 0x0000, "3" )
|
||||
PORT_DIPSETTING( 0x0010, "5" )
|
||||
PORT_DIPNAME( 0x0040, 0x0000, "Invulnerability (Cheat)" ) PORT_DIPLOCATION("SW2:!7")
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0040, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0080, 0x0000, DEF_STR( Allow_Continue ) ) PORT_DIPLOCATION("SW2:!8")
|
||||
PORT_DIPSETTING( 0x0080, DEF_STR( No ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( Yes ) )
|
||||
INPUT_PORTS_END
|
||||
|
||||
void fixeight_state::sound_reset_w(u8 data)
|
||||
{
|
||||
m_audiocpu->set_input_line(INPUT_LINE_RESET, (data & 0x08) ? CLEAR_LINE : ASSERT_LINE);
|
||||
}
|
||||
|
||||
void fixeight_state::fixeight_68k_mem(address_map &map)
|
||||
{
|
||||
map(0x000000, 0x07ffff).rom();
|
||||
map(0x100000, 0x103fff).ram();
|
||||
map(0x200000, 0x200001).portr("IN1");
|
||||
map(0x200004, 0x200005).portr("IN2");
|
||||
map(0x200008, 0x200009).portr("IN3");
|
||||
map(0x200010, 0x200011).portr("SYS");
|
||||
map(0x20001d, 0x20001d).w("coincounter", FUNC(toaplan_coincounter_device::coin_w));
|
||||
map(0x280000, 0x28ffff).rw(FUNC(fixeight_state::shared_ram_r), FUNC(fixeight_state::shared_ram_w)).umask16(0x00ff);
|
||||
map(0x300000, 0x30000d).rw(m_vdp, FUNC(gp9001vdp_device::read), FUNC(gp9001vdp_device::write));
|
||||
map(0x400000, 0x400fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
|
||||
map(0x500000, 0x501fff).ram().w(FUNC(fixeight_state::tx_videoram_w)).share(m_tx_videoram);
|
||||
map(0x502000, 0x5021ff).ram().share(m_tx_lineselect);
|
||||
map(0x503000, 0x5031ff).ram().w(FUNC(fixeight_state::tx_linescroll_w)).share(m_tx_linescroll);
|
||||
map(0x600000, 0x60ffff).ram().w(FUNC(fixeight_state::tx_gfxram_w)).share(m_tx_gfxram);
|
||||
map(0x700000, 0x700001).w(FUNC(fixeight_state::sound_reset_w)).umask16(0x00ff).cswidth(16);
|
||||
map(0x800000, 0x800001).r(m_vdp, FUNC(gp9001vdp_device::vdpcount_r));
|
||||
}
|
||||
|
||||
|
||||
void fixeight_bootleg_state::fixeightbl_oki_bankswitch_w(u8 data)
|
||||
{
|
||||
data &= 7;
|
||||
if (data <= 4) m_okibank->set_entry(data);
|
||||
}
|
||||
|
||||
|
||||
void fixeight_bootleg_state::fixeightbl_68k_mem(address_map &map)
|
||||
{
|
||||
map(0x000000, 0x0fffff).rom(); // 0-7ffff ?
|
||||
map(0x100000, 0x10ffff).ram(); // 100000-107fff 105000-105xxx 106000-106xxx 108000 - related to sound ?
|
||||
map(0x200000, 0x200001).portr("IN1");
|
||||
map(0x200004, 0x200005).portr("IN2");
|
||||
map(0x200008, 0x200009).portr("IN3");
|
||||
map(0x20000c, 0x20000d).portr("DSWB");
|
||||
map(0x200010, 0x200011).portr("SYS");
|
||||
map(0x200015, 0x200015).w(FUNC(fixeight_bootleg_state::fixeightbl_oki_bankswitch_w)); // Sound banking. Code at $4084c, $5070
|
||||
map(0x200019, 0x200019).rw(m_oki, FUNC(okim6295_device::read), FUNC(okim6295_device::write));
|
||||
map(0x20001c, 0x20001d).portr("DSWA");
|
||||
map(0x300000, 0x30000d).rw(m_vdp, FUNC(gp9001vdp_device::read), FUNC(gp9001vdp_device::write));
|
||||
map(0x400000, 0x400fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
|
||||
map(0x500000, 0x501fff).ram().w(FUNC(fixeight_bootleg_state::tx_videoram_w)).share(m_tx_videoram);
|
||||
map(0x700000, 0x700001).r(m_vdp, FUNC(gp9001vdp_device::vdpcount_r));
|
||||
map(0x800000, 0x87ffff).rom().region("maincpu", 0x80000);
|
||||
}
|
||||
|
||||
|
||||
void fixeight_state::fixeight_v25_mem(address_map &map)
|
||||
{
|
||||
map(0x00000, 0x00000).portr("IN1");
|
||||
map(0x00002, 0x00002).portr("IN2");
|
||||
map(0x00004, 0x00004).portr("IN3");
|
||||
map(0x0000a, 0x0000b).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write));
|
||||
map(0x0000c, 0x0000c).rw(m_oki, FUNC(okim6295_device::read), FUNC(okim6295_device::write));
|
||||
map(0x80000, 0x87fff).mirror(0x78000).ram().share(m_shared_ram);
|
||||
}
|
||||
|
||||
void fixeight_bootleg_state::cpu_space_fixeightbl_map(address_map &map)
|
||||
{
|
||||
map(0xfffff0, 0xffffff).m(m_maincpu, FUNC(m68000_base_device::autovectors_map));
|
||||
map(0xfffff5, 0xfffff5).lr8(NAME([this] () { m_maincpu->set_input_line(M68K_IRQ_2, CLEAR_LINE); return m68000_device::autovector(2); }));
|
||||
}
|
||||
|
||||
|
||||
|
||||
#define XOR(a) WORD_XOR_LE(a)
|
||||
#define LOC(x) (x+XOR(0))
|
||||
|
||||
static const gfx_layout truxton2_tx_tilelayout =
|
||||
{
|
||||
8,8, /* 8x8 characters */
|
||||
1024, /* 1024 characters */
|
||||
4, /* 4 bits per pixel */
|
||||
{ STEP4(0,1) },
|
||||
{ LOC(0)*4, LOC(1)*4, LOC(4)*4, LOC(5)*4, LOC(8)*4, LOC(9)*4, LOC(12)*4, LOC(13)*4 },
|
||||
{ STEP8(0,8*8) },
|
||||
8*8*8
|
||||
};
|
||||
|
||||
|
||||
static GFXDECODE_START( gfx )
|
||||
GFXDECODE_ENTRY( nullptr, 0, truxton2_tx_tilelayout, 64*16, 64 )
|
||||
GFXDECODE_END
|
||||
|
||||
static GFXDECODE_START( gfx_textrom )
|
||||
GFXDECODE_ENTRY( "text", 0, gfx_8x8x4_packed_msb, 64*16, 64 )
|
||||
GFXDECODE_END
|
||||
|
||||
void fixeight_state::fixeight(machine_config &config)
|
||||
{
|
||||
/* basic machine hardware */
|
||||
M68000(config, m_maincpu, 16_MHz_XTAL); // verified on PCB
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &fixeight_state::fixeight_68k_mem);
|
||||
m_maincpu->reset_cb().set(FUNC(fixeight_state::reset));
|
||||
|
||||
v25_device &audiocpu(V25(config, m_audiocpu, 16_MHz_XTAL)); // NEC V25 type Toaplan marked CPU ???
|
||||
audiocpu.set_addrmap(AS_PROGRAM, &fixeight_state::fixeight_v25_mem);
|
||||
audiocpu.set_decryption_table(toaplan_v25_tables::ts001turbo_decryption_table);
|
||||
audiocpu.p0_in_cb().set_ioport("EEPROM");
|
||||
audiocpu.p0_out_cb().set_ioport("EEPROM");
|
||||
|
||||
TOAPLAN_COINCOUNTER(config, "coincounter", 0);
|
||||
|
||||
EEPROM_93C46_16BIT(config, m_eeprom);
|
||||
|
||||
/* video hardware */
|
||||
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
|
||||
m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
|
||||
m_screen->set_raw(27_MHz_XTAL/4, 432, 0, 320, 262, 0, 240); // verified on PCB
|
||||
m_screen->set_screen_update(FUNC(fixeight_state::screen_update));
|
||||
m_screen->screen_vblank().set(FUNC(fixeight_state::screen_vblank));
|
||||
m_screen->set_palette(m_palette);
|
||||
|
||||
GFXDECODE(config, m_gfxdecode, m_palette, gfx);
|
||||
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, gp9001vdp_device::VDP_PALETTE_LENGTH);
|
||||
|
||||
GP9001_VDP(config, m_vdp, 27_MHz_XTAL);
|
||||
m_vdp->set_palette(m_palette);
|
||||
m_vdp->vint_out_cb().set_inputline(m_maincpu, M68K_IRQ_4);
|
||||
|
||||
/* sound hardware */
|
||||
SPEAKER(config, "mono").front_center();
|
||||
|
||||
YM2151(config, "ymsnd", 27_MHz_XTAL/8).add_route(ALL_OUTPUTS, "mono", 0.5); /* verified on pcb */
|
||||
|
||||
OKIM6295(config, m_oki, 16_MHz_XTAL/16, okim6295_device::PIN7_HIGH); /* verified on pcb */
|
||||
m_oki->add_route(ALL_OUTPUTS, "mono", 0.5);
|
||||
}
|
||||
|
||||
void fixeight_bootleg_state::fixeightbl_oki(address_map &map)
|
||||
{
|
||||
map(0x00000, 0x2ffff).rom();
|
||||
map(0x30000, 0x3ffff).bankr(m_okibank);
|
||||
}
|
||||
|
||||
void fixeight_bootleg_state::fixeightbl(machine_config &config)
|
||||
{
|
||||
/* basic machine hardware */
|
||||
M68000(config, m_maincpu, XTAL(10'000'000)); /* 10MHz Oscillator */
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &fixeight_bootleg_state::fixeightbl_68k_mem);
|
||||
m_maincpu->set_addrmap(m68000_base_device::AS_CPU_SPACE, &fixeight_bootleg_state::cpu_space_fixeightbl_map);
|
||||
|
||||
TOAPLAN_COINCOUNTER(config, "coincounter", 0);
|
||||
|
||||
/* video hardware */
|
||||
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
|
||||
m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
|
||||
m_screen->set_raw(27_MHz_XTAL/4, 432, 0, 320, 262, 0, 240);
|
||||
//m_screen->set_refresh_hz(60);
|
||||
//m_screen->set_size(432, 262);
|
||||
//m_screen->set_visarea(0, 319, 0, 239);
|
||||
m_screen->set_screen_update(FUNC(fixeight_bootleg_state::screen_update_bootleg));
|
||||
m_screen->screen_vblank().set(FUNC(fixeight_bootleg_state::screen_vblank));
|
||||
m_screen->set_palette(m_palette);
|
||||
|
||||
GFXDECODE(config, m_gfxdecode, m_palette, gfx_textrom);
|
||||
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, gp9001vdp_device::VDP_PALETTE_LENGTH);
|
||||
|
||||
GP9001_VDP(config, m_vdp, 27_MHz_XTAL);
|
||||
m_vdp->set_palette(m_palette);
|
||||
m_vdp->vint_out_cb().set_inputline(m_maincpu, M68K_IRQ_2, ASSERT_LINE);
|
||||
|
||||
/* sound hardware */
|
||||
SPEAKER(config, "mono").front_center();
|
||||
|
||||
OKIM6295(config, m_oki, 14_MHz_XTAL/16, okim6295_device::PIN7_LOW);
|
||||
m_oki->add_route(ALL_OUTPUTS, "mono", 1.0);
|
||||
m_oki->set_addrmap(0, &fixeight_bootleg_state::fixeightbl_oki);
|
||||
}
|
||||
|
||||
|
||||
#define ROMS_FIXEIGHT \
|
||||
ROM_REGION( 0x080000, "maincpu", 0 ) \
|
||||
ROM_LOAD16_WORD_SWAP( "tp-026-1", 0x000000, 0x080000, CRC(f7b1746a) SHA1(0bbea6f111b818bc9b9b2060af4fe900f37cf7f9) ) \
|
||||
ROM_REGION( 0x400000, "gp9001", 0 ) \
|
||||
ROM_LOAD( "tp-026-3", 0x000000, 0x200000, CRC(e5578d98) SHA1(280d2b716d955e767d311fc9596823852435b6d7) ) \
|
||||
ROM_LOAD( "tp-026-4", 0x200000, 0x200000, CRC(b760cb53) SHA1(bc9c5e49e45cdda0f774be0038aa4deb21d4d285) ) \
|
||||
ROM_REGION( 0x40000, "oki", 0 ) \
|
||||
ROM_LOAD( "tp-026-2", 0x00000, 0x40000, CRC(85063f1f) SHA1(1bf4d77494de421c98f6273b9876e60d827a6826) )
|
||||
|
||||
// note you may need to byteswap these EEPROM files to reprogram the original chip, this is the same for many supported in MAME.
|
||||
|
||||
ROM_START( fixeightkt )
|
||||
ROMS_FIXEIGHT
|
||||
ROM_REGION16_BE( 0x80, "eeprom", 0 )
|
||||
ROM_LOAD( "fixeightkt.nv", 0x00, 0x80, CRC(08fa73ba) SHA1(b7761d3dd3f4485e55c8ef2cf1a840ca771ee2fc) )
|
||||
ROM_END
|
||||
|
||||
ROM_START( fixeightk )
|
||||
ROMS_FIXEIGHT
|
||||
ROM_REGION16_BE( 0x80, "eeprom", 0 )
|
||||
ROM_LOAD( "fixeightk.nv", 0x00, 0x80, CRC(cac91c6f) SHA1(55b284f081753d60abff63493094322756b7f0c5) )
|
||||
ROM_END
|
||||
|
||||
ROM_START( fixeightht )
|
||||
ROMS_FIXEIGHT
|
||||
ROM_REGION16_BE( 0x80, "eeprom", 0 )
|
||||
ROM_LOAD( "fixeightht.nv", 0x00, 0x80, CRC(57edaa51) SHA1(b8d50e82590b8cbbbcafec5f9cfbc91e4c286db5) )
|
||||
ROM_END
|
||||
|
||||
ROM_START( fixeighth )
|
||||
ROMS_FIXEIGHT
|
||||
ROM_REGION16_BE( 0x80, "eeprom", 0 )
|
||||
ROM_LOAD( "fixeighth.nv", 0x00, 0x80, CRC(95dec584) SHA1(1c309074b51da5a5263dee00403296946e41067b) )
|
||||
ROM_END
|
||||
|
||||
ROM_START( fixeighttwt )
|
||||
ROMS_FIXEIGHT
|
||||
ROM_REGION16_BE( 0x80, "eeprom", 0 )
|
||||
ROM_LOAD( "fixeighttwt.nv", 0x00, 0x80, CRC(b6d5c06c) SHA1(7fda380ac6835a983c57d093ccad7bd76893c9ba))
|
||||
ROM_END
|
||||
|
||||
ROM_START( fixeighttw )
|
||||
ROMS_FIXEIGHT
|
||||
ROM_REGION16_BE( 0x80, "eeprom", 0 )
|
||||
ROM_LOAD( "fixeighttw.nv", 0x00, 0x80, CRC(74e6afb9) SHA1(87bdc95eb0d2d54375de2c622557d503e14154be))
|
||||
ROM_END
|
||||
|
||||
ROM_START( fixeightat )
|
||||
ROMS_FIXEIGHT
|
||||
ROM_REGION16_BE( 0x80, "eeprom", 0 )
|
||||
ROM_LOAD( "fixeightat.nv", 0x00, 0x80,CRC(e9c21987) SHA1(7f699e38deb84902ed62b857a3d2b4e3ea1475bb) )
|
||||
ROM_END
|
||||
|
||||
ROM_START( fixeighta )
|
||||
ROMS_FIXEIGHT
|
||||
ROM_REGION16_BE( 0x80, "eeprom", 0 )
|
||||
ROM_LOAD( "fixeighta.nv", 0x00, 0x80, CRC(2bf17652) SHA1(4ec6f188e63610d258cd6b2432d2200d61d80bed))
|
||||
ROM_END
|
||||
|
||||
ROM_START( fixeightt )
|
||||
ROMS_FIXEIGHT
|
||||
ROM_REGION16_BE( 0x80, "eeprom", 0 )
|
||||
ROM_LOAD( "fixeightt.nv", 0x00, 0x80, CRC(c0da4a05) SHA1(3686161244e3e8be0e2fdb5fc5c24e39a7aeba85) )
|
||||
ROM_END
|
||||
|
||||
ROM_START( fixeight )
|
||||
ROMS_FIXEIGHT
|
||||
ROM_REGION16_BE( 0x80, "eeprom", 0 )
|
||||
ROM_LOAD( "fixeight.nv", 0x00, 0x80, CRC(02e925d0) SHA1(5839d10aceff84916ea99e9c6afcdc90eef7468b) )
|
||||
ROM_END
|
||||
|
||||
ROM_START( fixeightut )
|
||||
ROMS_FIXEIGHT
|
||||
ROM_REGION16_BE( 0x80, "eeprom", 0 )
|
||||
ROM_LOAD( "fixeightut.nv", 0x00, 0x80, CRC(9fcd93ee) SHA1(4f2750f09d9b8ff358a2fd6c7a4a8ba6de67017a) )
|
||||
ROM_END
|
||||
|
||||
ROM_START( fixeightu )
|
||||
ROMS_FIXEIGHT
|
||||
ROM_REGION16_BE( 0x80, "eeprom", 0 )
|
||||
ROM_LOAD( "fixeightu.nv", 0x00, 0x80, CRC(5dfefc3b) SHA1(5203525c58e2ae10575af2e277a5696bd64c5b60) )
|
||||
ROM_END
|
||||
|
||||
ROM_START( fixeightj )
|
||||
ROMS_FIXEIGHT
|
||||
ROM_REGION16_BE( 0x80, "eeprom", 0 )
|
||||
ROM_LOAD( "fixeightj.nv", 0x00, 0x80, CRC(21e22038) SHA1(29fb10061e62799bb5e4171e144daac49f0cdf06) )
|
||||
ROM_END
|
||||
|
||||
ROM_START( fixeightjt )
|
||||
ROMS_FIXEIGHT
|
||||
ROM_REGION16_BE( 0x80, "eeprom", 0 )
|
||||
ROM_LOAD( "fixeightjt.nv", 0x00, 0x80, CRC(e3d14fed) SHA1(ee4982ef195240c5eaa5005ca1d591901fb01b47) )
|
||||
ROM_END
|
||||
|
||||
|
||||
/*
|
||||
Fix Eight (bootleg)
|
||||
Toaplan, 1992
|
||||
|
||||
PCB Layout
|
||||
----------
|
||||
|
||||
|--------------------------------------------|
|
||||
| 1.BIN PAL 14MHz PAL|
|
||||
| M6295 PAL |
|
||||
| PAL 6116 4.BIN 681000 681000|
|
||||
| 6116 |
|
||||
| 6116 681000 681000|
|
||||
|J 6116 PAL |
|
||||
|A PAL |
|
||||
|M |
|
||||
|M 62256 62256 PAL |
|
||||
|A 2.BIN 3.BIN PAL |
|
||||
| PAL |
|
||||
| 68000 PAL |
|
||||
| DSW2 |------| 5.BIN |
|
||||
| DSW1 6264 |TPC | |
|
||||
| 3.579545MHz |1020 | 6.BIN |
|
||||
| 10MHz 6264 |------| 7.BIN |
|
||||
|--------------------------------------------|
|
||||
Notes:
|
||||
68000 clock at 10.000MHz
|
||||
M6295 clock at 875kHz [14M/16]. Sample rate = 875000 / 165
|
||||
VSync at 60Hz
|
||||
6116 - 2k x8 SRAM (x4)
|
||||
6264 - 8k x8 SRAM (x2)
|
||||
62256 - 32k x8 SRAM (x2)
|
||||
681000- 128k x8 SRAM (x4)
|
||||
*/
|
||||
|
||||
|
||||
ROM_START( fixeightbl )
|
||||
ROM_REGION( 0x100000, "maincpu", 0 ) /* Main 68K code */
|
||||
ROM_LOAD16_BYTE( "3.bin", 0x000000, 0x80000, CRC(cc77d4b4) SHA1(4d3376cbae13d90c6314d8bb9236c2183fc6253c) )
|
||||
ROM_LOAD16_BYTE( "2.bin", 0x000001, 0x80000, CRC(ed715488) SHA1(37be9bc8ff6b54a1f660d89469c6c2da6301e9cd) )
|
||||
|
||||
ROM_REGION( 0x400000, "gp9001", 0 )
|
||||
ROM_LOAD( "tp-026-3", 0x000000, 0x200000, CRC(e5578d98) SHA1(280d2b716d955e767d311fc9596823852435b6d7) )
|
||||
ROM_LOAD( "tp-026-4", 0x200000, 0x200000, CRC(b760cb53) SHA1(bc9c5e49e45cdda0f774be0038aa4deb21d4d285) )
|
||||
|
||||
ROM_REGION( 0x08000, "text", 0)
|
||||
ROM_LOAD( "4.bin", 0x00000, 0x08000, CRC(a6aca465) SHA1(2b331faeee1832e0adc5218254a99d66331862c6) )
|
||||
|
||||
ROM_REGION( 0x80000, "oki", 0 ) /* ADPCM Samples */
|
||||
ROM_LOAD( "1.bin", 0x00000, 0x80000, CRC(888f19ac) SHA1(d2f4f8b7be7a0fdb95baa0af8930e50e2f875c05) )
|
||||
|
||||
ROM_REGION( 0x8000, "user1", 0 ) /* ??? Some sort of table - same as in pipibibsbl */
|
||||
ROM_LOAD( "5.bin", 0x0000, 0x8000, CRC(456dd16e) SHA1(84779ee64d3ea33ba1ba4dee39b504a81c6811a1) )
|
||||
ROM_END
|
||||
|
||||
|
||||
void fixeight_bootleg_state::init_fixeightbl()
|
||||
{
|
||||
u8 *ROM = memregion("oki")->base();
|
||||
|
||||
m_okibank->configure_entries(0, 5, &ROM[0x30000], 0x10000);
|
||||
}
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
// region is in eeprom (and also requires correct return value from a v25 mapped address??)
|
||||
GAME( 1992, fixeight, 0, fixeight, fixeight, fixeight_state, empty_init, ROT270, "Toaplan", "FixEight (Europe)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1992, fixeightk, fixeight, fixeight, fixeight, fixeight_state, empty_init, ROT270, "Toaplan", "FixEight (Korea)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1992, fixeighth, fixeight, fixeight, fixeight, fixeight_state, empty_init, ROT270, "Toaplan", "FixEight (Hong Kong)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1992, fixeighttw, fixeight, fixeight, fixeight, fixeight_state, empty_init, ROT270, "Toaplan", "FixEight (Taiwan)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1992, fixeighta, fixeight, fixeight, fixeight, fixeight_state, empty_init, ROT270, "Toaplan", "FixEight (Southeast Asia)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1992, fixeightu, fixeight, fixeight, fixeight, fixeight_state, empty_init, ROT270, "Toaplan", "FixEight (USA)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1992, fixeightj, fixeight, fixeight, fixeight, fixeight_state, empty_init, ROT270, "Toaplan", "FixEight - Jigoku no Eiyuu Densetsu (Japan)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1992, fixeightt, fixeight, fixeight, fixeight, fixeight_state, empty_init, ROT270, "Toaplan (Taito license)", "FixEight (Europe, Taito license)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1992, fixeightkt, fixeight, fixeight, fixeight, fixeight_state, empty_init, ROT270, "Toaplan (Taito license)", "FixEight (Korea, Taito license)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1992, fixeightht, fixeight, fixeight, fixeight, fixeight_state, empty_init, ROT270, "Toaplan (Taito license)", "FixEight (Hong Kong, Taito license)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1992, fixeighttwt, fixeight, fixeight, fixeight, fixeight_state, empty_init, ROT270, "Toaplan (Taito license)", "FixEight (Taiwan, Taito license)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1992, fixeightat, fixeight, fixeight, fixeight, fixeight_state, empty_init, ROT270, "Toaplan (Taito license)", "FixEight (Southeast Asia, Taito license)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1992, fixeightut, fixeight, fixeight, fixeight, fixeight_state, empty_init, ROT270, "Toaplan (Taito license)", "FixEight (USA, Taito license)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1992, fixeightjt, fixeight, fixeight, fixeight, fixeight_state, empty_init, ROT270, "Toaplan (Taito license)", "FixEight - Jigoku no Eiyuu Densetsu (Japan, Taito license)", MACHINE_SUPPORTS_SAVE )
|
||||
|
||||
GAME( 1992, fixeightbl, fixeight, fixeightbl, fixeightbl, fixeight_bootleg_state, init_fixeightbl, ROT270, "bootleg", "FixEight (Korea, bootleg)", MACHINE_SUPPORTS_SAVE )
|
347
src/mame/toaplan/ghox.cpp
Normal file
347
src/mame/toaplan/ghox.cpp
Normal file
@ -0,0 +1,347 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Quench, Yochizo, David Haywood
|
||||
|
||||
#include "emu.h"
|
||||
|
||||
#include "emupal.h"
|
||||
#include "screen.h"
|
||||
#include "speaker.h"
|
||||
#include "tilemap.h"
|
||||
|
||||
#include "toaplan_coincounter.h"
|
||||
#include "toaplipt.h"
|
||||
#include "gp9001.h"
|
||||
|
||||
#include "cpu/m68000/m68000.h"
|
||||
#include "cpu/z180/hd647180x.h"
|
||||
#include "sound/ymopm.h"
|
||||
|
||||
/*
|
||||
Name Board No Maker Game name
|
||||
----------------------------------------------------------------------------
|
||||
ghox TP-021 Toaplan Ghox (Spinner with single up/down axis control)
|
||||
ghoxj TP-021 Toaplan Ghox (8-Way Joystick controls)
|
||||
|
||||
|
||||
ghox - The ghoxj set displays an English title screen when the jumpers are set for Japan/Taito,
|
||||
and fails to display the "Winners Don't Use Drugs" logo when set for USA/Taito (either
|
||||
Taito America or Taito Japan).
|
||||
*/
|
||||
|
||||
namespace {
|
||||
|
||||
class ghox_state : public driver_device
|
||||
{
|
||||
public:
|
||||
ghox_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: driver_device(mconfig, type, tag)
|
||||
, m_io_pad(*this, "PAD%u", 1U)
|
||||
, m_shared_ram(*this, "shared_ram")
|
||||
, m_maincpu(*this, "maincpu")
|
||||
, m_audiocpu(*this, "audiocpu")
|
||||
, m_vdp(*this, "gp9001")
|
||||
, m_screen(*this, "screen")
|
||||
, m_palette(*this, "palette")
|
||||
{ }
|
||||
void ghox(machine_config &config);
|
||||
|
||||
protected:
|
||||
virtual void machine_start() override ATTR_COLD;
|
||||
virtual void machine_reset() override ATTR_COLD;
|
||||
virtual void video_start() override ATTR_COLD;
|
||||
|
||||
private:
|
||||
void ghox_68k_mem(address_map &map) ATTR_COLD;
|
||||
void ghox_hd647180_mem_map(address_map &map) ATTR_COLD;
|
||||
|
||||
u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
void screen_vblank(int state);
|
||||
|
||||
template<unsigned Which> u16 ghox_h_analog_r();
|
||||
u8 shared_ram_r(offs_t offset) { return m_shared_ram[offset]; }
|
||||
void shared_ram_w(offs_t offset, u8 data) { m_shared_ram[offset] = data; }
|
||||
void reset(int state);
|
||||
|
||||
s8 m_old_paddle_h[2] = {0};
|
||||
|
||||
required_ioport_array<2> m_io_pad;
|
||||
required_shared_ptr<u8> m_shared_ram; // 8 bit RAM shared between 68K and sound CPU
|
||||
required_device<m68000_base_device> m_maincpu;
|
||||
required_device<cpu_device> m_audiocpu;
|
||||
required_device<gp9001vdp_device> m_vdp;
|
||||
required_device<screen_device> m_screen;
|
||||
required_device<palette_device> m_palette;
|
||||
bitmap_ind8 m_custom_priority_bitmap;
|
||||
};
|
||||
|
||||
|
||||
void ghox_state::reset(int state)
|
||||
{
|
||||
if (m_audiocpu != nullptr)
|
||||
m_audiocpu->pulse_input_line(INPUT_LINE_RESET, attotime::zero);
|
||||
}
|
||||
|
||||
|
||||
void ghox_state::video_start()
|
||||
{
|
||||
m_screen->register_screen_bitmap(m_custom_priority_bitmap);
|
||||
m_vdp->custom_priority_bitmap = &m_custom_priority_bitmap;
|
||||
}
|
||||
|
||||
|
||||
u32 ghox_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
bitmap.fill(0, cliprect);
|
||||
m_custom_priority_bitmap.fill(0, cliprect);
|
||||
m_vdp->render_vdp(bitmap, cliprect);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void ghox_state::screen_vblank(int state)
|
||||
{
|
||||
if (state) // rising edge
|
||||
{
|
||||
m_vdp->screen_eof();
|
||||
}
|
||||
}
|
||||
|
||||
void ghox_state::machine_start()
|
||||
{
|
||||
save_item(NAME(m_old_paddle_h));
|
||||
}
|
||||
|
||||
void ghox_state::machine_reset()
|
||||
{
|
||||
m_old_paddle_h[0] = 0;
|
||||
m_old_paddle_h[1] = 0;
|
||||
}
|
||||
|
||||
template<unsigned Which>
|
||||
u16 ghox_state::ghox_h_analog_r()
|
||||
{
|
||||
const s8 new_value = m_io_pad[Which]->read();
|
||||
const s8 result = new_value - m_old_paddle_h[Which];
|
||||
if (!machine().side_effects_disabled())
|
||||
m_old_paddle_h[Which] = new_value;
|
||||
return result;
|
||||
}
|
||||
|
||||
static INPUT_PORTS_START( base )
|
||||
PORT_START("IN1")
|
||||
TOAPLAN_JOY_UDLR_2_BUTTONS( 1 )
|
||||
|
||||
PORT_START("IN2")
|
||||
TOAPLAN_JOY_UDLR_2_BUTTONS( 2 )
|
||||
|
||||
PORT_START("SYS")
|
||||
PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_SERVICE1 )
|
||||
PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_TILT )
|
||||
TOAPLAN_TEST_SWITCH( 0x04, IP_ACTIVE_HIGH )
|
||||
PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_COIN1 )
|
||||
PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_COIN2 )
|
||||
PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_START1 )
|
||||
PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_START2 )
|
||||
PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNKNOWN )
|
||||
|
||||
PORT_START("DSWA")
|
||||
TOAPLAN_MACHINE_NO_COCKTAIL_LOC(SW1)
|
||||
// Coinage on bit mask 0x00f0
|
||||
PORT_BIT( 0x00f0, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // Modified below
|
||||
|
||||
PORT_START("DSWB")
|
||||
TOAPLAN_DIFFICULTY_LOC(SW2)
|
||||
// Per-game features on bit mask 0x00fc
|
||||
PORT_BIT( 0x00fc, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // Modified below
|
||||
INPUT_PORTS_END
|
||||
|
||||
static INPUT_PORTS_START( ghox )
|
||||
PORT_INCLUDE( base )
|
||||
|
||||
PORT_MODIFY("DSWA")
|
||||
// Various features on bit mask 0x000f - see above
|
||||
TOAPLAN_COINAGE_DUAL_LOC( JMPR, 0x80000, 0x80000, SW1 )
|
||||
|
||||
PORT_MODIFY("DSWB")
|
||||
// Difficulty on bit mask 0x0003 - see above
|
||||
// "Debug Mode" corresponds to "Invulnerability" in the other games
|
||||
// (i.e. it enables pause and slow motion)
|
||||
PORT_DIPNAME( 0x000c, 0x0000, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:!3,!4")
|
||||
PORT_DIPSETTING( 0x000c, DEF_STR( None ) )
|
||||
PORT_DIPSETTING( 0x0008, "100k only" )
|
||||
PORT_DIPSETTING( 0x0004, "100k and 300k" )
|
||||
PORT_DIPSETTING( 0x0000, "100k and every 200k" )
|
||||
PORT_DIPNAME( 0x0030, 0x0000, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:!5,!6")
|
||||
PORT_DIPSETTING( 0x0030, "1" )
|
||||
PORT_DIPSETTING( 0x0020, "2" )
|
||||
PORT_DIPSETTING( 0x0000, "3" )
|
||||
PORT_DIPSETTING( 0x0010, "5" )
|
||||
PORT_DIPNAME( 0x0040, 0x0000, "Debug Mode (Cheat)" ) PORT_DIPLOCATION("SW2:!7")
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0040, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0080, 0x0000, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW2:!8")
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0080, DEF_STR( On ) )
|
||||
|
||||
PORT_START("JMPR")
|
||||
// Bit Mask 0x80000 is used here to signify European Coinage for MAME purposes - not read on the real board!
|
||||
PORT_CONFNAME( 0x8000f, 0x80002, DEF_STR( Region ) ) //PORT_CONFLOCATION("JP:!4,!3,!2,!1,FAKE:!1")
|
||||
PORT_CONFSETTING( 0x80002, DEF_STR( Europe ) )
|
||||
PORT_CONFSETTING( 0x00001, DEF_STR( USA ) )
|
||||
PORT_CONFSETTING( 0x00000, DEF_STR( Japan ) )
|
||||
PORT_CONFSETTING( 0x00003, "Hong Kong (Honest Trading Co.)" )
|
||||
PORT_CONFSETTING( 0x00004, DEF_STR( Korea ) )
|
||||
PORT_CONFSETTING( 0x00005, DEF_STR( Taiwan ) )
|
||||
PORT_CONFSETTING( 0x80006, "Spain & Portugal (APM Electronics S.A.)" )
|
||||
PORT_CONFSETTING( 0x80007, "Italy (Star Electronica SRL)" )
|
||||
PORT_CONFSETTING( 0x80008, "UK (JP Leisure Limited)" )
|
||||
PORT_CONFSETTING( 0x00009, "USA (Romstar, Inc.)" )
|
||||
PORT_CONFSETTING( 0x8000a, "Europe (Nova Apparate GMBH & Co.)" )
|
||||
PORT_CONFSETTING( 0x0000b, "USA (Taito America Corporation)" )
|
||||
PORT_CONFSETTING( 0x0000c, "USA (Taito Corporation Japan)" )
|
||||
PORT_CONFSETTING( 0x8000d, "Europe (Taito Corporation Japan)" )
|
||||
PORT_CONFSETTING( 0x0000e, "Japan (Licensed to [blank])" ) // English title screen
|
||||
PORT_CONFSETTING( 0x0000f, "Japan (Taito Corporation)" )
|
||||
|
||||
PORT_START("PAD1") /* Paddle 1 (left-right) read at $100000 */
|
||||
PORT_BIT( 0xff, 0x00, IPT_DIAL ) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(1)
|
||||
PORT_BIT( 0xff00, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // Unknown/Unused
|
||||
|
||||
PORT_START("PAD2") /* Paddle 2 (left-right) read at $040000 */
|
||||
PORT_BIT( 0xff, 0x00, IPT_DIAL ) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(2)
|
||||
PORT_BIT( 0xff00, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // Unknown/Unused
|
||||
INPUT_PORTS_END
|
||||
|
||||
static INPUT_PORTS_START( ghoxjo )
|
||||
PORT_INCLUDE( ghox )
|
||||
|
||||
PORT_MODIFY("JMPR")
|
||||
// Bit Mask 0x80000 is used here to signify European Coinage for MAME purposes - not read on the real board!
|
||||
PORT_CONFNAME( 0x8000f, 0x80002, DEF_STR( Region ) ) //PORT_CONFLOCATION("JP:!4,!3,!2,!1,FAKE:!1")
|
||||
PORT_CONFSETTING( 0x80002, DEF_STR( Europe ) )
|
||||
PORT_CONFSETTING( 0x00001, DEF_STR( USA ) )
|
||||
PORT_CONFSETTING( 0x00000, DEF_STR( Japan ) )
|
||||
PORT_CONFSETTING( 0x00003, "Hong Kong (Honest Trading Co.)" )
|
||||
PORT_CONFSETTING( 0x00004, DEF_STR( Korea ) )
|
||||
PORT_CONFSETTING( 0x00005, DEF_STR( Taiwan ) )
|
||||
PORT_CONFSETTING( 0x80006, "Spain & Portugal (APM Electronics S.A.)" )
|
||||
PORT_CONFSETTING( 0x80007, "Italy (Star Electronica SRL)" )
|
||||
PORT_CONFSETTING( 0x80008, "UK (JP Leisure Limited)" )
|
||||
PORT_CONFSETTING( 0x00009, "USA (Romstar, Inc.)" )
|
||||
PORT_CONFSETTING( 0x8000a, "Europe (Nova Apparate GMBH & Co.)" )
|
||||
PORT_CONFSETTING( 0x0000b, "Japan (Unused) [b]" )
|
||||
PORT_CONFSETTING( 0x0000c, "Japan (Unused) [c]" )
|
||||
PORT_CONFSETTING( 0x0000d, "Japan (Unused) [d]" )
|
||||
PORT_CONFSETTING( 0x0000e, "Japan (Unused) [e]" )
|
||||
PORT_CONFSETTING( 0x0000f, "Japan (Unused) [f]" )
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
void ghox_state::ghox_68k_mem(address_map &map)
|
||||
{
|
||||
map(0x000000, 0x03ffff).rom();
|
||||
map(0x040000, 0x040001).r(FUNC(ghox_state::ghox_h_analog_r<1>));
|
||||
map(0x080000, 0x083fff).ram();
|
||||
map(0x0c0000, 0x0c0fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
|
||||
map(0x100000, 0x100001).r(FUNC(ghox_state::ghox_h_analog_r<0>));
|
||||
map(0x140000, 0x14000d).rw(m_vdp, FUNC(gp9001vdp_device::read), FUNC(gp9001vdp_device::write));
|
||||
map(0x180000, 0x180fff).rw(FUNC(ghox_state::shared_ram_r), FUNC(ghox_state::shared_ram_w)).umask16(0x00ff);
|
||||
map(0x181001, 0x181001).w("coincounter", FUNC(toaplan_coincounter_device::coin_w));
|
||||
map(0x18100c, 0x18100d).portr("JMPR");
|
||||
}
|
||||
|
||||
void ghox_state::ghox_hd647180_mem_map(address_map &map)
|
||||
{
|
||||
map(0x40000, 0x407ff).ram().share(m_shared_ram);
|
||||
|
||||
map(0x80002, 0x80002).portr("DSWA");
|
||||
map(0x80004, 0x80004).portr("DSWB");
|
||||
map(0x80006, 0x80006).nopr(); // nothing?
|
||||
map(0x80008, 0x80008).portr("IN1");
|
||||
map(0x8000a, 0x8000a).portr("IN2");
|
||||
|
||||
map(0x8000c, 0x8000e).portr("SYS");
|
||||
|
||||
map(0x8000e, 0x8000f).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write));
|
||||
}
|
||||
|
||||
|
||||
void ghox_state::ghox(machine_config &config)
|
||||
{
|
||||
/* basic machine hardware */
|
||||
M68000(config, m_maincpu, 10_MHz_XTAL); /* verified on pcb */
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &ghox_state::ghox_68k_mem);
|
||||
m_maincpu->reset_cb().set(FUNC(ghox_state::reset));
|
||||
|
||||
HD647180X(config, m_audiocpu, 10_MHz_XTAL);
|
||||
m_audiocpu->set_addrmap(AS_PROGRAM, &ghox_state::ghox_hd647180_mem_map);
|
||||
|
||||
TOAPLAN_COINCOUNTER(config, "coincounter", 0);
|
||||
|
||||
config.set_maximum_quantum(attotime::from_hz(600));
|
||||
|
||||
/* video hardware */
|
||||
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
|
||||
m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
|
||||
m_screen->set_raw(27_MHz_XTAL/4, 432, 0, 320, 262, 0, 240);
|
||||
m_screen->set_screen_update(FUNC(ghox_state::screen_update));
|
||||
m_screen->screen_vblank().set(FUNC(ghox_state::screen_vblank));
|
||||
m_screen->set_palette(m_palette);
|
||||
|
||||
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, gp9001vdp_device::VDP_PALETTE_LENGTH);
|
||||
|
||||
GP9001_VDP(config, m_vdp, 27_MHz_XTAL);
|
||||
m_vdp->set_palette(m_palette);
|
||||
m_vdp->vint_out_cb().set_inputline(m_maincpu, M68K_IRQ_4);
|
||||
|
||||
/* sound hardware */
|
||||
SPEAKER(config, "mono").front_center();
|
||||
|
||||
YM2151(config, "ymsnd", 27_MHz_XTAL/8).add_route(ALL_OUTPUTS, "mono", 0.5); // verified on pcb
|
||||
}
|
||||
|
||||
|
||||
ROM_START( ghox ) /* Spinner with single axis (up/down) controls */
|
||||
ROM_REGION( 0x040000, "maincpu", 0 ) /* Main 68K code */
|
||||
ROM_LOAD16_BYTE( "tp021-01.u10", 0x000000, 0x020000, CRC(9e56ac67) SHA1(daf241d9e55a6e60fc004ed61f787641595b1e62) )
|
||||
ROM_LOAD16_BYTE( "tp021-02.u11", 0x000001, 0x020000, CRC(15cac60f) SHA1(6efa3a50a5dfe6ef4072738d6a7d0d95dca8a675) )
|
||||
|
||||
ROM_REGION( 0x10000, "audiocpu", 0 ) /* Sound HD647180 code */
|
||||
ROM_LOAD( "hd647180.021", 0x00000, 0x08000, CRC(6ab59e5b) SHA1(d814dd3a8f1ee638794e2bd422eed4247ba4a15e) )
|
||||
|
||||
ROM_REGION( 0x100000, "gp9001", 0 )
|
||||
ROM_LOAD( "tp021-03.u36", 0x000000, 0x080000, CRC(a15d8e9d) SHA1(640a33997bdce8e84bea6a944139716379839037) )
|
||||
ROM_LOAD( "tp021-04.u37", 0x080000, 0x080000, CRC(26ed1c9a) SHA1(37da8af86ea24327444c2d4ad3dfbd936208d43d) )
|
||||
ROM_END
|
||||
|
||||
|
||||
ROM_START( ghoxj ) /* 8-way joystick for controls */
|
||||
ROM_REGION( 0x040000, "maincpu", 0 ) /* Main 68K code */
|
||||
ROM_LOAD16_BYTE( "tp021-01a.u10", 0x000000, 0x020000, CRC(c11b13c8) SHA1(da7defc1d3b6ddded910ba56c31fbbdb5ed57b09) )
|
||||
ROM_LOAD16_BYTE( "tp021-02a.u11", 0x000001, 0x020000, CRC(8d426767) SHA1(1ed4a8bcbf4352257e7d58cb5c2c91eb48c2f047) )
|
||||
|
||||
ROM_REGION( 0x10000, "audiocpu", 0 ) /* Sound HD647180 code */
|
||||
ROM_LOAD( "hd647180.021", 0x00000, 0x08000, CRC(6ab59e5b) SHA1(d814dd3a8f1ee638794e2bd422eed4247ba4a15e) )
|
||||
|
||||
ROM_REGION( 0x100000, "gp9001", 0 )
|
||||
ROM_LOAD( "tp021-03.u36", 0x000000, 0x080000, CRC(a15d8e9d) SHA1(640a33997bdce8e84bea6a944139716379839037) )
|
||||
ROM_LOAD( "tp021-04.u37", 0x080000, 0x080000, CRC(26ed1c9a) SHA1(37da8af86ea24327444c2d4ad3dfbd936208d43d) )
|
||||
ROM_END
|
||||
|
||||
ROM_START( ghoxjo ) /* older version (with fewer regions) of the 8-way joystick version */
|
||||
ROM_REGION( 0x040000, "maincpu", 0 ) /* Main 68K code */
|
||||
ROM_LOAD16_BYTE( "tp021-01.ghoxsticker.u10", 0x000000, 0x020000, CRC(ad3a8817) SHA1(317267e0c00934a86bf05c5afd6c69a7944a2ed3) ) // TP021 ?01? label covered with a handwriten 'GHOX' sticker
|
||||
ROM_LOAD16_BYTE( "tp021-02.ghoxsticker.u11", 0x000001, 0x020000, CRC(2340e981) SHA1(d8e3f55e67fe6500f9e6c7eed1388dc895c5f574) ) // TP021 ?02? label covered with a handwriten 'GHOX' sticker
|
||||
|
||||
ROM_REGION( 0x10000, "audiocpu", 0 ) /* Sound HD647180 code */
|
||||
ROM_LOAD( "hd647180.021", 0x00000, 0x08000, CRC(6ab59e5b) SHA1(d814dd3a8f1ee638794e2bd422eed4247ba4a15e) )
|
||||
|
||||
ROM_REGION( 0x100000, "gp9001", 0 )
|
||||
ROM_LOAD( "tp021-03.u36", 0x000000, 0x080000, CRC(a15d8e9d) SHA1(640a33997bdce8e84bea6a944139716379839037) )
|
||||
ROM_LOAD( "tp021-04.u37", 0x080000, 0x080000, CRC(26ed1c9a) SHA1(37da8af86ea24327444c2d4ad3dfbd936208d43d) )
|
||||
ROM_END
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
GAME( 1991, ghox, 0, ghox, ghox, ghox_state, empty_init, ROT270, "Toaplan", "Ghox (spinner)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1991, ghoxj, ghox, ghox, ghox, ghox_state, empty_init, ROT270, "Toaplan", "Ghox (joystick)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1991, ghoxjo, ghox, ghox, ghoxjo, ghox_state, empty_init, ROT270, "Toaplan", "Ghox (joystick, older)", MACHINE_SUPPORTS_SAVE )
|
@ -378,6 +378,38 @@ u16 gp9001vdp_device::vdpstatus_r()
|
||||
return ((screen().vpos() + 15) % 262) >= 245;
|
||||
}
|
||||
|
||||
// this is a common form of reading several of the flags provide by the VDP
|
||||
u16 gp9001vdp_device::vdpcount_r()
|
||||
{
|
||||
/* +---------+---------+--------+---------------------------+ */
|
||||
/* | /H-Sync | /V-Sync | /Blank | Scanline Count | */
|
||||
/* | Bit 15 | Bit 14 | Bit 8 | Bit 7-0 (count from #EF) | */
|
||||
/* +---------+---------+--------+---------------------------+ */
|
||||
/*************** Control Signals are active low ***************/
|
||||
|
||||
int vpos = screen().vpos();
|
||||
|
||||
u16 video_status = 0xff00; // Set signals inactive
|
||||
|
||||
vpos = (vpos + 15) % 262;
|
||||
|
||||
if (hsync_r())
|
||||
video_status &= ~0x8000;
|
||||
if (vsync_r())
|
||||
video_status &= ~0x4000;
|
||||
if (fblank_r())
|
||||
video_status &= ~0x0100;
|
||||
if (vpos < 256)
|
||||
video_status |= (vpos & 0xff);
|
||||
else
|
||||
video_status |= 0xff;
|
||||
|
||||
// logerror("VC: vpos=%04x hpos=%04x VBL=%04x\n",vpos,hpos,m_screen->vblank());
|
||||
|
||||
return video_status;
|
||||
}
|
||||
|
||||
|
||||
void gp9001vdp_device::scroll_reg_select_w(u16 data, u16 mem_mask)
|
||||
{
|
||||
if (ACCESSING_BITS_0_7)
|
||||
|
@ -50,6 +50,7 @@ public:
|
||||
int hsync_r();
|
||||
int vsync_r();
|
||||
int fblank_r();
|
||||
u16 vdpcount_r();
|
||||
|
||||
// these bootlegs have strange access
|
||||
u16 bootleg_videoram16_r(offs_t offset);
|
||||
@ -58,6 +59,8 @@ public:
|
||||
void bootleg_spriteram16_w(offs_t offset, u16 data, u16 mem_mask = ~0);
|
||||
void bootleg_scroll_w(offs_t offset, u16 data, u16 mem_mask = ~0);
|
||||
|
||||
static constexpr unsigned VDP_PALETTE_LENGTH = 0x10000;
|
||||
|
||||
protected:
|
||||
virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
|
||||
virtual void device_start() override ATTR_COLD;
|
||||
@ -137,9 +140,9 @@ private:
|
||||
DECLARE_GFXDECODE_MEMBER(gfxinfo);
|
||||
|
||||
void voffs_w(u16 data, u16 mem_mask = ~0);
|
||||
int videoram16_r(void);
|
||||
int videoram16_r();
|
||||
void videoram16_w(u16 data, u16 mem_mask = ~0);
|
||||
u16 vdpstatus_r(void);
|
||||
u16 vdpstatus_r();
|
||||
void scroll_reg_select_w(u16 data, u16 mem_mask = ~0);
|
||||
void scroll_reg_data_w(u16 data, u16 mem_mask = ~0);
|
||||
|
||||
|
511
src/mame/toaplan/kbash.cpp
Normal file
511
src/mame/toaplan/kbash.cpp
Normal file
@ -0,0 +1,511 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Quench, Yochizo, David Haywood
|
||||
|
||||
#include "emu.h"
|
||||
|
||||
#include "emupal.h"
|
||||
#include "screen.h"
|
||||
#include "speaker.h"
|
||||
#include "tilemap.h"
|
||||
|
||||
#include "toaplan_coincounter.h"
|
||||
#include "toaplan_v25_tables.h"
|
||||
#include "toaplipt.h"
|
||||
#include "gp9001.h"
|
||||
|
||||
#include "cpu/m68000/m68000.h"
|
||||
#include "cpu/nec/v25.h"
|
||||
#include "sound/okim6295.h"
|
||||
#include "sound/ymopm.h"
|
||||
|
||||
/*
|
||||
Name Board No Maker Game name
|
||||
----------------------------------------------------------------------------
|
||||
kbash TP-023 Toaplan Knuckle Bash
|
||||
kbash2 bootleg Toaplan Knuckle Bash 2
|
||||
*/
|
||||
|
||||
namespace {
|
||||
|
||||
class kbash_state : public driver_device
|
||||
{
|
||||
public:
|
||||
kbash_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: driver_device(mconfig, type, tag)
|
||||
, m_shared_ram(*this, "shared_ram")
|
||||
, m_maincpu(*this, "maincpu")
|
||||
, m_audiocpu(*this, "audiocpu")
|
||||
, m_vdp(*this, "gp9001")
|
||||
, m_oki(*this, "oki")
|
||||
, m_screen(*this, "screen")
|
||||
, m_palette(*this, "palette")
|
||||
{ }
|
||||
|
||||
void kbash(machine_config &config);
|
||||
|
||||
|
||||
void kbash_68k_mem(address_map &map) ATTR_COLD;
|
||||
void kbash_v25_mem(address_map &map) ATTR_COLD;
|
||||
|
||||
void kbash_oki_bankswitch_w(u8 data);
|
||||
|
||||
u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
void screen_vblank(int state);
|
||||
|
||||
u8 shared_ram_r(offs_t offset) { return m_shared_ram[offset]; }
|
||||
void shared_ram_w(offs_t offset, u8 data) { m_shared_ram[offset] = data; }
|
||||
void reset(int state);
|
||||
|
||||
optional_shared_ptr<u8> m_shared_ram; // 8 bit RAM shared between 68K and sound CPU
|
||||
|
||||
required_device<m68000_base_device> m_maincpu;
|
||||
optional_device<cpu_device> m_audiocpu;
|
||||
required_device<gp9001vdp_device> m_vdp;
|
||||
required_device<okim6295_device> m_oki;
|
||||
required_device<screen_device> m_screen;
|
||||
required_device<palette_device> m_palette;
|
||||
bitmap_ind8 m_custom_priority_bitmap;
|
||||
|
||||
protected:
|
||||
virtual void video_start() override ATTR_COLD;
|
||||
|
||||
};
|
||||
|
||||
class kbash2_state : public kbash_state
|
||||
{
|
||||
public:
|
||||
kbash2_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: kbash_state(mconfig, type, tag)
|
||||
, m_musicoki(*this, "musicoki")
|
||||
{ }
|
||||
|
||||
void kbash2(machine_config &config);
|
||||
|
||||
void kbash2_68k_mem(address_map &map) ATTR_COLD;
|
||||
|
||||
optional_device<okim6295_device> m_musicoki;
|
||||
};
|
||||
|
||||
void kbash_state::reset(int state)
|
||||
{
|
||||
m_audiocpu->pulse_input_line(INPUT_LINE_RESET, attotime::zero);
|
||||
}
|
||||
|
||||
void kbash_state::video_start()
|
||||
{
|
||||
m_screen->register_screen_bitmap(m_custom_priority_bitmap);
|
||||
m_vdp->custom_priority_bitmap = &m_custom_priority_bitmap;
|
||||
}
|
||||
|
||||
u32 kbash_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
bitmap.fill(0, cliprect);
|
||||
m_custom_priority_bitmap.fill(0, cliprect);
|
||||
m_vdp->render_vdp(bitmap, cliprect);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void kbash_state::screen_vblank(int state)
|
||||
{
|
||||
if (state) // rising edge
|
||||
{
|
||||
m_vdp->screen_eof();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void kbash_state::kbash_oki_bankswitch_w(u8 data)
|
||||
{
|
||||
m_oki->set_rom_bank(data & 1);
|
||||
}
|
||||
|
||||
|
||||
static INPUT_PORTS_START( base )
|
||||
PORT_START("IN1")
|
||||
TOAPLAN_JOY_UDLR_3_BUTTONS( 1 )
|
||||
|
||||
PORT_START("IN2")
|
||||
TOAPLAN_JOY_UDLR_3_BUTTONS( 2 )
|
||||
|
||||
PORT_START("SYS")
|
||||
PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_SERVICE1 )
|
||||
PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_TILT )
|
||||
TOAPLAN_TEST_SWITCH( 0x04, IP_ACTIVE_HIGH )
|
||||
PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_COIN1 )
|
||||
PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_COIN2 )
|
||||
PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_START1 )
|
||||
PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_START2 )
|
||||
PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNKNOWN )
|
||||
|
||||
PORT_START("DSWA")
|
||||
TOAPLAN_MACHINE_NO_COCKTAIL_LOC(SW1)
|
||||
// Coinage on bit mask 0x00f0
|
||||
PORT_BIT( 0x00f0, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // Modified below
|
||||
|
||||
PORT_START("DSWB")
|
||||
TOAPLAN_DIFFICULTY_LOC(SW2)
|
||||
// Per-game features on bit mask 0x00fc
|
||||
PORT_BIT( 0x00fc, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // Modified below
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
static INPUT_PORTS_START( kbash )
|
||||
PORT_INCLUDE( base )
|
||||
|
||||
PORT_MODIFY("DSWA")
|
||||
PORT_DIPNAME( 0x0001, 0x0000, DEF_STR( Continue_Price ) ) PORT_DIPLOCATION("SW1:!1")
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( Normal ) )
|
||||
PORT_DIPSETTING( 0x0001, "Discount" )
|
||||
// Various features on bit mask 0x000e - see above
|
||||
TOAPLAN_COINAGE_DUAL_LOC( JMPR, 0x70, 0x20, SW1 )
|
||||
|
||||
PORT_MODIFY("DSWB")
|
||||
// Difficulty on bit mask 0x0003 - see above
|
||||
PORT_DIPNAME( 0x000c, 0x0000, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:!3,!4")
|
||||
PORT_DIPSETTING( 0x000c, DEF_STR( None ) )
|
||||
PORT_DIPSETTING( 0x0008, "200k only" )
|
||||
PORT_DIPSETTING( 0x0004, "100k only" )
|
||||
PORT_DIPSETTING( 0x0000, "100k and 400k" )
|
||||
PORT_DIPNAME( 0x0030, 0x0000, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:!5,!6")
|
||||
PORT_DIPSETTING( 0x0030, "1" )
|
||||
PORT_DIPSETTING( 0x0000, "2" )
|
||||
PORT_DIPSETTING( 0x0020, "3" )
|
||||
PORT_DIPSETTING( 0x0010, "4" )
|
||||
PORT_DIPNAME( 0x0040, 0x0000, "Invulnerability (Cheat)" ) PORT_DIPLOCATION("SW2:!7")
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0040, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0080, 0x0000, DEF_STR( Allow_Continue ) ) PORT_DIPLOCATION("SW2:!8")
|
||||
PORT_DIPSETTING( 0x0080, DEF_STR( No ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( Yes ) )
|
||||
|
||||
PORT_START("JMPR")
|
||||
PORT_CONFNAME( 0x00f0, 0x0020, DEF_STR( Region ) ) //PORT_CONFLOCATION("JP:!4,!3,!2,!1")
|
||||
PORT_CONFSETTING( 0x0020, "Europe, USA (Atari Games)" ) // European coinage
|
||||
PORT_CONFSETTING( 0x0010, "USA, Europe (Atari Games)" )
|
||||
PORT_CONFSETTING( 0x0000, DEF_STR( Japan ) )
|
||||
PORT_CONFSETTING( 0x0030, DEF_STR( Korea ) )
|
||||
PORT_CONFSETTING( 0x0040, DEF_STR( Hong_Kong ) )
|
||||
PORT_CONFSETTING( 0x0050, DEF_STR( Taiwan ) )
|
||||
PORT_CONFSETTING( 0x0060, DEF_STR( Southeast_Asia ) ) // Service Mode wrongly shows European coinage
|
||||
// PORT_CONFSETTING( 0x0070, DEF_STR( Unused ) )
|
||||
// PORT_CONFSETTING( 0x0080, DEF_STR( Unused ) )
|
||||
PORT_CONFSETTING( 0x0090, DEF_STR( USA ) )
|
||||
PORT_CONFSETTING( 0x00a0, DEF_STR( Europe ) ) // European coinage
|
||||
// PORT_CONFSETTING( 0x00b0, DEF_STR( Unused ) )
|
||||
// PORT_CONFSETTING( 0x00c0, DEF_STR( Unused ) )
|
||||
// PORT_CONFSETTING( 0x00d0, DEF_STR( Unused ) )
|
||||
// PORT_CONFSETTING( 0x00e0, DEF_STR( Unused ) ) // Service Mode wrongly shows European coinage
|
||||
// PORT_CONFSETTING( 0x00f0, DEF_STR( Unused ) )
|
||||
INPUT_PORTS_END
|
||||
|
||||
static INPUT_PORTS_START( kbashk )
|
||||
PORT_INCLUDE( kbash )
|
||||
|
||||
PORT_MODIFY("JMPR")
|
||||
PORT_CONFNAME( 0x00f0, 0x0000, DEF_STR( Region ) ) //PORT_CONFLOCATION("JP:!4,!3,!2,!1")
|
||||
PORT_CONFSETTING( 0x0000, "Japan (Taito license)" ) // Taito license
|
||||
PORT_CONFSETTING( 0x0010, DEF_STR( Unused ) )
|
||||
PORT_CONFSETTING( 0x0020, DEF_STR( Unused ) )
|
||||
PORT_CONFSETTING( 0x0030, DEF_STR( Korea ) )
|
||||
PORT_CONFSETTING( 0x0040, DEF_STR( Hong_Kong ) )
|
||||
PORT_CONFSETTING( 0x0050, DEF_STR( Taiwan ) )
|
||||
PORT_CONFSETTING( 0x0060, DEF_STR( Southeast_Asia ) )
|
||||
PORT_CONFSETTING( 0x0070, DEF_STR( Unused ) )
|
||||
PORT_CONFSETTING( 0x0080, DEF_STR( Japan ) ) // no Taito license
|
||||
PORT_CONFSETTING( 0x0090, DEF_STR( Unused ) )
|
||||
PORT_CONFSETTING( 0x00a0, DEF_STR( Unused ) )
|
||||
PORT_CONFSETTING( 0x00b0, DEF_STR( Korea ) )
|
||||
PORT_CONFSETTING( 0x00c0, DEF_STR( Hong_Kong ))
|
||||
PORT_CONFSETTING( 0x00d0, DEF_STR( Taiwan ))
|
||||
PORT_CONFSETTING( 0x00e0, DEF_STR( Southeast_Asia ))
|
||||
PORT_CONFSETTING( 0x00f0, DEF_STR( Unused ) )
|
||||
INPUT_PORTS_END
|
||||
|
||||
static INPUT_PORTS_START( kbash2 )
|
||||
PORT_INCLUDE( kbash )
|
||||
|
||||
PORT_MODIFY("DSWA")
|
||||
TOAPLAN_COINAGE_DUAL_LOC( JMPR, 0x07, 0x02, SW1 )
|
||||
|
||||
PORT_MODIFY("JMPR")
|
||||
PORT_CONFNAME( 0x000f, 0x0006, DEF_STR( Region ) ) //PORT_CONFLOCATION("JP:!4,!3,!2,!1")
|
||||
PORT_CONFSETTING( 0x0000, "Japan (Taito Corp.)" )
|
||||
// PORT_CONFSETTING( 0x0001, DEF_STR( Unused ) )
|
||||
// PORT_CONFSETTING( 0x0002, DEF_STR( Unused ) ) // European coinage
|
||||
PORT_CONFSETTING( 0x0003, "Korea (Unite Trading)" )
|
||||
PORT_CONFSETTING( 0x0004, DEF_STR( Hong_Kong ) )
|
||||
PORT_CONFSETTING( 0x0005, DEF_STR( Taiwan ) )
|
||||
PORT_CONFSETTING( 0x0006, "Southeast Asia (Charterfield)" ) // Service Mode wrongly shows European coinage
|
||||
// PORT_CONFSETTING( 0x0007, DEF_STR( Unused ) )
|
||||
PORT_CONFSETTING( 0x0008, DEF_STR( Japan ) )
|
||||
// PORT_CONFSETTING( 0x0009, DEF_STR( Unused ) )
|
||||
// PORT_CONFSETTING( 0x000a, DEF_STR( Unused ) ) // European coinage
|
||||
PORT_CONFSETTING( 0x000b, DEF_STR( Korea ) )
|
||||
// PORT_CONFSETTING( 0x000c, DEF_STR( Hong_Kong ) )
|
||||
// PORT_CONFSETTING( 0x000d, DEF_STR( Taiwan ) )
|
||||
PORT_CONFSETTING( 0x000e, DEF_STR( Southeast_Asia ) ) // Service Mode wrongly shows European coinage
|
||||
// PORT_CONFSETTING( 0x000f, DEF_STR( Unused ) )
|
||||
PORT_BIT( 0x00f0, IP_ACTIVE_HIGH, IPT_UNKNOWN )
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
|
||||
void kbash_state::kbash_68k_mem(address_map &map)
|
||||
{
|
||||
map(0x000000, 0x07ffff).rom();
|
||||
map(0x100000, 0x103fff).ram();
|
||||
map(0x200000, 0x200fff).rw(FUNC(kbash_state::shared_ram_r), FUNC(kbash_state::shared_ram_w)).umask16(0x00ff);
|
||||
map(0x208010, 0x208011).portr("IN1");
|
||||
map(0x208014, 0x208015).portr("IN2");
|
||||
map(0x208018, 0x208019).portr("SYS");
|
||||
map(0x20801d, 0x20801d).w("coincounter", FUNC(toaplan_coincounter_device::coin_w));
|
||||
map(0x300000, 0x30000d).rw(m_vdp, FUNC(gp9001vdp_device::read), FUNC(gp9001vdp_device::write));
|
||||
map(0x400000, 0x400fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
|
||||
map(0x700000, 0x700001).r(m_vdp, FUNC(gp9001vdp_device::vdpcount_r)); // test bit 8
|
||||
}
|
||||
|
||||
|
||||
void kbash2_state::kbash2_68k_mem(address_map &map)
|
||||
{
|
||||
map(0x000000, 0x07ffff).rom();
|
||||
map(0x100000, 0x103fff).ram();
|
||||
map(0x104000, 0x10401f).ram(); // Sound related?
|
||||
map(0x200000, 0x200001).noprw(); // Left over from original code - Sound Number write, Status read
|
||||
map(0x200002, 0x200003).nopw(); // Left over from original code - Reset Sound
|
||||
map(0x200004, 0x200005).portr("DSWA");
|
||||
map(0x200008, 0x200009).portr("DSWB");
|
||||
map(0x20000c, 0x20000d).portr("JMPR");
|
||||
map(0x200010, 0x200011).portr("IN1");
|
||||
map(0x200014, 0x200015).portr("IN2");
|
||||
map(0x200018, 0x200019).portr("SYS");
|
||||
map(0x200021, 0x200021).rw(m_musicoki, FUNC(okim6295_device::read), FUNC(okim6295_device::write));
|
||||
map(0x200025, 0x200025).rw(m_oki, FUNC(okim6295_device::read), FUNC(okim6295_device::write));
|
||||
map(0x200029, 0x200029).w(FUNC(kbash2_state::kbash_oki_bankswitch_w));
|
||||
map(0x20002c, 0x20002d).r(m_vdp, FUNC(gp9001vdp_device::vdpcount_r));
|
||||
map(0x300000, 0x30000d).rw(m_vdp, FUNC(gp9001vdp_device::read), FUNC(gp9001vdp_device::write));
|
||||
map(0x400000, 0x400fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
|
||||
}
|
||||
|
||||
void kbash_state::kbash_v25_mem(address_map &map)
|
||||
{
|
||||
map(0x00000, 0x007ff).ram().share(m_shared_ram);
|
||||
map(0x04000, 0x04001).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write));
|
||||
map(0x04002, 0x04002).rw(m_oki, FUNC(okim6295_device::read), FUNC(okim6295_device::write));
|
||||
map(0x80000, 0x87fff).mirror(0x78000).rom().region("audiocpu", 0);
|
||||
}
|
||||
|
||||
|
||||
void kbash_state::kbash(machine_config &config)
|
||||
{
|
||||
/* basic machine hardware */
|
||||
M68000(config, m_maincpu, 16_MHz_XTAL); /* 16MHz Oscillator */
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &kbash_state::kbash_68k_mem);
|
||||
m_maincpu->reset_cb().set(FUNC(kbash_state::reset));
|
||||
|
||||
/* ROM based v25 */
|
||||
v25_device &audiocpu(V25(config, m_audiocpu, 16_MHz_XTAL)); /* NEC V25 type Toaplan marked CPU ??? */
|
||||
audiocpu.set_addrmap(AS_PROGRAM, &kbash_state::kbash_v25_mem);
|
||||
audiocpu.set_decryption_table(toaplan_v25_tables::nitro_decryption_table);
|
||||
audiocpu.pt_in_cb().set_ioport("DSWA").exor(0xff);
|
||||
audiocpu.p0_in_cb().set_ioport("DSWB").exor(0xff);
|
||||
audiocpu.p1_in_cb().set_ioport("JMPR").exor(0xff);
|
||||
audiocpu.p2_out_cb().set_nop(); // bit 0 is FAULT according to kbash schematic
|
||||
|
||||
TOAPLAN_COINCOUNTER(config, "coincounter", 0);
|
||||
|
||||
/* video hardware */
|
||||
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
|
||||
m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
|
||||
m_screen->set_raw(27_MHz_XTAL/4, 432, 0, 320, 262, 0, 240);
|
||||
m_screen->set_screen_update(FUNC(kbash_state::screen_update));
|
||||
m_screen->screen_vblank().set(FUNC(kbash_state::screen_vblank));
|
||||
m_screen->set_palette(m_palette);
|
||||
|
||||
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, gp9001vdp_device::VDP_PALETTE_LENGTH);
|
||||
|
||||
GP9001_VDP(config, m_vdp, 27_MHz_XTAL);
|
||||
m_vdp->set_palette(m_palette);
|
||||
m_vdp->vint_out_cb().set_inputline(m_maincpu, M68K_IRQ_4);
|
||||
|
||||
/* sound hardware */
|
||||
SPEAKER(config, "mono").front_center();
|
||||
|
||||
YM2151(config, "ymsnd", 27_MHz_XTAL/8).add_route(ALL_OUTPUTS, "mono", 0.5);
|
||||
|
||||
OKIM6295(config, m_oki, 32_MHz_XTAL/32, okim6295_device::PIN7_HIGH);
|
||||
m_oki->add_route(ALL_OUTPUTS, "mono", 0.5);
|
||||
}
|
||||
|
||||
|
||||
void kbash2_state::kbash2(machine_config &config)
|
||||
{
|
||||
/* basic machine hardware */
|
||||
M68000(config, m_maincpu, 16_MHz_XTAL); /* 16MHz Oscillator */
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &kbash2_state::kbash2_68k_mem);
|
||||
|
||||
/* video hardware */
|
||||
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
|
||||
m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
|
||||
m_screen->set_raw(27_MHz_XTAL/4, 432, 0, 320, 262, 0, 240);
|
||||
m_screen->set_screen_update(FUNC(kbash2_state::screen_update));
|
||||
m_screen->screen_vblank().set(FUNC(kbash2_state::screen_vblank));
|
||||
m_screen->set_palette(m_palette);
|
||||
|
||||
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, gp9001vdp_device::VDP_PALETTE_LENGTH);
|
||||
|
||||
GP9001_VDP(config, m_vdp, 27_MHz_XTAL);
|
||||
m_vdp->set_palette(m_palette);
|
||||
m_vdp->vint_out_cb().set_inputline(m_maincpu, M68K_IRQ_4);
|
||||
|
||||
/* sound hardware */
|
||||
SPEAKER(config, "mono").front_center();
|
||||
|
||||
OKIM6295(config, m_oki, 16_MHz_XTAL/16, okim6295_device::PIN7_HIGH);
|
||||
m_oki->add_route(ALL_OUTPUTS, "mono", 0.5);
|
||||
|
||||
OKIM6295(config, m_musicoki, 16_MHz_XTAL/16, okim6295_device::PIN7_HIGH);
|
||||
m_musicoki->add_route(ALL_OUTPUTS, "mono", 0.5);
|
||||
}
|
||||
|
||||
|
||||
ROM_START( kbash )
|
||||
ROM_REGION( 0x080000, "maincpu", 0 ) /* Main 68K code */
|
||||
ROM_LOAD16_WORD_SWAP( "tp023_01.bin", 0x000000, 0x080000, CRC(2965f81d) SHA1(46f2df30fa92c80ba5a37f75e756424e15534784) )
|
||||
|
||||
/* Secondary CPU is a Toaplan marked chip, (TS-004-Dash TOA PLAN) */
|
||||
/* It's a NEC V25 (PLCC94) (encrypted) */
|
||||
|
||||
ROM_REGION( 0x8000, "audiocpu", 0 ) /* Sound CPU code */
|
||||
ROM_LOAD( "tp023_02.bin", 0x0000, 0x8000, CRC(4cd882a1) SHA1(7199a5c384918f775f0815e09c46b2a58141814a) )
|
||||
|
||||
ROM_REGION( 0x800000, "gp9001", 0 )
|
||||
ROM_LOAD( "tp023_3.bin", 0x000000, 0x200000, CRC(32ad508b) SHA1(e473489beaf649d3e5236770eb043327e309850c) )
|
||||
ROM_LOAD( "tp023_5.bin", 0x200000, 0x200000, CRC(b84c90eb) SHA1(17a1531d884d9a9696d1b25d65f9155f02396e0e) )
|
||||
ROM_LOAD( "tp023_4.bin", 0x400000, 0x200000, CRC(e493c077) SHA1(0edcfb70483ad07206695d9283031b85cd198a36) )
|
||||
ROM_LOAD( "tp023_6.bin", 0x600000, 0x200000, CRC(9084b50a) SHA1(03b58278619524d2f09a4b1c152d5e057e792a56) )
|
||||
|
||||
ROM_REGION( 0x40000, "oki", 0 ) /* ADPCM Samples */
|
||||
ROM_LOAD( "tp023_7.bin", 0x00000, 0x40000, CRC(3732318f) SHA1(f0768459f5ad2dee53d408a0a5ae3a314864e667) )
|
||||
ROM_END
|
||||
|
||||
ROM_START( kbashk )
|
||||
ROM_REGION( 0x080000, "maincpu", 0 ) /* Main 68K code */
|
||||
ROM_LOAD16_WORD_SWAP( "tp023_01.u52", 0x000000, 0x080000, CRC(099aefbc) SHA1(8daa0deffe221e1bb5a8744ced18c23ad319ffd3) ) // same label as parent?
|
||||
|
||||
/* Secondary CPU is a Toaplan marked chip, (TS-004-Dash TOA PLAN) */
|
||||
/* It's a NEC V25 (PLCC94) (encrypted) */
|
||||
|
||||
ROM_REGION( 0x8000, "audiocpu", 0 ) /* Sound CPU code */
|
||||
ROM_LOAD( "tp023_02.bin", 0x0000, 0x8000, CRC(4cd882a1) SHA1(7199a5c384918f775f0815e09c46b2a58141814a) )
|
||||
|
||||
ROM_REGION( 0x800000, "gp9001", 0 )
|
||||
ROM_LOAD( "tp023_3.bin", 0x000000, 0x200000, CRC(32ad508b) SHA1(e473489beaf649d3e5236770eb043327e309850c) )
|
||||
ROM_LOAD( "tp023_5.bin", 0x200000, 0x200000, CRC(b84c90eb) SHA1(17a1531d884d9a9696d1b25d65f9155f02396e0e) )
|
||||
ROM_LOAD( "tp023_4.bin", 0x400000, 0x200000, CRC(e493c077) SHA1(0edcfb70483ad07206695d9283031b85cd198a36) )
|
||||
ROM_LOAD( "tp023_6.bin", 0x600000, 0x200000, CRC(9084b50a) SHA1(03b58278619524d2f09a4b1c152d5e057e792a56) )
|
||||
|
||||
ROM_REGION( 0x40000, "oki", 0 ) /* ADPCM Samples */
|
||||
ROM_LOAD( "tp023_7.bin", 0x00000, 0x40000, CRC(3732318f) SHA1(f0768459f5ad2dee53d408a0a5ae3a314864e667) )
|
||||
ROM_END
|
||||
|
||||
// all labels handwritten. Given the AOU on the audio ROM, maybe a prototype destined to be showed there?
|
||||
// GFX ROMs are on 4 riser boards. They are smaller but contain the same data as the final version.
|
||||
// Only different ROMs are the main and audio CPU ones
|
||||
ROM_START( kbashp )
|
||||
ROM_REGION( 0x080000, "maincpu", 0 )
|
||||
ROM_LOAD16_WORD_SWAP( "2-19.u52", 0x000000, 0x080000, CRC(60dfdfec) SHA1(ca61433c8f7b1b765a699c375c946f113beeccc4) ) // actually 2/19
|
||||
|
||||
/* Secondary CPU is a Toaplan marked chip, (NITRO TOA PLAN 509) */
|
||||
/* It's a NEC V25 (PLCC94) (encrypted) */
|
||||
|
||||
ROM_REGION( 0x8000, "audiocpu", 0 )
|
||||
ROM_LOAD( "aou-nb-sound.u34", 0x0000, 0x8000, CRC(26ba8fb1) SHA1(4259c4704f0fea0c8befa2e60a0838280b23a507) )
|
||||
|
||||
ROM_REGION( 0x800000, "gp9001", 0 )
|
||||
ROM_LOAD( "0.u1", 0x000000, 0x080000, CRC(1b87ffa5) SHA1(fbd5ac9e9635c1f5b1b896a3d504b827c0a99679) )
|
||||
ROM_LOAD( "2.u2", 0x080000, 0x080000, CRC(a411457e) SHA1(6b515e6524aa4fb1785d99556fefb0434368de84) )
|
||||
ROM_LOAD( "4.u3", 0x100000, 0x080000, CRC(631f770d) SHA1(0f0c11bc5549ed68d20dfc6ae51c3caec65aab88) )
|
||||
ROM_LOAD( "6.u4", 0x180000, 0x080000, CRC(5a46d262) SHA1(56d5180196b5acf76b700e627878998e88a21f3c) )
|
||||
ROM_LOAD( "8.u1", 0x200000, 0x080000, CRC(11b1c986) SHA1(05260c6cc5ab4239b52549e0dcda8853fc1fcd3a) )
|
||||
ROM_LOAD( "a.u2", 0x280000, 0x080000, CRC(4c4b47ce) SHA1(a41a27ac96bd9eb57bc4bd8b6592b70e86ad16d3) )
|
||||
ROM_LOAD( "c.u3", 0x300000, 0x080000, CRC(1ccc6a19) SHA1(d5735c2f075d81018021ec9e8642104227b67ace) )
|
||||
ROM_LOAD( "e.u4", 0x380000, 0x080000, CRC(731ad154) SHA1(78efce53000d170098b57342641299aacb7a82aa) )
|
||||
ROM_LOAD( "3.u1", 0x400000, 0x080000, CRC(7fbe0452) SHA1(c9b8c0d7126382fcdf8b5fa9a4466292954c88f7) )
|
||||
ROM_LOAD( "1.u2", 0x480000, 0x080000, CRC(6cd94e90) SHA1(9957ad69f8e80370dbf2cd863d0646241236f6b4) )
|
||||
ROM_LOAD( "5.u3", 0x500000, 0x080000, CRC(9cb4884e) SHA1(f596902b7740de4c262b4b18ac17eccca566ea77) )
|
||||
ROM_LOAD( "7.u4", 0x580000, 0x080000, CRC(53c2e0b6) SHA1(ee1128ad41ae3c68ef32d4211dd5205a9a5bb216) )
|
||||
ROM_LOAD( "g.u1", 0x600000, 0x080000, CRC(a63c795c) SHA1(30d3bb29cd73b31e233229f9304e3b87feaf01f3) )
|
||||
ROM_LOAD( "b.u2", 0x680000, 0x080000, CRC(32f8c39b) SHA1(a9029910c0b4fc3693081056a0afb9bcf9c0e699) )
|
||||
ROM_LOAD( "d.u3", 0x700000, 0x080000, CRC(40ac17d5) SHA1(140c67cf86ce545469fbe899b1f38c3a070908c9) )
|
||||
ROM_LOAD( "f.u4", 0x780000, 0x080000, CRC(2ca4eb83) SHA1(0d7c4242a82aba49cafd96ee5b051918d1b23b08) )
|
||||
|
||||
ROM_REGION( 0x40000, "oki", 0 )
|
||||
ROM_LOAD( "2m-nb-pcm.u40", 0x00000, 0x40000, CRC(3732318f) SHA1(f0768459f5ad2dee53d408a0a5ae3a314864e667) )
|
||||
ROM_END
|
||||
|
||||
/*
|
||||
Knuckle Bash 2
|
||||
This is a hacked version of Knuckle Bash on bootleg/Korean/Chinese
|
||||
hardware showing (C)Toaplan 1999 Licensed to Charterfield
|
||||
|
||||
PCB Layout
|
||||
----------
|
||||
|
||||
|--------------------------------------------|
|
||||
|UPC1241 EPROM MECAT-S |
|
||||
| LM324 |
|
||||
| M6295 M6295 |
|
||||
| PAL 62256 M5M51008 |
|
||||
| 62256 MECAT-M M5M51008 |
|
||||
| 6116 M5M51008 |
|
||||
|J 6116 14.31818MHz M5M51008 |
|
||||
|A 68000 |
|
||||
|M 16MHz |
|
||||
|M PAL |
|
||||
|A PAL |
|
||||
| |-------| |
|
||||
| |ACTEL | PAL |
|
||||
| |A40MX04| PAL |
|
||||
| | | |
|
||||
| DSW1 |-------| 050917-10 |
|
||||
| |ACTEL | |
|
||||
| DSW2 |A40MX04| MECAT-12 |
|
||||
|62256 | | |
|
||||
|62256 |-------| MECAT-34 |
|
||||
|--------------------------------------------|
|
||||
Notes:
|
||||
68000 clock 16.000MHz
|
||||
M6295 clock 1.000MHz [16/16]. Sample rate (Hz) 16000000/16/132
|
||||
M5M51008 - Mitsubishi M5M51008 128k x8 SRAM (SOP32)
|
||||
62256 - 32k x8 SRAM
|
||||
6116 - 2k x8 SRAM
|
||||
VSync 60Hz
|
||||
HSync 15.68kHz
|
||||
*/
|
||||
|
||||
ROM_START( kbash2 )
|
||||
ROM_REGION( 0x80000, "maincpu", 0 ) /* Main 68K code */
|
||||
ROM_LOAD16_WORD_SWAP( "mecat-m", 0x000000, 0x80000, CRC(bd2263c6) SHA1(eb794c0fc9c1fb4337114d48149283d42d22e4b3) )
|
||||
|
||||
ROM_REGION( 0x800000, "gp9001", 0 )
|
||||
ROM_LOAD( "mecat-34", 0x000000, 0x400000, CRC(6be7b37e) SHA1(13160ad0712fee932bb98cc226e651895b19228a) )
|
||||
ROM_LOAD( "mecat-12", 0x400000, 0x400000, CRC(49e46b1f) SHA1(d12b12696a8473eb34f3cd247ab060289a6c0e9c) )
|
||||
|
||||
ROM_REGION( 0x80000, "oki", 0 ) /* ADPCM Music */
|
||||
ROM_LOAD( "mecat-s", 0x00000, 0x80000, CRC(3eb7adf4) SHA1(b0e6e99726b854858bd0e69eb77f12b9664b35e6) )
|
||||
|
||||
ROM_REGION( 0x40000, "musicoki", 0 ) /* ADPCM Samples */
|
||||
ROM_LOAD( "eprom", 0x00000, 0x40000, CRC(31115cb9) SHA1(c79ea01bd865e2fc3aaab3ff05483c8fd27e5c98) )
|
||||
|
||||
ROM_REGION( 0x10000, "user1", 0 ) /* ??? Some sort of table - same as in pipibibi*/
|
||||
ROM_LOAD( "050917-10", 0x0000, 0x10000, CRC(6b213183) SHA1(599c59d155d11edb151bfaed1d24ef964462a447) )
|
||||
ROM_END
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
GAME( 1993, kbash, 0, kbash, kbash, kbash_state, empty_init, ROT0, "Toaplan / Atari", "Knuckle Bash", MACHINE_SUPPORTS_SAVE ) // Atari license shown for some regions.
|
||||
GAME( 1993, kbashk, kbash, kbash, kbashk, kbash_state, empty_init, ROT0, "Toaplan / Taito", "Knuckle Bash (Korean PCB)", MACHINE_SUPPORTS_SAVE ) // Japan region has optional Taito license, maybe the original Japan release?
|
||||
GAME( 1993, kbashp, kbash, kbash, kbash, kbash_state, empty_init, ROT0, "Toaplan / Taito", "Knuckle Bash (location test)", MACHINE_SUPPORTS_SAVE )
|
||||
|
||||
GAME( 1999, kbash2, 0, kbash2, kbash2, kbash2_state, empty_init, ROT0, "bootleg", "Knuckle Bash 2 (bootleg)", MACHINE_SUPPORTS_SAVE )
|
495
src/mame/toaplan/pipibibi.cpp
Normal file
495
src/mame/toaplan/pipibibi.cpp
Normal file
@ -0,0 +1,495 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Quench, Yochizo, David Haywood
|
||||
|
||||
#include "emu.h"
|
||||
|
||||
#include "emupal.h"
|
||||
#include "screen.h"
|
||||
#include "speaker.h"
|
||||
#include "tilemap.h"
|
||||
|
||||
#include "toaplan_coincounter.h"
|
||||
#include "toaplipt.h"
|
||||
#include "gp9001.h"
|
||||
|
||||
#include "cpu/m68000/m68000.h"
|
||||
#include "cpu/z80/z80.h"
|
||||
#include "sound/ymopm.h"
|
||||
#include "sound/ymopl.h"
|
||||
|
||||
/*
|
||||
* Name Board No Maker Game name
|
||||
----------------------------------------------------------------------------
|
||||
pipibibs TP-025 Toaplan Pipi & Bibis / Whoopee!! (set 1)
|
||||
pipibibsa TP-025 Toaplan Pipi & Bibis / Whoopee!! (set 2)
|
||||
pipibibsp TP-025 Toaplan Pipi & Bibis / Whoopee!! (Prototype)
|
||||
pipibibsbl bootleg Toaplan Pipi & Bibis / Whoopee!! (based of the prototype)
|
||||
|
||||
TODO:
|
||||
- move bootlegs to oneshot.cpp driver
|
||||
*/
|
||||
|
||||
namespace {
|
||||
|
||||
class pipibibi_state : public driver_device
|
||||
{
|
||||
public:
|
||||
pipibibi_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: driver_device(mconfig, type, tag)
|
||||
, m_shared_ram(*this, "shared_ram")
|
||||
, m_maincpu(*this, "maincpu")
|
||||
, m_audiocpu(*this, "audiocpu")
|
||||
, m_vdp(*this, "gp9001")
|
||||
, m_screen(*this, "screen")
|
||||
, m_palette(*this, "palette")
|
||||
{ }
|
||||
|
||||
void pipibibs(machine_config &config);
|
||||
|
||||
protected:
|
||||
virtual void video_start() override ATTR_COLD;
|
||||
u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
void screen_vblank(int state);
|
||||
|
||||
u8 shared_ram_r(offs_t offset) { return m_shared_ram[offset]; }
|
||||
void shared_ram_w(offs_t offset, u8 data) { m_shared_ram[offset] = data; }
|
||||
|
||||
void pipibibs_68k_mem(address_map &map) ATTR_COLD;
|
||||
void pipibibs_sound_z80_mem(address_map &map) ATTR_COLD;
|
||||
void reset(int state);
|
||||
|
||||
required_shared_ptr<u8> m_shared_ram; // 8 bit RAM shared between 68K and sound CPU
|
||||
required_device<m68000_base_device> m_maincpu;
|
||||
required_device<cpu_device> m_audiocpu;
|
||||
required_device<gp9001vdp_device> m_vdp;
|
||||
required_device<screen_device> m_screen;
|
||||
required_device<palette_device> m_palette;
|
||||
bitmap_ind8 m_custom_priority_bitmap;
|
||||
};
|
||||
|
||||
class pipibibi_bootleg_state : public pipibibi_state
|
||||
{
|
||||
public:
|
||||
pipibibi_bootleg_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: pipibibi_state(mconfig, type, tag)
|
||||
{ }
|
||||
|
||||
void pipibibsbl(machine_config &config);
|
||||
|
||||
void init_pipibibsbl();
|
||||
|
||||
private:
|
||||
void cpu_space_pipibibsbl_map(address_map &map) ATTR_COLD;
|
||||
void pipibibi_bootleg_68k_mem(address_map &map) ATTR_COLD;
|
||||
|
||||
};
|
||||
|
||||
void pipibibi_state::reset(int state)
|
||||
{
|
||||
m_audiocpu->pulse_input_line(INPUT_LINE_RESET, attotime::zero);
|
||||
}
|
||||
|
||||
void pipibibi_state::video_start()
|
||||
{
|
||||
m_screen->register_screen_bitmap(m_custom_priority_bitmap);
|
||||
m_vdp->custom_priority_bitmap = &m_custom_priority_bitmap;
|
||||
}
|
||||
|
||||
|
||||
u32 pipibibi_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
bitmap.fill(0, cliprect);
|
||||
m_custom_priority_bitmap.fill(0, cliprect);
|
||||
m_vdp->render_vdp(bitmap, cliprect);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void pipibibi_state::screen_vblank(int state)
|
||||
{
|
||||
if (state) // rising edge
|
||||
{
|
||||
m_vdp->screen_eof();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
static INPUT_PORTS_START( base )
|
||||
PORT_START("IN1")
|
||||
TOAPLAN_JOY_UDLR_2_BUTTONS( 1 )
|
||||
|
||||
PORT_START("IN2")
|
||||
TOAPLAN_JOY_UDLR_2_BUTTONS( 2 )
|
||||
|
||||
PORT_START("SYS")
|
||||
PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_SERVICE1 )
|
||||
PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_TILT )
|
||||
TOAPLAN_TEST_SWITCH( 0x04, IP_ACTIVE_HIGH )
|
||||
PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_COIN1 )
|
||||
PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_COIN2 )
|
||||
PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_START1 )
|
||||
PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_START2 )
|
||||
PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNKNOWN )
|
||||
|
||||
PORT_START("DSWA")
|
||||
TOAPLAN_MACHINE_NO_COCKTAIL_LOC(SW1)
|
||||
// Coinage on bit mask 0x00f0
|
||||
PORT_BIT( 0x00f0, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // Modified below
|
||||
|
||||
PORT_START("DSWB")
|
||||
TOAPLAN_DIFFICULTY_LOC(SW2)
|
||||
// Per-game features on bit mask 0x00fc
|
||||
PORT_BIT( 0x00fc, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // Modified below
|
||||
INPUT_PORTS_END
|
||||
|
||||
static INPUT_PORTS_START( pipibibs )
|
||||
PORT_INCLUDE( base )
|
||||
|
||||
PORT_MODIFY("DSWA")
|
||||
// Various features on bit mask 0x000f - see above
|
||||
TOAPLAN_COINAGE_DUAL_LOC( JMPR, 0x06, 0x06, SW1 )
|
||||
|
||||
PORT_MODIFY("DSWB")
|
||||
// Difficulty on bit mask 0x0003 - see above
|
||||
PORT_DIPNAME( 0x000c, 0x0000, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:!3,!4")
|
||||
PORT_DIPSETTING( 0x000c, DEF_STR( None ) )
|
||||
PORT_DIPSETTING( 0x0008, "200k only" )
|
||||
PORT_DIPSETTING( 0x0000, "200k and every 300k" )
|
||||
PORT_DIPSETTING( 0x0004, "150k and every 200k" )
|
||||
PORT_DIPNAME( 0x0030, 0x0000, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:!5,!6")
|
||||
PORT_DIPSETTING( 0x0030, "1" )
|
||||
PORT_DIPSETTING( 0x0020, "2" )
|
||||
PORT_DIPSETTING( 0x0000, "3" )
|
||||
PORT_DIPSETTING( 0x0010, "5" )
|
||||
PORT_DIPNAME( 0x0040, 0x0000, "Invulnerability (Cheat)" ) PORT_DIPLOCATION("SW2:!7")
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0040, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0080, 0x0000, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW2:!8")
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0080, DEF_STR( On ) )
|
||||
|
||||
PORT_START("JMPR")
|
||||
PORT_CONFNAME( 0x0008, 0x0000, "Nudity" ) //PORT_CONFLOCATION("JP:!1")
|
||||
PORT_CONFSETTING( 0x0008, DEF_STR( Low ) )
|
||||
PORT_CONFSETTING( 0x0000, "High, but censored" )
|
||||
PORT_CONFNAME( 0x0007, 0x0006, DEF_STR( Region ) ) //PORT_CONFLOCATION("JP:!4,!3,!2")
|
||||
PORT_CONFSETTING( 0x0006, DEF_STR( Europe ) )
|
||||
PORT_CONFSETTING( 0x0004, DEF_STR( USA ) )
|
||||
PORT_CONFSETTING( 0x0000, DEF_STR( Japan ) )
|
||||
PORT_CONFSETTING( 0x0001, DEF_STR( Asia ) )
|
||||
PORT_CONFSETTING( 0x0002, "Hong Kong (Honest Trading Co.)" )
|
||||
PORT_CONFSETTING( 0x0003, DEF_STR( Taiwan ) )
|
||||
PORT_CONFSETTING( 0x0005, "USA (Romstar, Inc.)" )
|
||||
PORT_CONFSETTING( 0x0007, "Europe (Nova Apparate GMBH & Co.)" )
|
||||
INPUT_PORTS_END
|
||||
|
||||
static INPUT_PORTS_START( pipibibsp )
|
||||
PORT_INCLUDE( pipibibs )
|
||||
|
||||
PORT_MODIFY("DSWA")
|
||||
// Various features on bit mask 0x000d - see above
|
||||
TOAPLAN_COINAGE_DUAL_LOC( JMPR, 0x80000, 0x80000, SW1 )
|
||||
|
||||
PORT_MODIFY("JMPR")
|
||||
// Bit Mask 0x80000 is used here to signify European Coinage for MAME purposes - not read on the real board!
|
||||
PORT_CONFNAME( 0x80007, 0x00002, DEF_STR( Region ) ) //PORT_CONFLOCATION("JP:!4,!3,!2,FAKE:!1")
|
||||
PORT_CONFSETTING( 0x00002, DEF_STR( World ) )
|
||||
PORT_CONFSETTING( 0x80005, DEF_STR( Europe ) )
|
||||
PORT_CONFSETTING( 0x00004, DEF_STR( USA ) )
|
||||
PORT_CONFSETTING( 0x00000, "Japan (Ryouta Kikaku)" )
|
||||
PORT_CONFSETTING( 0x00001, "Hong Kong (Honest Trading Co.)" )
|
||||
PORT_CONFSETTING( 0x80006, "Spain & Portugal (APM Electronics S.A.)" )
|
||||
PORT_CONFSETTING( 0x00007, "World (Ryouta Kikaku)" )
|
||||
INPUT_PORTS_END
|
||||
|
||||
static INPUT_PORTS_START( pipibibsbl )
|
||||
PORT_INCLUDE( pipibibs )
|
||||
|
||||
PORT_MODIFY("DSWA")
|
||||
PORT_DIPNAME( 0x0002, 0x0000, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW1:!2") // In Test Mode, it shows as Normal/Invert Screen - HW doesn't support it
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0002, DEF_STR( On ) )
|
||||
// Various features on bit mask 0x000d - see above
|
||||
TOAPLAN_COINAGE_DUAL_LOC( JMPR, 0x80000, 0x80000, SW1 )
|
||||
|
||||
PORT_MODIFY("JMPR")
|
||||
// Bit Mask 0x80000 is used here to signify European Coinage for MAME purposes - not read on the real board!
|
||||
PORT_CONFNAME( 0x80007, 0x00002, DEF_STR( Region ) ) //PORT_CONFLOCATION("JP:!4,!3,!2,FAKE:!1")
|
||||
PORT_CONFSETTING( 0x00002, DEF_STR( World ) )
|
||||
PORT_CONFSETTING( 0x80005, DEF_STR( Europe ) )
|
||||
PORT_CONFSETTING( 0x00004, DEF_STR( USA ) )
|
||||
PORT_CONFSETTING( 0x00000, "Japan (Ryouta Kikaku)" )
|
||||
PORT_CONFSETTING( 0x00001, "Hong Kong (Honest Trading Co.)" )
|
||||
PORT_CONFSETTING( 0x80006, "Spain & Portugal (APM Electronics S.A.)" )
|
||||
PORT_CONFSETTING( 0x00007, "World (Ryouta Kikaku)" )
|
||||
INPUT_PORTS_END
|
||||
|
||||
void pipibibi_state::pipibibs_68k_mem(address_map &map)
|
||||
{
|
||||
map(0x000000, 0x03ffff).rom();
|
||||
map(0x080000, 0x082fff).ram();
|
||||
map(0x0c0000, 0x0c0fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
|
||||
map(0x140000, 0x14000d).rw(m_vdp, FUNC(gp9001vdp_device::read), FUNC(gp9001vdp_device::write));
|
||||
map(0x190000, 0x190fff).rw(FUNC(pipibibi_state::shared_ram_r), FUNC(pipibibi_state::shared_ram_w)).umask16(0x00ff);
|
||||
map(0x19c01d, 0x19c01d).w("coincounter", FUNC(toaplan_coincounter_device::coin_w));
|
||||
map(0x19c020, 0x19c021).portr("DSWA");
|
||||
map(0x19c024, 0x19c025).portr("DSWB");
|
||||
map(0x19c028, 0x19c029).portr("JMPR");
|
||||
map(0x19c02c, 0x19c02d).portr("SYS");
|
||||
map(0x19c030, 0x19c031).portr("IN1");
|
||||
map(0x19c034, 0x19c035).portr("IN2");
|
||||
}
|
||||
|
||||
// odd scroll registers
|
||||
void pipibibi_bootleg_state::pipibibi_bootleg_68k_mem(address_map &map)
|
||||
{
|
||||
map(0x000000, 0x03ffff).rom();
|
||||
map(0x080000, 0x082fff).ram();
|
||||
map(0x083000, 0x0837ff).rw(m_vdp, FUNC(gp9001vdp_device::bootleg_spriteram16_r), FUNC(gp9001vdp_device::bootleg_spriteram16_w)); // SpriteRAM
|
||||
map(0x083800, 0x087fff).ram(); // SpriteRAM (unused)
|
||||
map(0x0c0000, 0x0c0fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
|
||||
map(0x120000, 0x120fff).ram(); // Copy of SpriteRAM ?
|
||||
// map(0x13f000, 0x13f001).nopw(); // ???
|
||||
map(0x180000, 0x182fff).rw(m_vdp, FUNC(gp9001vdp_device::bootleg_videoram16_r), FUNC(gp9001vdp_device::bootleg_videoram16_w)); // TileRAM
|
||||
map(0x188000, 0x18800f).w(m_vdp, FUNC(gp9001vdp_device::bootleg_scroll_w));
|
||||
map(0x190003, 0x190003).r(FUNC(pipibibi_bootleg_state::shared_ram_r)); // Z80 ready ?
|
||||
map(0x190011, 0x190011).w(FUNC(pipibibi_bootleg_state::shared_ram_w)); // Z80 task to perform
|
||||
map(0x19c01d, 0x19c01d).w("coincounter", FUNC(toaplan_coincounter_device::coin_w));
|
||||
map(0x19c020, 0x19c021).portr("DSWA");
|
||||
map(0x19c024, 0x19c025).portr("DSWB");
|
||||
map(0x19c028, 0x19c029).portr("JMPR");
|
||||
map(0x19c02c, 0x19c02d).portr("SYS");
|
||||
map(0x19c030, 0x19c031).portr("IN1");
|
||||
map(0x19c034, 0x19c035).portr("IN2");
|
||||
}
|
||||
|
||||
|
||||
void pipibibi_bootleg_state::cpu_space_pipibibsbl_map(address_map &map)
|
||||
{
|
||||
map(0xfffff0, 0xffffff).m(m_maincpu, FUNC(m68000_base_device::autovectors_map));
|
||||
map(0xfffff9, 0xfffff9).lr8(NAME([this] () { m_maincpu->set_input_line(M68K_IRQ_4, CLEAR_LINE); return m68000_device::autovector(4); }));
|
||||
}
|
||||
|
||||
void pipibibi_state::pipibibs_sound_z80_mem(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x7fff).rom();
|
||||
map(0x8000, 0x87ff).ram().share(m_shared_ram);
|
||||
map(0xe000, 0xe001).rw("ymsnd", FUNC(ym3812_device::read), FUNC(ym3812_device::write));
|
||||
}
|
||||
|
||||
void pipibibi_state::pipibibs(machine_config &config)
|
||||
{
|
||||
/* basic machine hardware */
|
||||
M68000(config, m_maincpu, 10_MHz_XTAL); // verified on PCB
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &pipibibi_state::pipibibs_68k_mem);
|
||||
m_maincpu->reset_cb().set(FUNC(pipibibi_state::reset));
|
||||
|
||||
Z80(config, m_audiocpu, 27_MHz_XTAL/8); // verified on PCB
|
||||
m_audiocpu->set_addrmap(AS_PROGRAM, &pipibibi_state::pipibibs_sound_z80_mem);
|
||||
|
||||
TOAPLAN_COINCOUNTER(config, "coincounter", 0);
|
||||
|
||||
config.set_maximum_quantum(attotime::from_hz(600));
|
||||
|
||||
/* video hardware */
|
||||
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
|
||||
m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
|
||||
m_screen->set_raw(27_MHz_XTAL/4, 432, 0, 320, 262, 0, 240);
|
||||
m_screen->set_screen_update(FUNC(pipibibi_state::screen_update));
|
||||
m_screen->screen_vblank().set(FUNC(pipibibi_state::screen_vblank));
|
||||
m_screen->set_palette(m_palette);
|
||||
|
||||
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, gp9001vdp_device::VDP_PALETTE_LENGTH);
|
||||
|
||||
GP9001_VDP(config, m_vdp, 27_MHz_XTAL);
|
||||
m_vdp->set_palette(m_palette);
|
||||
m_vdp->vint_out_cb().set_inputline(m_maincpu, M68K_IRQ_4);
|
||||
|
||||
/* sound hardware */
|
||||
SPEAKER(config, "mono").front_center();
|
||||
|
||||
ym3812_device &ymsnd(YM3812(config, "ymsnd", 27_MHz_XTAL/8)); // verified on PCB
|
||||
ymsnd.irq_handler().set_inputline(m_audiocpu, 0);
|
||||
ymsnd.add_route(ALL_OUTPUTS, "mono", 1.0);
|
||||
}
|
||||
|
||||
|
||||
void pipibibi_bootleg_state::pipibibsbl(machine_config &config)
|
||||
{
|
||||
/* basic machine hardware */
|
||||
M68000(config, m_maincpu, 12_MHz_XTAL); // ??? (position labeled "68000-12" but 10 MHz-rated parts used)
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &pipibibi_bootleg_state::pipibibi_bootleg_68k_mem);
|
||||
m_maincpu->set_addrmap(m68000_base_device::AS_CPU_SPACE, &pipibibi_bootleg_state::cpu_space_pipibibsbl_map);
|
||||
m_maincpu->reset_cb().set(FUNC(pipibibi_bootleg_state::reset));
|
||||
|
||||
Z80(config, m_audiocpu, 12_MHz_XTAL / 2); // GoldStar Z8400B; clock source and divider unknown
|
||||
m_audiocpu->set_addrmap(AS_PROGRAM, &pipibibi_bootleg_state::pipibibs_sound_z80_mem);
|
||||
|
||||
TOAPLAN_COINCOUNTER(config, "coincounter", 0);
|
||||
|
||||
config.set_maximum_quantum(attotime::from_hz(600));
|
||||
|
||||
/* video hardware */
|
||||
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
|
||||
m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
|
||||
m_screen->set_raw(28.322_MHz_XTAL / 4, 450, 0, 320, 262, 0, 240); // guess, but this is within NTSC parameters
|
||||
m_screen->set_screen_update(FUNC(pipibibi_bootleg_state::screen_update));
|
||||
m_screen->screen_vblank().set(FUNC(pipibibi_bootleg_state::screen_vblank));
|
||||
m_screen->set_palette(m_palette);
|
||||
|
||||
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, gp9001vdp_device::VDP_PALETTE_LENGTH);
|
||||
|
||||
GP9001_VDP(config, m_vdp, 27_MHz_XTAL); // FIXME: bootleg has no VDP
|
||||
m_vdp->set_palette(m_palette);
|
||||
m_vdp->vint_out_cb().set_inputline(m_maincpu, M68K_IRQ_4, ASSERT_LINE);
|
||||
m_vdp->set_bootleg_extra_offsets(0x01f, 0x1ef, 0x01d, 0x1ef, 0x01b, 0x1ef, 0x1d4, 0x1f7);
|
||||
|
||||
/* sound hardware */
|
||||
SPEAKER(config, "mono").front_center();
|
||||
|
||||
ym3812_device &ymsnd(YM3812(config, "ymsnd", 28.322_MHz_XTAL / 8)); // ???
|
||||
ymsnd.irq_handler().set_inputline(m_audiocpu, 0);
|
||||
ymsnd.add_route(ALL_OUTPUTS, "mono", 1.0);
|
||||
}
|
||||
|
||||
void pipibibi_bootleg_state::init_pipibibsbl()
|
||||
{
|
||||
u16 *ROM = (u16 *)(memregion("maincpu")->base());
|
||||
|
||||
for (int i = 0; i < (0x040000/2); i += 4)
|
||||
{
|
||||
ROM[i+0] = bitswap<16>(ROM[i+0],0x1,0x5,0x6,0x7,0x8,0x2,0x0,0x9,0xe,0xd,0x4,0x3,0xf,0xa,0xb,0xc);
|
||||
ROM[i+1] = bitswap<16>(ROM[i+1],0x5,0x3,0x1,0xf,0xd,0xb,0x9,0x0,0x2,0x4,0x6,0x8,0xa,0xc,0xe,0x7);
|
||||
ROM[i+2] = bitswap<16>(ROM[i+2],0xc,0xd,0xe,0xf,0x8,0x9,0xa,0xb,0x3,0x2,0x1,0x0,0x7,0x6,0x5,0x4);
|
||||
ROM[i+3] = bitswap<16>(ROM[i+3],0x8,0x9,0xa,0xb,0xc,0xd,0xe,0xf,0x3,0x2,0x1,0x0,0x7,0x6,0x5,0x4);
|
||||
}
|
||||
}
|
||||
|
||||
ROM_START( pipibibs )
|
||||
ROM_REGION( 0x040000, "maincpu", 0 ) /* Main 68K code */
|
||||
ROM_LOAD16_BYTE( "tp025-1.bin", 0x000000, 0x020000, CRC(b2ea8659) SHA1(400431b656dbfbd5a9bc5961c3ea04c4d38b6f77) )
|
||||
ROM_LOAD16_BYTE( "tp025-2.bin", 0x000001, 0x020000, CRC(dc53b939) SHA1(e4de371f97ba7c350273ad43b7f58ff31672a269) )
|
||||
|
||||
ROM_REGION( 0x10000, "audiocpu", 0 ) /* Sound Z80 code */
|
||||
ROM_LOAD( "tp025-5.bin", 0x0000, 0x8000, CRC(bf8ffde5) SHA1(79c09cc9a0ea979f5af5a7e5ad671ea486f5f43e) )
|
||||
|
||||
ROM_REGION( 0x200000, "gp9001", 0 )
|
||||
ROM_LOAD( "tp025-4.bin", 0x000000, 0x100000, CRC(ab97f744) SHA1(c1620e614345dbd5c6567e4cb6f55c61b900d0ee) )
|
||||
ROM_LOAD( "tp025-3.bin", 0x100000, 0x100000, CRC(7b16101e) SHA1(ae0119bbfa0937d18c4fbb0a3ef7cdc3b9fa6b56) )
|
||||
ROM_END
|
||||
|
||||
|
||||
ROM_START( pipibibsa )
|
||||
ROM_REGION( 0x040000, "maincpu", 0 ) /* Main 68K code */
|
||||
ROM_LOAD16_BYTE( "tp025-1.alt.bin", 0x000000, 0x020000, CRC(3e522d98) SHA1(043dd76b99e130909e47063d4cc773177a2eaccf) )
|
||||
ROM_LOAD16_BYTE( "tp025-2.alt.bin", 0x000001, 0x020000, CRC(48370485) SHA1(9895e086c9a5eeec4f454cbc6098adb2f66d4e11) )
|
||||
|
||||
ROM_REGION( 0x10000, "audiocpu", 0 ) /* Sound Z80 code */
|
||||
ROM_LOAD( "tp025-5.bin", 0x0000, 0x8000, CRC(bf8ffde5) SHA1(79c09cc9a0ea979f5af5a7e5ad671ea486f5f43e) )
|
||||
|
||||
ROM_REGION( 0x200000, "gp9001", 0 )
|
||||
ROM_LOAD( "tp025-4.bin", 0x000000, 0x100000, CRC(ab97f744) SHA1(c1620e614345dbd5c6567e4cb6f55c61b900d0ee) )
|
||||
ROM_LOAD( "tp025-3.bin", 0x100000, 0x100000, CRC(7b16101e) SHA1(ae0119bbfa0937d18c4fbb0a3ef7cdc3b9fa6b56) )
|
||||
ROM_END
|
||||
|
||||
|
||||
ROM_START( whoopee )
|
||||
ROM_REGION( 0x040000, "maincpu", 0 ) /* Main 68K code */
|
||||
ROM_LOAD16_BYTE( "whoopee.1", 0x000000, 0x020000, CRC(28882e7e) SHA1(8fcd278a7d005eb81cd9e461139c0c0f756a4fa4) )
|
||||
ROM_LOAD16_BYTE( "whoopee.2", 0x000001, 0x020000, CRC(6796f133) SHA1(d4e657be260ba3fd3f0556ade617882513b52685) )
|
||||
|
||||
ROM_REGION( 0x10000, "audiocpu", 0 ) /* Sound HD647180 code */
|
||||
ROM_LOAD( "hd647180.025", 0x00000, 0x08000, CRC(c02436f6) SHA1(385343f88991646ec23b385eaea82718f1251ea6) )
|
||||
|
||||
ROM_REGION( 0x200000, "gp9001", 0 )
|
||||
ROM_LOAD( "tp025-4.bin", 0x000000, 0x100000, CRC(ab97f744) SHA1(c1620e614345dbd5c6567e4cb6f55c61b900d0ee) )
|
||||
ROM_LOAD( "tp025-3.bin", 0x100000, 0x100000, CRC(7b16101e) SHA1(ae0119bbfa0937d18c4fbb0a3ef7cdc3b9fa6b56) )
|
||||
ROM_END
|
||||
|
||||
|
||||
ROM_START( pipibibsp )
|
||||
ROM_REGION( 0x080000, "maincpu", 0 ) /* Main 68K code */
|
||||
ROM_LOAD16_BYTE( "pip_cpu_e", 0x000000, 0x020000, CRC(ae3205bd) SHA1(1613fec637dfed213433dca0d267e49f4848df81) )
|
||||
ROM_LOAD16_BYTE( "pip_cpu_o", 0x000001, 0x020000, CRC(241669a9) SHA1(234e0bb819453e16625d15d2cf22496bbc547943) )
|
||||
|
||||
ROM_REGION( 0x10000, "audiocpu", 0 ) /* Sound Z80 code */
|
||||
ROM_LOAD( "pip_snd", 0x0000, 0x8000, CRC(8ebf183b) SHA1(602b138c85b02d121d007f6788b322aa107c7d91) )
|
||||
|
||||
ROM_REGION( 0x200000, "gp9001", 0 )
|
||||
ROM_LOAD( "cg_01_l", 0x000000, 0x080000, CRC(21d1ef46) SHA1(d7ccbe56eb08be421c241065cbaa99cc9cca4d73) )
|
||||
ROM_LOAD( "cg_01_h", 0x080000, 0x080000, CRC(d5726328) SHA1(26401ba8ce22fda161306b91d70afefa959cde8c) )
|
||||
ROM_LOAD( "cg_23_l", 0x100000, 0x080000, CRC(114d41d0) SHA1(d1166d495d92c6082fffbed422deb7605c5a41a2) )
|
||||
ROM_LOAD( "cg_23_h", 0x180000, 0x080000, CRC(e0468152) SHA1(f5a872d8658e959ec6cce51c7798291b5b973f15) )
|
||||
ROM_END
|
||||
|
||||
|
||||
// TODO: this runs on oneshot.cpp hardware. Move to that driver and remove the hacks in video/gp9001.cpp needed to run it in this driver
|
||||
ROM_START( pipibibsbl ) /* Based off the proto code. */
|
||||
ROM_REGION( 0x040000, "maincpu", 0 ) /* Main 68K code */
|
||||
ROM_LOAD16_BYTE( "ppbb06.bin", 0x000000, 0x020000, CRC(14c92515) SHA1(2d7f7c89272bb2a8115f163ad651bef3bca5107e) )
|
||||
ROM_LOAD16_BYTE( "ppbb05.bin", 0x000001, 0x020000, CRC(3d51133c) SHA1(d7bd94ad11e9aeb5a5165c5ac6f71950849bcd2f) )
|
||||
|
||||
ROM_REGION( 0x10000, "audiocpu", 0 ) /* Sound Z80 code */
|
||||
ROM_LOAD( "ppbb08.bin", 0x0000, 0x8000, CRC(101c0358) SHA1(162e02d00b7bdcdd3b48a0cd0527b7428435ec50) ) // same data as komocomo in oneshot.cpp
|
||||
|
||||
ROM_REGION( 0x200000, "gp9001", 0 )
|
||||
/* GFX data differs slightly from Toaplan boards ??? */
|
||||
ROM_LOAD16_BYTE( "ppbb01.bin", 0x000000, 0x080000, CRC(0fcae44b) SHA1(ac72bc79e3a5d0a81647c312d310d00ace017272) )
|
||||
ROM_LOAD16_BYTE( "ppbb02.bin", 0x000001, 0x080000, CRC(8bfcdf87) SHA1(4537a7d646d3014f069c6fd0be457bb32e2f18ac) )
|
||||
ROM_LOAD16_BYTE( "ppbb03.bin", 0x100000, 0x080000, CRC(abdd2b8b) SHA1(a4246dd63515f01d1227c9a9e16d9f1c739ee39e) )
|
||||
ROM_LOAD16_BYTE( "ppbb04.bin", 0x100001, 0x080000, CRC(70faa734) SHA1(4448f4dbded56c142e57293d371e0a422c3a667e) )
|
||||
|
||||
ROM_REGION( 0x8000, "user1", 0 ) /* ??? Some sort of table */
|
||||
ROM_LOAD( "ppbb07.bin", 0x0000, 0x8000, CRC(456dd16e) SHA1(84779ee64d3ea33ba1ba4dee39b504a81c6811a1) ) // 1xxxxxxxxxxxxxx = 0xFF, same data as komocomo in oneshot.cpp
|
||||
ROM_END
|
||||
|
||||
|
||||
// TODO: determine if this is the correct driver or if this needs to be moved somewhere else, too
|
||||
ROM_START( pipibibsbl2 ) // PIPI001 PCB
|
||||
ROM_REGION( 0x040000, "maincpu", 0 ) /* Main 68K code */
|
||||
ROM_LOAD16_BYTE( "06.bin", 0x000000, 0x020000, CRC(25f49c2f) SHA1(a61246ec8a07ba14ee0a01c3458c59840b435c0b) )
|
||||
ROM_LOAD16_BYTE( "07.bin", 0x000001, 0x020000, CRC(15250177) SHA1(a5ee5ccc219f300d7387b45dc8f8b72fd0f37d7e) )
|
||||
|
||||
ROM_REGION( 0x20000, "audiocpu", 0 ) /* Sound Z80 code */
|
||||
ROM_LOAD( "08.bin", 0x00000, 0x10000, CRC(f2080071) SHA1(68cbae9559879b2dc19c41a7efbd13ab4a569d3f) ) // // 1ST AND 2ND HALF IDENTICAL, same as komocomo in oneshot.cpp
|
||||
|
||||
ROM_REGION( 0x200000, "gp9001", 0 )
|
||||
ROM_LOAD16_BYTE( "01.bin", 0x000000, 0x80000, CRC(505e9e9f) SHA1(998995d94585d785263cc926f68632065aa6c366) )
|
||||
ROM_LOAD16_BYTE( "02.bin", 0x000001, 0x80000, CRC(860018f5) SHA1(7f42dffb27940629447d688e1771b4ecf04f3b43) )
|
||||
ROM_LOAD16_BYTE( "03.bin", 0x100000, 0x80000, CRC(ece1bc0f) SHA1(d29f1520f1a3a9d276d36af650bc0d70bcb5b8da) )
|
||||
ROM_LOAD16_BYTE( "04.bin", 0x100001, 0x80000, CRC(f328d7a3) SHA1(2c4fb5d6202f847aaf7c7be719c0c92b8bb5946b) )
|
||||
|
||||
ROM_REGION( 0x20000, "user1", 0 )
|
||||
ROM_LOAD( "5.bin", 0x00000, 0x20000, CRC(8107c4bd) SHA1(64e2fafa808c16c722454b611a8492a4620a925c) ) // motherboard ROM, unknown purpose
|
||||
ROM_END
|
||||
|
||||
ROM_START( pipibibsbl3 )
|
||||
ROM_REGION( 0x040000, "maincpu", 0 ) // Main 68K code, not scrambled
|
||||
ROM_LOAD16_BYTE( "5.bin", 0x000000, 0x020000, CRC(7fab770c) SHA1(c96808870c5906e0203f38114702bd660e491a7d) )
|
||||
ROM_LOAD16_BYTE( "6.bin", 0x000001, 0x020000, CRC(9007ef00) SHA1(594052be7351e0b8e30f83abd9a91ab1429d82ef) )
|
||||
|
||||
ROM_REGION( 0x10000, "audiocpu", 0 ) // Sound Z80 code
|
||||
ROM_LOAD( "7.bin", 0x0000, 0x8000, CRC(101c0358) SHA1(162e02d00b7bdcdd3b48a0cd0527b7428435ec50) ) // same data as komocomo in oneshot.cpp
|
||||
|
||||
ROM_REGION( 0x200000, "gp9001", 0 )
|
||||
// GFX data differs slightly from Toaplan boards ???
|
||||
ROM_LOAD16_BYTE( "4.bin", 0x000000, 0x080000, CRC(0fcae44b) SHA1(ac72bc79e3a5d0a81647c312d310d00ace017272) )
|
||||
ROM_LOAD16_BYTE( "3.bin", 0x000001, 0x080000, CRC(8bfcdf87) SHA1(4537a7d646d3014f069c6fd0be457bb32e2f18ac) )
|
||||
ROM_LOAD16_BYTE( "2.bin", 0x100000, 0x080000, CRC(abdd2b8b) SHA1(a4246dd63515f01d1227c9a9e16d9f1c739ee39e) )
|
||||
ROM_LOAD16_BYTE( "1.bin", 0x100001, 0x080000, CRC(70faa734) SHA1(4448f4dbded56c142e57293d371e0a422c3a667e) )
|
||||
|
||||
ROM_REGION( 0x8000, "user1", 0 ) // ??? Some sort of table
|
||||
ROM_LOAD( "8.bin", 0x0000, 0x8000, CRC(456dd16e) SHA1(84779ee64d3ea33ba1ba4dee39b504a81c6811a1) ) // 1xxxxxxxxxxxxxx = 0xFF, same data as komocomo in oneshot.cpp
|
||||
ROM_END
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
GAME( 1991, pipibibs, 0, pipibibs, pipibibs, pipibibi_state, empty_init, ROT0, "Toaplan", "Pipi & Bibis / Whoopee!! (Z80 sound cpu, set 1)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1991, pipibibsa, pipibibs, pipibibs, pipibibs, pipibibi_state, empty_init, ROT0, "Toaplan", "Pipi & Bibis / Whoopee!! (Z80 sound cpu, set 2)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1991, pipibibsp, pipibibs, pipibibs, pipibibsp, pipibibi_state, empty_init, ROT0, "Toaplan", "Pipi & Bibis / Whoopee!! (prototype)", MACHINE_SUPPORTS_SAVE )
|
||||
|
||||
GAME( 1991, pipibibsbl, pipibibs, pipibibsbl, pipibibsbl, pipibibi_bootleg_state, init_pipibibsbl, ROT0, "bootleg (Ryouta Kikaku)", "Pipi & Bibis / Whoopee!! (Ryouta Kikaku bootleg, encrypted)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1991, pipibibsbl2, pipibibs, pipibibsbl, pipibibsbl, pipibibi_bootleg_state, empty_init, ROT0, "bootleg", "Pipi & Bibis / Whoopee!! (bootleg, decrypted)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // different memory map, not scrambled
|
||||
GAME( 1991, pipibibsbl3, pipibibs, pipibibsbl, pipibibsbl, pipibibi_bootleg_state, empty_init, ROT0, "bootleg (Ryouta Kikaku)", "Pipi & Bibis / Whoopee!! (Ryouta Kikaku bootleg, decrypted)", MACHINE_SUPPORTS_SAVE )
|
||||
|
||||
|
1355
src/mame/toaplan/raizing.cpp
Normal file
1355
src/mame/toaplan/raizing.cpp
Normal file
File diff suppressed because it is too large
Load Diff
108
src/mame/toaplan/raizing.h
Normal file
108
src/mame/toaplan/raizing.h
Normal file
@ -0,0 +1,108 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Quench, Yochizo, David Haywood
|
||||
|
||||
#include "emupal.h"
|
||||
#include "screen.h"
|
||||
#include "speaker.h"
|
||||
#include "tilemap.h"
|
||||
|
||||
#include "toaplan_coincounter.h"
|
||||
#include "toaplipt.h"
|
||||
#include "gp9001.h"
|
||||
|
||||
#include "cpu/m68000/m68000.h"
|
||||
#include "cpu/z80/z80.h"
|
||||
#include "machine/bankdev.h"
|
||||
#include "machine/eepromser.h"
|
||||
#include "machine/gen_latch.h"
|
||||
#include "sound/okim6295.h"
|
||||
#include "sound/ymopm.h"
|
||||
#include "sound/ymz280b.h"
|
||||
|
||||
|
||||
class raizing_base_state : public driver_device
|
||||
{
|
||||
public:
|
||||
raizing_base_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: driver_device(mconfig, type, tag)
|
||||
, m_tx_videoram(*this, "tx_videoram")
|
||||
, m_tx_lineselect(*this, "tx_lineselect")
|
||||
, m_tx_linescroll(*this, "tx_linescroll")
|
||||
, m_tx_gfxram(*this, "tx_gfxram")
|
||||
, m_audiobank(*this, "audiobank")
|
||||
, m_raizing_okibank{
|
||||
{ *this, "raizing_okibank0_%u", 0U },
|
||||
{ *this, "raizing_okibank1_%u", 0U } }
|
||||
, m_shared_ram(*this, "shared_ram")
|
||||
, m_maincpu(*this, "maincpu")
|
||||
, m_audiocpu(*this, "audiocpu")
|
||||
, m_vdp(*this, "gp9001")
|
||||
, m_oki(*this, "oki%u", 1U)
|
||||
, m_gfxdecode(*this, "gfxdecode")
|
||||
, m_screen(*this, "screen")
|
||||
, m_palette(*this, "palette")
|
||||
, m_soundlatch(*this, "soundlatch%u", 1U)
|
||||
, m_oki_rom(*this, "oki%u", 1U)
|
||||
, m_coincounter(*this, "coincounter")
|
||||
{ }
|
||||
|
||||
protected:
|
||||
u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
virtual void device_post_load() override;
|
||||
|
||||
// used by everything
|
||||
void create_tx_tilemap(int dx = 0, int dx_flipped = 0);
|
||||
// used by bgaregga + batrider etc.
|
||||
void bgaregga_common_video_start();
|
||||
void raizing_z80_bankswitch_w(u8 data);
|
||||
void raizing_oki_bankswitch_w(offs_t offset, u8 data);
|
||||
void install_raizing_okibank(int chip);
|
||||
void common_bgaregga_reset();
|
||||
|
||||
// similar as NMK112, but GAL-driven; NOT actual NMK112 is present
|
||||
template<unsigned Chip>
|
||||
void raizing_oki(address_map &map)
|
||||
{
|
||||
map(0x00000, 0x000ff).bankr(m_raizing_okibank[Chip][0]);
|
||||
map(0x00100, 0x001ff).bankr(m_raizing_okibank[Chip][1]);
|
||||
map(0x00200, 0x002ff).bankr(m_raizing_okibank[Chip][2]);
|
||||
map(0x00300, 0x003ff).bankr(m_raizing_okibank[Chip][3]);
|
||||
map(0x00400, 0x0ffff).bankr(m_raizing_okibank[Chip][4]);
|
||||
map(0x10000, 0x1ffff).bankr(m_raizing_okibank[Chip][5]);
|
||||
map(0x20000, 0x2ffff).bankr(m_raizing_okibank[Chip][6]);
|
||||
map(0x30000, 0x3ffff).bankr(m_raizing_okibank[Chip][7]);
|
||||
};
|
||||
|
||||
u8 shared_ram_r(offs_t offset) { return m_shared_ram[offset]; }
|
||||
void shared_ram_w(offs_t offset, u8 data) { m_shared_ram[offset] = data; }
|
||||
|
||||
u32 screen_update_base(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
void screen_vblank(int state);
|
||||
|
||||
void tx_videoram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
|
||||
void tx_linescroll_w(offs_t offset, u16 data, u16 mem_mask = ~0);
|
||||
TILE_GET_INFO_MEMBER(get_text_tile_info);
|
||||
|
||||
void coin_w(u8 data);
|
||||
void reset(int state);
|
||||
|
||||
tilemap_t *m_tx_tilemap = nullptr; /* Tilemap for extra-text-layer */
|
||||
required_shared_ptr<u16> m_tx_videoram;
|
||||
optional_shared_ptr<u16> m_tx_lineselect;
|
||||
optional_shared_ptr<u16> m_tx_linescroll;
|
||||
optional_shared_ptr<u16> m_tx_gfxram;
|
||||
optional_memory_bank m_audiobank; // batrider and bgaregga
|
||||
optional_memory_bank_array<8> m_raizing_okibank[2];
|
||||
optional_shared_ptr<u8> m_shared_ram; // 8 bit RAM shared between 68K and sound CPU
|
||||
required_device<m68000_base_device> m_maincpu;
|
||||
optional_device<cpu_device> m_audiocpu;
|
||||
required_device<gp9001vdp_device> m_vdp;
|
||||
optional_device_array<okim6295_device, 2> m_oki;
|
||||
optional_device<gfxdecode_device> m_gfxdecode;
|
||||
required_device<screen_device> m_screen;
|
||||
required_device<palette_device> m_palette;
|
||||
optional_device_array<generic_latch_8_device, 4> m_soundlatch; // tekipaki, batrider, bgaregga, batsugun
|
||||
optional_region_ptr_array<u8, 2> m_oki_rom;
|
||||
required_device<toaplan_coincounter_device> m_coincounter;
|
||||
bitmap_ind8 m_custom_priority_bitmap;
|
||||
};
|
1434
src/mame/toaplan/raizing_batrider.cpp
Normal file
1434
src/mame/toaplan/raizing_batrider.cpp
Normal file
File diff suppressed because it is too large
Load Diff
451
src/mame/toaplan/snowbro2.cpp
Normal file
451
src/mame/toaplan/snowbro2.cpp
Normal file
@ -0,0 +1,451 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Quench, Yochizo, David Haywood
|
||||
|
||||
#include "emu.h"
|
||||
|
||||
#include "emupal.h"
|
||||
#include "screen.h"
|
||||
#include "speaker.h"
|
||||
#include "tilemap.h"
|
||||
|
||||
#include "toaplan_coincounter.h"
|
||||
#include "toaplipt.h"
|
||||
#include "gp9001.h"
|
||||
|
||||
#include "cpu/m68000/m68000.h"
|
||||
#include "sound/okim6295.h"
|
||||
#include "sound/ymopm.h"
|
||||
|
||||
/*
|
||||
Name Board No Maker Game name
|
||||
----------------------------------------------------------------------------
|
||||
snowbro2 TP-033 Hanafram Snow Bros. 2 - With New Elves
|
||||
|
||||
*/
|
||||
|
||||
namespace {
|
||||
|
||||
class snowbro2_state : public driver_device
|
||||
{
|
||||
public:
|
||||
snowbro2_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: driver_device(mconfig, type, tag)
|
||||
, m_maincpu(*this, "maincpu")
|
||||
, m_vdp(*this, "gp9001")
|
||||
, m_oki(*this, "oki")
|
||||
, m_screen(*this, "screen")
|
||||
, m_palette(*this, "palette")
|
||||
{ }
|
||||
|
||||
void snowbro2(machine_config &config);
|
||||
void snowbro2b3(machine_config &config);
|
||||
|
||||
protected:
|
||||
virtual void video_start() override ATTR_COLD;
|
||||
|
||||
void snowbro2_68k_mem(address_map &map) ATTR_COLD;
|
||||
void snowbro2b3_68k_mem(address_map &map) ATTR_COLD;
|
||||
|
||||
u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
void screen_vblank(int state);
|
||||
void sb2_oki_bankswitch_w(u8 data);
|
||||
private:
|
||||
|
||||
required_device<m68000_base_device> m_maincpu;
|
||||
required_device<gp9001vdp_device> m_vdp;
|
||||
required_device<okim6295_device> m_oki;
|
||||
required_device<screen_device> m_screen;
|
||||
required_device<palette_device> m_palette;
|
||||
bitmap_ind8 m_custom_priority_bitmap;
|
||||
};
|
||||
|
||||
|
||||
void snowbro2_state::video_start()
|
||||
{
|
||||
m_screen->register_screen_bitmap(m_custom_priority_bitmap);
|
||||
m_vdp->custom_priority_bitmap = &m_custom_priority_bitmap;
|
||||
}
|
||||
|
||||
u32 snowbro2_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
bitmap.fill(0, cliprect);
|
||||
m_custom_priority_bitmap.fill(0, cliprect);
|
||||
m_vdp->render_vdp(bitmap, cliprect);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void snowbro2_state::screen_vblank(int state)
|
||||
{
|
||||
if (state) // rising edge
|
||||
{
|
||||
m_vdp->screen_eof();
|
||||
}
|
||||
}
|
||||
|
||||
void snowbro2_state::sb2_oki_bankswitch_w(u8 data)
|
||||
{
|
||||
m_oki->set_rom_bank(data & 1);
|
||||
}
|
||||
|
||||
static INPUT_PORTS_START( base )
|
||||
PORT_START("IN1")
|
||||
TOAPLAN_JOY_UDLR_2_BUTTONS( 1 )
|
||||
|
||||
PORT_START("IN2")
|
||||
TOAPLAN_JOY_UDLR_2_BUTTONS( 2 )
|
||||
|
||||
PORT_START("SYS")
|
||||
PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_SERVICE1 )
|
||||
PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_TILT )
|
||||
TOAPLAN_TEST_SWITCH( 0x04, IP_ACTIVE_HIGH )
|
||||
PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_COIN1 )
|
||||
PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_COIN2 )
|
||||
PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_START1 )
|
||||
PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_START2 )
|
||||
PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNKNOWN )
|
||||
|
||||
PORT_START("DSWA")
|
||||
TOAPLAN_MACHINE_NO_COCKTAIL_LOC(SW1)
|
||||
// Coinage on bit mask 0x00f0
|
||||
PORT_BIT( 0x00f0, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // Modified below
|
||||
|
||||
PORT_START("DSWB")
|
||||
TOAPLAN_DIFFICULTY_LOC(SW2)
|
||||
// Per-game features on bit mask 0x00fc
|
||||
PORT_BIT( 0x00fc, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // Modified below
|
||||
INPUT_PORTS_END
|
||||
|
||||
static INPUT_PORTS_START( snowbro2 )
|
||||
PORT_INCLUDE( base )
|
||||
|
||||
PORT_START("IN3")
|
||||
PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(3) PORT_8WAY
|
||||
PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(3) PORT_8WAY
|
||||
PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(3) PORT_8WAY
|
||||
PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(3) PORT_8WAY
|
||||
PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(3)
|
||||
PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(3)
|
||||
PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_START3 )
|
||||
PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNKNOWN )
|
||||
|
||||
PORT_START("IN4")
|
||||
PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(4) PORT_8WAY
|
||||
PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(4) PORT_8WAY
|
||||
PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(4) PORT_8WAY
|
||||
PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(4) PORT_8WAY
|
||||
PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(4)
|
||||
PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(4)
|
||||
PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_START4 )
|
||||
PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNKNOWN )
|
||||
|
||||
PORT_MODIFY("DSWA")
|
||||
PORT_DIPNAME( 0x0001, 0x0000, DEF_STR( Continue_Price ) ) PORT_DIPLOCATION("SW1:!1")
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( Normal ) )
|
||||
PORT_DIPSETTING( 0x0001, "Discount" )
|
||||
// Various features on bit mask 0x000e - see above
|
||||
TOAPLAN_COINAGE_DUAL_LOC( JMPR, 0x1c00, 0x0800, SW1 )
|
||||
|
||||
PORT_MODIFY("DSWB")
|
||||
// Difficulty on bit mask 0x0003 - see above
|
||||
PORT_DIPNAME( 0x000c, 0x0000, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:!3,!4")
|
||||
PORT_DIPSETTING( 0x000c, DEF_STR( None ) )
|
||||
PORT_DIPSETTING( 0x0008, "200k only" )
|
||||
PORT_DIPSETTING( 0x0000, "100k only" )
|
||||
PORT_DIPSETTING( 0x0004, "100k and every 500k" )
|
||||
PORT_DIPNAME( 0x0030, 0x0000, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:!5,!6")
|
||||
PORT_DIPSETTING( 0x0030, "1" )
|
||||
PORT_DIPSETTING( 0x0020, "2" )
|
||||
PORT_DIPSETTING( 0x0000, "3" )
|
||||
PORT_DIPSETTING( 0x0010, "4" )
|
||||
PORT_DIPNAME( 0x0040, 0x0000, "Invulnerability (Cheat)" ) PORT_DIPLOCATION("SW2:!7")
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0040, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0080, 0x0000, "Maximum Players" ) PORT_DIPLOCATION("SW2:!8")
|
||||
PORT_DIPSETTING( 0x0080, "2" )
|
||||
PORT_DIPSETTING( 0x0000, "4" )
|
||||
|
||||
PORT_START("JMPR")
|
||||
PORT_CONFNAME( 0x2000, 0x0000, "Show All Rights Reserved" ) //PORT_CONFLOCATION("JP:!1")
|
||||
PORT_CONFSETTING( 0x0000, DEF_STR( No ) )
|
||||
PORT_CONFSETTING( 0x2000, DEF_STR( Yes ) )
|
||||
PORT_CONFNAME( 0x1c00, 0x0800, DEF_STR( Region ) ) //PORT_CONFLOCATION("JP:!4,!3,!2")
|
||||
PORT_CONFSETTING( 0x0800, DEF_STR( Europe ) )
|
||||
PORT_CONFSETTING( 0x0400, DEF_STR( USA ) )
|
||||
PORT_CONFSETTING( 0x0000, DEF_STR( Japan ) )
|
||||
PORT_CONFSETTING( 0x0c00, DEF_STR( Korea ) )
|
||||
PORT_CONFSETTING( 0x1000, DEF_STR( Hong_Kong ) )
|
||||
PORT_CONFSETTING( 0x1400, DEF_STR( Taiwan ) )
|
||||
PORT_CONFSETTING( 0x1800, DEF_STR( Southeast_Asia ) )
|
||||
// PORT_CONFSETTING( 0x1c00, DEF_STR( Unused ) )
|
||||
PORT_BIT( 0xc3ff, IP_ACTIVE_HIGH, IPT_UNKNOWN )
|
||||
INPUT_PORTS_END
|
||||
|
||||
static INPUT_PORTS_START( snowbro2b3 )
|
||||
PORT_START("IN1")
|
||||
PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_8WAY
|
||||
PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_8WAY
|
||||
PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_8WAY
|
||||
PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_8WAY
|
||||
PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1)
|
||||
PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1)
|
||||
PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_UNKNOWN )
|
||||
PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNKNOWN )
|
||||
PORT_BIT( 0xff00, IP_ACTIVE_HIGH, IPT_UNKNOWN )
|
||||
|
||||
PORT_START("IN2")
|
||||
PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2) PORT_8WAY
|
||||
PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) PORT_8WAY
|
||||
PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) PORT_8WAY
|
||||
PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) PORT_8WAY
|
||||
PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2)
|
||||
PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2)
|
||||
PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_UNKNOWN )
|
||||
PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNKNOWN )
|
||||
PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_SERVICE1 )
|
||||
PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_TILT )
|
||||
TOAPLAN_TEST_SWITCH( 0x0400, IP_ACTIVE_HIGH )
|
||||
PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_COIN1 )
|
||||
PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_COIN2 )
|
||||
PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_START1 )
|
||||
PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_START2 )
|
||||
PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_UNKNOWN )
|
||||
|
||||
PORT_START("IN3")
|
||||
PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(3) PORT_8WAY
|
||||
PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(3) PORT_8WAY
|
||||
PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(3) PORT_8WAY
|
||||
PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(3) PORT_8WAY
|
||||
PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(3)
|
||||
PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(3)
|
||||
PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_START3 )
|
||||
PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNKNOWN )
|
||||
PORT_BIT( 0xff00, IP_ACTIVE_HIGH, IPT_UNKNOWN )
|
||||
|
||||
PORT_START("IN4")
|
||||
PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(4) PORT_8WAY
|
||||
PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(4) PORT_8WAY
|
||||
PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(4) PORT_8WAY
|
||||
PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(4) PORT_8WAY
|
||||
PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(4)
|
||||
PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(4)
|
||||
PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_START4 )
|
||||
PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNKNOWN )
|
||||
PORT_BIT( 0xff00, IP_ACTIVE_HIGH, IPT_UNKNOWN )
|
||||
|
||||
PORT_START("DSWA")
|
||||
PORT_DIPNAME( 0x01, 0x00, DEF_STR( Continue_Price ) ) PORT_DIPLOCATION("SW1:!1")
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( Normal ) )
|
||||
PORT_DIPSETTING( 0x01, "Discount" )
|
||||
PORT_DIPNAME( 0x02, 0x00, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW1:!2")
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x02, DEF_STR( On ) )
|
||||
PORT_SERVICE_DIPLOC( 0x04, IP_ACTIVE_HIGH, "SW1:!3" )
|
||||
PORT_DIPNAME( 0x08, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW1:!4")
|
||||
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x30, 0x00, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:!5,!6")
|
||||
PORT_DIPSETTING( 0x30, DEF_STR( 4C_1C ) )
|
||||
PORT_DIPSETTING( 0x20, DEF_STR( 3C_1C ) )
|
||||
PORT_DIPSETTING( 0x10, DEF_STR( 2C_1C ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) )
|
||||
PORT_DIPNAME( 0xc0, 0x00, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SW1:!7,!8")
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( 1C_2C ) )
|
||||
PORT_DIPSETTING( 0x40, DEF_STR( 1C_3C ) )
|
||||
PORT_DIPSETTING( 0x80, DEF_STR( 1C_4C ) )
|
||||
PORT_DIPSETTING( 0xc0, DEF_STR( 1C_6C ) )
|
||||
|
||||
PORT_START("DSWB")
|
||||
PORT_DIPNAME( 0x03, 0x00, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:!1,!2")
|
||||
PORT_DIPSETTING( 0x01, DEF_STR( Easy ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( Normal ) )
|
||||
PORT_DIPSETTING( 0x02, DEF_STR( Hard ) )
|
||||
PORT_DIPSETTING( 0x03, DEF_STR( Very_Hard ) )
|
||||
PORT_DIPNAME( 0x000c, 0x0000, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:!3,!4")
|
||||
PORT_DIPSETTING( 0x000c, DEF_STR( None ) )
|
||||
PORT_DIPSETTING( 0x0008, "200k only" )
|
||||
PORT_DIPSETTING( 0x0000, "100k only" )
|
||||
PORT_DIPSETTING( 0x0004, "100k and every 500k" )
|
||||
PORT_DIPNAME( 0x0030, 0x0000, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:!5,!6")
|
||||
PORT_DIPSETTING( 0x0030, "1" )
|
||||
PORT_DIPSETTING( 0x0020, "2" )
|
||||
PORT_DIPSETTING( 0x0000, "3" )
|
||||
PORT_DIPSETTING( 0x0010, "4" )
|
||||
PORT_DIPNAME( 0x0040, 0x0000, "Invulnerability (Cheat)" ) PORT_DIPLOCATION("SW2:!7")
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0040, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0080, 0x0000, "Maximum Players" ) PORT_DIPLOCATION("SW2:!8")
|
||||
PORT_DIPSETTING( 0x0080, "2" )
|
||||
PORT_DIPSETTING( 0x0000, "4" )
|
||||
INPUT_PORTS_END
|
||||
|
||||
void snowbro2_state::snowbro2_68k_mem(address_map &map)
|
||||
{
|
||||
map(0x000000, 0x07ffff).rom();
|
||||
map(0x100000, 0x10ffff).ram();
|
||||
map(0x300000, 0x30000d).rw(m_vdp, FUNC(gp9001vdp_device::read), FUNC(gp9001vdp_device::write));
|
||||
map(0x400000, 0x400fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
|
||||
map(0x500000, 0x500003).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write)).umask16(0x00ff);
|
||||
map(0x600001, 0x600001).rw(m_oki, FUNC(okim6295_device::read), FUNC(okim6295_device::write));
|
||||
map(0x700000, 0x700001).portr("JMPR");
|
||||
map(0x700004, 0x700005).portr("DSWA");
|
||||
map(0x700008, 0x700009).portr("DSWB");
|
||||
map(0x70000c, 0x70000d).portr("IN1");
|
||||
map(0x700010, 0x700011).portr("IN2");
|
||||
map(0x700014, 0x700015).portr("IN3");
|
||||
map(0x700018, 0x700019).portr("IN4");
|
||||
map(0x70001c, 0x70001d).portr("SYS");
|
||||
map(0x700031, 0x700031).w(FUNC(snowbro2_state::sb2_oki_bankswitch_w));
|
||||
map(0x700035, 0x700035).w("coincounter", FUNC(toaplan_coincounter_device::coin_w));
|
||||
}
|
||||
|
||||
void snowbro2_state::snowbro2b3_68k_mem(address_map &map)
|
||||
{
|
||||
map(0x000000, 0x07ffff).rom();
|
||||
map(0x100000, 0x10ffff).ram();
|
||||
map(0x404000, 0x404fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
|
||||
map(0x500000, 0x500003).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write)).umask16(0x00ff);
|
||||
map(0x600001, 0x600001).rw(m_oki, FUNC(okim6295_device::read), FUNC(okim6295_device::write));
|
||||
map(0x700004, 0x700005).portr("DSWA");
|
||||
map(0x700008, 0x700009).portr("DSWB");
|
||||
map(0x70000c, 0x70000d).portr("IN1");
|
||||
map(0x700010, 0x700011).portr("IN2");
|
||||
map(0x700014, 0x700015).portr("IN3");
|
||||
map(0x700018, 0x700019).portr("IN4");
|
||||
map(0x700035, 0x700035).w("coincounter", FUNC(toaplan_coincounter_device::coin_w));
|
||||
map(0x700041, 0x700041).w(FUNC(snowbro2_state::sb2_oki_bankswitch_w));
|
||||
map(0xff0000, 0xff2fff).rw(m_vdp, FUNC(gp9001vdp_device::bootleg_videoram16_r), FUNC(gp9001vdp_device::bootleg_videoram16_w));
|
||||
map(0xff3000, 0xff37ff).rw(m_vdp, FUNC(gp9001vdp_device::bootleg_spriteram16_r), FUNC(gp9001vdp_device::bootleg_spriteram16_w));
|
||||
map(0xff8000, 0xff800f).w(m_vdp, FUNC(gp9001vdp_device::bootleg_scroll_w));
|
||||
}
|
||||
|
||||
void snowbro2_state::snowbro2(machine_config &config)
|
||||
{
|
||||
/* basic machine hardware */
|
||||
M68000(config, m_maincpu, 32_MHz_XTAL/2);
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &snowbro2_state::snowbro2_68k_mem);
|
||||
|
||||
TOAPLAN_COINCOUNTER(config, "coincounter", 0);
|
||||
|
||||
/* video hardware */
|
||||
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
|
||||
m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
|
||||
m_screen->set_raw(27_MHz_XTAL/4, 432, 0, 320, 262, 0, 240);
|
||||
m_screen->set_screen_update(FUNC(snowbro2_state::screen_update));
|
||||
m_screen->screen_vblank().set(FUNC(snowbro2_state::screen_vblank));
|
||||
m_screen->set_palette(m_palette);
|
||||
|
||||
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, gp9001vdp_device::VDP_PALETTE_LENGTH);
|
||||
|
||||
GP9001_VDP(config, m_vdp, 27_MHz_XTAL);
|
||||
m_vdp->set_palette(m_palette);
|
||||
m_vdp->vint_out_cb().set_inputline(m_maincpu, M68K_IRQ_4);
|
||||
|
||||
/* sound hardware */
|
||||
SPEAKER(config, "mono").front_center();
|
||||
|
||||
YM2151(config, "ymsnd", 27_MHz_XTAL/8).add_route(ALL_OUTPUTS, "mono", 0.5);
|
||||
|
||||
OKIM6295(config, m_oki, 16_MHz_XTAL/4, okim6295_device::PIN7_LOW);
|
||||
m_oki->add_route(ALL_OUTPUTS, "mono", 0.5);
|
||||
}
|
||||
|
||||
void snowbro2_state::snowbro2b3(machine_config &config)
|
||||
{
|
||||
snowbro2(config);
|
||||
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &snowbro2_state::snowbro2b3_68k_mem);
|
||||
m_maincpu->set_vblank_int("screen", FUNC(snowbro2_state::irq2_line_hold));
|
||||
|
||||
m_vdp->vint_out_cb().set_nop();
|
||||
m_vdp->set_bootleg_extra_offsets(0x02e, 0x1f0, 0x02e, 0x1ee, 0x02e, 0x1ef, 0x1e9, 0x1ef);
|
||||
}
|
||||
|
||||
|
||||
ROM_START( snowbro2 )
|
||||
ROM_REGION( 0x080000, "maincpu", 0 ) /* Main 68K code */
|
||||
ROM_LOAD16_WORD_SWAP( "pro-4", 0x000000, 0x080000, CRC(4c7ee341) SHA1(ad46c605a38565d0148daac301be4e4b72302fe7) )
|
||||
|
||||
ROM_REGION( 0x300000, "gp9001", 0 )
|
||||
ROM_LOAD( "rom2-l", 0x000000, 0x100000, CRC(e9d366a9) SHA1(e87e3966fce3395324b90db6c134b3345104c04b) )
|
||||
ROM_LOAD( "rom2-h", 0x100000, 0x080000, CRC(9aab7a62) SHA1(611f6a15fdbac5d3063426a365538c1482e996bf) )
|
||||
ROM_LOAD( "rom3-l", 0x180000, 0x100000, CRC(eb06e332) SHA1(7cd597bfffc153d178530c0f0903bebd751c9dd1) )
|
||||
ROM_LOAD( "rom3-h", 0x280000, 0x080000, CRC(df4a952a) SHA1(b76af61c8437caca573ff1312832898666a611aa) )
|
||||
|
||||
ROM_REGION( 0x80000, "oki", 0 ) /* ADPCM Samples */
|
||||
ROM_LOAD( "rom4", 0x00000, 0x80000, CRC(638f341e) SHA1(aa3fca25f099339ece1878ea730c5e9f18ec4823) )
|
||||
ROM_END
|
||||
|
||||
ROM_START( snowbro2b ) // seems to be the same data as the main set, but with the extra user1 rom and different rom layout
|
||||
ROM_REGION( 0x080000, "maincpu", 0 ) /* Main 68K code - difference with main set is year changed from 1994 to 1998 and upper FFFF fill changed to 00FF fill */
|
||||
ROM_LOAD16_BYTE( "sb2-prg1.u39", 0x000000, 0x040000, CRC(e1fec8a2) SHA1(30c1a351070d784da9ba0dca68be8a262dba2045) )
|
||||
ROM_LOAD16_BYTE( "sb2-prg0.u23", 0x000001, 0x040000, CRC(b473cd57) SHA1(331130faa9de01b3ca93845174e8c3684bd269c7) )
|
||||
|
||||
ROM_REGION( 0x400000, "gp9001", 0 )
|
||||
ROM_LOAD( "sb2-gfx.u177", 0x000000, 0x200000, CRC(ebeec910) SHA1(e179f393b98135caa8419b68cd979038ab47a413) )
|
||||
ROM_LOAD( "sb2-gfx.u175", 0x200000, 0x200000, CRC(e349c75b) SHA1(7d40d00fc0e15a68c427fe94db410bb7cbe00117) )
|
||||
|
||||
ROM_REGION( 0x80000, "oki", 0 ) /* ADPCM Samples */
|
||||
ROM_LOAD( "sb2-snd-4.u17", 0x00000, 0x80000, CRC(638f341e) SHA1(aa3fca25f099339ece1878ea730c5e9f18ec4823) )
|
||||
|
||||
ROM_REGION( 0x8000, "user1", 0 ) /* ??? Some sort of table - same as other bootleg boards */
|
||||
ROM_LOAD( "sb2-unk.u100", 0x0000, 0x8000, CRC(456dd16e) SHA1(84779ee64d3ea33ba1ba4dee39b504a81c6811a1) )
|
||||
ROM_END
|
||||
|
||||
ROM_START( snowbro2b2 ) // seems to mostly be the same data, but with copyright changed to Q Elec. Only set with staff credits still present. Also differently arranged graphics ROMs data.
|
||||
ROM_REGION( 0x080000, "maincpu", 0 ) /* Main 68K code */
|
||||
ROM_LOAD16_WORD_SWAP( "rom10.bin", 0x000000, 0x080000, CRC(3e96da41) SHA1(692211d40f506efb9cb49848521de2da7890e248) ) // 27c04002
|
||||
|
||||
ROM_REGION( 0x300000, "gp9001", 0 )
|
||||
ROM_LOAD16_BYTE( "rom07.bin", 0x000000, 0x080000, CRC(c54ae0b3) SHA1(94099b2da52eb12638799eab0819fe8a13aa3879) ) // 27c040
|
||||
ROM_LOAD16_BYTE( "rom05.bin", 0x000001, 0x080000, CRC(af3c74d1) SHA1(e97a688db50dfe41723452a9f652564e89e367ed) ) // 27c040
|
||||
ROM_LOAD16_BYTE( "rom08.bin", 0x100000, 0x040000, CRC(72812088) SHA1(1c0d410a7dd8de0bc48b7ff677979ad269966f7d) ) // 27c02001
|
||||
ROM_LOAD16_BYTE( "rom06.bin", 0x100001, 0x040000, CRC(c8f80774) SHA1(004752d7dfa08c3beb774f545fe3260d328abff0) ) // 27c02001
|
||||
ROM_LOAD16_BYTE( "rom03.bin", 0x180000, 0x080000, CRC(42fecbd7) SHA1(96dc9d5495d7830400ca7475c6613119099e93f2) ) // 27c040
|
||||
ROM_LOAD16_BYTE( "rom01.bin", 0x180001, 0x080000, CRC(e7134937) SHA1(7c12e7c6b08f804613e5ea0db8d622bda01bc036) ) // 27c040
|
||||
ROM_LOAD16_BYTE( "rom04.bin", 0x280000, 0x040000, CRC(3343b7a7) SHA1(10efcb2dfae635f005773655faa573bf51ddc6a3) ) // 27c020
|
||||
ROM_LOAD16_BYTE( "rom02.bin", 0x280001, 0x040000, CRC(af4d9551) SHA1(adcf1641e37b239b1ae4322b5710d49e53c30684) ) // 27c020
|
||||
|
||||
ROM_REGION( 0x80000, "oki", 0 ) /* ADPCM Samples */
|
||||
ROM_LOAD( "rom09.bin", 0x00000, 0x80000, CRC(638f341e) SHA1(aa3fca25f099339ece1878ea730c5e9f18ec4823) )
|
||||
ROM_END
|
||||
|
||||
ROM_START( snowbro2b3 ) // SK000616 PCB, no original parts, seems hardcoded on Europe region
|
||||
ROM_REGION( 0x080000, "maincpu", 0 )
|
||||
ROM_LOAD16_WORD_SWAP( "prg", 0x000000, 0x080000, CRC(8ce2ede2) SHA1(ddd8a2aa442cd5bb3a7d393b9b5c06fd981e7c61) )
|
||||
|
||||
ROM_REGION( 0x400000, "gp9001", 0 ) // not actually a GP9001
|
||||
ROM_LOAD( "gfx2", 0x100000, 0x100000, CRC(a3be41af) SHA1(4cb1ce9c47bf8bbf7d1e36f6a1d276ce52957cfb) )
|
||||
ROM_CONTINUE( 0x000000, 0x100000 )
|
||||
ROM_LOAD( "gfx1", 0x300000, 0x100000, CRC(8df1ab06) SHA1(2a28caf7d545dc05acfcd2a8d2ffbd9f710af45d) )
|
||||
ROM_CONTINUE( 0x200000, 0x100000 )
|
||||
|
||||
ROM_REGION( 0x80000, "oki", 0 )
|
||||
ROM_LOAD( "voice", 0x00000, 0x80000, CRC(638f341e) SHA1(aa3fca25f099339ece1878ea730c5e9f18ec4823) )
|
||||
ROM_END
|
||||
|
||||
ROM_START( snowbro2ny ) // Nyanko
|
||||
ROM_REGION( 0x080000, "maincpu", 0 ) /* Main 68K code */
|
||||
ROM_LOAD16_WORD_SWAP( "rom1_c8.u61", 0x000000, 0x080000, CRC(9e6eb76b) SHA1(9e8b356dabedeb4ae9e08d60fbf6ed4a09edc0bd) )
|
||||
|
||||
ROM_REGION( 0x300000, "gp9001", 0 )
|
||||
ROM_LOAD( "rom2-l_tp-033.u13", 0x000000, 0x100000, CRC(e9d366a9) SHA1(e87e3966fce3395324b90db6c134b3345104c04b) )
|
||||
ROM_LOAD( "rom2-h_c10.u26", 0x100000, 0x080000, CRC(9aab7a62) SHA1(611f6a15fdbac5d3063426a365538c1482e996bf) )
|
||||
ROM_LOAD( "rom3-l_tp-033.u12", 0x180000, 0x100000, CRC(eb06e332) SHA1(7cd597bfffc153d178530c0f0903bebd751c9dd1) )
|
||||
ROM_LOAD( "rom3-h_c9.u27", 0x280000, 0x080000, CRC(6de2b059) SHA1(695e789849c34de5d83e40b0e834b2106fcd78db) )
|
||||
|
||||
ROM_REGION( 0x80000, "oki", 0 ) /* ADPCM Samples */
|
||||
ROM_LOAD( "rom4-tp-033.u33", 0x00000, 0x80000, CRC(638f341e) SHA1(aa3fca25f099339ece1878ea730c5e9f18ec4823) )
|
||||
|
||||
ROM_REGION( 0x345, "plds", 0 )
|
||||
ROM_LOAD( "13_gal16v8-25lnc.u91", 0x000, 0x117, NO_DUMP ) // Protected
|
||||
ROM_LOAD( "14_gal16v8-25lnc.u92", 0x117, 0x117, NO_DUMP ) // Protected
|
||||
ROM_LOAD( "15_gal16v8-25lnc.u93", 0x22e, 0x117, NO_DUMP ) // Protected
|
||||
ROM_END
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
GAME( 1994, snowbro2, 0, snowbro2, snowbro2, snowbro2_state, empty_init, ROT0, "Hanafram", "Snow Bros. 2 - With New Elves / Otenki Paradise (Hanafram)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1994, snowbro2ny, snowbro2, snowbro2, snowbro2, snowbro2_state, empty_init, ROT0, "Nyanko", "Snow Bros. 2 - With New Elves / Otenki Paradise (Nyanko)", MACHINE_SUPPORTS_SAVE ) // not a bootleg, has original parts (the "GP9001 L7A0498 TOA PLAN" IC and the three mask ROMs)
|
||||
GAME( 1998, snowbro2b, snowbro2, snowbro2, snowbro2, snowbro2_state, empty_init, ROT0, "bootleg", "Snow Bros. 2 - With New Elves / Otenki Paradise (bootleg, set 1)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1994, snowbro2b2, snowbro2, snowbro2, snowbro2, snowbro2_state, empty_init, ROT0, "bootleg (Q Elec)", "Snow Bros. 2 - With New Elves / Otenki Paradise (bootleg, set 2)", MACHINE_SUPPORTS_SAVE ) // possibly not a bootleg, has some original parts
|
||||
GAME( 1994, snowbro2b3, snowbro2, snowbro2b3, snowbro2b3, snowbro2_state, empty_init, ROT0, "bootleg", "Snow Bros. 2 - With New Elves / Otenki Paradise (bootleg, set 3)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // GFX offsets not 100% correct
|
595
src/mame/toaplan/sunwise.cpp
Normal file
595
src/mame/toaplan/sunwise.cpp
Normal file
@ -0,0 +1,595 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Quench, Yochizo, David Haywood
|
||||
|
||||
#include "emu.h"
|
||||
|
||||
#include "toaplan_coincounter.h"
|
||||
#include "toaplipt.h"
|
||||
#include "gp9001.h"
|
||||
|
||||
#include "emupal.h"
|
||||
#include "screen.h"
|
||||
#include "speaker.h"
|
||||
#include "tilemap.h"
|
||||
|
||||
#include "cpu/m68000/m68000.h"
|
||||
#include "machine/nvram.h"
|
||||
#include "machine/ticket.h"
|
||||
#include "machine/upd4992.h"
|
||||
#include "sound/okim6295.h"
|
||||
|
||||
/*****************************************************************************
|
||||
|
||||
Name Board No Maker Game name
|
||||
----------------------------------------------------------------------------
|
||||
pwrkick SW931201 Sunwise Power Kick
|
||||
burgkids SW931201 Sunwise Burger Kids
|
||||
othldrby S951060-VGP Sunwise Othello Derby
|
||||
|
||||
|
||||
Notes on Power Kick coin inputs:
|
||||
- The 10 yen input is "Key In" according to the bookkeeping screen, but is
|
||||
an otherwise normal coin input with a counter and a lockout (sharing the
|
||||
latter with the "medal" coin).
|
||||
- The 100 yen input never adds any credits except in "Coin Function Check,"
|
||||
instead dispensing its value into the hopper immediately.
|
||||
|
||||
To reset the NVRAM in Othello Derby, hold P1 Button 1 down while booting.
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
namespace {
|
||||
|
||||
class sunwise_state : public driver_device
|
||||
{
|
||||
public:
|
||||
sunwise_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: driver_device(mconfig, type, tag)
|
||||
, m_rtc(*this, "rtc")
|
||||
, m_hopper(*this, "hopper")
|
||||
, m_maincpu(*this, "maincpu")
|
||||
, m_vdp(*this, "gp9001")
|
||||
, m_oki(*this, "oki")
|
||||
, m_screen(*this, "screen")
|
||||
, m_palette(*this, "palette")
|
||||
{ }
|
||||
|
||||
void othldrby(machine_config &config);
|
||||
void pwrkick(machine_config &config);
|
||||
|
||||
protected:
|
||||
virtual void video_start() override ATTR_COLD;
|
||||
|
||||
void othldrby_68k_mem(address_map &map) ATTR_COLD;
|
||||
void pwrkick_68k_mem(address_map &map) ATTR_COLD;
|
||||
|
||||
u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
void screen_vblank(int state);
|
||||
|
||||
void sw_oki_bankswitch_w(u8 data);
|
||||
private:
|
||||
void pwrkick_coin_w(u8 data);
|
||||
void pwrkick_coin_lockout_w(u8 data);
|
||||
|
||||
required_device<upd4992_device> m_rtc;
|
||||
optional_device<ticket_dispenser_device> m_hopper; // pwrkick only
|
||||
|
||||
required_device<m68000_base_device> m_maincpu;
|
||||
required_device<gp9001vdp_device> m_vdp;
|
||||
required_device<okim6295_device> m_oki;
|
||||
required_device<screen_device> m_screen;
|
||||
required_device<palette_device> m_palette;
|
||||
bitmap_ind8 m_custom_priority_bitmap;
|
||||
};
|
||||
|
||||
void sunwise_state::video_start()
|
||||
{
|
||||
m_screen->register_screen_bitmap(m_custom_priority_bitmap);
|
||||
m_vdp->custom_priority_bitmap = &m_custom_priority_bitmap;
|
||||
}
|
||||
|
||||
|
||||
u32 sunwise_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
bitmap.fill(0, cliprect);
|
||||
m_custom_priority_bitmap.fill(0, cliprect);
|
||||
m_vdp->render_vdp(bitmap, cliprect);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void sunwise_state::screen_vblank(int state)
|
||||
{
|
||||
if (state) // rising edge
|
||||
{
|
||||
m_vdp->screen_eof();
|
||||
}
|
||||
}
|
||||
|
||||
void sunwise_state::sw_oki_bankswitch_w(u8 data)
|
||||
{
|
||||
m_oki->set_rom_bank(data & 1);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static INPUT_PORTS_START( pwrkick )
|
||||
PORT_START("DSWA")
|
||||
PORT_DIPNAME( 0x03, 0x00, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW1:!1,!2")
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( Easy ) )
|
||||
PORT_DIPSETTING( 0x01, DEF_STR( Normal ) )
|
||||
PORT_DIPSETTING( 0x02, DEF_STR( Hard ) )
|
||||
PORT_DIPSETTING( 0x03, DEF_STR( Very_Hard ) )
|
||||
PORT_DIPNAME( 0x5c, 0x00, "Payout" ) PORT_DIPLOCATION("SW1:!3,!4,!5,!7")
|
||||
PORT_DIPSETTING( 0x00, "110" ) // Service mode displays values as 1-8, ignoring SW1:7
|
||||
PORT_DIPSETTING( 0x04, "105" )
|
||||
PORT_DIPSETTING( 0x08, "100" )
|
||||
PORT_DIPSETTING( 0x0c, "95" )
|
||||
PORT_DIPSETTING( 0x10, "90" )
|
||||
PORT_DIPSETTING( 0x14, "85" )
|
||||
PORT_DIPSETTING( 0x18, "80" )
|
||||
PORT_DIPSETTING( 0x1c, "75" )
|
||||
PORT_DIPSETTING( 0x40, "70" )
|
||||
PORT_DIPSETTING( 0x44, "65" )
|
||||
PORT_DIPSETTING( 0x48, "60" )
|
||||
PORT_DIPSETTING( 0x4c, "55" )
|
||||
PORT_DIPSETTING( 0x50, "50" )
|
||||
PORT_DIPSETTING( 0x54, "45" )
|
||||
PORT_DIPSETTING( 0x58, "40" )
|
||||
PORT_DIPSETTING( 0x5c, "35" )
|
||||
PORT_DIPNAME( 0x20, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW1:!6")
|
||||
PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x80, 0x00, "Diagnostic" ) PORT_DIPLOCATION("SW1:!8")
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x80, DEF_STR( On ) )
|
||||
|
||||
PORT_START("DSWB")
|
||||
PORT_DIPNAME( 0x03, 0x00, "Play Credit" ) PORT_DIPLOCATION("SW2:!1,!2")
|
||||
PORT_DIPSETTING( 0x00, u8"¥10" )
|
||||
PORT_DIPSETTING( 0x01, u8"¥20" )
|
||||
PORT_DIPSETTING( 0x02, u8"¥30" )
|
||||
PORT_DIPSETTING( 0x03, u8"¥40" )
|
||||
PORT_DIPNAME( 0x0c, 0x00, "Coin Exchange" ) PORT_DIPLOCATION("SW2:!3,!4")
|
||||
PORT_DIPSETTING( 0x00, "12" )
|
||||
PORT_DIPSETTING( 0x04, "10" )
|
||||
PORT_DIPSETTING( 0x08, "6" )
|
||||
PORT_DIPSETTING( 0x0c, "5" )
|
||||
PORT_DIPNAME( 0x30, 0x00, "Game Mode" ) PORT_DIPLOCATION("SW2:!5,!6")
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( Normal ) )
|
||||
PORT_DIPSETTING( 0x10, "Shot" )
|
||||
PORT_DIPSETTING( 0x20, "Auto" )
|
||||
PORT_DIPSETTING( 0x30, "S-Manual" )
|
||||
PORT_DIPUNUSED_DIPLOC( 0x40, 0x00, "SW2:!7" )
|
||||
PORT_DIPUNUSED_DIPLOC( 0x80, 0x00, "SW2:!8" )
|
||||
|
||||
PORT_START("DSWC")
|
||||
PORT_DIPUNUSED_DIPLOC( 0x01, 0x00, "SW3:!1" )
|
||||
PORT_DIPUNUSED_DIPLOC( 0x02, 0x00, "SW3:!2" )
|
||||
PORT_DIPUNUSED_DIPLOC( 0x04, 0x00, "SW3:!3" )
|
||||
PORT_DIPUNUSED_DIPLOC( 0x08, 0x00, "SW3:!4" )
|
||||
PORT_DIPUNUSED_DIPLOC( 0x10, 0x00, "SW3:!5" )
|
||||
PORT_DIPUNUSED_DIPLOC( 0x20, 0x00, "SW3:!6" )
|
||||
PORT_DIPUNUSED_DIPLOC( 0x40, 0x00, "SW3:!7" )
|
||||
PORT_DIPUNUSED_DIPLOC( 0x80, 0x00, "SW3:!8" )
|
||||
|
||||
PORT_START("IN1")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START1 )
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SLOT_STOP1 ) PORT_NAME("Left")
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SLOT_STOP2 ) PORT_NAME("Center")
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SLOT_STOP3 ) PORT_NAME("Right")
|
||||
PORT_BIT( 0xf0, IP_ACTIVE_HIGH, IPT_UNUSED )
|
||||
|
||||
PORT_START("IN2")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN2 ) PORT_NAME(u8"Coin 2 (¥10)")
|
||||
PORT_SERVICE_NO_TOGGLE( 0x02, IP_ACTIVE_HIGH )
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SLOT_STOP4 ) PORT_NAME("Down") // does this button really exist?
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("hopper", FUNC(ticket_dispenser_device::line_r))
|
||||
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_MEMORY_RESET )
|
||||
PORT_BIT( 0xe0, IP_ACTIVE_HIGH, IPT_UNUSED )
|
||||
|
||||
PORT_START("SYS")
|
||||
PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED )
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_COIN3 ) PORT_NAME(u8"Coin Exchange (¥100)")
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_GAMBLE_BOOK )
|
||||
PORT_BIT( 0x30, IP_ACTIVE_HIGH, IPT_UNUSED )
|
||||
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_GAMBLE_SERVICE ) PORT_NAME("Attendant Key")
|
||||
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_NAME("Coin 1 (Medal)")
|
||||
|
||||
// The specific "Payout" button shown on the test screen and diagnostic menu does not exist.
|
||||
INPUT_PORTS_END
|
||||
|
||||
static INPUT_PORTS_START( burgkids )
|
||||
PORT_START("DSWA")
|
||||
PORT_DIPNAME( 0x03, 0x00, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW1:!1,!2")
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( Easy ) )
|
||||
PORT_DIPSETTING( 0x01, DEF_STR( Normal ) )
|
||||
PORT_DIPSETTING( 0x02, DEF_STR( Hard ) )
|
||||
PORT_DIPSETTING( 0x03, DEF_STR( Very_Hard ) )
|
||||
PORT_DIPNAME( 0x5c, 0x00, "Payout" ) PORT_DIPLOCATION("SW1:!3,!4,!5,!7")
|
||||
PORT_DIPSETTING( 0x00, "110" ) // Service mode displays values as 1-8, ignoring SW1:7
|
||||
PORT_DIPSETTING( 0x04, "105" )
|
||||
PORT_DIPSETTING( 0x08, "100" )
|
||||
PORT_DIPSETTING( 0x0c, "95" )
|
||||
PORT_DIPSETTING( 0x10, "90" )
|
||||
PORT_DIPSETTING( 0x14, "85" )
|
||||
PORT_DIPSETTING( 0x18, "80" )
|
||||
PORT_DIPSETTING( 0x1c, "75" )
|
||||
PORT_DIPSETTING( 0x40, "70" )
|
||||
PORT_DIPSETTING( 0x44, "65" )
|
||||
PORT_DIPSETTING( 0x48, "60" )
|
||||
PORT_DIPSETTING( 0x4c, "55" )
|
||||
PORT_DIPSETTING( 0x50, "50" )
|
||||
PORT_DIPSETTING( 0x54, "45" )
|
||||
PORT_DIPSETTING( 0x58, "40" )
|
||||
PORT_DIPSETTING( 0x5c, "35" )
|
||||
PORT_DIPNAME( 0x20, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW1:!6")
|
||||
PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPUNUSED_DIPLOC( 0x80, 0x00, "SW2:!8" )
|
||||
|
||||
PORT_START("DSWB")
|
||||
PORT_DIPNAME( 0x03, 0x00, "Play Credit" ) PORT_DIPLOCATION("SW2:!1,!2")
|
||||
PORT_DIPSETTING( 0x00, u8"¥10" )
|
||||
PORT_DIPSETTING( 0x01, u8"¥20" )
|
||||
PORT_DIPSETTING( 0x02, u8"¥30" )
|
||||
PORT_DIPSETTING( 0x03, u8"¥40" )
|
||||
PORT_DIPNAME( 0x1c, 0x00, "Coin Exchange" ) PORT_DIPLOCATION("SW2:!3,!4,!5")
|
||||
PORT_DIPSETTING( 0x00, "12" )
|
||||
PORT_DIPSETTING( 0x04, "11" )
|
||||
PORT_DIPSETTING( 0x08, "10" )
|
||||
PORT_DIPSETTING( 0x0c, "6" )
|
||||
PORT_DIPSETTING( 0x10, "5" )
|
||||
PORT_DIPSETTING( 0x14, "4" )
|
||||
PORT_DIPSETTING( 0x18, "3" )
|
||||
PORT_DIPSETTING( 0x1c, DEF_STR ( Off ) )
|
||||
PORT_DIPUNUSED_DIPLOC( 0x20, 0x00, "SW2:!6" )
|
||||
PORT_DIPUNUSED_DIPLOC( 0x40, 0x00, "SW2:!7" )
|
||||
PORT_DIPUNUSED_DIPLOC( 0x80, 0x00, "SW2:!8" )
|
||||
|
||||
PORT_START("DSWC")
|
||||
PORT_DIPUNUSED_DIPLOC( 0x01, 0x00, "SW3:!1" )
|
||||
PORT_DIPUNUSED_DIPLOC( 0x02, 0x00, "SW3:!2" )
|
||||
PORT_DIPUNUSED_DIPLOC( 0x04, 0x00, "SW3:!3" )
|
||||
PORT_DIPUNUSED_DIPLOC( 0x08, 0x00, "SW3:!4" )
|
||||
PORT_DIPUNUSED_DIPLOC( 0x10, 0x00, "SW3:!5" )
|
||||
PORT_DIPUNUSED_DIPLOC( 0x20, 0x00, "SW3:!6" )
|
||||
PORT_DIPUNUSED_DIPLOC( 0x40, 0x00, "SW3:!7" )
|
||||
PORT_DIPUNUSED_DIPLOC( 0x80, 0x00, "SW3:!8" )
|
||||
|
||||
PORT_START("IN1")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START1 )
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SLOT_STOP1 ) PORT_NAME("1")
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SLOT_STOP2 ) PORT_NAME("2")
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SLOT_STOP3 ) PORT_NAME("3")
|
||||
PORT_BIT( 0xf0, IP_ACTIVE_HIGH, IPT_UNUSED )
|
||||
|
||||
PORT_START("IN2")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN2 ) PORT_NAME(u8"Coin 2 (¥10)")
|
||||
PORT_SERVICE_NO_TOGGLE( 0x02, IP_ACTIVE_HIGH )
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SLOT_STOP4 ) PORT_NAME("Down")
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("hopper", FUNC(ticket_dispenser_device::line_r))
|
||||
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_MEMORY_RESET )
|
||||
PORT_BIT( 0xe0, IP_ACTIVE_HIGH, IPT_UNUSED )
|
||||
|
||||
PORT_START("SYS")
|
||||
PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED )
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_COIN3 ) PORT_NAME(u8"Coin Exchange (¥100)")
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_GAMBLE_BOOK )
|
||||
PORT_BIT( 0x30, IP_ACTIVE_HIGH, IPT_UNUSED )
|
||||
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_GAMBLE_SERVICE ) PORT_NAME("Attendant Key")
|
||||
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_NAME("Coin 1 (Medal)")
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
static INPUT_PORTS_START( 2b )
|
||||
PORT_START("IN1")
|
||||
TOAPLAN_JOY_UDLR_2_BUTTONS( 1 )
|
||||
|
||||
PORT_START("IN2")
|
||||
TOAPLAN_JOY_UDLR_2_BUTTONS( 2 )
|
||||
|
||||
PORT_START("SYS")
|
||||
PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_SERVICE1 )
|
||||
PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_TILT )
|
||||
TOAPLAN_TEST_SWITCH( 0x04, IP_ACTIVE_HIGH )
|
||||
PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_COIN1 )
|
||||
PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_COIN2 )
|
||||
PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_START1 )
|
||||
PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_START2 )
|
||||
PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNKNOWN )
|
||||
|
||||
PORT_START("DSWA")
|
||||
TOAPLAN_MACHINE_NO_COCKTAIL_LOC(SW1)
|
||||
// Coinage on bit mask 0x00f0
|
||||
PORT_BIT( 0x00f0, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // Modified below
|
||||
|
||||
PORT_START("DSWB")
|
||||
TOAPLAN_DIFFICULTY_LOC(SW2)
|
||||
// Per-game features on bit mask 0x00fc
|
||||
PORT_BIT( 0x00fc, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // Modified below
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
static INPUT_PORTS_START( base )
|
||||
PORT_INCLUDE( 2b )
|
||||
|
||||
PORT_MODIFY("IN1")
|
||||
TOAPLAN_JOY_UDLR_3_BUTTONS( 1 )
|
||||
|
||||
PORT_MODIFY("IN2")
|
||||
TOAPLAN_JOY_UDLR_3_BUTTONS( 2 )
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
static INPUT_PORTS_START( othldrby )
|
||||
PORT_INCLUDE( base )
|
||||
|
||||
PORT_MODIFY("SYS")
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_IMPULSE(1)
|
||||
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_COIN2 ) PORT_IMPULSE(1)
|
||||
|
||||
PORT_MODIFY("DSWA")
|
||||
PORT_DIPNAME( 0x01, 0x00, DEF_STR( Demo_Sounds ) )
|
||||
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x02, 0x00, DEF_STR( Flip_Screen ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x02, DEF_STR( On ) )
|
||||
PORT_SERVICE( 0x04, IP_ACTIVE_HIGH )
|
||||
PORT_DIPNAME( 0x08, 0x00, DEF_STR( Allow_Continue ) )
|
||||
PORT_DIPSETTING( 0x08, DEF_STR( No ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( Yes ) )
|
||||
PORT_DIPNAME( 0x30, 0x00, DEF_STR( Coin_A ) )
|
||||
PORT_DIPSETTING( 0x30, DEF_STR( 3C_1C ) )
|
||||
PORT_DIPSETTING( 0x20, DEF_STR( 2C_1C ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) )
|
||||
PORT_DIPSETTING( 0x10, DEF_STR( 1C_2C ) )
|
||||
PORT_DIPNAME( 0xc0, 0x00, DEF_STR( Coin_B ) )
|
||||
PORT_DIPSETTING( 0xc0, DEF_STR( 3C_1C ) )
|
||||
PORT_DIPSETTING( 0x80, DEF_STR( 2C_1C ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) )
|
||||
PORT_DIPSETTING( 0x40, DEF_STR( 1C_2C ) )
|
||||
|
||||
PORT_MODIFY("DSWB")
|
||||
PORT_DIPNAME( 0x03, 0x00, DEF_STR( Difficulty ) )
|
||||
PORT_DIPSETTING( 0x01, DEF_STR( Easy ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( Normal ) )
|
||||
PORT_DIPSETTING( 0x02, DEF_STR( Hard ) )
|
||||
PORT_DIPSETTING( 0x03, DEF_STR( Very_Hard ) )
|
||||
PORT_DIPNAME( 0x04, 0x00, DEF_STR( Unused ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x04, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unused ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x08, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unused ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x10, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unused ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x20, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unused ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x40, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unused ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x80, DEF_STR( On ) )
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
void sunwise_state::pwrkick_coin_w(u8 data)
|
||||
{
|
||||
machine().bookkeeping().coin_counter_w(0, BIT(data, 1)); // medal
|
||||
machine().bookkeeping().coin_counter_w(1, BIT(data, 3)); // 10 yen
|
||||
machine().bookkeeping().coin_counter_w(2, BIT(data, 0)); // 100 yen
|
||||
m_hopper->motor_w(BIT(data, 7));
|
||||
}
|
||||
|
||||
void sunwise_state::pwrkick_coin_lockout_w(u8 data)
|
||||
{
|
||||
machine().bookkeeping().coin_lockout_w(0, BIT(~data, 2));
|
||||
machine().bookkeeping().coin_lockout_w(1, BIT(~data, 2));
|
||||
machine().bookkeeping().coin_lockout_w(2, BIT(~data, 1));
|
||||
}
|
||||
|
||||
|
||||
void sunwise_state::pwrkick_68k_mem(address_map &map)
|
||||
{
|
||||
map(0x000000, 0x07ffff).rom();
|
||||
map(0x100000, 0x103fff).ram().share("nvram"); // Only 10022C-10037B is actually saved as NVRAM
|
||||
map(0x104000, 0x10ffff).ram();
|
||||
|
||||
map(0x200000, 0x20000f).rw(m_rtc, FUNC(upd4992_device::read), FUNC(upd4992_device::write)).umask16(0x00ff);
|
||||
map(0x300000, 0x30000d).rw(m_vdp, FUNC(gp9001vdp_device::read), FUNC(gp9001vdp_device::write));
|
||||
map(0x400000, 0x400fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
|
||||
map(0x600001, 0x600001).rw(m_oki, FUNC(okim6295_device::read), FUNC(okim6295_device::write));
|
||||
|
||||
map(0x700000, 0x700001).r(m_vdp, FUNC(gp9001vdp_device::vdpcount_r));
|
||||
map(0x700004, 0x700005).portr("DSWA");
|
||||
map(0x700008, 0x700009).portr("DSWB");
|
||||
map(0x70000c, 0x70000d).portr("IN1");
|
||||
map(0x700014, 0x700015).portr("IN2");
|
||||
map(0x700018, 0x700019).portr("DSWC");
|
||||
map(0x70001c, 0x70001d).portr("SYS");
|
||||
map(0x700031, 0x700031).w(FUNC(sunwise_state::sw_oki_bankswitch_w));
|
||||
map(0x700035, 0x700035).w(FUNC(sunwise_state::pwrkick_coin_w));
|
||||
map(0x700039, 0x700039).w(FUNC(sunwise_state::pwrkick_coin_lockout_w));
|
||||
}
|
||||
|
||||
void sunwise_state::othldrby_68k_mem(address_map &map)
|
||||
{
|
||||
map(0x000000, 0x07ffff).rom();
|
||||
map(0x100000, 0x103fff).ram().share("nvram"); // Only 10331E-103401 is actually saved as NVRAM
|
||||
map(0x104000, 0x10ffff).ram();
|
||||
|
||||
map(0x200000, 0x20000f).rw(m_rtc, FUNC(upd4992_device::read), FUNC(upd4992_device::write)).umask16(0x00ff);
|
||||
map(0x300000, 0x30000d).rw(m_vdp, FUNC(gp9001vdp_device::read), FUNC(gp9001vdp_device::write));
|
||||
map(0x400000, 0x400fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
|
||||
map(0x600001, 0x600001).rw(m_oki, FUNC(okim6295_device::read), FUNC(okim6295_device::write));
|
||||
|
||||
map(0x700000, 0x700001).r(m_vdp, FUNC(gp9001vdp_device::vdpcount_r));
|
||||
map(0x700004, 0x700005).portr("DSWA");
|
||||
map(0x700008, 0x700009).portr("DSWB");
|
||||
map(0x70000c, 0x70000d).portr("IN1");
|
||||
map(0x700010, 0x700011).portr("IN2");
|
||||
map(0x70001c, 0x70001d).portr("SYS");
|
||||
map(0x700031, 0x700031).w(FUNC(sunwise_state::sw_oki_bankswitch_w));
|
||||
map(0x700035, 0x700035).w("coincounter", FUNC(toaplan_coincounter_device::coin_w));
|
||||
}
|
||||
|
||||
|
||||
void sunwise_state::pwrkick(machine_config &config) // Sunwise SW931201-1 PCB (27.000MHz, 20.000MHz & 16.000MHz OSCs)
|
||||
{
|
||||
/* basic machine hardware */
|
||||
M68000(config, m_maincpu, 20_MHz_XTAL/2); // verified on PCB
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &sunwise_state::pwrkick_68k_mem);
|
||||
|
||||
UPD4992(config, m_rtc, 32.768_kHz_XTAL);
|
||||
|
||||
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
|
||||
|
||||
TICKET_DISPENSER(config, m_hopper, attotime::from_msec(50)); // duration is probably wrong
|
||||
|
||||
/* video hardware */
|
||||
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
|
||||
m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
|
||||
m_screen->set_raw(27_MHz_XTAL/4, 432, 0, 320, 262, 0, 240);
|
||||
m_screen->set_screen_update(FUNC(sunwise_state::screen_update));
|
||||
m_screen->screen_vblank().set(FUNC(sunwise_state::screen_vblank));
|
||||
m_screen->set_palette(m_palette);
|
||||
|
||||
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, gp9001vdp_device::VDP_PALETTE_LENGTH);
|
||||
|
||||
GP9001_VDP(config, m_vdp, 27_MHz_XTAL);
|
||||
m_vdp->set_palette(m_palette);
|
||||
m_vdp->vint_out_cb().set_inputline(m_maincpu, M68K_IRQ_4);
|
||||
|
||||
/* sound hardware */
|
||||
SPEAKER(config, "mono").front_center();
|
||||
// empty YM2151 socket
|
||||
OKIM6295(config, m_oki, 16_MHz_XTAL/4, okim6295_device::PIN7_LOW); // verified on PCB
|
||||
m_oki->add_route(ALL_OUTPUTS, "mono", 0.5);
|
||||
}
|
||||
|
||||
void sunwise_state::othldrby(machine_config &config) // Sunwise S951060-VGP PCB (27.000MHz, 20.000MHz & 16.000MHz OSCs)
|
||||
{
|
||||
/* basic machine hardware */
|
||||
M68000(config, m_maincpu, 20_MHz_XTAL/2); // assumed same as pwrkick
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &sunwise_state::othldrby_68k_mem);
|
||||
|
||||
TOAPLAN_COINCOUNTER(config, "coincounter", 0);
|
||||
|
||||
UPD4992(config, m_rtc, 32.768_kHz_XTAL);
|
||||
|
||||
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
|
||||
|
||||
/* video hardware */
|
||||
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
|
||||
m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
|
||||
m_screen->set_raw(27_MHz_XTAL/4, 432, 0, 320, 262, 0, 240);
|
||||
m_screen->set_screen_update(FUNC(sunwise_state::screen_update));
|
||||
m_screen->screen_vblank().set(FUNC(sunwise_state::screen_vblank));
|
||||
m_screen->set_palette(m_palette);
|
||||
|
||||
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, gp9001vdp_device::VDP_PALETTE_LENGTH);
|
||||
|
||||
GP9001_VDP(config, m_vdp, 27_MHz_XTAL);
|
||||
m_vdp->set_palette(m_palette);
|
||||
m_vdp->vint_out_cb().set_inputline(m_maincpu, M68K_IRQ_4);
|
||||
|
||||
/* sound hardware */
|
||||
SPEAKER(config, "mono").front_center();
|
||||
|
||||
OKIM6295(config, m_oki, 16_MHz_XTAL/4, okim6295_device::PIN7_LOW); // assumed same as pwrkick
|
||||
m_oki->add_route(ALL_OUTPUTS, "mono", 0.5);
|
||||
}
|
||||
|
||||
|
||||
ROM_START( pwrkick ) // Sunwise SW931201-1 PCB - 8-liner connections
|
||||
ROM_REGION( 0x80000, "maincpu", ROMREGION_ERASE00 )
|
||||
ROM_LOAD16_WORD_SWAP( "1.u61", 0x000000, 0x080000, CRC(118b5899) SHA1(7a1637a63eb17e3892d79aede5730013a1dc00f9) )
|
||||
|
||||
ROM_REGION( 0x100000, "gp9001", ROMREGION_ERASE00 )
|
||||
ROM_LOAD( "2.u26", 0x000000, 0x080000, CRC(a190eaea) SHA1(2c7b8c8026873e0f591fbcbc2e72b196ef84e162) )
|
||||
ROM_LOAD( "3.u27", 0x080000, 0x080000, CRC(0b81e038) SHA1(8376617ae519a8ef604f20b26e941aa5b8066602) )
|
||||
|
||||
ROM_REGION( 0x80000, "oki", ROMREGION_ERASE00 )
|
||||
ROM_LOAD( "4.u33", 0x000000, 0x080000, CRC(3ab742f1) SHA1(ce8ca02ca57fd77872e421ce601afd017d3518a0) )
|
||||
ROM_END
|
||||
|
||||
/*
|
||||
|
||||
Burger Kids, 1995 Sunwise
|
||||
|
||||
SW931201-1
|
||||
+--||||||-----------------------------------------+
|
||||
| YM3014* YM2151* |
|
||||
| TDA1519A M6295 FFK4.U33 BT1 |
|
||||
| U31* |
|
||||
| 16.000MHz 32.768kHz D4992C |
|
||||
| MB3771 |
|
||||
|8 |
|
||||
|- U67* |
|
||||
|L FFK1.U61 62256 |
|
||||
|I U68* 62256 |
|
||||
|N GAL16V8B TMP68HC000P-12 |
|
||||
|E |
|
||||
|R |
|
||||
| 1635 27.000MHz FFK3.U27 |
|
||||
| GAL16V8B 1635 20.000MHz U12* |
|
||||
| SW1 GAL16V8B +---------+ FFK2.U26 |
|
||||
| SW2 | L7A0498 | U13* |
|
||||
| SW3 | GP9001 | 4256 4256 |
|
||||
| 6216 +---------+ 4256 4256 |
|
||||
| 6216 4256 4256 |
|
||||
+-------------------------------------------------+
|
||||
|
||||
NOTE: This PCB uses an 8-Liner style edge connector
|
||||
|
||||
* Denotes unpopulated components
|
||||
|
||||
CPU: Toshiba TMP68HC000P-12
|
||||
Sound: OKI M6295
|
||||
Video: L7A0498 GP9001 QFP208
|
||||
OSC: 27MHz, 20MHz, 16MHz & 32.768kHz
|
||||
RAM: MB81C4256A-70P - 256K x 4-bit DRAM
|
||||
HM62256BLP-9 - 32K x 8-bit SRAM
|
||||
IMS1635P-25 - 8K x 8-bit SRAM
|
||||
XRM6216-10 - 2K x 8-bit SRAM
|
||||
Other: 8 Position Dipswitch x 3
|
||||
NEC D4992 CMOS 8-Bit Parallel I/O Calendar Clock
|
||||
MB3771 Voltage monitor
|
||||
BT1 - CR2550 3Volt battery
|
||||
|
||||
NOTE: Sunwise's S951060-VGP PCB uses identical componenets to the SW931201 but has a standard JAMMA connector
|
||||
*/
|
||||
|
||||
ROM_START( burgkids ) // Sunwise SW931201-1 PCB - 8-liner connections
|
||||
ROM_REGION( 0x80000, "maincpu", ROMREGION_ERASE00 )
|
||||
ROM_LOAD16_WORD_SWAP( "ffk1.u61", 0x000000, 0x080000, CRC(ac96cb0d) SHA1(2ce5c06d61f3ff18b222619e41d09e46d44c5bab) )
|
||||
|
||||
ROM_REGION( 0x100000, "gp9001", ROMREGION_ERASE00 )
|
||||
ROM_LOAD( "ffk2.u26", 0x000000, 0x080000, CRC(09f7b0ae) SHA1(f340f27a601ff89f143398263d822b8f340eea6e) )
|
||||
ROM_LOAD( "ffk3.u27", 0x080000, 0x080000, CRC(63c761bc) SHA1(f0ee1dc6aaeacff23e55d072102b814c7ef30550) )
|
||||
|
||||
ROM_REGION( 0x80000, "oki", ROMREGION_ERASE00 )
|
||||
ROM_LOAD( "ffk4.u33", 0x000000, 0x080000, CRC(3b032d4f) SHA1(69056bf205aadf6c9fee56ce396b11a5187caa03) )
|
||||
ROM_END
|
||||
|
||||
ROM_START( othldrby ) // Sunwise S951060-VGP PCB - JAMMA compliant (components identical to Sunwise SW931201-1 PCB)
|
||||
ROM_REGION( 0x080000, "maincpu", 0 )
|
||||
ROM_LOAD16_WORD_SWAP( "sunwise_db0_1.u61", 0x00000, 0x80000, CRC(6b4008d3) SHA1(4cf838c47563ba482be8364b2e115569a4a06c83) )
|
||||
|
||||
ROM_REGION( 0x400000, "gp9001", 0 )
|
||||
ROM_LOAD( "db0-r2.u26", 0x000000, 0x200000, CRC(4efff265) SHA1(4cd239ff42f532495946cb52bd1fee412f84e192) ) // mask ROMs
|
||||
ROM_LOAD( "db0-r3.u27", 0x200000, 0x200000, CRC(5c142b38) SHA1(5466a8b061a0f2545493de0f96fd4387beea276a) )
|
||||
|
||||
ROM_REGION( 0x080000, "oki", 0 ) /* OKIM6295 samples */
|
||||
ROM_LOAD( "sunwise_db0_4.u33", 0x00000, 0x80000, CRC(a9701868) SHA1(9ee89556666d358e8d3915622573b3ba660048b8) )
|
||||
ROM_END
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
GAME( 1994, pwrkick, 0, pwrkick, pwrkick, sunwise_state, empty_init, ROT0, "Sunwise", "Power Kick (Japan)", 0 )
|
||||
GAME( 1995, burgkids, 0, pwrkick, burgkids, sunwise_state, empty_init, ROT0, "Sunwise", "Burger Kids (Japan)", 0 )
|
||||
GAME( 1995, othldrby, 0, othldrby, othldrby, sunwise_state, empty_init, ROT0, "Sunwise", "Othello Derby (Japan)", 0 )
|
356
src/mame/toaplan/tekipaki.cpp
Normal file
356
src/mame/toaplan/tekipaki.cpp
Normal file
@ -0,0 +1,356 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Quench, Yochizo, David Haywood
|
||||
|
||||
#include "emu.h"
|
||||
|
||||
#include "emupal.h"
|
||||
#include "screen.h"
|
||||
#include "speaker.h"
|
||||
#include "tilemap.h"
|
||||
|
||||
#include "toaplan_coincounter.h"
|
||||
#include "toaplipt.h"
|
||||
#include "gp9001.h"
|
||||
|
||||
#include "cpu/m68000/m68000.h"
|
||||
#include "cpu/z180/hd647180x.h"
|
||||
#include "machine/gen_latch.h"
|
||||
#include "sound/ymopl.h"
|
||||
|
||||
/*
|
||||
|
||||
Name Board No Maker Game name
|
||||
----------------------------------------------------------------------------
|
||||
tekipaki TP-020 Toaplan Teki Paki
|
||||
tekipakit TP-020 Toaplan Teki Paki (location test)
|
||||
whoopee *TP-025/TP-020 Toaplan Pipi & Bibis / Whoopee!! (Teki Paki hardware)
|
||||
|
||||
* This version of Whoopee!! is on a board labeled TP-020
|
||||
(same board number, and same hardware, as Teki Paki)
|
||||
but the ROMs are labeled TP-025.
|
||||
|
||||
To Do / Unknowns:
|
||||
- Whoopee/Teki Paki sometimes tests bit 5 of the region jumper port
|
||||
just after testing for vblank. Why?
|
||||
*/
|
||||
|
||||
namespace {
|
||||
|
||||
class tekipaki_state : public driver_device
|
||||
{
|
||||
public:
|
||||
tekipaki_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: driver_device(mconfig, type, tag)
|
||||
, m_maincpu(*this, "maincpu")
|
||||
, m_audiocpu(*this, "audiocpu")
|
||||
, m_vdp(*this, "gp9001")
|
||||
, m_screen(*this, "screen")
|
||||
, m_palette(*this, "palette")
|
||||
, m_soundlatch(*this, "soundlatch")
|
||||
{ }
|
||||
|
||||
void tekipaki(machine_config &config);
|
||||
|
||||
int c2map_r();
|
||||
|
||||
protected:
|
||||
virtual void video_start() override ATTR_COLD;
|
||||
|
||||
private:
|
||||
u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
void screen_vblank(int state);
|
||||
u8 tekipaki_cmdavailable_r();
|
||||
|
||||
void tekipaki_68k_mem(address_map &map) ATTR_COLD;
|
||||
void hd647180_io_map(address_map &map) ATTR_COLD;
|
||||
void reset(int state);
|
||||
|
||||
required_device<m68000_base_device> m_maincpu;
|
||||
optional_device<cpu_device> m_audiocpu;
|
||||
required_device<gp9001vdp_device> m_vdp;
|
||||
required_device<screen_device> m_screen;
|
||||
required_device<palette_device> m_palette;
|
||||
optional_device<generic_latch_8_device> m_soundlatch;
|
||||
bitmap_ind8 m_custom_priority_bitmap;
|
||||
};
|
||||
|
||||
|
||||
void tekipaki_state::reset(int state)
|
||||
{
|
||||
m_audiocpu->pulse_input_line(INPUT_LINE_RESET, attotime::zero);
|
||||
}
|
||||
|
||||
void tekipaki_state::video_start()
|
||||
{
|
||||
m_screen->register_screen_bitmap(m_custom_priority_bitmap);
|
||||
m_vdp->custom_priority_bitmap = &m_custom_priority_bitmap;
|
||||
}
|
||||
|
||||
|
||||
u32 tekipaki_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
bitmap.fill(0, cliprect);
|
||||
m_custom_priority_bitmap.fill(0, cliprect);
|
||||
m_vdp->render_vdp(bitmap, cliprect);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void tekipaki_state::screen_vblank(int state)
|
||||
{
|
||||
if (state) // rising edge
|
||||
{
|
||||
m_vdp->screen_eof();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static INPUT_PORTS_START( base )
|
||||
PORT_START("IN1")
|
||||
TOAPLAN_JOY_UDLR_2_BUTTONS( 1 )
|
||||
|
||||
PORT_START("IN2")
|
||||
TOAPLAN_JOY_UDLR_2_BUTTONS( 2 )
|
||||
|
||||
PORT_START("SYS")
|
||||
PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_SERVICE1 )
|
||||
PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_TILT )
|
||||
TOAPLAN_TEST_SWITCH( 0x04, IP_ACTIVE_HIGH )
|
||||
PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_COIN1 )
|
||||
PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_COIN2 )
|
||||
PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_START1 )
|
||||
PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_START2 )
|
||||
PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNKNOWN )
|
||||
|
||||
PORT_START("DSWA")
|
||||
TOAPLAN_MACHINE_NO_COCKTAIL_LOC(SW1)
|
||||
// Coinage on bit mask 0x00f0
|
||||
PORT_BIT( 0x00f0, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // Modified below
|
||||
|
||||
PORT_START("DSWB")
|
||||
TOAPLAN_DIFFICULTY_LOC(SW2)
|
||||
// Per-game features on bit mask 0x00fc
|
||||
PORT_BIT( 0x00fc, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // Modified below
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
static INPUT_PORTS_START( tekipaki )
|
||||
PORT_INCLUDE( base )
|
||||
|
||||
PORT_MODIFY("DSWA")
|
||||
// Various features on bit mask 0x000f - see above
|
||||
TOAPLAN_COINAGE_DUAL_LOC( JMPR, 0x0f, 0x02, SW1 )
|
||||
|
||||
PORT_MODIFY("DSWB")
|
||||
// Difficulty on bit mask 0x0003 - see above
|
||||
// "Stop Mode" corresponds to "Invulnerability" in the other games
|
||||
// (i.e. it enables pause and slow motion)
|
||||
PORT_DIPNAME( 0x0004, 0x0000, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW2:!3")
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0004, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0008, 0x0000, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW2:!4")
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0008, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0010, 0x0000, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW2:!5")
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0010, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0020, 0x0000, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW2:!6")
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0020, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0040, 0x0000, "Stop Mode (Cheat)" ) PORT_DIPLOCATION("SW2:!7")
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0040, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0080, 0x0000, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW2:!8")
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0080, DEF_STR( On ) )
|
||||
|
||||
PORT_START("JMPR")
|
||||
PORT_CONFNAME( 0x000f, 0x0002, DEF_STR( Region ) ) PORT_DIPLOCATION("JP:!4,!3,!2,!1")
|
||||
PORT_CONFSETTING( 0x0002, DEF_STR( Europe ) )
|
||||
PORT_CONFSETTING( 0x0001, DEF_STR( USA ) )
|
||||
PORT_CONFSETTING( 0x0000, DEF_STR( Japan ) )
|
||||
PORT_CONFSETTING( 0x0003, DEF_STR( Hong_Kong ) )
|
||||
PORT_CONFSETTING( 0x0004, DEF_STR( Korea ) )
|
||||
PORT_CONFSETTING( 0x0005, DEF_STR( Taiwan ) )
|
||||
PORT_CONFSETTING( 0x0006, "Taiwan (Spacy Co., Ltd." )
|
||||
PORT_CONFSETTING( 0x0007, "USA (Romstar, Inc.)" )
|
||||
PORT_CONFSETTING( 0x0008, "Hong Kong (Honest Trading Co.)" )
|
||||
// PORT_CONFSETTING( 0x0009, DEF_STR( Japan ) ) // English title screen
|
||||
// PORT_CONFSETTING( 0x000a, DEF_STR( Japan ) )
|
||||
// PORT_CONFSETTING( 0x000b, DEF_STR( Japan ) )
|
||||
// PORT_CONFSETTING( 0x000c, DEF_STR( Japan ) )
|
||||
// PORT_CONFSETTING( 0x000d, DEF_STR( Japan ) )
|
||||
// PORT_CONFSETTING( 0x000e, DEF_STR( Japan ) )
|
||||
PORT_CONFSETTING( 0x000f, "Japan (Distributed by Tecmo)" )
|
||||
PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(FUNC(tekipaki_state::c2map_r))
|
||||
INPUT_PORTS_END
|
||||
|
||||
static INPUT_PORTS_START( whoopee )
|
||||
PORT_INCLUDE( base )
|
||||
|
||||
PORT_MODIFY("DSWA")
|
||||
// Various features on bit mask 0x000f - see above
|
||||
TOAPLAN_COINAGE_DUAL_LOC( JMPR, 0x06, 0x06, SW1 )
|
||||
|
||||
PORT_MODIFY("DSWB")
|
||||
// Difficulty on bit mask 0x0003 - see above
|
||||
PORT_DIPNAME( 0x000c, 0x0000, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:!3,!4")
|
||||
PORT_DIPSETTING( 0x000c, DEF_STR( None ) )
|
||||
PORT_DIPSETTING( 0x0008, "200k only" )
|
||||
PORT_DIPSETTING( 0x0000, "200k and every 300k" )
|
||||
PORT_DIPSETTING( 0x0004, "150k and every 200k" )
|
||||
PORT_DIPNAME( 0x0030, 0x0000, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:!5,!6")
|
||||
PORT_DIPSETTING( 0x0030, "1" )
|
||||
PORT_DIPSETTING( 0x0020, "2" )
|
||||
PORT_DIPSETTING( 0x0000, "3" )
|
||||
PORT_DIPSETTING( 0x0010, "5" )
|
||||
PORT_DIPNAME( 0x0040, 0x0000, "Invulnerability (Cheat)" ) PORT_DIPLOCATION("SW2:!7")
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0040, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0080, 0x0000, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW2:!8")
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0080, DEF_STR( On ) )
|
||||
|
||||
PORT_START("JMPR")
|
||||
PORT_CONFNAME( 0x0008, 0x0000, "Nudity" ) //PORT_CONFLOCATION("JP:!1")
|
||||
PORT_CONFSETTING( 0x0008, DEF_STR( Low ) )
|
||||
PORT_CONFSETTING( 0x0000, "High, but censored" )
|
||||
PORT_CONFNAME( 0x0007, 0x0006, DEF_STR( Region ) ) //PORT_CONFLOCATION("JP:!4,!3,!2")
|
||||
PORT_CONFSETTING( 0x0006, DEF_STR( Europe ) )
|
||||
PORT_CONFSETTING( 0x0004, DEF_STR( USA ) )
|
||||
PORT_CONFSETTING( 0x0000, DEF_STR( Japan ) )
|
||||
PORT_CONFSETTING( 0x0001, DEF_STR( Asia ) )
|
||||
PORT_CONFSETTING( 0x0002, "Hong Kong (Honest Trading Co.)" )
|
||||
PORT_CONFSETTING( 0x0003, DEF_STR( Taiwan ) )
|
||||
PORT_CONFSETTING( 0x0005, "USA (Romstar, Inc.)" )
|
||||
PORT_CONFSETTING( 0x0007, "Europe (Nova Apparate GMBH & Co.)" )
|
||||
PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(FUNC(tekipaki_state::c2map_r)) // bit 0x10 sound ready
|
||||
INPUT_PORTS_END
|
||||
|
||||
int tekipaki_state::c2map_r()
|
||||
{
|
||||
// bit 4 high signifies secondary CPU is ready
|
||||
// bit 5 is tested low before V-Blank bit ???
|
||||
return m_soundlatch->pending_r() ? 0x00 : 0x01;
|
||||
}
|
||||
|
||||
u8 tekipaki_state::tekipaki_cmdavailable_r()
|
||||
{
|
||||
if (m_soundlatch->pending_r()) return 0xff;
|
||||
else return 0x00;
|
||||
};
|
||||
|
||||
|
||||
void tekipaki_state::tekipaki_68k_mem(address_map &map)
|
||||
{
|
||||
map(0x000000, 0x01ffff).rom();
|
||||
map(0x020000, 0x03ffff).rom(); // extra for Whoopee
|
||||
map(0x080000, 0x082fff).ram();
|
||||
map(0x0c0000, 0x0c0fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
|
||||
map(0x140000, 0x14000d).rw(m_vdp, FUNC(gp9001vdp_device::read), FUNC(gp9001vdp_device::write));
|
||||
map(0x180000, 0x180001).portr("DSWA");
|
||||
map(0x180010, 0x180011).portr("DSWB");
|
||||
map(0x180020, 0x180021).portr("SYS");
|
||||
map(0x180030, 0x180031).portr("JMPR"); // CPU 2 busy and Region Jumper block
|
||||
map(0x180041, 0x180041).w("coincounter", FUNC(toaplan_coincounter_device::coin_w));
|
||||
map(0x180050, 0x180051).portr("IN1");
|
||||
map(0x180060, 0x180061).portr("IN2");
|
||||
map(0x180071, 0x180071).w(m_soundlatch, FUNC(generic_latch_8_device::write));
|
||||
}
|
||||
|
||||
void tekipaki_state::hd647180_io_map(address_map &map)
|
||||
{
|
||||
map.global_mask(0xff);
|
||||
|
||||
map(0x60, 0x60).nopr();
|
||||
map(0x70, 0x75).nopw(); // DDRs are written with the wrong upper addresses!
|
||||
map(0x84, 0x84).r(m_soundlatch, FUNC(generic_latch_8_device::read));
|
||||
|
||||
map(0x82, 0x82).rw("ymsnd", FUNC(ym3812_device::status_r), FUNC(ym3812_device::address_w));
|
||||
map(0x83, 0x83).w("ymsnd", FUNC(ym3812_device::data_w));
|
||||
}
|
||||
|
||||
void tekipaki_state::tekipaki(machine_config &config)
|
||||
{
|
||||
/* basic machine hardware */
|
||||
M68000(config, m_maincpu, 10_MHz_XTAL); // 10MHz Oscillator
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &tekipaki_state::tekipaki_68k_mem);
|
||||
m_maincpu->reset_cb().set(FUNC(tekipaki_state::reset));
|
||||
|
||||
hd647180x_device &audiocpu(HD647180X(config, m_audiocpu, 10_MHz_XTAL));
|
||||
// 16k byte ROM and 512 byte RAM are internal
|
||||
audiocpu.set_addrmap(AS_IO, &tekipaki_state::hd647180_io_map);
|
||||
audiocpu.in_pa_callback().set(FUNC(tekipaki_state::tekipaki_cmdavailable_r));
|
||||
|
||||
TOAPLAN_COINCOUNTER(config, "coincounter", 0);
|
||||
|
||||
config.set_maximum_quantum(attotime::from_hz(600));
|
||||
|
||||
/* video hardware */
|
||||
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
|
||||
m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
|
||||
m_screen->set_raw(27_MHz_XTAL/4, 432, 0, 320, 262, 0, 240);
|
||||
m_screen->set_screen_update(FUNC(tekipaki_state::screen_update));
|
||||
m_screen->screen_vblank().set(FUNC(tekipaki_state::screen_vblank));
|
||||
m_screen->set_palette(m_palette);
|
||||
|
||||
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, gp9001vdp_device::VDP_PALETTE_LENGTH);
|
||||
|
||||
GP9001_VDP(config, m_vdp, 27_MHz_XTAL);
|
||||
m_vdp->set_palette(m_palette);
|
||||
m_vdp->vint_out_cb().set_inputline(m_maincpu, M68K_IRQ_4);
|
||||
|
||||
/* sound hardware */
|
||||
SPEAKER(config, "mono").front_center();
|
||||
|
||||
GENERIC_LATCH_8(config, m_soundlatch);
|
||||
|
||||
ym3812_device &ymsnd(YM3812(config, "ymsnd", 27_MHz_XTAL/8));
|
||||
ymsnd.irq_handler().set_inputline(m_audiocpu, 0);
|
||||
ymsnd.add_route(ALL_OUTPUTS, "mono", 1.0);
|
||||
}
|
||||
|
||||
ROM_START( tekipaki )
|
||||
ROM_REGION( 0x040000, "maincpu", 0 ) /* Main 68K code */
|
||||
ROM_LOAD16_BYTE( "tp020-1.bin", 0x000000, 0x010000, CRC(d8420bd5) SHA1(30c1ad9e053cd7e79adb42aa428ebee28e144755) )
|
||||
ROM_LOAD16_BYTE( "tp020-2.bin", 0x000001, 0x010000, CRC(7222de8e) SHA1(8352ae23efc24a2e20cc24b6d37cb8fc6b1a730c) )
|
||||
|
||||
ROM_REGION( 0x8000, "audiocpu", 0 ) /* Sound HD647180 code */
|
||||
ROM_LOAD( "hd647180.020", 0x00000, 0x08000, CRC(d5157c12) SHA1(b2c6c087bb539456a9e562d0b40f05dde26cacd3) )
|
||||
|
||||
ROM_REGION( 0x100000, "gp9001", 0 )
|
||||
ROM_LOAD( "tp020-4.bin", 0x000000, 0x080000, CRC(3ebbe41e) SHA1(cea196c5f83e1a23d5b538a0db9bbbffa7af5118) )
|
||||
ROM_LOAD( "tp020-3.bin", 0x080000, 0x080000, CRC(2d5e2201) SHA1(5846c844eedd48305c1c67dc645b6e070b3f5b98) )
|
||||
ROM_END
|
||||
|
||||
|
||||
ROM_START( tekipakit ) /* Location Test version */
|
||||
ROM_REGION( 0x040000, "maincpu", 0 ) /* Main 68K code */
|
||||
ROM_LOAD16_BYTE( "e.e5", 0x000000, 0x010000, CRC(89affc73) SHA1(3930bf0c2528de28dcb0cf2cd537adb62a2172e3) ) /* hand written "E" 27C512 chip */
|
||||
ROM_LOAD16_BYTE( "o.e6", 0x000001, 0x010000, CRC(a2244558) SHA1(5291cfbea4d4d1c45d6d4bd21b3c466459a0fa17) ) /* hand written "O" 27C512 chip */
|
||||
|
||||
ROM_REGION( 0x8000, "audiocpu", 0 ) /* Sound HD647180 code */
|
||||
ROM_LOAD( "hd647180.020", 0x00000, 0x08000, CRC(d5157c12) SHA1(b2c6c087bb539456a9e562d0b40f05dde26cacd3) )
|
||||
|
||||
ROM_REGION( 0x100000, "gp9001", 0 )
|
||||
ROM_LOAD( "0-1_4.4_cb45.a16", 0x000000, 0x080000, CRC(35e14729) SHA1(8c929604953b78c6e72744a38e06a988510193a5) ) /* hand written "0-1 4/4 CB45" 27C402 chip */
|
||||
ROM_LOAD( "3-4_4.4_547d.a15", 0x080000, 0x080000, CRC(41975fcc) SHA1(f850d5a9638d41bb69f204a9cd54e2fd693b57ef) ) /* hand written "3-4 4/4 547D" 27C402 chip */
|
||||
ROM_END
|
||||
|
||||
ROM_START( whoopee )
|
||||
ROM_REGION( 0x040000, "maincpu", 0 ) /* Main 68K code */
|
||||
ROM_LOAD16_BYTE( "whoopee.1", 0x000000, 0x020000, CRC(28882e7e) SHA1(8fcd278a7d005eb81cd9e461139c0c0f756a4fa4) )
|
||||
ROM_LOAD16_BYTE( "whoopee.2", 0x000001, 0x020000, CRC(6796f133) SHA1(d4e657be260ba3fd3f0556ade617882513b52685) )
|
||||
|
||||
ROM_REGION( 0x10000, "audiocpu", 0 ) /* Sound HD647180 code */
|
||||
ROM_LOAD( "hd647180.025", 0x00000, 0x08000, CRC(c02436f6) SHA1(385343f88991646ec23b385eaea82718f1251ea6) )
|
||||
|
||||
ROM_REGION( 0x200000, "gp9001", 0 )
|
||||
ROM_LOAD( "tp025-4.bin", 0x000000, 0x100000, CRC(ab97f744) SHA1(c1620e614345dbd5c6567e4cb6f55c61b900d0ee) )
|
||||
ROM_LOAD( "tp025-3.bin", 0x100000, 0x100000, CRC(7b16101e) SHA1(ae0119bbfa0937d18c4fbb0a3ef7cdc3b9fa6b56) )
|
||||
ROM_END
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
GAME( 1991, tekipaki, 0, tekipaki, tekipaki, tekipaki_state, empty_init, ROT0, "Toaplan", "Teki Paki", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1991, tekipakit, tekipaki, tekipaki, tekipaki, tekipaki_state, empty_init, ROT0, "Toaplan", "Teki Paki (location test)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1991, whoopee, pipibibs, tekipaki, whoopee, tekipaki_state, empty_init, ROT0, "Toaplan", "Pipi & Bibis / Whoopee!! (Teki Paki hardware)", MACHINE_SUPPORTS_SAVE ) // original Whoopee!! boards have a HD647180 instead of Z80
|
File diff suppressed because it is too large
Load Diff
@ -1,307 +0,0 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Quench, Yochizo, David Haywood
|
||||
#ifndef MAME_TOAPLAN_TOAPLAN2_H
|
||||
#define MAME_TOAPLAN_TOAPLAN2_H
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "cpu/m68000/m68000.h"
|
||||
#include "machine/bankdev.h"
|
||||
#include "machine/eepromser.h"
|
||||
#include "machine/gen_latch.h"
|
||||
#include "machine/ticket.h"
|
||||
#include "machine/upd4992.h"
|
||||
#include "gp9001.h"
|
||||
#include "sound/okim6295.h"
|
||||
#include "emupal.h"
|
||||
#include "screen.h"
|
||||
#include "tilemap.h"
|
||||
|
||||
/**************** Machine stuff ******************/
|
||||
|
||||
class toaplan2_state : public driver_device
|
||||
{
|
||||
public:
|
||||
toaplan2_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: driver_device(mconfig, type, tag)
|
||||
, m_shared_ram(*this, "shared_ram")
|
||||
, m_mainram(*this, "mainram")
|
||||
, m_maincpu(*this, "maincpu")
|
||||
, m_audiocpu(*this, "audiocpu")
|
||||
, m_vdp(*this, "gp9001_%u", 0U)
|
||||
, m_oki(*this, "oki%u", 1U)
|
||||
, m_eeprom(*this, "eeprom")
|
||||
, m_gfxdecode(*this, "gfxdecode")
|
||||
, m_screen(*this, "screen")
|
||||
, m_palette(*this, "palette")
|
||||
, m_soundlatch(*this, "soundlatch%u", 1U)
|
||||
, m_z80_rom(*this, "audiocpu")
|
||||
, m_oki_rom(*this, "oki%u", 1U)
|
||||
, m_okibank(*this, "okibank")
|
||||
{ }
|
||||
|
||||
void batsugun(machine_config &config);
|
||||
void batsugunbl(machine_config &config);
|
||||
void dogyuun(machine_config &config);
|
||||
void dogyuunto(machine_config &config);
|
||||
void enmadaio(machine_config &config);
|
||||
void kbash(machine_config &config);
|
||||
void kbash2(machine_config &config);
|
||||
void pipibibs(machine_config &config);
|
||||
void pipibibsbl(machine_config &config);
|
||||
void snowbro2(machine_config &config);
|
||||
void snowbro2b3(machine_config &config);
|
||||
void tekipaki(machine_config &config);
|
||||
void vfive(machine_config &config);
|
||||
|
||||
void init_dogyuun();
|
||||
void init_enmadaio();
|
||||
void init_fixeightbl();
|
||||
void init_pipibibsbl();
|
||||
void init_vfive();
|
||||
|
||||
int c2map_r();
|
||||
|
||||
protected:
|
||||
// We encode priority with colour in the tilemaps, so need a larger palette
|
||||
static constexpr unsigned T2PALETTE_LENGTH = 0x10000;
|
||||
|
||||
optional_shared_ptr<u8> m_shared_ram; // 8 bit RAM shared between 68K and sound CPU
|
||||
optional_shared_ptr<u16> m_mainram;
|
||||
|
||||
required_device<m68000_base_device> m_maincpu;
|
||||
optional_device<cpu_device> m_audiocpu;
|
||||
optional_device_array<gp9001vdp_device, 2> m_vdp;
|
||||
optional_device_array<okim6295_device, 2> m_oki;
|
||||
optional_device<eeprom_serial_93cxx_device> m_eeprom;
|
||||
optional_device<gfxdecode_device> m_gfxdecode;
|
||||
required_device<screen_device> m_screen;
|
||||
required_device<palette_device> m_palette;
|
||||
optional_device_array<generic_latch_8_device, 4> m_soundlatch; // tekipaki, batrider, bgaregga, batsugun
|
||||
|
||||
optional_region_ptr<u8> m_z80_rom;
|
||||
optional_region_ptr_array<u8, 2> m_oki_rom;
|
||||
optional_memory_bank m_okibank;
|
||||
|
||||
u8 m_sound_reset_bit = 0; /* 0x20 for dogyuun/batsugun, 0x10 for vfive, 0x08 for fixeight */
|
||||
|
||||
bitmap_ind8 m_custom_priority_bitmap;
|
||||
bitmap_ind16 m_secondary_render_bitmap;
|
||||
|
||||
u16 video_count_r();
|
||||
void coin_w(u8 data);
|
||||
void coin_sound_reset_w(u8 data);
|
||||
u8 shared_ram_r(offs_t offset);
|
||||
void shared_ram_w(offs_t offset, u8 data);
|
||||
void sound_reset_w(u8 data);
|
||||
void fixeightbl_oki_bankswitch_w(u8 data);
|
||||
|
||||
template<int Chip> void oki_bankswitch_w(u8 data);
|
||||
void enmadaio_oki_bank_w(offs_t offset, u16 data, u16 mem_mask = ~0);
|
||||
|
||||
DECLARE_VIDEO_START(toaplan2);
|
||||
DECLARE_VIDEO_START(batsugunbl);
|
||||
|
||||
// Teki Paki sound
|
||||
u8 tekipaki_cmdavailable_r();
|
||||
|
||||
u32 screen_update_toaplan2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
u32 screen_update_dogyuun(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
u32 screen_update_batsugun(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
void screen_vblank(int state);
|
||||
void cpu_space_fixeightbl_map(address_map &map) ATTR_COLD;
|
||||
void cpu_space_pipibibsbl_map(address_map &map) ATTR_COLD;
|
||||
|
||||
void toaplan2_reset(int state);
|
||||
|
||||
void batsugun_68k_mem(address_map &map) ATTR_COLD;
|
||||
void batsugunbl_68k_mem(address_map &map) ATTR_COLD;
|
||||
void dogyuun_68k_mem(address_map &map) ATTR_COLD;
|
||||
void dogyuunto_68k_mem(address_map &map) ATTR_COLD;
|
||||
void dogyuunto_sound_z80_mem(address_map &map) ATTR_COLD;
|
||||
void enmadaio_68k_mem(address_map &map) ATTR_COLD;
|
||||
void enmadaio_oki(address_map &map) ATTR_COLD;
|
||||
void fixeightbl_oki(address_map &map) ATTR_COLD;
|
||||
void hd647180_io_map(address_map &map) ATTR_COLD;
|
||||
void kbash2_68k_mem(address_map &map) ATTR_COLD;
|
||||
void kbash_68k_mem(address_map &map) ATTR_COLD;
|
||||
void kbash_v25_mem(address_map &map) ATTR_COLD;
|
||||
void pipibibi_bootleg_68k_mem(address_map &map) ATTR_COLD;
|
||||
void pipibibs_68k_mem(address_map &map) ATTR_COLD;
|
||||
void pipibibs_sound_z80_mem(address_map &map) ATTR_COLD;
|
||||
void snowbro2_68k_mem(address_map &map) ATTR_COLD;
|
||||
void snowbro2b3_68k_mem(address_map &map) ATTR_COLD;
|
||||
void tekipaki_68k_mem(address_map &map) ATTR_COLD;
|
||||
void v25_mem(address_map &map) ATTR_COLD;
|
||||
void vfive_68k_mem(address_map &map) ATTR_COLD;
|
||||
void vfive_v25_mem(address_map &map) ATTR_COLD;
|
||||
};
|
||||
|
||||
// with paddle
|
||||
class ghox_state : public toaplan2_state
|
||||
{
|
||||
public:
|
||||
ghox_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: toaplan2_state(mconfig, type, tag)
|
||||
, m_io_pad(*this, "PAD%u", 1U)
|
||||
{ }
|
||||
|
||||
void ghox(machine_config &config);
|
||||
|
||||
protected:
|
||||
virtual void machine_start() override ATTR_COLD;
|
||||
virtual void machine_reset() override ATTR_COLD;
|
||||
|
||||
private:
|
||||
required_ioport_array<2> m_io_pad;
|
||||
|
||||
s8 m_old_paddle_h[2] = {0};
|
||||
|
||||
template<unsigned Which> u16 ghox_h_analog_r();
|
||||
|
||||
void ghox_68k_mem(address_map &map) ATTR_COLD;
|
||||
void ghox_hd647180_mem_map(address_map &map) ATTR_COLD;
|
||||
};
|
||||
|
||||
// with text layer
|
||||
class truxton2_state : public toaplan2_state
|
||||
{
|
||||
public:
|
||||
truxton2_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: toaplan2_state(mconfig, type, tag)
|
||||
, m_tx_videoram(*this, "tx_videoram")
|
||||
, m_tx_lineselect(*this, "tx_lineselect")
|
||||
, m_tx_linescroll(*this, "tx_linescroll")
|
||||
, m_tx_gfxram(*this, "tx_gfxram")
|
||||
, m_dma_space(*this, "dma_space")
|
||||
, m_audiobank(*this, "audiobank")
|
||||
, m_raizing_okibank{
|
||||
{ *this, "raizing_okibank0_%u", 0U },
|
||||
{ *this, "raizing_okibank1_%u", 0U } }
|
||||
, m_eepromout(*this, "EEPROMOUT")
|
||||
{ }
|
||||
|
||||
void batrider(machine_config &config);
|
||||
void bbakraid(machine_config &config);
|
||||
void bgaregga(machine_config &config);
|
||||
void bgareggabl(machine_config &config);
|
||||
void fixeight(machine_config &config);
|
||||
void fixeightbl(machine_config &config);
|
||||
void mahoudai(machine_config &config);
|
||||
void nprobowl(machine_config &config);
|
||||
void shippumd(machine_config &config);
|
||||
void truxton2(machine_config &config);
|
||||
|
||||
void init_batrider();
|
||||
void init_bbakraid();
|
||||
void init_bgaregga();
|
||||
void init_fixeight();
|
||||
|
||||
protected:
|
||||
virtual void machine_start() override ATTR_COLD;
|
||||
virtual void device_post_load() override;
|
||||
|
||||
private:
|
||||
required_shared_ptr<u16> m_tx_videoram;
|
||||
optional_shared_ptr<u16> m_tx_lineselect;
|
||||
optional_shared_ptr<u16> m_tx_linescroll;
|
||||
optional_shared_ptr<u16> m_tx_gfxram;
|
||||
|
||||
optional_device<address_map_bank_device> m_dma_space;
|
||||
|
||||
optional_memory_bank m_audiobank;
|
||||
optional_memory_bank_array<8> m_raizing_okibank[2];
|
||||
|
||||
optional_ioport m_eepromout;
|
||||
|
||||
u8 m_sndirq_line = 0; /* IRQ4 for batrider, IRQ2 for bbakraid */
|
||||
u8 m_z80_busreq = 0;
|
||||
u16 m_gfxrom_bank[8]{}; /* Batrider object bank */
|
||||
|
||||
tilemap_t *m_tx_tilemap = nullptr; /* Tilemap for extra-text-layer */
|
||||
|
||||
void shippumd_coin_w(u8 data);
|
||||
void raizing_z80_bankswitch_w(u8 data);
|
||||
void raizing_oki_bankswitch_w(offs_t offset, u8 data);
|
||||
u8 bgaregga_E01D_r();
|
||||
u16 batrider_z80_busack_r();
|
||||
void batrider_z80_busreq_w(u8 data);
|
||||
u16 batrider_z80rom_r(offs_t offset);
|
||||
void batrider_soundlatch_w(u8 data);
|
||||
void batrider_soundlatch2_w(u8 data);
|
||||
void batrider_unknown_sound_w(u16 data);
|
||||
void batrider_clear_sndirq_w(u16 data);
|
||||
void batrider_sndirq_w(u8 data);
|
||||
void batrider_clear_nmi_w(u8 data);
|
||||
u16 bbakraid_eeprom_r();
|
||||
void bbakraid_eeprom_w(u8 data);
|
||||
void tx_videoram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
|
||||
void tx_linescroll_w(offs_t offset, u16 data, u16 mem_mask = ~0);
|
||||
void tx_gfxram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
|
||||
void batrider_tx_gfxram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
|
||||
void batrider_textdata_dma_w(u16 data);
|
||||
void batrider_pal_text_dma_w(u16 data);
|
||||
void batrider_objectbank_w(offs_t offset, u8 data);
|
||||
void batrider_bank_cb(u8 layer, u32 &code);
|
||||
|
||||
void install_raizing_okibank(int chip);
|
||||
|
||||
TILE_GET_INFO_MEMBER(get_text_tile_info);
|
||||
DECLARE_MACHINE_RESET(bgaregga);
|
||||
DECLARE_VIDEO_START(truxton2);
|
||||
DECLARE_VIDEO_START(fixeightbl);
|
||||
DECLARE_VIDEO_START(bgaregga);
|
||||
DECLARE_VIDEO_START(bgareggabl);
|
||||
DECLARE_VIDEO_START(batrider);
|
||||
|
||||
u32 screen_update_truxton2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
u32 screen_update_bootleg(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
INTERRUPT_GEN_MEMBER(bbakraid_snd_interrupt);
|
||||
void create_tx_tilemap(int dx = 0, int dx_flipped = 0);
|
||||
|
||||
void batrider_68k_mem(address_map &map) ATTR_COLD;
|
||||
void batrider_dma_mem(address_map &map) ATTR_COLD;
|
||||
void batrider_sound_z80_mem(address_map &map) ATTR_COLD;
|
||||
void batrider_sound_z80_port(address_map &map) ATTR_COLD;
|
||||
void bbakraid_68k_mem(address_map &map) ATTR_COLD;
|
||||
void bbakraid_sound_z80_mem(address_map &map) ATTR_COLD;
|
||||
void bbakraid_sound_z80_port(address_map &map) ATTR_COLD;
|
||||
void bgaregga_68k_mem(address_map &map) ATTR_COLD;
|
||||
void bgaregga_sound_z80_mem(address_map &map) ATTR_COLD;
|
||||
void fixeight_68k_mem(address_map &map) ATTR_COLD;
|
||||
void fixeight_v25_mem(address_map &map) ATTR_COLD;
|
||||
void fixeightbl_68k_mem(address_map &map) ATTR_COLD;
|
||||
void mahoudai_68k_mem(address_map &map) ATTR_COLD;
|
||||
void nprobowl_68k_mem(address_map &map) ATTR_COLD;
|
||||
template<unsigned Chip> void raizing_oki(address_map &map) ATTR_COLD;
|
||||
void raizing_sound_z80_mem(address_map &map) ATTR_COLD;
|
||||
void shippumd_68k_mem(address_map &map) ATTR_COLD;
|
||||
void truxton2_68k_mem(address_map &map) ATTR_COLD;
|
||||
};
|
||||
|
||||
|
||||
// with RTC, hopper
|
||||
class pwrkick_state : public toaplan2_state
|
||||
{
|
||||
public:
|
||||
pwrkick_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: toaplan2_state(mconfig, type, tag)
|
||||
, m_rtc(*this, "rtc")
|
||||
, m_hopper(*this, "hopper")
|
||||
{ }
|
||||
|
||||
void othldrby(machine_config &config);
|
||||
void pwrkick(machine_config &config);
|
||||
|
||||
private:
|
||||
required_device<upd4992_device> m_rtc;
|
||||
optional_device<ticket_dispenser_device> m_hopper;
|
||||
|
||||
void pwrkick_coin_w(u8 data);
|
||||
void pwrkick_coin_lockout_w(u8 data);
|
||||
|
||||
void othldrby_68k_mem(address_map &map) ATTR_COLD;
|
||||
void pwrkick_68k_mem(address_map &map) ATTR_COLD;
|
||||
};
|
||||
|
||||
#endif // MAME_TOAPLAN_TOAPLAN2_H
|
@ -1,404 +0,0 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Quench, Yochizo, David Haywood
|
||||
/***************************************************************************
|
||||
|
||||
Functions to emulate additional video hardware on several Toaplan2 games.
|
||||
The main video is handled by the GP9001 (see gp9001.cpp)
|
||||
|
||||
Extra-text RAM format
|
||||
|
||||
Truxton 2, Fixeight and Raizing games have an extra-text layer.
|
||||
|
||||
Text RAM format $0000-1FFF (actually its probably $0000-0FFF)
|
||||
---- --xx xxxx xxxx = Tile number
|
||||
xxxx xx-- ---- ---- = Color (0 - 3Fh) + 40h
|
||||
|
||||
Line select / flip $0000-01EF (some games go to $01FF (excess?))
|
||||
---x xxxx xxxx xxxx = Line select for each line
|
||||
x--- ---- ---- ---- = X flip for each line ???
|
||||
|
||||
Line scroll $0000-01EF (some games go to $01FF (excess?))
|
||||
---- ---x xxxx xxxx = X scroll for each line
|
||||
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "toaplan2.h"
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Callbacks for the TileMap code
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
TILE_GET_INFO_MEMBER(truxton2_state::get_text_tile_info)
|
||||
{
|
||||
const u16 attrib = m_tx_videoram[tile_index];
|
||||
const u32 tile_number = attrib & 0x3ff;
|
||||
const u32 color = attrib >> 10;
|
||||
tileinfo.set(0,
|
||||
tile_number,
|
||||
color,
|
||||
0);
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Start the video hardware emulation.
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
|
||||
void truxton2_state::create_tx_tilemap(int dx, int dx_flipped)
|
||||
{
|
||||
m_tx_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(truxton2_state::get_text_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32);
|
||||
|
||||
m_tx_tilemap->set_scroll_rows(8*32); /* line scrolling */
|
||||
m_tx_tilemap->set_scroll_cols(1);
|
||||
m_tx_tilemap->set_scrolldx(dx, dx_flipped);
|
||||
m_tx_tilemap->set_transparent_pen(0);
|
||||
}
|
||||
|
||||
void truxton2_state::device_post_load()
|
||||
{
|
||||
if (m_tx_gfxram != nullptr)
|
||||
m_gfxdecode->gfx(0)->mark_all_dirty();
|
||||
}
|
||||
|
||||
VIDEO_START_MEMBER(toaplan2_state,toaplan2)
|
||||
{
|
||||
/* our current VDP implementation needs this bitmap to work with */
|
||||
m_screen->register_screen_bitmap(m_custom_priority_bitmap);
|
||||
|
||||
if (m_vdp[0] != nullptr)
|
||||
{
|
||||
m_secondary_render_bitmap.reset();
|
||||
m_vdp[0]->custom_priority_bitmap = &m_custom_priority_bitmap;
|
||||
}
|
||||
|
||||
if (m_vdp[1] != nullptr)
|
||||
{
|
||||
m_screen->register_screen_bitmap(m_secondary_render_bitmap);
|
||||
m_vdp[1]->custom_priority_bitmap = &m_custom_priority_bitmap;
|
||||
}
|
||||
}
|
||||
|
||||
VIDEO_START_MEMBER(truxton2_state,truxton2)
|
||||
{
|
||||
VIDEO_START_CALL_MEMBER(toaplan2);
|
||||
|
||||
/* Create the Text tilemap for this game */
|
||||
m_gfxdecode->gfx(0)->set_source(reinterpret_cast<u8 *>(m_tx_gfxram.target()));
|
||||
|
||||
create_tx_tilemap(0x1d5, 0x16a);
|
||||
}
|
||||
|
||||
VIDEO_START_MEMBER(truxton2_state,fixeightbl)
|
||||
{
|
||||
VIDEO_START_CALL_MEMBER(toaplan2);
|
||||
|
||||
/* Create the Text tilemap for this game */
|
||||
create_tx_tilemap();
|
||||
|
||||
/* This bootleg has additional layer offsets on the VDP */
|
||||
m_vdp[0]->set_tm_extra_offsets(0, -0x1d6 - 26, -0x1ef - 15, 0, 0);
|
||||
m_vdp[0]->set_tm_extra_offsets(1, -0x1d8 - 22, -0x1ef - 15, 0, 0);
|
||||
m_vdp[0]->set_tm_extra_offsets(2, -0x1da - 18, -0x1ef - 15, 0, 0);
|
||||
m_vdp[0]->set_sp_extra_offsets(8/*-0x1cc - 64*/, 8/*-0x1ef - 128*/, 0, 0);
|
||||
|
||||
m_vdp[0]->init_scroll_regs();
|
||||
}
|
||||
|
||||
VIDEO_START_MEMBER(toaplan2_state, batsugunbl)
|
||||
{
|
||||
VIDEO_START_CALL_MEMBER(toaplan2);
|
||||
|
||||
// This bootleg has additional layer offsets. TODO: further refinement needed
|
||||
m_vdp[0]->set_tm_extra_offsets(0, 0, 0, 0, 0);
|
||||
m_vdp[0]->set_tm_extra_offsets(1, 0, 0, 0, 0);
|
||||
m_vdp[0]->set_tm_extra_offsets(2, 0, 0, 0, 0);
|
||||
m_vdp[0]->set_sp_extra_offsets(0x37, 0x07, 0, 0);
|
||||
|
||||
m_vdp[1]->set_tm_extra_offsets(0, -0x05, 0x07, 0, 0);
|
||||
m_vdp[1]->set_tm_extra_offsets(1, -0x05, 0x07, 0, 0);
|
||||
m_vdp[1]->set_tm_extra_offsets(2, 0, 0, 0, 0);
|
||||
m_vdp[1]->set_sp_extra_offsets(0x39, 0x12, 0, 0);
|
||||
|
||||
m_vdp[0]->init_scroll_regs();
|
||||
m_vdp[1]->init_scroll_regs();
|
||||
}
|
||||
|
||||
VIDEO_START_MEMBER(truxton2_state,bgaregga)
|
||||
{
|
||||
VIDEO_START_CALL_MEMBER(toaplan2);
|
||||
|
||||
/* Create the Text tilemap for this game */
|
||||
create_tx_tilemap(0x1d4, 0x16b);
|
||||
}
|
||||
|
||||
VIDEO_START_MEMBER(truxton2_state,bgareggabl)
|
||||
{
|
||||
VIDEO_START_CALL_MEMBER(toaplan2);
|
||||
|
||||
/* Create the Text tilemap for this game */
|
||||
create_tx_tilemap(4, 4);
|
||||
}
|
||||
|
||||
VIDEO_START_MEMBER(truxton2_state,batrider)
|
||||
{
|
||||
VIDEO_START_CALL_MEMBER(toaplan2);
|
||||
|
||||
m_vdp[0]->disable_sprite_buffer(); // disable buffering on this game
|
||||
|
||||
/* Create the Text tilemap for this game */
|
||||
m_gfxdecode->gfx(0)->set_source(reinterpret_cast<u8 *>(m_tx_gfxram.target()));
|
||||
|
||||
create_tx_tilemap(0x1d4, 0x16b);
|
||||
|
||||
/* Has special banking */
|
||||
save_item(NAME(m_gfxrom_bank));
|
||||
}
|
||||
|
||||
void truxton2_state::tx_videoram_w(offs_t offset, u16 data, u16 mem_mask)
|
||||
{
|
||||
COMBINE_DATA(&m_tx_videoram[offset]);
|
||||
if (offset < 64*32)
|
||||
m_tx_tilemap->mark_tile_dirty(offset);
|
||||
}
|
||||
|
||||
void truxton2_state::tx_linescroll_w(offs_t offset, u16 data, u16 mem_mask)
|
||||
{
|
||||
/*** Line-Scroll RAM for Text Layer ***/
|
||||
COMBINE_DATA(&m_tx_linescroll[offset]);
|
||||
|
||||
m_tx_tilemap->set_scrollx(offset, m_tx_linescroll[offset]);
|
||||
}
|
||||
|
||||
void truxton2_state::tx_gfxram_w(offs_t offset, u16 data, u16 mem_mask)
|
||||
{
|
||||
/*** Dynamic GFX decoding for Truxton 2 / FixEight ***/
|
||||
|
||||
const u16 oldword = m_tx_gfxram[offset];
|
||||
|
||||
if (oldword != data)
|
||||
{
|
||||
COMBINE_DATA(&m_tx_gfxram[offset]);
|
||||
m_gfxdecode->gfx(0)->mark_dirty(offset/32);
|
||||
}
|
||||
}
|
||||
|
||||
void truxton2_state::batrider_tx_gfxram_w(offs_t offset, u16 data, u16 mem_mask)
|
||||
{
|
||||
/*** Dynamic GFX decoding for Batrider / Battle Bakraid ***/
|
||||
|
||||
const u16 oldword = m_tx_gfxram[offset];
|
||||
|
||||
if (oldword != data)
|
||||
{
|
||||
COMBINE_DATA(&m_tx_gfxram[offset]);
|
||||
m_gfxdecode->gfx(0)->mark_dirty(offset/16);
|
||||
}
|
||||
}
|
||||
|
||||
void truxton2_state::batrider_textdata_dma_w(u16 data)
|
||||
{
|
||||
/*** Dynamic Text GFX decoding for Batrider ***/
|
||||
/*** Only done once during start-up ***/
|
||||
m_dma_space->set_bank(1);
|
||||
for (int i = 0; i < (0x8000 >> 1); i++)
|
||||
{
|
||||
m_dma_space->write16(i, m_mainram[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void truxton2_state::batrider_pal_text_dma_w(u16 data)
|
||||
{
|
||||
// FIXME: In batrider and bbakraid, the text layer and palette RAM
|
||||
// are probably DMA'd from main RAM by writing here at every vblank,
|
||||
// rather than being directly accessible to the 68K like the other games
|
||||
m_dma_space->set_bank(0);
|
||||
for (int i = 0; i < (0x3400 >> 1); i++)
|
||||
{
|
||||
m_dma_space->write16(i, m_mainram[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void truxton2_state::batrider_objectbank_w(offs_t offset, u8 data)
|
||||
{
|
||||
data &= 0xf;
|
||||
if (m_gfxrom_bank[offset] != data)
|
||||
{
|
||||
m_gfxrom_bank[offset] = data;
|
||||
m_vdp[0]->set_dirty();
|
||||
}
|
||||
}
|
||||
|
||||
void truxton2_state::batrider_bank_cb(u8 layer, u32 &code)
|
||||
{
|
||||
code = (m_gfxrom_bank[code >> 15] << 15) | (code & 0x7fff);
|
||||
}
|
||||
|
||||
// Dogyuun doesn't appear to require fancy mixing?
|
||||
u32 toaplan2_state::screen_update_dogyuun(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
bitmap.fill(0, cliprect);
|
||||
if (m_vdp[1])
|
||||
{
|
||||
m_custom_priority_bitmap.fill(0, cliprect);
|
||||
m_vdp[1]->render_vdp(bitmap, cliprect);
|
||||
}
|
||||
if (m_vdp[0])
|
||||
{
|
||||
m_custom_priority_bitmap.fill(0, cliprect);
|
||||
m_vdp[0]->render_vdp(bitmap, cliprect);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
// renders to 2 bitmaps, and mixes output
|
||||
u32 toaplan2_state::screen_update_batsugun(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
// bitmap.fill(0, cliprect);
|
||||
// gp9001_custom_priority_bitmap->fill(0, cliprect);
|
||||
|
||||
if (m_vdp[0])
|
||||
{
|
||||
bitmap.fill(0, cliprect);
|
||||
m_custom_priority_bitmap.fill(0, cliprect);
|
||||
m_vdp[0]->render_vdp(bitmap, cliprect);
|
||||
}
|
||||
if (m_vdp[1])
|
||||
{
|
||||
m_secondary_render_bitmap.fill(0, cliprect);
|
||||
m_custom_priority_bitmap.fill(0, cliprect);
|
||||
m_vdp[1]->render_vdp(m_secondary_render_bitmap, cliprect);
|
||||
}
|
||||
|
||||
// key test places in batsugun
|
||||
// level 2 - the two layers of clouds (will appear under background, or over ships if wrong)
|
||||
// level 3 - the special effect 'layer' which should be under everything (will appear over background if wrong)
|
||||
// level 4(?) - the large clouds (will obscure player if wrong)
|
||||
// high score entry - letters will be missing if wrong
|
||||
// end credits - various issues if wrong, clouds like level 2
|
||||
//
|
||||
// when implemented based directly on the PAL equation it doesn't work, however, my own equations roughly based
|
||||
// on that do.
|
||||
//
|
||||
|
||||
if (m_vdp[0] && m_vdp[1])
|
||||
{
|
||||
for (int y = cliprect.min_y; y <= cliprect.max_y; y++)
|
||||
{
|
||||
u16 *const src_vdp0 = &bitmap.pix(y);
|
||||
u16 const *const src_vdp1 = &m_secondary_render_bitmap.pix(y);
|
||||
|
||||
for (int x = cliprect.min_x; x <= cliprect.max_x; x++)
|
||||
{
|
||||
const u16 GPU0_LUTaddr = src_vdp0[x];
|
||||
const u16 GPU1_LUTaddr = src_vdp1[x];
|
||||
|
||||
// these equations is derived from the PAL, but doesn't seem to work?
|
||||
|
||||
const bool COMPARISON = ((GPU0_LUTaddr & 0x0780) > (GPU1_LUTaddr & 0x0780));
|
||||
|
||||
// note: GPU1_LUTaddr & 0x000f - transparency check for vdp1? (gfx are 4bpp, the low 4 bits of the lookup would be the pixel data value)
|
||||
#if 0
|
||||
int result =
|
||||
((GPU0_LUTaddr & 0x0008) & !COMPARISON)
|
||||
| ((GPU0_LUTaddr & 0x0008) & !(GPU1_LUTaddr & 0x000f))
|
||||
| ((GPU0_LUTaddr & 0x0004) & !COMPARISON)
|
||||
| ((GPU0_LUTaddr & 0x0004) & !(GPU1_LUTaddr & 0x000f))
|
||||
| ((GPU0_LUTaddr & 0x0002) & !COMPARISON)
|
||||
| ((GPU0_LUTaddr & 0x0002) & !(GPU1_LUTaddr & 0x000f))
|
||||
| ((GPU0_LUTaddr & 0x0001) & !COMPARISON)
|
||||
| ((GPU0_LUTaddr & 0x0001) & !(GPU1_LUTaddr & 0x000f));
|
||||
|
||||
if (result) src_vdp0[x] = GPU0_LUTaddr;
|
||||
else src_vdp0[x] = GPU1_LUTaddr;
|
||||
#endif
|
||||
// this seems to work tho?
|
||||
if (!(GPU1_LUTaddr & 0x000f))
|
||||
{
|
||||
src_vdp0[x] = GPU0_LUTaddr;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!(GPU0_LUTaddr & 0x000f))
|
||||
{
|
||||
src_vdp0[x] = GPU1_LUTaddr; // bg pen
|
||||
}
|
||||
else
|
||||
{
|
||||
if (COMPARISON)
|
||||
{
|
||||
src_vdp0[x] = GPU1_LUTaddr;
|
||||
}
|
||||
else
|
||||
{
|
||||
src_vdp0[x] = GPU0_LUTaddr;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
u32 toaplan2_state::screen_update_toaplan2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
bitmap.fill(0, cliprect);
|
||||
m_custom_priority_bitmap.fill(0, cliprect);
|
||||
m_vdp[0]->render_vdp(bitmap, cliprect);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* fixeightbl and bgareggabl do not use the lineselect or linescroll tables */
|
||||
u32 truxton2_state::screen_update_bootleg(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
screen_update_toaplan2(screen, bitmap, cliprect);
|
||||
m_tx_tilemap->draw(screen, bitmap, cliprect, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
u32 truxton2_state::screen_update_truxton2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
screen_update_toaplan2(screen, bitmap, cliprect);
|
||||
|
||||
rectangle clip = cliprect;
|
||||
|
||||
/* it seems likely that flipx can be set per line! */
|
||||
/* however, none of the games does it, and emulating it in the */
|
||||
/* MAME tilemap system without being ultra slow would be tricky */
|
||||
m_tx_tilemap->set_flip(m_tx_lineselect[0] & 0x8000 ? 0 : TILEMAP_FLIPX);
|
||||
|
||||
/* line select is used for 'for use in' and '8ing' screen on bbakraid, 'Raizing' logo on batrider */
|
||||
for (int y = cliprect.min_y; y <= cliprect.max_y; y++)
|
||||
{
|
||||
clip.min_y = clip.max_y = y;
|
||||
m_tx_tilemap->set_scrolly(0, m_tx_lineselect[y] - y);
|
||||
m_tx_tilemap->draw(screen, bitmap, clip, 0);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void toaplan2_state::screen_vblank(int state)
|
||||
{
|
||||
// rising edge
|
||||
if (state)
|
||||
{
|
||||
if (m_vdp[0]) m_vdp[0]->screen_eof();
|
||||
if (m_vdp[1]) m_vdp[1]->screen_eof();
|
||||
}
|
||||
}
|
46
src/mame/toaplan/toaplan_coincounter.cpp
Normal file
46
src/mame/toaplan/toaplan_coincounter.cpp
Normal file
@ -0,0 +1,46 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Quench, Yochizo, David Haywood
|
||||
|
||||
#include "emu.h"
|
||||
#include "toaplan_coincounter.h"
|
||||
|
||||
DEFINE_DEVICE_TYPE(TOAPLAN_COINCOUNTER, toaplan_coincounter_device, "toaplan_coincounter", "Toaplan Coin Counter")
|
||||
|
||||
toaplan_coincounter_device::toaplan_coincounter_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
|
||||
: device_t(mconfig, TOAPLAN_COINCOUNTER, tag, owner, clock)
|
||||
{
|
||||
}
|
||||
|
||||
void toaplan_coincounter_device::device_start()
|
||||
{
|
||||
}
|
||||
|
||||
void toaplan_coincounter_device::device_reset()
|
||||
{
|
||||
}
|
||||
|
||||
void toaplan_coincounter_device::coin_w(u8 data)
|
||||
{
|
||||
/* +----------------+------ Bits 7-5 not used ------+--------------+ */
|
||||
/* | Coin Lockout 2 | Coin Lockout 1 | Coin Count 2 | Coin Count 1 | */
|
||||
/* | Bit 3 | Bit 2 | Bit 1 | Bit 0 | */
|
||||
|
||||
if (data & 0x0f)
|
||||
{
|
||||
machine().bookkeeping().coin_lockout_w(0, BIT(~data, 2));
|
||||
machine().bookkeeping().coin_lockout_w(1, BIT(~data, 3));
|
||||
machine().bookkeeping().coin_counter_w(0, BIT( data, 0));
|
||||
machine().bookkeeping().coin_counter_w(1, BIT( data, 1));
|
||||
}
|
||||
else
|
||||
{
|
||||
machine().bookkeeping().coin_lockout_global_w(1); // Lock all coin slots
|
||||
}
|
||||
if (data & 0xf0)
|
||||
{
|
||||
logerror("Writing unknown upper bits (%02x) to coin control\n",data);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
25
src/mame/toaplan/toaplan_coincounter.h
Normal file
25
src/mame/toaplan/toaplan_coincounter.h
Normal file
@ -0,0 +1,25 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Quench, Yochizo, David Haywood
|
||||
|
||||
#ifndef MAME_TOAPLAN_TOAPLAN_COINCOUNTER_H
|
||||
#define MAME_TOAPLAN_TOAPLAN_COINCOUNTER_H
|
||||
|
||||
#pragma once
|
||||
|
||||
class toaplan_coincounter_device : public device_t
|
||||
{
|
||||
public:
|
||||
toaplan_coincounter_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
|
||||
|
||||
void coin_w(u8 data);
|
||||
|
||||
protected:
|
||||
virtual void device_start() override ATTR_COLD;
|
||||
virtual void device_reset() override ATTR_COLD;
|
||||
|
||||
private:
|
||||
};
|
||||
|
||||
DECLARE_DEVICE_TYPE(TOAPLAN_COINCOUNTER, toaplan_coincounter_device)
|
||||
|
||||
#endif // MAME_TOAPLAN_TOAPLAN_COINCOUNTER_H
|
179
src/mame/toaplan/toaplan_v25_tables.h
Normal file
179
src/mame/toaplan/toaplan_v25_tables.h
Normal file
@ -0,0 +1,179 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Quench, Yochizo, David Haywood
|
||||
|
||||
#ifndef MAME_TOAPLAN_TOAPLAN_V25_TABLES_H
|
||||
#define MAME_TOAPLAN_TOAPLAN_V25_TABLES_H
|
||||
|
||||
#pragma once
|
||||
|
||||
class toaplan_v25_tables
|
||||
{
|
||||
public:
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// Table used by dogyuun, kbash, vfive
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/* probably dogyuun, vfive and kbash use the same decryption table;
|
||||
those 3 games have been seen with the NITRO905 chip, other alias are
|
||||
ts002mach for dogyuun, ts004dash for kbash and ts007spy for vfive */
|
||||
|
||||
static constexpr u8 nitro_decryption_table[256] = {
|
||||
0x1b,0x56,0x75,0x88,0x8c,0x06,0x58,0x72, 0x83,0x86,0x36,0x1a,0x5f,0xd3,0x8c,0xe9, /* 00 */
|
||||
/* *//* *//* *//* *//* *//* *//* *//* */ /* *//* *//* *//* *//* *//* *//* *//* */
|
||||
0x22,0x0f,0x03,0x2a,0xeb,0x2a,0xf9,0x0f, 0xa4,0xbd,0x75,0xf3,0x4f,0x53,0x8e,0xfe, /* 10 */
|
||||
/*W*//*W*//*r*//*W*//*r*//*W*//*W*//*r*/ /*r*//*a*//*r*//*r*//*r*//*W*//*x*//*r*/
|
||||
0x87,0xe8,0xb1,0x8d,0x36,0xb5,0x43,0x73, 0x2a,0x5b,0xf9,0x02,0x24,0x8a,0x03,0x80, /* 20 */
|
||||
/*a*//*r*//*r*//*r*//*x*//*r*//*r*//*r*/ /*W*//*r*//*W*//*W*//*a*//*r*//*a*//*r*/
|
||||
0x86,0x8b,0xd1,0x3e,0x8d,0x3e,0x58,0xfb, 0xc3,0x79,0xbd,0xb7,0x8a,0xe8,0x0f,0x81, /* 30 */
|
||||
/*a*//*a*//*a*//*a*//*r*//*r*//*a*//*r*/ /*r*//*a*//*a*//*W*//*r*//*r*//*r*//*r*/
|
||||
0xb7,0xd0,0x8b,0xeb,0xff,0xb8,0x90,0x8b, 0x5e,0xa2,0x90,0xc1,0xab,0xb4,0x80,0x59, /* 40 */
|
||||
/*r*//*r*//*a*//*r*//*a*//*x*/ /*a*/ /*W*//*W*/ /*r*//*W*//*r*//*a*/
|
||||
0x87,0x72,0xb5,0xbd,0xb0,0x88,0x50,0x0f, 0xfe,0xd2,0xc3,0x90,0x8a,0x90,0xf9,0x75, /* 50 */
|
||||
/*W*//*a*//*a*//*r*//*r*//*a*//*a*//*a*/ /*r*//*W*//*r*/ /*r*/ /*W*//*r*/
|
||||
0x1a,0xb3,0x74,0x0a,0x68,0x24,0xbb,0x90, 0x75,0x47,0xfe,0x2c,0xbe,0xc3,0x88,0xd2, /* 60 */
|
||||
/*W*//*r*//*a*//*r*//*a*//*a*//*W*/ /*r*//*a*//*r*//*W*//*W*//*a*//*r*//*a*/
|
||||
0x3e,0xc1,0x8c,0x33,0x0f,0x4f,0x8b,0x90, 0xb9,0x1e,0xff,0xa2,0x3e,0x22,0xbe,0x57, /* 70 */
|
||||
/*r*//*W*//*r*//*r*//*a*/ /*a*/ /*r*//*r*//*a*//*r*//*a*//*W*//*r*//*a*/
|
||||
0x81,0x3a,0xf6,0x88,0xeb,0xb1,0x89,0x8a, 0x32,0x80,0x0f,0xb1,0x48,0xc3,0x68,0x72, /* 80 */
|
||||
/*r*//*r*//*r*//*r*//*a*//*W*//*a*//*r*/ /*r*//*r*//*r*//*a*//*x*//*a*//*a*//*r*/
|
||||
0x53,0x02,0xc0,0x02,0xe8,0xb4,0x74,0xbc, 0x90,0x58,0x0a,0xf3,0x75,0xc6,0x90,0xe8, /* 90 */
|
||||
/*a*//*W*//*r*//*W*//*r*//*r*//*r*//*x*/ /*a*//*r*//*r*//*r*//*x*/ /*r*/
|
||||
0x26,0x50,0xfc,0x8c,0x06,0xb1,0xc3,0xd1, 0xeb,0x83,0xa4,0xbf,0x26,0x4b,0x46,0xfe, /* a0 */
|
||||
/*r*//*a*//*a*//*r*/ /*a*//*r*//*W*/ /*a*//*r*//*r*//*r*//*r*//*W*//*a*//*r*/
|
||||
0xe2,0x89,0xb3,0x88,0x03,0x56,0x0f,0x38, 0xbb,0x0c,0x90,0x0f,0x07,0x8a,0x8a,0x33, /* b0 */
|
||||
/*r*//*a*//*W*//*r*//*a*//*W*//*r*//*W*/ /*W*//*W*/ /*a*//*r*//*r*//*r*//*x*/
|
||||
0xfe,0xf9,0xb1,0xa0,0x45,0x36,0x22,0x5e, 0x8a,0xbe,0xc6,0xea,0x3c,0xb2,0x1e,0xe8, /* c0 */
|
||||
/*r*//*W*//*r*//*r*//*r*//*r*//*W*//*r*/ /*r*//*W*//*x*//*x*//*r*//*?*//*r*//*r*/
|
||||
0x90,0xeb,0x55,0xf6,0x8a,0xb0,0x5d,0xc0, 0xbb,0x8d,0xf6,0xd0,0xd1,0x88,0x4d,0x90, /* d0 */
|
||||
/*a*//*r*//*r*//*a*//*a*//*r*//*W*/ /*x*//*r*//*r*//*a*//*W*//*r*//*W*/
|
||||
0x51,0x51,0x74,0xbd,0x32,0xd1,0xc6,0xd2, 0x53,0xc7,0xab,0x36,0x50,0xe9,0x33,0xb3, /* e0 */
|
||||
/*r*//*a*//*r*//*r*//*r*//*W*/ /*a*/ /*r*//*x*//*r*//*r*//*W*//*a*//*r*//*W*/
|
||||
0x2e,0x05,0x88,0x59,0x74,0x74,0x22,0x8e, 0x8a,0x8a,0x36,0x08,0x0f,0x45,0x90,0x2e, /* f0 */
|
||||
/*r*//*W*//*r*//*r*//*a*//*a*//*W*//*x*/ /*r*//*r*//*x*//*a*//*r*//*a*/ /*r*/
|
||||
};
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// Table used by fixeight
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/* x = modified to match batsugun 'unencrypted' code - '?' likewise, but not so sure about them */
|
||||
/* e = opcodes used in the EEPROM service routine */
|
||||
/* this one seems more different to the other tables */
|
||||
static constexpr u8 ts001turbo_decryption_table[256] = {
|
||||
0x90,0x05,0x57,0x5f,0xfe,0x4f,0xbd,0x36, 0x80,0x8b,0x8a,0x0a,0x89,0x90,0x47,0x80, /* 00 */
|
||||
/*r*//*r*//*r*//*r*//*r*//*r*//*r*/ /*r*//*r*//*r*//*r*//*r*/ /*r*//*r*/
|
||||
0x22,0x90,0x90,0x5d,0x81,0x3c,0xb5,0x83, 0x68,0xff,0x75,0x75,0x8d,0x5b,0x8a,0x38, /* 10 */
|
||||
/*r*/ /*r*//*r*//*r*//*r*//*r*/ /*r*//*r*//*r*//*r*//*r*//*r*//*r*//*r*/
|
||||
0x8b,0xeb,0xd2,0x0a,0xb4,0xc7,0x46,0xd1, 0x0a,0x53,0xbd,0x77,0x22,0xff,0x1f,0x03, /* 20 */
|
||||
/*a*//*r*//*r*//*r*//*r*//*r*//*r*//*r*/ /*r*//*r*//*r*//*e*//*r*//*r*//*?*//*r*/
|
||||
0xfb,0x45,0xc3,0x02,0x90,0x0f,0xa3,0x02, 0x0f,0xb7,0x90,0x24,0xc6,0xeb,0x1b,0x32, /* 30 */
|
||||
/*r*//*r*//*r*//*r*/ /*r*//*e*//*r*/ /*r*//*r*/ /*r*//*r*//*r*//*r*//*r*/
|
||||
0x8d,0xb9,0xfe,0x08,0x88,0x90,0x8a,0x8a, 0x75,0x8a,0xbd,0x58,0xfe,0x51,0x1e,0x8b, /* 40 */
|
||||
/*r*//*r*//*r*//*r*//*r*/ /*r*//*r*/ /*r*//*r*//*r*//*r*//*r*//*r*//*r*//*r*/
|
||||
0x0f,0x22,0xf6,0x90,0xc3,0x36,0x03,0x8d, 0xbb,0x16,0xbc,0x90,0x0f,0x5e,0xf9,0x2e, /* 50 */
|
||||
/*r*//*r*//*r*/ /*r*//*r*//*r*//*r*/ /*r*//*?*//*r*/ /*r*//*r*//*r*//*r*/
|
||||
0x90,0x90,0x59,0x90,0xbb,0x1a,0x0c,0x8d, 0x89,0x72,0x83,0xa4,0xc3,0xb3,0x8b,0xe9, /* 60 */
|
||||
/*r*/ /*r*//*r*//*r*//*r*/ /*a*//*r*//*r*//*r*//*r*//*r*//*r*//*r*/
|
||||
0x81,0x43,0xa0,0x2c,0x0f,0x55,0xf3,0x36, 0xb0,0x59,0xe8,0x03,0x26,0xe9,0x22,0xb0, /* 70 */
|
||||
/*r*//*r*//*r*//*r*//*r*//*r*//*r*//*r*/ /*r*//*r*//*r*//*r*//*r*//*r*//*r*//*r*/
|
||||
0x90,0x8e,0x24,0x8a,0xd0,0x3e,0xc3,0x3a, 0x90,0x79,0x57,0x16,0x88,0x86,0x24,0x74, /* 80 */
|
||||
/*r*//*r*//*r*//*r*//*r*//*r*//*r*/ /*a*//*r*//*r*//*r*//*r*//*r*//*r*/
|
||||
0x33,0xc3,0x53,0xb8,0xab,0x75,0x90,0x90, 0x8e,0xb1,0xe9,0x5d,0xf9,0x02,0x3c,0x90, /* 90 */
|
||||
/*x*//*r*//*r*//*r*//*r*//*r*/ /*r*//*r*//*r*//*r*//*r*//*r*//*r*/
|
||||
0x80,0xd3,0x89,0xe8,0x90,0x90,0x2a,0x74, 0x90,0x5f,0xf6,0x88,0x4f,0x56,0x8c,0x03, /* a0 */
|
||||
/*r*//*a*//*r*//*r*/ /*r*//*r*/ /*r*//*r*//*r*//*r*//*r*//*r*//*r*/
|
||||
0x47,0xa1,0x88,0x90,0x03,0xfe,0x90,0xfc, 0x2a,0x90,0x33,0x07,0xb1,0x50,0x0f,0x3e, /* b0 */
|
||||
/*r*//*e*//*r*/ /*r*//*r*/ /*r*/ /*r*/ /*r*//*r*//*r*//*r*//*r*//*r*/
|
||||
0xbd,0x4d,0xf3,0xbf,0x59,0xd2,0xea,0xc6, 0x2a,0x74,0x72,0xe2,0x3e,0x2e,0x90,0x2e, /* c0 */
|
||||
/*r*//*r*//*r*//*r*//*r*//*a*//*x*//*r*/ /*r*//*r*//*r*//*r*//*r*//*r*/ /*r*/
|
||||
0x2e,0x73,0x88,0x72,0x45,0x5d,0xc1,0xb9, 0x32,0x38,0x88,0xc1,0xa0,0x06,0x45,0x90, /* d0 */
|
||||
/*r*//*r*//*r*//*r*//*r*//*r*//*r*//*r*/ /*r*//*r*//*r*//*r*//*a*//*r*//*r*/
|
||||
0x90,0x86,0x4b,0x87,0x90,0x8a,0x3b,0xab, 0x33,0xbe,0x90,0x32,0xbd,0xc7,0xb2,0x80, /* e0 */
|
||||
/*r*//*r*//*r*/ /*r*//*?*//*r*/ /*r*//*r*/ /*r*//*r*//*r*//*?*//*r*/
|
||||
0x0f,0x75,0xc0,0xb9,0x07,0x74,0x3e,0xa2, 0x8a,0x48,0x3e,0x8d,0xeb,0x90,0xfe,0x90, /* f0 */
|
||||
/*r*//*r*//*r*//*r*//*r*//*r*//*r*//*r*/ /*r*//*x*//*r*//*r*//*r*/ /*r*/
|
||||
};
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// Table used by DT7
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// single byte default-opcode
|
||||
#define UNKO 0xfc
|
||||
|
||||
// complete guess, wrong, just to get correct opcode size for DASM
|
||||
#define G_62 0xa0 // very likely wrong (or is it?)
|
||||
|
||||
// some kind of branch, not sure which
|
||||
// it's used after compares in blocks, sometimes with a 'be' then a 'br' straight after, so it must be a condition that could also fail a be and fall to the br
|
||||
//#define G_B0 0x74
|
||||
#define G_B0 0x79
|
||||
//#define G_B0 0x75
|
||||
|
||||
// 6b @ 73827
|
||||
#define G_6B 0x34 // must be a 2 byte operation on al? after an AND, 2nd byte is 0x08
|
||||
|
||||
// 59 @ 73505 and 7379B (maybe ret?, or di?)
|
||||
//#define G_59 0xfa
|
||||
#define G_59 0xc3
|
||||
|
||||
static constexpr u8 dt7_decryption_table[256] = {
|
||||
// 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, 0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f, /* 00 */
|
||||
UNKO,0xea,0x8a,0x51,0x8b,UNKO,0x48,0x3c, 0x75,0x50,0x75,0x88,0x03,0x03,UNKO,0x36,
|
||||
|
||||
// 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, 0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f, /* 10 */
|
||||
0x8a,0x0f,0x8a,0x3c,0xe2,0xe8,0xc6,0xc7, 0x24,0x4d,0x68,0x3e,0x0c,0x33,0xbb,UNKO,
|
||||
|
||||
// 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, 0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f, /* 20 */
|
||||
0xbb,0xc6,0x1f,0x36,0x24,0xeb,0xe8,UNKO, 0x02,0x38,0x0f,0x45,0x8d,0x45,0x36,0xc6,
|
||||
|
||||
// 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, 0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f, /* 30 */
|
||||
0x53,0x8b,0x81,0x22,0xf9,0xbe,0x75,0x55, 0x45,0x51,0x5d,0x3e,0x0f,0x88,0x72,0x74,
|
||||
|
||||
// 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47, 0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f, /* 40 */
|
||||
0x1e,0xb7,0x50,0xd0,0xe2,0xb1,0x0a,0xf3, 0xc7,0xff,0x8a,0x75,0x88,0xb5,UNKO,0xb3,
|
||||
|
||||
// 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, 0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f, /* 50 */
|
||||
0xc3,0x80,0x53,0x59,0x88,UNKO,0x87,0x45, 0x03,G_59,0x0c,0x36,0x5f,0x16,0x55,UNKO,
|
||||
|
||||
// 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, 0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f, /* 60 */
|
||||
0x0a,UNKO,G_62,0x89,0x88,0x57,0x2e,0xb1, 0x75,0x43,0x3a,G_6B,0x86,0x3a,0x03,0x58,
|
||||
|
||||
// 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, 0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f, /* 70 */
|
||||
0x46,0x33,0xe8,0x0f,0x0f,0xbb,0x59,0xc7, 0x2e,0xc6,0x53,0x3a,0xc0,0xfe,0x02,0x47,
|
||||
|
||||
// 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f, /* 80 */
|
||||
0xa0,0x2c,0xeb,0x24,UNKO,0xc3,0x8a,0x8e, 0x16,0x74,0x8a,0x33,0x4b,0x05,0x89,0x79,
|
||||
|
||||
// 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, 0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f, /* 90 */
|
||||
0xb4,0xd2,0x0f,0xbd,0xfb,0x3e,0x22,0x2a, 0x47,0xfe,0x8a,0xc3,0x03,0x5e,0xb3,0x07,
|
||||
|
||||
// 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7, 0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf, /* a0 */
|
||||
0x86,0x1b,0x81,0xf3,0x86,0xe9,0x53,0x74, 0x80,0xab,0xb1,0xc3,0xd0,0x88,0x2e,0xa4,
|
||||
|
||||
// 0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7, 0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf, /* b0 */
|
||||
G_B0,0x5b,0x87,UNKO,0xc3,0x8c,0xff,0x8a, 0x50,0xeb,0x56,0x0c,UNKO,0xfc,0x83,0x74,
|
||||
|
||||
// 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7, 0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf, /* c0 */
|
||||
0x26,UNKO,0xfe,0xbd,0x03,0xfe,0xb4,0xfe, 0x06,0xb8,0xc6,UNKO,0x45,0x73,0xb5,0x51,
|
||||
|
||||
// 0xd0,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7, 0xd8,0xd9,0xda,0xdb,0xdc,0xdd,0xde,0xdf, /* d0 */
|
||||
UNKO,0xa4,0xf9,0xc0,0x5b,0xab,0xf6,UNKO, 0x32,0xd3,0xeb,0xb9,0x73,0x89,0xbd,0x4d,
|
||||
|
||||
// 0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7, 0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef, /* e0 */
|
||||
0xb8,0xb9,0x74,0x07,0x0a,0xb0,0x4f,0x0f, 0xe8,0x47,0xeb,0x50,0xd1,0xd0,0x5d,0x72,
|
||||
|
||||
// 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7, 0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff, /* f0 */
|
||||
0x2e,0xe2,0xc1,0xe8,0xa2,0x53,0x0f,0x73, 0x3a,0xbf,0xbb,0x46,0x1a,0x3c,0x1a,0xbc,
|
||||
};
|
||||
|
||||
#undef UNKO
|
||||
#undef G_62
|
||||
#undef G_B0
|
||||
#undef G_6B
|
||||
#undef G_59
|
||||
};
|
||||
|
||||
#endif // MAME_TOAPLAN_TOAPLAN_V25_TABLES_H
|
383
src/mame/toaplan/truxton2.cpp
Normal file
383
src/mame/toaplan/truxton2.cpp
Normal file
@ -0,0 +1,383 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Quench, Yochizo, David Haywood
|
||||
|
||||
#include "emu.h"
|
||||
|
||||
#include "emupal.h"
|
||||
#include "screen.h"
|
||||
#include "speaker.h"
|
||||
#include "tilemap.h"
|
||||
|
||||
#include "toaplan_coincounter.h"
|
||||
#include "toaplipt.h"
|
||||
#include "gp9001.h"
|
||||
|
||||
#include "cpu/m68000/m68000.h"
|
||||
#include "sound/okim6295.h"
|
||||
#include "sound/ymopm.h"
|
||||
|
||||
//#define TRUXTON2_STEREO /* Uncomment to hear truxton2 music in stereo */
|
||||
|
||||
/*
|
||||
Name Board No Maker Game name
|
||||
----------------------------------------------------------------------------
|
||||
truxton2 TP-024 Toaplan Truxton 2 / Tatsujin Oh
|
||||
|
||||
truxton2 - Although the truxton2 PCB has only standard JAMMA mono audio output, and uses a YM3014B
|
||||
mono DAC, the YM2151 music is actually sequenced in stereo. In toaplan2.h, uncomment
|
||||
"#define TRUXTON2_STEREO" to hear the game's music the way it was originally composed.
|
||||
Difficulty is much lower when the region is set to Europe or USA than when set to any
|
||||
Asian region, independent of the "Difficulty" dipswitches. See the code beginning at
|
||||
1FE94 (RAM address 1002D6 contains 0 if region is an Asian region, 1 if Europe or USA)
|
||||
|
||||
*/
|
||||
|
||||
namespace {
|
||||
|
||||
class truxton2_state : public driver_device
|
||||
{
|
||||
public:
|
||||
truxton2_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: driver_device(mconfig, type, tag)
|
||||
, m_tx_videoram(*this, "tx_videoram")
|
||||
, m_tx_lineselect(*this, "tx_lineselect")
|
||||
, m_tx_linescroll(*this, "tx_linescroll")
|
||||
, m_tx_gfxram(*this, "tx_gfxram")
|
||||
, m_maincpu(*this, "maincpu")
|
||||
, m_vdp(*this, "gp9001")
|
||||
, m_oki(*this, "oki")
|
||||
, m_gfxdecode(*this, "gfxdecode")
|
||||
, m_screen(*this, "screen")
|
||||
, m_palette(*this, "palette")
|
||||
{ }
|
||||
|
||||
void truxton2(machine_config &config);
|
||||
|
||||
protected:
|
||||
virtual void video_start() override ATTR_COLD;
|
||||
|
||||
u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
void create_tx_tilemap(int dx = 0, int dx_flipped = 0);
|
||||
virtual void device_post_load() override;
|
||||
|
||||
void screen_vblank(int state);
|
||||
void tx_gfxram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
|
||||
void truxton2_68k_mem(address_map &map) ATTR_COLD;
|
||||
|
||||
void tx_videoram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
|
||||
void tx_linescroll_w(offs_t offset, u16 data, u16 mem_mask = ~0);
|
||||
TILE_GET_INFO_MEMBER(get_text_tile_info);
|
||||
|
||||
private:
|
||||
tilemap_t *m_tx_tilemap = nullptr; /* Tilemap for extra-text-layer */
|
||||
required_shared_ptr<u16> m_tx_videoram;
|
||||
required_shared_ptr<u16> m_tx_lineselect;
|
||||
required_shared_ptr<u16> m_tx_linescroll;
|
||||
required_shared_ptr<u16> m_tx_gfxram;
|
||||
|
||||
required_device<m68000_base_device> m_maincpu;
|
||||
required_device<gp9001vdp_device> m_vdp;
|
||||
required_device<okim6295_device> m_oki;
|
||||
required_device<gfxdecode_device> m_gfxdecode;
|
||||
required_device<screen_device> m_screen;
|
||||
required_device<palette_device> m_palette;
|
||||
bitmap_ind8 m_custom_priority_bitmap;
|
||||
};
|
||||
|
||||
/*
|
||||
Extra-text RAM format
|
||||
|
||||
Truxton 2 (and Fixeight + Raizing games have an extra-text layer)
|
||||
|
||||
Text RAM format $0000-1FFF (actually its probably $0000-0FFF)
|
||||
---- --xx xxxx xxxx = Tile number
|
||||
xxxx xx-- ---- ---- = Color (0 - 3Fh) + 40h
|
||||
|
||||
Line select / flip $0000-01EF (some games go to $01FF (excess?))
|
||||
---x xxxx xxxx xxxx = Line select for each line
|
||||
x--- ---- ---- ---- = X flip for each line ???
|
||||
|
||||
Line scroll $0000-01EF (some games go to $01FF (excess?))
|
||||
---- ---x xxxx xxxx = X scroll for each line
|
||||
*/
|
||||
|
||||
void truxton2_state::device_post_load()
|
||||
{
|
||||
if (m_tx_gfxram != nullptr)
|
||||
m_gfxdecode->gfx(0)->mark_all_dirty();
|
||||
}
|
||||
|
||||
|
||||
TILE_GET_INFO_MEMBER(truxton2_state::get_text_tile_info)
|
||||
{
|
||||
const u16 attrib = m_tx_videoram[tile_index];
|
||||
const u32 tile_number = attrib & 0x3ff;
|
||||
const u32 color = attrib >> 10;
|
||||
tileinfo.set(0,
|
||||
tile_number,
|
||||
color,
|
||||
0);
|
||||
}
|
||||
|
||||
void truxton2_state::tx_videoram_w(offs_t offset, u16 data, u16 mem_mask)
|
||||
{
|
||||
COMBINE_DATA(&m_tx_videoram[offset]);
|
||||
if (offset < 64*32)
|
||||
m_tx_tilemap->mark_tile_dirty(offset);
|
||||
}
|
||||
|
||||
void truxton2_state::tx_linescroll_w(offs_t offset, u16 data, u16 mem_mask)
|
||||
{
|
||||
/*** Line-Scroll RAM for Text Layer ***/
|
||||
COMBINE_DATA(&m_tx_linescroll[offset]);
|
||||
|
||||
m_tx_tilemap->set_scrollx(offset, m_tx_linescroll[offset]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void truxton2_state::screen_vblank(int state)
|
||||
{
|
||||
if (state) // rising edge
|
||||
{
|
||||
m_vdp->screen_eof();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
u32 truxton2_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
bitmap.fill(0, cliprect);
|
||||
m_custom_priority_bitmap.fill(0, cliprect);
|
||||
m_vdp->render_vdp(bitmap, cliprect);
|
||||
rectangle clip = cliprect;
|
||||
|
||||
/* it seems likely that flipx can be set per line! */
|
||||
/* however, none of the games does it, and emulating it in the */
|
||||
/* MAME tilemap system without being ultra slow would be tricky */
|
||||
m_tx_tilemap->set_flip(m_tx_lineselect[0] & 0x8000 ? 0 : TILEMAP_FLIPX);
|
||||
|
||||
/* line select is used for 'for use in' and '8ing' screen on bbakraid, 'Raizing' logo on batrider */
|
||||
for (int y = cliprect.min_y; y <= cliprect.max_y; y++)
|
||||
{
|
||||
clip.min_y = clip.max_y = y;
|
||||
m_tx_tilemap->set_scrolly(0, m_tx_lineselect[y] - y);
|
||||
m_tx_tilemap->draw(screen, bitmap, clip, 0);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void truxton2_state::create_tx_tilemap(int dx, int dx_flipped)
|
||||
{
|
||||
m_tx_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(truxton2_state::get_text_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32);
|
||||
|
||||
m_tx_tilemap->set_scroll_rows(8*32); /* line scrolling */
|
||||
m_tx_tilemap->set_scroll_cols(1);
|
||||
m_tx_tilemap->set_scrolldx(dx, dx_flipped);
|
||||
m_tx_tilemap->set_transparent_pen(0);
|
||||
}
|
||||
|
||||
void truxton2_state::tx_gfxram_w(offs_t offset, u16 data, u16 mem_mask)
|
||||
{
|
||||
const u16 oldword = m_tx_gfxram[offset];
|
||||
if (oldword != data)
|
||||
{
|
||||
COMBINE_DATA(&m_tx_gfxram[offset]);
|
||||
m_gfxdecode->gfx(0)->mark_dirty(offset/32);
|
||||
}
|
||||
}
|
||||
|
||||
void truxton2_state::video_start()
|
||||
{
|
||||
m_screen->register_screen_bitmap(m_custom_priority_bitmap);
|
||||
m_vdp->custom_priority_bitmap = &m_custom_priority_bitmap;
|
||||
|
||||
m_gfxdecode->gfx(0)->set_source(reinterpret_cast<u8 *>(m_tx_gfxram.target()));
|
||||
create_tx_tilemap(0x1d5, 0x16a);
|
||||
}
|
||||
|
||||
|
||||
static INPUT_PORTS_START( base )
|
||||
PORT_START("IN1")
|
||||
TOAPLAN_JOY_UDLR_3_BUTTONS( 1 )
|
||||
|
||||
PORT_START("IN2")
|
||||
TOAPLAN_JOY_UDLR_3_BUTTONS( 2 )
|
||||
|
||||
PORT_START("SYS")
|
||||
PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_SERVICE1 )
|
||||
PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_TILT )
|
||||
TOAPLAN_TEST_SWITCH( 0x04, IP_ACTIVE_HIGH )
|
||||
PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_COIN1 )
|
||||
PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_COIN2 )
|
||||
PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_START1 )
|
||||
PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_START2 )
|
||||
PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNKNOWN )
|
||||
|
||||
PORT_START("DSWA")
|
||||
TOAPLAN_MACHINE_NO_COCKTAIL_LOC(SW1)
|
||||
// Coinage on bit mask 0x00f0
|
||||
PORT_BIT( 0x00f0, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // Modified below
|
||||
|
||||
PORT_START("DSWB")
|
||||
TOAPLAN_DIFFICULTY_LOC(SW2)
|
||||
// Per-game features on bit mask 0x00fc
|
||||
PORT_BIT( 0x00fc, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // Modified below
|
||||
INPUT_PORTS_END
|
||||
|
||||
static INPUT_PORTS_START( truxton2 )
|
||||
PORT_INCLUDE( base )
|
||||
|
||||
PORT_MODIFY("IN1")
|
||||
PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Fast Scrolling (Cheat)")
|
||||
|
||||
PORT_MODIFY("DSWA")
|
||||
PORT_DIPNAME( 0x0001, 0x0000, "Rapid Fire" ) PORT_DIPLOCATION("SW1:!1")
|
||||
PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||
// Various features on bit mask 0x000e - see above
|
||||
TOAPLAN_COINAGE_DUAL_LOC( JMPR, 0x0f, 0x02, SW1 )
|
||||
|
||||
PORT_MODIFY("DSWB")
|
||||
// Difficulty on bit mask 0x0003 - see above
|
||||
PORT_DIPNAME( 0x000c, 0x0000, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:!3,!4")
|
||||
PORT_DIPSETTING( 0x000c, "200k only" )
|
||||
PORT_DIPSETTING( 0x0008, "100k only" )
|
||||
PORT_DIPSETTING( 0x0004, "100k and 250k" )
|
||||
PORT_DIPSETTING( 0x0000, "70k and 200k" )
|
||||
PORT_DIPNAME( 0x0030, 0x0000, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:!5,!6")
|
||||
PORT_DIPSETTING( 0x0030, "2" )
|
||||
PORT_DIPSETTING( 0x0000, "3" )
|
||||
PORT_DIPSETTING( 0x0020, "4" )
|
||||
PORT_DIPSETTING( 0x0010, "5" )
|
||||
PORT_DIPNAME( 0x0040, 0x0000, "Invulnerability (Cheat)" ) PORT_DIPLOCATION("SW2:!7")
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0040, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0080, 0x0000, DEF_STR( Allow_Continue ) ) PORT_DIPLOCATION("SW2:!8")
|
||||
PORT_DIPSETTING( 0x0080, DEF_STR( No ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( Yes ) )
|
||||
|
||||
PORT_START("JMPR")
|
||||
PORT_CONFNAME( 0x000f, 0x0002, DEF_STR( Region ) ) //PORT_CONFLOCATION("JP:!4,!3,!2,!1")
|
||||
PORT_CONFSETTING( 0x0002, DEF_STR( Europe ) )
|
||||
PORT_CONFSETTING( 0x0001, DEF_STR( USA ) )
|
||||
PORT_CONFSETTING( 0x0000, DEF_STR( Japan ) )
|
||||
PORT_CONFSETTING( 0x0003, DEF_STR( Hong_Kong ) )
|
||||
PORT_CONFSETTING( 0x0004, DEF_STR( Korea ) )
|
||||
PORT_CONFSETTING( 0x0005, DEF_STR( Taiwan ) )
|
||||
PORT_CONFSETTING( 0x0006, "Southeast Asia (Charterfield)" )
|
||||
PORT_CONFSETTING( 0x0007, "USA (Romstar, Inc.)" )
|
||||
PORT_CONFSETTING( 0x0008, "Hong Kong (Honest Trading Co.)" )
|
||||
PORT_CONFSETTING( 0x0009, "Korea (JC Trading Corp.)" )
|
||||
PORT_CONFSETTING( 0x000a, "USA (Fabtek)" )
|
||||
// PORT_CONFSETTING( 0x000b, DEF_STR( Unused ) )
|
||||
// PORT_CONFSETTING( 0x000c, DEF_STR( Unused ) )
|
||||
// PORT_CONFSETTING( 0x000d, DEF_STR( Unused ) )
|
||||
// PORT_CONFSETTING( 0x000e, DEF_STR( Unused ) )
|
||||
PORT_CONFSETTING( 0x000f, "Japan (Taito Corp.)" )
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
void truxton2_state::truxton2_68k_mem(address_map &map)
|
||||
{
|
||||
map(0x000000, 0x07ffff).rom();
|
||||
map(0x100000, 0x10ffff).ram();
|
||||
map(0x200000, 0x20000d).rw(m_vdp, FUNC(gp9001vdp_device::read), FUNC(gp9001vdp_device::write));
|
||||
map(0x300000, 0x300fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
|
||||
map(0x400000, 0x401fff).ram().w(FUNC(truxton2_state::tx_videoram_w)).share(m_tx_videoram);
|
||||
map(0x402000, 0x402fff).ram().share(m_tx_lineselect);
|
||||
map(0x403000, 0x4031ff).ram().w(FUNC(truxton2_state::tx_linescroll_w)).share(m_tx_linescroll);
|
||||
map(0x403200, 0x403fff).ram();
|
||||
map(0x500000, 0x50ffff).ram().w(FUNC(truxton2_state::tx_gfxram_w)).share(m_tx_gfxram);
|
||||
map(0x600000, 0x600001).r(m_vdp, FUNC(gp9001vdp_device::vdpcount_r));
|
||||
map(0x700000, 0x700001).portr("DSWA");
|
||||
map(0x700002, 0x700003).portr("DSWB");
|
||||
map(0x700004, 0x700005).portr("JMPR");
|
||||
map(0x700006, 0x700007).portr("IN1");
|
||||
map(0x700008, 0x700009).portr("IN2");
|
||||
map(0x70000a, 0x70000b).portr("SYS");
|
||||
map(0x700011, 0x700011).rw(m_oki, FUNC(okim6295_device::read), FUNC(okim6295_device::write));
|
||||
map(0x700014, 0x700017).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write)).umask16(0x00ff);
|
||||
map(0x70001f, 0x70001f).w("coincounter", FUNC(toaplan_coincounter_device::coin_w));
|
||||
}
|
||||
|
||||
#define XOR(a) WORD_XOR_LE(a)
|
||||
#define LOC(x) (x+XOR(0))
|
||||
|
||||
static const gfx_layout truxton2_tx_tilelayout =
|
||||
{
|
||||
8,8, /* 8x8 characters */
|
||||
1024, /* 1024 characters */
|
||||
4, /* 4 bits per pixel */
|
||||
{ STEP4(0,1) },
|
||||
{ LOC(0)*4, LOC(1)*4, LOC(4)*4, LOC(5)*4, LOC(8)*4, LOC(9)*4, LOC(12)*4, LOC(13)*4 },
|
||||
{ STEP8(0,8*8) },
|
||||
8*8*8
|
||||
};
|
||||
|
||||
|
||||
static GFXDECODE_START( gfx )
|
||||
GFXDECODE_ENTRY( nullptr, 0, truxton2_tx_tilelayout, 64*16, 64 )
|
||||
GFXDECODE_END
|
||||
|
||||
|
||||
void truxton2_state::truxton2(machine_config &config)
|
||||
{
|
||||
/* basic machine hardware */
|
||||
M68000(config, m_maincpu, 16_MHz_XTAL); /* verified on pcb */
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &truxton2_state::truxton2_68k_mem);
|
||||
|
||||
TOAPLAN_COINCOUNTER(config, "coincounter", 0);
|
||||
|
||||
/* video hardware */
|
||||
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
|
||||
m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
|
||||
m_screen->set_raw(27_MHz_XTAL/4, 432, 0, 320, 262, 0, 240);
|
||||
m_screen->set_screen_update(FUNC(truxton2_state::screen_update));
|
||||
m_screen->screen_vblank().set(FUNC(truxton2_state::screen_vblank));
|
||||
m_screen->set_palette(m_palette);
|
||||
|
||||
GFXDECODE(config, m_gfxdecode, m_palette, gfx);
|
||||
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, gp9001vdp_device::VDP_PALETTE_LENGTH);
|
||||
|
||||
GP9001_VDP(config, m_vdp, 27_MHz_XTAL);
|
||||
m_vdp->set_palette(m_palette);
|
||||
m_vdp->vint_out_cb().set_inputline(m_maincpu, M68K_IRQ_2);
|
||||
|
||||
/* sound hardware */
|
||||
#ifdef TRUXTON2_STEREO // music data is stereo...
|
||||
SPEAKER(config, "lspeaker").front_left();
|
||||
SPEAKER(config, "rspeaker").front_right();
|
||||
|
||||
YM2151(config, "ymsnd", 27_MHz_XTAL/8).add_route(0, "lspeaker", 0.5).add_route(1, "rspeaker", 0.5);
|
||||
|
||||
OKIM6295(config, m_oki, 16_MHz_XTAL/4, okim6295_device::PIN7_LOW);
|
||||
m_oki->add_route(ALL_OUTPUTS, "lspeaker", 0.5);
|
||||
m_oki->add_route(ALL_OUTPUTS, "rspeaker", 0.5);
|
||||
#else // ...but the hardware is mono
|
||||
SPEAKER(config, "mono").front_center();
|
||||
|
||||
YM2151(config, "ymsnd", 27_MHz_XTAL/8).add_route(ALL_OUTPUTS, "mono", 0.5); // verified on PCB
|
||||
|
||||
OKIM6295(config, m_oki, 16_MHz_XTAL/4, okim6295_device::PIN7_LOW); // verified on PCB
|
||||
m_oki->add_route(ALL_OUTPUTS, "mono", 0.5);
|
||||
#endif
|
||||
}
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
ROM_START( truxton2 )
|
||||
ROM_REGION( 0x080000, "maincpu", 0 ) /* Main 68K code */
|
||||
/* program ROM is byte swapped ! */
|
||||
ROM_LOAD16_WORD( "tp024_1.bin", 0x000000, 0x080000, CRC(f5cfe6ee) SHA1(30979888a4cd6500244117748f28386a7e20a169) )
|
||||
|
||||
ROM_REGION( 0x200000, "gp9001", 0 )
|
||||
ROM_LOAD( "tp024_4.bin", 0x000000, 0x100000, CRC(805c449e) SHA1(fdf985344145bd320b88b9b0c25e73066c9b2ada) )
|
||||
ROM_LOAD( "tp024_3.bin", 0x100000, 0x100000, CRC(47587164) SHA1(bac493e2d5507286b984957b289c929335d27eaa) )
|
||||
|
||||
ROM_REGION( 0x80000, "oki", 0 ) /* ADPCM Samples */
|
||||
ROM_LOAD( "tp024_2.bin", 0x00000, 0x80000, CRC(f2f6cae4) SHA1(bb4e8c36531bed97ced4696ca12fd40ede2531aa) )
|
||||
ROM_END
|
||||
|
||||
GAME( 1992, truxton2, 0, truxton2, truxton2, truxton2_state, empty_init, ROT270, "Toaplan", "Truxton II / Tatsujin Oh", MACHINE_SUPPORTS_SAVE )
|
343
src/mame/toaplan/vfive.cpp
Normal file
343
src/mame/toaplan/vfive.cpp
Normal file
@ -0,0 +1,343 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Quench, Yochizo, David Haywood
|
||||
|
||||
#include "emu.h"
|
||||
|
||||
#include "emupal.h"
|
||||
#include "screen.h"
|
||||
#include "speaker.h"
|
||||
#include "tilemap.h"
|
||||
|
||||
#include "toaplan_coincounter.h"
|
||||
#include "toaplan_v25_tables.h"
|
||||
#include "toaplipt.h"
|
||||
#include "gp9001.h"
|
||||
|
||||
#include "cpu/m68000/m68000.h"
|
||||
#include "cpu/nec/v25.h"
|
||||
#include "sound/ymopm.h"
|
||||
|
||||
/*
|
||||
Name Board No Maker Game name
|
||||
----------------------------------------------------------------------------
|
||||
grindstm TP-027 Toaplan Grind Stormer (1992)
|
||||
grindstma TP-027 Toaplan Grind Stormer (1992) (older)
|
||||
vfive TP-027 Toaplan V-V (V-Five) (1993 - Japan only)
|
||||
|
||||
|
||||
grindstm - Code at 20A26 in vfive forces region to Japan. All sets have some NOPs at reset vector,
|
||||
and the NEC V25 CPU test that the other games do is skipped. Furthermore, all sets have
|
||||
a broken ROM checksum routine that reads address ranges that don't match the actual
|
||||
location or size of the ROM, and that has a hack at the end so it always passes.
|
||||
Normally you would expect to see code like this in a bootleg, but the NOPs and other
|
||||
oddities are identical among three different sets.
|
||||
*/
|
||||
|
||||
namespace {
|
||||
|
||||
class vfive_state : public driver_device
|
||||
{
|
||||
public:
|
||||
vfive_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: driver_device(mconfig, type, tag)
|
||||
, m_shared_ram(*this, "shared_ram")
|
||||
, m_maincpu(*this, "maincpu")
|
||||
, m_audiocpu(*this, "audiocpu")
|
||||
, m_vdp(*this, "gp9001")
|
||||
, m_screen(*this, "screen")
|
||||
, m_palette(*this, "palette")
|
||||
, m_coincounter(*this, "coincounter")
|
||||
{ }
|
||||
void vfive(machine_config &config);
|
||||
|
||||
protected:
|
||||
virtual void video_start() override ATTR_COLD;
|
||||
|
||||
private:
|
||||
void vfive_68k_mem(address_map &map) ATTR_COLD;
|
||||
void vfive_v25_mem(address_map &map) ATTR_COLD;
|
||||
|
||||
u8 shared_ram_r(offs_t offset) { return m_shared_ram[offset]; }
|
||||
void shared_ram_w(offs_t offset, u8 data) { m_shared_ram[offset] = data; }
|
||||
void coin_sound_reset_w(u8 data);
|
||||
void reset(int state);
|
||||
|
||||
u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
void screen_vblank(int state);
|
||||
|
||||
required_shared_ptr<u8> m_shared_ram; // 8 bit RAM shared between 68K and sound CPU
|
||||
required_device<m68000_base_device> m_maincpu;
|
||||
required_device<cpu_device> m_audiocpu;
|
||||
required_device<gp9001vdp_device> m_vdp;
|
||||
required_device<screen_device> m_screen;
|
||||
required_device<palette_device> m_palette;
|
||||
required_device<toaplan_coincounter_device> m_coincounter;
|
||||
bitmap_ind8 m_custom_priority_bitmap;
|
||||
};
|
||||
|
||||
|
||||
void vfive_state::video_start()
|
||||
{
|
||||
m_screen->register_screen_bitmap(m_custom_priority_bitmap);
|
||||
m_vdp->custom_priority_bitmap = &m_custom_priority_bitmap;
|
||||
}
|
||||
|
||||
u32 vfive_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
bitmap.fill(0, cliprect);
|
||||
m_custom_priority_bitmap.fill(0, cliprect);
|
||||
m_vdp->render_vdp(bitmap, cliprect);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void vfive_state::screen_vblank(int state)
|
||||
{
|
||||
if (state) // rising edge
|
||||
{
|
||||
m_vdp->screen_eof();
|
||||
}
|
||||
}
|
||||
|
||||
void vfive_state::reset(int state)
|
||||
{
|
||||
m_audiocpu->pulse_input_line(INPUT_LINE_RESET, attotime::zero);
|
||||
}
|
||||
|
||||
void vfive_state::coin_sound_reset_w(u8 data)
|
||||
{
|
||||
m_coincounter->coin_w(data & ~0x10);
|
||||
m_audiocpu->set_input_line(INPUT_LINE_RESET, (data & 0x10) ? CLEAR_LINE : ASSERT_LINE);
|
||||
}
|
||||
|
||||
static INPUT_PORTS_START( base )
|
||||
PORT_START("IN1")
|
||||
TOAPLAN_JOY_UDLR_2_BUTTONS( 1 )
|
||||
|
||||
PORT_START("IN2")
|
||||
TOAPLAN_JOY_UDLR_2_BUTTONS( 2 )
|
||||
|
||||
PORT_START("SYS")
|
||||
PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_SERVICE1 )
|
||||
PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_TILT )
|
||||
TOAPLAN_TEST_SWITCH( 0x04, IP_ACTIVE_HIGH )
|
||||
PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_COIN1 )
|
||||
PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_COIN2 )
|
||||
PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_START1 )
|
||||
PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_START2 )
|
||||
PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNKNOWN )
|
||||
|
||||
PORT_START("DSWA")
|
||||
TOAPLAN_MACHINE_NO_COCKTAIL_LOC(SW1)
|
||||
// Coinage on bit mask 0x00f0
|
||||
PORT_BIT( 0x00f0, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // Modified below
|
||||
|
||||
PORT_START("DSWB")
|
||||
TOAPLAN_DIFFICULTY_LOC(SW2)
|
||||
// Per-game features on bit mask 0x00fc
|
||||
PORT_BIT( 0x00fc, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // Modified below
|
||||
INPUT_PORTS_END
|
||||
|
||||
static INPUT_PORTS_START( grindstm )
|
||||
PORT_INCLUDE( base )
|
||||
|
||||
PORT_MODIFY("DSWA")
|
||||
PORT_DIPNAME( 0x0001, 0x0000, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW1:!1")
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( Upright ) )
|
||||
PORT_DIPSETTING( 0x0001, DEF_STR( Cocktail ) )
|
||||
TOAPLAN_COINAGE_DUAL_LOC( JMPR, 0xe0, 0x80, SW1 )
|
||||
|
||||
PORT_MODIFY("DSWB")
|
||||
PORT_DIPNAME( 0x000c, 0x0000, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:!3,!4")
|
||||
PORT_DIPSETTING( 0x000c, DEF_STR( None ) )
|
||||
PORT_DIPSETTING( 0x0008, "200k only" )
|
||||
PORT_DIPSETTING( 0x0000, "300k and 800k" )
|
||||
PORT_DIPSETTING( 0x0004, "300k and every 800k" )
|
||||
PORT_DIPNAME( 0x0030, 0x0000, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:!5,!6")
|
||||
PORT_DIPSETTING( 0x0030, "1" )
|
||||
PORT_DIPSETTING( 0x0020, "2" )
|
||||
PORT_DIPSETTING( 0x0000, "3" )
|
||||
PORT_DIPSETTING( 0x0010, "5" )
|
||||
PORT_DIPNAME( 0x0040, 0x0000, "Invulnerability (Cheat)" ) PORT_DIPLOCATION("SW2:!7")
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x0040, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x0080, 0x0000, DEF_STR( Allow_Continue ) ) PORT_DIPLOCATION("SW2:!8")
|
||||
PORT_DIPSETTING( 0x0080, DEF_STR( No ) )
|
||||
PORT_DIPSETTING( 0x0000, DEF_STR( Yes ) )
|
||||
|
||||
PORT_START("JMPR")
|
||||
// Code in many places in game tests if region is >= 0xC. Effects on gameplay?
|
||||
PORT_CONFNAME( 0x00f0, 0x0090, DEF_STR( Region ) ) //PORT_CONFLOCATION("JP:!4,!3,!2,!1")
|
||||
PORT_CONFSETTING( 0x0090, DEF_STR( Europe ) )
|
||||
// PORT_CONFSETTING( 0x0080, DEF_STR( Europe ) )
|
||||
PORT_CONFSETTING( 0x00b0, DEF_STR( USA ) )
|
||||
PORT_CONFSETTING( 0x00a0, "USA (American Sammy Corporation)" )
|
||||
PORT_CONFSETTING( 0x0070, DEF_STR( Southeast_Asia ) )
|
||||
PORT_CONFSETTING( 0x0060, "Southeast Asia (Charterfield)" )
|
||||
PORT_CONFSETTING( 0x0050, DEF_STR( Taiwan ) )
|
||||
PORT_CONFSETTING( 0x0040, "Taiwan (Anomoto International Inc.)" )
|
||||
PORT_CONFSETTING( 0x0030, DEF_STR( Hong_Kong ) )
|
||||
PORT_CONFSETTING( 0x0020, "Hong Kong (Charterfield)" )
|
||||
PORT_CONFSETTING( 0x0010, DEF_STR( Korea ) )
|
||||
PORT_CONFSETTING( 0x0000, "Korea (Unite Trading)" )
|
||||
PORT_CONFSETTING( 0x00d0, "USA; different?" )
|
||||
PORT_CONFSETTING( 0x00c0, "USA (American Sammy Corporation); different?" )
|
||||
PORT_CONFSETTING( 0x00e0, "Korea; different?" )
|
||||
// PORT_CONFSETTING( 0x00f0, "Korea; different?" )
|
||||
INPUT_PORTS_END
|
||||
|
||||
static INPUT_PORTS_START( grindstma )
|
||||
PORT_INCLUDE( grindstm )
|
||||
|
||||
PORT_MODIFY("JMPR")
|
||||
// Code in many places in game tests if region is >= 0xC. Effects on gameplay?
|
||||
PORT_CONFNAME( 0x00f0, 0x0090, DEF_STR( Region ) ) //PORT_CONFLOCATION("JP:!4,!3,!2,!1")
|
||||
PORT_CONFSETTING( 0x0090, DEF_STR( Europe ) )
|
||||
// PORT_CONFSETTING( 0x0080, DEF_STR( Europe ) )
|
||||
PORT_CONFSETTING( 0x00b0, DEF_STR( USA ) )
|
||||
PORT_CONFSETTING( 0x00a0, "USA (Atari Games Corp.)" )
|
||||
PORT_CONFSETTING( 0x0070, DEF_STR( Southeast_Asia ) )
|
||||
PORT_CONFSETTING( 0x0060, "Southeast Asia (Charterfield)" )
|
||||
PORT_CONFSETTING( 0x0050, DEF_STR( Taiwan ) )
|
||||
// PORT_CONFSETTING( 0x0040, DEF_STR( Taiwan ) )
|
||||
PORT_CONFSETTING( 0x0030, DEF_STR( Hong_Kong ) )
|
||||
PORT_CONFSETTING( 0x0020, "Hong Kong (Charterfield)" )
|
||||
PORT_CONFSETTING( 0x0010, DEF_STR( Korea ) )
|
||||
PORT_CONFSETTING( 0x0000, "Korea (Unite Trading)" )
|
||||
PORT_CONFSETTING( 0x00c0, "Korea; different?" )
|
||||
// PORT_CONFSETTING( 0x00d0, "Korea; different?" )
|
||||
// PORT_CONFSETTING( 0x00e0, "Korea; different?" )
|
||||
// PORT_CONFSETTING( 0x00f0, "Korea; different?" )
|
||||
INPUT_PORTS_END
|
||||
|
||||
static INPUT_PORTS_START( vfive )
|
||||
PORT_INCLUDE( grindstm )
|
||||
|
||||
PORT_MODIFY("DSWA")
|
||||
TOAPLAN_COINAGE_JAPAN_LOC(SW1)
|
||||
|
||||
PORT_MODIFY("JMPR")
|
||||
// Region is forced to Japan in this set.
|
||||
// Code at $9238 tests bit 7.
|
||||
// (Actually bit 3, but the V25 shifts the jumper byte before storing it in shared RAM)
|
||||
// Runs twice near end of stage 1, once when each of the two boss tanks appears. Effect?
|
||||
// Also, if bit 7 is set and bits 6-5 are clear, service mode wrongly shows European coinage
|
||||
// (due to code left in from Grind Stormer: see code at $210A4 and lookup table at $211FA)
|
||||
PORT_CONFNAME( 0x0030, 0x0000, "Copyright" ) //PORT_CONFLOCATION("JP:!4,!3")
|
||||
PORT_CONFSETTING( 0x0000, "All Rights Reserved" )
|
||||
// PORT_CONFSETTING( 0x0010, "All Rights Reserved" )
|
||||
// PORT_CONFSETTING( 0x0020, "All Rights Reserved" )
|
||||
PORT_CONFSETTING( 0x0030, "Licensed to Taito Corp." )
|
||||
PORT_CONFNAME( 0x0040, 0x0000, DEF_STR( Unused ) ) //PORT_CONFLOCATION("JP:!2")
|
||||
PORT_CONFSETTING( 0x0000, DEF_STR( Off ) )
|
||||
PORT_CONFSETTING( 0x0040, DEF_STR( On ) )
|
||||
PORT_CONFNAME( 0x0080, 0x0000, DEF_STR( Unknown ) ) //PORT_CONFLOCATION("JP:!1")
|
||||
PORT_CONFSETTING( 0x0000, DEF_STR( Off ) )
|
||||
PORT_CONFSETTING( 0x0080, DEF_STR( On ) )
|
||||
INPUT_PORTS_END
|
||||
|
||||
void vfive_state::vfive_68k_mem(address_map &map)
|
||||
{
|
||||
map(0x000000, 0x07ffff).rom();
|
||||
map(0x100000, 0x103fff).ram();
|
||||
// map(0x200000, 0x20ffff).noprw(); // Read at startup by broken ROM checksum code - see notes
|
||||
map(0x200010, 0x200011).portr("IN1");
|
||||
map(0x200014, 0x200015).portr("IN2");
|
||||
map(0x200018, 0x200019).portr("SYS");
|
||||
map(0x20001d, 0x20001d).w(FUNC(vfive_state::coin_sound_reset_w)); // Coin count/lock + v25 reset line
|
||||
map(0x210000, 0x21ffff).rw(FUNC(vfive_state::shared_ram_r), FUNC(vfive_state::shared_ram_w)).umask16(0x00ff);
|
||||
map(0x300000, 0x30000d).rw(m_vdp, FUNC(gp9001vdp_device::read), FUNC(gp9001vdp_device::write));
|
||||
map(0x400000, 0x400fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
|
||||
map(0x700000, 0x700001).r(m_vdp, FUNC(gp9001vdp_device::vdpcount_r));
|
||||
}
|
||||
|
||||
|
||||
void vfive_state::vfive_v25_mem(address_map &map)
|
||||
{
|
||||
map(0x00000, 0x00001).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write));
|
||||
map(0x80000, 0x87fff).mirror(0x78000).ram().share(m_shared_ram);
|
||||
}
|
||||
|
||||
|
||||
void vfive_state::vfive(machine_config &config)
|
||||
{
|
||||
/* basic machine hardware */
|
||||
M68000(config, m_maincpu, 20_MHz_XTAL/2); // verified on PCB
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &vfive_state::vfive_68k_mem);
|
||||
m_maincpu->reset_cb().set(FUNC(vfive_state::reset));
|
||||
|
||||
v25_device &audiocpu(V25(config, m_audiocpu, 20_MHz_XTAL/2)); // Verified on PCB, NEC V25 type Toaplan mark scratched out
|
||||
audiocpu.set_addrmap(AS_PROGRAM, &vfive_state::vfive_v25_mem);
|
||||
audiocpu.set_decryption_table(toaplan_v25_tables::nitro_decryption_table);
|
||||
audiocpu.pt_in_cb().set_ioport("DSWA").exor(0xff);
|
||||
audiocpu.p0_in_cb().set_ioport("DSWB").exor(0xff);
|
||||
audiocpu.p1_in_cb().set_ioport("JMPR").exor(0xff);
|
||||
audiocpu.p2_out_cb().set_nop(); // bit 0 is FAULT according to kbash schematic
|
||||
|
||||
TOAPLAN_COINCOUNTER(config, m_coincounter, 0);
|
||||
|
||||
/* video hardware */
|
||||
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
|
||||
m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
|
||||
m_screen->set_raw(27_MHz_XTAL/4, 432, 0, 320, 262, 0, 240); // verified on PCB
|
||||
m_screen->set_screen_update(FUNC(vfive_state::screen_update));
|
||||
m_screen->screen_vblank().set(FUNC(vfive_state::screen_vblank));
|
||||
m_screen->set_palette(m_palette);
|
||||
|
||||
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, gp9001vdp_device::VDP_PALETTE_LENGTH);
|
||||
|
||||
GP9001_VDP(config, m_vdp, 27_MHz_XTAL);
|
||||
m_vdp->set_palette(m_palette);
|
||||
m_vdp->vint_out_cb().set_inputline(m_maincpu, M68K_IRQ_4);
|
||||
|
||||
/* sound hardware */
|
||||
SPEAKER(config, "mono").front_center();
|
||||
|
||||
YM2151(config, "ymsnd", 27_MHz_XTAL/8).add_route(ALL_OUTPUTS, "mono", 0.5); // verified on PCB
|
||||
}
|
||||
|
||||
|
||||
|
||||
ROM_START( grindstm )
|
||||
ROM_REGION( 0x080000, "maincpu", 0 ) /* Main 68K code */
|
||||
ROM_LOAD16_WORD_SWAP( "01.bin", 0x000000, 0x080000, CRC(4923f790) SHA1(1c2d66b432d190d0fb6ac7ca0ec0687aea3ccbf4) )
|
||||
|
||||
/* Secondary CPU is a Toaplan marked chip, (TS-007-Spy TOA PLAN) */
|
||||
/* It's a NEC V25 (PLCC94) (encrypted program uploaded by main CPU) */
|
||||
|
||||
ROM_REGION( 0x200000, "gp9001", 0 )
|
||||
ROM_LOAD( "tp027_02.bin", 0x000000, 0x100000, CRC(877b45e8) SHA1(b3ed8d8dbbe51a1919afc55d619d2b6771971493) )
|
||||
ROM_LOAD( "tp027_03.bin", 0x100000, 0x100000, CRC(b1fc6362) SHA1(5e97e3cce31be57689d394a50178cda4d80cce5f) )
|
||||
ROM_END
|
||||
|
||||
|
||||
ROM_START( grindstma )
|
||||
ROM_REGION( 0x080000, "maincpu", 0 ) /* Main 68K code */
|
||||
ROM_LOAD16_WORD_SWAP( "tp027-01.rom", 0x000000, 0x080000, CRC(8d8c0392) SHA1(824dde274c8bef8a87c54d8ccdda7f0feb8d11e1) )
|
||||
|
||||
/* Secondary CPU is a Toaplan marked chip, (TS-007-Spy TOA PLAN) */
|
||||
/* It's a NEC V25 (PLCC94) (encrypted program uploaded by main CPU) */
|
||||
|
||||
ROM_REGION( 0x200000, "gp9001", 0 )
|
||||
ROM_LOAD( "tp027_02.bin", 0x000000, 0x100000, CRC(877b45e8) SHA1(b3ed8d8dbbe51a1919afc55d619d2b6771971493) )
|
||||
ROM_LOAD( "tp027_03.bin", 0x100000, 0x100000, CRC(b1fc6362) SHA1(5e97e3cce31be57689d394a50178cda4d80cce5f) )
|
||||
ROM_END
|
||||
|
||||
|
||||
ROM_START( vfive )
|
||||
ROM_REGION( 0x080000, "maincpu", 0 ) /* Main 68K code */
|
||||
ROM_LOAD16_WORD_SWAP( "tp027_01.bin", 0x000000, 0x080000, CRC(731d50f4) SHA1(794255d0a809cda9170f5bac473df9d7f0efdac8) )
|
||||
|
||||
/* Secondary CPU is a Toaplan marked chip, (TS-007-Spy TOA PLAN) */
|
||||
/* It's a NEC V25 (PLCC94) (encrypted program uploaded by main CPU) */
|
||||
|
||||
ROM_REGION( 0x200000, "gp9001", 0 )
|
||||
ROM_LOAD( "tp027_02.bin", 0x000000, 0x100000, CRC(877b45e8) SHA1(b3ed8d8dbbe51a1919afc55d619d2b6771971493) )
|
||||
ROM_LOAD( "tp027_03.bin", 0x100000, 0x100000, CRC(b1fc6362) SHA1(5e97e3cce31be57689d394a50178cda4d80cce5f) )
|
||||
ROM_END
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
GAME( 1992, grindstm, 0, vfive, grindstm, vfive_state, empty_init, ROT270, "Toaplan", "Grind Stormer", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1992, grindstma, grindstm, vfive, grindstma, vfive_state, empty_init, ROT270, "Toaplan", "Grind Stormer (older set)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1993, vfive, grindstm, vfive, vfive, vfive_state, empty_init, ROT270, "Toaplan", "V-Five (Japan)", MACHINE_SUPPORTS_SAVE )
|
||||
|
Loading…
Reference in New Issue
Block a user