Amiga에서 실수로 $ DFC5A0에 쓰면 어떻게 되나요?

Aug 18 2020

나는 오디오 데이터에 쓰려고은 (범위 사용하는 게임 (TV 스포츠 농구) 고정 해요 $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그것에 somethig를 쓰면 실제로 $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(의 저주 커스텀 칩베이스 주소 및 (ra의 예를 저주에 대한) 일부 게임은 다른 사용자 정의 기본 주소를 사용 Ra는 $DFE000)를 사용 하여 해커를 혼동하거나 독창적 인 용도 로 사용할 수 있습니다.

내가하는 32 비트 값 연락 해주기 경우 $DFC5A0(실제 예), 주소 사용자 정의 레지스터로 변환 $1A0하고 $1A216, 17 (컬러 레지스터있는 $5A0에 마스크 $1A0, 어떤 더 높은 비트가 무시되고 단지 $ (100) 16 비트 사용자 등록이되어가 ), 따라서이 경우 오디오 레지스터가 작성되지 않고 대신 색상 레지스터가 작성되므로 사운드 루틴에 실제로 버그가 있습니다.

이제 영상 효과가없는 이유는 무엇입니까? 컬러 레지스터에 쓰는 것은 일반적으로 효과가 없기 때문에 대부분의 구리 목록은 PAL에서 매 20ms마다 빔의 각 시작에서이를 덮어 씁니다. 배경색 (배경이 잠시 깜박임)에서는 눈에 띄지 만 전경색에서는 거의 보이지 않거나 보이지 않습니다.

이제이 경우 (원래 게임과 같은) 작업을 수행하지 않거나 값을 마스크하여 유효한 오디오 채널을 선택하고 사운드가 변경되는지 확인하고 게임.