Amigaで、誤って$ DFC5A0に書き込むとどうなりますか?
オーディオデータを書き込もうとするゲーム(TV Sports Basketball)を修正していますが(範囲$DFF0A0
を使用して$DFF0D0
)、何らかの理由(プログラミングが悪い)で、インデックスが(常にではない)偽物である場合があります
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
場合はD0
3よりも大きい場合、その後の書き込みは、(A0,D0.W)
範囲外の方法です。私の場合$DFC5A0
、シフト後D0
は$D500
。なので、に書き込みます。また、メモリ拡張のメモリ位置にも依存します(チップメモリのみを使用してもバグは発生しません)。
AmigaアドレッシングシステムにはカスタムレジスタとCIAのマスクがあり、実際には正しいアドレスに書き込まれる可能性があることは知っていますが($D50
チャネルインデックスのベース値としては疑わしいです...)、インデックスが範囲外の場合に書き込みを削除すると、サウンドが機能しない可能性がありますが、その偽のアドレスでは機能します。
たとえば、何かを書き込んだ場合、$DFC09A
実際には$DFF09A
(INTENA、読み取り専用の対応物があるこの特定のレジスタで確認しやすい)に$DFC59A
影響しますが、書き込んだ場合、INTENAには影響しません。
その偽のアドレスはメモリレイアウトに違反するため、そのままにしておきたくありません。このアドレスをマスクして$DFF0A0 - $DFF0D0
範囲に戻る式はありますか?
回答
注:私はさらに調査と実験を行った後、自分の質問に答えています。
$DFF000
ベースは、カスタムチップレジスタベースアドレスであるコモドールが推奨します。
しかし、他の多くのベースアドレスは機能します。一部のアドレス行はカスタムチップベースを選択し、一部は無視されます。
カスタムチップアドレスエリアはDF0000-DFFFFF
、どんなベースでも$DFx000
機能します。
これは、WinUAEエミュレーターでいくつかのテストを実行することによって確認されます。これは、これらの側面に非常に忠実であり、内部デバッガーを使用してレジスターに書き込まれたものを読み取ることができるという興味深い機能を備えています。
したがって、たとえば書き込み$12345678
を$DFC0A0
行うと、(エミュレータを使用して)カスタムレジスタを読み取るときに$12345678
表示され$DFF0A0
ます。カスタムチップのベースアドレス$DFC000
と同じくらい優れて$DFF000
おり、一部のゲーム(たとえば、Curse of Ra)は代替のカスタムベースアドレス(Curse of Ra)を使用します。 Raは$DFE000
)を使用します。ハッカーを混乱させるため、または単にオリジナルであるためです。
今、私は32ビットの値の書き込み時に$DFC5A0
(現実の一例)を、アドレスがカスタム・レジスタに変換$1A0
し、$1A2
色レジスタ16と17である(が$5A0
にマスクされ$1A0
、たったの$ 100の16ビットのカスタム・レジスタがあり、任意の上位ビットは無視されます)、その場合、オーディオレジスタは書き込まれず、代わりにカラーレジスタが書き込まれるため、サウンドルーチンに実際にバグがあります。
さて、なぜそれはビジュアルの効果を持たないのですか?カラーレジスタへの書き込みは通常効果がないため、ほとんどの銅線リストは、ビームの開始ごとに、PALでは20ミリ秒ごとにそれらを上書きします。背景色(背景が一時的に点滅する)では目立ちますが、前景色ではほとんど見えないか、見えないことさえあります。
そのため、(元のゲームのように)その場合にアクションを実行しないか、値をマスクして有効なオーディオチャネルを選択し、それがサウンドを変更するかどうかを確認し、長期的なバグを修正するかどうかを決定する必要があります。ゲーム。