Architektur und Programmierung Philips Videopac (Magnavox Odyssey 2)

    „Hardware ist nur Software, die früh kristallisiert wurde“
    - Alan Kay


    Der Magnavox Odyssey 2 (Videopac) Computer erschien 1978 und wurde als Gaming- Computer positioniert, jedoch mit einer ernsteren Verwendung (für die er eine eingebaute Folientastatur hatte). Angesichts der zugewiesenen Speicherkapazität gab es nur sehr wenige ernsthafte Anwendungen. Daher ist es richtiger, Videopac als Spielekonsole zu betrachten.

    Der Magnavox Odyssey 2 wurde in den USA verkauft und produzierte ein NTSC-Videosignal (über RF-Ausgang). Philips Videopac G7000 (auch bekannt als C52) wurde in Europa mit PAL-Video verkauft. Zusätzlich zu diesem Unterschied (der sich natürlich auf die Leistung einiger Spiele auswirkte) sind die Computer genau gleich.

    Videopac war eine der ersten Spielekonsolen, für die Spiele in Form von Cartridges mit Programmen veröffentlicht wurden. Daher ist es nicht verwunderlich, dass dieses Gerät technisch sehr asketisch ist.

    CPU und Speicher


    Der Prozessor ist ein Intel 8048 Mikrocontroller . Zu einer Zeit war es ziemlich berühmt, da es in allen PC XT- und AT-Tastaturen (in verschiedenen Versionen) installiert war.

    Der 8048 verfügt über einen relativ einfachen Befehlssatz und einige Adressierungsmodi. Harvard- Architektur (im Gegensatz zu der allgemein bekannten von Neumann).

    Der gesamte Speicher ist in drei Typen unterteilt: Software-ROM (1 KB BIOS auf einem Chip und bis zu 8 KB ROM in Kassetten), internes RAM (64 Byte im Mikrocontroller selbst, davon 32 Byte für Register und Stack reserviert) und externes RAM (128 Byte statisches RAM). teilweise unter den gleichen Adressen wie der Videocontroller).

    Die Gesamtmenge an RAM, die dem Programmierer dadurch zur Verfügung steht, beträgt weniger als 160 Bytes, und selbst dann ist es sehr schwierig, es in seiner Gesamtheit zu verwenden.

    Es gibt separate Anweisungen für den Zugriff auf jeden Speichertyp (MOVP, MOV, MOVX). Die Taktfrequenz von 8048 in Videopac wird oft mit 5,37 MHz angegeben, aber tatsächlich (im Sinne der folgenden Anweisungen) sind es nur 0,358 MHz. In diesem Fall werden die meisten Anweisungen jedoch in 1-2 Zyklen ausgeführt. Es gibt neun Universalregister - A, R0-R7.

    Der 8048 verfügt außerdem über einen Timer, zwei E / A-Ports und einen Interrupt-Steuerkreis. Über Ports werden zwei Joysticks und eine Tastatur abgefragt.

    Eine unangenehme Eigenschaft von 8048 ist die Aufteilung des Speichers in Seiten von 256 Bytes (Sie können nicht auf den Speicherort zugreifen, der sich auf einer anderen Seite befindet) und Bänke von 2 kb (um auf eine benachbarte Bank zuzugreifen, müssen Sie mit SEL RB-Befehlen wechseln), die ständig berücksichtigt werden müssen.

    Es gibt ein inländisches Analogon von 8048 - 1816BE48.

    Video und Ton


    Eine weitere wichtige Komponente des Systems ist der Intel 8245-Chip (auch bekannt als 8244 für NTSC). Dies ist ein videobasierter Audiocontroller mit einem maskierten ROM, der speziell für Videopac hergestellt wurde (d. H. Anscheinend gibt es keine anderen Versionen oder Firmware).


    Der Videocontroller ist selbst für die Standards von Heimcomputern der achtziger Jahre ziemlich seltsam. Beispielsweise gibt es keinen Grafik- oder Textmodus. Alle Entitäten, die es unterstützt (Sprites, Zeichen, Quads, Gitter), sind Sprites mit der einen oder anderen Einschränkung. In dieser Hinsicht sind solche "normalen" Operationen wie das Zeichnen von Punkten an einer bestimmten Stelle auf dem Bildschirm oder das Füllen des Bildschirms mit Text unmöglich. Aus diesem Grund können Sie nicht einmal definitiv über die Bildschirmauflösung sprechen (es ist sehr wichtig, über Zahlen wie 228 x 262 zu sprechen).

    Tatsächlich ist dieser Videocontroller nicht universell und wurde für typische (sehr einfache) Spiele entwickelt. Es können sich bilden:

    Sprites- traditionelle Hardware-Sprites mit 8x8 Pixeln. Gleichzeitig können sich 4 Sprites auf dem Bildschirm befinden. Deren Inhalt, Koordinaten und Farbe können durch Schreiben in die Register des Videocontrollers geändert werden. Jedes Sprite kann eine von acht (hellen) Farben haben.

    Es gibt auch eine seltsame (wenn auch nützliche) Funktion, mit der Sie das Sprite um die Hälfte (!) Pixel oder die ungeraden Linien des Sprites um die Hälfte des Pixels relativ zu geraden verschieben können.

    Chars Chars - Symbole. Buchstaben, Zahlen und einige Zeichen (insgesamt 63), deren Bilder im ROM-BIOS gespeichert sind und nicht geändert werden können. Gleichzeitig können maximal 12 Zeichen auf dem Bildschirm angezeigt werden. Wie Sprites werden sie überall auf dem Bildschirm angezeigt (pixelgenau), können sich jedoch nicht überlappen. Jedes Zeichen kann eine von 8 (hellen) Farben haben.

    Die Adresse, von der das Symbolbild stammt, hängt von der Y-Koordinate, auf der das Symbol angezeigt wird, und dem Symbolcode (!) Ab. Um Zeichen auszugeben, müssen Sie diese Adresse entweder mit einer cleveren Formel berechnen (insbesondere, wenn Sie Teile von Zeichen abrufen möchten) oder die BIOS-Routine verwenden.


    Quads - Gruppen von Charakteren in 4 Teilen kombiniert.

    Raster - ein Raster von 9 x 8 Segmenten. Wird verwendet, um Labyrinthe, Fußböden, Treppen usw. anzuzeigen. Es gibt einen Modus, mit dem Sie statt eines Gitters feste Blöcke anzeigen können, um beispielsweise ein Schachbrett zu simulieren. Das gesamte Raster hat die gleiche Farbe. Das heißt Für alle Raster wird eine von acht (dunklen) Farben eingestellt.

    Das Raster befindet sich im Hintergrund (über dem Hintergrund, der aus 8 Farben bestehen kann), Symbole werden über dem Raster angezeigt und Sprites im Vordergrund.

    Es ist möglich, die Tatsache der Kollision von Objekten miteinander zu verfolgen (ein Bit-Flag für jeden Objekttyp - ohne Angabe eines bestimmten).

    Darüber hinaus ermöglicht der Videocontroller mit einer Reihe von Einschränkungen, die Position des Strahls nicht nur nach Vollbild, sondern auch nach Linie zu verfolgen. Im einfachsten Fall werden hiermit horizontale Streifen (z. B. Erde und Himmel) gezeichnet, indem die Hintergrundfarbe zum richtigen Zeitpunkt geändert wird.


    Neben Video können Sie mit 8245 auch primitive Sounds erzeugen. Dazu gibt es ein zyklisches 24-Bit-Schieberegister, das mit einer von zwei Frequenzen getaktet werden kann, um zwischen Rauschgenerierungsmodus zu wählen und umzuschalten. Somit ist die Erzeugung einer beliebigen Note praktisch unmöglich, obwohl Sie mit einigen Tricks eine akzeptable Annäherung erhalten können.

    Die Ausgangslautstärke ist allgemein, es kann eine von 16 Stufen eingestellt werden. Mit BIOS-Routinen können Sie mehrere Sounds erzeugen, die in den meisten Spielen zu hören sind (Quietschen, Schuss, Explosion).

    Spielkassetten sind einfache ROM-Größen von 2 KB (am typischsten) bis 8 KB. Neben Kassetten gibt es zwei Peripheriegeräte für Videopac - einen Sprachsynthesizer (LPC-Komprimierung, ROM mit Wörtern) und ein Schachcomputermodul (mit eigenem z80-Prozessor).

    Entwicklung



    Der beste Emulator ist o2em, und es gibt eine Version mit integriertem Debugger. Obwohl dies wirklich ein sehr anständiger Emulator ist, ist die Situation, in der ein ziemlich einfacher Code darin funktioniert, aber auf einem echten Videopac ein schwarzer Bildschirm oder die falschen Farben angezeigt werden, ziemlich typisch. Der Emulator 1816BE48 („SCM - Single Chip Machine von DCA Laboratory“) kann ebenfalls nützlich sein. Als Assembler verwenden Sie am besten AS (ASW).

    Build and Run sieht so aus:

    asw.exe -L -x %1.a48
    p2bin.exe %1.p %1.bin -r 1024-3071
    o2em.exe %1.bin -euro

    Um den Code auf einem realen Gerät zu überprüfen, wurden Mateos Videopac Multigame Cartridge und Mateos Burner / Dumper gekauft (d. H. ROM-Emulator und Programmierer dafür mit USB-Anschluss).

    Es ist auch sinnvoll, Videopac durch Erstellen einer Composite- oder RGB-Ausgabe zu ändern (im Internet gibt es viele Schemata ). Im Vergleich zu Standard-HF liefert dies ein besseres Bild und korrektere und klarere Farben.

    Wenn Sie den Computer einschalten (wenn eine funktionierende Kassette eingelegt ist), wird die Farbe „SELECT GAME“ auf dem Bildschirm angezeigt (wenn keine Kassette vorhanden ist, wird auf dem Bildschirm bestenfalls Müll angezeigt).
    Nach dem Drücken der Taste erfolgt ein Übergang zur Adresse 0400h - der ersten Adresse im Cartridge-ROM.

    Ein typisches Programm sieht wie folgt aus:

    ; Hello World for Philips Videopac (Magnavox Odyssey 2), 8048 CPU
    ; by Frog ( https://github.com/petersobolev )
        cpu 8048
        org 400h
        include "g7000.h"       ; стандартные для Videopac константы
    ; вектора прерываний
        jmp     selectgame      ; RESET. Инициализация VDC, внутреннего и внешнего ОЗУ. Отображение надписи "SELECT GAME" и ожидание клавиши. Затем переход по адресу 0408h, т.е. на jmp start (код клавиши в A).
        jmp     irq             ;
        jmp     timer           ;
        jmp     vsyncirq        ;
        jmp     start           ; вызывается после отработки selectgame
        jmp     soundirq        ;
    timer:
        ret                     ; таймер не используется
    start:
        call    gfxoff          ; необходимо чтобы можно было писать в регистры VDC
        mov     r0,#010h        ; начальный адрес в VDC отображаемого символа (одного из 12)
        mov     r3,#40          ; x
        mov     r4,#100         ; y
        mov     r1,#hellostr & 0ffh ; указатель на строку (должен быть на той же 255 байтной странице)
        mov     r2,#11          ; длина строки 11 символов
    nextchar:
        mov     a,r1
        movp    a,@a            ; получаем в A символ взятый по адресу хранящемуся в r1
        mov     r5,a
        inc     r1              ; увеличиваем адрес символа
        mov     r6,#0eh         ; белый цвет
        call    printchar       ; печатаем символ (одновременно увеличивая r0 и r3)
        djnz    r2,nextchar
        call    gfxon           ; изображаем то, на что запрограммировали VDC
    loop:
        jmp     loop            ; просто ждём
    ; 'HELLO WORLD' (ASCII строки не поддерживаются ассемблером)
    hellostr:
        db      01dh, 012h, 00eh, 00eh, 017h, 00ch, 011h, 017h, 013h, 00eh, 01ah
    

    Anwendung - Intro Rash


    Nach den Ergebnissen des Studiums von Videopac habe ich (für den Wettbewerb um Chaos Constructions ) ein 256-Byte-Intro ( Video , Quelle ) geschrieben.


    In der Arbeit werden drei Arten von Grafikprimitiven verwendet (von vier i8245, die im Videocontroller implementiert sind) - Raster, Sprites und Zeichen. Nur Quads (die eine Art von Zeichen darstellen) werden nicht verwendet.

    Männer, die von oben nach unten fallen, sind keine Sprites, wie es scheint, sondern Symbole (Zeichen) der Größe 8x8. In 8245 sind Zeichen und Sprites verwandte Konzepte. Die maximal zulässige Anzahl gleichzeitig angezeigter Zeichen beträgt 12 Stück. Alle von ihnen stammen aus einem Standard-Zeichengenerator (es gibt Symbole von Männern), der mindestens 24 Bytes speichert. Dies ist ein wichtiger Punkt, da die i8048-Architektur und das Videopac-Kassettenformat überhaupt nicht zur Kompaktheit des Codes beitragen. Insbesondere können trotz der großen Anzahl von Registern (a, r0-r7) in einigen Fällen nur einige (a, r0, r1) verwendet werden, so dass einige "zusätzliche" Befehle erzeugt werden, die Daten von Register zu Register treiben.

    Ein Hintergrund aus sich ändernden orangefarbenen Quadraten wird durch ein Raster implementiert. Dies ist ein Hardware-generiertes 9x8-Raster (in einem speziellen "Schach" -Feldmodus), in dem gemäß einem Algorithmus bestimmte Segmente eingeschaltet sind. Gitterpriorität ist immer die kleinste, also fliegen kleine Männer darüber.

    Ein unglückliches, aber fröhliches Kätzchen repräsentiert zwei Sprites (je 8x8). Gleichzeitig ändern sich die Daten für Sprites während der Bewegung regelmäßig in andere (nur zwei Frames), um sich bewegende Pfoten zu simulieren.

    Die Kollision von Zeichen und Sprites wird vom Videocontroller aufgezeichnet, und gemäß einem bestimmten Algorithmus ändert sich die Farbe der Sprites der Katze, und ein spezielles Bit wird zurückgesetzt oder ein spezielles Bit wird verschoben, das die geraden Zeilen des Sprites um ein halbes Pixel relativ zu den ungeraden verschiebt.

    Als Kollisionssound wird einer der Sounds verwendet, die über die BIOS-Routine verfügbar sind (wodurch einige Bytes mehr gespart werden).

    Außerdem


    Neben Spielen gab es für Videopac mehrere ernstzunehmende Anwendungen - ein Programm zum Anzeigen von Titeln in Form einer laufenden Linie und ein Programm zum Unterrichten von Programmierung, das gesondert erwähnt werden sollte.

    Die Kassette heißt "Computer Programmer" und ermöglicht es Ihnen, das Programm in Maschinencode (dh nicht einmal in Assembler) einzugeben und auszuführen. Ein Buch mit einer Beschreibung der Architektur und Anweisungen von 8048 wurde der Kassette beigefügt.

    Lassen Sie mich daran erinnern, dass dies ein vollständig kommerzielles Produkt war, das für Käufer einer (!) Spielekonsole entwickelt wurde.

    Auf dem Video können Sie sehen, wie es funktioniert.

    Referenzen



    Hier können Sie meine Arbeiten unter verschiedenen Retro-Plattformen sehen, und hier ihre Quellen auf Github.

    ps Danke, tnt23, dass Sie die Videoausgabe von Videopac von RF auf Composite umgestellt haben.

    Jetzt auch beliebt: