diff options
Diffstat (limited to 'src/mame/old/neogeo_helper.cpp')
-rw-r--r-- | src/mame/old/neogeo_helper.cpp | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/src/mame/old/neogeo_helper.cpp b/src/mame/old/neogeo_helper.cpp new file mode 100644 index 00000000000..4fd5ddecc20 --- /dev/null +++ b/src/mame/old/neogeo_helper.cpp @@ -0,0 +1,66 @@ +// license:BSD-3-Clause +// copyright-holders:S. Smith,David Haywood + +#include "emu.h" +#include "neogeo_helper.h" + +static uint32_t get_region_mask(uint8_t* rgn, uint32_t rgn_size) +{ + uint32_t mask; + uint32_t len; + uint32_t bit; + + mask = 0xffffffff; + + len = rgn_size; + + for (bit = 0x80000000; bit != 0; bit >>= 1) + { + if ((len * 2 - 1) & bit) + break; + + mask >>= 1; + } + + return mask; +} + +uint32_t neogeohelper_optimize_sprite_data(std::vector<uint8_t> &spritegfx, uint8_t* region_sprites, uint32_t region_sprites_size) +{ + /* convert the sprite graphics data into a format that + allows faster blitting */ + uint8_t *src; + uint8_t *dest; + + uint32_t mask = get_region_mask(region_sprites, region_sprites_size); + + spritegfx.resize(mask + 1); + uint32_t spritegfx_address_mask = mask; + + src = region_sprites; + dest = &spritegfx[0]; + + for (unsigned i = 0; i < region_sprites_size; i += 0x80, src += 0x80) + { + for (unsigned y = 0; y < 0x10; y++) + { + for (unsigned x = 0; x < 8; x++) + { + *(dest++) = (((src[0x43 | (y << 2)] >> x) & 0x01) << 3) | + (((src[0x41 | (y << 2)] >> x) & 0x01) << 2) | + (((src[0x42 | (y << 2)] >> x) & 0x01) << 1) | + (((src[0x40 | (y << 2)] >> x) & 0x01) << 0); + } + + for (unsigned x = 0; x < 8; x++) + { + *(dest++) = (((src[0x03 | (y << 2)] >> x) & 0x01) << 3) | + (((src[0x01 | (y << 2)] >> x) & 0x01) << 2) | + (((src[0x02 | (y << 2)] >> x) & 0x01) << 1) | + (((src[0x00 | (y << 2)] >> x) & 0x01) << 0); + } + } + } + + return spritegfx_address_mask; +} |