diff options
Diffstat (limited to 'src/mame/video/seta001.cpp')
-rw-r--r-- | src/mame/video/seta001.cpp | 494 |
1 files changed, 0 insertions, 494 deletions
diff --git a/src/mame/video/seta001.cpp b/src/mame/video/seta001.cpp deleted file mode 100644 index 583020c9389..00000000000 --- a/src/mame/video/seta001.cpp +++ /dev/null @@ -1,494 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Luca Elia, David Haywood - /* - emulation of Seta sprite chips - X1-001A X1-002A (SDIP64) - - these always seem to be used as a pair, some board have been seen without the - 'A', so it's probably a chip revision / bugfix. - - used by: - - seta.cpp - taito_x.cpp - tnzs.cpp - srmp2.cpp - champbwl.cpp - cchance.cpp - thedealr.cpp - - note: the data bus is almost certainly 8-bit, dating back to the earliest - hardware the games were used on. the RAM arrangements changes - slightly between games depending on how the RAM is hooked up to the - main cpu. - - '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 connected to the sprite chip - between the banks. - - This should implement device_video_interface, since it generates the vertical - and horizontal blanking and sync signals from a master clock. - */ - -#include "emu.h" -#include "seta001.h" -#include "screen.h" - - -DEFINE_DEVICE_TYPE(SETA001_SPRITE, seta001_device, "seta001", "Seta SETA001 Sprites") - -seta001_device::seta001_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, SETA001_SPRITE, tag, owner, clock) - , device_gfx_interface(mconfig, *this) - , m_gfxbank_cb(*this) - , m_fg_flipxoffs(0) - , m_fg_noflipxoffs(0) - , m_fg_flipyoffs(0) - , m_fg_noflipyoffs(0) - , m_bg_flipyoffs(0) - , m_bg_noflipyoffs(0) - , m_bg_flipxoffs(0) - , m_bg_noflipxoffs(0) - , m_colorbase(0) - , m_spritelimit(0x1ff) - , m_transpen(0) -{ -} - -void seta001_device::device_start() -{ - m_spriteylow = std::make_unique<uint8_t[]>(0x300); // 0x200 low y + 0x100 bg stuff - 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 - - 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); - memset(m_spritecodehigh.get(),0xff,0x2000); - - m_bgflag = 0x00; - - m_gfxbank_cb.resolve(); - - save_item(NAME(m_bgflag)); - save_item(NAME(m_spritectrl)); - save_pointer(NAME(m_spriteylow),0x300); - save_pointer(NAME(m_spritecodelow),0x2000); - save_pointer(NAME(m_spritecodehigh),0x2000); -} - -void seta001_device::device_reset() -{ -} - -uint16_t seta001_device::spritectrl_r16(offs_t offset) -{ - return m_spritectrl[offset]; -} - -void seta001_device::spritectrl_w16(offs_t offset, uint16_t data, uint16_t mem_mask) -{ - if (ACCESSING_BITS_0_7) - { - m_spritectrl[offset] = data; - } -} - -uint8_t seta001_device::spritectrl_r8(offs_t offset) -{ - return m_spritectrl[offset]; -} - -void seta001_device::spritectrl_w8(offs_t offset, uint8_t data) -{ - m_spritectrl[offset] = data; -} - -uint16_t seta001_device::spriteylow_r16(offs_t offset) -{ - return m_spriteylow[offset]; -} - -void seta001_device::spriteylow_w16(offs_t offset, uint16_t data, uint16_t mem_mask) -{ - if (ACCESSING_BITS_0_7) - { - m_spriteylow[offset] = data; - } -} - -uint8_t seta001_device::spriteylow_r8(offs_t offset) -{ - return m_spriteylow[offset]; -} - -void seta001_device::spriteylow_w8(offs_t offset, uint8_t data) -{ - m_spriteylow[offset] = data; -} - - -uint8_t seta001_device::spritecodelow_r8(offs_t offset) -{ - return m_spritecodelow[offset]; -} - -void seta001_device::spritecodelow_w8(offs_t offset, uint8_t data) -{ - m_spritecodelow[offset] = data; -} - -uint8_t seta001_device::spritecodehigh_r8(offs_t offset) -{ - return m_spritecodehigh[offset]; -} - -void seta001_device::spritecodehigh_w8(offs_t offset, uint8_t data) -{ - m_spritecodehigh[offset] = data; -} - -uint16_t seta001_device::spritecode_r16(offs_t offset) -{ - uint16_t ret = m_spritecodelow[offset]; - ret |= m_spritecodehigh[offset] << 8; - return ret; -} - -void seta001_device::spritecode_w16(offs_t offset, uint16_t data, uint16_t mem_mask) -{ - if (ACCESSING_BITS_0_7) m_spritecodelow[offset] = data & 0x00ff; - if (ACCESSING_BITS_8_15) m_spritecodehigh[offset] = (data & 0xff00)>>8; -} - -void seta001_device::spritebgflag_w8(uint8_t data) -{ - m_bgflag = data; -} - -/*************************************************************************** - - - Sprites Drawing - - -***************************************************************************/ - -/* - -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) -metafox : 18 21 0f f0 (bomb) -zingzip : 10 2c 00 0f (bomb) -wrofaero: 10 21 00 ff (test mode) -thunderl: 10 6c 00 ff (always?) -krzybowl: 11 28 c0 ff (game) -kiwame : 16 21 7f 00 (logo) -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 transpen; - - int offs, col; - int xoffs, yoffs; - - int const total_color_codes = gfx(0)->colors(); - - int const ctrl = m_spritectrl[0]; - int const ctrl2 = m_spritectrl[1]; - - bool const flip = BIT(ctrl, 6); - int numcol = ctrl2 & 0x0f; - - int scrollx, scrolly; - - uint32_t upper; - - const uint8_t* scrollram = &m_spriteylow[0x200]; - - /* Sprites Banking and/or Sprites Buffering */ - uint16_t bank = ( ((ctrl2 ^ (~ctrl2<<1)) & 0x40) ? bank_size : 0 ); - - int const max_y = 0xf0; - - 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; - - if (m_bgflag & 0x80) - transpen = -1; - else - transpen = m_transpen; - - if (numcol == 1) - numcol = 16; - - upper = m_spritectrl[2] + m_spritectrl[3] * 256; - - for (col = 0; col < numcol; col++) - { - scrollx = scrollram[col * 0x10 + 4]; - scrolly = scrollram[col * 0x10]; - - /* draw this column */ - for ( offs = 0 ; offs < 0x20; 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]; - - int flipx = code & 0x8000; - int flipy = code & 0x4000; - - int sx = scrollx + xoffs + (offs & 1) * 16; - int sy = -(scrolly + yoffs) + (offs / 2) * 16; - - if (upper & (1 << col)) sx -= 256; - - if (flip) - { - sy = max_y - sy; - flipx = !flipx; - flipy = !flipy; - } - - color = ( color >> (16-5) ) % total_color_codes; - code &= 0x3fff; - - gfx(0)->transpen(bitmap,cliprect, - code, - color, - flipx,flipy, - ((sx) & 0x1ff),((sy) & 0x0ff), - transpen); - - gfx(0)->transpen(bitmap,cliprect, - code, - color, - flipx,flipy, - ((sx) & 0x1ff)-512,((sy) & 0x0ff), - transpen); - - gfx(0)->transpen(bitmap,cliprect, - code, - color, - flipx,flipy, - ((sx) & 0x1ff),((sy) & 0x0ff)-256, - transpen); - - gfx(0)->transpen(bitmap,cliprect, - code, - color, - flipx,flipy, - ((sx) & 0x1ff)-512,((sy) & 0x0ff)-256, - transpen); - - } - } -} - - -void seta001_device::draw_foreground( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int bank_size) -{ - int const screenflip = (m_spritectrl[0] & 0x40) >> 6; - int const ctrl2 = m_spritectrl[1]; - - int const total_color_codes = gfx(0)->colors(); - - uint8_t *char_pointer = &m_spritecodelow[0x0000]; - uint8_t *x_pointer = &m_spritecodelow[0x0200]; - uint8_t *ctrl_pointer = &m_spritecodehigh[0x0000]; - uint8_t *color_pointer = &m_spritecodehigh[0x0200]; - - // note that drgnunit, stg and qzkklogy run on the same board, yet they need different alignment - int xoffs = screenflip ? m_fg_flipxoffs : m_fg_noflipxoffs; - int yoffs = screenflip ? m_fg_flipyoffs : m_fg_noflipyoffs; - - if ((ctrl2 ^ (~ctrl2 << 1)) & 0x40) - { - char_pointer += bank_size; - x_pointer += bank_size; - ctrl_pointer += bank_size; - color_pointer += bank_size; - } - - int const max_y = screen.height(); - - /* Draw up to 512 sprites, mjyuugi has glitches if you draw them all.. */ - for (int i = m_spritelimit; i >= 0; i--) - { - int code, color, sx, sy, flipx, flipy; - - code = char_pointer[i] + ((ctrl_pointer[i] & 0x3f) << 8); - color = (color_pointer[i] & 0xf8) >> 3; - - sx = x_pointer[i] - ((color_pointer[i] & 1) << 8); - sy = (m_spriteylow[i] & 0xff); - flipx = ctrl_pointer[i] & 0x80; - flipy = ctrl_pointer[i] & 0x40; - - if (!m_gfxbank_cb.isnull()) code = m_gfxbank_cb(code, color_pointer[i]); - - color %= total_color_codes; - - color += m_colorbase; - - if (screenflip) - { - sy = max_y - sy - +(screen.height() - (screen.visible_area().max_y + 1)); - flipx = !flipx; - flipy = !flipy; - } - - gfx(0)->transpen(bitmap,cliprect, - code, - color, - flipx,flipy, - ((sx + xoffs)&0x1ff), - max_y - ((sy + yoffs) & 0x0ff),m_transpen); - - /* wrap around x */ - gfx(0)->transpen(bitmap,cliprect, - code, - color, - flipx,flipy, - ((sx + xoffs)&0x1ff) - 512, - max_y - ((sy + yoffs) & 0x0ff),m_transpen); - - - gfx(0)->transpen(bitmap,cliprect, - code, - color, - flipx,flipy, - ((sx + xoffs)&0x1ff), - max_y - ((sy + yoffs) & 0x0ff)-256,m_transpen); - - /* wrap around x */ - gfx(0)->transpen(bitmap,cliprect, - code, - color, - flipx,flipy, - ((sx + xoffs)&0x1ff) - 512, - max_y - ((sy + yoffs) & 0x0ff)-256,m_transpen); - - } -} - - - -void seta001_device::setac_eof() -{ - // is this handling right? - // it differs to tnzs, and thundercade has sprite flickering issues (not related to the devicification) - - int const ctrl2 = m_spritectrl[1]; - - if (~ctrl2 & 0x20) - { - if (ctrl2 & 0x40) - { - memcpy( &m_spritecodelow[0x0000], &m_spritecodelow[0x1000],0x800); - memcpy(&m_spritecodehigh[0x0000],&m_spritecodehigh[0x1000],0x800); - } - else - { - memcpy( &m_spritecodelow[0x1000], &m_spritecodelow[0x0000],0x800); - memcpy(&m_spritecodehigh[0x1000],&m_spritecodehigh[0x0000],0x800); - } - } -} - -void seta001_device::tnzs_eof( void ) -{ - int const ctrl2 = m_spritectrl[1]; - if (~ctrl2 & 0x20) - { - // note I copy sprites only. setac implementation also copies the "floating tilemap" - if (ctrl2 & 0x40) - { - memcpy( &m_spritecodelow[0x0000], &m_spritecodelow[0x0800], 0x0400); - memcpy(&m_spritecodehigh[0x0000], &m_spritecodehigh[0x0800], 0x0400); - } - else - { - memcpy( &m_spritecodelow[0x0800], &m_spritecodelow[0x0000], 0x0400); - memcpy(&m_spritecodehigh[0x0800], &m_spritecodehigh[0x0000], 0x0400); - } - - // and I copy the "floating tilemap" BACKWARDS - this fixes kabukiz - memcpy( &m_spritecodelow[0x0400], &m_spritecodelow[0x0c00], 0x0400); - memcpy(&m_spritecodehigh[0x0400], &m_spritecodehigh[0x0c00], 0x0400); - } - -} - -void seta001_device::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int bank_size) -{ - draw_background(bitmap, cliprect, bank_size); - draw_foreground(screen, bitmap, cliprect, bank_size); -} |