
1974 brachte Texas Instruments die ersten 4-Bit-Mikrocontroller der TMS1000-Familie auf den Markt, und 1976 begann Intel mit der Produktion von 8-Bit-Mikrocontrollern der berühmten MCS-48-Serie. Und dann fing es an.
Aufgrund der Billigkeit und Autarkie von Mikrocontrollern (damals wurden sie direkt als Single-Chip-Mikrocomputer bezeichnet) waren Geräte der Unterhaltungselektronik deutlich weiser und ihre Zahl wuchs mehr denn je. Mit dem Aufkommen von Mikrocontrollern, einer Klasse von Geräten wie tragbaren elektronischen Spielen, kann das Ausmaß der "Katastrophe" unter
dieser Verbindung geschätzt werden. Unter all diesen frühen Spielen stach eines hervor, das ich in diesem Beitrag diskutieren werde - dies ist Milton Bradley Microvision, das erste tragbare elektronische Spiel mit austauschbaren Kassetten, bei dem beide oben genannten Mikrocontroller verwendet wurden. Ich werde auch versuchen, auf die Besonderheiten der Entwicklung dieser Konsole einzugehen.
Allgemeine Beschreibung

Microvision wurde 1979 vor fast vierzig Jahren in den USA veröffentlicht. Insgesamt wurden 12 Kassetten mit Spielen für sie verkauft, darunter - komplett mit der Block Buster-Konsole (analog zu
Breakout ), Sport - Bowling und Baseball, einer elektronischen Version des berühmten Brettspiels
Connect Four , Pinball und anderen. Die meisten Spiele können mit dem
MVEM- Emulator ausgewertet werden, der auf der Grundlage einer interessanten
Reihe von Veröffentlichungen erstellt wurde , aus denen ich auch viele nützliche Dinge gelernt habe. Hier werde ich nicht näher auf die Beschreibung der ursprünglichen Spiele der Konsole eingehen, sondern mich sofort ihrer inneren Welt zuwenden.

Ein wichtiges Merkmal der Konsole ist ein 2-Zoll-LCD mit einer Auflösung von 16 x 16 Pixel. Nach heutigen Maßstäben recht primitiv, aber im Vergleich zu den LED-Baugruppen und Vakuum-Lumineszenz-Anzeigen, die damals in tragbaren Spielen verwendet wurden, war der Matrix-LCD-Bildschirm ein ziemlich fortschrittlicher Schritt. Zusätzlich zu Microvision wurde im selben Jahr eine Reihe von elektronischen Spielen Mego Mini-Vid mit einem ähnlichen Bildschirm zum Verkauf angeboten, allerdings 13x20. Anscheinend waren dies zu dieser Zeit die einzigen Geräte, die mit Matrix-LCDs einer solchen Auflösung verkauft wurden.

Das Display wird vom Hughes SCUS0488-Chip gesteuert - dies ist ein Matrix-LCD-Treiber. Der Treiber wird von einem UA79MG-Negativspannungsstabilisator mit zwei Kondensatoren und Widerständen gespeist, der die einfachste Elementbasis darstellt.

Im Gehäuse der Konsole befinden sich auch die Bedienelemente - eine 4x3-Tastenmatrix und ein variabler 10kΩ-Widerstand als Paddel. Für die Tonwiedergabe gibt es eine Piezodynamik.
Das Wichtigste ist, warum Microvision Geschichte geschrieben hat und jeder das oben erwähnte Mini-Vid mit austauschbaren Patronen vergessen hat.

Äußerlich war die Patrone ein abnehmbarer oberer Teil des Gehäuses. In der Mitte der Patrone befand sich ein Plastikfenster, das den Bildschirm abdeckte und auf dem für jedes Spiel Farbspielelemente und individuelle Beschriftungen angebracht waren. Unten befanden sich die Löcher für die Knöpfe, die von einem dünnen Film bedeckt waren, auf den die Signaturen aufgebracht wurden, und für jedes Spiel wurden Löcher nur für die verwendeten Knöpfe gemacht. Wahrscheinlich ermöglichte diese Anordnung der Kassette laut den Autoren, die Anpassung der Konsole an ein bestimmtes Spiel zu maximieren.
Block Buster Spielbrett, im Koffer und auf der RückseiteDer elektronische Teil der Kassette wurde auf einem von zwei Mikrocontrollern aufgebaut - TMS1100 oder Intel 8021 mit dem erforderlichen Kabelbaum. Das „Gehirn“ einer Konsole in eine Kassette zu stecken, mag wie eine seltsame Entscheidung erscheinen, aber Sie konnten nur mit zwei Chips pro Spiel auskommen. Darüber hinaus wurde die Vielseitigkeit erhöht. Gleichzeitig stieg der Preis der Patrone, offenbar aufgrund des Vorhandenseins des Mikrocontrollers, nicht wesentlich an (zum Beispiel betrugen die Kosten für 8021 in großen Losen 1976 etwa 3 USD).
All dies speiste eine oder zwei parallel geschaltete Kronen (8021 war ziemlich unersättlich). Darüber hinaus wurden in späteren Versionen die Kontakte für die zweite Batterie entfernt, und es wurde empfohlen, den verbleibenden Platz für eine Ersatzbatterie zu verwenden. Anscheinend lag dies an der Tatsache, dass Benutzer häufig die Polarität verwechselten und einen ziemlich gefährlichen Kurzschluss erhielten.
Krawatte
Ich habe diese alte Konsole gekauft, um eine Art Spiel dafür zu schreiben, eine Kassette herzustellen und wenn möglich die Elementbasis des Originals so weit wie möglich zu kopieren.
Es gibt jedoch ein signifikantes Problem - dass TMS1100, dass Intel 8021 ein maskiertes ROM hatte, d. H. werkseitig während des Herstellungsprozesses programmiert. Für Intels Mikrocontroller gibt es einen Ausweg: 8021 ist eine abgespeckte Version von 8048, die ebenfalls über ein maskiertes ROM verfügte. Intel produzierte jedoch ein Analogon von 8048 mit einem programmierbaren ROM - 8748, sowohl im Fall der UV-Löschung als auch billiger, sobald es programmierbar ist.
Leider ist die Situation für das TMS1100 viel schlimmer - es gab eine Debug-Version des Chips, die mit einem externen ROM funktioniert - TMS1098, aber es ist sehr schwierig, es jetzt zu kaufen, wenn möglich. Darüber hinaus wurde der Chip im DIP-64-Gehäuse hergestellt. Er ist an sich riesig und passt nicht in die Länge der Kassette, es wird jedoch auch ein ziemlich großes ROM benötigt.
Im Allgemeinen ist der UV-löschbare 8748 genau das, was Sie brauchen, und die endgültige Version der Patrone kann auf einer nicht löschbaren Version hergestellt werden.
Oben ist ein einprogrammierbarer P8748H und unten ein UV-löschbarer D8748HIntel 8021
Unten ist eine kurze Beschreibung von 8021, nicht 8748, weil Ich werde nur abgeschnittene Funktionen von 8021 verwenden, um nur Ressourcen zu haben, die ursprünglich von den Entwicklern der Konsole festgelegt wurden.
Das Speichersubsystem basiert wie die gesamte MCS-48-Familie auf einer modifizierten Harvard-Architektur. Der Programmspeicher ist ein internes ROM mit 1024 Bytes, der Datenspeicher besteht aus 64 Bytes dynamischem RAM.
Die Organisation des Arbeitsspeichers ist in der folgenden Abbildung dargestellt:

Die Zellen 0–7 belegen direkt adressierte Arbeitsregister R0 - R7, wobei R0 und R1 als Zeiger für den indirekten Zugriff auf alle RAM-Zellen verwendet werden. Die Zellen 8-23 werden für den 8-Ebenen-Aufrufstapel verwendet, obwohl sie auch über R0-R1 verwendet werden können.
Der Mikrocontroller verfügt über einen eingebauten Taktgenerator, die Referenzfrequenz wird durch einen externen Quarz, eine RC-Kette oder eine LC-Kette eingestellt. Ein Maschinenzyklus dauert 10 Zyklen, und jeder Zyklus dauert 3 Perioden der Referenzfrequenz. Die maximale Frequenz beträgt 3,58 MHz, während der Maschinenzyklus 8,38 μs dauert. Die Mindestfrequenz ist durch die Besonderheiten des DRAM begrenzt und beträgt 600 kHz.
8021 enthält zwei 8-Bit-Ports und einen 4-Bit-Port, über den auch ein E / A-Port-Expander, Chip 8243, angeschlossen werden kann. Alle Ports sind quasi bidirektional.
Zusätzlich verfügt der Mikrocontroller über einen eingebauten achtstelligen Timer / Zähler. Im Timer-Modus wird der Zähler T alle 32 Maschinenzyklen um 1 erhöht. Bei Überlauf T wird das TF-Flag gesetzt. Im Zählermodus werden Impulse am Testeingang T1 gezählt.
Das Befehlssystem enthält 64 Anweisungen, von denen 36 in einem Zyklus und 28 in zwei ausgeführt werden. Die meisten Anweisungen sind Einzelbytes.
Anweisungsliste mit kurzen Beschreibungen Vorbereitung
Es gab keine Probleme beim Kauf von 8748, die Hauptsache ist, darauf zu achten, dass die Chips mit verschiedenen Technologien hergestellt wurden. Die frühesten NMOPs benötigten eine Spannung von 25 V für die Firmware mit der Bezeichnung D8748. Ende der 70er Jahre wurden diese Mikrocontroller mit HMOP-E-Technologie (einer verbesserten Version von Intels NMOP) gebaut, mit D8748H gekennzeichnet und benötigten bereits 21 V. Die gleiche Spannung wurde von einem späteren Klon von NEC (mPD8748H) benötigt. Die einmalig programmierbare Version wurde mit P8748H bezeichnet.
Der UV-Radierer wurde dem einfachsten und billigsten Chinesen mit einem mechanischen Timer gekauft, der, wie die Praxis gezeigt hat, seine Aufgabe perfekt erfüllt (obwohl es in kurzen Abständen keine Timergenauigkeit gibt). Es löscht zuverlässig den ROM von Chips in ~ 2,5 Minuten. Später kaufte ich einen ZAX Quick-EII-Radiergummi für einen symbolischen Preis von japanischen Händen. Ich weiß nicht einmal, welches Jahr es ist, wie es Anfang der 90er Jahre aussah. Es verwendet einen Xenon-Blitz und löscht 8748 buchstäblich in 3 (!) Sekunden. Ein Video (nicht meins) mit einer Demonstration der Arbeit ist hier zu sehen.
Das Hauptproblem war der Programmierer. Die Unterstützung für diese veraltete Intel-Familie in modernen Programmierern kostet nur 300 US-Dollar. Es gibt zwar einen relativ billigen Amateur Willem, der mit dem MCS-48 über einen Adapter arbeiten kann, aber er benötigt LPT, was mir überhaupt nicht zusagte. Ich musste mich löten. Ich bin zum Beispiel ein unerfahrener Funkamateur, also habe ich ungefähr eine Woche mit ihm verbracht und einen der beiden 8748, die bis dahin angekommen waren, über Bord geworfen (obwohl ich den Gedanken mag, dass sie ursprünglich so war). Ich habe
die hier veröffentlichte Schaltung
als Grundlage genommen und sie nur für Atmega und eine bequemere 24-V-Stromversorgung angepasst. All dies wurde auf ein Steckbrett gelötet:

Es stellte sich natürlich als ziemlich hässlich heraus, und einer der Mosfets arbeitet bis an die Grenzen (sogar ein wenig für), aber am Ende hat der Programmierer seine Aufgabe gemeistert und mir gute Dienste geleistet.
Also, alles ist fertig, die Test-Firmware blinkt glücklich mit der LED, es ist Zeit, eine Patrone herzustellen.
Patrone
Der Großteil der Patronen funktionierte auf dem TMS1100, weil Signetics, das die Intel Intel 8021-Lizenz von Intel herausgab, konnte nicht die erforderliche MB-Chipversorgung bereitstellen. Sogar einige Spiele, die bereits für 8021 geschrieben wurden, mussten auf das TMS1100 portiert werden. Dies ermöglichte es uns übrigens, das gefährliche Bündel von zwei Batterien aufzugeben, da der Verbrauch an TI-Mikrocontrollern bei Intel nur 0,1 W gegenüber 1 W betrug. Ich habe nur eine von 6 Kassetten mit 8021, dies ist das Connect Four-Spiel, und es wurde als Grundlage genommen.
Ich habe versucht, das Board so ähnlich wie möglich zum Original zu machen, aber natürlich musste ich Änderungen vornehmen. Erstens die Größe des Chips (DIP-40 gegenüber DIP-28) und eine andere Pinbelegung. Zweitens mussten wir die Nennwerte im Schwingkreis ändern, der die Taktfrequenz einstellt, weil Der Maschinenzyklus für HMOS-Versionen von Mikroschaltungen beträgt 15 Zyklen und für MOS-Versionen, die in den Originalpatronen verwendet wurden, 30 Zyklen. Aus Gründen der vollständigen Authentizität arbeitet meine Kassette daher mit 1,25 MHz gegenüber den ursprünglichen 2,5 MHz und gewährleistet gleichzeitig die gleiche Leistung.

Auf dem Foto oben wurden die fertigen Leiterplatten in China bestellt, und während sie eingeschaltet waren, habe ich die Leiterplatte gezeichnet und geätzt und einen solchen "Debugging-Komplex" zusammengesetzt:

Schließlich ist der Hardware-Teil fertig und Sie können mit der Programmierung beginnen.
Anzeige

Zunächst musste ich mich mit der Ausgabe auf dem LCD befassen. Wie ich oben geschrieben habe, wurde es vom Hughes 0488-Treiber mithilfe von Multiplexing gesteuert (kürzlich wurde auf Habré ein interessanter
Artikel über diese Art der LCD-Steuerung veröffentlicht). Es handelt sich um einen Treiber und nicht um einen Controller. Sie können also nicht nur ein Pixel einschalten und Ihrem Geschäft nachgehen. Sie müssen den Bildschirminhalt ständig mit einer Frequenz von 30 bis 50 Hz mit Low-Level-Befehlen aktualisieren.
Das Anschlussdiagramm lautet wie folgt:

Pinbelegung H0488:
Vdd - Stromversorgung (3-8V)
R1-R16 - String-Steuerausgänge
C1-C16 - Spaltensteuerungsausgänge
DATA0-DATA3 - Datenbus
! Data Clk -
DatenaufzeichnungstakteingangVerriegelungsimpuls - Pinbelegungsstatussignal R0-R15, C0-C15
Die Bedeutung des Chips ist wie folgt:
Über 4 Informationsleitungen wird der notwendige Zustand aller 32 Ausgänge der Mikroschaltung nacheinander eingestellt (16 pro Zeile und Spalte). Das heißt, Wir geben in 4-Bit-Abschnitten den Zustand der Ausgänge für die Zeilen 1 bis 4, dann 5 bis 8, 9 bis 12 und schließlich für 13 bis 16 an. Außerdem geben wir viermal in vier Bits den Zustand der Spalten an. Jedes neue Datenelement wird durch einen Impuls entlang der! DATA CLK-Leitung getaktet. Nachdem wir alle 8 Daten gesendet haben, setzt ein Impuls auf der Latch Pulse-Leitung den angezeigten Zustand der Ausgänge R1-R16, C1-C16, der bis zum nächsten Impuls auf dieser Leitung gehalten wird.
Natürlich können wir in einem solchen Zyklus nicht den Zustand jedes einzelnen Pixels unabhängig von den anderen angeben, sondern nur 16 (durch die Anzahl der Schnittpunkte von Zeilen mit Spalten). Um den Zustand jedes Pixels unabhängig zu aktualisieren, sind daher 256/16 = 16 Zyklen erforderlich.
Darüber hinaus sind wir dafür verantwortlich, die Polarität zu ändern, um die konstante Spannung der LCD-Elektroden zu beseitigen, da sich sonst die Anzeige schnell verschlechtert. Die Polaritätsumschaltung erfolgt an der Hinterflanke des Signals am Latch Pulse bei einem niedrigen Eingang! Data Clock. Es wird empfohlen, die Polarität mit der Bildwiederholfrequenz des Bildschirms zu ändern.
Das Obige wird durch das folgende Zeitdiagramm aus einem Datenblatt veranschaulicht:

All dies, implementiert in Assembler 8021 (was übrigens im Vergleich zum Assembler der übrigen Familie erheblich reduziert ist, alle für die gleiche Authentizität, die ich nur von 8021 unterstützte Anweisungen verwendet habe), könnte ungefähr so aussehen:
mov R0,
Dies ist meine schnellste Version des Unterprogramms, das das im RAM gespeicherte Bild anzeigt. Es wird in 1152 Maschinenzyklen durchgeführt (in unserem Fall ~ 12 μs).
Die maximale Bildwiederholfrequenz des Bildschirms beträgt etwa 70 Bilder pro Sekunde (wenn der Mikrocontroller nichts anderes tut), was im Prinzip redundant ist. Um Register und ROMs zu speichern, habe ich in der Praxis andere Unterprogramme verwendet - langsamer und für bestimmte Aufgaben besser geeignet. Bei dieser Frequenz ist es jedoch unter Berücksichtigung der hohen Inertheit dieser Anzeige möglich, Bilder mit 4 Graustufen (wie ein Niblonog auf KPDV) anzuzeigen, wobei sich die Bilder schnell ändern. Oder auch kurze vierfarbige Animationen:
Wie Sie sehen, lässt der Kontrast zu wünschen übrig. Besonders auffällig, wenn alle Zeilen und Spalten betroffen sind, aber nichts zu tun ist - die Kosten für die Multiplexsteuerung.
Tastatur

Hier ist alles viel einfacher. Die Schaltflächen sind in einer Matrix aus 4 Zeilen und 3 Spalten zusammengefasst. Zeilen sind mit den Pins P0.4-P0.7 verbunden, Spalten sind mit P0.0-P0.2 verbunden.

Wie oben erwähnt, sind die Ports von 8021 quasi bidirektional. Um den Status der Terminals zu ermitteln, müssen Sie zunächst Einheiten an diese senden. Das heißt, Bei der Dateneingabe tritt eine Verbindung zwischen den Eingangssignalen und dem Inhalt des Puffers auf, die den neuesten am Port angezeigten Daten entspricht. Eine Tastaturumfrage sieht ungefähr so aus:
mov a,
Paddeln

Oder auf Russisch ist das im unteren Teil der Konsole installierte Manipulatorrad ein variabler 10-kΩ-Widerstand mit einem dekorativen Griff, der gedreht werden kann, um etwas im Spiel zu steuern. Natürlich gab es weder im 8021 noch im TMS1100 einen ADC. Der Drehwinkel wurde durch die Ladegeschwindigkeit des Kondensators bestimmt, der vorsichtig auf die Konsolenplatine gelötet wurde.

Es funktioniert alles wie folgt: Während die Pins P2.2-P2.3 hoch sind, wird der Kondensator entladen und die logische Einheit befindet sich am Testeingang T1. Nachdem wir P2.2 auf P2.3 auf einen niedrigen Pegel eingestellt haben, beginnt sich der Kondensator aufzuladen, und nach einiger Zeit, exponentiell abhängig vom Widerstand des variablen Widerstands, wird der Spannungsabfall über ihm so, dass T1 auf 0 gesetzt wird. Es bleibt nur die Zeit zu erfassen bis zum Auftreten von Null auf T1, das proportional zum Drehwinkel des Paddels ist (Weitere Details und interessantere Informationen zu solchen Schemata finden Sie in
DI HALT'a ). Im Code könnte dies folgendermaßen aussehen:
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 ;
Ton
Hier ist es ganz einfach, eine Piezodynamik ist mit den beiden Leitungen des Ports P2.0 und P2.1 verbunden. Alles, was wir tun müssen, ist abwechselnd die Beine mit der richtigen Frequenz zu ruckeln.
Was ist passiert?
Als Ergebnis schrieb ich zwei Spiele - Tetris und eine Art Flappy Bird. Zum Debuggen habe ich Intel D8748H und einen Klon von NEC D8749HD verwendet, der sich nur in der ROM-Größe unterscheidet. Ich habe die
8048 Integrated Development Environment als Assembler und Debugger verwendet. Dabei habe ich ein unvergessliches Erlebnis bekommen - den ständigen Fluss von Mikrocontrollern von der Konsole zum Radiergummi, vom Radiergummi zum Programmierer und von dort zurück zur Konsole, und all dies wird von einem Krankenhausgeruch nach ionisierter ultravioletter Luft begleitet ...
Ich schrieb die fertigen Programme in den einst programmierbaren Intel P8748H, den ich auf die bis dahin eingetroffenen Leiterplatten gelötet hatte.
Vergleich mit den Originalplatinen von links nach rechts: Block Buster, Meine Option, Connect FourIch musste das Original als Fall verwenden, ich hatte nur eine der beiden verfügbaren Kassetten für das Block Buster-Spiel, die sich als nicht funktionsfähig herausstellten.
Der Rumpf war nicht genug für das zweite Spiel:
Fazit
Microvision MB wurde vor 1981 hergestellt, und obwohl die Verkäufe zu Beginn recht erfolgreich waren, werden eine kleine Anzahl von Spielen (insgesamt 13 Kassetten wurden veröffentlicht) und Qualitätsprobleme normalerweise als Gründe für den Umsatzrückgang bezeichnet. Ich würde dem eine übermäßig große Größe hinzufügen, insbesondere im Vergleich zu der Nintendo Game & Watch-Serie, die damals erschien und ein Hit wurde.
Auf GitHub veröffentlichte Quellcodes und Schemata