From c506d36a8da7da1b8c883fb10c26dc6fcf39c8dd Mon Sep 17 00:00:00 2001 From: etabeta78 Date: Thu, 28 Apr 2016 21:10:29 +0200 Subject: [PATCH] further cleanup + final untangling from the old code: optimized sprites data now lives only in the sprite device. got rid of neogeo_helper as a result. nw. --- scripts/src/bus.lua | 2 - src/devices/bus/neogeo/neogeo_helper.cpp | 66 ---------- src/devices/bus/neogeo/neogeo_helper.h | 4 - src/devices/bus/neogeo/slot.cpp | 4 - src/devices/bus/neogeo/slot.h | 31 ----- src/mame/drivers/neogeo.cpp | 12 +- src/mame/includes/neogeo.h | 151 +++++++++++------------ src/mame/video/neogeo_spr.cpp | 53 ++++++-- src/mame/video/neogeo_spr.h | 41 +++--- 9 files changed, 137 insertions(+), 227 deletions(-) delete mode 100644 src/devices/bus/neogeo/neogeo_helper.cpp delete mode 100644 src/devices/bus/neogeo/neogeo_helper.h diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index 9fabf3bfab0..dede0fd84ec 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -1895,8 +1895,6 @@ if (BUSES["NEOGEO"]~=null) then MAME_DIR .. "src/devices/bus/neogeo/slot.h", MAME_DIR .. "src/devices/bus/neogeo/carts.cpp", MAME_DIR .. "src/devices/bus/neogeo/carts.h", - MAME_DIR .. "src/devices/bus/neogeo/neogeo_helper.cpp", - MAME_DIR .. "src/devices/bus/neogeo/neogeo_helper.h", MAME_DIR .. "src/devices/bus/neogeo/rom.cpp", MAME_DIR .. "src/devices/bus/neogeo/rom.h", MAME_DIR .. "src/devices/bus/neogeo/fatfury2.cpp", diff --git a/src/devices/bus/neogeo/neogeo_helper.cpp b/src/devices/bus/neogeo/neogeo_helper.cpp deleted file mode 100644 index fdbd9ba7203..00000000000 --- a/src/devices/bus/neogeo/neogeo_helper.cpp +++ /dev/null @@ -1,66 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:S. Smith,David Haywood - -#include "emu.h" -#include "neogeo_helper.h" - -static UINT32 get_region_mask(UINT8* rgn, UINT32 rgn_size) -{ - UINT32 mask; - UINT32 len; - UINT32 bit; - - mask = 0xffffffff; - - len = rgn_size; - - for (bit = 0x80000000; bit != 0; bit >>= 1) - { - if ((len * 2 - 1) & bit) - break; - - mask >>= 1; - } - - return mask; -} - -UINT32 neogeohelper_optimize_sprite_data(std::vector &spritegfx, UINT8* region_sprites, UINT32 region_sprites_size) -{ - /* convert the sprite graphics data into a format that - allows faster blitting */ - UINT8 *src; - UINT8 *dest; - - UINT32 mask = get_region_mask(region_sprites, region_sprites_size); - - spritegfx.resize(mask + 1); - UINT32 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; -} diff --git a/src/devices/bus/neogeo/neogeo_helper.h b/src/devices/bus/neogeo/neogeo_helper.h deleted file mode 100644 index 3d125f7fd62..00000000000 --- a/src/devices/bus/neogeo/neogeo_helper.h +++ /dev/null @@ -1,4 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:S. Smith,David Haywood - -extern UINT32 neogeohelper_optimize_sprite_data(std::vector &spritegfx, UINT8* region_sprites, UINT32 region_sprites_size); diff --git a/src/devices/bus/neogeo/slot.cpp b/src/devices/bus/neogeo/slot.cpp index fe9661ec39b..cc9abafe17a 100644 --- a/src/devices/bus/neogeo/slot.cpp +++ b/src/devices/bus/neogeo/slot.cpp @@ -21,7 +21,6 @@ const device_type NEOGEO_CART_SLOT = &device_creator; device_neogeo_cart_interface::device_neogeo_cart_interface(const machine_config &mconfig, device_t &device) : device_slot_card_interface(mconfig, device), - m_sprite_gfx_address_mask(0), m_region_rom(*this, "^maincpu"), m_region_fixed(*this, "^fixed"), m_region_audio(*this, "^audiocpu"), @@ -262,9 +261,6 @@ bool neogeo_cart_slot_device::call_load() m_cart->get_ymdelta_base(), m_cart->get_ymdelta_size(), m_cart->get_audio_base(), m_cart->get_audio_size(), m_cart->get_audiocrypt_base(), m_cart->get_audiocrypt_size()); - - // create optimized sprite cache [NOT GOOD FOR NOSLOT!!!!] - m_cart->m_sprite_gfx_address_mask = neogeohelper_optimize_sprite_data(m_cart->get_sprites_optimized_arr(), m_cart->get_sprites_base(), m_cart->get_sprites_size()); return IMAGE_INIT_PASS; } diff --git a/src/devices/bus/neogeo/slot.h b/src/devices/bus/neogeo/slot.h index f7d7964e037..d5b14700599 100644 --- a/src/devices/bus/neogeo/slot.h +++ b/src/devices/bus/neogeo/slot.h @@ -4,7 +4,6 @@ #define __NEOGEO_SLOT_H #include "emu.h" -#include "bus/neogeo/neogeo_helper.h" /* PCB */ enum @@ -135,14 +134,6 @@ public: UINT8* get_region_sprites_base() { if (m_region_spr.found()) return m_region_spr->base(); return nullptr; } UINT32 get_region_sprites_size() { if (m_region_spr.found()) return m_region_spr->bytes(); return 0; } - UINT8* get_sprites_optimized() { return &m_sprites_optimized[0]; } - std::vector& get_sprites_optimized_arr() { return m_sprites_optimized; } - - UINT32 get_sprites_addrmask() { return m_sprite_gfx_address_mask; } - void init_sprites_addrmask(UINT8 *spr_base, UINT32 spr_size) { - m_sprite_gfx_address_mask = neogeohelper_optimize_sprite_data(get_sprites_optimized_arr(), &spr_base[0], spr_size); - } - void ym_alloc(UINT32 size) { m_ym.resize(size); } UINT8* get_ym_base() { return &m_ym[0]; } UINT32 get_ym_size() { return m_ym.size(); } @@ -155,15 +146,12 @@ public: UINT8* get_region_ymdelta_base() { if (m_region_ymd.found()) return m_region_ymd->base(); return nullptr; } UINT32 get_region_ymdelta_size() { if (m_region_ymd.found()) return m_region_ymd->bytes(); return 0; } - UINT32 m_sprite_gfx_address_mask; - protected: // these are allocated when loading from softlist std::vector m_rom; std::vector m_fixed; std::vector m_audio; std::vector m_sprites; - std::vector m_sprites_optimized; std::vector m_ym; std::vector m_ymdelta; std::vector m_audiocrypt; @@ -310,25 +298,6 @@ public: return 0; } - - UINT8* get_sprites_opt_base() { - if (m_cart) - return m_cart->get_sprites_optimized(); - return nullptr; - } - - void init_sprites_addrmask() { - if (m_cart) - { - if (!user_loadable()) - m_cart->init_sprites_addrmask(m_cart->get_region_sprites_base(), m_cart->get_region_sprites_size()); - else - m_cart->init_sprites_addrmask(m_cart->get_sprites_base(), m_cart->get_sprites_size()); - } - } - - - UINT32 get_sprites_addrmask() { if (m_cart) return m_cart->get_sprites_addrmask(); return 0; } int get_fixed_bank_type(void) { if (m_cart) return m_cart->get_fixed_bank_type(); return 0; } UINT32 get_bank_base(UINT16 sel) { if (m_cart) return m_cart->get_bank_base(sel); return 0; } UINT32 get_special_bank() { if (m_cart) return m_cart->get_special_bank(); return 0; } diff --git a/src/mame/drivers/neogeo.cpp b/src/mame/drivers/neogeo.cpp index 9b54fe2ffaf..908d4029915 100644 --- a/src/mame/drivers/neogeo.cpp +++ b/src/mame/drivers/neogeo.cpp @@ -1142,11 +1142,7 @@ void neogeo_state::init_sprites() { m_sprgen->set_sprite_region(m_slots[m_curr_slot]->get_sprites_base(), m_slots[m_curr_slot]->get_sprites_size()); m_sprgen->set_fixed_regions(m_slots[m_curr_slot]->get_fixed_base(), m_slots[m_curr_slot]->get_fixed_size(), m_region_fixedbios); - - // give the sprite chip pointers to the graphics for this cartslot from the slot device - if (!m_slots[m_curr_slot]->user_loadable()) - m_slots[m_curr_slot]->init_sprites_addrmask(); - m_sprgen->set_optimized_sprite_data(m_slots[m_curr_slot]->get_sprites_opt_base(), m_slots[m_curr_slot]->get_sprites_addrmask()); + m_sprgen->optimize_sprite_data(); m_sprgen->m_fixed_layer_bank_type = m_slots[m_curr_slot]->get_fixed_bank_type(); } else @@ -2029,9 +2025,9 @@ DRIVER_INIT_MEMBER(neogeo_state, neogeo) } -/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT */ -CONS( 1990, neogeo, 0, 0, mvs, neogeo_6slot, neogeo_state, neogeo, "SNK", "Neo-Geo", MACHINE_IS_BIOS_ROOT | MACHINE_SUPPORTS_SAVE ) -CONS( 1990, aes, 0, 0, aes, aes, driver_device, 0, "SNK", "Neo-Geo AES", MACHINE_SUPPORTS_SAVE ) +/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT */ +CONS( 1990, neogeo, 0, 0, mvs, neogeo_6slot, neogeo_state, neogeo, "SNK", "Neo-Geo", MACHINE_IS_BIOS_ROOT | MACHINE_SUPPORTS_SAVE ) +CONS( 1990, aes, 0, 0, aes, aes, driver_device, 0, "SNK", "Neo-Geo AES", MACHINE_SUPPORTS_SAVE ) // Include standalone drivers for the single games diff --git a/src/mame/includes/neogeo.h b/src/mame/includes/neogeo.h index b643736cac6..51a88aeadc2 100644 --- a/src/mame/includes/neogeo.h +++ b/src/mame/includes/neogeo.h @@ -31,6 +31,13 @@ public: : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_audiocpu(*this, "audiocpu"), + m_upd4990a(*this, "upd4990a"), + m_ym(*this, "ymsnd"), + m_sprgen(*this, "spritegen"), + m_save_ram(*this, "saveram"), + m_screen(*this, "screen"), + m_palette(*this, "palette"), + m_memcard(*this, "memcard"), m_region_maincpu(*this, "maincpu"), m_region_sprites(*this, "sprites"), m_region_fixed(*this, "fixed"), @@ -39,19 +46,12 @@ public: m_region_audiobios(*this, "audiobios"), m_region_audiocpu(*this, "audiocpu"), m_bank_audio_main(*this, "audio_main"), - m_upd4990a(*this, "upd4990a"), - m_ym(*this, "ymsnd"), - m_save_ram(*this, "saveram"), - m_screen(*this, "screen"), - m_palette(*this, "palette"), - m_memcard(*this, "memcard"), m_dsw(*this, "DSW"), m_trackx(*this, "TRACK_X"), m_tracky(*this, "TRACK_Y"), m_edge(*this, "edge"), m_ctrl1(*this, "ctrl1"), m_ctrl2(*this, "ctrl2"), - m_sprgen(*this, "spritegen"), m_use_cart_vectors(0), m_use_cart_audio(0), m_slot1(*this, "cslot1"), @@ -89,12 +89,6 @@ public: UINT32 screen_update_neogeo(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); - DECLARE_DRIVER_INIT(mvs); - - // NEW IMPLEMENTATION!!! - void set_slot_idx(int slot); - void neogeo_postload(); - DECLARE_WRITE8_MEMBER(io_control_w); DECLARE_WRITE8_MEMBER(system_control_w); DECLARE_READ16_MEMBER(banked_vectors_r); @@ -110,36 +104,27 @@ public: protected: void common_machine_start(); - - void update_interrupts(); - void create_interrupt_timers(); - void start_interrupt_timers(); - void acknowledge_interrupt(UINT16 data); - - void adjust_display_position_interrupt_timer(); - void set_display_position_interrupt_control(UINT16 data); - void set_display_counter_msb(UINT16 data); - void set_display_counter_lsb(UINT16 data); - void set_video_control(UINT16 data); - - void create_rgb_lookups(); - void set_pens(); - void set_screen_shadow(int data); - void set_palette_bank(int data); - - void audio_cpu_check_nmi(); - void set_save_ram_unlock(UINT8 data); + void set_outputs(); - void set_output_latch(UINT8 data); - void set_output_data(UINT8 data); // device overrides virtual void machine_start() override; virtual void machine_reset() override; + void neogeo_postload(); + // devices required_device m_maincpu; required_device m_audiocpu; + // MVS-specific devices + optional_device m_upd4990a; + optional_device m_ym; + required_device m_sprgen; + optional_shared_ptr m_save_ram; + + required_device m_screen; + optional_device m_palette; + optional_device m_memcard; // memory optional_memory_region m_region_maincpu; @@ -152,32 +137,10 @@ protected: optional_memory_bank m_bank_audio_main; // optional because of neocd memory_bank *m_bank_audio_cart[4]; memory_bank *m_bank_cartridge; - - // MVS-specific devices - optional_device m_upd4990a; - optional_device m_ym; - optional_shared_ptr m_save_ram; - - required_device m_screen; - optional_device m_palette; - optional_device m_memcard; // configuration enum {NEOGEO_MVS, NEOGEO_AES, NEOGEO_CD} m_type; - // internal state - bool m_recurse; - bool m_audio_cpu_nmi_enabled; - bool m_audio_cpu_nmi_pending; - - // MVS-specific state - UINT8 m_save_ram_unlocked; - UINT8 m_output_data; - UINT8 m_output_latch; - UINT8 m_el_value; - UINT8 m_led1_value; - UINT8 m_led2_value; - optional_ioport m_dsw; optional_ioport m_trackx; optional_ioport m_tracky; @@ -190,31 +153,15 @@ protected: virtual void video_start() override; virtual void video_reset() override; - emu_timer *m_display_position_interrupt_timer; - emu_timer *m_display_position_vblank_timer; - emu_timer *m_vblank_interrupt_timer; - UINT32 m_display_counter; - UINT8 m_vblank_interrupt_pending; - UINT8 m_display_position_interrupt_pending; - UINT8 m_irq3_pending; - UINT8 m_display_position_interrupt_control; + const pen_t *m_bg_pen; UINT8 m_vblank_level; UINT8 m_raster_level; - required_device m_sprgen; - UINT16 get_video_control(); - - // color/palette related - std::vector m_paletteram; - UINT8 m_palette_lookup[32][4]; - const pen_t *m_bg_pen; - int m_screen_shadow; - int m_palette_bank; - - int m_use_cart_vectors; int m_use_cart_audio; + void set_slot_idx(int slot); + // cart slots void init_cpu(); void init_audio(); @@ -232,6 +179,58 @@ protected: int m_curr_slot; neogeo_cart_slot_device* m_slots[6]; + +private: + void update_interrupts(); + void create_interrupt_timers(); + void start_interrupt_timers(); + void acknowledge_interrupt(UINT16 data); + + void adjust_display_position_interrupt_timer(); + void set_display_position_interrupt_control(UINT16 data); + void set_display_counter_msb(UINT16 data); + void set_display_counter_lsb(UINT16 data); + void set_video_control(UINT16 data); + + void create_rgb_lookups(); + void set_pens(); + void set_screen_shadow(int data); + void set_palette_bank(int data); + + void audio_cpu_check_nmi(); + void set_save_ram_unlock(UINT8 data); + void set_output_latch(UINT8 data); + void set_output_data(UINT8 data); + + // internal state + bool m_recurse; + bool m_audio_cpu_nmi_enabled; + bool m_audio_cpu_nmi_pending; + + // MVS-specific state + UINT8 m_save_ram_unlocked; + UINT8 m_output_data; + UINT8 m_output_latch; + UINT8 m_el_value; + UINT8 m_led1_value; + UINT8 m_led2_value; + + emu_timer *m_display_position_interrupt_timer; + emu_timer *m_display_position_vblank_timer; + emu_timer *m_vblank_interrupt_timer; + UINT32 m_display_counter; + UINT8 m_vblank_interrupt_pending; + UINT8 m_display_position_interrupt_pending; + UINT8 m_irq3_pending; + UINT8 m_display_position_interrupt_control; + + UINT16 get_video_control(); + + // color/palette related + std::vector m_paletteram; + UINT8 m_palette_lookup[32][4]; + int m_screen_shadow; + int m_palette_bank; }; @@ -244,9 +243,7 @@ class aes_state : public neogeo_state {} DECLARE_READ16_MEMBER(aes_in2_r); - DECLARE_INPUT_CHANGED_MEMBER(aes_jp1); - DECLARE_MACHINE_START(aes); protected: diff --git a/src/mame/video/neogeo_spr.cpp b/src/mame/video/neogeo_spr.cpp index 7f075b28797..eef5c9e8be0 100644 --- a/src/mame/video/neogeo_spr.cpp +++ b/src/mame/video/neogeo_spr.cpp @@ -5,7 +5,6 @@ #include "emu.h" #include "neogeo_spr.h" -#include "bus/neogeo/neogeo_helper.h" // pure virtual functions //const device_type NEOGEO_SPRITE_BASE = &device_creator; @@ -611,11 +610,6 @@ void neosprite_base_device::optimize_sprite_data() return; } -void neosprite_base_device::set_optimized_sprite_data(UINT8* sprdata, UINT32 mask) -{ - return; -} - // these are for passing in pointers from the main system void neosprite_base_device::set_sprite_region(UINT8* region_sprites, UINT32 region_sprites_size) @@ -710,19 +704,52 @@ neosprite_optimized_device::neosprite_optimized_device(const machine_config &mco { } +UINT32 neosprite_optimized_device::optimize_helper(std::vector &spritegfx, UINT8* region_sprites, UINT32 region_sprites_size) +{ + // convert the sprite graphics data into a format that allows faster blitting + UINT8 *src; + UINT8 *dest; + + UINT32 mask = get_region_mask(region_sprites, region_sprites_size); + + spritegfx.resize(mask + 1); + UINT32 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; +} + void neosprite_optimized_device::optimize_sprite_data() { - m_sprite_gfx_address_mask = neogeohelper_optimize_sprite_data(m_sprite_gfx, m_region_sprites, m_region_sprites_size); + m_sprite_gfx_address_mask = optimize_helper(m_sprite_gfx, m_region_sprites, m_region_sprites_size); m_spritegfx8 = &m_sprite_gfx[0]; } -void neosprite_optimized_device::set_optimized_sprite_data(UINT8* sprdata, UINT32 mask) -{ - m_spritegfx8 = sprdata; - m_sprite_gfx_address_mask = mask; -} - inline void neosprite_optimized_device::draw_pixel(int romaddr, UINT32* dst, const pen_t *line_pens) { const UINT8 gfx = m_spritegfx8[romaddr]; diff --git a/src/mame/video/neogeo_spr.h b/src/mame/video/neogeo_spr.h index 6c2f525544f..2fe3a25c202 100644 --- a/src/mame/video/neogeo_spr.h +++ b/src/mame/video/neogeo_spr.h @@ -25,27 +25,26 @@ public: // neosprite_base_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); virtual void optimize_sprite_data(); - virtual void set_optimized_sprite_data(UINT8* sprdata, UINT32 mask); virtual void draw_fixed_layer_2pixels(UINT32*&pixel_addr, int offset, UINT8* gfx_base, const pen_t* char_pens); - void draw_fixed_layer( bitmap_rgb32 &bitmap, int scanline ); - void set_videoram_offset( UINT16 data ); - UINT16 get_videoram_data( ); - void set_videoram_data( UINT16 data); - void set_videoram_modulo( UINT16 data); - UINT16 get_videoram_modulo( ); - void set_auto_animation_speed( UINT8 data); - void set_auto_animation_disabled( UINT8 data); - UINT8 neogeo_get_auto_animation_counter( ); - void create_auto_animation_timer( ); - void start_auto_animation_timer( ); - void neogeo_set_fixed_layer_source( UINT8 data ); + void draw_fixed_layer(bitmap_rgb32 &bitmap, int scanline); + void set_videoram_offset(UINT16 data); + UINT16 get_videoram_data(); + void set_videoram_data(UINT16 data); + void set_videoram_modulo(UINT16 data); + UINT16 get_videoram_modulo(); + void set_auto_animation_speed(UINT8 data); + void set_auto_animation_disabled(UINT8 data); + UINT8 neogeo_get_auto_animation_counter(); + void create_auto_animation_timer(); + void start_auto_animation_timer(); + void neogeo_set_fixed_layer_source(UINT8 data); inline bool sprite_on_scanline(int scanline, int y, int rows); virtual void draw_pixel(int romaddr, UINT32* dst, const pen_t *line_pens) = 0; - void draw_sprites( bitmap_rgb32 &bitmap, int scanline ); - void parse_sprites( int scanline ); - void create_sprite_line_timer( ); - void start_sprite_line_timer( ); + void draw_sprites(bitmap_rgb32 &bitmap, int scanline); + void parse_sprites(int scanline); + void create_sprite_line_timer(); + void start_sprite_line_timer(); virtual void set_sprite_region(UINT8* region_sprites, UINT32 region_sprites_size); void set_fixed_regions(UINT8* fix_cart, UINT32 fix_cart_size, memory_region* fix_bios); void set_screen(screen_device* screen); @@ -88,9 +87,6 @@ protected: memory_region* m_region_fixedbios; screen_device* m_screen; const pen_t *m_pens; - -private: - }; //extern const device_type NEOGEO_SPRITE_BASE; @@ -113,11 +109,12 @@ class neosprite_optimized_device : public neosprite_base_device public: neosprite_optimized_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); virtual void optimize_sprite_data() override; - virtual void set_optimized_sprite_data(UINT8* sprdata, UINT32 mask) override; virtual void draw_pixel(int romaddr, UINT32* dst, const pen_t *line_pens) override; std::vector m_sprite_gfx; UINT8* m_spritegfx8; - + +private: + UINT32 optimize_helper(std::vector &spritegfx, UINT8* region_sprites, UINT32 region_sprites_size); }; extern const device_type NEOGEO_SPRITE_OPTIMZIED;