diff --git a/src/mame/video/neogeo_spr.cpp b/src/mame/video/neogeo_spr.cpp index ea4fd41fd88..d184c20e352 100644 --- a/src/mame/video/neogeo_spr.cpp +++ b/src/mame/video/neogeo_spr.cpp @@ -178,7 +178,6 @@ void neosprite_base_device::neogeo_set_fixed_layer_source(uint8_t data) void neosprite_base_device::draw_fixed_layer(bitmap_rgb32 &bitmap, int scanline) { assert((m_fixed_layer_source && m_region_fixed != nullptr) || (m_region_fixedbios != nullptr)); - int x; uint8_t* gfx_base = m_fixed_layer_source ? m_region_fixed : m_region_fixedbios->base(); uint32_t addr_mask = ( m_fixed_layer_source ? m_region_fixed_size : m_region_fixedbios->bytes() ) - 1; @@ -207,7 +206,7 @@ void neosprite_base_device::draw_fixed_layer(bitmap_rgb32 &bitmap, int scanline) } } - for (x = 0; x < 40; x++) + for (int x = 0; x < 40; x++) { uint16_t code_and_palette = *video_data; uint16_t code = code_and_palette & 0x0fff; @@ -228,22 +227,19 @@ void neosprite_base_device::draw_fixed_layer(bitmap_rgb32 &bitmap, int scanline) } { - int i; int gfx_offset = ((code << 5) | (scanline & 0x07)) & addr_mask; const pen_t *char_pens; char_pens = &m_pens[code_and_palette >> 12 << m_bppshift]; - static const uint32_t pix_offsets[] = { 0x10, 0x18, 0x00, 0x08 }; - for (i = 0; i < 4; i++) + for (int i = 0; i < 4; i++) { draw_fixed_layer_2pixels(pixel_addr, gfx_offset + pix_offsets[i], gfx_base, char_pens); } } - video_data = video_data + 0x20; } } @@ -274,26 +270,8 @@ inline void neosprite_base_device::draw_fixed_layer_2pixels(uint32_t*&pixel_addr /* horizontal zoom table - verified on real hardware */ -static const int zoom_x_tables[][16] = -{ - { 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0 }, - { 0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0 }, - { 0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0 }, - { 0,0,1,0,1,0,0,0,1,0,0,0,1,0,0,0 }, - { 0,0,1,0,1,0,0,0,1,0,0,0,1,0,1,0 }, - { 0,0,1,0,1,0,1,0,1,0,0,0,1,0,1,0 }, - { 0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0 }, - { 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0 }, - { 1,0,1,0,1,0,1,0,1,1,1,0,1,0,1,0 }, - { 1,0,1,1,1,0,1,0,1,1,1,0,1,0,1,0 }, - { 1,0,1,1,1,0,1,0,1,1,1,0,1,0,1,1 }, - { 1,0,1,1,1,0,1,1,1,1,1,0,1,0,1,1 }, - { 1,0,1,1,1,0,1,1,1,1,1,0,1,1,1,1 }, - { 1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1 }, - { 1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1 }, - { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 } -}; - +static const u16 zoom_x_tables[16] = +{ 0x0080, 0x0880, 0x0888, 0x2888, 0x288a, 0x2a8a, 0x2aaa, 0xaaaa, 0xaaea, 0xbaea, 0xbaeb, 0xbbeb, 0xbbef, 0xfbef, 0xfbff, 0xffff }; inline bool neosprite_base_device::sprite_on_scanline(int scanline, int y, int rows) @@ -302,13 +280,9 @@ inline bool neosprite_base_device::sprite_on_scanline(int scanline, int y, int r } - - void neosprite_base_device::draw_sprites(bitmap_rgb32 &bitmap, int scanline) { - int sprite_index; int max_sprite_index; - int y = 0; int x = 0; int rows = 0; @@ -335,7 +309,7 @@ void neosprite_base_device::draw_sprites(bitmap_rgb32 &bitmap, int scanline) if (max_sprite_index != (MAX_SPRITES_PER_LINE - 1)) max_sprite_index = max_sprite_index + 1; - for (sprite_index = 0; sprite_index <= max_sprite_index; sprite_index++) + for (int sprite_index = 0; sprite_index <= max_sprite_index; sprite_index++) { uint16_t sprite_number = sprite_list[sprite_index] & 0x01ff; uint16_t y_control = m_videoram_drawsource[0x8200 | sprite_number]; @@ -373,7 +347,6 @@ void neosprite_base_device::draw_sprites(bitmap_rgb32 &bitmap, int scanline) offs_t attr_and_code_offs; uint16_t attr; uint32_t code; - const int *zoom_x_table; const pen_t *line_pens; int x_inc; @@ -423,15 +396,13 @@ void neosprite_base_device::draw_sprites(bitmap_rgb32 &bitmap, int scanline) if (attr & 0x0002) sprite_y ^= 0x0f; - zoom_x_table = zoom_x_tables[zoom_x]; + u16 zoom_x_table = zoom_x_tables[zoom_x]; /* compute offset in gfx ROM and mask it to the number of bits available */ int gfx_base = ((code << 8) | (sprite_y << 4)) & m_sprite_gfx_address_mask; - line_pens = &m_pens[attr >> 8 << m_bppshift]; - /* horizontal flip? */ if (attr & 0x0001) { @@ -444,34 +415,33 @@ void neosprite_base_device::draw_sprites(bitmap_rgb32 &bitmap, int scanline) /* draw the line - no wrap-around */ if (x <= 0x01f0) { - int i; - uint32_t *pixel_addr = &bitmap.pix32(scanline, x + NEOGEO_HBEND); - for (i = 0; i < 0x10; i++) + for (int i = 0; i < 0x10; i++) { - if (*zoom_x_table) + if (zoom_x_table & 0x8000) { draw_pixel(gfx_base, pixel_addr, line_pens); pixel_addr++; } - zoom_x_table++; + zoom_x_table <<= 1; + if (zoom_x_table == 0) + break; + gfx_base += x_inc; } } /* wrap-around */ else { - int i; - int x_save = x; uint32_t *pixel_addr = &bitmap.pix32(scanline, NEOGEO_HBEND); - for (i = 0; i < 0x10; i++) + for (int i = 0; i < 0x10; i++) { - if (*zoom_x_table) + if (zoom_x_table & 0x8000) { if (x >= 0x200) { @@ -483,10 +453,12 @@ void neosprite_base_device::draw_sprites(bitmap_rgb32 &bitmap, int scanline) x++; } - zoom_x_table++; + zoom_x_table <<= 1; + if (zoom_x_table == 0) + break; + gfx_base += x_inc; } - x = x_save; } } diff --git a/src/mame/video/neogeo_spr.h b/src/mame/video/neogeo_spr.h index 0c4cc9ce5d6..8ebc26a1c76 100644 --- a/src/mame/video/neogeo_spr.h +++ b/src/mame/video/neogeo_spr.h @@ -76,7 +76,6 @@ public: TIMER_CALLBACK_MEMBER(auto_animation_timer_callback); TIMER_CALLBACK_MEMBER(sprite_line_timer_callback); - int m_bppshift; // 4 for 4bpp gfx (NeoGeo) 8 for 8bpp gfx (Midas) protected: