diff options
Diffstat (limited to 'src/mame/video/mermaid.cpp')
-rw-r--r-- | src/mame/video/mermaid.cpp | 519 |
1 files changed, 0 insertions, 519 deletions
diff --git a/src/mame/video/mermaid.cpp b/src/mame/video/mermaid.cpp deleted file mode 100644 index d3271d9d4e8..00000000000 --- a/src/mame/video/mermaid.cpp +++ /dev/null @@ -1,519 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Zsolt Vasvari -#include "emu.h" -#include "includes/mermaid.h" - - -void mermaid_state::common_palette(palette_device &palette) const -{ - uint8_t const *const color_prom = memregion("proms")->base(); - for (int i = 0; i < 0x40; i++) - { - int const r = 0x21 * BIT(color_prom[i], 0) + 0x47 * BIT(color_prom[i], 1) + 0x97 * BIT(color_prom[i], 2); - int const g = 0x21 * BIT(color_prom[i], 3) + 0x47 * BIT(color_prom[i], 4) + 0x97 * BIT(color_prom[i], 5); - int const b = 0x47 * BIT(color_prom[i], 6) + 0x97 * BIT(color_prom[i], 7); - - palette.set_indirect_color(i, rgb_t(r, g, b)); - } -} - -void mermaid_state::mermaid_palette(palette_device &palette) const -{ - common_palette(palette); - - // blue background - palette.set_indirect_color(0x40, rgb_t(0, 0, 0xff)); - - // char/sprite palette - for (int i = 0; i < 0x40; i++) - palette.set_pen_indirect(i, i); - - // background palette - palette.set_pen_indirect(0x40, 0x20); - palette.set_pen_indirect(0x41, 0x21); - palette.set_pen_indirect(0x42, 0x40); - palette.set_pen_indirect(0x43, 0x21); -} - -void mermaid_state::rougien_palette(palette_device &palette) const -{ - common_palette(palette); - - // black background - palette.set_indirect_color(0x40, rgb_t(0, 0, 0)); - - // char/sprite palette - for (int i = 0; i < 0x40; i++) - palette.set_pen_indirect(i, i); - - // background palette - palette.set_pen_indirect(0x40, 0x40); - palette.set_pen_indirect(0x41, 0x00); - palette.set_pen_indirect(0x42, 0x00); - palette.set_pen_indirect(0x43, 0x02); -} - - -void mermaid_state::mermaid_videoram2_w(offs_t offset, uint8_t data) -{ - m_videoram2[offset] = data; - m_bg_tilemap->mark_tile_dirty(offset); -} - -void mermaid_state::mermaid_videoram_w(offs_t offset, uint8_t data) -{ - m_videoram[offset] = data; - m_fg_tilemap->mark_tile_dirty(offset); -} - -void mermaid_state::mermaid_colorram_w(offs_t offset, uint8_t data) -{ - m_colorram[offset] = data; - m_fg_tilemap->mark_tile_dirty(offset); -} - -WRITE_LINE_MEMBER(mermaid_state::flip_screen_x_w) -{ - flip_screen_x_set(state); -} - -WRITE_LINE_MEMBER(mermaid_state::flip_screen_y_w) -{ - flip_screen_y_set(state); -} - -void mermaid_state::mermaid_bg_scroll_w(offs_t offset, uint8_t data) -{ - m_bg_scrollram[offset] = data; - m_bg_tilemap->set_scrolly(offset, data); -} - -void mermaid_state::mermaid_fg_scroll_w(offs_t offset, uint8_t data) -{ - m_fg_scrollram[offset] = data; - m_fg_tilemap->set_scrolly(offset, data); -} - -WRITE_LINE_MEMBER(mermaid_state::rougien_gfxbankswitch1_w) -{ - m_rougien_gfxbank1 = state; -} - -WRITE_LINE_MEMBER(mermaid_state::rougien_gfxbankswitch2_w) -{ - m_rougien_gfxbank2 = state; -} - -uint8_t mermaid_state::mermaid_collision_r() -{ - /* - collision register active LOW: - - with coll = spriteram[offs + 2] & 0xc0 - - Bit 0 - Sprite (coll = 0x40) - Sprite (coll = 0x00) - Bit 1 - Sprite (coll = 0x40) - Foreground - Bit 2 - Sprite (coll = 0x40) - Background - Bit 3 - Sprite (coll = 0x80) - Sprite (coll = 0x00) - Bit 4 - Bit 5 - Bit 6 - Sprite (coll = 0x40) - Sprite (coll = 0x80) - Bit 7 - */ - - int collision = 0xff; - - if (m_coll_bit0) collision ^= 0x01; - if (m_coll_bit1) collision ^= 0x02; - if (m_coll_bit2) collision ^= 0x04; - if (m_coll_bit3) collision ^= 0x08; - if (m_coll_bit6) collision ^= 0x40; - - return collision; -} - -TILE_GET_INFO_MEMBER(mermaid_state::get_bg_tile_info) -{ - int code = m_videoram2[tile_index]; - int sx = tile_index % 32; - int color = (sx >= 26) ? 0 : 1; - - tileinfo.set(2, code, color, 0); -} - -TILE_GET_INFO_MEMBER(mermaid_state::get_fg_tile_info) -{ - int attr = m_colorram[tile_index]; - int code = m_videoram[tile_index] + ((attr & 0x30) << 4); - int color = attr & 0x0f; - int flags = TILE_FLIPYX((attr & 0xc0) >> 6); - - code |= m_rougien_gfxbank1 * 0x2800; - code |= m_rougien_gfxbank2 * 0x2400; - - tileinfo.set(0, code, color, flags); -} - -void mermaid_state::video_start() -{ - m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(mermaid_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); - m_bg_tilemap->set_scroll_cols(32); - - m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(mermaid_state::get_fg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); - m_fg_tilemap->set_scroll_cols(32); - m_fg_tilemap->set_transparent_pen(0); - - m_screen->register_screen_bitmap(m_helper); - m_screen->register_screen_bitmap(m_helper2); -} - -void mermaid_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect ) -{ - const rectangle spritevisiblearea(0 * 8, 26 * 8 - 1, 2 * 8, 30 * 8 - 1); - const rectangle flip_spritevisiblearea(6 * 8, 31 * 8 - 1, 2 * 8, 30 * 8 - 1); - - uint8_t *spriteram = m_spriteram; - int offs; - - for (offs = m_spriteram.bytes() - 4; offs >= 0; offs -= 4) - { - int attr = spriteram[offs + 2]; - int bank = (attr & 0x30) >> 4; - int code = (spriteram[offs] & 0x3f) | (bank << 6); - int color = attr & 0x0f; - int flipx = spriteram[offs] & 0x40; - int flipy = spriteram[offs] & 0x80; - int sx = spriteram[offs + 3] + 1; - int sy = 240 - spriteram[offs + 1]; - - if (sx >= 0xf0) sx -= 256; - - code |= m_rougien_gfxbank1 * 0x2800; - code |= m_rougien_gfxbank2 * 0x2400; - - if (flip_screen_x()) - { - flipx = !flipx; - sx = 240 - sx; - } - - if (flip_screen_y()) - { - flipy = !flipy; - sy = 240 - sy; - } - - - m_gfxdecode->gfx(1)->transpen(bitmap,(flip_screen_x() ? flip_spritevisiblearea : spritevisiblearea), code, color, flipx, flipy, sx, sy, 0); - } -} - -uint32_t mermaid_state::screen_update_mermaid(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0); - m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0); - draw_sprites(bitmap, cliprect); - return 0; -} - -uint8_t mermaid_state::collision_check( rectangle& rect ) -{ - uint8_t data = 0; - - for (int y = rect.top(); y <= rect.bottom(); y++) - for (int x = rect.left(); x <= rect.right(); x++) - { - uint16_t const a = m_palette->pen_indirect(m_helper.pix(y, x)) & 0x3f; - uint16_t const b = m_palette->pen_indirect(m_helper2.pix(y, x)) & 0x3f; - - if (b && a) - data |= 0x01; - } - - return data; -} - -void mermaid_state::collision_update() -{ - const rectangle &visarea = m_screen->visible_area(); - uint8_t *spriteram = m_spriteram; - - int offs, offs2; - - m_coll_bit0 = 0; - m_coll_bit1 = 0; - m_coll_bit2 = 0; - m_coll_bit3 = 0; - m_coll_bit6 = 0; - - // check for bit 0 (sprite-sprite), 1 (sprite-foreground), 2 (sprite-background) - - for (offs = m_spriteram.bytes() - 4; offs >= 0; offs -= 4) - { - int attr = spriteram[offs + 2]; - int bank = (attr & 0x30) >> 4; - int coll = (attr & 0xc0) >> 6; - int code = (spriteram[offs] & 0x3f) | (bank << 6); - int flipx = spriteram[offs] & 0x40; - int flipy = spriteram[offs] & 0x80; - int sx = spriteram[offs + 3] + 1; - int sy = 240 - spriteram[offs + 1]; - - rectangle rect; - - if (coll != 1) continue; - - code |= m_rougien_gfxbank1 * 0x2800; - code |= m_rougien_gfxbank2 * 0x2400; - - if (flip_screen_x()) - { - flipx = !flipx; - sx = 240 - sx; - } - - if (flip_screen_y()) - { - flipy = !flipy; - sy = 240 - sy; - } - - rect.set( - sx, sx + m_gfxdecode->gfx(1)->width() - 1, - sy, sy + m_gfxdecode->gfx(1)->height() - 1); - rect &= visarea; - - // check collision sprite - background - - m_helper.fill(0, rect); - m_helper2.fill(0, rect); - - m_bg_tilemap->draw(*m_screen, m_helper, rect, 0, 0); - - m_gfxdecode->gfx(1)->transpen(m_helper2,rect, code, 0, flipx, flipy, sx, sy, 0); - - m_coll_bit2 |= collision_check(rect); - - // check collision sprite - foreground - - m_helper.fill(0, rect); - m_helper2.fill(0, rect); - - m_fg_tilemap->draw(*m_screen, m_helper, rect, 0, 0); - - m_gfxdecode->gfx(1)->transpen(m_helper2,rect, code, 0, flipx, flipy, sx, sy, 0); - - m_coll_bit1 |= collision_check(rect); - - // check collision sprite - sprite - - m_helper.fill(0, rect); - m_helper2.fill(0, rect); - - for (offs2 = m_spriteram.bytes() - 4; offs2 >= 0; offs2 -= 4) - if (offs != offs2) - { - int attr2 = spriteram[offs2 + 2]; - int bank2 = (attr2 & 0x30) >> 4; - int coll2 = (attr2 & 0xc0) >> 6; - int code2 = (spriteram[offs2] & 0x3f) | (bank2 << 6); - int flipx2 = spriteram[offs2] & 0x40; - int flipy2 = spriteram[offs2] & 0x80; - int sx2 = spriteram[offs2 + 3] + 1; - int sy2 = 240 - spriteram[offs2 + 1]; - - if (coll2 != 0) continue; - - code2 |= m_rougien_gfxbank1 * 0x2800; - code2 |= m_rougien_gfxbank2 * 0x2400; - - if (flip_screen_x()) - { - flipx2 = !flipx2; - sx2 = 240 - sx2; - } - - if (flip_screen_y()) - { - flipy2 = !flipy2; - sy2 = 240 - sy2; - } - - m_gfxdecode->gfx(1)->transpen(m_helper,rect, code2, 0, flipx2, flipy2, sx2, sy2, 0); - } - - m_gfxdecode->gfx(1)->transpen(m_helper2,rect, code, 0, flipx, flipy, sx, sy, 0); - - m_coll_bit0 |= collision_check(rect); - } - - // check for bit 3 (sprite-sprite) - - for (offs = m_spriteram.bytes() - 4; offs >= 0; offs -= 4) - { - int attr = spriteram[offs + 2]; - int bank = (attr & 0x30) >> 4; - int coll = (attr & 0xc0) >> 6; - int code = (spriteram[offs] & 0x3f) | (bank << 6); - int flipx = spriteram[offs] & 0x40; - int flipy = spriteram[offs] & 0x80; - int sx = spriteram[offs + 3] + 1; - int sy = 240 - spriteram[offs + 1]; - - rectangle rect; - - if (coll != 2) continue; - - code |= m_rougien_gfxbank1 * 0x2800; - code |= m_rougien_gfxbank2 * 0x2400; - - if (flip_screen_x()) - { - flipx = !flipx; - sx = 240 - sx; - } - - if (flip_screen_y()) - { - flipy = !flipy; - sy = 240 - sy; - } - - rect.set( - sx, sx + m_gfxdecode->gfx(1)->width() - 1, - sy, sy + m_gfxdecode->gfx(1)->height() - 1); - rect &= visarea; - - // check collision sprite - sprite - - m_helper.fill(0, rect); - m_helper2.fill(0, rect); - - for (offs2 = m_spriteram.bytes() - 4; offs2 >= 0; offs2 -= 4) - if (offs != offs2) - { - int attr2 = spriteram[offs2 + 2]; - int bank2 = (attr2 & 0x30) >> 4; - int coll2 = (attr2 & 0xc0) >> 6; - int code2 = (spriteram[offs2] & 0x3f) | (bank2 << 6); - int flipx2 = spriteram[offs2] & 0x40; - int flipy2 = spriteram[offs2] & 0x80; - int sx2 = spriteram[offs2 + 3] + 1; - int sy2 = 240 - spriteram[offs2 + 1]; - - if (coll2 != 0) continue; - - code2 |= m_rougien_gfxbank1 * 0x2800; - code2 |= m_rougien_gfxbank2 * 0x2400; - - if (flip_screen_x()) - { - flipx2 = !flipx2; - sx2 = 240 - sx2; - } - - if (flip_screen_y()) - { - flipy2 = !flipy2; - sy2 = 240 - sy2; - } - - m_gfxdecode->gfx(1)->transpen(m_helper,rect, code2, 0, flipx2, flipy2, sx2, sy2, 0); - } - - m_gfxdecode->gfx(1)->transpen(m_helper2,rect, code, 0, flipx, flipy, sx, sy, 0); - - m_coll_bit3 |= collision_check(rect); - } - - // check for bit 6 - - for (offs = m_spriteram.bytes() - 4; offs >= 0; offs -= 4) - { - int attr = spriteram[offs + 2]; - int bank = (attr & 0x30) >> 4; - int coll = (attr & 0xc0) >> 6; - int code = (spriteram[offs] & 0x3f) | (bank << 6); - int flipx = spriteram[offs] & 0x40; - int flipy = spriteram[offs] & 0x80; - int sx = spriteram[offs + 3] + 1; - int sy = 240 - spriteram[offs + 1]; - - rectangle rect; - - if (coll != 1) continue; - - code |= m_rougien_gfxbank1 * 0x2800; - code |= m_rougien_gfxbank2 * 0x2400; - - if (flip_screen_x()) - { - flipx = !flipx; - sx = 240 - sx; - } - - if (flip_screen_y()) - { - flipy = !flipy; - sy = 240 - sy; - } - - rect.set( - sx, sx + m_gfxdecode->gfx(1)->width() - 1, - sy, sy + m_gfxdecode->gfx(1)->height() - 1); - rect &= visarea; - - // check collision sprite - sprite - - m_helper.fill(0, rect); - m_helper2.fill(0, rect); - - for (offs2 = m_spriteram.bytes() - 4; offs2 >= 0; offs2 -= 4) - if (offs != offs2) - { - int attr2 = spriteram[offs2 + 2]; - int bank2 = (attr2 & 0x30) >> 4; - int coll2 = (attr2 & 0xc0) >> 6; - int code2 = (spriteram[offs2] & 0x3f) | (bank2 << 6); - int flipx2 = spriteram[offs2] & 0x40; - int flipy2 = spriteram[offs2] & 0x80; - int sx2 = spriteram[offs2 + 3] + 1; - int sy2 = 240 - spriteram[offs2 + 1]; - - if (coll2 != 2) continue; - - code2 |= m_rougien_gfxbank1 * 0x2800; - code2 |= m_rougien_gfxbank2 * 0x2400; - - if (flip_screen_x()) - { - flipx2 = !flipx2; - sx2 = 240 - sx2; - } - - if (flip_screen_y()) - { - flipy2 = !flipy2; - sy2 = 240 - sy2; - } - - m_gfxdecode->gfx(1)->transpen(m_helper,rect, code2, 0, flipx2, flipy2, sx2, sy2, 0); - } - - m_gfxdecode->gfx(1)->transpen(m_helper2,rect, code, 0, flipx, flipy, sx, sy, 0); - - m_coll_bit6 |= collision_check(rect); - } -} - -WRITE_LINE_MEMBER(mermaid_state::screen_vblank_mermaid) -{ - // rising edge - if (state) - { - collision_update(); - - if (m_nmi_mask) - m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE); - } -} |