Előzmények
Nem túl rég spontán két Commodore 64C változattal gazdagodott a retro gyűjteményem. A padláson leltem rájuk, restauráltam és megjavítottam őket. A történetről két korábbi bejegyzésben részletesen írtam. Miután életre keltek azonnal adódott a kérdés, innen hogyan tovább? Egy C64 önmagában egy villogó kurzor a képernyőn és egy billentyűzet, amelyen keresztül unalmas parancsokat lehet kiadni, esetleg programokat lehet írni és futtatni BASIC nyelven. De önmagában ennek semmi értelme, mert a hardver képességeiből nem sok mindent lehet így megmutatni, ráadásul kikapcsoláskor minden elvész. Ahhoz, hogy valami értelmeset lehessen vele kezdeni, minimum kell valamilyen háttértároló, egy kazettás magnó, vagy egy floppy meghajtó, esetleg egy bővítőkártya. Nekem sajnos egyik sem volt.
Megoldhattam volna a problémát egy háttértároló eszköz beszerzésével, de őszintén megmondom abban semmi kihívás nem lett volna. Én jobban szeretem a kreatív dolgokat, és inkább láttam meg ebben egy újabb DIY projektet, amely megnöveli a dopamin szintemet.
Koncepció
Az elképzelés az volt, hogy letöltök Commodore 64 programokat a netről egy internet kapcsolattal rendelkező számítógépre, majd valahogy áttöltöm azt a Commodore 64 memóriájába. A Commodore 64-nek több portja is létezik, amelyen keresztül kapcsolódni képes a külvilághoz. Ezek közül a legegyszerűbbnek az IEC soros port tűnt, mivel a floppy meghajtó is ezen keresztül kapcsolódik a számítógéphez. A porthoz egy 6-pólusú DIN csatlakozóval lehet kapcsolódni. Szerencsére ilyen dugóm volt itthon.
Az alábbi követelményeket állítottam fel:
- A Commodore 64-et lehessen összekötni az IEC soros porton keresztül egy PC-vel.
- Az itthon fellelhető alkatrészekből meg lehessen építeni.
- Prototípus szintű megvalósítás elegendő.
Tervezés
A fenti elképzelés megvalósítása két részre osztható: hardver illesztés, valamint szoftver implementáció. Szükség van egy olyan hardverre, amely segítségével a Commodore 64 IEC soros buszát fizikailag össze lehet kötni a PC USB portjával. Emellett szükség van egy olyan szoftverre, amely alacsony szinten képes értelmezni a Commodore 64 által megvalósított IEC soros adat protokollt, a felső szinten pedig a CBM DOS fájl protokollt. Természetesen ehhez még szükség van egy PC oldali illesztő szoftverre is, amely gyakorlatilag egy olyan fájlszervert valósít meg, amely képes emulálni egy floppylemez tartalmát. Ha ezt összerakjuk, akkor gyakorlatilag egy virtuális 1541 floppy meghajtót kapunk.
A hardver
Az illesztés alapja egy Arduino Uno lett, amely alapértelmezetten biztosítja az USB porton keresztüli kapcsolódást egy PC-hez. Már csak az IEC oldali illesztés megvalósítása volt kérdéses. Itt egy kis overengineering becsúszott, ugyanis végül terveztem egy tranziens túlfeszültség-védelem és jelalak stabilizáló áramkört, amely egyrészről védi az Arduino portjait, másrészről stabilabb jelátvitelt tesz lehetővé.
| IEC interfész |
A túlfeszültség-védelmet Schottky diódák valósítják meg, a jelalak stabilizálást pedig Schmitt trigger kapuk. Mivel az IEC soros busz egy open-collector alapú busz, ezért két különálló NPN tranzisztorral oldottam meg a visszafele irányú kommunikációhoz kapcsolódó buszvezérlést. Elvileg ezt meg lehetett volna spórolni, közvetlenül az Arduino portjait is fel lehetett volna használni, viszont a különálló tranzisztoros megoldás szintén az Arduino túlterhelés elleni védelmét szolgálja, ugyanis annak portjai maximum 50 mA-t képesek elnyelni. Elméletileg ha 10-nél több eszköz kapcsolódik az IEC soros portra a standard 1 kohm felhúzó ellenállással, akkor a terhelés ezt a határt már meghaladná.
| Az IEC interfész alkatrészei |
Az adaptert egy prototípus nyákon összeforrasztottam, illetve készítettem egy soros portba dugható kábelt, amelyet az illesztő áramkörön keresztül az Arduino-hoz kapcsoltam.
| IEC-USB adapter |
A szoftver
Mi fejlesztők azt mondjuk, hogy a hardver a test, a szoftver pedig a lélek. A hardver szoftver nélkül egy élettelen test. A szoftver hardver nélkül pedig egy megfoghatatlan semmi, egy teória. Jelen esetben a szoftverre igen sok feladat hárul.
Az IEC soros protkoll egyrészről nem publikus, másrészről nagyon fontos időzítéseken alapul. Szerencsére szorgalmas emberek visszafejtették, dokumentálták, és nem mellesleg implementálták is. A port kialakításáról és működéséről az alábbi helyeken találunk részleteket:
- https://www.c64-wiki.com/wiki/Serial_Port
- https://retro-bobbel.de/zimmers/cbm/programming/serial-bus.pdf
Szerencsémre az IEC soros protokollt David Hansel cross-platform implementálta több népszerű mikrovezérlőre, így Arduino Uno-ra is, amely nagyban megkönnyítette a dolgomat. A library-n alapulva írtam egy firmware-t, amely kezeli a Commodore 64 irányából érkező IEC soros kommunikációt, valamint a rá épülő fájl transzfer műveleteket továbbítja a PC felé UART-on keresztül.
Az eddig elkészült hardver és szoftver megoldásokkal a kommunikációt sikerült elvinni a PC oldalig. Ami hiányzott az a PC oldali implementáció. Meg kellett oldani, hogy a Commodore felől érkező CBM DOS fájl műveletek legyenek kiszolgálva a PC fájl rendszeréből.
Ehhez készült egy fájl szervert megvalósító PowerShell script. A szerver konfigurációja tartalmazza annak a PC oldali mappának az útvonalát, amelyen belül a Commodore 64 programok elhelyezésre kerültek, a soros port azonosítóját, amelyen keresztül az IEC-USB adapter elérhető, valamint opcionálisan az IEC Device ID-t, amelyen a Commodore 64 látja a file storage eszközt. Ez a floppy meghajtó esetében alapértelmezetten a 8-as érték, de ezt igény esetén felül lehet definiálni.
| A fájlszerver letöltés közben |
| Fájl katalógus |
A végén a PowerShell scriptet átírtam Python-ra, hogy a fájlszerver linuxon is futtatható legyen, így a NAS szerverem is képes Commodore 64 programok kiszolgálására.
Összefoglalás
Adott volt egy probléma, amely megoldására több lehetőség létezik. Én a mérnöki megközelítést választottam, mert ez okozott számomra örömöt. Képzeljétek el, hogy ott van előttetek egy működő Commodore 64, de nincs eszközötök, és médiátok sem, amivel a régi ismert, de már nagyon rég látott játékokat, programokat életre tudnátok kelteni rajta. Nem adjátok fel, hanem elkezd dolgozni az elmétek és kifundáljátok, hogyan tudnátok ezt megoldani kreatívan, majd leküzdve számos akadályt megvalósítjátok az elképzeléseteket. A jutalom pedig nem más, mint az, hogy egy héttel később sikerül rátöltened a saját magad által alkotta megoldással az első programot a C64-re, elindítani és látni, ahogy életre kel előtteted az egész.
És végül meg tudtam mutatni a lányomnak, hogy milyen játékokon játszottunk a mi időnkben.
Néhány program a sok közül, amelyeket 40 év után ismét muszáj volt elindítani: Ghost Busters, Invaders, Boulder Dash, Trail Blazer, Pac-Man, Arkanoid...
| A lányom játszik az Arkanoiddal |
A projekt GitHub-on itt érhető el: https://github.com/fox20io/c64-fdemu
És már jött is a következő probléma, amelyet muszáj ismét elhárítani: a legjobb játékok csak joystick-el használhatók :) Hát persze, hogy nincs joystick-om sem. Vehetnék egyet vagy kettőt, de abban megint nincs semmi kihívás. Úgyhogy építeni kell. A következő posztban erről fogok írni.
Megjegyzések
Megjegyzés küldése