İNTRO TEKNİKLERİ
1x1 SCROLL VE RENKLİ RASTER ŞERİTLERİ
Bu sayıdan itibaren intro programcısı olmak için çalışmalara başlıyoruz. İlk konumuz öncelikle neredeyse her introda karşımıza çıkan “text scroll” ve “color raster” efektleri. Bir intro yapabilmek için en başta iyi bir assembler bilgisi, C64’ün donanım adreslerini iyi bilmek ve biraz da dizayn yeteneği gereklidir. Bunun yanında elinizin altında çeşitli karakter setleri, müzikler, sprite’lar, logolar ile çeşitli editörler (karakter, sprite, logo, grafik editörleri vs...) bulunmalıdır.
Programımız standart C64 karakter setini kullanmaktadır ve müzik yoktur.
(C64ASM V1.1 ile compile edilecek şekilde yazılmıştır.)
*=$0801
.word nextline
.word 2003
; 2003
.byte $9e
; SYS
.text "2061"
; 2061
.byte 0
; komutu
nextline
.word 0
start
sei
; interruptları engelle
lda
#$01
; Yazı rengi beyaz olacak şekilde
jsr
$e536
; ekranı sil.
lda
#$07
; kayma miktarının ilk değerini
sta
xpos
; “xpos” adresine yaz
lda
#<text0
; Scroll için text’in hafıza adresini
ldx
#>text0
; LO HI şeklinde
sta
tbase+1
; programdaki karakter
stx
tbase+2
; okuma kısmına yaz.
lda
#<int0
; kendi interrupt rutinimizin
ldx
#>int0
; başlangıç adresini
sta
$0314
; interrupt vektörlerine
stx
$0315
; kopyala
lda
#$00
; Bu komutlar mutlaka
ldx
#$01
; olmalıdır ve
ldy
#$7f
; standarttır.
sta
$dc0e
; CIA1 zamanlayıcılarını sıfırla
stx
$d01a
; Raster interrupt enable olacak
sty
$dc0d
; CIA1 interrupt kontrol registeri
cli
; interruptları serbest bırak
jmp
*
; normal kod sonsuz döngü olsun
int0
inc
$d019
; Bir sonraki interrupta izin ver
lda
xpos
; Kayma miktarını
sta
$d016
; VIC kontrol (scroll) registerine ver.
lda
#$38
; interrupt yapılacak raster değerini
raster0
cmp
$d012
; VIC’in raster registeriyle karşılaştır.
bne
raster0
; eşit değilse tekrar karşılaştır.
ldx
#$00
; Eşit olmuş ve sayıcıyı sıfırlayalım.
loop0
lda
colortab,x
; Renk tablosundan o anki renk değerini al
sta
$d020
; VIC’in ekran dış renk registerine yaz.
sta
$d021
; VIC’in ekran iç renk registerine yaz.
ldy
delaytab,x
; Gecikme tablosundan o anki değeri al
delay0
dey
; değeri 1 azalt
bne
delay0
; “0” olmadıysa tekrar azaltma yap.
inx
; Sayacı 1 arttır.
cpx
#$13
; $13 (19) olmuşmu?
bne
loop0
; olmadıysa işlemleri tekrarla.
lda
#$08
; VIC’in scroll registerine
sta
$d016
; normal değerini yaz.
wait
lda
$d012
; Raster registerini oku.
bne
wait
; “0” oluncaya kadar bekle.
jsr
scroll
; Scroll rutinini git.
jmp
$febc
; İnterrupt rutininden çık.
scroll
dec
xpos
; Kayma miktarını 1 azalt
bpl
exit
; Sonuç pozitif ise (0-127 arasındaysa) çık.
lda
#$07
; Negatif ise (128-255 arasındaysa)
sta
xpos
; kayma miktarını 7 yap
ldx
#$00
; Karakter sayacı=0
scr
lda
$0451,x
; Ekrandaki karakterleri
sta
$0450,x
; sola kaydır
inx
; sayacı 1 arttır.
cpx
#$27
; 39 oldumu?
bne
scr
; olmadıysa tekrarla
tbase
lda
text0
; hafızadan yeni karakter değerini oku
bne
nextchar
; Okunan değer 0 (yazı sonu) değilse git
lda
#<text0
; Hafızadaki yazının
ldx
#>text0
; başlangıç adresini
sta
tbase+1
; programdaki karakter okuma
stx
tbase+2
; kısmına yaz
rts
; ana rutine geri dön
nextchar
sta
$0477
; yeni karakteri 39. Sütuna yaz.
inc
tbase+1
; karakter okuma adresinin LO byte’ını 1 arttır.
bne
exit
; 0 olmadıysa çık.
inc
tbase+2
; olduysa HI byte’ı 1 arttır.
exit
rts
; Ana rutine geri dön.
text0
.scrl "iste karsinizda 1x1 scroll rutini 2003 hades.. "
.byte 0
; Bu sayı yazı sonunu gösterir ve mutlaka olmalıdır.
colortab
.byte 0,2,10,7,1,7,10,2,0,006,0,2,10,7,1,7,10,2,0
;renk tablosu
delaytab
.byte 6,8,08,1,7,8,8,8,9,117,8,8,8,8,9,8,7,1,9,1
;gecikme tablosu
xpos
.byte 7
; kayma miktarı
.end

Ve işte karşınızda 1x1 “text scroll” ve “color raster” programının ekran görüntüsü.....