Diseño retro para la primera consola portátil del lejano 1979



En 1974, Texas Instruments lanzó los primeros microcontroladores de 4 bits de la familia TMS1000, e Intel en 1976 comenzó la producción de microcontroladores de 8 bits de su famosa serie MCS-48. Y entonces comenzó.

Debido al bajo costo y la autosuficiencia de los microcontroladores (entonces se los llamó directamente, un microordenador de un solo chip), los dispositivos electrónicos de consumo fueron mucho más sabios, y su número creció más que nunca. Con el advenimiento de los microcontroladores, surgió una clase de dispositivos como los juegos electrónicos portátiles, la escala del "desastre" se puede estimar en este enlace . Entre toda esta variedad de juegos tempranos, uno que discutiré en esta publicación se destacó: este es Milton Bradley Microvision, el primer juego electrónico portátil con cartuchos reemplazables, que utilizó los dos microcontroladores anteriores. También intentaré detenerme en los detalles del desarrollo de esta consola.

Descripción general




Microvision fue lanzado en los Estados Unidos hace casi cuarenta años, en 1979. En total, se vendieron 12 cartuchos con juegos para ella, entre los que se encontraban - que se completaban con la consola Block Buster (análogo de Breakout ), deportes - Bowling and Baseball, una versión electrónica del famoso juego de mesa Connect Four , Pinball y otros. La mayoría de los juegos se pueden evaluar en el emulador MVEM , que se realizó sobre la base de una interesante serie de publicaciones , de las cuales también aprendí muchas cosas útiles. Aquí no me detendré en detalle en la descripción de los juegos originales de la consola, pero me referiré inmediatamente a su mundo interior.



Una característica importante de la consola es una pantalla LCD de 2 pulgadas con una resolución de 16x16 píxeles. Bastante primitivo para los estándares actuales, pero en comparación con los conjuntos de LED y los indicadores luminiscentes al vacío utilizados en los juegos portátiles, la pantalla LCD de matriz fue un paso bastante progresivo. Además de Microvision, en el mismo año, una serie de juegos electrónicos Mego Mini-Vid con una pantalla similar apareció a la venta, aunque 13x20. Aparentemente, en ese momento, estos eran los únicos dispositivos a la venta con LCD de matriz de tal resolución.



La pantalla está controlada por el chip Hughes SCUS0488; este es un controlador de matriz LCD. El controlador está alimentado por un estabilizador de voltaje negativo UA79MG con un par de condensadores y resistencias, que es la base de elementos más simple.


En la carcasa de la consola también se encuentran los controles: una matriz de botones de 4x3 y una resistencia variable de 10kΩ como una paleta. Para la reproducción de sonido hay una piezodinámica.

Lo más importante es por qué Microvision ha hecho historia, y todos se han olvidado del Mini-Vid mencionado anteriormente, usando cartuchos reemplazables.



Externamente, el cartucho era una parte superior desmontable de la carcasa. En el centro del cartucho había una ventana de plástico que cubría la pantalla, en la que se aplicaban elementos de color e inscripciones individuales para cada juego. Debajo estaban los agujeros para los botones cubiertos por una película delgada, sobre la cual se aplicaron las firmas, y para cada juego, se hicieron agujeros solo para los botones utilizados. Probablemente, esta disposición del cartucho, según los autores, hizo posible maximizar la adaptación de la consola a un juego específico.


Tablero de juego Block Buster, en el estuche y en la parte posterior

La parte electrónica del cartucho se construyó en uno de los dos microcontroladores: TMS1100 o Intel 8021 con el arnés necesario. Colocar el "cerebro" de una consola en un cartucho puede parecer una decisión bastante extraña, pero solo te permite sobrevivir con dos fichas por juego. Además, también agregó versatilidad. Al mismo tiempo, el precio del cartucho, aparentemente debido a la presencia del microcontrolador, no aumentó mucho (por ejemplo, el costo de 8021 en lotes grandes en 1976 fue de aproximadamente $ 3).

Todo esto alimentó una o dos coronas conectadas en paralelo (8021 era bastante voraz). Además, en versiones posteriores, se eliminaron los contactos para la segunda batería y se recomendó utilizar el espacio restante para una batería de repuesto. Aparentemente, esto se debió al hecho de que los usuarios a menudo confundían la polaridad, obteniendo un cortocircuito bastante peligroso.

Empate


Compré esta consola antigua para escribir algún tipo de juego y hacer un cartucho y, si es posible, copiar la base del elemento del original tanto como sea posible.
Pero hay un problema importante: que TMS1100, que Intel 8021 tenía una ROM enmascarada, es decir programado en la fábrica durante el proceso de fabricación. Hay una salida para el microcontrolador de Intel: 8021 es una versión reducida de 8048, que también tenía una ROM enmascarada, pero Intel produjo un análogo de 8048 con una ROM programable - 8748, tanto en el caso de borrado ultravioleta como más barato una vez programable.

Desafortunadamente, la situación es mucho peor para el TMS1100: había una versión de depuración del chip que funciona con una ROM externa: TMS1098, pero comprarlo ahora, si es posible, es muy difícil. Además, el chip se fabricó en el paquete DIP-64, es enorme en sí mismo y no cabe en la longitud del cartucho, pero también se necesita una ROM bastante grande.

En general, el 8748 borrable por UV es lo que necesita, y la versión final del cartucho se puede hacer en una versión indeleble.


Arriba hay un P8748H programable uno y debajo hay un D8748H borrable por UV

Intel 8021


A continuación se muestra una breve descripción de 8021, no 8748, porque Usaré solo funciones truncadas de 8021 para tener solo recursos originalmente establecidos por los desarrolladores de la consola.

El subsistema de memoria, como toda la familia MCS-48, se basa en una arquitectura Harvard modificada. La memoria del programa es una ROM interna de 1024 bytes, la memoria de datos es de 64 bytes de RAM dinámica.

La organización de la RAM se muestra en la siguiente figura:



Las celdas 0–7 ocupan registros de trabajo direccionados directamente R0 - R7, con R0 y R1 como punteros para el acceso indirecto a todas las celdas RAM. Las celdas 8-23 se usan para la pila de llamadas de 8 niveles, aunque también se pueden usar a través de R0-R1.

El microcontrolador tiene un generador de reloj incorporado, la frecuencia de referencia se establece mediante un cuarzo externo, cadena RC o cadena LC. Un ciclo de máquina dura 10 ciclos, y cada ciclo toma 3 períodos de la frecuencia de referencia. La frecuencia máxima es de 3.58 MHz, mientras que el ciclo de la máquina dura 8.38 μs. La frecuencia mínima está limitada por las especificaciones de DRAM y es de 600 kHz.

8021 contiene dos puertos de 8 bits y uno de 4 bits, que también se pueden usar para conectar un expansor de puertos de E / S, chip 8243. Todos los puertos son cuasi-bidireccionales.

Además, el microcontrolador tiene un temporizador / contador incorporado de ocho dígitos. En el modo de temporizador, el contador T se incrementa en 1 cada 32 ciclos de máquina. En el desbordamiento T, se establece el indicador TF. En modo contador, los pulsos se cuentan en la entrada de prueba T1.

El sistema de comando contiene 64 instrucciones, de las cuales 36 se ejecutan en un ciclo y 28 en dos. La mayoría de las instrucciones son de un solo byte.

Lista de instrucciones con breves descripciones.


Preparación


No hubo problemas con la compra de 8748, lo principal es prestar atención a que los chips se produjeron utilizando diferentes tecnologías. Los primeros NMOP requerían un voltaje de 25 V para el firmware, etiquetado D8748. A finales de los años 70, estos microcontroladores comenzaron a construirse utilizando la tecnología HMOP-E (una versión mejorada de NMOP de Intel), fueron etiquetados como D8748H y ya requerían 21V. El mismo voltaje fue requerido por un clon posterior de NEC (mPD8748H). La única versión programable fue etiquetada P8748H.

El borrador UV se compró el chino más simple y más barato con un temporizador mecánico, que, como la práctica ha demostrado, hace frente a su tarea perfectamente (aunque no hay precisión del temporizador a intervalos cortos). Borra de manera confiable la ROM de los chips en ~ 2.5 minutos. Más tarde, compré una goma de borrar ZAX Quick-EII por un precio simbólico de manos japonesas, ni siquiera sé en qué año es, por el aspecto de principios de los 90. Utiliza un flash de xenón y borra 8748 en 3 (!) Segundos, literalmente. Un video (no el mío) con una demostración de trabajo se puede ver aquí .

El principal problema fue el programador. El soporte para esta obsoleta familia Intel en programadores modernos está disponible solo a un costo de $ 300. Aunque, hay un Willem aficionado relativamente barato que puede trabajar con el MCS-48 a través de un adaptador, pero necesita LPT, lo que no me convenía en absoluto. Tuve que soldarme a mí mismo. Soy, digamos, un radioaficionado novato, así que pasé aproximadamente una semana con él, abandonando a uno de los dos 8748 que habían llegado para entonces (aunque me gusta pensar que originalmente era así). Tomé el circuito publicado aquí como base, solo lo adapté para Atmega y una alimentación de 24V más conveniente. Todo esto fue soldado en una placa de pruebas:



Resultó, por supuesto, bastante feo, y uno de los mosfets funciona hasta el límite (aunque sea un poco), pero, al final, el programador hizo frente a su tarea y me sirvió bien.

Entonces, todo está listo, el firmware de prueba parpadea felizmente con el LED, es hora de hacer un cartucho.

Cartucho


La mayor parte de los cartuchos funcionó en el TMS1100, porque Signetics, que lanzó la licencia Intel 8021 de Intel, no pudo proporcionar el suministro de chip MB requerido. Incluso algunos juegos que ya estaban escritos para 8021 tuvieron que ser portados al TMS1100. Esto, por cierto, nos permitió abandonar el paquete peligroso de dos baterías, porque el consumo del microcontrolador TI fue de solo 0.1W versus 1W para Intel. Solo tengo uno de los 6 cartuchos con 8021, este es el juego Connect Four, y fue tomado como base.

Traté de hacer que el tablero fuera lo más similar posible al original, pero, por supuesto, tuve que hacer cambios. En primer lugar, el tamaño del chip (DIP-40 versus DIP-28) y un pinout diferente. En segundo lugar, tuvimos que cambiar las denominaciones en el circuito oscilatorio que establece la frecuencia del reloj, porque el ciclo de la máquina para las versiones HMOS de microcircuitos es de 15 ciclos, y para las versiones MOS que se utilizaron en los cartuchos originales, 30 ciclos. Por lo tanto, para una autenticidad completa, mi cartucho funcionará a 1.25 MHz contra los 2.5 MHz originales, al tiempo que garantiza el mismo rendimiento.



En la foto de arriba, las placas de circuito impreso terminadas se ordenaron en China, y mientras estaban encendidas, dibujé y grabé la placa de circuito y ensamblé tal "complejo de depuración":


Finalmente, la parte del hardware está lista y puede comenzar a programar.

Display




En primer lugar, tuve que lidiar con la salida a la pantalla LCD. Como escribí anteriormente, fue controlado por el controlador Hughes 0488 mediante multiplexación (recientemente se publicó un artículo interesante sobre esta forma de control LCD en Habré). Es un controlador, no un controlador, por lo que no puede encender un píxel y ocuparse de su negocio, debe actualizar constantemente el contenido de la pantalla con una frecuencia de 30-50 Hz con comandos de bajo nivel.

El diagrama de conexión es el siguiente:



Pinout H0488:

Vdd - Potencia (3-8V)
R1-R16 - Salidas de control de cadena
C1-C16 - Salidas de control de columna
DATA0-DATA3 - Bus de datos
! Data Clk - Entrada de reloj de grabación de datos
Impulso de enganche: señal de estado de distribución R0-R15, C0-C15

El significado del chip es el siguiente:

A través de 4 líneas de información, el estado necesario de las 32 salidas del microcircuito se establece secuencialmente (16 por fila y columna). Es decir indicamos en porciones de 4 bits el estado de las salidas para las filas 1-4, luego 5-8, 9-12 y finalmente para 13-16, y también 4 veces en 4 bits indicamos el estado de las columnas. Cada nuevo dato se registra mediante un pulso a lo largo de la línea! DATA CLK. Después de que hayamos enviado los 8 datos, un pulso en la línea Latch Pulse establece el estado indicado de las salidas R1-R16, C1-C16 que se mantendrán hasta el siguiente pulso en esta línea.

Naturalmente, en uno de esos ciclos no podemos indicar el estado de cada píxel individual independientemente de los demás, solo podemos 16 (por el número de intersecciones de filas con columnas). Por lo tanto, para actualizar de forma independiente el estado de cada píxel, se requerirán 256/16 = 16 ciclos.

Además, tenemos la responsabilidad de cambiar la polaridad para eliminar el voltaje constante de los electrodos LCD, de lo contrario la pantalla se degradará rápidamente. El cambio de polaridad se produce en el borde posterior de la señal en el Latch Pulse en una entrada baja! Reloj de datos. Se recomienda cambiar la polaridad con la frecuencia de actualización de la pantalla.

Lo anterior se ilustra en el siguiente cuadro de tiempo de una hoja de datos:



Todo esto, implementado en el ensamblador 8021 (que, por cierto, se reduce significativamente en comparación con el ensamblador del resto de la familia, todo por la misma autenticidad que usé solo las instrucciones compatibles con 8021), podría verse así:

mov R0, #32 ;    . mov r1, #10000000b ;    r1-r2 mov r2, #00000000b ;  . mov r4, #00000010b ;    !DATA CLK. mov r3, #11110000b clr c loop: ;   r1-r16   . mov a, r1 ;   r1 loadNibble ;    R1-R4. mov a, r1 ;  4   r1 rrc a ;      , xch a, r1 ;    . swap a loadNibble ;    R5-R8. mov a, r2 ;   r2 loadNibble ;    R9-R12. mov a, r2 ;  4   r2 rrc a ;      ,  xch a, r2 ;  C,     . swap a loadNibble ;    R13-R16 ;   C1-C16     . mov a, @R0 ;       loadNibble ;       C1-C4. mov a, @R0 swap a ;   4 . loadNibble ;     C4-C8. inc R0 ;     mov a, @R0 ;     , loadNibble ;      4 . mov a, @R0 swap a ;   4 . loadNibble ;     C9-C12. inc R0 ;    inc a ;   R0-R15  C0-C15, outl p1, a ;  Latch Pulse  1. jnc loop ;      . clr a ; outl p1, a ; . inc a ; outl p1, a ; loadNibble macro anl a, r3 ;    . outl p1, a ;   . orl a, r4 outl p1, a ; !DATA CLK. endm 

Esta es mi versión más rápida de la subrutina que muestra la imagen almacenada en la RAM. Se realiza en 1152 ciclos de máquina (que en nuestro caso es ~ 12 μs).

La frecuencia de actualización máxima de la pantalla es de aproximadamente 70 fotogramas por segundo (si el microcontrolador no hace nada más), lo que en principio es redundante, por lo tanto, para guardar registros y ROM, en la práctica utilicé otras subrutinas, más lentas y más adecuadas para tareas específicas. Pero, a esta frecuencia, teniendo en cuenta la alta inercia de esta pantalla, es posible mostrar imágenes con 4 gradaciones de gris (como un niblonog en KPDV), cambiando rápidamente los cuadros. O incluso animaciones cortas de cuatro colores:


Como puede ver, el contraste deja mucho que desear, es especialmente sorprendente cuando todas las filas y columnas están involucradas, pero no hay nada que hacer: los costos del control multiplex.

Teclado




Aquí todo es mucho más simple. Los botones se agrupan en una matriz de 4 filas y 3 columnas. Las filas están conectadas a los pines P0.4-P0.7, las columnas están conectadas a P0.0-P0.2.



Como señalé anteriormente, los puertos de 8021 son casi bidireccionales, por lo tanto, para conocer el estado de las terminales, primero debe enviarles unidades. Es decir al ingresar datos, se produce una conjunción entre las señales de entrada y el contenido del búfer, que corresponde a los últimos datos que se muestran en el puerto. Una encuesta de teclado se ve así:

  mov a, #01111111b ; 0        1, outl p0, a ; ,      . in a, p0 ; , 0       ;      

Paleta




O, en ruso, la rueda del manipulador instalada en la parte inferior de la consola es una resistencia variable de 10kΩ con una manija decorativa, que se puede girar para controlar algo en el juego. Por supuesto, no había ADC ni en 8021 ni en el TMS1100. El ángulo de rotación fue determinado por la velocidad de carga del condensador, que fue soldado prudentemente a la placa de la consola.



Todo funciona de la siguiente manera: mientras los pines P2.2-P2.3 son altos, el condensador se descarga y la unidad lógica se encuentra en la entrada de prueba T1. Después de configurar P2.2 a P2.3 en un nivel bajo, el capacitor comenzará a cargarse y después de un tiempo, dependiendo exponencialmente de la resistencia de la resistencia variable, la caída de voltaje a través de él será tal que T1 se establece en 0. Solo queda detectar el tiempo hasta la aparición de cero en T1, que será proporcional al ángulo de rotación de la pala (se pueden encontrar más detalles y más interesantes sobre tales esquemas en DI HALT'a ). En código, esto podría verse así:

  clr a mov r1, a outl p2, a ; 0  P2.2-P2.3 loop: inc r1 ; r1 jt1 loop ;  T1  mov a, #00110000b ; 1  P2.2-P2.3 outl p2, a ;     



Sonido


Aquí es bastante simple, hay una piezodinámica conectada a las dos líneas de los puertos P2.0 y P2.1, todo lo que tenemos que hacer es sacudir las piernas alternativamente con la frecuencia correcta.

Que paso


Como resultado, escribí dos juegos: Tetris y una especie de Flappy Bird. Para la depuración, utilicé Intel D8748H y un clon de NEC D8749HD que difiere solo en tamaño de ROM. Utilicé el 8048 Integrated Development Environment como ensamblador y depurador. En el proceso obtuve una experiencia inolvidable: el flujo constante de microcontroladores desde la consola al borrador, del borrador al programador, y de allí a la consola, y todo esto va acompañado de un olor hospitalario de aire ultravioleta ionizado ...

Escribí los programas terminados en el alguna vez programable Intel P8748H que solde en las placas de circuito impreso que habían llegado para entonces.


Comparación con las placas originales, de izquierda a derecha: Block Buster, Mi opción, Connect Four

Tuve que usar el original como estuche; solo tenía uno de los dos cartuchos disponibles para el juego Block Buster que resultó inoperativo.



El casco no fue suficiente para el segundo juego:


Conclusión


Microvision MB se produjo antes de 1981, y aunque las ventas al principio fueron bastante exitosas, una pequeña cantidad de juegos (se lanzaron 13 cartuchos en total) y los problemas de calidad generalmente se llaman las razones de la disminución de las ventas. Agregaría a esto un tamaño excesivamente grande, especialmente en comparación con la serie Nintendo Game & Watch que apareció en ese momento y se convirtió en un éxito.

Códigos fuente y esquemas publicados en GitHub

Source: https://habr.com/ru/post/es416865/


All Articles