Poligon Dunia Lain: Amiga 500

Artikel ini adalah bagian dari seri tentang port game Another World. Ini akan berbicara tentang trik ketika bekerja dengan Amiga 500 . Disarankan agar Anda membaca artikel sebelumnya terlebih dahulu .


Kisah Amiga dimulai pada pertengahan 1982 dengan telepon dari Larry Kaplan ke Jay Miner. Keduanya kemudian bekerja di Atari di tahun 70-an. Keduanya memutuskan untuk meninggalkan perusahaan. Kaplan karena kurangnya pengakuan dan Miner karena larangan kepemimpinan dalam penggunaan prosesor Motorola 68000 yang keren tapi mahal.


Meninggalkan Atari, Kaplan mendirikan Activision. Setelah investor memintanya untuk mengembangkan platform game baru, dia menghubungi orang-orang paling cerdas yang dia kenal. Miner mengambil perangkat keras masalah ini di perusahaan Hi-Toro yang baru dibentuk. Sistem menerima nama kode "Lorraine".


Pada akhir 1983, sebuah prototipe telah dirakit. Perangkat ini mengesankan pengunjung Consumer Electronics Show (CES) pada Januari 1984, berkat demo Boing Ball, di mana sprite besar bergerak dengan frame rate 60 frame per detik. Perangkat itu diumumkan pada tahun 1985 dengan nama "Amiga dari Commodore", yang kemudian dinamai Amiga 1000.




Catatan: Amiga 1000 tidak dapat boot dengan sendirinya, perangkat tidak memiliki ROM. Bootloader ada di floppy disk, dan akan lebih baik jika Anda menyimpannya sebagai apel mata Anda!


Seri artikel


  1. Poligon Dunia Lain .
  2. Poligon Dunia Lain: Amiga 500.
  3. Poligon Dunia Lain: Atari ST .

A500


Pada tahun 1985, setelah serangkaian kesalahan, Commodore berada dalam situasi yang mengkhawatirkan di ambang kebangkrutan. Thomas Rattigan, saat itu COO, membuat perubahan radikal. Selain rencana ambisius yang mencakup hampir semua divisi perusahaan, ia membagi Amiga 1000 menjadi dua produk: versi high-end baru yang dirancang untuk pasar kreatif bernama Amiga 2000 dan versi murah untuk Commodore 64 yang disebut Amiga 500.


Amiga 500, juga dikenal sebagai A500, diluncurkan pada tahun 1987. Di bawah kap Motorola 68000, perangkat bekerja pada 7,16 MHz dan memiliki 512 KB RAM. Perangkat ini telah menjadi sangat sukses, telah mendapatkan popularitas di kalangan pemain, programmer, khususnya, orang-orang dari kancah demo. Itu adalah produk terlaris Commodore (sekitar 6 juta unit terjual dari 1987 hingga 1991 [1] ).



A500 memiliki ROM, tetapi hanya ada cukup memori untuk mengakomodasi bootloader bernama Kickstart. Setelah menginisialisasi peralatan, Kickstart meminta pengguna untuk memasukkan disket yang berisi program atau Workbench OS. Disket harus tetap berada di drive saat mesin hidup. Model selanjutnya, seperti A1200 (alias mesin terbesar yang pernah dibuat), memiliki ruang untuk hard drive 2,5 inci dan dibebaskan dari penggunaan floppy disk.


Arsitektur


Karena teknologi ini awalnya dibuat dengan pandangan untuk bermain game [2] [3] , Amiga tidak dibangun di atas prosesor "besi" dengan kemampuan audio dan video, seperti kebanyakan komputer pada waktu itu. 32/16-bit 68000 bekerja bersama dengan chipset, yang menampung tiga chip kuat: Paula (audio), Denise (video) dan Agnus (manipulasi data dan sinkronisasi).



Desain serupa dengan sistem memori yang tidak hanya menyediakan pengalamatan datar, tetapi juga RAM umum yang tersedia untuk prosesor dan chipset, sangat berkontribusi terhadap popularitas Amiga di kalangan pengembang. Sebagai perbandingan, baik Sega Genesis maupun Nintendo SNES, dua sistem yang kuat yang dirilis bertahun-tahun kemudian (masing-masing, pada Januari 1989 dan November 1990), tidak memiliki memori yang sama.


Chipset bus memiliki sistem prioritas kompleks di mana 68.000 tidak aktif pada siklus genap. Chipset DMA (akses memori langsung) mencoba menggunakan hanya siklus aneh untuk secara bertahap akses bus multipleks tanpa mempengaruhi prosesor. Tapi tidak semuanya selalu mulus. Agnus, khususnya, berhasil dengan baik di mana 68.000 kelaparan [4] .


Untuk mengatasi masalah ini, pelanggan dapat membeli ekstensi "RAM Cepat" dengan "bus CPU" khusus untuk 68000. Dengan instruksi di sana, 68000 [5] CPU tidak menjadi lapar ketika saluran DMA blitter [15] aktif. Ini menggandakan kecepatan eksekusi 68.000.


Sistem video


Sistem video sepenuhnya dikendalikan oleh Denise, menawarkan total dua puluh mode grafis [6] . Resolusi paling populer adalah 320x200 dengan rasio aspek 1,6, yang tidak sesuai dengan monitor pada waktu itu (4/3 = 1,3). Rasio aspek menyebabkan distorsi ketika buffer bingkai ditransmisikan ke monitor CRT.



Framebuffer tidak disimpan secara terus-menerus, tetapi di area memori yang terpisah yang disebut bit planes. Hingga 5 [7] bit pesawat 8 KB dapat dialokasikan, yang menghasilkan 5 bit per piksel, memungkinkan Anda untuk mendapatkan 32 indeks warna. Pada pandangan pertama, pendekatan ini terlihat cukup aneh (terutama untuk pengembang dengan pengalaman PC), tetapi Agnus dan khususnya blitter secara keseluruhan memberikan kejelasan yang lebih.


Palet didasarkan pada ruang warna RGB 4-bit per saluran. 12-bit per warna memungkinkan Anda mengidentifikasi hingga 4096 warna berbeda, yang jauh lebih dari biasanya di komputer pada era yang sama.


Banyak trik yang memungkinkan kami menampilkan lebih banyak warna. Seperti Copper, memungkinkan Anda untuk mengubah palet ke HSYNC.


Dua gambar berikut mewakili dua sisi berlawanan dari ruang warna RGB. Dengan koordinat hitam di (0x0, 0x0, 0x0), merah di (0xF, 0x0, 0x0), hijau di (0x0, 0xF, 0x0) biru di (0x0, 0x0, 0xF) dan putih di (0xF, 0xF) 0xF) . Gambar penuh warna ini menggambarkan dengan baik kebebasan kreatif yang diberikan kepada pengembang grafis.




Dunia lain di Amiga


Dunia lain di Amiga, sebenarnya, bukanlah pelabuhan. Karena A500 digunakan untuk pengembangan, ini adalah versi asli yang dibuat antara 1989 dan 1991 oleh Eric Shayy yang berusia 21 tahun, yang bekerja sendirian di kamarnya.



Dua alasan telah menjadikan Amiga mesin pengembangan ideal. Pertama, GenLock diizinkan melakukan rotoscoping. Kedua, dan yang paling penting, Amiga Agnus telah sangat memfasilitasi rendering poligon.


Blitter


Gagasan untuk membuat game hanya berdasarkan poligon muncul karena asumsi yang salah bahwa "Dragon's Lair, Escape from Singe's Castle" di Amiga menggunakannya [8] . Eric entah bagaimana harus mengimplementasikan ini dengan frame rate yang masuk akal. Pada tahap penelitian dan pengembangan inilah Amiga Blitter memainkan peran kunci.


Gambar Poligon


Dokumentasi blitter menyebutkan fitur yang disebut "Area Fill Mode". Kita tidak berbicara tentang proyeksi atau tekstur tiga dimensi yang mewah. Blitter bekerja di ruang layar pada string bit dengan opsi untuk "mengisi kosong". Pekerjaan ini didasarkan pada pemindaian dari kiri ke kanan. Selama blitter melihat 0, tidak ada yang terjadi. Begitu 1 pertama dilewati, blitter akan mengisi baris dengan unit ke 1. Gambar di dokumentasi menggambarkan pekerjaan dengan baik. Perhatikan bahwa poligon cekung dapat ditampilkan dengan benar menggunakan metode ini.


      bit array sebelum bit array sesudahnya
   ______________________ ______________________
  |  |  |  |
  |  |  |  |
  |  |  |  |
  |  1 1 1 1 |  |  11111 11111 |
  |  1 1 1 1 |  |  1111 1111 |
  |  1 1 1 1 |  |  111 111 |
  |  11 11 |  |  11 11 |
  |  1 1 1 1 |  |  111 111 |
  |  1 1 1 1 |  |  1111 1111 |
  |  1 1 1 1 |  |  11111 11111 |
  |  |  |  |
  |  |  |  |
  | ______________________ |  | ______________________ |

    

Solusi semacam itu mengarah pada masalah kedua - cara menggambar "batas" poligon. Jika Anda hati-hati melihat gambar di atas, Anda akan melihat bahwa ini adalah algoritma Bresenham non-standar [9] , karena garis horizontal harus dilewati. Untungnya, desainer Amigi mempresentasikan mode menggambar garis ke blitter [10] .


Kami belum selesai. Masih ada masalah. Pertama, "menggambar garis dan kemudian mengisi area" harus dilakukan empat kali (satu kali untuk setiap bidang bit), yang tampaknya sangat mahal. Kedua, mesin harus membuat ratusan poligon. Blitter membutuhkan penyangga bersih yang penuh dengan nol dan batas satuan yang baik untuk bekerja dengannya. Setelah beberapa poligon, penyangga bingkai mungkin akan terlihat seperti sup bit. Akhirnya, blitter hanya menghasilkan 1-ts, tetapi kita membutuhkan kemampuan untuk menghasilkan 0 di beberapa dari empat bidang bit untuk menghasilkan warna 4-bit yang benar.


Solusi untuk masalah ini adalah mengkonfigurasi input dari blitter A, B dan C [11] . Proses ini lebih baik dijelaskan oleh Blogger Scali di blog-nya [12] .


... ada solusi untuk masalah ini, dan itu bahkan tidak sulit. Blitter dapat membuat di mana saja dalam chipmem, sehingga mudah untuk mengatur buffer bersih sementara, "scratchpad", dan menggambar poligon di dalamnya. Kemudian Anda menyalinnya ke area aktual layar menggunakan sedikit cahaya pada topeng [16] . Seringkali operasi ini disebut juga cookie cut. Ini pada dasarnya adalah operasi yang sama yang akan Anda gunakan dengan gambar 2D ketika Anda merekam piksel hanya ketika mereka diatur dalam gambar asli, dan membiarkan piksel target tetap utuh (operasi logis ATAU). Ini akan menggabungkan poligon di layar dengan benar.


Bahkan, mungkin sekarang adalah waktu untuk menjelaskan masalah secara lebih rinci. Blitter memiliki 3 input dan 1 output. Semuanya diproses oleh DMA, sehingga dapat bekerja sepenuhnya secara independen dari CPU setelah penyetelan. 3 input dapat dikombinasikan menggunakan operasi logis. Hasilnya kemudian ditulis ke saluran output. Dalam kasus masker blit, Anda biasanya melakukan operasi berikut:


= ( ) ( )


- OpenBlog Scali



Berdasarkan data input blitter, kami sekarang memiliki gambaran lengkap tentang apa yang diperlukan untuk membuat setiap poligon.


  1. Pilih sepotong penyangga.
  2. Nol bersih dengan blitter.
  3. Gambarlah batas poligon dengan unit dalam mode garis tarik.
  4. Isi area penyangga dengan unit-unit dalam mode "area isian".
  5. Blitz sepotong buffer empat kali (satu kali untuk setiap bidang bit).

Itu tidak terlalu menyenangkan, tetapi pekerjaan itu selesai. Upaya itu sepadan, karena program dapat memproses hingga 50 poligon (tergantung pada ukurannya) dengan kecepatan 20 frame per detik. Yang membawa kita ke masalah kedua.


Salin framebuffer


Tidak peduli seberapa cepat blitter dapat menarik poligon, itu masih belum cukup cepat. Setiap frame terdiri dari ribuan poligon. Beberapa poligon sangat kecil (1x1, disebut piksel) sehingga tidak membenarkan overhead. Salah satu latar belakang pertama dalam permainan (ketika Leicester meninggalkan air) terdiri dari 981 poligon.



Solusinya adalah dengan men-cache latar belakang dalam buffer BKGD khusus dengan penyalinan sederhana. Ini adalah tugas khusus untuk blitter.


Blitter adalah salah satu dari dua coprocessor di Amiga. Sebagai bagian dari chip Agnus, ia digunakan untuk menyalin blok memori persegi panjang dan menggambar garis. Saat menyalin memori, sekitar dua kali lebih cepat dari 68000 dan mampu bergerak hampir empat megabyte per detik. Dia dapat menggambar garis dengan kecepatan hampir satu juta piksel per detik.


- CD Amiga Developer v2.1 (OS 3.5)



Pada kecepatan 4000 byte dalam milidetik, menggigit buffer BKGD pada awal setiap frame baru membutuhkan "hanya" 8 ms.


Catatan: terlepas dari kenyataan bahwa Another World adalah gim yang dipoles, beberapa sisi tetap "kasar". Jika seorang pemain mencoba menjadi pintar selama kuis perlindungan salinan [13] dan tekan "c" untuk memasukkan kode untuk pergi ke proses permainan, layar berubah hijau dan Amiga membeku. Satu-satunya jalan keluar adalah memulai kembali game.


Pengisian Framebuffer


Meskipun prosesor 68000 dapat merekam 16 bit pada satu waktu, framebuffer juga mungkin dibersihkan menggunakan blitter. Dokumentasi Amiga berisi contoh kode "clearmem" [14] yang menggunakan blitter untuk membersihkan 128 KB RAM.


Referensi


  1. Wikipedia: Amiga 500 .
  2. Commodore: Tahun Amiga .
  3. Commodore: Tahun-Tahun Terakhir .
  4. Amiga Chip RAM .
  5. Wikipedia: Perangkat Amiga .
  6. Mode Layar Amiga .
  7. Amiga Grafik 3D Real-time .
  8. Postmortem Game Klasik - Dunia Lain .
  9. Algoritma Bresenham .
  10. 6 Blitter Perangkat Keras / Mode Pengisian Area .
  11. 6 Saluran Blitter Hardware / DMA .
  12. Menjaga agar tetap nyata, bagian 3 .
  13. Roda kode .
  14. Dokumentasi Amiga, 'Contoh: Clearmem' .
  15. Blitter .
  16. Sedikit blit .

Source: https://habr.com/ru/post/id483140/


All Articles