diff --git a/src/mame/dataeast/deco32.cpp b/src/mame/dataeast/deco32.cpp index 8b1822e0af837..e4d95551f1953 100644 --- a/src/mame/dataeast/deco32.cpp +++ b/src/mame/dataeast/deco32.cpp @@ -766,10 +766,10 @@ void dragngun_state::speaker_switch_w(u32 data) // TODO: This should switch the oki3 output between the gun speaker and the standard speakers m_gun_speaker_disabled = bool(BIT(data, 0)); - logerror("Gun speaker: %s\n", m_gun_speaker_disabled ? "Disabled" : "Enabled"); + logerror("%s: Gun speaker: %s\n", machine().describe_context(), m_gun_speaker_disabled ? "Disabled" : "Enabled"); } -LC7535_VOLUME_CHANGED( dragngun_state::volume_main_changed ) +LC7535_VOLUME_CHANGED(dragngun_state::volume_main_changed) { // TODO: Support loudness logerror("Main speaker volume: left = %d dB, right %d dB, loudness = %s\n", attenuation_left, attenuation_right, loudness ? "on" :"off"); @@ -787,7 +787,7 @@ LC7535_VOLUME_CHANGED( dragngun_state::volume_main_changed ) m_oki[2]->set_output_gain(ALL_OUTPUTS, gain_l); } -LC7535_VOLUME_CHANGED( dragngun_state::volume_gun_changed ) +LC7535_VOLUME_CHANGED(dragngun_state::volume_gun_changed) { logerror("Gun speaker volume: left = %d dB, right %d dB, loudness = %s\n", attenuation_left, attenuation_right, loudness ? "on" :"off"); @@ -815,7 +815,7 @@ void deco32_state::sound_bankswitch_w(u8 data) void dragngun_state::lockload_okibank_lo_w(u8 data) { m_oki2_bank = (m_oki2_bank & 2) | ((data >> 1) & 1); - logerror("Load OKI2 Bank Low bits: %02x, Current : %02x\n",(data >> 1) & 1, m_oki2_bank); + logerror("%s: Load OKI2 Bank Low bits: %02x, Current : %02x\n", machine().describe_context(), (data >> 1) & 1, m_oki2_bank); m_oki[0]->set_rom_bank((data >> 0) & 1); m_oki[1]->set_rom_bank(m_oki2_bank); } @@ -823,7 +823,7 @@ void dragngun_state::lockload_okibank_lo_w(u8 data) void dragngun_state::lockload_okibank_hi_w(u8 data) { m_oki2_bank = (m_oki2_bank & 1) | ((data & 1) << 1); // TODO : Actually value unverified - logerror("Load OKI2 Bank Hi bits: %02x, Current : %02x\n",((data & 1) << 1), m_oki2_bank); + logerror("%s: Load OKI2 Bank Hi bits: %02x, Current : %02x\n", machine().describe_context(), ((data & 1) << 1), m_oki2_bank); m_oki[1]->set_rom_bank(m_oki2_bank); } @@ -977,13 +977,14 @@ u32 dragngun_state::lightgun_r() case 7: return m_io_light_y[1]->read(); } -// logerror("Illegal lightgun port %d read \n",m_lightgun_port); + //if (!machine().side_effects_disabled()) + //logerror("%s: Illegal lightgun port %d read \n", machine().describe_context(), m_lightgun_port); return 0; } void dragngun_state::lightgun_w(offs_t offset, u32 data) { -// logerror("Lightgun port %d\n",m_lightgun_port); +// logerror("%s: Lightgun port %d\n", machine().describe_context(), m_lightgun_port); m_lightgun_port = offset; } @@ -1065,7 +1066,7 @@ void tattass_state::tattass_control_w(offs_t offset, u32 data, u32 mem_mask) { if (m_buf_ptr) { - logerror("Eprom reset (bit count %d): ", m_read_bit_count); + logerror("%s: Eprom reset (bit count %d): ", machine().describe_context(), m_read_bit_count); for (int i = 0; i < m_buf_ptr; i++) logerror("%s", BIT(m_buffer, m_buf_ptr - 1 - i) ? "1" : "0"); logerror("\n"); @@ -1081,7 +1082,7 @@ void tattass_state::tattass_control_w(offs_t offset, u32 data, u32 mem_mask) { if (m_buf_ptr >= 32) { - logerror("Eprom overflow!"); + logerror("%s: Eprom overflow!\n", machine().describe_context()); m_buf_ptr = 0; } @@ -1137,7 +1138,7 @@ void tattass_state::tattass_control_w(offs_t offset, u32 data, u32 mem_mask) } else { - logerror("Detected unknown eprom command\n"); + logerror("%s: Detected unknown eprom command\n", machine().describe_context()); } } } @@ -1145,7 +1146,7 @@ void tattass_state::tattass_control_w(offs_t offset, u32 data, u32 mem_mask) { if (!(BIT(data, 6))) { - logerror("Cs set low\n"); + logerror("%s: Cs set low\n", machine().describe_context()); m_buf_ptr = 0; } } @@ -2207,6 +2208,7 @@ void dragngun_state::namco_sprites(machine_config &config) NAMCO_C355SPR(config, m_sprgenzoom, 0); m_sprgenzoom->set_tile_callback(namco_c355spr_device::c355_obj_code2tile_delegate(&dragngun_state::sprite_bank_callback, this)); m_sprgenzoom->set_palette(m_palette); + m_sprgenzoom->set_transparent_pen(15); m_sprgenzoom->set_colors(32); m_sprgenzoom->set_granularity(16); m_sprgenzoom->set_read_spritetile(FUNC(dragngun_state::read_spritetile)); @@ -2215,7 +2217,9 @@ void dragngun_state::namco_sprites(machine_config &config) m_sprgenzoom->set_read_spritelist(FUNC(dragngun_state::read_spritelist)); m_sprgenzoom->set_read_cliptable(FUNC(dragngun_state::read_cliptable)); m_sprgenzoom->set_priority_callback(FUNC(dragngun_state::sprite_priority_callback)); - m_sprgenzoom->set_device_allocates_spriteram_and_bitmaps(false); + m_sprgenzoom->set_mix_callback(FUNC(dragngun_state::sprite_mix_callback)); + m_sprgenzoom->set_device_allocates_spriteram(false); + m_sprgenzoom->set_alt_precision(true); } // DE-0420-1 + Bottom board DE-0421-0 diff --git a/src/mame/dataeast/deco32.h b/src/mame/dataeast/deco32.h index d8df30de53dcb..ce435c8cd6857 100644 --- a/src/mame/dataeast/deco32.h +++ b/src/mame/dataeast/deco32.h @@ -52,10 +52,7 @@ class deco32_state : public driver_device void sound_bankswitch_w(u8 data); protected: - void h6280_sound_custom_latch_map(address_map &map) ATTR_COLD; - void h6280_sound_map(address_map &map) ATTR_COLD; - void z80_sound_io(address_map &map) ATTR_COLD; - void z80_sound_map(address_map &map) ATTR_COLD; + virtual void video_start() override ATTR_COLD; // common u16 ioprot_r(offs_t offset); @@ -77,6 +74,15 @@ class deco32_state : public driver_device void buffered_palette_w(offs_t offset, u32 data, u32 mem_mask = ~0); void palette_dma_w(u32 data); + void allocate_spriteram(int chip); + void allocate_buffered_palette(); + void allocate_rowscroll(int size1, int size2, int size3, int size4); + + void h6280_sound_custom_latch_map(address_map &map) ATTR_COLD; + void h6280_sound_map(address_map &map) ATTR_COLD; + void z80_sound_io(address_map &map) ATTR_COLD; + void z80_sound_map(address_map &map) ATTR_COLD; + optional_device m_audiocpu; optional_device_array m_sprgen; required_device_array m_deco_tilegen; @@ -91,14 +97,8 @@ class deco32_state : public driver_device optional_device m_soundlatch; required_device m_maincpu; - void allocate_spriteram(int chip); - void allocate_buffered_palette(); - void allocate_rowscroll(int size1, int size2, int size3, int size4); - - virtual void video_start() override ATTR_COLD; - std::unique_ptr m_dirty_palette{}; // all but captaven - int m_pri = 0; // all but dragngun + u32 m_pri = 0; // all but dragngun std::unique_ptr m_spriteram16[2]{}; // all but dragngun std::unique_ptr m_spriteram16_buffered[2]{}; // all but dragngun std::unique_ptr m_pf_rowscroll[4]{}; // common @@ -167,7 +167,6 @@ class fghthist_state : public deco32_state void fghthist_map(address_map &map) ATTR_COLD; void fghthsta_memmap(address_map &map) ATTR_COLD; -private: }; // nslasher @@ -188,6 +187,7 @@ class nslasher_state : public deco32_state virtual void video_start() override ATTR_COLD; required_device m_deco_ace; + std::unique_ptr m_tilemap_alpha_bitmap; void tilemap_color_bank_w(u8 data); void sprite1_color_bank_w(u8 data); @@ -203,7 +203,6 @@ class nslasher_state : public deco32_state void mix_nslasher(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, gfx_element *gfx0, gfx_element *gfx1, int mixAlphaTilemap); - std::unique_ptr m_tilemap_alpha_bitmap; }; // tattass @@ -222,6 +221,14 @@ class tattass_state : public nslasher_state private: required_device m_decobsmt; + u8 m_tattass_eprom_bit = 0; + s32 m_last_clock = 0; + u32 m_buffer = 0U; + u32 m_buf_ptr = 0; + s32 m_pending_command = 0; + s32 m_read_bit_count = 0; + u32 m_byte_addr = 0; + void tattass_control_w(offs_t offset, u32 data, u32 mem_mask = ~0); void tattass_sound_irq_w(int state); @@ -232,14 +239,6 @@ class tattass_state : public nslasher_state void tattass_map(address_map &map) ATTR_COLD; void mix_tattass(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, gfx_element *gfx0, gfx_element *gfx1, int mixAlphaTilemap); - - int m_tattass_eprom_bit = 0; - int m_last_clock = 0; - u32 m_buffer = 0U; - int m_buf_ptr = 0; - int m_pending_command = 0; - int m_read_bit_count = 0; - int m_byte_addr = 0; }; class dragngun_state : public deco32_state @@ -291,9 +290,10 @@ class dragngun_state : public deco32_state optional_ioport_array<2> m_io_light_y; u32 m_sprite_ctrl = 0U; - int m_lightgun_port = 0; + u32 m_lightgun_port = 0; int m_oki2_bank = 0; // lockload - bitmap_rgb32 m_temp_render_bitmap{}; + + bool m_gun_speaker_disabled; u32 lightgun_r(); void lightgun_w(offs_t offset, u32 data = 0); @@ -323,6 +323,7 @@ class dragngun_state : public deco32_state void expand_sprite_data(); void dragngun_init_common(); + bool sprite_mix_callback(u16 &dest, u8 &destpri, u16 colbase, u16 src, int srcpri, int pri); u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); DECO16IC_BANK_CB_MEMBER(bank_1_callback); @@ -336,7 +337,6 @@ class dragngun_state : public deco32_state void lockloadu_map(address_map &map) ATTR_COLD; void lockload_sound_map(address_map &map) ATTR_COLD; void lockloadu_sound_map(address_map &map) ATTR_COLD; - bool m_gun_speaker_disabled; }; #endif // MAME_DATAEAST_DECO32_H diff --git a/src/mame/dataeast/deco32_v.cpp b/src/mame/dataeast/deco32_v.cpp index 5a4855f08a363..dfac4a8963a66 100644 --- a/src/mame/dataeast/deco32_v.cpp +++ b/src/mame/dataeast/deco32_v.cpp @@ -133,7 +133,6 @@ void nslasher_state::video_start() void dragngun_state::video_start() { - m_screen->register_screen_bitmap(m_temp_render_bitmap); deco32_state::allocate_rowscroll(0x4000/4, 0x2000/4, 0x4000/4, 0x2000/4); deco32_state::allocate_buffered_palette(); save_item(NAME(m_sprite_ctrl)); @@ -231,6 +230,21 @@ int dragngun_state::sprite_priority_callback(int priority) return priority; } +bool dragngun_state::sprite_mix_callback(u16 &dest, u8 &destpri, u16 colbase, u16 src, int srcpri, int pri) +{ + // TODO: proper priority handling + if (srcpri >= destpri) + { + if ((src & 0xf) != 0xf) + { + dest = colbase + src; + destpri = srcpri; + return true; + } + } + return false; +} + u32 dragngun_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { @@ -255,8 +269,8 @@ u32 dragngun_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, c if (cliprect.bottom() == 247) { rectangle clip(cliprect.left(), cliprect.right(), 8, 247); - - m_sprgenzoom->draw_dg(screen, bitmap, clip, screen.priority(), m_temp_render_bitmap); + m_sprgenzoom->clear_screen_bitmap(clip); + m_sprgenzoom->draw_dg(screen, bitmap, clip); } return 0; diff --git a/src/mame/namco/gal3.cpp b/src/mame/namco/gal3.cpp index 0f7588a8b40ee..dbce693123b26 100644 --- a/src/mame/namco/gal3.cpp +++ b/src/mame/namco/gal3.cpp @@ -166,29 +166,31 @@ class gal3_state : public driver_device private: required_device_array m_c355spr; required_device_array m_palette; - uint16_t m_video_enable[2]; - required_shared_ptr m_rso_shared_ram; + required_shared_ptr m_rso_shared_ram; required_device m_c140_16a; required_device m_c140_16g; required_device_array m_namcos21_3d; required_device_array m_namcos21_dsp_c67; - uint32_t m_led_mst = 0; - uint32_t m_led_slv = 0; + u16 m_video_enable[2]{}; + u32 m_led_mst = 0; + u32 m_led_slv = 0; - uint32_t led_mst_r(); - void led_mst_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0); - uint32_t led_slv_r(); - void led_slv_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0); - template uint16_t video_enable_r(); - template void video_enable_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - uint16_t rso_r(offs_t offset); - void rso_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + u32 led_mst_r(); + void led_mst_w(offs_t offset, u32 data, u32 mem_mask = ~0); + u32 led_slv_r(); + void led_slv_w(offs_t offset, u32 data, u32 mem_mask = ~0); + template u16 video_enable_r(); + template void video_enable_w(offs_t offset, u16 data, u16 mem_mask = ~0); + u16 rso_r(offs_t offset); + void rso_w(offs_t offset, u16 data, u16 mem_mask = ~0); + bool sprite_mix_callback(u16 &dest, u8 &destpri, u16 colbase, u16 src, int srcpri, int pri); // using ind16 for now because namco_c355spr_device::zdrawgfxzoom does not support rgb32, will probably need to be improved for LD use - uint32_t screen_update_left(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - uint32_t screen_update_right(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + u32 screen_update_left(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + u32 screen_update_right(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + void cpu_mst_map(address_map &map) ATTR_COLD; void cpu_slv_map(address_map &map) ATTR_COLD; void psn_b1_cpu_map(address_map &map) ATTR_COLD; @@ -208,7 +210,31 @@ void gal3_state::video_start() save_item(NAME(m_video_enable)); } -uint32_t gal3_state::screen_update_left(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +bool gal3_state::sprite_mix_callback(u16 &dest, u8 &destpri, u16 colbase, u16 src, int srcpri, int pri) +{ + if (srcpri == pri) + { + if ((src & 0xff) != 0xff) + { + switch (src & 0xff) + { + case 0: + dest = 0x4000 | (dest & 0x1fff); + break; + case 1: + dest = 0x6000 | (dest & 0x1fff); + break; + default: + dest = colbase + (src ^ 0xf00); + break; + } + return true; + } + } + return false; +} + +u32 gal3_state::screen_update_left(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { bitmap.fill(0xff, cliprect); // TODO : actually laserdisc layer screen.priority().fill(0, cliprect); @@ -220,17 +246,17 @@ uint32_t gal3_state::screen_update_left(screen_device &screen, bitmap_ind16 &bit static int pivot = 15; int pri; - if( machine().input().code_pressed_once(KEYCODE_H)&&(pivot<15) ) pivot+=1; - if( machine().input().code_pressed_once(KEYCODE_J)&&(pivot>0) ) pivot-=1; + if (machine().input().code_pressed_once(KEYCODE_H) && (pivot < 15)) pivot += 1; + if (machine().input().code_pressed_once(KEYCODE_J) && (pivot > 0)) pivot -= 1; - for( pri=0; pridraw(screen, bitmap, cliprect, pri); } -/* CopyVisiblePolyFrameBuffer( bitmap, cliprect,0,0x7fbf ); +/* CopyVisiblePolyFrameBuffer(bitmap, cliprect,0,0x7fbf); - for( pri=pivot; pri<15; pri++ ) + for (pri = pivot; pri < 15; pri++) { m_c355spr[0]->draw(screen, bitmap, cliprect, pri); }*/ @@ -238,24 +264,24 @@ uint32_t gal3_state::screen_update_left(screen_device &screen, bitmap_ind16 &bit // CPU Diag LEDs mst[17]='\0', slv[17]='\0'; /// printf("mst=0x%x\tslv=0x%x\n", m_led_mst, m_led_slv); - for(i=16;i<32;i++) + for (i = 16; i < 32; i++) { int t; - if(i<24) - t=i; + if (i < 24) + t = i; else - t=i+1; + t = i + 1; mst[8]=' '; slv[8]=' '; - if(m_led_mst&(1<0) ) pivot-=1; + if (machine().input().code_pressed_once(KEYCODE_H) && (pivot < 15)) pivot += 1; + if (machine().input().code_pressed_once(KEYCODE_J) && (pivot > 0)) pivot -= 1; - for( pri=0; pridraw(screen, bitmap, cliprect, pri); } -/* CopyVisiblePolyFrameBuffer( bitmap, cliprect,0,0x7fbf ); +/* CopyVisiblePolyFrameBuffer(bitmap, cliprect,0,0x7fbf); - for( pri=pivot; pri<15; pri++ ) + for (pri = pivot; pri < 15; pri++) { m_c355spr[1]->draw(screen, bitmap, cliprect, pri); }*/ @@ -293,39 +319,39 @@ uint32_t gal3_state::screen_update_right(screen_device &screen, bitmap_ind16 &bi /***************************************************************************************/ -uint32_t gal3_state::led_mst_r() +u32 gal3_state::led_mst_r() { return m_led_mst; } -void gal3_state::led_mst_w(offs_t offset, uint32_t data, uint32_t mem_mask) +void gal3_state::led_mst_w(offs_t offset, u32 data, u32 mem_mask) { COMBINE_DATA(&m_led_mst); } -uint32_t gal3_state::led_slv_r() +u32 gal3_state::led_slv_r() { return m_led_slv; } -void gal3_state::led_slv_w(offs_t offset, uint32_t data, uint32_t mem_mask) +void gal3_state::led_slv_w(offs_t offset, u32 data, u32 mem_mask) { COMBINE_DATA(&m_led_slv); } template -uint16_t gal3_state::video_enable_r() +u16 gal3_state::video_enable_r() { return m_video_enable[Screen]; } template -void gal3_state::video_enable_w(offs_t offset, uint16_t data, uint16_t mem_mask) +void gal3_state::video_enable_w(offs_t offset, u16 data, u16 mem_mask) { COMBINE_DATA(&m_video_enable[Screen]); // 0xff53, instead of 0x40 in namcos21 } -uint16_t gal3_state::rso_r(offs_t offset) +u16 gal3_state::rso_r(offs_t offset) { /*store $5555 @$0046, and readback @$0000 read @$0144 and store at A6_21e & A4_5c @@ -334,7 +360,7 @@ uint16_t gal3_state::rso_r(offs_t offset) return m_rso_shared_ram[offset]; } -void gal3_state::rso_w(offs_t offset, uint16_t data, uint16_t mem_mask) +void gal3_state::rso_w(offs_t offset, u16 data, u16 mem_mask) { COMBINE_DATA(&m_rso_shared_ram[offset]); } @@ -638,7 +664,7 @@ void gal3_state::gal3(machine_config &config) m_c355spr[0]->set_palette(m_palette[0]); m_c355spr[0]->set_scroll_offsets(0x26, 0x19); m_c355spr[0]->set_tile_callback(namco_c355spr_device::c355_obj_code2tile_delegate()); - m_c355spr[0]->set_palxor(0xf); // reverse mapping + m_c355spr[0]->set_mix_callback(FUNC(gal3_state::sprite_mix_callback)); m_c355spr[0]->set_color_base(0x1000); // TODO : verify palette offset m_c355spr[0]->set_external_prifill(true); @@ -668,7 +694,7 @@ void gal3_state::gal3(machine_config &config) m_c355spr[1]->set_palette(m_palette[1]); m_c355spr[1]->set_scroll_offsets(0x26, 0x19); m_c355spr[1]->set_tile_callback(namco_c355spr_device::c355_obj_code2tile_delegate()); - m_c355spr[1]->set_palxor(0xf); // reverse mapping + m_c355spr[1]->set_mix_callback(FUNC(gal3_state::sprite_mix_callback)); m_c355spr[1]->set_color_base(0x1000); // TODO : verify palette offset m_c355spr[1]->set_external_prifill(true); diff --git a/src/mame/namco/namco_c169roz.cpp b/src/mame/namco/namco_c169roz.cpp index e6d98db1c7207..759ee73276d6c 100644 --- a/src/mame/namco/namco_c169roz.cpp +++ b/src/mame/namco/namco_c169roz.cpp @@ -138,7 +138,7 @@ void namco_c169roz_device::unpack_params(const uint16_t *source, roz_parameters params.incyy <<= 8; } -void namco_c169roz_device::draw_helper(screen_device &screen, bitmap_ind16 &bitmap, tilemap_t &tmap, const rectangle &clip, const roz_parameters ¶ms) +void namco_c169roz_device::draw_helper(screen_device &screen, bitmap_ind16 &bitmap, tilemap_t &tmap, const rectangle &clip, const roz_parameters ¶ms, uint8_t prival, uint8_t primask) { if (!m_is_namcofl) // if (m_gametype != NAMCOFL_FINAL_LAP_R) // Fix speedrcr some title animations, but broke at road scene @@ -156,16 +156,21 @@ void namco_c169roz_device::draw_helper(screen_device &screen, bitmap_ind16 &bitm uint32_t cx = startx; uint32_t cy = starty; uint16_t *dest = &bitmap.pix(sy, sx); + uint8_t *destpri = &screen.priority().pix(sy, sx); while (x <= clip.max_x) { // TODO : Wraparound disable isn't implemented const uint32_t xpos = (((cx >> 16) & size_mask) + params.left) & 0xfff; const uint32_t ypos = (((cy >> 16) & size_mask) + params.top) & 0xfff; if (flagsbitmap.pix(ypos, xpos) & TILEMAP_PIXEL_LAYER0) + { *dest = srcbitmap.pix(ypos, xpos) + params.color + m_color_base; + *destpri = (*destpri & primask) | prival; + } cx += params.incxx; cy += params.incxy; x++; dest++; + destpri++; } startx += params.incyx; starty += params.incyy; @@ -182,11 +187,11 @@ void namco_c169roz_device::draw_helper(screen_device &screen, bitmap_ind16 &bitm params.startx, params.starty, params.incxx, params.incxy, params.incyx, params.incyy, - params.wrap,0,0); // wrap, flags, pri + params.wrap, 0, prival, primask); // wrap, flags, pri } } -void namco_c169roz_device::draw_scanline(screen_device &screen, bitmap_ind16 &bitmap, int line, int which, int pri, const rectangle &cliprect) +void namco_c169roz_device::draw_scanline(screen_device &screen, bitmap_ind16 &bitmap, int line, int which, int pri, const rectangle &cliprect, uint8_t prival, uint8_t primask) { if (line >= cliprect.min_y && line <= cliprect.max_y) { @@ -205,13 +210,13 @@ void namco_c169roz_device::draw_scanline(screen_device &screen, bitmap_ind16 &bi { rectangle clip(0, bitmap.width() - 1, line, line); clip &= cliprect; - draw_helper(screen, bitmap, *m_tilemap[which], clip, params); + draw_helper(screen, bitmap, *m_tilemap[which], clip, params, prival, primask); } } } } -void namco_c169roz_device::draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri) +void namco_c169roz_device::draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri, uint8_t prival, uint8_t primask) { const int special = (m_is_namcofl) ? 0 : 1; const int mode = m_control[0]; // 0x8000 or 0x1000 @@ -228,14 +233,14 @@ void namco_c169roz_device::draw(screen_device &screen, bitmap_ind16 &bitmap, con if (which == special && mode == 0x8000) { for (int line = cliprect.min_y; line <= cliprect.max_y; line++) - draw_scanline(screen, bitmap, line, which, pri, cliprect); + draw_scanline(screen, bitmap, line, which, pri, cliprect, prival, primask); } else { roz_parameters params; unpack_params(source, params); if (params.priority == pri) - draw_helper(screen, bitmap, *m_tilemap[which], cliprect, params); + draw_helper(screen, bitmap, *m_tilemap[which], cliprect, params, prival, primask); } } } diff --git a/src/mame/namco/namco_c169roz.h b/src/mame/namco/namco_c169roz.h index ccf50b702acbe..cd74850644367 100644 --- a/src/mame/namco/namco_c169roz.h +++ b/src/mame/namco/namco_c169roz.h @@ -7,6 +7,7 @@ #pragma once +#include "screen.h" #include "tilemap.h" class namco_c169roz_device : public device_t, public device_gfx_interface @@ -27,7 +28,7 @@ class namco_c169roz_device : public device_t, public device_gfx_interface typedef delegate c169_tilemap_delegate; void set_tile_callback(c169_tilemap_delegate tilemap_cb) { m_c169_cb = tilemap_cb; } - void draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri); + void draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri, uint8_t prival = 0, uint8_t primask = uint8_t(~0)); void mark_all_dirty(); protected: @@ -46,8 +47,8 @@ class namco_c169roz_device : public device_t, public device_gfx_interface int wrap; }; void unpack_params(const uint16_t *source, roz_parameters ¶ms); - void draw_helper(screen_device &screen, bitmap_ind16 &bitmap, tilemap_t &tmap, const rectangle &clip, const roz_parameters ¶ms); - void draw_scanline(screen_device &screen, bitmap_ind16 &bitmap, int line, int which, int pri, const rectangle &cliprect); + void draw_helper(screen_device &screen, bitmap_ind16 &bitmap, tilemap_t &tmap, const rectangle &clip, const roz_parameters ¶ms, uint8_t prival, uint8_t primask); + void draw_scanline(screen_device &screen, bitmap_ind16 &bitmap, int line, int which, int pri, const rectangle &cliprect, uint8_t prival, uint8_t primask); void get_info(tile_data &tileinfo, int tile_index, int which); template TILE_GET_INFO_MEMBER( get_info ); TILEMAP_MAPPER_MEMBER( mapper ); diff --git a/src/mame/namco/namco_c45road.cpp b/src/mame/namco/namco_c45road.cpp index 91053377e3667..fa4fbfc17a8ba 100644 --- a/src/mame/namco/namco_c45road.cpp +++ b/src/mame/namco/namco_c45road.cpp @@ -144,7 +144,7 @@ void namco_c45_road_device::tileram_w(offs_t offset, uint16_t data, uint16_t mem // draw -- render to the target bitmap //------------------------------------------------- -void namco_c45_road_device::draw(bitmap_ind16 &bitmap, const rectangle &cliprect, int pri) +void namco_c45_road_device::draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri, uint8_t prival, uint8_t primask) { bitmap_ind16 &source_bitmap = m_tilemap->pixmap(); unsigned yscroll = m_lineram[0x3fe/2]; @@ -198,6 +198,7 @@ void namco_c45_road_device::draw(bitmap_ind16 &bitmap, const rectangle &cliprect // BUT: support transparent color for Thunder Ceptor uint16_t *dest = &bitmap.pix(y); + uint8_t *destpri = &screen.priority().pix(y); if (m_transparent_color != ~0) { while (numpixels-- > 0) @@ -208,6 +209,7 @@ void namco_c45_road_device::draw(bitmap_ind16 &bitmap, const rectangle &cliprect if (m_clut != nullptr) pen = (pen & ~0xff) | m_clut[pen & 0xff]; dest[screenx] = pen; + destpri[screenx] = (destpri[screenx] & primask) | prival; } screenx++; sourcex += dsourcex; @@ -220,7 +222,9 @@ void namco_c45_road_device::draw(bitmap_ind16 &bitmap, const rectangle &cliprect int pen = source_gfx[sourcex >> 16]; if (m_clut != nullptr) pen = (pen & ~0xff) | m_clut[pen & 0xff]; - dest[screenx++] = pen; + dest[screenx] = pen; + destpri[screenx] = (destpri[screenx] & primask) | prival; + screenx++; sourcex += dsourcex; } } diff --git a/src/mame/namco/namco_c45road.h b/src/mame/namco/namco_c45road.h index 5874e7180fdcd..8be9e2f798822 100644 --- a/src/mame/namco/namco_c45road.h +++ b/src/mame/namco/namco_c45road.h @@ -5,6 +5,7 @@ #pragma once +#include "screen.h" #include "tilemap.h" @@ -31,7 +32,7 @@ class namco_c45_road_device : public device_t, public device_gfx_interface, publ void set_transparent_color(pen_t pen) { m_transparent_color = pen; } void set_xoffset(int xoffset) { m_xoffset = xoffset; } - void draw(bitmap_ind16 &bitmap, const rectangle &cliprect, int pri); + void draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri, uint8_t prival = 0, uint8_t primask = uint8_t(~0)); protected: // device-level overrides diff --git a/src/mame/namco/namcofl.cpp b/src/mame/namco/namcofl.cpp index 46f75e0439df7..8d9a3da29d8dd 100644 --- a/src/mame/namco/namcofl.cpp +++ b/src/mame/namco/namcofl.cpp @@ -223,8 +223,8 @@ class namcofl_state : public driver_device required_device m_c355spr; required_device m_mcu; - required_shared_ptr m_workram; - required_shared_ptr m_shareram; + required_shared_ptr m_workram; + required_shared_ptr m_shareram; memory_view m_mainbank; required_ioport m_in0; @@ -238,51 +238,73 @@ class namcofl_state : public driver_device emu_timer *m_raster_interrupt_timer = nullptr; emu_timer *m_vblank_interrupt_timer = nullptr; emu_timer *m_network_interrupt_timer = nullptr; - uint8_t m_mcu_port6 = 0; - uint32_t m_sprbank = 0; + u8 m_mcu_port6 = 0; + u32 m_sprbank = 0; static constexpr int m_irq_type[] = { I960_IRQ0, I960_IRQ1, I960_IRQ2, I960_IRQ3 }; - uint32_t unk1_r(); - uint8_t network_r(offs_t offset); - uint32_t sysreg_r(); - void sysreg_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0); - void c116_w(offs_t offset, uint8_t data); - uint16_t mcu_shared_r(offs_t offset); - void mcu_shared_w(offs_t offset, uint16_t data, uint16_t mem_mask); - uint8_t port6_r(); - void port6_w(uint8_t data); - uint8_t port7_r(); - uint8_t dac6_r(); - void spritebank_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0); - uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + u32 unk1_r(); + u8 network_r(offs_t offset); + u32 sysreg_r(); + void sysreg_w(offs_t offset, u32 data, u32 mem_mask = ~0); + void c116_w(offs_t offset, u8 data); + u16 mcu_shared_r(offs_t offset); + void mcu_shared_w(offs_t offset, u16 data, u16 mem_mask); + u8 port6_r(); + void port6_w(u8 data); + u8 port7_r(); + u8 dac6_r(); + void spritebank_w(offs_t offset, u32 data, u32 mem_mask = ~0); + bool sprite_mix_callback(u16 &dest, u8 &destpri, u16 colbase, u16 src, int srcpri, int pri); + u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); TIMER_CALLBACK_MEMBER(network_interrupt_callback); TIMER_CALLBACK_MEMBER(vblank_interrupt_callback); TIMER_CALLBACK_MEMBER(raster_interrupt_callback); TIMER_DEVICE_CALLBACK_MEMBER(mcu_irq0_cb); TIMER_DEVICE_CALLBACK_MEMBER(mcu_irq2_cb); int objcode2tile(int code); - void tilemap_cb(uint16_t code, int &tile, int &mask); - void roz_cb(uint16_t code, int &tile, int &mask, int which); + void tilemap_cb(u16 code, int &tile, int &mask); + void roz_cb(u16 code, int &tile, int &mask, int which); void namcoc75_am(address_map &map) ATTR_COLD; void main_map(address_map &map) ATTR_COLD; }; -void namcofl_state::tilemap_cb(uint16_t code, int &tile, int &mask) +void namcofl_state::tilemap_cb(u16 code, int &tile, int &mask) { tile = code; mask = code; } -void namcofl_state::roz_cb(uint16_t code, int &tile, int &mask, int which) +void namcofl_state::roz_cb(u16 code, int &tile, int &mask, int which) { tile = code; mask = code; } +bool namcofl_state::sprite_mix_callback(u16 &dest, u8 &destpri, u16 colbase, u16 src, int srcpri, int pri) +{ + if (srcpri >= destpri) + { + if ((src & 0xff) != 0xff) + { + if (src == 0xffe) + { + dest |= 0x800; + } + else + { + dest = colbase + src; + } + destpri = srcpri; + return true; + } + } + return false; +} -uint32_t namcofl_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) + +u32 namcofl_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { // compute window for custom screen blanking rectangle clip; @@ -296,17 +318,17 @@ uint32_t namcofl_state::screen_update(screen_device &screen, bitmap_ind16 &bitma clip &= cliprect; bitmap.fill(m_c116->black_pen(), cliprect); + screen.priority().fill(0, cliprect); for (int pri = 0; pri < 16; pri++) { - m_c169roz->draw(screen, bitmap, clip, pri); + m_c169roz->draw(screen, bitmap, clip, pri, pri, 0); if ((pri & 1) == 0) { - m_c123tmap->draw(screen, bitmap, clip, pri >> 1); + m_c123tmap->draw(screen, bitmap, clip, pri >> 1, pri, 0); } - - m_c355spr->draw(screen, bitmap, clip, pri); } + m_c355spr->draw(screen, bitmap, clip); return 0; } @@ -315,7 +337,7 @@ uint32_t namcofl_state::screen_update(screen_device &screen, bitmap_ind16 &bitma // groups of sprites. I am unsure how to differentiate those groups // at this time however. -void namcofl_state::spritebank_w(offs_t offset, uint32_t data, uint32_t mem_mask) +void namcofl_state::spritebank_w(offs_t offset, u32 data, u32 mem_mask) { COMBINE_DATA(&m_sprbank); } @@ -329,12 +351,12 @@ int namcofl_state::objcode2tile(int code) } -uint32_t namcofl_state::unk1_r() +u32 namcofl_state::unk1_r() { return 0xffffffff; } -uint8_t namcofl_state::network_r(offs_t offset) +u8 namcofl_state::network_r(offs_t offset) { if (offset == 1) return 0x7d; @@ -342,12 +364,12 @@ uint8_t namcofl_state::network_r(offs_t offset) return 0xff; } -uint32_t namcofl_state::sysreg_r() +u32 namcofl_state::sysreg_r() { return 0; } -void namcofl_state::sysreg_w(offs_t offset, uint32_t data, uint32_t mem_mask) +void namcofl_state::sysreg_w(offs_t offset, u32 data, u32 mem_mask) { if ((offset == 2) && ACCESSING_BITS_0_7) // address space configuration { @@ -363,13 +385,13 @@ void namcofl_state::sysreg_w(offs_t offset, uint32_t data, uint32_t mem_mask) } // FIXME: remove this trampoline once the IRQ is moved into the actual device -void namcofl_state::c116_w(offs_t offset, uint8_t data) +void namcofl_state::c116_w(offs_t offset, u8 data) { m_c116->write(offset, data); if ((offset & 0x180e) == 0x180a) { - const uint16_t triggerscanline = m_c116->get_reg(5) - (32+1); + const u16 triggerscanline = m_c116->get_reg(5) - (32+1); m_raster_interrupt_timer->adjust(m_screen->time_until_pos(triggerscanline)); } } @@ -400,7 +422,7 @@ void namcofl_state::main_map(address_map &map) } -void namcofl_state::mcu_shared_w(offs_t offset, uint16_t data, uint16_t mem_mask) +void namcofl_state::mcu_shared_w(offs_t offset, u16 data, u16 mem_mask) { // HACK! Many games data ROM routines redirect the vector from the sound command read to an RTS. // This needs more investigation. nebulray and vshoot do NOT do this. @@ -413,9 +435,9 @@ void namcofl_state::mcu_shared_w(offs_t offset, uint16_t data, uint16_t mem_mask #endif if (BIT(offset, 0)) - m_shareram[offset >> 1] = (m_shareram[offset >> 1] & ~(uint32_t(mem_mask) << 16)) | ((data & mem_mask) << 16); + m_shareram[offset >> 1] = (m_shareram[offset >> 1] & ~(u32(mem_mask) << 16)) | ((data & mem_mask) << 16); else - m_shareram[offset >> 1] = (m_shareram[offset >> 1] & ~uint32_t(mem_mask)) | (data & mem_mask); + m_shareram[offset >> 1] = (m_shareram[offset >> 1] & ~u32(mem_mask)) | (data & mem_mask); // C75 BIOS has a very short window on the CPU sync signal, so immediately let the i960 at it if ((offset == 0x6000/2) && BIT(data, 7)) @@ -424,7 +446,7 @@ void namcofl_state::mcu_shared_w(offs_t offset, uint16_t data, uint16_t mem_mask } } -uint16_t namcofl_state::mcu_shared_r(offs_t offset) +u16 namcofl_state::mcu_shared_r(offs_t offset) { if (BIT(offset, 0)) return m_shareram[offset >> 1] >> 16; @@ -432,17 +454,17 @@ uint16_t namcofl_state::mcu_shared_r(offs_t offset) return m_shareram[offset >> 1]; } -uint8_t namcofl_state::port6_r() +u8 namcofl_state::port6_r() { return m_mcu_port6; } -void namcofl_state::port6_w(uint8_t data) +void namcofl_state::port6_w(u8 data) { m_mcu_port6 = data; } -uint8_t namcofl_state::port7_r() +u8 namcofl_state::port7_r() { switch (m_mcu_port6 & 0xf0) { @@ -465,7 +487,7 @@ uint8_t namcofl_state::port7_r() return 0xff; } -uint8_t namcofl_state::dac6_r() +u8 namcofl_state::dac6_r() { return m_brake.read_safe(0xff); } @@ -705,7 +727,7 @@ void namcofl_state::namcofl(machine_config &config) m_c355spr->set_palette(m_c116); m_c355spr->set_scroll_offsets(0, 0); m_c355spr->set_tile_callback(namco_c355spr_device::c355_obj_code2tile_delegate(&namcofl_state::objcode2tile, this)); - m_c355spr->set_palxor(0x0); + m_c355spr->set_mix_callback(FUNC(namcofl_state::sprite_mix_callback)); m_c355spr->set_color_base(0); m_c355spr->set_buffer(1); diff --git a/src/mame/namco/namconb1.cpp b/src/mame/namco/namconb1.cpp index 0f693d1362e57..b86c6e17a7f2e 100644 --- a/src/mame/namco/namconb1.cpp +++ b/src/mame/namco/namconb1.cpp @@ -999,7 +999,7 @@ void namconb1_state::namconb1(machine_config &config) m_c355spr->set_palette(m_c116); m_c355spr->set_scroll_offsets(0x26, 0x19); m_c355spr->set_tile_callback(namco_c355spr_device::c355_obj_code2tile_delegate(&namconb1_state::NB1objcode2tile, this)); - m_c355spr->set_palxor(0x0); + m_c355spr->set_mix_callback(FUNC(namconb1_state::sprite_mix_callback)); m_c355spr->set_buffer(2); // triple buffered m_c355spr->set_color_base(0); m_c355spr->set_draw_2_lists(false); // prevents bad tile on top left of vshoot during certain scenes diff --git a/src/mame/namco/namconb1.h b/src/mame/namco/namconb1.h index 6d67160ee8147..94bdf9d850a9c 100644 --- a/src/mame/namco/namconb1.h +++ b/src/mame/namco/namconb1.h @@ -112,6 +112,7 @@ class namconb1_state : public driver_device u8 port7_r(); template u16 dac_bit_r(); + bool sprite_mix_callback(u16 &dest, u8 &destpri, u16 colbase, u16 src, int srcpri, int pri); u32 screen_update_namconb1(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); void screen_vblank(int state); diff --git a/src/mame/namco/namconb1_v.cpp b/src/mame/namco/namconb1_v.cpp index ae9992d1e1b1a..3f7c9e64f8dfc 100644 --- a/src/mame/namco/namconb1_v.cpp +++ b/src/mame/namco/namconb1_v.cpp @@ -91,6 +91,27 @@ void namconb1_state::screen_vblank(int state) } } +bool namconb1_state::sprite_mix_callback(u16 &dest, u8 &destpri, u16 colbase, u16 src, int srcpri, int pri) +{ + if (srcpri >= destpri) + { + if ((src & 0xff) != 0xff) + { + if (src == 0xffe) + { + dest |= 0x800; + } + else + { + dest = colbase + src; + } + destpri = srcpri; + return true; + } + } + return false; +} + /************************************************************************************************/ u32 namconb1_state::screen_update_namconb1(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) @@ -107,12 +128,12 @@ u32 namconb1_state::screen_update_namconb1(screen_device &screen, bitmap_ind16 & clip &= cliprect; bitmap.fill(m_c116->black_pen(), cliprect); + screen.priority().fill(0, cliprect); for (int pri = 0; pri < 8; pri++) - { - m_c123tmap->draw(screen, bitmap, clip, pri); - m_c355spr->draw(screen, bitmap, clip, pri); - } + m_c123tmap->draw(screen, bitmap, clip, pri, pri, 0); + + m_c355spr->draw(screen, bitmap, clip); return 0; } @@ -153,6 +174,7 @@ u32 namconb2_state::screen_update_namconb2(screen_device &screen, bitmap_ind16 & clip &= cliprect; bitmap.fill(m_c116->black_pen(), cliprect); + screen.priority().fill(0, cliprect); if (memcmp(m_tilemap_tile_bank, m_tilebank32, sizeof(m_tilemap_tile_bank)) != 0) { @@ -161,13 +183,13 @@ u32 namconb2_state::screen_update_namconb2(screen_device &screen, bitmap_ind16 & } for (int pri = 0; pri < 16; pri++) { - m_c169roz->draw(screen, bitmap, clip, pri); + m_c169roz->draw(screen, bitmap, clip, pri, pri, 0); if ((pri & 1) == 0) { - m_c123tmap->draw(screen, bitmap, clip, pri >> 1); + m_c123tmap->draw(screen, bitmap, clip, pri >> 1, pri, 0); } - m_c355spr->draw(screen, bitmap, clip, pri); } + m_c355spr->draw(screen, bitmap, clip); return 0; } diff --git a/src/mame/namco/namcos2.cpp b/src/mame/namco/namcos2.cpp index e9cfa29f8f806..0b90a9f58715d 100644 --- a/src/mame/namco/namcos2.cpp +++ b/src/mame/namco/namcos2.cpp @@ -1774,7 +1774,7 @@ void namcos2_state::configure_c355spr_standard(machine_config &config) m_c355spr->set_palette(m_c116); m_c355spr->set_scroll_offsets(0x26, 0x19); m_c355spr->set_tile_callback(namco_c355spr_device::c355_obj_code2tile_delegate()); - m_c355spr->set_palxor(0x0); + m_c355spr->set_mix_callback(FUNC(namcos2_state::sprite_mix_callback)); m_c355spr->set_color_base(0); } diff --git a/src/mame/namco/namcos2.h b/src/mame/namco/namcos2.h index c613fba2746ab..b9aaf0ddfa1be 100644 --- a/src/mame/namco/namcos2.h +++ b/src/mame/namco/namcos2.h @@ -191,6 +191,12 @@ enum std::unique_ptr m_eeprom; + required_shared_ptr m_dpram; /* 2Kx8 */ + optional_shared_ptr m_spriteram; + u16 m_gfx_ctrl = 0; + u8 m_finallap_prot_count = 0; + bool m_sendval = false; + u16 dpram_word_r(offs_t offset); virtual void dpram_word_w(offs_t offset, u16 data, u16 mem_mask = ~0); u8 dpram_byte_r(offs_t offset); @@ -210,6 +216,7 @@ enum void video_start_metlhawk(); void video_start_sgunner(); + bool sprite_mix_callback(u16 &dest, u8 &destpri, u16 colbase, u16 src, int srcpri, int pri); u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); u32 screen_update_finallap(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); u32 screen_update_luckywld(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); @@ -227,12 +234,6 @@ enum int get_pos_irq_scanline() { return (m_c116->get_reg(5) - 32) & 0xff; } TIMER_DEVICE_CALLBACK_MEMBER(screen_scanline); - required_shared_ptr m_dpram; /* 2Kx8 */ - optional_shared_ptr m_spriteram; - u16 m_gfx_ctrl = 0; - u8 m_finallap_prot_count = 0; - bool m_sendval = false; - optional_device m_c45_road; optional_device m_ns2sprite; optional_device m_ns2roz; diff --git a/src/mame/namco/namcos21_c67.cpp b/src/mame/namco/namcos21_c67.cpp index 4ac77ad478e7e..08cb640595a2f 100644 --- a/src/mame/namco/namcos21_c67.cpp +++ b/src/mame/namco/namcos21_c67.cpp @@ -326,36 +326,37 @@ class namcos21_c67_state : public driver_device required_device m_screen; required_memory_bank m_audiobank; required_region_ptr m_c140_region; - required_shared_ptr m_dpram; + required_shared_ptr m_dpram; required_device m_namcos21_3d; required_device m_namcos21_dsp_c67; - uint16_t m_video_enable; + u16 m_video_enable = 0; - uint16_t video_enable_r(); - void video_enable_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + u16 video_enable_r(); + void video_enable_w(offs_t offset, u16 data, u16 mem_mask = ~0); - uint16_t dpram_word_r(offs_t offset); - void dpram_word_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - uint8_t dpram_byte_r(offs_t offset); - void dpram_byte_w(offs_t offset, uint8_t data); + u16 dpram_word_r(offs_t offset); + void dpram_word_w(offs_t offset, u16 data, u16 mem_mask = ~0); + u8 dpram_byte_r(offs_t offset); + void dpram_byte_w(offs_t offset, u8 data); - void eeprom_w(offs_t offset, uint8_t data); - uint8_t eeprom_r(offs_t offset); + void eeprom_w(offs_t offset, u8 data); + u8 eeprom_r(offs_t offset); - void sound_bankselect_w(uint8_t data); + void sound_bankselect_w(u8 data); - void sound_reset_w(uint8_t data); - void system_reset_w(uint8_t data); + void sound_reset_w(u8 data); + void system_reset_w(u8 data); void reset_all_subcpus(int state); - std::unique_ptr m_eeprom; + std::unique_ptr m_eeprom; TIMER_DEVICE_CALLBACK_MEMBER(screen_scanline); void yield_hack(int state); - uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + bool sprite_mix_callback(u16 &dest, u8 &destpri, u16 colbase, u16 src, int srcpri, int pri); + u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); void configure_c68_namcos21(machine_config &config); @@ -368,43 +369,66 @@ class namcos21_c67_state : public driver_device }; -uint32_t namcos21_c67_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +bool namcos21_c67_state::sprite_mix_callback(u16 &dest, u8 &destpri, u16 colbase, u16 src, int srcpri, int pri) { - //uint8_t *videoram = m_gpu_videoram.get(); + if (srcpri == pri) + { + if ((src & 0xff) != 0xff) + { + switch (src & 0xff) + { + case 0: + dest = 0x4000 | (dest & 0x1fff); + break; + case 1: + dest = 0x6000 | (dest & 0x1fff); + break; + default: + dest = colbase + (src ^ 0xf00); + break; + } + return true; + } + } + return false; +} + +u32 namcos21_c67_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + //u8 *videoram = m_gpu_videoram.get(); int pivot = 3; - int pri; - bitmap.fill(0xff, cliprect ); + bitmap.fill(0xff, cliprect); screen.priority().fill(0, cliprect); m_c355spr->build_sprite_list_and_render_sprites(cliprect); // TODO : buffered? - m_c355spr->draw(screen, bitmap, cliprect, 2 ); + m_c355spr->draw(screen, bitmap, cliprect, 2); m_namcos21_3d->copy_visible_poly_framebuffer(bitmap, cliprect, 0x7fc0, 0x7ffe); - m_c355spr->draw(screen, bitmap, cliprect, 0 ); - m_c355spr->draw(screen, bitmap, cliprect, 1 ); + m_c355spr->draw(screen, bitmap, cliprect, 0); + m_c355spr->draw(screen, bitmap, cliprect, 1); m_namcos21_3d->copy_visible_poly_framebuffer(bitmap, cliprect, 0, 0x7fbf); /* draw high priority 2d sprites */ - for( pri=pivot; pri<8; pri++ ) + for (int pri = pivot; pri < 8; pri++) { - m_c355spr->draw(screen, bitmap, cliprect, pri ); + m_c355spr->draw(screen, bitmap, cliprect, pri); } return 0; } -uint16_t namcos21_c67_state::video_enable_r() +u16 namcos21_c67_state::video_enable_r() { return m_video_enable; } -void namcos21_c67_state::video_enable_w(offs_t offset, uint16_t data, uint16_t mem_mask) +void namcos21_c67_state::video_enable_w(offs_t offset, u16 data, u16 mem_mask) { COMBINE_DATA( &m_video_enable ); /* 0x40 = enable */ - if( m_video_enable!=0 && m_video_enable!=0x40 ) + if (m_video_enable != 0 && m_video_enable != 0x40) { - logerror( "unexpected video_enable_w=0x%x\n", m_video_enable ); + logerror("%s: unexpected video_enable_w=0x%x\n", machine().describe_context(), m_video_enable); } } @@ -412,25 +436,25 @@ void namcos21_c67_state::video_enable_w(offs_t offset, uint16_t data, uint16_t m /* dual port ram memory handlers */ -uint16_t namcos21_c67_state::dpram_word_r(offs_t offset) +u16 namcos21_c67_state::dpram_word_r(offs_t offset) { return m_dpram[offset]; } -void namcos21_c67_state::dpram_word_w(offs_t offset, uint16_t data, uint16_t mem_mask) +void namcos21_c67_state::dpram_word_w(offs_t offset, u16 data, u16 mem_mask) { - if( ACCESSING_BITS_0_7 ) + if (ACCESSING_BITS_0_7) { m_dpram[offset] = data&0xff; } } -uint8_t namcos21_c67_state::dpram_byte_r(offs_t offset) +u8 namcos21_c67_state::dpram_byte_r(offs_t offset) { return m_dpram[offset]; } -void namcos21_c67_state::dpram_byte_w(offs_t offset, uint8_t data) +void namcos21_c67_state::dpram_byte_w(offs_t offset, u8 data) { m_dpram[offset] = data; } @@ -692,13 +716,13 @@ static INPUT_PORTS_START( aircomb ) INPUT_PORTS_END -void namcos21_c67_state::sound_bankselect_w(uint8_t data) +void namcos21_c67_state::sound_bankselect_w(u8 data) { m_audiobank->set_entry(data>>4); } -void namcos21_c67_state::sound_reset_w(uint8_t data) +void namcos21_c67_state::sound_reset_w(u8 data) { if (data & 0x01) { @@ -718,7 +742,7 @@ void namcos21_c67_state::sound_reset_w(uint8_t data) } } -void namcos21_c67_state::system_reset_w(uint8_t data) +void namcos21_c67_state::system_reset_w(u8 data) { reset_all_subcpus(data & 1 ? CLEAR_LINE : ASSERT_LINE); @@ -733,12 +757,12 @@ void namcos21_c67_state::reset_all_subcpus(int state) m_namcos21_dsp_c67->reset_dsps(state); } -void namcos21_c67_state::eeprom_w(offs_t offset, uint8_t data) +void namcos21_c67_state::eeprom_w(offs_t offset, u8 data) { m_eeprom[offset] = data; } -uint8_t namcos21_c67_state::eeprom_r(offs_t offset) +u8 namcos21_c67_state::eeprom_r(offs_t offset) { return m_eeprom[offset]; } @@ -758,10 +782,10 @@ void namcos21_c67_state::machine_reset() void namcos21_c67_state::machine_start() { - m_eeprom = std::make_unique(0x2000); + m_eeprom = std::make_unique(0x2000); subdevice("nvram")->set_base(m_eeprom.get(), 0x2000); - uint32_t max = memregion("audiocpu")->bytes() / 0x4000; + u32 max = memregion("audiocpu")->bytes() / 0x4000; for (int i = 0; i < 0x10; i++) m_audiobank->configure_entry(i, memregion("audiocpu")->base() + (i % max) * 0x4000); @@ -773,7 +797,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(namcos21_c67_state::screen_scanline) int scanline = param; // int cur_posirq = get_posirq_scanline()*2; - if(scanline == 240*2) + if (scanline == 240*2) { m_master_intc->vblank_irq_trigger(); m_slave_intc->vblank_irq_trigger(); @@ -836,7 +860,7 @@ void namcos21_c67_state::namcos21(machine_config &config) m_c355spr->set_palette(m_palette); m_c355spr->set_scroll_offsets(0x26, 0x19); m_c355spr->set_tile_callback(namco_c355spr_device::c355_obj_code2tile_delegate()); - m_c355spr->set_palxor(0xf); // reverse mapping + m_c355spr->set_mix_callback(FUNC(namcos21_c67_state::sprite_mix_callback)); m_c355spr->set_color_base(0x1000); m_c355spr->set_external_prifill(true); @@ -1226,7 +1250,7 @@ ROM_END void namcos21_c67_state::init_solvalou() { - uint16_t *mem = (uint16_t *)memregion("maincpu")->base(); + u16 *mem = (u16 *)memregion("maincpu")->base(); mem[0x20ce4/2+1] = 0x0000; // $200128 mem[0x20cf4/2+0] = 0x4e71; // 2nd ptr_booting mem[0x20cf4/2+1] = 0x4e71; diff --git a/src/mame/namco/namcos21_de.cpp b/src/mame/namco/namcos21_de.cpp index 6b41f9c75ce43..3c758c8a3628a 100644 --- a/src/mame/namco/namcos21_de.cpp +++ b/src/mame/namco/namcos21_de.cpp @@ -58,7 +58,7 @@ class namco_de_pcbstack_device : public device_t { public: // construction/destruction - namco_de_pcbstack_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + namco_de_pcbstack_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); void configure_c148_standard(machine_config &config); @@ -85,34 +85,35 @@ class namco_de_pcbstack_device : public device_t required_device m_screen; required_memory_bank m_audiobank; required_region_ptr m_c140_region; - required_shared_ptr m_dpram; + required_shared_ptr m_dpram; required_device m_namcos21_3d; required_device m_namcos21_dsp; - uint16_t m_video_enable; + u16 m_video_enable = 0; - uint16_t video_enable_r(); - void video_enable_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + u16 video_enable_r(); + void video_enable_w(offs_t offset, u16 data, u16 mem_mask = ~0); - uint16_t dpram_word_r(offs_t offset); - void dpram_word_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - uint8_t dpram_byte_r(offs_t offset); - void dpram_byte_w(offs_t offset, uint8_t data); + u16 dpram_word_r(offs_t offset); + void dpram_word_w(offs_t offset, u16 data, u16 mem_mask = ~0); + u8 dpram_byte_r(offs_t offset); + void dpram_byte_w(offs_t offset, u8 data); - void eeprom_w(offs_t offset, uint8_t data); - uint8_t eeprom_r(offs_t offset); + void eeprom_w(offs_t offset, u8 data); + u8 eeprom_r(offs_t offset); - void sound_bankselect_w(uint8_t data); + void sound_bankselect_w(u8 data); - void sound_reset_w(uint8_t data); - void system_reset_w(uint8_t data); + void sound_reset_w(u8 data); + void system_reset_w(u8 data); void reset_all_subcpus(int state); - std::unique_ptr m_eeprom; + std::unique_ptr m_eeprom; TIMER_DEVICE_CALLBACK_MEMBER(screen_scanline); - uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + bool sprite_mix_callback(u16 &dest, u8 &destpri, u16 colbase, u16 src, int srcpri, int pri); + u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); void configure_c68_namcos21(machine_config &config); @@ -128,7 +129,7 @@ class namco_de_pcbstack_device : public device_t DEFINE_DEVICE_TYPE(NAMCO_DE_PCB, namco_de_pcbstack_device, "namco_de_pcb", "Namco Driver's Eyes PCB stack") -namco_de_pcbstack_device::namco_de_pcbstack_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : +namco_de_pcbstack_device::namco_de_pcbstack_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : device_t(mconfig, NAMCO_DE_PCB, tag, owner, clock), m_maincpu(*this, "maincpu"), m_audiocpu(*this, "audiocpu"), @@ -197,7 +198,7 @@ void namco_de_pcbstack_device::device_add_mconfig(machine_config &config) m_c355spr->set_palette(m_palette); m_c355spr->set_scroll_offsets(0x26, 0x19); m_c355spr->set_tile_callback(namco_c355spr_device::c355_obj_code2tile_delegate()); - m_c355spr->set_palxor(0xf); // reverse mapping + m_c355spr->set_mix_callback(FUNC(namco_de_pcbstack_device::sprite_mix_callback)); m_c355spr->set_color_base(0x1000); m_c355spr->set_external_prifill(true); @@ -213,47 +214,70 @@ void namco_de_pcbstack_device::device_add_mconfig(machine_config &config) } -uint32_t namco_de_pcbstack_device::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +bool namco_de_pcbstack_device::sprite_mix_callback(u16 &dest, u8 &destpri, u16 colbase, u16 src, int srcpri, int pri) { - //uint8_t *videoram = m_gpu_videoram.get(); + if (srcpri == pri) + { + if ((src & 0xff) != 0xff) + { + switch (src & 0xff) + { + case 0: + dest = 0x4000 | (dest & 0x1fff); + break; + case 1: + dest = 0x6000 | (dest & 0x1fff); + break; + default: + dest = colbase + (src ^ 0xf00); + break; + } + return true; + } + } + return false; +} + +u32 namco_de_pcbstack_device::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + //u8 *videoram = m_gpu_videoram.get(); int pivot = 3; - int pri; - bitmap.fill(0xff, cliprect ); + bitmap.fill(0xff, cliprect); screen.priority().fill(0, cliprect); m_c355spr->build_sprite_list_and_render_sprites(cliprect); // TODO : buffered? - m_c355spr->draw(screen, bitmap, cliprect, 2 ); - m_c355spr->draw(screen, bitmap, cliprect, 14 ); //driver's eyes + m_c355spr->draw(screen, bitmap, cliprect, 2); + m_c355spr->draw(screen, bitmap, cliprect, 14); //driver's eyes m_namcos21_3d->copy_visible_poly_framebuffer(bitmap, cliprect, 0x7fc0, 0x7ffe); - m_c355spr->draw(screen, bitmap, cliprect, 0 ); - m_c355spr->draw(screen, bitmap, cliprect, 1 ); + m_c355spr->draw(screen, bitmap, cliprect, 0); + m_c355spr->draw(screen, bitmap, cliprect, 1); m_namcos21_3d->copy_visible_poly_framebuffer(bitmap, cliprect, 0, 0x7fbf); - for (pri = pivot; pri < 8; pri++) + for (int pri = pivot; pri < 8; pri++) { m_c355spr->draw(screen, bitmap, cliprect, pri); } - m_c355spr->draw(screen, bitmap, cliprect, 15 ); //driver's eyes + m_c355spr->draw(screen, bitmap, cliprect, 15); //driver's eyes return 0; } -uint16_t namco_de_pcbstack_device::video_enable_r() +u16 namco_de_pcbstack_device::video_enable_r() { return m_video_enable; } -void namco_de_pcbstack_device::video_enable_w(offs_t offset, uint16_t data, uint16_t mem_mask) +void namco_de_pcbstack_device::video_enable_w(offs_t offset, u16 data, u16 mem_mask) { COMBINE_DATA( &m_video_enable ); /* 0x40 = enable */ - if( m_video_enable!=0 && m_video_enable!=0x40 ) + if (m_video_enable != 0 && m_video_enable != 0x40 ) { - logerror( "unexpected video_enable_w=0x%x\n", m_video_enable ); + logerror("%s: unexpected video_enable_w=0x%x\n", machine().describe_context(), m_video_enable); } } @@ -261,25 +285,25 @@ void namco_de_pcbstack_device::video_enable_w(offs_t offset, uint16_t data, uint /* dual port ram memory handlers */ -uint16_t namco_de_pcbstack_device::dpram_word_r(offs_t offset) +u16 namco_de_pcbstack_device::dpram_word_r(offs_t offset) { return m_dpram[offset]; } -void namco_de_pcbstack_device::dpram_word_w(offs_t offset, uint16_t data, uint16_t mem_mask) +void namco_de_pcbstack_device::dpram_word_w(offs_t offset, u16 data, u16 mem_mask) { - if( ACCESSING_BITS_0_7 ) + if (ACCESSING_BITS_0_7) { m_dpram[offset] = data&0xff; } } -uint8_t namco_de_pcbstack_device::dpram_byte_r(offs_t offset) +u8 namco_de_pcbstack_device::dpram_byte_r(offs_t offset) { return m_dpram[offset]; } -void namco_de_pcbstack_device::dpram_byte_w(offs_t offset, uint8_t data) +void namco_de_pcbstack_device::dpram_byte_w(offs_t offset, u8 data) { m_dpram[offset] = data; } @@ -382,12 +406,12 @@ void namco_de_pcbstack_device::driveyes_slave_map(address_map &map) map(0x1c0000, 0x1fffff).m(m_slave_intc, FUNC(namco_c148_device::map)); } -void namco_de_pcbstack_device::sound_bankselect_w(uint8_t data) +void namco_de_pcbstack_device::sound_bankselect_w(u8 data) { m_audiobank->set_entry(data>>4); } -void namco_de_pcbstack_device::sound_reset_w(uint8_t data) +void namco_de_pcbstack_device::sound_reset_w(u8 data) { if (data & 0x01) { @@ -402,7 +426,7 @@ void namco_de_pcbstack_device::sound_reset_w(uint8_t data) } } -void namco_de_pcbstack_device::system_reset_w(uint8_t data) +void namco_de_pcbstack_device::system_reset_w(u8 data) { reset_all_subcpus(data & 1 ? CLEAR_LINE : ASSERT_LINE); @@ -416,12 +440,12 @@ void namco_de_pcbstack_device::reset_all_subcpus(int state) m_c68->ext_reset(state); } -void namco_de_pcbstack_device::eeprom_w(offs_t offset, uint8_t data) +void namco_de_pcbstack_device::eeprom_w(offs_t offset, u8 data) { m_eeprom[offset] = data; } -uint8_t namco_de_pcbstack_device::eeprom_r(offs_t offset) +u8 namco_de_pcbstack_device::eeprom_r(offs_t offset) { return m_eeprom[offset]; } @@ -432,7 +456,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(namco_de_pcbstack_device::screen_scanline) int scanline = param; // int cur_posirq = get_posirq_scanline()*2; - if(scanline == 240*2) + if (scanline == 240*2) { m_master_intc->vblank_irq_trigger(); m_slave_intc->vblank_irq_trigger(); @@ -453,10 +477,10 @@ void namco_de_pcbstack_device::configure_c148_standard(machine_config &config) void namco_de_pcbstack_device::device_start() { - m_eeprom = std::make_unique(0x2000); + m_eeprom = std::make_unique(0x2000); subdevice("nvram")->set_base(m_eeprom.get(), 0x2000); - uint32_t max = memregion("audiocpu")->bytes() / 0x4000; + u32 max = memregion("audiocpu")->bytes() / 0x4000; for (int i = 0; i < 0x10; i++) m_audiobank->configure_entry(i, memregion("audiocpu")->base() + (i % max) * 0x4000); diff --git a/src/mame/namco/namcos2_v.cpp b/src/mame/namco/namcos2_v.cpp index 8205ca1691d76..f1b8b1c0e8568 100644 --- a/src/mame/namco/namcos2_v.cpp +++ b/src/mame/namco/namcos2_v.cpp @@ -65,6 +65,27 @@ void namcos2_state::create_shadow_table() } } +bool namcos2_state::sprite_mix_callback(u16 &dest, u8 &destpri, u16 colbase, u16 src, int srcpri, int pri) +{ + if (srcpri >= destpri) + { + if ((src & 0xff) != 0xff) + { + if (src == 0xffe) + { + dest |= 0x800; + } + else + { + dest = colbase + src; + } + destpri = srcpri; + return true; + } + } + return false; +} + /**************************************************************************/ void namcos2_state::video_start() @@ -130,7 +151,7 @@ u32 namcos2_state::screen_update_finallap(screen_device &screen, bitmap_ind16 &b { m_c123tmap->draw(screen, bitmap, clip, pri / 2); } - m_c45_road->draw(bitmap, clip, pri); + m_c45_road->draw(screen, bitmap, clip, pri); m_ns2sprite->draw_sprites(screen, bitmap, clip, pri, m_gfx_ctrl); } return 0; @@ -163,21 +184,21 @@ u32 namcos2_state::screen_update_luckywld(screen_device &screen, bitmap_ind16 &b rectangle clip; bitmap.fill(m_c116->black_pen(), cliprect); + screen.priority().fill(0, cliprect); apply_clip(clip, cliprect); for (int pri = 0; pri < 16; pri++) { if ((pri & 1) == 0) { - m_c123tmap->draw(screen, bitmap, clip, pri / 2); + m_c123tmap->draw(screen, bitmap, clip, pri / 2, pri, 0); } - m_c45_road->draw(bitmap, clip, pri); + m_c45_road->draw(screen, bitmap, clip, pri, pri, 0); if (m_c169roz) - m_c169roz->draw(screen, bitmap, clip, pri); - - m_c355spr->draw(screen, bitmap, clip, pri); + m_c169roz->draw(screen, bitmap, clip, pri, pri, 0); } + m_c355spr->draw(screen, bitmap, clip); return 0; } @@ -192,13 +213,13 @@ u32 namcos2_state::screen_update_sgunner(screen_device &screen, bitmap_ind16 &bi rectangle clip; bitmap.fill(m_c116->black_pen(), cliprect); + screen.priority().fill(0, cliprect); apply_clip(clip, cliprect); for (int pri = 0; pri < 8; pri++) - { - m_c123tmap->draw(screen, bitmap, clip, pri); - m_c355spr->draw(screen, bitmap, clip, pri); - } + m_c123tmap->draw(screen, bitmap, clip, pri, pri, 0); + + m_c355spr->draw(screen, bitmap, clip); return 0; } diff --git a/src/mame/namco/tceptor_v.cpp b/src/mame/namco/tceptor_v.cpp index c74aa3de7ccc0..f97e74110df00 100644 --- a/src/mame/namco/tceptor_v.cpp +++ b/src/mame/namco/tceptor_v.cpp @@ -514,8 +514,8 @@ uint32_t tceptor_state::screen_update_tceptor(screen_device &screen, bitmap_ind1 for (pri = 0; pri < 8; pri++) { - m_c45_road->draw(bitmap, cliprect, pri * 2); - m_c45_road->draw(bitmap, cliprect, pri * 2 + 1); + m_c45_road->draw(screen, bitmap, cliprect, pri * 2); + m_c45_road->draw(screen, bitmap, cliprect, pri * 2 + 1); draw_sprites(bitmap, cliprect, pri); } diff --git a/src/mame/shared/namco_c355spr.cpp b/src/mame/shared/namco_c355spr.cpp index 3f0f85efae712..23654025e1931 100644 --- a/src/mame/shared/namco_c355spr.cpp +++ b/src/mame/shared/namco_c355spr.cpp @@ -72,19 +72,21 @@ namco_c355spr_device::namco_c355spr_device(const machine_config &mconfig, device device_gfx_interface(mconfig, *this), device_video_interface(mconfig, *this), m_pri_cb(*this, DEVICE_SELF, FUNC(namco_c355spr_device::default_priority)), + m_mix_cb(*this, DEVICE_SELF, FUNC(namco_c355spr_device::default_mix)), m_read_spritetile(*this, DEVICE_SELF, FUNC(namco_c355spr_device::read_spritetile)), m_read_spriteformat(*this, DEVICE_SELF, FUNC(namco_c355spr_device::read_spriteformat)), m_read_spritetable(*this, DEVICE_SELF, FUNC(namco_c355spr_device::read_spritetable)), m_read_cliptable(*this, DEVICE_SELF, FUNC(namco_c355spr_device::read_cliptable)), m_read_spritelist(*this, DEVICE_SELF, FUNC(namco_c355spr_device::read_spritelist)), - m_palxor(0), m_buffer(0), m_external_prifill(false), + m_alt_precision(false), + m_transpen(255), m_colbase(0), m_colors(16), m_granularity(256), m_draw_2_lists(true), - m_device_allocates_spriteram_and_bitmaps(true) + m_device_allocates_spriteram(true) { std::fill(std::begin(m_position), std::end(m_position), 0); std::fill(std::begin(m_scrolloffs), std::end(m_scrolloffs), 0); @@ -99,25 +101,20 @@ namco_c355spr_device::namco_c355spr_device(const machine_config &mconfig, const /**************************************************************************************/ -template void namco_c355spr_device::zdrawgfxzoom( - BitmapClass *dest_bmp, const rectangle &clip, gfx_element *gfx, + bitmap_ind16 &dest_bmp, const rectangle &clip, gfx_element *gfx, u32 code, u32 color, bool flipx, bool flipy, int hpos, int vpos, int hsize, int vsize, u8 prival, - - bitmap_ind8 *pri_buffer, - int sprite_screen_width, int sprite_screen_height, - bitmap_ind8 *pri_bitmap) + int sprite_screen_width, int sprite_screen_height) { if (!hsize || !vsize) return; if (!gfx) return; - const u32 pal = gfx->colorbase() + gfx->granularity() * (color % gfx->colors()); - const pen_t *palpen = &gfx->palette().pen(pal); - - const u8 *source_base = gfx->get_data(code % gfx->elements()); if (sprite_screen_width && sprite_screen_height) { + const u32 pal = gfx->colorbase() + gfx->granularity() * (color % gfx->colors()); + + const u8 *source_base = gfx->get_data(code % gfx->elements()); /* compute sprite increment per screen pixel */ int dx = (gfx->width() << 16) / sprite_screen_width; int dy = (gfx->height() << 16) / sprite_screen_height; @@ -176,42 +173,16 @@ void namco_c355spr_device::zdrawgfxzoom( for (int y = vpos; y < ey; y++) { u8 const *const source = source_base + (y_index >> 16) * gfx->rowbytes(); - auto *const dest = &dest_bmp->pix(y); + u16 *const dest = &dest_bmp.pix(y); int x_index = x_index_base; - u8 *pri = nullptr; - - if (dest_bmp->bpp() == 32) - pri = &pri_bitmap->pix(y); - for (int x = hpos; x < ex; x++) { - if (dest_bmp->bpp() == 16) + const u8 c = source[x_index >> 16]; + if (c != m_transpen) { - const u8 c = source[x_index >> 16]; - if (c != 0xff) - { - dest[x] = ((prival & 0xf) << 12) | ((pal + c) & 0xfff); - } - x_index += dx; - } - else if (dest_bmp->bpp() == 32) - { - int c = source[x_index >> 16]; - if (c != 15) - { - if (prival >= pri[x]) - { - dest[x] = palpen[c]; - dest[x] |= 0xff000000; - } - else // sprites can have a 'masking' effect on other sprites - { - dest[x] = 0x00000000; - } - } - - x_index += dx; + dest[x] = ((prival & 0xf) << 12) | ((pal + c) & 0xfff); } + x_index += dx; } y_index += dy; } @@ -219,148 +190,56 @@ void namco_c355spr_device::zdrawgfxzoom( } } -void namco_c355spr_device::copybitmap(bitmap_ind16 &dest_bmp, const rectangle &clip, u8 pri) +bool namco_c355spr_device::default_mix(u16 &dest, u8 &destpri, u16 colbase, u16 src, int srcpri, int pri) { - if (m_palxor) + if ((src & 0xff) != 0xff) { - for (int y = clip.min_y; y <= clip.max_y; y++) - { - u16 *const src = &m_renderbitmap.pix(y); - u16 *const dest = &dest_bmp.pix(y); - for (int x = clip.min_x; x <= clip.max_x; x++) - { - if (src[x] != 0xffff) - { - u8 srcpri = (src[x] >> 12) & 0xf; - u16 c = src[x] & 0xfff; - if (srcpri == pri) - { - if ((c & 0xff) != 0xff) - { - switch (c & 0xff) - { - case 0: - dest[x] = 0x4000|(dest[x] & 0x1fff); - break; - case 1: - dest[x] = 0x6000|(dest[x] & 0x1fff); - break; - default: - dest[x] = gfx(0)->colorbase() + c; - break; - } - } - } - } - } - } + dest = colbase + src; + return true; } - else + return false; +} + +void namco_c355spr_device::copybitmap(screen_device &screen, bitmap_ind16 &dest_bmp, const rectangle &clip, int pri) +{ + for (int y = clip.min_y; y <= clip.max_y; y++) { - for (int y = clip.min_y; y <= clip.max_y; y++) + u16 *const src = &m_renderbitmap.pix(y); + u16 *const dest = &dest_bmp.pix(y); + u8 *const destpri = &screen.priority().pix(y); + for (int x = clip.min_x; x <= clip.max_x; x++) { - u16 *const src = &m_renderbitmap.pix(y); - u16 *const dest = &dest_bmp.pix(y); - for (int x = clip.min_x; x <= clip.max_x; x++) + if (src[x] != 0xffff) { - if (src[x] != 0xffff) - { - u8 srcpri = (src[x] >> 12) & 0xf; - u16 c = src[x] & 0xfff; - if (srcpri == pri) - { - if ((c & 0xff) != 0xff) - { - if (c == 0xffe) - { - dest[x] |= 0x800; - } - else - { - dest[x] = gfx(0)->colorbase() + c; - } - } - } - } + const u8 srcpri = (src[x] >> 12) & 0xf; + const u16 c = src[x] & 0xfff; + m_mix_cb(dest[x], destpri[x], gfx(0)->colorbase(), c, srcpri, pri); } } } } -void namco_c355spr_device::copybitmap(bitmap_rgb32 &dest_bmp, const rectangle &clip, u8 pri) +void namco_c355spr_device::copybitmap(screen_device &screen, bitmap_rgb32 &dest_bmp, const rectangle &clip, int pri) { device_palette_interface &palette = gfx(0)->palette(); - const pen_t *pal = &palette.pen(gfx(0)->colorbase()); - if (m_palxor) - { - for (int y = clip.min_y; y <= clip.max_y; y++) - { - u16 *const src = &m_renderbitmap.pix(y); - u16 *const srcrender = &m_screenbitmap.pix(y); - u32 *const dest = &dest_bmp.pix(y); - for (int x = clip.min_x; x <= clip.max_x; x++) - { - if (src[x] != 0xffff) - { - u8 srcpri = (src[x] >> 12) & 0xf; - u16 c = src[x] & 0xfff; - if (srcpri == pri) - { - if ((c & 0xff) != 0xff) - { - switch (c & 0xff) - { - case 0: - srcrender[x] = 0x4000|(srcrender[x] & 0x1fff); - break; - case 1: - srcrender[x] = 0x6000|(srcrender[x] & 0x1fff); - break; - default: - srcrender[x] = c; - break; - } - dest[x] = pal[srcrender[x]]; - } - } - } - else if (srcrender[x] != 0xffff) - dest[x] = pal[srcrender[x]]; - } - } - } - else + const pen_t *pal = palette.pens(); + for (int y = clip.min_y; y <= clip.max_y; y++) { - for (int y = clip.min_y; y <= clip.max_y; y++) + u16 *const src = &m_renderbitmap.pix(y); + u16 *const srcrender = &m_screenbitmap.pix(y); + u32 *const dest = &dest_bmp.pix(y); + u8 *const destpri = &screen.priority().pix(y); + for (int x = clip.min_x; x <= clip.max_x; x++) { - u16 *const src = &m_renderbitmap.pix(y); - u16 *const srcrender = &m_screenbitmap.pix(y); - u32 *const dest = &dest_bmp.pix(y); - for (int x = clip.min_x; x <= clip.max_x; x++) + if (src[x] != 0xffff) { - if (src[x] != 0xffff) - { - u8 srcpri = (src[x] >> 12) & 0xf; - u16 c = src[x] & 0xfff; - if (srcpri == pri) - { - if ((c & 0xff) != 0xff) - { - if (c == 0xffe) - { - srcrender[x] |= 0x800; - } - else - { - srcrender[x] = c; - } - dest[x] = pal[srcrender[x]]; - } - } - } - else if (srcrender[x] != 0xffff) + const u8 srcpri = (src[x] >> 12) & 0xf; + const u16 c = src[x] & 0xfff; + if (m_mix_cb(srcrender[x], destpri[x], gfx(0)->colorbase(), c, srcpri, pri)) dest[x] = pal[srcrender[x]]; } + else if (srcrender[x] != 0xffff) + dest[x] = pal[gfx(0)->colorbase() + srcrender[x]]; } } } @@ -374,6 +253,9 @@ void namco_c355spr_device::device_start() m_pri_cb.resolve(); + screen().register_screen_bitmap(m_renderbitmap); + screen().register_screen_bitmap(m_screenbitmap); + std::fill(std::begin(m_position), std::end(m_position), 0x0000); for (int i = 0; i < 2; i++) @@ -382,7 +264,7 @@ void namco_c355spr_device::device_start() m_sprite_end[i] = m_spritelist[i].get(); } - if (m_device_allocates_spriteram_and_bitmaps) + if (m_device_allocates_spriteram) { for (int i = 0; i < 2; i++) { @@ -390,9 +272,6 @@ void namco_c355spr_device::device_start() std::fill_n(m_spriteram[i].get(), 0x20000 / 2, 0); save_pointer(NAME(m_spriteram[i]), 0x20000 / 2, i); } - - screen().register_screen_bitmap(m_renderbitmap); - screen().register_screen_bitmap(m_screenbitmap); } m_read_spritetile.resolve(); @@ -400,6 +279,7 @@ void namco_c355spr_device::device_start() m_read_spritetable.resolve(); m_read_cliptable.resolve(); m_read_spritelist.resolve(); + m_mix_cb.resolve(); save_item(NAME(m_position)); @@ -430,7 +310,7 @@ u16 namco_c355spr_device::position_r(offs_t offset) /**************************************************************************************************************/ template -void namco_c355spr_device::draw_sprites(BitmapClass &bitmap, const rectangle &cliprect, int pri) +void namco_c355spr_device::draw_sprites(screen_device &screen, BitmapClass &bitmap, const rectangle &cliprect, int pri) { if (pri == 0) { @@ -440,17 +320,17 @@ void namco_c355spr_device::draw_sprites(BitmapClass &bitmap, const rectangle &cl build_sprite_list_and_render_sprites(cliprect); } } - copybitmap(bitmap, cliprect, pri); + copybitmap(screen, bitmap, cliprect, pri); } void namco_c355spr_device::draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri) { - draw_sprites(bitmap, cliprect, pri); + draw_sprites(screen, bitmap, cliprect, pri); } void namco_c355spr_device::draw(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int pri) { - draw_sprites( bitmap, cliprect, pri); + draw_sprites(screen, bitmap, cliprect, pri); } void namco_c355spr_device::spriteram_w(offs_t offset, u16 data, u16 mem_mask) @@ -470,7 +350,7 @@ void namco_c355spr_device::vblank(int state) if (m_buffer > 0) build_sprite_list_and_render_sprites(screen().visible_area()); - if (m_buffer > 1) + if ((m_buffer > 1) && m_device_allocates_spriteram) std::copy_n(m_spriteram[0].get(), 0x20000/2, m_spriteram[1].get()); } } @@ -494,7 +374,7 @@ u16 namco_c355spr_device::read_spritetile(int entry) u16 namco_c355spr_device::read_spritetable(int entry, u8 attr, int whichlist) { u16 *ram; - int buffer = std::max(0, m_buffer - 1); + const int buffer = std::max(0, m_buffer - 1); if (whichlist == 0) ram = &m_spriteram[buffer][0x00000 / 2]; else @@ -513,7 +393,7 @@ u16 namco_c355spr_device::read_cliptable(int entry, u8 attr) u16 namco_c355spr_device::read_spritelist(int entry, int whichlist) { u16 *ram; - int buffer = std::max(0, m_buffer - 1); + const int buffer = std::max(0, m_buffer - 1); if (whichlist == 0) ram = &m_spriteram[buffer][0x02000 / 2]; else @@ -550,13 +430,12 @@ void namco_c355spr_device::build_sprite_list_and_render_sprites(const rectangle build_sprite_list(1); - render_sprites(cliprect, nullptr, m_renderbitmap, 0); + render_sprites(cliprect); } -template -void namco_c355spr_device::render_sprites(const rectangle cliprect, bitmap_ind8 *pri_bitmap, BitmapClass &temp_bitmap, int alt_precision) +void namco_c355spr_device::render_sprites(const rectangle cliprect) { - temp_bitmap.fill(0xffff, cliprect); + m_renderbitmap.fill(0xffff, cliprect); for (int no = 0; no < 2; no++) { c355_sprite *sprite_ptr = m_spritelist[no].get(); @@ -574,7 +453,7 @@ void namco_c355spr_device::render_sprites(const rectangle cliprect, bitmap_ind8 int sprite_screen_height; int sprite_screen_width; - if (alt_precision) + if (m_alt_precision) { sprite_screen_width = ((sprite_ptr->x[ind] + (sprite_ptr->zoomx[ind] << 4)) >> 16) - (sprite_ptr->x[ind] >> 16); sprite_screen_height = ((sprite_ptr->y[ind] + (sprite_ptr->zoomy[ind] << 4)) >> 16) - (sprite_ptr->y[ind] >> 16); @@ -586,7 +465,7 @@ void namco_c355spr_device::render_sprites(const rectangle cliprect, bitmap_ind8 } zdrawgfxzoom( - &temp_bitmap, + m_renderbitmap, clip, gfx(0), m_code2tile(sprite_ptr->tile[ind]) + sprite_ptr->offset, @@ -594,9 +473,7 @@ void namco_c355spr_device::render_sprites(const rectangle cliprect, bitmap_ind8 sprite_ptr->flipx, sprite_ptr->flipy, sprite_ptr->x[ind] >> 16, sprite_ptr->y[ind] >> 16, sprite_ptr->zoomx[ind], sprite_ptr->zoomy[ind], sprite_ptr->pri, - nullptr, - sprite_screen_width, sprite_screen_height, - pri_bitmap); + sprite_screen_width, sprite_screen_height); } } } @@ -605,32 +482,13 @@ void namco_c355spr_device::render_sprites(const rectangle cliprect, bitmap_ind8 } } -void namco_c355spr_device::copybitmap(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, bitmap_ind8 &pri_bitmap, bitmap_rgb32 &temp_bitmap) -{ - for (int y = cliprect.top(); y <= cliprect.bottom(); y++) - { - u32 const *const src = &temp_bitmap.pix(y); - u32 *const dst = &bitmap.pix(y); - - for (int x = cliprect.left(); x <= cliprect.right(); x++) - { - u32 const srcpix = src[x]; - - if ((srcpix & 0xff000000) == 0xff000000) - { - dst[x] = srcpix & 0x00ffffff; - } - } - } -} - -void namco_c355spr_device::draw_dg(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, bitmap_ind8 &pri_bitmap, bitmap_rgb32 &temp_bitmap) +void namco_c355spr_device::draw_dg(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { build_sprite_list(0); - render_sprites(cliprect, &pri_bitmap, temp_bitmap, 1); + render_sprites(cliprect); - copybitmap(screen, bitmap, cliprect, pri_bitmap, temp_bitmap); + copybitmap(screen, bitmap, cliprect); } void namco_c355spr_device::get_single_sprite(u16 which, c355_sprite *sprite_ptr, int no) @@ -642,7 +500,7 @@ void namco_c355spr_device::get_single_sprite(u16 which, c355_sprite *sprite_ptr, */ const u16 palette = m_read_spritetable(which, 6, no); - int priority = m_pri_cb(palette); + const int priority = m_pri_cb(palette); if (priority == -1) { @@ -661,16 +519,12 @@ void namco_c355spr_device::get_single_sprite(u16 which, c355_sprite *sprite_ptr, /* m_read_spritetable(which, 6, no) contains priority/palette */ /* m_read_spritetable(which, 7, no) is used in Lucky & Wild, possibly for sprite-road priority */ - int xscroll = (s16)m_position[1]; - int yscroll = (s16)m_position[0]; - - xscroll &= 0x1ff; if (xscroll & 0x100) xscroll |= ~0x1ff; - yscroll &= 0x1ff; if (yscroll & 0x100) yscroll |= ~0x1ff; + int xscroll = util::sext(m_position[1], 9); + int yscroll = util::sext(m_position[0], 9); if (screen().height() > 384) { /* Medium Resolution: system21 adjust */ - xscroll = (s16)m_position[1]; - xscroll &= 0x3ff; if (xscroll & 0x200) xscroll |= ~0x3ff; + xscroll = util::sext(m_position[1], 10); if (yscroll < 0) { /* solvalou */ yscroll += 0x20; @@ -686,13 +540,13 @@ void namco_c355spr_device::get_single_sprite(u16 which, c355_sprite *sprite_ptr, hpos -= xscroll; vpos -= yscroll; - int clipentry = (palette >> 8) & 0xf; + const int clipentry = (palette >> 8) & 0xf; rectangle clip; clip.set(m_read_cliptable(clipentry, 0) - xscroll, m_read_cliptable(clipentry, 1) - xscroll, m_read_cliptable(clipentry, 2) - yscroll, m_read_cliptable(clipentry, 3) - yscroll); sprite_ptr->clip = clip; - hpos &= 0x7ff; if (hpos & 0x400) hpos |= ~0x7ff; /* sign extend */ - vpos &= 0x7ff; if (vpos & 0x400) vpos |= ~0x7ff; /* sign extend */ + hpos = util::sext(hpos & 0x7ff, 11); /* sign extend */ + vpos = util::sext(vpos & 0x7ff, 11); /* sign extend */ int tile_index = m_read_spriteformat(spriteformatram_offset, 0); const u16 format = m_read_spriteformat(spriteformatram_offset, 1); @@ -746,7 +600,7 @@ void namco_c355spr_device::get_single_sprite(u16 which, c355_sprite *sprite_ptr, sprite_ptr->flipx = flipx; sprite_ptr->flipy = flipy; sprite_ptr->size = num_rows * num_cols; - sprite_ptr->color = (palette & (m_colors-1)) ^ m_palxor; + sprite_ptr->color = palette & (m_colors - 1); u32 source_height_remaining = num_rows * 16; u32 screen_height_remaining = vsize; diff --git a/src/mame/shared/namco_c355spr.h b/src/mame/shared/namco_c355spr.h index cc261615b571e..18f7744c2ae20 100644 --- a/src/mame/shared/namco_c355spr.h +++ b/src/mame/shared/namco_c355spr.h @@ -14,21 +14,22 @@ class namco_c355spr_device : public device_t, public device_gfx_interface, publi // construction/destruction namco_c355spr_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0); + void set_transparent_pen(u8 transpen) { m_transpen = transpen; } void set_color_base(u16 base) { m_colbase = base; } void set_scroll_offsets(int x, int y) { m_scrolloffs[0] = x; m_scrolloffs[1] = y; } //void set_ram_words(u32 size) { m_ramsize = size; } - void set_palxor(int palxor) { m_palxor = palxor; } void set_buffer(int buffer) { m_buffer = buffer; } void set_external_prifill(bool external) { m_external_prifill = external; } + void set_alt_precision(bool alt_precision) { m_alt_precision = alt_precision; } void set_colors(int colors) { m_colors = colors; } void set_granularity(int granularity) { m_granularity = granularity; } void set_draw_2_lists(bool draw_2_lists) { m_draw_2_lists = draw_2_lists; } // the Namco code currently requires us to allocate memory in the device, the Data East hookup uses access callbacks - void set_device_allocates_spriteram_and_bitmaps(bool allocate_memory) { m_device_allocates_spriteram_and_bitmaps = allocate_memory; } - + void set_device_allocates_spriteram(bool allocate_memory) { m_device_allocates_spriteram = allocate_memory; } template void set_priority_callback(T &&... args) { m_pri_cb.set(std::forward(args)...); } + template void set_mix_callback(T &&... args) { m_mix_cb.set(std::forward(args)...); } template void set_read_spritetile(T &&... args) { m_read_spritetile.set(std::forward(args)...); } template void set_read_spriteformat(T &&... args) { m_read_spriteformat.set(std::forward(args)...); } template void set_read_spritetable(T &&... args) { m_read_spritetable.set(std::forward(args)...); } @@ -47,6 +48,7 @@ class namco_c355spr_device : public device_t, public device_gfx_interface, publi typedef device_delegate c355_obj_entry_delegate; typedef device_delegate c355_obj_entry_which_delegate; typedef device_delegate c355_priority_delegate; + typedef device_delegate c355_mix_delegate; void set_tile_callback(c355_obj_code2tile_delegate cb) { @@ -57,15 +59,14 @@ class namco_c355spr_device : public device_t, public device_gfx_interface, publi } - void draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri); - void draw(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int pri); + void draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri = 0); + void draw(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int pri = 0); - void draw_dg(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, bitmap_ind8 &pri_bitmap, bitmap_rgb32 &temp_bitmap); + void draw_dg(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); void build_sprite_list_and_render_sprites(const rectangle cliprect); - template - void render_sprites(const rectangle cliprect, bitmap_ind8 *pri_bitmap, BitmapClass &temp_bitmap, int alt_precision); + void render_sprites(const rectangle cliprect); void clear_screen_bitmap() { m_screenbitmap.fill(0xffff); } void clear_screen_bitmap(const rectangle cliprect) { m_screenbitmap.fill(0xffff, cliprect); } @@ -80,6 +81,7 @@ class namco_c355spr_device : public device_t, public device_gfx_interface, publi c355_obj_code2tile_delegate m_code2tile; c355_priority_delegate m_pri_cb; + c355_mix_delegate m_mix_cb; c355_obj_entry_delegate m_read_spritetile; c355_obj_entry_attr_delegate m_read_spriteformat; c355_obj_entry_attr_which_delegate m_read_spritetable; @@ -93,22 +95,20 @@ class namco_c355spr_device : public device_t, public device_gfx_interface, publi u16 read_spritelist(int entry, int whichlist); int default_priority(int pal_pri) { return ((pal_pri >> 4) & 0xf); } + bool default_mix(u16 &dest, u8 &destpri, u16 colbase, u16 src, int srcpri, int pri); // decoding info DECLARE_GFXDECODE_MEMBER(gfxinfo); // general - template void zdrawgfxzoom( - BitmapClass *dest_bmp, const rectangle &clip, gfx_element *gfx, + bitmap_ind16 &dest_bmp, const rectangle &clip, gfx_element *gfx, u32 code, u32 color, bool flipx, bool flipy, int sx, int sy, int scalex, int scaley, u8 prival, - bitmap_ind8 *pri_buffer, - int sprite_screen_width, int sprite_screen_height, - bitmap_ind8 *pri_bitmap); + int sprite_screen_width, int sprite_screen_height); struct c355_sprite { @@ -126,7 +126,6 @@ class namco_c355spr_device : public device_t, public device_gfx_interface, publi std::unique_ptr m_spritelist[2]; const c355_sprite *m_sprite_end[2]{}; - int m_palxor; u16 m_position[4]; std::unique_ptr m_spriteram[2]; bitmap_ind16 m_renderbitmap; @@ -135,10 +134,8 @@ class namco_c355spr_device : public device_t, public device_gfx_interface, publi void build_sprite_list(int no); private: - void copybitmap(bitmap_ind16 &dest_bmp, const rectangle &clip, u8 pri); - void copybitmap(bitmap_rgb32 &dest_bmp, const rectangle &clip, u8 pri); - - void copybitmap(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, bitmap_ind8 &pri_bitmap, bitmap_rgb32 &temp_bitmap); + void copybitmap(screen_device &screen, bitmap_ind16 &dest_bmp, const rectangle &clip, int pri = 0); + void copybitmap(screen_device &screen, bitmap_rgb32 &dest_bmp, const rectangle &clip, int pri = 0); // C355 Motion Object Emulation // for pal_xor, supply either 0x0 (normal) or 0xf (palette mapping reversed) @@ -146,19 +143,20 @@ class namco_c355spr_device : public device_t, public device_gfx_interface, publi // C355 Motion Object internals void get_single_sprite(u16 which, c355_sprite *sprite_ptr, int no); - template void draw_sprites(BitmapClass &bitmap, const rectangle &cliprect, int pri); - + template void draw_sprites(screen_device &screen, BitmapClass &bitmap, const rectangle &cliprect, int pri = 0); int m_scrolloffs[2]; //u32 m_ramsize; int m_buffer; bool m_external_prifill; + bool m_alt_precision; + u8 m_transpen; u16 m_colbase; int m_colors; int m_granularity; bool m_draw_2_lists; - bool m_device_allocates_spriteram_and_bitmaps; + bool m_device_allocates_spriteram; }; // device type definition