summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/sound/mas3507d.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/sound/mas3507d.cpp')
-rw-r--r--src/devices/sound/mas3507d.cpp76
1 files changed, 67 insertions, 9 deletions
diff --git a/src/devices/sound/mas3507d.cpp b/src/devices/sound/mas3507d.cpp
index 4b972b46dfc..11c2c79e8b7 100644
--- a/src/devices/sound/mas3507d.cpp
+++ b/src/devices/sound/mas3507d.cpp
@@ -15,6 +15,7 @@ mas3507d_device::mas3507d_device(const machine_config &mconfig, const char *tag,
, device_sound_interface(mconfig, *this)
, i2c_bus_state(), i2c_bus_address(), i2c_scli(false), i2c_sclo(false), i2c_sdai(false), i2c_sdao(false)
, i2c_bus_curbit(0), i2c_bus_curval(0), i2c_subdest(), i2c_command(), i2c_bytecount(0), i2c_io_bank(0), i2c_io_adr(0), i2c_io_count(0), i2c_io_val(0)
+ , m_samples(nullptr)
{
}
@@ -48,6 +49,7 @@ void mas3507d_device::i2c_scl_w(bool line)
if(i2c_device_got_address(i2c_bus_curval)) {
i2c_bus_state = ACK;
i2c_bus_address = VALIDATED;
+ i2c_bus_curval = 0;
} else {
i2c_bus_state = NAK;
i2c_bus_address = WRONG;
@@ -111,7 +113,12 @@ int mas3507d_device::i2c_sda_r()
bool mas3507d_device::i2c_device_got_address(uint8_t address)
{
- i2c_subdest = UNDEFINED;
+ if (address == 0x3b) {
+ i2c_subdest = DATA_READ;
+ } else {
+ i2c_subdest = UNDEFINED;
+ }
+
return (address & 0xfe) == 0x3a;
}
@@ -120,19 +127,37 @@ void mas3507d_device::i2c_device_got_byte(uint8_t byte)
switch(i2c_subdest) {
case UNDEFINED:
if(byte == 0x68)
- i2c_subdest = DATA;
+ i2c_subdest = DATA_WRITE;
else if(byte == 0x69)
- i2c_subdest = DATA;
+ i2c_subdest = DATA_READ;
else if(byte == 0x6a)
i2c_subdest = CONTROL;
else
i2c_subdest = BAD;
+
i2c_bytecount = 0;
+ i2c_io_val = 0;
+
break;
+
case BAD:
logerror("MAS I2C: Dropping byte %02x\n", byte);
break;
- case DATA:
+
+ case DATA_READ:
+ // Default Read
+ // This should return the current MPEGFrameCount value when called
+
+ // TODO: Figure out how to use this data exactly (chip docs are a little unclear to me)
+ i2c_io_val <<= 8;
+ i2c_io_val |= byte;
+ i2c_bytecount++;
+
+ logerror("MAS I2C: DATA_READ %d %08x\n", i2c_bytecount, i2c_io_val);
+
+ break;
+
+ case DATA_WRITE:
if(!i2c_bytecount) {
switch(byte >> 4) {
case 0: case 1:
@@ -215,6 +240,7 @@ void mas3507d_device::i2c_device_got_byte(uint8_t byte)
i2c_bytecount++;
break;
+
case CONTROL:
logerror("MAS I2C: Control byte %02x\n", byte);
break;
@@ -226,14 +252,46 @@ void mas3507d_device::i2c_device_got_stop()
logerror("MAS I2C: got stop\n");
}
+int gain_to_db(double val) {
+ return round(20 * log10((0x100000 - val) / 0x80000));
+}
+
+float gain_to_percentage(int val) {
+ double db = gain_to_db(val);
+
+ if (db == 0) {
+ return 0; // Special case for muting it seems
+ }
+
+ return powf(10.0, (db + 6) / 20.0);
+}
+
void mas3507d_device::mem_write(int bank, uint32_t adr, uint32_t val)
{
switch(adr | (bank ? 0x10000 : 0)) {
case 0x0032f: logerror("MAS3507D: OutputConfig = %05x\n", val); break;
- case 0x107f8: logerror("MAS3507D: left->left gain = %05x\n", val); break;
- case 0x107f9: logerror("MAS3507D: left->right gain = %05x\n", val); break;
- case 0x107fa: logerror("MAS3507D: right->left gain = %05x\n", val); break;
- case 0x107fb: logerror("MAS3507D: right->right gain = %05x\n", val); break;
+ case 0x107f8:
+ logerror("MAS3507D: left->left gain = %05x (%d dB, %f%%)\n", val, gain_to_db(val), gain_to_percentage(val));
+
+ if (m_samples != nullptr) {
+ m_samples->set_volume(0, gain_to_percentage(val));
+ }
+
+ break;
+ case 0x107f9:
+ logerror("MAS3507D: left->right gain = %05x (%d dB, %f%%)\n", val, gain_to_db(val), gain_to_percentage(val));
+ break;
+ case 0x107fa:
+ logerror("MAS3507D: right->left gain = %05x (%d dB, %f%%)\n", val, gain_to_db(val), gain_to_percentage(val));
+ break;
+ case 0x107fb:
+ logerror("MAS3507D: right->right gain = %05x (%d dB, %f%%)\n", val, gain_to_db(val), gain_to_percentage(val));
+
+ if (m_samples != nullptr) {
+ m_samples->set_volume(1, gain_to_percentage(val));
+ }
+
+ break;
default: logerror("MAS3507D: %d:%04x = %05x\n", bank, adr, val); break;
}
}
@@ -261,4 +319,4 @@ void mas3507d_device::run_program(uint32_t adr)
void mas3507d_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples)
{
-}
+} \ No newline at end of file