summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/karnov.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/video/karnov.cpp')
-rw-r--r--src/mame/video/karnov.cpp92
1 files changed, 25 insertions, 67 deletions
diff --git a/src/mame/video/karnov.cpp b/src/mame/video/karnov.cpp
index b9f6443bd26..730e87ffbb8 100644
--- a/src/mame/video/karnov.cpp
+++ b/src/mame/video/karnov.cpp
@@ -9,66 +9,19 @@
#include "emu.h"
#include "includes/karnov.h"
-void karnov_state::karnov_flipscreen_w( int data )
-{
- m_flipscreen = data;
- m_fix_tilemap->set_flip(m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0);
- m_spritegen->set_flip_screen(m_flipscreen);
-}
+/******************************************************************************/
-void karnov_state::draw_background( bitmap_ind16 &bitmap, const rectangle &cliprect )
+uint32_t karnov_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
- int my, mx, offs, color, tile, fx, fy;
- int scrollx = m_scroll[0];
- int scrolly = m_scroll[1];
-
- if (m_flipscreen)
- fx = fy = 1;
- else
- fx = fy = 0;
-
- mx = -1;
- my = 0;
-
- for (offs = 0; offs < 0x400; offs ++)
- {
- mx++;
- if (mx == 32)
- {
- mx=0;
- my++;
- }
-
- tile = m_pf_data[offs];
- color = tile >> 12;
- tile = tile & 0x7ff;
- if (m_flipscreen)
- m_gfxdecode->gfx(1)->opaque(*m_bitmap_f,m_bitmap_f->cliprect(),tile,
- color, fx, fy, 496-16*mx,496-16*my);
- else
- m_gfxdecode->gfx(1)->opaque(*m_bitmap_f,m_bitmap_f->cliprect(),tile,
- color, fx, fy, 16*mx,16*my);
- }
-
- if (!m_flipscreen)
- {
- scrolly = -scrolly;
- scrollx = -scrollx;
- }
- else
- {
- scrolly = scrolly + 256;
- scrollx = scrollx + 256;
- }
-
- copyscrollbitmap(bitmap, *m_bitmap_f, 1, &scrollx, 1, &scrolly, cliprect);
-}
+ int const flip = BIT(m_scroll[0], 15);
-/******************************************************************************/
+ m_bg_tilemap->set_flip(flip ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0);
+ m_fix_tilemap->set_flip(flip ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0);
+ m_spritegen->set_flip_screen(flip);
-uint32_t karnov_state::screen_update_karnov(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
-{
- draw_background(bitmap, cliprect);
+ m_bg_tilemap->set_scrollx(m_scroll[0]);
+ m_bg_tilemap->set_scrolly(m_scroll[1]);
+ m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0);
m_spritegen->draw_sprites(bitmap, cliprect, m_spriteram->buffer(), 0x800, 0);
m_fix_tilemap->draw(screen, bitmap, cliprect, 0, 0);
return 0;
@@ -80,21 +33,30 @@ TILE_GET_INFO_MEMBER(karnov_state::get_fix_tile_info)
{
int tile = m_videoram[tile_index];
SET_TILE_INFO_MEMBER(0,
- tile&0xfff,
- tile>>14,
+ tile & 0xfff,
+ tile >> 14,
0);
}
-WRITE16_MEMBER(karnov_state::karnov_videoram_w)
+TILE_GET_INFO_MEMBER(karnov_state::get_bg_tile_info)
+{
+ int tile = m_pf_data[tile_index];
+ SET_TILE_INFO_MEMBER(1,
+ tile & 0x7ff,
+ tile >> 12,
+ 0);
+}
+
+WRITE16_MEMBER(karnov_state::videoram_w)
{
COMBINE_DATA(&m_videoram[offset]);
m_fix_tilemap->mark_tile_dirty(offset);
}
-WRITE16_MEMBER(karnov_state::karnov_playfield_swap_w)
+void karnov_state::playfield_w(offs_t offset, u16 data, u16 mem_mask)
{
- offset = ((offset & 0x1f) << 5) | ((offset & 0x3e0) >> 5);
COMBINE_DATA(&m_pf_data[offset]);
+ m_bg_tilemap->mark_tile_dirty(offset);
}
/******************************************************************************/
@@ -102,22 +64,18 @@ WRITE16_MEMBER(karnov_state::karnov_playfield_swap_w)
VIDEO_START_MEMBER(karnov_state,karnov)
{
/* Allocate bitmap & tilemap */
- m_bitmap_f = std::make_unique<bitmap_ind16>(512, 512);
+ m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(karnov_state::get_bg_tile_info),this), TILEMAP_SCAN_ROWS, 16, 16, 32, 32);
m_fix_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(karnov_state::get_fix_tile_info),this), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
- save_item(NAME(*m_bitmap_f));
-
m_fix_tilemap->set_transparent_pen(0);
}
VIDEO_START_MEMBER(karnov_state,wndrplnt)
{
/* Allocate bitmap & tilemap */
- m_bitmap_f = std::make_unique<bitmap_ind16>(512, 512);
+ m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(karnov_state::get_bg_tile_info),this), TILEMAP_SCAN_ROWS, 16, 16, 32, 32);
m_fix_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(karnov_state::get_fix_tile_info),this), TILEMAP_SCAN_COLS, 8, 8, 32, 32);
- save_item(NAME(*m_bitmap_f));
-
m_fix_tilemap->set_transparent_pen(0);
}