simpsons: Correct video clocks [P. Bennett]

This commit is contained in:
Olivier Galibert 2020-04-26 17:41:50 +02:00
parent 7d55466ca7
commit b4a30b9c09
5 changed files with 40 additions and 10 deletions

View File

@ -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);

View File

@ -32,6 +32,7 @@ private:
enum
{
TIMER_NMI,
TIMER_DMASTART,
TIMER_DMAEND
};

View File

@ -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);
}
/***************************************************************************

View File

@ -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)

View File

@ -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<uint8_t> m_char_rom;
tile_delegate m_k052109_cb;