1 puan yazan GN⁺ 2024-02-26 | 1 yorum | WhatsApp'ta paylaş
  • 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 BPLMOD1 ayarı 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 0x20000 adresinden 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 0x100 bayt yer kapladığında ekran pointer’ı 0x20800 olarak 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_TCopTop ve vs_TCopBottom değ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 -40 olarak 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
  • 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

 
GN⁺ 2024-02-26
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.

  • 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.

    • 1991 doğumluyum; Windows 95 PC’ye geçmeden önce evde bir Amiga 1000 vardı. Bu yüzden Amiga’ya hep nostalji duydum; o performansı sağlayan benzersiz ve güçlü chip’leri daha iyi anladıkça sevgim de arttı.
      Ş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.
    • Birçok insan için Amiga, C64, Atari, ZX Spectrum kadar eğlenceli bir şey yok.
      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.
    • Bu gruba girecek kadar genç olmayabilirim ama kendi dönemimden biraz önceki bilgisayarların çoğunu seviyorum. Bir Commodore 64 edinip kondansatörlerini değiştirdim, PLA’yı da değiştirdim, çift SID ve “bölge değiştirme” modifikasyonu bile ekledim.
      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
    • Eski bilgisayarlara yeni oyun kumandalarını bağlayan arayüzler yapan bir arkadaşım var. Burada Nintendo Balance Board ile Commodore 64’te Decathlon oynanmasını sağlıyor.
      [1] https://retro.moe/2024/02/04/bluepad32-v4-0/
      [2] https://www.youtube.com/watch?v=Nj5fZlt_834
    • Orijinal yazının yazarından 5 yaş büyüğüm. Pandeminin başlarında eğlencesine assembly öğrenmek için Atari, Amiga ve birkaç kaynak topladım. Udemy kursu da var.
      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ı.

    • Buna Slow RAM denir.
      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.

    • “Sanatın düşmanı kısıtların yokluğudur.”
  • 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.

    • İkisine de sahiptim; Amiga açıkçası iki nesil ileride bir makine gibi geliyordu. Donanım farkına bakınca bu şaşırtıcı değil.
      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.
    • Kontrol amaçlı soruyorum: Bunun şu anda geliştirilen yeni bir oyun olduğunu biliyorsun, değil mi?
      https://www.youtube.com/watch?v=4SB20aFHc08