diff options
Diffstat (limited to 'src/mame/drivers/tetrisp2.cpp')
-rw-r--r-- | src/mame/drivers/tetrisp2.cpp | 492 |
1 files changed, 233 insertions, 259 deletions
diff --git a/src/mame/drivers/tetrisp2.cpp b/src/mame/drivers/tetrisp2.cpp index b2eb4ca2426..0f2068397f4 100644 --- a/src/mame/drivers/tetrisp2.cpp +++ b/src/mame/drivers/tetrisp2.cpp @@ -65,51 +65,6 @@ stepstag: #include "stepstag.lh" -/*************************************************************************** - - - System Registers - - -***************************************************************************/ - -void tetrisp2_state::tetrisp2_systemregs_w(offs_t offset, u16 data, u16 mem_mask) -{ - if (ACCESSING_BITS_0_7) - { - m_systemregs[offset] = data; - } -} - -#define ROCKN_TIMER_BASE attotime::from_nsec(500000) - -void tetrisp2_state::rockn_systemregs_w(offs_t offset, u16 data, u16 mem_mask) -{ - if (ACCESSING_BITS_0_7) - { - m_systemregs[offset] = data; - if (offset == 0x0c) - { - attotime timer = ROCKN_TIMER_BASE * (4096 - data); - m_rockn_timer_l4->adjust(timer, 0, timer); - } - } -} - - -void tetrisp2_state::rocknms_sub_systemregs_w(offs_t offset, u16 data, u16 mem_mask) -{ - if (ACCESSING_BITS_0_7) - { - m_rocknms_sub_systemregs[offset] = data; - if (offset == 0x0c) - { - attotime timer = ROCKN_TIMER_BASE * (4096 - data); - m_rockn_timer_sub_l4->adjust(timer, 0, timer); - } - } -} - /*************************************************************************** @@ -182,6 +137,7 @@ u16 tetrisp2_state::rockn_soundvolume_r() void tetrisp2_state::rockn_soundvolume_w(u16 data) { m_rockn_soundvolume = data; + // TODO: unemulated } @@ -263,23 +219,23 @@ u16 tetrisp2_state::rockn_nvram_r(offs_t offset) ***************************************************************************/ -u16 tetrisp2_state::rocknms_main2sub_r() +u16 rocknms_state::rocknms_main2sub_r() { return m_rocknms_main2sub; } -void tetrisp2_state::rocknms_main2sub_w(offs_t offset, u16 data, u16 mem_mask) +void rocknms_state::rocknms_main2sub_w(offs_t offset, u16 data, u16 mem_mask) { if (ACCESSING_BITS_0_7) m_rocknms_main2sub = (data ^ 0xffff); } -CUSTOM_INPUT_MEMBER(tetrisp2_state::rocknms_main2sub_status_r) +CUSTOM_INPUT_MEMBER(rocknms_state::rocknms_main2sub_status_r) { - return m_rocknms_sub2main & 0x0003; + return m_rocknms_sub2main & 0x0003; } -void tetrisp2_state::rocknms_sub2main_w(offs_t offset, u16 data, u16 mem_mask) +void rocknms_state::rocknms_sub2main_w(offs_t offset, u16 data, u16 mem_mask) { if (ACCESSING_BITS_0_7) m_rocknms_sub2main = (data ^ 0xffff); @@ -324,7 +280,7 @@ void tetrisp2_state::tetrisp2_map(address_map &map) map(0xb40010, 0xb4001b).writeonly().share("scroll_bg"); // Background Scrolling map(0xb4003e, 0xb4003f).nopw(); // scr_size map(0xb60000, 0xb6002f).writeonly().share("rotregs"); // Rotation Registers - map(0xba0000, 0xba001f).w(FUNC(tetrisp2_state::tetrisp2_systemregs_w)); // system param + map(0xba0000, 0xba001f).m(m_sysctrl, FUNC(jaleco_ms32_sysctrl_device::amap)); map(0xbe0000, 0xbe0001).nopr(); // INT-level1 dummy read map(0xbe0002, 0xbe0003).portr("PLAYERS"); // Inputs map(0xbe0004, 0xbe0005).r(FUNC(tetrisp2_state::tetrisp2_ip_1_word_r)); // Inputs & protection @@ -389,7 +345,7 @@ void tetrisp2_state::nndmseal_map(address_map &map) map(0xb80000, 0xb80001).w(FUNC(tetrisp2_state::nndmseal_sound_bank_w)); - map(0xba0000, 0xba001f).w(FUNC(tetrisp2_state::rockn_systemregs_w)); // system param + map(0xba0000, 0xba001f).m(m_sysctrl, FUNC(jaleco_ms32_sysctrl_device::amap)); map(0xbe0000, 0xbe0001).nopr(); // INT-level1 dummy read map(0xbe0002, 0xbe0003).portr("BUTTONS"); // Inputs @@ -425,7 +381,7 @@ void tetrisp2_state::rockn1_map(address_map &map) map(0xb40010, 0xb4001b).writeonly().share("scroll_bg"); // Background Scrolling map(0xb4003e, 0xb4003f).nopw(); // scr_size map(0xb60000, 0xb6002f).writeonly().share("rotregs"); // Rotation Registers - map(0xba0000, 0xba001f).w(FUNC(tetrisp2_state::rockn_systemregs_w)); // system param + map(0xba0000, 0xba001f).m(m_sysctrl, FUNC(jaleco_ms32_sysctrl_device::amap)); map(0xbe0000, 0xbe0001).nopr(); // INT-level1 dummy read map(0xbe0002, 0xbe0003).portr("PLAYERS"); // Inputs map(0xbe0004, 0xbe0005).portr("SYSTEM"); // Inputs @@ -458,7 +414,7 @@ void tetrisp2_state::rockn2_map(address_map &map) map(0xb40010, 0xb4001b).writeonly().share("scroll_bg"); // Background Scrolling map(0xb4003e, 0xb4003f).nopw(); // scr_size map(0xb60000, 0xb6002f).writeonly().share("rotregs"); // Rotation Registers - map(0xba0000, 0xba001f).w(FUNC(tetrisp2_state::rockn_systemregs_w)); // system param + map(0xba0000, 0xba001f).m(m_sysctrl, FUNC(jaleco_ms32_sysctrl_device::amap)); map(0xbe0000, 0xbe0001).nopr(); // INT-level1 dummy read map(0xbe0002, 0xbe0003).portr("PLAYERS"); // Inputs map(0xbe0004, 0xbe0005).portr("SYSTEM"); // Inputs @@ -467,32 +423,32 @@ void tetrisp2_state::rockn2_map(address_map &map) } -void tetrisp2_state::rocknms_main_map(address_map &map) +void rocknms_state::rocknms_main_map(address_map &map) { map(0x000000, 0x0fffff).rom(); // ROM map(0x100000, 0x103fff).ram().share("spriteram"); // Object RAM map(0x104000, 0x107fff).ram(); // Spare Object RAM map(0x108000, 0x10ffff).ram(); // Work RAM - map(0x200000, 0x23ffff).rw(FUNC(tetrisp2_state::tetrisp2_priority_r), FUNC(tetrisp2_state::tetrisp2_priority_w)); - map(0x300000, 0x31ffff).ram().w(FUNC(tetrisp2_state::tetrisp2_palette_w)).share("paletteram"); // Palette + map(0x200000, 0x23ffff).rw(FUNC(rocknms_state::tetrisp2_priority_r), FUNC(rocknms_state::tetrisp2_priority_w)); + map(0x300000, 0x31ffff).ram().w(FUNC(rocknms_state::tetrisp2_palette_w)).share("paletteram"); // Palette // map(0x500000, 0x50ffff).ram(); // Line - map(0x600000, 0x60ffff).ram().w(FUNC(tetrisp2_state::tetrisp2_vram_rot_w)).share("vram_rot"); // Rotation - map(0x800000, 0x803fff).ram().w(FUNC(tetrisp2_state::tetrisp2_vram_fg_w)).share("vram_fg"); // Foreground - map(0x804000, 0x807fff).ram().w(FUNC(tetrisp2_state::tetrisp2_vram_bg_w)).share("vram_bg"); // Background + map(0x600000, 0x60ffff).ram().w(FUNC(rocknms_state::tetrisp2_vram_rot_w)).share("vram_rot"); // Rotation + map(0x800000, 0x803fff).ram().w(FUNC(rocknms_state::tetrisp2_vram_fg_w)).share("vram_fg"); // Foreground + map(0x804000, 0x807fff).ram().w(FUNC(rocknms_state::tetrisp2_vram_bg_w)).share("vram_bg"); // Background // map(0x808000, 0x809fff).ram(); // ??? - map(0x900000, 0x903fff).r(FUNC(tetrisp2_state::rockn_nvram_r)).w(FUNC(tetrisp2_state::tetrisp2_nvram_w)).share("nvram"); // NVRAM - map(0xa30000, 0xa30001).rw(FUNC(tetrisp2_state::rockn_soundvolume_r), FUNC(tetrisp2_state::rockn_soundvolume_w)); // Sound Volume + map(0x900000, 0x903fff).r(FUNC(rocknms_state::rockn_nvram_r)).w(FUNC(rocknms_state::tetrisp2_nvram_w)).share("nvram"); // NVRAM + map(0xa30000, 0xa30001).rw(FUNC(rocknms_state::rockn_soundvolume_r), FUNC(rocknms_state::rockn_soundvolume_w)); // Sound Volume map(0xa40000, 0xa40003).rw("ymz", FUNC(ymz280b_device::read), FUNC(ymz280b_device::write)).umask16(0x00ff); // Sound - map(0xa44000, 0xa44001).rw(FUNC(tetrisp2_state::rockn_adpcmbank_r), FUNC(tetrisp2_state::rockn_adpcmbank_w)); // Sound Bank + map(0xa44000, 0xa44001).rw(FUNC(rocknms_state::rockn_adpcmbank_r), FUNC(rocknms_state::rockn_adpcmbank_w)); // Sound Bank map(0xa48000, 0xa48001).nopw(); // YMZ280 Reset - map(0xa00000, 0xa00001).w(FUNC(tetrisp2_state::rocknms_main2sub_w)); // MAIN -> SUB Communication - map(0xb00000, 0xb00001).w(FUNC(tetrisp2_state::tetrisp2_coincounter_w)); // Coin Counter + map(0xa00000, 0xa00001).w(FUNC(rocknms_state::rocknms_main2sub_w)); // MAIN -> SUB Communication + map(0xb00000, 0xb00001).w(FUNC(rocknms_state::tetrisp2_coincounter_w)); // Coin Counter map(0xb20000, 0xb20001).nopw(); // ??? map(0xb40000, 0xb4000b).writeonly().share("scroll_fg"); // Foreground Scrolling map(0xb40010, 0xb4001b).writeonly().share("scroll_bg"); // Background Scrolling map(0xb4003e, 0xb4003f).nopw(); // scr_size map(0xb60000, 0xb6002f).writeonly().share("rotregs"); // Rotation Registers - map(0xba0000, 0xba001f).w(FUNC(tetrisp2_state::rockn_systemregs_w)); // system param + map(0xba0000, 0xba001f).m(m_sysctrl, FUNC(jaleco_ms32_sysctrl_device::amap)); map(0xbe0000, 0xbe0001).nopr(); // INT-level1 dummy read map(0xbe0002, 0xbe0003).portr("PLAYERS"); map(0xbe0004, 0xbe0005).portr("SYSTEM"); // Inputs @@ -501,33 +457,33 @@ void tetrisp2_state::rocknms_main_map(address_map &map) } -void tetrisp2_state::rocknms_sub_map(address_map &map) +void rocknms_state::rocknms_sub_map(address_map &map) { map(0x000000, 0x0fffff).rom(); // ROM map(0x100000, 0x103fff).ram().share("spriteram2"); // Object RAM map(0x104000, 0x107fff).ram(); // Spare Object RAM map(0x108000, 0x10ffff).ram(); // Work RAM - map(0x200000, 0x23ffff).ram().w(FUNC(tetrisp2_state::rocknms_sub_priority_w)).share("sub_priority"); // Priority - map(0x300000, 0x31ffff).ram().w(FUNC(tetrisp2_state::rocknms_sub_palette_w)).share("sub_paletteram"); // Palette + map(0x200000, 0x23ffff).ram().w(FUNC(rocknms_state::rocknms_sub_priority_w)).share("sub_priority"); // Priority + map(0x300000, 0x31ffff).ram().w(FUNC(rocknms_state::rocknms_sub_palette_w)).share("sub_paletteram"); // Palette // map(0x500000, 0x50ffff).ram(); // Line - map(0x600000, 0x60ffff).ram().w(FUNC(tetrisp2_state::rocknms_sub_vram_rot_w)).share("sub_vram_rot"); // Rotation - map(0x800000, 0x803fff).ram().w(FUNC(tetrisp2_state::rocknms_sub_vram_fg_w)).share("sub_vram_fg"); // Foreground - map(0x804000, 0x807fff).ram().w(FUNC(tetrisp2_state::rocknms_sub_vram_bg_w)).share("sub_vram_bg"); // Background + map(0x600000, 0x60ffff).ram().w(FUNC(rocknms_state::rocknms_sub_vram_rot_w)).share("sub_vram_rot"); // Rotation + map(0x800000, 0x803fff).ram().w(FUNC(rocknms_state::rocknms_sub_vram_fg_w)).share("sub_vram_fg"); // Foreground + map(0x804000, 0x807fff).ram().w(FUNC(rocknms_state::rocknms_sub_vram_bg_w)).share("sub_vram_bg"); // Background // map(0x808000, 0x809fff).ram(); // ??? map(0x900000, 0x907fff).ram(); // NVRAM - map(0xa30000, 0xa30001).w(FUNC(tetrisp2_state::rockn_soundvolume_w)); // Sound Volume + map(0xa30000, 0xa30001).w(FUNC(rocknms_state::rockn_soundvolume_w)); // Sound Volume map(0xa40000, 0xa40003).w("ymz", FUNC(ymz280b_device::write)).umask16(0x00ff); // Sound - map(0xa44000, 0xa44001).w(FUNC(tetrisp2_state::rockn_adpcmbank_w)); // Sound Bank + map(0xa44000, 0xa44001).w(FUNC(rocknms_state::rockn_adpcmbank_w)); // Sound Bank map(0xa48000, 0xa48001).nopw(); // YMZ280 Reset - map(0xb00000, 0xb00001).w(FUNC(tetrisp2_state::rocknms_sub2main_w)); // MAIN <- SUB Communication + map(0xb00000, 0xb00001).w(FUNC(rocknms_state::rocknms_sub2main_w)); // MAIN <- SUB Communication map(0xb20000, 0xb20001).nopw(); // ??? map(0xb40000, 0xb4000b).writeonly().share("sub_scroll_fg"); // Foreground Scrolling map(0xb40010, 0xb4001b).writeonly().share("sub_scroll_bg"); // Background Scrolling map(0xb4003e, 0xb4003f).nopw(); // scr_size map(0xb60000, 0xb6002f).writeonly().share("sub_rotregs"); // Rotation Registers - map(0xba0000, 0xba001f).w(FUNC(tetrisp2_state::rocknms_sub_systemregs_w)); // system param + map(0xba0000, 0xba001f).m(m_sub_sysctrl, FUNC(jaleco_ms32_sysctrl_device::amap)); // map(0xbe0000, 0xbe0001).nopr(); // INT-level1 dummy read - map(0xbe0002, 0xbe0003).rw(FUNC(tetrisp2_state::rocknms_main2sub_r), FUNC(tetrisp2_state::rocknms_sub2main_w)); // MAIN <-> SUB Communication + map(0xbe0002, 0xbe0003).rw(FUNC(rocknms_state::rocknms_main2sub_r), FUNC(rocknms_state::rocknms_sub2main_w)); // MAIN <-> SUB Communication map(0xbe000a, 0xbe000b).r("watchdog", FUNC(watchdog_timer_device::reset16_r)); // Watchdog } @@ -681,7 +637,7 @@ void stepstag_state::stepstag_map(address_map &map) map(0xb40010, 0xb4001b).writeonly().share("scroll_bg"); // Background Scrolling map(0xb4003e, 0xb4003f).ram(); // scr_size map(0xb60000, 0xb6002f).writeonly().share("rotregs"); // Rotation Registers - map(0xba0000, 0xba001f).w(FUNC(stepstag_state::rockn_systemregs_w)); // System param + map(0xba0000, 0xba001f).m(m_sysctrl, FUNC(jaleco_ms32_sysctrl_device::amap)); map(0xbe0000, 0xbe0001).nopr(); // INT-level1 dummy read map(0xbe0002, 0xbe0003).portr("BUTTONS"); // Inputs map(0xbe0004, 0xbe0005).r(FUNC(stepstag_state::stepstag_coins_r)); // Inputs & protection @@ -1081,7 +1037,7 @@ INPUT_PORTS_END static INPUT_PORTS_START( rocknms ) PORT_START("PLAYERS") // IN0 - $be0002.w - PORT_BIT( 0x0003, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(tetrisp2_state, rocknms_main2sub_status_r) // MAIN -> SUB Communication + PORT_BIT( 0x0003, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(rocknms_state, rocknms_main2sub_status_r) // MAIN -> SUB Communication PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) @@ -1593,41 +1549,11 @@ GFXDECODE_END ***************************************************************************/ -TIMER_CALLBACK_MEMBER(tetrisp2_state::rockn_timer_level4_callback) -{ - m_maincpu->set_input_line(4, HOLD_LINE); -} - -TIMER_CALLBACK_MEMBER(tetrisp2_state::rockn_timer_sub_level4_callback) -{ - m_subcpu->set_input_line(4, HOLD_LINE); -} - - -TIMER_CALLBACK_MEMBER(tetrisp2_state::rockn_timer_level1_callback) -{ - m_maincpu->set_input_line(1, HOLD_LINE); -} - -TIMER_CALLBACK_MEMBER(tetrisp2_state::rockn_timer_sub_level1_callback) -{ - m_subcpu->set_input_line(1, HOLD_LINE); -} - void tetrisp2_state::init_rockn_timer() { - m_rockn_timer_l1 = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(tetrisp2_state::rockn_timer_level1_callback),this)); - m_rockn_timer_l4 = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(tetrisp2_state::rockn_timer_level4_callback),this)); - - m_rockn_timer_l1->adjust(attotime::from_msec(32), 0, attotime::from_msec(32)); - - save_item(NAME(m_systemregs)); - save_item(NAME(m_rocknms_sub_systemregs)); save_item(NAME(m_rockn_protectdata)); save_item(NAME(m_rockn_adpcmbank)); save_item(NAME(m_rockn_soundvolume)); - save_item(NAME(m_rocknms_main2sub)); - save_item(NAME(m_rocknms_sub2main)); } void tetrisp2_state::init_rockn() @@ -1648,17 +1574,12 @@ void tetrisp2_state::init_rockn2() m_rockn_protectdata = 2; } -void tetrisp2_state::init_rocknms() +void rocknms_state::init_rocknms() { init_rockn_timer(); - - m_rockn_timer_sub_l1 = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(tetrisp2_state::rockn_timer_sub_level1_callback),this)); - m_rockn_timer_sub_l4 = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(tetrisp2_state::rockn_timer_sub_level4_callback),this)); - - m_rockn_timer_sub_l1->adjust(attotime::from_msec(32), 0, attotime::from_msec(32)); - m_rockn_protectdata = 3; - + save_item(NAME(m_rocknms_main2sub)); + save_item(NAME(m_rocknms_sub2main)); } void tetrisp2_state::init_rockn3() @@ -1673,34 +1594,68 @@ void stepstag_state::init_stepstag() m_rockn_protectdata = 1; // unused? } +WRITE_LINE_MEMBER(tetrisp2_state::field_irq_w) +{ + // irq1 is valid on all games but tetrisp2, but always masked by SR? + m_maincpu->set_input_line(1, (state) ? ASSERT_LINE : CLEAR_LINE); +} + +WRITE_LINE_MEMBER(tetrisp2_state::vblank_irq_w) +{ + m_maincpu->set_input_line(2, (state) ? ASSERT_LINE : CLEAR_LINE); +} + +WRITE_LINE_MEMBER(tetrisp2_state::timer_irq_w) +{ + m_maincpu->set_input_line(4, (state) ? ASSERT_LINE : CLEAR_LINE); +} + +WRITE_LINE_MEMBER(tetrisp2_state::sound_reset_line_w) +{ + logerror("%s: sound_reset_line_w %d but no CPU to reset?\n", machine().describe_context(), state); +} + +void tetrisp2_state::setup_main_sysctrl(machine_config &config, const XTAL clock) +{ + JALECO_MS32_SYSCTRL(config, m_sysctrl, clock, m_screen); + m_sysctrl->flip_screen_cb().set(FUNC(tetrisp2_state::flipscreen_w)); + m_sysctrl->vblank_cb().set(FUNC(tetrisp2_state::vblank_irq_w)); + m_sysctrl->field_cb().set(FUNC(tetrisp2_state::field_irq_w)); + m_sysctrl->prg_timer_cb().set(FUNC(tetrisp2_state::timer_irq_w)); + m_sysctrl->sound_reset_cb().set(FUNC(tetrisp2_state::sound_reset_line_w)); +} + +void tetrisp2_state::setup_main_sprite(machine_config &config, const XTAL clock) +{ + JALECO_MEGASYSTEM32_SPRITE(config, m_sprite, clock); + m_sprite->set_palette(m_palette); + m_sprite->set_color_base(0); + m_sprite->set_color_entries(16); + m_sprite->set_zoom(false); +} void tetrisp2_state::tetrisp2(machine_config &config) { /* basic machine hardware */ M68000(config, m_maincpu, 12_MHz_XTAL); // 12MHz m_maincpu->set_addrmap(AS_PROGRAM, &tetrisp2_state::tetrisp2_map); - m_maincpu->set_vblank_int("screen", FUNC(tetrisp2_state::irq2_line_hold)); NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); WATCHDOG_TIMER(config, "watchdog").set_vblank_count("screen", 8); /* guess */ /* video hardware */ - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); - screen.set_refresh_hz(60); - screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); - screen.set_size(0x140, 0xe0); - screen.set_visarea(0, 0x140-1, 0, 0xe0-1); - screen.set_screen_update(FUNC(tetrisp2_state::screen_update_tetrisp2)); - screen.set_palette(m_palette); + constexpr XTAL pixel_clock = XTAL(48'000'000)/8; + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_raw(pixel_clock, 384, 0, 320, 263, 0, 224); // default CRTC setup + m_screen->set_screen_update(FUNC(tetrisp2_state::screen_update_tetrisp2)); + m_screen->set_palette(m_palette); GFXDECODE(config, m_gfxdecode, m_palette, gfx_tetrisp2); PALETTE(config, m_palette).set_entries(0x8000); - JALECO_MEGASYSTEM32_SPRITE(config, m_sprite, XTAL(48'000'000)); // 48MHz for video? - m_sprite->set_palette(m_palette); - m_sprite->set_color_base(0); - m_sprite->set_color_entries(16); + setup_main_sprite(config, pixel_clock); + setup_main_sysctrl(config, XTAL(48'000'000)); MCFG_VIDEO_START_OVERRIDE(tetrisp2_state,tetrisp2) @@ -1708,7 +1663,7 @@ void tetrisp2_state::tetrisp2(machine_config &config) SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); - ymz280b_device &ymz(YMZ280B(config, "ymz", 16.9344_MHz_XTAL)); // 16.9344MHz + ymz280b_device &ymz(YMZ280B(config, "ymz", XTAL(16'934'400))); // 16.9344MHz ymz.add_route(0, "lspeaker", 1.0); ymz.add_route(1, "rspeaker", 1.0); } @@ -1719,28 +1674,25 @@ void tetrisp2_state::nndmseal(machine_config &config) /* basic machine hardware */ M68000(config, m_maincpu, XTAL(12'000'000)); // 12MHz m_maincpu->set_addrmap(AS_PROGRAM, &tetrisp2_state::nndmseal_map); - m_maincpu->set_vblank_int("screen", FUNC(tetrisp2_state::irq2_line_hold)); NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); WATCHDOG_TIMER(config, "watchdog"); /* video hardware */ - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); - screen.set_refresh_hz(60); - screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); - screen.set_size(0x180, 0xf0); - screen.set_visarea(0, 0x180-1, 0, 0xf0-1); - screen.set_screen_update(FUNC(tetrisp2_state::screen_update_tetrisp2)); - screen.set_palette(m_palette); + // An odd one: it uses the faster dot clock divider setting + // but they replaced the xtal to a OSC1(42.9545MHz), I guess they compensated to not go out of ~60 Hz + constexpr XTAL pixel_clock = XTAL(42'954'545)/6; + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_raw(pixel_clock, 455, 0, 384, 262, 0, 240); + m_screen->set_screen_update(FUNC(tetrisp2_state::screen_update_tetrisp2)); + m_screen->set_palette(m_palette); GFXDECODE(config, m_gfxdecode, m_palette, gfx_tetrisp2); PALETTE(config, m_palette).set_entries(0x8000); - JALECO_MEGASYSTEM32_SPRITE(config, m_sprite, 42954500); // OSC1(42.9545MHz) for video? - m_sprite->set_palette(m_palette); - m_sprite->set_color_base(0); - m_sprite->set_color_entries(16); + setup_main_sprite(config, pixel_clock); + setup_main_sysctrl(config, XTAL(42'954'545)); MCFG_VIDEO_START_OVERRIDE(tetrisp2_state,nndmseal) // bg layer offset @@ -1756,28 +1708,23 @@ void tetrisp2_state::rockn(machine_config &config) /* basic machine hardware */ M68000(config, m_maincpu, XTAL(12'000'000)); // 12MHz m_maincpu->set_addrmap(AS_PROGRAM, &tetrisp2_state::rockn1_map); - m_maincpu->set_vblank_int("screen", FUNC(tetrisp2_state::irq2_line_hold)); NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); WATCHDOG_TIMER(config, "watchdog"); /* video hardware */ - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); - screen.set_refresh_hz(60); - screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); - screen.set_size(0x140, 0xe0); - screen.set_visarea(0, 0x140-1, 0, 0xe0-1); - screen.set_screen_update(FUNC(tetrisp2_state::screen_update_rockntread)); - screen.set_palette(m_palette); + constexpr XTAL pixel_clock = XTAL(48'000'000)/8; + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_raw(pixel_clock, 384, 0, 320, 263, 0, 224); + m_screen->set_screen_update(FUNC(tetrisp2_state::screen_update_rockntread)); + m_screen->set_palette(m_palette); GFXDECODE(config, m_gfxdecode, m_palette, gfx_tetrisp2); PALETTE(config, m_palette).set_entries(0x8000); - JALECO_MEGASYSTEM32_SPRITE(config, m_sprite, XTAL(48'000'000)); // 48MHz for video? - m_sprite->set_palette(m_palette); - m_sprite->set_color_base(0); - m_sprite->set_color_entries(16); + setup_main_sprite(config, pixel_clock); + setup_main_sysctrl(config, XTAL(48'000'000)); MCFG_VIDEO_START_OVERRIDE(tetrisp2_state,rockntread) @@ -1796,28 +1743,23 @@ void tetrisp2_state::rockn2(machine_config &config) /* basic machine hardware */ M68000(config, m_maincpu, XTAL(12'000'000)); // 12MHz m_maincpu->set_addrmap(AS_PROGRAM, &tetrisp2_state::rockn2_map); - m_maincpu->set_vblank_int("screen", FUNC(tetrisp2_state::irq2_line_hold)); NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); WATCHDOG_TIMER(config, "watchdog"); /* video hardware */ - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); - screen.set_refresh_hz(60); - screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); - screen.set_size(0x140, 0xe0); - screen.set_visarea(0, 0x140-1, 0, 0xe0-1); - screen.set_screen_update(FUNC(tetrisp2_state::screen_update_rockntread)); - screen.set_palette(m_palette); + constexpr XTAL pixel_clock = XTAL(48'000'000)/8; + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_raw(pixel_clock, 384, 0, 320, 263, 0, 224); + m_screen->set_screen_update(FUNC(tetrisp2_state::screen_update_rockntread)); + m_screen->set_palette(m_palette); GFXDECODE(config, m_gfxdecode, m_palette, gfx_tetrisp2); PALETTE(config, m_palette).set_entries(0x8000); - JALECO_MEGASYSTEM32_SPRITE(config, m_sprite, XTAL(48'000'000)); // 48MHz for video? - m_sprite->set_palette(m_palette); - m_sprite->set_color_base(0); - m_sprite->set_color_entries(16); + setup_main_sprite(config, pixel_clock); + setup_main_sysctrl(config, XTAL(48'000'000)); MCFG_VIDEO_START_OVERRIDE(tetrisp2_state,rockntread) @@ -1830,17 +1772,34 @@ void tetrisp2_state::rockn2(machine_config &config) ymz.add_route(1, "rspeaker", 1.0); } +WRITE_LINE_MEMBER(rocknms_state::sub_field_irq_w) +{ + m_subcpu->set_input_line(1, (state) ? ASSERT_LINE : CLEAR_LINE); +} + +WRITE_LINE_MEMBER(rocknms_state::sub_vblank_irq_w) +{ + m_subcpu->set_input_line(2, (state) ? ASSERT_LINE : CLEAR_LINE); +} -void tetrisp2_state::rocknms(machine_config &config) +WRITE_LINE_MEMBER(rocknms_state::sub_timer_irq_w) +{ + m_subcpu->set_input_line(4, (state) ? ASSERT_LINE : CLEAR_LINE); +} + +WRITE_LINE_MEMBER(rocknms_state::sub_sound_reset_line_w) +{ + logerror("%s: sound_reset_line_w %d on sub CPU but no CPU to reset?\n", machine().describe_context(), state); +} + +void rocknms_state::rocknms(machine_config &config) { /* basic machine hardware */ M68000(config, m_maincpu, XTAL(12'000'000)); // 12MHz - m_maincpu->set_addrmap(AS_PROGRAM, &tetrisp2_state::rocknms_main_map); - m_maincpu->set_vblank_int("lscreen", FUNC(tetrisp2_state::irq2_line_hold)); + m_maincpu->set_addrmap(AS_PROGRAM, &rocknms_state::rocknms_main_map); M68000(config, m_subcpu, XTAL(12'000'000)); // 12MHz - m_subcpu->set_addrmap(AS_PROGRAM, &tetrisp2_state::rocknms_sub_map); - m_subcpu->set_vblank_int("lscreen", FUNC(tetrisp2_state::irq2_line_hold)); + m_subcpu->set_addrmap(AS_PROGRAM, &rocknms_state::rocknms_sub_map); NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); @@ -1848,42 +1807,44 @@ void tetrisp2_state::rocknms(machine_config &config) /* video hardware */ + config.set_default_layout(layout_rocknms); + + constexpr XTAL pixel_clock = XTAL(48'000'000)/8; + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_orientation(ROT0); + m_screen->set_raw(pixel_clock, 384, 0, 320, 263, 0, 224); + m_screen->set_screen_update(FUNC(rocknms_state::screen_update_rocknms_left)); + + SCREEN(config, m_sub_screen, SCREEN_TYPE_RASTER); + m_sub_screen->set_orientation(ROT270); + m_sub_screen->set_raw(pixel_clock, 384, 0, 320, 263, 0, 224); + m_sub_screen->set_screen_update(FUNC(rocknms_state::screen_update_rocknms_right)); + GFXDECODE(config, m_gfxdecode, m_palette, gfx_tetrisp2); PALETTE(config, m_palette).set_entries(0x8000); GFXDECODE(config, m_sub_gfxdecode, m_sub_palette, gfx_rocknms_sub); PALETTE(config, m_sub_palette).set_entries(0x8000); - JALECO_MEGASYSTEM32_SPRITE(config, m_sprite, XTAL(48'000'000)); // 48MHz for video? - m_sprite->set_palette(m_palette); - m_sprite->set_color_base(0); - m_sprite->set_color_entries(16); + setup_main_sprite(config, pixel_clock); - JALECO_MEGASYSTEM32_SPRITE(config, m_rocknms_sub_sprite, XTAL(48'000'000)); // 48MHz for video? + JALECO_MEGASYSTEM32_SPRITE(config, m_rocknms_sub_sprite, pixel_clock); // 48MHz for video? m_rocknms_sub_sprite->set_palette(m_sub_palette); m_rocknms_sub_sprite->set_color_base(0); m_rocknms_sub_sprite->set_color_entries(16); - - config.set_default_layout(layout_rocknms); - - screen_device &lscreen(SCREEN(config, "lscreen", SCREEN_TYPE_RASTER)); - lscreen.set_orientation(ROT0); - lscreen.set_refresh_hz(60); - lscreen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); - lscreen.set_size(0x140, 0xe0); - lscreen.set_visarea(0, 0x140-1, 0, 0xe0-1); - lscreen.set_screen_update(FUNC(tetrisp2_state::screen_update_rocknms_left)); - - screen_device &rscreen(SCREEN(config, "rscreen", SCREEN_TYPE_RASTER)); - rscreen.set_orientation(ROT270); - rscreen.set_refresh_hz(60); - rscreen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); - rscreen.set_size(0x140, 0xe0); - rscreen.set_visarea(0, 0x140-1, 0, 0xe0-1); - rscreen.set_screen_update(FUNC(tetrisp2_state::screen_update_rocknms_right)); - - MCFG_VIDEO_START_OVERRIDE(tetrisp2_state,rocknms) - + m_rocknms_sub_sprite->set_zoom(false); + + setup_main_sysctrl(config, XTAL(48'000'000)); + + JALECO_MS32_SYSCTRL(config, m_sub_sysctrl, XTAL(48'000'000), m_sub_screen); + m_sub_sysctrl->flip_screen_cb().set(FUNC(rocknms_state::sub_flipscreen_w)); + m_sub_sysctrl->vblank_cb().set(FUNC(rocknms_state::sub_vblank_irq_w)); + m_sub_sysctrl->field_cb().set(FUNC(rocknms_state::sub_field_irq_w)); + m_sub_sysctrl->prg_timer_cb().set(FUNC(rocknms_state::sub_timer_irq_w)); + m_sub_sysctrl->sound_reset_cb().set(FUNC(rocknms_state::sub_sound_reset_line_w)); + + MCFG_VIDEO_START_OVERRIDE(rocknms_state,rocknms) + /* sound hardware */ SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); @@ -1893,51 +1854,62 @@ void tetrisp2_state::rocknms(machine_config &config) ymz.add_route(1, "rspeaker", 1.0); } +TIMER_DEVICE_CALLBACK_MEMBER(stepstag_state::field_cb) +{ + // TODO: pinpoint the exact source, translate to configure_scanline if necessary + // irq 4 is definitely a 30 Hz-ish here as well, + // except we have a multi-screen arrangement setup and no way to pinpoint source + m_subcpu->set_input_line(4, HOLD_LINE); +} + +void stepstag_state::setup_non_sysctrl_screen(machine_config &config, screen_device *screen, const XTAL xtal) +{ + // TODO: unknown clock and parameters + // assume there's a 42.954 MHz/6 like nndmseal to compensate the higher res + screen->set_raw(xtal/6, 455, 0, 352, 262, 0, 240); +} void stepstag_state::stepstag(machine_config &config) { - M68000(config, m_maincpu, XTAL(12'000'000)); // 12MHz? + M68000(config, m_maincpu, XTAL(12'000'000)); // unknown m_maincpu->set_addrmap(AS_PROGRAM, &stepstag_state::stepstag_map); - m_maincpu->set_vblank_int("mscreen", FUNC(tetrisp2_state::irq2_line_hold)); // lev 4 triggered by system timer - M68000(config, m_subcpu, 16000000); //?? + constexpr XTAL subxtal = XTAL(42'954'545); // unknown + constexpr XTAL sub_pixel_clock = subxtal/6; + + M68000(config, m_subcpu, subxtal/3); m_subcpu->set_addrmap(AS_PROGRAM, &stepstag_state::stepstag_sub_map); - m_subcpu->set_vblank_int("lscreen", FUNC(tetrisp2_state::irq4_line_hold)); // lev 6 triggered by main CPU + TIMER(config, "field_timer").configure_periodic(FUNC(stepstag_state::field_cb), attotime::from_hz(30)); NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); WATCHDOG_TIMER(config, "watchdog"); // video hardware + + // this screen arrangement is weird: + // it writes a regular 320x224 screen setup to the CRTC but none of these matches a 352 width, + // we are either missing a bit from the config regs or those writes are null and + // these screens are driven by something else. + // Also note: main 68k tilemap/sprite/palette aren't even displayed with this arrangement, + // even tho usage is minimal (POST/test mode), maybe just a left-over ... screen_device &lscreen(SCREEN(config, "lscreen", SCREEN_TYPE_RASTER)); lscreen.set_orientation(ROT270); -// lscreen.set_raw(12288000*2, 768, 0, 496, 264*2,0,480); - lscreen.set_refresh_hz(30); - lscreen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); - lscreen.set_size(0x160, 0xf0); - lscreen.set_visarea(0, 0x160-1, 0, 0xf0-1); + setup_non_sysctrl_screen(config, &lscreen, subxtal); lscreen.set_screen_update(FUNC(stepstag_state::screen_update_stepstag_left)); -// lscreen.set_palette(m_vj_palette_l)); - screen_device &mscreen(SCREEN(config, "mscreen", SCREEN_TYPE_RASTER)); - mscreen.set_orientation(ROT0); - mscreen.set_refresh_hz(60); - mscreen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); - mscreen.set_size(0x160, 0xf0); - mscreen.set_visarea(0, 0x160-1, 0, 0xf0-1); - mscreen.set_screen_update(FUNC(stepstag_state::screen_update_stepstag_mid)); -// mscreen.set_palette(m_vj_palette_m)); + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_orientation(ROT0); + // TODO: connected to the non sysctrl CRTC anyway? + m_screen->set_raw(XTAL(48'000'000)/8, 384, 0, 320, 263, 0, 224); + m_screen->set_screen_update(FUNC(stepstag_state::screen_update_stepstag_mid)); screen_device &rscreen(SCREEN(config, "rscreen", SCREEN_TYPE_RASTER)); rscreen.set_orientation(ROT270); - rscreen.set_refresh_hz(30); - rscreen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); - rscreen.set_size(0x160, 0xf0); - rscreen.set_visarea(0, 0x160-1, 0, 0xf0-1); + setup_non_sysctrl_screen(config, &rscreen, subxtal); rscreen.set_screen_update(FUNC(stepstag_state::screen_update_stepstag_right)); - rscreen.set_palette(m_vj_palette_r); - MCFG_VIDEO_START_OVERRIDE(stepstag_state, stepstag ) + MCFG_VIDEO_START_OVERRIDE(stepstag_state, stepstag) GFXDECODE(config, m_gfxdecode, m_palette, gfx_tetrisp2); PALETTE(config, m_palette).set_entries(0x8000); @@ -1945,28 +1917,37 @@ void stepstag_state::stepstag(machine_config &config) PALETTE(config, m_vj_palette_m).set_entries(0x8000); PALETTE(config, m_vj_palette_r).set_entries(0x8000); - JALECO_MEGASYSTEM32_SPRITE(config, m_sprite, 48000000); // unknown + JALECO_MEGASYSTEM32_SPRITE(config, m_sprite, XTAL(48'000'000)/8); // unknown m_sprite->set_palette(m_palette); m_sprite->set_color_base(0); m_sprite->set_color_entries(16); + m_sprite->set_zoom(false); // (left screen, vertical in stepping stage) - JALECO_MEGASYSTEM32_SPRITE(config, m_vj_sprite_l, 48000000); // unknown + JALECO_MEGASYSTEM32_SPRITE(config, m_vj_sprite_l, sub_pixel_clock); // unknown m_vj_sprite_l->set_palette(m_vj_palette_l); m_vj_sprite_l->set_color_base(0); m_vj_sprite_l->set_color_entries(0x80); + m_vj_sprite_l->set_zoom(false); + m_vj_sprite_l->set_yuv(true); // (mid screen, horizontal) - JALECO_MEGASYSTEM32_SPRITE(config, m_vj_sprite_m, 48000000); // unknown + JALECO_MEGASYSTEM32_SPRITE(config, m_vj_sprite_m, sub_pixel_clock); // unknown m_vj_sprite_m->set_palette(m_vj_palette_m); m_vj_sprite_m->set_color_base(0); m_vj_sprite_m->set_color_entries(0x80); + m_vj_sprite_m->set_zoom(false); + m_vj_sprite_m->set_yuv(true); // (right screens, vertical in stepping stage) - JALECO_MEGASYSTEM32_SPRITE(config, m_vj_sprite_r, 48000000); // unknown + JALECO_MEGASYSTEM32_SPRITE(config, m_vj_sprite_r, sub_pixel_clock); // unknown m_vj_sprite_r->set_palette(m_vj_palette_r); m_vj_sprite_r->set_color_base(0); m_vj_sprite_r->set_color_entries(0x80); + m_vj_sprite_r->set_zoom(false); + m_vj_sprite_r->set_yuv(true); + + setup_main_sysctrl(config, XTAL(48'000'000)); config.set_default_layout(layout_stepstag); @@ -1976,7 +1957,7 @@ void stepstag_state::stepstag(machine_config &config) GENERIC_LATCH_16(config, m_soundlatch); - ymz280b_device &ymz(YMZ280B(config, "ymz", XTAL(16'934'400))); // 16.9344MHz + ymz280b_device &ymz(YMZ280B(config, "ymz", subxtal/3)); // unknown ymz.add_route(0, "lspeaker", 1.0); ymz.add_route(1, "rspeaker", 1.0); } @@ -1985,49 +1966,37 @@ void stepstag_state::vjdash(machine_config &config) // 4 Screens { M68000(config, m_maincpu, XTAL(12'000'000)); // 12MHz? m_maincpu->set_addrmap(AS_PROGRAM, &stepstag_state::vjdash_map); - m_maincpu->set_vblank_int("screen", FUNC(tetrisp2_state::irq2_line_hold)); // lev 4 triggered by system timer - M68000(config, m_subcpu, 16000000); //?? + constexpr XTAL subxtal = XTAL(42'954'545); // unknown + constexpr XTAL main_pixel_clock = XTAL(48'000'000)/8; + constexpr XTAL sub_pixel_clock = subxtal/6; + + M68000(config, m_subcpu, subxtal/3); m_subcpu->set_addrmap(AS_PROGRAM, &stepstag_state::stepstag_sub_map); - m_subcpu->set_vblank_int("mscreen", FUNC(tetrisp2_state::irq4_line_hold)); // lev 6 triggered by main CPU + TIMER(config, "field_timer").configure_periodic(FUNC(stepstag_state::field_cb), attotime::from_hz(30)); NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); WATCHDOG_TIMER(config, "watchdog"); // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); - screen.set_refresh_hz(60); - screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); - screen.set_size(0x160, 0xf0); - screen.set_visarea(0, 0x140-1, 0, 0xe0-1); - screen.set_screen_update(FUNC(stepstag_state::screen_update_stepstag_main)); -// screen.set_screen_update(FUNC(tetrisp2_state::screen_update_rockntread)); - screen.set_palette(m_palette); + // same as stepstag, we assume that this screen is effectively connected to the system CRTC + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_raw(main_pixel_clock, 384, 0, 320, 263, 0, 224); + m_screen->set_screen_update(FUNC(stepstag_state::screen_update_stepstag_main)); + m_screen->set_palette(m_palette); screen_device &lscreen(SCREEN(config, "lscreen", SCREEN_TYPE_RASTER)); - lscreen.set_refresh_hz(30); - lscreen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); - lscreen.set_size(0x160, 0xf0); - lscreen.set_visarea(0, 0x160-1, 0, 0xf0-1); + setup_non_sysctrl_screen(config, &lscreen, subxtal); lscreen.set_screen_update(FUNC(stepstag_state::screen_update_stepstag_left)); -// lscreen.set_palette(m_vj_palette_l); screen_device &mscreen(SCREEN(config, "mscreen", SCREEN_TYPE_RASTER)); - mscreen.set_refresh_hz(30); - mscreen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); - mscreen.set_size(0x160, 0xf0); - mscreen.set_visarea(0, 0x160-1, 0, 0xf0-1); + setup_non_sysctrl_screen(config, &mscreen, subxtal); mscreen.set_screen_update(FUNC(stepstag_state::screen_update_stepstag_mid)); -// mscreen.set_palette(m_vj_palette_m); screen_device &rscreen(SCREEN(config, "rscreen", SCREEN_TYPE_RASTER)); - rscreen.set_refresh_hz(30); - rscreen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); - rscreen.set_size(0x160, 0xf0); - rscreen.set_visarea(0, 0x160-1, 0, 0xf0-1); + setup_non_sysctrl_screen(config, &rscreen, subxtal); rscreen.set_screen_update(FUNC(stepstag_state::screen_update_stepstag_right)); - rscreen.set_palette(m_vj_palette_r); MCFG_VIDEO_START_OVERRIDE(stepstag_state, stepstag ) GFXDECODE(config, m_gfxdecode, m_palette, gfx_tetrisp2); @@ -2037,28 +2006,33 @@ void stepstag_state::vjdash(machine_config &config) // 4 Screens PALETTE(config, m_vj_palette_m).set_entries(0x8000); PALETTE(config, m_vj_palette_r).set_entries(0x8000); - JALECO_MEGASYSTEM32_SPRITE(config, m_sprite, 48000000); // unknown + JALECO_MEGASYSTEM32_SPRITE(config, m_sprite, main_pixel_clock); // unknown m_sprite->set_palette(m_palette); m_sprite->set_color_base(0); m_sprite->set_color_entries(16); // (left screen, vertical in stepping stage) - JALECO_MEGASYSTEM32_SPRITE(config, m_vj_sprite_l, 48000000); // unknown + JALECO_MEGASYSTEM32_SPRITE(config, m_vj_sprite_l, sub_pixel_clock); // unknown m_vj_sprite_l->set_palette(m_vj_palette_l); m_vj_sprite_l->set_color_base(0); m_vj_sprite_l->set_color_entries(0x80); + m_vj_sprite_l->set_zoom(false); // (mid screen, horizontal) - JALECO_MEGASYSTEM32_SPRITE(config, m_vj_sprite_m, 48000000); // unknown + JALECO_MEGASYSTEM32_SPRITE(config, m_vj_sprite_m, sub_pixel_clock); // unknown m_vj_sprite_m->set_palette(m_vj_palette_m); m_vj_sprite_m->set_color_base(0); m_vj_sprite_m->set_color_entries(0x80); + m_vj_sprite_m->set_zoom(false); // (right screens, vertical in stepping stage) - JALECO_MEGASYSTEM32_SPRITE(config, m_vj_sprite_r, 48000000); // unknown + JALECO_MEGASYSTEM32_SPRITE(config, m_vj_sprite_r, sub_pixel_clock); // unknown m_vj_sprite_r->set_palette(m_vj_palette_r); m_vj_sprite_r->set_color_base(0); m_vj_sprite_r->set_color_entries(0x80); + m_vj_sprite_r->set_zoom(false); + + setup_main_sysctrl(config, XTAL(48'000'000)); // unknown config.set_default_layout(layout_vjdash); @@ -2068,7 +2042,7 @@ void stepstag_state::vjdash(machine_config &config) // 4 Screens GENERIC_LATCH_16(config, m_soundlatch); - ymz280b_device &ymz(YMZ280B(config, "ymz", XTAL(16'934'400))); // 16.9344MHz + ymz280b_device &ymz(YMZ280B(config, "ymz", subxtal/3)); // unknown ymz.add_route(0, "lspeaker", 1.0); ymz.add_route(1, "rspeaker", 1.0); } @@ -2910,14 +2884,14 @@ GAME( 1997, nndmseala, nndmseal, nndmseal, nndmseal, tetrisp2_state, init_rockn GAME( 1999, rockn, 0, rockn, rockn, tetrisp2_state, init_rockn, ROT270, "Jaleco", "Rock'n Tread (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1999, rockna, rockn, rockn, rockn, tetrisp2_state, init_rockn1, ROT270, "Jaleco", "Rock'n Tread (Japan, alternate)", MACHINE_SUPPORTS_SAVE ) GAME( 1999, rockn2, 0, rockn2, rockn, tetrisp2_state, init_rockn2, ROT270, "Jaleco", "Rock'n Tread 2 (Japan)", MACHINE_SUPPORTS_SAVE ) -GAME( 1999, rocknms, 0, rocknms, rocknms, tetrisp2_state, init_rocknms, ROT0, "Jaleco", "Rock'n MegaSession (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1999, rocknms, 0, rocknms, rocknms, rocknms_state, init_rocknms, ROT0, "Jaleco", "Rock'n MegaSession (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) GAME( 1999, rockn3, 0, rockn2, rockn, tetrisp2_state, init_rockn3, ROT270, "Jaleco", "Rock'n 3 (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 2000, rockn4, 0, rockn2, rockn, tetrisp2_state, init_rockn3, ROT270, "Jaleco / PCCWJ", "Rock'n 4 (Japan, prototype)", MACHINE_SUPPORTS_SAVE ) // Undumped: // - Stepping Stage <- the original Game // - Stepping Stage 2 Supreme -// Dumped (partly): +// Dumped (partially): GAME( 1999, vjdash, 0, vjdash, vjdash, stepstag_state, init_stepstag, ROT0, "Jaleco", "VJ Visual & Music Slap", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) GAME( 1999, stepstag, 0, stepstag, stepstag, stepstag_state, init_stepstag, ROT0, "Jaleco", "Stepping Stage Special", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) GAME( 1999, step3, 0, stepstag, stepstag, stepstag_state, init_stepstag, ROT0, "Jaleco", "Stepping 3 Superior", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) |