Astéroric — Funktionen im Detail
Studienklon von Asteroids für den Oric-1 48K · C + 6502-Assembler (cc65) · EUPL-1.2-Lizenz
Diese Seite listet die Funktionen von Astéroric auf, jeweils mit dem Was und dem Wie. Das GitHub-Repository (README, ROADMAP, CHANGELOG) bleibt die aktuelle Referenz; das Handbuch beschreibt die Bedienung.
Inhalt
1. HIRES-Vektordarstellung
Astéroric zeichnet alles — Schiff, Asteroiden, Untertassen, Torpedos, Buchstaben, Ziffern — mit Liniensegmenten, wie der Arcade-Automat mit Vektorbildschirm, aber auf dem Bitmap-HIRES-Bildschirm des Oric.
Monochromer HIRES-Modus
240 × 200 Pixel, PAPER 0 / INK 7. Der Zeichensatz wird von $B400 nach $9800 kopiert, die drei unteren Textzeilen werden bereinigt. Das bei der Initialisierung gesetzte Videoattribut ist $1E (HIRES 50 Hz, PAL): mit $1C (60 Hz) rastete ein RGB2HDMI am echten Oric-1 nicht auf das Signal ein.
Bresenham in XOR
Jedes Segment wird per XOR gezeichnet: erneutes Zeichnen löscht es, ohne den Hintergrund zu sichern. Die Routine draw_line_xor (src/asm/line.s) ist selbstmodifizierender Assembler mit einem eigenen Pfad für reine Vertikalen und byteweiser Verarbeitung auf der horizontalen Achse. Von Segmenten geteilte Eckpunkte werden nur einmal gezeichnet (halboffener Bresenham), sonst würde das XOR sie auslöschen.
Vorgerenderte Sprites
Formen, die sich nicht drehen (Asteroiden, Untertassen, Ziffern), werden vorgerendert und per XOR geblittet statt Segment für Segment neu gezeichnet — Phase 26, die die freie CPU-Zeit auf 39,8 % brachte.
Anti-Flimmern
Löschen und Neuzeichnen jeder Entität liegen in der Schleife eng beieinander (erase → tick → draw pro Entität, vorherige Positionen gemerkt), um das Fenster zu verkürzen, in dem ein Objekt auf dem Bildschirm fehlt.
Subpixel-Bewegung
Schiff und Asteroiden in 8.8-Festkomma: gebrochene Geschwindigkeiten und flüssige Bahnen trotz des 240 × 200-Rasters. Das Schiff dreht sich über 32 Winkel (11,25°) mit vorberechneten Tabellen.
2. Arcade-Treue
Die Spiellogik ist aus der Disassemblierung des Arcade-ROM rev 4 übertragen (6502disassembly.com): dieselbe CPU wie im Oric, die ursprünglichen Variablennamen bleiben zur Nachvollziehbarkeit erhalten.
Authentische Asteroiden
Vier Formen × drei Größen, Eckpunkte aus dem ROM extrahiert (Arbeiten von Nick Mikstas), 11 bis 13 Eckpunkte pro Form ohne Dezimierung. Bis zu sechs Asteroiden gleichzeitig (Leistungsgrenze).
Wellen und Zerfall
Ansteigende Wellen mit Positionen und Geschwindigkeiten aus dem Pseudozufallsgenerator des Automaten; ein getroffener großer Asteroid ergibt drei Bruchstücke, der Elternteil schrumpft; Bruchstückgeschwindigkeit nachjustiert (Phase 29) und Gesamtgeschwindigkeit gesenkt (Phase 37) nach Spieltests.
Zylinder und Torus
Der Übergang von einem Rand zum anderen erfolgt durch Instanzduplikation (ein Objekt auf dem Rand wird auf beiden Seiten gezeichnet); Kollisionen werden in Torustopologie berechnet.
Schiff, Schüsse, Hyperraum
Arcade-getreues Schiff mit 5 Segmenten (Cockpitbalken, Kerben), Schubflamme, Torpedos mit 2 × 2 px, Arcade-Reichweite und Wraparound, Dauerfeuer bei gehaltener SPACE, Hyperraum mit 25 % Todesrisiko. Extraleben alle 10.000 Punkte, gedeckelt bei 60.000; höchstens vier Lebenssymbole angezeigt.
Explosionen
Das Schiff zerbricht in fünf Trümmer (rev-4-Tabellen ShipExpVelTbl/ShipExpPtrTbl), Asteroiden explodieren in kurzlebige Punkte mit dem exakten Schrapnell-Muster des Automaten.
Game Over und Ergebnisse
Dreistufige Sequenz (Explosion → GAME OVER → HIGH-SCORES-Tabelle), 5 s Sperre, fünf beste Ergebnisse für die Sitzung im RAM.
3. Untertassen
Groß und klein
Zwei Untertassen mit aus dem Automaten übertragener Schuss-KI: Schüsse in 8 Richtungen oder Zielen auf das Schiff, Genauigkeit abhängig vom Punktestand, ab 35.000 Punkten nur noch die kleine.
Druck am Wellenende
ScrSpeedup: die Untertasse kehrt schneller zurück, wenn nur noch wenige Asteroiden übrig sind; AstBreakTimer blockiert ihr Erscheinen direkt nach einem getroffenen Asteroiden.
4. AY-3-8912-Sound
Der ursprüngliche Automat nutzte diskrete analoge Oszillatoren; die Effekte von Astéroric sind eine eigenständige Nachbildung auf dem PSG des Oric (keine Audiodaten von Atari wiederverwendet).
Player unter Interrupt
Der Sound wird von einer Routine unter dem Timer-1-IRQ des VIA mit 50 Hz abgespielt (jede zweite Aktualisierung mit 25 Hz), was die Hauptschleife entlastet. Der PSG-Zugriff ist geschützt (sei, eigener Scratch) — zwei Korruptionsfehler unter IRQ wurden gefunden und behoben.
Drei unabhängige Kanäle
Kanal A: Effekte (Schuss, S/M/L-Explosionen, Schub, Hyperraum, Extraleben); Kanal B: der Thump-Thump-Herzschlag, der sich mit der Asteroidenzahl beschleunigt; Kanal C: das durchgehende Piepen der Untertasse. Hardware-Hüllkurven (R11-R13) für natürliches Ausklingen.
Titel-Jingle
Beim Betreten des Titelbildschirms erklingt „In der Halle des Bergkönigs“ (Grieg, gemeinfrei), accelerando, legato, mit Oktavverdopplung auf Kanal B.
5. Titelbildschirm und Anzeige
A-Z-Vektorzeichensatz
Seit Phase 40 stellt ein vollständiger Vektorzeichensatz (src/font.c) „ASTERORIC“, „GAME OVER“, „PRESS SPACE“, „HIGH SCORES“, „WAVE“ und den CONTROLS-Bildschirm über eine generische Funktion text_draw dar.
Passive Demo
Wie am Automaten treiben Asteroiden hinter dem Titel; „PRESS SPACE“ blinkt; das Spiel wartet wirklich auf SPACE (kein zeitgesteuerter Start).
HUD
Punktestand in 7-Segment-Ziffern, Lebenssymbole, zweistellige Wellennummer.
6. Tastatur und Joystick
Direktes Tastatur-Scanning
Die Tastatur wird über den VIA und Register 14 des PSG spaltenweise gelesen, ohne den Tastaturpuffer des ROM — das Spiel hängt nicht vom Atmos-ROM $0265 ab. Die vollständige Matrix mit 64 Positionen (src/keys_tab.h) ist aus den ROM-Tabellen dokumentiert und auf Hardware validiert.
Konfigurierbare Tasten
Im Titelbildschirm öffnet K CONTROLS: LEFT, RIGHT, THRUST, FIRE, HYPER werden der Reihe nach eingegeben, Duplikate und unbekannte Positionen abgelehnt, ESC bricht ab und stellt wieder her. Die Belegung lebt im RAM (Standard nach dem Neuladen).
IJK-Joystick
Das IJK-Interface wird am Druckerport gelesen (VIA-Port A direkt, PB4-Strobe) mit einem Präsenzbit: ohne Interface wird die Lesung ignoriert. Das erste Protokoll (Lesen über den PSG) bildete ein falsches Emulatormodell nach und wurde nach Rückmeldung an einem physischen Interface korrigiert; Phosphoric wurde parallel korrigiert. Nicht neu belegbar.
7. Leistung
Das Budget beträgt etwa 40.000 Zyklen pro Bild bei 25 Hz auf einem 6502 mit 1 MHz.
Scheduler mit festem Schritt
Phase 28: fester Schritt mit Aufholen, getaktet vom Timer 1 des VIA (20 ms) — keine 60-ms-Ruckler mehr, konstante 25 Hz. Ein adaptiver 50-Hz-Modus wurde erprobt und verworfen.
Messungen
Anfängliches Zeichnen mit ~97 Zyklen/Pixel (Phase 2), seither durch Selbstmodifikation, byteweise Bündelung und vorgerenderte Sprites gesenkt; freie CPU-Zeit im Spiel von 17,9 % auf 39,8 % (Phasen 24-26). Profil make bench über 25 Millionen Zyklen.
Videosynchronisation
Die CB1-Leitung (VSync) ist am echten Oric-1 nicht verdrahtet: der Takt kommt vom freilaufenden Timer 1, nicht vom Videosignal.
8. Spezifikationen
| Element | Wert |
|---|---|
| Zielmaschine | Oric-1 48K, BASIC-1.0-ROM |
| Bildschirm | HIRES 240 × 200 monochrom, 50 Hz (Attribut $1E) |
| Bildrate | Konstante 25 Hz (Timer 1 des VIA, 20 ms) |
| Sound | AY-3-8912, 3 Kanäle, IRQ-Player mit 50 Hz |
| Eingabe | Tastatur (direktes VIA-Scanning, neu belegbar), IJK-Joystick (Druckerport) |
| Laden | asteroric.tap (~23 KB) mit Autorun-Flag, Code bei $0500 |
| Sprachen | C (cc65) + 6502-Assembler (ca65) |
| Lizenz | EUPL 1.2 (Originalcode); von Atari abgeleitete Elemente nicht erfasst |
9. Bauen und Tests
Voraussetzungen
cc65 ≥ 2.19 (cc65, ca65, ld65), Python 3 für die Tabellengeneratoren (ship_verts.s, shapes.s) und Phosphoric zum Starten, Aufnehmen und Profilieren (Pfad im Makefile anpassen).
Make-Ziele
make erzeugt build/asteroric.tap; make run / make run-joy starten unter Phosphoric (Tastatur / emulierter IJK); make test nimmt den Bildschirm headless auf; make check vergleicht Bit für Bit mit der versionierten Referenzaufnahme; make host-test baut und führt die x86-Host-Tests aus; make bench profiliert 25 M Zyklen.
Tests
Portable Host-Tests für den Pseudozufallsgenerator und die gemeinsame Tastentabelle (8 Assertions), Referenzaufnahme des Titelbildschirms bitweise verglichen, geskriptete Schussszenarien unter Phosphoric (--type-keys) für die Nichtregression von Tastatur/Joystick.
10. Bekannte Grenzen
Oric Atmos
Die .tap läuft nicht mit dem Atmos-ROM (BASIC 1.1), weder unter Phosphoric noch unter Oricutron. Nominalziel bleibt der Oric-1; Atmos-Kompatibilität ist ein eigener Sprint.
Nicht persistente Bestenliste
Die fünf besten Ergebnisse und die Tastenbelegung leben im RAM: beim Neuladen geht alles verloren. Speichern auf Kassette/Diskette steht auf der Roadmap.
Höchstens sechs Asteroiden
Grenze, um die 25 Hz zu halten; der Automat zeigt mehr.
Torpedos
Auf echter Hardware bleiben Torpedos bei hoher Geschwindigkeit trotz der Umstellung auf 2 × 2 px schwer zu sehen.