diff options
Diffstat (limited to 'src/devices/sound/mas3507d.cpp')
-rw-r--r-- | src/devices/sound/mas3507d.cpp | 76 |
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 |