From 98cda496b3a7caa4ebd8b86fdebf64717f9f5355 Mon Sep 17 00:00:00 2001 From: hap Date: Mon, 17 Oct 2022 16:51:58 +0200 Subject: fcombat: fix bg colors, add fg tilemap instead of drawing manually --- src/mame/jaleco/fcombat.cpp | 82 +++++++++++++++++++++++++-------------------- 1 file changed, 45 insertions(+), 37 deletions(-) diff --git a/src/mame/jaleco/fcombat.cpp b/src/mame/jaleco/fcombat.cpp index 38dc28d76ec..894efaff325 100644 --- a/src/mame/jaleco/fcombat.cpp +++ b/src/mame/jaleco/fcombat.cpp @@ -12,14 +12,8 @@ TS 2004.10.22. (press buttons 1+2 at the same time, to release 'army' ;) TODO: -- fix colours (sprites, bg), not many PCB references online - sprites: maybe they are correct? player ufo is ok, soldiers are ok, - explosions probably ok, helicopters ok, kidnapper ufo ok - bg: 16 levels, each has a different color, from photos: - - 1st level: green,black?,?,? - - 8th level(visible at bottom of 1st level): black,darkred,grey,white - More levels on the flyer, but might not be the final version of the game. -- cocktail mode doesn't work right +- verify sprite colors, not many PCB references online, but comparing with + the small amount of photos that are there, they match PCB Notes: @@ -87,6 +81,7 @@ private: // video-related tilemap_t *m_bgmap = nullptr; + tilemap_t *m_fgmap = nullptr; u8 m_cocktail_flip = 0; u8 m_char_palette = 0; u8 m_char_bank = 0; @@ -113,7 +108,9 @@ private: u8 e300_r(); void ee00_w(u8 data); void videoreg_w(u8 data); + void videoram_w(offs_t offset, u8 data); TILE_GET_INFO_MEMBER(get_bg_tile_info); + TILE_GET_INFO_MEMBER(get_fg_tile_info); void fcombat_palette(palette_device &palette) const; u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); void audio_map(address_map &map); @@ -131,16 +128,11 @@ static constexpr XTAL PIXEL_CLOCK = MASTER_CLOCK / 3; static constexpr int HCOUNT_START = 0x58; static constexpr int HTOTAL = 512 - HCOUNT_START; static constexpr int HBEND = 12 * 8; // ?? -static constexpr int HBSTART = 52 * 8; // +static constexpr int HBSTART = 52 * 8; // ?? static constexpr int VTOTAL = 256; static constexpr int VBEND = 16; static constexpr int VBSTART = 240; -static constexpr int VISIBLE_X_MIN = 12 * 8; -static constexpr int VISIBLE_X_MAX = 52 * 8; -static constexpr int VISIBLE_Y_MIN = 2 * 8; -static constexpr int VISIBLE_Y_MAX = 30 * 8; - /*************************************************************************** @@ -224,16 +216,34 @@ void fcombat_state::fcombat_palette(palette_device &palette) const void fcombat_state::video_start() { + m_fgmap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(fcombat_state::get_fg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32); + m_fgmap->set_transparent_pen(0); + m_bgmap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(fcombat_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 16, 16, 32 * 8 * 2, 32); } TILE_GET_INFO_MEMBER(fcombat_state::get_bg_tile_info) { const int tileno = m_bgdata_rom[tile_index]; - const int palno = (tile_index >> 5 & 0xf) ^ 7; + const int palno = (tileno >> 2 & 3) | (tileno >> 4 & 0xc); + tileinfo.set(2, tileno, palno, 0); } +TILE_GET_INFO_MEMBER(fcombat_state::get_fg_tile_info) +{ + const int tileno = m_videoram[tile_index] | (m_char_bank << 8); + const int palno = (tileno >> 4 & 0xf) | (m_char_palette << 4); + + tileinfo.set(0, tileno, palno, 0); +} + +void fcombat_state::videoram_w(offs_t offset, u8 data) +{ + m_videoram[offset] = data; + m_fgmap->mark_tile_dirty(offset); +} + /************************************* * @@ -245,12 +255,18 @@ void fcombat_state::videoreg_w(u8 data) { // bit 0: flip screen and joystick input multiplexer m_cocktail_flip = data & 1; + flip_screen_set(m_cocktail_flip); // bits 1-2: char lookup table bank - m_char_palette = (data & 0x06) >> 1; - // bit 3: char bank - m_char_bank = (data & 0x08) >> 3; + u8 char_pal = (data & 0x06) >> 1; + u8 char_bank = (data & 0x08) >> 3; + if (m_char_palette != char_pal || m_char_bank != char_bank) + { + m_char_palette = char_pal; + m_char_bank = char_bank; + m_fgmap->mark_all_dirty(); + } // bits 4-5: unused @@ -263,9 +279,11 @@ u32 fcombat_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, co { // draw background m_bgmap->set_scrolly(0, m_fcombat_sh); - m_bgmap->set_scrollx(0, m_fcombat_sv - 8); + if (m_cocktail_flip) + m_bgmap->set_scrollx(0, m_fcombat_sv + 8 - 2); + else + m_bgmap->set_scrollx(0, m_fcombat_sv - 8); - m_bgmap->mark_all_dirty(); m_bgmap->draw(screen, bitmap, cliprect, 0, 0); // draw sprites @@ -293,8 +311,8 @@ u32 fcombat_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, co if (m_cocktail_flip) { - x = 64 * 8 - gfx->width() - x; - y = 32 * 8 - gfx->height() - y; + x = 64 * 8 - gfx->width() - x + 2; + y = 32 * 8 - gfx->height() - y + 2; if (wide) y -= gfx->height(); xflip = !xflip; yflip = !yflip; @@ -321,19 +339,9 @@ u32 fcombat_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, co gfx->transpen(bitmap, cliprect, code, color, xflip, yflip, x, y, 0); } - // draw the visible text layer - for (int sy = VISIBLE_Y_MIN / 8; sy < VISIBLE_Y_MAX / 8; sy++) - for (int sx = VISIBLE_X_MIN / 8; sx < VISIBLE_X_MAX / 8; sx++) - { - const int x = m_cocktail_flip ? (63 * 8 - 8 * sx) : 8 * sx; - const int y = m_cocktail_flip ? (31 * 8 - 8 * sy) : 8 * sy; - - const int offs = sx + sy * 64; - m_gfxdecode->gfx(0)->transpen(bitmap, cliprect, - m_videoram[offs] + 256 * m_char_bank, - ((m_videoram[offs] & 0xf0) >> 4) + m_char_palette * 16, - m_cocktail_flip, m_cocktail_flip, x, y, 0); - } + // draw text layer + m_fgmap->draw(screen, bitmap, cliprect, 0, 0); + return 0; } @@ -417,7 +425,7 @@ void fcombat_state::main_map(address_map &map) { map(0x0000, 0x7fff).rom(); map(0xc000, 0xc7ff).ram(); - map(0xd000, 0xd7ff).ram().share(m_videoram); + map(0xd000, 0xd7ff).ram().share(m_videoram).w(FUNC(fcombat_state::videoram_w)); map(0xd800, 0xd8ff).ram().share(m_spriteram); map(0xe000, 0xe000).r(FUNC(fcombat_state::port01_r)); map(0xe100, 0xe100).portr("DSW0"); @@ -730,4 +738,4 @@ ROM_END } // anonymous namespace -GAME( 1985, fcombat, 0, fcombat, fcombat, fcombat_state, init_fcombat, ROT90, "Jaleco", "Field Combat", MACHINE_WRONG_COLORS | MACHINE_SUPPORTS_SAVE ) +GAME( 1985, fcombat, 0, fcombat, fcombat, fcombat_state, init_fcombat, ROT90, "Jaleco", "Field Combat", MACHINE_SUPPORTS_SAVE ) -- cgit v1.2.3