// license:BSD-3-Clause // copyright-holders:Uki /****************************************************************************** Markham (c) 1983 Sun Electronics Strength & Skill (c) 1984 Sun Electronics Video hardware driver by Uki ******************************************************************************/ #include "emu.h" #include "includes/markham.h" PALETTE_INIT_MEMBER(markham_state, markham) { const uint8_t *color_prom = memregion("proms")->base(); int i; /* create a lookup table for the palette */ for (i = 0; i < 0x100; i++) { int r = pal4bit(color_prom[i + 0x000]); int g = pal4bit(color_prom[i + 0x100]); int b = pal4bit(color_prom[i + 0x200]); palette.set_indirect_color(i, rgb_t(r, g, b)); } /* color_prom now points to the beginning of the lookup table */ color_prom += 0x300; /* sprites lookup table */ for (i = 0; i < 0x400; i++) { uint8_t ctabentry = color_prom[i]; palette.set_pen_indirect(i, ctabentry); } } WRITE8_MEMBER(markham_state::videoram_w) { m_videoram[offset] = data; m_bg_tilemap->mark_tile_dirty(offset / 2); } TILE_GET_INFO_MEMBER(markham_state::get_bg_tile_info) { int attr = m_videoram[tile_index * 2]; int code = m_videoram[(tile_index * 2) + 1] + ((attr & 0x60) << 3); int color = (attr & 0x1f) | ((attr & 0x80) >> 2); SET_TILE_INFO_MEMBER(0, code, color, 0); } void markham_state::video_start() { m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(markham_state::get_bg_tile_info),this), TILEMAP_SCAN_COLS, 8, 8, 32, 32); m_bg_tilemap->set_scroll_rows(32); } VIDEO_START_MEMBER(markham_state, strnskil) { video_start(); m_bg_tilemap->set_scroll_rows(32); m_irq_scanline_start = 96; m_irq_scanline_end = 240; save_item(NAME(m_irq_source)); save_item(NAME(m_irq_scanline_start)); save_item(NAME(m_irq_scanline_end)); save_item(NAME(m_scroll_ctrl)); } void markham_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect ) { uint8_t *spriteram = m_spriteram; int offs; for (offs = 0x60; offs < 0x100; offs += 4) { int chr = spriteram[offs + 1]; int col = spriteram[offs + 2]; int fx = flip_screen(); int fy = flip_screen(); int x = spriteram[offs + 3]; int y = spriteram[offs + 0]; int px, py; col &= 0x3f; if (flip_screen() == 0) { px = x - 2; py = 240 - y; } else { px = 240 - x; py = y; } px = px & 0xff; if (px > 248) px = px - 256; m_gfxdecode->gfx(1)->transmask(bitmap,cliprect, chr, col, fx,fy, px,py, m_palette->transpen_mask(*m_gfxdecode->gfx(1), col, 0)); } } uint32_t markham_state::screen_update_markham(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { int row; for (row = 0; row < 32; row++) { if ((row > 3) && (row < 16)) m_bg_tilemap->set_scrollx(row, m_xscroll[0]); if (row >= 16) m_bg_tilemap->set_scrollx(row, m_xscroll[1]); } m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0); draw_sprites(bitmap, cliprect); return 0; } uint32_t markham_state::screen_update_strnskil(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { const uint8_t *scroll_data = (const uint8_t *)memregion("scroll_prom")->base(); int row; for (row = 0; row < 32; row++) { if (m_scroll_ctrl != 0x07) { switch (scroll_data[m_scroll_ctrl * 32 + row]) { case 2: m_bg_tilemap->set_scrollx(row, -~m_xscroll[1]); case 4: m_bg_tilemap->set_scrollx(row, -~m_xscroll[0]); break; } } } m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0); draw_sprites(bitmap, cliprect); return 0; }