checkpoint (nw)

This commit is contained in:
MetalliC 2018-05-28 23:01:50 +03:00
parent 173ccc2b73
commit a0fc971911

View File

@ -151,6 +151,9 @@ public:
DECLARE_CUSTOM_INPUT_MEMBER(coin_r);
DECLARE_INPUT_CHANGED_MEMBER(coin_inc);
void init_istreb();
void init_moto();
required_device<cpu_device> m_maincpu;
required_device<i8255_device> m_ppi0;
required_device<i8255_device> m_ppi1;
@ -164,6 +167,7 @@ public:
TILE_GET_INFO_MEMBER(get_tile_info);
tilemap_t *m_tilemap;
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
uint32_t moto_screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
uint8_t coin_count;
uint8_t m_spr_ctrl[2];
@ -213,20 +217,38 @@ TILE_GET_INFO_MEMBER(istrebiteli_state::get_tile_info)
SET_TILE_INFO_MEMBER(0, m_tileram[tile_index] & 0x1f, 0, 0);
}
void istrebiteli_state::video_start()
void istrebiteli_state::init_istreb()
{
uint8_t *gfx = memregion("sprite")->base();
uint8_t temp[64];
for (int offs = 0; offs < 0x200; offs += 0x40)
{
memset(&temp[0], 0, 64);
memset(&temp[0], 0, sizeof(temp));
for (int spnum = 0; spnum < 8; spnum++)
for (int dot = 0; dot < 64; dot++)
temp[(dot >> 3) + spnum * 8] |= ((gfx[offs + dot] >> spnum) & 1) << (dot & 7);
memcpy(&gfx[offs], &temp[0], 64);
memcpy(&gfx[offs], &temp[0], sizeof(temp));
}
}
void istrebiteli_state::init_moto()
{
uint8_t *gfx = memregion("sprite")->base();
uint8_t temp[256];
for (int offs = 0; offs < 0x600; offs += 0x100)
{
memset(&temp[0], 0, sizeof(temp));
for (int spnum = 0; spnum < 8; spnum++)
for (int dot = 0; dot < 256; dot++)
temp[(dot >> 3) + spnum * 32] |= ((gfx[offs + dot] >> spnum) & 1) << (dot & 7);
memcpy(&gfx[offs], &temp[0], sizeof(temp));
}
}
void istrebiteli_state::video_start()
{
m_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(istrebiteli_state::get_tile_info), this), TILEMAP_SCAN_ROWS,
8, 16, 16, 1);
m_tilemap->set_scrolldx(96, 96);
@ -254,6 +276,32 @@ uint32_t istrebiteli_state::screen_update(screen_device &screen, bitmap_ind16 &b
return 0;
}
uint32_t istrebiteli_state::moto_screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
bitmap.fill(1);
rectangle rect = cliprect;
rect.offset(32, 64);
rect.set_size(16 * 8, 16);
m_tilemap->draw(screen, bitmap, rect, 0, 0);
// m_gfxdecode->gfx(3)->transpen(bitmap, cliprect, (m_spr_ctrl[0] & 0x40) ? 5 : 7, 0, 0, 0, m_spr_xy[4], m_spr_xy[5], 1);
// m_gfxdecode->gfx(3)->transpen(bitmap, cliprect, (m_spr_ctrl[1] & 0x40) ? 4 : 6, 0, 0, 0, m_spr_xy[6], m_spr_xy[7], 1);
int spritecode;
spritecode = ((m_spr_ctrl[0] >> 1) & 7) + ((m_spr_ctrl[0] << 3) & 8);
m_gfxdecode->gfx(1)->transpen(bitmap, cliprect, spritecode, 0, 0, 0, m_spr_xy[0], m_spr_xy[1], 1);
spritecode = ((m_spr_ctrl[1] >> 1) & 7) + ((m_spr_ctrl[1] << 3) & 8);
m_gfxdecode->gfx(2)->transpen(bitmap, cliprect, spritecode, 0, 0, 0, m_spr_xy[2], m_spr_xy[3], 1);
spritecode = (m_spr_ctrl[0] >> 4) & 7;
m_gfxdecode->gfx(3)->transpen(bitmap, cliprect, spritecode, 0, 0, 0, m_spr_xy[4], m_spr_xy[5], 1);
spritecode = ((m_spr_ctrl[1] >> 5) & 7) + ((m_spr_ctrl[1] >> 1) & 8);
m_gfxdecode->gfx(3)->transpen(bitmap, cliprect, spritecode, 0, 0, 0, m_spr_xy[6], m_spr_xy[7], 1);
return 0;
}
WRITE8_MEMBER(istrebiteli_state::tileram_w)
{
offset ^= 15;
@ -313,7 +361,7 @@ WRITE8_MEMBER(istrebiteli_state::spr_xy_w)
WRITE8_MEMBER(istrebiteli_state::moto_spr_xy_w)
{
m_spr_xy[offset] = data ^ 0xff;
m_spr_xy[offset] = data;
}
void istrebiteli_state::mem_map(address_map &map)
@ -412,23 +460,20 @@ INPUT_PORTS_END
static INPUT_PORTS_START( moto )
PORT_START("IN0")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT) // l/r
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT) // l/r
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT) // handle left
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT) // handle right
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP) // speed 30
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN) // speed 80
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_BUTTON1) // speed 120
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_BUTTON2) // ??
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_BUTTON3) // ??
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_BUTTON4) // brake or collision ?
//PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_CUSTOM) PORT_CUSTOM_MEMBER(DEVICE_SELF, istrebiteli_state, collision_r, 1)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_BUTTON1) // speed 120, 3 above bits encode 0 30 50 80 100 120 speeds
PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_BUTTON2) // skip RAM test
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_BUTTON3) // handle full left/right
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_BUTTON4) // brake
PORT_START("IN1")
PORT_START("IN2")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_START1) // coin, TODO check why it is locked
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_BUTTON5) // brake or collision ?
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_CUSTOM) PORT_HBLANK("screen") // guess, seems unused
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_CUSTOM) PORT_VBLANK("screen")
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_BUTTON5) // collision ?
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_CUSTOM) PORT_HBLANK("screen") // guess, seems unused
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_CUSTOM) PORT_VBLANK("screen")
INPUT_PORTS_END
static const gfx_layout char_layout =
@ -453,6 +498,17 @@ static const gfx_layout sprite_layout =
8*8
};
static const gfx_layout moto_sprite_layout =
{
16,16,
16,
1,
{ 0 },
{ 8,9,10,11,12,13,14,15,0,1,2,3,4,5,6,7 },
{ 15*16,14*16,13*16,12*16,11*16,10*16,9*16,8*16,7*16,6*16,5*16,4*16,3*16,2*16,1*16,0*16 },
16*16
};
static const gfx_layout projectile_layout =
{
16,16,
@ -471,6 +527,13 @@ static GFXDECODE_START( gfx_istrebiteli )
GFXDECODE_ENTRY( "sprite", 0x0200, projectile_layout, 0, 2 )
GFXDECODE_END
static GFXDECODE_START( gfx_motogonki )
GFXDECODE_ENTRY( "chars", 0x0000, char_layout, 2, 2 )
GFXDECODE_ENTRY( "sprite", 0x0000, moto_sprite_layout, 0, 2 )
GFXDECODE_ENTRY( "sprite", 0x0200, moto_sprite_layout, 0, 2 )
GFXDECODE_ENTRY( "sprite", 0x0400, moto_sprite_layout, 2, 2 )
GFXDECODE_END
MACHINE_CONFIG_START(istrebiteli_state::istreb)
/* basic machine hardware */
MCFG_DEVICE_ADD(I8080_TAG, I8080, XTAL(8'000'000) / 4) // KR580VM80A
@ -504,14 +567,35 @@ MACHINE_CONFIG_START(istrebiteli_state::istreb)
MACHINE_CONFIG_END
MACHINE_CONFIG_START(istrebiteli_state::motogonki)
istreb(config);
MCFG_DEVICE_REPLACE(I8080_TAG, I8080, XTAL(15'700'000) / 9) // KR580VM80A
/* basic machine hardware */
MCFG_DEVICE_ADD(I8080_TAG, I8080, XTAL(15'700'000) / 9) // KR580VM80A
MCFG_DEVICE_PROGRAM_MAP(moto_mem_map)
MCFG_DEVICE_IO_MAP(moto_io_map)
MCFG_DEVICE_MODIFY("ppi1")
MCFG_DEVICE_ADD("ppi0", I8255A, 0)
MCFG_I8255_OUT_PORTA_CB(WRITE8(*this, istrebiteli_state, spr0_ctrl_w))
MCFG_I8255_OUT_PORTB_CB(WRITE8(*this, istrebiteli_state, spr1_ctrl_w))
MCFG_I8255_OUT_PORTC_CB(WRITE8(*this, istrebiteli_state, sound_w))
MCFG_DEVICE_ADD("ppi1", I8255A, 0)
MCFG_I8255_IN_PORTA_CB(IOPORT("IN0"))
// PORT B writen 1 if speed 120, never reset later
MCFG_I8255_IN_PORTC_CB(IOPORT("IN1"))
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_RAW_PARAMS(XTAL(8'000'000) / 2, 256, 64, 256, 312, 0, 256)
MCFG_SCREEN_UPDATE_DRIVER(istrebiteli_state, moto_screen_update)
MCFG_SCREEN_PALETTE("palette")
MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_motogonki)
MCFG_PALETTE_ADD("palette", 4)
MCFG_PALETTE_INIT_OWNER(istrebiteli_state, istrebiteli)
/* sound hardware */
SPEAKER(config, "mono").front_center();
MCFG_DEVICE_ADD("custom", ISTREBITELI_SOUND, XTAL(8'000'000) / 2 / 256)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
MACHINE_CONFIG_END
ROM_START( istreb )
@ -545,16 +629,16 @@ ROM_START( motogonki )
ROM_LOAD( "003_ig8.g8", 0x000, 0x200, CRC(9af1e9de) SHA1(4bc89bc0c1f229ca3ebee983ae2fb3910d8ca599) )
ROM_REGION( 0x1000, "sprite", 0 ) // gfx layout is not correct
ROM_LOAD( "006_b1.b1", 0x000, 0x200, CRC(ae9820fb) SHA1(7727d20e314aee670ba36ca6ea7ca5a4da0fc1cd) )
ROM_LOAD( "006_02.b5", 0x200, 0x200, CRC(e5c17daf) SHA1(1b6ffeba7dd98da11e5eb953280dd53f0f77fa7f) )
ROM_LOAD( "006_03.b7", 0x400, 0x200, CRC(e1731d8d) SHA1(744fd768754a65a66bfcdb1959b4d6796bff4fcb) )
ROM_LOAD( "006_05.b3", 0x600, 0x100, CRC(7dc4f9c9) SHA1(8a40f9f021b1662b1c638c7fdcefead1687ca4f1) )
ROM_LOAD( "006_01.d3", 0x700, 0x100, CRC(b53b83c9) SHA1(8f9733c827cc9aacc7c182585dcbc5da01357468) )
ROM_LOAD( "006_04.w13", 0x800, 0x100, CRC(6d6441f6) SHA1(999356e5b31a03c667d6cb975210e058e340509e) )
ROM_LOAD( "006_b1.b1", 0x000, 0x200, CRC(ae9820fb) SHA1(7727d20e314aee670ba36ca6ea7ca5a4da0fc1cd) ) // player bike sprites, 16 16x16
ROM_LOAD( "006_02.b5", 0x200, 0x200, CRC(e5c17daf) SHA1(1b6ffeba7dd98da11e5eb953280dd53f0f77fa7f) ) // opponents, road signs, etc sprites, 16 16x16
ROM_LOAD( "006_03.b7", 0x400, 0x200, CRC(e1731d8d) SHA1(744fd768754a65a66bfcdb1959b4d6796bff4fcb) ) // more opponents, road signs, etc sprites, 16 16x16
ROM_LOAD( "006_05.b3", 0x600, 0x100, CRC(7dc4f9c9) SHA1(8a40f9f021b1662b1c638c7fdcefead1687ca4f1) ) // unknown
ROM_LOAD( "006_01.d3", 0x700, 0x100, CRC(b53b83c9) SHA1(8f9733c827cc9aacc7c182585dcbc5da01357468) ) // unknown
ROM_LOAD( "006_04.w13", 0x800, 0x100, CRC(6d6441f6) SHA1(999356e5b31a03c667d6cb975210e058e340509e) ) // unknown
ROM_REGION(0x200, "soundrom", 0)
ROM_LOAD( "003_iw3.w3", 0x000, 0x200, CRC(814854ba) SHA1(2cbfd60df01f00d7659393efa58547de660bf201) )
ROM_END
GAME( 198?, istreb, 0, istreb, istreb, istrebiteli_state, empty_init, ROT0, "Terminal", "Istrebiteli", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE)
GAME( 198?, motogonki, 0, motogonki, moto, istrebiteli_state, empty_init, ROT0, "Terminal", "Motogonki", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
GAME( 198?, istreb, 0, istreb, istreb, istrebiteli_state, init_istreb, ROT0, "Terminal", "Istrebiteli", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE)
GAME( 198?, motogonki, 0, motogonki, moto, istrebiteli_state, init_moto, ROT0, "Terminal", "Motogonki", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)