- Perkalian floating-point VU pada PS2 memiliki galat operasi 1 bit, sehingga pada nilai tertentu
1 * Xbisa berbeda dariX - Menurut manual pengembang VU, akurasi
X * 1dijamin, tetapi1 * Xtidak memiliki jaminan yang sama, dan perbedaan ini menjadi sinyal deteksi emulator - Contohnya menggunakan 129.5f, salah satu nilai bermasalah yang ditemukan dengan brute force, untuk memeriksa perbedaan perilaku antara PS2 asli dan emulator
- Implementasinya berupa struktur sederhana: di mode makro VU0, kalikan
129.5fdengan1, lalu cukup bandingkan apakah input asli berbeda dari hasilnya - PCSX2, Play!, DobieStation, dan hps2x64 saat ini tidak mengemulasikan perilaku ini, dan tingkat kesulitan deteksinya dinilai 1/5
Galat 1 bit yang muncul pada perkalian VU PS2
- Metode ini adalah entri kedua dalam seri deteksi emulator PS2, dan bisa digunakan di mode mikro VU1, mode mikro VU0, serta mode makro VU0
- Contoh ini memakai mode makro VU0 untuk menyederhanakan implementasi
- VU0 digunakan seperti koprosesor sehingga bisa dijalankan langsung dari CPU EE
- Tidak perlu menangani program VU terpisah
- Manual pengembang VU memberi catatan bahwa instruksi perkalian seperti
MUL,MULimemiliki galat operasi 1 bit1 * Xbisa berbeda dari nilai aslinya,X- Jika
VF[fs]digunakan sebagai operand yang dikalikan, akurasi hasil dalam bentukX * 1dijamin
- Alasan pasti mengapa bit ini hilang belum dapat dipastikan
Nilai deteksi dan cara implementasi
- Untuk mendeteksi galat ini, dibutuhkan angka yang memicu masalah, dan cara termudah mencarinya adalah dengan brute force
- Penulis sebelumnya telah membuat daftar 250 angka pertama yang memicu masalah pada interval 0.5, dan mempublikasikan daftar tersebut di gist
- Kode contoh menggunakan 129.5f sebagai angka target deteksi
- Set
129.5fkeVF1denganQMTC2 - Buat nilai
1diVF2denganVADDw - Hitung
VF1 = 1 * 129.5fdenganVMUL - Ambil hasilnya kembali ke sisi EE dengan
QMFC2lalu bandingkan dengan input
- Set
- Nilai kembalian adalah
in[0] != out[0]; jika nilai asli dan hasil perkalian berbeda, maka dianggap ada galat perkalian VU
Dampak pada masing-masing emulator
- Saat ini PCSX2, Play!, DobieStation, dan hps2x64 tidak mengemulasikan perilaku perkalian VU PS2 ini
- Karena hanya perlu mengalikan satu angka dengan
1lalu memeriksa hasilnya, tingkat kesulitan metode deteksi ini berada di level 1/5
1 komentar
Komentar Hacker News
ARM sungguhan, karena pipeline, membaca PC+8 saat mengeksekusi dari PC dan mendekode PC+4, jadi instruksi yang baru disimpan seharusnya tidak berpengaruh. Emulator yang tidak mengemulasikan pipeline hardware akan menjalankan instruksi itu
Artikel yang menjelaskan lebih detail bersama berbagai teknik pengganggu emulasi dari 2004: https://mgba.io//2014/12/28/classic-nes/
Mungkin selama beberapa siklus nilai register tidak terdefinisi. Menulis kode assembly yang dioptimalkan ketat untuk chip seperti ini terasa seperti memainkan klon Zachtronics dengan selera yang luar biasa buruk, jadi cukup mengerikan
Jauh kemudian, seseorang menemukan kasus batas lain yang tidak terdeteksi: instruksi string berulang yang menimpa dirinya sendiri
https://silviocesare.wordpress.com/2009/02/02/anti-debugging...
x86 punya mekanisme seperti itu, meski saya tidak yakin apakah akhirnya dihapus pada varian 64-bit
Anda tidak hanya harus mengetahui semua perilaku ganjil dari hardware dan software asli, tetapi juga harus mereproduksinya apa adanya, seaneh apa pun. Itu sendiri sudah sulit, dan masih harus mempertimbangkan dampak performanya
Menggunakan JIT recompiler tidak bisa sepenuhnya akurat per siklus seperti hardware asli, tetapi umumnya tidak menjadi masalah kecuali kode game sengaja dibuat untuk merusak emulator
Dolphin juga harus menangani keseimbangan ini ketika beberapa game Wii komersial memasukkan kode anti-emulator yang mengeksploitasi detail perilaku cache CPU Wii asli. Secara teori, cache CPU asli bisa diemulasikan agar game berjalan mulus, tetapi overhead performanya mungkin sekitar 10 kali lebih lambat sehingga tidak dapat dimainkan, maka dipilih patch untuk mengakalinya
https://dolphin-emu.org/blog/2017/02/01/dolphin-progress-rep...
Rasanya kita harus memahami elektronika sekaligus sihir pemrograman tingkat dalam
Saat memulai, dan bahkan sebagian besar saat menyelesaikannya, Anda tidak perlu memahami sihir tingkat dalam. Pada umumnya cukup melihat spesifikasi dan mengimplementasikannya sesuai isi spesifikasi. Anda memang perlu mampu menyusun struktur kode agar tidak berantakan, tetapi ada pola-pola umum, dan setelah membuat satu atau dua emulator semuanya menjadi jauh lebih mudah
Hampir tidak pernah perlu memahami elektronika. Yang diemulasikan hanyalah perilakunya. Jika bug pada perilaku hardware asli ditemukan, biasanya cukup menambahkan penanganan khusus ke emulator. Pengetahuan elektronika bisa membantu memahami mengapa perilaku seperti itu muncul, tetapi itu lebih merupakan minat historis daripada kebutuhan praktis
Ada kesulitan khasnya sendiri. Saat terjadi masalah, biasanya Anda men-debug tiga hal sekaligus: pemahaman tentang hardware, implementasi emulator, dan game yang sedang diemulasikan. Menyempitkan penyebab pastinya bisa sulit. Meski begitu, saya sarankan untuk sekadar mencoba membuat versi kasar. Memang tidak rapi, tetapi semua emulator penuh dengan penanganan khusus agar game populer entah bagaimana bisa berjalan. Jika beberapa hack kotor membuat game berjalan, lakukan saja. Anda tidak harus mengimplementasikan perilaku hardware asli secara tepat; cukup buat gamenya berjalan
CPU 8-bit adalah mesin keadaan sederhana yang hanya punya beberapa byte state, yaitu register. Anda membaca program byte demi byte, lalu menirukan apa yang dilakukan CPU setelah membaca byte itu. Operasinya sangat sederhana, seperti menjumlahkan dan mengurangkan angka, atau membaca dan menyimpan byte
http://www.6502.org/users/obelisk/6502/registers.html
http://www.6502.org/users/obelisk/6502/instructions.html
Emulator CPU 6502 membaca beberapa byte berikutnya dari program, menafsirkan byte-byte itu sebagai instruksi, lalu menjalankan instruksi tersebut. Dalam prosesnya, ia memperbarui beberapa register atau counter CPU, melakukan operasi aritmetika atau bitwise, dan jika perlu membaca atau menyimpan 1 byte data dari satu lokasi ke lokasi lain. Proses ini diulang dalam loop tak terbatas
Ini adalah simulasi dari siklus fetch-decode-execute
https://en.wikipedia.org/wiki/Instruction_cycle
Dulu saya pernah mem-porting interpreter 6502 dari UNIX ke Classic Macintosh untuk memutar file musik SID. Karena yang penting hanya berjalan cukup cepat, akurasi siklus clock tidak terlalu penting
Cara kerjanya adalah memanggil kode C dari interpreter
Saya masih ingin mencobanya, tetapi tidak punya waktu
Selain itu, komentar saudara dari @xcv123 benar-benar tepat
Jika suatu hari nanti memungkinkan untuk mereplikasi PS2 dengan FPGA, mencari tahu bagaimana perilaku ini terjadi akan menjadi proyek yang menarik bagi seseorang
Tidak ada jaminan bahwa versi FPGA dari PS2 tidak akan mengimplementasikan bug yang sama atau mirip
Floating-point perangkat lunak memang akan lambat, tetapi solusi umumnya mungkin akan mengikuti emulator PS2 di PS4. Caranya adalah menetapkan whitelist, per game, untuk bagian-bagian kode yang diizinkan memakai jalur floating-point perangkat lunak
Butuh waktu terlalu lama bagi saya untuk menyadari bahwa ini membahas PlayStation 2, bukan port Personal System/2 untuk menghubungkan mouse dan keyboard
Akronim tiga huruf bisa membuat konteks sangat sulit ditemukan. Kalau hanya memasukkan akronim ke Google, cukup sering hasilnya sebagian besar nyaris tidak relevan