Tachibana

Astéroric — functies in detail

Studiekloon van Asteroids voor de Oric-1 48K · C + 6502-assembler (cc65) · EUPL 1.2-licentie

Deze pagina somt de functies van Astéroric op, met voor elke functie wat ze doet en hoe. De GitHub-repository (README, ROADMAP, CHANGELOG) blijft de actuele referentie; de handleiding beschrijft het gebruik.

Inhoud

1. HIRES-vectorweergave

Astéroric tekent alles — schip, asteroïden, schotels, torpedo's, letters, cijfers — met lijnsegmenten, zoals de arcadekast met vectorscherm, maar op het bitmap-HIRES-scherm van de Oric.

Monochrome HIRES-modus

240 × 200 pixels, PAPER 0 / INK 7. De tekenset wordt van $B400 naar $9800 gekopieerd en de drie onderste tekstregels worden opgeschoond. Het video-attribuut bij de init is $1E (HIRES 50 Hz, PAL): met $1C (60 Hz) vergrendelde een RGB2HDMI niet op het signaal van een echte Oric-1.

Bresenham in XOR

Elk segment wordt in XOR getekend: opnieuw tekenen wist het, zonder de achtergrond te bewaren. De routine draw_line_xor (src/asm/line.s) is zelfmodificerende assembler, met een apart pad voor zuivere verticalen en verwerking per byte op de horizontale as. Hoekpunten die segmenten delen worden maar één keer getekend (half-open Bresenham), anders zou de XOR ze opheffen.

Voorgerenderde sprites

Vormen die niet draaien (asteroïden, schotels, cijfers) worden voorgerenderd en in XOR geblit in plaats van segment voor segment hertekend — fase 26, die de vrije CPU-tijd naar 39,8 % bracht.

Anti-flikker

Wissen en hertekenen van elke entiteit staan dicht bij elkaar in de lus (erase → tick → draw per entiteit, vorige posities onthouden) om het venster te verkorten waarin een object van het scherm ontbreekt.

Subpixelbeweging

Schip en asteroïden in 8.8 vaste komma: fractionele snelheden en vloeiende banen ondanks het raster van 240 × 200. Het schip draait over 32 hoeken (11,25°) met voorberekende tabellen.

2. Arcadegetrouwheid

De spellogica is overgezet uit de disassemblage van de arcade-ROM rev 4 (6502disassembly.com): dezelfde CPU als de Oric, en de oorspronkelijke variabelenamen zijn behouden voor de traceerbaarheid.

Authentieke asteroïden

Vier vormen × drie groottes, hoekpunten uit de ROM gehaald (werk van Nick Mikstas), 11 tot 13 hoekpunten per vorm zonder decimatie. Maximaal zes asteroïden tegelijk (prestatielimiet).

Golven en fragmentatie

Oplopende golven met posities en snelheden uit de pseudowillekeurige generator van de arcade; een geraakte grote asteroïde geeft drie fragmenten, de ouder krimpt; fragmentsnelheid bijgesteld (fase 29) en algemene snelheid verlaagd (fase 37) na speeltests.

Cilinder en torus

De overgang van de ene rand naar de andere gebeurt door instantieduplicatie (een object op de rand wordt aan beide kanten getekend); botsingen worden in torustopologie berekend.

Schip, schoten, hyperspace

Arcadegetrouw schip met 5 segmenten (cockpitbalk, inkepingen), stuwvlam, torpedo's van 2 × 2 px met arcadebereik en wraparound, salvo bij ingedrukte SPACE, hyperspace met 25 % kans op de dood. Extra leven elke 10.000 punten, begrensd op 60.000; hoogstens vier levensiconen op het scherm.

Explosies

Het schip breekt in vijf brokstukken (tabellen ShipExpVelTbl/ShipExpPtrTbl van rev 4), asteroïden exploderen in kortstondige stippen met het exacte shrapnel-patroon van de arcade.

Game over en scores

Reeks in drie stappen (explosie → GAME OVER → HIGH SCORES-tabel), vergrendeling van 5 s, vijf beste scores in RAM bewaard voor de sessie.

3. Schotels

Groot en klein

Twee schotels met schiet-AI overgezet uit de arcade: schoten in 8 richtingen of gericht op het schip, precisie afhankelijk van de score, alleen de kleine boven 35.000 punten.

Druk aan het einde van de golf

ScrSpeedup: de schotel komt sneller terug als er nog maar enkele asteroïden over zijn; AstBreakTimer blokkeert haar verschijning vlak na een geraakte asteroïde.

4. AY-3-8912-geluid

De oorspronkelijke arcade gebruikte discrete analoge oscillatoren; de effecten van Astéroric zijn een oorspronkelijke nabootsing op de PSG van de Oric (geen audiogegevens van Atari hergebruikt).

Speler onder interrupt

Het geluid wordt afgespeeld door een routine onder de Timer 1-IRQ van de VIA op 50 Hz (om de andere update op 25 Hz), wat de hoofdlus ontlast. De PSG-toegang is beveiligd (sei, eigen scratch) — twee corruptiebugs onder IRQ zijn gevonden en verholpen.

Drie onafhankelijke kanalen

Kanaal A: effecten (schot, S/M/L-explosies, stuwkracht, hyperspace, extra leven); kanaal B: de thump-thump-hartslag die versnelt met het aantal asteroïden; kanaal C: het doorlopende gepiep van de schotel. Hardware-envelopes (R11-R13) voor natuurlijk uitsterven.

Titeljingle

Bij het betreden van het titelscherm klinkt “In de hal van de bergkoning” (Grieg, publiek domein), in accelerando, legato, met octaafverdubbeling op kanaal B.

5. Titelscherm en weergave

A-Z-vectorlettertype

Sinds fase 40 tekent een volledig vectorlettertype (src/font.c) “ASTERORIC”, “GAME OVER”, “PRESS SPACE”, “HIGH SCORES”, “WAVE” en het CONTROLS-scherm via één generieke functie text_draw.

Passieve demo

Zoals op de kast drijven er asteroïden achter de titel; “PRESS SPACE” knippert; het spel wacht echt op SPACE (geen start op tijd).

HUD

Score in 7-segmentcijfers, levensiconen, golfnummer met twee cijfers.

6. Toetsenbord en joystick

Directe toetsenbordscan

Het toetsenbord wordt via de VIA en register 14 van de PSG kolom voor kolom gelezen, zonder de toetsenbordbuffer van de ROM — het spel hangt niet af van de Atmos-ROM $0265. De volledige matrix van 64 posities (src/keys_tab.h) is gedocumenteerd uit de ROM-tabellen en gevalideerd op hardware.

Instelbare toetsen

Op het titelscherm opent K CONTROLS: LEFT, RIGHT, THRUST, FIRE, HYPER worden om de beurt ingevoerd, duplicaten en onbekende posities geweigerd, ESC annuleert en herstelt. De indeling leeft in RAM (standaardwaarden na herladen).

IJK-joystick

De IJK-interface wordt gelezen op de printerpoort (VIA-poort A rechtstreeks, PB4-strobe) met een aanwezigheidsbit: zonder interface wordt de lezing genegeerd. Het eerste protocol (lezen via de PSG) volgde een verkeerd emulatormodel en is gecorrigeerd na feedback op een fysieke interface; Phosphoric is tegelijk gecorrigeerd. Niet herindeelbaar.

7. Prestaties

Het budget is ongeveer 40.000 cycli per beeld op 25 Hz op een 6502 van 1 MHz.

Planner met vaste stap

Fase 28: vaste stap met inhaalslag, geklokt door Timer 1 van de VIA (20 ms) — geen haperingen van 60 ms meer, constante 25 Hz. Een adaptieve 50 Hz-modus is geprobeerd en verworpen.

Metingen

Aanvankelijk tekenen op ~97 cycli/pixel (fase 2), sindsdien verlaagd door zelfmodificatie, bundeling per byte en voorgerenderde sprites; vrije CPU-tijd in het spel van 17,9 % naar 39,8 % (fasen 24-26). Profiel make bench over 25 miljoen cycli.

Videosynchronisatie

De CB1-lijn (VSync) is niet bedraad op een echte Oric-1: het tempo komt van de vrijlopende Timer 1, niet van het videosignaal.

8. Specificaties

OnderdeelWaarde
DoelmachineOric-1 48K, BASIC 1.0-ROM
SchermHIRES 240 × 200 monochroom, 50 Hz (attribuut $1E)
BeeldfrequentieConstante 25 Hz (Timer 1 van de VIA, 20 ms)
GeluidAY-3-8912, 3 kanalen, IRQ-speler op 50 Hz
InvoerToetsenbord (directe VIA-scan, herindeelbaar), IJK-joystick (printerpoort)
Ladenasteroric.tap (~23 KB) met autorun-vlag, code op $0500
TalenC (cc65) + 6502-assembler (ca65)
LicentieEUPL 1.2 (oorspronkelijke code); van Atari afgeleide elementen niet gedekt

9. Bouwen en tests

Vereisten

cc65 ≥ 2.19 (cc65, ca65, ld65), Python 3 voor de tabelgeneratoren (ship_verts.s, shapes.s) en Phosphoric om te draaien, op te nemen en te profileren (pad aan te passen in de Makefile).

Make-doelen

make maakt build/asteroric.tap; make run / make run-joy starten onder Phosphoric (toetsenbord / geëmuleerde IJK); make test neemt het scherm headless op; make check vergelijkt bit voor bit met de geversioneerde referentieopname; make host-test bouwt en draait de x86-hosttests; make bench profileert 25 M cycli.

Tests

Draagbare hosttests op de pseudowillekeurige generator en de gedeelde toetstabel (8 asserties), referentieopname van het titelscherm bit voor bit vergeleken, gescripte schietscenario's onder Phosphoric (--type-keys) voor de non-regressie van toetsenbord/joystick.

10. Bekende beperkingen

Oric Atmos

De .tap werkt niet met de Atmos-ROM (BASIC 1.1), noch onder Phosphoric noch onder Oricutron. Het nominale doel blijft de Oric-1; Atmos-compatibiliteit is een aparte sprint.

Niet-persistente beste scores

De vijf beste scores en de toetsindeling leven in RAM: alles gaat verloren bij herladen. Opslag op cassette/diskette staat op de roadmap.

Hoogstens zes asteroïden

Limiet om de 25 Hz te houden; de arcade toont er meer.

Torpedo's

Op echte hardware blijven torpedo's op hoge snelheid slecht zichtbaar, ondanks de overstap naar 2 × 2 px.

← Astéroric · Handleiding →