diff options
Diffstat (limited to 'src/mame/video/combatsc.cpp')
-rw-r--r-- | src/mame/video/combatsc.cpp | 567 |
1 files changed, 0 insertions, 567 deletions
diff --git a/src/mame/video/combatsc.cpp b/src/mame/video/combatsc.cpp deleted file mode 100644 index a77789f9e71..00000000000 --- a/src/mame/video/combatsc.cpp +++ /dev/null @@ -1,567 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Phil Stroffolino, Manuel Abadia -/*************************************************************************** - - video.c - - Functions to emulate the video hardware of the machine. - -***************************************************************************/ - -#include "emu.h" - -#include "includes/combatsc.h" - -void combatsc_state::combatsc_palette(palette_device &palette) const -{ - uint8_t const *const color_prom = memregion("proms")->base(); - - for (int pal = 0; pal < 8; pal++) - { - int clut; - - switch (pal) - { - default: - case 0: // other sprites - case 2: // other sprites(alt) - clut = 1; // 0 is wrong for Firing Range III targets - break; - - case 4: // player sprites - case 6: // player sprites(alt) - clut = 2; - break; - - case 1: // background - case 3: // background(alt) - clut = 1; - break; - - case 5: // foreground tiles - case 7: // foreground tiles(alt) - clut = 3; - break; - } - - for (int i = 0; i < 0x100; i++) - { - uint8_t ctabentry; - - if (((pal & 0x01) == 0) && (color_prom[(clut << 8) | i] == 0)) - ctabentry = 0; - else - ctabentry = (pal << 4) | (color_prom[(clut << 8) | i] & 0x0f); - - palette.set_pen_indirect((pal << 8) | i, ctabentry); - } - } -} - - -void combatsc_state::combatscb_palette(palette_device &palette) const -{ - uint8_t const *const color_prom = memregion("proms")->base(); - - for (int pal = 0; pal < 8; pal++) - { - for (int i = 0; i < 0x100; i++) - { - uint8_t ctabentry; - - if ((pal & 1) == 0) - // sprites - ctabentry = (pal << 4) | (~color_prom[i] & 0x0f); - else - // chars - no lookup? - ctabentry = (pal << 4) | (i & 0x0f); // no lookup? - - palette.set_pen_indirect((pal << 8) | i, ctabentry); - } - } -} - - - -/*************************************************************************** - - Callbacks for the TileMap code - -***************************************************************************/ - -TILE_GET_INFO_MEMBER(combatsc_state::get_tile_info0) -{ - uint8_t ctrl_6 = m_k007121_1->ctrlram_r(6); - uint8_t attributes = m_page[0][tile_index]; - int bank = 4 * ((m_vreg & 0x0f) - 1); - int number, color; - - if (bank < 0) - bank = 0; - - if ((attributes & 0xb0) == 0) - bank = 0; /* text bank */ - - if (attributes & 0x80) - bank += 1; - - if (attributes & 0x10) - bank += 2; - - if (attributes & 0x20) - bank += 4; - - color = ((ctrl_6 & 0x10) * 2 + 16) + (attributes & 0x0f); - - number = m_page[0][tile_index + 0x400] + 256 * bank; - - tileinfo.set(0, - number, - color, - 0); - tileinfo.category = (attributes & 0x40) >> 6; -} - -TILE_GET_INFO_MEMBER(combatsc_state::get_tile_info1) -{ - uint8_t ctrl_6 = m_k007121_2->ctrlram_r(6); - uint8_t attributes = m_page[1][tile_index]; - int bank = 4 * ((m_vreg >> 4) - 1); - int number, color; - - if (bank < 0) - bank = 0; - - if ((attributes & 0xb0) == 0) - bank = 0; /* text bank */ - - if (attributes & 0x80) - bank += 1; - - if (attributes & 0x10) - bank += 2; - - if (attributes & 0x20) - bank += 4; - - color = ((ctrl_6 & 0x10) * 2 + 16 + 4 * 16) + (attributes & 0x0f); - - number = m_page[1][tile_index + 0x400] + 256 * bank; - - tileinfo.set(1, - number, - color, - 0); - tileinfo.category = (attributes & 0x40) >> 6; -} - -TILE_GET_INFO_MEMBER(combatsc_state::get_text_info) -{ - uint8_t attributes = m_page[0][tile_index + 0x800]; - int number = m_page[0][tile_index + 0xc00]; - int color = 16 + (attributes & 0x0f); - - tileinfo.set(0, - number, - color, - 0); -} - - -TILE_GET_INFO_MEMBER(combatsc_state::get_tile_info0_bootleg) -{ - uint8_t attributes = m_page[0][tile_index]; - int bank = 4 * ((m_vreg & 0x0f) - 1); - int number, pal, color; - - if (bank < 0) - bank = 0; - - if ((attributes & 0xb0) == 0) - bank = 0; /* text bank */ - - if (attributes & 0x80) - bank += 1; - - if (attributes & 0x10) - bank += 2; - - if (attributes & 0x20) - bank += 4; - - pal = (bank == 0 || bank >= 0x1c || (attributes & 0x40)) ? 1 : 3; - color = pal*16;// + (attributes & 0x0f); - number = m_page[0][tile_index + 0x400] + 256 * bank; - - tileinfo.set(0, - number, - color, - 0); -} - -TILE_GET_INFO_MEMBER(combatsc_state::get_tile_info1_bootleg) -{ - uint8_t attributes = m_page[1][tile_index]; - int bank = 4*((m_vreg >> 4) - 1); - int number, pal, color; - - if (bank < 0) - bank = 0; - - if ((attributes & 0xb0) == 0) - bank = 0; /* text bank */ - - if (attributes & 0x80) - bank += 1; - - if (attributes & 0x10) - bank += 2; - - if (attributes & 0x20) - bank += 4; - - pal = (bank == 0 || bank >= 0x1c || (attributes & 0x40)) ? 5 : 7; - color = pal * 16;// + (attributes & 0x0f); - number = m_page[1][tile_index + 0x400] + 256 * bank; - - tileinfo.set(1, - number, - color, - 0); -} - -TILE_GET_INFO_MEMBER(combatsc_state::get_text_info_bootleg) -{ -// uint8_t attributes = m_page[0][tile_index + 0x800]; - int number = m_page[0][tile_index + 0xc00]; - int color = 16;// + (attributes & 0x0f); - - tileinfo.set(1, - number, - color, - 0); -} - -/*************************************************************************** - - Start the video hardware emulation. - -***************************************************************************/ - -VIDEO_START_MEMBER(combatsc_state,combatsc) -{ - m_bg_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(combatsc_state::get_tile_info0)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); - m_bg_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(combatsc_state::get_tile_info1)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); - m_textlayer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(combatsc_state::get_text_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); - - m_spriteram[0] = make_unique_clear<uint8_t[]>(0x800); - m_spriteram[1] = make_unique_clear<uint8_t[]>(0x800); - - m_bg_tilemap[0]->set_transparent_pen(0); - m_bg_tilemap[1]->set_transparent_pen(0); - m_textlayer->set_transparent_pen(0); - - m_textlayer->set_scroll_rows(32); - - save_pointer(NAME(m_spriteram[0]), 0x800); - save_pointer(NAME(m_spriteram[1]), 0x800); -} - -VIDEO_START_MEMBER(combatsc_state,combatscb) -{ - m_bg_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(combatsc_state::get_tile_info0_bootleg)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); - m_bg_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(combatsc_state::get_tile_info1_bootleg)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); - m_textlayer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(combatsc_state::get_text_info_bootleg)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); - - m_spriteram[0] = make_unique_clear<uint8_t[]>(0x800); - m_spriteram[1] = make_unique_clear<uint8_t[]>(0x800); - - m_bg_tilemap[0]->set_transparent_pen(0); - m_bg_tilemap[1]->set_transparent_pen(0); - m_textlayer->set_transparent_pen(0); - - m_bg_tilemap[0]->set_scroll_rows(32); - m_bg_tilemap[1]->set_scroll_rows(32); - - save_pointer(NAME(m_spriteram[0]), 0x800); - save_pointer(NAME(m_spriteram[1]), 0x800); -} - -/*************************************************************************** - - Memory handlers - -***************************************************************************/ - -uint8_t combatsc_state::combatsc_video_r(offs_t offset) -{ - return m_videoram[offset]; -} - -void combatsc_state::combatsc_video_w(offs_t offset, uint8_t data) -{ - m_videoram[offset] = data; - - if (offset < 0x800) - { - if (m_video_circuit) - m_bg_tilemap[1]->mark_tile_dirty(offset & 0x3ff); - else - m_bg_tilemap[0]->mark_tile_dirty(offset & 0x3ff); - } - else if (offset < 0x1000 && m_video_circuit == 0) - { - m_textlayer->mark_tile_dirty(offset & 0x3ff); - } -} - -void combatsc_state::combatsc_pf_control_w(offs_t offset, uint8_t data) -{ - k007121_device *k007121 = m_video_circuit ? m_k007121_2 : m_k007121_1; - k007121->ctrl_w(offset, data); - - if (offset == 7) - { - m_bg_tilemap[m_video_circuit]->set_flip((data & 0x08) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); - if(m_video_circuit == 0) - { - m_textflip = (data & 0x08) == 0x08; - m_textlayer->set_flip((data & 0x08) ? TILEMAP_FLIPY | TILEMAP_FLIPX : 0); - } - } - if (offset == 3) - { - if (data & 0x08) - memcpy(m_spriteram[m_video_circuit].get(), m_page[m_video_circuit] + 0x1000, 0x800); - else - memcpy(m_spriteram[m_video_circuit].get(), m_page[m_video_circuit] + 0x1800, 0x800); - } -} - -uint8_t combatsc_state::combatsc_scrollram_r(offs_t offset) -{ - return m_scrollram[offset]; -} - -void combatsc_state::combatsc_scrollram_w(offs_t offset, uint8_t data) -{ - m_scrollram[offset] = data; -} - - - -/*************************************************************************** - - Display Refresh - -***************************************************************************/ - -void combatsc_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect, const uint8_t *source, int circuit, bitmap_ind8 &priority_bitmap, uint32_t pri_mask ) -{ - k007121_device *k007121 = circuit ? m_k007121_2 : m_k007121_1; - int base_color = (circuit * 4) * 16 + (k007121->ctrlram_r(6) & 0x10) * 2; - - k007121->sprites_draw(bitmap, cliprect, m_gfxdecode->gfx(circuit), *m_palette, source, base_color, 0, 0, priority_bitmap, pri_mask); -} - - -uint32_t combatsc_state::screen_update_combatsc(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - int i; - - if (m_k007121_1->ctrlram_r(1) & 0x02) - { - m_bg_tilemap[0]->set_scroll_rows(32); - for (i = 0; i < 32; i++) - m_bg_tilemap[0]->set_scrollx(i, m_scrollram0[i]); - } - else - { - m_bg_tilemap[0]->set_scroll_rows(1); - m_bg_tilemap[0]->set_scrollx(0, m_k007121_1->ctrlram_r(0) | ((m_k007121_1->ctrlram_r(1) & 0x01) << 8)); - } - - if (m_k007121_2->ctrlram_r(1) & 0x02) - { - m_bg_tilemap[1]->set_scroll_rows(32); - for (i = 0; i < 32; i++) - m_bg_tilemap[1]->set_scrollx(i, m_scrollram1[i]); - } - else - { - m_bg_tilemap[1]->set_scroll_rows(1); - m_bg_tilemap[1]->set_scrollx(0, m_k007121_2->ctrlram_r(0) | ((m_k007121_2->ctrlram_r(1) & 0x01) << 8)); - } - - m_bg_tilemap[0]->set_scrolly(0, m_k007121_1->ctrlram_r(2)); - m_bg_tilemap[1]->set_scrolly(0, m_k007121_2->ctrlram_r(2)); - - screen.priority().fill(0, cliprect); - - if (m_priority == 0) - { - m_bg_tilemap[1]->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE | 0, 4); - m_bg_tilemap[1]->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE | 1, 8); - m_bg_tilemap[0]->draw(screen, bitmap, cliprect, 0, 1); - m_bg_tilemap[0]->draw(screen, bitmap, cliprect, 1, 2); - - /* we use the priority buffer so sprites are drawn front to back */ - draw_sprites(bitmap, cliprect, m_spriteram[1].get(), 1, screen.priority(), 0x0f00); - draw_sprites(bitmap, cliprect, m_spriteram[0].get(), 0, screen.priority(), 0x4444); - } - else - { - m_bg_tilemap[0]->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE | 0, 1); - m_bg_tilemap[0]->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE | 1, 2); - - /* we use the priority buffer so sprites are drawn front to back */ - // drill sergeant ribbons goes here, MT #06259 - draw_sprites(bitmap, cliprect, m_spriteram[1].get(), 1, screen.priority(), 0x0f00); - // guess: move the face as well (should go behind hands but it isn't tested) - draw_sprites(bitmap, cliprect, m_spriteram[0].get(), 0, screen.priority(), 0x4444); - - m_bg_tilemap[1]->draw(screen, bitmap, cliprect, 1, 4); - m_bg_tilemap[1]->draw(screen, bitmap, cliprect, 0, 8); - } - - //if (m_k007121_1->ctrlram_r(1) & 0x08) - { - rectangle clip; - clip = cliprect; - - for (i = 0; i < 32; i++) - { - // scrollram [0x20]-[0x3f]: char enable (presumably bit 0 only) - uint8_t base_scroll = m_textflip == true ? (0x3f - i) : (0x20 + i); - if(m_scrollram[base_scroll] == 0) - continue; - - - clip.min_y = i * 8; - clip.max_y = clip.min_y + 7; - - // bit 3 of reg [1] selects if tiles are opaque or have transparent pen. - m_textlayer->draw(screen, bitmap, clip, m_k007121_1->ctrlram_r(1) & 0x08 ? TILEMAP_DRAW_OPAQUE : 0, 0); - } - } - - /* chop the extreme columns if necessary */ - if (m_k007121_1->ctrlram_r(3) & 0x40) - { - rectangle clip; - - clip = cliprect; - clip.max_x = clip.min_x + 7; - bitmap.fill(0, clip); - - clip = cliprect; - clip.min_x = clip.max_x - 7; - bitmap.fill(0, clip); - } - return 0; -} - - - - - - - - -/*************************************************************************** - - bootleg Combat School sprites. Each sprite has 5 bytes: - -byte #0: sprite number -byte #1: y position -byte #2: x position -byte #3: - bit 0: x position (bit 0) - bits 1..3: ??? - bit 4: flip x - bit 5: unused? - bit 6: sprite bank # (bit 2) - bit 7: ??? -byte #4: - bits 0,1: sprite bank # (bits 0 & 1) - bits 2,3: unused? - bits 4..7: sprite color - -***************************************************************************/ - -void combatsc_state::bootleg_draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect, const uint8_t *source, int circuit ) -{ - address_space &space = m_maincpu->space(AS_PROGRAM); - gfx_element *gfx = m_gfxdecode->gfx(circuit + 2); - - int limit = circuit ? (space.read_byte(0xc2) * 256 + space.read_byte(0xc3)) : (space.read_byte(0xc0) * 256 + space.read_byte(0xc1)); - const uint8_t *finish; - - source += 0x1000; - finish = source; - source += 0x400; - limit = (0x3400 - limit) / 8; - if (limit >= 0) - finish = source - limit * 8; - source -= 8; - - while (source > finish) - { - uint8_t attributes = source[3]; /* PBxF ?xxX */ - { - int number = source[0]; - int x = source[2] - 71 + (attributes & 0x01)*256; - int y = 242 - source[1]; - uint8_t color = source[4]; /* CCCC xxBB */ - - int bank = (color & 0x03) | ((attributes & 0x40) >> 4); - - number = ((number & 0x02) << 1) | ((number & 0x04) >> 1) | (number & (~6)); - number += 256 * bank; - - color = (circuit * 4) * 16 + (color >> 4); - - /* hacks to select alternate palettes */ -// if(m_vreg == 0x40 && (attributes & 0x40)) color += 1*16; -// if(m_vreg == 0x23 && (attributes & 0x02)) color += 1*16; -// if(m_vreg == 0x66 ) color += 2*16; - - gfx->transpen(bitmap,cliprect, - number, color, - attributes & 0x10,0, /* flip */ - x, y, 15 ); - } - source -= 8; - } -} - -uint32_t combatsc_state::screen_update_combatscb(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - int i; - - for (i = 0; i < 32; i++) - { - m_bg_tilemap[0]->set_scrollx(i, m_io_ram[0x040 + i] + 5); - m_bg_tilemap[1]->set_scrollx(i, m_io_ram[0x060 + i] + 3); - } - m_bg_tilemap[0]->set_scrolly(0, m_io_ram[0x000] + 1); - m_bg_tilemap[1]->set_scrolly(0, m_io_ram[0x020] + 1); - - if (m_priority == 0) - { - m_bg_tilemap[1]->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); - bootleg_draw_sprites(bitmap,cliprect, m_page[0], 0); - m_bg_tilemap[0]->draw(screen, bitmap, cliprect, 0 ,0); - bootleg_draw_sprites(bitmap,cliprect, m_page[1], 1); - } - else - { - m_bg_tilemap[0]->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); - bootleg_draw_sprites(bitmap,cliprect, m_page[0], 0); - m_bg_tilemap[1]->draw(screen, bitmap, cliprect, 0, 0); - bootleg_draw_sprites(bitmap,cliprect, m_page[1], 1); - } - - m_textlayer->draw(screen, bitmap, cliprect, 0, 0); - return 0; -} |