2012-07-17 3 views
0

Z80 호환 프로젝트를 설계 중입니다. 나는 플래그 레지스터를 디자인 할 것이다.Z80 플래그 - 생성 방법은 무엇입니까?

원래 나는 플래그가 ALU 연산의 입력 및 유형에 따라 ALU에서 직접 생성되었다고 생각했습니다.

그러나 지침과 플래그 결과를 살펴본 후에는 플래그가 항상이 논리와 일치하지 않는 것으로 보입니다.

그 결과 나는 매번 정확한 플래그를 생성하기 위해 ALU에 연산 코드를 공급해야한다고 가정합니다. 그러나 이것은 디자인을 지나치게 복잡하게 만드는 것처럼 보일 것입니다. 그리고이 거대한 디자인 단계를 시작하기 전에 인터넷으로 확인하고 싶었습니다.

맞습니까? 아니면 정말 혼란스럽고, 원래 생각했던 것처럼 간단합니다.

+0

이것은 명확하지 않습니다. Z80 * 에뮬레이터 *를 쓰고 있습니까? 일들이 일관성이없는 곳의 예를 들려 줄 수 있습니까? –

답변

3

물론 작업 유형이 중요합니다. 더하기와 빼기를 할 때 오버플로를 고려하십시오. 말, 추가 또는 감산하는 8 비트 바이트 :

1 + 5 = 6 - 오버플

255 + 7 = 6 - 오버플

1-5 = 252 - 오버플

200-100 = 100 - 오버플

200 + 100 = 44 - 오버플

100-56 = 44 - 오버플

여기서 carry 플래그의 상태는 입력 바이트 또는 결과 바이트 값뿐만 아니라 작업에도 영향을 미칩니다. 그리고 부호없는 오버플로를 나타냅니다.

로직이 매우 일관됩니다. 그것이 아니라면 공식 논리를 배우기 위해 문서를 읽을 시간입니다.

this question에 관심이있을 수 있습니다.

0

귀하의 코드는 CP/M 운영 체제 용으로 작성되었습니다. I/O는 BDOS (기본 디스크 운영 체제) 인터페이스를 통해 수행됩니다. 기본적으로 C 레지스터에 연산 코드를로드하고 다른 레지스터에 추가 매개 변수를로드하고 0x5 위치에 호출합니다. 기능 코드 C = 2는 E 레지스터의 문자를 콘솔 (= 화면)에 씁니다. 당신은 라인 1200 액션에서 볼 수 있습니다

ld e,a 
    ld c,2 
    call bdos 
    pop hl 
    pop de 
    pop bc 
    pop af 
    ret 
bdos push af 
    push bc 
    push de 
    push hl 
    call 5 
    pop hl 
    pop de 
    pop bc 
    pop af 
    ret 

here을 시도 호출 BDOS에 대한 참조하십시오. 이것을 에뮬레이션하려면 5 번 주소로 걸려 오는 전화를 걸러 내고 사용 가능한 모든 기능을 사용하여 구현해야합니다.