diff --git a/qtBuildSystem/Mu/debugviewer.cpp b/qtBuildSystem/Mu/debugviewer.cpp index 2cb63e1..d4df3dc 100644 --- a/qtBuildSystem/Mu/debugviewer.cpp +++ b/qtBuildSystem/Mu/debugviewer.cpp @@ -45,16 +45,19 @@ int64_t DebugViewer::numberFromString(QString str, bool negativeAllowed){ } QString DebugViewer::stringFromNumber(int64_t number, bool hex, uint32_t forcedZeros){ - if(hex){ - QString hexString; + QString numString; - hexString += QString::number(number, 16).toUpper(); - while(hexString.length() < (int)forcedZeros)hexString.push_front("0"); - hexString.push_front("0x"); - return hexString; + if(hex){ + numString += QString::number(number, 16).toUpper(); + while(numString.length() < (int)forcedZeros)numString.push_front("0"); + numString.push_front("0x"); + } + else{ + numString += QString::number(number, 10); + while(numString.length() < (int)forcedZeros)numString.push_front("0"); } - return QString::number(number, 10); + return numString; } void DebugViewer::debugRadioButtonHandler(){ @@ -137,6 +140,15 @@ void DebugViewer::on_debugDump_clicked(){ } } +void DebugViewer::on_debugPrintAudioBuffer_clicked(){ + EmuWrapper& emu = ((MainWindow*)parentWidget())->emu; + const int16_t* samples = emu.getAudioSamples(); + + ui->debugValueList->clear(); + for(uint32_t index = 0; index < AUDIO_SAMPLES_PER_FRAME * 2; index++) + ui->debugValueList->addItem(stringFromNumber(index, false, 5) + ":" + stringFromNumber(samples[index], false, 5)); +} + void DebugViewer::on_debugShowRegisters_clicked(){ std::vector registers = ((MainWindow*)parentWidget())->emu.getCpuRegisters(); diff --git a/qtBuildSystem/Mu/debugviewer.h b/qtBuildSystem/Mu/debugviewer.h index 4f972b6..3bf9b1e 100644 --- a/qtBuildSystem/Mu/debugviewer.h +++ b/qtBuildSystem/Mu/debugviewer.h @@ -30,6 +30,7 @@ private slots: void on_debug32Bit_clicked(); void on_debugDump_clicked(); + void on_debugPrintAudioBuffer_clicked(); void on_debugShowRegisters_clicked(); void on_debugPrintDebugLogs_clicked(); void on_debugEraseDebugLogs_clicked(); diff --git a/qtBuildSystem/Mu/debugviewer.ui b/qtBuildSystem/Mu/debugviewer.ui index 83c298f..6ea490f 100644 --- a/qtBuildSystem/Mu/debugviewer.ui +++ b/qtBuildSystem/Mu/debugviewer.ui @@ -6,8 +6,8 @@ 0 0 - 578 - 359 + 548 + 393 @@ -45,23 +45,6 @@ - - - - 16bit - - - - - - - Show Registers - - - false - - - @@ -72,7 +55,24 @@ - + + + + 16bit + + + + + + + Show Registers + + + false + + + + @@ -82,7 +82,7 @@ - + Print Debug Logs @@ -92,7 +92,7 @@ - + Erase Debug Logs @@ -102,7 +102,7 @@ - + Dump To File @@ -140,6 +140,13 @@ + + + + Print Last Frame Audio Buffer + + + diff --git a/src/hardwareRegisters.c b/src/hardwareRegisters.c index e1bd15f..1cde293 100644 --- a/src/hardwareRegisters.c +++ b/src/hardwareRegisters.c @@ -605,16 +605,28 @@ void setHwRegister8(uint32_t address, uint8_t value){ case PWMS1 + 1: //write only if PWM1 and FIFOAV are set and a slot is available if((registerArrayRead16(PWMC1) & 0x0030) == 0x0030){ - /* - uint32_t audioNow = audioGetFramePercentage(); - uint32_t audioSampleDuration = 0; - uint32_t audioDutyCycle = 0; + uint16_t pwmc1 = registerArrayRead16(PWMC1); - for(uint8_t times = 0; times < repeat; times++){ - blip_add_delta(palmAudioResampler, audioGetFramePercentage()) + if(!(pwmc1 & 0x8000)){ + //SYSCLK + uint8_t prescaler = (pwmc1 >> 8 & 0x7F) + 1; + uint8_t clockDivider = 2 << (pwmc1 & 0x03); + uint8_t repeat = 1 << (pwmc1 >> 2 & 0x03); + + double dutyCycle = dMin((double)value / (registerArrayRead8(PWMP1) + 2), 1.0); + uint32_t audioNow = audioGetFramePercentage(); + uint32_t audioSampleDuration = prescaler * clockDivider; + uint32_t audioDutyCycle = audioSampleDuration * dutyCycle; + + for(uint8_t times = 0; times < repeat; times++){ + blip_add_delta(palmAudioResampler, audioNow, 0x6666); + blip_add_delta(palmAudioResampler, audioNow + audioDutyCycle, -0x6666); + audioNow += audioSampleDuration; + } + } + else{ + //CLK32 } - */ - //empty } break;