diff --git a/src/emulator.c b/src/emulator.c index 116808b..e83a4cd 100644 --- a/src/emulator.c +++ b/src/emulator.c @@ -40,7 +40,8 @@ sd_card_t palmSdCard; misc_hw_t palmMisc; uint16_t palmFramebuffer[160 * (160 + 60)];//really 160*160, the extra pixels are the silkscreened digitizer area uint16_t* palmExtendedFramebuffer; -uint16_t palmAudio[AUDIO_SAMPLES]; +int16_t palmAudio[AUDIO_SAMPLES]; +uint32_t palmAudioSampleIndex; uint32_t palmSpecialFeatures; double palmCrystalCycles;//how many cycles before toggling the 32.768 kHz crystal double palmCycleCounter;//can be greater then 0 if too many cycles where run @@ -94,6 +95,7 @@ uint32_t emulatorInit(buffer_t palmRomDump, buffer_t palmBootDump, uint32_t spec memset(palmExtendedFramebuffer, 0x00, 320 * 320 * sizeof(uint16_t)); //add 320*320 silkscreen image later, 2xBRZ should be able to make 320*320 version of the 160*160 silkscreen } + memset(palmAudio, 0x00, AUDIO_SAMPLES * sizeof(int16_t)); m68328Reset(); sed1376Reset(); ads7846Reset(); @@ -493,6 +495,7 @@ uint32_t emulatorInstallPrcPdb(buffer_t file){ void emulateFrame(){ refreshInputState(); + palmAudioSampleIndex = 0; while(palmCycleCounter < CRYSTAL_FREQUENCY / EMU_FPS){ if(palmCrystalCycles != 0.0){ diff --git a/src/emulator.h b/src/emulator.h index 77b48c0..6a31022 100644 --- a/src/emulator.h +++ b/src/emulator.h @@ -127,7 +127,8 @@ extern sd_card_t palmSdCard;//dont touch extern misc_hw_t palmMisc;//read/write allowed extern uint16_t palmFramebuffer[];//read allowed if FEATURE_320x320 is off, or else invalid data will be displayed extern uint16_t* palmExtendedFramebuffer;//read allowed if FEATURE_320x320 is on, or else SIGSEGV -extern uint16_t palmAudio[];//read allowed +extern int16_t palmAudio[];//read allowed +extern uint32_t palmAudioSampleIndex;//dont touch extern uint32_t palmSpecialFeatures;//read allowed extern double palmCrystalCycles;//dont touch extern double palmCycleCounter;//dont touch diff --git a/src/hardwareRegisters.c b/src/hardwareRegisters.c index 1c2fd00..78eb0d3 100644 --- a/src/hardwareRegisters.c +++ b/src/hardwareRegisters.c @@ -621,8 +621,16 @@ void setHwRegister8(uint32_t address, uint8_t value){ break; case PWMS1 + 1: - if(pwm1FifoEntrys() < 5) - pwm1FifoWrite(value); + //write only if PWM1 enabled + if(registerArrayRead16(PWMC1) & 0x0010) + if(pwm1FifoEntrys() < 5) + pwm1FifoWrite(value); + break; + + case PWMP1: + //write only if PWM1 enabled + if(registerArrayRead16(PWMC1) & 0x0010) + registerArrayWrite8(address, value); break; case PCTLR: @@ -988,10 +996,13 @@ void setHwRegister16(uint32_t address, uint16_t value){ break; case PWMS1: - if(pwm1FifoEntrys() < 5) - pwm1FifoWrite(value >> 8); - if(pwm1FifoEntrys() < 5) - pwm1FifoWrite(value & 0xFF); + //write only if PWM1 enabled + if(registerArrayRead16(PWMC1) & 0x0010){ + if(pwm1FifoEntrys() < 5) + pwm1FifoWrite(value >> 8); + if(pwm1FifoEntrys() < 5) + pwm1FifoWrite(value & 0xFF); + } break; case SPISPC: