Tabii c64 ile pek alakam yok ama bildiğim kadarıyla vic'de bir scroll registeri var 0xd016'da. Ayrıca bir raster irq var, programlanabilir bir kesme isteği. Ben olsam, eğer ekranın üstteki 3 plane'i hep aynı şekilde ise, bir kere cycle sayıp tüm planelerin kaydırılmalarının kaç cycle tuttuğunu hesaplar, programlanabilir kesme isteğine göre paralax'ımı tek raster'a yerleştirdiğim kesme ile tamamlardım. Geri kalan vakte de oyun logic'ini koyardım.
Yani, örnek, diyelim ki ekranın ilk 3 karakter satırı gökyüzü, ikinci 3lü satırı tarlalar, üçüncü üçlü satırı yol kenarındaki ağaçlar olsun.
-x=1 olsun
-0. raster satırına irq kur (
http://www.c64-wiki.com/index.php/Raster_interrupt )
-bitmask'ı kontrol et, bit set ise,
--d016'da x pixel kaydır, cycle say, 3 sütun geçsin.
--d016'da x pixel kaydır, cycle say, 3 sütun geçsin.
--d016'da x+x pixel kaydır, cycle say, 3 sütun geçsin.
--8 pixel kaydı ise, karakterleri kaydır.
böylece 1.katman 1 pixel, 2. katman 2 pixel, 3.katman 4 pixel kaymış olur, bence işi görür.
Vic'i 8 pixelde bir geri alman gerekiyor. Aynı zamanda arka plan grafiklerini bir karakter kaydırıp tazelemen gerekiyor.
Cycle say'dan kastım, bir loop ile bekleyebilirsin. Ya da burada her zaman aynı cycle tutan bir işlemi yapabilirsin. Ya da zaman yetiyorsa yeniden raster kesmesi programlayabilir ve bekleyebilirsin. (vic'in 1 raster satırı kaç cycle tutuyor, border kaç cycle tutuyor bilmiyorum. Eğer çok büyükse bu süre, o zaman bayağı cycle harcamış olursun. Bu durumda en iyisi 3 kere raster interrupt kurmak daha mantıklı olur herhalde.)
Hızı yavaşlatmak için bir adet bitmask kullanabilirsin. yani diyelim ki #10101010 (170) bu senin mask'ın olsun. 8 irq'nun sadece 4'ünde kaydırma yapılacak. Ya da 00010001 olunca 2 kaydırma. 11111111 (255) olursa 8'inin 8'inde kaydırma var. Hızlandırmak için, bitmask 255'e geldikten sonra, x'i artırıp bitmask'ı yine düşüğe ayarlayarak hızı arttırırsın.
Burada hızı değiştirmek için iki değişken var, x ve bitmask. Zaten kaydırma rutini her ikisini de kontrol ettiği için hızı değiştirmek için bu değerleri modifiye etmen yeterli. Bitmap için bir tablo tutarsın hızlıdan yavaşa,
0-10000000
1-10001000
2-10010010
3-10101010
4-11010110
5-11011011
6-11101110
7-11111111
şeklinde bu tablodan çekersin 8 bitmask yavaşlama seviyesi, ve 8 (x) seviyesi 8x8 64 hız seviyesi eder. Bunları bile bir tabloya koyabilirsin. 64 girdili bir tablo yap, ordan direk yerleştirirsin.
Tabii şimdi ben bir spectrumcu olarak biraz işleri dolaylı yapıyor olabilirim. Lütfen c64'cüler atlasın konuya

Yani görüldüğü üzere timer falan kullanmadım, sadece 1 raster irq kullanarak tüm kaydırmaları yaptım.
Bilmem anlatabildim mi

edit:Mantığı anlatmak için mecburen speccy'den örnek vericem.
Speccy'de 1 raster 228 ts tutuyor. Raster border'ı çizerken 80 ts var. Kaydırmayı border alanında yapmak akıllıca. d016'yı border çizilirken ayarlarsın, sonra 228x24 beklemek gerek (5400 cycle beklemek için sabit tstate tutan bir loop yapılabilir, bu sürede iş de yapılabilir.) Sanırım PAL c64'de 1 raster 63 cycle tutuyormuş (kaynak:
http://unusedino.de/ec64/technical/misc/vic656x/pal-ntsc.html). Bu durumda 3 karakter satırı için, 63x24= 1512 cycle beklemek gerek. Eğer bu süre senin için değerliyse ozaman en iyisi irq programlayıp işe geri koyulmak gerek.
Haa tabii ben bütün bunları 8x8'lik karakter ekranı için söyledim, 8x4'lük ekran modunda, ona göre ayarlamak lazım.