From b4a30b9c09ba71d7f58d2f8356a99f539ee65d1b Mon Sep 17 00:00:00 2001 From: Olivier Galibert Date: Sun, 26 Apr 2020 17:41:50 +0200 Subject: [PATCH] simpsons: Correct video clocks [P. Bennett] --- src/mame/drivers/simpsons.cpp | 27 +++++++++++++++++++-------- src/mame/includes/simpsons.h | 1 + src/mame/machine/simpsons.cpp | 2 ++ src/mame/video/k052109.cpp | 16 ++++++++++++++-- src/mame/video/k052109.h | 4 ++++ 5 files changed, 40 insertions(+), 10 deletions(-) diff --git a/src/mame/drivers/simpsons.cpp b/src/mame/drivers/simpsons.cpp index 9f363ffbd86..c9d3bcc2429 100644 --- a/src/mame/drivers/simpsons.cpp +++ b/src/mame/drivers/simpsons.cpp @@ -173,9 +173,12 @@ void simpsons_state::device_timer(emu_timer &timer, device_timer_id id, int para case TIMER_NMI: m_audiocpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE); break; - case TIMER_DMAEND: + case TIMER_DMASTART: if (m_firq_enabled) - m_maincpu->set_input_line(KONAMI_FIRQ_LINE, HOLD_LINE); + m_maincpu->set_input_line(KONAMI_FIRQ_LINE, ASSERT_LINE); + break; + case TIMER_DMAEND: + m_maincpu->set_input_line(KONAMI_FIRQ_LINE, CLEAR_LINE); break; default: throw emu_fatalerror("Unknown id in simpsons_state::device_timer"); @@ -313,8 +316,8 @@ INTERRUPT_GEN_MEMBER(simpsons_state::simpsons_irq) if (m_k053246->k053246_is_irq_enabled()) { simpsons_objdma(); - // 32+256us delay at 8MHz dotclock; artificially shortened since actual V-blank length is unknown - timer_set(attotime::from_usec(30), TIMER_DMAEND); + timer_set(attotime::from_ticks(256, XTAL(24'000'000)/4), TIMER_DMASTART); + timer_set(attotime::from_ticks(256+2048, XTAL(24'000'000)/4), TIMER_DMAEND); } } @@ -335,12 +338,19 @@ void simpsons_state::simpsons(machine_config &config) EEPROM_ER5911_8BIT(config, "eeprom"); WATCHDOG_TIMER(config, "watchdog"); + //So, the horizontal timing of simpsons is 16/32/16/320 + //6MHz dot clock + //Vertical is 16/8/16/224 /* video hardware */ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); - screen.set_raw(XTAL(24'000'000)/3, 528, 112, 400, 256, 16, 240); -// 6MHz dotclock is more realistic, however needs drawing updates. replace when ready -// screen.set_raw(XTAL(24'000'000)/4, 396, hbend, hbstart, 256, 16, 240); + + // Screen timings generated by the 051962, probably not programmable (except maybe between 6 amd 8MHz) + // 6MHz dot clock + // horizontal: 16 cycles front porch, 32 cycles sync, 16 cycles back porch + // vertical: 16 lines front porch, 8 lines sync, 16 lines back porch + + screen.set_raw(XTAL(24'000'000)/4, 384, 0, 320, 256, 0, 224); screen.set_video_attributes(VIDEO_UPDATE_AFTER_VBLANK); screen.set_screen_update(FUNC(simpsons_state::screen_update_simpsons)); screen.set_palette("palette"); @@ -348,6 +358,7 @@ void simpsons_state::simpsons(machine_config &config) PALETTE(config, "palette").set_format(palette_device::xBGR_555, 2048).enable_shadows().enable_hilights(); K052109(config, m_k052109, 0); + m_k052109->set_xy_offset(-96, -16); m_k052109->set_palette("palette"); m_k052109->set_screen("screen"); m_k052109->set_tile_callback(FUNC(simpsons_state::tile_callback)); @@ -355,7 +366,7 @@ void simpsons_state::simpsons(machine_config &config) K053246(config, m_k053246, 0); m_k053246->set_sprite_callback(FUNC(simpsons_state::sprite_callback)); - m_k053246->set_config(NORMAL_PLANE_ORDER, 53, 23); + m_k053246->set_config(NORMAL_PLANE_ORDER, -43, 39); m_k053246->set_palette("palette"); K053251(config, m_k053251, 0); diff --git a/src/mame/includes/simpsons.h b/src/mame/includes/simpsons.h index 3a206085c3c..0670f743e1a 100644 --- a/src/mame/includes/simpsons.h +++ b/src/mame/includes/simpsons.h @@ -32,6 +32,7 @@ private: enum { TIMER_NMI, + TIMER_DMASTART, TIMER_DMAEND }; diff --git a/src/mame/machine/simpsons.cpp b/src/mame/machine/simpsons.cpp index 90ee5566cdc..e5c3ed07c78 100644 --- a/src/mame/machine/simpsons.cpp +++ b/src/mame/machine/simpsons.cpp @@ -22,6 +22,8 @@ WRITE8_MEMBER(simpsons_state::simpsons_eeprom_w) simpsons_video_banking(data & 0x03); m_firq_enabled = data & 0x04; + if (!m_firq_enabled) + m_maincpu->set_input_line(KONAMI_FIRQ_LINE, CLEAR_LINE); } /*************************************************************************** diff --git a/src/mame/video/k052109.cpp b/src/mame/video/k052109.cpp index 24ade46c68f..661ba6ddae0 100644 --- a/src/mame/video/k052109.cpp +++ b/src/mame/video/k052109.cpp @@ -184,6 +184,8 @@ k052109_device::k052109_device(const machine_config &mconfig, const char *tag, d m_irq_enabled(0), m_romsubbank(0), m_scrollctrl(0), + m_dx(0), + m_dy(0), m_char_rom(*this, DEVICE_SELF), m_k052109_cb(*this), m_irq_handler(*this), @@ -248,8 +250,12 @@ void k052109_device::device_start() m_tilemap[1]->set_transparent_pen(0); m_tilemap[2]->set_transparent_pen(0); - m_tilemap[1]->set_scrolldx(6, 6); - m_tilemap[2]->set_scrolldx(6, 6); + m_tilemap[0]->set_scrolldx(m_dx, m_dx); + m_tilemap[1]->set_scrolldx(m_dx+6, m_dx+6); + m_tilemap[2]->set_scrolldx(m_dx+6, m_dx+6); + m_tilemap[0]->set_scrolldy(m_dy, m_dy); + m_tilemap[1]->set_scrolldy(m_dy, m_dy); + m_tilemap[2]->set_scrolldy(m_dy, m_dy); save_pointer(NAME(m_ram), 0x6000); save_item(NAME(m_rmrd_line)); @@ -294,6 +300,12 @@ void k052109_device::device_post_load() DEVICE HANDLERS *****************************************************************************/ +void k052109_device::set_xy_offset(int dx, int dy) +{ + m_dx = dx; + m_dy = dy; +} + void k052109_device::vblank_callback(screen_device &screen, bool state) { if (state && m_irq_enabled) diff --git a/src/mame/video/k052109.h b/src/mame/video/k052109.h index e597e63a7a6..0dc28c7651c 100644 --- a/src/mame/video/k052109.h +++ b/src/mame/video/k052109.h @@ -58,6 +58,8 @@ public: void vblank_callback(screen_device &screen, bool state); + void set_xy_offset(int dx, int dy); + protected: // device-level overrides virtual void device_start() override; @@ -86,6 +88,8 @@ private: uint8_t m_irq_enabled; uint8_t m_romsubbank, m_scrollctrl; + int m_dx, m_dy; + optional_region_ptr m_char_rom; tile_delegate m_k052109_cb;