Identificación de AY-3-8910, YM2149 y clones

¿Tienes problemas con tu equipo?, preguntanos.

Moderador: Fundadores

Avatar de Usuario
cacharreo !Sinclair 1
Moderador
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

Mensaje por cacharreo »

Kyp escribió: 24 Dic 2023, 19:06Si sale así igual ha tenido suerte y le han vendido AY remarcados como YM :D Que no sería nada raro.
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.
© cacharreo
berarma
Aspirante a demonio
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

Mensaje por berarma »

Kyp escribió: 24 Dic 2023, 19:06 Lo de los registros tiene que valer. Creo que el AY devuelve bits a 1 en los bits no usados. Si sale así igual ha tenido suerte y le han vendido AY remarcados como YM :D Que no sería nada raro.
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.
Avatar de Usuario
cacharreo !Sinclair 1
Moderador
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

Mensaje por cacharreo »

Kyp escribió: 24 Dic 2023, 19:06Lo de los registros tiene que valer. Creo que el AY devuelve bits a 1 en los bits no usados.
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
Avatar de Usuario
cacharreo !Sinclair 1
Moderador
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

Mensaje por cacharreo »

berarma escribió: 24 Dic 2023, 20:20El 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.
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()
{

}
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.

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()
{

}

Esta otra sí que funciona. No utiliza la escritura y lectura en los registros sino que comprueba el DC offset del canal analógico A del PSG. Obviamente las conexiones necesarias entre el Nano y el PSG son mínimas.

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()
{

}
Por último, otra versión que hace lo mismo que la anterior pero además hace parpadear el LED del Nano unas 20 veces por segundo cuando detecta un AY-3 y 2 veces por segundo cuando se trata de un YM. Así no hace falta utilizar el monitor serie, ni siquiera tener conectado el Nano al PC para saber el resultado.

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
berarma
Aspirante a demonio
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

Mensaje por berarma »

cacharreo escribió: 24 Dic 2023, 21:56
Kyp escribió: 24 Dic 2023, 19:06Lo de los registros tiene que valer. Creo que el AY devuelve bits a 1 en los bits no usados.
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.

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           ;
Y este es el programa en Basic, con ejecución automática en la línea 100:

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
Como ya has explicado simplemente escribe 31 en el registro 1 del chip de sonido y comprueba si se lee 31 o 15.
berarma
Aspirante a demonio
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

Mensaje por berarma »

cacharreo escribió: 24 Dic 2023, 21:59
berarma escribió: 24 Dic 2023, 20:20El 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.
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)

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.
Los probaré cuando tenga un rato.

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.
Avatar de Usuario
cacharreo !Sinclair 1
Moderador
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

Mensaje por cacharreo »

berarma escribió: 26 Dic 2023, 01:54Los probaré cuando tenga un rato.
No hay prisa y me da que sabemos qué va a pasar.
berarma escribió: 26 Dic 2023, 01:54Yo también había mirado el código de la biblioteca para ver si estaba poniendo a cero los bits no usados.
Mirado rápido y por encima no he visto nada que justifique que no se lean esos bits.
berarma escribió: 26 Dic 2023, 01:54Imagino 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.
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.
berarma escribió: 26 Dic 2023, 01:54¿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.
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
Avatar de Usuario
cacharreo !Sinclair 1
Moderador
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

Mensaje por cacharreo »

Por si lo desmonto pronto, dejo una foto del engendro en la breadboard para nuestros archivos retroelectrónicos. ;)

Imagen

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
berarma
Aspirante a demonio
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

Mensaje por berarma »

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:
Imagen

Lectura de 0xFF en registro 1:
Imagen

Escritura de 0xFF en registro 0:
Imagen

Lectura de 0xFF en registro 0:
Imagen
Avatar de Usuario
cacharreo !Sinclair 1
Moderador
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

Mensaje por cacharreo »

berarma escribió: 26 Dic 2023, 15:37He 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.
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
Responder

Volver a “Consultas”