Bu içeriğimizde, Pico ile Doom oynamanın adımlarını anlatıyoruz. “Doom her şeyde çalışır” (Doom runs on everything), teknoloji dünyasının en bilinen klişelerinden ve eğlenceli meydan okumalarından biridir. Bugüne kadar hamilelik testlerinden akıllı buzdolaplarına, osiloskoplardan e-kitap okuyuculara kadar yüzlerce farklı cihazda Doom’un çalıştırıldığına şahit olduk.
Ancak, sadece 4 dolarlık mütevazı bir fiyat etiketine sahip olan Raspberry Pi Pico üzerinde, orijinal 1993 yapımı Doom oyununu (id Software’in efsanevi 2.5D başyapıtı) akıcı bir şekilde sesli, renkli ve hatta çok oyunculu (multiplayer) olarak çalıştırmak, basit bir nostalji gösterisinden çok daha fazlasını; gerçek bir gömülü sistem yazılımı ve donanım optimizasyon mucizesini ifade eder.

Bu inanılmaz port, popüler modern işletim sistemlerinde Doom’un tarihsel doğruluğunu koruyarak çalışmasını sağlayan açık kaynaklı Chocolate Doom kaynak kodlarını temel alır. Geliştirici Graham Sanderson tarafından gerçekleştirilen bu portun arkasındaki en büyük teknik engel donanım kısıtlamalarıdır.
Orijinal Doom’un sadece ilk bölümünü (shareware) barındıran veri dosyası (WAD) 4.2 MB boyutundadır. Ancak standart bir Raspberry Pi Pico kartında sadece 2 MB harici Flash bellek yer alır! Bu depolama çıkmazını aşmak ve projenin tüm detaylarını incelemek için rp2040-doom Proje Kılavuzu sayfasını ziyaret edebilirsiniz.
Mühendislik Sınırlarında Optimizasyon: WHD Sıkıştırma ve SRAM Yönetimi
Sanderson, 4.2 MB’lık WAD dosyasını Pico’nun 2 MB’lık flash belleğine sığdırabilmek için WHD (Where’s Half the Data? – Verinin Yarısı Nerede?) adını verdiği özel bir sıkıştırma ve paketleme algoritması geliştirdi. Bu algoritma yardımıyla grafik pikselleri yeniden paketlendi, ses efektleri 8-bit mono 11025 Hz örnekleme hızına düşürüldü ve WAD dosyası orijinal yapısını bozmadan %57 oranında sıkıştırılarak 1.85 MB’a indirildi. Böylece tüm oyun motoru ve ses/grafik kütüphanesi Pico’nun harici flash belleğine kusursuzca sığdırıldı.
Depolama sorununun ardından gelen ikinci büyük engel ise SRAM (RAM) yönetimidir. RP2040 mikrodenetleyicisi sadece 264 KB sistem belleğine sahiptir. Bilgisayar dünyasında komutların çalışabilmesi için verilerin RAM’e aktarılması gerekir. Sanderson, harici flash bellekteki verileri doğrudan RAM’e kopyalamak yerine, verileri ihtiyaç anında flash bellekten okuyan QSPI XIP (Execute In Place) önbellekleme mimarisini sonuna kadar optimize etti.
Tüm Doom oyun motoru, nesne yığınları (heap) ve değişkenler sadece 230 KB RAM tüketecek şekilde optimize edildi; geriye kalan 34 KB boş alan ise 6 farklı oyun kayıt (save game) yuvası için başarıyla ayrıldı!
Pico ile Doom Oynanış Videosu
VGA Görüntü Sinyali ve PIO (Programlanabilir G/Ç) Gücü
Bir mikrodenetleyiciden monitöre aktarılacak VGA sinyallerini üretmek, normal şartlarda işlemci çekirdeklerini tamamen bloke eden bir süreçtir. Ancak RP2040’ın donanımsal bir diğer mucizesi olan PIO (Programmable I/O) durum makineleri burada devreye girer. İşlemcinin ana çekirdekleri (ARM Cortex-M0+) oyun mantığını hesaplamak ve 3D dünyayı render etmekle meşgulken, arka planda çalışan PIO blokları ve DMA (Direct Memory Access – Doğrudan Bellek Erişimi) kanalları, işlemciye yük bindirmeden RAM’deki piksel verilerini doğrudan GPIO pinlerine aktararak VGA sinyallerini (R-2R direnç merdiveni DAC devresi üzerinden) üretir.
Oyun, 320 x 240 piksel çözünürlükte render edilir. PIO tabanlı `pico_scanvideo` kütüphanesi yardımıyla pikseller yatayda ve dikeyde ikiye katlanarak (pixel doubling), modern monitör ve televizyonların kolaylıkla senkronize olabildiği standart 640 x 480 @ 60Hz VGA sinyaline dönüştürülür. Çift çekirdeğin bir diğeri ise ses sentezleyici motoru yöneterek, GPIO pinlerine bağlı basit bir PWM filtre devresi üzerinden 8 kanallı dijital ses miksajını gerçek zamanlı olarak hoparlörlere üfler.
Dahası, RP2040’ın GPIO pinleri üzerinden kurulan I2C/UART iletişim kanalları sayesinde, 4 adet Raspberry Pi Pico birbirine bağlanarak 4 oyuncuya kadar gerçek zamanlı Link Kablo çok oyunculu (multiplayer co-op / deathmatch) oyun desteği sunulmuştur. Eğer elinizde 8 MB veya 16 MB harici flash belleğe sahip donanımlar (örn. Pimoroni Tiny 2040, Adafruit Feather RP2040 veya Waveshare Pico) varsa, Graham Sanderson’ın bu portu sayesinde Doom II: Hell on Earth ve Ultimate Doom gibi tüm büyük PC WAD dosyalarını da hiçbir kısıtlama olmaksızın tam sürüm olarak oynayabilirsiniz.
Mühendisler İçin Çıkarılacak Dersler
RP2040 üzerinde Doom çalıştırma projesi, modern yazılımcıların sıklıkla düştüğü “sınırsız donanım kaynakları” konforunun dışına çıkıldığında, yaratıcı yazılım mühendisliğinin neleri başarabileceğini gösteren mükemmel bir kanıttır. Gömülü sistemlerde kısıtlı bellek (SRAM) ve döngü (CPU Cycles) sınırları altında verimli kod yazmak, projenizin sınırlarını belirler. Raspberry Pi Pico ile gerçekleştirebileceğiniz diğer üstün performanslı projeler, donanımsal PIO uygulamaları ve ses/video işleme yöntemleri hakkında hazırladığımız kılavuzlara Raspberry Pi Pico Projeleri kategorimizden ulaşarak kendi donanım sınırlarınızı zorlamaya başlayabilirsiniz.
Fiziksel Kurulum ve VGA Bağlantı Arayüzü
Pico ile Doom çalıştırdıktan sonra fiziksel dünyada görüntü ve ses alabilmek için basit bir R-2R direnç ağı kurmanız gerekmektedir. İşte donanımsal bağlantıların ana hatları:
- VGA Renk Hatları (RGB): Kırmızı, Yeşil ve Mavi renk sinyallerini analog seviyeye (
) indirmek için GPIO pinlerine bağlı direnç ağları (R-2R DAC) kullanılır. - VGA Yatay ve Dikey Senkronizasyon (HSYNC/VSYNC): Monitörün ekran taramasını tetiklemek için GPIO pinlerinden doğrudan
lojik senkronizasyon darbeleri gönderilir. - PWM Ses Filtresi: Dijital ses çıkış pini ile şase (GND) arasına yerleştirilecek basit bir
kondansatör ve
dirençten oluşan alçak geçiren filtre (low-pass filter), parazitleri süzerek temiz analog ses çıkışı sağlar.
Yorum yapma özelliği, forum tarafından gelen istek sebebiyle kapatılmıştır. Lütfen tartışmalar ve sorularınız için topluluk forumumuza katılın.

