summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/firebeat.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/firebeat.cpp')
-rw-r--r--src/mame/drivers/firebeat.cpp95
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();