Merhaba. Dizinin bu yazısını tamamen mod 13h'teki palet kullanımına ayırdım. Bu mod bence her konuda ayrı olarak ele alınmayı hak ediyor. Veya ben mod 13h'e nostaljik ve yanlı bir açıdan bakıyorum. Bu yazıdaki konuları, önceki yazıda anlattığım bmp göstericisiyle bazı dosyaları görüntüleyerek açıklayacağım. Buna ek olarak yazıda paletle ilgili bir kaç detay daha göstereceğim.
Öncelikle, ilk yazıda diğer ekran modlarında paletle ilgili açıkladığım hemen her şey mod 13h'te de geçerli. Özetlersem: VGA DAC, mod 12h ve metin modunda 262 144 renkten yalnızca 16'sını, mod 13h'te 256'sını aynı anda gösterebiliyor. Paletteki her rengin bir indisi ve kanal başına 6-bit'ten 18-bit'lik bir RGB değeri var. Palet indisi 3C8h portuna yazıldıktan sonra, her renk kanalına ait değer 3C9h portundan byte-uzunluklu olarak ardarda yazılıyor. Aşağıda, BMP göstericinin paleti ayarlayan döngüsü görülüyor.
outportb(0x3C8, i); // Palette index
outportb(0x3C9, VGApalette.color[i].B >> 2); // Blue
outportb(0x3C9, VGApalette.color[i].G >> 2); // Green
outportb(0x3C9, VGApalette.color[i].R >> 2); // Red
}
Mod 13h'te palet diğer modlara göre daha basit, çünkü bu modda her ne kadar attribute register'a değer atamak mümkün olsa da, ekranda zaten DAC'taki tüm renkler (256 renk) gösterilebildiği için, zaten gösterilebilir olan rengi başka bir renge atamanın anlamı yok. Dolayısıyla attribute register bu modda anlamsız.
Ben Wikipedia'nın VGA maddesindeki, üç papağan görselini temel örnek olarak alacağım. Bu görselde 256 rengin tamamı kullanıldığından VGA'nın yeteneklerini göstermek için oldukça kullanışlı.
![]() |
| Kaynak: Wikipedia [2] |
İlk olarak bu görseli 320x200 olarak boyutlandırdım. Orjinal görüntü 1280x960 olduğu için en boy oranını değişti, ama onun dışında renklere veya palete dokunmadım. Aşağıda aynı görselin DOSBox içinden ekran görüntüsü var.
İki görsel karşılaştırıldığında belirgin bir fark görünmüyor. Paletin etkisini daha iyi anlamak için 208. satırdaki setPalette fonksiyonunu yorum satırı yapıp, bu görsel default mod 13h paletiyle nasıl görünürdü ona bakalım:
Görüldüğü gibi paletin olmaması ciddi bir fark yaratıyor.
Makinalarda RAM'in megabyte'la ölçüldüğü, bu nedenle yazılımda optimizasyonun birinci öncelik olduğu zamanlarda (90lar), aklıma "paletteki renkleri düzenleyerek VGA paletine uyarlayabilir miyim?" sorusu gelmişti. Böylelikle hem 400 byte civarındaki setPalette(...) fonksiyonundan hem de resim başına 1KB büyüklükteki paletten kurtulabilirdim. Bunun teorisini, aşağıda orjinalinden [1] küçülttüğüm görselle göstereceğim. Burada 97 328 renk var.
Palet oluşturma problemi, bu sorunun benim aklıma gelmesinden çok önce kafa yorulmuş bir konu. İlk giriş noktası median cut (1982) adlı algoritma. Bu algoritmayla renk uzayındaki tüm renklerin medyanı alınarak, bu rengin en az ortalama hata ile diğerlerini temsil edebileceği varsayılıyor. Hedeflenen renk derinliğine göre özyinelemeli (recursive) bir şekilde aralıkların medyanları alınarak görsel 2n (16 veya 256) renk derinliğine indirgeniyor. Ancak bu algoritma renk değişimlerinin çok olduğu görsellerde, küçük sapmaları görmezden geldiği için, fotoğraflarda doğal olmayan renk adalarına neden oluyor. Bu bozulmayı göstermek için görseli median-cut'la 16 renge indirdim (aşağıda). Arkaplandaki ve kuşun karnındaki adacıklar özellikle belirgin.
Bu nedenle de, dithering ve/veya error diffusion gibi teknikler uygulanarak, paletteki yakın renkler aralara serpiştirilip büyük renk adalarına hafif bir gürültü (noise) ekleniyor. Böylelikle gözü daha az rahatsız eden bir sonuç elde ediliyor.
![]() |
| Hey gidi günler... 🥲 |
Median cut, yalnızca renklerin azaltılmasında kullanılıyor olsa da, error diffusion tekniği palet dönüşümlerinde de kullanılır. Algoritmalara bu yazıda değinmeyeceğim, yer kalırsa sonraki yazıya saklıyorum. Ben bu dönüşümleri zamanın Paint Shop Pro'suyla (PSP) denedim ve güzel sonuçlar elde ettim. Aşağıda, örnek görselin paletini VGA paletine uyarladığımda elde ettiğim görsel üstte olmak üzere orjinaliyle yanyana koydum. Error diffusion nedeniyle yeşil kuşta ve arkaplandaki yolda bazı ilgisiz renkler olsa da fena sayılmayacak bir sonuç.
Dönüştürdüğüm görseli setPalette(...) olmadan ekranda görüntüleyince:
Bu görseli, bir de programı modifiye etmeden görüntüledim ve GIMP'te bunları üstüste oturtup birbirinden çıkardığımda beklenildiği gibi elimde siyah bir görüntü kaldı.
Palet dönüşürme için ilk olarak, önceki yazıda bahsettiğim gibi 0x3C7 portundan indis numarasını gönderip, 0x3C9 portundan renk değerlerini okudum ve bunları dörtle çarpıp bir dosyaya JASC (Paint Shop Pro) formatında yazdırdım. Bu format üç satırlık bir başlık ve boşluk karakteriyle ayrılmış R, G, B kodlarından oluşan basit bir metin dosyası. Ve güzel tarafı GIMP'in de bu formatı okuyabilmesi.
PRINT #1, "JASC-PAL"
PRINT #1, "0100"
PRINT #1, "256"
SCREEN 13
FOR I% = 0 TO 255
OUT &H3C7, I%
R% = INP(&H3C9)
G% = INP(&H3C9)
B% = INP(&H3C9)
PRINT #1, LTRIM$(STR$(R% * 4));
PRINT #1, RTRIM$(STR$(G% * 4));
PRINT #1, RTRIM$(STR$(B% * 4))
NEXT I%
CLOSE #1
Paint Shop Pro'yu oldversion.com'dan indirip Wine ile çalıştırabildim. Dönüştüreceğim dosyayı açıp Colors -> Load Palette'i seçtim. Önceki adımda oluşturduğum 13.PAL'i yükleyip dönüştürme algoritmasını "Error diffusion dithering" olarak seçtim. Burada farklı algoritmaları deneyerek karşılaştırmak mümkün.

GIMP'teyse önce palet penceresinde (Windows -> Dockable Dialogs -> Palettes) boş bir yere sağ tıklayıp 13.PAL'i import etmek gerek. Sonra dönüştürmek istediğim dosyayı açtım ve Image -> Mode -> Indexed'le gelen pencerede "Use custom palette"i ve altında 13.PAL'i seçtim. Ben hangi dithering metodunu seçersem seçeyim, GIMP maalesef bu dönüşümü PSP'den daha iyi yapamadı.
[1]: https://commons.wikimedia.org/wiki/File:Perched_blue_and_orange_bird_%28Unsplash%29.jpg
[2]: https://en.wikipedia.org/wiki/Video_Graphics_Array#/media/File:Birds_VGA256.png










