diff --git a/Makefile b/Makefile index 243f005..c8fa0fe 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,7 @@ include $(DEVKITARM)/ds_rules export TARGET := GimliDS export TOPDIR := $(CURDIR) -export VERSION := 0.6 +export VERSION := 0.7 ICON := -b $(CURDIR)/C64_icon.bmp "GimliDS $(VERSION);wavemotion-dave;https://github.com/wavemotion-dave/GimliDS" diff --git a/arm9/gfx_data/intro.png b/arm9/gfx_data/intro.png index efdffc7..4cc6ece 100644 Binary files a/arm9/gfx_data/intro.png and b/arm9/gfx_data/intro.png differ diff --git a/arm9/source/C64.cpp b/arm9/source/C64.cpp index 3ee8ec1..46d8de9 100644 --- a/arm9/source/C64.cpp +++ b/arm9/source/C64.cpp @@ -860,7 +860,7 @@ ITCM_CODE void C64::VBlank(bool draw_frame) { if (ThePrefs.TrueDrive && TheDisplay->led_state[0]) break; // If reading the drive in 'true drive' mode, just plow along... asm("nop"); - break; // Uncomment this for full speed... + //break; // Uncomment this for full speed... } frames_per_sec++; diff --git a/arm9/source/Display.cpp b/arm9/source/Display.cpp index 0be30fa..2a7d153 100644 --- a/arm9/source/Display.cpp +++ b/arm9/source/Display.cpp @@ -447,7 +447,7 @@ int i = 0; int debug[8]={0,0,0,0,0,0,0,0}; void C64Display::Speedometer(int speed) { -#if 1 +#if 0 char tmp[34]; sprintf(tmp, "%-8d", speed); diff --git a/arm9/source/SID.cpp b/arm9/source/SID.cpp index 68025dc..927efff 100644 --- a/arm9/source/SID.cpp +++ b/arm9/source/SID.cpp @@ -75,10 +75,8 @@ uint32_t sid_random_seed __attribute__((section(".dtcm"))); // Random seed */ #define CALC_RESONANCE_LP(f) (227.755 - 1.7635 * f - 0.0176385 * f * f + 0.00333484 * f * f * f) - #define CALC_RESONANCE_HP(f) (366.374 - 14.0052 * f + 0.603212 * f * f - 0.000880196 * f * f * f) - /* * Random number generator for noise waveform */ @@ -362,6 +360,7 @@ private: uint8 f_type; // Filter type uint8 f_freq; // SID filter frequency (upper 8 bits) + uint8 f_freq_low; // SID filter frequency (lower 4 bits) uint8 f_res; // Filter resonance (0..15) #ifdef USE_FIXPOINT_MATHS FixPoint f_ampl; @@ -369,16 +368,16 @@ private: int32 xn1, xn2, yn1, yn2; // can become very large FixPoint sidquot; #ifdef PRECOMPUTE_RESONANCE - FixPoint resonanceLP[256]; - FixPoint resonanceHP[256]; + FixPoint resonanceLP[257]; + FixPoint resonanceHP[257]; #endif #else float f_ampl; // IIR filter input attenuation float d1, d2, g1, g2; // IIR filter coefficients float xn1, xn2, yn1, yn2; // IIR filter previous input/output signal #ifdef PRECOMPUTE_RESONANCE - float resonanceLP[256]; // shortcut for calc_filter - float resonanceHP[256]; + float resonanceLP[257]; // shortcut for calc_filter + float resonanceHP[257]; #endif #endif int16 *sound_buffer; @@ -733,7 +732,7 @@ DigitalRenderer::DigitalRenderer() #ifdef PRECOMPUTE_RESONANCE #ifdef USE_FIXPOINT_MATHS // slow floating point doesn't matter much on startup! - for (int i=0; i<256; i++) { + for (int i=0; i<257; i++) { resonanceLP[i] = FixNo(CALC_RESONANCE_LP(i)); resonanceHP[i] = FixNo(CALC_RESONANCE_HP(i)); } @@ -742,7 +741,7 @@ DigitalRenderer::DigitalRenderer() // compute lookup table for sin and cos InitFixSinTab(); #else - for (int i=0; i<256; i++) { + for (int i=0; i<257; i++) { resonanceLP[i] = CALC_RESONANCE_LP(i); resonanceHP[i] = CALC_RESONANCE_HP(i); } @@ -778,6 +777,7 @@ void DigitalRenderer::Reset(void) f_type = FILT_NONE; f_freq = f_res = 0; + f_freq_low = 0; #ifdef USE_FIXPOINT_MATHS f_ampl = FixNo(1); d1 = d2 = g1 = g2 = 0; @@ -873,11 +873,14 @@ void DigitalRenderer::WriteRegister(uint16 adr, uint8 byte) voice[v].r_sub = EGTable[byte & 0xf]; break; - case 22: - if (byte != f_freq) { - f_freq = byte; - calc_filter(); - } + case 21: // Filter Frequency - lower 3 bits + f_freq_low = ((byte & 0x7) > 3) ? 1:0; + calc_filter(); + break; + + case 22: // Filter Frequency - upper 8 bits + f_freq = byte; + calc_filter(); break; case 23: @@ -954,13 +957,13 @@ void DigitalRenderer::calc_filter(void) // Calculate resonance frequency if (f_type == FILT_LP || f_type == FILT_LPBP) #ifdef PRECOMPUTE_RESONANCE - fr = resonanceLP[f_freq]; + fr = resonanceLP[f_freq + f_freq_low]; #else fr = CALC_RESONANCE_LP(f_freq); #endif else #ifdef PRECOMPUTE_RESONANCE - fr = resonanceHP[f_freq]; + fr = resonanceHP[f_freq+f_freq_low]; #else fr = CALC_RESONANCE_HP(f_freq); #endif