Micro-Professor MPF-1 en het programmeren in Z80 assembleertaal

Microprofessor advertentie

Er was een tijd dat er geen iPads en Macintoshes waren en beide Apple Computer medewerkers nog vanuit de garage van Steve Jobs werkten. In die tijd (het zal 1981 zijn geweest) kwam Multitech (later Acer genoemd) met zijn eerste computer-voor-onderwijsdoeleinden op de markt: de Micro-Professor MPF-1. Ook Nederland was goedbedeeld als het ging om de beschikbaarheid van deze ‘unieke leer- en experimenteercomputer’, die voor zo’n 400 gulden inclusief BTW en verzendkosten (nu zo’n 1000 euro) in de handen van de nieuwsgierige hobbyist terecht kwam. En laten we eerlijk zijn: het wás een unieke computer, met experimenteermogelijkheden die ook vandaag de dag niets aan waarde hebben ingeleverd.

De MPF-1 is een microprocessorsysteem gebaseerd op een Zilog Z80. De kleine printplaat bevat de 1,7MHz processor, een rekenmachine-achtig toetsenbord met 36 toetsen en een 6-cijferig 7-segment LED display. Er is verder voorzien in een 8255 PPI Programmable Peripheral Interface die het toetsenbord uitleest en 4KB ROM en 2KB RAM in de vorm van een 2732 EPROM en een 6116 RAM chip. Ook zijn er drie lege IC-voeten voor geheugenuitbreiding, naar wens EPROM of RAM, en twee lege IC-voeten voor een Z80 PIO Parallel I/O en een Z80 CTC Counter Timer. De MPF-1 heeft een kleine luidspreker, aansluitingen voor een cassetterecorder en een gebied waarop kleine eigen schakelingen kunnen worden gesoldeerd. Bijzonder is de behuizing: die bestaat uit een kunststof boekomslag die, dichtgeslagen, zo de boekenkast in kan.

De MPF-1 wordt in Z80 assembly geprogrammeerd. Deze assembleertaal-instructies zien er uit als LD A,05 en ADD A,B, wat wordt ingevoerd als hexadecimale codes (bytes) 3E-05-80 (verderop meer over de vertaling). De bijgeleverde handleidingen bevatten veel uitgewerkte voorbeelden van onder meer timers en spelletjes die gebruik maken van het 6-cijferige display en de luidspreker. De hexadecimale codes van deze voorbeelden worden byte-voor-byte via het toetsenbord ingevoerd in geheugenadressen, met tussen iedere byte het ophogen van het geheugenadres met een druk op de toets +, zoals (1800) 3E +, (1801) 05 +, (1802) 80 +. Het ingebouwde monitorprogramma maakt wijzigingen in geheugenplaatsen eenvoudig en ook het starten van een programma vanaf een bepaald adres en het instellen van breakpoints is mogelijk. Gebruikers die verder willen dan de voorbeelden moeten zich specialiseren in Z80 assembly, een drempel waar gegarandeerd niet iedere nieuwe eigenaar van de MPF-1 overheen wist te komen. De MPF-1 kwam met een handleiding met hierin de relevante delen van het Z80 databoek voor de vertaling van assembleertaal-instructies naar hexadecimale codes. Als de gebruiker de codes van de meegeleverde voorbeelden wist te combineren tot nieuwe programma’s was dat mooi meegenomen, maar het echte werk zat toch in het handmatig vertalen van assembleertaal naar machinetaalcode, aan de hand van handleiding, de Zilog Z80 CPU User’s Manual of een ander boek waarin de vertaling van Z80 assembleertaal naar machinecode staat gespecificeerd, zoals How to program the Z80 van Rodney Zaks.

De MPF-1 is een printplaat van 15 x 22 cm met hierop alle elektronische onderdelen, een 6 x 7 segment led display en een toetsenbord met 36 toetsen. Er is verder voorzien in aansluitingen voor een cassetterecorder, een luidspreker en twee statusleds. Op de printplaat is ruimte voor enkele zelf te solderen onderdelen en diverse IC-voeten zijn leeggelaten voor toekomstige uitbreidingen. Het toetsenbord is voorzien van commando’s voor het monitorprogramma dat in een 2716 EPROM op de printplaat is geplaatst, maar kan ook worden voorzien van een overlay als een programma een ander gebruik van het toetsenbord voorstaat. Een voorbeeld hiervan is de BASIC programmeertaal voor de MPF-1, waarvoor een ander gebruik van het toetsenbord is bedacht en dat met een kunststof folie met aangepaste toetsaanduidingen komt.

MPF-1 uitgebreide set met BASIC bijgeplaatst

Het monitorprogramma was hetgeen de MPF-1 ‘gebruiksvriendelijk’ maakte: het zorgde ervoor dat programma’s in hexadecimaal via een goedwerkend toetsenbord ingevoerd konden worden en dat uitvoer via een led display of met een hoorbare toon gedaan kon worden. Het maakte programmeren al een stuk plezieriger, hoewel iedere assembleerinstructie nog steeds met de hand in een Z80 handboek opgezocht moest worden.

De handleiding van de MPF-1 introduceerde dat gegeven op laconieke wijze, getuige de volgende drie stukken tekst:

Introductie van een eerste programma, met links de assembleertaal-instructies en rechts (na de puntkomma) het commentaar. 1800H(exadecimaal) is het startadres van het werkgeheugen (RAM)

De oplettende lezer vraagt zich op dit moment af, hoe de assembleertaal-instructies met het toetsenbord van de MPF-1 ingevoerd moeten worden en zoekt op het toetsenbord vergeefs naar toetsen met de opdruk ORG, LD, ADD en HALT.

Hoewel het handmatig vertalen van assembleertaal naar machinetaalcodes (“machinecode”) voor een beetje puzzelaar niet heel complex met voldoende wilskracht te doen is, is hiervoor de Zilog Z80 CPU User’s Manual het handigst in het gebruik. Hierin is de vertaling van assembleertaal naar machinecode na te slaan, voor bijvoorbeeld LD A, 05. In dit handboek staat op pagina 82 hoe “laad register met vaste waarde”, ofwel LD r, n voor een gegeven register r en vaste waarde n moet worden vertaald naar machinecode:

Vertaling van assembleertaal-instructie LD r,n naar machinecode (bron: Zilog Z80 CPU User’s Manual)

De pagina beschrijft specifiek de situatie waarin een register met een constante waarde moet worden gevuld. Voor het vullen van een register met de inhoud van een ander register of met de inhoud van een geheugenadres zijn weer andere pagina’s met andere vertalingen. Maar kijkend naar deze pagina en bereid om het nodige aan puzzelwerk te doen: voor register A levert de vertaling 00111110 op (3E hexadecimaal), gevolgd door de vaste waarde 05. Samengesteld is dit 3E05. Voor register B levert de vertaling 00000110 op (06 hexadecimaal), gevolgd door de vaste waarde 04. Samengesteld is dit 0604.

Op pagina 140 van het Z80 handboek staat hoe “voeg de inhoud van een register toe aan register A”, ofwel ADD A, r voor een gegeven register r moet worden vertaald:

Vertaling van assembleertaal-instructie ADD A, r naar machinecode (bron: Zilog Z80 CPU User’s Manual)

Voor register B levert de vertaling 10000000 op (80 hexadecimaal).

Op pagina 97 van het handboek staat hoe “het laden van de inhoud van register A in een geheugenadres”, ofwel LD (nn), A voor een vast geheugenadres nn naar machinecode moet worden vertaald:

Vertaling van assembleertaal-instructie LD (nn), A naar machinecode (bron: Zilog Z80 CPU User’s Manual)

Voor het geheugenadres 1830H, het beoogde adres waarin het resultaat van de optelling moet worden opgeslagen, levert dit de samenstelling 323018 op. Voor het adres is eerst het minst significante deel 30 gespecificeerd en hierna het meest significante deel 18, conform de beschrijving “The first n operand [..] is the low order byte of nn“. Deze constructie wordt ‘Little Endian’ genoemd. Andere processoren maken gebruik van ‘Big Endian’, een cultuurverschil die menig programmeerfout voor overstappende programmeurs heeft veroorzaakt, vertel ik uit eigen ervaring.

De instructie HALT vinden we op pagina 173 van het Z80 handboek en levert 76 hexadecimaal op.

Het gehele vertaalde programma ziet er dan als volgt in machinecode uit, gerepresenteerd door hexadecimale getallen:

In de kolom MACHINE LANGUAGE zijn de assembleertaal-instructies en bijbehorende parameters op magische wijze omgezet naar machinecode, gerepresenteerd door hexadecimale getallen 3E, 05, 06, 04, 80, 32, 30, 18 en 76.

Het invoeren van de machinecode in de Z80 microprocessor van de MPF-1 is de derde stap in de handleiding, waarin dit in combinatie met het gebruik van het toetsenbord en het led display wordt uitgelegd:

Instructie in de handleiding voor het invoeren van machinecode door middel van het monitorprogramma dat het toetsenbord uitleest, hexadecimale getallen accepteert en deze in de geheugenadressen plaatst en het led display aanstuurt

Voor de gebruiker van de MPF-1 betekende het invoeren van het programma de volgende handelingen (getallen tussen haakjes geven weergaves op het display aan en vetgedrukte teksten zoals ADDR de in te drukken toetsen of in te voeren getallen):

  • ADRR 1800 (00)
  • ADDR 1800 DATA
  • (1800) 3E +
  • (1801) 05 +
  • (1802) 06 +
  • (1803) 04 +
  • (1805) 80 +
  • (1806) 32 +
  • (1807) 30 +
  • (1808) 18 +
  • (1809) 76
  • RS ADDR 1800 GO
  • ADDR 1830 (09)

Het zelf vertalen van de assembleertaal-instructies uit de voorbeelden naar machinecode is een leerzaam proces, die zal helpen bij het begrijpen van het gebruik van de gekozen instructies, het werken met registeres en geheugen en het omgaan met de statusbits van de processor. Hoewel ik mijn carrière in het programmeren van microprocessoren niet met de MPF-1 ben begonnen, herinner ik me nog wel de periode waarin het me begon te dagen dat de ene instructie meer cycli (verwerkingstijd) in beslag neemt dan de andere. Je vindt deze informatie bij iedere instructie in de Z80 User’s Manual onder het kopje M Cycles. Omdat sommige instructies in een programma vaak herhaald worden, maakt het in die gevallen nogal een verschil of een instructie 2 of 1 cycli in beslag neemt.

Een ander voordeel van het zelf opnieuw vertalen van de voorbeelden is dat na enige tijd de vertaling ook zonder handboek lukt: de machinecode bij de meestgebruikte instructies maken dan onderdeel uit van je eigen werkgeheugen.

De aantrekkingskracht van programmeren in assembleertaal (“assembly“) op een single board computer zoals de MPF-1 is moeilijk uit te leggen. Er speelt in elk geval mee dat je dicht bij de elektronica, de hardware van de computer bezig bent. Die computerhardware heeft een heel simpele besturingslogica, waarbij je zelf maximaal oplossingsgericht en creatief bezig moet zijn om complexe oplossingen in kleine stappen op te bouwen. Je bestuurt met de assembleertaal de vulling van het werkgeheugen en aansturing van hardware zoals het display. Niet alleen zie je die elektronica voor je, je ervaart ook de elektronische opbouw van de processor. Want immers, iedere vertaling van instructie naar code reflecteert de bits die straks in de processor bepaalde delen van de interne digitale schakelingen zullen activeren. In gedachten zie je de program counter naar het geheugenadres met de volgende instructie wijzen, de instruction decoder bepalen wat met die instructie te doen, de arithmetic logic unit de bewerking uitvoeren en het resultaat terug in één van de registers plaatsen en een fractie van een seconde later zie je een resultaat op het scherm. Of niet, en dan begint het debuggen, het stap voor stap in gedachten uitvoeren van het programma om te zien waar je een denkfout hebt gemaakt. Machtig mooi allemaal, en de MPF-1 is absoluut die ‘unieke leer- en experimenteercomputer’ die je daarvoor nodig hebt.

Sciento, de Nederlandse importeur van de MPF-1, gebruikte later de printplaat uit de boekomslag van de Micro-Professor voor hun eigen Teach Pendant CS-113, een besturingscomputer voor hun robot arm CS-113. De EPROM was in deze Teach Pendant door Sciento voorzien van een speciaal programma om de robot arm bewegingen te laten maken en te laten herhalen. Een toetsenbord overlay maakte het apparaat compleet. Het geheel was in een stevige aluminium kast ingebouwd met een voedingsaansluiting en een parallelle poort waarop de robot arm werd aangesloten.

Vrij snel na de introductie in 1981 kwam Multitech uit met een BASIC interpreter in een 2K EPROM, die naast de EPROM met het monitorprogramma in een lege IC voet werd geplaatst. Een overlay over het toetsenbord werd meegeleverd en ook de handleiding, met alweer veel voorbeelden, was prima in orde.

Met de MPF-1 BASIC konden programma’s zoals onderstaande worden geschreven:

100 FOR L = 0 TO 9
110 PRINT "IN THE LOOP", L
130 NEXT L
140 PRINT "OUT OF THE LOOP"

De MPF-1 BASIC is een directe afgeleide van Tiny BASIC die vanaf 1976 voor een keur van processoren beschikbaar was. Omdat de Tiny BASIC programmeertaal maar weinig woorden kent en deze woorden toch al als enkele ’token’ in het geheugen van de computer worden opgeslagen, zochten veel computerbouwers naar manieren om met een enkele toets een geheel BASIC woord in te kunnen voeren, zo ook bij de MPF-1. De overlay laat een volledig overzicht van BASIC instructies zien, die door op de betreffende toets te drukken in z’n geheel werden ingevoerd. Dit had twee voordelen: de beschikbare commando’s waren altijd te zien en hoefden vervolgens niet helemaal letter-voor-letter ingetoetst te worden. De commando’s SAVECONTLISTNEWLOADRUN en ENTER zijn geen programmeerinstructies, maar middelen om programma’s in z’n geheel te laden van of bewaren op cassetteband, een programma te starten, te ‘listen’, of een afgebroken programma te hervatten.

Overlay bedoeld voor de BASIC interpreter. Let op het handige gebruik van de USER KEY linksonder op het toetsenbord als SHIFT.