Di Amiga, apa yang terjadi jika saya salah menulis ke $ DFC5A0?
Saya sedang memperbaiki permainan (TV Olahraga Bola Basket) yang mencoba untuk menulis dalam data audio (menggunakan rentang $DFF0A0
untuk $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 D0
lebih besar dari 3, maka penulisan ke (A0,D0.W)
luar batas. Dalam kasus saya itu menulis untuk $DFC5A0
, karena setelah pergeseran D0
adalah $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 $D50
sebagai 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 $DFC09A
itu sebenarnya berpengaruh pada $DFF09A
(INTENA, lebih mudah untuk memeriksa dengan register khusus ini yang memiliki mitra hanya-baca) tetapi jika saya menulisnya $DFC59A
tidak 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 - $DFF0D0
kisaran?
Jawaban
catatan: Saya menjawab pertanyaan saya sendiri setelah lebih banyak penelitian dan eksperimen.
The $DFF000
dasar 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-DFFFFF
jadi basis apa pun seperti $DFx000
karya.
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 $12345678
di $DFC0A0
misalnya, $12345678
akan muncul dalam $DFF0A0
ketika membaca register kustom (menggunakan emulator): $DFC000
sebagus $DFF000
sebagai 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 $1A0
dan $1A2
yang merupakan register warna 16 dan 17 ( $5A0
disamarkan $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.