A Soggy projekt keretében a szerző egy saját fejlesztésű SG-1000 klónon, a Soggy-1000-en kíván egy Forth rendszert elindítani, hogy egy általa kontrollált, szerzői jogi aggályoktól mentes, interaktív programozási környezetet hozzon létre. A Sega SG-1000 konzol és az SC-3000 számítógép lényegében azonos hardverre épül, így a konzolhoz csatlakoztatott billentyűzettel gyakorlatilag számítógéppé alakítható, amin még egy korlátozott BASIC is fut. Mivel a szerző eredeti SC-3000 gépe törékeny és romló állapotú, saját klónt épített, amely kompatibilis az SG-1000 billentyűzetével. A Sega BASIC korlátai miatt döntött úgy, hogy inkább egy Forth interpretert implementál, mivel a Forth minimalista, beágyazott rendszerekben elterjedt nyelv, könnyen elindítható, lépésenként bővíthető egy parancssori felületen keresztül, és gyakran integrált assemblert is tartalmaz, ami lehetővé teszi assembly programok írását közvetlenül a hardveren. A projekt a RetroChallenge 2026/10 keretében készül, amelynek szabályai szerint a munkát nem lehet korábban elkezdeni, így a cikk a kihívás kezdetén jelenik meg, és elsősorban bevezetőként szolgál a célok megértéséhez.
A Forth portolásához a szerző a GPL-licencű CamelForth-80 implementációból indult ki, amely eredetileg CP/M-80 alatt fut, de a szerzője részletes útmutatót ad a ROM-alapú, önálló működéshez szükséges módosításokhoz. Ehhez saját hardverinicializálást kellett írni (TMS9918 VDP, veremmutató), egy reset kezelőt, valamint a három CP/M-függő szót – KEY, KEY? és EMIT – Z80 assemblyben újraimplementálni. Az eredeti forráskód a Z80MR assemblerhez készült, ezért a szerzőnek át kellett portolnia a zasm assemblerre, ami több akadályba ütközött: a makrók passzkezelése eltért, a head és immed makrókat szét kellett bontani, bizonyos karaktereket (például a < jelet) escape-elni kellett, az idézőjeleket és vesszőket tartalmazó szavak neveit pedig át kellett írni, mivel a zasm másképp értelmezte őket. Végül a --casefold opcióval sikerült kezelni a kis- és nagybetűk közötti eltéréseket, és a kód lefordult.
Az EMIT implementálása komoly kihívást jelentett, mivel a TMS9918 VDP nem támogat hardveres görgetést. A szerző a Graphics 1 módot választotta (32×24 tile-os kijelzés), és a VDP videomemóriáját használta képernyőpufferként, hogy ne foglaljon el értékes rendszermemóriát – ez különösen fontos, mivel az eredeti SG-1000 mindössze 1 KB RAM-mal rendelkezik. A görgetést egy egyszerű ciklussal oldotta meg, amely soronként másolja a karaktereket, és kiüríti az utolsó sort. A backspace és a sortörés különleges esetekként kerültek implementálásra; utóbbinál a szerző felismerte, hogy a 32 hatványsága miatt a modulo művelet helyett bitenkénti ÉS-sel is kiszámítható a következő sor eleje. Végül a QUIT szó ismételt meghívásának rejtélyét is megoldotta: a CPMACCEPT szót kellett ACCEPT-re cserélni, ami a KEY szót használja. A billentyűzetkezelő részleges implementálásával sikerült egy saját szót (AAAA) definiálni és meghívni a rendszeren, ami igazolta a működést. A RetroChallenge hátralévő részében a billentyűzetkezelés befejezése, majd opcionális célként a TMS99xx/SN76489 grafikai és hangszavak hozzáadása, a 32K RAM és lapozás kihasználása, a hosszú távú tárolás megoldása, valamint egy hasznos Forth kazetta elkészítése szerepel a tervek között.
Ez a cikk a Neural News AI (V1) verziójával készült.
Forrás: https://www.leadedsolder.com/2026/10/01/rc2026-10-sg1000-forth-port.html.
A képet Sean Kuriyan készítette, mely az Unsplash-on található.
