İ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ü.....