Bu sayfadaki yazılar
Sayfanın metni
Sayfa 23
PROGRAM ADI
: SPRIİTE DEMO 2 duk. Bir ufak tavsiyemiz var. Özellikle monitörü olmayıp da normal televizyon ekranı kullanan arkadaşlar için. Tek renkli sprite dizaynı yaparken, sağı ve solu boş olan tek noktalar kullanmaktan kaçının. Bunları ekranda görmeniz çok zor olacaktır. Yanyana iki nokta daima daha iyi görüntü verecektir. Bu tamamen video sinyallerinin teknik özelliğinden kaynaklanan bir sorun. Çokrenkli sprite'ler için böyle bir sorun yok. Nasılsa her renk noktası iki kat genişlikte. Tüm bu işlemleri elde yaptığımızda, bir süre sonra alışkanlık kazanacaksınız. Ancak gene de, ben zahmete girmek istemiyorum derseniz, daha önceki sayılarımızda yayınladığımız sprite editörlerini kullanmanızı tavsiye edebiliriz (Sayı 6, Sayı 9). Sıra geldi bu 63 byte'ı nereye yerleştireceğimize. Bu yerleşim bölgelerinin her biri *blok”' adı ile bilinir ve 64'er byte'lık alanlardır. Tabii bize 63 byte gerektiği için, 64. byte'ın bir anlamı olmayacaktır. VIC'in bir defada hafızanın 16K'lık bölümünü görebildiğini ve C64'ün 64K'lık hafızasının bu nedenle BANKO-BANK3 isimleriyle tanımlanan dört hafıza blokuna bölündüğünü 12. ve 11. sayılarımızda belirtmiştik. 16K'yı, 256 adet 64 byte'lık par-
00010 V>53248:POKE E V*21,0 <161> 09020 INPUT "<CLROHIİZ CLR>" <a20> 00030 Alzi1k64 <061> 00040 FOR TO A:POKE AL*I, XT <033> 20050 POKE 2040,11:POKE <164> 00060 POKE <182> 00078 POKE 20080 POKE Vt*23,144:POKE 90090 POKE V4*21,144 <018> 00100 POKE V*4*37,7 <158)> 00110 POKE V*38,6 00120 POKE <127)> 00138 POKE <853> 90140 POKE V*4*1,100:POKE V4*5,108 09150 X2z255 <a24> 00160 POKE V4*0,0:POKE V*4,X2 <145> 00170 POKE V*4*30,0 <028> 00188 FOR TO 255 STEP HZ <a55> 00190 IF THEN 240 <044> 200200 X2-X2-1:POKE <058> 002106 POKE V*1,40x5IN<X0/30) 41100 <236)> 00220 POKE <114> 00230 NEXT <a240> 90240 FOR TO 255:POKE V*4*33,X:POKE 1,X-1:NEXT <149> 09250 POKE V4*30,0:PRINT "<HOME 631,ASCC"<HOME>"):POKE i 98,1 <113> 0920260 DATA 8,0,128,10,2,128,2,138,0,64,13 '6,5,80,168,21,84,32,93,117,33,1825 <114> “ 900270 DATA 125,101,253,127,103,253,123,10 | “3,173,123,103,173,123,103,173 00280 DATA 1İ23,103,173,123,103,173,123,10“ 93,253 <185> 00290 DATA 95,101,253,21,97,117,5,32,84
çalara ayırabilir ve bunları 0-255 arası numaralayabiliriz. Bilgisayar ilk açılışta BANKO'ı kullandığına göre, 64 byte'lik bloklarımızın başlangıç adresleri aşağıdaki gibi olacaktır.- -
BLOK BAŞLANGIÇ ADRESİ
0 80000 (0) 1 $0040 (64) 2 $0080 (128) 3 $00CO0 (192) 4 $0100 (256)
255 $3FCO (16320)
0-1 arası bloklar ve 12. blok, bilgisayar için hayati değeri olan bilgileri saklandığı bölgeye geldiği için kullanılmamaktadır. 16-32 arası bloklar için de bu sözkonusu. 33 ve sonra gelen bloklar, BASIC programlarınızın ve kullandığınız değişkenlerin saklandığı hafızaya denk geliyor. 11, 13, 14, 15 numaralı bloklar boş kaldığına göre onları kullanabiliriz. Yalnız dikkat etmeniz gereken nokta, 13-15 arası aynı zamanda teyp için tampon bölge olarak kullanılmaktadır. Dolayısıyla bu bölgeleri sprite için kullanır, sonra da teyp ile bazı işlemler yaparsanız, sprite tanımlamalarınız bozulacaktır.
Bir başka olanak da, normalde $0801 (2049) adresinde başlayan BA-SIC hafızasının başlangıç adresini, 43/44 numaralı hafızalarda değişiklik yaparak “yukarı' kaydırmaktır. Bilgisayar ilk âçıldığında, bu adreslerin değeri sırasıyla 1 ve 8'dir, 14 8*256- 2049 ettiğine göre, BASIC bölgesi 2049 ($0801) adresinden başlıyor demektir. Eğer biz POKE 44,10 yaparsak bu adresi 1 4 10*256 — 2561 adresine taşımış oluruz ve arada kalan bölge bize 8 yeni blok sağlar. Ancak bu POKE işlemi hafızada herhangi bir BASIC programı yokken yapılmalıyoksa programınız bozulur.
Veya 16K”'nın son kısımlarında yeralan blokları kullanabilirsiniz. Bu durumda dikkat etmeniz gereken şey, BASIC programınızın veya kullandığınız değişkenlerin bu bölgelere kadar uzanabilmesi durumunda tanımlamalarınızın bozulacağıdır. Buna da bir çözüm bulabiliriz. Nasıl ki, 43/44 adreslerinde BASIC başlangıç adresi bulunuyor, 55/56 adreslerinde de BA-SIC hafızasının tavanı tamamlanır. Bunu nasıl kullanabiliriz?.. Diyelim ki, 248-255 numaralı blokları kullanmak istediniz. 248 numaralı blokun başlangıç adresi, 248 x 64 — 15872 ($3E00) olduğuna göre BASIC hafızasının tavanını bu adrese getirip
| tanımlamalarımızı koruyabiliriz. Bu durumda 15872'yi küçük ve büyük byte olarak (bkz. Sayı 13, Süperassembler) ikiye ayırmamız gerekiyor. Bunlar, 62 ($3E) ve 0 ($00) değerleridir. Şimdi de POKE 55,0:POKE56,62 ile sınırı aşağı indirmiş oluruz. Son iki işlemin ortak iki noktası var. Her ikisinde de geri kalan BASIC kullanım alanı 38911 byte'dan daha az oluyor. Çünkü bunun bir kısmını sprite'lara feda ediyoruz. Bir başka nokta da, $1000-$1FFF (4096-8191) arasında bulunan 64-127 numaralı blokların hiç kullanılmaması gerektiği. Çünkü bu bölge, 12. sayımızda da sözünü ettiğimiz bölgedir. Ancak, şunu belirtmek gerekiyor. İki üç sprite kullanmanız gerekiyorsa, 11, 13, 14 ve 15 numaralı blokları kullanmanızda büyük fayda var. Hem kolaylık hem de hafıza kullanımı açısından. Üstelik birazdan da göreceğimiz gibi, iki değişik sprite aynı görüntüye sahip olacaksa, iki ayrı blok yerine tek blok kullanma imkânımız var.
DEMO 2 programımızda olduğu gibi.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 22
2!Byte GBl!lkk..kk..!Byte 3iIByte 1Byte 41Byte İ2!kxk.. 5SiByte 15!kk.. 4k kk 10!Byte 30!4xk.. 111Byte 33!*k.. !Byte 12!Byte 4k 13!Byte 33!kk.. 15!Byte kk 16!Byte 17!Byte 18!Byte kk 13!Byte saptar. Bunu da şu şekilde gösterebi- BİT KAYNAK
74000 Saydam (ekran rengi) 001 VIC'in 37. yazmaçı
7010 VIC'in 38. yazmaçı
VIC'in 39-46 arasını yazmaçları
Bir başka özellik de, ekranda tekrenkli ve çokrenkli sprite'ların aynı anda gösterilebilmesi. Örneğin, 3 çokrenkli ve 5 tekrenkli sprite kullanma
olanağımız var. Bir sprite'ın hangi renklendirme türünde olacağını, VIC'in 28 numaralı yazmaçı saptar. Bu yazmaçın her bir bit'i bir sprite'ı temsil eder. Örneğin 0. bit 0. sprite'a, 6. bit 6. sprite'a karşılık gelir. Eğer bir sprite'a ait bit 1 değerini almışsa, o sprite çokrenkli gösterimi kullanacak demektir. Bir örnek görelim: Diyelim ki 4 numaralı sprite çokrenkli olacak. Vereceğiniz komut, POKE 53248+28,2^4 olacaktır. Veya, daha fazla sprite'ı çokrenkli
.1Byte .1Byte Hk... .1Byte Hk... 20! 231 .1Byte 23!kk.. 4k...
1 1 1 1 1 1 1 ! .!Byte 1 1 1 1
38!kk.. kk... 47! kk... SOlxk.. ka... .1Byte Mk...
Daha önceleri de gördüğümüz gibi, iki bit'in alabileceği değerler 0-3 arası değişmekteydi. İşte yanyana duran ve tablomuzda da gösterdiğimiz ikişerli bit gruplarının alacağı 0-3 arası değer, karşılık geldiği renk noktasının renginin hangi kaynaktan geleceğini yapmak isteyebilirsiniz, örneğin 1, 5 ve 7'yi. Bu durumda da POKE 53248+28, 1 OR 32 OR 128 vereceksiniz. Bir sprite yaratırken, ilk yapılacak iş 63 byte'lık bilgiyi oluşturmak ve bu bilgiyi hafızanın içinde uygun bir yere yerleştirmek. Önce 63 tane byte'ın nasıl oluşturulacağına bakalım. Kolaylık olması amacıyla, sprite'ı oluşturan 21 sıranın sadece ilkini ele alalım. Nasılsa diğerleri de aynı şekilde hesaplanıyor. Ve diyelim ki, sprite'ımızın ilk satırı, bir dolu, iki boş, bir dolu, iki boş... şeklinde olsun. Bu-
nu bir ve sıfır kullanarak gösterirsek:
100100100100100100100100100
Her bir satırımız üç byte'dan oluştuğuna göre bu-satırı üç parçaya ayıralım:
97010010010 9001001001 97000100100
Bunların her birinin onluk sistemdeki karşılıklarını da bulalım:
146 73 36
Demek ki, sprite'ımızı oluşturan 63 byte'ın ilk üçünün değerleri 146, 73 ve 36 olacaktır. Eğer yukarıda verdiğimiz satır, sprite'ımızın 15. satırı olsaydı, bulduğumuz bu değerler, sırasıyla 45, 46 ve 47 numaralı byte'ların içerikleri olacaktı (tablomuza bakınız). Çokrenkli sprite dizaynı biraz daha karmaşık. Bu sefer noktaların dolu veya boş olmasını değil de, hangi renkte olması gerektiğini bilmemiz gerekiyor. Gene diyelim ki sprite'ın ilk satırını oluşturan 12 renk noktasının sırayla, 0, 1,2,3,2,1,0,1,2,3,2, 1 renklerinden oluşmasını istiyoruz. Bu sayıların ikili sistemdeki karşılıklarını yanyana yazarak elde edeceğimiz sıfır-bir dizisi şu şekilde olacaktır:
0001101110001000110111001 Gene üçe ayıralım:
00011011 10010001 10111001
Değerlerini de hesaplayalım:
21 145 185
Demin olduğu gibi, ilk üç byte'ın veya dilediğimiz satırı oluşturan üç byte'ın alacağı değerleri bulmuş ol-