Proyecto ZX80 (¿Algún zx80 real?)

Tanto si estás empezando a programar para sistemas clásicos como si quieres compartir tus conocimientos, aquí encontrarás información al respecto.

Proyecto ZX80 (¿Algún zx80 real?)

Notapor wilco2009 » 06/06/2016 17:17

A raiz de leer el proyecto de Antoniovillena en la que basándose en un proyecto existente (ver aquí) intentaban reditar el zx-80, me ha picado el gusanillo de construir un ordenador completo.
Y qué puede haber más apropiado que un simple zx80 que está basado completamente en electrónica discreta.

En los ratos libres que tengo con el prototipo de la ampliación de Spectrum me he puesto manos a la obra y después de intentar entender la rutina de display de la ROM y el funcionamiento del hardware (menuda marcianada que se curró el diseñador :o ), he copiado el esquema y ya tengo enrutada la placa.

Me he tomado la libertad de sustituir los dos chips de 1K x 4bits de RAM por unos solo de 16K x 8bits, y la ROM de 8Kb por una EPROM de 32Kb que es mucho más barata y con alguna sencilla modificación podría convertir el ordenador en un "4 en uno", ZX80, ZX81, Jupiter Ace y "otro".

También he sustituido el teclado de membrana por pulsadores, pero he intentado mantener en lo posible el tamaño de la placa original, pero reenrutando todo para que el resultado sea una placa de sólo dos capas.

Sólo he querido adelantároslo a ver que os parece como posible próximo proyecto, ya que ahora mismo tengo que centrarme en el otro proyecto.

Quizás no sea un enfoque tan purista como el de Antonio, pero a mi me sirve como ejercicio práctico para continuar aprendiendo, e incluso con algunos ajustes hasta puede que seamos capaces de meterlo en una caja original. :D

Aquí os dejo el esquema y como quedaría la placa, a falta, por supuesto, de repasarla en detalle.

Imagen

Imagen

https://goo.gl/photos/HCjJ5Z9i7Pd1rETW8

Bueno, pues aquí tengo una nueva versión con algunos ajustes en la posición de los agujeros.

La placa funciona como un zx80, pero tiene un conector a la derecha (X6) para poder conectarle una placa auxiliar y convertirlo en un zx81. Para ello, además de conectarle la placa auxiliar habría que seleccionar la ROM del zx81con los microswitches que hay justo debajo (SW1).

Otra modificación que tiene es que genera el black porch para que no pase como en el original que no se ve con las teles modernas.

La parte del teclado permite dos opciones:
- Soldar microswitches
- Acoplar una membrana de zx80, gracias al entramado que he añadido en la parte interior de la huella de los microswitches.

A falta de confirmación los anclajes y agujeros encajan perfectamente con los de la caja del zx80 real, por lo que se podría poner dentro de una de estas cajas, aunque como estas son prácticamente imposibles de conseguir se podría mecanizar una caja en tres partes:
- Una plancha inferior para poder sujetar la placa sobre ella. Simplemente recortando a las medidas correctas y haciendo los agujeros en las posiciones adecuadas.
- Un marco para sujetar la membrana, que se podría hacer también recortando sobre una plancha de plástico.
- La carcasa que cubre la electrónica. Esta es la más complicada, aunque quizás se podría utilizar una impresora 3D, ya que estamos hablando de unos 135x156 aprox. No se hasta donde llegan las impresoras domésticas. Como alternativa hay un método (vacuformado) que parece prometedor y que ha propuesto groovydrifter : https://www.youtube.com/watch?v=fucs_brr5Yo

Y aquí una interpretación de como funciona el hardware.

La interpretación la he hecho basándome en el esquema publicado aquí y el listado en ensamblador de la ROM que se puede encontrar aquí.

La explicación viene dividida según las partes lógicas en las que podemos dividir el hardware.

Generador de NOPs

El circuito siguiente es el que se encarga de comprobar que estamos refrescando la pantalla.

La salida del circuito (patilla 6 de IC16) es igual a 0 cuando /HALT = 1, A15 = 1 y D6=0, osea siempre y cuando no estemos ejecutando un HALT (/HALT y D6=0) y estemos ejecutando algo en la segunda mitad de la memoria (A15=1), que como ya habíamos dicho solo ocurre cuando refrescamos la pantalla. Al comprobar que /HALT = 1 y D6 = 0 descartamos también el momento en el que ya hemos llegado a fin de línea.

Imagen

La salida de este circuito va a parar al pin 9 de IC 17 (ver abajo) lo que hace que sólo tengamos un 0 a la salida de este “OR” (patilla 8 de IC 17) en el caso de que el circuito anterior sea 0 y /M1=0, es decir estemos pintando la pantalla y estemos en el ciclo de fetch.

Imagen

Al tener un 0 en el pin 8 de IC 17 tendremos un 1 en el pin 2 de IC 15, lo que hará 0 todos los bits de datos (D0..D7) conectados al conjunto de NOPs de la figura de arriba.

Secuencia de visualización de video

IC5 es un circuito 74LS373 que consta de 8 latchs triestado. En este caso tenemos siempre a 0 la habilitación (patilla 1) por lo que los latch se utilizan como biestables.

Dicho circuito es el que se encarga de capturar cada código de carácter que es puesto es el bus de datos por la CPU cuando se está en la fase de refresco de pantalla. Estos datos acaban en el bus, ya que la CPU está ejecutando la zona correspondiente a DFile y por tanto poniendo el contenido de dicha memoria en el bus de datos, aunque como dijimos antes sólo se ejecutan NOPs ya que estos datos son sustituidos por ceros en la fase fetch.

En dicho circuito, capturamos únicamente los bits D0..D5 que son los 64 caracteres posibles y D7 que nos indica si hay que invertir el vídeo.

La patilla 11 (LE) que es activa en alta, es la que deja o no pasar los datos desde el bus de datos.

La patilla 11 se activa cuando alcanzamos la fase de RFSH, teniendo a uno la salida del circuito siguiente (patilla 4 de IC13):

Imagen

La salida de IC5 es redirigida a los tres chips multiplexores IC6, IC7 e IC8 que seleccionan entre un acceso a ROM estándar o un acceso a la ROM de caracteres cuando estamos en la fase de refresco. La señal de selección (S) de dichos chips está conectada directamente a /RFSH, por lo que cuando /RFSH = 0 se seleccionan las entradas que llegan desde IC5, interpretando el código presente en el bus de datos como una dirección que apunta a la tabla de caracteres en ROM.

La correspondencia es como sigue:
D0 -> A3, D1 –> A4, D2 –> A5, D3 –> A6, D4 –> A7, D5 –> A8.

Estos 6 bits nos direccionan el carácter dentro de la tabla de caracteres.

El scanline del carácter a representar viene determinado por los tres bits inferiores, por lo que las 3 líneas inferiores se alimentan de un contador de 3 bits que reside en IC21 y que va contando cíclicamente al compás del sincronismo horizontal los 8 scanlines de cada carácter, y es reseteado cuando se dispara el sincronismo vertical.

Con lo anterior tenemos la dirección correspondiente al desplazamiento dentro de la tabla de caracteres del scanline a representar, pero nos falta añadir la dirección de tabla dentro de la ROM.

Los bits A9, A10 y A11 que nos faltan vienen directamente del bus de direcciones debido que estamos en el ciclo de refresco y en el programa de la ROM (antes de activar las interrupciones) hemos cargado convenientemente el registro I para que apunte a la tabla de caracteres en ROM:

Código: Seleccionar todo
        LD      A,$0E           ; set the I register to $0E to tell
        LD      I,A             ; the video hardware where to find
                                ; the character set ($0E00).


Los datos de salida de la ROM, van a parar a la entrada de IC9 que se encarga de serializar los datos para enviarlos al display.

Por otro lado, el valor que entra de D7 en IC5, va a parar al circuito que controla la inversión del vídeo de los caracteres.

Imagen

Este dato entra por la patilla 5 de IC11 acabando en un OR exclusivo con el dato serializado que viene por la patilla 4 de IC20, por lo que si D7 está a 1 el dato que llega se invertirá.

serialización de los datos de video.

La serialización la realiza IC9.

Se utiliza un reloj de 6,5MHz que le llega directamente del cristal. Este reloj entra por el pin 2.

La salida es normalmente el pin 7 (/Q) produciendo un video de caracteres blancos sobre fondo negro, pero puede modificarse utilizando el pin 9 (Q).

El pin 1 (S/L) habilita la serialización, permitiendo que fluyan los datos sólo cuando el pin 9 de IC5, que es un flip-flop, es igual a cero. Esto ocurre cuando estamos en la fase de refresco de pantalla indicado por el circuito de la página anterior (patilla 6 de IC16)

Los datos vienen desde el circuito que multiplexa el acceso a la ROM entre la CPU o el sistema de visualización. Este circuito está formado por los chips IC6, IC7 e IC8.

La visualización vista desde el lado del Z80.


Lo primero que llama la atención en el esquema es que /INT está conectado directamente con A6, eso significa que la línea correspondiente a la activación de las interrupciones enmascarables se activa simplemente accediendo a cualquier dirección cuyo bit 6 sea 0.

Leyendo el listado de la ROM del Z80, cuando echas un vistazo a la rutina de servicio de interrupciones, lo que te encuentras es que se carga en HL la dirección de la zona de pantalla+32Kb, inmediatamente después se activan las interrupciones con la instrucción “EI” y después hace un salto incondicional a dicha dirección, como si de un trozo de programa se tratara.

El hardware monitoriza la señal A15, por lo que todo acceso a una posición de memoria superior a 32Kb el sistema lo interpreta como que se está refrescando la pantalla y en lugar de meter en el bus de datos el contenido de la memoria, durante la fase de fetch, mete en dicho bus un 0, que es el código de la instrucción NOP o “No Operation”.

El programa continúa ejecutando NOPs hasta que se encuentra con una instrucción HALT en la memoria (en los zx80 y 81 se utiliza un HALT o $76 como fin de línea), momento en el cual el hardware deja pasar dicha instrucción y deja al procesador parado hasta que se active /INT. (La comprobación de si es una instrucción HALT la hace el hardware comprobando si el bit 6 del bus de datos está a 1, ya que su código es $76)
/INT se activa una vez ejecutados los 32 NOPs correspondientes a una línea de pantalla. Esto es así porque el registro R se incrementa cada vez que se ejecuta una instrucción, y este se carga adecuadamente, antes de hacer el salto a la zona de pantalla, con un valor tal que, después incrementarse 33 veces su bit 6 se hace 0.

El contenido del registro R, que es el encargado de direccionar el refresco de la memoria, va a parar al bus de direcciones al final del ciclo “fetch” o de búsqueda de instrucciones, por lo que A6=0 y se activa /INT, interrumpiendo la pausa en la que se encontraba el procesador (con HALT) y continuando con la ejecución del programa.

Generador del sincronismo vertical/Decodificación de entrada/salida


En el ZX80, el sincronismo vertical se genera aprovechando la lectura del teclado. Es decir el programa de la ROM del ZX80 se las ingenia para hacer una lectura de teclado cada vez que toca generar un sincronismo vertical, por lo que el hardware aprovecha la misma lógica para dicha lectura y para la generación de VSYNC.
El siguiente circuito es el encargado de detectar una lectura de teclado.

Imagen

Cuando realizamos una lectura de teclado (puerto $FEFE) comprobamos únicamente que A0=0, lo que implica que interpretaremos como tal cualquier lectura de un puerto par.
Mediante las dos puertas OR de IC17 de la derecha del circuito comprobamos que /RD=0, /IORQ = 0 y A0=0 dando como resultado la señal /KBD.
Si tenemos una escritura de puerto la salida 8 de IC11 estará a 1 por loa que el clear del tercer biestable estará a 1, como el preset está a 1 el biestable dejará pasar el dato y como no es posible una lectura y una escritura de manera simultánea tendremos a 0 la salida 11 de IC11.
Por otro lado, si tenemos una lectura de puerto la salida 11 de IC11 sera 1 por lo que se reseteará el contador de scanlines. Adicionalmente la salida 8 de IC cambiará a 0 lo que hará un reset en el último flip-flop de la derecha generando el pulso de VSYNC.
En cualquier otro momento en el que no estemos realizando una lectura o una escritura se mantendrá el estado anterior.

La exactitud del momento en que salta este sincronismo depende exclusivamente de lanzar la lectura del teclado en el momento correcto, por lo que para ser capaz de ajustar el programa de la ROM debe perder algo de tiempo en el último momento.

Código: Seleccionar todo
;; KEYBOARD
L013F:  LD      B,$08           ; (7) set counter to 8

;; KB-1
L0141:  DJNZ    L0141           ; (13,8) and loop back 7 times. (7*13+8)

                                ;       "WASTE 99 T-STATES"

;; KB-2
L0143:  LD      HL,($401E)      ; (16) fetch two-byte FRAMES value.
        INC     HL              ; ( 6) increment
        LD      ($401E),HL      ; (16) and store in FRAMES again.

; now read the keyboard

        LD      HL,$FFFF        ; (10) prepare a buffer
        LD      B,$FE           ; ( 7) set B to $FE
        LD      C,B             ; ( 4) now BC is $FEFE - slightly slower than
                                ; the equally time-critical LD BC,$FEFE  (10) 
                                ; that is used in the ZX81 ROM.             
        IN      A,(C)           ; (12) now read port $FEFE the half-row with
                                ; the shift key.

                                ; "START FRAME SYNC"


Como el ZX80 sufre del mismo mal que las primeras versiones del ZX81, ya que la ULA presente en estos últimos es en gran medida un empaquetado del circuito original del zx80.

Es decir, no se genera la señal de blackporch, por lo que la imagen aparece completamente negra en las teles modernas.
He encontrado una solución alternativa a la típica con el LM, que consiste simplemente en añadir un 74ls74, de tal forma que generamos una señal de blackporch del mismo nivel que la señal de SYNC mezclando ambas en una única señal al final.

Imagen

Imagen

La página de donde viene esta idea es esta: http://www.fruitcake.plus.com/Sinclair/ ... ration.htm

Y las señales como quedan antes y después de la modificación...

ANTES:
Imagen

DESPUES:
Imagen
Última edición por wilco2009 el 19/06/2016 00:26, editado 5 veces en total
Los retrocacharros de Wilco
Djurkwhad: ¿Como te llamaba tu mamaita?
Roger: Un Error. Pero mis amigos me llaman Roger. Roger Wilco.
Avatar de Usuario
wilco2009
Veterano
Veterano
 
Mensajes: 591
Registrado: 07/01/2013 15:47

Re: Futuro proyecto ZX80

Notapor mambrino » 07/06/2016 09:41

Este voy a tratar de montarlo, al igual que tú, siempre he querido empezar desde 0 y así entender (aunque sea con una máquina sencilla como esta) cómo funciona en detalle un ordenador a nivel de hardware.

Gracias!
Avatar de Usuario
mambrino
Maestro
Maestro
 
Mensajes: 1696
Registrado: 20/10/2010 07:24

Re: Futuro proyecto ZX80

Notapor wilco2009 » 07/06/2016 10:17

mambrino escribió:Este voy a tratar de montarlo, al igual que tú, siempre he querido empezar desde 0 y así entender (aunque sea con una máquina sencilla como esta) cómo funciona en detalle un ordenador a nivel de hardware.

Gracias!


Cuidado que este no está llegado a probar, y tengo mis dudas de la parte que genera el video compuesto.

A ver si me desatasco de todas las cosas que tengo pendientes y puedo retormar este tema.
Los retrocacharros de Wilco
Djurkwhad: ¿Como te llamaba tu mamaita?
Roger: Un Error. Pero mis amigos me llaman Roger. Roger Wilco.
Avatar de Usuario
wilco2009
Veterano
Veterano
 
Mensajes: 591
Registrado: 07/01/2013 15:47

Re: Futuro proyecto ZX80

Notapor Pepillo » 07/06/2016 20:48

Puff, wilco impresionate

Y pensar que despues de tres años aun no he consegido resucitar mi zx81
Pepillo
Aprendiz
Aprendiz
 
Mensajes: 77
Registrado: 21/10/2010 08:42

Re: Futuro proyecto ZX80

Notapor flopping » 07/06/2016 22:32

wilco2009 escribió:
mambrino escribió:Este voy a tratar de montarlo, al igual que tú, siempre he querido empezar desde 0 y así entender (aunque sea con una máquina sencilla como esta) cómo funciona en detalle un ordenador a nivel de hardware.

Gracias!


Cuidado que este no está llegado a probar, y tengo mis dudas de la parte que genera el video compuesto.

A ver si me desatasco de todas las cosas que tengo pendientes y puedo retormar este tema.


¿Y por que no deberia de funcionar?, si es una copia del esquema original, deberia de funcionar como el original, ¿no?, por cierto, ya puestos, no costaria mucho meter la maxima ampliacion de ram posible, 64K, jejejeejeje....¿te lo habias planteado?.
No me hago responsable de mis post pues estan escritos bajo la influencia del alcohol y drogas psicotropicas, por la esquizofrenia paranoide que padezco.
(C) 1982-2014, 32años de ZX Spectrum.
un foro "diferente".
Avatar de Usuario
flopping
Promesa
Promesa
 
Mensajes: 334
Registrado: 10/04/2012 15:06
Ubicación: Valencia

Re: Futuro proyecto ZX80

Notapor javidoom » 08/06/2016 07:26

A mi el diseño del ZX80 me mola bastante, y si se decide a hacer algún tipo de clon estaría interesado...

A ese nivel de soldadura creo que llego. :) Y el tema del teclado sería ya verlo a ver... Pero si como dice Flopping debería de funcionar, masmola mucho el proyecto y yo me apuntaría! :)

Nos vemoss.
Avatar de Usuario
javidoom
Leyenda
Moderador | Leyenda
 
Mensajes: 2973
Registrado: 20/10/2010 22:51

Re: Futuro proyecto ZX80

Notapor wilco2009 » 08/06/2016 07:46

flopping escribió:
wilco2009 escribió:
mambrino escribió:Este voy a tratar de montarlo, al igual que tú, siempre he querido empezar desde 0 y así entender (aunque sea con una máquina sencilla como esta) cómo funciona en detalle un ordenador a nivel de hardware.

Gracias!


Cuidado que este no está llegado a probar, y tengo mis dudas de la parte que genera el video compuesto.

A ver si me desatasco de todas las cosas que tengo pendientes y puedo retormar este tema.


¿Y por que no deberia de funcionar?, si es una copia del esquema original, deberia de funcionar como el original, ¿no?, por cierto, ya puestos, no costaria mucho meter la maxima ampliacion de ram posible, 64K, jejejeejeje....¿te lo habias planteado?.


Debe de funcionar, pero ten en cuenta que el original no lleva video compuesto, sino RF, por lo que el cambio que he hecho para que saque vídeo compuesto puede fallar.

Habría que repasar esa parte, ya que, como supongo que el vídeo será idéntico al del zx81, se podría incluir el circuito que se hace para este con un LM para el caso de las primeras ULAs.

EDITO:
Después de repasarlo y buscar algo de info por internet, he podido comprobar que el zx80 tiene el mismo problema en el black porch que los primeros zx81, aunque también he encontrado una solución alternativa a la típica con el LM, que consiste simplemente en añadir un 74ls74, de tal forma que generamos una señal de blackporch del mismo nivel que la señal de SYNC, mezclando ambas en una única señal al final.

Imagen

Imagen

La página de donde viene esta idea es esta: http://www.fruitcake.plus.com/Sinclair/ ... ration.htm

Y las señales como quedan antes y después de la modificación...

ANTES:
Imagen

DESPUES:
Imagen
Los retrocacharros de Wilco
Djurkwhad: ¿Como te llamaba tu mamaita?
Roger: Un Error. Pero mis amigos me llaman Roger. Roger Wilco.
Avatar de Usuario
wilco2009
Veterano
Veterano
 
Mensajes: 591
Registrado: 07/01/2013 15:47

Re: Futuro proyecto ZX80

Notapor wilco2009 » 15/06/2016 23:45

¿Alguien tiene un zx80 real para comprobar si coinciden los tres taladros de mi diseño con los del auténtico?

Aquí está en formato imagen y más abajo el pdf para que lo podáis imprimir y comparar.

https://drive.google.com/file/d/0B69T2l ... sp=sharing

https://drive.google.com/file/d/0B69T2l ... sp=sharing

Muchas gracias.......
Los retrocacharros de Wilco
Djurkwhad: ¿Como te llamaba tu mamaita?
Roger: Un Error. Pero mis amigos me llaman Roger. Roger Wilco.
Avatar de Usuario
wilco2009
Veterano
Veterano
 
Mensajes: 591
Registrado: 07/01/2013 15:47

Re: Futuro proyecto ZX80

Notapor javidoom » 16/06/2016 09:31

wilco2009 escribió:¿Alguien tiene un zx80 real para comprobar si coinciden los tres taladros de mi diseño con los del auténtico?

Aquí está en formato imagen y más abajo el pdf para que lo podáis imprimir y comparar.

https://drive.google.com/file/d/0B69T2l ... sp=sharing

https://drive.google.com/file/d/0B69T2l ... sp=sharing

Muchas gracias.......



Cuadran perfectamente, te paso fotos con el pdf impreso debajo de la placa.

Imagen
Imagen
Imagen
Imagen
Imagen
Avatar de Usuario
javidoom
Leyenda
Moderador | Leyenda
 
Mensajes: 2973
Registrado: 20/10/2010 22:51

Re: Proyecto ZX80 (¿Algún zx80 real?)

Notapor wilco2009 » 16/06/2016 11:04

Muchisimas gracias javi.

Qué calladito te lo tenías, un zx80 auténtico en tu poder. :o

Si quieres te quito ese cacharro de enmedio y no te cobro ni nada. :roll:
Los retrocacharros de Wilco
Djurkwhad: ¿Como te llamaba tu mamaita?
Roger: Un Error. Pero mis amigos me llaman Roger. Roger Wilco.
Avatar de Usuario
wilco2009
Veterano
Veterano
 
Mensajes: 591
Registrado: 07/01/2013 15:47

Siguiente

Volver a Desarrollo y programación

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado