Di Amiga, apa yang terjadi jika saya salah menulis ke $ DFC5A0?

Aug 18 2020

Saya sedang memperbaiki permainan (TV Olahraga Bola Basket) yang mencoba untuk menulis dalam data audio (menggunakan rentang $DFF0A0untuk $DFF0D0) tetapi untuk beberapa alasan (pemrograman yang buruk), indeks terkadang (tidak selalu) palsu

MOVEA.L #$00DFF0A0,A0 ;004e78: 207c00dff0a0 load custom address in A0 MOVE.W $0008(A5),D0         ;004e80: 302d0008      audio channel 0-3
LSL.W   #4,D0                ;004e84: e948          shifting (mul by 16)
MOVE.L  -$346E(A4),(A0,D0.W) ;004e86: 21accb920000  write to register

jika D0lebih besar dari 3, maka penulisan ke (A0,D0.W)luar batas. Dalam kasus saya itu menulis untuk $DFC5A0, karena setelah pergeseran D0adalah $D500. Itu juga tergantung pada lokasi memori ekspansi memori (hanya menggunakan memori chip tidak memicu bug).

Saya tahu bahwa sistem pengalamatan Amiga memiliki topeng untuk register khusus dan CIA, dan mungkin itu benar-benar akan menulis ke alamat yang benar (saya ragu dengan itu $D50sebagai nilai dasar untuk indeks saluran ...), tetapi jika saya memperbaiki masalah dengan menghapus tulis ketika indeks berada di luar jangkauan, mungkin suaranya tidak akan berfungsi, sedangkan berfungsi dengan alamat palsu itu.

Misalnya, jika saya menulis sesuatu untuk $DFC09Aitu sebenarnya berpengaruh pada $DFF09A(INTENA, lebih mudah untuk memeriksa dengan register khusus ini yang memiliki mitra hanya-baca) tetapi jika saya menulisnya $DFC59Atidak berpengaruh pada INTENA.

Saya tidak ingin membiarkan alamat palsu itu apa adanya, karena itu melanggar tata letak memori. Apakah ada rumus untuk menutupi alamat ini dan kembali ke $DFF0A0 - $DFF0D0kisaran?

Jawaban

9 Jean-FrançoisFabre Aug 19 2020 at 04:36

catatan: Saya menjawab pertanyaan saya sendiri setelah lebih banyak penelitian dan eksperimen.

The $DFF000dasar adalah chip kustom alamat register dasar direkomendasikan oleh Commodore .

Tetapi banyak alamat dasar lainnya berfungsi. Beberapa baris alamat memilih basis chip khusus, dan beberapa diabaikan.

Area alamat chip khusus DF0000-DFFFFFjadi basis apa pun seperti $DFx000karya.

Ini dikonfirmasi dengan melakukan beberapa tes pada emulator WinUAE, yang sangat setia pada aspek-aspek tersebut, dan yang memiliki kemampuan menarik untuk dapat membaca apa yang tertulis di register menggunakan debugger internalnya.

Jadi jika saya menulis $12345678di $DFC0A0misalnya, $12345678akan muncul dalam $DFF0A0ketika membaca register kustom (menggunakan emulator): $DFC000sebagus $DFF000sebagai alamat dasar chip yang kustom, dan beberapa permainan (misalnya Curse of Ra) menggunakan alamat dasar kustom alternatif (Kutukan Ra menggunakan $DFE000), mungkin untuk membingungkan peretas, atau hanya untuk menjadi orisinal.

Sekarang ketika saya menulis nilai 32-bit ke $DFC5A0(contoh kehidupan nyata), alamat diterjemahkan menjadi register khusus $1A0dan $1A2yang merupakan register warna 16 dan 17 ( $5A0disamarkan $1A0, hanya ada register khusus $ 100 16 bit, bit yang lebih tinggi diabaikan ), jadi dalam kasus ini, register audio tidak ditulis, register warna yang ditulis, jadi benar-benar ada bug dalam rutinitas suara.

Sekarang mengapa tidak memiliki efek visual? Karena menulis ke register warna biasanya tidak berpengaruh: sebagian besar daftar tembaga menimpa setiap awal balok, setiap 20 md di PAL. Ini dapat terlihat untuk warna latar belakang (latar belakang akan berkedip sebentar) tetapi untuk warna latar depan hampir tidak terlihat atau bahkan tidak terlihat.

Jadi sekarang saya hanya perlu memutuskan apakah saya tidak melakukan tindakan dalam kasus itu (seperti game aslinya) atau jika saya menutupi nilainya untuk memilih saluran audio yang valid dan melihat apakah itu mengubah suaranya, dan mungkin memperbaiki bug jangka panjang di permainan.