-------------------------------------- ASSEMBLER-ECKE -------------------------------------- In diesem Teil der Assmblerecke wollen wir uns dem Scrolling widmen und zwar dem vertikalen Scrolling. Ziel soll es sein, in mit Hilfe eines VBIs eine Zeile vertikal zu scrollen. Hier erst einmal unser fertiges Listing, wir kauen es dann Stück für Stück durch... * VERTIKALES SCROLLING * GESCWINDIGKEIT STEHT IN PAUSE * ZUR VERAENDERUNG DEN CMP# WERT * ZU BEGINN DES VBI VERAENDERN... ORG $A800 LDA #VBI:LO STA 548 LDA #VBI:HI STA 549 LDA #192 STA $D40E LDA #DL:LO STA 560 LDA #DL:HI STA 561 LOOP JMP LOOP DL DFB 112,112,112 DFB 2+64+32 TX DFW SCROLL DFB 2+64 TX2 DFW SCROLL2 DFB 2,2,2,2,2,2,2,2,2,2 DFB 2,2,2,2,2,2,2,2,2,2 DFB 2,2 DFB 65 DFW DL VBI INC PAUSE LDA PAUSE CMP #3 BNE END LDA #0 STA PAUSE INC DATA LDA DATA CMP #8 BNE CONT LDA #0 STA DATA INC TX+1 INC TX2+1 LDA TX+1 CMP #$AE BNE W1 LDA #$AD STA TX+1 W1 LDA TX2+1 CMP #$AF BNE CONT LDA #$AE STA TX2+1 LDA #0 STA DATA CONT STA $D405 END JMP $E462 DATA DFB 0 PAUSE DFB 0 ORG $AD00 SCROLL ASC % LOADING % ORG $AE00 SCROLL2 ASC % LOADING % Zu Beginn haben wir wieder unseren Initialisierungsblock, in dem der VBI und die DL vorbereitet wird. Anschließend folgt die Display List. Hier in der DL sehen wir die erste Besonderheit. Wo sonst das normale 2+64 steht, was die Startadresse für den Bildschirmspeicher angibt, ist noch das Offset 32 angehängt. 32 Ist der ANTIC Code für vertikales Scrolling, das damit in dieser Zeile eingeschaltet wird. Anschließend kommt wieder ganz normal die Adresse in Form eines Platzhalters SCROLL. Darauf folgt die selbe Prozedur nur diesmal ohne die 32. Das ist eine Eigenheit des ANTIC: Nach der letzten Zeile, die gescrollt werden soll, muß ein Bildschirmladebefehl kommen ohne den 32er Offset, da sonst ein häßliches Ruckeln entsteht. Das braucht uns im Technischen nicht weiter zu interessieren, wir merken uns lediglich die Tatsache. Der Rest ist eine normale DL. Dann kommt der VBI: Zu Beginn wird mittels der PAUSE Adresse nachgesehen, ob der VBI schon wieder ausgeführt werden soll oder ob er nochmal übersprungen wird. Dann wird der Wert von DATA in VSCROL ($D405) abgelegt. Dies geschieht aber erst nach einer Reihe von Überprüfungen: Das Scrollregister kann nämlich nur um 8 Pixel scrollen, deswegen muß nach dem siebten Scroller ein "Hardscrolling" erfolgen, ehe mit dem Finescrolling fortgefahren werden kann. Das Hardscrolling wird durch die Veränderung in der DL vorgenommen indem dort die Bildschirmspeicheradresse verändert wird. Ist also der Wert in DATA auf acht gegangen, wird er auf null zurückgesetzt und dann die DL verändert. Das geschieht so: In der DL befinden sich Platzhalter TX1 und TX2. Wenn man TX+1 erhöht, wird das Highbyte der ersten BS-Adresse erhöht, bei TX2+1 die der Zweiten. Wenn wir dann einen Blick nach unten werfen, können wir sehen, daß der Scrollsatz auch genau um 256 Byte, also eine Page auseinanderliegt. Das muß nicht sein, ist aber am einfachsten und schnellsten, da wir somit wirklich nur das Highbyte verändern müssen. Natürlich kann man das Highbyte nicht bis in alles Ewigkeit erhöhen und somit muß auch hier wieder überprüft werden, ob nicht die Zeile durchgelaufen ist und dann alles wieder auf den Ursprungswert gesetzt werden muß. Das war eigentlich auch schon die ganze Chose. Nächstes Mal kommt dann das horizontale Scrolling.