2016-06-04 12 views
2

나는 6502 시스템에 대해 다음 코드를 사용하여 몇 가지 문제가 있습니다 :6502 간접 주소 문제

C000 LDA #$00 
C002 STA $FE 
C004 LDA #$20 
C006 STA $FF 
C008 LDY #$08 
C00A LDX #$00 
C00C DEY 
C00D CPY #$FF 
C00F BEQ $C01B 
C011 LDA ($FE),Y 
C013 CMP #$2F 
C015 BPL $C00C 
C017 INX 
C018 JMP $C00C 
C01B BRK 

운동은 2, 1, 4는 주소 2000로 시작하는 번호를 저장하고 무슨 말을하는 것입니다 A, X와 Y의 값

내 펜과 종이와 코드 그러나 나는 다음과 같은 이유로 C011에 붙어있어이 "실행"하고있어

:
LDA ($FE),Y
이건의 값에서로드에 저장 이 방법으로 계산 된 메모리 주소 :

  1. $FE 값을 선택
  2. Y의 값을 추가 (즉, 제 00 임) (제 1 반복에서 그 7) 지금 07
  3. 에 저장된 값으로 07
  4. 로드 A를 가지고

이 정보가 맞습니까? 내가 놓친 게 있니? 내가 아닌 경우 200020012002에 저장된 값은 어디에서 사용합니까? 미리

감사 ..

답변

2

아니요, 올바르지 않습니다. LDA ($FE),Y의 의미가 누락되어 indirect indexed (색인 된 간접 참조와 반대) 주소 지정 모드를 사용합니다. 간접적 인 것은 괄호 안의 값이 낮은 바이트부터 16 비트 포인터의 주소임을 의미합니다. 그것은 당신이 이전에 설정 한 $ 00와 $ 20, 그래서 $ 2000입니다.

인덱싱은 Y로 끝나고 루프 종료 조건은 Y를 기반으로합니다. A의 값은 마지막으로 읽은 값이므로 그 값도 있습니다.

하지만 Weather Vane의 답변에 관한 귀하의 의견은 &입니다. 다른 메모리 위치의 값은 CMP #$2F 및 이후 BPLINX으로 인해 중요합니다. CMP는 빼기처럼 동작하며, 비교 된 레지스터가 N 비교 플래그가 설정된 경우 <은 메모리를 비교합니다. see here.

따라서 X의 값은 다른 메모리 값에 따라 달라집니다.

+0

그래, 알아. 사실은 "$ 2000"부터 시작하는 내 배지 번호 (16 진수 값으로 intepreted)의 최하위 바이트를로드하도록 요청되었습니다. 내 번호는 0648214이므로'$ 2000','82 '2002 년''$ 2001',''$''에서''$''(2004 년'$ 2003'에서 '$ 2007'까지의 가치에 대해서는 전혀 몰랐습니다. 나는 가상 머신에 메모리를 여러 번 버렸고, 값은 모두 0이고, 항상 바보 같다고 느낀다. – magicleon

+0

어리 석음이 필요 없다. -) 어셈블리는 매우 매혹적이다. 어쨌든, 가상 머신을 사용하여 초기 메모리 상태를 기록하면 좋겠지 만 어떤 경우에는 메모리가 0으로 미리 설정되어있는 것처럼 들리지만 (실제 머신에서는 반드시 그런 것은 아닙니다) 모든 위치 값> $ 2F가 트리거됩니다 귀하의 코드에있는 INX –

+0

여기에 상황이 있습니다 : [image] (https://s33.postimg.org/ljzrvqk9r/image.png) – magicleon

4

픽업 $ FE 값 (즉, 처음에 00이다) 실제로

, 그것은 $FE로부터 16 비트 값을로드하고, 그 다음에 Y 추가 유효한 주소를 얻기위한 값.

당신은 $FF에서 $FE에서 $00$20 저장 한, 그래서 2000 2001 2002

에 저장된 값을 사용하는 곳 $FE에서로드 16 비트 값은 $2000

될 것입니다

Y의 값은 0, 1 및 2입니다. Y이 0에서 $ FF로 줄 바꿈 될 때까지 루프가 계속됩니다.


6502.txt에을 "간접 포스트 - 인덱스) 10"를 참조하십시오.

+1

괄호 때문에 post-indirect를 기억하기 쉽다 :'lda ($ 00, x)'는'$ 00 + x'의 메모리 주소에서로드되지만'lda ($ 00), y'는 (메모리 0의 주소) + y. 'lda ($ 00, x)'는 역 참조 이전에 X *를 추가하지만,'lda ($ 00), y'는 역 참조 후 Y *를 추가합니다. – NobodyNada

+0

'$ 2007' (첫 번째 반복)의 값이 0이라고 가정하는 것이 안전한가요? – magicleon

2

이 주소 지정 모드는 이라는 색인 후 간접어이며 Y 레지스터에서만 사용됩니다. 유효 주소는 주소 $00FE$00FF의 (리틀 엔디안) 내용으로 구성되고 해당 주소에는 Y이 추가됩니다.

당신은 그 두 페이지 제로 위치에 $2000을 저장

Y7 그래서 유효 주소를 액세스하려는 데이터의 3 바이트를 넘어, $2007입니다 보유하고 있습니다.

LDA $2000,Y 

로 직접 배열을 액세스하지만 간접 방법의 장점은 여러 테이블 중 하나를 선택할 수 있습니다 예를 들어 당신이 사전에 주소를 알 필요가 없다는 것입니다 수 있었다

주 런타임 조건에 따라 인덱싱됩니다.

+0

그럼, 처음에는'$ 2007'의 내용으로 A가로드됩니다. 문제는 '$ 2007'에 아무것도로드하지 않은 것입니다. 콘텐츠 0을 고려하는 것이 안전한가요? 나는 그렇게 생각하지 않는다. – magicleon

+1

더 높은 수준의 언어에서는 "정의되지 않은 행동"이라고 불릴 것이다. '$ 2007' 주소에 내용을 설정하지 않았다면 (코드에서 직접 또는'ROM '에서 미리 정의 된 위치이기 때문에) 내용을 전혀 알 수 없습니다. 전원을 켰을 때 휘발성 RAM의 내용은 규칙적인 패턴으로 설정 될 수 있지만 이는 하드웨어의 단점 일뿐입니다. 위에서 언급 한 것처럼 가상 머신을 사용하고 있다면, 아마'RAM'은 호스트에 의해'0'으로 초기화 될 것입니다. 그러나 당신이 의존해야하는 것은 아닙니다. –