mirror of
https://github.com/holub/mame
synced 2025-04-25 17:56:43 +03:00
simpsons: Correct video clocks [P. Bennett]
This commit is contained in:
parent
7d55466ca7
commit
b4a30b9c09
@ -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);
|
||||
|
@ -32,6 +32,7 @@ private:
|
||||
enum
|
||||
{
|
||||
TIMER_NMI,
|
||||
TIMER_DMASTART,
|
||||
TIMER_DMAEND
|
||||
};
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user