diff --git a/src/mame/drivers/tiamc1.cpp b/src/mame/drivers/tiamc1.cpp index 7b59b5be424..591ab1edb0b 100644 --- a/src/mame/drivers/tiamc1.cpp +++ b/src/mame/drivers/tiamc1.cpp @@ -113,7 +113,6 @@ - Use machine/pit8253.c in sound - Check sprites priorities on the real hardware - Check vertical background scrolling on the real hardware - - What charset control is used for? - Kot Rybolov viewable area size likely controlled by pit8253 timers 0 and 1, used in test mode only */ @@ -168,7 +167,7 @@ static ADDRESS_MAP_START( tiamc1_io_map, AS_IO, 8, tiamc1_state ) AM_RANGE(0xbc, 0xbc) AM_WRITE(tiamc1_bg_vshift_w)/* background V scroll */ AM_RANGE(0xbd, 0xbd) AM_WRITE(tiamc1_bg_hshift_w)/* background H scroll */ AM_RANGE(0xbe, 0xbe) AM_WRITE(tiamc1_bankswitch_w) /* VRAM selector */ - AM_RANGE(0xbf, 0xbf) AM_WRITENOP /* charset control */ + AM_RANGE(0xbf, 0xbf) AM_WRITE(tiamc1_bg_bplctrl_w) /* charset control */ AM_RANGE(0xc0, 0xc3) AM_DEVWRITE("2x8253", tiamc1_sound_device, tiamc1_timer0_w) /* timer 0 */ AM_RANGE(0xd0, 0xd3) AM_DEVREADWRITE("kr580vv55a", i8255_device, read, write) /* input ports + coin counters & lockout */ AM_RANGE(0xd4, 0xd7) AM_DEVWRITE("2x8253", tiamc1_sound_device, tiamc1_timer1_w) /* timer 1 */ @@ -236,8 +235,8 @@ static INPUT_PORTS_START( gorodki ) 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_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) // right button - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) // left button + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) // right button + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) // left button PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_VBLANK("screen") INPUT_PORTS_END @@ -337,7 +336,7 @@ static MACHINE_CONFIG_START( tiamc1, tiamc1_state ) MCFG_SCREEN_PALETTE("palette") MCFG_GFXDECODE_ADD("gfxdecode", "palette", tiamc1) - MCFG_PALETTE_ADD("palette", 16) + MCFG_PALETTE_ADD("palette", 32) MCFG_PALETTE_INIT_OWNER(tiamc1_state, tiamc1) /* sound hardware */ diff --git a/src/mame/includes/tiamc1.h b/src/mame/includes/tiamc1.h index 2766b994339..513f7c1df5f 100644 --- a/src/mame/includes/tiamc1.h +++ b/src/mame/includes/tiamc1.h @@ -22,9 +22,11 @@ public: UINT8 *m_spriteram_y; UINT8 *m_spriteram_a; UINT8 *m_spriteram_n; + UINT8 *m_paletteram; UINT8 m_layers_ctrl; UINT8 m_bg_vshift; UINT8 m_bg_hshift; + UINT8 m_bg_bplctrl; tilemap_t *m_bg_tilemap1; tilemap_t *m_bg_tilemap2; std::unique_ptr m_palette_ptr; @@ -37,6 +39,7 @@ public: DECLARE_WRITE8_MEMBER(tiamc1_sprite_n_w); DECLARE_WRITE8_MEMBER(tiamc1_bg_vshift_w); DECLARE_WRITE8_MEMBER(tiamc1_bg_hshift_w); + DECLARE_WRITE8_MEMBER(tiamc1_bg_bplctrl_w); DECLARE_WRITE8_MEMBER(tiamc1_palette_w); DECLARE_WRITE8_MEMBER(kot_bankswitch_w); DECLARE_WRITE8_MEMBER(kot_videoram_w); @@ -56,6 +59,7 @@ public: required_device m_palette; private: optional_device m_speaker; + void update_bg_palette(); }; diff --git a/src/mame/video/tiamc1.cpp b/src/mame/video/tiamc1.cpp index d813b0030fb..a87fb5ee31a 100644 --- a/src/mame/video/tiamc1.cpp +++ b/src/mame/video/tiamc1.cpp @@ -89,9 +89,24 @@ WRITE8_MEMBER(tiamc1_state::tiamc1_bg_hshift_w) m_bg_hshift = data; } +WRITE8_MEMBER(tiamc1_state::tiamc1_bg_bplctrl_w) +{ + m_bg_bplctrl = data; + update_bg_palette(); +} + WRITE8_MEMBER(tiamc1_state::tiamc1_palette_w) { + m_paletteram[offset] = data; m_palette->set_pen_color(offset, m_palette_ptr[data]); + update_bg_palette(); +} + +void tiamc1_state::update_bg_palette() +{ + UINT8 bplmask = ((m_bg_bplctrl >> 0) & 1) | ((m_bg_bplctrl >> 1) & 2) | ((m_bg_bplctrl >> 2) & 4) | ((m_bg_bplctrl >> 3) & 8); + for (int i = 0; i < 16; i++) + m_palette->set_pen_color(i + 16, m_palette_ptr[m_paletteram[i | bplmask]]); } PALETTE_INIT_MEMBER(tiamc1_state, tiamc1) @@ -139,7 +154,7 @@ TILE_GET_INFO_MEMBER(tiamc1_state::get_bg2_tile_info) void tiamc1_state::video_start() { - m_videoram = make_unique_clear(0x3040); + m_videoram = make_unique_clear(0x3050); m_charram = m_videoram.get() + 0x0800; /* Ram is banked */ m_tileram = m_videoram.get() + 0x0000; @@ -148,8 +163,9 @@ void tiamc1_state::video_start() m_spriteram_x = m_videoram.get() + 0x3010; m_spriteram_n = m_videoram.get() + 0x3020; m_spriteram_a = m_videoram.get() + 0x3030; + m_paletteram = m_videoram.get() + 0x3040; - save_pointer(NAME(m_videoram.get()), 0x3040); + save_pointer(NAME(m_videoram.get()), 0x3050); 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); @@ -158,9 +174,12 @@ void tiamc1_state::video_start() 8, 8, 32, 32); m_bg_tilemap1->set_scrolldx(4, 4); m_bg_tilemap2->set_scrolldx(4, 4); + m_bg_tilemap1->set_palette_offset(16); + m_bg_tilemap2->set_palette_offset(16); m_bg_vshift = 0; m_bg_hshift = 0; + m_bg_bplctrl = 0; save_item(NAME(m_layers_ctrl)); save_item(NAME(m_bg_vshift)); @@ -173,14 +192,15 @@ VIDEO_START_MEMBER(tiamc1_state, kot) { m_charram = memregion("gfx2")->base(); - m_videoram = make_unique_clear(0x440); + m_videoram = make_unique_clear(0x450); 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; + m_paletteram = m_videoram.get() + 0x440; - save_pointer(NAME(m_videoram.get()), 0x440); + save_pointer(NAME(m_videoram.get()), 0x450); 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);