- [NEW] [ui] incoffset() i panel()
- [NEW] mòdul ay_viewer - [NEW] [ay-3-8912] afegits mètodes de debug - [FIX] [ay-3-8912]Arreglats uns quants tipus de dades - [FIX] [ay-3-8912]Arreglat el càlcul de la frequència (en realitat amplitud) dels tonos - [FIX] [ay-3-8912] Arreglat el algoritme de càlcul del roido
This commit is contained in:
@@ -29,26 +29,28 @@ namespace audio
|
||||
uint8_t selected_register {0};
|
||||
uint8_t registers[16];
|
||||
|
||||
uint16_t channel_a_tone_freq;
|
||||
uint16_t channel_a_tone_freq_counter;
|
||||
uint16_t channel_a_tone_level;
|
||||
uint16_t channel_a_level;
|
||||
uint16_t channel_b_tone_freq;
|
||||
uint16_t channel_b_tone_freq_counter;
|
||||
uint16_t channel_b_tone_level;
|
||||
uint16_t channel_b_level;
|
||||
uint16_t channel_c_tone_freq;
|
||||
uint16_t channel_c_tone_freq_counter;
|
||||
uint16_t channel_c_tone_level;
|
||||
uint16_t channel_c_level;
|
||||
uint32_t channel_a_tone_freq;
|
||||
uint32_t channel_a_tone_freq_counter;
|
||||
uint8_t channel_a_tone_level;
|
||||
uint8_t channel_a_level;
|
||||
|
||||
uint8_t noise_freq;
|
||||
uint8_t noise_freq_counter;
|
||||
uint32_t channel_b_tone_freq;
|
||||
uint32_t channel_b_tone_freq_counter;
|
||||
uint8_t channel_b_tone_level;
|
||||
uint8_t channel_b_level;
|
||||
|
||||
uint32_t channel_c_tone_freq;
|
||||
uint32_t channel_c_tone_freq_counter;
|
||||
uint8_t channel_c_tone_level;
|
||||
uint8_t channel_c_level;
|
||||
|
||||
uint32_t noise_freq;
|
||||
uint32_t noise_freq_counter;
|
||||
uint8_t noise_level;
|
||||
uint32_t shiftreg;
|
||||
|
||||
uint16_t envelope_freq;
|
||||
uint16_t envelope_freq_counter;
|
||||
uint32_t envelope_freq;
|
||||
uint32_t envelope_freq_counter;
|
||||
int8_t envelope_volume;
|
||||
int8_t envelope_direction;
|
||||
|
||||
@@ -65,40 +67,39 @@ namespace audio
|
||||
void write_register(int port, int val)
|
||||
{
|
||||
registers[selected_register] = val;
|
||||
uint32_t clock = (z80::getClock() >> 4);
|
||||
|
||||
switch (selected_register) {
|
||||
case 0:
|
||||
case 1: {
|
||||
uint16_t freq = registers[0] | ((registers[1] & 0xf) << 8);
|
||||
channel_a_tone_freq = clock / freq==0?1:freq;
|
||||
uint32_t freq = uint32_t(registers[0]) + (uint32_t(registers[1]) * 256);
|
||||
channel_a_tone_freq = (freq==0?1:freq)<<4;
|
||||
channel_a_tone_freq_counter = 0;
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
case 3: {
|
||||
uint16_t freq = registers[2] | ((registers[3] & 0xf) << 8);
|
||||
channel_b_tone_freq = clock / freq==0?1:freq;
|
||||
uint32_t freq = uint32_t(registers[2]) + (uint32_t(registers[3]) * 256);
|
||||
channel_b_tone_freq = (freq==0?1:freq)<<4;
|
||||
channel_b_tone_freq_counter = 0;
|
||||
break;
|
||||
}
|
||||
case 4:
|
||||
case 5: {
|
||||
uint16_t freq = registers[4] | ((registers[5] & 0xf) << 8);
|
||||
channel_c_tone_freq = clock / freq==0?1:freq;
|
||||
uint32_t freq = uint32_t(registers[4]) + (uint32_t(registers[5]) * 256);
|
||||
channel_c_tone_freq = (freq==0?1:freq)<<4;
|
||||
channel_c_tone_freq_counter = 0;
|
||||
break;
|
||||
}
|
||||
case 6: {
|
||||
uint8_t freq = (registers[6] & 0x1f);
|
||||
noise_freq = clock / freq==0?1:freq;
|
||||
uint32_t freq = (registers[6] & 0x1f);
|
||||
noise_freq = (freq==0?1:freq)<<4;
|
||||
noise_freq_counter = 0;
|
||||
break;
|
||||
}
|
||||
case 11:
|
||||
case 12: {
|
||||
uint16_t freq = registers[11] | (registers[12] << 8);
|
||||
envelope_freq = clock / freq==0?1:freq;
|
||||
uint32_t freq = registers[11] | (registers[12] << 8);
|
||||
envelope_freq = (freq==0?1:freq)<<4;
|
||||
break;
|
||||
}
|
||||
case 13:
|
||||
@@ -127,7 +128,7 @@ namespace audio
|
||||
|
||||
void update(uint32_t dt)
|
||||
{
|
||||
dt = dt >> 1;
|
||||
//dt = dt >> 1;
|
||||
|
||||
// Oscillate (0-1) channel A tone level given its frequency
|
||||
channel_a_tone_freq_counter+=dt;
|
||||
@@ -154,11 +155,14 @@ namespace audio
|
||||
noise_freq_counter+=dt;
|
||||
if (noise_freq_counter >= noise_freq) {
|
||||
noise_freq_counter -= noise_freq;
|
||||
noise_level = noise_level ^ shiftreg;
|
||||
uint32_t newbit = shiftreg ^ (shiftreg >> 3);
|
||||
shiftreg = ((shiftreg >> 1) & 0xff) | ((newbit << 16) & 0x100);
|
||||
//noise_level = noise_level ^ shiftreg;
|
||||
//uint32_t newbit = shiftreg ^ (shiftreg >> 3);
|
||||
//shiftreg = ((shiftreg >> 1) & 0xffff) | ((newbit << 16) & 0x10000);
|
||||
shiftreg = (shiftreg * 2 + 1) ^ (((shiftreg >> 16) ^ (shiftreg >> 13)) & 1);
|
||||
noise_level = ((shiftreg >> 16) & 1);
|
||||
}
|
||||
|
||||
|
||||
// Develop (0-15) envelope volume given its frequency and shape
|
||||
envelope_freq_counter+=dt;
|
||||
if (envelope_freq_counter >= envelope_freq) {
|
||||
@@ -218,4 +222,33 @@ namespace audio
|
||||
return sample;
|
||||
}
|
||||
|
||||
namespace debug
|
||||
{
|
||||
uint8_t get_register(uint8_t num) { return registers[num]; }
|
||||
uint32_t get_channel_a_tone_freq() { return channel_a_tone_freq; }
|
||||
uint32_t get_channel_a_tone_freq_counter() { return channel_a_tone_freq_counter; }
|
||||
uint8_t get_channel_a_tone_level() { return channel_a_tone_level; }
|
||||
uint8_t get_channel_a_level() { return channel_a_level; }
|
||||
|
||||
uint32_t get_channel_b_tone_freq() { return channel_b_tone_freq; }
|
||||
uint32_t get_channel_b_tone_freq_counter() { return channel_b_tone_freq_counter; }
|
||||
uint8_t get_channel_b_tone_level() { return channel_b_tone_level; }
|
||||
uint8_t get_channel_b_level() { return channel_b_level; }
|
||||
|
||||
uint32_t get_channel_c_tone_freq() { return channel_c_tone_freq; }
|
||||
uint32_t get_channel_c_tone_freq_counter() { return channel_c_tone_freq_counter; }
|
||||
uint8_t get_channel_c_tone_level() { return channel_c_tone_level; }
|
||||
uint8_t get_channel_c_level() { return channel_c_level; }
|
||||
|
||||
uint32_t get_noise_freq() { return noise_freq; }
|
||||
uint32_t get_noise_freq_counter() { return noise_freq_counter; }
|
||||
uint8_t get_noise_level() { return noise_level; }
|
||||
uint32_t get_shiftreg() { return shiftreg; }
|
||||
|
||||
uint32_t get_envelope_freq() { return envelope_freq; }
|
||||
uint32_t get_envelope_freq_counter() { return envelope_freq_counter; }
|
||||
int8_t get_envelope_volume() { return envelope_volume; }
|
||||
int8_t get_envelope_direction() { return envelope_direction; }
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user