No es nada raro, a mí me han llegado AY-3-8910 remarcados como YM2149. También tengo YM2149 remarcados pero con estos es curioso comprobar como partían de un conjunto heterogéneo de chips y, aunque todos tienen exactamente la misma serigrafía, unos son YM2149 y otros no.
Identificación de AY-3-8910, YM2149 y clones
Moderador: Fundadores
- cacharreo
- Moderador
- Mensajes: 6043
- Registrado: 09 Ago 2019, 10:17
- Ubicación: /home/cacharreo/
- Has thanked: 1239 times
- Been thanked: 2969 times
- Contactar:
Re: Identificación de AY-3-8910, YM2149 y clones
© cacharreo
-
- Aspirante a demonio
- Mensajes: 208
- Registrado: 07 Jun 2023, 10:57
- Has thanked: 76 times
- Been thanked: 28 times
Re: Identificación de AY-3-8910, YM2149 y clones
El caso es que el volumen es muy diferente de los AY que también he comprado. Tengo dos AY que parecen reales, y cinco YM2149 que no son iguales a los AY que tengo pero que no parece que se comporten como tales.
- cacharreo
- Moderador
- Mensajes: 6043
- Registrado: 09 Ago 2019, 10:17
- Ubicación: /home/cacharreo/
- Has thanked: 1239 times
- Been thanked: 2969 times
- Contactar:
Re: Identificación de AY-3-8910, YM2149 y clones
Creo que el AY-3 debe devolver 0 en esos bits.
He echado un vistazo al programa AYdete de ZX Spectrum y no hace más que escribir un 31 (1Fh) en el registro 1 para a continuación volver a leer el registro. Si ha leído un 15 (0Fh) deduce que se trata de un AY-3-891x; si ha leído un 31 (1Fh) deduce que se trata de un YM2149; y en cualquier otro caso entiende que no hay un chip de sonido.
© cacharreo
- cacharreo
- Moderador
- Mensajes: 6043
- Registrado: 09 Ago 2019, 10:17
- Ubicación: /home/cacharreo/
- Has thanked: 1239 times
- Been thanked: 2969 times
- Contactar:
Re: Identificación de AY-3-8910, YM2149 y clones
Ni te preocupes, tengo 3 tipos diferentes por aquí y cada grupo se comporta de forma diferente. Los AY-3-8910 reales consumen unos 55-60mA, los YM unos 35-40mA y otros supuestos YM pero que son detectados como AY-3-8910 solo 25-27mA.
¿Podrías probar el siguiente código con los tuyos y devolverme la salida que da por el puerto serie? (especialmente los que creas que son YM2149)
AY-3_Detect.ino 0.00β
Código: Seleccionar todo
// #############################################################################
// ┏┻┻┻┻┻┻┓
// ┫ ┣ VaDeRetro
// ┫ ┣ AY-3 detection
// ┫ ┣ 0.00β
// ┗┳┳┳┳┳┳┛
// #############################################################################
#include "AY3891x.h"
#define DEBUG
const char acPSGpn[3][7] = // PSG chip part number
{
"No PSG",
"AY-3",
"YM2149"
};
// PSG pins
// PSG: DA7, DA6, DA5, DA4, DA3, DA2, DA1, DA0, BDIR, BC2, BC1
// Nano digital pins
AY3891x psg( 17, 8, 7, 6, 5, 4, 2, 3, 16, 15, 14);
void setup()
{
byte
bMatches = 0, // Match counter
bR = 0, // PSG checked register counter
bReg, // PSG register
bResult, // Result
bRV, // Read value from register
bWV; // Value to write to register
Serial.begin( 115200 );
#ifdef DEBUG
Serial.println();
#endif
psg.begin();
for ( bReg = AY3891x::ChA_Tone_Period_Fine_Reg; bReg <= AY3891x::IO_Port_B_Reg; bReg++ )
{
// Write value to register
bWV = bReg | 0x50;
psg.write( bReg, bWV );
// Read value from register
bRV = psg.read( bReg );
#ifdef DEBUG
Serial.print( bWV, HEX );
Serial.print( "->" );
Serial.println( bRV, HEX );
#endif
// Match counter
bMatches += bWV == bRV;
// Register counter
bR++;
}
#ifdef DEBUG
Serial.print( "Registers: " );
Serial.println( bR );
Serial.print( "Matches: " );
Serial.println( bMatches );
#endif
// Calc result
bResult = bMatches ? 1 + ( bR == bMatches ) : 0;
#ifdef DEBUG
Serial.print( "Result: " );
Serial.println( bResult );
#endif
Serial.println( acPSGpn[bResult] );
Serial.end();
}
void loop()
{
}
La siguiente versión pretende hacer exactamente lo mismo que el AYdete de ZX Spectrum pero tampoco funciona. Incluso he comprobado el código de la librería por si aplicaba una máscara al resultado para eliminar los bits no utilizados pero no es el caso.
AY-3_Detect.ino 0.01
Código: Seleccionar todo
// #############################################################################
// ┏┻┻┻┻┻┻┓
// ┫ ┣ VaDeRetro
// ┫ ┣ AY-3 detection
// ┫ ┣ 0.01
// ┗┳┳┳┳┳┳┛
// #############################################################################
#include "AY3891x.h"
#define DEBUG
const char acPSGpn[3][7] = // PSG chip part number
{
"No PSG",
"AY-3",
"YM2149"
};
// PSG pins
// PSG: DA7, DA6, DA5, DA4, DA3, DA2, DA1, DA0, BDIR, BC2, BC1
// Nano digital pins
AY3891x psg( 17, 8, 7, 6, 5, 4, 2, 3, 16, 15, 14);
void setup()
{
byte
bReg, // PSG register
bResult, // Result
bRV, // Read value from register
bWV; // Value to write to register
Serial.begin( 115200 );
#ifdef DEBUG
Serial.println();
#endif
psg.begin();
bReg = AY3891x::ChA_Tone_Period_Coarse_Reg;
// Write value to register
bWV = 0x1F;
psg.write( bReg, bWV );
// Read value from register
bRV = psg.read( bReg );
#ifdef DEBUG
Serial.print( "R" );
Serial.print( bReg, HEX );
Serial.print( ": " );
Serial.print( bWV, HEX );
Serial.print( "->" );
Serial.println( bRV, HEX );
#endif
// Calc result
bResult = ( bRV & 0x0F ) ? 1 + ( bRV == bWV ) : 0;
#ifdef DEBUG
Serial.print( "Result: " );
Serial.println( bResult );
#endif
Serial.println( acPSGpn[bResult] );
Serial.end();
}
void loop()
{
}
AY-3_Detect.ino 1.00
Código: Seleccionar todo
// #############################################################################
// ┏┻┻┻┻┻┻┓
// ┫ ┣ VaDeRetro
// ┫ ┣ AY-3 detection
// ┫ ┣ 1.00
// ┗┳┳┳┳┳┳┛
// #############################################################################
#undef DEBUG
// Nano GND -> PSG #1 (Vss)
// Nano +5V -> PSG #40 (Vcc)
// Nano A7 -> PSG #4 (Analog Channel A)
// Nano AREF -> Nano +5V
const char acPSGpn[2][7] = // PSG chip part number
{
"AY-3",
"YM2149"
};
void setup()
{
byte
bResult; // Result
word
wRV; // Analog value
pinMode( A7, INPUT );
Serial.begin( 115200 );
#ifdef DEBUG
Serial.println();
#endif
wRV = analogRead( A7 );
#ifdef DEBUG
Serial.print( "wRV: " );
Serial.println( wRV );
#endif
// Calc result
bResult = wRV > 511;
#ifdef DEBUG
Serial.print( "Result: " );
Serial.println( bResult );
#endif
Serial.println( acPSGpn[bResult] );
Serial.end();
}
void loop()
{
}
AY-3_Detect.ino 1.01
Código: Seleccionar todo
// #############################################################################
// ┏┻┻┻┻┻┻┓
// ┫ ┣ VaDeRetro
// ┫ ┣ AY-3 detection
// ┫ ┣ 1.01
// ┗┳┳┳┳┳┳┛
// #############################################################################
#undef DEBUG
// Nano GND -> PSG #1 (Vss)
// Nano +5V -> PSG #40 (Vcc)
// Nano A7 -> PSG #4 (Analog Channel A)
// Nano AREF -> Nano +5V
byte
bLED; // LED status
word
wLEDdelay; // Blinking delay
const char acPSGpn[2][7] = // PSG chip part number
{
"AY-3",
"YM2149"
};
void setup()
{
byte
bResult; // Result
word
wRV; // Analog value
pinMode( A7, INPUT );
pinMode( LED_BUILTIN, OUTPUT );
Serial.begin( 115200 );
#ifdef DEBUG
Serial.println();
#endif
wRV = analogRead( A7 );
#ifdef DEBUG
Serial.print( "wRV: " );
Serial.println( wRV );
#endif
// Calc result & blinking delay
bResult = wRV > 511;
wLEDdelay = 500*(word)bResult + 50;
#ifdef DEBUG
Serial.print( "Result: " );
Serial.println( bResult );
#endif
Serial.println( acPSGpn[bResult] );
Serial.end();
}
void loop()
{
bLED = !bLED;
digitalWrite( LED_BUILTIN, bLED );
delay( wLEDdelay );
}
© cacharreo
-
- Aspirante a demonio
- Mensajes: 208
- Registrado: 07 Jun 2023, 10:57
- Has thanked: 76 times
- Been thanked: 28 times
Re: Identificación de AY-3-8910, YM2149 y clones
cacharreo escribió: ↑24 Dic 2023, 21:56Creo que el AY-3 debe devolver 0 en esos bits.
He echado un vistazo al programa AYdete de ZX Spectrum y no hace más que escribir un 31 (1Fh) en el registro 1 para a continuación volver a leer el registro. Si ha leído un 15 (0Fh) deduce que se trata de un AY-3-891x; si ha leído un 31 (1Fh) deduce que se trata de un YM2149; y en cualquier otro caso entiende que no hay un chip de sonido.
Creo que habías pedido un listado en ensamblador aunque parece que ya lo has sacado:
Código: Seleccionar todo
50000 EI ;
50001 HALT ;
50002 LD BC,65533 ;
50005 LD A,1 ;
50007 OUT (C),A ;
50009 LD BC,49149 ;
50012 LD A,31 ;
50014 OUT (C),A ;
50016 LD BC,65533 ;
50019 IN A,(C) ;
50021 LD B,0 ;
50023 LD C,A ;
50024 RET ;
Código: Seleccionar todo
1 CLEAR 3e4
10 LET a=USR 50000
20 IF a=31 THEN PRINT AT 0,0;"YM2149",: GO TO 10
30 IF a=15 THEN PRINT AT 0,0;"AY-3-891x",: GO TO 10
40 PRINT AT 0,0;"No soundchip",: GO TO 10
100 CLEAR 3e4: LOAD "aydet"CODE 5e4,100: RUN
-
- Aspirante a demonio
- Mensajes: 208
- Registrado: 07 Jun 2023, 10:57
- Has thanked: 76 times
- Been thanked: 28 times
Re: Identificación de AY-3-8910, YM2149 y clones
Los probaré cuando tenga un rato.cacharreo escribió: ↑24 Dic 2023, 21:59Ni te preocupes, tengo 3 tipos diferentes por aquí y cada grupo se comporta de forma diferente. Los AY-3-8910 reales consumen unos 55-60mA, los YM unos 35-40mA y otros supuestos YM pero que son detectados como AY-3-8910 solo 25-27mA.
¿Podrías probar el siguiente código con los tuyos y devolverme la salida que da por el puerto serie? (especialmente los que creas que son YM2149)
Te adelanto que me ocurre como a ti, ninguno de los PSG que tengo conserva los bits que debería conservar el YM, incluyendo los chips que AYdete de ZX Spectrum reconoce como YM2149.
La siguiente versión pretende hacer exactamente lo mismo que el AYdete de ZX Spectrum pero tampoco funciona. Incluso he comprobado el código de la librería por si aplicaba una máscara al resultado para eliminar los bits no utilizados pero no es el caso.
Yo también había mirado el código de la biblioteca para ver si estaba poniendo a cero los bits no usados.
Imagino que debe haber clones piratas, además de los originales con su referencia oficial, y por eso tanta variedad. Pero aun así me resulta raro que esos clones tengan diferencias significativas a nivel funcional como lo de los registros.
Y sobretodo, ¿cómo es posible que con el Aydete te reconozca el YM y con un programa de Arduino que hace lo mismo no lo detecte? Esto sería muy raro e indicaría que hay algo que se nos escapa del funcionamiento de estos chips.
- cacharreo
- Moderador
- Mensajes: 6043
- Registrado: 09 Ago 2019, 10:17
- Ubicación: /home/cacharreo/
- Has thanked: 1239 times
- Been thanked: 2969 times
- Contactar:
Re: Identificación de AY-3-8910, YM2149 y clones
No hay prisa y me da que sabemos qué va a pasar.
Mirado rápido y por encima no he visto nada que justifique que no se lean esos bits.
Mientras no se demuestre lo contrario, todos estos chips remarcados son AY-3-8910 o YM2149 y funcionan como deben. La diferencia en el comportamiento de los registros la achaco a la librería en sí, sobre todo porque cuando pruebo con el AYdete del Spectrum los detecta siempre igual y sí que aparece el 0 en el bit 4 del registro 1 con los AY-3 y el bit 4 sin modificar con los YM.
También me resultó sorprendente que las dos últimas versiones del código, que simplemente miden el nivel de salida del canal A, coinciden exactamente con los resultados del AYdete sin dar ni un solo falso positivo o falso negativo.
Esta librería concreta es muy suya en cuanto a las temporizaciones que utiliza para escribir o leer los chips quedando en la gran mayoría de los casos fuera de las especificaciones así que cualquier resultado raro no me extrañaría.
El Nano a 16MHz que he usado (y cualquier AVR en su misma categoría) tarda una barbaridad en ejecutar una lectura o escritura de puertos con las librerías estándar (esto se explicó en detalle en el tema del desarrollo del VdR RAM Tester), tanto que es difícil o imposible escribir o leer en los registros del AY/YM pero el autor de la librería utiliza una técnica muy particular (pero fuera de especificaciones) que tal vez funcione en un conjunto muy cerrado de casos.
Para confirmarlo podríamos probar con otros sistemas u otros microcontroladores mucho más rápidos pero no creo que merezca la pena tomarse esa molestia.
© cacharreo
- cacharreo
- Moderador
- Mensajes: 6043
- Registrado: 09 Ago 2019, 10:17
- Ubicación: /home/cacharreo/
- Has thanked: 1239 times
- Been thanked: 2969 times
- Contactar:
Re: Identificación de AY-3-8910, YM2149 y clones
Por si lo desmonto pronto, dejo una foto del engendro en la breadboard para nuestros archivos retroelectrónicos.
Recuerdo que esta versión tiene todos los cables que permiten tanto la lectura/escritura de registros como la detección basada en el nivel del canal analógico A. Si se utilizara cualquiera de las dos últimas versiones del código (1.xx) con 4/6 cables bastaría.
Recuerdo que esta versión tiene todos los cables que permiten tanto la lectura/escritura de registros como la detección basada en el nivel del canal analógico A. Si se utilizara cualquiera de las dos últimas versiones del código (1.xx) con 4/6 cables bastaría.
© cacharreo
-
- Aspirante a demonio
- Mensajes: 208
- Registrado: 07 Jun 2023, 10:57
- Has thanked: 76 times
- Been thanked: 28 times
Re: Identificación de AY-3-8910, YM2149 y clones
He ejecutado los tests propuestos en una de las supuestas YM2149 y los resultados son los esperados. No se guardan los bits no usados y por tanto los dos primeros tests las detectan como AY. Solo he probado una pero por los tests similares que ya había hecho antes el resultado será el mismo.
El tercer test sí que detecta la AY/YM como era de esperar también por la diferencia en la tensión base de salida.
He estado mirando el tema de las temporizaciones y no me parece que haya nada raro. Usa los estados inválidos de las señales de control del bus como estados transicionales para que la velocidad no sea un problema.
No quiero haceros perder tiempo con esto porque reconozco que las implicaciones son casi inexistentes y la explicación de @cacharreo es la más lógica. Aunque me gustaría seguir indagando si no os parece mal. Entenderé que no sigáis el tema.
He sacado unas capturas con el Logic 2 de Saleae y parece todo bastante normal. Adjunto captura de pantalla de las operaciones de lectura y escritura, y captura completa. El programa ejecutado es AY3891x_EX1_Find_Address de los ejemplos de la biblioteca por lo que las operaciones de lectura y escritura son las últimas. He hecho una prueba cambiando el registro 0 para ver como se comporta cambiando solo bits usados y otra cambiando el registro 1 para ver como se comporta cuando hay bits no usados.
Escritura de 0xFF en registro 1:
Lectura de 0xFF en registro 1:
Escritura de 0xFF en registro 0:
Lectura de 0xFF en registro 0:
El tercer test sí que detecta la AY/YM como era de esperar también por la diferencia en la tensión base de salida.
He estado mirando el tema de las temporizaciones y no me parece que haya nada raro. Usa los estados inválidos de las señales de control del bus como estados transicionales para que la velocidad no sea un problema.
No quiero haceros perder tiempo con esto porque reconozco que las implicaciones son casi inexistentes y la explicación de @cacharreo es la más lógica. Aunque me gustaría seguir indagando si no os parece mal. Entenderé que no sigáis el tema.
He sacado unas capturas con el Logic 2 de Saleae y parece todo bastante normal. Adjunto captura de pantalla de las operaciones de lectura y escritura, y captura completa. El programa ejecutado es AY3891x_EX1_Find_Address de los ejemplos de la biblioteca por lo que las operaciones de lectura y escritura son las últimas. He hecho una prueba cambiando el registro 0 para ver como se comporta cambiando solo bits usados y otra cambiando el registro 1 para ver como se comporta cuando hay bits no usados.
Escritura de 0xFF en registro 1:
Lectura de 0xFF en registro 1:
Escritura de 0xFF en registro 0:
Lectura de 0xFF en registro 0:
- cacharreo
- Moderador
- Mensajes: 6043
- Registrado: 09 Ago 2019, 10:17
- Ubicación: /home/cacharreo/
- Has thanked: 1239 times
- Been thanked: 2969 times
- Contactar:
Re: Identificación de AY-3-8910, YM2149 y clones
Pero fuera de las especificaciones y es que con un ATmega328P a 16MHz es imposible. Un simple NOP en este microcontrolador se ejecutaría en 62.5ns y, por comparar, el tAH y el tDH del AY-3-8910 requieren un mínimo 65ns, siendo el mínimo no es que vaya a dejar de funcionar pero da una idea de la escala. Una operación de escritura de puertos con la librería estandar se lleva mucho, mucho más que los 62.5ns de una instrucción simple.
Otro asunto más, que se me está olvidando mencionar una y otra vez, es que aparte de distinguir entre AY-3 e YM también interesaría saber cuando funcionan al 100%. He recibido AY-3 e YM que cuando se utilizan en, por ejemplo, un Amstrad CPC aparecen fallos en el teclado (normalmente en forma de teclas que no funcionan). En definitiva que no solo habría que comprobar el tipo de PSG sino también comprobar sus puertos I/O.
Si te apetece seguir indagando te recomendaría utilizar un microcontrolador mucho más rápido, partir de un código que cumpla estrictamente las temporizaciones del AY-3-8910 y después ir reduciendo progresivamente la velocidad para comprobar cuándo aparece el fallo. El problema del ATmega328P y similares es que ni reescribiendo el código en C o en assembler se conseguiría la suficiente velocidad.
Aparte de todo esto he escrito al autor de la librería para comentarle estos problemas con la lectura/escritura y los bits no utilizados. Veremos qué responde si tiene a bien contestarnos.
© cacharreo