Commodore 64 Grafik Modları (Koala, Advanced Art Studio)
Retro bilgisayarMerhaba 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