diff --git a/src/mame/drivers/tiamc1.cpp b/src/mame/drivers/tiamc1.cpp index 9e79fd1fba5..fb3b56fdb24 100644 --- a/src/mame/drivers/tiamc1.cpp +++ b/src/mame/drivers/tiamc1.cpp @@ -141,9 +141,9 @@ static ADDRESS_MAP_START( tiamc1_map, AS_PROGRAM, 8, tiamc1_state ) ADDRESS_MAP_END static ADDRESS_MAP_START( kotrybolov_map, AS_PROGRAM, 8, tiamc1_state ) - AM_RANGE(0xf000, 0xf3ff) AM_WRITE(tiamc1_videoram_w) - AM_RANGE(0x0000, 0x5fff) AM_ROM + AM_RANGE(0x0000, 0xbfff) AM_ROM AM_RANGE(0xc000, 0xcfff) AM_RAM + AM_RANGE(0xf000, 0xf3ff) AM_WRITE(kot_videoram_w) ADDRESS_MAP_END static ADDRESS_MAP_START( tiamc1_io_map, AS_IO, 8, tiamc1_state ) @@ -176,7 +176,7 @@ static ADDRESS_MAP_START( kotrybolov_io_map, AS_IO, 8, tiamc1_state ) AM_RANGE(0xe0, 0xef) AM_WRITE(tiamc1_palette_w) // color ram AM_RANGE(0xf0, 0xf0) AM_WRITE(tiamc1_bg_vshift_w) // background V scroll AM_RANGE(0xf4, 0xf4) AM_WRITE(tiamc1_bg_hshift_w) // background H scroll - AM_RANGE(0xf8, 0xf8) AM_WRITE(tiamc1_bankswitch_w) // VRAM selector and character rom bank/offset ? + AM_RANGE(0xf8, 0xf8) AM_WRITE(kot_bankswitch_w) // character rom offset, msb video on/off AM_RANGE(0xc0, 0xc3) AM_DEVWRITE("2x8253", tiamc1_sound_device, tiamc1_timer0_w) // TODO this PCB have single 8253 AM_RANGE(0xd0, 0xd0) AM_READ_PORT("IN0") AM_RANGE(0xd1, 0xd1) AM_READ_PORT("IN1") @@ -236,6 +236,38 @@ static INPUT_PORTS_START( gorodki ) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_VBLANK("screen") INPUT_PORTS_END +static INPUT_PORTS_START( kot ) + PORT_START("IN0") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) /* Player 0 JOYSTICK_RIGHT */ + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) /* Player 2 JOYSTICK_RIGHT */ + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) /* Player 3 JOYSTICK_RIGHT */ + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED ) /* Player 0 JOYSTICK_LEFT */ + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) /* Player 2 JOYSTICK_LEFT */ + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) /* Player 3 JOYSTICK_LEFT */ + + PORT_START("IN1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) /* Player 0 JOYSTICK_UP */ + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) /* Player 2 JOYSTICK_UP */ + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) /* Player 3 JOYSTICK_UP */ + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED ) /* Player 0 JOYSTICK_DOWN */ + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) /* Player 2 JOYSTICK_DOWN */ + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE ) + + PORT_START("IN2") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SPECIAL ) /* OUT:coin lockout */ + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SPECIAL ) /* OUT:game counter */ + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* RAZR ??? */ + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_COIN1 ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) // Punch / Right + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) // Kick / Left + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_VBLANK("screen") +INPUT_PORTS_END + static const gfx_layout sprites16x16_layout = { 16,16, @@ -258,11 +290,26 @@ static const gfx_layout char_layout = 8*8 }; +static const gfx_layout char_rom_layout = +{ + 8,8, + 256, + 4, + { 1024*8*8*3, 1024*8*8*2, 1024*8*8*1, 1024*8*8*0 }, + { 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 +}; + static GFXDECODE_START( tiamc1 ) GFXDECODE_ENTRY( nullptr, 0x0000, char_layout, 0, 16 ) GFXDECODE_ENTRY( "gfx1", 0x0000, sprites16x16_layout, 0, 16 ) GFXDECODE_END +static GFXDECODE_START( kot ) + GFXDECODE_ENTRY( nullptr, 0x0000, char_rom_layout, 0, 16 ) + GFXDECODE_ENTRY( "gfx1", 0x0000, sprites16x16_layout, 0, 16 ) +GFXDECODE_END static MACHINE_CONFIG_START( tiamc1, tiamc1_state ) /* basic machine hardware */ @@ -297,6 +344,12 @@ static MACHINE_CONFIG_DERIVED(kot, tiamc1) MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(kotrybolov_map) MCFG_CPU_IO_MAP(kotrybolov_io_map) + + MCFG_SCREEN_MODIFY("screen") + MCFG_VIDEO_START_OVERRIDE(tiamc1_state, kot) + MCFG_SCREEN_UPDATE_DRIVER(tiamc1_state, screen_update_kot) + + MCFG_GFXDECODE_MODIFY("gfxdecode", kot) MACHINE_CONFIG_END @@ -400,20 +453,21 @@ ROM_END // notable ICs: i8080, i8255, i8253, 3x KR573RU8 2Kx8 SRAM, 2x KR541RU2 1Kx4 RAM, 9x KR531RU8 16x4 RAM // tile/character generator uses ROMs instead of RAM ROM_START( kot ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0xc000, "maincpu", ROMREGION_ERASE00) ROM_LOAD( "854.6", 0x00000, 0x2000, CRC(44e5e8fc) SHA1(dafbace689f3834d5c6e952a2f6188fb190845e4) ) ROM_LOAD( "855.7", 0x02000, 0x2000, CRC(0bb2e4b2) SHA1(7bbb45b18e3b444e3b6006a4670453ec0792e5d3) ) ROM_LOAD( "856.8", 0x04000, 0x2000, CRC(9180c98f) SHA1(4085180b9e9772e965c487e7b02d88fcae973e87) ) - ROM_REGION( 0x10000, "gfx1", 0 ) + ROM_REGION( 0x8000, "gfx1", 0 ) ROM_LOAD( "850.5", 0x00000, 0x2000, CRC(5dc3a102) SHA1(e97d219f7004291438b991435b7fe5d5be01d468) ) // sprite gfx ROM_LOAD( "851.6", 0x02000, 0x2000, CRC(7db239a0) SHA1(af5772afff9009f63e2ab95c1cb00e047f3ed7e4) ) ROM_LOAD( "852.7", 0x04000, 0x2000, CRC(c7700f88) SHA1(1a20cc60b083259070e4f1687b09a31fc763d47e) ) ROM_LOAD( "853.8", 0x06000, 0x2000, CRC(b94bf1af) SHA1(da403c51fd78f99b82304c67f2197078f4ea0bf5) ) - ROM_LOAD( "846.1", 0x08000, 0x2000, CRC(42447f4a) SHA1(bd35f2f5e468f9191680bf2c1800e09bb9ae1691) ) // tile gfx - ROM_LOAD( "847.2", 0x0a000, 0x2000, CRC(99ada5e8) SHA1(9425a515105ec9e9989aae736645b270e39420be) ) - ROM_LOAD( "848.3", 0x0c000, 0x2000, CRC(a124cff4) SHA1(d1d8e6f725a6f30058d52cdbe80b598149cd6052) ) - ROM_LOAD( "849.4", 0x0e000, 0x2000, CRC(5d27fda6) SHA1(f1afb39c7422caaa5eff53388f1b7241dd7c1cd7) ) + ROM_REGION( 0x8000, "gfx2", 0 ) + ROM_LOAD( "846.1", 0x00000, 0x2000, CRC(42447f4a) SHA1(bd35f2f5e468f9191680bf2c1800e09bb9ae1691) ) // tile gfx + ROM_LOAD( "847.2", 0x02000, 0x2000, CRC(99ada5e8) SHA1(9425a515105ec9e9989aae736645b270e39420be) ) + ROM_LOAD( "848.3", 0x04000, 0x2000, CRC(a124cff4) SHA1(d1d8e6f725a6f30058d52cdbe80b598149cd6052) ) + ROM_LOAD( "849.4", 0x06000, 0x2000, CRC(5d27fda6) SHA1(f1afb39c7422caaa5eff53388f1b7241dd7c1cd7) ) ROM_END GAME( 1988, konek, 0, tiamc1, tiamc1, driver_device, 0, ROT0, "Terminal", "Konek-Gorbunok", MACHINE_SUPPORTS_SAVE ) @@ -421,4 +475,4 @@ GAME( 1988, sosterm, 0, tiamc1, tiamc1, driver_device, 0, ROT0, "Terminal", "S GAME( 1988, koroleva, 0, tiamc1, tiamc1, driver_device, 0, ROT0, "Terminal", "Snezhnaja Koroleva", MACHINE_SUPPORTS_SAVE ) GAME( 1988, bilyard, 0, tiamc1, tiamc1, driver_device, 0, ROT0, "Terminal", "Billiard", MACHINE_SUPPORTS_SAVE ) GAME( 1988, gorodki, 0, tiamc1, gorodki, driver_device, 0, ROT0, "Terminal", "Gorodki", MACHINE_SUPPORTS_SAVE ) -GAME( 1988, kot, 0, kot, tiamc1, driver_device, 0, ROT0, "Terminal", "Kot-Rybolov", MACHINE_NOT_WORKING ) +GAME( 1988, kot, 0, kot, kot, driver_device, 0, ROT0, "Terminal", "Kot-Rybolov", MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE) diff --git a/src/mame/includes/tiamc1.h b/src/mame/includes/tiamc1.h index a6a7096efb7..57cabfd87b1 100644 --- a/src/mame/includes/tiamc1.h +++ b/src/mame/includes/tiamc1.h @@ -33,12 +33,16 @@ public: DECLARE_WRITE8_MEMBER(tiamc1_bg_vshift_w); DECLARE_WRITE8_MEMBER(tiamc1_bg_hshift_w); DECLARE_WRITE8_MEMBER(tiamc1_palette_w); + DECLARE_WRITE8_MEMBER(kot_bankswitch_w); + DECLARE_WRITE8_MEMBER(kot_videoram_w); TILE_GET_INFO_MEMBER(get_bg1_tile_info); TILE_GET_INFO_MEMBER(get_bg2_tile_info); virtual void machine_reset() override; virtual void video_start() override; + DECLARE_VIDEO_START(kot); DECLARE_PALETTE_INIT(tiamc1); UINT32 screen_update_tiamc1(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + UINT32 screen_update_kot(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect); required_device m_maincpu; required_device m_gfxdecode; diff --git a/src/mame/video/tiamc1.cpp b/src/mame/video/tiamc1.cpp index 8bdf45ff7e3..09ebf7ae66a 100644 --- a/src/mame/video/tiamc1.cpp +++ b/src/mame/video/tiamc1.cpp @@ -36,6 +36,12 @@ WRITE8_MEMBER(tiamc1_state::tiamc1_videoram_w) } } +WRITE8_MEMBER(tiamc1_state::kot_videoram_w) +{ + m_tileram[offset] = data; + m_bg_tilemap1->mark_tile_dirty(offset); +} + WRITE8_MEMBER(tiamc1_state::tiamc1_bankswitch_w) { if ((data & 128) != (m_layers_ctrl & 128)) @@ -44,6 +50,13 @@ WRITE8_MEMBER(tiamc1_state::tiamc1_bankswitch_w) m_layers_ctrl = data; } +WRITE8_MEMBER(tiamc1_state::kot_bankswitch_w) +{ + m_gfxdecode->gfx(0)->set_source(m_charram + (data >> 1) * 0x100); + + m_layers_ctrl = data; // bit 0 - video enable/disable, unemulated +} + WRITE8_MEMBER(tiamc1_state::tiamc1_sprite_x_w) { m_spriteram_x[offset] = data; @@ -154,6 +167,33 @@ void tiamc1_state::video_start() m_gfxdecode->gfx(0)->set_source(m_charram); } +VIDEO_START_MEMBER(tiamc1_state, kot) +{ + m_charram = memregion("gfx2")->base(); + + m_videoram = make_unique_clear(0x440); + m_tileram = m_videoram.get() + 0x000; + m_spriteram_y = m_videoram.get() + 0x400; + m_spriteram_x = m_videoram.get() + 0x410; + m_spriteram_n = m_videoram.get() + 0x420; + m_spriteram_a = m_videoram.get() + 0x430; + + save_pointer(NAME(m_videoram.get()), 0x440); + + m_bg_tilemap1 = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(tiamc1_state::get_bg1_tile_info), this), TILEMAP_SCAN_ROWS, + 8, 8, 32, 32); + + m_bg_tilemap1->set_scrolldx(4, 4); + + m_bg_vshift = 0; + m_bg_hshift = 0; + + save_item(NAME(m_layers_ctrl)); + save_item(NAME(m_bg_vshift)); + save_item(NAME(m_bg_hshift)); + + m_gfxdecode->gfx(0)->set_source(m_charram); +} void tiamc1_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect) { int offs; @@ -203,3 +243,18 @@ UINT32 tiamc1_state::screen_update_tiamc1(screen_device &screen, bitmap_ind16 &b return 0; } + +UINT32 tiamc1_state::screen_update_kot(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + for (int i = 0; i < 32; i++) + m_bg_tilemap1->set_scrolly(i, m_bg_vshift); + + for (int i = 0; i < 32; i++) + m_bg_tilemap1->set_scrollx(i, m_bg_hshift); + + m_bg_tilemap1->draw(screen, bitmap, cliprect, 0, 0); + + draw_sprites(bitmap, cliprect); + + return 0; +}