[title = Commodore 64 Grafik Modları (Koala, Advanced Art Studio)]

Merhaba Plazma okuyucuları. Bu döküman tr-demoscene forumunda sorulmuş bir soruya karşılık olarak çok hızlı yazılmış bir dökümandır. Ancak Plazma disk dergisinin çıkış tarihine çok yakın yazılmış olduğu için bunu forum yerine dergiye göndermeye karar verdim. Bu dökümanda hızlı bir şekilde Koala ve Advanced Art Studio grafik modlarını inceleyeceğiz. Ayrıca dergiyle birlikte gerekli kaynak kod ve örnekler de yayınlanacaktır.

Koala ve Advanced Art Studio grafik modları arasında temelde hiçbir fark yoktur. Tek fark kaydedilen dosyaların hafıza yerleşimleri arasındaki ufak tefek farklılıklardır. Her ikisi de Commodore 64'ün standart çok renkli grafik moduna tekabül eder.

Çok renkli grafik modunda 3 temel öğe vardır.
[b]
* Bitmap (bit haritası) verileri (8000 byte = $1f40 byte)
* Video ekranı (1000 byte = $03e8 byte)
* Renk ekranı (1000 byte = $03e8 byte)
[/b]
Bunlardan birtek renk ekranı sabittir ve hafızada $d800-$dbe7 adresleri arasında yer alır. Diğer video ekranı ve bitmap ekranının yerleri ise değişkendir ve birazdan açıklanacak olan VIC hafıza adresleriyle kontrol edilirler.

Biz örnek olarak grafiği
[b]
Bitmap = $2000
Video  = $0400
Renk   = $d800 (değişmez)
[/b]
adreslerine yerleştirerek göstereceğiz.

Commodore 64'de grafik modlarını incelerken bizim için önemli olan 3 temel hafıza adresi mevcuttur.
[b]
$d011: 1. Kontrol Register'ı
$d016: 2. Kontrol Register'ı
$d018: Hafıza Kontrol Register'ı
[/b]
[b]$d011
-----[/b]
Bit yapısı:

Bit 7   : $D012'nin 9.biti (Bit 8)
Bit 6   : Genişletilmiş Renkli Text Modu: 1 = Açık, 0 = Kapalı
Bit 5   : Bitmap Modu: 1 = Açık, 0 = Kapalı
Bit 4   : Kapalı Ekran: 1 = Açık, 0 = Kapalı
Bit 3   : 24/25 Satır Text Gösterimi: 1 = 25 Satır, 0 = 24 Satır
Bit 2-0 : Yumuşak Kayma için Y Nokta Pozisyonu: 0-7

Bu bitlerden bizi şimdilik "Bit 5" ilgilendiriyor. Bu biti set edersek grafik modunu açmış oluruz. Yani;
[b]
lda $d011
ora #%00100000
sta $d011
[/b]
ya da hexadecimal karşılığıyla
[b]
lda $d011
ora #$20
sta $d011
[/b]
diyebiliriz. Bilgisayarın açılıştaki ekran değeri "Bit 7"i hesaba katmazsak (tarama sırasında tarama pozisyonuna göre değişir) $d011'in değeri $1b'dir. Bu durumda doğrudan;
[b]
lda #$3b
sta $d011
[/b]
Diyerek $1b->text moddan $3b->grafik moduna geçiş yapmış oluruz.

[b]$d016
-----[/b]
Bit yapısı:

Bit 7-6 : Kullanılmıyor
Bit 5   : Reset Biti: 1 = Dur (VIC), 0 = Devam Et (VIC)
Bit 4   : Çoklu Renk Modu: 1 = Açık, 0 = Kapalı
Bit 3   : 38/40 Kolun Text Görüntüleme: 1 = 40 Kolon, 0: 38 Kolon
Bit 2-0 : Yumuşak Kayma için X Nokta Pozisyonu 0-7

Burada da bizi şimdilik ilgilendiren "Bit 4" yani çoklu renk modu. Koala ve Advanced Art Studio gibi grafik modları çok renkli oldukları için bu bitin açık olması lazım. Yani;
[b]
lda $d016
ora #%00010000
sta $d016
[/b]
ya da hexadecimal karşılığıyla
[b]
lda $d016
ora #$10
sta $d016
[/b]
diyebiliriz. Aynı $d011 örneğinde olduğu gibi açılıştaki varsayılan değerini $c8 kabul edersek.
[b]
lda #$d8
sta $d016
[/b]
ile çoklu renk moduna geçiş yapabiliriz.

[b]$d018
-----[/b]
Bit yapısı:

Bit 7-4 : Video Ekranı Taban Adresi
Bit 3-1 : Karakter Ekranı Verisi Taban Adresi (Eğer Bitmap Modu açıksa yalnızca Bit 3'e bakılır)
Bit 0   : Kullanılmıyor

Not: Hafıza 4 parçaya bölünmüştür. Burada anlatılanlar $0000-$3fff aralığındaki ilk parçayı kapsar. Diğer parçalara da bu benzer şekilde uygulanabilir ancak şu anda bu konuya girmeyeceğiz.

Video ekranı hafızada 1024'lük ($0400) alanlarla ilerlediği için Bit 7-4'ün aldığı değerleri 1024 ile çarparak hafızada hangi ekran adresine karşılık geldiği bulunabilir. 7-4 arasında (7,6,5,4) toplam 4 bit olduğuna göre 16 farklı değere sahip olabilir bu bitler.
[b]
 0 -> %0000 ->  0*$0400 = $0000
 1 -> %0001 ->  1*$0400 = $0400 (Commodore'un varsayılan ekran adresi)
 2 -> %0010 ->  2*$0400 = $0800
 3 -> %0011 ->  3*$0400 = $0c00
 4 -> %0100 ->  4*$0400 = $1000
 5 -> %0101 ->  5*$0400 = $1400
 6 -> %0110 ->  6*$0400 = $1800
 7 -> %0111 ->  7*$0400 = $1c00
 8 -> %1000 ->  8*$0400 = $2000
 9 -> %1001 ->  9*$0400 = $2400
10 -> %1010 -> 10*$0400 = $2800
11 -> %1011 -> 11*$0400 = $2c00
12 -> %1100 -> 12*$0400 = $3000
13 -> %1101 -> 13*$0400 = $3400
14 -> %1110 -> 14*$0400 = $3800
15 -> %1111 -> 15*$0400 = $3c00
[/b]
Biz $0400'ü kullanmak istediğimiz durumda yukardaki tabloya göre 7-4 arasındaki bitlerin "1" değerine sahip olması lazım.

Bit 3-1 ise text modda karakter setinin yerini belirler. Her karakter seti 2048 byte yani $0800'lük bir alan kaplar. Dolayısıyla yerleşebileceği 8 farklı konum vardır.
[b]
 0 -> %000 ->  0*$0800 = $0000
 1 -> %001 ->  1*$0800 = $0800
 2 -> %010 ->  2*$0800 = $1000 (Commodore'un varsayılan karakter seti adresi)
 3 -> %011 ->  3*$0800 = $1800
 4 -> %100 ->  4*$0800 = $2000
 5 -> %101 ->  5*$0800 = $2800
 6 -> %110 ->  6*$0800 = $3000
 7 -> %111 ->  7*$0800 = $3800
[/b]
Ancak biz karakter ekranı kullanmadığımız ve grafik ekranları 8000 byte kapladığı ve 8192'lik ($2000) alanlara yerleştiği için, bizim için yalnızca "Bit 3" önemli. Bit 3'ün set olup olmamasına göre bitmap verileri;
[b]
 0 -> 0*$2000 = $0000
 1 -> 1*$2000 = $2000
[/b]
adreslerine denk gelir.

Şimdi bu durumda biz "Bit 3"ü 1 olarak kullanacağız çünkü bitmap'i $2000 adresinde istiyoruz. Bit 7-4 aralığını ise %0001 şeklinde kullanacağız çünkü video ekranımız $0400'de olacak.

Aşağıdaki toplama işlemi sayısal değil bitleri yan yana ekleme anlamında kullanılmıştır.

[b]Bit 7-4 + Bit 3 + Bit 2-1 = %0001 + %1 + %000 = %00011000 = $18 = 24[/b]

Bu durumda $d018'in alması gereken değerin $18 olduğunu da burdan hesaplamış bulunmaktayız. Yani grafik modumuzu açmak için yazmamız gereken kod.
[b]
lda #$3b
sta $d011
lda #$d8
sta $d016
lda #$18
sta $d018
[/b]
bu hale gelmiş oluyor.

Peki işimiz bitti mi? Hayır. İşte bu noktada grafik modlarının aralarındaki farklılıklar önem kazanıyor. Çünkü Koala modu da Advanced Art Studio modu da hafızaya yüklendiği yerden itibaren ilk 8000 byte ($1f40) bitmap verisi olacak şekilde yerleşmiştir. Hatta hatta video verileri de anı şekilde bitmap verilerinin hemen ardına yani 8000 byte ilerden yerleşmiştir. Ancak renk ekranları ve arkaplan renklerinin tutulduğu yerler farklıdır.

Aynı zamanda her iki grafik modu da varsayılan değerleriyle farklı adreslerden yükleyebilir (Koala $6000, Adv.Art Studio $2000) ancak bunun fazla bir önemi yoktur. Sonuç olarak biz istediğimiz yerden yükletmekte serbestiz. Her iki modu da başlangıç adreslerinden itibaren inceleyecek olursak.
[b]
Koala Grafik Modu İçin Değerler
Bitmap   = $0000-$1f3f = 0-7999
Video    = $1f40-$2327 = 8000-8999
Renk     = $2328-$270f = 9000-9999
Arkaplan = $2710       = 10000

Advanced Art Studio Grafik Modu İçin Değerler
Bitmap   = $0000-$1f3f = 0-7999
Video    = $1f40-$2327 = 8000-8999
Renk     = $2338-$271f = 9016-10015
Arkaplan = $2329       = 9001
[/b]
Bu durumda $d011,$d016,$d018 değerlerini ayarlamanın haricinde bir de Video ve Renk ekranlarını olması gereken yerlere transfer edip, arkaplan rengini de $d021'e vermemiz lazım. Yani bizim örneğimizde;
[b]
Video    -> $0400-$07e7
Renk     -> $d800-$dbe7
Arkaplan -> $d021
[/b]
Verileri bu şekilde transfer ettiğimizde grafiğimizi ekranda düzgün bir şekilde görüntüleyebiliriz. Verilerin nasıl transfer edilceğini dergiyle birlikte yayınlanan kaynak kod örneklerinden inceleyebilirsiniz.

Kaynak kodlardan "resim_gosterici.a" dosyası her iki modu da kapsayacak biçimde hazırlanmıştır. En başında tanımlanan _GRAFIK_TIPI_ değişkeni 0 değerini aldığında kod "resim.kla" dosyasını okuyarak "koala.prg" çıktısını verecektir. Eğer _GRAFIK_TIPI_ 1 değerini alırsa bu durumda "resim.aas" dosyasını okuyup "adv_art_studio.prg" çıktısını verir.

Eğer her iki modun birlikte yer aldığı ve koşula bağlı olarak derlenen dosya yapısı kafanızı karıştıracak olursa "bonus" klasörü içersinde ayrı ayrı "koala.a" ve "adv_art_studio.a" kaynak kodlarını bulabilirsiniz.

Programların derlenmiş halleri ise "prg" klasörü içersinde yer almaktadır.

Bu "forumda sorulan bir soru üzerine hazırlanmış döküman"ın burada sonuna geldik. Başka yazılarla sizlerle buluşmak dileğiyle.

Benimle irtibata geçmek isteyenler için e-mail adresim;
[url = mailto:skate@glance.ws]skate <at> glance <dot> ws[/url]
[b]
Emir Akaydın
Skate / Glance
[/b]