2014-01-16 10 views
0

Motorola 68000 용 바이너리 opcode를 포맷하려고했으나 대상 메모리 주소, 명령어 지정 및 주소 지정 모드/크기를 모두 인코딩 할 수 없음을 계속 확인했습니다. 및 메모리 맵핑 된 I/O를 위해 어드레스 버스에 복사 될 데이터 값.기계 명령어에 32 비트 이진 opcode를 인코딩 할 수 없습니다.

Sega Genesis의 비디오 디스플레이 프로세서의 경우, 제네시스 메모리 맵의 C00004에 매핑 된 메모리 인 제어 포트에 쓰려고합니다.

C0004는 2 진수 또는 3 바이트의 1100 0000 0000 0000 0000 0100입니다. 내가 쓰고있는 값은 VDP가 VDP 레지스터 # 7에서 8787로 인식하는 87입니다. 32 비트의 데이터를 인코딩하는 방법을 알아내는 것이 문제입니다. 명령어 접두어 지정 move.b, 값 87 (#$87) 및 대상 메모리 주소 C00004 (MMIO가 VDP로가는 도중에 올바른 VDP 포트로 재 라우팅 됨).

전부는 다음과 같다 : 느슨하게 하지 네로 변환

move.b #$87, $00C00004, 

하지만 4 바이트 및 니블 (36 비트를 정확하게는)

0001 1000 0111 1100 0000 0000 0000 0000 0100 

모토로라 68000은 microcode으로 작업 할 때만 32 비트를 구문 분석하기 때문에 공간이 충분하지 않은 경우 (그리고 동일한 도구 내에서) 필요한 정보를 인코딩하는 것이 어떻게 가능합니까?)?

Perhaps I'm understanding this incorrectly?

나는이 대부분의 프로그래머가 예상 할 수준을 넘어 알고,하지만 난 나를 위해이 고장이 인코딩 체계가 어떻게 작동하는지 설명 할 수있는 주변 사람을 희망하고있다.

답변

0

귀하의 명령, move.b #$87, $$00C00004

0001111001111100 0000000010000111 00000000110000000000000000000100 

로 인코딩한다고 (또는 이와 유사한 것, 나는 피연산자의 순서에 대한 확실하지 않다).

처음 16 비트 워드는

thusly 히 세분화 될 수

  • 제 4 비트는 이것이 move.b 명령임을 말한다.
  • 다음 6 비트는 목적지 주소 지정 모드가 절대 32 비트 주소라고 말합니다.
  • 마지막 6 비트는 소스 피연산자가 즉각적인 것이라고 말합니다.

다음은 피연산자로 명령어 확장 단어를 따른 것입니다. 첫 번째는 직접 데이터의 경우 16 비트이고 마지막 32 비트는 주소의 경우입니다. (다른 방향 일 수 있습니다.)

자세한 내용은 http://www.freescale.com/files/archives/doc/ref_manual/M68000PRM.pdf

을 참조하십시오.