Commodore 64 ile Grafik (2)
Geçen bölümümüzde, bit ve byte seviyesinde işlem yapmanın ana hatlarını görmüştük. Artık grafik özelliklerine başlayabiliriz.
Cu ün BASIC'inde bulunmayan grafik komutları, SIMONS' BASIC vs. gibi programlarla giderilmeye çalışılmıştır. Hatta sadece grafik programlamasına yönelik komutlar içeren programlar bile geliştirilmiştir. Ancak, şu veya bu şekilde hepsi de insanın isteyebileceği her özelliği taşımamaktadır. Bu tip programları kullanırken bile, arada sırada bazı POKE komutlarına başvurmak zorunda kahıyoruz. Bunun başlıca sebebi de, insan hayalgücünün birkaç komutla sınırlandırılamayacağı. Fakat bu POKE komutlarını kullanabilmek için, C64'ün grafik özelliklerini düzenleyen ünitesini (VIC - Video Interface Chip) çok iyi bilmelisiniz. Bundan sonra da makine dilini öğrenmeniz yararınıza olur, çünkü birkaç sayı sonra da göreceğiniz gibi, BASIC ile POKE kullanarak yapılan işlemler çok yavaş kalmakta. Eğer bu ayki yazımızda anlamadığınız noktalar olursa üzülmeyin, nasıl olsa ileride tüm konuları daha ayrıntılı olarak göreceğiz. Yazımızın bu bölümünün amacı, sizleri VIC ile ve onun byte'ları, bit'leri ile tanıştırmak, görevlerini bir liste halinde sunmak. Hatta daha sonra bu listeyi bir tür fih-
Tuna ERTEMALP rist gibi kullanabilirsiniz. VİC'in 47 yazmacı (register) vardır. Bunlar, C64'ün grafik işlemlerinin hemen hemen hepsinden sorumludurlar. Kimisi bir byte olarak, kimisi de bit'- leri düzeyinde önem taşır. VIC yazmaçları 53248 ($D000) adresinde başlar. Her bir yazmaç, 0-46 arası bir sıra numarası alır. Bir yazmaçın adres olarak yerini bulmak isterseniz, 53248 ile sıra numarasını toplamanız gerekir. Örneğin en son yazmaç, 53248 4 46 — 53294 adresinde bulunmaktadır. Aşağıdaki listede, her yazmaçın sıra numarasını önce ondalık sayı, sonra da parantez içinde onaltılık sayı olarak vereceğiz. Daha sonra tanımı, açıklaması ve bilgisayar açıldığı anda sahip olduğu açılış değerini vereceğiz. Bu değeri de, hem onluk, hem de ikilik sistemde bulacaksınız. Gerektiği zaman, o yazmaçı oluşturan bit'lerin görevleri de verilecektir. Bu sırada en sağdaki bit'e 0, en soldakine de 7 numarası verilecektir. Bu yazım tarzı, tüm bilgisayar dünyasında kullanılan tarzdır. Artık başlayalım...
YAZMAÇ: 0 (800) TANIM: 0 numaralı X koordinatı. AÇIKLAMA: Bu yazmaç, O numaralı sprite'ın ekrandaki X koordinatının alt 8 bit'ini taşır. Dolayısıyla 0-255 arası koordinatlar bu yazmaç ile gösterilebilir. 256-511 arası koordinatları gösterebilmek için, dokuzuncu bir bit gerekir ve bu bit, 16 numaralı yazmaçın içindedir.
AÇILIŞ: 0 (7000000000)
YAZMAÇ: 1 ($01) TANIM: 0 numaralı sprite'ın Y koordinatı. AÇIKLAMA: Bu yazmaç, 0 numaralı sprite'ın ekrandaki Y koordinatını 0- 255 arası değerlerle gösterir. X koordinatı gibi bir dokuzuncu bit gerektirmemektedir. AÇILIŞ: 0 (4400000000)
YAZMAÇ: 2 (802) TANIM: | numaralı sprite'in X koordinatı. AÇILIŞ: 0 (900000000) YAZMAÇ: 3 (803) TANIM: | numaralı sprite'in Y koordinatı. AÇILIŞ: 0 (9000000000)
YAZMAÇ: 4 (804) TANIM: 2 numaralı sprite'ın X koordinatı. AÇILIŞ: 0 (4400000000) YAZMAÇ: 5 (805) TANIM: 2 numaralı sprite'ın Y koordinatı. AÇILIŞ: 0 (9000000000)
YAZMAÇ: 6 (806)
TANIM: 3 numaralı sprite'ın X koordinatı. AÇILIŞ: 0 (4400000000)
YAZMAÇ: 7
(807) TANIM: 3 numaralı sprite'ın Y koordinatı.
AÇILIŞ: 0 (900000000)
YAZMAÇ: 8 ($08) TANIM: 4 numaralı sprite'ın X koordinatı. AÇILIŞ: 0 (1100000000)
YAZMAÇ 9 (809) TANIM: 4 numaralı sprite'ın Y koordinatı.
AÇILIŞ: 0 (9400000000)
YAZMAÇ: 10 (S0A) TANIM: 5 numaralı sprite'in X koordinatı. AÇILI
0 (7000000000)
YAZMAÇ: 11 (S0B) tanım: 5 numaralı sprite'ın Y koordinatı. AÇILIŞ: 0 (9000000000)
TANIM: 6 numaralı sprite'in X koordinatı. AÇILI!
0 (%00000000)
YAZMAÇ: 13 ($0D) TANIM: 6 numaralı sprite'ın Y koordinatı. AÇILIŞ: 0 (%00000000)
YAZMAÇ: 14 ($0E) TANIM: 7 numaralı sprite'ın X koordinatı. AÇILIŞ: 0 (%00000000)
YAZMAÇ: 15 TANIM: 7 numaralı sprite'ın Y koordinatı. AÇILIŞ: 0 (%00000000)
YAZMAÇ: 16 ($10) TANIM: Sprite X koordinatlarının 9. bit'i AÇIKLAMA: 8 adet sprite'ın 256-511 arası koordinatlarını göstermek için gerekli 9. bit'leri içerir. Her bir bit, bir sprite'a aittir.
BİT 0: 0 numaralı sprite BİT 1: 1 numaralı sprite BİT 2: 2 numaralı sprite BİT 3: 3 numaralı sprite BİT 4: 4 numaralı sprite BİT 5: 5 numaralı sprite BİT 6: 6 numaralı sprite BİT 7: 7 numaralı sprite
AÇILIŞ: 0 (%00000000)
17 ($11) TANIM: 1 numaralı kontrol yazmacı. AÇIKLAMA: Çeşitli grafik özelliklerini kontrol eden bitlerin bir kısmı bu yazmaçta bulunur. BİT 0-2: Yukarı aşağı noktasal ekran kaymasının 0-7 (%000-111) arası nokta değerini gösterir.
BİT 3: Ekranın kaç satır olduğunu gösterir. 0 ise 24 satır, 1 ise 25 satır gösterilir. BİT 4: Ekranın açık ya da kapalı olmasını belirler. 0 ise kapalı, 1 ise açıktır. Eğer ekran kapalı kalırsa VIC, merkezi işlem ünitesini ekran yaratmak amacıyla yormayacaktır. Bu da, bilgisayarın işlemleri biraz daha hızlı yapmasını sağlayacaktır. Örnek vermek gerekirse, sprite kullandığınızda VIC, bir saniyenin %4'ünü kullanır.
BİT 5: Normal grafik modunun açık ya da kapalı olmasını ayarlar. 0 ise kapalı, 1 ise açık demektir. BİT 6: Extended (geliştirilmiş) renk kullanımını kontrol eder. 0 ise normal renk, 1 ise geliştirilmiş renk modu kullanılır. BİT 7: 18 numaralı yazmacın 9. bit'ini temsil eder, AÇILIŞ: 155 (%10011011)
YAZMAÇ: 18 ($12) TANIM: Ekran tarama satırları inter- AÇIKLAMA: Bu yazmacı ve 17 numaralı yazmacın 7. bit'ini kullanarak 0-511 arası bir sayı yazarsanız, bu sayı, VIC tarafından oluşturulur oluşturulmaz kesinti (interrupt) yaratılması gereken ekran tarama satırını belirtir. Eğer bu yazmacı ve 17. yazmaçtaki ekstra bit'i okursanız, ekran tarama satırının (raster-line) o sırada hangi satırda olduğunu öğrenirsiniz. AÇILIŞ: 55 (%00110111)
YAZMAÇ: 19 ($13) TANIM: Lightpen X koordinatı. AÇIKLAMA: Lightpen'den bir sinyal geldiği sırada ekran tarama ışınının bulunduğu X koordinatı. AÇILIŞ: 0 (%00000000)
YAZMAÇ: 20 ($14) TANIM: Lightpen Y koordinatı. AÇIKLAMA: Lightpen'den bir sinyal geldiği sırada ekran tarama ışınının bulunduğu Y koordinatı. AÇILIŞ: 0 (%00000000)
YAZMAÇ: 21 ($15) TANIM: Sprite açık/kapalı. AÇIKLAMA: Her bir sprite'ın açık ya da kapalı olmasını bu yazmacın bit'leri kontrol eder. Eğer bir sprite'a ait bit 0 ise, o sprite görünmezdir. Eğer 1 ise, sprite görünürdür.
BİT numaralı BİT numaralı — sprite BİT numaralı — sprite BİT numaralı — sprite BİT numaralı — sprite BİT numaralı — sprite BİT numaralı — sprite BİT numaralı — sprite
AÇILIŞ: 0 (%00000000) YAZMAÇ: 22 ($16) TANIM: 2 numaralı kontrol yazmacı AÇIKLAMA: Çeşitli grafik özelliklerini kontrol eden bitlerin bir kısmı da bu yazmaçta bulunur. BİT 0-2: Sağa sola noktasal ekran kaymasının 0-7 (%000-111) arası nokta değerini gösterir. BİT 3: Ekranın kaç kolon olduğunu gösterir. 0 ise 38 kolon, 1 ise 40 kolon gösterilir. BİT 4: Multicolor (çokrenkli) renk kullanımını kontrol eder. 0 ise normal renk, 1 ise çokrenkli mod kullanılır. BİT 5-7: Kullanılmıyor. AÇILIŞ: 8 (%00001000) YAZMAÇ: 23 TANIM: Y yönünde sprite büyütme. AÇIKLAMA: Sprite'ların Y yönünde büyüyüp büyümemesini bu yazmacın bit'leri kontrol eder. Eğer bir sprite'a ait bit 0 ise, o sprite normal büyüklüktedir. Eğer 1 ise, sprite Y yönünde iki kat büyür. Ayrıca 29 numaralı yazmaca da bakınız.
BİT 0: 0 numaralı sprite BİT 1: 1 numaralı sprite BİT 2: 2 numaralı sprite BİT 3: 3 numaralı sprite BİT 4: 4 numaralı sprite BİT 5: 5 numaralı sprite BİT 6: 6 numaralı sprite BİT 7: 7 numaralı sprite
AÇILIŞ: 0 (%00000000)
YAZMAÇ: 24 ($18) TANIM: VIC'ın temel adresleri. AÇIKLAMA: Bu yazmaçta, karakter seti ve videoram (ekrandaki karakterlerin depolandığı hafıza kısmı) başlangıç adreslerinin hafıza içindeki yerinin üst bit'leri yer alır. Bunları değiştirerek (daha sonra bunu da göreceğiz), bu hafıza bölgelerinin yerini değiştirmek ve böylece aynı anda birkaç ekranı hafızada tutmak mümkün olacak.
Kullanılmıyor. : Karakter seti başlangıç ad- 11-13 numaralı bitleri. Yani bu üç bitin oluşturduğu sayıyı 2048 ile çarparak başlangıç adresini bulabiliriz. BİT 4-7: Videoram'ın başlangıç adresinin 10-13 numaralı bit'leri. Bu dört bit'in değerini de 1024 ile çarparak gerçek adresi bulabiliriz. AÇILIŞ: 20 (%00010100) YAZMAÇ: 25 ($19) TANIM: İnterrupt oluşma nedenleri. AÇIKLAMA: Bu yazmaçtaki bit'lerle, hangi sebepten ötürü interrupt (kesinti) yaratıldığı belirlenebilmektedir. BİT 0: Eğer 1 ise, ekran tarama satırı interrupt nedeni olmuştur (bkz. yazmaç 18). BİT 1: Eğer 1 ise, sprite-ekran çarpışması sebep olmuştur (bkz. yazmaç 31). BİT 2: Eğer 1 ise, sprite-sprite çarpışması interrupt yaratmıştır (bkz. yazmaç 30). BİT 3: Eğer 1 ise, 1 lightpen sinyal göndermiştir.
BİT 4-6: Kullanılmıyor. BİT 7: İlk dört bit'in en az biri 1 demektir. Bu yazmaç gerek BASIC'ten, gerekse makine dilinden okunduğunda, okunan değerin tekrar yerine yazılması gerekir. Yoksa çalışması hatalı olacaktır. AÇILIŞ: 15 (%00001111)
YAZMAÇ: 26 ($1A)
TANIM: İnterrupt oluşturma nedenleri. AÇIKLAMA: Programcı, bu yazmaçı kullanarak, hangi sebepten ötürü interrupt oluşması gerektiğini belirleyebilir. Bit'lerin durumu 25 numaralı yazmaç gibidir. Yukarıdaki olaylardan biri oluştuğunda, 25 numaralı yazmaçtaki bit 1 olmakta. Eğer programcı, 26 numaralı yazmaçtaki aynı bit'i önceden 1 yapmışsa, bilgisayar $0314/$0315 adreslerinde belirtilen adrese interrupt atlaması yapacaktır (bunu da anlatacağız). AÇILIŞ: 0 (%00000000) YAZMAÇ: 27 ($1B) TANIM: Sprite önceliği. AÇIKLAMA: Tıpkı daha önceki yazmaçlarda olduğu gibi, her sprite için bir bit ayrılmış durumdadır. Eğer bu bit 0 ise, sprite ekrandaki karakterlerin önünde görünecektir. Eğer 1 ise, karakterlerin arkasına saklanacaktır. AÇILIŞ: 0 (%00000000) YAZMAÇ: 28 TANIM: Çokrenkli sprite'lar. AÇIKLAMA: Bir sprite'ın tek renkli veya çok renkli olması bu yazmaçtaki bit'ler tarafından ayarlanır. Eğer bir sprite'a ait bit 1 ise, o sprite çokrenkli olarak görünecektir. AÇILIŞ: 0 (%00000000)
YAZMAÇ: 29 ($1D)
TANIM: X yönünde sprite büyütme. AÇIKLAMA: Sprite'ların X yönünde büyüyüp büyümemesini bu yazmaçın bit'leri kontrol eder. Eğer bir sprite'a ait bit 0 ise, o sprite normal büyüklüktedir. Eğer 1 ise, sprite X yönünde iki kat büyür. Ayrıca 23 numaralı yazmaça da bakınız. AÇILIŞ: 0 (%00000000)
YAZMAÇ: 30 TANIM: Sprite-sprite çarpışması. AÇIKLAMA: Her bir sprite'ın bir bit'i vardır. Eğer iki sprite birbirine
değerse, onlara ait bit'ler 1 olur. Aynı zamanda 25 numaralı yazmaçın BİT 2'si 1 durumuna gelir. Eğer yanan iki bit tekrar 0 yapılmazsa, hep 1 olarak kalırlar. Yani, temas bitince kendiliklerinden 0 olmazlar. AÇILIŞ: 0 (%00000000)
YAZMAÇ: 31 ($1F) TANIM: Sprite-ekran çarpışması. AÇIKLAMA: Her bir sprite'ın bir bit'i vardır. Eğer bir sprite bir ekran karakterine değerse, ona ait bit 1 olur. Aynı zamanda 25 numaralı yazmaçın BİT 1'i 1 durumuna gelir. Eğer yanan bit tekrar 0 yapılmazsa, hep 1 olarak kalırlar. Yani, temas bitince kendiliğinden 0 olmaz. AÇILIŞ: 0 (%00000000)
YAZMAÇ: 32 ($20) TANIM: Çerçeve rengi. AÇIKLAMA: Ekranın çerçeve rengini 0-15 sayılarıyla gösterir. Yani sadece alt dört bit bir anlam taşımaktadır. 15'den büyük bir sayı bu yazmaça konduğunda, sadece BİT 0-3 arası çerçeve rengini saptar. AÇILIŞ: 14 (%00001110)
YAZMAÇ: 33 ($21) TANIM: 0 numaralı ekran rengi. AÇIKLAMA: Normalde görünen ekran rengini bu yazmaçın alt dört bit'i saptar. AÇILIŞ: 6 (%00000110)
TANIM: 1 numaralı ekran rengi. AÇIKLAMA: Extended renk moduna geçildiğinde kullanılacak arka plan renklerinden biri. AÇILIŞ: 1 (%00000001)
: 35 ($23)
TANIM: 2 numaralı ekran rengi. AÇIKLAMA: Extended renk moduna geçildiğinde kullanılacak arka plan renklerinden biri. AÇILIŞ: 2 (%00000010)
AÇILI!
YAZMAÇ: 36 ($24) TANIM: 3 numaralı ekran rengi. AÇIKLAMA: Extended renk moduna geçildiğinde kullanılacak arka plan renklerinden biri. AÇILIŞ: 3 (%00000011)
TANIM: Sprite için 0 numaralı multicolor. AÇIKLAMA: Multicolor sprite'larda kullanılacak üç renkten biri. AÇILIŞ: 4 (%00000100)
YAZMAÇ: 38 ($26) TANIM: Sprite için 1 numaralı multicolor. AÇIKLAMA: Multicolor sprite'larda kullanılacak üç renkten biri. AÇILIŞ: 0 (%00000000)
YAZMAÇ: 39 ($27) TANIM: 0 numaralı sprite'ın rengi. AÇIKLAMA: 0 numaralı sprite'ın normal modda gösterildiği zaman sahip olacağı rengi (0-15) gösterir. Sadece alt dört bit'in sahip olduğu değer önemlidir. AÇILIŞ: 1 (%00000001) YAZMAÇ: 40 ($28) TANIM: 1 numaralı sprite'ın rengi. AÇIKLAMA: 0 numaralı sprite gibi. AÇILIŞ: 2 (%00000010) YAZMAÇ: 41 ($29) TANIM: 2 numaralı sprite'ın rengi. AÇIKLAMA: 0 numaralı sprite gibi. AÇILIŞ: 3 (%00000011) YAZMAÇ: 42 TANIM: 3 numaralı sprite'ın rengi. AÇIKLAMA: 0 numaralı sprite gibi.
YAZMAÇ: 43 TANIM: 4 numaralı sprite'ın rengi. AÇIKLAMA: 0 numaralı sprite gibi. AÇILIŞ: 5 (%00000101)
YAZMAÇ: 44 ($2C) TANIM: 5 numaralı sprite'ın rengi AÇIKLAMA: 0 numaralı sprite gibi AÇILIŞ: 6 (%00000110)
YAZMAÇ: 45 ($2D) TANIM: 6 numaralı sprite'ın rengi. AÇIKLAMA: 0 numaralı sprite gibi. AÇILIŞ: 7 (%00000111)
YAZMAÇ: 46 ($2E) TANIM: 7 numaralı sprite'ın rengi. AÇIKLAMA: 0 numaralı sprite gibi. AÇILIŞ: 12 (%00001100)
Sevgili VIC'in içişleri, işte böyle. Umarız fazla sıkılmamışsınızdır. Gelecek sayıda, VIC dışında kalan, ama gene de grafiklerle ilgili yazmaçları görüp, VIC'in kabiliyetlerini ve C64'ün hafıza kullanımını inceleyeceğiz. Şimdilik hoşçakalın... D