2013-05-30 3 views
4

저는 6502 에뮬레이터를 만들고 있습니다. (ADC 작업을 구현할 때) 이미 처음부터 붙어 있습니다. 문제는 carry 나 overflow가 있는지를 결정해야한다는 것입니다. 문제는 제 구현에서 그 차이를 실제로 파악할 수 없다는 것입니다. 저는 연산이 끝난 후 9 번째 비트가있을 때 캐리 (carry)가 있다는 것을 알고 있습니다. 결과가 255보다 클 경우 오버플로가 발생한다는 것을 알고 있습니다. 이것은 캐리와 오버플로 플래그를 같은 것으로 결정하지 않습니까?Java에서 6502 에뮬레이션의 캐리 및 오버플로 플래그 결정?

if(result > 255) { 
    carry = 1; 
    overflow = 1; 
} else { 
    carry = 0; 
    overflow = 0; 
} 

이것이 맞습니까? 그리고 그렇지 않은 경우, 정확하고 왜 무엇입니까?

+0

http://www.righto.com/2012/12/the-6502-overflow-flag-explained.html – arcy

+0

고마워요. 나는 그 순간을 자세히 읽을 시간이 없어서 그 일을 미뤘다. 그리고 이것은 내가 이해 한 것이다. 기본적으로 나는 캐리에 대해 정확했다.결과가 255 이상이면 캐리가 있습니다. 추가가 있고 숫자가 음수이거나 빼기가 있고 숫자가 양수이면 오버플로 (8 비트 부호있는 바이트를 사용할 때)가 있습니다. 그게 맞습니까? 아니면 놓친 것이 있습니까? 어쨌든, 고마워, 내일 더 자세히 살펴볼거야. – ZimZim

+4

IMO, 자세한 내용을 읽을 시간이 없다면 에뮬레이터를 프로그래밍 할 시간이 없습니다. 에뮬레이터는 모두 세부 사항에 관한 것이므로 지루하고 시간이 오래 걸리고 큰 지름길은 없습니다. – arcy

답변

10

넘침 플래그는 숫자의 부호가 잘못 변경된 경우를 나타냅니다. 따라서 두 개의 양수를 추가하고 음수 결과를 얻으면 오버플로가 발생합니다. 두 개의 음수를 추가하고 긍정적 인 결과를 얻으면 오버플로가 발생합니다.

범위가 허용되지 않기 때문에 두 개의 다른 기호를 추가 할 때 오버플로를 얻을 수 없습니다. 가장 작은 양수와 가장 큰 음수는 0 + (-128)이며, 0에 더해서 8 비트에 맞는 것은 8 비트에 맞을 것입니다. 가장 작은 양수와 가장 큰 양수는 -1 + 127 = 126입니다. 어느 것이 적합합니다.

(EDIT : 심지어 캐리와, -128 + 0 + 적합하고, -127 = 1, -1 맞는 + 127 = 127 + 1)

그래서 오버플로 설정되는 경우와 두 개의 입력 같은 부호는 결과가 다른 부호로 나타납니다. 그렇지 않으면 그것은 분명합니다.

부호 비트에 대한 간단한 비트 연산으로 표현할 수 있습니다. + b = c가 있다고 가정하십시오.

a^b 

부호가 다른 경우 부호 비트가 1이됩니다. 당신은 그 반대를 알고 싶습니다. 따라서 :

~(a^b) 

부호가 동일하면 부호 비트에 1을 제공합니다. 그것이 테스트의 첫 번째 부분입니다. a와 b가 같은 부호를 가졌다 고 가정하면, 둘 중 하나에 대해서 c를 테스트 할 수 있습니다. 이 시간은 당신이 차이를 테스트 할 않기 때문에 그건 그냥 : 당신이 브래킷을 많이두고 (바이너리 가진 사람을 결합 할 수 있도록, 테스트 비트가 테스트의 두 부분에서 설정해야

a^c 

언어 적 추론에 링크)에에서 :

(~(a^b))&(a^c) 
에서만 부호 비트를 원하는, 그래서 오프 마스크

: 오버 플로우 플래그가 CL해야하는 경우

(~(a^b))&(a^c)&0x80 

는 그 0x00로 평가합니다 귀를 설정해야한다면 0x80입니다. 그러니 그냥 그 자리로 이동하십시오.

(단, 명령 세트 플래그가 6502 개이고 상태 레지스터가 하나만 표시되기 때문에 에뮬레이터는 플래그를 원하는 형식으로 별도로 유지하고 필요에 따라 상태 레지스터를 구성하기도합니다. 이동 및 작성을 귀찮게하는 경우 해당 결과를 저장하면됩니다.)

+0

위대한 답변 Tommy. – alex