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
| Onderdeel | Waarde |
|---|---|
| Doelmachine | Oric-1 48K, BASIC 1.0-ROM |
| Scherm | HIRES 240 × 200 monochroom, 50 Hz (attribuut $1E) |
| Beeldfrequentie | Constante 25 Hz (Timer 1 van de VIA, 20 ms) |
| Geluid | AY-3-8912, 3 kanalen, IRQ-speler op 50 Hz |
| Invoer | Toetsenbord (directe VIA-scan, herindeelbaar), IJK-joystick (printerpoort) |
| Laden | asteroric.tap (~23 KB) met autorun-vlag, code op $0500 |
| Talen | C (cc65) + 6502-assembler (ca65) |
| Licentie | EUPL 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.