Programmeren in TI-83+ Assembly/Tekenen/De tekenbuffer

Uit Wikibooks
Naar navigatie springen Naar zoeken springen

Programmeren in TI-83+ Assembly


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[bewerken]

De bovenste rij pixels geeft het begin van de eerste rij weer. De tekenbuffer ziet er dan zo uit als onder vermeld is.

Het 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[bewerken]

Het 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[bewerken]

Resultaat na het draaien van het programma hiernaast. Let op de pixels linksboven.

Het 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[bewerken]

Wil 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[bewerken]

Probeer om het hele scherm zwart te maken. Hint: je kunt een for-loop gebruiken.

ArrowLeftNavbox.svg ← Tekenen De tekenbuffer Pixels tekenen → ArrowRightNavbox.svg
Informatie afkomstig van http://nl.wikibooks.org Wikibooks NL.
Wikibooks NL is onderdeel van de wikimediafoundation.