YAYINCININ NOTU
AYCUK
Teleteknik A.Ş. adına
Sahibi ve Sorumlu Yazıişleri Müdürü Osman BABAOĞLU
Yayın Yönetmeni İskender SAVAŞIR
Yayın Koordinatörü A. Ziya BAYMAN
Danışma Kurulu Bilal Sadi OĞUZ Yusuf BİTON Bülent ÖZÜKAN Emre SENAN
Yayın Kurulu Kenan AKKERMAN Seyfettin ÇANKAYA Ömer ERKMEN Tuna ERTEMALP Mustafa GÜVEN Turhan TANDOĞMUŞ Ayşegül TARIM
Fotoğraflar Mehmet ÖZCAN
Baskı Öncesi Hizmetler ve Yönetim BOYUT Reklam/Tanıtım Hizmetleri Yayıncılık ve Ticaret A.Ş.
Teknik Yönetmen Sevinç YENAL
Grafik Saadettin OKTAY. Dizgi Hüsnü ABBAS, Hamit BALABAN
Reklam ve Halkla İlişkiler Aysın AYDEMİR
Kapak Düzeni MARKOM A.Ş.
Katkıda Bulunanlar Sema AKÇAY, Birgül ASENA, Silva AVEDİKOĞLU, İlkay BODUROĞLU, Cafer BULUT, Türkan ÇEBİOĞLU, Öjeni GÜLLAPYAN, Derya KÖROĞLU, Mehmet SARIYAR, Ankin SİNANYAN, Esra SİPAHİOĞLU, Garo TAŞÇIYAN, Mahmure ÜNYELİ
Film ve Renk Ayrımı: Laçin Repro Baskı: Alaş Matbaası
Kapak Renk Ayrımı: Güven Reprodüksiyon
KKTC Satış Fiyatı: 1850 TL.
BEYAYINCININ NOTU
Bilgisayar kelimesinin ilk andaki çağrışımı hemen hemen hepimiz için gelişmiş bir hesap makinesi olmayı sürdürüyor. Televizyondaki banka veya sanayi kuruluşlarının rakamlarında izlediğimiz bir oda dolusu madeni dolaplar görüntüsündeki büyük hesap makineleri... Gözümüzün önünde bu görüntüler olunca da doğal olarak bilgisayar ve müzik ya da resim arasında bir bağlantı kurmak pek aklımıza gelmiyor. Halbuki olaya biraz soyutlayarak baktığımızda bu bağlantı hiç de şaşırtıcı değil: Resim dediğimizde optik, müzik dediğimizde de akustik “bilgiler toplamından” bahsediyoruz aslında. Bilgisayarımız bu bilgileri işleyip yeniden üretebilecek yapıya sahipse istersek bir orkestra istersek bir tuval işlevini üstlenebiliyor. Commodore ev bilgisayarlarının yapısı bilhassa ses ve grafik özelliklerinin gelişmiş olmasına önem verilerek tasarlanmış. Bu yaklaşımın nedeni ev bilgisayarlarından beklenenin banka hesapları tutmaktan ziyade bilgisayar ile olan ilişkiyi zevkli bir uğraş haline getirecek olanakları sunabilmek olması. Bu tanıtılması bildiğiniz gibi dergimizin ağırlıklı konularını oluşturuyor. 3. sayımızda “Bilgisayar ve Müzik” konusuna özel bir bölüm ayırmıştık. Bu sayımızda da Commodore'un grafik özelliklerini tanıtıcı “Ekran Cinlerimizin” yanısıra Bilgisayar ve Grafik konusunu daha geniş bir açıdan inceleyen “Bilgisayar Devrimi ve Görsel Sanatlar” ve “Bilgisayarla Yeni Görsel Ufuklara” yazıları yer alıyor. Makine Dili ile ilgilenen okurlarımız bu sayımızda Baytan Bitirmez'in yazısını görmeyince “Yoksa bitirdi mi?” diye telaşlanmasınlar. Bu ay Baytan Bulunmaz olan Sayın Baytan'ın elinde yeni yazılarla aniden karşımıza çıkacağından hiç şüphemiz yok. Önümüzdeki ay hep beraber buluşmak üzere.
Osman Babaoğlu
Commodore 64'ünüzün en ilginç özelliklerinden biri hiç kuşkusuz cinlerdir (sprites). Ekran cinleri kendi yaratabileceğiniz ve diğer ekran içeriklerinden ve birbirlerinden bağımsız hareket ettirilebilen grafik dizaynlardır. Ekranda bir defasında toplam 8 ekran cini sergilenebilir.
Ekran cinleri renklerini, boyutlarını, fon karakterleri ve birbirlerine göre önceliklerini değiştirebilirler. İki ekran cini arasındaki ve ekran cinleriyle fon arasındaki çarpışmalar otomatik olarak saptanır. Üstelik her ekran cini için — normal — çok renkli ekran cini modları arasında seçim yapma imkanınız vardır. Tüm bu fonksiyonlar VIC (Video kontrolü 6567) ve sicillerinin yardımıyla kolayca gerçekleştirilebilir. Ancak önce ekran cinlerinin yapısına bir göz atalım. Daha önce de söylediğimiz gibi bir defasında ekranda aynı anda sekiz farklı ekran cinini sergileyebilirsiniz. Her ekran cinine özel bir numara (0-7) ayrılmıştır; bu numara ekran cinine kullanmakta olduğunuz program boyunca eşlik edecektir. Her normal ekran cini 504 noktadan oluşur. Bu 504 nokta birbirlerinden bağımsız olarak kontrol edilir ve değerleri tekrar tekrar değiştirilebilir. Bunun için 24x21'lik bir nokta matrisi kullanılır. Bu yüzden her ekran cini 24 nokta genişlikte ve 21 nokta yüksekliktedir. Bu matris içerisinde çeşitli grafikler ya da şekiller yaratabilirsiniz.
Cin Tasarlamak
O halde nasıl var edeceğiz bir cini? Tanımlayarak... Cinleri tanımlamak zor zanaattır. Bu yüzden okurlarımıza biraz sabırlı olmalarını tavsiye edeceğiz. Her cinin bellekte 24 x 21 nokta olarak saklandığını söylemiştik (eğer çok renkli ise 12x21). Her noktaya bir bit tekabül ediyor (çok renklide 1 noktaya iki bit). 8 bit bir bayt oluşturduğuna göre cinin kapladığı toplam alanın eni 24/8=3 bayttır.
Cini tanımlamanın ilk adımı bu tablodaki hangi noktaların (karelerin) harekete geçirileceğine karar vermek. Basit bir örnek olsun diye adam şeklindeki bir cin üzerinde karar kılalım.
« 3. Block 2. Block 1. Block * 8 2 64 32 16 8 4 2 1 64 32 16 1 0,0,0 2 0,8,0 3 | 0,28,0 « 1 0,28,0 5 0,28,0 | 6 0,8,0 7 | 0,62,0 8 0,127,0 9 0,221,128 10 0,156,128 11 0,156,128 12 0,156,128 13 | 0,62,0 14 0,54,0 15 0,34,0 16 0,34,0 17 0,34,0 18 0,34,0 19 0,99,0 20 0,0,0 21 | 0,0,0
Bu şekilde ilk harekete geçmiş noktanın 2. satırda 2. blokta dördüncü (numaralarına 0'dan başladığı için 4 no. ile gösterilen) nokta. Yani bu satırda 2. bloğu 00001000 şeklinde gösterebiliriz. Bunun ondalık karşılığı ise 8
(sanırım daha önce anlamadıysanız şimdi anlamışsınızdır: Şekildeki 2. satırdaki 128, 64, 32, 16, 8, 4, 2, 1 gibi sayıların ne anlama geldiğini). 2. satırdaki yanık noktalar ise, 4. 5. 6. noktalar; yani bu satırda ikinci bloğun aldığı değer 00111000. Bunun ondalık karşılığı 16+8+4=28'dir. Böylelikle bütün satırları tarayarak adam şeklindeki cinimizin bellekte hangi noktaları harekete geçirilmesiyle yaratılacağını şematize etmiş oluyoruz. Sonunda yazacağımız programda bu değerleri bilgisayara bir dizi DATA komutuyla girmek işten bile değil (bkz. döküm).
Cin Belleğin Neresinde?
Bizim kullandığımız 24 x 21'lik matris her rastgele herhangi 504 bellek noktasını temsil ediyordu. Bunları belleğin neresine yükleyeceğiz? Yani hangi gerçek bellek noktalarını kullanacağız? Aslında ilk önce RAM'ın (bizim yazabildiğimiz belleğin) herhangi bir bölgesini kullanabiliriz. Ama sık kullanılan, trafiği sıkışık bir bölge seçecek olursak, başka bir işlem bizim yazdıklarımızı değiştirip ekran cinimizi yok edebilir. Bunun için RAM'ın ücra bir köşesini kullanmakta yarar vardır. RAM'ın “en tepedeki” 13. öbeğinden başlayan bölgesi böyle bir bölgedir. İlk 12 öbeği ise işlemci kendi ihtiyaçları için kullanılmaktadır. “Öbek” mi ne demek? Tam olarak biz de anlayamadık ama, anlaşılan bellek bölgelerini saymakta kullanılan bir terim. 4 öbek = 64 bayt. Yani ilk ekran cinimizi (0 numaralı olanı) 13 x 64 = 832 numaralı bellek noktasından başlayarak depolayacağız. Ama işimiz daha bitmedi. Bilgisayara da cin tasarımımızı oraya yerleştirdiğimizi söylememiz gerekiyor. Bu bilginin 2040 numaralı bellek noktasından başlayan bellek noktalarına girilmesi gerekiyormuş (Nereden ille de 2040 biz de anlamadık). O halde daha verileri girmeye başlamadan önce
POKE komutunu girmemiz gerekiyor ki, bilgisayar 0 cinle ilgili bilgilerin 13. öbekte saklandığını anlasın (Bir cin daha yaratacak olsaydık o zaman da POKE 2041, 14 komutunu girmemiz gerekiyordu ki bilgisayar bu sefer 1 numaralı cinin 14. öbekte depolandığını anlasın).
VIC: Bir Cin
Kontrolörü
Sıra geldi bilgilerin işlenmesine: Nasıl seslerle ilgili bilgilerin işlenmesi için SID (ses arabirimi aygıtı) diye anılan ve özel bir bellek bölgesinde saklanan bazı sicilleriniz vardıysa, her türlü görüntü ile bilgileri işleyen VIC (Video Interface Chip-Ekran Arabirimi Yongası) adlı bazı sicilleriniz var. Bunlar 53248 numaralı bellek bloğundan başlıyor, 53294 numaralı bellek bloğuna kadar devam ediyor. Yandaki tabloda en önemli VIC sicillerini, adreslerini ve işlevlerini veriyoruz. Her sicil bir bayt olduğundan her sicile 8 ayrı bilgi verileceğini unutmayın.
Önemli VIC Sicilleri
0 no.lu ekran cininin X koordinatlarının ilk 8 biti burada saklanır. Varsa, 9. bit $D010 (yani 16. sicilde saklanır) $D001: 0 no.lu y koordinatı $D002: 0 no.lu x koordinatı $D003: 0 no.lu y koordinatı $D004-$D00F: Diğer yedi cinin x ve y koordinatları. Örneğin $D002'de 1 no.lu cinin x koordinatı $D003'te y koordinatı saklanır. $D010: Ekran cinlerinin x koordinatlarının 9. biti. Sicilin 8 bit olduğunu hatırlayın. Dolayısıyla 0 no.lu cinin x koordinatının 9. bit değerini 0 no.lu bit, 4 no.lu ekran cinininkini 1 no.lu bit saklıyor. $D011 1. Kontrol Sicili: 0-2 Bitler: Ekranı yukarı aşağı kaydırma 3 Bit: 0 değerini alırsa ekran 24, 1 değerini alırsa 25 satır olur. 4 Bit: 0 değerini alırsa merkezi işlem birimi VIC'ten gelen sinyalleri almaz ve programlarınız biraz daha hızlı çalışır. Ama cinleri kullanabilmek için bunun 1 değerini alması lazım. 5 Bit: 1 değerini aldığında alet standart “bit map” moduna geçiyor. 6 Bit: 1 değerini aldığında ekran geliştirilmiş renk moduna geçiyor. 7 Bit: $D018'den artan değerleri saklıyor (Bu son 3 bit daha sonra ayrıntılı olarak anlaşılabilecek). $D015 En Sevdiğimiz Sicil: Cinlerin ekranda bilfiil görünmesini sağlıyor (0 no.lu bit 0 cinin; 1 no.lusu 1 no.lunun vs.). $D016 2. Kontrol Sicili: 0-2 Bitler: Ekranın sağa/sola kayması 3 Bit: 0 değerini aldığında ekran 38 sütun, 1 değerini aldığında 40 sütun alır. 4 Bit: 1 değerini aldığında çok renkli cinler mümkün olur. 5-7. Bitler: Kullanılmaz. $D01D Şişmanlama Sicili: Her bit bir cine ayrılmıştır. Eğer 0 no.lu bit 1 değerini alırsa 0 no.lu cin bir misli genişler. $D01B Öncelikler: Yine her bit bir cine ayrılmıştır. Eğer 0 no.lu bit 1 değerini alırsa 0 no.lu cinin zemindeki şekillere kıyasla önceliği, 0 değerini alırsa zeminin önceliği var. Cinleri Çok Renklendiren Sicil: Yine her cinin bir biti vardır. 0 bit 1 değerini alırsa 0 no.lu cin çok renklenir. $D017 Uzama Sicili: Her cinin yine kendi biti vardır ve o bit 1 değerini alınca söz konusu cin 1 misli uzar. $D01E Cin Çarpışması Sicili: Bu daha ileriki sayılarda anlatılacak. Cin-Zemin Çarpışması: Bu da daha ileri sayılarda anlatılacak. $D020: Ekran çerçeve rengi. $D021: Zemin rengi. $D022-$D024: 1-3 zemin renkleri. $D025-$D026: Çok renkliliğe geçiş. $D027-$D02E: 0'dan 7'ye kadar çok renkli cinlerin renkleri.
EKRAN0,
Şimdi artık programımızı çalıştırabiliriz. Aşağıdaki program satırlarının çoğu artık açıklama gerektirmeyecek kadar açık olmalı. 70-400 satırlar arasında cin tasarımımızı 832 noktasından başlayarak belleğe yerleştiriyoruz. 110 ve 140. satırların ne anlama geldiğini VIC sicilleri tablosunu inceleyerek anlayabilirsiniz. 150-200 satırlar da, girdiğimiz cinin hareketlerini klavyeden kontrol etmenizi sağlıyor. 210 ve 220 satırlar ise $D010 sicilinin işlevini görmenizi sağlıyor. Hatırlayacağınız gibi herhangi bir sicil en çok 255 değerini alıyor. Eğer cinimiz yatay eksende çok hare-
18
ea
40
SA
78
108
118
izâ
130
156
168
178
180
196
eza
e3a
3aa
Bia
32a
SAA
“1G
Sen
STA
Vz53248
REM DIKEY K
RENK #7
POKE 2A4A,13
FOR SICILsA TÜ
READ CIN
POKE 832*4*SICIL,CIN
NEXT SICIL
PÜKE
PÜKE VY*iİ,Y
PÜKE Y*33,RENK
GET HAREK$
IF HAREK$£-"" THEN
IF THE
IF HâREK$-"A" THE
IF THE
IF THE
IF THEN POK
IF TH
PRINT A.Y
POKE Y,&
POKE
158
DATA
DATA
DATA
DATA
DATA A,221,128,0,
DATA
DATA A,6G2,A,A,5A4,
DATA 0,34,A,A,34,
DATA 4,0,0,34,
590 DATA
SAA DATA
”
;
“
ket eder ve 255'in üzerinde bir x koordinat sayısı gerektirirse o zaman bu değeri gireceğimiz yeni bir yere gerek var demektir. İşte $D010 sicili bu yerdir. 230. satır ise ekranı biraz daha iyi tanımanızı sağlamak üzere cin hareket ettikçe bulunduğu yerin x ve y koordinatlarını veriyor. Kuşkusuz bu programı çalıştırdığınızda ekranda elde ettiğiniz sonuç çok heyecanlandırıcı değil. Ama bu yazının amacı sizi ZÜLKÜF adını verdiğimiz bu sevimli cinle ve onu kontrol eden VIC'le tanıştırmaktı. ZÜLKÜF'ün nelere kadir olduğunu ilerki sayılarda göreceksiniz. O
REM YATAY
OORDINATLAR
150
N
N
N AsAL41
N
E
EN PÜKE
156,128
156,128
a
a
a
N p
/
Zülküf başka bir cinle ya da herhangi bir başka karakterle çarpıştığı takdirde ne olur? Ne olacağını siz tayin edebilirsiniz... Eğer Zülküf başka bir cinle çarpışacaksa, şu genel komut kullanılabilir:
IF PEEK ($D01E) AND X=X THEN (durum)
Burada $D01E çarpışmaları kontrol eden VIC sicili, (durum) ise gerçekleşmesini istediğiniz olay, X de çarpışması istenen cinlerin numaralarıdır. Ancak örneklere geçmeden önce bir hatırlatma yapmakta yarar var:
Cin Numaraları
Daha önce cinlerin 0-7 arası rakamlarla gösterildiğini söylemiştik. Ancak hangi cinin ne yapması gerektiği makineye bildirilirken bu rakamlar değil, 2^n formülü ile elde edilen sayılar kullanılır. Dolayısıyla kendi aramızda, 0, 1, 2 diye adlandıracağımız cinlerden makineye bahsederken şu temsil numaralarını (bundan böyle tn. kısaltmasıyla gösterilecek) kullanacağız:
Cin no. Temsil no. 0 1 1 2 2 4 3 8 4 16 5 32 6 64 7 128
Birden çok cinden birden söz etmek istediğimiz zaman ise, o cinlere ait temsil no.ları toplanır. Şimdi artık cinlerin çarpışmasına dair örnek komutlarımıza dönebiliriz:
IF PEEK (V 430) AND
1—1 THEN GOTO 100
0 no.lu cin başka herhangi bir cinle çarpışırsa, 100 no.lu program satırına git.
IF PEEK (V * 30) AND 6-6 THEN
POKE (V 4 21), PEEK (V 4 21)
AND (255-2-4)
1 ve 2 no.lu cinler çarpışırsa, her ikisi de ekrandan silinsin. Şimdi bu karmaşıklığı biraz çözmeye çalışalım. 1 ve 2 no.lu cinlerden söz ettiğimiz 6'nın 244 olmasından anlaşılıyor. $D015 cinlerin silinmesini sağlayan sicil. Bütün cinler birden görünüyorsa, değeri 128-255 olacaktır. Bizim yapmak istediğimiz, $D015'te mevcut olan değerden, sadece 2 ve 4'ün silinmesini sağlayacak olan değerleri çıkartmak. Bunun için önce mevcut değeri PEEK etmemiz, bunu yalnızca 2 ve 4 no.lu cinlerin silinmesini sağlayacak şekilde yeniden düzenlememiz (255-2-4) ve sonucu yeniden $D015 POKE etmemiz gerekiyor. Eğer çarpışanlar cinler değilse, bir cin başka herhangi bir başka karakterle çarpışıyorsa, ufak bir değişiklik gerekiyor. Örneğin;
IF PEEK (V 431) AND 4-4
THEN PRINT “CLR”
2 no.lu cin herhangi bir karakterle çarpışırsa, yazı ekranını temizle. $D01F, cin-zemin çarpışmalarını yöneten VIC sicilidir.
IF PEEK (V 431) AND 3-3
THEN POKE 29,1
0 veya 1 no.lu cin herhangi bir karakterle çarpışırsa, 0 no.lu cin şişmanlasın (enine büyüsün, $D01D için bkz. bir önceki yazıda VIC sicilleri tablosu). Bütün bu komutlar, cinleri hareket ettiren döngülerin içinde konurlarsa,
5 POKES3281
10
tanımlı koşul gerçekleştiğinde, verilen komutu yaparlar.
Ekran/Görüntü Önceliği
Cinler birbirleriyle çarpışmakla kalmaz, birbirlerinin ya da başka bir karakterin önüne ya da arkasına da geçebilirler. Böylece 3-D efekti yaratılmış olur. Buna öncelik denir. 0 numaralı cin her zaman diğerle-
15
EA
TSİ
25
£Ts8
30 NE
25 POKEYLİ,
40 Psla2
45
SA
BA
65 POKEY,LK
TA
75 POKESA4A,P
Sf 2280, (PEEK
85 PsPti
gü
95 NEXT END
7;129,254,127,189,254,127,255,P254
1010 ,255,252,31,187,248,23,187 4192,
7,129,254,127,189,P54,127,255,254
1040 DATAS3,255,252,31,221,248,2,221,192,
1,255,128,3,255,192,1,195,128,1,231,3
1962 DATAZA, A
7 ,A29,254,127,189,254,127,255,254
DATAS3I,255,252,21,221,248,3,221,192,
1,255,134,3,189,204,1,199,152,1,255,48
A READY.
rinden önde görünür. Daha da genel olarak söyleyecek olursak, küçük numaralı cin büyük numaralı cinin önünde görünür. Yani 7 no.lu cin bütün diğerlerinin arkasında görünür. $D01B sicili cinlerin karakterlere göre önceliğini belirleyen değerleri içerir. Bu sicilin baytlarının gıyabi (per default) değeri 0'dır; dolayısıyla normal olarak bütün cinler karakterlerin önünde görünür. Bu adrese hangi cinlerin toplama temsil no.su yerleştirilirse, o cinler karakterlerin arkasına gizlenebilir. Örneğin;
POKE 53275,1 0 no.lu cin karakterlerin arkasına gizlenebilir.
POKE 53275,255 Bütün cinler karakterlerin arkasına gizlenebilir.
Cinlerle Çizgi Film Yapmak
Çizgi film yapmanın en kolay yolu yapılması/tekrarlanması istenen hareketleri (yürümek, kanat çırpmak vb.) bölümlere ayırmak ve bunlara ait resimleri arka arkaya göstermektir. Biz de bu ilkeden yararlanacağız. Birinci adım resimleri belirlemek ve bunları belleğe kaydetmektir. Örneğin arka arkaya üç farklı resim göstermek hareketi sağlamak için yeterli olsun. Bu üç resim tek veya çok renkli olarak çizilir ve belleğin farklı yerlerine (kolaylık olsun diye arka arkaya) kaydedilir. Biz, örneğimizde 192, 193 ve 194 no.lu blokları kullanalım. İkinci adım, Zülküf'ün tanımlanmasıdır. Temel ilkenin aynı cini farklı şekillerde göstermek olduğunu hatırlayınız. Üçüncü adım bir FOR/NEXT döngüsü içinde hareketi vermektir.
Bizim gibi TRT'ye mahkûm olmayan insanlar için bile televizyon, evlerdeki varlığı kuşkuyla karşılanması gereken bir konuk. Bir kere hepimizi edilginleştiriyor. Bize kendi zevklerini empoze eden, bizim kim olduğumuza aldırmayan kaba bir konuk. Tam artık akşamlarımızın bir daha geri dönmemek üzere bu kaçınılmaz yabancıya teslim olduğunu düşünüyorduk ki, video geldi. Videonun ilk günleri bir şenlikti. Ama galiba artık bu aşamada video kulüplerinin listelerini bir sınırlama olarak hissediyoruz.
Bilgisayar Bize
Akşamlarımızı Geri Verecek
Hem sorun sadece çeşitlilik de değil -seyretmeye, seyirci olmaya zorlanmak. Bunun farkına varanlardan bazıları video kamera satın aldı. Yaş günlerinin, okul toplantılarının, tatil izlenimlerinin, düğünlerin, nişanların kayıtları ekrana yeni bir çeşni kattı. Ama seyrettiğimiz kendimiz bile olsak, seyirciliğin edilginliği aşılamıyor. Galiba istediğimiz akşamlarımıza sahip çıkabilmek. Bunun içinse akşamların biraz kendi faaliyetlerimiz tarafından, onların katkıları ile örülmesi gerekiyor. İşte bu noktada bilgisayar