Programmeren in TI-83+ Assembly/Tekenen/De tekenbuffer
Bij het tekenen van grafische elementen, zoals lijnen en punten, op het scherm krijg je te maken met de tekenbuffer. De tekenbuffer is een afspiegeling van het "plaatje" op het scherm.
Opbouw van de tekenbuffer
bewerkenHet scherm van de TI-83+ en TI-84+ is 96 bij 64 pixels groot. Er zijn dus 96 x 64 = 6144 pixels. Je zou misschien verwachten dat de tekenbuffer dan erg groot is (6144 bytes). Maar dat is niet zo. Iedere pixel kan namelijk maar twee kleuren hebben: zwart of wit. Dit betekent dat je in één byte acht pixels kunt opslaan (want een byte bestaat uit acht bits). De tekenbuffer heeft dus een grootte van 6144 / 8 = 768 bytes. Zie de tekening hiernaast.
De tekenbuffer is een gebied in het geheugen. Het geheugenadres van de eerste byte van de tekenbuffer is $9340. Je kunt voor deze waarde ook gebruiken: plotSScreen.
Naar de tekenbuffer schrijven
bewerkenHet is uiteraard mogelijk om dit geheugen aan te passen, zodat het scherm verandert. We gaan proberen om de eerste 24 pixels van het scherm zo in te stellen als hiernaast.
Tekenen: ld hl, plotSScreen ; het begin van de tekenbuffer ld (hl), $9D inc hl ; nu de volgende byte van het geheugen aanspreken ld (hl), $00 inc hl ; weer de volgende byte ld (hl), $45 ret ; terug naar TI-OS
Dit werkt helaas niet. Dat komt omdat het LCD-scherm niet direct geüpdatet wordt als de tekenbuffer wordt geüpdatet.
Het scherm updaten
bewerkenHet scherm updaten kan met de bcall _GrBufCpy. Dit programma werkt dus wel:
Tekenen: ld hl, plotSScreen ; het begin van de tekenbuffer ld (hl), $9D inc hl ; nu de volgende byte van het geheugen aanspreken ld (hl), $00 inc hl ; weer de volgende byte ld (hl), $45 bcall(_GrBufCpy) ret ; terug naar TI-OS
Hiernaast zie je het resultaat.
Een groot gebied tekenen
bewerkenWil je nu een afbeelding op het scherm zetten, bijvoorbeeld voor een splash-screen of iets dergelijks, dan is het ondoenlijk om dat met de routine hierboven te doen. Je moet dan namelijk 767 keer het volgende stukje kopiëren:
ld (hl), %00000000 inc hl
Dat kost niet alleen veel moeite, maar ook veel geheugen en processortijd. Hoe kan dat dan? In het hoofdstuk Geheugenbeheer (paragraaf Het gebruik van ldir) hebben we leren werken met ldir. Dit is perfect voor deze doeleinden. We hebben zelfs in het voorbeeldprogramma aldaar al gekopieerd naar de tekenbuffer. Voor de volledigheid hier nog het voorbeeldprogramma:
ld bc, 767 ; 767 bytes aan data (= de grootte van de tekenbuffer) ld de, PlotSScreen ; kopiëren naar de tekenbuffer ld hl, DataLabel ; kopiëren vanaf het DataLabel ldir ; het eigenlijke kopiëren ret ; terug naar TI-OS DataLabel: .db ...767 bytes aan data...
Opdracht
bewerkenProbeer om het hele scherm zwart te maken. Hint: je kunt een for-loop gebruiken.