Fixed bug in AY-3-8910 emulation

This commit is contained in:
fabio.olimpieri 2012-08-22 21:18:36 +00:00
parent 46ca256bca
commit e697305fab
3 changed files with 8 additions and 17 deletions

View File

@ -141,7 +141,6 @@ void computer_init () { //Called only on start-up
ordenador.vol_b = 0;
ordenador.vol_c = 0;
ordenador.tst_ay = 0;
ordenador.tst_ay2 = 0;
ordenador.wr = 0;
ordenador.r_fetch = 0;
ordenador.io = 0;

View File

@ -132,7 +132,6 @@ struct computer {
unsigned char audio_mode; //mono, ABC, ACB, BAC
unsigned char vol_a,vol_b,vol_c;
unsigned int tst_ay;
unsigned int tst_ay2;
unsigned int ay_latch;
signed char ay_envel_value;
unsigned char ay_envel_way;

View File

@ -49,7 +49,6 @@ inline void play_ay (unsigned int tstados) {
return;
ordenador.tst_ay += tstados;
ordenador.tst_ay2 += tstados;
// A note about the period of tones, noise and envelope: careful studies of the chip
// output prove that it counts up from 0 until the counter becomes
@ -61,16 +60,17 @@ inline void play_ay (unsigned int tstados) {
//The frequency of AY-3-8912 is half the ZX Spectrum frequency
if (ordenador.tst_ay > 16) {
ordenador.tst_ay -= 16;
//Envelope
//Envelope frequency is 1/(256*envelop_period) of AY-3-8912 frequency
if (ordenador.tst_ay2 > 127) {
ordenador.tst_ay2 -= 128;
env_period=((unsigned int) ordenador.ay_registers[11]) + 256 * ((unsigned int) ordenador.ay_registers[12]);
if (!env_period) env_period = 1; //It should be the half period
env_period=2*((unsigned int) ordenador.ay_registers[11]) + 256 * ((unsigned int) (ordenador.ay_registers[12]));
if (!env_period) env_period = 1;
if (ordenador.aych_envel<env_period) // to check
if (ordenador.aych_envel<env_period)
ordenador.aych_envel++;
else {
ordenador.aych_envel = 0;
@ -170,21 +170,14 @@ inline void play_ay (unsigned int tstados) {
}
}
}
//Tone and noise
//Tone frequency is 1/(16*tone_period) of AY-3-8912 frequency
//Noise frequency is 1/(16*noise_period) of AY-3-8912 frequency
while (ordenador.tst_ay > 15)
{
ordenador.tst_ay -= 16;
tone_period_a= ((unsigned int) ordenador.ay_registers[0]) + 256 * ((unsigned int) ((ordenador.ay_registers[1]) & 0x0F));
tone_period_b= ((unsigned int) ordenador.ay_registers[2]) + 256 * ((unsigned int) ((ordenador.ay_registers[3]) & 0x0F));
tone_period_c= ((unsigned int) ordenador.ay_registers[4]) + 256 * ((unsigned int) ((ordenador.ay_registers[5]) & 0x0F));
if (tone_period_a<6) //max 20KHz
ordenador.ayval_a =1;
else