BASICODE: softwaredistributie via radiouitzendingen in de jaren ’80 (geplaatst 2020-07-04)
In 2009 begon ik al mijn oude cassettebandjes te digitaliseren. Nu mijn laatste computer die nog een audio lijn-in poort heeft aan z’n pensioen toe is leek me dit het moment om dat project af te ronden. Misschien meer daarover op een later moment. Het blijkt dat er op sommige van die oude cassettes nogal vreemde dingen staan, inclusief radiouitzendingen met computerprogramma’s.
Lees hieronder hoe ik de Hobbyscoop jubileum-beeldkrant op een 31 jaar oude cassette wist te runnen op een moderne computer.
Huiscomputers uit de jaren ’80 hadden geen opslag in de vorm van een harddisk of zelfs een ingebouwde diskdrive. En een Commodore 64 floppydrive kostte hier in Europa net zo veel als de computer zelf. Het was dus gebruikelijk om een goedkope cassette-drive te gebruiken om programma’s en data op te slaan op cassette. Het was natuurlijk mogelijk om commerciële software te kopen of kopiëen uit te wisselen met vrienden. Maar zonder modem, die pas rond 1990 verschenen, was er geen goede manier om data uit te wisselen met een groep gelijkgestemden. Wat ook niet hielp is dat er veel verschillende huiscomputers waren en ze werkten allemaal anders.
Allebei deze problemen werden geadresseerd door BASICODE. Dit was een kleinste gemene deler van de BASIC-programmeertaal waarmee alle huiscomputers uitgerust waren. Voor de essentiële functies die niet in deze subset voorkwamen had BASICODE een verzameling gestandaardiseerde subroutines. Dus als je BASICODE-programma’s wilde draaien dan was het enige wat je hoefde te doen subroutines te schrijven voor het schoonmaken van het scherm en het positioneren van de cursor en dergelijke voor jouw specifieke computer. En dan kon je alle BASICODE-programma’s draaien.
Maar dan moest je ze wel eerst zien te krijgen. Oplossing: een gestandaardiseerd cassette-dataprotocol. BASICODE voor een bepaalde computer kon normaliter BASICODE van cassette lezen en ernaar schrijven. Er waren ook adaptertjes voor de seriële poort. We kunnen tegenwoordig BASICODE decoderen van WAV files. Hiervoor haalde ik pvtmert/minimodem op via Docker en gebruikte het volgende om mijn opnames te decoderen:
docker run --rm -ti -v /Volumes/video/rips:/rips pvtmert/minimodem minimodem -f /rips/basicode.wav --rx -q -S 1200 -M 2400 --stopbits 2 1200 |LC_ALL=C tr '200-377' '000-177' >basicode.txt
(Het tr commando het hoge bit op 0 dat op 1 staat volgens het BASICODE-protocol.)
Naast een selectie van ingezonden BASICODE-programma’s zond het radioprogramma Hobbyscoop ook een wekelijkse nieuwsbrief uit in de vorm van een BASICODE-programma. En het blijkt dat ik de jubileum-beeldkrant nummer 250 uit 1989 op een cassette heb staan. Dit is hoe het programma binnenkwam vanaf de cassette.
Na enigszins After opschonen wilde ik het progrmma runnen op mijn C64 Mini, maar al mijn pogingen om via Google ergens de C64 BASICODE-routines te vinden waren vruchteloos. Dus heb ik die zelf maar geschreven. Je kan het resulterende .prg-bestand hier vinden als je het programma zelf wilt draaien. Of probeer dat hier met een Javascript BASICODE-interpreter.
Interessant om het hoofdstuk Delfts Blauw in de beeldkrant te lezen, over de overgang van van mechanische naar digitale of in elk geval semi-elektrische telefooncentrales. Zie hier voor een HTML-versie van alleen de tekst van de beeldkrant.
Vervolgens besloot ik te zien hoe moeilijk het zou zijn om BASICODE te runnen in Python. Je kan de resulterende code hier zien. Afgezien van wat kleine syntax-verschillen zijn veel BASIC-commando’s hetzelfde in Python, en het is makkelijk genoeg om de meeste die ontbreken toe te voegen met een paar regels code. Het grote verschil is dat je in BASIC zelf je programma moet structureren met GOTO-commando’s terwijl moderne programmeertalen zoals Python veel gestructureerder zijn en geen GOTO hebben. Daarnaast zijn in BASIC alle variabelen globaal. Het overzetten is dus redelijk simpel, maar niet helemaal triviaal.
De meeste tijd was ik kwijt met het goed werkend krijgen van het inlezen van de huidige cursorpositie. In xterm gaat dit door het naar de terminal sturen van een ANSI escape-reeks, waarop je er een terugkrijgt die je moet inlezen van stdin. Typisch genoeg was dit ook het lastigste deel bij de C64-subroutines, waar ik uiteindelijk een KERNAL systeem-routine moest aanroepen om dit voor elkaar te krijgen.
door Iljitsch van Beijnum.