summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author David Haywood <28625134+DavidHaywood@users.noreply.github.com>2021-10-23 03:52:46 +0100
committer GitHub <noreply@github.com>2021-10-22 22:52:46 -0400
commit559ba3124366b7af42b16c244f772470f02e3290 (patch)
treef2030800c6e89fc6399fcbb46fe75d722f8a242e
parenteca8831836ab5ccbc9432a600a20fdfe14c86322 (diff)
add some recognizable (but still awful) PSG output to the dphh8630 driver (#8704)
-rw-r--r--src/devices/cpu/m6502/st2205u.cpp10
-rw-r--r--src/devices/cpu/m6502/st2205u.h2
-rw-r--r--src/mame/drivers/st2302u_bbl_rom.cpp23
3 files changed, 34 insertions, 1 deletions
diff --git a/src/devices/cpu/m6502/st2205u.cpp b/src/devices/cpu/m6502/st2205u.cpp
index 7e2848dd356..0dfde79e388 100644
--- a/src/devices/cpu/m6502/st2205u.cpp
+++ b/src/devices/cpu/m6502/st2205u.cpp
@@ -117,6 +117,9 @@ void st2205u_base_device::sound_stream_update(sound_stream &stream, std::vector<
{
s16 adpcm_contribution = m_adpcm_level[channel];
outputs[channel].add_int(outpos, adpcm_contribution * 0x10, 32768);
+
+ auto psg_contribution = std::sin((double)m_psg_freqcntr[channel]/4096.0f);
+ outputs[channel].add_int(outpos, psg_contribution * m_psg_amplitude[channel]*0x80,32768);
}
outpos++;
@@ -160,6 +163,8 @@ void st2205u_base_device::base_init(std::unique_ptr<mi_st2xxx> &&intf)
save_item(NAME(m_lvctr));
save_item(NAME(m_adpcm_level));
+ save_item(NAME(m_psg_amplitude));
+ save_item(NAME(m_psg_freqcntr));
mintf = std::move(intf);
save_common_registers();
@@ -362,6 +367,8 @@ void st2205u_base_device::device_reset()
m_lvctr = 0;
std::fill(std::begin(m_adpcm_level), std::end(m_adpcm_level), 0);
+ std::fill(std::begin(m_psg_amplitude), std::end(m_psg_amplitude), 0);
+ std::fill(std::begin(m_psg_freqcntr), std::end(m_psg_freqcntr), 0);
}
void st2205u_device::device_reset()
@@ -782,6 +789,9 @@ void st2205u_base_device::timer_12bit_process(int t)
{
reset_adpcm_value(t);
LOGDAC("Playing %s sample %02X on channel %d\n", BIT(m_psgm, 2 * t) ? "tone" : "DAC", psg_data & 0xff, t);
+
+ m_psg_amplitude[t] = psg_data & 0xff; // amplitude is controller by the data writes
+ m_psg_freqcntr[t] += 0x80; // the frequency is determined by the timer speed (there must be a better way to do this?)
}
--m_fifo_filled[t];
diff --git a/src/devices/cpu/m6502/st2205u.h b/src/devices/cpu/m6502/st2205u.h
index 4182793a3bb..bd73e481822 100644
--- a/src/devices/cpu/m6502/st2205u.h
+++ b/src/devices/cpu/m6502/st2205u.h
@@ -168,6 +168,8 @@ protected:
u8 m_lvctr;
s16 m_adpcm_level[4];
+ u8 m_psg_amplitude[4];
+ u32 m_psg_freqcntr[4];
};
class st2205u_device : public st2205u_base_device
diff --git a/src/mame/drivers/st2302u_bbl_rom.cpp b/src/mame/drivers/st2302u_bbl_rom.cpp
index 53eb7ad5b53..6002717755e 100644
--- a/src/mame/drivers/st2302u_bbl_rom.cpp
+++ b/src/mame/drivers/st2302u_bbl_rom.cpp
@@ -5,6 +5,7 @@
#include "cpu/m6502/st2205u.h"
#include "video/bl_handhelds_lcdc.h"
#include "screen.h"
+#include "speaker.h"
class st22xx_bbl338_state : public driver_device
{
@@ -25,11 +26,12 @@ public:
protected:
virtual void machine_start() override;
- required_device<st2xxx_device> m_maincpu;
+ required_device<st2205u_base_device> m_maincpu;
private:
u8 porta_r();
void portb_w(u8 data);
+ void porta_w(u8 data);
void st22xx_bbl338_map(address_map &map);
void st22xx_dphh8213_map(address_map &map);
@@ -248,11 +250,21 @@ u8 st22xx_bbl338_state::porta_r()
// TODO: bit 7 is I/O for some bitbanged SPI device (used for the menu)
input |= 0xc0;
+
+ logerror("%s: port a read\n", machine().describe_context());
+
return input;
}
+void st22xx_bbl338_state::porta_w(u8 data)
+{
+ // Menu control writes?
+ logerror("%s: port a write %02x\n", machine().describe_context(), data);
+}
+
void st22xx_bbl338_state::portb_w(u8 data)
{
+// logerror("%s: port b write %02x\n", machine().describe_context(), data);
m_portb = data;
}
@@ -306,9 +318,18 @@ void st22xx_bbl338_state::st22xx_dphh8213(machine_config &config)
ST2302U(config, m_maincpu, 24000000);
m_maincpu->set_addrmap(AS_DATA, &st22xx_bbl338_state::st22xx_dphh8213_map);
m_maincpu->in_pa_callback().set(FUNC(st22xx_bbl338_state::porta_r));
+ m_maincpu->out_pa_callback().set(FUNC(st22xx_bbl338_state::porta_w));
+
m_maincpu->out_pb_callback().set(FUNC(st22xx_bbl338_state::portb_w));
m_maincpu->in_pc_callback().set_ioport("PORTC");
+ SPEAKER(config, "mono").front_center();
+ m_maincpu->add_route(0, "mono", 1.00);
+ m_maincpu->add_route(1, "mono", 1.00);
+ m_maincpu->add_route(2, "mono", 1.00);
+ m_maincpu->add_route(3, "mono", 1.00);
+
+
SCREEN(config, m_screen, SCREEN_TYPE_LCD);
m_screen->set_refresh_hz(60);
m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));