- model2.cpp: dumped IO board ROM for srallycdx [Guru]

- quizpun2.cpp, tail2nos.cpp: used finder for memory bank, small cleanups

- aerofgt.cpp, cop01.cpp, dacholer.cpp, galivan.cpp, pzletime.cpp, taxidriv.cpp, terracre.cpp, welltris.cpp: removed some custom GFX decodes in favor of the ones provided in emu/video/generic.cpp
This commit is contained in:
Ivan Vangelista 2022-03-12 08:10:34 +01:00
parent f29cd1988c
commit a7225d8818
14 changed files with 432 additions and 561 deletions

View File

@ -4575,8 +4575,6 @@ files {
MAME_DIR .. "src/mame/includes/suprslam.h",
MAME_DIR .. "src/mame/video/suprslam.cpp",
MAME_DIR .. "src/mame/drivers/tail2nos.cpp",
MAME_DIR .. "src/mame/includes/tail2nos.h",
MAME_DIR .. "src/mame/video/tail2nos.cpp",
MAME_DIR .. "src/mame/drivers/taotaido.cpp",
MAME_DIR .. "src/mame/includes/taotaido.h",
MAME_DIR .. "src/mame/video/taotaido.cpp",

View File

@ -1229,17 +1229,6 @@ static INPUT_PORTS_START( wbbc97 )
PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_SERVICE1 )
INPUT_PORTS_END
static const gfx_layout pspikes_charlayout =
{
8,8,
RGN_FRAC(1,1),
4,
{ 0, 1, 2, 3 },
{ 1*4, 0*4, 3*4, 2*4, 5*4, 4*4, 7*4, 6*4 },
{ 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 },
32*8
};
static const gfx_layout aerofgt_charlayout =
{
8,8,
@ -1390,7 +1379,7 @@ static const gfx_layout kickball_spritelayout =
};
static GFXDECODE_START( gfx_pspikes )
GFXDECODE_ENTRY( "gfx1", 0, pspikes_charlayout, 0, 64 ) /* colors 0-1023 in 8 banks */
GFXDECODE_ENTRY( "gfx1", 0, gfx_8x8x4_packed_lsb, 0, 64 ) /* colors 0-1023 in 8 banks */
GFXDECODE_ENTRY( "gfx2", 0, pspikes_spritelayout, 1024, 64 ) /* colors 1024-2047 in 4 banks */
GFXDECODE_END
@ -1405,13 +1394,13 @@ static GFXDECODE_START( gfx_spikes91 )
GFXDECODE_END
static GFXDECODE_START( gfx_kickball )
GFXDECODE_ENTRY( "gfx1", 0, pspikes_charlayout, 0, 64 ) /* colors 0-1023 in 8 banks */
GFXDECODE_ENTRY( "gfx1", 0, gfx_8x8x4_packed_lsb, 0, 64 ) /* colors 0-1023 in 8 banks */
GFXDECODE_ENTRY( "gfx2", 0, kickball_spritelayout, 1024, 64 ) /* colors 1024-2047 in 4 banks */
GFXDECODE_END
static GFXDECODE_START( gfx_turbofrc )
GFXDECODE_ENTRY( "gfx1", 0, pspikes_charlayout, 0, 16 )
GFXDECODE_ENTRY( "gfx2", 0, pspikes_charlayout, 256, 16 )
GFXDECODE_ENTRY( "gfx1", 0, gfx_8x8x4_packed_lsb, 0, 16 )
GFXDECODE_ENTRY( "gfx2", 0, gfx_8x8x4_packed_lsb, 256, 16 )
GFXDECODE_ENTRY( "spritegfx", 0, pspikes_spritelayout, 512, 16 )
GFXDECODE_ENTRY( "gfx4", 0, pspikes_spritelayout, 768, 16 )
GFXDECODE_END
@ -1437,7 +1426,7 @@ static GFXDECODE_START( gfx_aerfboo2 )
GFXDECODE_END
static GFXDECODE_START( gfx_wbbc97 )
GFXDECODE_ENTRY( "gfx1", 0, pspikes_charlayout, 0, 64 ) /* colors 0-1023 in 8 banks */
GFXDECODE_ENTRY( "gfx1", 0, gfx_8x8x4_packed_lsb, 0, 64 ) /* colors 0-1023 in 8 banks */
GFXDECODE_ENTRY( "gfx2", 0, wbbc97_spritelayout, 1024, 64 ) /* colors 1024-2047 in 4 banks */
GFXDECODE_END

View File

@ -376,17 +376,6 @@ INPUT_PORTS_END
*
*************************************/
static const gfx_layout charlayout =
{
8,8,
RGN_FRAC(1,1),
4,
{ 0, 1, 2, 3 },
{ 1*4, 0*4, 3*4, 2*4, 5*4, 4*4, 7*4, 6*4 },
{ 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 },
32*8
};
static const gfx_layout tilelayout =
{
8,8,
@ -418,9 +407,9 @@ static const gfx_layout spritelayout =
};
static GFXDECODE_START( gfx_cop01 )
GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 1 )
GFXDECODE_ENTRY( "gfx2", 0, tilelayout, 16, 8 )
GFXDECODE_ENTRY( "gfx3", 0, spritelayout, 16+8*16, 16 )
GFXDECODE_ENTRY( "gfx1", 0, gfx_8x8x4_packed_lsb, 0, 1 )
GFXDECODE_ENTRY( "gfx2", 0, tilelayout, 16, 8 )
GFXDECODE_ENTRY( "gfx3", 0, spritelayout, 16+8*16, 16 )
GFXDECODE_END

View File

@ -547,39 +547,16 @@ static INPUT_PORTS_START( itaten )
PORT_DIPSETTING( 0x80, DEF_STR( Cocktail ) )
INPUT_PORTS_END
static const gfx_layout charlayout =
{
8,8,
RGN_FRAC(1,1),
4,
{ 0, 1, 2, 3 },
{ 1*4, 0*4, 3*4, 2*4, 5*4, 4*4, 7*4, 6*4 },
{ 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 },
32*8
};
static const gfx_layout spritelayout =
{
16,16,
RGN_FRAC(1,1),
4,
{ 0, 1, 2, 3 },
{ 4,0,12,8,20,16,28,24,36,32,44,40,52,48,60,56 },
{ 0*64, 1*64, 2*64, 3*64, 4*64, 5*64, 6*64, 7*64,
8*64, 9*64, 10*64, 11*64, 12*64, 13*64, 14*64, 15*64 },
16*16*4
};
static GFXDECODE_START( gfx_dacholer )
GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0x00, 1 )
GFXDECODE_ENTRY( "gfx2", 0, charlayout, 0x10, 1 )
GFXDECODE_ENTRY( "gfx3", 0, spritelayout, 0x10, 1 )
GFXDECODE_ENTRY( "gfx1", 0, gfx_8x8x4_packed_lsb, 0x00, 1 )
GFXDECODE_ENTRY( "gfx2", 0, gfx_8x8x4_packed_lsb, 0x10, 1 )
GFXDECODE_ENTRY( "gfx3", 0, gfx_16x16x4_packed_lsb, 0x10, 1 )
GFXDECODE_END
static GFXDECODE_START( gfx_itaten )
GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0x00, 1 )
GFXDECODE_ENTRY( "gfx2", 0, charlayout, 0x00, 1 )
GFXDECODE_ENTRY( "gfx3", 0, spritelayout, 0x10, 1 )
GFXDECODE_ENTRY( "gfx1", 0, gfx_8x8x4_packed_lsb, 0x00, 1 )
GFXDECODE_ENTRY( "gfx2", 0, gfx_8x8x4_packed_lsb, 0x00, 1 )
GFXDECODE_ENTRY( "gfx3", 0, gfx_16x16x4_packed_lsb, 0x10, 1 )
GFXDECODE_END

View File

@ -338,29 +338,6 @@ INPUT_PORTS_END
static const gfx_layout charlayout =
{
8,8,
RGN_FRAC(1,1),
4,
{ 0, 1, 2, 3 },
{ 1*4, 0*4, 3*4, 2*4, 5*4, 4*4, 7*4, 6*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,
RGN_FRAC(1,1),
4,
{ 0, 1, 2, 3 },
{ 4,0,12,8,20,16,28,24,36,32,44,40,52,48,60,56 },
{ 0*64, 1*64, 2*64, 3*64, 4*64, 5*64, 6*64, 7*64,
8*64, 9*64, 10*64, 11*64, 12*64, 13*64, 14*64, 15*64 },
16*16*4
};
static const gfx_layout spritelayout =
{
16,16,
@ -375,15 +352,15 @@ static const gfx_layout spritelayout =
};
static GFXDECODE_START( gfx_galivan )
GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 16 )
GFXDECODE_ENTRY( "gfx2", 0, tilelayout, 16*16, 16 )
GFXDECODE_ENTRY( "gfx3", 0, spritelayout, 16*16+16*16, 256 )
GFXDECODE_ENTRY( "gfx1", 0, gfx_8x8x4_packed_lsb, 0, 16 )
GFXDECODE_ENTRY( "gfx2", 0, gfx_16x16x4_packed_lsb, 16*16, 16 )
GFXDECODE_ENTRY( "gfx3", 0, spritelayout, 16*16+16*16, 256 )
GFXDECODE_END
static GFXDECODE_START( gfx_ninjemak )
GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 8 )
GFXDECODE_ENTRY( "gfx2", 0, tilelayout, 8*16, 16 )
GFXDECODE_ENTRY( "gfx3", 0, spritelayout, 8*16+16*16, 256 )
GFXDECODE_ENTRY( "gfx1", 0, gfx_8x8x4_packed_lsb, 0, 8 )
GFXDECODE_ENTRY( "gfx2", 0, gfx_16x16x4_packed_lsb, 8*16, 16 )
GFXDECODE_ENTRY( "gfx3", 0, spritelayout, 8*16+16*16, 256 )
GFXDECODE_END

View File

@ -3128,7 +3128,7 @@ ROM_START( zeroguna ) /* Zero Gunner (Export), Model 2A */
ROM_LOAD32_WORD("mpr-20296.10", 0x000000, 0x400000, CRC(072d8a5e) SHA1(7f69c90dd3c3e6e522d1065b3c4b09434cb4e634) )
ROM_LOAD32_WORD("mpr-20297.11", 0x000002, 0x400000, CRC(ba6a825b) SHA1(670a86c3a1a78550c760cc66c0a6181928fb9054) )
ROM_LOAD32_WORD("mpr-20294.8", 0x800000, 0x400000, CRC(a0bd1474) SHA1(c0c032adac69bd545e3aab481878b08f3c3edab8) )
ROM_LOAD32_WORD("mpr-20295.9", 0x800002, 0x400000, CRC(c548cced) SHA1(d34f2fc9b4481c75a6824aa4bdd3f1884188d35b) )
ROM_LOAD32_WORD("mpr-20295.9", 0x800002, 0x400000, CRC(c548cced) SHA1(d34f2fc9b4481c75a6824aa4bdd3f1884188d35b) )
ROM_REGION32_LE( 0x800000, "copro_data", ROMREGION_ERASE00 ) // Copro extra data (collision/height map/etc) (COPRO socket)
@ -3664,8 +3664,7 @@ ROM_START( srallycdx ) /* Sega Rally Championship DX Revision A, Model 2A - Sing
ROM_LOAD32_WORD( "mpr-17755.29", 0x000002, 0x200000, CRC(2a6e7da4) SHA1(e60803ae951489fe47d66731d15c32249ca547b4) )
ROM_REGION( 0x010000, "drivecpu", 0 ) // Drive I/O program
ROM_LOAD( "epr-17762.ic12", 0x000000, 0x010000, NO_DUMP ) /* Need to verify actual EPR-xxxx number, might be EPR-17759 */
ROM_LOAD( "epr-17891.ic12", 0x000000, 0x010000, CRC(9a33b437) SHA1(3e8f210aa5159e78f640126cb5ce7f05f22560f2) ) /* REMOVE when EPR-17762 is dumped & added */
ROM_LOAD( "epr-17182.ic12", 0x000000, 0x010000, CRC(08d3db42) SHA1(57d902a835f4f738b9383760073193d206cf6343) )
ROM_REGION( 0x2000000, "polygons", 0 ) // Models
ROM_LOAD32_WORD( "mpr-17748.16", 0x000000, 0x200000, CRC(3148a2b2) SHA1(283cc49bfb6c6381a7ead9273fd097dca5b981b6) )
@ -3711,8 +3710,7 @@ ROM_START( srallycdxa ) // Sega Rally Championship DX, Model 2A? - Single player
ROM_LOAD32_WORD( "mpr-17755.29", 0x000002, 0x200000, CRC(2a6e7da4) SHA1(e60803ae951489fe47d66731d15c32249ca547b4) ) //
ROM_REGION( 0x010000, "drivecpu", 0 ) // Drive I/O program
ROM_LOAD( "epr-17762.ic12", 0x000000, 0x010000, NO_DUMP ) /* Need to verify actual EPR-xxxx number, might be EPR-17759 */
ROM_LOAD( "epr-17891.ic12", 0x000000, 0x010000, CRC(9a33b437) SHA1(3e8f210aa5159e78f640126cb5ce7f05f22560f2) ) /* REMOVE when EPR-17762 is dumped & added */
ROM_LOAD( "epr-17182.ic12", 0x000000, 0x010000, CRC(08d3db42) SHA1(57d902a835f4f738b9383760073193d206cf6343) )
ROM_REGION( 0x2000000, "polygons", 0 ) // Models
ROM_LOAD32_WORD( "mpr-17748.16", 0x000000, 0x200000, CRC(3148a2b2) SHA1(283cc49bfb6c6381a7ead9273fd097dca5b981b6) )
@ -3786,12 +3784,12 @@ ROM_START( manxtt ) /* Manx TT Superbike Twin Revision D, Model 2A - Can be set
ROM_REGION32_LE( 0x2400000, "main_data", 0 ) // Data
ROM_LOAD32_WORD( "mpr-18751.10", 0x000000, 0x200000, CRC(773ad43d) SHA1(4d1601dc08a08b724e33e7cd90a4f22e18cfed9c) )
ROM_LOAD32_WORD( "mpr-18752.11", 0x000002, 0x200000, CRC(4da3719e) SHA1(24007e4ae3ba1a06321328d14e2bd6002fa1936e) )
ROM_LOAD32_WORD( "mpr-18749.8", 0x400000, 0x200000, CRC(c3fe0eea) SHA1(ada21405a136935ac4da1a3535c25fccf903f2d1) )
ROM_LOAD32_WORD( "mpr-18750.9", 0x400002, 0x200000, CRC(40b55494) SHA1(d98ae5518c5d31b155b1a7c4f7d9d67f44d7beae) )
ROM_LOAD32_WORD( "mpr-18747.6", 0x800000, 0x200000, CRC(a65ec1e8) SHA1(92636bdff0ae4cdb43dfc2986fad2d1b59469323) )
ROM_LOAD32_WORD( "mpr-18748.7", 0x800002, 0x200000, CRC(375e3748) SHA1(6c2e903dd073b130bcabb347631b876dc868b494) )
ROM_LOAD32_WORD( "epr-18862.4", 0xc00000, 0x080000, CRC(9adc3a30) SHA1(029db946338f8e0eccace8590082cc96bdf13e31) )
ROM_LOAD32_WORD( "epr-18863.5", 0xc00002, 0x080000, CRC(603742e9) SHA1(f78a5f7e582d313880c734158bb0fa68b256a58a) )
ROM_LOAD32_WORD( "mpr-18749.8", 0x400000, 0x200000, CRC(c3fe0eea) SHA1(ada21405a136935ac4da1a3535c25fccf903f2d1) )
ROM_LOAD32_WORD( "mpr-18750.9", 0x400002, 0x200000, CRC(40b55494) SHA1(d98ae5518c5d31b155b1a7c4f7d9d67f44d7beae) )
ROM_LOAD32_WORD( "mpr-18747.6", 0x800000, 0x200000, CRC(a65ec1e8) SHA1(92636bdff0ae4cdb43dfc2986fad2d1b59469323) )
ROM_LOAD32_WORD( "mpr-18748.7", 0x800002, 0x200000, CRC(375e3748) SHA1(6c2e903dd073b130bcabb347631b876dc868b494) )
ROM_LOAD32_WORD( "epr-18862.4", 0xc00000, 0x080000, CRC(9adc3a30) SHA1(029db946338f8e0eccace8590082cc96bdf13e31) )
ROM_LOAD32_WORD( "epr-18863.5", 0xc00002, 0x080000, CRC(603742e9) SHA1(f78a5f7e582d313880c734158bb0fa68b256a58a) )
ROM_COPY( "main_data", 0xc00000, 0xd00000, 0x100000 )
ROM_COPY( "main_data", 0xc00000, 0xe00000, 0x100000 )
ROM_COPY( "main_data", 0xc00000, 0xf00000, 0x100000 )
@ -3844,14 +3842,14 @@ ROM_START( manxttc ) /* Manx TT Superbike Twin Revision C, Model 2A */
ROM_LOAD32_WORD( "epr-18825c.15", 0x040002, 0x020000, CRC(f88b036c) SHA1(f6196e8da5e6579fe3fa5c24ab9538964c98e267) )
ROM_REGION32_LE( 0x2400000, "main_data", 0 ) // Data
ROM_LOAD32_WORD( "mpr-18751.10", 0x000000, 0x200000, CRC(773ad43d) SHA1(4d1601dc08a08b724e33e7cd90a4f22e18cfed9c) )
ROM_LOAD32_WORD( "mpr-18752.11", 0x000002, 0x200000, CRC(4da3719e) SHA1(24007e4ae3ba1a06321328d14e2bd6002fa1936e) )
ROM_LOAD32_WORD( "mpr-18749.8", 0x400000, 0x200000, CRC(c3fe0eea) SHA1(ada21405a136935ac4da1a3535c25fccf903f2d1) )
ROM_LOAD32_WORD( "mpr-18750.9", 0x400002, 0x200000, CRC(40b55494) SHA1(d98ae5518c5d31b155b1a7c4f7d9d67f44d7beae) )
ROM_LOAD32_WORD( "mpr-18747.6", 0x800000, 0x200000, CRC(a65ec1e8) SHA1(92636bdff0ae4cdb43dfc2986fad2d1b59469323) )
ROM_LOAD32_WORD( "mpr-18748.7", 0x800002, 0x200000, CRC(375e3748) SHA1(6c2e903dd073b130bcabb347631b876dc868b494) )
ROM_LOAD32_WORD( "epr-18862.4", 0xc00000, 0x080000, CRC(9adc3a30) SHA1(029db946338f8e0eccace8590082cc96bdf13e31) )
ROM_LOAD32_WORD( "epr-18863.5", 0xc00002, 0x080000, CRC(603742e9) SHA1(f78a5f7e582d313880c734158bb0fa68b256a58a) )
ROM_LOAD32_WORD( "mpr-18751.10", 0x000000, 0x200000, CRC(773ad43d) SHA1(4d1601dc08a08b724e33e7cd90a4f22e18cfed9c) )
ROM_LOAD32_WORD( "mpr-18752.11", 0x000002, 0x200000, CRC(4da3719e) SHA1(24007e4ae3ba1a06321328d14e2bd6002fa1936e) )
ROM_LOAD32_WORD( "mpr-18749.8", 0x400000, 0x200000, CRC(c3fe0eea) SHA1(ada21405a136935ac4da1a3535c25fccf903f2d1) )
ROM_LOAD32_WORD( "mpr-18750.9", 0x400002, 0x200000, CRC(40b55494) SHA1(d98ae5518c5d31b155b1a7c4f7d9d67f44d7beae) )
ROM_LOAD32_WORD( "mpr-18747.6", 0x800000, 0x200000, CRC(a65ec1e8) SHA1(92636bdff0ae4cdb43dfc2986fad2d1b59469323) )
ROM_LOAD32_WORD( "mpr-18748.7", 0x800002, 0x200000, CRC(375e3748) SHA1(6c2e903dd073b130bcabb347631b876dc868b494) )
ROM_LOAD32_WORD( "epr-18862.4", 0xc00000, 0x080000, CRC(9adc3a30) SHA1(029db946338f8e0eccace8590082cc96bdf13e31) )
ROM_LOAD32_WORD( "epr-18863.5", 0xc00002, 0x080000, CRC(603742e9) SHA1(f78a5f7e582d313880c734158bb0fa68b256a58a) )
ROM_COPY( "main_data", 0xc00000, 0xd00000, 0x100000 )
ROM_COPY( "main_data", 0xc00000, 0xe00000, 0x100000 )
ROM_COPY( "main_data", 0xc00000, 0xf00000, 0x100000 )
@ -4114,14 +4112,14 @@ Model2c:
epr-20952.15 epr-20956.15 epr-20981.15 epr-20948.15
epr-20953.16 epr-20957.16 epr-20982.16 epr-20949.16
* The numbers for the Japan sets were not listed, but are shown for comparision
* The numbers for the Japan sets were not listed, but are shown for comparison
In Dynamite Deka 2 manual 420-6406-01 it states there are C-CRX versions of the
USA, Export and Korea versions as well as the Japan version.
*/
ROM_START( dynamcop ) /* Dynamite Cop (Export), Model 2A, Sega Game ID# 833-11341, ROM board ID# 834-11342 */
ROM_START( dynamcop ) /* Dynamite Cop (Export), Model 2A, Sega Game ID# 833-13461-02 DYNAMITE COP A-CRX EXP, ROM board ID# 834-13462-02 */
ROM_REGION( 0x200000, "maincpu", 0 ) // i960 program
ROM_LOAD32_WORD("epr-20930.12", 0x000000, 0x080000, CRC(b8fc8ff7) SHA1(53b0f9dc8494effa077170ddced2d95f43a5f134) )
ROM_LOAD32_WORD("epr-20931.13", 0x000002, 0x080000, CRC(89d13f88) SHA1(5e266b5e153a0d9a57360cfd1af81e3a58a2fb7d) )
@ -4172,7 +4170,7 @@ ROM_START( dynamcop ) /* Dynamite Cop (Export), Model 2A, Sega Game ID# 833-1134
ROM_PARAMETER( ":315_5881:key", "2c2a4a93" )
ROM_END
ROM_START( dyndeka2 ) /* Dynamite Deka 2 (Japan), Model 2A, Sega Game ID# 833-13461 DYNAMITE DEKA 2 A-CRX */
ROM_START( dyndeka2 ) /* Dynamite Deka 2 (Japan), Model 2A, Sega Game ID# 833-13461 DYNAMITE DEKA 2 A-CRX, ROM board ID# 834-13462 */
ROM_REGION( 0x200000, "maincpu", 0 ) // i960 program
ROM_LOAD32_WORD("epr-20922.12", 0x000000, 0x080000, CRC(0a8b5604) SHA1(4076998fc600c1df3bb5ef48d42681c01e651495) )
ROM_LOAD32_WORD("epr-20923.13", 0x000002, 0x080000, CRC(83be73d4) SHA1(1404a9c79cd2bae13f60e5e008307417324c3666) )
@ -5722,9 +5720,9 @@ The Dead or Alive set below is also known to have genuine Tecmo labels:
Sega ID# 836-12884 DEAD OR ALIVE
*/
ROM_START( doaa ) /* Dead or Alive Revision A, Model 2A, Sega Game ID# 833-11341, ROM board ID# 834-11342, 837-12880 security board */
ROM_START( doaa ) /* Dead or Alive Revision A, Model 2A, Sega Game ID# 836-12884 DEAD OR ALIVE, ROM board ID# 838-12885, 837-12880 security board */
ROM_REGION( 0x200000, "maincpu", 0 ) // i960 program
ROM_LOAD32_WORD("epr-19310a.12", 0x000000, 0x080000, CRC(06486f7a) SHA1(b3e14103570e5f45aed16e1c158e469bc85002ae) )
ROM_LOAD32_WORD("epr-19310a.12", 0x000000, 0x080000, CRC(06486f7a) SHA1(b3e14103570e5f45aed16e1c158e469bc85002ae) ) // Game Mode Settings : Nation : defaults to Japan, can select Japan, U.S.A. & Export
ROM_LOAD32_WORD("epr-19311a.13", 0x000002, 0x080000, CRC(1be62912) SHA1(dcc2df8e28e1a107867f74248e6ffcac83afe7c0) )
ROM_REGION32_LE( 0x2000000, "main_data", 0 ) // Data
@ -5765,9 +5763,9 @@ ROM_START( doaa ) /* Dead or Alive Revision A, Model 2A, Sega Game ID# 833-11341
MODEL2A_VID_BOARD
ROM_END
ROM_START( doaab ) /* Dead or Alive Revision A, Model 2A, Sega Game ID# 833-?????, ROM board ID# 838-12885-02, 837-12880 security board, defaults to export and can't be changed in test mode */
ROM_START( doaab ) /* Dead or Alive Revision A, Model 2A, Sega Game ID# 836-12884-02 DEAD OR ALIVE, ROM board ID# 838-12885-02, 837-12880 security board */
ROM_REGION( 0x200000, "maincpu", 0 ) // i960 program
ROM_LOAD32_WORD("epr-19383a.12", 0x000000, 0x080000, CRC(42e61481) SHA1(ecee88b17d60924c63d01ff72acb186350265e0a) )
ROM_LOAD32_WORD("epr-19383a.12", 0x000000, 0x080000, CRC(42e61481) SHA1(ecee88b17d60924c63d01ff72acb186350265e0a) ) // Game Mode Settings : Nation : defaults to Export and can't be changed in test mode
ROM_LOAD32_WORD("epr-19384a.13", 0x000002, 0x080000, CRC(034a3ab9) SHA1(a01d2f0a4accfdf892228b65c25e2ad9144ecf59) )
ROM_REGION32_LE( 0x2000000, "main_data", 0 ) // Data
@ -5811,7 +5809,7 @@ ROM_END
ROM_START( doa ) /* Dead or Alive Jan 10 1997, probably Revision C, Model 2B, 837-12880 security board */
ROM_REGION( 0x200000, "maincpu", 0 ) // i960 program
// ROMs have hand written labels - "EPR-19379B / EPR-19380B, 96/12/6", probably was reused and reprogrammed to newer revision
ROM_LOAD32_WORD("epr-19379c.15", 0x000000, 0x080000, CRC(5cc62fbe) SHA1(a1489b92f32bcd16cca10017975beb62fc27a060) )
ROM_LOAD32_WORD("epr-19379c.15", 0x000000, 0x080000, CRC(5cc62fbe) SHA1(a1489b92f32bcd16cca10017975beb62fc27a060) ) // Game Mode Settings : Nation : defaults to Japan, can select Japan, U.S.A. & Export
ROM_LOAD32_WORD("epr-19380c.16", 0x000002, 0x080000, CRC(58cfeaa9) SHA1(4319c22b8ebcff152676b62b5b1d4c1c7ce64fa6) )
ROM_REGION32_LE( 0x2000000, "main_data", 0 ) // Data
@ -5849,9 +5847,9 @@ ROM_START( doa ) /* Dead or Alive Jan 10 1997, probably Revision C, Model 2B, 83
ROM_LOAD16_WORD_SWAP("mpr-19332.34", 0x600000, 0x200000, CRC(2877f96f) SHA1(00e5677da30527b862e238f10762a5cbfbabde2b) )
ROM_END
ROM_START( doab ) /* Dead or Alive Revision B, Model 2B, 837-12880 security board */
ROM_START( doab ) /* Dead or Alive Dec 6 1996, Revision B, Model 2B, 837-12880 security board */
ROM_REGION( 0x200000, "maincpu", 0 ) // i960 program
ROM_LOAD32_WORD("epr-19379b.15", 0x000000, 0x080000, CRC(8a10a944) SHA1(c675a344f74d0118907fb5292495883c0c30c719) )
ROM_LOAD32_WORD("epr-19379b.15", 0x000000, 0x080000, CRC(8a10a944) SHA1(c675a344f74d0118907fb5292495883c0c30c719) ) // Game Mode Settings : Nation : defaults to Japan, can select Japan, U.S.A. & Export
ROM_LOAD32_WORD("epr-19380b.16", 0x000002, 0x080000, CRC(766c1ec8) SHA1(49250886f66db9fd37d88bc22c8f22046f74f043) )
ROM_REGION32_LE( 0x2000000, "main_data", 0 ) // Data

View File

@ -266,32 +266,11 @@ static INPUT_PORTS_START( pzletime )
PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_START2 )
INPUT_PORTS_END
static const gfx_layout layout8x8 =
{
8,8,
RGN_FRAC(1,1),
4,
{ 0, 1, 2, 3 },
{ 1*4, 0*4, 3*4, 2*4, 5*4, 4*4, 7*4, 6*4 },
{ 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 },
32*8
};
static const gfx_layout layout16x16 =
{
16,16,
RGN_FRAC(1,1),
4,
{ 0, 1, 2, 3 },
{ 4, 0, 12, 8, 20, 16, 28, 24, 16*32+4, 16*32+0, 16*32+12, 16*32+8, 16*32+20, 16*32+16, 16*32+28, 16*32+24 },
{ 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32, 8*32, 9*32, 10*32, 11*32, 12*32, 13*32, 14*32, 15*32 },
32*32
};
static GFXDECODE_START( gfx_pzletime )
GFXDECODE_ENTRY( "gfx1", 0, layout8x8, 0x100, 0x10 )
GFXDECODE_ENTRY( "gfx2", 0, layout16x16, 0x200, 0x10 )
GFXDECODE_ENTRY( "gfx3", 0, layout16x16, 0x000, 0x10 )
GFXDECODE_ENTRY( "gfx1", 0, gfx_8x8x4_packed_lsb, 0x100, 0x10 )
GFXDECODE_ENTRY( "gfx2", 0, gfx_8x8x4_col_2x2_group_packed_lsb, 0x200, 0x10 )
GFXDECODE_ENTRY( "gfx3", 0, gfx_8x8x4_col_2x2_group_packed_lsb, 0x000, 0x10 )
GFXDECODE_END
void pzletime_state::machine_start()

View File

@ -6,7 +6,7 @@ Quiz Punch II (C)1989 Space Computer
Driver by Luca Elia
- It uses an unknown DIP40 device for protection, that supplies
- It uses a COP MCU for protection, that supplies
the address to jump to (same as mosaic.cpp) and handles the EEPROM
PCB Layout
@ -97,6 +97,19 @@ Notes:
#include "speaker.h"
#include "tilemap.h"
// configurable logging
#define LOG_SCROLL (1U << 1)
#define LOG_MCU (1U << 2)
//#define VERBOSE (LOG_GENERAL | LOG_SCROLL | LOG_MCU)
#include "logmacro.h"
#define LOGSCROLL(...) LOGMASKED(LOG_SCROLL, __VA_ARGS__)
#define LOGMCU(...) LOGMASKED(LOG_MCU, __VA_ARGS__)
namespace {
class quizpun2_state : public driver_device
{
@ -110,7 +123,8 @@ public:
m_soundlatch(*this, "soundlatch"),
m_eeprom(*this, "eeprom"),
m_fg_ram(*this, "fg_ram"),
m_bg_ram(*this, "bg_ram")
m_bg_ram(*this, "bg_ram"),
m_mainbank(*this, "mainbank")
{ }
void quizpun2_base(machine_config &config);
@ -131,6 +145,7 @@ private:
required_device<eeprom_serial_93cxx_device> m_eeprom;
required_shared_ptr<uint8_t> m_fg_ram;
required_shared_ptr<uint8_t> m_bg_ram;
required_memory_bank m_mainbank;
tilemap_t *m_bg_tmap;
tilemap_t *m_fg_tmap;
@ -150,8 +165,10 @@ private:
void rombank_w(uint8_t data);
void irq_ack(uint8_t data);
void soundlatch_w(uint8_t data);
uint8_t protection_r();
void protection_w(uint8_t data);
uint32_t screen_update_quizpun2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
// quizpun2
void cop_d_w(uint8_t data);
@ -170,14 +187,11 @@ private:
uint8_t quizpun_68705_port_c_r();
void quizpun_68705_port_c_w(uint8_t data);
uint8_t quizpun_protection_r();
void quizpun_protection_w(uint8_t data);
void quizpun2_cop_map(address_map &map);
void quizpun2_io_map(address_map &map);
void quizpun2_map(address_map &map);
void quizpun2_sound_io_map(address_map &map);
void quizpun2_sound_map(address_map &map);
void io_map(address_map &map);
void main_map(address_map &map);
void sound_io_map(address_map &map);
void sound_map(address_map &map);
};
/***************************************************************************
@ -186,27 +200,27 @@ private:
TILE_GET_INFO_MEMBER(quizpun2_state::get_bg_tile_info)
{
uint16_t code = m_bg_ram[ tile_index * 2 ] + m_bg_ram[ tile_index * 2 + 1 ] * 256;
uint16_t code = m_bg_ram[tile_index * 2] + m_bg_ram[tile_index * 2 + 1] * 256;
tileinfo.set(0, code, code >> 12, TILE_FLIPXY((code & 0x800) >> 11));
}
TILE_GET_INFO_MEMBER(quizpun2_state::get_fg_tile_info)
{
uint16_t code = m_fg_ram[ tile_index * 4 ]/* + m_fg_ram[ tile_index * 4 + 1 ] * 256*/;
uint8_t color = m_fg_ram[ tile_index * 4 + 2 ];
uint16_t code = m_fg_ram[tile_index * 4]; // + m_fg_ram[tile_index * 4 + 1] * 256
uint8_t color = m_fg_ram[tile_index * 4 + 2];
tileinfo.set(1, code, color / 2, 0);
}
void quizpun2_state::bg_ram_w(offs_t offset, uint8_t data)
{
m_bg_ram[offset] = data;
m_bg_tmap->mark_tile_dirty(offset/2);
m_bg_tmap->mark_tile_dirty(offset / 2);
}
void quizpun2_state::fg_ram_w(offs_t offset, uint8_t data)
{
m_fg_ram[offset] = data;
m_fg_tmap->mark_tile_dirty(offset/4);
m_fg_tmap->mark_tile_dirty(offset / 4);
}
void quizpun2_state::scroll_w(uint8_t data)
@ -216,14 +230,16 @@ void quizpun2_state::scroll_w(uint8_t data)
void quizpun2_state::video_start()
{
m_bg_tmap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(quizpun2_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS,16,16,0x20,0x40);
m_fg_tmap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(quizpun2_state::get_fg_tile_info)), TILEMAP_SCAN_ROWS,16,16,0x20,0x40);
m_bg_tmap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(quizpun2_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 16, 16, 0x20, 0x40);
m_fg_tmap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(quizpun2_state::get_fg_tile_info)), TILEMAP_SCAN_ROWS, 16, 16, 0x20, 0x40);
m_bg_tmap->set_transparent_pen(0);
m_fg_tmap->set_transparent_pen(0);
save_item(NAME(m_scroll));
}
uint32_t quizpun2_state::screen_update_quizpun2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
uint32_t quizpun2_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
int layers_ctrl = -1;
@ -248,7 +264,7 @@ uint32_t quizpun2_state::screen_update_quizpun2(screen_device &screen, bitmap_in
if (layers_ctrl & 2) m_fg_tmap->draw(screen, bitmap, cliprect, 0, 0);
// popmessage("BG: %x FG: %x", bg_scroll, fg_scroll);
LOGSCROLL("BG: %x FG: %x", bg_scroll, fg_scroll);
return 0;
}
@ -266,12 +282,18 @@ uint32_t quizpun2_state::screen_update_quizpun2(screen_device &screen, bitmap_in
void quizpun2_state::machine_start()
{
uint8_t *ROM = memregion("maincpu")->base();
membank("bank1")->configure_entries(0, 0x20, &ROM[0x10000], 0x2000);
m_mainbank->configure_entries(0, 0x20, &ROM[0x10000], 0x2000);
save_item(NAME(m_mcu_data_port));
save_item(NAME(m_mcu_control_port));
save_item(NAME(m_mcu_pending));
save_item(NAME(m_mcu_repeat));
save_item(NAME(m_mcu_written));
}
void quizpun2_state::machine_reset()
{
membank("bank1")->set_entry(0);
m_mainbank->set_entry(0);
// quizpun2 service mode needs this to fix a race condition since the MCU takes a while to start up
m_maincpu->set_input_line(INPUT_LINE_HALT, ASSERT_LINE);
@ -319,7 +341,7 @@ uint8_t quizpun2_state::cop_in_r()
void quizpun2_state::rombank_w(uint8_t data)
{
membank("bank1")->set_entry(data & 0x1f);
m_mainbank->set_entry(data & 0x1f);
}
void quizpun2_state::irq_ack(uint8_t data)
@ -333,19 +355,19 @@ void quizpun2_state::soundlatch_w(uint8_t data)
m_audiocpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
}
void quizpun2_state::quizpun2_map(address_map &map)
void quizpun2_state::main_map(address_map &map)
{
map(0x0000, 0x7fff).rom();
map(0x8000, 0x9fff).bankr("bank1");
map(0x8000, 0x9fff).bankr(m_mainbank);
map(0xa000, 0xbfff).ram().w(FUNC(quizpun2_state::fg_ram_w)).share("fg_ram");
map(0xc000, 0xcfff).ram().w(FUNC(quizpun2_state::bg_ram_w)).share("bg_ram");
map(0xa000, 0xbfff).ram().w(FUNC(quizpun2_state::fg_ram_w)).share(m_fg_ram);
map(0xc000, 0xcfff).ram().w(FUNC(quizpun2_state::bg_ram_w)).share(m_bg_ram);
map(0xd000, 0xd3ff).ram().w(m_palette, FUNC(palette_device::write8)).share("palette");
map(0xe000, 0xffff).ram();
}
void quizpun2_state::quizpun2_io_map(address_map &map)
void quizpun2_state::io_map(address_map &map)
{
map.global_mask(0xff);
map(0x40, 0x40).w(FUNC(quizpun2_state::irq_ack));
@ -355,7 +377,7 @@ void quizpun2_state::quizpun2_io_map(address_map &map)
map(0x80, 0x80).portr("DSW");
map(0x90, 0x90).portr("IN0");
map(0xa0, 0xa0).portr("IN1");
map(0xe0, 0xe0).rw(FUNC(quizpun2_state::quizpun_protection_r), FUNC(quizpun2_state::quizpun_protection_w));
map(0xe0, 0xe0).rw(FUNC(quizpun2_state::protection_r), FUNC(quizpun2_state::protection_w));
}
void quizpun2_state::quizpun2_cop_map(address_map &map)
@ -365,19 +387,19 @@ void quizpun2_state::quizpun2_cop_map(address_map &map)
// quizpun
uint8_t quizpun2_state::quizpun_protection_r()
uint8_t quizpun2_state::protection_r()
{
// logerror("%s: port A read %02x\n", machine().describe_context(), m_mcu_data_port);
LOGMCU("%s: port A read %02x\n", machine().describe_context(), m_mcu_data_port);
/*
Upon reading this port the main cpu is stalled until the mcu provides the value to read
Upon reading this port the main CPU is stalled until the MCU provides the value to read
and explicitly un-stalls the z80. Is this possible under the current MAME architecture?
** ghastly hack **
The first read stalls the main cpu and triggers the mcu, it returns an incorrect value.
It also decrements the main cpu PC back to the start of the read instruction.
When the mcu un-stalls the Z80, the read happens again, returning the correct mcu-provided value this time
The first read stalls the main CPU and triggers the MCU, it returns an incorrect value.
It also decrements the main CPU PC back to the start of the read instruction.
When the MCU un-stalls the Z80, the read happens again, returning the correct MCU-provided value this time
*/
if (m_mcu_repeat)
{
@ -397,9 +419,9 @@ uint8_t quizpun2_state::quizpun_protection_r()
return m_mcu_data_port;
}
void quizpun2_state::quizpun_protection_w(uint8_t data)
void quizpun2_state::protection_w(uint8_t data)
{
// logerror("%s: port A write %02x\n", machine().describe_context(), data);
LOGMCU("%s: port A write %02x\n", machine().describe_context(), data);
m_mcu_data_port = data;
m_mcu_pending = true;
m_mcu_written = true;
@ -411,27 +433,27 @@ void quizpun2_state::quizpun_protection_w(uint8_t data)
Memory Maps - MCU
***************************************************************************/
// Port A - I/O with main cpu (data)
// Port A - I/O with main CPU (data)
uint8_t quizpun2_state::quizpun_68705_port_a_r()
{
// logerror("%s: port A read %02x\n", machine().describe_context(), m_mcu_data_port);
LOGMCU("%s: port A read %02x\n", machine().describe_context(), m_mcu_data_port);
return m_mcu_data_port;
}
void quizpun2_state::quizpun_68705_port_a_w(uint8_t data)
{
// logerror("%s: port A write %02x\n", machine().describe_context(), data);
LOGMCU("%s: port A write %02x\n", machine().describe_context(), data);
m_mcu_data_port = data;
}
// Port B - I/O with main cpu (status)
// Port B - I/O with main CPU (status)
uint8_t quizpun2_state::quizpun_68705_port_b_r()
{
// bit 3: 0 = pending
// bit 1: 0 = main cpu has written
// bit 0: 0 = main cpu is reading
// bit 1: 0 = main CPU has written
// bit 0: 0 = main CPU is reading
uint8_t const ret =
0xf4 |
@ -439,15 +461,15 @@ uint8_t quizpun2_state::quizpun_68705_port_b_r()
((m_mcu_pending && m_mcu_written) ? 0 : (1 << 1)) |
((m_mcu_pending && !m_mcu_written) ? 0 : (1 << 0));
// logerror("%s: port B read %02x\n", machine().describe_context(), ret);
LOGMCU("%s: port B read %02x\n", machine().describe_context(), ret);
return ret;
}
void quizpun2_state::quizpun_68705_port_b_w(uint8_t data)
{
// logerror("%s: port B write %02x\n", machine().describe_context(), data);
LOGMCU("%s: port B write %02x\n", machine().describe_context(), data);
// bit 2: 0->1 run main cpu
// bit 2: 0->1 run main CPU
if (!BIT(m_mcu_control_port, 2) && BIT(data, 2))
{
@ -462,7 +484,7 @@ void quizpun2_state::quizpun_68705_port_b_w(uint8_t data)
uint8_t quizpun2_state::quizpun_68705_port_c_r()
{
uint8_t const ret = 0xf7 | (m_eeprom->do_read() ? 0x08 : 0x00);
// logerror("%s: port C read %02x\n", machine().describe_context(), ret);
LOGMCU("%s: port C read %02x\n", machine().describe_context(), ret);
return ret;
}
@ -477,20 +499,20 @@ void quizpun2_state::quizpun_68705_port_c_w(uint8_t data)
// clock line asserted: write latch or select next bit to read
m_eeprom->clk_write(BIT(data, 0) ? ASSERT_LINE : CLEAR_LINE);
// logerror("%s: port C write %02x\n", machine().describe_context(), data);
LOGMCU("%s: port C write %02x\n", machine().describe_context(), data);
}
/***************************************************************************
Memory Maps - Sound CPU
***************************************************************************/
void quizpun2_state::quizpun2_sound_map(address_map &map)
void quizpun2_state::sound_map(address_map &map)
{
map(0x0000, 0xf7ff).rom();
map(0xf800, 0xffff).ram();
}
void quizpun2_state::quizpun2_sound_io_map(address_map &map)
void quizpun2_state::sound_io_map(address_map &map)
{
map.global_mask(0xff);
map(0x00, 0x00).nopw(); // IRQ end
@ -582,33 +604,33 @@ GFXDECODE_END
void quizpun2_state::quizpun2_base(machine_config &config)
{
/* basic machine hardware */
// basic machine hardware
Z80(config, m_maincpu, XTAL(8'000'000) / 2); // 4 MHz
m_maincpu->set_addrmap(AS_PROGRAM, &quizpun2_state::quizpun2_map);
m_maincpu->set_addrmap(AS_IO, &quizpun2_state::quizpun2_io_map);
m_maincpu->set_addrmap(AS_PROGRAM, &quizpun2_state::main_map);
m_maincpu->set_addrmap(AS_IO, &quizpun2_state::io_map);
m_maincpu->set_vblank_int("screen", FUNC(quizpun2_state::irq0_line_hold));
Z80(config, m_audiocpu, XTAL(8'000'000) / 2); // 4 MHz
m_audiocpu->set_addrmap(AS_PROGRAM, &quizpun2_state::quizpun2_sound_map);
m_audiocpu->set_addrmap(AS_IO, &quizpun2_state::quizpun2_sound_io_map);
m_audiocpu->set_addrmap(AS_PROGRAM, &quizpun2_state::sound_map);
m_audiocpu->set_addrmap(AS_IO, &quizpun2_state::sound_io_map);
m_audiocpu->set_vblank_int("screen", FUNC(quizpun2_state::irq0_line_hold));
// NMI generated by main CPU
EEPROM_93C46_16BIT(config, "eeprom");
/* 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));
screen.set_size(384, 256);
screen.set_visarea(0, 384-1, 0, 256-1);
screen.set_screen_update(FUNC(quizpun2_state::screen_update_quizpun2));
screen.set_screen_update(FUNC(quizpun2_state::screen_update));
screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_quizpun2);
PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 0x200);
/* sound hardware */
// sound hardware
SPEAKER(config, "mono").front_center();
GENERIC_LATCH_8(config, m_soundlatch);
@ -655,7 +677,7 @@ ROM_START( quizpun2 )
ROM_REGION( 0x50000, "maincpu", 0 )
ROM_LOAD( "u111", 0x00000, 0x08000, CRC(14bdaffc) SHA1(7fb5988ea565d7cbe3c8e2cdb9402d3cf81507d7) )
ROM_LOAD( "u117", 0x10000, 0x10000, CRC(e9d1d05e) SHA1(c24104e023d12db8c9199d3e18750414aa511e40) )
ROM_LOAD( "u118", 0x20000, 0x10000, CRC(1f232707) SHA1(3f5f44611f25c556521333f15daf3e2128cc1538) BAD_DUMP ) // fails rom check
ROM_LOAD( "u118", 0x20000, 0x10000, CRC(1f232707) SHA1(3f5f44611f25c556521333f15daf3e2128cc1538) BAD_DUMP ) // fails ROM check
ROM_LOAD( "u119", 0x30000, 0x10000, CRC(c73b82f7) SHA1(d5c683440e9db46dd5859b519b3f32da80352626) )
ROM_LOAD( "u120", 0x40000, 0x10000, CRC(700648b8) SHA1(dfa824166dfe7361d7c2ab0d8aa1ada882916cb9) )
@ -718,5 +740,8 @@ ROM_START( quizpun )
ROM_LOAD( "02.u2", 0x10000, 0x10000, CRC(9294a19c) SHA1(cd7109262e5f68b946c84aa390108bcc47ee1300) )
ROM_END
GAME( 1988, quizpun, 0, quizpun, quizpun2, quizpun2_state, empty_init, ROT270, "Space Computer", "Quiz Punch", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
GAME( 1989, quizpun2, 0, quizpun2, quizpun2, quizpun2_state, empty_init, ROT270, "Space Computer", "Quiz Punch II", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
} // anonymous namespace
GAME( 1988, quizpun, 0, quizpun, quizpun2, quizpun2_state, empty_init, ROT270, "Space Computer", "Quiz Punch", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1989, quizpun2, 0, quizpun2, quizpun2, quizpun2_state, empty_init, ROT270, "Space Computer", "Quiz Punch II", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )

View File

@ -9,22 +9,266 @@
keep pressed F1 during POST to see ROM/RAM/GFX tests.
The "Country" DIP switch is intended to select the game's title.
However, the program code in all known sets forces it to one value or
the other whenever it reads it outside of service mode.
However, the program code in all but one of the known sets forces it to
one value or the other whenever it reads it outside of service mode.
***************************************************************************/
#include "emu.h"
#include "includes/tail2nos.h"
#include "video/k051316.h"
#include "video/vsystem_gga.h"
#include "cpu/m68000/m68000.h"
#include "cpu/z80/z80.h"
#include "machine/6850acia.h"
#include "machine/gen_latch.h"
#include "sound/ymopn.h"
#include "video/vsystem_gga.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
#include "tilemap.h"
namespace {
class tail2nos_state : public driver_device
{
public:
tail2nos_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_txvideoram(*this, "txvideoram"),
m_spriteram(*this, "spriteram"),
m_zoomram(*this, "k051316"),
m_soundbank(*this, "soundbank"),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
m_k051316(*this, "k051316"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
m_soundlatch(*this, "soundlatch"),
m_acia(*this, "acia"),
m_analog(*this, "AN%u", 0U)
{ }
void tail2nos(machine_config &config);
template <int N> DECLARE_CUSTOM_INPUT_MEMBER(analog_in_r);
protected:
virtual void machine_start() override;
virtual void video_start() override;
private:
// memory pointers
required_shared_ptr<uint16_t> m_txvideoram;
required_shared_ptr<uint16_t> m_spriteram;
required_shared_ptr<uint16_t> m_zoomram;
required_memory_bank m_soundbank;
// video-related
tilemap_t *m_tx_tilemap;
uint8_t m_txbank;
uint8_t m_txpalette;
bool m_video_enable;
bool m_flip_screen;
// devices
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<k051316_device> m_k051316;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_device<generic_latch_8_device> m_soundlatch;
required_device<acia6850_device> m_acia;
required_ioport_array<2> m_analog;
void txvideoram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
void zoomdata_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
void gfxbank_w(uint8_t data);
void sound_bankswitch_w(uint8_t data);
uint8_t sound_semaphore_r();
TILE_GET_INFO_MEMBER(get_tile_info);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void postload();
void draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect );
K051316_CB_MEMBER(zoom_callback);
void main_map(address_map &map);
void sound_map(address_map &map);
void sound_port_map(address_map &map);
};
// video
/***************************************************************************
Callbacks for the TileMap code
***************************************************************************/
TILE_GET_INFO_MEMBER(tail2nos_state::get_tile_info)
{
uint16_t code = m_txvideoram[tile_index];
tileinfo.set(0,
(code & 0x1fff) + (m_txbank << 13),
((code & 0xe000) >> 13) + m_txpalette * 16,
0);
}
/***************************************************************************
Callbacks for the K051316
***************************************************************************/
K051316_CB_MEMBER(tail2nos_state::zoom_callback)
{
*code |= ((*color & 0x03) << 8);
*color = 32 + ((*color & 0x38) >> 3);
}
/***************************************************************************
Start the video hardware emulation.
***************************************************************************/
void tail2nos_state::postload()
{
m_tx_tilemap->mark_all_dirty();
m_k051316->gfx(0)->mark_all_dirty();
}
void tail2nos_state::video_start()
{
m_tx_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(tail2nos_state::get_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32);
m_tx_tilemap->set_transparent_pen(15);
machine().save().register_postload(save_prepost_delegate(FUNC(tail2nos_state::postload), this));
}
/***************************************************************************
Memory handlers
***************************************************************************/
void tail2nos_state::txvideoram_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
COMBINE_DATA(&m_txvideoram[offset]);
m_tx_tilemap->mark_tile_dirty(offset);
}
void tail2nos_state::zoomdata_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
int oldword = m_zoomram[offset];
COMBINE_DATA(&m_zoomram[offset]);
// tell the K051316 device the data changed
if (oldword != m_zoomram[offset])
m_k051316->mark_gfx_dirty(offset * 2);
}
void tail2nos_state::gfxbank_w(uint8_t data)
{
// -------- --pe-b-b
// p = palette bank
// b = tile bank
// e = video enable
// bits 0 and 2 select char bank
int bank = 0;
if (data & 0x04) bank |= 2;
if (data & 0x01) bank |= 1;
if (m_txbank != bank)
{
m_txbank = bank;
m_tx_tilemap->mark_all_dirty();
}
// bit 5 seems to select palette bank (used on startup)
if (data & 0x20)
bank = 7;
else
bank = 3;
if (m_txpalette != bank)
{
m_txpalette = bank;
m_tx_tilemap->mark_all_dirty();
}
// bit 4 seems to be video enable
m_video_enable = BIT(data, 4);
// bit 7 is flip screen
m_flip_screen = BIT(data, 7);
m_tx_tilemap->set_flip(m_flip_screen ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0);
m_tx_tilemap->set_scrolly(m_flip_screen ? -8 : 0);
}
/***************************************************************************
Display Refresh
***************************************************************************/
void tail2nos_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect )
{
for (int offs = 0; offs < m_spriteram.bytes() / 2; offs += 4)
{
int sx = m_spriteram[offs + 1];
if (sx >= 0x8000)
sx -= 0x10000;
int sy = 0x10000 - m_spriteram[offs + 0];
if (sy >= 0x8000)
sy -= 0x10000;
int code = m_spriteram[offs + 2] & 0x07ff;
int color = (m_spriteram[offs + 2] & 0xe000) >> 13;
int flipx = m_spriteram[offs + 2] & 0x1000;
int flipy = m_spriteram[offs + 2] & 0x0800;
if (m_flip_screen)
{
flipx = !flipx;
flipy = !flipy;
sx = 302 - sx;
sy = 216 - sy;
}
m_gfxdecode->gfx(1)->transpen(bitmap, // placement relative to zoom layer verified on the real thing
cliprect,
code,
40 + color,
flipx, flipy,
sx + 3, sy + 1, 15);
}
}
uint32_t tail2nos_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
if (m_video_enable)
{
m_k051316->zoom_draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0);
draw_sprites(bitmap, cliprect);
m_tx_tilemap->draw(screen, bitmap, cliprect, 0, 0);
}
else
bitmap.fill(0, cliprect);
return 0;
}
// machine
uint8_t tail2nos_state::sound_semaphore_r()
{
return m_soundlatch->pending_r();
@ -32,24 +276,24 @@ uint8_t tail2nos_state::sound_semaphore_r()
void tail2nos_state::sound_bankswitch_w(uint8_t data)
{
membank("bank3")->set_entry(data & 0x01);
m_soundbank->set_entry(data & 0x01);
}
void tail2nos_state::main_map(address_map &map)
{
map(0x000000, 0x03ffff).rom();
map(0x200000, 0x27ffff).rom().region("user1", 0); /* extra ROM */
map(0x200000, 0x27ffff).rom().region("user1", 0); // extra ROM
map(0x2c0000, 0x2dffff).rom().region("user2", 0);
map(0x400000, 0x41ffff).ram().w(FUNC(tail2nos_state::tail2nos_zoomdata_w)).share("k051316");
map(0x400000, 0x41ffff).ram().w(FUNC(tail2nos_state::zoomdata_w)).share(m_zoomram);
map(0x500000, 0x500fff).rw(m_k051316, FUNC(k051316_device::read), FUNC(k051316_device::write)).umask16(0x00ff);
map(0x510000, 0x51001f).w(m_k051316, FUNC(k051316_device::ctrl_w)).umask16(0x00ff);
map(0xff8000, 0xffbfff).ram(); /* work RAM */
map(0xffc000, 0xffc2ff).ram().share("spriteram");
map(0xff8000, 0xffbfff).ram(); // work RAM
map(0xffc000, 0xffc2ff).ram().share(m_spriteram);
map(0xffc300, 0xffcfff).ram();
map(0xffd000, 0xffdfff).ram().w(FUNC(tail2nos_state::tail2nos_txvideoram_w)).share("txvideoram");
map(0xffd000, 0xffdfff).ram().w(FUNC(tail2nos_state::txvideoram_w)).share(m_txvideoram);
map(0xffe000, 0xffefff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
map(0xfff000, 0xfff001).portr("IN0");
map(0xfff001, 0xfff001).w(FUNC(tail2nos_state::tail2nos_gfxbank_w));
map(0xfff001, 0xfff001).w(FUNC(tail2nos_state::gfxbank_w));
map(0xfff002, 0xfff003).portr("IN1");
map(0xfff004, 0xfff005).portr("DSW");
map(0xfff009, 0xfff009).r(FUNC(tail2nos_state::sound_semaphore_r)).w(m_soundlatch, FUNC(generic_latch_8_device::write)).umask16(0x00ff);
@ -61,7 +305,7 @@ void tail2nos_state::sound_map(address_map &map)
{
map(0x0000, 0x77ff).rom();
map(0x7800, 0x7fff).ram();
map(0x8000, 0xffff).bankr("bank3");
map(0x8000, 0xffff).bankr(m_soundbank);
}
void tail2nos_state::sound_port_map(address_map &map)
@ -127,7 +371,7 @@ static INPUT_PORTS_START( tail2nos )
PORT_DIPSETTING( 0x000d, "5 Coins/6 Credits" )
PORT_DIPSETTING( 0x000e, DEF_STR( 4C_5C ) )
PORT_DIPSETTING( 0x000a, DEF_STR( 2C_3C ) )
// PORT_DIPSETTING( 0x000f, DEF_STR( 2C_3C ) )
PORT_DIPSETTING( 0x000f, DEF_STR( 2C_3C ) )
PORT_DIPSETTING( 0x0001, DEF_STR( 1C_2C ) )
PORT_DIPSETTING( 0x0002, DEF_STR( 1C_3C ) )
PORT_DIPSETTING( 0x0003, DEF_STR( 1C_4C ) )
@ -144,7 +388,7 @@ static INPUT_PORTS_START( tail2nos )
PORT_DIPSETTING( 0x00d0, "5 Coins/6 Credits" )
PORT_DIPSETTING( 0x00e0, DEF_STR( 4C_5C ) )
PORT_DIPSETTING( 0x00a0, DEF_STR( 2C_3C ) )
// PORT_DIPSETTING( 0x00f0, DEF_STR( 2C_3C ) )
PORT_DIPSETTING( 0x00f0, DEF_STR( 2C_3C ) )
PORT_DIPSETTING( 0x0010, DEF_STR( 1C_2C ) )
PORT_DIPSETTING( 0x0020, DEF_STR( 1C_3C ) )
PORT_DIPSETTING( 0x0030, DEF_STR( 1C_4C ) )
@ -183,18 +427,6 @@ static INPUT_PORTS_START( sformula )
INPUT_PORTS_END
static const gfx_layout tail2nos_charlayout =
{
8,8,
RGN_FRAC(1,1),
4,
{ 0, 1, 2, 3 },
{ 1*4, 0*4, 3*4, 2*4, 5*4, 4*4, 7*4, 6*4 },
{ 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 },
32*8
};
static const gfx_layout tail2nos_spritelayout =
{
16,32,
@ -211,8 +443,8 @@ static const gfx_layout tail2nos_spritelayout =
};
static GFXDECODE_START( gfx_tail2nos )
GFXDECODE_ENTRY( "gfx1", 0, tail2nos_charlayout, 0, 128 )
GFXDECODE_ENTRY( "gfx2", 0, tail2nos_spritelayout, 0, 128 )
GFXDECODE_ENTRY( "chars", 0, gfx_8x8x4_packed_lsb, 0, 128 )
GFXDECODE_ENTRY( "sprites", 0, tail2nos_spritelayout, 0, 128 )
GFXDECODE_END
@ -220,8 +452,8 @@ void tail2nos_state::machine_start()
{
uint8_t *ROM = memregion("audiocpu")->base();
membank("bank3")->configure_entries(0, 2, &ROM[0x10000], 0x8000);
membank("bank3")->set_entry(0);
m_soundbank->configure_entries(0, 2, &ROM[0x10000], 0x8000);
m_soundbank->set_entry(0);
m_acia->write_cts(0);
m_acia->write_dcd(0);
@ -237,34 +469,31 @@ void tail2nos_state::machine_start()
save_item(NAME(m_flip_screen));
}
void tail2nos_state::machine_reset()
{
}
void tail2nos_state::tail2nos(machine_config &config)
{
/* basic machine hardware */
M68000(config, m_maincpu, XTAL(20'000'000)/2); /* verified on pcb */
// basic machine hardware
M68000(config, m_maincpu, XTAL(20'000'000) / 2); // verified on PCB
m_maincpu->set_addrmap(AS_PROGRAM, &tail2nos_state::main_map);
m_maincpu->set_vblank_int("screen", FUNC(tail2nos_state::irq6_line_hold));
Z80(config, m_audiocpu, XTAL(20'000'000)/4); /* verified on pcb */
Z80(config, m_audiocpu, XTAL(20'000'000) / 4); // verified on PCB
m_audiocpu->set_addrmap(AS_PROGRAM, &tail2nos_state::sound_map);
m_audiocpu->set_addrmap(AS_IO, &tail2nos_state::sound_port_map);
/* IRQs are triggered by the YM2608 */
// IRQs are triggered by the YM2608
ACIA6850(config, m_acia, 0);
m_acia->irq_handler().set_inputline("maincpu", M68K_IRQ_3);
//m_acia->txd_handler().set("link", FUNC(rs232_port_device::write_txd));
//m_acia->rts_handler().set("link", FUNC(rs232_port_device::write_rts));
/* 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));
screen.set_size(64*8, 32*8);
screen.set_visarea(0*8, 40*8-1, 1*8, 31*8-1);
screen.set_screen_update(FUNC(tail2nos_state::screen_update_tail2nos));
screen.set_screen_update(FUNC(tail2nos_state::screen_update));
screen.set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_tail2nos);
@ -279,7 +508,7 @@ void tail2nos_state::tail2nos(machine_config &config)
VSYSTEM_GGA(config, "gga", XTAL(14'318'181) / 2); // divider not verified
/* sound hardware */
// sound hardware
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
@ -287,7 +516,7 @@ void tail2nos_state::tail2nos(machine_config &config)
m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI);
m_soundlatch->set_separate_acknowledge(true);
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(m_audiocpu, 0);
ymsnd.port_b_write_callback().set(FUNC(tail2nos_state::sound_bankswitch_w));
ymsnd.add_route(0, "lspeaker", 0.25);
@ -307,7 +536,7 @@ ROM_START( tail2nos )
ROM_REGION16_BE( 0x80000, "user1", 0 ) // extra ROM mapped at 200000
ROM_LOAD16_WORD_SWAP( "a23.ic96", 0x00000, 0x80000, CRC(d851cf04) SHA1(ac5b366b686c5a037b127d223dc6fe90985eb160) )
/* unpopulated 4M mask ROM socket at IC105 */
// unpopulated 4M mask ROM socket at IC105
ROM_REGION16_BE( 0x20000, "user2", 0 ) // extra ROM mapped at 2c0000
ROM_LOAD16_BYTE( "v5.ic119", 0x00000, 0x10000, CRC(a9fe15a1) SHA1(d90bf40c610ea7daaa338f83f82cdffbae7da08e) )
@ -317,15 +546,15 @@ ROM_START( tail2nos )
ROM_LOAD( "v2.ic125", 0x00000, 0x08000, CRC(920d8920) SHA1(b8d30903248fee6f985af7fafbe534cfc8c6e829) )
ROM_LOAD( "v1.ic137", 0x10000, 0x10000, CRC(bf35c1a4) SHA1(a838740e023dc3344dc528324a8dbc48bb98b574) )
ROM_REGION( 0x100000, "gfx1", 0 )
ROM_REGION( 0x100000, "chars", 0 )
ROM_LOAD( "a24.ic34", 0x00000, 0x80000, CRC(b1e9de43) SHA1(0144252dd9ed561fbebd4994cccf11f6c87e1825) )
ROM_LOAD( "o1s.ic18", 0x80000, 0x40000, CRC(e27a8eb4) SHA1(4fcadabf42a1c3deeb6d74d75cdbee802cf16db5) )
ROM_REGION( 0x080000, "gfx2", 0 )
ROM_REGION( 0x080000, "sprites", 0 )
ROM_LOAD( "oj1.ic93", 0x000000, 0x40000, CRC(39c36b35) SHA1(a97480696bf6d81bf415737e03cc5324d439ab84) )
ROM_LOAD( "oj2.ic79", 0x040000, 0x40000, CRC(77ccaea2) SHA1(e38175859c75c6d0f2f01752fad6e167608c4662) )
ROM_REGION( 0x20000, "ymsnd", 0 ) // sound samples
ROM_REGION( 0x20000, "ymsnd", 0 )
ROM_LOAD( "osb.ic127", 0x00000, 0x20000, CRC(d49ab2f5) SHA1(92f7f6c8f35ac39910879dd88d2cfb6db7c848c9) )
ROM_END
@ -338,7 +567,7 @@ ROM_START( tail2nosa )
ROM_REGION16_BE( 0x80000, "user1", 0 ) // extra ROM mapped at 200000
ROM_LOAD16_WORD_SWAP( "a23.ic96", 0x00000, 0x80000, CRC(d851cf04) SHA1(ac5b366b686c5a037b127d223dc6fe90985eb160) )
/* unpopulated 4M mask ROM socket at IC105 */
// unpopulated 4M mask ROM socket at IC105
ROM_REGION16_BE( 0x20000, "user2", 0 ) // extra ROM mapped at 2c0000
ROM_LOAD16_BYTE( "v5.ic119", 0x00000, 0x10000, CRC(a9fe15a1) SHA1(d90bf40c610ea7daaa338f83f82cdffbae7da08e) )
@ -348,15 +577,15 @@ ROM_START( tail2nosa )
ROM_LOAD( "v2.ic125", 0x00000, 0x08000, CRC(920d8920) SHA1(b8d30903248fee6f985af7fafbe534cfc8c6e829) )
ROM_LOAD( "v1.ic137", 0x10000, 0x10000, CRC(bf35c1a4) SHA1(a838740e023dc3344dc528324a8dbc48bb98b574) )
ROM_REGION( 0x100000, "gfx1", 0 )
ROM_REGION( 0x100000, "chars", 0 )
ROM_LOAD( "a24.ic34", 0x00000, 0x80000, CRC(b1e9de43) SHA1(0144252dd9ed561fbebd4994cccf11f6c87e1825) )
ROM_LOAD( "o1s.ic18", 0x80000, 0x40000, CRC(e27a8eb4) SHA1(4fcadabf42a1c3deeb6d74d75cdbee802cf16db5) )
ROM_REGION( 0x080000, "gfx2", 0 )
ROM_REGION( 0x080000, "sprites", 0 )
ROM_LOAD( "oj1.ic93", 0x000000, 0x40000, CRC(39c36b35) SHA1(a97480696bf6d81bf415737e03cc5324d439ab84) )
ROM_LOAD( "oj2.ic79", 0x040000, 0x40000, CRC(77ccaea2) SHA1(e38175859c75c6d0f2f01752fad6e167608c4662) )
ROM_REGION( 0x20000, "ymsnd", 0 ) // sound samples
ROM_REGION( 0x20000, "ymsnd", 0 )
ROM_LOAD( "osb.ic127", 0x00000, 0x20000, CRC(d49ab2f5) SHA1(92f7f6c8f35ac39910879dd88d2cfb6db7c848c9) )
ROM_END
@ -369,7 +598,7 @@ ROM_START( sformula )
ROM_REGION16_BE( 0x80000, "user1", 0 ) // extra ROM mapped at 200000
ROM_LOAD16_WORD_SWAP( "a23.ic96", 0x00000, 0x80000, CRC(d851cf04) SHA1(ac5b366b686c5a037b127d223dc6fe90985eb160) )
/* unpopulated 4M mask ROM socket at IC105 */
// unpopulated 4M mask ROM socket at IC105
ROM_REGION16_BE( 0x20000, "user2", 0 ) // extra ROM mapped at 2c0000
ROM_LOAD16_BYTE( "v5.ic119", 0x00000, 0x10000, CRC(a9fe15a1) SHA1(d90bf40c610ea7daaa338f83f82cdffbae7da08e) )
@ -379,15 +608,15 @@ ROM_START( sformula )
ROM_LOAD( "v2.ic125", 0x00000, 0x08000, CRC(920d8920) SHA1(b8d30903248fee6f985af7fafbe534cfc8c6e829) )
ROM_LOAD( "v1.ic137", 0x10000, 0x10000, CRC(bf35c1a4) SHA1(a838740e023dc3344dc528324a8dbc48bb98b574) )
ROM_REGION( 0x100000, "gfx1", 0 )
ROM_REGION( 0x100000, "chars", 0 )
ROM_LOAD( "a24.ic34", 0x00000, 0x80000, CRC(b1e9de43) SHA1(0144252dd9ed561fbebd4994cccf11f6c87e1825) )
ROM_LOAD( "o1s.ic18", 0x80000, 0x40000, CRC(e27a8eb4) SHA1(4fcadabf42a1c3deeb6d74d75cdbee802cf16db5) )
ROM_REGION( 0x080000, "gfx2", 0 )
ROM_REGION( 0x080000, "sprites", 0 )
ROM_LOAD( "oj1.ic93", 0x000000, 0x40000, CRC(39c36b35) SHA1(a97480696bf6d81bf415737e03cc5324d439ab84) )
ROM_LOAD( "oj2.ic79", 0x040000, 0x40000, CRC(77ccaea2) SHA1(e38175859c75c6d0f2f01752fad6e167608c4662) )
ROM_REGION( 0x20000, "ymsnd", 0 ) // sound samples
ROM_REGION( 0x20000, "ymsnd", 0 )
ROM_LOAD( "osb.ic127", 0x00000, 0x20000, CRC(d49ab2f5) SHA1(92f7f6c8f35ac39910879dd88d2cfb6db7c848c9) )
ROM_END
@ -401,7 +630,7 @@ ROM_START( sformulaa )
ROM_REGION16_BE( 0x80000, "user1", 0 ) // extra ROM mapped at 200000
ROM_LOAD16_WORD_SWAP( "a23.ic96", 0x00000, 0x80000, CRC(d851cf04) SHA1(ac5b366b686c5a037b127d223dc6fe90985eb160) )
/* unpopulated 4M mask ROM socket at IC105 */
// unpopulated 4M mask ROM socket at IC105
ROM_REGION16_BE( 0x20000, "user2", 0 ) // extra ROM mapped at 2c0000
ROM_LOAD16_BYTE( "v5.ic119", 0x00000, 0x10000, CRC(a9fe15a1) SHA1(d90bf40c610ea7daaa338f83f82cdffbae7da08e) )
@ -411,19 +640,22 @@ ROM_START( sformulaa )
ROM_LOAD( "v2.ic125", 0x00000, 0x08000, CRC(920d8920) SHA1(b8d30903248fee6f985af7fafbe534cfc8c6e829) )
ROM_LOAD( "v1.ic137", 0x10000, 0x10000, CRC(bf35c1a4) SHA1(a838740e023dc3344dc528324a8dbc48bb98b574) )
ROM_REGION( 0x100000, "gfx1", 0 )
ROM_REGION( 0x100000, "chars", 0 )
ROM_LOAD( "a24.ic34", 0x00000, 0x80000, CRC(b1e9de43) SHA1(0144252dd9ed561fbebd4994cccf11f6c87e1825) )
ROM_LOAD( "o1s.ic18", 0x80000, 0x40000, CRC(e27a8eb4) SHA1(4fcadabf42a1c3deeb6d74d75cdbee802cf16db5) )
ROM_LOAD( "9.ic3", 0xc0000, 0x08000, CRC(c76edc0a) SHA1(2c6c21f8d1f3bcb0f65ba5a779fe479783271e0b) ) // present on this PCB, contains Japanese text + same font as in above roms, where does it map? is there another layer?
ROM_LOAD( "9.ic3", 0xc0000, 0x08000, CRC(c76edc0a) SHA1(2c6c21f8d1f3bcb0f65ba5a779fe479783271e0b) ) // present on this PCB, contains Japanese text + same font as in above ROMs, where does it map? is there another layer?
ROM_REGION( 0x080000, "gfx2", 0 )
ROM_REGION( 0x080000, "sprites", 0 )
ROM_LOAD( "oj1.ic93", 0x000000, 0x40000, CRC(39c36b35) SHA1(a97480696bf6d81bf415737e03cc5324d439ab84) )
ROM_LOAD( "oj2.ic79", 0x040000, 0x40000, CRC(77ccaea2) SHA1(e38175859c75c6d0f2f01752fad6e167608c4662) )
ROM_REGION( 0x20000, "ymsnd", 0 ) // sound samples
ROM_REGION( 0x20000, "ymsnd", 0 )
ROM_LOAD( "osb.ic127", 0x00000, 0x20000, CRC(d49ab2f5) SHA1(92f7f6c8f35ac39910879dd88d2cfb6db7c848c9) )
ROM_END
} // anonymous namespace
GAME( 1989, tail2nos, 0, tail2nos, tail2nos, tail2nos_state, empty_init, ROT90, "V-System Co.", "Tail to Nose - Great Championship / Super Formula", MACHINE_NODEVICE_LAN | MACHINE_SUPPORTS_SAVE ) // Only set that's affected by the Country dipswitch
GAME( 1989, tail2nosa, tail2nos, tail2nos, tail2nos, tail2nos_state, empty_init, ROT90, "V-System Co.", "Tail to Nose - Great Championship", MACHINE_NODEVICE_LAN | MACHINE_SUPPORTS_SAVE )
GAME( 1989, sformula, tail2nos, tail2nos, sformula, tail2nos_state, empty_init, ROT90, "V-System Co.", "Super Formula (Japan, set 1)", MACHINE_NODEVICE_LAN | MACHINE_SUPPORTS_SAVE ) // For Use in Japan... warning

View File

@ -462,17 +462,6 @@ INPUT_PORTS_END
static const gfx_layout charlayout =
{
8,8,
RGN_FRAC(1,1),
4,
{ 0, 1, 2, 3 },
{ 1*4, 0*4, 3*4, 2*4, 5*4, 4*4, 7*4, 6*4 },
{ 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 },
32*8
};
static const gfx_layout charlayout2 =
{
4,4,
@ -486,10 +475,10 @@ static const gfx_layout charlayout2 =
static GFXDECODE_START( gfx_taxidriv )
GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 1 )
GFXDECODE_ENTRY( "gfx2", 0, charlayout, 0, 1 )
GFXDECODE_ENTRY( "gfx3", 0, charlayout, 0, 1 )
GFXDECODE_ENTRY( "gfx4", 0, charlayout, 0, 1 )
GFXDECODE_ENTRY( "gfx1", 0, gfx_8x8x4_packed_lsb, 0, 1 )
GFXDECODE_ENTRY( "gfx2", 0, gfx_8x8x4_packed_lsb, 0, 1 )
GFXDECODE_ENTRY( "gfx3", 0, gfx_8x8x4_packed_lsb, 0, 1 )
GFXDECODE_ENTRY( "gfx4", 0, gfx_8x8x4_packed_lsb, 0, 1 )
GFXDECODE_ENTRY( "gfx5", 0, charlayout2, 0, 1 )
GFXDECODE_END

View File

@ -418,17 +418,6 @@ static INPUT_PORTS_START( horekidb2 )
INPUT_PORTS_END
static const gfx_layout char_layout =
{
8,8,
RGN_FRAC(1,1),
4,
{ 0, 1, 2, 3 },
{ 1*4, 0*4, 3*4, 2*4, 5*4, 4*4, 7*4, 6*4 },
{ 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 },
32*8
};
static const gfx_layout tile_layout =
{
16,16,
@ -466,7 +455,7 @@ static const gfx_layout sprite_layout =
};
static GFXDECODE_START( gfx_terracre )
GFXDECODE_ENTRY( "gfx1", 0, char_layout, 0, 1 )
GFXDECODE_ENTRY( "gfx1", 0, gfx_8x8x4_packed_lsb, 0, 1 )
GFXDECODE_ENTRY( "gfx2", 0, tile_layout, 1*16, 16 )
GFXDECODE_ENTRY( "gfx3", 0, sprite_layout, 1*16+16*16, 256 )
GFXDECODE_END

View File

@ -786,16 +786,6 @@ INPUT_PORTS_END
static const gfx_layout charlayout =
{
8,8,
RGN_FRAC(1,1),
4,
{ 0, 1, 2, 3 },
{ 1*4, 0*4, 3*4, 2*4, 5*4, 4*4, 7*4, 6*4 },
{ 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 },
32*8
};
static const gfx_layout spritelayout =
{
@ -811,7 +801,7 @@ static const gfx_layout spritelayout =
};
static GFXDECODE_START( gfx_welltris )
GFXDECODE_ENTRY( "chars", 0, charlayout, 16* 0, 4*16 )
GFXDECODE_ENTRY( "chars", 0, gfx_8x8x4_packed_lsb, 16* 0, 4*16 )
GFXDECODE_ENTRY( "sprites", 0, spritelayout, 16*96, 2*16 )
GFXDECODE_END

View File

@ -1,84 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Nicola Salmoria
/*************************************************************************
Tail to Nose / Super Formula
*************************************************************************/
#ifndef MAME_INCLUDES_TAIL2NOS_H
#define MAME_INCLUDES_TAIL2NOS_H
#pragma once
#include "machine/6850acia.h"
#include "machine/gen_latch.h"
#include "video/k051316.h"
#include "emupal.h"
#include "tilemap.h"
class tail2nos_state : public driver_device
{
public:
tail2nos_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_txvideoram(*this, "txvideoram"),
m_spriteram(*this, "spriteram"),
m_zoomram(*this, "k051316"),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
m_k051316(*this, "k051316"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
m_soundlatch(*this, "soundlatch"),
m_acia(*this, "acia"),
m_analog(*this, "AN%u", 0U)
{ }
void tail2nos(machine_config &config);
template <int N> DECLARE_CUSTOM_INPUT_MEMBER(analog_in_r);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void video_start() override;
private:
/* memory pointers */
required_shared_ptr<uint16_t> m_txvideoram;
required_shared_ptr<uint16_t> m_spriteram;
required_shared_ptr<uint16_t> m_zoomram;
/* video-related */
tilemap_t *m_tx_tilemap;
int m_txbank;
int m_txpalette;
bool m_video_enable;
bool m_flip_screen;
/* devices */
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<k051316_device> m_k051316;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_device<generic_latch_8_device> m_soundlatch;
required_device<acia6850_device> m_acia;
required_ioport_array<2> m_analog;
void tail2nos_txvideoram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
void tail2nos_zoomdata_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
void tail2nos_gfxbank_w(uint8_t data);
void sound_bankswitch_w(uint8_t data);
uint8_t sound_semaphore_r();
TILE_GET_INFO_MEMBER(get_tile_info);
uint32_t screen_update_tail2nos(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void tail2nos_postload();
void draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect );
K051316_CB_MEMBER(zoom_callback);
void main_map(address_map &map);
void sound_map(address_map &map);
void sound_port_map(address_map &map);
};
#endif // MAME_INCLUDES_TAIL2NOS_H

View File

@ -1,177 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Nicola Salmoria
#include "emu.h"
#include "includes/tail2nos.h"
#define TOTAL_CHARS 0x400
/***************************************************************************
Callbacks for the TileMap code
***************************************************************************/
TILE_GET_INFO_MEMBER(tail2nos_state::get_tile_info)
{
uint16_t code = m_txvideoram[tile_index];
tileinfo.set(0,
(code & 0x1fff) + (m_txbank << 13),
((code & 0xe000) >> 13) + m_txpalette * 16,
0);
}
/***************************************************************************
Callbacks for the K051316
***************************************************************************/
K051316_CB_MEMBER(tail2nos_state::zoom_callback)
{
*code |= ((*color & 0x03) << 8);
*color = 32 + ((*color & 0x38) >> 3);
}
/***************************************************************************
Start the video hardware emulation.
***************************************************************************/
void tail2nos_state::tail2nos_postload()
{
m_tx_tilemap->mark_all_dirty();
m_k051316->gfx(0)->mark_all_dirty();
}
void tail2nos_state::video_start()
{
m_tx_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(tail2nos_state::get_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32);
m_tx_tilemap->set_transparent_pen(15);
machine().save().register_postload(save_prepost_delegate(FUNC(tail2nos_state::tail2nos_postload), this));
}
/***************************************************************************
Memory handlers
***************************************************************************/
void tail2nos_state::tail2nos_txvideoram_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
COMBINE_DATA(&m_txvideoram[offset]);
m_tx_tilemap->mark_tile_dirty(offset);
}
void tail2nos_state::tail2nos_zoomdata_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
int oldword = m_zoomram[offset];
COMBINE_DATA(&m_zoomram[offset]);
// tell the K051316 device the data changed
if (oldword != m_zoomram[offset])
m_k051316->mark_gfx_dirty(offset * 2);
}
void tail2nos_state::tail2nos_gfxbank_w(uint8_t data)
{
// -------- --pe-b-b
// p = palette bank
// b = tile bank
// e = video enable
// bits 0 and 2 select char bank
int bank = 0;
if (data & 0x04) bank |= 2;
if (data & 0x01) bank |= 1;
if (m_txbank != bank)
{
m_txbank = bank;
m_tx_tilemap->mark_all_dirty();
}
// bit 5 seems to select palette bank (used on startup)
if (data & 0x20)
bank = 7;
else
bank = 3;
if (m_txpalette != bank)
{
m_txpalette = bank;
m_tx_tilemap->mark_all_dirty();
}
// bit 4 seems to be video enable
m_video_enable = BIT(data, 4);
// bit 7 is flip screen
m_flip_screen = BIT(data, 7);
m_tx_tilemap->set_flip(m_flip_screen ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0);
m_tx_tilemap->set_scrolly(m_flip_screen ? -8 : 0);
}
/***************************************************************************
Display Refresh
***************************************************************************/
void tail2nos_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect )
{
uint16_t *spriteram = m_spriteram;
int offs;
for (offs = 0; offs < m_spriteram.bytes() / 2; offs += 4)
{
int sx, sy, flipx, flipy, code, color;
sx = spriteram[offs + 1];
if (sx >= 0x8000)
sx -= 0x10000;
sy = 0x10000 - spriteram[offs + 0];
if (sy >= 0x8000)
sy -= 0x10000;
code = spriteram[offs + 2] & 0x07ff;
color = (spriteram[offs + 2] & 0xe000) >> 13;
flipx = spriteram[offs + 2] & 0x1000;
flipy = spriteram[offs + 2] & 0x0800;
if (m_flip_screen)
{
flipx = !flipx;
flipy = !flipy;
sx = 302 - sx;
sy = 216 - sy;
}
m_gfxdecode->gfx(1)->transpen(bitmap,/* placement relative to zoom layer verified on the real thing */
cliprect,
code,
40 + color,
flipx,flipy,
sx+3,sy+1,15);
}
}
uint32_t tail2nos_state::screen_update_tail2nos(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
if (m_video_enable)
{
m_k051316->zoom_draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0);
draw_sprites(bitmap, cliprect);
m_tx_tilemap->draw(screen, bitmap, cliprect, 0, 0);
}
else
bitmap.fill(0, cliprect);
return 0;
}