Een speciale computer om kinderen te interesseren voor coderen; wij hebben hem kunnen bemachtigen. Met een aanschafprijs van 299 dollar inclusief toetsenbord ligt hij binnen ieders handbereik. Je moet er dan wel zelf nog een beeldscherm bij aanschaffen of hem aansluiten op je TV. Hoe eenvoudig is het coderen? Linux Magazine ging aan de slag!

Onze nieuwste computeraanwinst heeft een snelle 8-bit 6502 processor op iets meer dan 1,1 MHz. Het ingebouwde 20KB ROM en 5KB RAM geheugen is wellicht wat weinig, maar het is uitbreidbaar tot 32KB. Het systeem heeft een ingebouwde composite-aansluiting en een bus voor cartridges. Gecombineerd met het geavanceerde ROM-gebaseerde besturingssysteem, zijn grafische applicaties in maximaal 16 kleuren met een resolutie van 176 × 184 pixels en met geluid (mogelijk gemaakt door 4 geluidssynthesizers), is dat geen enkel probleem. Beeld en geluid worden aangestuurd door de closed source Video Interface Chip (VIC), die zelf ontwikkelt is door de fabrikant. 

 

BASIC 2.0 en 6502-assembler

Het systeem boot snel en toont dan het ietwat karige groenblauwe bureaublad, met een grijs kader waarop de cursor staat te knipperen. Je bedient het OS default vanaf de console, maar dat zijn wij als Linux-mensen wel gewend. De console ondersteunt 22 karakters op elke regel en 23 regels per scherm (dat is 8 bij 8 pixels per karakter). De meegeleverde programmeertaal is BASIC 2.0, waar je (zonder de uitbreiding) 3.583 bytes beschikbaar geheugen voor vrij hebt. Wij prefereren assembler, want met die taal leer je het systeem pas echt goed kennen en gebruik je het geheugen optimaal.

 

Hello you

We gaan een applicatie schrijven, die de tekst Hello world op het scherm toont. Niet meteen een uitzonderlijke app, maar wel een klassieker uit “The C Programming Language” geschreven door Kernighan & Ritchie in 1978. We maken gebruik van één van de 39 subroutines van de kernal van het besturingssysteem. Deze kernal is in ROM opgeslagen en gebruikt de hoogste bits in het 64Kb adresgeheugengebied, van hexadecimaal $E000 tot en met $FFFF. We roepen een kernal-subroutine om een karakter op het scherm te plaatsen (op adres $FFD2). De subroutines en ook de instructies van de 6502 zoek je bijvoorbeeld op in de documentatie van de processor of van de computer.

Het beste codeer je op het systeem in Mnemonic van de assembler. Een goede gewoonte is het om de code meteen te documenteren, dat kan door een ;-teken achter de regel te plaatsen. Als eerste laden we de accumulator – het A-register – met de ASCII-code van de letter H:

 

LDA #$48; laad register A met de letter H

 

We plaatsen het zojuist geladen karakter op het scherm met de subroutine op adres $E716:

 

JSR $FFD2 ; spring naar subroutine chrout to screen

 

We herhalen deze laatste twee regels voor het karakter e:

 

LDA #$45; laad register A met de letter E

JSR $FFD2 ; spring naar subroutine chrout to screen

 

En datzelfde doen we voor alle andere karakters in “Hello world”; je snapt het idee. We eindigen ons assemblerprogramma door de subroutine te verlaten:

 

RTS; verlaat subroutine

 

We kunnen zo snel geen IDE vinden voor assembler op dit systeem, dus we voeren de code in via BASIC 2.0. Het eerste wat we dan handmatig moeten doen, is elke instructie omzetten naar een hexadecimale code. JSR is $20, LDA is $A9 en RTS is $60. Adressen moeten worden weergegeven van laag naar hoog, zo wordt JSR $FFD2 omgezet naar $20 $D2 $FF.

Ons assemblerprogramma ziet er dan als volgt uit (allemaal enen en nullen, hexadecimaal weergegeven): $A9 $48 $20 $D2 $FF $A9 $45 $20 $D2 $FF enzovoort, eindigend met $60. In BASIC 2.0 kunnen we geen hexadecimale getallen invoeren, dus ons assemblerprogramma ziet er omgezet naar decimaal als volgt uit: 169 72 32 210 255 169 69 32 210 255 enzovoort, eindigend met 96. Met een BASIC 2.0 app voeren we het gemaakt assemblerprogramma in op de console van het systeem:

 

10  REM HELLO WORLD APP VOOR DE 6502 

20  ADR = 828

30  FOR L = 0 TO 58

40       READ MACH

50       POKE ADR + L, MACH

60   NEXT L

90   REM 6502 ASSEMBLER CODE 

100 DATA  169, 082, 032, 210, 255, 169, 065 

110 DATA  032, 210, 255, 169, 083, 032, 210

120 DATA  255, 169, 080, 032, 210, 255, 169

130 DATA  066, 032, 210, 255, 169, 069, 032 

140 DATA  210, 255, 169, 082, 032, 210, 255

150 DATA  169, 082, 032, 210, 255, 169, 089

160 DATA  032 ,210 ,255, 169, 080, 032, 210

170 DATA  255, 169, 073, 032, 210 ,255, 076

180 DATA  060, 003, 096

 

We voeren het BASIC-programma uit met RUN. Er verschijnt behalve READY niets op het scherm, omdat hiermee alleen de assemblercode in het geheugen is geladen (we spreken van “poken”, uitlezen van geheugen heet “peeken”). De assemblercode begint op adres 828 decimaal. We starten onze Hello world-app met: SYS 828 en inderdaad wordt door de machinecode de gewenste tekst op het scherm gezet.

Het andere OS waar we op draaien is Commodore Kernal/Commodore BASIC 2., ontwikkeld in 1981. De naam kernal is correct, het verhaal gaat dat dit eigenlijk een eenmalige tikfout is geweest, die daarna blijvend is overgenomen in alle communicatie en documentatie. 

 

Verjaardag

Deze rubriek “Het Andere OS” is een klein eerbetoon aan Commodore. Het is begin dit jaar de 35ste verjaardag van de Commodore VIC-20. Begin 1981 kwam Commodore op de markt met een betaalbare thuiscomputer, die destijds de rol vervulde die vandaag de dag voor de Raspberry Pi is weggelegd. Het is dus indirect tevens een ode aan de Raspberry Pi, die begin van dit jaar vier jaar jong is geworden. 

 

Emulatie op Linux

Heb je geen Commodore VIC-20? Geen probleem, want deze thuiscomputer wordt bijzonder goed geëmuleerd door VICE! Installeer VICE op je Linux-systeem met: 

 

sudo apt-get install vice

 

Wat je nog mist, zijn de ROM’s van de thuiscomputer. Download het zip-bestand van de Windows-versie van VICE, want daar worden de ROM’s wel meegeleverd. Pak dit zip-bestand uit en plaats de directory op het bureaublad. Kopieer dan drie bestanden:

 

sudo cp ~/Bureaublad/WinVICE-2.4-x64/VIC20/kernal /usr/lib/vice/VIC20 

 

Herhaal dit voor de ROM-bestanden basic en chargen.  De VIC-20 emulator start nu vanaf de opdrachtregel op met xvic.

Overigens kun je met VICE ook de voorloper van de VIC-20 emuleren, de Commodore PET (commando xpet), maar ook enkele opvolgers, zoals de Commodore 64 (commando x64) en de Commodore 128 (commando x128). Denk eraan dat je weer de betreffende ROM-bestanden vooraf kopieert van en naar de juiste directories. Ons assemblerprogramma draait op alle vier deze computers, omdat ze allen een 6502- of een compatibele 6510-processor bevatten.

 

Emulatie op de Raspberry Pi

VICE doet het ook op je Raspberry Pi en is tevens onderdeel van RetroPie. Heb je toevallig nog een defecte Commodore-computer thuis liggen? Bouw dan de Raspberry Pi in de behuizing, en “repareer” zo je defecte retro-computer. Draai de Commodore Kernal gewoon geëmuleerd en oude tijden herleven. 

 

Quiz!!!

Je kunt er geen prijs mee winnen, maar wel een vermelding in onze lezersrubriek met eeuwige roem. Het afgedrukte assembler programma is aangepast en toont geen Hello world meer. Wat doet het programma wel? Probeer het uit op je op bijvoorbeeld Ubuntu, MINT of Raspbian geëmuleerde VIC-20, of Commodore PET/64/128 en laat ons weten welke twee aanpassingen we gedaan hebben in het oorspronkelijk assemblerprogramma. Stuur eventueel een schermafdruk mee van het resultaat, gemaakt op één van de Commodores.