mirror of
https://github.com/holub/mame
synced 2025-10-06 17:08:28 +03:00
tatsumi.cpp: cycle warriors and big fight bit 15 of tilemap code is per-tile high priority with regards to sprites. Fixes several priority glitches [Angelo Salese]
(out of whatsnew: also made a massive order cleanup)
This commit is contained in:
parent
9c34fccdee
commit
63cf91f214
@ -215,11 +215,8 @@ template<int Bank>
|
|||||||
WRITE16_MEMBER(cyclwarr_state::cyclwarr_videoram_w)
|
WRITE16_MEMBER(cyclwarr_state::cyclwarr_videoram_w)
|
||||||
{
|
{
|
||||||
COMBINE_DATA(&m_cyclwarr_videoram[Bank][offset]);
|
COMBINE_DATA(&m_cyclwarr_videoram[Bank][offset]);
|
||||||
if (offset>=0x400)
|
m_layer[(Bank<<1)|0]->mark_tile_dirty(offset);
|
||||||
{
|
m_layer[(Bank<<1)|1]->mark_tile_dirty(offset);
|
||||||
m_layer[(Bank<<1)|0]->mark_tile_dirty(offset-0x400);
|
|
||||||
m_layer[(Bank<<1)|1]->mark_tile_dirty(offset-0x400);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
WRITE16_MEMBER(cyclwarr_state::output_w)
|
WRITE16_MEMBER(cyclwarr_state::output_w)
|
||||||
@ -1012,6 +1009,8 @@ void cyclwarr_state::machine_reset()
|
|||||||
|
|
||||||
m_last_control = 0;
|
m_last_control = 0;
|
||||||
m_control_word = 0;
|
m_control_word = 0;
|
||||||
|
|
||||||
|
m_road_color_bank = m_prev_road_bank = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
MACHINE_CONFIG_START(cyclwarr_state::cyclwarr)
|
MACHINE_CONFIG_START(cyclwarr_state::cyclwarr)
|
||||||
@ -1076,8 +1075,8 @@ MACHINE_CONFIG_START(cyclwarr_state::bigfight)
|
|||||||
cyclwarr(config);
|
cyclwarr(config);
|
||||||
|
|
||||||
// TODO: it's same video HW, we don't know how/where video registers are mapped
|
// TODO: it's same video HW, we don't know how/where video registers are mapped
|
||||||
MCFG_SCREEN_MODIFY("screen")
|
// MCFG_SCREEN_MODIFY("screen")
|
||||||
MCFG_SCREEN_UPDATE_DRIVER(cyclwarr_state, screen_update_bigfight)
|
// MCFG_SCREEN_UPDATE_DRIVER(cyclwarr_state, screen_update_bigfight)
|
||||||
|
|
||||||
MCFG_VIDEO_START_OVERRIDE(cyclwarr_state, bigfight)
|
MCFG_VIDEO_START_OVERRIDE(cyclwarr_state, bigfight)
|
||||||
|
|
||||||
|
@ -212,7 +212,6 @@ public:
|
|||||||
DECLARE_VIDEO_START(cyclwarr);
|
DECLARE_VIDEO_START(cyclwarr);
|
||||||
DECLARE_VIDEO_START(bigfight);
|
DECLARE_VIDEO_START(bigfight);
|
||||||
uint32_t screen_update_cyclwarr(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
uint32_t screen_update_cyclwarr(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||||
uint32_t screen_update_bigfight(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
|
||||||
|
|
||||||
void cyclwarr(machine_config &config);
|
void cyclwarr(machine_config &config);
|
||||||
void bigfight(machine_config &config);
|
void bigfight(machine_config &config);
|
||||||
@ -240,8 +239,11 @@ private:
|
|||||||
uint16_t m_bigfight_a40000[2];
|
uint16_t m_bigfight_a40000[2];
|
||||||
uint16_t m_bigfight_bank;
|
uint16_t m_bigfight_bank;
|
||||||
uint16_t m_bigfight_last_bank;
|
uint16_t m_bigfight_last_bank;
|
||||||
uint16_t m_cyclwarr_color_bank;
|
uint16_t m_road_color_bank, m_prev_road_bank;
|
||||||
|
bool m_layer1_can_be_road;
|
||||||
|
|
||||||
void tile_expand();
|
void tile_expand();
|
||||||
void draw_bg(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, tilemap_t *src, const uint16_t* scrollx, const uint16_t* scrolly, int xscroll_offset, int yscroll_offset, bool is_road, bool is_opaque);
|
void draw_bg(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, tilemap_t *src, const uint16_t* scrollx, const uint16_t* scrolly, bool is_road, bool is_opaque, int hi_priority);
|
||||||
|
void draw_bg_layers(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int hi_priority);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -5,75 +5,11 @@
|
|||||||
#include "screen.h"
|
#include "screen.h"
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************/
|
/**********************************
|
||||||
|
*
|
||||||
READ16_MEMBER(tatsumi_state::tatsumi_sprite_control_r)
|
* Common routines
|
||||||
{
|
*
|
||||||
return m_sprite_control_ram[offset];
|
*********************************/
|
||||||
}
|
|
||||||
|
|
||||||
WRITE16_MEMBER(tatsumi_state::tatsumi_sprite_control_w)
|
|
||||||
{
|
|
||||||
COMBINE_DATA(&m_sprite_control_ram[offset]);
|
|
||||||
|
|
||||||
/* 0xe0 is bank switch, others unknown */
|
|
||||||
// if ((offset==0xe0 && data&0xefff) || offset!=0xe0)
|
|
||||||
// logerror("%s: Tatsumi TZB215 sprite control %04x %08x\n", m_maincpu->pc(), offset, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
/******************************************************************************/
|
|
||||||
|
|
||||||
WRITE16_MEMBER(apache3_state::apache3_road_z_w)
|
|
||||||
{
|
|
||||||
m_apache3_road_z = data & 0xff;
|
|
||||||
}
|
|
||||||
|
|
||||||
WRITE8_MEMBER(apache3_state::apache3_road_x_w)
|
|
||||||
{
|
|
||||||
// Note: Double buffered. Yes, this is correct :)
|
|
||||||
m_apache3_road_x_ram[data] = offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
READ8_MEMBER(roundup5_state::gfxdata_r)
|
|
||||||
{
|
|
||||||
if((m_control_word & 0x200) == 0x200)
|
|
||||||
{
|
|
||||||
offset += (m_control_word & 0x6000) << 2;
|
|
||||||
|
|
||||||
return m_bg_gfxram[offset];
|
|
||||||
}
|
|
||||||
|
|
||||||
offset+=((m_control_word&0x0c00)>>10) * 0x8000;
|
|
||||||
return m_tx_gfxram[offset];
|
|
||||||
}
|
|
||||||
|
|
||||||
WRITE8_MEMBER(roundup5_state::gfxdata_w)
|
|
||||||
{
|
|
||||||
if((m_control_word & 0x200) == 0x200)
|
|
||||||
{
|
|
||||||
offset += (m_control_word & 0x6000) << 2;
|
|
||||||
m_bg_gfxram[offset] = data;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
offset+=((m_control_word&0x0c00)>>10) * 0x8000;
|
|
||||||
|
|
||||||
if (offset>=0x18000 && data)
|
|
||||||
logerror("effective write to vram %06x %02x (control %04x)\n",offset,data,m_control_word);
|
|
||||||
|
|
||||||
m_tx_gfxram[offset] = data;
|
|
||||||
|
|
||||||
offset=offset%0x8000;
|
|
||||||
|
|
||||||
m_gfxdecode->gfx(1)->mark_dirty(offset/8);
|
|
||||||
}
|
|
||||||
|
|
||||||
WRITE16_MEMBER(tatsumi_state::text_w)
|
|
||||||
{
|
|
||||||
uint16_t *videoram = m_videoram;
|
|
||||||
COMBINE_DATA(&videoram[offset]);
|
|
||||||
m_tx_layer->mark_tile_dirty(offset);
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: move into device
|
// TODO: move into device
|
||||||
WRITE8_MEMBER(tatsumi_state::hd6445_crt_w)
|
WRITE8_MEMBER(tatsumi_state::hd6445_crt_w)
|
||||||
@ -105,7 +41,44 @@ WRITE8_MEMBER(tatsumi_state::hd6445_crt_w)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/********************************************************************/
|
READ16_MEMBER(tatsumi_state::tatsumi_sprite_control_r)
|
||||||
|
{
|
||||||
|
return m_sprite_control_ram[offset];
|
||||||
|
}
|
||||||
|
|
||||||
|
WRITE16_MEMBER(tatsumi_state::tatsumi_sprite_control_w)
|
||||||
|
{
|
||||||
|
COMBINE_DATA(&m_sprite_control_ram[offset]);
|
||||||
|
|
||||||
|
/* 0xe0 is bank switch, others unknown */
|
||||||
|
// if ((offset==0xe0 && data&0xefff) || offset!=0xe0)
|
||||||
|
// logerror("%s: Tatsumi TZB215 sprite control %04x %08x\n", m_maincpu->pc(), offset, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
// apply shadowing to underlying layers
|
||||||
|
// TODO: it might mix up with the lower palette bank instead
|
||||||
|
void tatsumi_state::apply_shadow_bitmap(bitmap_rgb32 &bitmap, const rectangle &cliprect, bitmap_ind8 &shadow_bitmap)
|
||||||
|
{
|
||||||
|
for(int y=cliprect.min_y;y<cliprect.max_y;y++)
|
||||||
|
{
|
||||||
|
for(int x=cliprect.min_x;x<cliprect.max_x;x++)
|
||||||
|
{
|
||||||
|
uint8_t shadow = shadow_bitmap.pix8(y, x);
|
||||||
|
if(shadow)
|
||||||
|
{
|
||||||
|
rgb_t shadow_pen = bitmap.pix32(y, x);
|
||||||
|
bitmap.pix32(y, x) = rgb_t(shadow_pen.r() >> 1,shadow_pen.g() >> 1, shadow_pen.b() >> 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
WRITE16_MEMBER(tatsumi_state::text_w)
|
||||||
|
{
|
||||||
|
uint16_t *videoram = m_videoram;
|
||||||
|
COMBINE_DATA(&videoram[offset]);
|
||||||
|
m_tx_layer->mark_tile_dirty(offset);
|
||||||
|
}
|
||||||
|
|
||||||
TILE_GET_INFO_MEMBER(tatsumi_state::get_text_tile_info)
|
TILE_GET_INFO_MEMBER(tatsumi_state::get_text_tile_info)
|
||||||
{
|
{
|
||||||
@ -116,119 +89,6 @@ TILE_GET_INFO_MEMBER(tatsumi_state::get_text_tile_info)
|
|||||||
0);
|
0);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<int Bank>
|
|
||||||
TILE_GET_INFO_MEMBER(cyclwarr_state::get_tile_info_bigfight)
|
|
||||||
{
|
|
||||||
int tile=m_cyclwarr_videoram[Bank][(tile_index+0x400)&0x7fff];
|
|
||||||
int bank = (m_bigfight_a40000[0] >> (((tile&0xc00)>>10)*4))&0xf;
|
|
||||||
SET_TILE_INFO_MEMBER(1,(tile&0x3ff)|(bank<<10),(tile>>12)&0xf,0);
|
|
||||||
tileinfo.mask_data = &m_mask[((tile&0x3ff)|(bank<<10))<<3];
|
|
||||||
}
|
|
||||||
|
|
||||||
template<int Bank>
|
|
||||||
TILE_GET_INFO_MEMBER(cyclwarr_state::get_tile_info_cyclwarr_road)
|
|
||||||
{
|
|
||||||
int tile=m_cyclwarr_videoram[Bank][(tile_index+0x400)&0x7fff];
|
|
||||||
int bank = (m_bigfight_a40000[0] >> (((tile&0xc00)>>10)*4))&0xf;
|
|
||||||
SET_TILE_INFO_MEMBER(1,(tile&0x3ff)|(bank<<10),((tile>>12)&0xf) | m_cyclwarr_color_bank,0);
|
|
||||||
// TODO: enables transparent pen on sideways
|
|
||||||
tileinfo.mask_data = &m_mask[((tile&0x3ff)|(bank<<10))<<3];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/********************************************************************/
|
|
||||||
|
|
||||||
void cyclwarr_state::tile_expand()
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
Each tile (0x4000 of them) has a lookup table in ROM to build an individual 3-bit palette
|
|
||||||
from sets of 8 bit palettes!
|
|
||||||
*/
|
|
||||||
gfx_element *gx0 = m_gfxdecode->gfx(1);
|
|
||||||
m_mask.resize(gx0->elements() << 3,0);
|
|
||||||
uint8_t *srcdata, *dest;
|
|
||||||
|
|
||||||
// allocate memory for the assembled data
|
|
||||||
srcdata = auto_alloc_array(machine(), uint8_t, gx0->elements() * gx0->width() * gx0->height());
|
|
||||||
|
|
||||||
// loop over elements
|
|
||||||
dest = srcdata;
|
|
||||||
for (int c = 0; c < gx0->elements(); c++)
|
|
||||||
{
|
|
||||||
const uint8_t *c0base = gx0->get_data(c);
|
|
||||||
|
|
||||||
// loop over height
|
|
||||||
for (int y = 0; y < gx0->height(); y++)
|
|
||||||
{
|
|
||||||
const uint8_t *c0 = c0base;
|
|
||||||
|
|
||||||
for (int x = 0; x < gx0->width(); x++)
|
|
||||||
{
|
|
||||||
uint8_t pix = (*c0++ & 7);
|
|
||||||
uint8_t respix = m_cyclwarr_tileclut[(c << 3)|pix];
|
|
||||||
*dest++ = respix;
|
|
||||||
// Transparent pixels are set by both the tile pixel data==0 AND colour palette & 7 == 0
|
|
||||||
m_mask[(c << 3) | (y & 7)] |= ((pix&0x7)!=0 || ((pix&0x7)==0 && (respix&0x7)!=0)) ? (0x80 >> (x & 7)) : 0;
|
|
||||||
}
|
|
||||||
c0base += gx0->rowbytes();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
gx0->set_raw_layout(srcdata, gx0->width(), gx0->height(), gx0->elements(), 8 * gx0->width(), 8 * gx0->width() * gx0->height());
|
|
||||||
gx0->set_granularity(256);
|
|
||||||
}
|
|
||||||
|
|
||||||
/********************************************************************/
|
|
||||||
|
|
||||||
VIDEO_START_MEMBER(apache3_state,apache3)
|
|
||||||
{
|
|
||||||
m_tx_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(tatsumi_state::get_text_tile_info),this),TILEMAP_SCAN_ROWS,8,8,64,64);
|
|
||||||
m_shadow_pen_array = make_unique_clear<uint8_t[]>(8192);
|
|
||||||
m_temp_bitmap.allocate(512, 512);
|
|
||||||
m_apache3_road_x_ram = std::make_unique<uint8_t[]>(512);
|
|
||||||
|
|
||||||
m_tx_layer->set_transparent_pen(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
VIDEO_START_MEMBER(roundup5_state,roundup5)
|
|
||||||
{
|
|
||||||
m_tx_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(tatsumi_state::get_text_tile_info),this),TILEMAP_SCAN_ROWS,8,8,128,64);
|
|
||||||
m_shadow_pen_array = make_unique_clear<uint8_t[]>(8192);
|
|
||||||
m_tx_gfxram = std::make_unique<uint8_t[]>(0x20000);
|
|
||||||
m_bg_gfxram = std::make_unique<uint8_t[]>(0x20000);
|
|
||||||
|
|
||||||
m_tx_layer->set_transparent_pen(0);
|
|
||||||
|
|
||||||
m_gfxdecode->gfx(1)->set_source(m_tx_gfxram.get());
|
|
||||||
|
|
||||||
save_pointer(NAME(m_tx_gfxram.get()),0x20000);
|
|
||||||
save_pointer(NAME(m_bg_gfxram.get()),0x20000);
|
|
||||||
}
|
|
||||||
|
|
||||||
VIDEO_START_MEMBER(cyclwarr_state,cyclwarr)
|
|
||||||
{
|
|
||||||
tile_expand();
|
|
||||||
m_layer[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cyclwarr_state::get_tile_info_bigfight<0>),this),TILEMAP_SCAN_ROWS,8,8,64,512);
|
|
||||||
m_layer[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cyclwarr_state::get_tile_info_cyclwarr_road<0>),this),TILEMAP_SCAN_ROWS,8,8,128,256);
|
|
||||||
m_layer[2] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cyclwarr_state::get_tile_info_bigfight<1>),this),TILEMAP_SCAN_ROWS,8,8,64,512);
|
|
||||||
m_layer[3] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cyclwarr_state::get_tile_info_bigfight<1>),this),TILEMAP_SCAN_ROWS,8,8,64,512);
|
|
||||||
|
|
||||||
m_shadow_pen_array = make_unique_clear<uint8_t[]>(8192);
|
|
||||||
}
|
|
||||||
|
|
||||||
VIDEO_START_MEMBER(cyclwarr_state,bigfight)
|
|
||||||
{
|
|
||||||
tile_expand();
|
|
||||||
m_layer[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cyclwarr_state::get_tile_info_bigfight<0>),this),TILEMAP_SCAN_ROWS,8,8,128,256);
|
|
||||||
m_layer[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cyclwarr_state::get_tile_info_bigfight<0>),this),TILEMAP_SCAN_ROWS,8,8,128,256);
|
|
||||||
m_layer[2] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cyclwarr_state::get_tile_info_bigfight<1>),this),TILEMAP_SCAN_ROWS,8,8,128,256);
|
|
||||||
m_layer[3] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cyclwarr_state::get_tile_info_bigfight<1>),this),TILEMAP_SCAN_ROWS,8,8,128,256);
|
|
||||||
|
|
||||||
m_shadow_pen_array = make_unique_clear<uint8_t[]>(8192);
|
|
||||||
}
|
|
||||||
|
|
||||||
/********************************************************************/
|
|
||||||
|
|
||||||
template<class _BitmapClass>
|
template<class _BitmapClass>
|
||||||
inline void tatsumi_state::roundupt_drawgfxzoomrotate( _BitmapClass &dest_bmp, const rectangle &clip,
|
inline void tatsumi_state::roundupt_drawgfxzoomrotate( _BitmapClass &dest_bmp, const rectangle &clip,
|
||||||
gfx_element *gfx, uint32_t code,uint32_t color,int flipx,int flipy,uint32_t ssx,uint32_t ssy,
|
gfx_element *gfx, uint32_t code,uint32_t color,int flipx,int flipy,uint32_t ssx,uint32_t ssy,
|
||||||
@ -679,6 +539,61 @@ void tatsumi_state::draw_sprites(_BitmapClass &bitmap, const rectangle &cliprect
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Object palettes are build from a series of cluts stored in the object roms.
|
||||||
|
*
|
||||||
|
* We update 'Mame palettes' from the clut here in order to simplify the
|
||||||
|
* draw routines. We also note down any uses of the 'shadow' pen (index 255).
|
||||||
|
*/
|
||||||
|
void tatsumi_state::update_cluts(int fake_palette_offset, int object_base, int length)
|
||||||
|
{
|
||||||
|
|
||||||
|
int i;
|
||||||
|
const uint8_t* bank1 = m_rom_clut[0];
|
||||||
|
const uint8_t* bank2 = m_rom_clut[1];
|
||||||
|
for (i=0; i<length; i+=8)
|
||||||
|
{
|
||||||
|
m_palette->set_pen_color(fake_palette_offset+i+0,m_palette->pen_color(bank1[1]+object_base));
|
||||||
|
m_shadow_pen_array[i+0]=(bank1[1]==255);
|
||||||
|
m_palette->set_pen_color(fake_palette_offset+i+1,m_palette->pen_color(bank1[0]+object_base));
|
||||||
|
m_shadow_pen_array[i+1]=(bank1[0]==255);
|
||||||
|
m_palette->set_pen_color(fake_palette_offset+i+2,m_palette->pen_color(bank1[3]+object_base));
|
||||||
|
m_shadow_pen_array[i+2]=(bank1[3]==255);
|
||||||
|
m_palette->set_pen_color(fake_palette_offset+i+3,m_palette->pen_color(bank1[2]+object_base));
|
||||||
|
m_shadow_pen_array[i+3]=(bank1[2]==255);
|
||||||
|
|
||||||
|
m_palette->set_pen_color(fake_palette_offset+i+4,m_palette->pen_color(bank2[1]+object_base));
|
||||||
|
m_shadow_pen_array[i+4]=(bank2[1]==255);
|
||||||
|
m_palette->set_pen_color(fake_palette_offset+i+5,m_palette->pen_color(bank2[0]+object_base));
|
||||||
|
m_shadow_pen_array[i+5]=(bank2[0]==255);
|
||||||
|
m_palette->set_pen_color(fake_palette_offset+i+6,m_palette->pen_color(bank2[3]+object_base));
|
||||||
|
m_shadow_pen_array[i+6]=(bank2[3]==255);
|
||||||
|
m_palette->set_pen_color(fake_palette_offset+i+7,m_palette->pen_color(bank2[2]+object_base));
|
||||||
|
m_shadow_pen_array[i+7]=(bank2[2]==255);
|
||||||
|
|
||||||
|
bank1+=4;
|
||||||
|
bank2+=4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************
|
||||||
|
*
|
||||||
|
* Apache 3
|
||||||
|
*
|
||||||
|
*********************************/
|
||||||
|
|
||||||
|
WRITE16_MEMBER(apache3_state::apache3_road_z_w)
|
||||||
|
{
|
||||||
|
m_apache3_road_z = data & 0xff;
|
||||||
|
}
|
||||||
|
|
||||||
|
WRITE8_MEMBER(apache3_state::apache3_road_x_w)
|
||||||
|
{
|
||||||
|
// Note: Double buffered. Yes, this is correct :)
|
||||||
|
m_apache3_road_x_ram[data] = offset;
|
||||||
|
}
|
||||||
|
|
||||||
void apache3_state::draw_sky(bitmap_rgb32 &bitmap,const rectangle &cliprect, int palette_base, int start_offset)
|
void apache3_state::draw_sky(bitmap_rgb32 &bitmap,const rectangle &cliprect, int palette_base, int start_offset)
|
||||||
{
|
{
|
||||||
// all todo
|
// all todo
|
||||||
@ -701,6 +616,154 @@ start_offset-=48;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Draw the sky and ground, applying rotation (eventually). Experimental! */
|
||||||
|
void apache3_state::draw_ground(bitmap_rgb32 &dst, const rectangle &cliprect)
|
||||||
|
{
|
||||||
|
if (0)
|
||||||
|
{
|
||||||
|
int x, y;
|
||||||
|
|
||||||
|
uint16_t gva = 0x180; // TODO
|
||||||
|
uint8_t sky_val = m_apache3_rotate_ctrl[1] & 0xff;
|
||||||
|
|
||||||
|
for (y = cliprect.min_y; y <= cliprect.max_y; ++y)
|
||||||
|
{
|
||||||
|
uint16_t rgdb = 0;//m_apache3_road_x_ram[gva & 0xff];
|
||||||
|
uint16_t gha = 0xf60; // test
|
||||||
|
int ln = (((m_apache3_prom[gva & 0x7f] & 0x7f) + (m_apache3_road_z & 0x7f)) >> 5) & 3;
|
||||||
|
|
||||||
|
if (gva & 0x100)
|
||||||
|
{
|
||||||
|
/* Sky */
|
||||||
|
for (x = cliprect.min_x; x <= cliprect.max_x; ++x)
|
||||||
|
{
|
||||||
|
dst.pix32(y, x) = m_palette->pen(0x100 + (sky_val & 0x7f));
|
||||||
|
|
||||||
|
/* Update horizontal counter? */
|
||||||
|
gha = (gha + 1) & 0xfff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Ground */
|
||||||
|
for (x = cliprect.min_x; x <= cliprect.max_x; ++x)
|
||||||
|
{
|
||||||
|
uint8_t colour;
|
||||||
|
uint16_t hval;
|
||||||
|
uint8_t pixels;
|
||||||
|
int pix_sel;
|
||||||
|
|
||||||
|
hval = (rgdb + gha) & 0xfff; // Not quite
|
||||||
|
|
||||||
|
if (hval & 0x800)
|
||||||
|
hval ^= 0x1ff; // TEST
|
||||||
|
//else
|
||||||
|
//hval = hval;
|
||||||
|
|
||||||
|
pixels = m_apache3_g_ram[(((gva & 0xff) << 7) | ((hval >> 2) & 0x7f))];
|
||||||
|
pix_sel = hval & 3;
|
||||||
|
|
||||||
|
colour = (pixels >> (pix_sel << 1)) & 3;
|
||||||
|
colour = (BIT(hval, 11) << 4) | (colour << 2) | ln;
|
||||||
|
|
||||||
|
/* Draw the pixel */
|
||||||
|
dst.pix32(y, x) = m_palette->pen(0x200 + colour);
|
||||||
|
|
||||||
|
/* Update horizontal counter */
|
||||||
|
gha = (gha + 1) & 0xfff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Update sky counter */
|
||||||
|
sky_val++;
|
||||||
|
gva = (gva + 1) & 0x1ff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
VIDEO_START_MEMBER(apache3_state,apache3)
|
||||||
|
{
|
||||||
|
m_tx_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(tatsumi_state::get_text_tile_info),this),TILEMAP_SCAN_ROWS,8,8,64,64);
|
||||||
|
m_shadow_pen_array = make_unique_clear<uint8_t[]>(8192);
|
||||||
|
m_temp_bitmap.allocate(512, 512);
|
||||||
|
m_apache3_road_x_ram = std::make_unique<uint8_t[]>(512);
|
||||||
|
|
||||||
|
m_tx_layer->set_transparent_pen(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t apache3_state::screen_update_apache3(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
||||||
|
{
|
||||||
|
update_cluts(1024, 0, 2048+2048);
|
||||||
|
|
||||||
|
m_tx_layer->set_scrollx(0,24);
|
||||||
|
|
||||||
|
bitmap.fill(m_palette->pen(0), cliprect);
|
||||||
|
screen.priority().fill(0, cliprect);
|
||||||
|
draw_sprites(screen.priority(),cliprect,1,(m_sprite_control_ram[0xe0]&0x1000) ? 0x1000 : 0); // Alpha pass only
|
||||||
|
draw_sky(bitmap, cliprect, 256, m_apache3_rotate_ctrl[1]);
|
||||||
|
apply_shadow_bitmap(bitmap,cliprect,screen.priority());
|
||||||
|
// draw_ground(bitmap, cliprect);
|
||||||
|
draw_sprites(bitmap,cliprect,0, (m_sprite_control_ram[0x20]&0x1000) ? 0x1000 : 0);
|
||||||
|
m_tx_layer->draw(screen, bitmap, cliprect, 0,0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**********************************
|
||||||
|
*
|
||||||
|
* Round Up 5
|
||||||
|
*
|
||||||
|
*********************************/
|
||||||
|
|
||||||
|
READ8_MEMBER(roundup5_state::gfxdata_r)
|
||||||
|
{
|
||||||
|
if((m_control_word & 0x200) == 0x200)
|
||||||
|
{
|
||||||
|
offset += (m_control_word & 0x6000) << 2;
|
||||||
|
|
||||||
|
return m_bg_gfxram[offset];
|
||||||
|
}
|
||||||
|
|
||||||
|
offset+=((m_control_word&0x0c00)>>10) * 0x8000;
|
||||||
|
return m_tx_gfxram[offset];
|
||||||
|
}
|
||||||
|
|
||||||
|
WRITE8_MEMBER(roundup5_state::gfxdata_w)
|
||||||
|
{
|
||||||
|
if((m_control_word & 0x200) == 0x200)
|
||||||
|
{
|
||||||
|
offset += (m_control_word & 0x6000) << 2;
|
||||||
|
m_bg_gfxram[offset] = data;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
offset+=((m_control_word&0x0c00)>>10) * 0x8000;
|
||||||
|
|
||||||
|
if (offset>=0x18000 && data)
|
||||||
|
logerror("effective write to vram %06x %02x (control %04x)\n",offset,data,m_control_word);
|
||||||
|
|
||||||
|
m_tx_gfxram[offset] = data;
|
||||||
|
|
||||||
|
offset=offset%0x8000;
|
||||||
|
|
||||||
|
m_gfxdecode->gfx(1)->mark_dirty(offset/8);
|
||||||
|
}
|
||||||
|
|
||||||
|
VIDEO_START_MEMBER(roundup5_state,roundup5)
|
||||||
|
{
|
||||||
|
m_tx_layer = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(tatsumi_state::get_text_tile_info),this),TILEMAP_SCAN_ROWS,8,8,128,64);
|
||||||
|
m_shadow_pen_array = make_unique_clear<uint8_t[]>(8192);
|
||||||
|
m_tx_gfxram = std::make_unique<uint8_t[]>(0x20000);
|
||||||
|
m_bg_gfxram = std::make_unique<uint8_t[]>(0x20000);
|
||||||
|
|
||||||
|
m_tx_layer->set_transparent_pen(0);
|
||||||
|
|
||||||
|
m_gfxdecode->gfx(1)->set_source(m_tx_gfxram.get());
|
||||||
|
|
||||||
|
save_pointer(NAME(m_tx_gfxram.get()),0x20000);
|
||||||
|
save_pointer(NAME(m_bg_gfxram.get()),0x20000);
|
||||||
|
}
|
||||||
|
|
||||||
void roundup5_state::draw_road(bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
void roundup5_state::draw_road(bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@ -778,6 +841,8 @@ pos is 11.5 fixed point
|
|||||||
|
|
||||||
for (/*y=0*/; y<cliprect.max_y+1; y++)
|
for (/*y=0*/; y<cliprect.max_y+1; y++)
|
||||||
{
|
{
|
||||||
|
// TODO: tunnels road drawing has a different format?
|
||||||
|
// shift is always 0x88** while data[3] is a variable argument with bit 15 always on
|
||||||
int shift=data[0];
|
int shift=data[0];
|
||||||
int shift2=data[2];
|
int shift2=data[2];
|
||||||
int pal = 4; //(data[3]>>8)&0xf;
|
int pal = 4; //(data[3]>>8)&0xf;
|
||||||
@ -915,140 +980,6 @@ offset is from last pixel of first road segment?
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void tatsumi_state::update_cluts(int fake_palette_offset, int object_base, int length)
|
|
||||||
{
|
|
||||||
/* Object palettes are build from a series of cluts stored in the object roms.
|
|
||||||
|
|
||||||
We update 'Mame palettes' from the clut here in order to simplify the
|
|
||||||
draw routines. We also note down any uses of the 'shadow' pen (index 255).
|
|
||||||
*/
|
|
||||||
int i;
|
|
||||||
const uint8_t* bank1=m_rom_clut[0];
|
|
||||||
const uint8_t* bank2=m_rom_clut[1];
|
|
||||||
for (i=0; i<length; i+=8) {
|
|
||||||
m_palette->set_pen_color(fake_palette_offset+i+0,m_palette->pen_color(bank1[1]+object_base));
|
|
||||||
m_shadow_pen_array[i+0]=(bank1[1]==255);
|
|
||||||
m_palette->set_pen_color(fake_palette_offset+i+1,m_palette->pen_color(bank1[0]+object_base));
|
|
||||||
m_shadow_pen_array[i+1]=(bank1[0]==255);
|
|
||||||
m_palette->set_pen_color(fake_palette_offset+i+2,m_palette->pen_color(bank1[3]+object_base));
|
|
||||||
m_shadow_pen_array[i+2]=(bank1[3]==255);
|
|
||||||
m_palette->set_pen_color(fake_palette_offset+i+3,m_palette->pen_color(bank1[2]+object_base));
|
|
||||||
m_shadow_pen_array[i+3]=(bank1[2]==255);
|
|
||||||
|
|
||||||
m_palette->set_pen_color(fake_palette_offset+i+4,m_palette->pen_color(bank2[1]+object_base));
|
|
||||||
m_shadow_pen_array[i+4]=(bank2[1]==255);
|
|
||||||
m_palette->set_pen_color(fake_palette_offset+i+5,m_palette->pen_color(bank2[0]+object_base));
|
|
||||||
m_shadow_pen_array[i+5]=(bank2[0]==255);
|
|
||||||
m_palette->set_pen_color(fake_palette_offset+i+6,m_palette->pen_color(bank2[3]+object_base));
|
|
||||||
m_shadow_pen_array[i+6]=(bank2[3]==255);
|
|
||||||
m_palette->set_pen_color(fake_palette_offset+i+7,m_palette->pen_color(bank2[2]+object_base));
|
|
||||||
m_shadow_pen_array[i+7]=(bank2[2]==255);
|
|
||||||
|
|
||||||
bank1+=4;
|
|
||||||
bank2+=4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**********************************************************************/
|
|
||||||
|
|
||||||
void cyclwarr_state::draw_bg(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, tilemap_t *src, const uint16_t* scrollx, const uint16_t* scrolly, int xscroll_offset, int yscroll_offset, bool is_road, bool is_opaque)
|
|
||||||
{
|
|
||||||
rectangle clip;
|
|
||||||
clip.min_x = cliprect.min_x;
|
|
||||||
clip.max_x = cliprect.max_x;
|
|
||||||
// TODO: both enabled when this occurs
|
|
||||||
bool rowscroll_enable = (scrollx[0] & 0x1000) == 0;
|
|
||||||
bool colscroll_enable = (scrollx[0] & 0x2000) == 0;
|
|
||||||
|
|
||||||
for (int y=cliprect.min_y; y<=cliprect.max_y; y++)
|
|
||||||
{
|
|
||||||
clip.min_y = clip.max_y = y;
|
|
||||||
int y_base = rowscroll_enable ? y : 0;
|
|
||||||
int x_base = colscroll_enable ? y : 0;
|
|
||||||
int src_y = (scrolly[y_base] & 0xfff) + yscroll_offset;
|
|
||||||
int src_x = (scrollx[x_base] & 0xfff) + xscroll_offset;
|
|
||||||
|
|
||||||
// special handling for cycle warriors road: it reads in scrolly table bits 15-13 an
|
|
||||||
// additional tile color bank and per scanline.
|
|
||||||
if(is_road == true && scrolly[y_base] & 0x8000)
|
|
||||||
{
|
|
||||||
m_cyclwarr_color_bank = (scrolly[y_base] >> 13) & 3;
|
|
||||||
src->mark_all_dirty();
|
|
||||||
// TODO: road sidelines attempt, still not right (cuts off cyan color at intro and farmost road lines)
|
|
||||||
//if(m_cyclwarr_color_bank)
|
|
||||||
// is_opaque = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
src->set_scrollx(0,src_x);
|
|
||||||
src->set_scrolly(0,src_y);
|
|
||||||
src->draw(screen, bitmap, clip, is_opaque ? TILEMAP_DRAW_OPAQUE : 0, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Draw the sky and ground, applying rotation (eventually). Experimental! */
|
|
||||||
void apache3_state::draw_ground(bitmap_rgb32 &dst, const rectangle &cliprect)
|
|
||||||
{
|
|
||||||
if (0) {
|
|
||||||
int x, y;
|
|
||||||
|
|
||||||
uint16_t gva = 0x180; // TODO
|
|
||||||
uint8_t sky_val = m_apache3_rotate_ctrl[1] & 0xff;
|
|
||||||
|
|
||||||
for (y = cliprect.min_y; y <= cliprect.max_y; ++y)
|
|
||||||
{
|
|
||||||
uint16_t rgdb = 0;//m_apache3_road_x_ram[gva & 0xff];
|
|
||||||
uint16_t gha = 0xf60; // test
|
|
||||||
int ln = (((m_apache3_prom[gva & 0x7f] & 0x7f) + (m_apache3_road_z & 0x7f)) >> 5) & 3;
|
|
||||||
|
|
||||||
if (gva & 0x100)
|
|
||||||
{
|
|
||||||
/* Sky */
|
|
||||||
for (x = cliprect.min_x; x <= cliprect.max_x; ++x)
|
|
||||||
{
|
|
||||||
dst.pix32(y, x) = m_palette->pen(0x100 + (sky_val & 0x7f));
|
|
||||||
|
|
||||||
/* Update horizontal counter? */
|
|
||||||
gha = (gha + 1) & 0xfff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Ground */
|
|
||||||
for (x = cliprect.min_x; x <= cliprect.max_x; ++x)
|
|
||||||
{
|
|
||||||
uint8_t colour;
|
|
||||||
uint16_t hval;
|
|
||||||
uint8_t pixels;
|
|
||||||
int pix_sel;
|
|
||||||
|
|
||||||
hval = (rgdb + gha) & 0xfff; // Not quite
|
|
||||||
|
|
||||||
if (hval & 0x800)
|
|
||||||
hval ^= 0x1ff; // TEST
|
|
||||||
//else
|
|
||||||
//hval = hval;
|
|
||||||
|
|
||||||
pixels = m_apache3_g_ram[(((gva & 0xff) << 7) | ((hval >> 2) & 0x7f))];
|
|
||||||
pix_sel = hval & 3;
|
|
||||||
|
|
||||||
colour = (pixels >> (pix_sel << 1)) & 3;
|
|
||||||
colour = (BIT(hval, 11) << 4) | (colour << 2) | ln;
|
|
||||||
|
|
||||||
/* Draw the pixel */
|
|
||||||
dst.pix32(y, x) = m_palette->pen(0x200 + colour);
|
|
||||||
|
|
||||||
/* Update horizontal counter */
|
|
||||||
gha = (gha + 1) & 0xfff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Update sky counter */
|
|
||||||
sky_val++;
|
|
||||||
gva = (gva + 1) & 0x1ff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// background layer landscape for Round Up 5
|
// background layer landscape for Round Up 5
|
||||||
// two bitmap layers, back layer is 512 x 128, the other one is 512 x 64
|
// two bitmap layers, back layer is 512 x 128, the other one is 512 x 64
|
||||||
// it's safe to assume that three monitor version will have a different arrangement here ...
|
// it's safe to assume that three monitor version will have a different arrangement here ...
|
||||||
@ -1089,25 +1020,6 @@ void roundup5_state::draw_landscape(bitmap_rgb32 &bitmap, const rectangle &clipr
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**********************************************************************/
|
|
||||||
|
|
||||||
uint32_t apache3_state::screen_update_apache3(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
|
||||||
{
|
|
||||||
update_cluts(1024, 0, 2048+2048);
|
|
||||||
|
|
||||||
m_tx_layer->set_scrollx(0,24);
|
|
||||||
|
|
||||||
bitmap.fill(m_palette->pen(0), cliprect);
|
|
||||||
screen.priority().fill(0, cliprect);
|
|
||||||
draw_sprites(screen.priority(),cliprect,1,(m_sprite_control_ram[0xe0]&0x1000) ? 0x1000 : 0); // Alpha pass only
|
|
||||||
draw_sky(bitmap, cliprect, 256, m_apache3_rotate_ctrl[1]);
|
|
||||||
apply_shadow_bitmap(bitmap,cliprect,screen.priority());
|
|
||||||
// draw_ground(bitmap, cliprect);
|
|
||||||
draw_sprites(bitmap,cliprect,0, (m_sprite_control_ram[0x20]&0x1000) ? 0x1000 : 0);
|
|
||||||
m_tx_layer->draw(screen, bitmap, cliprect, 0,0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t roundup5_state::screen_update_roundup5(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
uint32_t roundup5_state::screen_update_roundup5(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
||||||
{
|
{
|
||||||
int tx_start_addr;
|
int tx_start_addr;
|
||||||
@ -1140,20 +1052,174 @@ uint32_t roundup5_state::screen_update_roundup5(screen_device &screen, bitmap_rg
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void tatsumi_state::apply_shadow_bitmap(bitmap_rgb32 &bitmap, const rectangle &cliprect, bitmap_ind8 &shadow_bitmap)
|
/**********************************
|
||||||
|
*
|
||||||
|
* Cycle Warriors / Big Fight
|
||||||
|
*
|
||||||
|
*********************************/
|
||||||
|
|
||||||
|
// TODO: color offset is a mystery, it's certainly not masked with 0xf
|
||||||
|
// cfr. Big Fight fade in/out effects or CRT test
|
||||||
|
template<int Bank>
|
||||||
|
TILE_GET_INFO_MEMBER(cyclwarr_state::get_tile_info_bigfight)
|
||||||
{
|
{
|
||||||
for(int y=cliprect.min_y;y<cliprect.max_y;y++)
|
int tile = m_cyclwarr_videoram[Bank][tile_index&0x7fff];
|
||||||
|
int bank = (m_bigfight_a40000[0] >> (((tile&0xc00)>>10)*4))&0xf;
|
||||||
|
uint16_t tileno = (tile&0x3ff)|(bank<<10);
|
||||||
|
|
||||||
|
SET_TILE_INFO_MEMBER(1,
|
||||||
|
tileno,
|
||||||
|
(tile >> 12) & 0xf,
|
||||||
|
0);
|
||||||
|
|
||||||
|
// bit 15: tile appears in front of sprites
|
||||||
|
tileinfo.category = (tile >> 15) & 1;
|
||||||
|
tileinfo.mask_data = &m_mask[tileno<<3];
|
||||||
|
}
|
||||||
|
|
||||||
|
// same as above but additionally apply per-scanline color banking
|
||||||
|
// TODO: split for simplicity, need to merge with above
|
||||||
|
template<int Bank>
|
||||||
|
TILE_GET_INFO_MEMBER(cyclwarr_state::get_tile_info_cyclwarr_road)
|
||||||
|
{
|
||||||
|
int tile = m_cyclwarr_videoram[Bank][tile_index&0x7fff];
|
||||||
|
int bank = (m_bigfight_a40000[0] >> (((tile&0xc00)>>10)*4))&0xf;
|
||||||
|
uint16_t tileno = (tile&0x3ff)|(bank<<10);
|
||||||
|
|
||||||
|
SET_TILE_INFO_MEMBER(1,
|
||||||
|
tileno,
|
||||||
|
((tile>>12) & 0xf) | m_road_color_bank,
|
||||||
|
0);
|
||||||
|
|
||||||
|
tileinfo.category = (tile >> 15) & 1;
|
||||||
|
// TODO: enables transparent pen on sideways
|
||||||
|
tileinfo.mask_data = &m_mask[((tile&0x3ff)|(bank<<10))<<3];
|
||||||
|
}
|
||||||
|
|
||||||
|
void cyclwarr_state::tile_expand()
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
Each tile (0x4000 of them) has a lookup table in ROM to build an individual 3-bit palette
|
||||||
|
from sets of 8 bit palettes!
|
||||||
|
*/
|
||||||
|
gfx_element *gx0 = m_gfxdecode->gfx(1);
|
||||||
|
m_mask.resize(gx0->elements() << 3,0);
|
||||||
|
uint8_t *srcdata, *dest;
|
||||||
|
|
||||||
|
// allocate memory for the assembled data
|
||||||
|
srcdata = auto_alloc_array(machine(), uint8_t, gx0->elements() * gx0->width() * gx0->height());
|
||||||
|
|
||||||
|
// loop over elements
|
||||||
|
dest = srcdata;
|
||||||
|
for (int c = 0; c < gx0->elements(); c++)
|
||||||
{
|
{
|
||||||
for(int x=cliprect.min_x;x<cliprect.max_x;x++)
|
const uint8_t *c0base = gx0->get_data(c);
|
||||||
|
|
||||||
|
// loop over height
|
||||||
|
for (int y = 0; y < gx0->height(); y++)
|
||||||
{
|
{
|
||||||
uint8_t shadow = shadow_bitmap.pix8(y, x);
|
const uint8_t *c0 = c0base;
|
||||||
if(shadow)
|
|
||||||
|
for (int x = 0; x < gx0->width(); x++)
|
||||||
{
|
{
|
||||||
rgb_t shadow_pen = bitmap.pix32(y, x);
|
uint8_t pix = (*c0++ & 7);
|
||||||
bitmap.pix32(y, x) = rgb_t(shadow_pen.r() >> 1,shadow_pen.g() >> 1, shadow_pen.b() >> 1);
|
uint8_t respix = m_cyclwarr_tileclut[(c << 3)|pix];
|
||||||
|
*dest++ = respix;
|
||||||
|
// Transparent pixels are set by both the tile pixel data==0 AND colour palette & 7 == 0
|
||||||
|
m_mask[(c << 3) | (y & 7)] |= ((pix&0x7)!=0 || ((pix&0x7)==0 && (respix&0x7)!=0)) ? (0x80 >> (x & 7)) : 0;
|
||||||
}
|
}
|
||||||
|
c0base += gx0->rowbytes();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gx0->set_raw_layout(srcdata, gx0->width(), gx0->height(), gx0->elements(), 8 * gx0->width(), 8 * gx0->width() * gx0->height());
|
||||||
|
gx0->set_granularity(256);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
VIDEO_START_MEMBER(cyclwarr_state,cyclwarr)
|
||||||
|
{
|
||||||
|
tile_expand();
|
||||||
|
m_layer[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cyclwarr_state::get_tile_info_bigfight<0>),this),TILEMAP_SCAN_ROWS,8,8,64,512);
|
||||||
|
m_layer[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cyclwarr_state::get_tile_info_cyclwarr_road<0>),this),TILEMAP_SCAN_ROWS,8,8,128,256);
|
||||||
|
m_layer[2] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cyclwarr_state::get_tile_info_bigfight<1>),this),TILEMAP_SCAN_ROWS,8,8,64,512);
|
||||||
|
m_layer[3] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cyclwarr_state::get_tile_info_bigfight<1>),this),TILEMAP_SCAN_ROWS,8,8,64,512);
|
||||||
|
|
||||||
|
m_shadow_pen_array = make_unique_clear<uint8_t[]>(8192);
|
||||||
|
|
||||||
|
m_layer[3]->set_scrolldx(-8,-8);
|
||||||
|
m_layer[2]->set_scrolldx(-8,-8);
|
||||||
|
m_layer[1]->set_scrolldx(-8,-8);
|
||||||
|
m_layer[0]->set_scrolldx(-0x10,-0x10);
|
||||||
|
m_layer1_can_be_road = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
VIDEO_START_MEMBER(cyclwarr_state,bigfight)
|
||||||
|
{
|
||||||
|
tile_expand();
|
||||||
|
m_layer[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cyclwarr_state::get_tile_info_bigfight<0>),this),TILEMAP_SCAN_ROWS,8,8,128,256);
|
||||||
|
m_layer[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cyclwarr_state::get_tile_info_bigfight<0>),this),TILEMAP_SCAN_ROWS,8,8,128,256);
|
||||||
|
m_layer[2] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cyclwarr_state::get_tile_info_bigfight<1>),this),TILEMAP_SCAN_ROWS,8,8,128,256);
|
||||||
|
m_layer[3] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cyclwarr_state::get_tile_info_bigfight<1>),this),TILEMAP_SCAN_ROWS,8,8,128,256);
|
||||||
|
|
||||||
|
m_shadow_pen_array = make_unique_clear<uint8_t[]>(8192);
|
||||||
|
|
||||||
|
m_layer[3]->set_scrolldx(-8,-8);
|
||||||
|
m_layer[2]->set_scrolldx(-8,-8);
|
||||||
|
m_layer[1]->set_scrolldx(-8,-8);
|
||||||
|
m_layer[0]->set_scrolldx(-0x10,-0x10);
|
||||||
|
m_layer1_can_be_road = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void cyclwarr_state::draw_bg(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, tilemap_t *src, const uint16_t* scrollx, const uint16_t* scrolly, bool is_road, bool is_opaque, int hi_priority)
|
||||||
|
{
|
||||||
|
rectangle clip;
|
||||||
|
clip.min_x = cliprect.min_x;
|
||||||
|
clip.max_x = cliprect.max_x;
|
||||||
|
// TODO: both always enabled when this occurs
|
||||||
|
bool rowscroll_enable = (scrollx[0] & 0x1000) == 0;
|
||||||
|
bool colscroll_enable = (scrollx[0] & 0x2000) == 0;
|
||||||
|
|
||||||
|
for (int y=cliprect.min_y; y<=cliprect.max_y; y++)
|
||||||
|
{
|
||||||
|
clip.min_y = clip.max_y = y;
|
||||||
|
int y_base = rowscroll_enable ? y : 0;
|
||||||
|
int x_base = colscroll_enable ? y : 0;
|
||||||
|
int src_y = (scrolly[y_base] & 0xfff);
|
||||||
|
int src_x = (scrollx[x_base] & 0x7ff);
|
||||||
|
|
||||||
|
// special handling for cycle warriors road: it reads in scrolly table bits 15-13 an
|
||||||
|
// additional tile color bank and per scanline.
|
||||||
|
if(is_road == true)
|
||||||
|
{
|
||||||
|
if(scrolly[y_base] & 0x8000)
|
||||||
|
m_road_color_bank = (scrolly[y_base] >> 13) & 3;
|
||||||
|
else
|
||||||
|
m_road_color_bank = 0;
|
||||||
|
|
||||||
|
if(m_road_color_bank != m_prev_road_bank)
|
||||||
|
{
|
||||||
|
m_prev_road_bank = m_road_color_bank;
|
||||||
|
src->mark_all_dirty();
|
||||||
|
}
|
||||||
|
// TODO: road sidelines attempt, still not right (cuts off cyan color at intro and farmost road lines)
|
||||||
|
//if(m_road_color_bank)
|
||||||
|
// is_opaque = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
src->set_scrollx(0,src_x);
|
||||||
|
src->set_scrolly(0,src_y);
|
||||||
|
src->draw(screen, bitmap, clip, (is_opaque ? TILEMAP_DRAW_OPAQUE : 0) | TILEMAP_DRAW_CATEGORY(hi_priority), 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void cyclwarr_state::draw_bg_layers(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int hi_priority)
|
||||||
|
{
|
||||||
|
draw_bg(screen, bitmap, cliprect, m_layer[3], &m_cyclwarr_videoram[1][0x000], &m_cyclwarr_videoram[1][0x100], false, hi_priority == 0, hi_priority);
|
||||||
|
draw_bg(screen, bitmap, cliprect, m_layer[2], &m_cyclwarr_videoram[1][0x200], &m_cyclwarr_videoram[1][0x300], false, false, hi_priority);
|
||||||
|
draw_bg(screen, bitmap, cliprect, m_layer[1], &m_cyclwarr_videoram[0][0x000], &m_cyclwarr_videoram[0][0x100], m_layer1_can_be_road, false, hi_priority);
|
||||||
|
draw_bg(screen, bitmap, cliprect, m_layer[0], &m_cyclwarr_videoram[0][0x200], &m_cyclwarr_videoram[0][0x300], false, false,hi_priority);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t cyclwarr_state::screen_update_cyclwarr(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
uint32_t cyclwarr_state::screen_update_cyclwarr(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
||||||
@ -1177,49 +1243,12 @@ uint32_t cyclwarr_state::screen_update_cyclwarr(screen_device &screen, bitmap_rg
|
|||||||
,m_cyclwarr_videoram[0][0x000],m_cyclwarr_videoram[0][0x100]
|
,m_cyclwarr_videoram[0][0x000],m_cyclwarr_videoram[0][0x100]
|
||||||
,m_cyclwarr_videoram[0][0x200],m_cyclwarr_videoram[0][0x300]);
|
,m_cyclwarr_videoram[0][0x200],m_cyclwarr_videoram[0][0x300]);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
screen.priority().fill(0, cliprect);
|
screen.priority().fill(0, cliprect);
|
||||||
draw_sprites(screen.priority(),cliprect,1,(m_sprite_control_ram[0xe0]&0x1000) ? 0x1000 : 0); // Alpha pass only
|
draw_sprites(screen.priority(),cliprect,1,(m_sprite_control_ram[0xe0]&0x1000) ? 0x1000 : 0); // Alpha pass only
|
||||||
draw_bg(screen, bitmap, cliprect, m_layer[3], &m_cyclwarr_videoram[1][0x000], &m_cyclwarr_videoram[1][0x100], 8, -0x80, false, true);
|
draw_bg_layers(screen, bitmap, cliprect, 0);
|
||||||
draw_bg(screen, bitmap, cliprect, m_layer[2], &m_cyclwarr_videoram[1][0x200], &m_cyclwarr_videoram[1][0x300], 8, -0x80, false, false);
|
|
||||||
draw_bg(screen, bitmap, cliprect, m_layer[1], &m_cyclwarr_videoram[0][0x000], &m_cyclwarr_videoram[0][0x100], 8, -0x40, true, false);
|
|
||||||
apply_shadow_bitmap(bitmap,cliprect,screen.priority());
|
apply_shadow_bitmap(bitmap,cliprect,screen.priority());
|
||||||
draw_sprites(bitmap,cliprect,0,(m_sprite_control_ram[0xe0]&0x1000) ? 0x1000 : 0);
|
draw_sprites(bitmap,cliprect,0,(m_sprite_control_ram[0xe0]&0x1000) ? 0x1000 : 0);
|
||||||
draw_bg(screen, bitmap, cliprect, m_layer[0], &m_cyclwarr_videoram[0][0x200], &m_cyclwarr_videoram[0][0x300], 0x10, -0x80, false, false);
|
draw_bg_layers(screen, bitmap, cliprect, 1);
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t cyclwarr_state::screen_update_bigfight(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
|
||||||
{
|
|
||||||
m_bigfight_bank=m_bigfight_a40000[0];
|
|
||||||
if (m_bigfight_bank!=m_bigfight_last_bank)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < 4; i++)
|
|
||||||
{
|
|
||||||
m_layer[i]->mark_all_dirty();
|
|
||||||
}
|
|
||||||
m_bigfight_last_bank=m_bigfight_bank;
|
|
||||||
}
|
|
||||||
update_cluts(8192, 4096, 8192);
|
|
||||||
|
|
||||||
#ifdef UNUSED_FUNCTION
|
|
||||||
popmessage("%04x %04x|%04x %04x|%04x %04x|%04x %04x",m_cyclwarr_videoram[1][0x000],m_cyclwarr_videoram[1][0x100]
|
|
||||||
,m_cyclwarr_videoram[1][0x200],m_cyclwarr_videoram[1][0x300]
|
|
||||||
,m_cyclwarr_videoram[0][0x000],m_cyclwarr_videoram[0][0x100]
|
|
||||||
,m_cyclwarr_videoram[0][0x200],m_cyclwarr_videoram[0][0x300]);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
bitmap.fill(m_palette->pen(0), cliprect);
|
|
||||||
|
|
||||||
screen.priority().fill(0, cliprect);
|
|
||||||
draw_sprites(screen.priority(),cliprect,1,(m_sprite_control_ram[0xe0]&0x1000) ? 0x1000 : 0); // Alpha pass only
|
|
||||||
draw_bg(screen, bitmap, cliprect, m_layer[3], &m_cyclwarr_videoram[1][0x000], &m_cyclwarr_videoram[1][0x100], 8, -0x40, false, true);
|
|
||||||
draw_bg(screen, bitmap, cliprect, m_layer[2], &m_cyclwarr_videoram[1][0x200], &m_cyclwarr_videoram[1][0x300], 8, -0x40, false, false);
|
|
||||||
draw_bg(screen, bitmap, cliprect, m_layer[1], &m_cyclwarr_videoram[0][0x000], &m_cyclwarr_videoram[0][0x100], 8, -0x40, false, false);
|
|
||||||
apply_shadow_bitmap(bitmap,cliprect,screen.priority());
|
|
||||||
draw_sprites(bitmap,cliprect,0,(m_sprite_control_ram[0xe0]&0x1000) ? 0x1000 : 0);
|
|
||||||
draw_bg(screen, bitmap, cliprect, m_layer[0], &m_cyclwarr_videoram[0][0x200], &m_cyclwarr_videoram[0][0x300], 0x10, -0x40, false, false);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user