tecmo/tehkanwc.cpp: Added world version of Tee'd Off (new parent). (#10651)

New working clones
-----------------
Tee'd Off (World) [system11]
This commit is contained in:
David Haywood 2022-12-07 20:00:57 +00:00 committed by GitHub
parent 19bfee52ad
commit e39ae3db1c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 55 additions and 51 deletions

View File

@ -41727,6 +41727,7 @@ tecnodargr // (c) 1991 Automatics Pasqual / Recreativos G.R
@source:tecmo/tehkanwc.cpp
gridiron // (c) 1985 Tehkan
teedoff // 6102 - (c) 1986 Tecmo
teedoffj //
tehkanwc // (c) 1985 Tehkan
tehkanwcb // bootleg
tehkanwcc // bootleg

View File

@ -23,7 +23,8 @@ About 'teedoff' :
The main problem with that game is that it should sometimes jumps into shared memory
(see 'init_teedoff' function below) depending on a value that is supposed to be
in the palette RAM !
in the palette RAM ! (maybe palette RAM is write only, and this is an open bus read
or was used for debugging during the game development?)
Palette RAM is reset here (main CPU) :
@ -222,7 +223,11 @@ WRITE_LINE_MEMBER(tehkanwc_state::adpcm_int)
/* End of MSM with counters emulation */
uint8_t tehkanwc_state::teedoff_unk_r()
{
logerror("%s: teedoff_unk_r\n", machine().describe_context());
return 0x80;
}
void tehkanwc_state::main_mem(address_map &map)
{
@ -231,8 +236,9 @@ void tehkanwc_state::main_mem(address_map &map)
map(0xc800, 0xcfff).ram().share("share1");
map(0xd000, 0xd3ff).ram().w(FUNC(tehkanwc_state::videoram_w)).share("videoram");
map(0xd400, 0xd7ff).ram().w(FUNC(tehkanwc_state::colorram_w)).share("colorram");
map(0xd800, 0xddff).ram().w(m_palette, FUNC(palette_device::write8)).share("palette");
map(0xde00, 0xdfff).ram().share("share5"); /* unused part of the palette RAM, I think? Gridiron uses it */
map(0xd800, 0xddff).writeonly().w(m_palette, FUNC(palette_device::write8)).share("palette");
map(0xda00, 0xda00).r(FUNC(tehkanwc_state::teedoff_unk_r));
map(0xde00, 0xdfff).writeonly().share("share5"); /* unused part of the palette RAM, I think? Gridiron uses it */
map(0xe000, 0xe7ff).ram().w(FUNC(tehkanwc_state::videoram2_w)).share("videoram2");
map(0xe800, 0xebff).ram().share("spriteram"); /* sprites */
map(0xec00, 0xec01).ram().w(FUNC(tehkanwc_state::scroll_x_w));
@ -258,8 +264,8 @@ void tehkanwc_state::sub_mem(address_map &map)
map(0xc800, 0xcfff).ram().share("share1");
map(0xd000, 0xd3ff).ram().w(FUNC(tehkanwc_state::videoram_w)).share("videoram");
map(0xd400, 0xd7ff).ram().w(FUNC(tehkanwc_state::colorram_w)).share("colorram");
map(0xd800, 0xddff).ram().w(m_palette, FUNC(palette_device::write8)).share("palette");
map(0xde00, 0xdfff).ram().share("share5"); /* unused part of the palette RAM, I think? Gridiron uses it */
map(0xd800, 0xddff).writeonly().w(m_palette, FUNC(palette_device::write8)).share("palette");
map(0xde00, 0xdfff).writeonly().share("share5"); /* unused part of the palette RAM, I think? Gridiron uses it */
map(0xe000, 0xe7ff).ram().w(FUNC(tehkanwc_state::videoram2_w)).share("videoram2");
map(0xe800, 0xebff).ram().share("spriteram"); /* sprites */
map(0xec00, 0xec01).ram().w(FUNC(tehkanwc_state::scroll_x_w));
@ -726,37 +732,6 @@ void tehkanwc_state::tehkanwcb(machine_config &config)
ay2.add_route(ALL_OUTPUTS, "mono", 0.25);
}
void tehkanwc_state::init_teedoff()
{
/* Patch to avoid the game jumping in shared memory */
/* Code at 0x0233 (main CPU) :
0233: 3A 00 DA ld a,($DA00)
0236: CB 7F bit 7,a
0238: CA 00 C8 jp z,$C800
changed to :
0233: 3A 00 DA ld a,($DA00)
0236: CB 7F bit 7,a
0238: 00 nop
0239: 00 nop
023A: 00 nop
*/
// Update 2022: sub CPU doesn't seem responsible for sharing code to main,
// and bit 7 write to 0xca00 happens after that main checks it out during attract.
// Notice that main CPU just fakes the ROM checksum check at startup, just drawing ROM # OK at PC=0x1726
// There's also this (nsfw link) -> https://sudden-desu.net/entry/tee-d-off-a-saucy-secret-and-hidden-dev-credits
// which implies that at least 1 ROM is bad here.
uint8_t *ROM = memregion("maincpu")->base();
ROM[0x0238] = 0x00;
ROM[0x0239] = 0x00;
ROM[0x023a] = 0x00;
}
/***************************************************************************
@ -973,31 +948,57 @@ ROM_END
ROM_START( teedoff )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "to-1.bin", 0x0000, 0x4000, BAD_DUMP CRC(cc2aebc5) SHA1(358e77e53b35dd89fcfdb3b2484b8c4fbc34c1be) )
ROM_LOAD( "to-2.bin", 0x4000, 0x4000, BAD_DUMP CRC(f7c9f138) SHA1(2fe56059ef67387b5938bb4751aa2f74a58b04fb) )
ROM_LOAD( "to-3.bin", 0x8000, 0x4000, BAD_DUMP CRC(a0f0a6da) SHA1(72390c8dc5519d90e39a660e6ec18861fdbadcc8) )
ROM_LOAD( "1_m5m27c128_dip28.4a", 0x0000, 0x4000, CRC(0e18f6ee) SHA1(7e78b97ca343b6bdc7ee24e99063fbe9bc86e7a2) )
ROM_LOAD( "2_m5m27c128_dip28.4b", 0x4000, 0x4000, CRC(70635a77) SHA1(301794ef4761ed417ae211bd570d0cbc6a75bcc5) )
ROM_LOAD( "3_m5m27c128_dip28.4d", 0x8000, 0x4000, CRC(2c765def) SHA1(bf256104d8b89713b69dde3d84d03638241ba6af) )
ROM_REGION( 0x10000, "sub", 0 )
ROM_LOAD( "to-4.bin", 0x0000, 0x8000, BAD_DUMP CRC(e922cbd2) SHA1(922c030be70150efb760fa81bda0bc54f2ec681a) )
ROM_LOAD( "4_hn27256g@dip28.9c", 0x0000, 0x8000, CRC(a21315bf) SHA1(a9dd2c1fea3a184ec5d40fa3246fa24c4d720bb3) )
ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "to-6.bin", 0x0000, 0x4000, CRC(d8dfe1c8) SHA1(d00a71ad89b530339990780334588f5738c60f25) )
ROM_LOAD( "6_m5m27c128_dip28.8r", 0x0000, 0x4000, CRC(f87a43f5) SHA1(268da812846b9ec24cfeb8d89869e39fa01a6676) )
ROM_REGION( 0x04000, "gfx1", 0 )
ROM_LOAD( "to-12.bin", 0x00000, 0x4000, CRC(4f44622c) SHA1(161c3646a3ec2274bffc957240d47d55a35a8416) ) /* fg tiles */
ROM_LOAD( "12_m5m27c128_dip28.8u", 0x00000, 0x4000, CRC(4f44622c) SHA1(161c3646a3ec2274bffc957240d47d55a35a8416) ) /* fg tiles */
ROM_REGION( 0x10000, "gfx2", 0 )
ROM_LOAD( "to-8.bin", 0x00000, 0x8000, CRC(363bd1ba) SHA1(c5b7d56b0595712b18351403a9e3325a03de1676) ) /* sprites */
ROM_LOAD( "to-7.bin", 0x08000, 0x8000, CRC(6583fa5b) SHA1(1041181887350d860c517c0a031ab064a20f5cee) )
ROM_LOAD( "8_hn27256g_dip28.5j", 0x00000, 0x8000, CRC(363bd1ba) SHA1(c5b7d56b0595712b18351403a9e3325a03de1676) ) /* sprites */
ROM_LOAD( "7_hn27256g_dip28.5e", 0x08000, 0x8000, CRC(6583fa5b) SHA1(1041181887350d860c517c0a031ab064a20f5cee) )
ROM_REGION( 0x10000, "gfx3", 0 )
ROM_LOAD( "to-11.bin", 0x00000, 0x8000, CRC(1ec00cb5) SHA1(0e61eed3d6fc44ff89d8b9e4f558f0989eb8094f) ) /* bg tiles */
ROM_LOAD( "to-9.bin", 0x08000, 0x8000, CRC(a14347f0) SHA1(00a34ed56ec32336bb524424fcb007d8160163ec) )
ROM_LOAD( "11_hn27256g_dip28.8m", 0x00000, 0x8000, CRC(1ec00cb5) SHA1(0e61eed3d6fc44ff89d8b9e4f558f0989eb8094f) ) /* bg tiles */
ROM_LOAD( "9_hn27256g_dip28.8j", 0x08000, 0x8000, CRC(a14347f0) SHA1(00a34ed56ec32336bb524424fcb007d8160163ec) )
ROM_REGION( 0x8000, "adpcm", 0 ) /* ADPCM samples */
ROM_LOAD( "to-5.bin", 0x0000, 0x8000, CRC(e5e4246b) SHA1(b2fe2e68fa86163ebe1ef00ecce73fb62cef6b19) )
ROM_LOAD( "5_m5m27c256k_dip28.4r", 0x0000, 0x8000, CRC(90141093) SHA1(e8983d8c47e47481c2a8ee2a0bac6df3b17f8e70) )
ROM_END
ROM_START( teedoffj )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "to-1.4a", 0x0000, 0x4000, CRC(cc2aebc5) SHA1(358e77e53b35dd89fcfdb3b2484b8c4fbc34c1be) )
ROM_LOAD( "to-2.4b", 0x4000, 0x4000, CRC(f7c9f138) SHA1(2fe56059ef67387b5938bb4751aa2f74a58b04fb) )
ROM_LOAD( "to-3.4d", 0x8000, 0x4000, CRC(a0f0a6da) SHA1(72390c8dc5519d90e39a660e6ec18861fdbadcc8) )
ROM_REGION( 0x10000, "sub", 0 )
ROM_LOAD( "to-4.9c", 0x0000, 0x8000, CRC(e922cbd2) SHA1(922c030be70150efb760fa81bda0bc54f2ec681a) )
ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "to-6.8r", 0x0000, 0x4000, CRC(d8dfe1c8) SHA1(d00a71ad89b530339990780334588f5738c60f25) )
ROM_REGION( 0x04000, "gfx1", 0 )
ROM_LOAD( "12_m5m27c128_dip28.8u", 0x00000, 0x4000, CRC(4f44622c) SHA1(161c3646a3ec2274bffc957240d47d55a35a8416) ) /* fg tiles */
ROM_REGION( 0x10000, "gfx2", 0 )
ROM_LOAD( "8_hn27256g_dip28.5j", 0x00000, 0x8000, CRC(363bd1ba) SHA1(c5b7d56b0595712b18351403a9e3325a03de1676) ) /* sprites */
ROM_LOAD( "7_hn27256g_dip28.5e", 0x08000, 0x8000, CRC(6583fa5b) SHA1(1041181887350d860c517c0a031ab064a20f5cee) )
ROM_REGION( 0x10000, "gfx3", 0 )
ROM_LOAD( "11_hn27256g_dip28.8m", 0x00000, 0x8000, CRC(1ec00cb5) SHA1(0e61eed3d6fc44ff89d8b9e4f558f0989eb8094f) ) /* bg tiles */
ROM_LOAD( "9_hn27256g_dip28.8j", 0x08000, 0x8000, CRC(a14347f0) SHA1(00a34ed56ec32336bb524424fcb007d8160163ec) )
ROM_REGION( 0x8000, "adpcm", 0 ) /* ADPCM samples */
ROM_LOAD( "to-5.4r", 0x0000, 0x8000, CRC(e5e4246b) SHA1(b2fe2e68fa86163ebe1ef00ecce73fb62cef6b19) )
ROM_END
/* There are some dumps out there that only have the year hacked to 1986 and a little bunch of bytes
from the graphics zone. I think that not worth to support these hacks...
@ -1009,5 +1010,8 @@ GAME( 1985, tehkanwcb, tehkanwc, tehkanwcb,tehkanwc, tehkanwc_state, empty_init,
GAME( 1985, tehkanwcc, tehkanwc, tehkanwcb,tehkanwc, tehkanwc_state, empty_init, ROT0, "bootleg", "Tehkan World Cup (set 3, bootleg)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // aka 'World Cup 85', different inputs?
GAME( 1985, tehkanwcd, tehkanwc, tehkanwc, tehkanwcd,tehkanwc_state, empty_init, ROT0, "Tehkan", "Tehkan World Cup (set 4, earlier)", MACHINE_SUPPORTS_SAVE )
GAME( 1986, tehkanwch, tehkanwc, tehkanwc, tehkanwcd,tehkanwc_state, empty_init, ROT0, "hack", "Tehkan World Cup (1986 year hack)", MACHINE_SUPPORTS_SAVE )
GAMEL(1985, gridiron, 0, tehkanwc, gridiron, tehkanwc_state, empty_init, ROT0, "Tehkan", "Gridiron Fight", MACHINE_SUPPORTS_SAVE, layout_gridiron )
GAME( 1986, teedoff, 0, tehkanwc, teedoff, tehkanwc_state, init_teedoff, ROT90, "Tecmo", "Tee'd Off (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1987, teedoff, 0, tehkanwc, teedoff, tehkanwc_state, empty_init, ROT90, "Tecmo", "Tee'd Off (World)", MACHINE_SUPPORTS_SAVE ) // found in US, but no region warning
GAME( 1986, teedoffj, teedoff, tehkanwc, teedoff, tehkanwc_state, empty_init, ROT90, "Tecmo", "Tee'd Off (Japan)", MACHINE_SUPPORTS_SAVE )

View File

@ -33,8 +33,6 @@ public:
void tehkanwcb(machine_config &config);
void tehkanwc(machine_config &config);
void init_teedoff();
protected:
virtual void machine_start() override;
virtual void video_start() override;
@ -85,6 +83,7 @@ private:
void flipscreen_y_w(uint8_t data);
void gridiron_led0_w(uint8_t data);
void gridiron_led1_w(uint8_t data);
uint8_t teedoff_unk_r();
uint8_t portA_r();
uint8_t portB_r();
void portA_w(uint8_t data);