2017-01-02 19 views
0

안녕하세요 저는 Game Boy의 에뮬레이터를 작성하고 있습니다.SUB 명령 gameboy 에뮬레이션을 위해 두 가지 보완을 사용할 수 있습니까?

그리고 a = 0x90 주어진

SUB a, 0x92 

intruction SUB와 사투를 벌인거야.

내가 뭐하는 거지 것은 :

0x90 + (-0x92) 

나는 빼기 위해 2 보수 방법을 사용합니다.

-0x92 <=> 
2_complement(0x92) <=> 
2_complement(10010010) <=> 
01101101 + 1 <=> 
01101110 

그래서 빼기는 다음과 같은 추가하는 것과 같습니다

과정에서
1001 0000 (0x90) 
+0110 1110 (-0x92) 
--------- 
1111 1110 (0xFE) 

, 거기에는 캐리는하지 않고 반은 내가 플래그를 설정하지 수행하지 않습니다. 그리고 다른 에뮬레이터 (예 : BGB과 같은 것입니다.) 결과가 정확하고 플래그가 정확하지 않음을 유의하십시오.

그래서 실제 프로세서는 자유로운 방법이 없기 때문에 2 보수법을 사용하지 않는다고 가정합니다. 아직도.

을 캐리 반 캐리를 검색하는 I 플래그 처리와 SUB 명령을 모방하는 두 개의 보완을 사용하거나, 나는 "고전적인"빼기 논리에 의존해야합니까?

답변

1

리얼 CPU는 정말로 뺄셈을하는 동안 인수의 반전에 의존하고 있습니다.

먼저 2의 보수는 그 자체로 다른 추가 사항입니다 (모든 비트를 반전 한 후 1을 더함). 정확히 그렇게하면 느려질 것입니다.

그냥 거꾸로 인수를 추가 보자 :

0x90 + (~ 0x92) = 0x90 + 0x6D =에서부터 0xFD하고 더 캐리를 얻을 수 없습니다. 정확한 결과에서 1 씩 끕니다.

결과를 수정하려면 다른 값을 더해야합니다. 이는 carry = 1을 가산기에 전달하면 편리합니다. 따라서, 당신은 논쟁을 끝낸 것처럼 들어오는 캐리를 반전해야합니다. 놀랍지 만 결과 캐리도 거꾸로됩니다.

예 : 0x34 : 0x34 + (~ 0x12) +1 (반전 입력 캐리) = 0x34 + 0xED + 1 = 0x122 : 수행하지 않음 (반전 출력 캐리 가져 오기) 및 올바른 결과. 수신 캐리는 1 : 0x34 + 0xED + 0 = 0x121 (캐리 아웃 없음, 결과는 1 미만).

그러나 들어오는 결과 캐리를 반전하지 않는 CPU가 있습니다. 6502 (반전 캐리 입력 및 출력 SBC 명령) 및 32 비트 ARM이 있습니다. 그들은 단지 논쟁을 역전시킵니다.

+1

아마도이 답변의 핵심 부분은 다음과 같습니다. * 결과 캐리도 반전됩니다 *.따라서 원래의 저자는 덧셈 형식이 캐리 (carry)도 반감도 (half-carry)도 생성하지 않는다고 옳습니다. 하지만 그는 그 결과를 뒤집어서 ** 캐리와 반 캐리 플래그를 설정해야합니다. 그것은 공정한 말입니까? – Tommy