Vectrex Nachbau

Inspiriert von der Vectrex Spielekonsole haben wird hier Liniengrafik auf dem Oszillioskop dargestellt und analog erzeugt.

Motivation

Vectrex mit Minestorm (Creative-Commons-Lizenz)

Das Vectrex ist eine Spielekonsole, die 1982 auf den Markt kam (Wikipedia). Seine Besonderheit ist die Verwendung von Vektorgrafik, es werden im XY-Betrieb Linien auf einer kleinen SW-Fernsehbildröhre dargestellt.

Die Vektoren werden analog über Integrierer erzeugt, was den Hauptprozessor entlastet. Dieser gibt über einen DAC nur die Steigung sowie die Integrationszeit der einzelnen Vektoren vor.

Das teil-analoge Design empfinde ich als sehr elegant, insbesondere weil sich damit -- eben analog -- Linengrafik in sehr hoher Auflösung darstellen lässt. Begrenzend ist hierbei nur die Genauigkeit der Integratoren, es gibt kein Pixelraster. Der analoge Schaltungsteil sieht vereinfacht aus wie folgt (aus dem Service Manual, klicken zum Vergrößern):

Ausschnitt aus dem Service Manual

komplettes Vectrex Service Manual inkl. Schaltplänen (Quelle: http://www.vectrex.nl/)

Schaltungsbeschreibung

Der MC1408 (IC301) ist der DA-Wandler. Da er einen Stromausgang besitzt, ist eine Transimpedanzverstärker nachgeschaltet, der den Strom in eine proportionale Spannung umwandelt.
Der 4052 (IC302) ist ein analog Multiplexer. Er schaltet die erzeugte Spannung wahlweise auf Y, Z, oder ZERO_REF. Zusätzlich wird die Spannung auf den X-Kanal geleitet.
Der Analog-MUX bildet gemeinsam mit den nachgeschalteten Kondensatoren und Impedanzwandlern eine Sample&Hold Stufe, d.h. es können die Spannungen für Y, ZERO_REF und X als kurze Pulse ausgegeben werden. Wird die Verbindung zum DAC über den MUX getrennt, so bleibt die Spannung im Kondensator gespeichert und steht weiterhin am Ausgang des Impedanzwandlers zur Verfügung.

Der X-Kanal verfügt über kein S&H. Nach Laden der übrigen Kanäle wird der MUX abgeschaltet und ein konstanter Wert über den DAC ausgegeben, dieser wird dann nur über den X-Kanal weitergeleitet.

Der Analogschalter 4066 (IC305) verbindet nun, gesteuert durch das RAMP Signal, die x- und Y-S&H mit den beiden Integratoren. So ist zum einen sichergestellt, das keine Glitches vom Umladen der S&H-Kondensatoren zu den Integratoren gelangen und es kann außerdem sichergestellt werden, das die Integration von X und Y genau gleichzeitig beginnt, auch wenn ihre Werte sequentiell uuber den DAC ausgegeben werden.

Nachbau

Aus dem original Vectrex habe ich nur den eigentlichen Vektorgenerator übernommen (siehe Schaltbild oben). Als Prozessor verwende ich einen Atmel AVR ATmega8, der als Ein-Chip Lösung die gesamte Digitalelektronik des Vectrex ersetzt. Kompatibel mit Vectrex-Spielen ist der Aufbau natürlich nicht und Sound ist bisher auch nicht vorgesehen.

Auf dem AVR soll nach ersten Tests mit Liniengrafiken ein Asteroids-Clon entstehen.

Die ersten Ergebnisse möchte ich hier dokumentieren. Bisher gibt es nur fürchterliche Handy-Fotos, bessere folgen, wenn ich mit Hard- und Software etwas weiter bin.


Das ist die gesamte Schaltung. Eigentlich recht übersichtlich, durch die Vogelnest-Konstruktionstechnik aber doch irgendwie geheimnisvoll.


2011-12-25: Pünktlich zu Weihnachten sind erste Ergebnisse zu bewundern. Der Baum sollte allerdings eigentlich symmetrisch zur Mitelline der Scope-Röhre sein. Hier sind noch Integratoren abzugleichen und die DAC-Offsetspannung muss beseitigt werden.


2011-12-28: Der erste Asteroid! Da kann es bis zum kompletten Spiel doch eigentlich nicht mehr weit sein...


2011-12-28: Kleine Animationen gehen auch schon. Es fehlt aber noch die komplette Spiellogik, Kollisionserkennung etc. pp.



2011-12-29: Hershey Vektor-Zeichensatz eingebunden. Funktioniert wunderbar, allerdings sieht alles noch recht zappelig aus. Es wird Zeit für einen robusteren Aufbau auf einer Platine.



2011-12-30: Asteroids funktioniert! Konnte mangels Kamera und Zeit noch kein Video machen.

TODO:

  • Momentan passiert die Vektorskalierung per Software im AVR. Für kleine Objekte bleibt sehr wenig Auflösung übrig was zu Artefakten insbesondere beim Drehen des Raumschiffs führt. Sehr viel sinnvoller ist natürlich eine analoge Skalierung. Das sollte entweder über änderungen der Integrator-Referenzspannung gehen oder schlicht über die Änderung der Integrationszeit. Geplant ist die Umstellung der Zeichenroutine von fester Integrationszeit auf verwendung eines konfigurierbaren Timers. Bei der Gelgenheit sollte es auch möglich sein, Interrupts einzubauen:
    • Vektor starten: Warten bis VEKTOR_READ==1, X, Y, Z Spannungen ausgeben, Timer starten, Integrator starten
    • Vektor-Zeichenroutine kehrt zum Hauptprogramm zurück, dieses kann weitere FUnktionen ausführen (außer Vektoren zeichnen)
    • ...
    • Timer abgelaufen, Interrupt wird ausgelöst, Interrupt schaltet Integrator ab. VEKTOR_READY=1
  • Bewegung von Asteroiden und Schüssen wird momentan unterschiedlich gespeicher (Asteroiden als dx/dy und Schüsse un Polarkoordinaten). Was ist praktischer? Ggf. müssen Umrechnungsroutinen her.

2012-01-02: Analoge Skalierung eingebaut. Damit klappt auch die Rotation ohne Artefakte.





TODO:

  • Kollisionstest funktioniert nicht mehr besonders gut, für neue Skalierung überarbeiten
  • Kollision mit Raumschiff einbauen
  • Alles kleiner, mehr Asteroiden
  • Explosionen animieren
  • Sound

Schematics: AVR Vectrex 2012 Rev. B This is what the breadboard should have been. Differences:

  • Z channel not implemented on breadboard. Digital AVR pin is used instead for blanking.
  • ZERO REF not implemented on breadboard

2012-01-08: Extracted asteroid vector lists from original (i.e. Atari arcade) asteroids. In my small Python vector simulator, they look like this:

Will be included in the AVR game soon...


2012-01-08: And now for something completely different...

I wrote a little parser for the Atari Asteroids DVG (digital vector generator) ROM. Lacking a sensible place to publish it, here it is:

asteroids_parser_2012-01-08.zip

Inspiration: http://www.heise.de/ct/projekte/machmit/asteroids/attachment/wiki/Tools/vda.pl, http://www.philpem.me.uk/elec/vecgen.pdf

It's written in Python using PyQt4. Don't expect too much. I improvised this to get an overview of all the objects in the DVG ROM. I might use some of them for my own asteroids clone since I am not particulary creative and would rather focus on the technical details than the artwork.

--- Sebastian B 2012/01/01 18:25