2024 yılının başında Mastodon'da gezinirken Koen van Gilst'in JavaScript ile yeniden yarattığı Pong Wars oyununa rastladım. Bu oyun, 'gündüz' ve 'gece' toplarının birbirlerinin alanlarını ters renge çevirmek için sonsuz bir savaşa giriştiği büyüleyici bir animasyon. Binlerce beğeni alan bu paylaşım, aklıma takıldı: Eğer van Gilst bunu JavaScript'te yapabildiyse, ben de Commodore 64'te yapabilirim. Peki bu mümkün müydü? Cevap: Evet, ama zorluklar var.
Oyunun temel mekaniği basit: İki top düz çizgiler halinde hareket ediyor, 20x20'lik bir blok alanında sekiyor ve her sekişte bir bloğun rengini değiştiriyor. Ancak Commodore 64'ün sınırlamaları, özellikle de daha önce assembly dilinde hiçbir şey yazmamış olmam, işleri karmaşıklaştırdı. Neyse ki, C64'ün video çıkışı sırasında dikey boşluk döneminde hesaplamaları sığdırmak mümkündü. Bu sayede BASIC yorumlayıcısı çalışırken her karede özel kod çağırabilecektik.
İlk adım, blok alanının iç durumunu ve ekran düzenini oluşturmaktı. C64'ün metin modunda 40x25 karakterlik bir alan vardı; her karakter 8x8 pikseldi. Ekran RAM'i $0400 adresinde, renk RAM'i ise $D800 adresindeydi. Tüm ekranı boşluk karakteriyle doldurmak için basit bir döngü yazdım. Ardından, 20x20'lik blok alanını ortalamak için ekranın 10. sütunundan başlayarak her satıra 20 blok yerleştirdim.
Sonuç ve Değerlendirme
Blokları temsil etmek için ters video boşluk karakterini (160) kullandım. Bu sayede her blok, ön plan rengiyle tamamen dolu bir kare oldu. Renk RAM'ini kullanarak blokların beyaz veya siyah olmasını sağladım. Döngüyü yazarken, her satırda 20 blok yazıp 20 boşluk bırakmam gerekiyordu. Ayrıca, blok alanını ekranın ortasına yerleştirmek için bir satır aşağıdan başladım.
Detaylar ve Etkileri
Bu noktada, henüz topların hareketini ve çarpışma mantığını eklememiştim. Assembly dilinde ilerlemek, hem heyecan verici hem de zorluydu. Bellek haritasını inceleyerek BASIC'in kullanmadığı alanları buldum ve BLOCKPTR gibi değişkenler için bu alanları kullandım. Her karede, topların konumunu güncellemek ve çarpışmaları kontrol etmek için dikey boşluk döneminde çalışacak bir kesme rutini yazmam gerekiyordu.
Sonuç olarak, bu proje benim için sadece bir oyun yapmaktan öte, Commodore 64'ün derinliklerine inmek ve assembly dilini öğrenmek için bir fırsattı. Pong Wars'un C64 versiyonu, sınırlı donanımda bile yaratıcı çözümlerle neler başarılabileceğini gösteriyor. Eğer siz de retro oyun geliştirmeye ilgi duyuyorsanız, bu tür projeler size ilham verebilir.
Kaynak: imrannazar.com