Commodore 64 Grafik Modları (Koala, Advanced Art Studio)

Merhaba Plazma okuyucuları. Bu doküman tr-demoscene forumunda sorulmuş bir soruya karşılık olarak çok hızlı yazılmış bir dokü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 dokü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.

* Bitmap (bit haritası) verileri (8000 byte = $1f40 byte)

* Video ekranı (1000 byte = $03e8 byte)

* Renk ekranı (1000 byte = $03e8 byte)

Bunlardan bir tek 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

Bitmap = $2000

Video = $0400

Renk = $d800 (değişmez)

adreslerine yerleştirerek göstereceğiz.

Commodore 64'te grafik modlarını incelerken bizim için önemli olan 3 temel hafıza adresi mevcuttur.

$d011: 1. Kontrol Register'ı

$d016: 2. Kontrol Register'ı

$d018: Hafıza Kontrol Register'ı

$d011

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;

lda $d011 ora #%00100000 sta $d011 ya da hexadecimal karşılığıyla lda $d011 ora #$20 sta $d011 diyebiliriz. Bilgisayarın açılıştaki ekran değeri "Bit 7"yi hesaba katmazsak (tarama sırasında tarama pozisyonuna göre değişir) $d011'in değeri $1b'dir. Bu durumda doğrudan;

lda #$3b sta $d011

Diyerek $1b->text moddan $3b->grafik moduna geçiş yapmış oluruz.

$d016

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 Kolon 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;

lda $d016 ora #%00010000 sta $d016 ya da hexadecimal karşılığıyla lda $d016 ora #$10 sta $d016 diyebiliriz. Aynı $d011 örneğinde olduğu gibi açılıştaki varsayılan değerini $c8 kabul edersek.

LDA #$D8 STA $D016 ile çoklu renk moduna geçiş yapabiliriz.

$D018

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.

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

Biz $0400'ü kullanmak istediğimiz durumda yukarıdaki 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.

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

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;

0 -> 0*$2000 = $0000

1 -> 1*$2000 = $2000 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.

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

Bu durumda $d018'in alması gereken değerin $18 olduğunu da buradan hesaplamış bulunmaktayız. Yani grafik modumuzu açmak için yazmamız gereken kod:

lda #$3b sta $d011 lda #$d8 sta $d016 lda #$18 sta $d018 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 aynı şekilde bitmap verilerinin hemen ardına yani 8000 byte ileriden 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.

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

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;

Video -> $0400-$07e7

Renk -> $d800-$dbe7

Arkaplan -> $d021

Verileri bu şekilde transfer ettiğimizde grafiğimizi ekranda düzgün bir şekilde görüntüleyebiliriz. Verilerin nasıl transfer edileceğ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çerisinde ayrı ayrı "koala.a" ve "adv_art_studio.a" kaynak kodlarını bulabilirsiniz.

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

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

Benimle irtibata geçmek isteyenler için e-mail adresim;

skate <at> glance <dot> ws (mailto:skate@glance.ws)

Emir Akaydın

Skate / Glance