TEST 3 disponible
Publicado: 25 Ago 2017, 02:01
Pues después de trastear a base de bien, incluyendo hacer una plaquita para un Amstrad original con el diseño de gate array del core, ver que funciona idéntico al venerable 40010, y a su vez, probando un Z80 original en la placa del ZX-UNO, ha llegado el resultado. El TEST 3 del core de CPC 464 (sí, aún un 464 pero todo se andará)
Uno de los prototipos del módulo de reemplazo de gate array. Hice dos, con distintas tecnologías. Este de la foto aún no he podido echarlo a andar, pero el otro, afortunadamente, funciona como un reloj suizo
Módulo de reemplazo del gate array en un Amstrad CPC 6128, mientras se está ejecutando la demo Batman Forever. Se la tragó enterita
Abajo a la derecha, un ZX-UNO con un Z80 CMOS real pinchado como plaquita addon. El core de CPC está cargando el juego Blade Warrior.
Con esta versión deberían haberse corregido los errores de sonido en los juegos que usan WYZPlayer (los juegos de los Mojon Twins, los de CEZ y los de la CPCRetroDev). Todo viene de que hay muchos juegos (y entre ellos, la rutina de sonido de WYZPlayer) que asumen que la instrucción indocumentada OUT (C),0 funciona tal y como su nombre indica, pero si el Z80 es CMOS (o su implementación es como la del CMOS) entonces esa instrucción en realidad escribe $FF en lugar de 0. Una vez corregido esto, además de los juegos mencionados, hay demos técnicas que funcionan por fin pero aún con glitches, como la de Mario de Rhino (Batman Brothers).
Por otra parte, creo que ya sé por qué algunos juegos no parecía que funcionasen con el disparo: resulta que en el Amstrad, la nomenclatura de los dos pines de fuego en el joystick están intercambiados con respecto a la norma Atari, lo que significa que lo que yo llamo FIRE 1 en Atari/Spectrum, en el Amstrad es FIRE 2. Yo esto no lo sabía y cableé FIRE 1 y FIRE 2 en el joystick de acuerdo con la norma Atari. El resultado es que cuando en el jostick, desde BASIC, pulsaba el disparo, en lugar de salirme la X me salía la Z. En definitiva: que parece ser que en Amstrad, los juegos que tienen solo un disparo usan FIRE 2, así que intercambiando esos pines en el diseño se ha solucionado.
He aprovechado para implementar algunas... "exquisiteces", tales como una característica bastante oscura del Amstrad, y que permite forzar al gate array la generación de un VSYNC aunque el CRTC no lo haya mandado. Esto se puede hacer en algunos modelos de Amstrad porque la señal VSYNC del CRTC está conectada, además de al gate array, a un pin del 8255. Este pin del 8255 es, normalmente, de entrada y sirve para que el programador sepa cuándo hay en curso un retrazo vertical. Pero se puede hacer que el 8255 ponga ese pin como de escritura y enviar un valor ahí. Si el 8255 que se usa es más.... "fuerte" que el CRTC (traducido: si la etapa de salida del 8255 tiene menos impedancia que la del CRTC) entonces prevalece el 0 escrito por el 8255 y el gate array interpreta que ha llegado el momento de un intervalo de vblank.
Leyendo el datasheet del 8255 he podido ver que las etapas de entrada de los pines tienen "memoria", es decir, que si se envía un valor por un pin al ponerlo como salida, ese valor puede leerse como valor del pin de entrada, si no hay nada externo forzando un valor en dicho pin. Esto también se ha implementado.
Por favor, id repasando, de la lista que hay compartida en Google Docs (ver hilo del TEST 2), a ver qué juegos que antes no funcionaban ahora sí funcionan Estaré atento
En este mismo post teneis el core. Como siempre, cambiad la "n" por el número de slot donde vayais a poner el core y flashearlo en el mismo lugar donde tuviérais el TEST 2 (salvo que alguien quiera comparar ambos cores).
Saludos!
Uno de los prototipos del módulo de reemplazo de gate array. Hice dos, con distintas tecnologías. Este de la foto aún no he podido echarlo a andar, pero el otro, afortunadamente, funciona como un reloj suizo
Módulo de reemplazo del gate array en un Amstrad CPC 6128, mientras se está ejecutando la demo Batman Forever. Se la tragó enterita
Abajo a la derecha, un ZX-UNO con un Z80 CMOS real pinchado como plaquita addon. El core de CPC está cargando el juego Blade Warrior.
Con esta versión deberían haberse corregido los errores de sonido en los juegos que usan WYZPlayer (los juegos de los Mojon Twins, los de CEZ y los de la CPCRetroDev). Todo viene de que hay muchos juegos (y entre ellos, la rutina de sonido de WYZPlayer) que asumen que la instrucción indocumentada OUT (C),0 funciona tal y como su nombre indica, pero si el Z80 es CMOS (o su implementación es como la del CMOS) entonces esa instrucción en realidad escribe $FF en lugar de 0. Una vez corregido esto, además de los juegos mencionados, hay demos técnicas que funcionan por fin pero aún con glitches, como la de Mario de Rhino (Batman Brothers).
Por otra parte, creo que ya sé por qué algunos juegos no parecía que funcionasen con el disparo: resulta que en el Amstrad, la nomenclatura de los dos pines de fuego en el joystick están intercambiados con respecto a la norma Atari, lo que significa que lo que yo llamo FIRE 1 en Atari/Spectrum, en el Amstrad es FIRE 2. Yo esto no lo sabía y cableé FIRE 1 y FIRE 2 en el joystick de acuerdo con la norma Atari. El resultado es que cuando en el jostick, desde BASIC, pulsaba el disparo, en lugar de salirme la X me salía la Z. En definitiva: que parece ser que en Amstrad, los juegos que tienen solo un disparo usan FIRE 2, así que intercambiando esos pines en el diseño se ha solucionado.
He aprovechado para implementar algunas... "exquisiteces", tales como una característica bastante oscura del Amstrad, y que permite forzar al gate array la generación de un VSYNC aunque el CRTC no lo haya mandado. Esto se puede hacer en algunos modelos de Amstrad porque la señal VSYNC del CRTC está conectada, además de al gate array, a un pin del 8255. Este pin del 8255 es, normalmente, de entrada y sirve para que el programador sepa cuándo hay en curso un retrazo vertical. Pero se puede hacer que el 8255 ponga ese pin como de escritura y enviar un valor ahí. Si el 8255 que se usa es más.... "fuerte" que el CRTC (traducido: si la etapa de salida del 8255 tiene menos impedancia que la del CRTC) entonces prevalece el 0 escrito por el 8255 y el gate array interpreta que ha llegado el momento de un intervalo de vblank.
Leyendo el datasheet del 8255 he podido ver que las etapas de entrada de los pines tienen "memoria", es decir, que si se envía un valor por un pin al ponerlo como salida, ese valor puede leerse como valor del pin de entrada, si no hay nada externo forzando un valor en dicho pin. Esto también se ha implementado.
Por favor, id repasando, de la lista que hay compartida en Google Docs (ver hilo del TEST 2), a ver qué juegos que antes no funcionaban ahora sí funcionan Estaré atento
En este mismo post teneis el core. Como siempre, cambiad la "n" por el número de slot donde vayais a poner el core y flashearlo en el mismo lugar donde tuviérais el TEST 2 (salvo que alguien quiera comparar ambos cores).
Saludos!