REHome escribió:Usar un FPGA me parece mucho para un Spectrum, ejjejejej. Eso si, es muy curioso, sobre todo saber manejarlo bien que es otro reto.
No creas que no barajé otras opciones, pero para implementar la ULAplus, era (es) lo más barato. Tanto en el coste del chip en sí mismo, como en el ahorro de espacio en la plaquita (al no necesitar la RAM extra para implementar la paleta)
REHome escribió:¿Saben donde hay un buen esquema eléctrico del ZX Spectrum +2A?
En el repositorio de archivos de WOS (World Of Spectrum). Ahí tienes todos los esquemáticos habidos y por haber.
REHome escribió:Sólo da un 0 en todo el proceso, aún así con un mini PIC furula, jajajajja. Si insisten en las retro de la época, pues.........
Repito que usar un PIC para hacer esa decodificación es matar moscas a cañonazos, sobre todo cuando la solución con un chip 74HC ocupa lo mismo que el PIC, no necesita reloj, y... ¡es mucho más rápida! ¿Cuánto tarda tu PIC en calcular la nueva salida cuando cambie alguna de las entradas? Que yo sepa, el PIC no tiene instrucciones de carga con índice, así que no puedes usar 8 posiciones de memoria para almacenar la tabla de verdad del circuito, sino que tienes que calcularla en cada vuelta de bucle (porque tendrás que hacer polling en las entradas). Nunca he usado el ensamblador del PIC, pero así a ojo, mirando una tabla de opcodes de PIC de una página web se me ocurre el siguiente código:
Asumo que hay un puerto al que llamo PORTA al que puedo programar para que sus bits 0,1 y 2 sean de entrada, y el 3 de salida.
Código: Seleccionar todo
principio:
BTFSC PORTA,0 ;salta una instrucción si IORQ es 0
GOTO pon1 ;ve a poner la salida a 1
BTFSC PORTA,1 ;salta una instrucción si A4 es 0
GOTO pon1 ;ve a poner la salida a 1
BTSS PORTA,2; salta una instrucción si M1 es 1
GOTO pon1 ;ve a poner la salida a 1
BCF PORTA,3; SALIDA ;aquí llegamos sólo si IORQ es 0, A4 es 0, y M1 es 1. Ponemos SALIDA=0
GOTO principio
pon1:
BSF PORTA,3; SALIDA ;Aquí ponemos SALIDA=1
GOTO principio
Si no me he equivocado y este código funciona, en el caso peor (cuando las tres condiciones se cumplen y hay que poner SALIDA=0), una vuelta de bucle completa necesita 4 instrucciones para ejecutarse (las tres comprobaciones, el clear del bit, y el GOTO al principio). Es decir, 4 instrucciones de salto y 1 de set bit. Las 4 de salto, como el salto se cumple, duran 8 ciclos de reloj de PIC. La de set bit dura 4. En total son 36 ciclos de reloj de PIC.
El tiempo en que IORQ está a nivel bajo indicando un ciclo de E/S en el Z80 es de 2.5 ciclos de reloj del Z80. Esto es, 714.28ns. En menos de ese tiempo, la CF tiene que haber sido seleccionada y hay que darle tiempo a que reaccione enviando el valor (si es un ciclo de lectura). Pongamos que la CF necesita 20ns para responder (una CF realmente rápida). Eso significa que la decodificación debe haberse producido antes de 690ns aproximadamente.
Para que al PIC le dé tiempo, 36 ciclos de reloj de PIC deben durar 690ns o menos. Eso significa que la frecuencia de reloj que necesita el PIC debe ser como mínimo, 52MHz.
Ahora, veamos un humilde 74HC10 (tres puertas NAND de 3 entradas), que es el circuito original. Es un chip de 14 pines. Cada puerta tiene un retraso de 11ns (según datasheet). Las puertas están conectadas en cascada en el circuito, así que la propagación de las entradas a la salida es de como máximo, 33ns.
¿Puede un PIC real mejorar estas cifras? ¿Cómo sería el programa y cuánto tardaría en propagar el nuevo valor de las entradas a la salida? ¿Cuánto costaría? ¿Cuánto ocuparía en placa? (incluyendo el cuarzo de 1GHz

)
REHome escribió:No solo hay que tener conocimiento, sino €€€€€€€€€€, tiempo y dedicación hasta para comprar un Willem para leer y grabr EEPROM de todo tipo.
Hombre... un programador Willem, creo que es de lo más barato que hay por ahí... Si ya incluso los programadores universales estos que hay por USB empiezan a estar baratitos

Y ahora, vamos de vuelta al tema de este hilo:
-----------------------------------------------------------------------------------------
Tengo ya incluido el procesador, ROM y los 128K de RAM en la simulación en Verilog. Como ROM he puesto el test de memoria 128K de Paul Farrow. Si no lo habeis probado con el clon real, os lo recomiendo, porque no sólamente testea el correcto funcionamiento de la RAM, sino también la lógica de paginación.
http://www.fruitcake.plus.com/Sinclair/ ... Tester.htmSimular 20ms (un frame) de ejecución del clon completo le lleva a mi PC del orden de 1.5 segundos, así que para simular estos 163 frames (unos 3 segundos de animación) se ha llevado su tiempo. Después de recoger los datos RGB en cada ciclo de reloj de pixel y traducirlo a imágenes, esto es lo que sale (la animación está en bucle):

Destaco el hecho de que no he visto ningún fallo de escritura o lectura en VRAM como visteis vosotros. Eso significa que lo que es la lógica "sobre el papel" funciona, y que lo que ha pasado ha sido tema de retrasos, como de hecho ya comprobasteis. Cuando monte "de verdad" el clon, lo que haré será ver si sustituyendo el HC4040 por algo que sea equivalente a él, pero en síncrono, se resuelven los fallos.
Con todo, hay algo que creo que hay que comprobar, incluso con los cambios que habeis hecho: resulta que los mencionados glitches del 4040 afectan a otras partes del circuito, como por ejemplo, la generación del reloj de la CPU. Así, hay veces en que el periodo de ese reloj es más largo de lo que debería ser, como aquí (el periodo alargado está entre los dos cursores amarillos. No hay contención):

Además los glitches del HC4040 afectan, como ya habeis averiguado, a la generación de AL y /AL . Vosotros habeis solucionado el tema de la generación de esas dos señales, pero no habeis solucionado el problema subyacente, y es que esas dos señales se generan mal porque AL1 y AL2 tienen a su vez glitches. Esto hace que en ocasiones, alguna de ellas se activa cuando no debe durante un momentito, haciendo que AL y /AL cambien a su vez también brevemente. Brevemente, pero lo suficiente para confundir al circuito de contienda, que cree que está ante un nuevo ciclo de generación de píxeles, y frena a la CPU cuando no debe hacerlo. Es lo que pasa por ejemplo, aquí:

Lo que está enmarcado entre el cursor amarillo punteado y el cursor amarillo sólido es un ciclo de escritura (3 ciclos de reloj de la CPU). La escritura es a la dirección 4000h y el valor es 01h. El momento exacto en el que se produce la escritura es en el flanco alto de wr_n, que está marcado por un cursor blanco. Ahí se puede ver la dirección a la que se quiere escribir (4000h) y el dato (01h). Esta escritura es a una dirección de VRAM, y por tanto sujeta a contienda. De hecho, así ocurre porque el comienzo de este ciclo de bus coincide con el tramo de tiempo en que la ULA requiere a la VRAM para leerla. Hay contienda del primer ciclo (T1), que se alaaaaaaarga hasta que la señal AL deja de valer 0. El tiempo en que AL vale 1 es el tiempo en que la VRAM no está siendo usada por la ULA.
En condiciones normales, los dos restantes ciclos (T2 y T3) se suceden sin problemas, ya que el tiempo que AL está a 1 es suficientemente largo como para permitir que el ciclo de escritura termine sin más contención.
Peeeeeeeero ¡
el glitch! Cuando el contador horizontal (HC, nuestro HC4040) pasa de 159 a 160, podeis ver que ese paso no es nada limpio. De hecho, en binario esto es pasar de 10011111 a 10100000, y eso implica que cambien de estado 6 bits. Siendo el HC4040 un contador ripple, el resultado es similar al que os conté hace ya unas cuantas páginas. El resultado es que uno de los valores basura de HC hace que AL2 vuelva a valer 0, así que AL vuelve a valer 0. Esto sucede durante unos cuantos nanosegndos, pero los suficientes para que la lógica de contención se crea que esto es un nuevo ciclo, y en la siguiente subida del reloj de la CPU, lo vuelva a frenar, alargando T3 mucho más de lo debido. Esta es una ampliación del glitch y el pulso erróneo de AL2:

Tengo que buscar alguna rutina o programilla que sea muy sensible a las temporizaciones (quizás la segunda parte de la Shock Megademo...) y ponerla aquí, a ver qué pasa...