Tachibana

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

ElementWert
ZielmaschineOric-1 48K, BASIC-1.0-ROM
BildschirmHIRES 240 × 200 monochrom, 50 Hz (Attribut $1E)
BildrateKonstante 25 Hz (Timer 1 des VIA, 20 ms)
SoundAY-3-8912, 3 Kanäle, IRQ-Player mit 50 Hz
EingabeTastatur (direktes VIA-Scanning, neu belegbar), IJK-Joystick (Druckerport)
Ladenasteroric.tap (~23 KB) mit Autorun-Flag, Code bei $0500
SprachenC (cc65) + 6502-Assembler (ca65)
LizenzEUPL 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.

← Astéroric · Handbuch →