Programmeren in TI-83+ Assembly/Tekenen/Pixels tekenen
Het tekenen van losse pixels lijkt nutteloos. Maar vaak is het toch handig om het te kunnen. Bijvoorbeeld, door een for-loop van pixels kun je een lijn tekenen. Als eerste gaan we het geheugenadres bepalen van een pixel waarvan we de x- en de y-coördinaat weten.
Het geheugenadres van een enkele pixel ophalen
bewerkenDe inhoud van deze paragraaf is nog niet getest en kan fouten bevatten. Je kunt het geheugenadres van een enkele pixel ophalen, bijvoorbeeld om hem zwart of wit te maken, met een bepaalde routine die we zo gaan schrijven. Je moet je daarbij wel bedenken, dat je niet alleen een geheugenadres krijgt, maar ook een bepaalde manier om de bit ín het geheugenadres te bepalen. (Als je dat niet snapt, kijk dan naar de afbeelding linksboven in de vorige paragraaf.)
Eerst schrijven we het algoritme op.
- Zet de x-coördinaat (van 0 t/m 95) in b en de y-coördinaat (van 0 t/m 63) in a.
- Vermenigvuldig a (= de y-coördinaat) met 12 (iedere rij bevat 96/8 = 12 bytes. Dus dit is eigenlijk het nummer (t.o.v. het begin van de tekenbuffer) van de eerste byte in de rij).
- Deel b door 8 (iedere byte bevat 8 pixels). Tel het geheel deel van de deling bij de vorige uitkomst op. Dit is het nummer (t.o.v. het begin van de tekenbuffer) van de byte waarin de gevraagde pixel staat.
- Tel hierbij plotSScreen op. We hebben nu het geheugenadres van de byte waarin de gevraagde pixel staat.
- De rest van de deling uit stap 3 is het nummer van de bit in de byte (als je van 1 naar 8 telt).
1. Coördinaten laden
Dat moet de aanroeper van de methode doen.
2. Vermenigvuldigen met 12
Hoe doen we dat?
- Vermenigvuldigen met 2 geeft 2a.
- Vermenigvuldigen met 2 geeft 4a.
- Vermenigvuldigen met 2 geeft 8a.
- 8a + 4a = 12a
Er is alleen één probleem. Stel a=30. Dan 12a=360. Dat past helemaal niet in a... We moeten dus eerst a overzetten op hl om de berekening te kunnen uitvoeren.
ld h, 0 ; a overzetten op hl ld l, a add hl, hl ; dit geeft 2a add hl, hl ; dit geeft 4a ld d, h ; het resultaat van 4a opslaan in de ld e, l add hl, hl ; dit geeft 8a add hl, de ; 8a + 4a = hl + de = 12a
3. Delen door 8
Hoe doen we dat? Delen door twee kan met de verschuiving (zie Geheugenbeheer>Verschuivingen) srl. Je gooit de rest dan weg: perfect, want we willen juist het gehele deel.
srl b ; dit geeft b/2 srl b ; dit geeft b/4 srl b ; dit geeft b/8 ld d, 0 ; b overzetten op de - de is immers toch niet meer nodig, en zo kunnen we gemakkelijk de bij hl optellen ld e, b add hl, de
4. Optellen bij PlotSScreen
Dat spreekt voor zich:
add hl, PlotSScreen ; erbij het begin van de tekenbuffer optellen
5. Nummer van de bit bepalen
Voordat we dit stuk kunnen programmeren, moeten we bedenken hoe we het nummer van de bit willen krijgen. Het is namelijk zo, dat je aan slechts het nummer van de bit niet al te veel hebt. Je denkt misschien dat het mogelijk zou moeten zijn om set en res te gebruiken om de bit aan of uit te zetten, maar dit is niet mogelijk omdat het nummer van de bit al vastligt in de code; het is niet mogelijk om daarvoor bijvoorbeeld een register te gebruiken.