2016-12-21 9 views
3

대부분의 에뮬레이터는 특정 명령어가 룩업 테이블에서 차지하는 사이클 수를 저장 한 다음 필요에 따라 조건부 사이클을 추가합니다 (예 : 페이지 경계를 넘는 경우).특정 명령에서 6502에 걸리는 사이클 수를 절차 적으로 결정할 수 있습니까?

어드레싱 모드와 메모리 읽기/쓰기에만 기반하여 명령어가 취할 사이클 수를 절차 적으로 결정할 수있는 방법이 있는지 궁금합니다.

예를 들어, 즉시 또는 상대 주소 지정을 사용하는 모든 명령어는 2 사이클이 걸린다는 것을 알았습니다.

모든 제로 페이지 명령어는 3 사이클을 소비하며, 내부 메모리를 변경하면 추가로 2 사이클이 소요됩니다.

인덱싱 된 모든 제로 페이지 명령은 4 사이클을 수행하고 메모리를 내부에서 변경하는 경우 추가로 2 사이클을 소요합니다.

... 등등.

따라서 위와 같은 명령어의 사이클 수를 결정하기위한 절차가 문서화되어 있습니다. 그러한 공식에서 결정론을 깨뜨릴 수있는 예외가 있습니까?

+0

수동으로 보낸 이전 Atari 8 비트 시리즈 주변 장치에 대한 정확한 타이밍을 얻으려면 항상 [6502 명령어 세트] (http://www.6502.org/tutorials/6502opcodes.html)와 같은 참조를 사용해야했습니다. 비트 당 52 사이클 또는 19 사이클 (1 mhz 6502)에서 직렬 인터페이스에서 한번에 한 비트 씩 수신됩니다. (~ 19,200 비트/초 또는 ~ 52,600 비트/초). – rcgldr

답변

6

예 - 이것은 거의 모든 정확한 에뮬레이터가 쓰여지는 방식입니다. *; 64doc.txt과 같은 문서를 참조하십시오. 단순 메모리 액세스 카운팅보다 훨씬 복잡하지는 않습니다. 6502는 매주기마다 메모리 액세스를 수행 할 것이고, 액세스 후주기의 나머지 부분에서 의미있는 결과를 얻을 수 있습니다 (즉, 파이프 라인 된 것과 그렇지 않은 것에 대한 토론, 문서 참조).

예. ADC#54의 경우 프로세서는 (i) opcode를 읽어야합니다. (ii) 피연산자를 읽는다. 그것은 두 사이클입니다. ADC ($32), Y를 들어

의 그 :

  1. 읽기 연산 코드는
  2. 읽기 피연산자는
  3. 주소의 상위 바이트를 얻을 수 $ (33)로부터 읽어 주소
  4. 의 하위 바이트를 얻을 $ (32)로부터 읽어
  5. , 낮은 Y를 추가 (주소의 상위 바이트) : (주소의 하위 바이트 + Y), 하위 바이트 계산을 수행 할 시간이 있기 때문에
  6. 아, 잠깐, 마지막 결과가 나왔다면 다시 읽는 것이 좋을 것입니다. 그렇지 않다면, 위대하고, 모든 것이 잘되고,이 주기로 귀찮게하지 마십시오.

그래서 5 또는 6 사이클입니다.

언제든지 단계별로 메모리 액세스를 에뮬레이트 할 수 있으며 실제 작업을 직교 단계로 수행 할 수 있습니다. 읽기, 쓰기 또는 읽기 - 수정 - 쓰기에 동일한 로직을 사용하는 것도 쉽습니다. 읽기와 쓰기는 동일한 타이밍을 가지지 만 마지막에는 다른 메모리 액세스를 수행하고, 모든 수정 - 쓰기는 모든 사이클에 대해 읽기 값을 다시 씁니다. 실제 결과를 작성하는 동안 실제 결과를 작성하십시오.

*) 모든 메모리 액세스를 동시에 수행하기 때문에 중복되는 것을 포함하지 않으므로 워핑 시간이 약간 길어 지므로 실제 하드웨어와 전혀 다릅니다.또한 메모리 액세스가 독립적 인 시간 개념 (인터럽트를 생성 할 수있는 타이머 또는 기타 사항)이 있거나 RAM이 비디오 출력을 위해 RAM을 검색하는 경우 RAM 자체만으로는 아무 것도 할 수 없습니다. CLISEI **과 같은 지침 주위에 특수 사례를 추가해야한다는 점을 기억하십시오. 에뮬레이터는 더 이상 1990 년대와 같이 구조화 될 필요가 없습니다.

**) 모든 작업의 ​​마지막 두 번째 사이클에서 IRQ 상태가 샘플링됩니다. CLISEI은 최종 사이클 동안 비트를 조정합니다. 따라서 인터럽트가 보류 중이더라도 CLI은 명령어 뒤에 CLI까지 인터럽트가 발생하지 않습니다. 그 자체가 SEI 일 수 있습니다. 인터럽트가 보류 중일 때 CLI/SEI 쌍이므로 인터럽트 플래그가 설정된 SEI이 실행 된 후 인터럽트 처리기로 이동해야합니다. 6502의주기 별 동작을 에뮬레이션하는 경우 자연스럽게 발생하며, 작업 별 및 시간 왜곡 작업을 수행하는 경우 거대한 해킹이 될 수 있습니다. 또는 훨씬 더 많은 가능성이있는 그러한 에뮬레이터는 동작을 잘못 이해합니다.

+1

여분의 것을 포함하여 메모리에서 모든 읽기/쓰기를 관찰하는 훌륭한 리소스는 http://www.visual6502.org/JSSim/index.html –

+1

입니다. 그건 그렇고, 그건 STI가 아니라 SEI입니다. –

+0

@ 8-BitGuru가 당신이 전문가 인 이유입니다! SEt 인터럽트가 아닌 SEt 인터럽트; 결정된. – Tommy