Retrocomputing by Macc Magyar English

Port · 2025 · AI kísérlet

Back to the PET.

A shiru8bit Commodore PET-re írt PETSCII demójának portolása Commodore 64-re, Kick Assemblerben. A kérdés nem az volt, hogy megoldható-e, hanem hogy mennyit bír el belőle egy nyelvi modell — a portot ugyanis végig Claude Opus 5 írta.

Az eredmény működik: mind a tizenöt effekt fut, a zene szól, és a demó végigmegy az elejétől a végéig.

FORRÁS Commodore PET CÉL Commodore 64 NYELV 6510 ASM / Kick IDŐ kb. 2,5 óra
Az eredeti demó — shiru8bit A port forrása — GitHub

2025. szeptember

Az eredeti demó a Commodore PET-en fut: negyven oszlop, huszonöt sor, semmi szín, semmi sprite, semmi raszter­megszakítás. Csak PETSCII karakterek, amiket a kód elég gyorsan pakol a képernyőmemóriába ahhoz, hogy mozgásnak lássuk. Pont ezért jó portolási feladat: nincs benne semmi, ami a PET egyedi hardveréhez kötné — a képernyőn kívül.

A demó címképe C64-en
A címkép — már a C64-en, a PET karakterkészletével

A trükk: a képernyő marad a $8000-en

A PET a képernyőmemóriát a $8000-re teszi. A C64 alapból a $0400-ra — de ha a VIC-et a 2-es bankra állítjuk, a képernyő ugyanoda kerül, mint a PET-en. Ez az egyetlen döntés viszi el a port nagy részét: az effektek, a sortáblák, a jelenetek memóriakiosztása egyetlen sort sem igényelt ebből a szempontból.

Ezért maradt tizenöt effektből tizenhárom szó szerint úgy, ahogy az eredetiben volt. A maradék kettő is csak ott változott, ahol a PET hangchipjét szólította meg.

Karakterkészlet

A demó nem működik a C64 saját betűivel: a PET karakterkészlete kell hozzá, különben rossz karakterek jelennek meg. Ez RAM-ba másolva, a $8800-on ül. Egy csavarral: a PET hardveresen fordította meg a karaktereket (inverz videó), a C64 nem. A $80$ff tartománynak valódi, megfordított rajzolatként kell léteznie — az effektek sűrűségtáblái ugyanis a $a0-t tekintik a legsötétebb karakternek. Így csak a 128 eredeti rajzolat utazik a fájlban, a másik felét indításkor egy EOR-ciklus gyártja le.

Matrix effekt
A zöld karakterek inverz PETSCII glyphek — a futásidőben gyártott felükből

Hang: a 6522-től a SID-ig

A PET-en nincs hangchip. A hangot a 6522 shift regisztere adja: egy 8 bites mintát kitol a CB2 lábon, amit egy időzítő üteme határoz meg. Ez — ha jobban megnézzük — nem más, mint egy impulzus­hullám, aminek a kitöltési tényezője a bitminta, a frekvenciája pedig az időzítő periódusa. Vagyis pontosan egy SID pulse hang, kerülőúttal.

A zene ezért nem újraírt, hanem az eredeti adat szólal meg: ugyanaz a becsomagolt dallamtábla, ugyanaz a lejátszó, csak a két rutin cserélődött ki, amelyik a vasat fogta meg. A hangmagasság a helyén van: felvételről visszamérve minden két képkockánál hosszabb hang 1,1 centen belül szól.

Két jelenet a zene leállítása után maga csinál hangot. Az egyik zajt (a shift regisztert gyorsabban írja újra, mint ahogy hangmagasságként hallanánk — ez a SID zaj hullámformája lett), a másik beszédet, 1 bites digiként. Utóbbi a C64 $d418 hangerő-digijére fordul, és a mintavételi frekvencia ciklusra pontosan ugyanaz maradt: a SID-írás két ciklusát a ciklus saját töltelék­utasításaiból vettük vissza.

Hullám effekt
Karakteres hullámok — az effekt logikája egy az egyben az eredeti

A memória, ami épphogy kifér

Az eredeti azért fér el egy 32K-s PET-ben, mert a becsomagolt adat szándékosan átfed azzal a területtel, ahova a jelenetek kicsomagolódnak: ami elsőként fogy el, az van legfelül, így egy jelenet mindig csak olyasmit ír felül, amivel a demó már végzett. Emiatt nem is indítható újra újratöltés nélkül — sem az eredeti, sem ez.

Ez a port legtörékenyebb öröksége, ezért nem bizalmi kérdés: minden fordításnál végigfut egy ellenőrzés a demó tényleges jelenetsorrendjén, és elhasal, ha bármelyik jelenet olyasmire íródna rá, amire még szükség van — vagy a saját tömörített forrására.

Ami nem azonos

A PAL C64 50 Hz-cel jár a PET 60 Hz-e helyett, így az egész demó nagyjából 17%-kal lassabb — kép és zene együtt, mert mindkettő képkockához kötött. A beszéd-digi negyed hangköznyivel mélyebb, mert a C64 PAL órajele nem kerek megahertz. És a $d418-digi 6581-en hangos, 8580-on halk — ez a chip, nem a kód.

A PET arca
„Only Commodore PET makes it possible”

Az intró

Egy jelenet van, aminek nincs PET-es eredetije. Az eredeti demó azzal indul, hogy kigördíti a képernyőt — a PET-en a bekapcsolási üzenetet. A C64-en nem volt mit kigördíteni, így most egy oldalnyi szöveg kerül oda: karakterenként, képkockánként kiírva, villogó kurzorral, terminál módra, majd egy billentyűre vár. Aztán pontosan úgy gördül ki, ahogy az eredeti üzenet.

Az intró oldal
Az intró — ez gördül ki a demó elején

És a kísérlet?

A port — kód, dokumentáció, hangmunka, ellenőrző eszközök — nagyjából két és fél óra alatt készült el, végig Claude Opus 5-tel. Az érdekes rész nem az, hogy fordított: az effektek átalakítása gépies munka. Az érdekes az volt, ahol dönteni kellett — hogy a képernyő maradjon a $8000-en, hogy a zenei lejátszót ne kicsapni kelljen hanem átvinni, mert a jelenetek az ő jelzéseire lépnek tovább, és hogy a hangmagasságot ne fülre, hanem felvételről visszamérve kelljen igazolni.

A teljes forrás, a portolási jegyzet és az ellenőrző eszközök a GitHubon vannak. A demó érdeme viszont változatlanul shiru8bit-é: az effektek, a grafika és a zene mind az övé — ez itt csak átköltöztetés.

shiru.untergrund.net github.com/AbelVincze/Backtothepet-c64-ai-port