diff options
Diffstat (limited to 'src/mame/drivers/firebeat.cpp')
-rw-r--r-- | src/mame/drivers/firebeat.cpp | 95 |
1 files changed, 62 insertions, 33 deletions
diff --git a/src/mame/drivers/firebeat.cpp b/src/mame/drivers/firebeat.cpp index 26ac10aa36e..13d5b465a71 100644 --- a/src/mame/drivers/firebeat.cpp +++ b/src/mame/drivers/firebeat.cpp @@ -10,6 +10,8 @@ GQ972 PWB(A2) 0000070609 Main board ----------------------------------- + 25.175 MHz clock (near GCUs and VGA connectors) + 16.6666 MHz clock (near GCUs and VGA connectors) OSC 66.0000MHz IBM PowerPC 403GCX at 66MHz (2x) Konami 0000057714 (2D object processor) @@ -396,6 +398,7 @@ public: m_work_ram(*this, "work_ram"), m_ata(*this, "ata"), m_gcu(*this, "gcu"), + m_gcu_sub(*this, "gcu_sub"), m_duart_com(*this, "duart_com"), m_status_leds(*this, "status_led_%u", 0U), m_io_inputs(*this, "IN%u", 0U) @@ -405,6 +408,7 @@ public: protected: virtual void machine_start() override; + virtual void machine_reset() override; virtual void device_resolve_objects() override; uint32_t screen_update_firebeat_0(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); @@ -433,6 +437,7 @@ protected: required_shared_ptr<uint32_t> m_work_ram; required_device<ata_interface_device> m_ata; required_device<k057714_device> m_gcu; + optional_device<k057714_device> m_gcu_sub; private: uint32_t cabinet_r(offs_t offset, uint32_t mem_mask = ~0); @@ -446,6 +451,8 @@ private: uint8_t input_r(offs_t offset); + void control_w(offs_t offset, uint8_t data); + uint16_t ata_command_r(offs_t offset, uint16_t mem_mask = ~0); void ata_command_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); @@ -465,6 +472,8 @@ private: output_finder<8> m_status_leds; required_ioport_array<4> m_io_inputs; + + uint8_t m_control; }; class firebeat_spu_state : public firebeat_state @@ -574,7 +583,6 @@ public: firebeat_state(mconfig, type, tag), m_duart_midi(*this, "duart_midi"), m_kbd(*this, "kbd%u", 0), - m_gcu_sub(*this, "gcu_sub"), m_lamps(*this, "lamp_%u", 1U), m_cab_led_door_lamp(*this, "door_lamp"), m_cab_led_start1p(*this, "start1p"), @@ -613,7 +621,6 @@ private: required_device<pc16552_device> m_duart_midi; required_device_array<midi_keyboard_device, 2> m_kbd; - required_device<k057714_device> m_gcu_sub; output_finder<3> m_lamps; output_finder<> m_cab_led_door_lamp; @@ -691,6 +698,13 @@ void firebeat_state::machine_start() m_maincpu->ppcdrc_add_fastram(0x00000000, 0x01ffffff, false, m_work_ram); } +void firebeat_state::machine_reset() +{ + m_extend_board_irq_enable = 0x3f; + m_extend_board_irq_active = 0x00; + m_control = 0; +} + void firebeat_state::device_resolve_objects() { m_status_leds.resolve(); @@ -699,12 +713,10 @@ void firebeat_state::device_resolve_objects() void firebeat_state::init_firebeat() { uint8_t *rom = memregion("user2")->base(); + set_ibutton(rom); // pc16552d_init(machine(), 0, 19660800, comm_uart_irq_callback, 0); // Network UART - m_extend_board_irq_enable = 0x3f; - m_extend_board_irq_active = 0x00; - // Set to defaults here, but overridden for most specific games. It represents various bits of // data, such as the firebeat's ability to play certain games at all, whether the firebeat is // meant as a rental unit or normal unit, and whether the unit is meant as a JP firebeat or @@ -715,8 +727,6 @@ void firebeat_state::init_firebeat() m_maincpu->ppc4xx_spu_set_tx_handler(write8smo_delegate(*this, FUNC(firebeat_state::security_w))); - set_ibutton(rom); - init_lights(write32s_delegate(*this), write32s_delegate(*this), write32s_delegate(*this)); } @@ -740,17 +750,14 @@ void firebeat_state::firebeat(machine_config &config) /* video hardware */ PALETTE(config, "palette", palette_device::RGB_555); - K057714(config, m_gcu, 0); - m_gcu->irq_callback().set(FUNC(firebeat_state::gcu_interrupt)); - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); - screen.set_refresh_hz(60); - screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */ - screen.set_size(512, 384); - screen.set_visarea(0, 511, 0, 383); + screen.set_raw(25.175_MHz_XTAL, 800, 0, 640, 525, 0, 480); screen.set_screen_update(FUNC(firebeat_state::screen_update_firebeat_0)); screen.set_palette("palette"); + K057714(config, m_gcu, 0).set_screen("screen"); + m_gcu->irq_callback().set(FUNC(firebeat_state::gcu_interrupt)); + /* sound hardware */ SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); @@ -774,6 +781,7 @@ void firebeat_state::firebeat_map(address_map &map) map(0x74000000, 0x740003ff).noprw(); // SPU shared RAM map(0x7d000200, 0x7d00021f).r(FUNC(firebeat_state::cabinet_r)); map(0x7d000400, 0x7d000401).rw("ymz", FUNC(ymz280b_device::read), FUNC(ymz280b_device::write)); + map(0x7d000500, 0x7d000501).w(FUNC(firebeat_state::control_w)); map(0x7d000800, 0x7d000803).r(FUNC(firebeat_state::input_r)); map(0x7d400000, 0x7d5fffff).rw("flash_main", FUNC(fujitsu_29f016a_device::read), FUNC(fujitsu_29f016a_device::write)); map(0x7d800000, 0x7d9fffff).rw("flash_snd1", FUNC(fujitsu_29f016a_device::read), FUNC(fujitsu_29f016a_device::write)); @@ -1019,6 +1027,36 @@ uint8_t firebeat_state::input_r(offs_t offset) } /*****************************************************************************/ + +void firebeat_state::control_w(offs_t offset, uint8_t data) +{ + // 0x01 - 31kHz (25.175 MHz)/24kHz (16.6666 MHz) clock switch + // 0x02 - Unused? + // 0x04 - Set to 1 by all games except beatmania III, usage unknown. Screen related? + // 0x08 - Toggles screen mirroring when only one GCU is in use? Default 0 + // 0x80 - Used by ParaParaParadise and Keyboardmania. Set to 1 when doing YMZ flash initialization? + + if (BIT(data, 0) == 0 && BIT(m_control, 0) == 1) + { + // Set screen to 31kHz from 24kHz + m_gcu->set_pixclock(25.175_MHz_XTAL); + + if (m_gcu_sub) + m_gcu_sub->set_pixclock(25.175_MHz_XTAL); + } + else if (BIT(data, 0) == 1 && BIT(m_control, 0) == 0) + { + // Set screen to 24kHz from 31kHz + m_gcu->set_pixclock(16.6666_MHz_XTAL); + + if (m_gcu_sub) + m_gcu_sub->set_pixclock(16.6666_MHz_XTAL); + } + + m_control = data; +} + +/*****************************************************************************/ /* ATA Interface */ uint16_t firebeat_state::ata_command_r(offs_t offset, uint16_t mem_mask) @@ -1176,11 +1214,13 @@ WRITE_LINE_MEMBER(firebeat_state::sound_irq_callback) void firebeat_spu_state::machine_start() { + firebeat_state::machine_start(); m_dma_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(firebeat_spu_state::spu_dma_callback), this)); } void firebeat_spu_state::machine_reset() { + firebeat_state::machine_reset(); m_spu_ata_dma = 0; m_spu_ata_dmarq = 0; m_wave_bank = 0; @@ -1430,11 +1470,6 @@ void firebeat_bm3_state::firebeat_bm3(machine_config &config) m_maincpu->set_addrmap(AS_PROGRAM, &firebeat_bm3_state::firebeat_bm3_map); - // beatmania III is the only game on the Firebeat platform to use 640x480 - screen_device *screen = subdevice<screen_device>("screen"); - screen->set_size(640, 480); - screen->set_visarea(0, 639, 0, 479); - ATA_INTERFACE(config, m_spuata).options(firebeat_ata_devices, "hdd", nullptr, true); m_spuata->irq_handler().set(FUNC(firebeat_bm3_state::spu_ata_interrupt)); m_spuata->dmarq_handler().set(FUNC(firebeat_bm3_state::spu_ata_dmarq)); @@ -1803,28 +1838,22 @@ void firebeat_kbm_state::firebeat_kbm(machine_config &config) /* video hardware */ PALETTE(config, "palette", palette_device::RGB_555); - K057714(config, m_gcu, 0); - m_gcu->irq_callback().set(FUNC(firebeat_kbm_state::gcu_interrupt)); - - K057714(config, m_gcu_sub, 0); - m_gcu_sub->irq_callback().set(FUNC(firebeat_kbm_state::gcu_interrupt)); - screen_device &lscreen(SCREEN(config, "lscreen", SCREEN_TYPE_RASTER)); - lscreen.set_refresh_hz(60); - lscreen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */ - lscreen.set_size(512, 384); - lscreen.set_visarea(0, 511, 0, 383); + lscreen.set_raw(25.175_MHz_XTAL, 800, 0, 640, 525, 0, 480); lscreen.set_screen_update(FUNC(firebeat_kbm_state::screen_update_firebeat_0)); lscreen.set_palette("palette"); + K057714(config, m_gcu, 0).set_screen("lscreen"); + m_gcu->irq_callback().set(FUNC(firebeat_kbm_state::gcu_interrupt)); + screen_device &rscreen(SCREEN(config, "rscreen", SCREEN_TYPE_RASTER)); - rscreen.set_refresh_hz(60); - rscreen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */ - rscreen.set_size(512, 384); - rscreen.set_visarea(0, 511, 0, 383); + rscreen.set_raw(25.175_MHz_XTAL, 800, 0, 640, 525, 0, 480); rscreen.set_screen_update(FUNC(firebeat_kbm_state::screen_update_firebeat_1)); rscreen.set_palette("palette"); + K057714(config, m_gcu_sub, 0).set_screen("rscreen"); + m_gcu_sub->irq_callback().set(FUNC(firebeat_kbm_state::gcu_interrupt)); + /* sound hardware */ SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); |