summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/atari/starshp1_v.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/atari/starshp1_v.cpp')
-rw-r--r--src/mame/atari/starshp1_v.cpp397
1 files changed, 0 insertions, 397 deletions
diff --git a/src/mame/atari/starshp1_v.cpp b/src/mame/atari/starshp1_v.cpp
deleted file mode 100644
index 710607abccd..00000000000
--- a/src/mame/atari/starshp1_v.cpp
+++ /dev/null
@@ -1,397 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Frank Palazzolo, Stefan Jokisch
-/***************************************************************************
-
-Atari Starship 1 video emulation
-
-***************************************************************************/
-
-#include "emu.h"
-#include "starshp1.h"
-
-
-void starshp1_state::set_pens()
-{
- m_palette->set_indirect_color(m_inverse ? 7 : 0, rgb_t(0x00, 0x00, 0x00));
- m_palette->set_indirect_color(m_inverse ? 6 : 1, rgb_t(0x1e, 0x1e, 0x1e));
- m_palette->set_indirect_color(m_inverse ? 5 : 2, rgb_t(0x4e, 0x4e, 0x4e));
- m_palette->set_indirect_color(m_inverse ? 4 : 3, rgb_t(0x6c, 0x6c, 0x6c));
- m_palette->set_indirect_color(m_inverse ? 3 : 4, rgb_t(0x93, 0x93, 0x93));
- m_palette->set_indirect_color(m_inverse ? 2 : 5, rgb_t(0xb1, 0xb1, 0xb1));
- m_palette->set_indirect_color(m_inverse ? 1 : 6, rgb_t(0xe1, 0xe1, 0xe1));
- m_palette->set_indirect_color(m_inverse ? 0 : 7, rgb_t(0xff, 0xff, 0xff));
-}
-
-
-void starshp1_state::starshp1_palette(palette_device &palette) const
-{
- static constexpr uint16_t colortable_source[] =
- {
- 0, 3, // 0x00 - 0x01 - alpha numerics
- 0, 2, // 0x02 - 0x03 - sprites (Z=0)
- 0, 5, // 0x04 - 0x05 - sprites (Z=1)
- 0, 2, 4, 6, // 0x06 - 0x09 - spaceship (EXPLODE=0)
- 0, 6, 6, 7, // 0x0a - 0x0d - spaceship (EXPLODE=1)
- 5, 2, // 0x0e - 0x0f - star field
- 7, // 0x10 - phasor
- 5, 7 // 0x11 - circle
- };
-
- for (unsigned i = 0; i < std::size(colortable_source); i++)
- palette.set_pen_indirect(i, colortable_source[i]);
-}
-
-
-TILE_GET_INFO_MEMBER(starshp1_state::get_tile_info)
-{
- uint8_t code = m_playfield_ram[tile_index];
-
- tileinfo.set(0, code & 0x3f, 0, 0);
-}
-
-
-void starshp1_state::video_start()
-{
- uint16_t val = 0;
-
- int i;
-
- m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(starshp1_state::get_tile_info)), TILEMAP_SCAN_ROWS, 16, 8, 32, 8);
-
- m_bg_tilemap->set_transparent_pen(0);
-
- m_bg_tilemap->set_scrollx(0, -8);
-
- m_LSFR = std::make_unique<uint16_t[]>(0x10000);
-
- for (i = 0; i < 0x10000; i++)
- {
- int bit = (val >> 0xf) ^
- (val >> 0xc) ^
- (val >> 0x7) ^
- (val >> 0x1) ^ 1;
-
- m_LSFR[i] = val;
-
- val = (val << 1) | (bit & 1);
- }
-
- m_screen->register_screen_bitmap(m_helper);
-}
-
-
-uint8_t starshp1_state::starshp1_rng_r()
-{
- int width = m_screen->width();
- int height = m_screen->height();
- int x = m_screen->hpos();
- int y = m_screen->vpos();
-
- /* the LFSR is only running in the non-blank region
- of the screen, so this is not quite right */
- if (x > width - 1)
- x = width - 1;
- if (y > height - 1)
- y = height - 1;
-
- return m_LSFR[x + (uint16_t) (512 * y)];
-}
-
-
-void starshp1_state::starshp1_ssadd_w(offs_t offset, uint8_t data)
-{
- /*
- * The range of sprite position values doesn't suffice to
- * move the zoomed spaceship sprite over the top and left
- * edges of the screen. These additional values are used
- * to compensate for this. Technically, they cut off the
- * first columns and rows of the spaceship sprite, but in
- * practice they work like offsets in zoomed pixels.
- */
-
- m_ship_voffset = ((offset & 0xf0) >> 4);
- m_ship_hoffset = ((offset & 0x0f) << 2) | (data & 3);
-}
-
-
-void starshp1_state::starshp1_sspic_w(uint8_t data)
-{
- /*
- * Some mysterious game code at address $2CCE is causes
- * erratic images in the target explosion sequence. But
- * This is the way the actual game worked!
- */
-
- m_ship_picture = data;
-
-}
-
-
-void starshp1_state::starshp1_playfield_w(offs_t offset, uint8_t data)
-{
- if (m_mux != 0)
- {
- offset ^= 0x1f;
- m_playfield_ram[offset] = data;
- m_bg_tilemap->mark_tile_dirty(offset);
- }
-}
-
-
-void starshp1_state::draw_starfield(bitmap_ind16 &bitmap)
-{
- /*
- * The LSFR is reset once per frame at the position of
- * sprite 15. This behavior is quite pointless and not
- * really needed by the game. Not emulated.
- */
-
- for (int y = 0; y < bitmap.height(); y++)
- {
- uint16_t const *const p = m_LSFR.get() + (uint16_t) (512 * y);
-
- uint16_t *const pLine = &bitmap.pix(y);
-
- for (int x = 0; x < bitmap.width(); x++)
- if ((p[x] & 0x5b56) == 0x5b44)
- pLine[x] = (p[x] & 0x0400) ? 0x0e : 0x0f;
- }
-}
-
-
-int starshp1_state::get_sprite_hpos(int i)
-{
- return 2 * (m_hpos_ram[i] ^ 0xff);
-}
-int starshp1_state::get_sprite_vpos(int i)
-{
- return 1 * (m_vpos_ram[i] - 0x07);
-}
-
-
-void starshp1_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
-{
- int i;
-
- for (i = 0; i < 14; i++)
- {
- int code = (m_obj_ram[i] & 0xf) ^ 0xf;
-
- m_gfxdecode->gfx(1)->transpen(bitmap,cliprect,
- code % 8,
- code / 8,
- 0, 0,
- get_sprite_hpos(i),
- get_sprite_vpos(i), 0);
- }
-}
-
-
-void starshp1_state::draw_spaceship(bitmap_ind16 &bitmap, const rectangle &cliprect)
-{
- double scaler = -5 * log(1 - m_ship_size / 256.0); /* ? */
-
- unsigned xzoom = 2 * 0x10000 * scaler;
- unsigned yzoom = 1 * 0x10000 * scaler;
-
- int x = get_sprite_hpos(14);
- int y = get_sprite_vpos(14);
-
- if (x <= 0)
- x -= (xzoom * m_ship_hoffset) >> 16;
-
- if (y <= 0)
- y -= (yzoom * m_ship_voffset) >> 16;
-
- m_gfxdecode->gfx(2)->zoom_transpen(bitmap,cliprect,
- m_ship_picture & 0x03,
- m_ship_explode,
- m_ship_picture & 0x80, 0,
- x, y,
- xzoom, yzoom, 0);
-}
-
-
-void starshp1_state::draw_phasor(bitmap_ind16 &bitmap)
-{
- for (int i = 128; i < 240; i++)
- if (i >= get_sprite_vpos(13))
- {
- bitmap.pix(i, 2 * i + 0) = 0x10;
- bitmap.pix(i, 2 * i + 1) = 0x10;
- bitmap.pix(i, 2 * (255 - i) + 0) = 0x10;
- bitmap.pix(i, 2 * (255 - i) + 1) = 0x10;
- }
-}
-
-
-int starshp1_state::get_radius()
-{
- return 6 * sqrt((double)m_circle_size); /* size calibrated by hand */
-}
-int starshp1_state::get_circle_hpos()
-{
- return 2 * (3 * m_circle_hpos / 2 - 64);
-}
-int starshp1_state::get_circle_vpos()
-{
- return 1 * (3 * m_circle_vpos / 2 - 64);
-}
-
-
-void starshp1_state::draw_circle_line(bitmap_ind16 &bitmap, int x, int y, int l)
-{
- if (y >= 0 && y <= bitmap.height() - 1)
- {
- uint16_t const *const p = m_LSFR.get() + uint16_t(512 * y);
-
- uint16_t *const pLine = &bitmap.pix(y);
-
- int h1 = x - 2 * l;
- int h2 = x + 2 * l;
-
- if (h1 < 0)
- h1 = 0;
- if (h2 > bitmap.width() - 1)
- h2 = bitmap.width() - 1;
-
- for (x = h1; x <= h2; x++)
- if (m_circle_mod)
- {
- if (p[x] & 1)
- pLine[x] = 0x11;
- }
- else
- pLine[x] = 0x12;
- }
-}
-
-
-void starshp1_state::draw_circle(bitmap_ind16 &bitmap)
-{
- int cx = get_circle_hpos();
- int cy = get_circle_vpos();
-
- int x = 0;
- int y = get_radius();
-
- /* Bresenham's circle algorithm */
-
- int d = 3 - 2 * get_radius();
-
- while (x <= y)
- {
- draw_circle_line(bitmap, cx, cy - x, y);
- draw_circle_line(bitmap, cx, cy + x, y);
- draw_circle_line(bitmap, cx, cy - y, x);
- draw_circle_line(bitmap, cx, cy + y, x);
-
- x++;
-
- if (d < 0)
- d += 4 * x + 6;
- else
- d += 4 * (x - y--) + 10;
- }
-}
-
-
-int starshp1_state::spaceship_collision(bitmap_ind16 &bitmap, const rectangle &rect)
-{
- for (int y = rect.top(); y <= rect.bottom(); y++)
- {
- uint16_t const *const pLine = &m_helper.pix(y);
-
- for (int x = rect.left(); x <= rect.right(); x++)
- if (pLine[x] != 0)
- return 1;
- }
-
- return 0;
-}
-
-
-int starshp1_state::point_in_circle(int x, int y, int center_x, int center_y, int r)
-{
- int dx = abs(x - center_x) / 2;
- int dy = abs(y - center_y) / 1;
-
- return dx * dx + dy * dy < r * r;
-}
-
-
-int starshp1_state::circle_collision(const rectangle &rect)
-{
- int center_x = get_circle_hpos();
- int center_y = get_circle_vpos();
-
- int r = get_radius();
-
- return point_in_circle(rect.left(), rect.top(), center_x, center_y, r) ||
- point_in_circle(rect.left(), rect.bottom(), center_x, center_y, r) ||
- point_in_circle(rect.right(), rect.top(), center_x, center_y, r) ||
- point_in_circle(rect.right(), rect.bottom(), center_x, center_y, r);
-}
-
-
-uint32_t starshp1_state::screen_update_starshp1(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
-{
- set_pens();
-
- bitmap.fill(0, cliprect);
-
- if (m_starfield_kill == 0)
- draw_starfield(bitmap);
-
- draw_sprites(bitmap, cliprect);
-
- if (m_circle_kill == 0 && m_circle_mod != 0)
- draw_circle(bitmap);
-
- if (m_attract == 0)
- draw_spaceship(bitmap, cliprect);
-
- if (m_circle_kill == 0 && m_circle_mod == 0)
- draw_circle(bitmap);
-
- rectangle tilemaprect(0, m_bg_tilemap->width(), 0, m_bg_tilemap->height());
- tilemaprect &= cliprect;
- m_bg_tilemap->draw(screen, bitmap, tilemaprect, 0, 0);
-
- if (m_phasor != 0)
- draw_phasor(bitmap);
-
- return 0;
-}
-
-
-WRITE_LINE_MEMBER(starshp1_state::screen_vblank_starshp1)
-{
- // rising edge
- if (state)
- {
- const rectangle &visarea = m_screen->visible_area();
-
- rectangle rect(get_sprite_hpos(13), 0, get_sprite_vpos(13), 0);
- rect.set_size(m_gfxdecode->gfx(1)->width(), m_gfxdecode->gfx(1)->height());
-
- rect &= m_helper.cliprect();
-
- m_helper.fill(0, visarea);
-
- if (m_attract == 0)
- draw_spaceship(m_helper, visarea);
-
- if (circle_collision(visarea))
- m_collision_latch |= 1;
-
- if (circle_collision(rect))
- m_collision_latch |= 2;
-
- if (spaceship_collision(m_helper, rect))
- m_collision_latch |= 4;
-
- if (spaceship_collision(m_helper, visarea))
- m_collision_latch |= 8;
- }
-}