Amiga’da animasyon “woosh” ekranı kodlamak
(dansalva.to)- Magicore Anomala, 1985’te çıkan Amiga’nın grafik ve ses yetenekleriyle tam ekran CG ve animasyon tarzı geçişler gerçekleştiriyor; ancak oyun motoru içinde RAM yerleşimi, ekran bölme ve sprite kısıtları aynı anda çözülmek zorunda
- Tipik bir Amiga 500 yapılandırmasında grafik ve ses için kullanılabilen Chip RAM yalnızca 512 KB olduğundan, 320x240 ve 32 renkli bir CG’nin 48 KB’lık sıkıştırılmamış boyutu ciddi bir yük oluşturuyor
- CG, ZX0 sıkıştırması ile yaklaşık 8 KB’a düşürülüp genişletme RAM’inde tutuluyor; gösterimden hemen önce Chip RAM’e açılırken mevcut 48.000 baytlık ekran belleği yeniden kullanılıyor
- Geçiş efekti, copper’ın belirli tarama satırlarında donanım register’larını değiştirip bitplane DMA’yı kapatıp açmasıyla oluşturuluyor; CPU ise her frame’de split genişliğine göre copperlist değerlerini ayarlıyor
- Arka plandaki motion lines, Amiga sprite’larının renk, yeniden kullanım ve bitplane bağımlılığı kısıtlarını aşmak zorunda; attached sprites, sahte kontrol bitleri, 1 bitplane’i açık tutma ve
BPLMOD1ayarı kilit mekanizmalar oluyor
Amiga 500’de tam ekran CG eklemenin RAM sorunu
- Magicore Anomala’nın hedef platformu tipik bir Amiga 500; yapılandırması 512 KB Chip RAM ve 512 KB genişletme RAM’i
- Amiga yonga setinin grafik ve ses çıkışı için kullanabildiği bellek yalnızca Chip RAM
- Genişletme RAM’ine yalnızca CPU erişebildiğinden grafik ve ses için doğrudan kullanmak zor
- Tam ekran karakter grafiği (CG), 320x240 bitmap biçiminde 32 renkli bir görüntü ve sıkıştırılmamış hâlde 48 KB yer kaplıyor
- Ortak varlıklar, seviye verileri ve ekran belleği ayırmaları da hesaba katıldığında 48 KB büyük bir ek yük
- Yakın zamanda eklenen varlık sıkıştırma desteği ZX0 sıkıştırma biçimini kullanıyor
- Sıkıştırılmış CG yaklaşık 8 KB’a düşüyor
- Seviye varlıkları yüklenirken sıkıştırılmış CG genişletme RAM’ine konuyor
- Gösterimden hemen önce Chip RAM’e açılıyor
Yeni 48 KB Chip RAM ayırmadan yapma yöntemi
- CG için ayrı bir 48 KB boş Chip RAM alanı aramak yerine, mevcut ekran belleğinin bir kısmı yeniden kullanılıyor
- Oda arka planı görüntüsü
- Tehlikeli nesneleri render etmek için ekran katmanı
- Metin kutusu ekran alanı
- Bu üç bellek alanı RAM’de ardışık ve toplam boyutları 48.000 bayt; bu da CG’nin tam boyutuyla eşleşiyor
- Oda arka planı görüntüsü CG gösterimi bittikten sonra geri yüklenebildiği için üzerine yazılmasında sorun yok
- CG’nin açılması yaklaşık 500 ms sürüyor, ancak cutscene akışının içine yerleştirilerek yükleme gibi görünmemesi sağlanıyor
- Magicore Anomala’nın oynanış proof-of-concept videosu YouTube üzerinden izlenebilir
Ekran bölme efekti ve copper kullanımı
- Başta dikey wipe geçişi düşünülmüş, ancak iyi görünmesi için her tarama satırında renk paletini ayarlayan bir gradyan gerekiyordu
- Yalnızca copper ile tek bir yatay blank içinde 32 rengin tamamını ayarlamanın zor olduğu düşünüldü
- “racing the beam” ile uğraşmak istenmediğinden ekran bölme efekti seçildi
- Ekran bölme efekti genel izleyiciye daha etkileyici görünüyor ve Amiga’nın copper’ı adeta bu tür efektler için tasarlanmış gibi çalışıyor
- Benzer bir efektin Amiga Workbench’e yerleşik olduğu örnek bu videoda görülebilir
- Uygulamada Amiga’nın iki özelliği birlikte kullanılıyor
- Copper, CPU’ya paralel olarak kendi komut listesini yürütür ve belirli ekran satırlarında donanım register’larını değiştirebilir
- Ekran pointer’ı donanım register’larıyla ayarlanarak ekran belleği Chip RAM’in herhangi bir konumuna taşınabilir
bitplane DMA’yı durdurup sonra çizime devam etmek
- Örneğin ana ekran belleği
0x20000adresinden başlıyorsa, normalde copper bu adresi bitplane DMA register’ına ayarlar- Bitplane etkinleştirildiğinde DMA ilgili bellek alanını sırayla okuyarak ekrana çizer
- Her yatay satır
0x100bayt yer kapladığında ekran pointer’ı0x20800olarak ayarlanırsa, ekran 8 satır yukarı kaydırılmış gibi görünür- Çünkü ekranın başlangıç noktası bellekte 8 satır aşağı taşınmış olur
- Split’in üst yarısı bu yöntemle yukarı kaydırılır
- Split noktasında copper bitplane DMA’yı kapatır ve arka plan rengini kırmızıya değiştirir
- Bitplane ile ilgili donanım register’ları o anda fiilen durur
- Split’in alt kısmına gelindiğinde arka plan rengi geri alınır ve bitplane DMA yeniden açılır
- Ekran, durduğu konumdan tekrar çizilmeye devam eder; ancak gerçek görüntü konumu daha aşağıdadır
- CPU her frame’de split’in mevcut genişliğine göre
vs_TCopTopvevs_TCopBottomdeğerlerini ayarlar- Üst split için ekran pointer ayarı da birlikte yapılır, ancak kod örneğine dahil değildir
“woosh” hareket çizgileri için sprite etrafından dolaşmak
- Animasyon tarzı arka plandaki motion lines sprite’larla çiziliyor
- Sprite’lar ekran belleğinden bağımsız olarak çizilip hareket ettirilebildiği için bu kullanım için uygun
- Ancak Amiga sprite’larının çok sayıda sınırlaması var ve yönetmeleri karmaşık
-
Renk kısıtları
- Sprite’lar bitplane’lerle renk paletini paylaştığından mümkün olduğunca az renk kullanmak gerekiyor
- Motion lines yalnızca 3 renk kullanarak CG’ye 28 renk, arka plana 1 renk bırakıyor
- Amiga’da her sprite çiftinin kullandığı palet renk aralığı farklı
- İlk iki sprite 16-19 renklerini kullanır
- Sonraki iki sprite 20-23 renklerini kullanır
- İki sprite attach edildiğinde 16 renkli palete sahip tek bir sprite gibi davranır ve 16-31 renklerini kullanabilir
- Motion lines 4 attached sprites kullanıyor ve grafikte yalnızca 29-31 renkleri kullanılıyor
-
Aynı sprite grafiğini birden fazla konumda kullanmak
- Sprite grafiğinin ilk 4 baytı, konum ve yüksekliği belirleyen kontrol bitleridir
- Aynı grafiği birden fazla konumda çizmek istendiğinde bu yapı sorun yaratır
- Sprite kontrol bitlerini donanım register’larıyla doğrudan ayarlamaya çalışılmış, ancak ekranda görünür hâle getirilememiş
- Amiga sprite DMA, bitplane DMA gibi sprite veri pointer’ını takip ederek ekrana çizer
- Çözüm, 4 baytlık 8 sahte sprite oluşturmak
- Bu sahte sprite’lar yalnızca kontrol bitlerini içerir
- Tüm sprite pointer’ları önce sahte sprite’lara ayarlanır
- Yaklaşık 19. satırda sprite DMA pointer’ları görüp kontrol bitlerini yükler
- Ardından tüm pointer’lar gerçek “motion line” grafiğine çevrilir
- Sonuçta DMA, farklı konumlara sprite çizecek şekilde yüklenmiş durumdayken aynı grafiği kullanır; bu geçiş copperlist içinde işlenir
bitplane kapatılınca sprite’ların da kaybolması sorunu
- CG ekranın üstüne ulaşmadan önce ekranın üst kısmı ile CG’nin başlangıç noktası arasında boş alan vardır
- Bu sırada bitplane açık bırakılırsa ekranda çöp veri çizilir
- Bu bölgede bitplane kapatılarak DMA’nın çöp veriyi okumaması gerekir
- Sorun şu ki bitplane kapatıldığında sprite’lar da çizilmez
- Motion lines’ın yalnızca CG sınırları içinde görünmesi gibi bir durum oluşur
- Çözüm, bitplane’i tamamen kapatmak yerine yalnızca 1 tanesini açık tutup ekran pointer’ını boş veriye ayarlamak
- Ekrana bir şey çizilir, ancak sonuçta hiçbir şey görünmez
- Tam bir boş ekran hazırlamaya gerek yok
- 1 bitlik piksel temelinde 320 piksellik bir satır 320 bit, yani 40 bayttır
BPLMOD1-40olarak ayarlanırsa her satırdan sonra pointer 40 bayt geri dönerek aynı 40 baytı tekrar tekrar çizer- Ekranın safety margin’indeki ilk 40 baytı boş bırakmak yeterlidir
Sonuç ve kalan küçük işler
- Başta RAM gereksinimi nedeniyle böyle bir CG’yi oyuna ekleyip eklememe konusunda emin olunmamıştı; ancak veri sıkıştırma uygulandıktan sonra ek yükün oldukça makul bir seviyede olduğu görüldü
- Magicore’a ek görsel süslemeler katmak mümkün hâle geldi
- Ele alınmamış küçük işler de hâlâ var
- Örneğin 100px motion line ekranın üstünden çıktıktan sonra alt kısmının aniden kaybolmamasını sağlama sorunu
- Bu efekt blitter’ı hiç kullanmıyor
- Blitter ile ilgili yazı Getting clever with the Amiga blitter içinde ele alınıyor
- Amiga, 1980’lerin sonlarında insanları etkilediği gibi bugün de renkli grafik gösterme yeteneğiyle insanları etkileyebilen bir platform olmayı sürdürüyor
1 yorum
Hacker News yorumları
“Racing the beam”in ne anlama geldiğini tam olarak anladım. Eskiden vsync edilmiş bir rutinin başında ve sonunda beam rengini farklı değiştirip, kare başına kaç scanline kadar CPU zamanı kullanabildiğimizi hesaplardık.
Bu iş için kullandığımız adresin $dff180 olduğunu hatırlıyorum. Renk paleti 0 olduğu için bitmap alanının dışındaki ekran kenarlarında da her zaman görünürdü.
O numarayı da internet olmadan tamamen kulaktan kulağa öğrenmiştik; bugün hâlâ o chipset’ten daha fazlasını çıkarmaya çalışan insanların olduğunu bilmiyordum.
Günümüzde demoscene, 2017 civarından beri inanılmaz derecede iyileşti; yalnızca trapdoor bellek takılı temel Amiga 500 üzerinde çalışan, sevdiğim işler var.
https://www.youtube.com/watch?v=2jciCr8zEhw
https://www.youtube.com/watch?v=iD9xk3SDSYc
https://www.youtube.com/watch?v=pYtleuGV7ok
https://www.youtube.com/watch?v=E0OzX7plbeY
https://www.youtube.com/watch?v=rIV4AhfugIs
Amiga’da oyun yapmaya zaman ayıran insanların nasıl bir kitle olduğunu gerçekten merak ediyorum. Gençlerin bu kadar eski bilgisayarlara ilgi duymayacağını düşünüyorum; bunlarla büyüyenler de aile ve iş yüzünden meşguldür.
Meşgul olmasalar bile aynı derecede eğlenceli olup güncel hissi de koruyabilecek çok fazla proje var. Yine de gerçekten harika.
Şu anda tam zamanlı bağımsız oyun geliştiricisi olarak çalışıyorum. Amiga oyunu yapmak, ömürlük bir hayale yakın bir şeydi; artık bunu başaracak beceriye sahip olduğumu düşünüyorum.
Günümüz araçlarını ve yaygın bilgiyi kullanarak, modern tasarım ilkelerine sahip bir oyun deneyimiyle sevilen klasik donanıma yeni bir hayat verilebileceğini göstermek istiyorum.
Hayattaki her şeyi kariyerle ilişkilendirirseniz tüm hayatınız işe dönüşür.
Photoshop varken neden yağlı boya çalışıyorsun, ya da Tesla varken neden vintage araba restore ediyorsun diye sormaya benziyor.
Bölge değiştirme modifikasyonu, iki VIC-II ve iki osilatör arasında geçiş yapmayı gerektirdiği için epey karmaşık. Bir MSX2’m de var; çok kullanmadım ama büyük bir çekiciliği var.
Bu makineler için gerçekten kod yazmaya zaman ayırmak zor; ama çoğu çalışan insan hobisinde olduğu gibi, ilham geldiğinde geceleri ve hafta sonlarını ayırma meselesi olduğunu düşünüyorum.
Retrocomputing büyüleyici ve tatmin edici harika bir hobi. Ancak zamandan çok, parça bulmanın fiyatı ve zorluğu daha çok canımı sıkıyor.
Bilgisayar pazarında “antika” ya da “vintage” etiketi yapıştırılan her şeyi pahalıya satmaya çalışan insanların arttığını görmek üzücü.
Daha yaşlı taraf adına doğrudan konuşamam ama hâlâ Commodore 64 demoları yapan bazı kişilerde çocukluklarıyla yeniden bağ kurma isteği güçlü görünüyor.
Bonzai ve Pretzel Logic’in nispeten yeni demosu “Mojo” gibi, neredeyse bu hikâyeyi doğrudan anlatan işler de var. Demoscene işlerinde “ciddi” hikâye anlatımı yapmaya çalışmak biraz cringe duruyor ama yine de sıcak ve hoş.
Çok zaman isteyen bir hobi; ama gerçekten zaman ayırmak istiyorsanız sonunda bir yolunu buluyorsunuz.
[1]: https://csdb.dk/release/?id=232966, https://www.youtube.com/watch?v=HXi3oJ9huiI
[1] https://retro.moe/2024/02/04/bluepad32-v4-0/
[2] https://www.youtube.com/watch?v=Nj5fZlt_834
https://www.udemy.com/course/programming-games-for-the-atari...
Evden çalışınca daha fazla boş zamanım olacağını düşünmüştüm ama gerçek öyle olmadı. Yine de bir gün devam etmem gerekiyor.
Amiga’da Japon konsol tarzı oyunların nasıl görüneceğini ve Amiga’nın performansının mı yetersiz olduğunu yoksa çoğu oyunun tasarımının mı zevkime uymadığını hep merak etmişimdir.
Bonk’u Factor 5 harika port etmişti ama onlar neredeyse sihirbazdı.
“Sıradan bir Amiga 500’de 512KB Chip RAM ve 512KB genişletme RAM’i vardır” kısmı biraz hatalı. Temel A500’de yalnızca 512KB Chip RAM vardı.
Birçok kullanıcı A501 RAM genişletmesi ekleyerek grafik donanımının doğrudan erişemediği 512KB Fast RAM daha ekledi.
Fast RAM olarak etiketlenmişti ama genişletme yapısı nedeniyle gerçek Fast RAM’den daha yavaştı.
A500 sahiplerinin çoğunda 512KB trapdoor genişletmesi vardı. Monkey Island gibi oyunlar dahil birçok yazılım toplam 1MB RAM olmadan çalışmazdı.
Günümüzde açık donanım tasarımlı ucuz trapdoor genişletmeleri yaygın; 1.5MB Slow RAM, toplamı 1MB yapacak şekilde 512KB Chip RAM ve RTC de sunuyorlar.
Böyle kısıtlar içinde kod yazmanın inanılmaz derecede çekici bir yanı var.
IE’yi görmek güzel. Amiga’ya dalmanı görmek hoş.
Sanırım pek çok kişi benim kullandığımdan farklı bir Amiga ile oynamış gibi hissediyorum. Harika görünen oyunlar kesinlikle vardı ama Nintendo NES için de öyleydi; ikisine de o kadar duygusal bakmıyorum.
Yine de böyle bir animasyonun nasıl yapıldığını göstermek çok güzel.
Amiga gerçekten her şeyi içine koymuş bir sistemdi. Üst düzey 32-bit CPU, grafik hızlandırma, harika ses ve NES’in kelimenin tam anlamıyla 256 katı RAM’e sahipti.
SNES bile yaklaşamıyordu; Sega Saturn dönemine kadar Amiga’yı aşan bir makine görmedim.
https://www.youtube.com/watch?v=4SB20aFHc08