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.
This commit is contained in:
etabeta78 2016-04-28 21:10:29 +02:00
parent 8e58d4099c
commit c506d36a8d
9 changed files with 137 additions and 227 deletions

View File

@ -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",

View File

@ -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<UINT8> &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;
}

View File

@ -1,4 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:S. Smith,David Haywood
extern UINT32 neogeohelper_optimize_sprite_data(std::vector<UINT8> &spritegfx, UINT8* region_sprites, UINT32 region_sprites_size);

View File

@ -21,7 +21,6 @@ const device_type NEOGEO_CART_SLOT = &device_creator<neogeo_cart_slot_device>;
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"),
@ -263,9 +262,6 @@ bool neogeo_cart_slot_device::call_load()
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;
}
}

View File

@ -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<UINT8>& 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<UINT16> m_rom;
std::vector<UINT8> m_fixed;
std::vector<UINT8> m_audio;
std::vector<UINT8> m_sprites;
std::vector<UINT8> m_sprites_optimized;
std::vector<UINT8> m_ym;
std::vector<UINT8> m_ymdelta;
std::vector<UINT8> 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; }

View File

@ -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

View File

@ -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);
@ -111,35 +105,26 @@ 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<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
// MVS-specific devices
optional_device<upd4990a_device> m_upd4990a;
optional_device<ym2610_device> m_ym;
required_device<neosprite_optimized_device> m_sprgen;
optional_shared_ptr<UINT16> m_save_ram;
required_device<screen_device> m_screen;
optional_device<palette_device> m_palette;
optional_device<ng_memcard_device> m_memcard;
// memory
optional_memory_region m_region_maincpu;
@ -153,31 +138,9 @@ protected:
memory_bank *m_bank_audio_cart[4];
memory_bank *m_bank_cartridge;
// MVS-specific devices
optional_device<upd4990a_device> m_upd4990a;
optional_device<ym2610_device> m_ym;
optional_shared_ptr<UINT16> m_save_ram;
required_device<screen_device> m_screen;
optional_device<palette_device> m_palette;
optional_device<ng_memcard_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<neosprite_optimized_device> m_sprgen;
UINT16 get_video_control();
// color/palette related
std::vector<UINT16> 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<UINT16> 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:

View File

@ -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<neosprite_base_device>;
@ -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<UINT8> &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];

View File

@ -25,7 +25,6 @@ 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);
@ -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<UINT8> m_sprite_gfx;
UINT8* m_spritegfx8;
private:
UINT32 optimize_helper(std::vector<UINT8> &spritegfx, UINT8* region_sprites, UINT32 region_sprites_size);
};
extern const device_type NEOGEO_SPRITE_OPTIMZIED;