Amigaで、誤って$ DFC5A0に書き込むとどうなりますか?

Aug 18 2020

オーディオデータを書き込もうとするゲーム(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

場合はD03よりも大きい場合、その後の書き込みは、(A0,D0.W)範囲外の方法です。私の場合$DFC5A0、シフト後D0$D500。なので、に書き込みます。また、メモリ拡張のメモリ位置にも依存します(チップメモリ​​のみを使用してもバグは発生しません)。

AmigaアドレッシングシステムにはカスタムレジスタとCIAのマスクがあり、実際には正しいアドレスに書き込まれる可能性があることは知っていますが($D50チャネルインデックスのベース値としては疑わしいです...)、インデックスが範囲外の場合に書き込みを削除すると、サウンドが機能しない可能性がありますが、その偽のアドレスでは機能します。

たとえば、何かを書き込んだ場合、$DFC09A実際には$DFF09A(INTENA、読み取り専用の対応物があるこの特定のレジスタで確認しやすい)に$DFC59A影響しますが、書き込んだ場合、INTENAには影響しません。

その偽のアドレスはメモリレイアウトに違反するため、そのままにしておきたくありません。このアドレスをマスクして$DFF0A0 - $DFF0D0範囲に戻る式はありますか?

回答

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

注:私はさらに調査と実験を行った後、自分の質問に答えています。

$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ミリ秒ごとにそれらを上書きします。背景色(背景が一時的に点滅する)では目立ちますが、前景色ではほとんど見えないか、見えないことさえあります。

そのため、(元のゲームのように)その場合にアクションを実行しないか、値をマスクして有効なオーディオチャネルを選択し、それがサウンドを変更するかどうかを確認し、長期的なバグを修正するかどうかを決定する必要があります。ゲーム。