mirror of
https://github.com/Oibaf66/fbzx-wii.git
synced 2024-11-28 11:04:15 +01:00
Fixed bug in AY-3-8910 emulation
This commit is contained in:
parent
46ca256bca
commit
e697305fab
@ -141,7 +141,6 @@ void computer_init () { //Called only on start-up
|
|||||||
ordenador.vol_b = 0;
|
ordenador.vol_b = 0;
|
||||||
ordenador.vol_c = 0;
|
ordenador.vol_c = 0;
|
||||||
ordenador.tst_ay = 0;
|
ordenador.tst_ay = 0;
|
||||||
ordenador.tst_ay2 = 0;
|
|
||||||
ordenador.wr = 0;
|
ordenador.wr = 0;
|
||||||
ordenador.r_fetch = 0;
|
ordenador.r_fetch = 0;
|
||||||
ordenador.io = 0;
|
ordenador.io = 0;
|
||||||
|
@ -132,7 +132,6 @@ struct computer {
|
|||||||
unsigned char audio_mode; //mono, ABC, ACB, BAC
|
unsigned char audio_mode; //mono, ABC, ACB, BAC
|
||||||
unsigned char vol_a,vol_b,vol_c;
|
unsigned char vol_a,vol_b,vol_c;
|
||||||
unsigned int tst_ay;
|
unsigned int tst_ay;
|
||||||
unsigned int tst_ay2;
|
|
||||||
unsigned int ay_latch;
|
unsigned int ay_latch;
|
||||||
signed char ay_envel_value;
|
signed char ay_envel_value;
|
||||||
unsigned char ay_envel_way;
|
unsigned char ay_envel_way;
|
||||||
|
21
src/spk_ay.c
21
src/spk_ay.c
@ -49,7 +49,6 @@ inline void play_ay (unsigned int tstados) {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
ordenador.tst_ay += tstados;
|
ordenador.tst_ay += tstados;
|
||||||
ordenador.tst_ay2 += tstados;
|
|
||||||
|
|
||||||
// A note about the period of tones, noise and envelope: careful studies of the chip
|
// 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
|
// 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
|
//The frequency of AY-3-8912 is half the ZX Spectrum frequency
|
||||||
|
|
||||||
|
|
||||||
|
if (ordenador.tst_ay > 16) {
|
||||||
|
ordenador.tst_ay -= 16;
|
||||||
|
|
||||||
//Envelope
|
//Envelope
|
||||||
//Envelope frequency is 1/(256*envelop_period) of AY-3-8912 frequency
|
//Envelope frequency is 1/(256*envelop_period) of AY-3-8912 frequency
|
||||||
|
|
||||||
if (ordenador.tst_ay2 > 127) {
|
env_period=((unsigned int) ordenador.ay_registers[11]) + 256 * ((unsigned int) ordenador.ay_registers[12]);
|
||||||
ordenador.tst_ay2 -= 128;
|
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 (ordenador.aych_envel<env_period)
|
||||||
if (!env_period) env_period = 1;
|
|
||||||
|
|
||||||
if (ordenador.aych_envel<env_period) // to check
|
|
||||||
ordenador.aych_envel++;
|
ordenador.aych_envel++;
|
||||||
else {
|
else {
|
||||||
ordenador.aych_envel = 0;
|
ordenador.aych_envel = 0;
|
||||||
@ -170,21 +170,14 @@ inline void play_ay (unsigned int tstados) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//Tone and noise
|
//Tone and noise
|
||||||
//Tone frequency is 1/(16*tone_period) of AY-3-8912 frequency
|
//Tone frequency is 1/(16*tone_period) of AY-3-8912 frequency
|
||||||
//Noise frequency is 1/(16*noise_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_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_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));
|
tone_period_c= ((unsigned int) ordenador.ay_registers[4]) + 256 * ((unsigned int) ((ordenador.ay_registers[5]) & 0x0F));
|
||||||
|
|
||||||
|
|
||||||
if (tone_period_a<6) //max 20KHz
|
if (tone_period_a<6) //max 20KHz
|
||||||
ordenador.ayval_a =1;
|
ordenador.ayval_a =1;
|
||||||
else
|
else
|
||||||
|
Loading…
Reference in New Issue
Block a user