HADES' BASIC

NEREDEN : İSTANBUL NİCK / GRUP(LAR) : HADES / HI3S WEB SİTE : WWW.HI3S.ORG HTTP://HADES6510.SITEMYNET.COM

(C64ASM V1.1 ile compile edilecek şekilde yazılmıştır.) Herkese tekrar merhaba. Geçen sayımızda C64’ün yetersiz olan BASIC komutlarına yeni komutların nasıl eklendiğini görmüş ve 4 tane de yeni komut eklemiştik. Bu sayımızda da C64’e işe yarar birkaç komut daha ekliyoruz. Yeni komutlarımızın 9 tanesi sprite ile ilgili, 1 tanesi ise kursörü ekranda istediğiniz yere yerleştirmenizi sağlayan “CURSOR” komutu. Bildiğiniz gibi “SPRITE” C64’ün yazı ve grafiklerinden bağımsız olan, programlanabilen ve çeşitli özellikleri olan hardware tabanlı grafik elemanlarıdır. Oyunlarda yönettiğiniz kahramanlar, araçlar, düşmanlar, hareketli şekiller hep sprite’tır. C64’ün oyun bolluğu bu sprite’ların sayesindedir. Buraya kadar her şey güzel ama C64’ün “her güzelin bir kusuru vardır” sözünü doğrulayan bir kusuru vardır. Gerek sprite, gerek ses olsun C64’ün bu özelliklerini kullanabilmenizi sağlayan hiçbir komutu yoktur. Ekranda bir sprite gösterebilmek için en az 4 tane POKE komutu kullanmanız gerekmektedir. Yeni komutlarımız sizleri POKE komutu yazmaktan kurtaracaktır. Komutların kullanımı çok basittir. Aslında komutlar bu kadar fazla değildi. Bazı komutların parametreleri opsiyonel durumdaydı, yani kullanma zorunluluğu yoktu. Bu parametrelerin ayrı bir komut altında kullanılabilmesi için değişiklik yaptım. Sprite komutlarımızın neler olduğuna geçmeden önce biraz da “CURSOR” komutundan bahsedelim. C64’ün BASIC komutları arasında maalesef kursörle ilgili bir komut bulunmamaktadır. Ekranın herhangi bir yerine bir şeyler yazmak istediğinizde tırnak işaretleri arasında bol miktarda –kursör aşağı ve kursör sağa– karakterlerini kullanmanız gerekmektedir. Yeni komut ile bunların hiçbirisine gerek kalmayacak. Mesela CURSOR 10,20:PRINT “C64 TURKIYE” ile 10. satır 20. sütundan itibaren “C64 TURKIYE” yazısını yazmış oluyorsunuz. Konuyu daha fazla dağıtmadan SPRITE komutlarımızı açıklayalım. 1- SPRITE sprnum, açık/kapalı : Bu komut ile istediğiniz sprite’ı açıp kapatabilirsiniz. Sprite’ın ekranda gözükmesi için koordinatlarının uygun sınırlar arasında olması gereklidir. Mesela 24,20 (x,y) koordinatlarında bulunan bir sprite gösterilmeyecektir. (Laf aramızda eğer BORDER’leri ortadan kaldırırsa alt ve üst Y koordinatı sorun olmaz ☺ ) 2- SPRPOS sprnum, x-koor, y-koor : Yukarıda bahsettiğimiz koordinatları bu komutla girebilirsiniz. Bir sprite’ın ekranda tam olarak gözükeceği ilk koordinatlar x=24 y=50’dir. 3- SPRPNT sprnum, göstergeç : Sprite’ın şekil datalarının alınacağı hafıza adresini VIC’e bildirmek için kullanılır. Bu komut default pointer adresleri olan $07F8-$07FF arasını kullanır. Eğer VIC BANK ve/veya ekran belleğinin yeri değiştirilmişse sprite’ın şekli bozuk olacaktır. Aslında VIC BANK ve ekran belleği kontrolü yapan ve adresleri ayarlayan bir rutin programa eklenebilir. 4- SPREXP sprnum, x-genişletme, y-genişletme : Bu komut ile sprite’ınızın X ve Y eksenlerinde 2 kat genişleme özelliğini ayarlayabilirsiniz. 5- SPRMUL sprnum, açık/kapalı : Hangi sprite’ın multicolor modda görüneceğini bu komut ile ayarlayabilirsiniz. 6- SPRMCL renk1, renk2 : Bu komutla multicolor sprite renklerini girebilirsiniz.

7- SPRCOL sprnum, renk : Sprite’ların rengini bu komutla değiştirebilirsiniz. 8- SPRIOR sprnum, öncelik : Bu komut ile sprite’ların normal yazı karakterlerinin önünde mi yoksa arkasında mı gözükeceğini belirleyebilirsiniz. 9- SPRALL açık/kapalı : Bu komut ise bütün sprite’ları açabilir veya kapatabilirsiniz. Bu komuttan önce bütün sprite’ların x ve y koordinatları, göstergeçleri vs. girilmiş olması gerekmektedir. 10- CURSOR satır, sütun : Bu komut ile artık PRINT komutuyla yazıyı ekranda istediğiniz yere rahatça yazdırabileceksiniz. Şimdide gelelim komutlardaki parametrelerin aldıkları değerlere... SPRNUM : Sprite numarası demektir ve 0...7 arasında olması gerekmektedir. 8 ve yukarısı değerler hata verir. AÇIK / KAPALI : Bu parametre ile ilgili özelliğin açık veya kapalı olması seçilir. 0: Kapalı, 1: Açık demektir. 2 ve yukarısı değerler hata verir.

X-KOOR : Sprite’ın ekrandaki pozisyonunun X koordinat değeridir. 0...65535 arasında bir değer alabilir. 65536 ve yukarısı değerler hata verir. 255’ten büyük X koordinatları için Extra X-koordinat biti otomatik olarak ayarlanır. Bu durumda bir sprite’ın alabileceği X-koordinat değeri en fazla 511 olabilir. Bir sprite’ın ekranda tam olarak görüntülenebileceği minimum X-koordinat değeri 24’tür. Eğer sprite X ekseninde genişletilmemiş ise ekranda tam olarak görüntülenebileceği maksimum X koordinat değeri ise 320’dir. 320’den itibaren sprite görüntüden çıkmaya başlar. Eğer OPEN SIDE BORDER demo tekniğini kullanırsanız 320’den sonraki koordinatlarda da sprite görünüyor olacaktır. Y-KOOR : Sprite’ın ekrandaki pozisyonunun Y koordinat değeridir. 0...255 arasında olmalıdır. 256 ve yukarısı değerler hata verir. Normalde bir sprite’ın ekranda tam olarak görüntülenebileceği minimum Y koordinat değeri 50’dir. GÖSTERGEÇ : Bir sprite’ın şekil datalarının tutulduğu bellek adresleri göstergeç ile VIC’e bildirilir. 0...255 arasında olmalıdır. 256 ve yukarısı değerler hata verir. GÖSTERGEÇ * 64 = ŞEKİL DATA ADRESİDİR. Bu komut sadece VICBANK 0’da ve EKRAN BELLEĞİNİN YERİ DEĞİŞMEDİYSE geçerlidir. İsteyen source code’a VIC bank ve ekran belleği adres kontrolü ekleyebilir. X-GENİŞLETME, Y-GENİŞLETME : Sprite’ın X ve/veya Y eksenlerinde 2 kat büyümesini kontrol edebilirsiniz. 0: Genişleme yok, 1: Genişleme var demektir. 2 ve yukarısı değerler hata verir. RENK, RENK1, RENK2 : 0...255 arasında olmalıdır. 256 ve yukarısı değerler hata verir. İlk 0...15 arası renk değerleri her 16 sayıda tekrar eder. Yani herhangi bir renk değerine 16 eklerseniz yine aynı rengi elde edersiniz. ÖNCELİK : Bu parametre ile bir sprite’ın ekrandaki bir karakterin önünde veya arkasında olmasını sağlayabilirsiniz. 0 ise sprite önde, 1 ise arkada gözükecektir. 2 ve yukarısı değerler hata verir. SATIR, SÜTUN : Kursörün ekranda gözükeceği satır ve sütun değerini bildirmeye yarar. Satır değeri 0...24, sütun değeri 0...39 arasında olmalıdır. Satır için 25 ve yukarısı, sütun için 40 ve yukarısı değerler hata verir. Yukarıdaki açıklamalardan sonra C64’te sprite kullanmak artık çok basit olacaktır. Daha önce bir “sprite editör” ile sprite’larınızı hazırlayın. Sonra sprite komutlarıyla denemeler yapın. Bir gecikme rutini (işte size bir BASIC komutu daha : DELAY süre ile gecikme yaptırabiliriz.) SPRPNT komutuyla bir sprite’ın datalarının alınacağı adresi değiştirirseniz basit bir animasyon yapmış olursunuz. Programın assembler listesinin sonunda iki adet BASIC program listesi göreceksiniz. Birincisi C64’ün POKE komutlarıyla sprite hareket ettirirken ikincisinde bu iş için yeni komutları kullanacağız. Bu arada bazı temel BASIC komutlarını bildiğinizi varsayıyorum. Mesela PRINT, FOR-NEXT vs..

*=$c000 
lda 
#<yeni 
ldx 
#>yeni 
sta 
$0308 
stx 
$0309 
rts 
yeni  
lda 
$7a 
ldx 
$7b 
sta 
$fb 
stx 
$fc 
lda 
#<comset 
ldx 
#>comset 
sta 
$fd 
stx 
$fe 
ldx 
#$00 
ldy 
#$00 
loop0  
jsr 
$0073 
sta 
$02 
loop1  
lda 
($fd),y 
cmp 
$02 
bne 
nextcom 
iny 
tya 
cmp 
comlen,x 
bne 
loop0 
exec  
txa 
asl 
tax 
lda 
comexe+1,x 
pha 
lda 
comexe,x 
pha 
rts 
nextcom 
lda 
comlen,x 
clc 
adc 
$fd 
sta 
$fd 
bcc 
next0 
inc 
$fc 
next0  
inx 
cpx 
commax 
bne 
loop1 
lda 
$fb 
ldx 
$fc 
sta 
$7a 
stx 
$7b 
jmp 
$a7e4 
;--------------------------------------------------------------------- 
commax 
.byte 10 
comlen 
.byte 6,4,6,4,6,6,6,5,6,5 
comset 
.text "sprite" 
.text "spr" 
.byte $b9 
;POS 
.text "sprpnt" 
.text "spr" 
.byte $bd 
;EXP 
.text "sprmul" 
.text "sprmcl"
.text "sprcol" 
.text "spri" 
.byte $b0 
;OR 
.text "sprall" 
.text "curs" 
.byte $b0 
;OR 
comexe 
.word sprite-1 
.word sprpos-1 
.word sprpnt-1 
.word sprexp-1 
.word sprmul-1 
.word sprmcl-1 
.word sprcol-1 
.word sprior-1 
.word sprall-1 
.word cursor-1 
;--------------------------------------------------------------------- 
sprite 
jsr 
spritex 
bcs 
spron 
and 
$d015 
jmp 
cont1 
spron  
ora 
$d015 
cont1  
sta 
$d015 
jmp 
$a7ae 
;--------------------------------------------------------------------- 
sprpos 
jsr 
comspr 
jsr 
$aefd 
jsr 
$b7eb 
stx 
spry 
ldx 
sprnum 
lda 
$15 
beq 
noext 
lda 
on,x 
ora 
$d010 
jmp 
cont2 
noext  
lda 
off,x 
and 
$d010 
cont2  
sta 
$d010 
txa 
asl 
tax 
lda 
$14 
sta 
$d000,x 
lda 
spry 
sta 
$d001,x 
jmp 
$a7ae 
;--------------------------------------------------------------------- 
sprpnt 
jsr 
comspr 
jsr 
common 
txa 
ldx 
sprnum 
sta 
$07f8,x 
jmp 
$a7ae 
;--------------------------------------------------------------------- 
sprexp 
jsr 
spritex 
bcs 
sprex 
and 
$d01d 
jmp 
cont3 
sprex  
ora 
$d01d 
cont3  
sta 
$d01d
jsr 
common 
jsr 
spritex2 
bcs 
sprey 
and 
$d017 
jmp 
cont4 
sprey  
ora 
$d017 
cont4  
sta 
$d017 
jmp 
$a7ae 
;--------------------------------------------------------------------- 
sprmul 
jsr 
spritex 
bcs 
multi 
and 
$d01c 
jmp 
cont5 
multi  
ora 
$d01c 
cont5  
sta 
$d01c 
jmp 
$a7ae 
;--------------------------------------------------------------------- 
sprmcl 
jsr 
$b79b 
stx 
$d025 
jsr 
common 
stx 
$d026 
jmp 
$a7ae 
;--------------------------------------------------------------------- 
sprcol 
jsr 
comspr 
jsr 
common 
txa 
ldx 
sprnum 
sta 
$d027,x 
jmp 
$a7ae 
;--------------------------------------------------------------------- 
sprior 
jsr 
spritex 
bcs 
pri 
and 
$d01b 
jmp 
cont6 
pri 
ora 
$d01b 
cont6  
sta 
$d01b 
jmp 
$a7ae 
;--------------------------------------------------------------------- 
sprall 
jsr 
$b79b 
jsr 
spritex2 
bcs 
allon 
lda 
#$00 
.byte $2c 
allon  
lda 
#$ff 
jmp 
cont1 
;--------------------------------------------------------------------- 
cursor 
jsr 
$b79b 
cpx 
#$19 
bcs 
error  
stx 
line 
jsr 
common 
cpx 
#$28 
bcs 
error 
stx 
column 
ldx 
line 
ldy 
column 
jsr 
$e50c 
jmp 
$a7ae 
error  
jmp 
$b248 
;--------------------------------------------------------------------- 
spritex 
jsr 
comspr
jsr 
common 
spritex2 
cpx 
#$02 
bcs 
error 
cpx 
#$01 
beq 
onspr 
offspr 
ldx 
sprnum 
lda 
off,x 
rts 
onspr  
ldx 
sprnum 
lda 
on,x 
sec 
rts 
;--------------------------------------------------------------------- 
comspr 
jsr 
$b79b 
cpx 
#$08 
bcs 
error 
stx 
sprnum 
rts 
;--------------------------------------------------------------------- 
common 
jsr 
$aefd 
jsr 
$b79e 
rts 
;--------------------------------------------------------------------- 
spry  
.byte 0 
sprnum 
.byte 0 
on 
.byte 1,2,4,8,16,32,64,128 
off 
.byte 254,253,251,247,239,223,191,127 
line  
.byte 0 
column 
.byte 0 
.end
C64 BASIC KOMUTLARI 
HADES BASIC KOMUTLARI 
10 PRINT CHR$(147):REM EKRANI SIL 
15 POKE 53280,6:POKE 53281,0:POKE 646,1 
20 PRINT:PRINT REM KURSORU 2 SATIR 
ASAGI AL. (KURSOR 4.SATIRDA) 
25 PRINT “        C64’TE SPRITE 
KULLANMAK.” 
30 FOR F=0 TO 64:POKE 832+F,255:NEXT 
40 POKE 2040,13:REM 632/64 
50 POKE 53264,0 
60 POKE 53287,7 
70 POKE 53269,1 
80 X=24:Y=50 
90 POKE 53249,Y 
100 X=X+1:IF X<256 THEN POKE 53248,X: 
GOTO 90 
110 POKE 53264,1:X=24 
120 POKE 53248,X 
130 X=X+1:IF X<90 THEN 120 
140 GOTO 50
10 SYS 58692:REM CLS KOMUTU 
15 POKE 53280,6:POKE53281,0:POKE 646 
,1:REM BORDER 6:REM PAPER 0:REM INK 1 
20 CURSOR 3,8: REM KURSOR 4. SATIRDA 
25 PRINT “C64’TE SPRITE KULLANMAK.” 
30 FOR F=0 TO 64:POKE 832+F,255:NEXT 
40 SPRPNT 0,13 
50 REM 
60 SPRCOL 0,7 
70 SPRITE 0,1 
80 X=24:Y=50 
90 SPRPOS 0,X,Y 
100 X=X+1:IF X<346 THEN 90 
110 GOTO 80

Gördüğünüz gibi program hem kısalmakta hem de basitleşmektedir. C64’ün BASIC komutlarında bir sürü adres bilmeniz gerekirken yeni komutlarda bunlara gerek kalmamaktadır. Bu arada zaman yetersizliğinden dolayı assembler listesinde açıklama yapamadım. Anlamadığınız yerler olursa foruma yazabilirsiniz.