- a1supply.cpp: dumped most missing PROMs for tv21_3 [Siftware]

- blktiger.cpp, nmk16.cpp: added some hardware infos. Corrected blktiger MCU clock [Guru]

- wc90.cpp, wc90b.cpp: used finders, small cleanups
This commit is contained in:
Ivan Vangelista 2022-03-21 19:28:14 +01:00
parent 092ee310ff
commit 064cd262a6
11 changed files with 1014 additions and 877 deletions

View File

@ -4382,11 +4382,7 @@ files {
MAME_DIR .. "src/mame/includes/tehkanwc.h",
MAME_DIR .. "src/mame/video/tehkanwc.cpp",
MAME_DIR .. "src/mame/drivers/wc90.cpp",
MAME_DIR .. "src/mame/includes/wc90.h",
MAME_DIR .. "src/mame/video/wc90.cpp",
MAME_DIR .. "src/mame/drivers/wc90b.cpp",
MAME_DIR .. "src/mame/includes/wc90b.h",
MAME_DIR .. "src/mame/video/wc90b.cpp",
}
createMAMEProjects(_target, _subtarget, "terminal")

View File

@ -107,17 +107,17 @@ ROM_START( tv21_3 )
ROM_LOAD( "750135.9", 0x0000, 0x0800, CRC(c821464c) SHA1(5334e6011ff8cd76b6215af05e697e4538921260) ) // 2716 looking chip FIXED BITS (xx000000) BADADDR ---xxxxxxxx
ROM_LOAD( "750030.42", 0x0800, 0x0200, CRC(d8595357) SHA1(44805f2b3dad8e764dda246ed19d328927679062) ) // 82s141
ROM_LOAD( "750026a.47", 0x0a00, 0x0200, CRC(165f590a) SHA1(d4d001ac710d28b983f8f5ce4a2e9364c2e73179) ) // 82s141
ROM_LOAD( "700122.36", 0x0c00, 0x0100, NO_DUMP ) // 82s129ba
ROM_LOAD( "700121.37", 0x0d00, 0x0100, NO_DUMP ) // 82s129ba
ROM_LOAD( "700123.38", 0x0e00, 0x0100, NO_DUMP ) // 82s129ba
ROM_LOAD( "700124.11", 0x0f00, 0x0020, NO_DUMP ) // 82s23n
ROM_LOAD( "700119a.23", 0x0f20, 0x0020, NO_DUMP ) // PROM1-8256-5B 7644, size unverified
ROM_LOAD( "7500116a.24", 0x0f40, 0x0020, NO_DUMP ) // 82s23n
ROM_LOAD( "7500115a.25", 0x0f60, 0x0020, NO_DUMP ) // 82s23n
ROM_LOAD( "700117a.41", 0x0f80, 0x0020, NO_DUMP ) // PROM1-0512-5B 7645, size unverified
ROM_LOAD( "700120.46", 0x0fa0, 0x0020, NO_DUMP ) // PROM1-0512-5B 7704, size unverified
ROM_LOAD( "700118.51", 0x0fc0, 0x0020, NO_DUMP ) // PROM1-0512-5B 7704, size unverified
ROM_LOAD( "750029.53", 0x0fe0, 0x0020, NO_DUMP ) // 82s23n
ROM_LOAD( "700122.36", 0x0c00, 0x0100, CRC(29f99d7e) SHA1(e9c15507ca976b8ab9bb3f070eb9e1f9c3fc185c) ) // 82s129ba
ROM_LOAD( "700121.37", 0x0d00, 0x0100, CRC(29b22045) SHA1(5017fa45909b243f5b84a523d8098320936e0c6a) ) // 82s129ba
ROM_LOAD( "700123.38", 0x0e00, 0x0100, CRC(53c03cbe) SHA1(f28f4ce4c79fbf4407c27e094540d0e2ff794093) ) // 82s129ba
ROM_LOAD( "700124.11", 0x0f00, 0x0020, CRC(a4a7d564) SHA1(fd625d431ca00fec129b85526839cd8e4f7d7091) ) // 82s23n, same contents as tvpoker's 90902100.20
ROM_LOAD( "700119a.23", 0x0f20, 0x0020, CRC(51d2e42e) SHA1(144e5c7dbc034893e66ef8385fc1f839c862bf29) ) // PROM1-8256-5B 7644
ROM_LOAD( "7500116a.24", 0x0f40, 0x0020, CRC(ebed85b7) SHA1(b62f099c3e6350cf88f9c70750d227c82c8c4608) ) // 82s23n
ROM_LOAD( "7500115a.25", 0x0f60, 0x0020, CRC(b663d121) SHA1(ddf09dd624ad3cddc8f10406bdb22cf746361571) ) // 82s23n
ROM_LOAD( "700117a.41", 0x0f80, 0x0020, NO_DUMP ) // PROM1-0512-5B 7645, unknown chip type and size
ROM_LOAD( "700120.46", 0x0fa0, 0x0020, NO_DUMP ) // PROM1-0512-5B 7704, unknown chip type and size
ROM_LOAD( "700118.51", 0x0fc0, 0x0020, NO_DUMP ) // PROM1-0512-5B 7704, unknown chip type and size
ROM_LOAD( "750029.53", 0x0fe0, 0x0020, CRC(d8c22608) SHA1(170e6f552fc013fec6903e45e2c7ec07e44d725c) ) // 82s23n, same contents as tvpoker's 90204100.69
ROM_END

View File

@ -13,8 +13,126 @@
- sprites/tile priority is a guess. I didn't find a PROM that would simply
translate to the scheme I implemented.
***************************************************************************
Black Tiger / Black Dragon (Capcom, 1987)
Hardware info by Guru
Note boards connect solder side to solder side and parts face outwards
on both boards.
Top Board
---------
CAPCOM
87118-A-X1
|-------------------------------------------------------------------------|
| VOL |------------------| BD_06.1L |
| HA13001 YM3014 YM2203 |138 138 21 08 | |
| |2kB 174 367 74 74| 3.579545MHz|
| M5224 YM3014 YM2203 |Z80 139 | JP7..12 |
| |---SOUND_MODULE---| |
| |
| 5814 4364 |
|J BD.6K |
|A BD_U_01A.5E |
|M 5814 24MHz |
|M BD_U_02A.6E |
|A |
| BD01.8J |
| BD_U_03A.8E |
| JP1..6 BD02.9J |
| SW2 BD_U_04A.9E |
| |
| BD_U_05A.10E BD03.11K |
| SW1 BD04.11L |
| Z80 |
|--------|--------------|-------------------------|--------------|--------|
|--------------| |--------------|
Notes:
Z80 - Zilog Z084006PSC CPU (main CPU). Clock input 6MHz [24/4]
Z80 (sound module) - Zilog Z084004PSC CPU (sound CPU). Clock input 3.579545MHz
BD.6K - Intel D8751H-8 Microcontroller with internal 4kBx8-bit EPROM and 128 bytes internal RAM. Clock input 8.000MHz [24/3]
YM2203 - Yamaha YM2203 FM Operator Type-N (OPN) sound chip. Clock input 3.579545MHz (both)
YM3014 - Yamaha YM3014B Serial Input Floating D/A Converter. Clock input 1.193181667MHz [3.579545/3] (both)
SOUND_MODULE - Contains commonly available parts.... logic, Z80A and 2kBx8-bit SRAM
JP1..6 - 0-ohm jumpers. JP1 & JP6 are shorted, others are open
JP7..12 - 0-ohm jumpers. JP10 & JP11 are shorted, others are open
HA13001 - Hitachi HA13001 5.5W Dual / 17.5W BTL Audio Power Amplifier
SW1/2 - 8-position DIP switch
M5224 - Mitsubishi M5224 Quad Operational Amplifier (compatible with LM324)
2kB - 2kBx8-bit SRAM (inside sound module). Compatible with 6116, 2018, 5814, 4016 etc.
5814 - Sony CXK5814 2kBx8-bit SRAM (color RAM)
4364 - NEC D4364 8kBx8-bit SRAM (main program RAM)
BD01.8J - Signetics 82S129 bipolar PROM. When removed: No backgrounds and no sprites. Text layer/characters ok.
BD02.9J - Signetics 82S129 bipolar PROM. When removed: Affects sprites, sometimes they are partial or disappear under tiles.
BD03.11K - Signetics 82S129 bipolar PROM. Timing. When removed: Black screen, no syncs, game plays blind.
BD04.11L - Signetics 82S129 bipolar PROM. Timing. When removed: No bootup, shows only static garbage
BD_06.1L - Hitachi HN27256 32kBx8-bit OTP EPROM (sound program)
BD_U_01A.5E - \
BD_U_02A.6E - \ 27C512 EPROM or OTP EPROM (main program)
BD_U_03A.8E - /
BD_U_04A.9E - /
BD_U_05A.10E - /
VSync - 59.6373Hz
HSync - 15.6250kHz
Bottom Board
------------
CAPCOM
87118-B-X1
|--------------| |--------------|
|--------|--------------|-------------------------|--------------|--------|
| 86S100 |
| |-------| |
| |CAPCOM | BD_U_15.2N |
| |86S105 | |
| |RJ5C39 | 2018 2018 |
| |-------| |
| |
| |
| BD_07.4A BD_U_11A.4B |
| |
| BD_08.5A BD_U_12A.5B |
| |
| 4016 |
| 86S100 86S100 |
| |
| BD_09.8A BD_U_13A.8B |
| |
| BD_10.9A BD_U_14A.9B 43256 |
| JP7..8 JP9..12 |
| JP1..6 |
|-------------------------------------------------------------------------|
Notes:
86S105 - Custom PLCC84 chip marked 'CAPCOM 86S105 RJ5C39 863 32 JAPAN'. Manufactured by Ricoh
This chip is used to generate sprites. Note the chip has 3x 2kBx8-bit (6kB) internal SRAM.
This chip fails often so when a game that uses this chip has vertical jailbars in the sprites
most likely this chip has failed.
86S100 - Custom chip marked 'CAPCOM 86S100 M ^ 73100'. ^ = triangle. Manufactured by Texas Instruments
This chip is similar to 2x 74LS165 8-bit parallel-to-serial shift register chips in one package
but with direction control and two data modes (4-bit/8-bit).
JP1..6 - 0-ohm jumpers. JP1 & JP5 are shorted, others are open
JP7..8 - 0-ohm jumpers. JP7 shorted, JP8 open
JP9..12 - 0-ohm jumpers. JP12 shorted, others are open
43256 - NEC D43256 32kBx8-bit SRAM (background tile RAM)
2018 - Toshiba TMM2018 2kBx8-bit SRAM (additional sprite RAM.... see note above re: 86S105)
4016 - NEC D4016 2kBx8-bit SRAM (text layer / character RAM)
BD_07.4A \
BD_08.5A \ 27C512 EPROM or OTP EPROM
BD_09.8A /
BD_10.9A /
BD_U_11A.4B \
BD_U_12A.5B \
BD_U_13A.8B / 27512 OTP EPROM
BD_U_14A.9B /
BD_U_15.2N - 27256 OTP EPROM
***************************************************************************/
#include "emu.h"
#include "includes/blktiger.h"
@ -300,7 +418,7 @@ void blktiger_state::blktiger(machine_config &config)
Z80(config, m_audiocpu, XTAL(3'579'545)); /* verified on pcb */
m_audiocpu->set_addrmap(AS_PROGRAM, &blktiger_state::blktiger_sound_map);
I8751(config, m_mcu, XTAL(24'000'000)/4); /* ??? */
I8751(config, m_mcu, XTAL(24'000'000)/3); /* verified on pcb */
m_mcu->port_in_cb<0>().set(FUNC(blktiger_state::blktiger_from_main_r));
m_mcu->port_out_cb<0>().set(FUNC(blktiger_state::blktiger_to_main_w));
// other ports unknown

View File

@ -6055,6 +6055,75 @@ ROM_START( tharrierb )
ROM_LOAD( "20h.512", 0x70000, 0x10000, CRC(5ccd9205) SHA1(6e5443d6af5a896d6dd4b4e06d5c3151826bf8b5) )
ROM_END
/***************************************************************************
USAAF Mustang (UPL, 1990)
Hardware info by Guru
UPL-90058
|-------------------------------------------------------------------------|
| LA4460 LM358 YM2203 76C28 55257 |
| Y3014 7.IC141 |
| NMK004 55257 |
|90058-6.IC219 90058-4.IC142 |
| 90058-5.IC185 55257 |
| NMK903 |
| 55257 |
| SW1 |
| 6264 |
| |
|J 1.IC160 6264 |
|A |
|M 90058-9.IC35 |
|M NMK903 NMK901 |
|A 90058-8.IC36 |
| |
| SW2 10.IC120 |
| 2016 2016 NMK902 |
| 11.IC121 |
| 2.IC166 |
| 12MHz |
| 3.IC167 |
| |
| |
| 6116 55257 6116 |
| 6116 68000 55257 6116 |
| 8MHz |
|-------------------------------------------------------------------------|
Notes:
68000 - Clock 8.000MHz
YM2203 - Clock 1.500MHz [12/8]
M6295 - 4.000MHz [12/3] and pin 7 LOW (both)
VSync - 56Hz
HSync - 15.5kHz
SW1/2 - 8-position DIP switch
55257 - Toshiba TC55257 32kBx8-bit SRAM
6116 - 2kBx8-bit SRAM
2016 - 2kBx8-bit SRAM
6264 - 8kBx8-bit SRAM
76C28 - Goldstar GM76C28 2kBx8-bit SRAM
NMK901 - Custom chip
NMK902 - Custom chip
NMK903 - Custom chip
NMK904 - Toshiba TMP90C840AF with 8Kbyte internal ROM disguised as a custom chip. Clock input 8.000MHz. Clock output on pin 17 is 2.000MHz
LA4460 - Sanyo LA4460 Audio Power Amplifier
LM358 - Texas Instruments LM358 Dual Operational Amplifier
Y3014 - Yamaha YM3014 DAC
90058-1.IC160 - 27C010 128kBx8-bit EPROM (foreground tiles)
90058-2.IC166 - 27C010 128kBx8-bit EPROM (main program)
90058-3.IC167 - 27C010 128kBx8-bit EPROM (main program)
90058-7.IC141 - 27C512 64kBx8-bit EPROM ( sound program)
90058-4.IC142 - 4Mbit mask ROM (background tiles)
90058-5.IC185 - 4Mbit mask ROM (OKI M6295 samples)
90058-6.IC219 - 4Mbit mask ROM (OKI M6295 samples)
90058-8.IC36 - 4Mbit mask ROM (sprites)
90058-9.IC35 - TC574000 512kBx8-bit EPROM (sprites)
90058-10.IC120 - Harris M1-7649 bipolar PROM
90058-11.IC121 - Harris M1-7621 bipolar PROM
***************************************************************************/
ROM_START( mustang )
ROM_REGION( 0x40000, "maincpu", 0 )
ROM_LOAD16_BYTE( "2.bin", 0x00000, 0x20000, CRC(bd9f7c89) SHA1(a0af46a8ff82b90bece2515e1bd74e7a7ddf5379) )

View File

@ -146,6 +146,7 @@ TODO:
Thundercade / Twin Formation
Taito America Corp./Romstar USA/Seta, 1987
Hardware info by Guru
PCB Layout
---------
@ -630,6 +631,7 @@ BPGH-013.U70 TC538000
Zombie Raid
Sammy, 1996
Hardware info by Guru
This is a gun shooting game using Seta/Allumer hardware.
@ -689,6 +691,7 @@ NEC 71054C ----???
Kamen Rider
Kamen Riderclub Battleracer
Banpresto, 1993
Hardware info by Guru
Runs on Seta/Allumer hardware
@ -748,6 +751,7 @@ X1-010 X1-006
Allumer, 1993
This game is a vertical shoot'em-up and runs on fairly standard Allumer hardware.
Hardware info by Guru
PCB Layout
----------
@ -882,6 +886,7 @@ Custom chips: X1-001A X1-002A
Triple Fun
??, 19??
Hardware info by Guru
CPU : TMP68HC000P-16 (68000)
@ -1006,6 +1011,7 @@ Other : Allumer
Banpresto, 1992
This game runs on Seta/Allumer hardware
Hardware info by Guru
PCB Layout
----------
@ -1081,6 +1087,7 @@ Custom chips: X1-001A X1-002A
Banpresto, 1992
Board looks similar to Castle of Dragon PCB.
Hardware info by Guru
PCB No: P0-077A (Seta Number)
BP922 (Banpresto Number)
@ -1116,6 +1123,7 @@ BP-U-003.U13 8M mask (32 pin, 1M x 8), read as MX27C8000 Sound
/***************************************************************************
Ultra Toukon Densetsu
Banpresto, 1993
Hardware info by Guru
This game runs on fairly standard Allumer hardware.
@ -1212,6 +1220,7 @@ X1-010 5168-10 68000-16
Pairs Love
Allumer, 199x
Hardware info by Guru
PCB Layout
----------
@ -1249,6 +1258,7 @@ Notes:
Rezon (Taito License)
Allumer / Taito, 1992
Hardware info by Guru
This game runs on fairly standard Allumer hardware.
@ -1324,7 +1334,7 @@ Notes:
Crazy Fight
Subsino 1996
Readme by Guru
Hardware info by Guru
This game runs on Allumer-based hardware.
It is a whack-a-mole type game using 6 buttons.

View File

@ -54,59 +54,284 @@ Press one of the start buttons to exit.
*/
#include "emu.h"
#include "includes/wc90.h"
#include "video/tecmo_spr.h"
#include "cpu/z80/z80.h"
#include "machine/gen_latch.h"
#include "machine/watchdog.h"
#include "sound/ymopn.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
#include "tilemap.h"
namespace {
class wc90_state : public driver_device
{
public:
wc90_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_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
m_sprgen(*this, "spritegen"),
m_fgvideoram(*this, "fgvideoram"),
m_bgvideoram(*this, "bgvideoram"),
m_txvideoram(*this, "txvideoram"),
m_scrollxlo(*this, "scrollxlo%u", 0U),
m_scrollxhi(*this, "scrollxhi%u", 0U),
m_scrollylo(*this, "scrollylo%u", 0U),
m_scrollyhi(*this, "scrollyhi%u", 0U),
m_spriteram(*this, "spriteram"),
m_mainbank(*this, "mainbank"),
m_subbank(*this, "subbank")
{ }
void wc90t(machine_config &config);
void wc90(machine_config &config);
void pac90(machine_config &config);
protected:
virtual void machine_start() override;
virtual void video_start() override;
private:
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_device<tecmo_spr_device> m_sprgen;
required_shared_ptr<uint8_t> m_fgvideoram;
required_shared_ptr<uint8_t> m_bgvideoram;
required_shared_ptr<uint8_t> m_txvideoram;
required_shared_ptr_array<uint8_t, 3> m_scrollxlo;
required_shared_ptr_array<uint8_t, 3> m_scrollxhi;
required_shared_ptr_array<uint8_t, 3> m_scrollylo;
required_shared_ptr_array<uint8_t, 3> m_scrollyhi;
required_shared_ptr<uint8_t> m_spriteram;
required_memory_bank m_mainbank;
required_memory_bank m_subbank;
tilemap_t *m_tx_tilemap;
tilemap_t *m_fg_tilemap;
tilemap_t *m_bg_tilemap;
void bankswitch_w(uint8_t data);
void sub_bankswitch_w(uint8_t data);
void bgvideoram_w(offs_t offset, uint8_t data);
void fgvideoram_w(offs_t offset, uint8_t data);
void txvideoram_w(offs_t offset, uint8_t data);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
TILE_GET_INFO_MEMBER(get_fg_tile_info);
TILE_GET_INFO_MEMBER(get_tx_tile_info);
TILE_GET_INFO_MEMBER(track_get_bg_tile_info);
TILE_GET_INFO_MEMBER(track_get_fg_tile_info);
DECLARE_VIDEO_START(wc90t);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void sound_map(address_map &map);
void main_map(address_map &map);
void sub_map(address_map &map);
};
// video
/***************************************************************************
Callbacks for the TileMap code
***************************************************************************/
TILE_GET_INFO_MEMBER(wc90_state::get_bg_tile_info)
{
int attr = m_bgvideoram[tile_index];
int tile = m_bgvideoram[tile_index + 0x800] +
256 * ((attr & 3) + ((attr >> 1) & 4));
tileinfo.set(2,
tile,
attr >> 4,
0);
}
TILE_GET_INFO_MEMBER(wc90_state::get_fg_tile_info)
{
int attr = m_fgvideoram[tile_index];
int tile = m_fgvideoram[tile_index + 0x800] +
256 * ((attr & 3) + ((attr >> 1) & 4));
tileinfo.set(1,
tile,
attr >> 4,
0);
}
TILE_GET_INFO_MEMBER(wc90_state::get_tx_tile_info)
{
tileinfo.set(0,
m_txvideoram[tile_index + 0x800] + ((m_txvideoram[tile_index] & 0x07) << 8),
m_txvideoram[tile_index] >> 4,
0);
}
TILE_GET_INFO_MEMBER(wc90_state::track_get_bg_tile_info)
{
int attr = m_bgvideoram[tile_index];
int tile = m_bgvideoram[tile_index + 0x800] +
256 * (attr & 7);
tileinfo.set(2,
tile,
attr >> 4,
0);
}
TILE_GET_INFO_MEMBER(wc90_state::track_get_fg_tile_info)
{
int attr = m_fgvideoram[tile_index];
int tile = m_fgvideoram[tile_index + 0x800] +
256 * (attr & 7);
tileinfo.set(1,
tile,
attr >> 4,
0);
}
/***************************************************************************
Start the video hardware emulation.
***************************************************************************/
void wc90_state::video_start()
{
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(wc90_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 16,16, 64,32);
m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(wc90_state::get_fg_tile_info)), TILEMAP_SCAN_ROWS, 16,16, 64,32);
m_tx_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(wc90_state::get_tx_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64,32);
m_fg_tilemap->set_transparent_pen(0);
m_tx_tilemap->set_transparent_pen(0);
}
VIDEO_START_MEMBER(wc90_state,wc90t)
{
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(wc90_state::track_get_bg_tile_info)), TILEMAP_SCAN_ROWS, 16,16, 64,32);
m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(wc90_state::track_get_fg_tile_info)), TILEMAP_SCAN_ROWS, 16,16, 64,32);
m_tx_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(wc90_state::get_tx_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64,32);
m_fg_tilemap->set_transparent_pen(0);
m_tx_tilemap->set_transparent_pen(0);
}
/***************************************************************************
Memory handlers
***************************************************************************/
void wc90_state::bgvideoram_w(offs_t offset, uint8_t data)
{
m_bgvideoram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset & 0x7ff);
}
void wc90_state::fgvideoram_w(offs_t offset, uint8_t data)
{
m_fgvideoram[offset] = data;
m_fg_tilemap->mark_tile_dirty(offset & 0x7ff);
}
void wc90_state::txvideoram_w(offs_t offset, uint8_t data)
{
m_txvideoram[offset] = data;
m_tx_tilemap->mark_tile_dirty(offset & 0x7ff);
}
/***************************************************************************
Display refresh
***************************************************************************/
uint32_t wc90_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_bg_tilemap->set_scrollx(0, m_scrollxlo[2][0] + 256 * m_scrollxhi[2][0]);
m_bg_tilemap->set_scrolly(0, m_scrollylo[2][0] + 256 * m_scrollyhi[2][0]);
m_fg_tilemap->set_scrollx(0, m_scrollxlo[1][0] + 256 * m_scrollxhi[1][0]);
m_fg_tilemap->set_scrolly(0, m_scrollylo[1][0] + 256 * m_scrollyhi[1][0]);
m_tx_tilemap->set_scrollx(0, m_scrollxlo[0][0] + 256 * m_scrollxhi[0][0]);
m_tx_tilemap->set_scrolly(0, m_scrollylo[0][0] + 256 * m_scrollyhi[0][0]);
// m_sprgen->draw_wc90_sprites(bitmap, cliprect, m_gfxdecode->gfx(3), m_spriteram, m_spriteram.bytes(), 3); // unused
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
m_sprgen->draw_wc90_sprites(bitmap, cliprect, m_gfxdecode->gfx(3), m_spriteram, m_spriteram.bytes(), 2);
m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
m_sprgen->draw_wc90_sprites(bitmap, cliprect, m_gfxdecode->gfx(3), m_spriteram, m_spriteram.bytes(), 1);
m_tx_tilemap->draw(screen, bitmap, cliprect, 0, 0);
m_sprgen->draw_wc90_sprites(bitmap, cliprect, m_gfxdecode->gfx(3), m_spriteram, m_spriteram.bytes(), 0);
return 0;
}
// machine
void wc90_state::bankswitch_w(uint8_t data)
{
m_mainbank->set_entry(data >> 3);
}
void wc90_state::bankswitch1_w(uint8_t data)
void wc90_state::sub_bankswitch_w(uint8_t data)
{
m_subbank->set_entry(data >> 3);
}
void wc90_state::wc90_map_1(address_map &map)
void wc90_state::main_map(address_map &map)
{
map(0x0000, 0x7fff).rom();
map(0x8000, 0x9fff).ram(); /* Main RAM */
map(0xa000, 0xafff).ram().w(FUNC(wc90_state::fgvideoram_w)).share(m_fgvideoram); /* fg video ram */
map(0x8000, 0x9fff).ram(); // Main RAM
map(0xa000, 0xafff).ram().w(FUNC(wc90_state::fgvideoram_w)).share(m_fgvideoram);
map(0xb000, 0xbfff).ram();
map(0xc000, 0xcfff).ram().w(FUNC(wc90_state::bgvideoram_w)).share(m_bgvideoram);
map(0xd000, 0xdfff).ram();
map(0xe000, 0xefff).ram().w(FUNC(wc90_state::txvideoram_w)).share(m_txvideoram); /* tx video ram */
map(0xe000, 0xefff).ram().w(FUNC(wc90_state::txvideoram_w)).share(m_txvideoram);
map(0xf000, 0xf7ff).bankr(m_mainbank);
map(0xf800, 0xfbff).ram().share("share1");
map(0xf800, 0xfbff).ram().share("main_sub");
map(0xfc00, 0xfc00).portr("P1");
map(0xfc02, 0xfc02).portr("P2");
map(0xfc05, 0xfc05).portr("SYSTEM");
map(0xfc06, 0xfc06).portr("DSW1");
map(0xfc07, 0xfc07).portr("DSW2");
map(0xfc02, 0xfc02).writeonly().share(m_scroll0ylo);
map(0xfc03, 0xfc03).writeonly().share(m_scroll0yhi);
map(0xfc06, 0xfc06).writeonly().share(m_scroll0xlo);
map(0xfc07, 0xfc07).writeonly().share(m_scroll0xhi);
map(0xfc22, 0xfc22).writeonly().share(m_scroll1ylo);
map(0xfc23, 0xfc23).writeonly().share(m_scroll1yhi);
map(0xfc26, 0xfc26).writeonly().share(m_scroll1xlo);
map(0xfc27, 0xfc27).writeonly().share(m_scroll1xhi);
map(0xfc42, 0xfc42).writeonly().share(m_scroll2ylo);
map(0xfc43, 0xfc43).writeonly().share(m_scroll2yhi);
map(0xfc46, 0xfc46).writeonly().share(m_scroll2xlo);
map(0xfc47, 0xfc47).writeonly().share(m_scroll2xhi);
map(0xfcc0, 0xfcc0).w(m_soundlatch, FUNC(generic_latch_8_device::write));
map(0xfc02, 0xfc02).writeonly().share(m_scrollylo[0]);
map(0xfc03, 0xfc03).writeonly().share(m_scrollyhi[0]);
map(0xfc06, 0xfc06).writeonly().share(m_scrollxlo[0]);
map(0xfc07, 0xfc07).writeonly().share(m_scrollxhi[0]);
map(0xfc22, 0xfc22).writeonly().share(m_scrollylo[1]);
map(0xfc23, 0xfc23).writeonly().share(m_scrollyhi[1]);
map(0xfc26, 0xfc26).writeonly().share(m_scrollxlo[1]);
map(0xfc27, 0xfc27).writeonly().share(m_scrollxhi[1]);
map(0xfc42, 0xfc42).writeonly().share(m_scrollylo[2]);
map(0xfc43, 0xfc43).writeonly().share(m_scrollyhi[2]);
map(0xfc46, 0xfc46).writeonly().share(m_scrollxlo[2]);
map(0xfc47, 0xfc47).writeonly().share(m_scrollxhi[2]);
map(0xfcc0, 0xfcc0).w("soundlatch", FUNC(generic_latch_8_device::write));
map(0xfcd0, 0xfcd0).w("watchdog", FUNC(watchdog_timer_device::reset_w));
map(0xfce0, 0xfce0).w(FUNC(wc90_state::bankswitch_w));
}
void wc90_state::wc90_map_2(address_map &map)
void wc90_state::sub_map(address_map &map)
{
map(0x0000, 0xbfff).rom();
map(0xc000, 0xcfff).ram();
@ -114,8 +339,8 @@ void wc90_state::wc90_map_2(address_map &map)
map(0xd800, 0xdfff).ram();
map(0xe000, 0xe7ff).ram().w(m_palette, FUNC(palette_device::write8)).share("palette");
map(0xf000, 0xf7ff).bankr(m_subbank);
map(0xf800, 0xfbff).ram().share("share1");
map(0xfc00, 0xfc00).w(FUNC(wc90_state::bankswitch1_w));
map(0xf800, 0xfbff).ram().share("main_sub");
map(0xfc00, 0xfc00).w(FUNC(wc90_state::sub_bankswitch_w));
map(0xfc01, 0xfc01).w("watchdog", FUNC(watchdog_timer_device::reset_w));
}
@ -125,7 +350,7 @@ void wc90_state::sound_map(address_map &map)
map(0xf000, 0xf7ff).ram();
map(0xf800, 0xf803).rw("ymsnd", FUNC(ym2608_device::read), FUNC(ym2608_device::write));
map(0xfc00, 0xfc00).noprw(); // IRQ acknowledge? (data read and immediately written back)
map(0xfc10, 0xfc10).r(m_soundlatch, FUNC(generic_latch_8_device::read));
map(0xfc10, 0xfc10).r("soundlatch", FUNC(generic_latch_8_device::read));
}
@ -196,11 +421,11 @@ static INPUT_PORTS_START( wc90 )
PORT_DIPSETTING( 0x10, "4:00" )
PORT_DIPSETTING( 0x00, "5:00" )
/* the following 3 switches are listed as "don't touch" */
// the following 3 switches are listed as "don't touch"
PORT_DIPUNUSED_DIPLOC( 0x20, 0x20, "SW2:3" )
PORT_DIPUNUSED_DIPLOC( 0x40, 0x40, "SW2:2" )
PORT_DIPNAME( 0x80, 0x00, DEF_STR( Language ) ) PORT_DIPLOCATION("SW2:1")
PORT_DIPSETTING( 0x00, DEF_STR( English ) ) /* ON by default */
PORT_DIPSETTING( 0x00, DEF_STR( English ) ) // ON by default
PORT_DIPSETTING( 0x80, DEF_STR( Japanese ) )
PORT_START("SYSTEM")
@ -291,18 +516,6 @@ static INPUT_PORTS_START( pac90 )
INPUT_PORTS_END
static const gfx_layout charlayout =
{
8,8,
RGN_FRAC(1,1),
4,
{ 0, 1, 2, 3 },
{ 0*4, 1*4, 2*4, 3*4, 4*4, 5*4, 6*4, 7*4 },
{ 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 },
32*8
};
static const gfx_layout tilelayout =
{
16,16,
@ -330,10 +543,10 @@ static const gfx_layout spritelayout8 =
static GFXDECODE_START( gfx_wc90 )
GFXDECODE_ENTRY( "gfx1", 0x00000, charlayout, 1*16*16, 16*16 )
GFXDECODE_ENTRY( "gfx2", 0x00000, tilelayout, 2*16*16, 16*16 )
GFXDECODE_ENTRY( "gfx3", 0x00000, tilelayout, 3*16*16, 16*16 )
GFXDECODE_ENTRY( "gfx4", 0x00000, spritelayout8, 0*16*16, 16*16 )
GFXDECODE_ENTRY( "chars", 0x00000, gfx_8x8x4_packed_msb, 1*16*16, 16*16 )
GFXDECODE_ENTRY( "tiles1_2", 0x00000, tilelayout, 2*16*16, 16*16 )
GFXDECODE_ENTRY( "tiles3_4", 0x00000, tilelayout, 3*16*16, 16*16 )
GFXDECODE_ENTRY( "sprites", 0x00000, spritelayout8, 0*16*16, 16*16 )
GFXDECODE_END
@ -346,24 +559,24 @@ void wc90_state::machine_start()
void wc90_state::wc90(machine_config &config)
{
/* basic machine hardware */
Z80(config, m_maincpu, XTAL(8'000'000)); /* verified on pcb */
m_maincpu->set_addrmap(AS_PROGRAM, &wc90_state::wc90_map_1);
// basic machine hardware
Z80(config, m_maincpu, XTAL(8'000'000)); // verified on PCB
m_maincpu->set_addrmap(AS_PROGRAM, &wc90_state::main_map);
m_maincpu->set_vblank_int("screen", FUNC(wc90_state::irq0_line_hold));
z80_device &sub(Z80(config, "sub", XTAL(8'000'000))); /* verified on pcb */
sub.set_addrmap(AS_PROGRAM, &wc90_state::wc90_map_2);
z80_device &sub(Z80(config, "sub", XTAL(8'000'000))); // verified on PCB
sub.set_addrmap(AS_PROGRAM, &wc90_state::sub_map);
sub.set_vblank_int("screen", FUNC(wc90_state::irq0_line_hold));
Z80(config, m_audiocpu, XTAL(8'000'000)/2); /* verified on pcb */
Z80(config, m_audiocpu, XTAL(8'000'000)/2); // verified on PCB
m_audiocpu->set_addrmap(AS_PROGRAM, &wc90_state::sound_map);
/* NMIs are triggered by the main CPU */
// NMIs are triggered by the main CPU
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
// video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(59.17); /* verified on pcb */
screen.set_refresh_hz(59.17); // verified on PCB
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
screen.set_size(32*8, 32*8);
screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
@ -375,13 +588,12 @@ void wc90_state::wc90(machine_config &config)
TECMO_SPRITE(config, m_sprgen, 0);
/* sound hardware */
// sound hardware
SPEAKER(config, "mono").front_center();
GENERIC_LATCH_8(config, m_soundlatch);
m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI);
GENERIC_LATCH_8(config, "soundlatch").data_pending_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI);
ym2608_device &ymsnd(YM2608(config, "ymsnd", XTAL(8'000'000))); /* verified on pcb */
ym2608_device &ymsnd(YM2608(config, "ymsnd", XTAL(8'000'000))); // verified on PCB
ymsnd.irq_handler().set_inputline("audiocpu", 0);
ymsnd.add_route(0, "mono", 0.50);
ymsnd.add_route(1, "mono", 1.0);
@ -391,7 +603,7 @@ void wc90_state::wc90(machine_config &config)
void wc90_state::wc90t(machine_config &config)
{
wc90(config);
MCFG_VIDEO_START_OVERRIDE(wc90_state, wc90t )
MCFG_VIDEO_START_OVERRIDE(wc90_state, wc90t)
}
void wc90_state::pac90(machine_config &config)
@ -403,166 +615,166 @@ void wc90_state::pac90(machine_config &config)
ROM_START( twcup90 )
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_LOAD( "ic87_01.bin", 0x00000, 0x08000, CRC(4a1affbc) SHA1(bc531e97ca31c66fdac194e2d79d5c6ba1300556) ) /* c000-ffff is not used */
ROM_LOAD( "ic95_02.bin", 0x10000, 0x10000, CRC(847d439c) SHA1(eade31050da9e84feb4406e327d050a7496871b7) ) /* banked at f000-f7ff */
ROM_LOAD( "ic87_01.bin", 0x00000, 0x08000, CRC(4a1affbc) SHA1(bc531e97ca31c66fdac194e2d79d5c6ba1300556) ) // c000-ffff is not used
ROM_LOAD( "ic95_02.bin", 0x10000, 0x10000, CRC(847d439c) SHA1(eade31050da9e84feb4406e327d050a7496871b7) ) // banked at f000-f7ff
ROM_REGION( 0x20000, "sub", 0 ) /* Second CPU */
ROM_LOAD( "ic67_04.bin", 0x00000, 0x10000, CRC(dc6eaf00) SHA1(d53924070a59eee35dc0e6465702e4f04e61a073) ) /* c000-ffff is not used */
ROM_LOAD( "ic56_03.bin", 0x10000, 0x10000, CRC(1ac02b3b) SHA1(4f8dc049d404072150342f3c2df04789a73ce244) ) /* banked at f000-f7ff */
ROM_REGION( 0x20000, "sub", 0 )
ROM_LOAD( "ic67_04.bin", 0x00000, 0x10000, CRC(dc6eaf00) SHA1(d53924070a59eee35dc0e6465702e4f04e61a073) ) // c000-ffff is not used
ROM_LOAD( "ic56_03.bin", 0x10000, 0x10000, CRC(1ac02b3b) SHA1(4f8dc049d404072150342f3c2df04789a73ce244) ) // banked at f000-f7ff
ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "ic54_05.bin", 0x00000, 0x10000, CRC(27c348b3) SHA1(cf19ff4ae4f323ae3e5a905249b7af8ae342202a) )
ROM_REGION( 0x010000, "gfx1", 0 )
ROM_LOAD( "ic85_07v.bin", 0x00000, 0x10000, CRC(c5219426) SHA1(95e21fcd7de7d418ec287ae7087f6244c6bce5a8) ) /* characters */
ROM_REGION( 0x010000, "chars", 0 )
ROM_LOAD( "ic85_07v.bin", 0x00000, 0x10000, CRC(c5219426) SHA1(95e21fcd7de7d418ec287ae7087f6244c6bce5a8) )
ROM_REGION( 0x040000, "gfx2", 0 )
ROM_LOAD( "ic86_08v.bin", 0x00000, 0x20000, CRC(8fa1a1ff) SHA1(ce624617ac8c8b54e41294cf5dca7a09c91f53ba) ) /* tiles #1 */
ROM_LOAD( "ic90_09v.bin", 0x20000, 0x20000, CRC(99f8841c) SHA1(1969b4d78ca00924a7550826e1c4f4fa0588ef02) ) /* tiles #2 */
ROM_REGION( 0x040000, "tiles1_2", 0 )
ROM_LOAD( "ic86_08v.bin", 0x00000, 0x20000, CRC(8fa1a1ff) SHA1(ce624617ac8c8b54e41294cf5dca7a09c91f53ba) )
ROM_LOAD( "ic90_09v.bin", 0x20000, 0x20000, CRC(99f8841c) SHA1(1969b4d78ca00924a7550826e1c4f4fa0588ef02) )
ROM_REGION( 0x040000, "gfx3", 0 )
ROM_LOAD( "ic87_10v.bin", 0x00000, 0x20000, CRC(8232093d) SHA1(59bf9c9a858b47326cf0c64b1ee6ac727a15a20b) ) /* tiles #3 */
ROM_LOAD( "ic91_11v.bin", 0x20000, 0x20000, CRC(188d3789) SHA1(35654a99a20735bae09b32f74255f8132dee9af2) ) /* tiles #4 */
ROM_REGION( 0x040000, "tiles3_4", 0 )
ROM_LOAD( "ic87_10v.bin", 0x00000, 0x20000, CRC(8232093d) SHA1(59bf9c9a858b47326cf0c64b1ee6ac727a15a20b) )
ROM_LOAD( "ic91_11v.bin", 0x20000, 0x20000, CRC(188d3789) SHA1(35654a99a20735bae09b32f74255f8132dee9af2) )
ROM_REGION( 0x080000, "gfx4", 0 )
ROM_LOAD( "ic50_12v.bin", 0x00000, 0x20000, CRC(da1fe922) SHA1(5184053c2b7dd2bf1cd2e9f783686f2c0db7e47b) ) /* sprites */
ROM_LOAD( "ic54_13v.bin", 0x20000, 0x20000, CRC(9ad03c2c) SHA1(1c1947f9b51a58002e9992fc7c0c1a1c59b4d740) ) /* sprites */
ROM_LOAD( "ic60_14v.bin", 0x40000, 0x20000, CRC(499dfb1b) SHA1(ac67985d36fea18c82a4ea00019d9e6e4bcb5d0d) ) /* sprites */
ROM_LOAD( "ic65_15v.bin", 0x60000, 0x20000, CRC(d8ea5c81) SHA1(ccb3f7d565b1c1b8e874a2df91cda40dde2962ed) ) /* sprites */
ROM_REGION( 0x080000, "sprites", 0 )
ROM_LOAD( "ic50_12v.bin", 0x00000, 0x20000, CRC(da1fe922) SHA1(5184053c2b7dd2bf1cd2e9f783686f2c0db7e47b) )
ROM_LOAD( "ic54_13v.bin", 0x20000, 0x20000, CRC(9ad03c2c) SHA1(1c1947f9b51a58002e9992fc7c0c1a1c59b4d740) )
ROM_LOAD( "ic60_14v.bin", 0x40000, 0x20000, CRC(499dfb1b) SHA1(ac67985d36fea18c82a4ea00019d9e6e4bcb5d0d) )
ROM_LOAD( "ic65_15v.bin", 0x60000, 0x20000, CRC(d8ea5c81) SHA1(ccb3f7d565b1c1b8e874a2df91cda40dde2962ed) )
ROM_REGION( 0x20000, "ymsnd", 0 ) /* 64k for ADPCM samples */
ROM_REGION( 0x20000, "ymsnd", 0 )
ROM_LOAD( "ic82_06.bin", 0x00000, 0x20000, CRC(2fd692ed) SHA1(0273dc39181504320bec0187d074b2f86c821508) )
ROM_END
ROM_START( twcup90a )
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_LOAD( "wc90-1.bin", 0x00000, 0x08000, CRC(d1804e1a) SHA1(eec7374f4d23c89843f38fffff436635adb43b63) ) /* c000-ffff is not used */
ROM_LOAD( "ic95_02.bin", 0x10000, 0x10000, CRC(847d439c) SHA1(eade31050da9e84feb4406e327d050a7496871b7) ) /* banked at f000-f7ff */
ROM_LOAD( "wc90-1.bin", 0x00000, 0x08000, CRC(d1804e1a) SHA1(eec7374f4d23c89843f38fffff436635adb43b63) ) // c000-ffff is not used
ROM_LOAD( "ic95_02.bin", 0x10000, 0x10000, CRC(847d439c) SHA1(eade31050da9e84feb4406e327d050a7496871b7) ) // banked at f000-f7ff
ROM_REGION( 0x20000, "sub", 0 ) /* Second CPU */
ROM_LOAD( "ic67_04.bin", 0x00000, 0x10000, CRC(dc6eaf00) SHA1(d53924070a59eee35dc0e6465702e4f04e61a073) ) /* c000-ffff is not used */
ROM_LOAD( "ic56_03.bin", 0x10000, 0x10000, CRC(1ac02b3b) SHA1(4f8dc049d404072150342f3c2df04789a73ce244) ) /* banked at f000-f7ff */
ROM_REGION( 0x20000, "sub", 0 )
ROM_LOAD( "ic67_04.bin", 0x00000, 0x10000, CRC(dc6eaf00) SHA1(d53924070a59eee35dc0e6465702e4f04e61a073) ) // c000-ffff is not used
ROM_LOAD( "ic56_03.bin", 0x10000, 0x10000, CRC(1ac02b3b) SHA1(4f8dc049d404072150342f3c2df04789a73ce244) ) // banked at f000-f7ff
ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "ic54_05.bin", 0x00000, 0x10000, CRC(27c348b3) SHA1(cf19ff4ae4f323ae3e5a905249b7af8ae342202a) )
ROM_REGION( 0x010000, "gfx1", 0 )
ROM_LOAD( "ic85_07v.bin", 0x00000, 0x10000, CRC(c5219426) SHA1(95e21fcd7de7d418ec287ae7087f6244c6bce5a8) ) /* characters */
ROM_REGION( 0x010000, "chars", 0 )
ROM_LOAD( "ic85_07v.bin", 0x00000, 0x10000, CRC(c5219426) SHA1(95e21fcd7de7d418ec287ae7087f6244c6bce5a8) )
ROM_REGION( 0x040000, "gfx2", 0 )
ROM_LOAD( "ic86_08v.bin", 0x00000, 0x20000, CRC(8fa1a1ff) SHA1(ce624617ac8c8b54e41294cf5dca7a09c91f53ba) ) /* tiles #1 */
ROM_LOAD( "ic90_09v.bin", 0x20000, 0x20000, CRC(99f8841c) SHA1(1969b4d78ca00924a7550826e1c4f4fa0588ef02) ) /* tiles #2 */
ROM_REGION( 0x040000, "tiles1_2", 0 )
ROM_LOAD( "ic86_08v.bin", 0x00000, 0x20000, CRC(8fa1a1ff) SHA1(ce624617ac8c8b54e41294cf5dca7a09c91f53ba) )
ROM_LOAD( "ic90_09v.bin", 0x20000, 0x20000, CRC(99f8841c) SHA1(1969b4d78ca00924a7550826e1c4f4fa0588ef02) )
ROM_REGION( 0x040000, "gfx3", 0 )
ROM_LOAD( "ic87_10v.bin", 0x00000, 0x20000, CRC(8232093d) SHA1(59bf9c9a858b47326cf0c64b1ee6ac727a15a20b) ) /* tiles #3 */
ROM_LOAD( "ic91_11v.bin", 0x20000, 0x20000, CRC(188d3789) SHA1(35654a99a20735bae09b32f74255f8132dee9af2) ) /* tiles #4 */
ROM_REGION( 0x040000, "tiles3_4", 0 )
ROM_LOAD( "ic87_10v.bin", 0x00000, 0x20000, CRC(8232093d) SHA1(59bf9c9a858b47326cf0c64b1ee6ac727a15a20b) )
ROM_LOAD( "ic91_11v.bin", 0x20000, 0x20000, CRC(188d3789) SHA1(35654a99a20735bae09b32f74255f8132dee9af2) )
ROM_REGION( 0x080000, "gfx4", 0 )
ROM_LOAD( "ic50_12v.bin", 0x00000, 0x20000, CRC(da1fe922) SHA1(5184053c2b7dd2bf1cd2e9f783686f2c0db7e47b) ) /* sprites */
ROM_LOAD( "ic54_13v.bin", 0x20000, 0x20000, CRC(9ad03c2c) SHA1(1c1947f9b51a58002e9992fc7c0c1a1c59b4d740) ) /* sprites */
ROM_LOAD( "ic60_14v.bin", 0x40000, 0x20000, CRC(499dfb1b) SHA1(ac67985d36fea18c82a4ea00019d9e6e4bcb5d0d) ) /* sprites */
ROM_LOAD( "ic65_15v.bin", 0x60000, 0x20000, CRC(d8ea5c81) SHA1(ccb3f7d565b1c1b8e874a2df91cda40dde2962ed) ) /* sprites */
ROM_REGION( 0x080000, "sprites", 0 )
ROM_LOAD( "ic50_12v.bin", 0x00000, 0x20000, CRC(da1fe922) SHA1(5184053c2b7dd2bf1cd2e9f783686f2c0db7e47b) )
ROM_LOAD( "ic54_13v.bin", 0x20000, 0x20000, CRC(9ad03c2c) SHA1(1c1947f9b51a58002e9992fc7c0c1a1c59b4d740) )
ROM_LOAD( "ic60_14v.bin", 0x40000, 0x20000, CRC(499dfb1b) SHA1(ac67985d36fea18c82a4ea00019d9e6e4bcb5d0d) )
ROM_LOAD( "ic65_15v.bin", 0x60000, 0x20000, CRC(d8ea5c81) SHA1(ccb3f7d565b1c1b8e874a2df91cda40dde2962ed) )
ROM_REGION( 0x20000, "ymsnd", 0 ) /* 64k for ADPCM samples */
ROM_REGION( 0x20000, "ymsnd", 0 )
ROM_LOAD( "ic82_06.bin", 0x00000, 0x20000, CRC(2fd692ed) SHA1(0273dc39181504320bec0187d074b2f86c821508) )
ROM_END
ROM_START( twcup90b )
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_LOAD( "ic87-1b.bin", 0x00000, 0x08000, CRC(d024a971) SHA1(856c6ab7abc1cd6db42703f70930b84e3da69db0) ) /* c000-ffff is not used */
ROM_LOAD( "ic95_02.bin", 0x10000, 0x10000, CRC(847d439c) SHA1(eade31050da9e84feb4406e327d050a7496871b7) ) /* banked at f000-f7ff */
ROM_LOAD( "ic87-1b.bin", 0x00000, 0x08000, CRC(d024a971) SHA1(856c6ab7abc1cd6db42703f70930b84e3da69db0) ) // c000-ffff is not used
ROM_LOAD( "ic95_02.bin", 0x10000, 0x10000, CRC(847d439c) SHA1(eade31050da9e84feb4406e327d050a7496871b7) ) // banked at f000-f7ff
ROM_REGION( 0x20000, "sub", 0 ) /* Second CPU */
ROM_LOAD( "ic67_04.bin", 0x00000, 0x10000, CRC(dc6eaf00) SHA1(d53924070a59eee35dc0e6465702e4f04e61a073) ) /* c000-ffff is not used */
ROM_LOAD( "ic56_03.bin", 0x10000, 0x10000, CRC(1ac02b3b) SHA1(4f8dc049d404072150342f3c2df04789a73ce244) ) /* banked at f000-f7ff */
ROM_REGION( 0x20000, "sub", 0 )
ROM_LOAD( "ic67_04.bin", 0x00000, 0x10000, CRC(dc6eaf00) SHA1(d53924070a59eee35dc0e6465702e4f04e61a073) ) // c000-ffff is not used
ROM_LOAD( "ic56_03.bin", 0x10000, 0x10000, CRC(1ac02b3b) SHA1(4f8dc049d404072150342f3c2df04789a73ce244) ) // banked at f000-f7ff
ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "ic54_05.bin", 0x00000, 0x10000, CRC(27c348b3) SHA1(cf19ff4ae4f323ae3e5a905249b7af8ae342202a) )
ROM_REGION( 0x010000, "gfx1", 0 )
ROM_LOAD( "ic85_07v.bin", 0x00000, 0x10000, CRC(c5219426) SHA1(95e21fcd7de7d418ec287ae7087f6244c6bce5a8) ) /* characters */
ROM_REGION( 0x010000, "chars", 0 )
ROM_LOAD( "ic85_07v.bin", 0x00000, 0x10000, CRC(c5219426) SHA1(95e21fcd7de7d418ec287ae7087f6244c6bce5a8) )
ROM_REGION( 0x040000, "gfx2", 0 )
ROM_LOAD( "ic86_08v.bin", 0x00000, 0x20000, CRC(8fa1a1ff) SHA1(ce624617ac8c8b54e41294cf5dca7a09c91f53ba) ) /* tiles #1 */
ROM_LOAD( "ic90_09v.bin", 0x20000, 0x20000, CRC(99f8841c) SHA1(1969b4d78ca00924a7550826e1c4f4fa0588ef02) ) /* tiles #2 */
ROM_REGION( 0x040000, "tiles1_2", 0 )
ROM_LOAD( "ic86_08v.bin", 0x00000, 0x20000, CRC(8fa1a1ff) SHA1(ce624617ac8c8b54e41294cf5dca7a09c91f53ba) )
ROM_LOAD( "ic90_09v.bin", 0x20000, 0x20000, CRC(99f8841c) SHA1(1969b4d78ca00924a7550826e1c4f4fa0588ef02) )
ROM_REGION( 0x040000, "gfx3", 0 )
ROM_LOAD( "ic87_10v.bin", 0x00000, 0x20000, CRC(8232093d) SHA1(59bf9c9a858b47326cf0c64b1ee6ac727a15a20b) ) /* tiles #3 */
ROM_LOAD( "ic91_11v.bin", 0x20000, 0x20000, CRC(188d3789) SHA1(35654a99a20735bae09b32f74255f8132dee9af2) ) /* tiles #4 */
ROM_REGION( 0x040000, "tiles3_4", 0 )
ROM_LOAD( "ic87_10v.bin", 0x00000, 0x20000, CRC(8232093d) SHA1(59bf9c9a858b47326cf0c64b1ee6ac727a15a20b) )
ROM_LOAD( "ic91_11v.bin", 0x20000, 0x20000, CRC(188d3789) SHA1(35654a99a20735bae09b32f74255f8132dee9af2) )
ROM_REGION( 0x080000, "gfx4", 0 )
ROM_LOAD( "ic50_12v.bin", 0x00000, 0x20000, CRC(da1fe922) SHA1(5184053c2b7dd2bf1cd2e9f783686f2c0db7e47b) ) /* sprites */
ROM_LOAD( "ic54_13v.bin", 0x20000, 0x20000, CRC(9ad03c2c) SHA1(1c1947f9b51a58002e9992fc7c0c1a1c59b4d740) ) /* sprites */
ROM_LOAD( "ic60_14v.bin", 0x40000, 0x20000, CRC(499dfb1b) SHA1(ac67985d36fea18c82a4ea00019d9e6e4bcb5d0d) ) /* sprites */
ROM_LOAD( "ic65_15v.bin", 0x60000, 0x20000, CRC(d8ea5c81) SHA1(ccb3f7d565b1c1b8e874a2df91cda40dde2962ed) ) /* sprites */
ROM_REGION( 0x080000, "sprites", 0 )
ROM_LOAD( "ic50_12v.bin", 0x00000, 0x20000, CRC(da1fe922) SHA1(5184053c2b7dd2bf1cd2e9f783686f2c0db7e47b) )
ROM_LOAD( "ic54_13v.bin", 0x20000, 0x20000, CRC(9ad03c2c) SHA1(1c1947f9b51a58002e9992fc7c0c1a1c59b4d740) )
ROM_LOAD( "ic60_14v.bin", 0x40000, 0x20000, CRC(499dfb1b) SHA1(ac67985d36fea18c82a4ea00019d9e6e4bcb5d0d) )
ROM_LOAD( "ic65_15v.bin", 0x60000, 0x20000, CRC(d8ea5c81) SHA1(ccb3f7d565b1c1b8e874a2df91cda40dde2962ed) )
ROM_REGION( 0x20000, "ymsnd", 0 ) /* 64k for ADPCM samples */
ROM_REGION( 0x20000, "ymsnd", 0 )
ROM_LOAD( "ic82_06.bin", 0x00000, 0x20000, CRC(2fd692ed) SHA1(0273dc39181504320bec0187d074b2f86c821508) )
ROM_END
ROM_START( twcup90c ) // 2 PCB set: 6303 A and 6303 B. ic87_01 is very similar to the one in the twcup90a set.
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_LOAD( "ic87_01.bin", 0x00000, 0x08000, CRC(f588bb33) SHA1(46e90f145befd50be5ce0ffc05b00a034318a330) ) /* sldh, c000-ffff is not used */
ROM_LOAD( "ic95_02.bin", 0x10000, 0x10000, CRC(847d439c) SHA1(eade31050da9e84feb4406e327d050a7496871b7) ) /* banked at f000-f7ff */
ROM_LOAD( "ic87_01.bin", 0x00000, 0x08000, CRC(f588bb33) SHA1(46e90f145befd50be5ce0ffc05b00a034318a330) ) // sldh, c000-ffff is not used
ROM_LOAD( "ic95_02.bin", 0x10000, 0x10000, CRC(847d439c) SHA1(eade31050da9e84feb4406e327d050a7496871b7) ) // banked at f000-f7ff
ROM_REGION( 0x20000, "sub", 0 ) /* Second CPU */
ROM_LOAD( "ic67_04.bin", 0x00000, 0x10000, CRC(dc6eaf00) SHA1(d53924070a59eee35dc0e6465702e4f04e61a073) ) /* c000-ffff is not used */
ROM_LOAD( "ic56_03.bin", 0x10000, 0x10000, CRC(1ac02b3b) SHA1(4f8dc049d404072150342f3c2df04789a73ce244) ) /* banked at f000-f7ff */
ROM_REGION( 0x20000, "sub", 0 )
ROM_LOAD( "ic67_04.bin", 0x00000, 0x10000, CRC(dc6eaf00) SHA1(d53924070a59eee35dc0e6465702e4f04e61a073) ) // c000-ffff is not used
ROM_LOAD( "ic56_03.bin", 0x10000, 0x10000, CRC(1ac02b3b) SHA1(4f8dc049d404072150342f3c2df04789a73ce244) ) // banked at f000-f7ff
ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "ic54_05.bin", 0x00000, 0x10000, CRC(27c348b3) SHA1(cf19ff4ae4f323ae3e5a905249b7af8ae342202a) )
ROM_REGION( 0x010000, "gfx1", 0 )
ROM_LOAD( "ic85_07v.bin", 0x00000, 0x10000, CRC(c5219426) SHA1(95e21fcd7de7d418ec287ae7087f6244c6bce5a8) ) /* characters */
ROM_REGION( 0x010000, "chars", 0 )
ROM_LOAD( "ic85_07v.bin", 0x00000, 0x10000, CRC(c5219426) SHA1(95e21fcd7de7d418ec287ae7087f6244c6bce5a8) )
ROM_REGION( 0x040000, "gfx2", 0 )
ROM_LOAD( "ic86_08v.bin", 0x00000, 0x20000, CRC(8fa1a1ff) SHA1(ce624617ac8c8b54e41294cf5dca7a09c91f53ba) ) /* tiles #1 */
ROM_LOAD( "ic90_09v.bin", 0x20000, 0x20000, CRC(99f8841c) SHA1(1969b4d78ca00924a7550826e1c4f4fa0588ef02) ) /* tiles #2 */
ROM_REGION( 0x040000, "tiles1_2", 0 )
ROM_LOAD( "ic86_08v.bin", 0x00000, 0x20000, CRC(8fa1a1ff) SHA1(ce624617ac8c8b54e41294cf5dca7a09c91f53ba) )
ROM_LOAD( "ic90_09v.bin", 0x20000, 0x20000, CRC(99f8841c) SHA1(1969b4d78ca00924a7550826e1c4f4fa0588ef02) )
ROM_REGION( 0x040000, "gfx3", 0 )
ROM_LOAD( "ic87_10v.bin", 0x00000, 0x20000, CRC(8232093d) SHA1(59bf9c9a858b47326cf0c64b1ee6ac727a15a20b) ) /* tiles #3 */
ROM_LOAD( "ic91_11v.bin", 0x20000, 0x20000, CRC(188d3789) SHA1(35654a99a20735bae09b32f74255f8132dee9af2) ) /* tiles #4 */
ROM_REGION( 0x040000, "tiles3_4", 0 )
ROM_LOAD( "ic87_10v.bin", 0x00000, 0x20000, CRC(8232093d) SHA1(59bf9c9a858b47326cf0c64b1ee6ac727a15a20b) )
ROM_LOAD( "ic91_11v.bin", 0x20000, 0x20000, CRC(188d3789) SHA1(35654a99a20735bae09b32f74255f8132dee9af2) )
ROM_REGION( 0x080000, "gfx4", 0 )
ROM_LOAD( "ic50_12v.bin", 0x00000, 0x20000, CRC(da1fe922) SHA1(5184053c2b7dd2bf1cd2e9f783686f2c0db7e47b) ) /* sprites */
ROM_LOAD( "ic54_13v.bin", 0x20000, 0x20000, CRC(9ad03c2c) SHA1(1c1947f9b51a58002e9992fc7c0c1a1c59b4d740) ) /* sprites */
ROM_LOAD( "ic60_14v.bin", 0x40000, 0x20000, CRC(499dfb1b) SHA1(ac67985d36fea18c82a4ea00019d9e6e4bcb5d0d) ) /* sprites */
ROM_LOAD( "ic65_15v.bin", 0x60000, 0x20000, CRC(d8ea5c81) SHA1(ccb3f7d565b1c1b8e874a2df91cda40dde2962ed) ) /* sprites */
ROM_REGION( 0x080000, "sprites", 0 )
ROM_LOAD( "ic50_12v.bin", 0x00000, 0x20000, CRC(da1fe922) SHA1(5184053c2b7dd2bf1cd2e9f783686f2c0db7e47b) )
ROM_LOAD( "ic54_13v.bin", 0x20000, 0x20000, CRC(9ad03c2c) SHA1(1c1947f9b51a58002e9992fc7c0c1a1c59b4d740) )
ROM_LOAD( "ic60_14v.bin", 0x40000, 0x20000, CRC(499dfb1b) SHA1(ac67985d36fea18c82a4ea00019d9e6e4bcb5d0d) )
ROM_LOAD( "ic65_15v.bin", 0x60000, 0x20000, CRC(d8ea5c81) SHA1(ccb3f7d565b1c1b8e874a2df91cda40dde2962ed) )
ROM_REGION( 0x20000, "ymsnd", 0 ) /* 64k for ADPCM samples */
ROM_REGION( 0x20000, "ymsnd", 0 )
ROM_LOAD( "ic82_06.bin", 0x00000, 0x20000, CRC(2fd692ed) SHA1(0273dc39181504320bec0187d074b2f86c821508) )
ROM_END
ROM_START( twcup90t )
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_LOAD( "wc90a-1.bin", 0x00000, 0x08000, CRC(b6f51a68) SHA1(e0263dee35bf99cb4288a1df825bbbca17c85d36) ) /* c000-ffff is not used */
ROM_LOAD( "wc90a-2.bin", 0x10000, 0x10000, CRC(c50f2a98) SHA1(0fbeabadebfa75515d5e35bfcc565ecfa4d6e693) ) /* banked at f000-f7ff */
ROM_LOAD( "wc90a-1.bin", 0x00000, 0x08000, CRC(b6f51a68) SHA1(e0263dee35bf99cb4288a1df825bbbca17c85d36) ) // c000-ffff is not used
ROM_LOAD( "wc90a-2.bin", 0x10000, 0x10000, CRC(c50f2a98) SHA1(0fbeabadebfa75515d5e35bfcc565ecfa4d6e693) ) // banked at f000-f7ff
ROM_REGION( 0x20000, "sub", 0 ) /* Second CPU */
ROM_LOAD( "ic67_04.bin", 0x00000, 0x10000, CRC(dc6eaf00) SHA1(d53924070a59eee35dc0e6465702e4f04e61a073) ) /* c000-ffff is not used */
ROM_LOAD( "wc90a-3.bin", 0x10000, 0x10000, CRC(8c7a9542) SHA1(a06a7cd40d41692c4cc2a35d9c69b944c5baf163) ) /* banked at f000-f7ff */
ROM_REGION( 0x20000, "sub", 0 )
ROM_LOAD( "ic67_04.bin", 0x00000, 0x10000, CRC(dc6eaf00) SHA1(d53924070a59eee35dc0e6465702e4f04e61a073) ) // c000-ffff is not used
ROM_LOAD( "wc90a-3.bin", 0x10000, 0x10000, CRC(8c7a9542) SHA1(a06a7cd40d41692c4cc2a35d9c69b944c5baf163) ) // banked at f000-f7ff
ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "ic54_05.bin", 0x00000, 0x10000, CRC(27c348b3) SHA1(cf19ff4ae4f323ae3e5a905249b7af8ae342202a) )
ROM_REGION( 0x010000, "gfx1", 0 )
ROM_LOAD( "ic85_07v.bin", 0x00000, 0x10000, CRC(c5219426) SHA1(95e21fcd7de7d418ec287ae7087f6244c6bce5a8) ) /* characters */
ROM_REGION( 0x010000, "chars", 0 )
ROM_LOAD( "ic85_07v.bin", 0x00000, 0x10000, CRC(c5219426) SHA1(95e21fcd7de7d418ec287ae7087f6244c6bce5a8) )
ROM_REGION( 0x040000, "gfx2", 0 )
ROM_LOAD( "ic86_08v.bin", 0x00000, 0x20000, CRC(8fa1a1ff) SHA1(ce624617ac8c8b54e41294cf5dca7a09c91f53ba) ) /* tiles #1 */
ROM_LOAD( "ic90_09v.bin", 0x20000, 0x20000, CRC(99f8841c) SHA1(1969b4d78ca00924a7550826e1c4f4fa0588ef02) ) /* tiles #2 */
ROM_REGION( 0x040000, "tiles1_2", 0 )
ROM_LOAD( "ic86_08v.bin", 0x00000, 0x20000, CRC(8fa1a1ff) SHA1(ce624617ac8c8b54e41294cf5dca7a09c91f53ba) )
ROM_LOAD( "ic90_09v.bin", 0x20000, 0x20000, CRC(99f8841c) SHA1(1969b4d78ca00924a7550826e1c4f4fa0588ef02) )
ROM_REGION( 0x040000, "gfx3", 0 )
ROM_LOAD( "ic87_10v.bin", 0x00000, 0x20000, CRC(8232093d) SHA1(59bf9c9a858b47326cf0c64b1ee6ac727a15a20b) ) /* tiles #3 */
ROM_LOAD( "ic91_11v.bin", 0x20000, 0x20000, CRC(188d3789) SHA1(35654a99a20735bae09b32f74255f8132dee9af2) ) /* tiles #4 */
ROM_REGION( 0x040000, "tiles3_4", 0 )
ROM_LOAD( "ic87_10v.bin", 0x00000, 0x20000, CRC(8232093d) SHA1(59bf9c9a858b47326cf0c64b1ee6ac727a15a20b) )
ROM_LOAD( "ic91_11v.bin", 0x20000, 0x20000, CRC(188d3789) SHA1(35654a99a20735bae09b32f74255f8132dee9af2) )
ROM_REGION( 0x080000, "gfx4", 0 )
ROM_LOAD( "ic50_12v.bin", 0x00000, 0x20000, CRC(da1fe922) SHA1(5184053c2b7dd2bf1cd2e9f783686f2c0db7e47b) ) /* sprites */
ROM_LOAD( "ic54_13v.bin", 0x20000, 0x20000, CRC(9ad03c2c) SHA1(1c1947f9b51a58002e9992fc7c0c1a1c59b4d740) ) /* sprites */
ROM_LOAD( "ic60_14v.bin", 0x40000, 0x20000, CRC(499dfb1b) SHA1(ac67985d36fea18c82a4ea00019d9e6e4bcb5d0d) ) /* sprites */
ROM_LOAD( "ic65_15v.bin", 0x60000, 0x20000, CRC(d8ea5c81) SHA1(ccb3f7d565b1c1b8e874a2df91cda40dde2962ed) ) /* sprites */
ROM_REGION( 0x080000, "sprites", 0 )
ROM_LOAD( "ic50_12v.bin", 0x00000, 0x20000, CRC(da1fe922) SHA1(5184053c2b7dd2bf1cd2e9f783686f2c0db7e47b) )
ROM_LOAD( "ic54_13v.bin", 0x20000, 0x20000, CRC(9ad03c2c) SHA1(1c1947f9b51a58002e9992fc7c0c1a1c59b4d740) )
ROM_LOAD( "ic60_14v.bin", 0x40000, 0x20000, CRC(499dfb1b) SHA1(ac67985d36fea18c82a4ea00019d9e6e4bcb5d0d) )
ROM_LOAD( "ic65_15v.bin", 0x60000, 0x20000, CRC(d8ea5c81) SHA1(ccb3f7d565b1c1b8e874a2df91cda40dde2962ed) )
ROM_REGION( 0x20000, "ymsnd", 0 ) /* 64k for ADPCM samples */
ROM_REGION( 0x20000, "ymsnd", 0 )
ROM_LOAD( "ic82_06.bin", 0x00000, 0x20000, CRC(2fd692ed) SHA1(0273dc39181504320bec0187d074b2f86c821508) )
ROM_END
@ -570,32 +782,34 @@ ROM_START( pac90 )
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_LOAD( "rom1.ic87", 0x00000, 0x08000, CRC(8af34306) SHA1(1a98adca74f46da36e3648d37bfcb56a328a031e) )
ROM_REGION( 0x20000, "sub", ROMREGION_ERASE00 ) /* Second CPU */
ROM_REGION( 0x20000, "sub", ROMREGION_ERASE00 )
ROM_LOAD( "rom2.ic67", 0x00000, 0x10000, CRC(bc9bfdf2) SHA1(869e4012e5c577e501143cbfd75cce8cef919c86) )
ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "rom3.ic54", 0x00000, 0x10000, CRC(1c4d17fd) SHA1(5abebf867de452cc3e85331e91b9110c26a8b050) )
ROM_REGION( 0x010000, "gfx1", 0 )
ROM_REGION( 0x010000, "chars", 0 )
ROM_LOAD( "char.ic85", 0x00000, 0x10000, CRC(70941a50) SHA1(283583743c21774d0097dc935ae7bc7009b5b633) )
// char.ic85 CRC32 0b906dae SHA1 0d14d6a7bbe0b8772143afb4c6c94c62313e4b9c <-- An alternate version...
ROM_REGION( 0x040000, "gfx2", ROMREGION_ERASE00 )
//ROM_LOAD( "ic86_08v.bin", 0x00000, 0x20000, CRC(8fa1a1ff) SHA1(ce624617ac8c8b54e41294cf5dca7a09c91f53ba) ) /* tiles #1 */
//ROM_LOAD( "ic90_09v.bin", 0x20000, 0x20000, CRC(99f8841c) SHA1(1969b4d78ca00924a7550826e1c4f4fa0588ef02) ) /* tiles #2 */
ROM_REGION( 0x040000, "tiles1_2", ROMREGION_ERASE00 )
//ROM_LOAD( "ic86_08v.bin", 0x00000, 0x20000, CRC(8fa1a1ff) SHA1(ce624617ac8c8b54e41294cf5dca7a09c91f53ba) )
//ROM_LOAD( "ic90_09v.bin", 0x20000, 0x20000, CRC(99f8841c) SHA1(1969b4d78ca00924a7550826e1c4f4fa0588ef02) )
ROM_REGION( 0x040000, "gfx3", ROMREGION_ERASE00 )
//ROM_LOAD( "ic87_10v.bin", 0x00000, 0x20000, CRC(8232093d) SHA1(59bf9c9a858b47326cf0c64b1ee6ac727a15a20b) ) /* tiles #3 */
//ROM_LOAD( "ic91_11v.bin", 0x20000, 0x20000, CRC(188d3789) SHA1(35654a99a20735bae09b32f74255f8132dee9af2) ) /* tiles #4 */
ROM_REGION( 0x040000, "tiles3_4", ROMREGION_ERASE00 )
//ROM_LOAD( "ic87_10v.bin", 0x00000, 0x20000, CRC(8232093d) SHA1(59bf9c9a858b47326cf0c64b1ee6ac727a15a20b) )
//ROM_LOAD( "ic91_11v.bin", 0x20000, 0x20000, CRC(188d3789) SHA1(35654a99a20735bae09b32f74255f8132dee9af2) )
ROM_REGION( 0x080000, "gfx4", ROMREGION_ERASE00 )
ROM_LOAD( "sprite1.ic50", 0x00000, 0x10000, CRC(190852ea) SHA1(fad7eb3aa53d03917173dd5a040655cfd329db32) ) /* sprites */
ROM_LOAD( "sprite2.ic60", 0x40000, 0x10000, CRC(33effbea) SHA1(dbf6b735f3c8bacb695caf5d15ac8b7961bffc74) ) /* sprites */
ROM_REGION( 0x080000, "sprites", ROMREGION_ERASE00 )
ROM_LOAD( "sprite1.ic50", 0x00000, 0x10000, CRC(190852ea) SHA1(fad7eb3aa53d03917173dd5a040655cfd329db32) )
ROM_LOAD( "sprite2.ic60", 0x40000, 0x10000, CRC(33effbea) SHA1(dbf6b735f3c8bacb695caf5d15ac8b7961bffc74) )
ROM_REGION( 0x20000, "ymsnd", ROMREGION_ERASE00 ) /* 64k for ADPCM samples */
ROM_REGION( 0x20000, "ymsnd", ROMREGION_ERASE00 )
ROM_LOAD( "voice.ic82", 0x00000, 0x10000, CRC(abc61f3d) SHA1(c6f123d16a26c4d77c635617dd97bb4b906c463a) )
ROM_END
} // anonymous namespace
GAME( 1989, twcup90, 0, wc90, wc90, wc90_state, empty_init, ROT0, "Tecmo", "Tecmo World Cup '90 (World set 1)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1989, twcup90a, twcup90, wc90, wc90, wc90_state, empty_init, ROT0, "Tecmo", "Tecmo World Cup '90 (Euro set 1)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )

View File

@ -67,13 +67,13 @@ to the crappy artwork of the person that did the bootleg.
Dip switches are not complete and they don't seem to differ from
the original machine.
Last but not least, the set of ROMs i have for Euro League seem to have
Last but not least, the set of ROMs I have for Euro League seem to have
the sprites corrupted. The game seems to be exactly the same as the
World Cup 90 bootleg.
Noted added by ClawGrip 28-Mar-2008:
-----------------------------------
-Dumped and added the all the PCB GALs.
-Dumped and added all the PCB GALs.
-Removed the second YM2203, Ernesto said it wasn't present on his board,
and also isn't on mine.
-My PCB has a different ROM (a05.bin), but only two bytes are different.
@ -85,41 +85,350 @@ Noted added by ClawGrip 28-Mar-2008:
*/
#include "emu.h"
#include "includes/wc90b.h"
#include "cpu/z80/z80.h"
#include "machine/gen_latch.h"
#include "sound/msm5205.h"
#include "sound/ymopn.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
#include "tilemap.h"
#define TEST_DIPS false /* enable to test unmapped dip switches */
namespace {
#define MASTER_CLOCK XTAL(14'318'181)/2
#define SOUND_CLOCK XTAL(20'000'000)/4
#define YM2203_CLOCK XTAL(20'000'000)/16
#define MSM5205_CLOCK XTAL(384'000)
class wc90b_state : public driver_device
{
public:
wc90b_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_subcpu(*this, "sub"),
m_audiocpu(*this, "audiocpu"),
m_msm(*this, "msm"),
m_palette(*this, "palette"),
m_gfxdecode(*this, "gfxdecode"),
m_fgvideoram(*this, "fgvideoram"),
m_bgvideoram(*this, "bgvideoram"),
m_txvideoram(*this, "txvideoram"),
m_spriteram(*this, "spriteram"),
m_mainbank(*this, "mainbank"),
m_subbank(*this, "subbank"),
m_audiobank(*this, "audiobank"),
m_scrollx(*this, "scrollx%u", 1U),
m_scrolly(*this, "scrolly%u", 1U),
m_scroll_x_lo(*this, "scroll_x_lo")
{ }
void wc90b(machine_config &config);
void eurogael(machine_config &config);
void init_wc90b();
protected:
virtual void machine_start() override;
virtual void video_start() override;
tilemap_t *m_tx_tilemap;
tilemap_t *m_fg_tilemap;
tilemap_t *m_bg_tilemap;
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_subcpu;
required_device<cpu_device> m_audiocpu;
required_device<msm5205_device> m_msm;
required_device<palette_device> m_palette;
required_device<gfxdecode_device> m_gfxdecode;
required_shared_ptr<uint8_t> m_fgvideoram;
required_shared_ptr<uint8_t> m_bgvideoram;
required_shared_ptr<uint8_t> m_txvideoram;
required_shared_ptr<uint8_t> m_spriteram;
required_memory_bank m_mainbank;
required_memory_bank m_subbank;
required_memory_bank m_audiobank;
void bgvideoram_w(offs_t offset, uint8_t data);
void fgvideoram_w(offs_t offset, uint8_t data);
void txvideoram_w(offs_t offset, uint8_t data);
void bankswitch_w(uint8_t data);
DECLARE_WRITE_LINE_MEMBER(adpcm_int);
void sound_map(address_map &map);
void sub_map(address_map &map);
virtual uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
virtual void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, int priority);
private:
optional_shared_ptr_array<uint8_t, 2> m_scrollx;
optional_shared_ptr_array<uint8_t, 2> m_scrolly;
optional_shared_ptr<uint8_t> m_scroll_x_lo;
void main_map(address_map &map);
uint8_t m_msm5205next;
uint8_t m_toggle;
void sub_bankswitch_w(uint8_t data);
void adpcm_data_w(uint8_t data);
void adpcm_control_w(uint8_t data);
uint8_t master_irq_ack_r();
void slave_irq_ack_w(uint8_t data);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
TILE_GET_INFO_MEMBER(get_fg_tile_info);
TILE_GET_INFO_MEMBER(get_tx_tile_info);
};
class eurogael_state : public wc90b_state
{
public:
eurogael_state(const machine_config &mconfig, device_type type, const char *tag) :
wc90b_state(mconfig, type, tag),
m_bgscroll(*this, "bgscroll")
{ }
void eurogael(machine_config &config);
protected:
virtual uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) override;
virtual void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, int priority) override;
private:
void master_irq_ack_w(uint8_t data);
required_shared_ptr<uint8_t> m_bgscroll;
void main_map(address_map &map);
};
// video
/***************************************************************************
Callbacks for the TileMap code
***************************************************************************/
TILE_GET_INFO_MEMBER(wc90b_state::get_bg_tile_info)
{
int attr = m_bgvideoram[tile_index];
int tile = m_bgvideoram[tile_index + 0x800];
tileinfo.set(1,
((((attr & 3) + ((attr >> 1) & 4))) << 8) | tile | 0x800,
(attr >> 4) | 0x10,
0);
}
TILE_GET_INFO_MEMBER(wc90b_state::get_fg_tile_info)
{
int attr = m_fgvideoram[tile_index];
int tile = m_fgvideoram[tile_index + 0x800];
tileinfo.set(1,
((((attr & 3) + ((attr >> 1) & 4))) << 8) | tile,
attr >> 4,
0);
}
TILE_GET_INFO_MEMBER(wc90b_state::get_tx_tile_info)
{
tileinfo.set(0,
m_txvideoram[tile_index + 0x800] + ((m_txvideoram[tile_index] & 0x07) << 8),
m_txvideoram[tile_index] >> 4,
0);
}
/***************************************************************************
Start the video hardware emulation.
***************************************************************************/
void wc90b_state::video_start()
{
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(wc90b_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 16, 16, 64, 32);
m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(wc90b_state::get_fg_tile_info)), TILEMAP_SCAN_ROWS, 16, 16, 64, 32);
m_tx_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(wc90b_state::get_tx_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32);
m_fg_tilemap->set_transparent_pen(15);
m_tx_tilemap->set_transparent_pen(15);
}
/***************************************************************************
Memory handlers
***************************************************************************/
void wc90b_state::bgvideoram_w(offs_t offset, uint8_t data)
{
m_bgvideoram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset & 0x7ff);
}
void wc90b_state::fgvideoram_w(offs_t offset, uint8_t data)
{
m_fgvideoram[offset] = data;
m_fg_tilemap->mark_tile_dirty(offset & 0x7ff);
}
void wc90b_state::txvideoram_w(offs_t offset, uint8_t data)
{
m_txvideoram[offset] = data;
m_tx_tilemap->mark_tile_dirty(offset & 0x7ff);
}
/***************************************************************************
Display refresh
***************************************************************************/
void wc90b_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, int priority)
{
// draw all visible sprites of specified priority
for (int offs = m_spriteram.bytes() - 8 ; offs >= 0 ; offs -= 8)
{
if ((~(m_spriteram[offs + 3] >> 7 ) & 1) == priority)
{
// 0 bbbb bbff b = tile lower , f = flip bits
// 1 yyyy yyyy
// 2 xxxx xxxx
// 3 PXcc cccc P = priority X = x high, c = tile upper
// 4 pppp ---- palette
int tilehigh = (m_spriteram[offs + 3] & 0x3f) << 6;
int tilelow = m_spriteram[offs + 0];
int flags = m_spriteram[offs + 4];
tilehigh += (tilelow & 0xfc) >> 2;
int sx = m_spriteram[offs + 2];
if (!(m_spriteram[offs + 3] & 0x40)) sx -= 0x0100;
int sy = 240 - m_spriteram[offs + 1];
m_gfxdecode->gfx(2)->transpen(bitmap, cliprect, tilehigh,
flags >> 4, // color
tilelow & 1, // flipx
tilelow & 2, // flipy
sx,
sy, 15);
}
}
}
uint32_t wc90b_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_bg_tilemap->set_scrollx(0, 8 * (m_scrollx[1][0] & 0x7f) + 256 - 4 + (m_scroll_x_lo[0] & 0x07));
m_bg_tilemap->set_scrolly(0, m_scrolly[1][0] + 1 + ((m_scrollx[1][0] & 0x80) ? 256 : 0));
m_fg_tilemap->set_scrollx(0, 8 * (m_scrollx[0][0] & 0x7f) + 256 - 6 + ((m_scroll_x_lo[0] & 0x38) >> 3));
m_fg_tilemap->set_scrolly(0, m_scrolly[0][0] + 1 + ((m_scrollx[0][0] & 0x80) ? 256 : 0));
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
draw_sprites(bitmap, cliprect, 1);
m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
m_tx_tilemap->draw(screen, bitmap, cliprect, 0, 0);
// TODO: if scoring on same Y as GOAL message, ball will be above it. Might be a BTANB (or needs single pass draw + mix?)
draw_sprites(bitmap, cliprect, 0);
return 0;
}
void eurogael_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, int priority)
{
// draw all visible sprites of specified priority
// entry at start of RAM might not be a sprite
for (int offs = 0x200 - 4 ; offs >= 4 ; offs -= 4)
{
if (((m_spriteram[offs + 3] >> 4) & 1) == priority)
{
// this is wrong
// 0 bbbb bbbb b = tile lower
// 1 yyyy yyyy
// 2 xxxx xxxx
// 3 ffXP cccc f = flip bits, P = priority (inverted vs. other bootlegs) X = X high?, c = tile upper
// 0x200 ---- -ppp p = palette
int tilehigh = (m_spriteram[offs + 3] & 0x0f) << 8;
int attr = (m_spriteram[offs + 3] & 0xf0) >> 4;
int tilelow = m_spriteram[offs + 0];
int flags = m_spriteram[offs + 0x200];
tilehigh += tilelow;
int sx = m_spriteram[offs + 2];
if (!(attr & 0x02)) sx -= 0x0100;
int sy = 240 - m_spriteram[offs + 1];
m_gfxdecode->gfx(2)->transpen(bitmap, cliprect, tilehigh,
(flags & 0x7) | 8, // color - palettes 0x0 - 0x7 never written?
attr & 4, // flipx
attr & 8, // flipy
sx,
sy, 15);
}
}
}
uint32_t eurogael_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
// the code to write / clear tilemaps for fb and tx layers has been specifically modified to avoid writing to the last 4 bytes
// and the game instead writes scroll values there instead, there is no code to copy from there, so it looks like these are the scroll regs
// each of the 3 layer has its own PCB, all PCBs look identical, so why does handling differ slightly?
int fg_scrollx = ((m_fgvideoram[0xffc]) | (m_fgvideoram[0xffd] << 8)) + 33;
int fg_scrolly = ((m_fgvideoram[0xffe]) | (m_fgvideoram[0xfff] << 8)) + 1;
int bg_scrollx = ((m_bgscroll[0xf00]) | (m_bgscroll[0xf01] << 8)) + 33;
int bg_scrolly = ((m_bgscroll[0xf02]) | (m_bgscroll[0xf03] << 8)) + 1;
int tx_scrollx = ((m_txvideoram[0xffc]) | (m_txvideoram[0xffd] << 8)) + 33;
int tx_scrolly = ((m_txvideoram[0xffe]) | (m_txvideoram[0xfff] << 8)) + 1;
m_bg_tilemap->set_scrollx(0, bg_scrollx);
m_bg_tilemap->set_scrolly(0, bg_scrolly);
m_fg_tilemap->set_scrollx(0, fg_scrollx);
m_fg_tilemap->set_scrolly(0, fg_scrolly);
m_tx_tilemap->set_scrollx(0, tx_scrollx);
m_tx_tilemap->set_scrolly(0, tx_scrolly);
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
draw_sprites(bitmap, cliprect, 1);
m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
m_tx_tilemap->draw(screen, bitmap, cliprect, 0, 0);
draw_sprites(bitmap, cliprect, 0);
return 0;
}
// machine
void wc90b_state::bankswitch_w(uint8_t data)
{
membank("mainbank")->set_entry(data >> 3);
m_mainbank->set_entry(data >> 3);
}
void wc90b_state::bankswitch1_w(uint8_t data)
void wc90b_state::sub_bankswitch_w(uint8_t data)
{
membank("subbank")->set_entry(data >> 3);
}
void wc90b_state::sound_command_w(uint8_t data)
{
m_soundlatch->write(data);
m_audiocpu->set_input_line(0, HOLD_LINE);
m_subbank->set_entry(data >> 3);
}
void wc90b_state::adpcm_control_w(uint8_t data)
{
membank("audiobank")->set_entry(data & 0x01);
m_audiobank->set_entry(data & 0x01);
m_msm->reset_w(data & 0x08);
}
@ -130,32 +439,32 @@ void wc90b_state::adpcm_data_w(uint8_t data)
uint8_t wc90b_state::master_irq_ack_r()
{
m_maincpu->set_input_line(0,CLEAR_LINE);
m_maincpu->set_input_line(0, CLEAR_LINE);
return 0xff;
}
void wc90b_state::slave_irq_ack_w(uint8_t data)
{
m_subcpu->set_input_line(0,CLEAR_LINE);
m_subcpu->set_input_line(0, CLEAR_LINE);
}
void wc90b_state::wc90b_map1(address_map &map)
void wc90b_state::main_map(address_map &map)
{
map(0x0000, 0x7fff).rom();
map(0x8000, 0x9fff).ram(); /* Main RAM */
map(0xa000, 0xafff).ram().w(FUNC(wc90b_state::fgvideoram_w)).share("fgvideoram");
map(0xc000, 0xcfff).ram().w(FUNC(wc90b_state::bgvideoram_w)).share("bgvideoram");
map(0xe000, 0xefff).ram().w(FUNC(wc90b_state::txvideoram_w)).share("txvideoram");
map(0xf000, 0xf7ff).bankr("mainbank");
map(0xf800, 0xfbff).ram().share("share1");
map(0x8000, 0x9fff).ram(); // Main RAM
map(0xa000, 0xafff).ram().w(FUNC(wc90b_state::fgvideoram_w)).share(m_fgvideoram);
map(0xc000, 0xcfff).ram().w(FUNC(wc90b_state::bgvideoram_w)).share(m_bgvideoram);
map(0xe000, 0xefff).ram().w(FUNC(wc90b_state::txvideoram_w)).share(m_txvideoram);
map(0xf000, 0xf7ff).bankr(m_mainbank);
map(0xf800, 0xfbff).ram().share("main_sub");
map(0xfc00, 0xfc00).w(FUNC(wc90b_state::bankswitch_w));
map(0xfd00, 0xfd00).w(FUNC(wc90b_state::sound_command_w));
map(0xfd04, 0xfd04).writeonly().share("scroll1y");
map(0xfd06, 0xfd06).writeonly().share("scroll1x");
map(0xfd08, 0xfd08).writeonly().share("scroll2y");
map(0xfd0a, 0xfd0a).writeonly().share("scroll2x");
map(0xfd0e, 0xfd0e).writeonly().share("scroll_x_lo");
map(0xfd00, 0xfd00).w("soundlatch", FUNC(generic_latch_8_device::write));
map(0xfd04, 0xfd04).writeonly().share(m_scrolly[0]);
map(0xfd06, 0xfd06).writeonly().share(m_scrollx[0]);
map(0xfd08, 0xfd08).writeonly().share(m_scrolly[1]);
map(0xfd0a, 0xfd0a).writeonly().share(m_scrollx[1]);
map(0xfd0e, 0xfd0e).writeonly().share(m_scroll_x_lo);
map(0xfd00, 0xfd00).portr("P1");
map(0xfd02, 0xfd02).portr("P2");
map(0xfd06, 0xfd06).portr("DSW1");
@ -163,56 +472,56 @@ void wc90b_state::wc90b_map1(address_map &map)
map(0xfd0c, 0xfd0c).r(FUNC(wc90b_state::master_irq_ack_r));
}
void wc90b_state::wc90b_map2(address_map &map)
void wc90b_state::sub_map(address_map &map)
{
map(0x0000, 0xbfff).rom();
map(0xc000, 0xcfff).ram();
map(0xd000, 0xd7ff).ram().share("spriteram");
map(0xd000, 0xd7ff).ram().share(m_spriteram);
map(0xd800, 0xdfff).ram();
map(0xe000, 0xe7ff).ram().w(m_palette, FUNC(palette_device::write8)).share("palette");
map(0xe800, 0xefff).rom();
map(0xf000, 0xf7ff).bankr("subbank");
map(0xf800, 0xfbff).ram().share("share1");
map(0xfc00, 0xfc00).w(FUNC(wc90b_state::bankswitch1_w));
map(0xf000, 0xf7ff).bankr(m_subbank);
map(0xf800, 0xfbff).ram().share("main_sub");
map(0xfc00, 0xfc00).w(FUNC(wc90b_state::sub_bankswitch_w));
map(0xfd0c, 0xfd0c).w(FUNC(wc90b_state::slave_irq_ack_w));
}
void wc90b_state::sound_cpu(address_map &map)
void wc90b_state::sound_map(address_map &map)
{
map(0x0000, 0x7fff).rom();
map(0x8000, 0xbfff).bankr("audiobank");
map(0x8000, 0xbfff).bankr(m_audiobank);
map(0xe000, 0xe000).w(FUNC(wc90b_state::adpcm_control_w));
map(0xe400, 0xe400).w(FUNC(wc90b_state::adpcm_data_w));
map(0xe800, 0xe801).rw("ymsnd1", FUNC(ym2203_device::read), FUNC(ym2203_device::write));
map(0xec00, 0xec01).rw("ymsnd2", FUNC(ym2203_device::read), FUNC(ym2203_device::write));
map(0xf000, 0xf7ff).ram();
map(0xf800, 0xf800).r(m_soundlatch, FUNC(generic_latch_8_device::read));
map(0xf800, 0xf800).r("soundlatch", FUNC(generic_latch_8_device::read));
}
void eurogael_state::master_irq_ack_w(uint8_t data)
{
// this seems to be write based instead of read based
m_maincpu->set_input_line(0,CLEAR_LINE);
m_maincpu->set_input_line(0, CLEAR_LINE);
}
void eurogael_state::map1(address_map &map)
void eurogael_state::main_map(address_map &map)
{
map(0x0000, 0x7fff).rom();
map(0x8000, 0x9fff).ram(); /* Main RAM */
map(0xa000, 0xafff).ram().w(FUNC(wc90b_state::fgvideoram_w)).share("fgvideoram");
map(0xc000, 0xcfff).ram().w(FUNC(wc90b_state::bgvideoram_w)).share("bgvideoram");
map(0xd000, 0xdfff).ram().share("bgscroll"); // there are a bunch of read / write accesses in here (is it meant to mirror the bgram? - bg scroll regs are at df00 - df03
map(0xe000, 0xefff).ram().w(FUNC(wc90b_state::txvideoram_w)).share("txvideoram");
map(0xf000, 0xf7ff).bankr("mainbank");
map(0xf800, 0xfbff).ram().share("share1");
map(0xfc00, 0xfc00).w(FUNC(wc90b_state::bankswitch_w));
map(0x8000, 0x9fff).ram(); // Main RAM
map(0xa000, 0xafff).ram().w(FUNC(eurogael_state::fgvideoram_w)).share(m_fgvideoram);
map(0xc000, 0xcfff).ram().w(FUNC(eurogael_state::bgvideoram_w)).share(m_bgvideoram);
map(0xd000, 0xdfff).ram().share(m_bgscroll); // there are a bunch of read / write accesses in here (is it meant to mirror the bgram? - bg scroll regs are at df00 - df03
map(0xe000, 0xefff).ram().w(FUNC(eurogael_state::txvideoram_w)).share(m_txvideoram);
map(0xf000, 0xf7ff).bankr(m_mainbank);
map(0xf800, 0xfbff).ram().share("main_sub");
map(0xfc00, 0xfc00).w(FUNC(eurogael_state::bankswitch_w));
map(0xfd00, 0xfd00).portr("P1");
map(0xfd02, 0xfd02).portr("P2");
map(0xfd06, 0xfd06).portr("DSW1");
map(0xfd08, 0xfd08).portr("DSW2");
map(0xfd0c, 0xfd0c).w(FUNC(eurogael_state::master_irq_ack_w));
map(0xfd0e, 0xfd0e).w(FUNC(wc90b_state::sound_command_w));
map(0xfd0e, 0xfd0e).w("soundlatch", FUNC(generic_latch_8_device::write));
}
@ -298,32 +607,32 @@ INPUT_PORTS_END
static const gfx_layout charlayout =
{
8,8, /* 8*8 characters */
RGN_FRAC(1,4), /* 2048 characters */
4, /* 4 bits per pixel */
{ RGN_FRAC(0,4), RGN_FRAC(1,4), RGN_FRAC(2,4), RGN_FRAC(3,4) }, /* the bitplanes are separated */
8,8, // 8*8 characters
RGN_FRAC(1,4), // 2048 characters
4, // 4 bits per pixel
{ RGN_FRAC(0,4), RGN_FRAC(1,4), RGN_FRAC(2,4), RGN_FRAC(3,4) }, // the bitplanes are separated
{ 0, 1, 2, 3, 4, 5, 6, 7 },
{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
8*8 /* every char takes 8 consecutive bytes */
8*8 // every char takes 8 consecutive bytes
};
static const gfx_layout spritelayout =
{
16,16, /* 32*32 characters */
16,16, // 32*32 characters
RGN_FRAC(1,4),
4, /* 4 bits per pixel */
{ RGN_FRAC(0,4), RGN_FRAC(1,4), RGN_FRAC(2,4), RGN_FRAC(3,4) }, /* the bitplanes are separated */
4, // 4 bits per pixel
{ RGN_FRAC(0,4), RGN_FRAC(1,4), RGN_FRAC(2,4), RGN_FRAC(3,4) }, // the bitplanes are separated
{ 0, 1, 2, 3, 4, 5, 6, 7,
(16*8)+0, (16*8)+1, (16*8)+2, (16*8)+3, (16*8)+4, (16*8)+5, (16*8)+6, (16*8)+7 },
{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8,
8*8, 8*8+1*8, 8*8+2*8, 8*8+3*8, 8*8+4*8, 8*8+5*8, 8*8+6*8, 8*8+7*8 },
32*8 /* every char takes 128 consecutive bytes */
32*8 // every char takes 128 consecutive bytes
};
static GFXDECODE_START( gfx_wc90b )
GFXDECODE_ENTRY( "chargfx", 0x00000, charlayout, 0x100, 0x10 )
GFXDECODE_ENTRY( "tilegfx", 0x00000, spritelayout, 0x200, 0x20 )
GFXDECODE_ENTRY( "spritegfx", 0x00000, spritelayout, 0x000, 0x10 ) // sprites
GFXDECODE_ENTRY( "spritegfx", 0x00000, spritelayout, 0x000, 0x10 )
GFXDECODE_END
@ -342,9 +651,9 @@ WRITE_LINE_MEMBER(wc90b_state::adpcm_int)
void wc90b_state::machine_start()
{
membank("mainbank")->configure_entries(0, 32, memregion("maincpu")->base() + 0x10000, 0x800);
membank("subbank")->configure_entries(0, 32, memregion("sub")->base() + 0x10000, 0x800);
membank("audiobank")->configure_entries(0, 2, memregion("audiocpu")->base() + 0x8000, 0x4000);
m_mainbank->configure_entries(0, 32, memregion("maincpu")->base() + 0x10000, 0x800);
m_subbank->configure_entries(0, 32, memregion("sub")->base() + 0x10000, 0x800);
m_audiobank->configure_entries(0, 2, memregion("audiocpu")->base() + 0x8000, 0x4000);
save_item(NAME(m_msm5205next));
save_item(NAME(m_toggle));
@ -353,20 +662,20 @@ void wc90b_state::machine_start()
void wc90b_state::wc90b(machine_config &config)
{
/* basic machine hardware */
Z80(config, m_maincpu, MASTER_CLOCK);
m_maincpu->set_addrmap(AS_PROGRAM, &wc90b_state::wc90b_map1);
// basic machine hardware
Z80(config, m_maincpu, XTAL(14'318'181) / 2);
m_maincpu->set_addrmap(AS_PROGRAM, &wc90b_state::main_map);
m_maincpu->set_vblank_int("screen", FUNC(wc90b_state::irq0_line_assert));
Z80(config, m_subcpu, MASTER_CLOCK);
m_subcpu->set_addrmap(AS_PROGRAM, &wc90b_state::wc90b_map2);
Z80(config, m_subcpu, XTAL(14'318'181) / 2);
m_subcpu->set_addrmap(AS_PROGRAM, &wc90b_state::sub_map);
m_subcpu->set_vblank_int("screen", FUNC(wc90b_state::irq0_line_assert));
Z80(config, m_audiocpu, SOUND_CLOCK);
m_audiocpu->set_addrmap(AS_PROGRAM, &wc90b_state::sound_cpu);
/* IRQs are triggered by the main CPU */
Z80(config, m_audiocpu, XTAL(20'000'000) / 4);
m_audiocpu->set_addrmap(AS_PROGRAM, &wc90b_state::sound_map);
// IRQs are triggered by the main CPU
/* video hardware */
// video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(60);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
@ -378,17 +687,17 @@ void wc90b_state::wc90b(machine_config &config)
GFXDECODE(config, m_gfxdecode, m_palette, gfx_wc90b);
PALETTE(config, m_palette).set_format(palette_device::xBGR_444, 1024).set_endianness(ENDIANNESS_BIG);
/* sound hardware */
// sound hardware
SPEAKER(config, "mono").front_center();
GENERIC_LATCH_8(config, m_soundlatch);
GENERIC_LATCH_8(config, "soundlatch").data_pending_callback().set_inputline(m_audiocpu, 0, HOLD_LINE);
YM2203(config, "ymsnd1", YM2203_CLOCK).add_route(ALL_OUTPUTS, "mono", 0.40);
YM2203(config, "ymsnd2", YM2203_CLOCK).add_route(ALL_OUTPUTS, "mono", 0.40);
YM2203(config, "ymsnd1", XTAL(20'000'000) / 16).add_route(ALL_OUTPUTS, "mono", 0.40);
YM2203(config, "ymsnd2", XTAL(20'000'000) / 16).add_route(ALL_OUTPUTS, "mono", 0.40);
MSM5205(config, m_msm, MSM5205_CLOCK);
m_msm->vck_legacy_callback().set(FUNC(wc90b_state::adpcm_int)); /* interrupt function */
m_msm->set_prescaler_selector(msm5205_device::S96_4B); /* 4KHz 4-bit */
MSM5205(config, m_msm, XTAL(384'000));
m_msm->vck_legacy_callback().set(FUNC(wc90b_state::adpcm_int)); // interrupt function
m_msm->set_prescaler_selector(msm5205_device::S96_4B); // 4KHz 4-bit
m_msm->add_route(ALL_OUTPUTS, "mono", 0.20);
}
@ -399,20 +708,20 @@ void eurogael_state::eurogael(machine_config &config)
// DSWs are on the sound board near the YM2203Cs
// use is guessed
/* basic machine hardware */
Z80(config, m_maincpu, XTAL(16'000'000)/2);
m_maincpu->set_addrmap(AS_PROGRAM, &eurogael_state::map1);
m_maincpu->set_vblank_int("screen", FUNC(wc90b_state::irq0_line_assert));
// basic machine hardware
Z80(config, m_maincpu, XTAL(16'000'000) / 2);
m_maincpu->set_addrmap(AS_PROGRAM, &eurogael_state::main_map);
m_maincpu->set_vblank_int("screen", FUNC(eurogael_state::irq0_line_assert));
Z80(config, m_subcpu, XTAL(16'000'000)/2);
m_subcpu->set_addrmap(AS_PROGRAM, &wc90b_state::wc90b_map2);
m_subcpu->set_vblank_int("screen", FUNC(wc90b_state::irq0_line_assert));
Z80(config, m_subcpu, XTAL(16'000'000) / 2);
m_subcpu->set_addrmap(AS_PROGRAM, &eurogael_state::sub_map);
m_subcpu->set_vblank_int("screen", FUNC(eurogael_state::irq0_line_assert));
Z80(config, m_audiocpu, XTAL(20'000'000)/4);
m_audiocpu->set_addrmap(AS_PROGRAM, &wc90b_state::sound_cpu);
/* IRQs are triggered by the main CPU */
Z80(config, m_audiocpu, XTAL(20'000'000) / 4);
m_audiocpu->set_addrmap(AS_PROGRAM, &eurogael_state::sound_map);
// IRQs are triggered by the main CPU
/* video hardware */
// video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(60);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
@ -424,22 +733,22 @@ void eurogael_state::eurogael(machine_config &config)
GFXDECODE(config, m_gfxdecode, m_palette, gfx_wc90b);
PALETTE(config, m_palette).set_format(palette_device::xBRG_444, 1024).set_endianness(ENDIANNESS_BIG);
/* sound hardware */
// sound hardware
SPEAKER(config, "mono").front_center();
GENERIC_LATCH_8(config, m_soundlatch);
GENERIC_LATCH_8(config, "soundlatch").data_pending_callback().set_inputline(m_audiocpu, 0, HOLD_LINE);
YM2203(config, "ymsnd1", XTAL(16'000'000)/4).add_route(ALL_OUTPUTS, "mono", 0.40); // YM2203C
YM2203(config, "ymsnd2", XTAL(16'000'000)/4).add_route(ALL_OUTPUTS, "mono", 0.40); // YM2203C
YM2203(config, "ymsnd1", XTAL(16'000'000) / 4).add_route(ALL_OUTPUTS, "mono", 0.40); // YM2203C
YM2203(config, "ymsnd2", XTAL(16'000'000) / 4).add_route(ALL_OUTPUTS, "mono", 0.40); // YM2203C
MSM5205(config, m_msm, MSM5205_CLOCK);
m_msm->vck_legacy_callback().set(FUNC(wc90b_state::adpcm_int)); /* interrupt function */
m_msm->set_prescaler_selector(msm5205_device::S96_4B); /* 4KHz 4-bit */
MSM5205(config, m_msm, XTAL(384'000));
m_msm->vck_legacy_callback().set(FUNC(eurogael_state::adpcm_int)); // interrupt function
m_msm->set_prescaler_selector(msm5205_device::S96_4B); // 4KHz 4-bit
m_msm->add_route(ALL_OUTPUTS, "mono", 0.20);
}
/* these were dumped from unprotected pal16l8 devices found on a twcup90b2 set, probably the same for all sets? */
// these were dumped from unprotected pal16l8 devices found on a twcup90b2 set, probably the same for all sets?
#define TWCUP90B_PLD_DEVICES \
ROM_LOAD( "pal16l8.1", 0x0000, 0x0104, CRC(1f13c98f) SHA1(dbcac8a47bd6fe050a731132396b42dc35704dde) ) \
ROM_LOAD( "pal16l8.2", 0x0200, 0x0104, CRC(54af6bf3) SHA1(9373250b501ec4a9cd4ef697da40b41c2411f046) ) \
@ -450,12 +759,12 @@ void eurogael_state::eurogael(machine_config &config)
ROM_START( twcup90b1 )
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_LOAD( "a02.bin", 0x00000, 0x10000, CRC(192a03dd) SHA1(ab98d370bba5437f956631b0199b173be55f1c27) ) /* c000-ffff is not used */
ROM_LOAD( "a03.bin", 0x10000, 0x10000, CRC(f54ff17a) SHA1(a19850fc28a5a0da20795a5cc6b56d9c16554bce) ) /* banked at f000-f7ff */
ROM_LOAD( "a02.bin", 0x00000, 0x10000, CRC(192a03dd) SHA1(ab98d370bba5437f956631b0199b173be55f1c27) ) // c000-ffff is not used
ROM_LOAD( "a03.bin", 0x10000, 0x10000, CRC(f54ff17a) SHA1(a19850fc28a5a0da20795a5cc6b56d9c16554bce) ) // banked at f000-f7ff
ROM_REGION( 0x20000, "sub", 0 ) /* Second CPU */
ROM_LOAD( "a04.bin", 0x00000, 0x10000, CRC(3d535e2f) SHA1(f1e1878b5a8316e770c74a1e1f29a7a81a4e5dfe) ) /* c000-ffff is not used */
ROM_LOAD( "a05.bin", 0x10000, 0x10000, CRC(9e421c4b) SHA1(e23a1f1d5d1e960696f45df653869712eb889839) ) /* banked at f000-f7ff */
ROM_REGION( 0x20000, "sub", 0 )
ROM_LOAD( "a04.bin", 0x00000, 0x10000, CRC(3d535e2f) SHA1(f1e1878b5a8316e770c74a1e1f29a7a81a4e5dfe) ) // c000-ffff is not used
ROM_LOAD( "a05.bin", 0x10000, 0x10000, CRC(9e421c4b) SHA1(e23a1f1d5d1e960696f45df653869712eb889839) ) // banked at f000-f7ff
ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "a01.bin", 0x00000, 0x10000, CRC(3d317622) SHA1(ae4e8c5247bc215a2769786cb8639bce2f80db22) )
@ -495,11 +804,11 @@ ROM_END
*/
ROM_START( twcup90ba )
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_LOAD( "a02.bin", 0x00000, 0x10000, CRC(192a03dd) SHA1(ab98d370bba5437f956631b0199b173be55f1c27) ) /* c000-ffff is not used */
ROM_LOAD( "a03.bin", 0x10000, 0x10000, CRC(f54ff17a) SHA1(a19850fc28a5a0da20795a5cc6b56d9c16554bce) ) /* banked at f000-f7ff */
ROM_LOAD( "a02.bin", 0x00000, 0x10000, CRC(192a03dd) SHA1(ab98d370bba5437f956631b0199b173be55f1c27) ) // c000-ffff is not used
ROM_LOAD( "a03.bin", 0x10000, 0x10000, CRC(f54ff17a) SHA1(a19850fc28a5a0da20795a5cc6b56d9c16554bce) ) // banked at f000-f7ff
ROM_REGION( 0x20000, "sub", 0 ) /* Second CPU */
ROM_LOAD( "a04.bin", 0x00000, 0x10000, CRC(3d535e2f) SHA1(f1e1878b5a8316e770c74a1e1f29a7a81a4e5dfe) ) /* c000-ffff is not used */
ROM_REGION( 0x20000, "sub", 0 )
ROM_LOAD( "a04.bin", 0x00000, 0x10000, CRC(3d535e2f) SHA1(f1e1878b5a8316e770c74a1e1f29a7a81a4e5dfe) ) // c000-ffff is not used
ROM_LOAD( "el_ic98_27c512_05.bin",0x10000, 0x10000, CRC(c70d8c13) SHA1(365718725ea7d0355c68ba703b7f9624cb1134bc) )
ROM_REGION( 0x10000, "audiocpu", 0 )
@ -537,7 +846,7 @@ ROM_START( twcup90b2 )
ROM_LOAD( "a02", 0x00000, 0x08000, CRC(84cb2bf5) SHA1(de8343c991fc752de46448e4f6db1c3a70fc4459) ) // 2x 27c256
ROM_LOAD( "a03.bin", 0x10000, 0x08000, CRC(68156be5) SHA1(c90b873a147d00f313084cbe5d0a5a7688af1485) )
ROM_REGION( 0x20000, "sub", 0 ) /* Second CPU */
ROM_REGION( 0x20000, "sub", 0 )
ROM_LOAD( "a04.bin", 0x00000, 0x10000, CRC(3d535e2f) SHA1(f1e1878b5a8316e770c74a1e1f29a7a81a4e5dfe) ) // 2x 27c512
ROM_LOAD( "a05.bin", 0x10000, 0x10000, CRC(9e421c4b) SHA1(e23a1f1d5d1e960696f45df653869712eb889839) )
@ -585,7 +894,7 @@ ROM_START( twcup90bb )
ROM_LOAD( "27c512.02", 0x00000, 0x10000, CRC(192a03dd) SHA1(ab98d370bba5437f956631b0199b173be55f1c27) )
ROM_LOAD( "27c512.03", 0x10000, 0x10000, CRC(f54ff17a) SHA1(a19850fc28a5a0da20795a5cc6b56d9c16554bce) )
ROM_REGION( 0x20000, "sub", 0 ) /* Second CPU */
ROM_REGION( 0x20000, "sub", 0 )
ROM_LOAD( "27c512.04", 0x00000, 0x10000, CRC(3d535e2f) SHA1(f1e1878b5a8316e770c74a1e1f29a7a81a4e5dfe) )
ROM_LOAD( "27c512.05", 0x10000, 0x10000, CRC(9e421c4b) SHA1(e23a1f1d5d1e960696f45df653869712eb889839) )
@ -624,12 +933,12 @@ ROM_END
// Modular System is a stack of boards in a cage, there are apparently other games on this 'system' that wouldn't even share any hardware with this apart from the metal cage itself.
ROM_START( eurogael )
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_LOAD( "3z-1_fu301.ic17", 0x00000, 0x10000, CRC(74acc161) SHA1(d8660dd6d05164df4a66125c68627e955b35bef3) ) /* c000-ffff is not used */
ROM_LOAD( "3z-1_fu302.ic15", 0x10000, 0x10000, CRC(f54ff17a) SHA1(a19850fc28a5a0da20795a5cc6b56d9c16554bce) ) /* banked at f000-f7ff */
ROM_LOAD( "3z-1_fu301.ic17", 0x00000, 0x10000, CRC(74acc161) SHA1(d8660dd6d05164df4a66125c68627e955b35bef3) ) // c000-ffff is not used
ROM_LOAD( "3z-1_fu302.ic15", 0x10000, 0x10000, CRC(f54ff17a) SHA1(a19850fc28a5a0da20795a5cc6b56d9c16554bce) ) // banked at f000-f7ff
ROM_REGION( 0x20000, "sub", 0 ) /* Second CPU */
ROM_LOAD( "3z-1_fu303.ic19", 0x00000, 0x10000, CRC(348195fa) SHA1(41c59e38ec4ba4f3c2185dd32dbf4ea0318ab375) ) /* c000-ffff is not used */
ROM_LOAD( "3z-1_fu304.ic16", 0x10000, 0x10000, CRC(9e421c4b) SHA1(e23a1f1d5d1e960696f45df653869712eb889839) ) /* banked at f000-f7ff */
ROM_REGION( 0x20000, "sub", 0 )
ROM_LOAD( "3z-1_fu303.ic19", 0x00000, 0x10000, CRC(348195fa) SHA1(41c59e38ec4ba4f3c2185dd32dbf4ea0318ab375) ) // c000-ffff is not used
ROM_LOAD( "3z-1_fu304.ic16", 0x10000, 0x10000, CRC(9e421c4b) SHA1(e23a1f1d5d1e960696f45df653869712eb889839) ) // banked at f000-f7ff
ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "system2_fu101.ic6", 0x00000, 0x10000, CRC(712566ca) SHA1(9e46f9d449ff549b7a6d82283d8f903189b058e7) )
@ -699,6 +1008,8 @@ void wc90b_state::init_wc90b()
}
}
} // anonymous namespace
GAME( 1989, twcup90b1, twcup90, wc90b, wc90b, wc90b_state, init_wc90b, ROT0, "bootleg", "Euro League (Italian hack of Tecmo World Cup '90, set 1)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1989, twcup90ba, twcup90, wc90b, wc90b, wc90b_state, init_wc90b, ROT0, "bootleg", "Euro League (Italian hack of Tecmo World Cup '90, set 2)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )

View File

@ -1,105 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Ernesto Corvi
#ifndef MAME_INCLUDES_WC90_H
#define MAME_INCLUDES_WC90_H
#pragma once
#include "machine/gen_latch.h"
#include "video/tecmo_spr.h"
#include "emupal.h"
#include "tilemap.h"
class wc90_state : public driver_device
{
public:
wc90_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_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
m_sprgen(*this, "spritegen"),
m_soundlatch(*this, "soundlatch"),
m_fgvideoram(*this, "fgvideoram"),
m_bgvideoram(*this, "bgvideoram"),
m_txvideoram(*this, "txvideoram"),
m_scroll0xlo(*this, "scroll0xlo"),
m_scroll0xhi(*this, "scroll0xhi"),
m_scroll1xlo(*this, "scroll1xlo"),
m_scroll1xhi(*this, "scroll1xhi"),
m_scroll2xlo(*this, "scroll2xlo"),
m_scroll2xhi(*this, "scroll2xhi"),
m_scroll0ylo(*this, "scroll0ylo"),
m_scroll0yhi(*this, "scroll0yhi"),
m_scroll1ylo(*this, "scroll1ylo"),
m_scroll1yhi(*this, "scroll1yhi"),
m_scroll2ylo(*this, "scroll2ylo"),
m_scroll2yhi(*this, "scroll2yhi"),
m_spriteram(*this, "spriteram"),
m_mainbank(*this, "mainbank"),
m_subbank(*this, "subbank")
{ }
void wc90t(machine_config &config);
void wc90(machine_config &config);
void pac90(machine_config &config);
protected:
virtual void machine_start() override;
virtual void video_start() override;
private:
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_device<tecmo_spr_device> m_sprgen;
required_device<generic_latch_8_device> m_soundlatch;
required_shared_ptr<uint8_t> m_fgvideoram;
required_shared_ptr<uint8_t> m_bgvideoram;
required_shared_ptr<uint8_t> m_txvideoram;
required_shared_ptr<uint8_t> m_scroll0xlo;
required_shared_ptr<uint8_t> m_scroll0xhi;
required_shared_ptr<uint8_t> m_scroll1xlo;
required_shared_ptr<uint8_t> m_scroll1xhi;
required_shared_ptr<uint8_t> m_scroll2xlo;
required_shared_ptr<uint8_t> m_scroll2xhi;
required_shared_ptr<uint8_t> m_scroll0ylo;
required_shared_ptr<uint8_t> m_scroll0yhi;
required_shared_ptr<uint8_t> m_scroll1ylo;
required_shared_ptr<uint8_t> m_scroll1yhi;
required_shared_ptr<uint8_t> m_scroll2ylo;
required_shared_ptr<uint8_t> m_scroll2yhi;
required_shared_ptr<uint8_t> m_spriteram;
required_memory_bank m_mainbank;
required_memory_bank m_subbank;
tilemap_t *m_tx_tilemap;
tilemap_t *m_fg_tilemap;
tilemap_t *m_bg_tilemap;
void bankswitch_w(uint8_t data);
void bankswitch1_w(uint8_t data);
void bgvideoram_w(offs_t offset, uint8_t data);
void fgvideoram_w(offs_t offset, uint8_t data);
void txvideoram_w(offs_t offset, uint8_t data);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
TILE_GET_INFO_MEMBER(get_fg_tile_info);
TILE_GET_INFO_MEMBER(get_tx_tile_info);
TILE_GET_INFO_MEMBER(track_get_bg_tile_info);
TILE_GET_INFO_MEMBER(track_get_fg_tile_info);
DECLARE_VIDEO_START(wc90t);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void sound_map(address_map &map);
void wc90_map_1(address_map &map);
void wc90_map_2(address_map &map);
};
#endif // MAME_INCLUDES_WC90_H

View File

@ -1,122 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Ernesto Corvi
#ifndef MAME_INCLUDES_WC90B_H
#define MAME_INCLUDES_WC90B_H
#pragma once
#include "machine/gen_latch.h"
#include "sound/msm5205.h"
#include "emupal.h"
#include "tilemap.h"
class wc90b_state : public driver_device
{
public:
wc90b_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_subcpu(*this, "sub"),
m_audiocpu(*this, "audiocpu"),
m_msm(*this, "msm"),
m_soundlatch(*this, "soundlatch"),
m_palette(*this, "palette"),
m_gfxdecode(*this, "gfxdecode"),
m_fgvideoram(*this, "fgvideoram"),
m_bgvideoram(*this, "bgvideoram"),
m_txvideoram(*this, "txvideoram"),
m_spriteram(*this, "spriteram"),
m_scroll1x(*this, "scroll1x"),
m_scroll2x(*this, "scroll2x"),
m_scroll1y(*this, "scroll1y"),
m_scroll2y(*this, "scroll2y"),
m_scroll_x_lo(*this, "scroll_x_lo")
{ }
void wc90b(machine_config &config);
void eurogael(machine_config &config);
void init_wc90b();
void bgvideoram_w(offs_t offset, uint8_t data);
void fgvideoram_w(offs_t offset, uint8_t data);
void txvideoram_w(offs_t offset, uint8_t data);
void bankswitch_w(uint8_t data);
void sound_command_w(uint8_t data);
DECLARE_WRITE_LINE_MEMBER(adpcm_int);
void sound_cpu(address_map &map);
void wc90b_map2(address_map &map);
protected:
virtual void machine_start() override;
virtual void video_start() override;
tilemap_t *m_tx_tilemap;
tilemap_t *m_fg_tilemap;
tilemap_t *m_bg_tilemap;
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_subcpu;
required_device<cpu_device> m_audiocpu;
required_device<msm5205_device> m_msm;
required_device<generic_latch_8_device> m_soundlatch;
required_device<palette_device> m_palette;
required_device<gfxdecode_device> m_gfxdecode;
required_shared_ptr<uint8_t> m_fgvideoram;
required_shared_ptr<uint8_t> m_bgvideoram;
required_shared_ptr<uint8_t> m_txvideoram;
required_shared_ptr<uint8_t> m_spriteram;
virtual uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
virtual void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, int priority );
private:
optional_shared_ptr<uint8_t> m_scroll1x;
optional_shared_ptr<uint8_t> m_scroll2x;
optional_shared_ptr<uint8_t> m_scroll1y;
optional_shared_ptr<uint8_t> m_scroll2y;
optional_shared_ptr<uint8_t> m_scroll_x_lo;
void wc90b_map1(address_map &map);
int m_msm5205next;
int m_toggle;
void bankswitch1_w(uint8_t data);
void adpcm_data_w(uint8_t data);
void adpcm_control_w(uint8_t data);
uint8_t master_irq_ack_r();
void slave_irq_ack_w(uint8_t data);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
TILE_GET_INFO_MEMBER(get_fg_tile_info);
TILE_GET_INFO_MEMBER(get_tx_tile_info);
};
class eurogael_state : public wc90b_state
{
public:
eurogael_state(const machine_config &mconfig, device_type type, const char *tag) :
wc90b_state(mconfig, type, tag),
m_bgscroll(*this, "bgscroll")
{ }
void eurogael(machine_config &config);
protected:
virtual uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) override;
virtual void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, int priority ) override;
private:
void master_irq_ack_w(uint8_t data);
required_shared_ptr<uint8_t> m_bgscroll;
void map1(address_map &map);
};
#endif // MAME_INCLUDES_WC90B_H

View File

@ -1,143 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Ernesto Corvi
#include "emu.h"
#include "includes/wc90.h"
/***************************************************************************
Callbacks for the TileMap code
***************************************************************************/
TILE_GET_INFO_MEMBER(wc90_state::get_bg_tile_info)
{
int attr = m_bgvideoram[tile_index];
int tile = m_bgvideoram[tile_index + 0x800] +
256 * ((attr & 3) + ((attr >> 1) & 4));
tileinfo.set(2,
tile,
attr >> 4,
0);
}
TILE_GET_INFO_MEMBER(wc90_state::get_fg_tile_info)
{
int attr = m_fgvideoram[tile_index];
int tile = m_fgvideoram[tile_index + 0x800] +
256 * ((attr & 3) + ((attr >> 1) & 4));
tileinfo.set(1,
tile,
attr >> 4,
0);
}
TILE_GET_INFO_MEMBER(wc90_state::get_tx_tile_info)
{
tileinfo.set(0,
m_txvideoram[tile_index + 0x800] + ((m_txvideoram[tile_index] & 0x07) << 8),
m_txvideoram[tile_index] >> 4,
0);
}
TILE_GET_INFO_MEMBER(wc90_state::track_get_bg_tile_info)
{
int attr = m_bgvideoram[tile_index];
int tile = m_bgvideoram[tile_index + 0x800] +
256 * (attr & 7);
tileinfo.set(2,
tile,
attr >> 4,
0);
}
TILE_GET_INFO_MEMBER(wc90_state::track_get_fg_tile_info)
{
int attr = m_fgvideoram[tile_index];
int tile = m_fgvideoram[tile_index + 0x800] +
256 * (attr & 7);
tileinfo.set(1,
tile,
attr >> 4,
0);
}
/***************************************************************************
Start the video hardware emulation.
***************************************************************************/
void wc90_state::video_start()
{
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(wc90_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 16,16, 64,32);
m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(wc90_state::get_fg_tile_info)), TILEMAP_SCAN_ROWS, 16,16, 64,32);
m_tx_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(wc90_state::get_tx_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64,32);
m_fg_tilemap->set_transparent_pen(0);
m_tx_tilemap->set_transparent_pen(0);
}
VIDEO_START_MEMBER(wc90_state,wc90t)
{
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(wc90_state::track_get_bg_tile_info)), TILEMAP_SCAN_ROWS, 16,16, 64,32);
m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(wc90_state::track_get_fg_tile_info)), TILEMAP_SCAN_ROWS, 16,16, 64,32);
m_tx_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(wc90_state::get_tx_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64,32);
m_fg_tilemap->set_transparent_pen(0);
m_tx_tilemap->set_transparent_pen(0);
}
/***************************************************************************
Memory handlers
***************************************************************************/
void wc90_state::bgvideoram_w(offs_t offset, uint8_t data)
{
m_bgvideoram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset & 0x7ff);
}
void wc90_state::fgvideoram_w(offs_t offset, uint8_t data)
{
m_fgvideoram[offset] = data;
m_fg_tilemap->mark_tile_dirty(offset & 0x7ff);
}
void wc90_state::txvideoram_w(offs_t offset, uint8_t data)
{
m_txvideoram[offset] = data;
m_tx_tilemap->mark_tile_dirty(offset & 0x7ff);
}
/***************************************************************************
Display refresh
***************************************************************************/
uint32_t wc90_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_bg_tilemap->set_scrollx(0,m_scroll2xlo[0] + 256 * m_scroll2xhi[0]);
m_bg_tilemap->set_scrolly(0,m_scroll2ylo[0] + 256 * m_scroll2yhi[0]);
m_fg_tilemap->set_scrollx(0,m_scroll1xlo[0] + 256 * m_scroll1xhi[0]);
m_fg_tilemap->set_scrolly(0,m_scroll1ylo[0] + 256 * m_scroll1yhi[0]);
m_tx_tilemap->set_scrollx(0,m_scroll0xlo[0] + 256 * m_scroll0xhi[0]);
m_tx_tilemap->set_scrolly(0,m_scroll0ylo[0] + 256 * m_scroll0yhi[0]);
// m_sprgen->draw_wc90_sprites(bitmap,cliprect, m_gfxdecode->gfx(3), m_spriteram, m_spriteram.bytes(), 3); // unused
m_bg_tilemap->draw(screen, bitmap, cliprect, 0,0);
m_sprgen->draw_wc90_sprites(bitmap,cliprect, m_gfxdecode->gfx(3), m_spriteram, m_spriteram.bytes(), 2);
m_fg_tilemap->draw(screen, bitmap, cliprect, 0,0);
m_sprgen->draw_wc90_sprites(bitmap,cliprect, m_gfxdecode->gfx(3), m_spriteram, m_spriteram.bytes(), 1);
m_tx_tilemap->draw(screen, bitmap, cliprect, 0,0);
m_sprgen->draw_wc90_sprites(bitmap,cliprect, m_gfxdecode->gfx(3), m_spriteram, m_spriteram.bytes(), 0);
return 0;
}

View File

@ -1,211 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Ernesto Corvi
#include "emu.h"
#include "includes/wc90b.h"
/***************************************************************************
Callbacks for the TileMap code
***************************************************************************/
TILE_GET_INFO_MEMBER(wc90b_state::get_bg_tile_info)
{
int attr = m_bgvideoram[tile_index];
int tile = m_bgvideoram[tile_index + 0x800];
tileinfo.set(1,
((((attr & 3) + ((attr >> 1) & 4)))<<8) | tile | 0x800,
(attr >> 4) | 0x10,
0);
}
TILE_GET_INFO_MEMBER(wc90b_state::get_fg_tile_info)
{
int attr = m_fgvideoram[tile_index];
int tile = m_fgvideoram[tile_index + 0x800];
tileinfo.set(1,
((((attr & 3) + ((attr >> 1) & 4)))<<8) | tile,
attr >> 4,
0);
}
TILE_GET_INFO_MEMBER(wc90b_state::get_tx_tile_info)
{
tileinfo.set(0,
m_txvideoram[tile_index + 0x800] + ((m_txvideoram[tile_index] & 0x07) << 8),
m_txvideoram[tile_index] >> 4,
0);
}
/***************************************************************************
Start the video hardware emulation.
***************************************************************************/
void wc90b_state::video_start()
{
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(wc90b_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 16, 16, 64, 32);
m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(wc90b_state::get_fg_tile_info)), TILEMAP_SCAN_ROWS, 16, 16, 64, 32);
m_tx_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(wc90b_state::get_tx_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32);
m_fg_tilemap->set_transparent_pen(15);
m_tx_tilemap->set_transparent_pen(15);
}
/***************************************************************************
Memory handlers
***************************************************************************/
void wc90b_state::bgvideoram_w(offs_t offset, uint8_t data)
{
m_bgvideoram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset & 0x7ff);
}
void wc90b_state::fgvideoram_w(offs_t offset, uint8_t data)
{
m_fgvideoram[offset] = data;
m_fg_tilemap->mark_tile_dirty(offset & 0x7ff);
}
void wc90b_state::txvideoram_w(offs_t offset, uint8_t data)
{
m_txvideoram[offset] = data;
m_tx_tilemap->mark_tile_dirty(offset & 0x7ff);
}
/***************************************************************************
Display refresh
***************************************************************************/
void wc90b_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, int priority )
{
/* draw all visible sprites of specified priority */
for ( int offs = m_spriteram.bytes() - 8 ; offs >= 0 ; offs -= 8 )
{
if ( ( ~( m_spriteram[offs+3] >> 7 ) & 1 ) == priority )
{
// 0 bbbb bbff b = tile lower , f = flip bits
// 1 yyyy yyyy
// 2 xxxx xxxx
// 3 PXcc cccc P = priority X = x high, c = tile upper
// 4 pppp ---- palette
int tilehigh = ( m_spriteram[offs + 3] & 0x3f ) << 6;
int tilelow = m_spriteram[offs + 0];
int flags = m_spriteram[offs + 4];
tilehigh += ( tilelow & 0xfc ) >> 2;
int sx = m_spriteram[offs + 2];
if (!(m_spriteram[offs + 3] & 0x40)) sx -= 0x0100;
int sy = 240 - m_spriteram[offs + 1];
m_gfxdecode->gfx(2)->transpen(bitmap,cliprect, tilehigh,
flags >> 4, /* color */
tilelow & 1, /* flipx */
tilelow & 2, /* flipy */
sx,
sy,15 );
}
}
}
uint32_t wc90b_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_bg_tilemap->set_scrollx(0,8 * (m_scroll2x[0] & 0x7f) + 256 - 4 + (m_scroll_x_lo[0] & 0x07));
m_bg_tilemap->set_scrolly(0,m_scroll2y[0] + 1 + ((m_scroll2x[0] & 0x80) ? 256 : 0));
m_fg_tilemap->set_scrollx(0,8 * (m_scroll1x[0] & 0x7f) + 256 - 6 + ((m_scroll_x_lo[0] & 0x38) >> 3));
m_fg_tilemap->set_scrolly(0,m_scroll1y[0] + 1 + ((m_scroll1x[0] & 0x80) ? 256 : 0));
m_bg_tilemap->draw(screen, bitmap, cliprect, 0,0);
draw_sprites(bitmap,cliprect, 1 );
m_fg_tilemap->draw(screen, bitmap, cliprect, 0,0);
m_tx_tilemap->draw(screen, bitmap, cliprect, 0,0);
// TODO: if scoring on same Y as GOAL message, ball will be above it. Might be a btanb (or needs single pass draw + mix?)
draw_sprites(bitmap,cliprect, 0 );
return 0;
}
void eurogael_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, int priority )
{
/* draw all visible sprites of specified priority */
// entry at start of RAM might not be a sprite
for ( int offs = 0x200 - 4 ; offs >= 4 ; offs -= 4 )
{
if ( ( ( m_spriteram[offs+3] >> 4 ) & 1 ) == priority )
{
// this is wrong
// 0 bbbb bbbb b = tile lower
// 1 yyyy yyyy
// 2 xxxx xxxx
// 3 ffXP cccc f = flip bits, P = priority (inverted vs. other bootlegs) X = X high?, c = tile upper
// 0x200 ---- -ppp p = palette
int tilehigh = ( m_spriteram[offs + 3] & 0x0f ) << 8;
int attr = ( m_spriteram[offs + 3] & 0xf0 ) >> 4;
int tilelow = m_spriteram[offs + 0];
int flags = m_spriteram[offs + 0x200];
tilehigh += tilelow;
int sx = m_spriteram[offs + 2];
if (!(attr & 0x02)) sx -= 0x0100;
int sy = 240 - m_spriteram[offs + 1];
m_gfxdecode->gfx(2)->transpen(bitmap,cliprect, tilehigh,
(flags & 0x7) | 8, /* color - palettes 0x0 - 0x7 never written? */
attr & 4, /* flipx */
attr & 8, /* flipy */
sx,
sy,15 );
}
}
}
uint32_t eurogael_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
// the code to write / clear tilemaps for fb and tx layers has been specifically modified to avoid writing to the last 4 bytes
// and the game instead writes scroll values there instead, there is no code to copy from there, so it looks like these are the scroll regs
// each of the 3 layer has its own PCB, all PCBs look identical, so why does handling differ slightly?
int fg_scrollx = ((m_fgvideoram[0xffc]) | (m_fgvideoram[0xffd]<<8)) + 33;
int fg_scrolly = ((m_fgvideoram[0xffe]) | (m_fgvideoram[0xfff]<<8)) + 1;
int bg_scrollx = ((m_bgscroll[0xf00]) | (m_bgscroll[0xf01]<<8)) + 33;
int bg_scrolly = ((m_bgscroll[0xf02]) | (m_bgscroll[0xf03]<<8)) + 1;
int tx_scrollx = ((m_txvideoram[0xffc]) | (m_txvideoram[0xffd]<<8)) + 33;
int tx_scrolly = ((m_txvideoram[0xffe]) | (m_txvideoram[0xfff]<<8)) + 1;
m_bg_tilemap->set_scrollx(0, bg_scrollx);
m_bg_tilemap->set_scrolly(0, bg_scrolly);
m_fg_tilemap->set_scrollx(0, fg_scrollx);
m_fg_tilemap->set_scrolly(0, fg_scrolly);
m_tx_tilemap->set_scrollx(0, tx_scrollx);
m_tx_tilemap->set_scrolly(0, tx_scrolly);
m_bg_tilemap->draw(screen, bitmap, cliprect, 0,0);
draw_sprites(bitmap,cliprect, 1 );
m_fg_tilemap->draw(screen, bitmap, cliprect, 0,0);
m_tx_tilemap->draw(screen, bitmap, cliprect, 0,0);
draw_sprites(bitmap,cliprect, 0 );
return 0;
}