Skip to content

Latest commit

 

History

History
110 lines (87 loc) · 4 KB

assembly_cursus_5.md

File metadata and controls

110 lines (87 loc) · 4 KB

Arjan programmeert er rustig op los...

    ASSEMBLY (5)

Deze keer gaan we het hebben over screensplits, paletsplits en alle andere soorten splits die je maar kunt bedenken. Een goed voorbeeld van een screensplit zie je nu terwijl je aan het lezen bent. Eigenlijk zijn er zelfs 2 screensplits, want alleen de tekst beweegt en de border staat stil.

Een split is eigenlijk heel simpel om te maken. Het kan zelfs op 2 verschillende manieren. Je kunt namelijk de VDP een interrupt laten genereren als de lijn voorbij is en je kunt zelf testen of de VDP al voorbij de lijn is. Deze laatste methode zal ik hier bespreken, de eerste komt een volgende keer aan bod.

Zoals gezegd is een split heel simpel. Eerst doe je nog wat dingetjes totdat je denkt dat de VDP ongeveer is bij de lijn waar je de split wilt hebben. Dan zet je in register 19 NA welke lijn je de split wilt hebben. Daarna test je of bit 0 van statusregister 1 een 1 is. Als dat zo is, is de VDP klaar met die lijn. Vervolgens selecteer je een andere page, schermmode, palet of whatever. Dit kost wel wat tijd, dus zorg ervoor dat de lijnen bij de split dezelfde kleur hebben want anders gaat die lijn knipperen.

Een voorbeeldje: stel je wilt de helft van het scherm page 0 hebben en de andere helft page 1. Dan zet je in register 19 de waarde 105, dus komt de split bij lijn 106. Lijn 106 maak je dan op beide pagina's dezelfde kleur en vervolgens test je of de lijn al voorbij is. Daarna selecteer je page 1 en dan wacht je weer op een interrupt om page 0 te selecteren.

De volgende source zal het wel duidelijker maken. De source staat ook op disk onder de naam SCRSPLIT.GEN. Natuurlijk is er ook een klein voorbeeldje bij, namelijk SCRSPLIT.BAS, welke deze routine gebruikt. Dit programmaatje laat ook zien wat er gebeurt als je de lijnen bij de split niet dezelfde kleur geeft.

     defb    #fe                    ; BLOAD-header
     defw    start,einde,start

     org     #d000

start: ei halt

     ld      a,31           ; 31 = page 0, 63 = page 1
     out     (#99),a        ; 127 = page 2, 255 = page 3
     ld      a,2 + 128
     out     (#99),a        ; Selecteer page 0

     xor     a
     call    #d8
     or      a
     ret     nz             ; Spatie ingedrukt = stoppen

     ld      a,105          ; Lijn voor screensplit
     out     (#99),a
     ld      a,19 + 128
     out     (#99),a        ; Stuur lijn naar register 19

     ld      a,1
     out     (#99),a
     ld      a,15 + 128
     out     (#99),a        ; Selecteer statusregister 1
     nop
     nop                    ; geef VDP wat tijd

split: in a,(#99) ; lees statusregister 1 bit 0,A ; test bit 0 (0 = niet ; voorbij lijn) jp z,split ; herhaal test indien nodig

     ld      a,63
     out     (#99),a
     ld      a,2 + 128
     out     (#99),a        ; selecteer page 1

     xor     a
     out     (#99),a
     ld      a,15 + 128
     out     (#99),a        ; Selecteer statusregister 0

     jp      start          ; herhaal

einde:

Een kleine opmerking wil ik nog maken over het selecteren van statusregister 0. Dit register moet geselecteerd worden, omdat de BIOS met IN A,(#99) dit register wil lezen terwijl 'ie dit register meestal niet eerst selecteert (om tijd te sparen).

Als je maar ��n split hebt, hoef je register 19 maar ��n keer te veranderen, zodat je weer (iets) meer tijd hebt voor andere dingen. Dit heb ik hier niet gedaan voor de duidelijk- heid. Natuurlijk is het mogelijk om meerdere splits te maken. Je zet de routine voor de split vaker in je code, maar dan telkens met een andere lijn. Zo simpel is dat.

Dit was het dan voor deze keer. De volgende keer zal ik .LIB-files behandelen (een file waar je alle files in propt). Dat wordt een lekker lange aflevering, maar dat mag ook wel eens een keertje, of niet soms?

Arjan Bakker