Pues aquí estamos, esta vez con un fix al ZX Omni rev.2 de retroradionics.
El problema encontrado es que hay juegos que usan el AY para hacer sonidos o poner música y que cuando se arrancan o bien se resetean o se quedan colgados y / o comportamientos erráticos.
Al habla con Habi (Habisoft creador del es.pectrum, y diversos inventos para el PCW que podeis ver en su página), resulta que este omni tiene un bug que hace que, si el juego en cuestión no genera la tabla completa de IM2 (por ejemplo entre 0xFE00 y 0xFF01) en determinadas condiciones que mejor no me extiendo para no aburrir.... el AY pone "morralla" en el bus de datos y cuando el Z80 acepta la interrupcion en modo IM2, crea una dirección que no es 0xFEFF y, si la tabla IM2 tiene valores 0 pues la dirección de salto será 0x0000 (osea un reset en toda regla)... o si la tabla tiene otro valor pues saltará allá.
El fix en este caso es sencillo aunque requiere desoldar un pin de un chip smd (U4, 74HC138) y conectarlo al /M1 para que el AY no "devuelva" datos.
Video con el zx omni lanzando Gauntlet (que solo usa #FEFF ) y funcionando
Tuto, fix para el zx omni rev.2 problemas de reinicio por decodificacion del AY
Moderador: Fundadores
- mad3001
- Demonio segundo orden
- Mensajes: 1938
- Registrado: 25 Nov 2015, 00:15
- Ubicación: Mostoles(Madrid)
- Has thanked: 83 times
- Been thanked: 116 times
Tuto, fix para el zx omni rev.2 problemas de reinicio por decodificacion del AY
Volviendo a los origenes... programa en assembler
- dandare
- Hermano de Lucifer
- Mensajes: 3718
- Registrado: 09 Feb 2016, 15:09
- Ubicación: I Register
- Been thanked: 6 times
Re: Tuto, fix para el zx omni rev.2 problemas de reinicio por decodificacion del AY
Excelente investigación del problema y muy elegante la solución. Enhorabuena.
En resumen, el INTACK que ofrece el Z80 (IOREQ y M1 a 0, pero RD y WR a 1) se interpretaba por el AY del Omni como una lectura de entrada salida. En determinadas situaciones en las que el bus de direcciones llevaba los bits adecuados, el AY se activaba y devolvía datos al bus, precisamente porque no tenía en cuenta si RD estaba activado o no. Sólo se fijaba en WR.
Al limitar las respuestas del AY cuando M1 está a 1, se evita que responda en el INTACK del Z80, brillante.
En resumen, el INTACK que ofrece el Z80 (IOREQ y M1 a 0, pero RD y WR a 1) se interpretaba por el AY del Omni como una lectura de entrada salida. En determinadas situaciones en las que el bus de direcciones llevaba los bits adecuados, el AY se activaba y devolvía datos al bus, precisamente porque no tenía en cuenta si RD estaba activado o no. Sólo se fijaba en WR.
Al limitar las respuestas del AY cuando M1 está a 1, se evita que responda en el INTACK del Z80, brillante.