summaryrefslogblamecommitdiffstatshomepage
path: root/src/mame/video/sub.cpp
blob: 9f7d243b04a115b50307dc267f75e8283f43af34 (plain) (tree)









































                                                                                         
                                                   

































































                                                                                                                                                               
 

                                                                        
         



















                                                                                                         
// license:BSD-3-Clause
// copyright-holders:Angelo Salese, David Haywood
/*************************************************************************************

Submarine (c) 1985 Sigma

Video functions

*************************************************************************************/

#include "emu.h"
#include "includes/sub.h"

PALETTE_INIT_MEMBER(sub_state, sub)
{
	const uint8_t *color_prom = memregion("proms")->base();
	int i;
	uint8_t* lookup = memregion("proms2")->base();

	for (i = 0;i < 0x100;i++)
	{
		int r,g,b;
		r = (color_prom[0x000] >> 0);
		g = (color_prom[0x100] >> 0);
		b = (color_prom[0x200] >> 0);

		//palette.set_indirect_color(i, rgb_t(r, g, b));
		palette.set_indirect_color(i, rgb_t(pal4bit(r), pal4bit(g), pal4bit(b)));

		color_prom++;
	}

	for (i = 0;i < 0x400;i++)
	{
		uint8_t ctabentry = lookup[i+0x400] | (lookup[i+0x000] << 4);
		palette.set_pen_indirect(i, ctabentry);
	}
}

TILE_GET_INFO_MEMBER(sub_state::get_tile_info)
{
	int code = m_vram[tile_index] | ((m_attr[tile_index]&0xe0)<<3);
	int color = (m_attr[tile_index]&0x1f)+0x40;

	SET_TILE_INFO_MEMBER(0, code, color, 0);
}

WRITE8_MEMBER(sub_state::vram_w)
{
	m_vram[offset] = data;
	m_tilemap->mark_tile_dirty(offset & 0x3ff);
}

WRITE8_MEMBER(sub_state::attr_w)
{
	m_attr[offset] = data;
	m_tilemap->mark_tile_dirty(offset & 0x3ff);
}

WRITE8_MEMBER(sub_state::scrolly_w)
{
	m_scrolly[offset] = data;
	m_tilemap->set_scrolly(offset,m_scrolly[offset]);
}

void sub_state::video_start()
{
	m_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(sub_state::get_tile_info),this), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);

	m_tilemap->set_scroll_cols(32);
}

/*
sprite bank 1
0 xxxx xxxx X offset
1 tttt tttt tile offset
sprite bank 2
0 yyyy yyyy Y offset
1 f--- ---- flips the X offset
1 -f-- ---- flip y, inverted
1 --cc cccc color
*/
void sub_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
	gfx_element *gfx = m_gfxdecode->gfx(1);

	uint8_t *spriteram = m_spriteram;
	uint8_t *spriteram_2 = m_spriteram2;
	uint8_t x,y,spr_offs,i,col,dx,fx,fy;

	for(i=0;i<0x40;i+=2)
	{
		spr_offs = spriteram[i+1];
		x = spriteram[i+0];
		y = 0xe0 - spriteram_2[i+1];
		col = (spriteram_2[i+0])&0x3f;
		dx = (spriteram_2[i+0] & 0x80) ? 0 : 1;
		fy = (spriteram_2[i+0] & 0x40) ? 0 : 1;
		fx = 0;
		if (flip_screen())
		{
			x = 0xe0 - x;
			fx = 1;
			//fx ^= 1;
			//fy ^= 1;
		}

		if(dx)
			x = 0xe0 - x;


		gfx->transpen(bitmap,cliprect,spr_offs,col,fx,fy,x,y,0);
	}
}


uint32_t sub_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
	m_tilemap->draw(screen, bitmap, cliprect, 0, 0);
	draw_sprites(bitmap,cliprect);

	/* re-draw score display above the sprites (window effect) */
	rectangle opaque_rect;
	opaque_rect.min_y = cliprect.min_y;
	opaque_rect.max_y = cliprect.max_y;
	opaque_rect.min_x = flip_screen() ? cliprect.min_x : (cliprect.max_x - 32);
	opaque_rect.max_x = flip_screen() ? (cliprect.min_x + 32) : cliprect.max_x;

	m_tilemap->draw(screen, bitmap, opaque_rect, 0, 0);

	return 0;
}