1 poin oleh GN⁺ 2024-02-26 | 1 komentar | Bagikan ke WhatsApp
  • Magicore Anomala memanfaatkan kemampuan grafis dan suara Amiga yang dirilis pada 1985 untuk mewujudkan CG layar penuh dan transisi bergaya animasi, tetapi di dalam engine game harus sekaligus menyelesaikan penempatan RAM, pembagian layar, dan keterbatasan sprite
  • Pada konfigurasi Amiga 500 yang umum, Chip RAM yang bisa dipakai untuk grafis dan suara hanya 512KB, sehingga ukuran 48KB tanpa kompresi untuk CG 320x240 32 warna menjadi beban besar
  • CG dikurangi hingga sekitar 8KB dengan kompresi ZX0, disimpan di RAM ekspansi, lalu didekompresi ke Chip RAM tepat sebelum ditampilkan sambil memakai ulang 48.000 byte memori layar yang sudah ada
  • Efek transisi dibuat dengan copper yang mengubah register perangkat keras pada scanline tertentu serta mematikan dan menyalakan kembali bitplane DMA, sementara CPU menyesuaikan nilai copperlist di setiap frame sesuai lebar split
  • Motion lines pada latar harus mengakali ketergantungan warna, penggunaan ulang, dan bitplane pada sprite Amiga; perangkat kuncinya adalah attached sprites, bit kontrol dummy, mempertahankan 1 bitplane, dan penyesuaian BPLMOD1

Masalah RAM untuk memasukkan CG layar penuh di Amiga 500

  • Platform target Magicore Anomala adalah Amiga 500 standar, dengan konfigurasi 512KB Chip RAM dan 512KB RAM ekspansi
    • Memori yang dapat dipakai chipset Amiga untuk keluaran grafis dan suara hanyalah Chip RAM
    • RAM ekspansi hanya bisa diakses CPU, sehingga sulit dipakai langsung untuk grafis dan suara
  • Grafik karakter layar penuh (CG) adalah gambar bitmap 320x240 dengan 32 warna, yang memakan 48KB dalam keadaan tidak terkompresi
    • Jika memperhitungkan aset bersama, data level, dan alokasi memori layar, 48KB menjadi overhead yang besar
  • Dukungan kompresi aset yang baru ditambahkan memakai format kompresi ZX0
    • CG yang dikompresi turun menjadi sekitar 8KB
    • Saat memuat aset level, CG terkompresi ditempatkan di RAM ekspansi
    • Tepat sebelum ditampilkan, data didekompresi ke Chip RAM

Cara tanpa menyediakan 48KB Chip RAM baru

  • Alih-alih mencari 48KB Chip RAM kosong khusus untuk CG, sebagian memori layar yang sudah ada dipakai ulang
    • Gambar latar ruangan
    • Layer layar untuk merender objek berbahaya
    • Area layar textbox
  • Tiga area memori ini tersusun berurutan di RAM, dan ukuran gabungannya 48.000 byte, tepat sama dengan ukuran CG
  • Gambar latar ruangan bisa dipulihkan setelah CG selesai ditampilkan, jadi tidak masalah jika ditimpa
  • Dekompresi CG memakan waktu sekitar 500ms, tetapi dimasukkan ke dalam alur cutscene agar tidak terasa seperti loading
  • Video proof-of-concept gameplay Magicore Anomala dapat dilihat di YouTube

Efek pembagian layar dan penggunaan copper

  • Awalnya dipertimbangkan transisi wipe vertikal, tetapi untuk membuatnya terlihat bagus dibutuhkan gradien yang menyesuaikan palet warna di tiap scanline
    • Dinilai sulit mengatur semua 32 warna hanya dalam satu horizontal blank dengan copper saja
    • Karena tidak ingin berurusan dengan “racing the beam”, dipilihlah efek pembagian layar
  • Efek pembagian layar terlihat lebih keren bagi penonton umum, dan copper pada Amiga praktis terasa seperti dirancang khusus untuk efek semacam ini
    • Contoh efek serupa yang tertanam di Amiga Workbench bisa dilihat di video ini
  • Implementasinya memakai dua fitur Amiga sekaligus
    • copper mengeksekusi daftar instruksinya sendiri secara paralel dengan CPU, dan dapat mengubah register perangkat keras pada baris layar tertentu
    • Pointer layar dapat diatur lewat register perangkat keras untuk memindahkan memori layar ke posisi mana pun di Chip RAM

Menghentikan lalu melanjutkan gambar dengan bitplane DMA

  • Sebagai contoh, jika memori layar utama dimulai di 0x20000, biasanya copper menetapkan alamat ini ke register bitplane DMA
    • Saat bitplane diaktifkan, DMA membaca area memori tersebut secara berurutan dan menggambarnya ke layar
  • Jika setiap garis horizontal memakan 0x100 byte, mengatur pointer layar ke 0x20800 akan membuat layar tampak seolah tergulir 8 baris ke atas
    • Karena titik awal layar bergeser 8 baris ke bawah di dalam memori
  • Separuh atas split digulirkan ke atas dengan cara ini
  • Di titik split, copper mematikan bitplane DMA dan mengubah warna latar menjadi merah
    • Register perangkat keras terkait bitplane pada dasarnya berhenti di titik itu
    • Saat mencapai bagian bawah split, warna latar dipulihkan dan bitplane DMA dinyalakan kembali
    • Layar lalu dilanjutkan dari posisi saat berhenti, tetapi lokasi tampil nyatanya sudah lebih ke bawah
  • Di setiap frame, CPU menyesuaikan vs_TCopTop dan vs_TCopBottom sesuai lebar split saat ini
    • Penyesuaian pointer layar untuk split bagian atas juga dilakukan, tetapi tidak disertakan dalam contoh kode

Akal-akalan sprite untuk motion line “woosh”

  • Motion lines pada latar bergaya animasi digambar sebagai sprite
    • Sprite digambar dan dapat dipindahkan secara independen dari memori layar, sehingga cocok untuk tujuan ini
    • Namun, sprite Amiga memiliki banyak keterbatasan dan rumit untuk ditangani
  • Keterbatasan warna

    • Sprite berbagi bitplane dan palet warna, jadi harus memakai warna sesedikit mungkin
    • Motion line hanya memakai 3 warna, menyisakan 28 warna untuk CG dan 1 warna untuk latar
    • Di Amiga, rentang warna palet yang dipakai berbeda untuk tiap pasangan sprite
      • Dua sprite pertama memakai warna 16-19
      • Dua sprite berikutnya memakai warna 20-23
    • Jika dua sprite di-attach, hasilnya bertindak seperti satu sprite dengan palet 16 warna dan dapat memakai warna 16-31
    • Motion line memakai 4 attached sprites, dan pada grafik hanya menggunakan warna 29-31
  • Memakai grafik sprite yang sama di banyak posisi

    • 4 byte pertama grafik sprite adalah bit kontrol yang menentukan posisi dan tinggi
    • Struktur ini menjadi masalah jika grafik yang sama ingin digambar di banyak posisi
    • Pernah dicoba mengatur bit kontrol sprite langsung lewat register perangkat keras, tetapi tidak berhasil membuatnya tampil di layar
    • Sprite DMA Amiga, seperti bitplane DMA, menggambar ke layar sambil mengikuti pointer data sprite
    • Solusinya adalah membuat 8 sprite palsu berukuran 4 byte
      • Sprite palsu ini hanya berisi bit kontrol
      • Semua pointer sprite mula-mula diarahkan ke sprite palsu
      • Sekitar baris ke-19, sprite DMA membaca pointer tersebut dan memuat bit kontrol
      • Setelah itu semua pointer diubah ke grafik “motion line” yang sebenarnya
    • Hasilnya, DMA telah dimuat untuk menggambar sprite di posisi berbeda sambil memakai grafik yang sama, dan pergantian ini ditangani dalam copperlist

Masalah sprite ikut hilang saat bitplane dimatikan

  • Sebelum CG mencapai bagian atas layar, ada ruang kosong di antara bagian atas layar dan titik awal CG
    • Jika bitplane dibiarkan menyala pada saat ini, layar akan menampilkan data sampah
  • Di area tersebut, bitplane harus dimatikan agar DMA tidak membaca data sampah
  • Masalahnya, jika bitplane dimatikan, sprite juga tidak ikut tergambar
    • Akibatnya motion line hanya terlihat di dalam batas CG
  • Solusinya bukan mematikan bitplane sepenuhnya, melainkan membiarkan 1 bitplane tetap aktif sambil mengarahkan pointer layar ke data kosong
    • Layar tetap menggambar sesuatu, tetapi hasil akhirnya tampak seperti tidak ada apa-apa
  • Tidak perlu menyiapkan satu layar kosong penuh
    • Untuk piksel 1 bit, satu baris 320 piksel berarti 320 bit, yaitu 40 byte
    • Jika BPLMOD1 diatur ke -40, setelah tiap baris pointer akan kembali 40 byte ke belakang dan terus menggambar 40 byte yang sama berulang-ulang
    • Cukup kosongkan 40 byte pertama di safety margin layar

Hasil dan detail kecil yang masih tersisa

  • Pada awalnya belum yakin CG seperti ini bisa dimasukkan ke dalam game karena kebutuhan RAM, tetapi setelah kompresi data diimplementasikan, terlihat bahwa overhead-nya sangat masuk akal
  • Kini Magicore bisa diberi hiasan visual tambahan
  • Masih ada tugas kecil yang belum dibahas
    • Misalnya, bagaimana agar motion line 100px yang sudah keluar ke atas layar tidak tiba-tiba hilang bagian bawahnya
  • Efek ini sama sekali tidak memakai blitter
  • Amiga tetap menjadi platform yang mampu mengesankan orang dengan kemampuan menampilkan grafis berwarna, sama seperti ketika ia mengesankan orang-orang pada akhir 1980-an

1 komentar

 
GN⁺ 2024-02-26
Komentar Hacker News
  • Saya jadi benar-benar paham apa arti “Racing the beam”. Dulu, kami mengubah warna beam secara berbeda di awal dan akhir rutin yang tersinkronisasi vsync untuk menghitung berapa banyak waktu CPU per frame yang bisa dipakai, dalam satuan beberapa scanline
    Saya ingat alamat yang dipakai untuk tujuan ini adalah $dff180. Itu palet warna 0, jadi selalu terlihat juga di tepi layar di luar area bitmap
    Trik itu pun semuanya dipelajari dari mulut ke mulut tanpa internet, dan saya tidak menyangka masih ada orang yang mencoba memeras lebih banyak dari chipset itu sampai sekarang

  • Saya benar-benar penasaran orang seperti apa yang masih meluangkan waktu membuat game untuk Amiga. Anak muda sepertinya tidak tertarik pada komputer tua seperti ini, sementara orang-orang yang tumbuh dengannya mungkin sibuk dengan keluarga dan pekerjaan
    Bahkan kalau tidak sibuk, ada begitu banyak proyek lain yang sama menyenangkannya dan tetap terasa modern. Tapi tetap saja ini benar-benar keren

    • Saya lahir tahun 1991, dan sebelum beralih ke PC Windows 95, di rumah ada Amiga 1000. Jadi saya selalu punya nostalgia terhadap Amiga, dan rasa sayang itu makin besar saat saya makin memahami chip-chip unik dan kuat yang menghasilkan performanya
      Sekarang saya bekerja penuh waktu sebagai pengembang game indie. Membuat game Amiga hampir seperti impian seumur hidup, dan sekarang saya merasa sudah punya keterampilan untuk mewujudkannya
      Saya ingin menunjukkan bahwa dengan memanfaatkan alat masa kini dan pengetahuan yang sudah tersebar luas, kita bisa memberi kehidupan baru pada hardware klasik yang dicintai lewat pengalaman game dengan prinsip desain modern
    • Bagi banyak orang, tidak ada yang semenyenangkan Amiga, C64, Atari, atau ZX Spectrum
      Kalau semua hal dalam hidup dikaitkan dengan karier, seluruh hidup akan berubah menjadi pekerjaan
      Ini mirip seperti bertanya mengapa berlatih melukis cat minyak padahal ada Photoshop, atau mengapa merestorasi mobil vintage padahal ada Tesla
    • Mungkin saya tidak cukup muda untuk masuk kelompok ini, tetapi saya sangat menyukai banyak komputer yang sedikit mendahului era saya. Saya mendapatkan Commodore 64, mengganti kapasitor, mengganti PLA, bahkan memasang dual SID dan mod “alih wilayah”
      Mod alih wilayah itu cukup rumit karena harus mengganti dua VIC-II dan dua osilator. Saya juga punya MSX2; belum banyak saya pakai, tapi pesonanya besar
      Meluangkan waktu untuk benar-benar menulis kode di mesin-mesin seperti ini memang sulit, tetapi menurut saya, seperti kebanyakan hobi pekerja kantoran, ini soal mencurahkan malam dan akhir pekan ketika inspirasi datang
      Retrocomputing adalah hobi yang menarik dan memuaskan. Hanya saja, yang lebih saya keluhkan daripada waktu adalah harga dan sulitnya mendapatkan komponen
      Sayang rasanya sekarang makin banyak orang yang mencoba menjual mahal apa pun di pasar komputer begitu diberi label “antik” atau “vintage”
      Untuk orang yang lebih tua, sulit bagi saya berbicara langsung, tetapi sebagian orang yang masih membuat demo Commodore 64 tampaknya punya dorongan kuat untuk terhubung kembali dengan masa kecil mereka
      Ada juga karya yang hampir menceritakan hal semacam itu secara langsung, seperti demo “Mojo” yang relatif baru dari Bonzai dan Pretzel Logic. Upaya melakukan storytelling yang “serius” dalam karya demoscene memang agak membuat geli, tetapi tetap terasa hangat dan menyenangkan
      Ini hobi yang menyita banyak waktu, tetapi kalau benar-benar ingin meluangkan waktu, pada akhirnya akan menemukan caranya
      [1]: https://csdb.dk/release/?id=232966, https://www.youtube.com/watch?v=HXi3oJ9huiI
    • Saya punya teman yang membuat antarmuka untuk menghubungkan controller game baru ke komputer lama. Di sini ia menghubungkan Nintendo Balance Board agar bisa dipakai memainkan Decathlon di Commodore 64
      [1] https://retro.moe/2024/02/04/bluepad32-v4-0/
      [2] https://www.youtube.com/watch?v=Nj5fZlt_834
    • Saya 5 tahun lebih tua dari penulis asli. Pada awal pandemi, saya mengumpulkan Atari, Amiga, dan beberapa materi untuk belajar assembly sekadar untuk bersenang-senang. Ada juga kursus Udemy
      https://www.udemy.com/course/programming-games-for-the-atari...
      Saya kira bekerja dari rumah akan memberi lebih banyak waktu luang, tetapi kenyataannya tidak begitu. Tetap saja, suatu hari nanti saya harus melanjutkannya
  • Saya selalu penasaran seperti apa tampilan game bergaya konsol Jepang di Amiga, dan apakah Amiga memang kurang bertenaga atau kebanyakan desain gamenya saja yang tidak cocok dengan selera saya
    Bonk di-porting dengan sangat baik oleh Factor 5, tetapi mereka memang hampir seperti penyihir

  • Bagian yang mengatakan “Amiga 500 biasa memiliki 512KB Chip RAM dan 512KB RAM ekspansi” sedikit tidak akurat. A500 dasar hanya punya 512KB Chip RAM
    Banyak pengguna menambahkan ekspansi RAM A501 sehingga mendapat tambahan 512KB Fast RAM yang tidak bisa diakses langsung oleh hardware grafis
    Meski disebut Fast RAM, karena struktur ekspansinya, itu lebih lambat daripada Fast RAM sungguhan

    • Itulah yang disebut Slow RAM
      Sebagian besar pemilik A500 punya ekspansi trapdoor 512KB. Banyak software, termasuk game seperti Monkey Island, tidak bisa berjalan tanpa total RAM 1MB
      Sekarang ekspansi trapdoor murah berbasis desain hardware terbuka sudah banyak tersedia, menawarkan 1,5MB Slow RAM, 512KB Chip RAM agar totalnya menjadi 1MB, bahkan RTC
  • Ada sesuatu yang luar biasa menarik dari coding dalam batasan seperti ini

    • “Musuh seni adalah ketiadaan batasan
  • Senang melihat IE. Bagus melihatnya mendalami Amiga

  • Saya merasa banyak orang memainkan Amiga yang berbeda dari Amiga yang saya pakai. Memang ada game yang terlihat keren, tetapi Nintendo NES juga begitu, dan saya tidak mengenang keduanya dengan sebegitu sayangnya
    Meski begitu, menunjukkan bagaimana animasi seperti ini dibuat memang sangat keren

    • Saya punya keduanya, dan sejujurnya Amiga terasa seperti mesin dua generasi lebih maju. Kalau melihat perbedaan hardware-nya, itu tidak mengherankan
      Amiga benar-benar sistem yang memasukkan semuanya. CPU 32-bit kelas atas, akselerasi grafis, audio yang hebat, dan RAM yang secara harfiah 256 kali lebih besar daripada NES
      Bahkan SNES pun tidak mendekati, dan baru pada era Sega Saturn saya melihat mesin yang melampaui Amiga
    • Sekadar memastikan, Anda tahu ini adalah game baru yang sedang dikembangkan sekarang, kan?
      https://www.youtube.com/watch?v=4SB20aFHc08