From 9b2fa37c944113cd7924d9f41ef6131fdbf4b935 Mon Sep 17 00:00:00 2001 From: David Haywood <28625134+DavidHaywood@users.noreply.github.com> Date: Sat, 6 Jun 2020 23:09:06 +0100 Subject: Plug and Play work (new working machine) (#6800) * SunPlus current progres (nw) * defer expensve operation (nw) * new WORKING machine ---- Millennium M521 Arcade Neo 2.0 (Family Sport 220-in-1) [TeamEurope, David Haywood] - reworked / tweaked some of the SPG rendering based on my own research (nw) * param no longer required (nw) * move speedups (nw) * (nw) * fix asror, fixes piggy golf and ball shooter on unsp20 (nw) --- src/devices/cpu/unsp/unsp_exxx.cpp | 12 ++- src/devices/machine/generalplus_gpl16250soc.cpp | 17 ---- src/devices/machine/generalplus_gpl16250soc.h | 9 +- .../machine/generalplus_gpl16250soc_video.cpp | 14 ++- src/devices/machine/spg2xx_video.cpp | 10 +- src/devices/machine/spg_renderer.cpp | 111 +++++++++++++-------- src/devices/machine/spg_renderer.h | 33 ++++-- src/mame/drivers/generalplus_gpl16250_romram.cpp | 37 ++++++- src/mame/drivers/spg2xx_zone_32bit.cpp | 56 ++++++++--- src/mame/includes/generalplus_gpl16250_romram.h | 19 +++- src/mame/mame.lst | 1 + 11 files changed, 213 insertions(+), 106 deletions(-) diff --git a/src/devices/cpu/unsp/unsp_exxx.cpp b/src/devices/cpu/unsp/unsp_exxx.cpp index 89cbb8d95fd..38a15fe94d4 100644 --- a/src/devices/cpu/unsp/unsp_exxx.cpp +++ b/src/devices/cpu/unsp/unsp_exxx.cpp @@ -211,11 +211,17 @@ void unsp_12_device::execute_exxx_group(uint16_t op) const uint16_t opb = op & 7; m_core->m_icount -= 12; // unknown + + LOGMASKED(LOG_UNSP_MULS, "%s: MUL uu with %04x (unsigned) * %04x (unsigned) (fra:%d) :\n", machine().describe_context(), m_core->m_r[opa], m_core->m_r[opb], m_core->m_fra); + lres = m_core->m_r[opa] * m_core->m_r[opb]; m_core->m_r[REG_R4] = lres >> 16; m_core->m_r[REG_R3] = (uint16_t)lres; + + LOGMASKED(LOG_UNSP_MULS, "result was : %08x\n", lres); + return; - } + } else if (((op & 0xf180) == 0xe080)) { // MULS 1 1 1 0* r r r S* 1 s s s s r r r (* = sign bit, fixed here) @@ -276,7 +282,7 @@ void unsp_12_device::execute_exxx_group(uint16_t op) return; } - case 0x01: // jak_car2 on starting a game + case 0x01: // jak_car2 on starting a game, myac220 'piggy golf' ball movement { LOGMASKED(LOG_UNSP_SHIFTS, "%s = %s asror %s (%04x %04x)\n", regs[rd], regs[rd], regs[rs], m_core->m_r[rd], m_core->m_r[rs]); @@ -284,7 +290,7 @@ void unsp_12_device::execute_exxx_group(uint16_t op) const int shift = (m_core->m_r[rs] & 0x01f); const uint32_t res = rdval >> shift; m_core->m_r[REG_R3] |= (uint16_t)res; - m_core->m_r[REG_R4] |= (uint16_t)(res >> 16); + m_core->m_r[REG_R4] = (uint16_t)(res >> 16); LOGMASKED(LOG_UNSP_SHIFTS, "result: %04x%04x\n", m_core->m_r[REG_R4], m_core->m_r[REG_R3]); return; } diff --git a/src/devices/machine/generalplus_gpl16250soc.cpp b/src/devices/machine/generalplus_gpl16250soc.cpp index 29c7f7a2585..1c87d074819 100644 --- a/src/devices/machine/generalplus_gpl16250soc.cpp +++ b/src/devices/machine/generalplus_gpl16250soc.cpp @@ -1665,23 +1665,6 @@ void sunplus_gcm394_base_device::write_space(uint32_t offset, uint16_t data) } } -READ16_MEMBER(sunplus_gcm394_base_device::speedup_hack_r) -{ - u32 const pc = this->pc(); - - if (pc == m_speedup_pc) - this->spin_until_time(this->cycles_to_attotime(2000)); - - return m_mainram[m_speedup_address]; -} - - -void sunplus_gcm394_base_device::install_speedup_hack(int address, int pc) -{ - this->space(AS_PROGRAM).install_read_handler(address, address, read16_delegate(*this, FUNC(sunplus_gcm394_base_device::speedup_hack_r))); - m_speedup_address = address; - m_speedup_pc = pc; -} void sunplus_gcm394_base_device::device_add_mconfig(machine_config &config) diff --git a/src/devices/machine/generalplus_gpl16250soc.h b/src/devices/machine/generalplus_gpl16250soc.h index f5137a47bc0..50298fdf5eb 100644 --- a/src/devices/machine/generalplus_gpl16250soc.h +++ b/src/devices/machine/generalplus_gpl16250soc.h @@ -49,8 +49,7 @@ public: m_space_read_cb(*this), m_space_write_cb(*this), m_boot_mode(0), - m_cs_callback(*this, DEVICE_SELF, FUNC(sunplus_gcm394_base_device::default_cs_callback)), - m_speedup_address(-1) + m_cs_callback(*this, DEVICE_SELF, FUNC(sunplus_gcm394_base_device::default_cs_callback)) { } @@ -91,7 +90,7 @@ public: void set_romtype(int romtype) { m_romtype = romtype; } - void install_speedup_hack(int address, int pc); + inline uint16_t get_ram_addr(uint32_t addr) { return m_mainram[addr]; } protected: @@ -360,10 +359,6 @@ private: // config registers (external pins) int m_boot_mode; // 2 pins determine boot mode, likely only read at power-on sunplus_gcm394_cs_callback_device m_cs_callback; - - DECLARE_READ16_MEMBER(speedup_hack_r); - int m_speedup_address; - int m_speedup_pc; }; diff --git a/src/devices/machine/generalplus_gpl16250soc_video.cpp b/src/devices/machine/generalplus_gpl16250soc_video.cpp index fe6e03e534f..b1e0fd77a73 100644 --- a/src/devices/machine/generalplus_gpl16250soc_video.cpp +++ b/src/devices/machine/generalplus_gpl16250soc_video.cpp @@ -391,20 +391,18 @@ uint32_t gcm394_base_video_device::screen_update(screen_device &screen, bitmap_r const uint32_t sprites_addr = (m_sprite_702d_gfxbase_msb << 16) | m_sprite_7022_gfxbase_lsb; - bitmap.fill(0, cliprect); - for (uint32_t scanline = (uint32_t)cliprect.min_y; scanline <= (uint32_t)cliprect.max_y; scanline++) { - uint32_t* dst = &bitmap.pix32(scanline, cliprect.min_x); + m_renderer->new_line(cliprect); for (int i = 0; i < 4; i++) { - m_renderer->draw_page(true, true, m_alt_tile_addressing ? false : true, m_703a_palettebank, cliprect, dst, scanline, i, page0_addr, m_tmap0_scroll, m_tmap0_regs, mem, m_paletteram, m_rowscroll, 0); - m_renderer->draw_page(true, true, m_alt_tile_addressing ? false : true, m_703a_palettebank, cliprect, dst, scanline, i, page1_addr, m_tmap1_scroll, m_tmap1_regs, mem, m_paletteram, m_rowscroll, 1); - m_renderer->draw_page(true, true, m_alt_tile_addressing ? false : true, m_703a_palettebank, cliprect, dst, scanline, i, page2_addr, m_tmap2_scroll, m_tmap2_regs, mem, m_paletteram, m_rowscroll, 2); - m_renderer->draw_page(true, true, m_alt_tile_addressing ? false : true, m_703a_palettebank, cliprect, dst, scanline, i, page3_addr, m_tmap3_scroll, m_tmap3_regs, mem, m_paletteram, m_rowscroll, 3); + m_renderer->draw_page(true, true, m_alt_tile_addressing ? false : true, m_703a_palettebank, cliprect, scanline, i, page0_addr, m_tmap0_scroll, m_tmap0_regs, mem, m_paletteram, m_rowscroll, 0); + m_renderer->draw_page(true, true, m_alt_tile_addressing ? false : true, m_703a_palettebank, cliprect, scanline, i, page1_addr, m_tmap1_scroll, m_tmap1_regs, mem, m_paletteram, m_rowscroll, 1); + m_renderer->draw_page(true, true, m_alt_tile_addressing ? false : true, m_703a_palettebank, cliprect, scanline, i, page2_addr, m_tmap2_scroll, m_tmap2_regs, mem, m_paletteram, m_rowscroll, 2); + m_renderer->draw_page(true, true, m_alt_tile_addressing ? false : true, m_703a_palettebank, cliprect, scanline, i, page3_addr, m_tmap3_scroll, m_tmap3_regs, mem, m_paletteram, m_rowscroll, 3); - m_renderer->draw_sprites(true, true, m_alt_extrasprite_hack ? true : false, m_703a_palettebank, highres, cliprect, dst, scanline, i, sprites_addr, mem, m_paletteram, m_spriteram, -1); + m_renderer->draw_sprites(true, true, m_alt_extrasprite_hack ? true : false, m_703a_palettebank, highres, cliprect, scanline, i, sprites_addr, mem, m_paletteram, m_spriteram, -1); } m_renderer->apply_saturation_and_fade(bitmap, cliprect, scanline); diff --git a/src/devices/machine/spg2xx_video.cpp b/src/devices/machine/spg2xx_video.cpp index d62e6998ea2..9a4caa945cb 100644 --- a/src/devices/machine/spg2xx_video.cpp +++ b/src/devices/machine/spg2xx_video.cpp @@ -110,17 +110,15 @@ uint32_t spg2xx_video_device::screen_update(screen_device &screen, bitmap_rgb32 uint16_t *page1_regs = m_video_regs + 0x12; uint16_t *page2_regs = m_video_regs + 0x18; - bitmap.fill(0, cliprect); - for (uint32_t scanline = (uint32_t)cliprect.min_y; scanline <= (uint32_t)cliprect.max_y; scanline++) { - uint32_t* dst = &bitmap.pix32(scanline, cliprect.min_x); + m_renderer->new_line(cliprect); for (int i = 0; i < 4; i++) { - m_renderer->draw_page(false, false, false, 0, cliprect, dst, scanline, i, page1_addr, page1_scroll, page1_regs, mem, m_paletteram, m_scrollram, 0); - m_renderer->draw_page(false, false, false, 0, cliprect, dst, scanline, i, page2_addr, page2_scroll, page2_regs, mem, m_paletteram, m_scrollram, 1); - m_renderer->draw_sprites(false, false, false, 0, false, cliprect, dst, scanline, i, sprite_addr, mem, m_paletteram, m_spriteram, m_sprlimit_read_cb()); + m_renderer->draw_page(false, false, false, 0, cliprect, scanline, i, page1_addr, page1_scroll, page1_regs, mem, m_paletteram, m_scrollram, 0); + m_renderer->draw_page(false, false, false, 0, cliprect, scanline, i, page2_addr, page2_scroll, page2_regs, mem, m_paletteram, m_scrollram, 1); + m_renderer->draw_sprites(false, false, false, 0, false, cliprect, scanline, i, sprite_addr, mem, m_paletteram, m_spriteram, m_sprlimit_read_cb()); } m_renderer->apply_saturation_and_fade(bitmap, cliprect, scanline); diff --git a/src/devices/machine/spg_renderer.cpp b/src/devices/machine/spg_renderer.cpp index 19a0cbaff05..fb728396de4 100644 --- a/src/devices/machine/spg_renderer.cpp +++ b/src/devices/machine/spg_renderer.cpp @@ -30,6 +30,8 @@ void spg_renderer_device::device_start() m_rgb555_to_rgb888[i] = (m_rgb5_to_rgb8[(i >> 10) & 0x1f] << 16) | (m_rgb5_to_rgb8[(i >> 5) & 0x1f] << 8) | (m_rgb5_to_rgb8[(i >> 0) & 0x1f] << 0); + + m_rgb555_to_rgb888_current[i] = 0x0000; } save_item(NAME(m_video_regs_1c)); @@ -46,6 +48,9 @@ void spg_renderer_device::device_start() save_item(NAME(m_video_regs_7f)); save_item(NAME(m_ycmp_table)); + + save_item(NAME(m_rgb555_to_rgb888_current)); + save_item(NAME(m_brightness_or_saturation_dirty)); } void spg_renderer_device::device_reset() @@ -67,17 +72,19 @@ void spg_renderer_device::device_reset() { m_ycmp_table[i] = 0xffffffff; } + + m_brightness_or_saturation_dirty = true; } // Perform a lerp between a and b inline uint8_t spg_renderer_device::mix_channel(uint8_t bottom, uint8_t top, uint8_t alpha) { - return ((256 - alpha) * bottom + alpha * top) >> 8; + return ((0x20 - alpha) * bottom + alpha * top) >> 5; } template -void spg_renderer_device::draw_tilestrip(bool read_from_csspace, uint32_t screenwidth, uint32_t drawwidthmask, const rectangle& cliprect, uint32_t* dst, uint32_t tile_h, uint32_t tile_w, uint32_t tilegfxdata_addr, uint32_t tile, uint32_t tile_scanline, int drawx, bool flip_y, uint32_t palette_offset, const uint32_t nc_bpp, const uint32_t bits_per_row, const uint32_t words_per_tile, address_space &spc, uint16_t* paletteram, uint8_t blendlevel) +void spg_renderer_device::draw_tilestrip(bool read_from_csspace, uint32_t screenwidth, uint32_t drawwidthmask, const rectangle& cliprect, uint32_t tile_h, uint32_t tile_w, uint32_t tilegfxdata_addr, uint32_t tile, uint32_t tile_scanline, int drawx, bool flip_y, uint32_t palette_offset, const uint32_t nc_bpp, const uint32_t bits_per_row, const uint32_t words_per_tile, address_space &spc, uint16_t* paletteram, uint8_t blendlevel) { const uint32_t yflipmask = flip_y ? tile_h - 1 : 0; uint32_t m = tilegfxdata_addr + words_per_tile * tile + bits_per_row * (tile_scanline ^ yflipmask); @@ -132,13 +139,13 @@ void spg_renderer_device::draw_tilestrip(bool read_from_csspace, uint32_t screen if (Blend) { - dst[realdrawpos] = (mix_channel((uint8_t)(dst[realdrawpos] >> 16), m_rgb5_to_rgb8[(rgb >> 10) & 0x1f], blendlevel) << 16) | - (mix_channel((uint8_t)(dst[realdrawpos] >> 8), m_rgb5_to_rgb8[(rgb >> 5) & 0x1f], blendlevel) << 8) | - (mix_channel((uint8_t)(dst[realdrawpos] >> 0), m_rgb5_to_rgb8[(rgb >> 0) & 0x1f], blendlevel) << 0); + m_linebuf[realdrawpos] = (mix_channel((uint8_t)(m_linebuf[realdrawpos] >> 10) & 0x1f, (rgb >> 10) & 0x1f, blendlevel) << 10) | + (mix_channel((uint8_t)(m_linebuf[realdrawpos] >> 5) & 0x1f, (rgb >> 5) & 0x1f, blendlevel) << 5) | + (mix_channel((uint8_t)(m_linebuf[realdrawpos] >> 0) & 0x1f, (rgb >> 0) & 0x1f, blendlevel) << 0); } else { - dst[realdrawpos] = m_rgb555_to_rgb888[rgb]; + m_linebuf[realdrawpos] = rgb; } } } @@ -146,7 +153,7 @@ void spg_renderer_device::draw_tilestrip(bool read_from_csspace, uint32_t screen } -void spg_renderer_device::draw_linemap(bool has_extended_tilemaps, const rectangle& cliprect, uint32_t* dst, uint32_t scanline, int priority, uint32_t tilegfxdata_addr, uint16_t* scrollregs, uint16_t* tilemapregs, address_space &spc, uint16_t* paletteram) +void spg_renderer_device::draw_linemap(bool has_extended_tilemaps, const rectangle& cliprect, uint32_t scanline, int priority, uint32_t tilegfxdata_addr, uint16_t* scrollregs, uint16_t* tilemapregs, address_space &spc, uint16_t* paletteram) { if (has_extended_tilemaps) { @@ -220,7 +227,7 @@ void spg_renderer_device::draw_linemap(bool has_extended_tilemaps, const rectang if (!(rgb & 0x8000)) { - dst[xx] = m_rgb555_to_rgb888[rgb]; + m_linebuf[xx] = rgb; } } @@ -236,7 +243,7 @@ void spg_renderer_device::draw_linemap(bool has_extended_tilemaps, const rectang if (!(rgb & 0x8000)) { - dst[xx] = m_rgb555_to_rgb888[rgb]; + m_linebuf[xx] = rgb; } } } @@ -250,7 +257,7 @@ void spg_renderer_device::draw_linemap(bool has_extended_tilemaps, const rectang uint32_t tilemap = tilemapregs[2]; uint32_t palette_map = tilemapregs[3]; - popmessage("draw draw_linemap bases %04x %04x\n", tilemap, palette_map); + //popmessage("draw draw_linemap bases %04x %04x\n", tilemap, palette_map); //uint32_t xscroll = scrollregs[0]; uint32_t yscroll = scrollregs[1]; @@ -283,7 +290,7 @@ void spg_renderer_device::draw_linemap(bool has_extended_tilemaps, const rectang if (!(data & 0x8000)) { - dst[i] = m_rgb555_to_rgb888[data & 0x7fff]; + m_linebuf[i] = data & 0x7fff; } } } @@ -300,7 +307,7 @@ void spg_renderer_device::draw_linemap(bool has_extended_tilemaps, const rectang if (!(color & 0x8000)) { - dst[(i * 2) + 0] = m_rgb555_to_rgb888[color & 0x7fff]; + m_linebuf[(i * 2) + 0] = color & 0x7fff; } palette_entry = (data & 0xff00) >> 8; @@ -308,7 +315,7 @@ void spg_renderer_device::draw_linemap(bool has_extended_tilemaps, const rectang if (!(color & 0x8000)) { - dst[(i * 2) + 1] = m_rgb555_to_rgb888[color & 0x7fff]; + m_linebuf[(i * 2) + 1] = color & 0x7fff; } } } @@ -357,33 +364,33 @@ void spg_renderer_device::update_vcmp_table() } } -void spg_renderer_device::draw_tilestrip(bool read_from_csspace, uint32_t screenwidth, uint32_t drawwidthmask, spg_renderer_device::blend_enable_t blend, spg_renderer_device::flipx_t flip_x, const rectangle& cliprect, uint32_t* dst, uint32_t tile_h, uint32_t tile_w, uint32_t tilegfxdata_addr, uint32_t tile, uint32_t tile_scanline, int drawx, bool flip_y, uint32_t palette_offset, const uint32_t nc_bpp, const uint32_t bits_per_row, const uint32_t words_per_tile, address_space& spc, uint16_t* paletteram, uint8_t blendlevel) +void spg_renderer_device::draw_tilestrip(bool read_from_csspace, uint32_t screenwidth, uint32_t drawwidthmask, spg_renderer_device::blend_enable_t blend, spg_renderer_device::flipx_t flip_x, const rectangle& cliprect, uint32_t tile_h, uint32_t tile_w, uint32_t tilegfxdata_addr, uint32_t tile, uint32_t tile_scanline, int drawx, bool flip_y, uint32_t palette_offset, const uint32_t nc_bpp, const uint32_t bits_per_row, const uint32_t words_per_tile, address_space& spc, uint16_t* paletteram, uint8_t blendlevel) { if (blend) { if (flip_x) { - draw_tilestrip(read_from_csspace, screenwidth, drawwidthmask, cliprect, dst, tile_h, tile_w, tilegfxdata_addr, tile, tile_scanline, drawx, flip_y, palette_offset, nc_bpp, bits_per_row, words_per_tile, spc, paletteram, blendlevel); + draw_tilestrip(read_from_csspace, screenwidth, drawwidthmask, cliprect, tile_h, tile_w, tilegfxdata_addr, tile, tile_scanline, drawx, flip_y, palette_offset, nc_bpp, bits_per_row, words_per_tile, spc, paletteram, blendlevel); } else { - draw_tilestrip(read_from_csspace, screenwidth, drawwidthmask, cliprect, dst, tile_h, tile_w, tilegfxdata_addr, tile, tile_scanline, drawx, flip_y, palette_offset, nc_bpp, bits_per_row, words_per_tile, spc, paletteram, blendlevel); + draw_tilestrip(read_from_csspace, screenwidth, drawwidthmask, cliprect, tile_h, tile_w, tilegfxdata_addr, tile, tile_scanline, drawx, flip_y, palette_offset, nc_bpp, bits_per_row, words_per_tile, spc, paletteram, blendlevel); } } else { if (flip_x) { - draw_tilestrip(read_from_csspace, screenwidth, drawwidthmask, cliprect, dst, tile_h, tile_w, tilegfxdata_addr, tile, tile_scanline, drawx, flip_y, palette_offset, nc_bpp, bits_per_row, words_per_tile, spc, paletteram, blendlevel); + draw_tilestrip(read_from_csspace, screenwidth, drawwidthmask, cliprect, tile_h, tile_w, tilegfxdata_addr, tile, tile_scanline, drawx, flip_y, palette_offset, nc_bpp, bits_per_row, words_per_tile, spc, paletteram, blendlevel); } else { - draw_tilestrip(read_from_csspace, screenwidth, drawwidthmask, cliprect, dst, tile_h, tile_w, tilegfxdata_addr, tile, tile_scanline, drawx, flip_y, palette_offset, nc_bpp, bits_per_row, words_per_tile, spc, paletteram, blendlevel); + draw_tilestrip(read_from_csspace, screenwidth, drawwidthmask, cliprect, tile_h, tile_w, tilegfxdata_addr, tile, tile_scanline, drawx, flip_y, palette_offset, nc_bpp, bits_per_row, words_per_tile, spc, paletteram, blendlevel); } } } -void spg_renderer_device::draw_page(bool read_from_csspace, bool has_extended_tilemaps, bool use_alt_tile_addressing, uint32_t palbank, const rectangle& cliprect, uint32_t* dst, uint32_t scanline, int priority, uint32_t tilegfxdata_addr, uint16_t* scrollregs, uint16_t* tilemapregs, address_space& spc, uint16_t* paletteram, uint16_t* scrollram, uint32_t which) +void spg_renderer_device::draw_page(bool read_from_csspace, bool has_extended_tilemaps, bool use_alt_tile_addressing, uint32_t palbank, const rectangle& cliprect, uint32_t scanline, int priority, uint32_t tilegfxdata_addr, uint16_t* scrollregs, uint16_t* tilemapregs, address_space& spc, uint16_t* paletteram, uint16_t* scrollram, uint32_t which) { const uint32_t attr = tilemapregs[0]; const uint32_t ctrl = tilemapregs[1]; @@ -400,7 +407,7 @@ void spg_renderer_device::draw_page(bool read_from_csspace, bool has_extended_ti if (ctrl & 0x0001) // Bitmap / Linemap mode! (basically screen width tile mode) { - draw_linemap(has_extended_tilemaps, cliprect, dst, scanline, priority, tilegfxdata_addr, scrollregs, tilemapregs, spc, paletteram); + draw_linemap(has_extended_tilemaps, cliprect, scanline, priority, tilegfxdata_addr, scrollregs, tilemapregs, spc, paletteram); return; } @@ -459,7 +466,7 @@ void spg_renderer_device::draw_page(bool read_from_csspace, bool has_extended_ti const uint32_t bits_per_row = nc_bpp * tile_w / 16; //const uint32_t words_per_tile = bits_per_row * tile_h; const bool row_scroll = (ctrl & 0x0010); - uint8_t blendlevel = (m_video_regs_2a & 3) << 6; + uint8_t blendlevel = (m_video_regs_2a & 3) << 3; uint32_t words_per_tile; @@ -585,11 +592,11 @@ void spg_renderer_device::draw_page(bool read_from_csspace, bool has_extended_ti palette_offset <<= nc_bpp; const int drawx = (x0 * tile_w) - (realxscroll & (tile_w - 1)); - draw_tilestrip(read_from_csspace, screenwidth, drawwidthmask, blend, flip_x, cliprect, dst, tile_h, tile_w, tilegfxdata_addr, tile, tile_scanline, drawx, flip_y, palette_offset, nc_bpp, bits_per_row, words_per_tile, spc, paletteram, blendlevel); + draw_tilestrip(read_from_csspace, screenwidth, drawwidthmask, blend, flip_x, cliprect, tile_h, tile_w, tilegfxdata_addr, tile, tile_scanline, drawx, flip_y, palette_offset, nc_bpp, bits_per_row, words_per_tile, spc, paletteram, blendlevel); } } -void spg_renderer_device::draw_sprite(bool read_from_csspace, bool has_extended_sprites, bool alt_extrasprite_hack, uint32_t palbank, bool highres, const rectangle& cliprect, uint32_t* dst, uint32_t scanline, int priority, uint32_t spritegfxdata_addr, uint32_t base_addr, address_space &spc, uint16_t* paletteram, uint16_t* spriteram) +void spg_renderer_device::draw_sprite(bool read_from_csspace, bool has_extended_sprites, bool alt_extrasprite_hack, uint32_t palbank, bool highres, const rectangle& cliprect, uint32_t scanline, int priority, uint32_t spritegfxdata_addr, uint32_t base_addr, address_space &spc, uint16_t* paletteram, uint16_t* spriteram) { uint32_t tilegfxdata_addr = spritegfxdata_addr; uint32_t tile = spriteram[base_addr + 0]; @@ -645,7 +652,7 @@ void spg_renderer_device::draw_sprite(bool read_from_csspace, bool has_extended_ const uint8_t bpp = attr & 0x0003; const uint32_t nc_bpp = ((bpp)+1) << 1; const uint32_t bits_per_row = nc_bpp * tile_w / 16; - uint8_t blendlevel = (m_video_regs_2a & 3) << 6; + uint8_t blendlevel = (m_video_regs_2a & 3) << 3; uint32_t words_per_tile; @@ -659,12 +666,12 @@ void spg_renderer_device::draw_sprite(bool read_from_csspace, bool has_extended_ { // before or after the 0 tile check? tile |= (spriteram[(base_addr / 4) + 0x400] & 0x01ff) << 16; - blendlevel = ((spriteram[(base_addr / 4) + 0x400] & 0x3e00) >> 9) << 3; + blendlevel = ((spriteram[(base_addr / 4) + 0x400] & 0x3e00) >> 9); } else // jak_prft - no /4 to offset in this mode - 4 extra words per sprite instead ? (or is RAM content incorrect for one of these cases?) { tile |= spriteram[(base_addr) + 0x400] << 16; - blendlevel = ((spriteram[(base_addr) + 0x400] & 0x3e00) >> 9) << 3; + blendlevel = ((spriteram[(base_addr) + 0x400] & 0x3e00) >> 9); } } else @@ -709,7 +716,7 @@ void spg_renderer_device::draw_sprite(bool read_from_csspace, bool has_extended_ if ((scanx >= 0) && (scanline <= lastline)) { - draw_tilestrip(read_from_csspace, screenwidth, xmask, blend, flip_x, cliprect, dst, tile_h, tile_w, tilegfxdata_addr, tile, scanx, x, flip_y, palette_offset, nc_bpp, bits_per_row, words_per_tile, spc, paletteram, blendlevel); + draw_tilestrip(read_from_csspace, screenwidth, xmask, blend, flip_x, cliprect, tile_h, tile_w, tilegfxdata_addr, tile, scanx, x, flip_y, palette_offset, nc_bpp, bits_per_row, words_per_tile, spc, paletteram, blendlevel); } } else @@ -721,7 +728,7 @@ void spg_renderer_device::draw_sprite(bool read_from_csspace, bool has_extended_ if ((scanx >= 0) && (scanline <= templastline)) { - draw_tilestrip(read_from_csspace, screenwidth, xmask, blend, flip_x, cliprect, dst, tile_h, tile_w, tilegfxdata_addr, tile, scanx, x, flip_y, palette_offset, nc_bpp, bits_per_row, words_per_tile, spc, paletteram, blendlevel); + draw_tilestrip(read_from_csspace, screenwidth, xmask, blend, flip_x, cliprect, tile_h, tile_w, tilegfxdata_addr, tile, scanx, x, flip_y, palette_offset, nc_bpp, bits_per_row, words_per_tile, spc, paletteram, blendlevel); } // clipped against the bottom tempfirstline = firstline; @@ -730,12 +737,12 @@ void spg_renderer_device::draw_sprite(bool read_from_csspace, bool has_extended_ if ((scanx >= 0) && (scanline <= templastline)) { - draw_tilestrip(read_from_csspace, screenwidth, xmask, blend, flip_x, cliprect, dst, tile_h, tile_w, tilegfxdata_addr, tile, scanx, x, flip_y, palette_offset, nc_bpp, bits_per_row, words_per_tile, spc, paletteram, blendlevel); + draw_tilestrip(read_from_csspace, screenwidth, xmask, blend, flip_x, cliprect, tile_h, tile_w, tilegfxdata_addr, tile, scanx, x, flip_y, palette_offset, nc_bpp, bits_per_row, words_per_tile, spc, paletteram, blendlevel); } } } -void spg_renderer_device::draw_sprites(bool read_from_csspace, bool has_extended_sprites, bool alt_extrasprite_hack, uint32_t palbank, bool highres, const rectangle &cliprect, uint32_t* dst, uint32_t scanline, int priority, uint32_t spritegfxdata_addr, address_space &spc, uint16_t* paletteram, uint16_t* spriteram, int sprlimit) +void spg_renderer_device::draw_sprites(bool read_from_csspace, bool has_extended_sprites, bool alt_extrasprite_hack, uint32_t palbank, bool highres, const rectangle &cliprect, uint32_t scanline, int priority, uint32_t spritegfxdata_addr, address_space &spc, uint16_t* paletteram, uint16_t* spriteram, int sprlimit) { if (!(m_video_regs_42 & 0x0001)) { @@ -752,13 +759,25 @@ void spg_renderer_device::draw_sprites(bool read_from_csspace, bool has_extended for (uint32_t n = 0; n < sprlimit; n++) { - draw_sprite(read_from_csspace, has_extended_sprites, alt_extrasprite_hack, palbank, highres, cliprect, dst, scanline, priority, spritegfxdata_addr, 4 * n, spc, paletteram, spriteram); + draw_sprite(read_from_csspace, has_extended_sprites, alt_extrasprite_hack, palbank, highres, cliprect, scanline, priority, spritegfxdata_addr, 4 * n, spc, paletteram, spriteram); } } +void spg_renderer_device::new_line(const rectangle& cliprect) +{ + update_palette_lookup(); -void spg_renderer_device::apply_saturation_and_fade(bitmap_rgb32& bitmap, const rectangle& cliprect, int scanline) + for (int x = cliprect.min_x; x <= cliprect.max_x; x++) + { + m_linebuf[x] = 0x0000; + } +} + +void spg_renderer_device::update_palette_lookup() { + if (!m_brightness_or_saturation_dirty) + return; + static const float s_u8_to_float = 1.0f / 255.0f; static const float s_gray_r = 0.299f; static const float s_gray_g = 0.587f; @@ -767,13 +786,13 @@ void spg_renderer_device::apply_saturation_and_fade(bitmap_rgb32& bitmap, const const uint16_t fade_offset = m_video_regs_30; - uint32_t* src = &bitmap.pix32(scanline, cliprect.min_x); - - for (int x = cliprect.min_x; x <= cliprect.max_x; x++) + for (uint16_t i = 0; i < 0x8000; i++) { + uint32_t src = m_rgb555_to_rgb888[i]; + if ((m_video_regs_3c & 0x00ff) != 0x0020) // apply saturation { - const uint32_t src_rgb = *src; + const uint32_t src_rgb = src; const float src_r = (uint8_t)(src_rgb >> 16) * s_u8_to_float; const float src_g = (uint8_t)(src_rgb >> 8) * s_u8_to_float; const float src_b = (uint8_t)(src_rgb >> 0) * s_u8_to_float; @@ -784,26 +803,38 @@ void spg_renderer_device::apply_saturation_and_fade(bitmap_rgb32& bitmap, const const int integer_r = (int)floor(adjusted_r * 255.0f); const int integer_g = (int)floor(adjusted_g * 255.0f); const int integer_b = (int)floor(adjusted_b * 255.0f); - *src = (integer_r > 255 ? 0xff0000 : (integer_r < 0 ? 0 : ((uint8_t)integer_r << 16))) | + src = (integer_r > 255 ? 0xff0000 : (integer_r < 0 ? 0 : ((uint8_t)integer_r << 16))) | (integer_g > 255 ? 0x00ff00 : (integer_g < 0 ? 0 : ((uint8_t)integer_g << 8))) | (integer_b > 255 ? 0x0000ff : (integer_b < 0 ? 0 : (uint8_t)integer_b)); - } if (fade_offset != 0) // apply fade { - const uint32_t src_rgb = *src; + const uint32_t src_rgb = src; const uint8_t src_r = (src_rgb >> 16) & 0xff; const uint8_t src_g = (src_rgb >> 8) & 0xff; const uint8_t src_b = (src_rgb >> 0) & 0xff; const uint8_t r = src_r - fade_offset; const uint8_t g = src_g - fade_offset; const uint8_t b = src_b - fade_offset; - *src = (r > src_r ? 0 : (r << 16)) | + src = (r > src_r ? 0 : (r << 16)) | (g > src_g ? 0 : (g << 8)) | (b > src_b ? 0 : (b << 0)); } + m_rgb555_to_rgb888_current[i] = src; + } + + m_brightness_or_saturation_dirty = false; +} + +void spg_renderer_device::apply_saturation_and_fade(bitmap_rgb32& bitmap, const rectangle& cliprect, int scanline) +{ + uint32_t* src = &bitmap.pix32(scanline, cliprect.min_x); + + for (int x = cliprect.min_x; x <= cliprect.max_x; x++) + { + *src = m_rgb555_to_rgb888_current[m_linebuf[x]]; src++; } } diff --git a/src/devices/machine/spg_renderer.h b/src/devices/machine/spg_renderer.h index 50ecf6ff11c..f88991a4b50 100644 --- a/src/devices/machine/spg_renderer.h +++ b/src/devices/machine/spg_renderer.h @@ -14,8 +14,9 @@ public: spg_renderer_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); spg_renderer_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - void draw_sprites(bool read_from_csspace, bool has_extended_sprites, bool alt_extrasprite_hack, uint32_t palbank, bool highres, const rectangle& cliprect, uint32_t* dst, uint32_t scanline, int priority, uint32_t spritegfxdata_addr, address_space& spc, uint16_t* paletteram, uint16_t* spriteram, int sprlimit); - void draw_page(bool read_from_csspace, bool has_extended_tilemaps, bool use_alt_tile_addressing, uint32_t palbank, const rectangle& cliprect, uint32_t* dst, uint32_t scanline, int priority, uint32_t tilegfxdata_addr, uint16_t* scrollregs, uint16_t* tilemapregs, address_space& spc, uint16_t* paletteram, uint16_t* scrollram, uint32_t which); + void draw_sprites(bool read_from_csspace, bool has_extended_sprites, bool alt_extrasprite_hack, uint32_t palbank, bool highres, const rectangle& cliprect, uint32_t scanline, int priority, uint32_t spritegfxdata_addr, address_space& spc, uint16_t* paletteram, uint16_t* spriteram, int sprlimit); + void draw_page(bool read_from_csspace, bool has_extended_tilemaps, bool use_alt_tile_addressing, uint32_t palbank, const rectangle& cliprect, uint32_t scanline, int priority, uint32_t tilegfxdata_addr, uint16_t* scrollregs, uint16_t* tilemapregs, address_space& spc, uint16_t* paletteram, uint16_t* scrollram, uint32_t which); + void new_line(const rectangle& cliprect); void apply_saturation_and_fade(bitmap_rgb32& bitmap, const rectangle& cliprect, int scanline); @@ -23,8 +24,20 @@ public: void set_video_reg_1d(uint16_t val) { m_video_regs_1d = val; update_vcmp_table(); } void set_video_reg_1e(uint16_t val) { m_video_regs_1e = val; update_vcmp_table(); } void set_video_reg_2a(uint16_t val) { m_video_regs_2a = val; } - void set_video_reg_30(uint16_t val) { m_video_regs_30 = val; } - void set_video_reg_3c(uint16_t val) { m_video_regs_3c = val; } + void set_video_reg_30(uint16_t val) + { + if (m_video_regs_30 != val) + m_brightness_or_saturation_dirty = true; + + m_video_regs_30 = val; + } + void set_video_reg_3c(uint16_t val) + { + if (m_video_regs_3c != val) + m_brightness_or_saturation_dirty = true; + + m_video_regs_3c = val; + } void set_video_reg_42(uint16_t val) { m_video_regs_42 = val; } uint16_t get_video_reg_1c(void) { return m_video_regs_1c; } @@ -60,18 +73,19 @@ protected: }; template - inline void draw_tilestrip(bool read_from_csspace, uint32_t screenwidth, uint32_t drawwidthmask, const rectangle& cliprect, uint32_t* dst, uint32_t tile_h, uint32_t tile_w, uint32_t tilegfxdata_addr, uint32_t tile, uint32_t tile_scanline, int drawx, bool flip_y, uint32_t palette_offset, const uint32_t nc_bpp, const uint32_t bits_per_row, const uint32_t words_per_tile, address_space &spc, uint16_t* palette, uint8_t blendlevel); + inline void draw_tilestrip(bool read_from_csspace, uint32_t screenwidth, uint32_t drawwidthmask, const rectangle& cliprect, uint32_t tile_h, uint32_t tile_w, uint32_t tilegfxdata_addr, uint32_t tile, uint32_t tile_scanline, int drawx, bool flip_y, uint32_t palette_offset, const uint32_t nc_bpp, const uint32_t bits_per_row, const uint32_t words_per_tile, address_space &spc, uint16_t* palette, uint8_t blendlevel); - inline void draw_tilestrip(bool read_from_csspace, uint32_t screenwidth, uint32_t drawwidthmask, spg_renderer_device::blend_enable_t blend, spg_renderer_device::flipx_t flip_x, const rectangle& cliprect, uint32_t* dst, uint32_t tile_h, uint32_t tile_w, uint32_t tilegfxdata_addr, uint32_t tile, uint32_t tile_scanline, int drawx, bool flip_y, uint32_t palette_offset, const uint32_t nc_bpp, const uint32_t bits_per_row, const uint32_t words_per_tile, address_space& spc, uint16_t* paletteram, uint8_t blendlevel); + inline void draw_tilestrip(bool read_from_csspace, uint32_t screenwidth, uint32_t drawwidthmask, spg_renderer_device::blend_enable_t blend, spg_renderer_device::flipx_t flip_x, const rectangle& cliprect, uint32_t tile_h, uint32_t tile_w, uint32_t tilegfxdata_addr, uint32_t tile, uint32_t tile_scanline, int drawx, bool flip_y, uint32_t palette_offset, const uint32_t nc_bpp, const uint32_t bits_per_row, const uint32_t words_per_tile, address_space& spc, uint16_t* paletteram, uint8_t blendlevel); - inline void draw_sprite(bool read_from_csspace, bool has_extended_sprites, bool alt_extrasprite_hack, uint32_t palbank, bool highres, const rectangle& cliprect, uint32_t* dst, uint32_t scanline, int priority, uint32_t spritegfxdata_addr, uint32_t base_addr, address_space& spc, uint16_t* paletteram, uint16_t* spriteram); + inline void draw_sprite(bool read_from_csspace, bool has_extended_sprites, bool alt_extrasprite_hack, uint32_t palbank, bool highres, const rectangle& cliprect, uint32_t scanline, int priority, uint32_t spritegfxdata_addr, uint32_t base_addr, address_space& spc, uint16_t* paletteram, uint16_t* spriteram); - inline void draw_linemap(bool has_extended_tilemaps, const rectangle& cliprect, uint32_t* dst, uint32_t scanline, int priority, uint32_t tilegfxdata_addr, uint16_t* scrollregs, uint16_t* tilemapregs, address_space& spc, uint16_t* paletteram); + inline void draw_linemap(bool has_extended_tilemaps, const rectangle& cliprect, uint32_t scanline, int priority, uint32_t tilegfxdata_addr, uint16_t* scrollregs, uint16_t* tilemapregs, address_space& spc, uint16_t* paletteram); inline uint8_t mix_channel(uint8_t a, uint8_t b, uint8_t alpha); uint8_t m_rgb5_to_rgb8[32]; uint32_t m_rgb555_to_rgb888[0x8000]; + uint32_t m_rgb555_to_rgb888_current[0x8000]; private: @@ -96,6 +110,9 @@ private: address_space* m_cpuspace; address_space* m_cs_space; int m_csbase; + bool m_brightness_or_saturation_dirty; + void update_palette_lookup(void); + uint16_t m_linebuf[640]; }; DECLARE_DEVICE_TYPE(SPG_RENDERER, spg_renderer_device) diff --git a/src/mame/drivers/generalplus_gpl16250_romram.cpp b/src/mame/drivers/generalplus_gpl16250_romram.cpp index 987ec9854c8..2c0909335b2 100644 --- a/src/mame/drivers/generalplus_gpl16250_romram.cpp +++ b/src/mame/drivers/generalplus_gpl16250_romram.cpp @@ -323,7 +323,15 @@ void lazertag_game_state::machine_reset() void paccon_game_state::machine_reset() { jak_s500_game_state::machine_reset(); - m_maincpu->install_speedup_hack(0x6593, 0x30033); + m_maincpu->space(AS_PROGRAM).install_read_handler(0x6593, 0x6593, read16_delegate(*this, FUNC(paccon_game_state::paccon_speedup_hack_r))); +// install_speedup_hack(0x6593, 0x30033); +} + +void jak_pf_game_state::machine_reset() +{ + jak_s500_game_state::machine_reset(); + m_maincpu->space(AS_PROGRAM).install_read_handler(0x0001, 0x0001, read16_delegate(*this, FUNC(jak_pf_game_state::jak_pf_speedup_hack_r))); + m_maincpu->space(AS_PROGRAM).install_read_handler(0x13dd, 0x13dd, read16_delegate(*this, FUNC(jak_pf_game_state::jak_pf_speedup_hack2_r))); } void jak_prft_game_state::machine_reset() @@ -333,6 +341,31 @@ void jak_prft_game_state::machine_reset() m_maincpu->set_alt_extrasprite_hack(1); } + +READ16_MEMBER(paccon_game_state::paccon_speedup_hack_r) +{ + u32 const pc = m_maincpu->pc(); + if (pc == 0x30033) + m_maincpu->spin_until_time(m_maincpu->cycles_to_attotime(2000)); + return m_maincpu->get_ram_addr(0x6593); +} + +READ16_MEMBER(jak_pf_game_state::jak_pf_speedup_hack_r) +{ + u32 const pc = m_maincpu->pc(); + if (pc == 0x30010) + m_maincpu->spin_until_time(m_maincpu->cycles_to_attotime(2000)); + return m_maincpu->get_ram_addr(0x0001); +} + +READ16_MEMBER(jak_pf_game_state::jak_pf_speedup_hack2_r) +{ + u32 const pc = m_maincpu->pc(); + if (pc == 0x2611b4) + m_maincpu->spin_until_time(m_maincpu->cycles_to_attotime(2000)); + return m_maincpu->get_ram_addr(0x13dd); +} + ROM_START( paccon ) //ROM_REGION16_BE( 0x40000, "maincpu:internal", ROMREGION_ERASE00 ) // not on this model? (or at least not this size, as CS base is different) //ROM_LOAD16_WORD_SWAP( "internal.rom", 0x00000, 0x40000, NO_DUMP ) @@ -507,7 +540,7 @@ CONS(2008, lazertag, 0, 0, wrlshunt, jak_s500, lazertag_game_state, init_wrlshun CONS(2009, jak_s500, 0, 0, wrlshunt, jak_s500, jak_s500_game_state, init_wrlshunt, "JAKKS Pacific Inc / HotGen Ltd", "SpongeBob SquarePants Bikini Bottom 500 (JAKKS Pacific TV Motion Game)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND) CONS(2009, jak_smwm, 0, 0, wrlshunt, jak_s500, jak_s500_game_state, init_wrlshunt, "JAKKS Pacific Inc / HotGen Ltd", "Spider-Man Web Master (JAKKS Pacific TV Motion Game)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND) -CONS(2010, jak_pf, 0, 0, wrlshunt, jak_s500, jak_s500_game_state, init_wrlshunt, "JAKKS Pacific Inc / HotGen Ltd", "Phineas and Ferb: Best Game Ever! (JAKKS Pacific TV Motion Game)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND) // build date is 2009, but onscreen display is 2010 +CONS(2010, jak_pf, 0, 0, wrlshunt, jak_s500, jak_pf_game_state, init_wrlshunt, "JAKKS Pacific Inc / HotGen Ltd", "Phineas and Ferb: Best Game Ever! (JAKKS Pacific TV Motion Game)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND) // build date is 2009, but onscreen display is 2010 CONS(200?, jak_totm, 0, 0, wrlshunt, jak_s500, jak_s500_game_state, init_wrlshunt, "JAKKS Pacific Inc / HotGen Ltd", "Toy Story - Toys on the Move (JAKKS Pacific TV Motion Game)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND) // Toys on the Move has ISSI 404A CONS(2009, jak_prft, 0, 0, wrlshunt, jak_s500, jak_prft_game_state, init_wrlshunt, "JAKKS Pacific Inc / Santa Cruz Games", "Power Rangers Force In Time (JAKKS Pacific TV Motion Game)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND) CONS(2009, jak_tink, 0, 0, wrlshunt, jak_s500, jak_prft_game_state, init_wrlshunt, "JAKKS Pacific Inc / Santa Cruz Games", "Tinker Bell and the Lost Treasure (JAKKS Pacific TV Motion Game)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND) diff --git a/src/mame/drivers/spg2xx_zone_32bit.cpp b/src/mame/drivers/spg2xx_zone_32bit.cpp index 9130d958bae..596ee09c3a7 100644 --- a/src/mame/drivers/spg2xx_zone_32bit.cpp +++ b/src/mame/drivers/spg2xx_zone_32bit.cpp @@ -85,6 +85,9 @@ public: { } void init_denver(); + void init_m521neo(); + + protected: virtual void machine_reset() override; @@ -788,6 +791,29 @@ ROM_START( m505neo ) ROM_IGNORE(0x4000000) ROM_END +ROM_START( m521neo ) + ROM_REGION( 0x8000000, "maincpu", ROMREGION_ERASE00 ) // was this dumped with some address lines swapped? + ROM_LOAD16_WORD_SWAP( "6gu-1cd-a.u2", 0x0000000, 0x800000, CRC(7cb31b4c) SHA1(8de44756747a292c5d39bd491048d6fac4219953) ) + ROM_CONTINUE(0x01000000, 0x800000) + ROM_CONTINUE(0x00800000, 0x800000) + ROM_CONTINUE(0x01800000, 0x800000) + + ROM_CONTINUE(0x02000000, 0x800000) + ROM_CONTINUE(0x03000000, 0x800000) + ROM_CONTINUE(0x02800000, 0x800000) + ROM_CONTINUE(0x03800000, 0x800000) + + ROM_CONTINUE(0x04000000, 0x800000) + ROM_CONTINUE(0x05000000, 0x800000) + ROM_CONTINUE(0x04800000, 0x800000) + ROM_CONTINUE(0x05800000, 0x800000) + + ROM_CONTINUE(0x06000000, 0x800000) + ROM_CONTINUE(0x07000000, 0x800000) + ROM_CONTINUE(0x06800000, 0x800000) + ROM_CONTINUE(0x07800000, 0x800000) +ROM_END + void oplayer_100in1_state::init_oplayer() { @@ -848,7 +874,7 @@ void oplayer_100in1_state::init_m505neo() // TODO: remove these hacks // port a checks when starting the system - ROM[0x43c30 + (0x2000000 / 2)] = 0xf165; // boot + ROM[0x43c30 + (0x2000000 / 2)] = 0xf165; // boot main bank } @@ -858,20 +884,21 @@ void denver_200in1_state::init_denver() // patch checks when booting each bank, similar to oplayer uint16_t* rom = (uint16_t*)memregion("maincpu")->base(); - rom[0x175f7 + (0x0000000 / 2)] = 0xf165; - rom[0x18f47 + (0x1000000 / 2)] = 0xf165; - rom[0x33488 + (0x2000000 / 2)] = 0xf165; - rom[0x87f81 + (0x3000000 / 2)] = 0xf165; - rom[0x764d9 + (0x4000000 / 2)] = 0xf165; - rom[0xb454e + (0x5000000 / 2)] = 0xf165; - rom[0x43c30 + (0x6000000 / 2)] = 0xf165; // boot - rom[0x1fb00 + (0x7000000 / 2)] = 0xf165; - - // no exit patches required? + //rom[0x175f7 + (0x0000000 / 2)] = 0xf165; + //rom[0x18f47 + (0x1000000 / 2)] = 0xf165; + //rom[0x33488 + (0x2000000 / 2)] = 0xf165; + //rom[0x87f81 + (0x3000000 / 2)] = 0xf165; + //rom[0x764d9 + (0x4000000 / 2)] = 0xf165; + //rom[0xb454e + (0x5000000 / 2)] = 0xf165; + rom[0x43c30 + (0x6000000 / 2)] = 0xf165; // boot main bank + //rom[0x1fb00 + (0x7000000 / 2)] = 0xf165; } - - +void denver_200in1_state::init_m521neo() +{ + uint16_t* rom = (uint16_t*)memregion("maincpu")->base(); + rom[0x43c30 + (0x6000000 / 2)] = 0xf165; // boot main bank +} @@ -887,6 +914,9 @@ CONS( 200?, oplayer, 0, 0, zon32bit, oplayer, oplayer_100in1_state, init_oplay CONS( 2012, m505neo, 0, 0, zon32bit, oplayer, oplayer_100in1_state, init_m505neo, "Millennium 2000 GmbH", "Millennium M505 Arcade Neo Portable Spielkonsole (Family Sport 100-in-1)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) +// a version of this exists with the 'newer' style title screen seen in m505neo +CONS( 2012, m521neo, 0, 0, zon32bit, oplayer, denver_200in1_state, init_m521neo, "Millennium 2000 GmbH", "Millennium M521 Arcade Neo 2.0 (Family Sport 220-in-1) ", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) + /* DENVER(r) diff --git a/src/mame/includes/generalplus_gpl16250_romram.h b/src/mame/includes/generalplus_gpl16250_romram.h index 10b843cda0e..59fa6d33b3c 100644 --- a/src/mame/includes/generalplus_gpl16250_romram.h +++ b/src/mame/includes/generalplus_gpl16250_romram.h @@ -94,10 +94,26 @@ public: } protected: - //virtual void machine_start() override; virtual void machine_reset() override; private: + DECLARE_READ16_MEMBER(paccon_speedup_hack_r); +}; + +class jak_pf_game_state : public jak_s500_game_state +{ +public: + jak_pf_game_state(const machine_config& mconfig, device_type type, const char* tag) : + jak_s500_game_state(mconfig, type, tag) + { + } + +protected: + virtual void machine_reset() override; + +private: + DECLARE_READ16_MEMBER(jak_pf_speedup_hack_r); + DECLARE_READ16_MEMBER(jak_pf_speedup_hack2_r); }; @@ -109,7 +125,6 @@ public: { } - protected: virtual void machine_reset() override; diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 3047ca78adc..f7336bf5044 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -37628,6 +37628,7 @@ zon32bit // Zone 32-bit oplayer dnv200fs m505neo +m521neo @source:spiders.cpp spiders // (c) 1981 Sigma Ent. Inc. -- cgit v1.2.3