From b29a4c1f86164bd26a789c9d98762d7837aa2edf Mon Sep 17 00:00:00 2001 From: angelosa Date: Fri, 5 Jan 2024 00:35:30 +0100 Subject: amiga: get rid of logic setups in screen_update --- src/mame/amiga/alg.cpp | 3 ++- src/mame/amiga/amiga.cpp | 16 ++++++++-------- src/mame/amiga/amiga.h | 5 +++-- src/mame/amiga/amiga_m.cpp | 35 +++++++++++++++++++++++++---------- src/mame/amiga/amiga_v.cpp | 21 ++++++++------------- src/mame/amiga/amigaaga.cpp | 23 +++-------------------- src/mame/amiga/cubo.cpp | 2 +- 7 files changed, 50 insertions(+), 55 deletions(-) diff --git a/src/mame/amiga/alg.cpp b/src/mame/amiga/alg.cpp index 5c96cf1155d..14e1401aeb9 100644 --- a/src/mame/amiga/alg.cpp +++ b/src/mame/amiga/alg.cpp @@ -348,9 +348,10 @@ void alg_state::alg_r1(machine_config &config) SONY_LDP1450(config, m_laserdisc, 9600); m_laserdisc->set_screen("screen"); - m_laserdisc->set_overlay(512*2, 262, FUNC(amiga_state::screen_update_amiga)); + m_laserdisc->set_overlay(512*2, 262, FUNC(amiga_state::screen_update)); m_laserdisc->set_overlay_clip((129-8)*2, (449+8-1)*2, 44-8, 244+8-1); + // FIXME: should be 4096 PALETTE(config, m_palette, FUNC(alg_state::amiga_palette), 4097); MCFG_VIDEO_START_OVERRIDE(alg_state,alg) diff --git a/src/mame/amiga/amiga.cpp b/src/mame/amiga/amiga.cpp index fabb0fcc924..30d6dcb9610 100644 --- a/src/mame/amiga/amiga.cpp +++ b/src/mame/amiga/amiga.cpp @@ -2081,7 +2081,7 @@ void a1200_state::a1200(machine_config &config) kbd.kdat_handler().set("cia_0", FUNC(mos8520_device::sp_w)); kbd.krst_handler().set(FUNC(a1200_state::kbreset_w)); - m_screen->set_screen_update(FUNC(amiga_state::screen_update_amiga_aga)); + m_screen->set_screen_update(FUNC(amiga_state::screen_update)); MCFG_VIDEO_START_OVERRIDE(amiga_state, amiga_aga) @@ -2122,7 +2122,7 @@ void a1200_state::a1200n(machine_config &config) subdevice("gayle")->set_clock(amiga_state::CLK_28M_NTSC / 2); config.device_remove("screen"); ntsc_video(config); - m_screen->set_screen_update(FUNC(amiga_state::screen_update_amiga_aga)); + m_screen->set_screen_update(FUNC(amiga_state::screen_update)); m_paula->set_clock(amiga_state::CLK_C1_NTSC); m_cia_0->set_clock(amiga_state::CLK_E_NTSC); m_cia_1->set_clock(amiga_state::CLK_E_NTSC); @@ -2148,7 +2148,7 @@ void a4000_state::a4000(machine_config &config) kbd.kclk_handler().set("cia_0", FUNC(mos8520_device::cnt_w)); kbd.kdat_handler().set("cia_0", FUNC(mos8520_device::sp_w)); - m_screen->set_screen_update(FUNC(amiga_state::screen_update_amiga_aga)); + m_screen->set_screen_update(FUNC(amiga_state::screen_update)); MCFG_VIDEO_START_OVERRIDE(amiga_state, amiga_aga) @@ -2173,7 +2173,7 @@ void a4000_state::a4000n(machine_config &config) config.device_remove("screen"); ntsc_video(config); - m_screen->set_screen_update(FUNC(amiga_state::screen_update_amiga_aga)); + m_screen->set_screen_update(FUNC(amiga_state::screen_update)); m_paula->set_clock(amiga_state::CLK_C1_NTSC); m_cia_0->set_clock(amiga_state::CLK_E_NTSC); m_cia_1->set_clock(amiga_state::CLK_E_NTSC); @@ -2196,7 +2196,7 @@ void a4000_state::a400030n(machine_config &config) a400030(config); config.device_remove("screen"); ntsc_video(config); - m_screen->set_screen_update(FUNC(amiga_state::screen_update_amiga_aga)); + m_screen->set_screen_update(FUNC(amiga_state::screen_update)); m_paula->set_clock(amiga_state::CLK_C1_NTSC); m_cia_0->set_clock(amiga_state::CLK_E_NTSC); m_cia_1->set_clock(amiga_state::CLK_E_NTSC); @@ -2230,7 +2230,7 @@ void cd32_state::cd32(machine_config &config) akiko.sda_r_callback().set("i2cmem", FUNC(i2cmem_device::read_sda)); akiko.sda_w_callback().set("i2cmem", FUNC(i2cmem_device::write_sda)); - m_screen->set_screen_update(FUNC(amiga_state::screen_update_amiga_aga)); + m_screen->set_screen_update(FUNC(amiga_state::screen_update)); MCFG_VIDEO_START_OVERRIDE(amiga_state, amiga_aga) @@ -2248,7 +2248,7 @@ void cd32_state::cd32n(machine_config &config) m_maincpu->set_clock(amiga_state::CLK_28M_NTSC / 2); config.device_remove("screen"); ntsc_video(config); - m_screen->set_screen_update(FUNC(amiga_state::screen_update_amiga_aga)); + m_screen->set_screen_update(FUNC(amiga_state::screen_update)); m_paula->set_clock(amiga_state::CLK_C1_NTSC); m_cia_0->set_clock(amiga_state::CLK_E_NTSC); m_cia_1->set_clock(amiga_state::CLK_E_NTSC); @@ -2272,7 +2272,7 @@ void a4000_state::a4000tn(machine_config &config) config.device_remove("screen"); ntsc_video(config); - m_screen->set_screen_update(FUNC(amiga_state::screen_update_amiga_aga)); + m_screen->set_screen_update(FUNC(amiga_state::screen_update)); m_paula->set_clock(amiga_state::CLK_C1_NTSC); m_cia_0->set_clock(amiga_state::CLK_E_NTSC); m_cia_1->set_clock(amiga_state::CLK_E_NTSC); diff --git a/src/mame/amiga/amiga.h b/src/mame/amiga/amiga.h index 2edb68625e4..b7b36c4b9e0 100644 --- a/src/mame/amiga/amiga.h +++ b/src/mame/amiga/amiga.h @@ -434,8 +434,7 @@ public: DECLARE_VIDEO_START( amiga_aga ); void amiga_palette(palette_device &palette) const; - uint32_t screen_update_amiga(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); - uint32_t screen_update_amiga_aga(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); void update_screenmode(); TIMER_CALLBACK_MEMBER( scanline_callback ); @@ -622,6 +621,7 @@ protected: // TODO: move to Agnus/Alice u16 vposr_r(); + u16 vhposr_r(); void vposw_w(u16 data); void bplcon0_w(u16 data); void aga_bplcon0_w(u16 data); @@ -709,6 +709,7 @@ private: bool m_previous_lof; bitmap_rgb32 m_flickerfixer; + bitmap_rgb32 m_scanline_bitmap; uint16_t m_rx_shift; uint16_t m_tx_shift; diff --git a/src/mame/amiga/amiga_m.cpp b/src/mame/amiga/amiga_m.cpp index eff150e7dec..2a79a27bf2e 100644 --- a/src/mame/amiga/amiga_m.cpp +++ b/src/mame/amiga/amiga_m.cpp @@ -27,6 +27,8 @@ #define LOG_SERIAL (1U << 4) #define VERBOSE (LOG_SERIAL) +//#define LOG_OUTPUT_FUNC osd_printf_info + #include "logmacro.h" @@ -273,13 +275,13 @@ TIMER_CALLBACK_MEMBER( amiga_state::scanline_callback ) } // render up to this scanline - if (!m_screen->update_partial(scanline)) + //if (!m_screen->update_partial(scanline)) { - bitmap_rgb32 dummy_bitmap; + //bitmap_rgb32 dummy_bitmap; if (IS_AGA()) - aga_render_scanline(dummy_bitmap, scanline); + aga_render_scanline(m_scanline_bitmap, scanline); else - render_scanline(dummy_bitmap, scanline); + render_scanline(m_scanline_bitmap, scanline); } // clock tod (if we actually render this scanline) @@ -1117,7 +1119,7 @@ void amiga_state::ocs_map(address_map &map) // map(0x000, 0x001).r(FUNC(amiga_state::bltddat_r)); // map(0x002, 0x003).r(FUNC(amiga_state::dmaconr_r)); map(0x004, 0x005).r(FUNC(amiga_state::vposr_r)); -// map(0x006, 0x007).r(FUNC(amiga_state::vhposr_r)); + map(0x006, 0x007).r(FUNC(amiga_state::vhposr_r)); // map(0x008, 0x009).r(FUNC(amiga_state::dskdatr_r)); // TODO: verify if JOYxDAT really belongs to Denise (???) // map(0x00a, 0x00b).r(FUNC(amiga_state::joydat_r<0>)); @@ -1262,6 +1264,11 @@ u16 amiga_state::vposr_r() return res; } +u16 amiga_state::vhposr_r() +{ + return amiga_gethvpos() & 0xffff; +} + void amiga_state::vposw_w(u16 data) { // TODO: data actually resync the screen? @@ -1499,7 +1506,7 @@ void amiga_state::custom_chip_w(offs_t offset, uint16_t data) } break; - // OCS and AGA versions of Soccer Kid explicitly writes blitter addresses way beyond chip RAM + // soccerkd (OCS) and sockid_a (AGA) explicitly writes blitter addresses way beyond chip RAM // This is clearly deterministic: it draws an individual empty tile scattered across playfield // (which also collides on top of it) case REG_BLTAPTH: case REG_BLTBPTH: case REG_BLTCPTH: case REG_BLTDPTH: @@ -1568,11 +1575,15 @@ void amiga_state::custom_chip_w(offs_t offset, uint16_t data) data = (data & INTENA_SETCLR) ? (CUSTOM_REG(offset) | (data & 0x7fff)) : (CUSTOM_REG(offset) & ~(data & 0x7fff)); CUSTOM_REG(offset) = data; if (temp & INTENA_SETCLR) - // if we're enabling irq's, delay a bit + { + /* if we're enabling irq's, delay a bit */ m_irq_timer->adjust(m_maincpu->cycles_to_attotime(AMIGA_IRQ_DELAY_CYCLES)); + } else - // if we're disabling irq's, process right away + { + /* if we're disabling irq's, process right away */ update_irqs(); + } break; case REG_INTREQ: @@ -1593,11 +1604,15 @@ void amiga_state::custom_chip_w(offs_t offset, uint16_t data) CUSTOM_REG(offset) = data; if (temp & INTENA_SETCLR) - // if we're generating irq's, delay a bit + { + /* if we're generating irq's, delay a bit */ m_irq_timer->adjust(m_maincpu->cycles_to_attotime(AMIGA_IRQ_DELAY_CYCLES)); + } else - // if we're clearing irq's, process right away + { + /* if we're clearing irq's, process right away */ update_irqs(); + } break; case REG_ADKCON: diff --git a/src/mame/amiga/amiga_v.cpp b/src/mame/amiga/amiga_v.cpp index 98bf0d3c01c..7ed423e6eb3 100644 --- a/src/mame/amiga/amiga_v.cpp +++ b/src/mame/amiga/amiga_v.cpp @@ -101,6 +101,7 @@ VIDEO_START_MEMBER( amiga_state, amiga ) m_sprite_ctl_written = 0; m_screen->register_screen_bitmap(m_flickerfixer); + m_screen->register_screen_bitmap(m_scanline_bitmap); } @@ -124,7 +125,7 @@ uint32_t amiga_state::amiga_gethvpos() /* if there's no latched position, or if we are in the active display area */ /* but before the latching point, return the live HV position */ - if ((CUSTOM_REG(REG_BPLCON0) & 0x0008) == 0 || latchedpos == 0 || (m_last_scanline >= 20 && hvpos < latchedpos)) + if (!BIT(CUSTOM_REG(REG_BPLCON0), 3) || latchedpos == 0 || (m_last_scanline >= 20 && hvpos < latchedpos)) return hvpos; /* otherwise, return the latched position (cfr. lightgun input in alg.cpp, lightpen) */ @@ -513,6 +514,8 @@ void amiga_state::render_scanline(bitmap_rgb32 &bitmap, int scanline) // otherwise just render the contents of the previous frame's scanline int shift = (m_previous_lof == lof) ? 1 : 0; + if ((scanline - shift) < 0) + return; std::copy_n(&m_flickerfixer.pix(scanline - shift), amiga_state::SCREEN_WIDTH, &bitmap.pix(scanline)); return; } @@ -864,17 +867,9 @@ void amiga_state::render_scanline(bitmap_rgb32 &bitmap, int scanline) * *************************************/ -uint32_t amiga_state::screen_update_amiga(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +uint32_t amiga_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { - // sometimes the core tells us to render a bunch of lines to keep up (resolution change, for example) - // this causes trouble for us since it can happen at any time - if (cliprect.top() != cliprect.bottom()) - return 0; - - // render each scanline in the visible region - for (int y = cliprect.top(); y <= cliprect.bottom(); y++) - render_scanline(bitmap, y); - + copybitmap(bitmap, m_scanline_bitmap, 0, 0, 0, 0, cliprect); return 0; } @@ -919,7 +914,7 @@ void amiga_state::pal_video(machine_config &config) amiga_state::SCREEN_WIDTH, amiga_state::HBLANK, amiga_state::SCREEN_WIDTH, amiga_state::SCREEN_HEIGHT_PAL, amiga_state::VBLANK_PAL, amiga_state::SCREEN_HEIGHT_PAL ); - m_screen->set_screen_update(FUNC(amiga_state::screen_update_amiga)); + m_screen->set_screen_update(FUNC(amiga_state::screen_update)); } void amiga_state::ntsc_video(machine_config &config) @@ -931,5 +926,5 @@ void amiga_state::ntsc_video(machine_config &config) amiga_state::SCREEN_WIDTH, amiga_state::HBLANK, amiga_state::SCREEN_WIDTH, amiga_state::SCREEN_HEIGHT_NTSC, amiga_state::VBLANK_NTSC, amiga_state::SCREEN_HEIGHT_NTSC ); - m_screen->set_screen_update(FUNC(amiga_state::screen_update_amiga)); + m_screen->set_screen_update(FUNC(amiga_state::screen_update)); } diff --git a/src/mame/amiga/amigaaga.cpp b/src/mame/amiga/amigaaga.cpp index b617564eb62..7550305f592 100644 --- a/src/mame/amiga/amigaaga.cpp +++ b/src/mame/amiga/amigaaga.cpp @@ -505,6 +505,8 @@ void amiga_state::aga_render_scanline(bitmap_rgb32 &bitmap, int scanline) // otherwise just render the contents of the previous frame's scanline int shift = (m_previous_lof == lof) ? 1 : 0; + if ((scanline - shift) < 0) + return; std::copy_n(&m_flickerfixer.pix(scanline - shift), amiga_state::SCREEN_WIDTH, &bitmap.pix(scanline)); return; } @@ -515,6 +517,7 @@ void amiga_state::aga_render_scanline(bitmap_rgb32 &bitmap, int scanline) m_last_scanline = scanline; /* update sprite data fetching */ + // FIXME: verify and apply same logic as per OCS aga_update_sprite_dma(scanline); /* all sprites off at the start of the line */ @@ -929,23 +932,3 @@ void amiga_state::aga_render_scanline(bitmap_rgb32 &bitmap, int scanline) if (dst != nullptr) std::copy_n(dst, amiga_state::SCREEN_WIDTH, &m_flickerfixer.pix(save_scanline)); } - - - -/************************************* - * - * Update - * - *************************************/ - -uint32_t amiga_state::screen_update_amiga_aga(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) -{ - if (cliprect.top() != cliprect.bottom()) - return 0; - - // render each scanline in the visible region - for (int y = cliprect.top(); y <= cliprect.bottom(); y++) - aga_render_scanline(bitmap, y); - - return 0; -} diff --git a/src/mame/amiga/cubo.cpp b/src/mame/amiga/cubo.cpp index c86f61fd1e1..9a31cb65c42 100644 --- a/src/mame/amiga/cubo.cpp +++ b/src/mame/amiga/cubo.cpp @@ -1092,7 +1092,7 @@ void cubo_state::cubo(machine_config &config) // video hardware pal_video(config); - m_screen->set_screen_update(FUNC(amiga_state::screen_update_amiga_aga)); + m_screen->set_screen_update(FUNC(amiga_state::screen_update)); PALETTE(config, m_palette, FUNC(amiga_state::amiga_palette), 4096); MCFG_VIDEO_START_OVERRIDE(amiga_state, amiga_aga) -- cgit v1.2.3