Programmeren van de 8080
Arnout van Kempen over rommelen in een digitale wereld.
Nu we de belangrijkste kenmerken van de 8080 hebben gezien, kunnen we eens kijken naar hoe een programma er nu uit komt te zien. Let wel, het echte programma bestaat uit elektrische ladinkjes in een stukje silicium die naar een ander stukje silicium worden gebracht, door reeksen transistoren worden geleid en die resulteren in andere elektrische ladinkjes. We abstraheren die ladinkjes naar nullen en enen, die we abstraheren naar hexadecimale getallen en die abstraheren we weer naar assembly code. Maar de abstractie van de code gaat tot dit niveau wel één op één: hetzelfde patroon van ladinkjes is hetzelfde patroon van nullen en enen, is hetzelfde patroon van programma-codes. Er zijn wel vertaalslagen nodig, maar geen interpretatieslagen.
Op het niveau van de hardware gebeurt dat overigens al wel. Ik moet echt dringend dit filmpje op YouTube adviseren: hoe transistors code uitvoeren. Het is onderdeel van een hele serie die op een erg begrijpelijke wijze exact uitlegt hoe abstractie van de werkelijkheid van transistors naar uiteindelijk computer-hardware als CPU en geheugen werkt.
Terug naar assembly. Stel voor dat we twee getallen op geheugenlocatie 2000h en 2001h hebben staan. We gaan het verschil uitrekenen en als dat verschil 0 is (beide getallen zijn dus gelijk), dan plaatsen we een 0 in het B register en anders komt daar een 1. Dat zou er in 8080 assembly zo uit kunnen zien:
LXI H, 2000h ; Stel HL in op geheugenadres 2000h
MOV A, M ; Laad [HL] in accumulator A
INX H ; Verhoog HL om naar [HL+1] te wijzen
SUB M ; Trek [HL+1] af van A (A = [HL] - [HL+1])
JZ ZERO ; Als resultaat 0 is, spring naar ZERO
MVI B, 1 ; Anders, zet 1 in register B
JMP END ; Spring naar einde
ZERO:
MVI B, 0 ; Zet 0 in register B
END:
HLT ; Stop het programma
De codes die Intel gebruikte liggen niet altijd direct voor de hand, maar met een beetje hulp is een programma als dit best leesbaar. Wat niet enorm helpt in die leesbaarheid is het gebruik van load en move voor verschillende soorten data-transport. De LXI H,nnnn staat voor het plaatsen van een 16-bits waarde in het HL register-paar, terwijl de MOV A, M gebruikt wordt voor een 8-bits beweging; in dit geval van de locatie aangewezen door HL naar A. Je ziet in de instructies terug wat voor soort data bewerkt wordt. De X wijst naar 16-bits, de I wijst naar een immediate of directe waarde. Dat lijkt misschien overzichtelijk, maar het tegendeel is waar.
Bij de Z80, een grote verbetering ten opzichte van de 8080 maar wel nog steeds 100 procent software compatible, zie je die syntax al simpeler worden. Hetzelfde programma in Z80 wordt:
LD HL, 2000h ; Stel HL in op geheugenadres 2000h
LD A, (HL) ; Laad [HL] in accumulator A
INC HL ; Verhoog HL om naar [HL+1] te wijzen
SUB (HL) ; Trek de waarde op [HL+1] af van A
JR Z, ZERO ; Als het resultaat 0 is, spring naar ZERO
LD B, 1 ; Anders, zet 1 in register B
JR END ; Spring naar einde
ZERO:
LD B, 0 ; Zet 0 in register B
END:
HALT ; Stop het programma
De verschillen zijn niet heel groot, maar de leesbaarheid neemt wel toe. Een aardig detail dat in de Z80-variant zichtbaar wordt, is het gebruik van JR. In dit geval is het een conditionele JR, immers, er wordt alleen gesprongen als de laatste bewerking de Z-vlag gezet heeft. Maar vooral interessant is dat de sprong relatief is. Er wordt dus niet naar een vast adres in het geheugen gesprongen, maar relatief, een aantal plaatsen vooruit dus. Dat maakt code onafhankelijk van de plaats in het geheugen waar deze loopt en dat maakt code flexibeler.
De Z80 kende nog wat extra registers die de CPU sneller en krachtiger maakten dan de 8080, maar dat is voor de liefhebbers. De echt boeiende stap komt de volgende keer: de 8086.
Wie mee wil doen met #klooienmetcomputers kan dat doen via GitHub. Maak een account op github.com en zoek naar Abmvk/kmc. Het account Abmvk volgen kan ook. Lezers zijn vrij te gebruiken wat ze willen en om zelf zaken toe te voegen of aan te passen, vragen te stellen of commentaar te leveren.
Gerelateerd
De basis van de 8080: registers en de ALU
Arnout van Kempen over rommelen in een digitale wereld.
De basis van de 8080: pinnen en interrupts
Arnout van Kempen over rommelen in een digitale wereld.
De lijst der lijsten
Arnout van Kempen over rommelen in een digitale wereld.
Van 4004 naar 86-64
Arnout van Kempen over rommelen in een digitale wereld.
We gaan diep!
Arnout van Kempen over rommelen in een digitale wereld.