zauważyłem w różnych przykładach że dla uzyskania przesuwu poziomego scrolla sugeruje się przestawienie bajtów w takim buforze, w stylu
.rept 48
lda bufor+1+#
sta bufor+#
.endr
jeśli takich wierszy byłoby więcej, tracimy tylko czas CPU, a przecież można oszczędzić czas kosztem pamięci (2 strony na linię/wiersz), stosując taki RING BUFFER (http://en.wikipedia.org/wiki/Circular_buffer)
zapis naszego znaku, lub kolumny znaków dokonujemy na końcu i początku bufora linii/wiersza, wartość rejestru X to młodszy bajt adresu wyświetlanej linii/wiersza, którą zwiększamy o 1 i o nic więcej nie musimy dbać, samo się zrobi
sta bufor+SCREEN_WIDTH,x
sta bufor+SCREEN_WIDTH-256,x
innymi słowy jest to okno szerokości SCREEN_WIDTH które przesuwamy w obszarze -$ff..$ff
jeśli zadbamy o przekręcanie się licznika na końcu strony i odpowiednio zapiszemy znak początkowy/końcowy to powinno udać się zejść do 1 strony pamięci na linię/wiersz
poniżej przykład niekończącego się scrolla dla bufora korzystającego z dwóch stron pamięci
org $600
dlist dta $70,$70,$70 ; 24 puste linie ($70 = 8 pustych linii)
dta $42|$10 ; rozkaz ANTIC-a LMS ($42) dla trybu $02 + $10 dla HSCROL
adres dta a(text) ; adres scrolla
dta $41,a(dlist) ; zakończenie programu ANTIC-a
main mwa #dlist 560 ; ustawiamy nowy adres programu ANTIC-a
loop
lda tmp ; płynny scroll, przepisanie wartości TMP do rejestru HSCROL
sta hscrol ; koniecznie przed poniższą pętlą opóźniającą
lda:cmp:req 20
dec tmp ; zmniejszenie komórki TMP [3,2,1,0]
bpl loop ; pętla
mva #3 tmp ; odnowienie wartości komórki TMP
inc adres ; scroll zgrubny
ldx adres
lda scroll
ascrol equ *-2
sta text+48,x
sta text+48-256,x
inw ascrol
cpw ascrol #end_scroll
scc
mwa #scroll ascrol
jmp loop
tmp dta 3 ; pomocnicza komórka pamięci TMP
scroll dta d'to jest tekst przykladowy, scrolla z buforem ulegajacemu zapetleniu'
end_scroll
org $a000
text :48 dta d' '
run main ; adres uruchomienia tego przykładu