Design rétro pour la première console portable de la lointaine 1979



En 1974, Texas Instruments a lancé les premiers microcontrôleurs 4 bits de la famille TMS1000 et Intel a commencé en 1976 la production des microcontrôleurs 8 bits de sa célèbre série MCS-48. Et puis ça a commencé.

En raison du bon marché et de l'autosuffisance des microcontrôleurs (alors ils étaient appelés directement - un micro-ordinateur monopuce), les appareils électroniques grand public étaient beaucoup plus sages et leur nombre a augmenté plus que jamais. Avec l'avènement des microcontrôleurs, une classe d'appareils comme les jeux électroniques portables est apparue, l'ampleur de la "catastrophe" peut être estimée à ce lien . Parmi toute cette variété de premiers jeux, un dont je parlerai dans cet article s'est démarqué - il s'agit de Milton Bradley Microvision, le premier jeu électronique portable avec des cartouches remplaçables, qui utilisait les deux microcontrôleurs ci-dessus. J'essaierai également de m'attarder sur les spécificités du développement de cette console.

Description générale




Microvision est sorti aux États-Unis il y a près de quarante ans, en 1979. Au total, 12 cartouches avec des jeux lui ont été vendues, parmi lesquelles - livrées avec la console Block Buster (analogique de Breakout ), des sports - Bowling et Baseball, une version électronique du célèbre jeu de plateau Connect Four , Pinball et autres. La plupart des jeux peuvent être évalués sur l'émulateur MVEM , qui a été réalisé sur la base d'une série intéressante de publications , à partir desquelles j'ai également appris beaucoup de choses utiles. Ici, je ne m'attarderai pas en détail sur la description des jeux originaux de la console, mais je me tournerai immédiatement vers son monde intérieur.



Une caractéristique importante de la console est un écran LCD de 2 pouces avec une résolution de 16x16 pixels. Assez primitif par rapport aux normes d'aujourd'hui, mais par rapport aux assemblages LED et aux indicateurs luminescents sous vide utilisés dans les jeux portables à l'époque, l'écran LCD à matrice était une étape plutôt progressive. En plus de Microvision, la même année, une série de jeux électroniques Mego Mini-Vid avec un écran similaire est apparue en vente, bien que 13x20. Apparemment, à cette époque, il s'agissait des seuls appareils en vente avec des écrans LCD matriciels d'une telle résolution.



L'affichage est contrôlé par la puce Hughes SCUS0488 - il s'agit d'un pilote LCD matriciel. Le pilote est alimenté par un stabilisateur de tension négative UA79MG avec une paire de condensateurs et de résistances, qui est la base de l'élément la plus simple.


Dans le boîtier de la console se trouvent également les commandes - une matrice de boutons 4x3 et une résistance variable de 10kΩ comme une palette. Pour la reproduction sonore il y a une piézodynamique.

La chose la plus importante est la raison pour laquelle Microvision a marqué l'histoire, et tout le monde a oublié le Mini-Vid mentionné ci-dessus, en utilisant des cartouches remplaçables.



À l'extérieur, la cartouche était une partie supérieure détachable du boîtier. Au centre de la cartouche, il y avait une fenêtre en plastique recouvrant l'écran, sur laquelle des éléments de jeu en couleur et des inscriptions individuelles étaient appliqués pour chaque jeu. Ci-dessous se trouvaient les trous pour les boutons recouverts derrière par un film mince, sur lequel les signatures étaient appliquées, et pour chaque jeu, des trous étaient faits uniquement pour les boutons utilisés. Probablement, cette disposition de la cartouche, selon les auteurs, a permis de maximiser l'adaptation de la console à un jeu spécifique.


Plateau de jeu Block Buster, dans le boîtier et au dos

La partie électronique de la cartouche a été construite sur l'un des deux microcontrôleurs - TMS1100 ou Intel 8021 avec le faisceau nécessaire. Placer le «cerveau» d'une console dans une cartouche peut sembler une décision plutôt étrange, mais cela ne vous a permis de vous en sortir qu'avec deux jetons par partie. En outre, il a également ajouté de la polyvalence. Dans le même temps, le prix de la cartouche, apparemment dû à la présence du microcontrôleur, n'a pas beaucoup augmenté (par exemple, le coût de 8021 en grands lots en 1976 était d'environ 3 $).

Tout cela alimentait une ou deux couronnes connectées en parallèle (8021 était assez vorace). De plus, dans les versions ultérieures, les contacts de la deuxième batterie ont été supprimés et il a été recommandé d'utiliser l'espace restant pour une batterie de rechange. Apparemment, cela était dû au fait que les utilisateurs confondaient souvent la polarité, obtenant un court-circuit assez dangereux.

Cravate


J'ai acheté cette ancienne console afin d'écrire une sorte de jeu et de faire une cartouche, et si possible, de copier autant que possible la base de l'élément de l'original.
Mais il y a un problème important - que le TMS1100, qu'Intel 8021 avait une ROM masquée, c'est-à-dire programmé en usine pendant le processus de fabrication. Il existe un moyen de sortir pour le microcontrôleur d'Intel: 8021 est une version allégée de 8048, qui avait également une ROM masquée, mais Intel a produit un analogue de 8048 avec une ROM programmable - 8748, à la fois dans le cas de l'effacement ultraviolet et moins cher une fois programmable.

Malheureusement, la situation est bien pire pour le TMS1100 - il y avait une version de débogage de la puce qui fonctionne avec une ROM externe - TMS1098, mais l'acheter maintenant, si possible, est très difficile. De plus, la puce a été fabriquée dans le boîtier DIP-64, elle est énorme en soi et ne rentrera pas dans la cartouche en longueur, mais une ROM assez grande est également nécessaire.

En général, le 8748 effaçable aux UV est ce dont vous avez besoin, et la version finale de la cartouche peut être réalisée sur une version indélébile.


Au-dessus se trouve un P8748H programmable et en dessous un D8748H effaçable aux UV

Intel 8021


Voici une brève description de 8021, pas 8748, car Je n'utiliserai que des fonctionnalités tronquées du 8021 afin de n'avoir que les ressources initialement prévues par les développeurs de la console.

Le sous-système de mémoire, comme toute la famille MCS-48, est basé sur une architecture Harvard modifiée. La mémoire du programme est une ROM interne de 1024 octets, la mémoire de données est de 64 octets de RAM dynamique.

L'organisation de la RAM est illustrée dans la figure suivante:



Les cellules 0 à 7 occupent les registres de travail adressés directement R0 à R7, R0 et R1 étant utilisés comme pointeurs pour un accès indirect à toutes les cellules RAM. Les cellules 8-23 sont utilisées pour la pile d'appels à 8 niveaux, bien qu'elles puissent également être utilisées via R0-R1.

Le microcontrôleur a un générateur d'horloge intégré, la fréquence de référence est réglée par une chaîne à quartz externe, une chaîne RC ou une chaîne LC. Un cycle machine dure 10 cycles et chaque cycle prend 3 périodes de la fréquence de référence. La fréquence maximale est de 3,58 MHz, tandis que le cycle machine dure 8,38 μs. La fréquence minimale est limitée par les spécificités de la DRAM et est de 600 kHz.

8021 contient deux ports 8 bits et un 4 bits, qui peuvent également être utilisés pour connecter un module d'extension de port d'E / S, la puce 8243. Tous les ports sont quasi bidirectionnels.

De plus, le microcontrôleur a un temporisateur / compteur à huit chiffres intégré. En mode minuterie, le compteur T est incrémenté de 1 tous les 32 cycles machine. Au débordement T, le drapeau TF est activé. En mode compteur, les impulsions sont comptées sur l'entrée de test T1.

Le système de commande contient 64 instructions, dont 36 sont exécutées en un cycle et 28 en deux. La plupart des instructions sont à un octet.

Liste d'instructions avec de brèves descriptions


La préparation


Il n'y a eu aucun problème avec l'achat de 8748, l'essentiel est de faire attention au fait que les puces ont été produites en utilisant différentes technologies. Les premiers NMOP nécessitaient une tension de 25 V pour le micrologiciel, étiqueté D8748. À la fin des années 70, ces microcontrôleurs ont commencé à être construits en utilisant la technologie HMOP-E (une version améliorée du NMOP d'Intel), étaient étiquetés D8748H et nécessitaient déjà 21V. La même tension a été requise par un clone ultérieur de NEC (mPD8748H). La version programmable unique était étiquetée P8748H.

L'effaceur UV a été acheté au chinois le plus simple et le moins cher avec une minuterie mécanique qui, comme la pratique l'a montré, remplit parfaitement sa tâche (bien qu'il n'y ait pas de précision de minuterie à de courts intervalles). Il efface de manière fiable la ROM des puces en ~ 2,5 minutes. Plus tard, j’ai acheté une gomme ZAX Quick-EII à un prix symbolique auprès de mains japonaises, je ne sais même pas de quelle année il s'agit, au regard du début des années 90. Il utilise un flash au xénon et efface littéralement 8748 en 3 (!) Secondes. Une vidéo (pas la mienne) avec une démonstration du travail peut être vue ici .

Le principal problème était le programmeur. La prise en charge de cette famille Intel obsolète dans les programmeurs modernes n'est disponible qu'au coût de 300 $. Bien qu'il y ait un Willem amateur relativement bon marché qui peut travailler avec le MCS-48 via un adaptateur, mais il a besoin de LPT, ce qui ne me convenait pas du tout. J'ai dû me souder. Je suis, disons, un radio-amateur novice, donc j'ai passé environ une semaine avec lui, abandonnant l'un des deux 8748 arrivés à ce moment-là (bien que j'aime l'idée qu'elle était à l'origine comme ça). J'ai pris le circuit publié ici comme base, je ne l' ai adapté qu'à Atmega et à une alimentation 24V plus pratique. Tout cela a été soudé sur une planche à pain:



Cela s'est avéré, bien sûr, assez moche, et l'un des mosfets fonctionne à la limite (même un peu pour), mais, finalement, le programmeur a fait face à sa tâche et m'a bien servi.

Donc, tout est prêt, le firmware du test clignote joyeusement avec la LED, il est temps de faire une cartouche.

Cartouche


La majeure partie des cartouches fonctionnait sur le TMS1100, car Signetics, qui a publié la licence Intel 8021 d'Intel, n'a pas pu fournir les puces MB requises. Même certains jeux déjà écrits pour 8021 ont dû être portés sur le TMS1100. Incidemment, cela nous a permis d'abandonner le dangereux faisceau de deux batteries, car la consommation du microcontrôleur TI n'était que de 0,1 W contre 1 W pour Intel. Je n'ai qu'une des 6 cartouches avec 8021, c'est le jeu Connect Four, et il a été pris comme base.

J'ai essayé de rendre la planche aussi similaire à l'original que possible, mais, bien sûr, j'ai dû apporter des modifications. Tout d'abord, la taille de la puce (DIP-40 contre DIP-28) et un brochage différent. Deuxièmement, nous avons dû changer les dénominations dans le circuit oscillatoire qui règle la fréquence d'horloge, car le cycle machine pour les versions HMOS des microcircuits est de 15 cycles et pour les versions MOS utilisées dans les cartouches d'origine, 30 cycles. Par conséquent, pour une authenticité complète, ma cartouche fonctionnera à 1,25 MHz contre 2,5 MHz d'origine, tout en assurant les mêmes performances.



Sur la photo ci-dessus, les circuits imprimés finis commandés en Chine, et pendant qu'ils étaient allumés, j'ai dessiné et gravé le circuit imprimé et assemblé un tel "complexe de débogage":


Enfin, la partie matérielle est prête et vous pouvez commencer la programmation.

Affichage




Tout d'abord, j'ai dû gérer la sortie vers l'écran LCD. Comme je l'ai écrit ci-dessus, il était contrôlé par le pilote Hughes 0488 en utilisant le multiplexage (récemment un article intéressant sur ce mode de contrôle LCD a été publié sur Habré). C'est un pilote, pas un contrôleur, vous ne pouvez donc pas simplement allumer un pixel et vous déplacer, vous devez constamment mettre à jour le contenu de l'écran à une fréquence de 30 à 50 Hz avec des commandes de bas niveau.

Le schéma de connexion est le suivant:



Brochage H0488:

Vdd - Puissance (3-8V)
R1-R16 - Sorties de contrôle de chaîne
C1-C16 - Sorties de contrôle de colonne
DATA0-DATA3 - Bus de données
! Data Clk - Entrée d'horloge d'enregistrement de données
Impulsion de verrouillage - Signal d'état de brochage R0-R15, C0-C15

La signification de la puce est la suivante:

Grâce à 4 lignes d'information, l'état nécessaire des 32 sorties du microcircuit est défini séquentiellement (16 par ligne et colonne). C'est-à-dire nous indiquons en portions de 4 bits l'état des sorties pour les lignes 1-4, puis 5-8, 9-12 et enfin pour 13-16, et aussi 4 fois en 4 bits nous indiquons l'état des colonnes. Chaque nouvelle donnée est cadencée par une impulsion le long de la ligne! DATA CLK. Après avoir envoyé les 8 données, une impulsion sur la ligne Latch Pulse définit l'état indiqué des sorties R1-R16, C1-C16 qui seront maintenues jusqu'à l'impulsion suivante sur cette ligne.

Naturellement, dans un tel cycle, nous ne pouvons pas indiquer l'état de chaque pixel individuel indépendamment des autres, nous ne pouvons que 16 (par le nombre d'intersections de lignes avec des colonnes). Par conséquent, pour mettre à jour indépendamment l'état de chaque pixel, 256/16 = 16 cycles seront nécessaires.

De plus, nous avons la responsabilité de changer la polarité pour éliminer la tension constante des électrodes LCD, sinon l'affichage se dégradera rapidement. La commutation de polarité se produit sur le front arrière du signal sur l'impulsion de verrouillage à une entrée basse! Horloge de données. Il est recommandé de changer la polarité avec le taux de rafraîchissement de l'écran.

Ce qui précède est illustré par le chronogramme suivant à partir d'une fiche technique:



Tout cela, implémenté dans l'assembleur 8021 (qui, soit dit en passant, est considérablement réduit par rapport à l'assembleur du reste de la famille, le tout pour la même authenticité que j'ai utilisé uniquement des instructions prises en charge par 8021), cela pourrait ressembler à ceci:

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 

Ceci est ma version la plus rapide du sous-programme affichant l'image stockée dans la RAM. Elle est réalisée en 1152 cycles machine (ce qui dans notre cas est ~ 12 μs).

Le taux de rafraîchissement maximum de l'écran est d'environ 70 images par seconde (si le microcontrôleur ne fait rien d'autre), ce qui est fondamentalement redondant, donc, pour enregistrer les registres et les ROM, j'ai utilisé d'autres routines dans la pratique - plus lentes et plus adaptées à des tâches spécifiques. Mais, à cette fréquence, compte tenu de la grande inertie de cet affichage, il est possible d'afficher des images avec 4 dégradés de gris (comme un niblonog sur KPDV), changeant rapidement de trame. Ou même de courtes animations en quadrichromie:


Comme vous pouvez le voir, le contraste laisse beaucoup à désirer, il est particulièrement frappant lorsque toutes les lignes et colonnes sont impliquées, mais il n'y a rien à faire - les coûts de contrôle multiplex.

Clavier




Ici, tout est beaucoup plus simple. Les boutons sont regroupés dans une matrice de 4 lignes et 3 colonnes. Les lignes sont connectées aux broches P0.4-P0.7, les colonnes sont connectées à P0.0-P0.2.



Comme je l'ai noté ci-dessus, les ports du 8021 sont quasi-bidirectionnels, donc, pour connaître l'état des terminaux, vous devez d'abord leur envoyer des unités. C'est-à-dire lors de la saisie des données, une conjonction se produit entre les signaux d'entrée et le contenu du tampon, ce qui correspond aux dernières données affichées sur le port. Un sondage au clavier ressemble à ceci:

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

Paddle




Ou, en russe, la molette de manipulation installée dans la partie inférieure de la console est une résistance variable de 10 kΩ avec une poignée décorative, qui peut être tournée pour contrôler quelque chose dans le jeu. Bien sûr, il n'y avait aucun ADC dans le 8021 ou le TMS1100. L'angle de rotation a été déterminé par la vitesse de charge du condensateur, qui a été soigneusement soudé à la carte console.



Tout fonctionne comme suit: alors que les broches P2.2-P2.3 sont hautes, le condensateur est déchargé et l'unité logique est à l'entrée de test T1. Après avoir réglé les broches P2.2-P2.3 à un niveau bas, le condensateur commencera à se charger et après un certain temps, dépendant exponentiellement de la résistance de la résistance variable, la chute de tension à travers elle deviendra telle que T1 est réglé sur 0. Il ne reste plus qu'à détecter l'heure jusqu'à l'apparition de zéro sur T1, qui sera proportionnel à l'angle de rotation de la palette (Plus de détails et plus intéressants sur de tels schémas peuvent être trouvés dans DI HALT'a ). Dans le code, cela pourrait ressembler à ceci:

  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 ;     



Son


Ici, c'est assez simple, une piézodynamique est connectée aux deux lignes du port P2.0 et P2.1, tout ce que nous avons à faire est alternativement de branler les jambes avec la bonne fréquence.

Qu'est-il arrivé?


En conséquence, j'ai écrit deux jeux - Tetris et une sorte de Flappy Bird. Pour le débogage, j'ai utilisé Intel D8748H et un clone de NEC D8749HD ne différant que par la taille de la ROM. J'ai utilisé l' environnement de développement intégré 8048 comme assembleur et débogueur. Dans le processus, j'ai eu une expérience inoubliable - le flux constant de microcontrôleurs de la console à la gomme, de la gomme au programmateur, et de là à la console, et tout cela s'accompagne d'une odeur hospitalière d'air ionisé ultraviolet ...

J'ai noté les programmes finis dans le P8748H Intel une fois programmable que j'ai soudé sur les cartes de circuits imprimés qui étaient arrivées à ce moment-là.


Comparaison avec les cartes d'origine, de gauche à droite: Block Buster, My option, Connect Four

J'ai dû utiliser l'original comme étui; je n'avais qu'une seule des deux cartouches disponibles pour le jeu Block Buster s'est avérée être inopérante.



La coque n'était pas suffisante pour le deuxième match:


Conclusion


Microvision MB a été produit avant 1981, et bien que les ventes au début aient été assez réussies, un petit nombre de jeux (13 cartouches ont été lancées au total) et des problèmes de qualité sont généralement appelés les raisons de la baisse des ventes. J'ajouterais à cela une taille excessivement grande, surtout par rapport à la série Nintendo Game & Watch qui est alors apparue et est devenue un succès.

Codes source et schémas publiés sur GitHub

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


All Articles