mirror of
https://github.com/holub/mame
synced 2025-04-24 09:20:02 +03:00
seta001 remove a kludge
This commit is contained in:
parent
6d9e304150
commit
e10af629f3
@ -478,7 +478,7 @@ uint32_t champbwl_state::screen_update_champbwl(screen_device &screen, bitmap_in
|
||||
m_seta001->set_fg_yoffsets( -0x12, 0x0e );
|
||||
m_seta001->set_bg_yoffsets( 0x1, -0x1 );
|
||||
|
||||
m_seta001->draw_sprites(screen, bitmap, cliprect, 0x800, 1 );
|
||||
m_seta001->draw_sprites(screen, bitmap, cliprect, 0x800);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -539,7 +539,7 @@ uint32_t champbwl_state::screen_update_doraemon(screen_device &screen, bitmap_in
|
||||
m_seta001->set_bg_yoffsets( 0x00, 0x01 );
|
||||
m_seta001->set_fg_yoffsets( 0x00, 0x10 );
|
||||
|
||||
m_seta001->draw_sprites(screen, bitmap, cliprect, 0x800, 1 );
|
||||
m_seta001->draw_sprites(screen, bitmap, cliprect, 0x800);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -114,7 +114,7 @@ uint32_t thedealr_state::screen_update(screen_device &screen, bitmap_ind16 &bitm
|
||||
m_seta001->set_bg_yoffsets( 0x11+1, -0x10 ); // + is up (down with flip)
|
||||
m_seta001->set_fg_yoffsets( -0x12+1, -0x01 );
|
||||
|
||||
m_seta001->draw_sprites(screen, bitmap, cliprect, 0x1000, 1);
|
||||
m_seta001->draw_sprites(screen, bitmap, cliprect, 0x1000);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -304,7 +304,7 @@ protected:
|
||||
void set_pens();
|
||||
void usclssic_set_pens();
|
||||
void draw_tilemap_palette_effect(bitmap_ind16 &bitmap, const rectangle &cliprect, tilemap_t *tilemap, int scrollx, int scrolly, int gfxnum, int flipscreen);
|
||||
void seta_layers_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int sprite_bank_size, int sprite_setac );
|
||||
void seta_layers_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int sprite_bank_size);
|
||||
void rearrange_gfx();
|
||||
void uPD71054_timer_init( );
|
||||
DECLARE_WRITE_LINE_MEMBER(pit_out0);
|
||||
|
@ -734,13 +734,13 @@ uint32_t seta_state::screen_update_seta_no_layers(screen_device &screen, bitmap_
|
||||
set_pens();
|
||||
bitmap.fill(0x1f0, cliprect);
|
||||
|
||||
m_seta001->draw_sprites(screen, bitmap,cliprect,0x1000, 1);
|
||||
m_seta001->draw_sprites(screen, bitmap,cliprect,0x1000);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* For games with 1 or 2 tilemaps */
|
||||
void seta_state::seta_layers_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int sprite_bank_size, int sprite_setac )
|
||||
void seta_state::seta_layers_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int sprite_bank_size )
|
||||
{
|
||||
const rectangle &visarea = screen.visible_area();
|
||||
int vis_dimy = visarea.max_y - visarea.min_y + 1;
|
||||
@ -833,7 +833,7 @@ void seta_state::seta_layers_update(screen_device &screen, bitmap_ind16 &bitmap,
|
||||
|
||||
if (order & 2) // layer-sprite priority?
|
||||
{
|
||||
if (layers_ctrl & 8) m_seta001->draw_sprites(screen, bitmap,cliprect,sprite_bank_size, sprite_setac);
|
||||
if (layers_ctrl & 8) m_seta001->draw_sprites(screen, bitmap,cliprect,sprite_bank_size);
|
||||
|
||||
if (order & 4)
|
||||
{
|
||||
@ -851,7 +851,7 @@ void seta_state::seta_layers_update(screen_device &screen, bitmap_ind16 &bitmap,
|
||||
|
||||
if (layers_ctrl & 1) m_tilemap[0]->draw(screen, bitmap, cliprect, 0, 0);
|
||||
|
||||
if (layers_ctrl & 8) m_seta001->draw_sprites(screen, bitmap,cliprect,sprite_bank_size, sprite_setac);
|
||||
if (layers_ctrl & 8) m_seta001->draw_sprites(screen, bitmap,cliprect,sprite_bank_size);
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -860,7 +860,7 @@ void seta_state::seta_layers_update(screen_device &screen, bitmap_ind16 &bitmap,
|
||||
|
||||
if (order & 2) // layer-sprite priority?
|
||||
{
|
||||
if (layers_ctrl & 8) m_seta001->draw_sprites(screen, bitmap,cliprect,sprite_bank_size, sprite_setac);
|
||||
if (layers_ctrl & 8) m_seta001->draw_sprites(screen, bitmap,cliprect,sprite_bank_size);
|
||||
|
||||
if ((order & 4) && m_paletteram[1] != nullptr)
|
||||
{
|
||||
@ -898,7 +898,7 @@ void seta_state::seta_layers_update(screen_device &screen, bitmap_ind16 &bitmap,
|
||||
}
|
||||
}
|
||||
|
||||
if (layers_ctrl & 8) m_seta001->draw_sprites(screen,bitmap,cliprect,sprite_bank_size, sprite_setac);
|
||||
if (layers_ctrl & 8) m_seta001->draw_sprites(screen,bitmap,cliprect,sprite_bank_size);
|
||||
}
|
||||
}
|
||||
|
||||
@ -906,7 +906,7 @@ void seta_state::seta_layers_update(screen_device &screen, bitmap_ind16 &bitmap,
|
||||
|
||||
uint32_t seta_state::screen_update_seta_layers(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
seta_layers_update(screen, bitmap, cliprect, 0x1000, 1 );
|
||||
seta_layers_update(screen, bitmap, cliprect, 0x1000 );
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -916,7 +916,7 @@ uint32_t setaroul_state::screen_update(screen_device &screen, bitmap_ind16 &bitm
|
||||
bitmap.fill(0x0, cliprect);
|
||||
|
||||
if (m_led & 0x80)
|
||||
seta_layers_update(screen, bitmap, cliprect, 0x800, 1 );
|
||||
seta_layers_update(screen, bitmap, cliprect, 0x800 );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -24,6 +24,12 @@
|
||||
|
||||
'y' low bits are NEVER buffered?
|
||||
|
||||
TODO:
|
||||
use getter callbacks in drivers for spriterams rather than allocating memory
|
||||
here, then we won't have to allocate extra memory for seta.cpp games which
|
||||
appear to have 0x800 bytes of RAM that isn't connceted to the sprite chip
|
||||
between the banks.
|
||||
|
||||
*/
|
||||
|
||||
#include "emu.h"
|
||||
@ -45,9 +51,28 @@ void seta001_device::device_start()
|
||||
m_spritecodelow = std::make_unique<uint8_t[]>(0x2000);
|
||||
m_spritecodehigh = std::make_unique<uint8_t[]>(0x2000);
|
||||
|
||||
// chukatai draws a column on the left from uninitialized RAM which causes garbage in a debug build
|
||||
// if we initialize ram this is a single line in the top left instead.
|
||||
// maybe there is less RAM actually present and it should mirror, or there is another flaw?
|
||||
/* chukatai draws a column on the left from uninitialized RAM which causes garbage
|
||||
|
||||
the reason for this is because the m_spriteylow only gets populated from 0x000 to 0x17d
|
||||
with the remainder of the ram (0x17e - 0x1ff) never being written to.
|
||||
|
||||
If we initialize ram to 0xff it has a single line in the top left instead, but
|
||||
the PCB has no error at all, initializing to 0xf8 is better, but unlikely from a hardware
|
||||
perspective.
|
||||
|
||||
jjsquawk has a garbage tile in the bottom left instead, but in this case the entire
|
||||
m_spriteylow is initalized (to 0), but sprite entry 0 for the other tables is never
|
||||
written to, again meaning it picks up whatever we clear the RAM to as positional
|
||||
values.
|
||||
|
||||
we can't simply skip sprite 0 as other games (mostly tnzs.cpp ones, eg. kabukiz) rely
|
||||
on it being rendered, even if a number of seta.cpp games specifically avoid it.
|
||||
|
||||
maybe other components on the board determine the sprite start / end limits on a per
|
||||
game basis?
|
||||
|
||||
*/
|
||||
|
||||
memset(m_spritectrl,0xff,4);
|
||||
memset(m_spriteylow.get(),0xff,0x300);
|
||||
memset(m_spritecodelow.get(),0xff,0x2000);
|
||||
@ -178,6 +203,9 @@ WRITE8_MEMBER( seta001_device::spritebgflag_w8 )
|
||||
***************************************************************************/
|
||||
|
||||
/*
|
||||
|
||||
these mostly seem to be controlling the tilemap part of the chip
|
||||
|
||||
twineagl: 10 2d 0f 10 (ship)
|
||||
tndrcade: 58 2d 07 18 (start of game - yes, flip on!)
|
||||
arbalest: 18 2d 0f 10 (logo)
|
||||
@ -191,12 +219,31 @@ oisipuzl: 59 20 00 00 (game - yes, flip on!)
|
||||
superman: 10 21 07 38 (game)
|
||||
twineagl: 00 27 00 0f (test mode)
|
||||
doraemon: 19 2a 00 03 (always)
|
||||
srmp2: 1e 20 xx xx
|
||||
tnzs: 1a 20 xx xx
|
||||
|
||||
format
|
||||
byte 0 byte 1 byte 2 byte3
|
||||
-f-e uUss -Bb- cccc ---- ---- ---- ----
|
||||
|
||||
f = flipy
|
||||
e = possible enable (only disabled in twineagl test mode? check if it needs sprites)
|
||||
u = sometimes set
|
||||
U = sometimes set (srmp2)
|
||||
s = start column
|
||||
B = buffering control - toggles often (kabukiz doesn't seem to use these like the other games)
|
||||
b = buffering control
|
||||
c = number of columns, 0x0 = disabled, 0x01 = 16 columns 0x2 = 2 coluns ... 0xf = 15 columns
|
||||
|
||||
bytes 2 and 3 get set in a bitwize way in the tnzs driver games while horizontal scrolling happens, dependong on how
|
||||
far we've scrolled, what they actually do is unclear.
|
||||
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
void seta001_device::draw_background( bitmap_ind16 &bitmap, const rectangle &cliprect, int bank_size, int setac_type)
|
||||
void seta001_device::draw_background( bitmap_ind16 &bitmap, const rectangle &cliprect, int bank_size)
|
||||
{
|
||||
int transpen;
|
||||
|
||||
@ -222,18 +269,14 @@ void seta001_device::draw_background( bitmap_ind16 &bitmap, const rectangle &cli
|
||||
|
||||
int const max_y = 0xf0;
|
||||
|
||||
// HACKS
|
||||
// used in conjunction with setac_type
|
||||
int col0; /* Kludge, needed for krzybowl and kiwame */
|
||||
switch (ctrl & 0x0f)
|
||||
{
|
||||
case 0x01: col0 = 0x4; break; // krzybowl
|
||||
case 0x09: col0 = 0x4; break; // doraemon
|
||||
case 0x06: col0 = 0x8; break; // kiwame
|
||||
|
||||
default: col0 = 0x0;
|
||||
}
|
||||
int startcol = 0;
|
||||
|
||||
if (ctrl & 0x01)
|
||||
startcol += 0x4;
|
||||
|
||||
if (ctrl & 0x02)
|
||||
startcol += 0x8;
|
||||
|
||||
xoffs = flip ? m_bg_flipxoffs : m_bg_noflipxoffs;
|
||||
yoffs = flip ? m_bg_flipyoffs : m_bg_noflipyoffs;
|
||||
|
||||
@ -255,10 +298,7 @@ void seta001_device::draw_background( bitmap_ind16 &bitmap, const rectangle &cli
|
||||
/* draw this column */
|
||||
for ( offs = 0 ; offs < 0x20; offs += 1 )
|
||||
{
|
||||
int i;
|
||||
// HACKS
|
||||
if (setac_type) i = ((col+col0)&0xf) * 32 + offs;
|
||||
else i = 32 * (col ^ 8) + 2 * (offs>>1) + (offs&1);
|
||||
int i = ((col+startcol)&0xf) * 32 + offs;
|
||||
|
||||
int code = ((m_spritecodehigh[i+0x400+bank]) << 8) | m_spritecodelow[i+0x400+bank];
|
||||
int color =((m_spritecodehigh[i+0x600+bank]) << 8) | m_spritecodelow[i+0x600+bank];
|
||||
@ -450,8 +490,8 @@ void seta001_device::tnzs_eof( void )
|
||||
|
||||
}
|
||||
|
||||
void seta001_device::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int bank_size, int setac)
|
||||
void seta001_device::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int bank_size)
|
||||
{
|
||||
draw_background(bitmap, cliprect, bank_size, setac);
|
||||
draw_background(bitmap, cliprect, bank_size);
|
||||
draw_foreground(screen, bitmap, cliprect, bank_size);
|
||||
}
|
||||
|
@ -40,7 +40,7 @@ public:
|
||||
DECLARE_READ16_MEMBER( spritecode_r16 );
|
||||
DECLARE_WRITE16_MEMBER( spritecode_w16 );
|
||||
|
||||
void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int bank_size, int setac);
|
||||
void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int bank_size);
|
||||
|
||||
void setac_eof( void );
|
||||
void tnzs_eof( void );
|
||||
@ -63,7 +63,7 @@ protected:
|
||||
|
||||
private:
|
||||
|
||||
void draw_background( bitmap_ind16 &bitmap, const rectangle &cliprect, int bank_size, int setac_type);
|
||||
void draw_background( bitmap_ind16 &bitmap, const rectangle &cliprect, int bank_size);
|
||||
void draw_foreground( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int bank_size);
|
||||
required_device<gfxdecode_device> m_gfxdecode;
|
||||
|
||||
|
@ -58,7 +58,7 @@ uint32_t srmp2_state::screen_update_srmp2(screen_device &screen, bitmap_ind16 &b
|
||||
m_seta001->set_bg_xoffsets( 0x00, 0x00 ); // bg not used?
|
||||
m_seta001->set_bg_yoffsets( 0x00, 0x00 ); // bg not used?
|
||||
|
||||
m_seta001->draw_sprites(screen,bitmap,cliprect,0x1000, 1);
|
||||
m_seta001->draw_sprites(screen,bitmap,cliprect,0x1000);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -71,7 +71,7 @@ uint32_t srmp2_state::screen_update_srmp3(screen_device &screen, bitmap_ind16 &b
|
||||
m_seta001->set_bg_xoffsets( -0x01, 0x10 );
|
||||
m_seta001->set_bg_yoffsets( -0x06, 0x06 );
|
||||
|
||||
m_seta001->draw_sprites(screen,bitmap,cliprect,0x1000, 1);
|
||||
m_seta001->draw_sprites(screen,bitmap,cliprect,0x1000);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -85,6 +85,6 @@ uint32_t srmp2_state::screen_update_mjyuugi(screen_device &screen, bitmap_ind16
|
||||
|
||||
m_seta001->set_spritelimit( 0x1ff-6 );
|
||||
|
||||
m_seta001->draw_sprites(screen,bitmap,cliprect,0x1000, 1);
|
||||
m_seta001->draw_sprites(screen,bitmap,cliprect,0x1000);
|
||||
return 0;
|
||||
}
|
||||
|
@ -50,7 +50,7 @@ uint32_t tnzs_base_state::screen_update_tnzs(screen_device &screen, bitmap_ind16
|
||||
m_seta001->set_fg_yoffsets( -0x12, 0x0e );
|
||||
m_seta001->set_bg_yoffsets( 0x1, -0x1 );
|
||||
|
||||
m_seta001->draw_sprites(screen, bitmap, cliprect, 0x800, 0 );
|
||||
m_seta001->draw_sprites(screen, bitmap, cliprect, 0x800);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user