Assembly Cursus 4

ACNu we weten wat er in de computer zit, de registers behandeld hebben en vorige keer een assembler besproken hebben, kunnen we nu aan de slag gaan om echt wat met de registers te gaan doen. Dit zal ik doen met veel voorbeelden, zodat het een en ander duidelijker wordt. 

 CursusAssembly Deel1 hdr

CAComputer: Commodore 64
Datum: 2011
Type: Programmeertaal
Door: Addy van Ladesteijn

Schermuitvoer…
Nu we weten wat er in de computer zit, de registers behandeld hebben en vorige keer een assembler besproken hebben, kunnen we nu aan de slag gaan om echt wat met de registers te gaan doen. Dit zal ik doen met veel voorbeelden, zodat het een en ander duidelijker wordt.

De voorbeelden die in dit deel genoemd worden kun je in de assembler invoeren en uitproberen. Zo krijg je een beter begrip van de commando’s en leer je de Assembler kennen. Vorige keer hebben we de Merlin assembler besproken, maar je bent natuurlijk vrij in het gebruik van je eigen voorkeur.

De komende delen zullen de eerder besproken commando’s vanzelf voorbij komen en als leidraad dienen, waar ik beetje bij beetje meer theorie en achtergrond informatie aan toe zal voegen!

Zoals eerder gezegd, het hart van de 6510 is de Accumulator waar bijna alle gegevens doorheen gaan. Het is een opslagplaats van acht bits waar je een getal tot maximaal 255 in kunt stoppen. We gaan nu een aantal commando’s uit het vorige deel gebruiken voor het laden en verplaatsen van data.

OPCODE OPERAND
LDA #0      (Laad het decimale getal 0 in de Accumulator)
STA 1024    (Zet inhoud van de Accumulator op geheugenadres 1024)
STA 55296   (Zet inhoud van Accumulator op geheugenadres 55296)
RTS         (Keer terug vab de Subroutine naar BASIC)
END

Bovenstaande listing zal na het uitvoeren een zwarte “@” in de linkerbovenhoek van het scherm afdrukken, en toch, het enige wat we feitelijk gedaan hebben is het getal “0” op twee plaatsen in het geheugen geplaatst! Dit heeft te maken met wáár we de waarde plaatsen. Als deze geheugenlocatie tussen de 1024 en 2023 ligt, wordt de waarde op het scherm getoond. Met andere woorden, door een nul te stoppen op geheugenadres 1024 zal de inhoud van geheugenadres linksboven op het scherm getoond worden. De reden hiervoor heeft te maken met de manier waarop de Commodore 64 VIC chip het scherm opbouwt. Het scherm is opgebouwd uit 25 rijen van 40 vakjes (samen precies 1000), zoals hieronder weergegeven wordt. Elk vakje heeft zijn eigen geheugenadres. De eerste rij, bijvoorbeeld, begint op geheugen adres 1024 (he daar is ie) en loopt tot en met adres 1063. De allerlaatste rij eindige tenslotte op 2023, de laatste positie op het scherm helemaal rechts onderin.

CANu het duidelijk is, waarom er iets op de eerste positie van het scherm getoond wordt als we iets in adres 1024 zetten, komt de volgende vraag: Waarom wordt een “@” getoond? Dat heeft dus te maken met wát we op geheugenadres 1024 zetten. Zoals eerder gezegd kan het een waarde van 0 tot 255 zijn. In een kleurenadres stelt elk van deze 256 waarden (de nul telt ook mee) een karakter voor. Je kunt dus 256 verschillende karakters op een positie op het scherm laten verschijnen, afhankelijk van welke waarde je op adres 1024 t/m 2023 zet. Op de volgende pagina staat een karaktertabel, waarbij je kunt zien welk karakter welke waarde voorstelt.

CA
Bovenstaande tabel laat, voor de oplettende lezer, slechts 128 verschillende karakters zien (0 – 127), terwijl ik het dubbele aantal beloofd had. Dat komt doordat de waardes 128 t/m 255 de inverse versies zijn van de boven getoonde karakters. Je ziet hierboven bij de nul het karakter “@” staan. Hadden we een hoofdletter D gewild, dan hadden we de waarde “4” gebruikt en voor het cijfer acht de waarde “56”.

Nu weten we dus waarom de “@” in de linkerbovenhoek van het scherm getoond werd. We zette met ons programma een de waarde 0 (@) op geheugenadres 1024. Maar ik moet nog één ding vertellen over kleuren. Als je een waarde direct op het scherm zet, dien je de computer ook te vertellen welke kleur hij moet weergeven. Doe je dit niet, dan laat je de kleurbepaling van het karakter volledig aan de willekeur over, met het risico dat het karakter dezelfde kleur krijgt als de achtergrond. Elke van de 1000 video adressen heeft een bijbehorend kleurenadres, die in de tabel hieronder weergegeven wordt.
CA
Je ziet dezelfde layout als bij de video adressen. Elke vakje kan een waarde 0 t/m 15 bevatten, waarbij de waarde overeenkomt met de kleur, die je waarschijnlijk vanuit BASIC nog kent:

0 – Zwart 8 – Oranje
1 – Wit 9 – Bruin
2 – Rood 10 – Licht Rood
3 – Cyaan 11 – Donker Grijs
4 – Paars 12 – Midden Grijs
5 – Groen 13 – Licht Groen
6 – Blauw 14 – Licht Blauw
7 – Geel 15 – Licht Grijs

Dus door een waarde nul te zetten op geheugen adres 55296 krijgt het karakter dat op de eerste positie op het scherm (1024) staat de kleur die bij die opgegeven waarde (zwart) hoort.

Wat we nu geleerd hebben is om een karakter, in een bepaalde kleur, op een bepaalde positie op het scherm te zetten. Met deze kennis, zou ik mijn voornaam (Addy) dus in het rood op het scherm kunnen zetten met het volgende programma:

OPCODE OPERAND
LDA #1      (Laad decimale getal 1 in Accumulator, dit wordt dus de "A")
LDY #2      (Ik gebruik het Y register om de kleur rood in op te slaan)
STA 1024    (Zet een A op de eerste positie van het scherm)
STY 55296   (Zorg dat de A de kleur rood krijgt vanuit het Y register)
LDA #4      (Laad decimale getal 4 in de Accumulator, dit wordt dus de "D")
STA 1025    (Zet een D op de tweede positie van het scherm)
STY 55297   (Zorg dat de D de kleur rood krijgt vanuit het Y register)
STA 1026    (Zet een D op de derde positie van het scherm)
STY 55298   (Zorg dat de D de kleur rood krijgt vanuit het Y register)
LDA #25     (Laad het decimale getal 25 in de Accumulator, dit wordt de "Y")
STA 1027    (Zet een Y op de tweede positie van het scherm)
STY 55299   (Zorg dat de Y de kleur rood krijgt vanuit het Y register)
RTS         (Keer terug uit naar de Subroutine naar, in dit geval, BASIC)
END

Wat opvalt, is dat ik het Y register eenmaal vul met de waarde 2 (rood) en deze steeds hergebruik. Ook laad ik de “D” maar eenmaal, en gebruik ik deze tweemaal. Als je het aandurft, doe dan hetzelfde met jouw naam. In sommige Assemblers laad je een decimale waarde met het commando LDAIM (LaaD Accumulator IMmediately) gevolgd door het cijfer zonder “#”.

Je snapt dat het bovenstaande voorbeeld wel een heel omslachtige manier is om een woordje op het scherm te krijgen en natuurlijk gaan we dit later makkelijker doen. Het gaat er nu enkel om dat je begrijpt hoe je het LDA en STA commando’s gebruikt. We hadden hier de commando’s LDA, LDX of LDY door elkaar heen kunnen gebruiken, omdat we geen rekenkundige bewerkingen uit hoefde te voeren (zoals optellen e.d). Daar gebruik je normaliter de Accumulator voor en de X/Y registers gebruik je voor het verplaatsen van data. Maar je ziet, het maakt voor de laad commando’s in dit geval niets uit.

Tevens hebben we in dit deel gezien dat je adressen kunt voorzien van een waarde, die direct iets uitvoert (in dit geval op het scherm). De kleuren manipuleer je door in de kleuren adressen 55296 t/m 56295 een waarde van 0 t/m 15 te laden. De positie van het scherm kun je vullen door een waarde van 0 t/m 255 te laden op adressen 1025 t/m 2023.

Volgende keer gaan we wat berekeningen doen, waardoor we nog leukere voorbeelden kunnen aanhalen. Maar omdat je door verschillende karakters naar het scherm te sturen gelijk het resultaat ziet, zullen in de komende delen voorbeelden als deze steeds weer terugkomen om andere commando’s te demonstreren. Ik daag daarom iedereen uit om met behulp van de voorbeelden uit dit deel te gaan experimenteren om karakters op het scherm te toveren in willekeurige kleuren.

CA