Dari "Color Extender untuk ZX-Spectrum" ke ZX-Poly

"Color Extender for ZX-Spectrum" - ini adalah judul artikel yang diterbitkan dalam echo fido7.zx.spectrum pada 3 Agustus 1997. Artikel tersebut menggambarkan ide untuk menyelesaikan salah satu masalah utama platform ZX-Spectrum - atribut clash . Publikasi membangkitkan minat pada waktu itu, dan saya ingin menceritakan tentang rincian teknis dan sejarah masalah ini.


ZX-Poly logo


Saya tidak akan masuk jauh ke detail teknis dan hanya secara struktural menggambarkan ide dan solusi.


Bagian non-teknis dari cerita ini, Anda bisa lewati

Kisah pembangunan dimulai pada awal musim semi 1994, ketika negara itu masih mengalami "perubahan dalam rancangan", yang menyebabkan penutupan besar-besaran penangguhan dan daya tarik siswa sekolah kejuruan dan sekolah teknik. Saya beruntung - saya berada di tahun terakhir saya di Leningrad Radiotechnical College dan sedemikian rupa negara setuju untuk memberikan penundaan jangka pendek untuk percepatan penerimaan diploma dengan penggantian desain diploma dengan ujian dalam semua mata pelajaran. Dia meninggalkan tentara pada 1 Maret 1994, sebagai teknisi radio bersertifikat.


Di angkatan bersenjata pada waktu itu ada gelombang yang belum pernah terjadi sebelumnya dari spesialis yang sama dari tingkat teknis menengah, meskipun ini sedikit merusak sistem wajib militer musim gugur-musim semi di kepala "kakek" yang sudah memiliki gradasi yang jelas dalam nama-nama, mereka menjuluki panggilan ini "goblin" non-standar. Di antara "booming" ada cukup banyak orang yang menyukai ZX-Spectrum dan Alexander Gumin ada di unit saya (ia menulis game di ZX-Spectrum di bawah label ANCCAN dengan Denis Markelov dan menjadi terkenal karena adaptasi Mortal Kombat untuk platform ini pada tahun 1997), siapa yang berbicara tentang pemrograman dan perangkat keras.


Lebih dekat ke pertengahan April 1994, di akhir "jalur pejuang muda," Alexander dan saya dipindahkan ke batalion konstruksi yang terletak di Strelna, pinggiran kota St. Petersburg. Di sana, kami harus menguasai spesialisasi splicer kabel yang sulit selama beberapa bulan. Kehidupan di bagian ini mengalir dengan santai dan belajar bergantian dengan pakaian, yang sebagian besar tegang tangan, tetapi memberi waktu otak untuk refleksi. Jadi, di salah satu pakaian di dapur, lantai saya dan berpikir tentang ZX-Spectrum dan kemampuannya, saya datang dengan ide - bagaimana mengatasi "konflik atribut."


Saya merenungkan ide ini sampai akhir kebaktian dan semakin yakin bahwa "itu bisa berhasil." Sayangnya, gagasan tentang keberlangsungan platform itu sendiri, di mana saya akan menerapkan ide ini, jarang mengunjungi saya. Namun, di Rusia, ZX-Spectrum menyala paling jelas di langit dari sekitar 1991 hingga 1996. Beberapa produsen klon Rusia telah meningkat pesat sehingga mereka mensponsori program di TV (misalnya, perusahaan BiM telah mensponsori program "The Jungle's Name" untuk beberapa waktu). Tetapi selama layanan ada masalah lain, jadi saya memutuskan untuk menunda semua masalah yang berkaitan dengan perdagangan sampai saya dikirim ke cadangan. Secara berkala dan tanpa mengungkapkan detail, saya tertarik pada berbagai pakar tentang topik kelayakan teknis dan validitas pendekatan. Dia menyimpan ide itu secara rahasia dan bahkan tidak membaginya dengan Alexander Gumin, hanya secara samar menunjukkan kepadanya bahwa dia telah menemukan solusi yang sangat sederhana untuk meningkatkan jumlah warna sambil mempertahankan kompatibilitas ke belakang.


Setelah memasuki "warga negara" pada tahun 1997 dan mendapat pekerjaan sebagai insinyur perangkat lunak dari kategori kedua di perusahaan "Teknologi dan Model Informasi" St. Petersburg, saya mulai tertarik pada pertanyaan tentang mengkomersilkan solusi. Untuk beberapa alasan, saya yakin bahwa jika saya hanya mengisyaratkan solusi yang saya temukan, semua orang akan mulai merobek dengan tangan mereka dan uang akan mengalir. Saya mulai menelepon yang terkenal, pada waktu itu di bidang "Spectrum Engineering" produsen dan pedagang, seperti Sergey Zonov, Vyacheslav Skutin (Nemo) dan lainnya. Sergey Zonov hanya mengatakan kepada saya bahwa "kereta sudah pergi" dan tidak ada lagi pengertian komersial dalam usaha ini. Vyacheslav Skutin, sebagai seorang spektrumist ortodoks, mengambil permusuhan dengan ide di mana mereka mencoba untuk mengubah sesuatu di platform dan ini juga merupakan versi yang benar-benar mati. Saya memutuskan bahwa ada sedikit pembicaraan dan setidaknya sesuatu harus dilakukan dan yang terbaik adalah memulai dengan emulator untuk mendapatkan materi promosi dan data eksperimen.


Pada tahun 1998, dengan mengambil basis dari emulator ZX-Spectrum open-source yang ada saat itu yang ditulis dalam Pascal, saya membuat emulator primitif dari empat komputer yang bekerja secara paralel. Saya sebagian mengadaptasi permainan After The War 2 untuknya, mewarnai beberapa sprite-nya. Sistem bekerja dan, selain menikmati ide yang berfungsi, saya dapat screenshot saya mengkonfirmasi ide mewarnai game yang ada.


Pada tahun 1998, saya mengunjungi perusahaan Peters, yang sedang mengembangkan platform Sprinter baru pada waktu itu. Dia berusaha menarik minat sutradara mereka Nikolai Noskov. Mereka banyak berinvestasi dalam pengembangan baru dan, menurut hukum kekejaman, arsitektur super-fleksibel Sprinter, yang mampu meniru hampir semua platform prosesor tunggal pada Z80, tidak dapat memperpanjang empat prosesor. Namun, kunjungan ke perusahaan ini sangat berguna, ketika ia bertemu dengan penulis platform Sprinter Ivan Makarchenko dan belajar tentang peluang baru di bidang pengembangan FPGA.


Segera krisis 1998 "layu" dan ada harapan naif bahwa minat terhadap ZX-Spectrum bisa hidup kembali. Pada awal tahun 1999, kami (bersama pasangan saya saat itu, Andrei Savichev) bahkan mempunyai rencana untuk menciptakan "Dana Spektrum Nasional" dan satu pertemuan diadakan tentang topik ini di kantor baru dari perusahaan Peters yang sama. Tetapi mereka tidak memasuki sungai yang sama dua kali dan tentu saja tidak ada yang datang darinya. Sudah pada tahun 1999, semua ide tentang topik implementasi perangkat keras dari platform tersebut dibuang (kami bekerja pada pengembangan ini dengan Sergey Egorov, tetapi kami tidak melangkah lebih jauh dari skema). Sampai 2007, saya praktis tidak berurusan dengan platform, tetapi ada waktu dan memutuskan untuk menulis ulang emulator dan mengerjakan rincian platform, memeriksa pendekatan dan membiarkan mereka "secara virtual".


Mode video standar ZX-Spectrum, menampilkan 256 x 192 piksel. Dalam mode monokrom, ini hanya membutuhkan 6144 byte, yaitu sekitar 10% dari total bidang memori (terhadap 50% pada BK-0010). Informasi warna disimpan dalam 768 byte tambahan yang terletak tepat setelah data piksel. Palet terdiri dari delapan warna dan dua warna. Warna piksel yang menyala dan dibuang segera ditentukan untuk blok 8 oleh 8 piksel, dan rona ditentukan segera untuk warna piksel yang menyala dan dibuang.


Itu terlihat penuh warna dan jumlah data yang relatif kecil dikirimkan dengan sangat cepat, tetapi itu membutuhkan usaha dan seni yang luar biasa dari para seniman dan programmer ketika mengembangkan permainan warna dan screensaver. Inkonsistensi sekecil apa pun dalam grafik menyebabkan konflik atribut. Sebagian besar pengembang melakukan pekerjaannya dengan baik dengan latar belakang BK-0010, dengan hanya empat warna (tetapi untuk setiap titik!), Warna semu Spectrum tampak sangat menguntungkan dan segar.


Contoh atribut ZX-Spectrum


Dengan pengembangan platform ke ZX-Spectrum 128, kemampuan untuk beralih perangkat keras antara dua halaman memori video ditambahkan. Pemrogram dengan cepat menemukan cara untuk mendapatkan multi-warna menggunakan perubahan sangat cepat dari halaman video yang ditampilkan dan perubahan atribut warna yang dinamis.



Karena ini, bahkan mungkin untuk secara terprogram menaikkan resolusi layar (yang ditunjukkan dengan sempurna, misalnya, dalam demo "Dead Morose", di mana pada saat yang sama teks berjalan dengan resolusi 256, 512, dan 768 poin secara horizontal).



Tetapi setiap solusi perangkat lunak yang membutuhkan peningkatan aliran informasi video menyebabkan peningkatan konsumsi prosesor, yang sangat penting dalam kasus permainan yang dinamis. Tidak ada sumber cadangan daya komputasi yang tidak digunakan dalam sistem. Semuanya tergantung pada prosesor di ZX-Spectrum dan memberikannya sedikit, kecuali mungkin prosesor musik di bidang efek suara.


Ide saya adalah Anda dapat menambahkan tiga prosesor lagi, masing-masing memproses komponen warna mereka. Data yang diterima dari masing-masing memori video prosesor harus diintegrasikan, membentuk nilai YRGB untuk setiap piksel . Atribut warna standar diabaikan. Pemrosesan informasi yang paralel harus memastikan bahwa tidak ada kinerja yang kendur.


Skema Warna dalam ZX-Poly 256x192


Saya tidak bisa mengatakan bahwa itu asli dalam ide, karena terinspirasi oleh pembacaan buku terjemahan "The Computer Gain Mind" (Mir Publishing House, 1990), yang menggambarkan platform grafis Pixar tertentu yang dikembangkan di Lucasfilm. Dan menurut TRIZ, ini hanya transisi dari sistem tunggal menjadi sistem tunggal.


bagian halaman dari buku "The Computer Gain Mind"


Pertanyaan yang sangat menyakitkan untuk pengembangan apa pun - dan siapa yang akan menulis program? (khususnya, platform Sprinter menemukan "perangkap" ini). Dalam kasus saya, masalah dengan perangkat lunak secara otomatis diselesaikan oleh fakta bahwa sangat jarang ada program memeriksa jenis data apa yang mereka rekam dalam memori video dan hanya bekerja dengan mereka "seperti tukang pos dengan surat yang disegel". Menurut perhitungan saya, ternyata sebagian besar program game yang ada dapat dengan mudah bertahan adaptasi data video mereka tanpa perubahan dalam kode yang dapat dieksekusi. Tentu saja, game dengan paket grafik atau optimisasi internal dalam outputnya ke layar terputus. Mengadaptasi program semacam itu akan membutuhkan penelitian dan perubahan kode yang dapat dieksekusi. Pengembangan ROM khusus tidak diperlukan sama sekali.


Saya pikir konsep ini berlaku untuk platform rumah tangga lama (misalnya, AGAT, Radio86RK, BK-0010, dll.), Di mana tidak ada akselerator video khusus dan prosesor bekerja langsung dengan memori video untuk membentuk gambar.


Pada versi pertama dari emulator, saya baru saja membuat empat ZX-Spectrum 48s bekerja secara serempak. Tetapi apa yang mudah disimulasikan pada emulator sangat sulit untuk diulang pada perangkat keras nyata. Sangat sulit untuk memastikan pemuatan data ke dalam empat modul komputasi dan untuk memulai secara sinkron dari alamat yang sama. Solusi serupa Spec256 memperkenalkan untuk SIMD Z80 64-bit virtual khusus ini, yang tidak ada di alam. Sebagai bagian dari solusi yang lebih realistis (dan lebih kompleks) untuk masalah ini, platform ZX-Poly dibentuk.


Dari "Color Extender" ke ZX-Poly


Modul prosesor


ZX-Poly adalah platform komputasi berbasis pada ZX-Spectrum 128 yang berisi empat modul prosesor. Setiap modul memiliki port IO sistem addressable yang terlihat secara eksternal. Meskipun modul prosesor berbagi sinyal kontrol sistem (RESET, NMI, CLK, dan INT), mereka bekerja secara independen.


Diagram blok


Ada peringkat tertentu tergantung pada indeks modul - semakin kecil indeks, semakin tinggi peringkat, masing-masing, "modul 0" adalah master dalam sistem. Akses tulis ke port sistem dari modul hanya diperbolehkan ke modul dengan peringkat yang sama atau lebih tinggi, tidak ada batasan membaca. Ini dilakukan karena ada pemikiran tentang pengembangan OS khusus.


Modul pemeringkatan


Detail yang sangat penting adalah bahwa semua perangkat prosesor yang digunakan harus dari pabrikan yang sama (dan alangkah baiknya memiliki satu seri produksi), karena perbedaan sekecil apa pun dalam organisasi internal atau pengoptimalannya dapat melanggar konsistensi sistem.


Segera setelah dimulainya sistem, hanya modul master (CPU0) yang diluncurkan, modul yang tersisa dalam mode WAIT, sehingga bagi pengguna semuanya berjalan tanpa disadari.


Di ruang IO, ZX-Poly menambahkan port berikut yang tersedia untuk menulis dan membaca:


  • port konfigurasi utama $ 3D00
  • modul 0 - $ 00FF, $ 10FF, $ 20FF, $ 30FF
  • modul 1 - $ 01FF, $ 11FF, $ 21FF, $ 31FF
  • modul 2 - $ 02FF, $ 12FF, $ 22FF, $ 32FF
  • modul 3 - $ 03FF, $ 13FF, $ 23FF, $ 33FF

Port konfigurasi ZX-Poly utama adalah $ 3D00. Hanya modul master yang dapat menulisnya, tetapi tersedia untuk membaca ke semua modul dan masing-masing informasi khususnya dikembalikan. Secara khusus, modul dapat mengetahui indeksnya, apakah memorinya dipetakan ke port IO modul utama, offset ingatannya di heap, dll. Juga, port konfigurasi platform dasar $ 7FFD telah mengalami perubahan kecil, yang menggunakan bit yang tidak digunakan dalam aslinya.


Memori


Seperti dalam arsitektur asli ZX-Spectrum 128, ada ROM dan RAM. Jika organisasi dan bekerja dengan ROM praktis tidak berubah, maka RAM berubah menjadi "tumpukan" umum dari 512 KB di mana setiap prosesor bekerja dengan jendela 128 KB khusus (ini adalah 8 halaman 16 KB dalam ZX-Spectrum 128). Offset jendela dapat diubah dengan peningkatan 64 Kb dan semua modul prosesor dapat diproyeksikan untuk bekerja dengan sepotong memori yang penuh atau sebagian tumpang tindih di tumpukan. ROM dapat dinonaktifkan dan halaman RAM RAM0 akan terhubung pada tempatnya (ini memungkinkan Anda untuk membuat versi "penuh warna" dari OS dasar, misalnya, juru bahasa dasar). Setelah perangkat keras RESET, semua modul menerima offset otomatis untuk memisahkan jendela memori di heap.


Master modul prosesor (CPU0), memiliki kemampuan untuk memetakan ruang alamat modul lain (CPU1-3) ke area port IO-nya. Yaitu ia dapat menulis ke port, mengubah keadaan sel memori dari modul yang diberikan, dan pada saat yang sama, dimungkinkan untuk menghasilkan sinyal NMI pada modul yang dipetakan. Saat membaca dari sel memori dari modul yang dipetakan, pembuatan INT dimungkinkan. Ini dilakukan untuk meniru perangkat virtual menggunakan modul 1-3.


Pengontrol video


"Ceri" utama adalah tentu saja pengontrol video, semuanya dimulai untuk itu. Secara total, platform ini mendukung lima mode video.


ZX-Spectrum 128 Mode Video (mode 0,1,2,3)


Mode video ini biasa-biasa saja dan tidak berbeda sama sekali dari mode video standar ZX-Spectrum 128. Halaman video saat ini dari modul prosesor yang dipilih dengan pewarnaan atribut ditampilkan. Segera setelah dimulainya sistem, mode 0 diaktifkan, mis. Halaman video modul master (CPU0) ditampilkan.


ATW2 dalam mode ZX standar


ZX-Poly 256x192 (mode 4)


Mode video ini tidak menggunakan data apa pun dari area atribut sama sekali. Bit piksel dari setiap modul dikombinasikan dengan data piksel dari modul lain dan empat bit yang dihasilkan digunakan untuk menghasilkan sinyal YRGB-kecerahan warna.


Setiap modul bertanggung jawab atas komponennya:


  • modul 0 (master) untuk Hijau (hijau).
  • modul 1 untuk Merah (merah)
  • modul 2 untuk Biru (biru)
  • modul 3 untuk kecerahan

versi berwarna


Jika Anda memulai gim yang tidak diadaptasi dalam mode ini, itu hanya akan menjadi hitam dan putih.
game tidak diadaptasi


ZX-Poly 256x192 dengan masking oleh INK + PAPER (mode 6)


Seperti yang sebelumnya, ia menyediakan 16 warna untuk setiap titik, tetapi ada satu "trik". Dalam beberapa program ZX-Spectrum, elemen grafis disembunyikan menggunakan nilai TIN dan KERTAS identik dalam atribut, terutama dalam permainan scroller. Jika Anda menghapus peluang ini, maka elemen grafis mulai menumpuk di layar, memecahkan gambar. Oleh karena itu, status TINTA dan KERTAS dianalisis dari atribut modul master yang dibaca dari memori video (CPU0) dan jika mereka identik, maka semua titik disorot dengan warna yang diambil dari TINTA / KERTAS (tentu saja, dengan mempertimbangkan kecerahan).



ZX-Poly 256x192 dengan masking oleh FLASH + INK + PAPER (mode 7)


Mode adalah kombinasi dari mode 4 dan mode 6. Untuk atribut yang dapat dibaca dari modul master (CPU0), bit FLASH dianalisis dan jika sudah diatur (yang jarang terjadi dalam permainan dinamis di lapangan bermain), maka blok 8 oleh 8 piksel ditampilkan dalam mode mode 6 ( dengan masking dengan TINTA dan KERTAS identik). Jika FLASH diatur ulang, blok ditampilkan seperti pada ZX-Spectrum biasa. Bit FLASH tidak dipraktikkan dalam peran langsungnya dan tidak akan ada berkedip.
Mode ini sangat nyaman untuk menghindari pengecatan ulang panel informasi gim dan beberapa efek dalam gim (misalnya, ketika pengembang gim melakukan flash pada bidang permainan melalui atribut).


Animasi Hiu Terbang yang diadaptasi


ZX-Poly 512x384 dengan atribut (mode 5)


Atribut digunakan dalam cara yang hampir sama seperti pada platform asli, tanpa perubahan apa pun (bahkan bit FLASH). Data piksel video dari masing-masing modul diwarnai dengan atribut dari memori video modul ini dan, setelah melewati pewarnaan, ditampilkan dalam pola kotak-kotak, karena satu blok keakraban 16 dengan 16 poin.


formasi catur


Mode ini memungkinkan Anda untuk menggandakan resolusi aplikasi, tanpa mengubah kode yang dapat dieksekusi. Benar, percobaan dengan game yang sama "Pinocchio" menunjukkan bahwa dalam game yang cerah dengan detail besar, efeknya akan kurang terlihat. Karena ini adalah jenis piksel virtual, gim tidak tahu apa-apa tentang ini dan gerakan minimum yang mungkin dari elemen gim adalah pada tingkat dua piksel virtual. Saya pikir mode ini bagus untuk gim dengan objek gim kecil di tempat yang akrab.


contoh permainan "Pinocchio"


Efek yang jauh lebih baik dalam mode video ini diperoleh pada aplikasi teks, misalnya, pada editor teks ZX-Word, di mana font diproses tanpa perubahan dalam kode yang dapat dieksekusi.


diadaptasi ZX-Word


Multitasking


Terlepas dari kenyataan bahwa prosesor dalam sistem menggunakan sumber sinyal kontrol yang sama, mereka bekerja secara independen. Sistem tidak dapat disebut SIMD penuh, karena setiap prosesor memproses instruksi dari blok memorinya sendiri, ia hanya mengambil keuntungan dari kemampuan untuk "membuka" instruksi yang sama. , " " โ€” .


Contoh tidak sinkron


, , "". , .



RESET


RESET , . JP ADDR .


-


master- (CPU0). , ( M1), WAIT, RESET. , , 16 .



2007 JavaSE . Z80 ( -) FDD 181893. JDK 1.8+ .


Jendela emulator


ZX-Spectrum , 80% , . ZX-Spectrum 128, Options->ZX 128 Mode , ZX-Poly .


-, ZX-Spectrum โ€” . , File->Options


ROM tes ZX-Poly


Jika gim tidak menggunakan paket sprite, maka mewarnai cukup sederhana. Kehati-hatian harus diambil ketika ada optimasi dalam kode yang dapat dieksekusi output sprite, karena ini dapat menyebabkan desinkronisasi modul prosesor.


Bootloader dikembangkan untuk memuat data ke dalam modul dari disk dan secara bersamaan mulai secara bersamaan. Kode untuk TAP dan TR-DOS disajikan dalam proyek.


Contoh operasi bootloader


Bersama dengan emulator, utilitas kecil (juga ditulis dalam Java) untuk aplikasi pewarnaan dikembangkan.


ZX-Poly Sprite Corrector


Seluruh proyek diterbitkan di GitHub di bawah lisensi GNU GPLv3 .



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


All Articles