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.