일반적으로이 작업을 수행 할 수는 없지만 어떤 의미에서는 많은 작업을 수행 할 수 있으며 실제로 몇 가지 역사적인 경우가 있었습니다 .
아타리 2600 (또는 아타리 비디오 컴퓨터 시스템), 아타리은 CPU가 가진 의미, 장치를 프레임 버퍼를 제공하기 위해 감당할 수있는 최초의 가정용 비디오 게임 시스템 중 하나 먼저 시대 이후 시스템과는 달리 1978 년에 출시 된 생성 할 항목을 결정하기 위해 모든 스캔 라인에서 코드 실행-이 코드를 실행하는 데 17.08 마이크로 초 (HBlank 간격) 이상 걸리면 스캔 라인이 그리기 전에 그래픽이 올바르게 설정되지 않습니다. 더 나쁜 것은 프로그래머가 Atari가 일반적으로 허용하는 것보다 더 복잡한 내용을 그리기를 원한다면, 명령에 대한 정확한 시간을 측정하고 빔이 그려 질 때 그래픽 레지스터를 전체 스캔 라인에 대해 57.29 마이크로 초의 범위로 변경해야했습니다.
그러나 Atari 2600은 6502 기반의 다른 많은 시스템과 마찬가지로이 시나리오에 필요한 시간 관리를 신중하게 수행 할 수있는 매우 중요한 기능을 가지고 있습니다. CPU, RAM 및 TV 신호는 모두 동일한 마스터를 기반으로 클럭을 모두 소모했습니다. 시계. TV 신호는 3.98 MHz 클럭에서 흘러 나와 TV 신호를 관리하는 정수 "컬러 클럭"으로 시간을 분할했으며 CPU 및 RAM 클럭의주기는 정확히 3 개의 컬러 클럭이므로 CPU의 클럭은 현재 진행 TV 신호에 대한 정확한 시간 측정. (이에 대한 자세한 내용 은 Stella Atari 2600 에뮬레이터 용으로 작성된 Stella Programmer 's Guide를 확인하십시오 ).
또한이 운영 환경은 모든 CPU 명령어가 모든 경우에 정의 된주기의주기를 가짐을 의미했으며 많은 6502 개발자가이 정보를 참조 표에 게시했습니다. 예를 들어, 다음 표CMP
에서 가져온 (메모리와 누산기 비교) 명령에 대한이 항목을 고려 하십시오 .
CMP Compare Memory with Accumulator
A - M N Z C I D V
+ + + - - -
addressing assembler opc bytes cycles
--------------------------------------------
immediate CMP #oper C9 2 2
zeropage CMP oper C5 2 3
zeropage,X CMP oper,X D5 2 4
absolute CMP oper CD 3 4
absolute,X CMP oper,X DD 3 4*
absolute,Y CMP oper,Y D9 3 4*
(indirect,X) CMP (oper,X) C1 2 6
(indirect),Y CMP (oper),Y D1 2 5*
* add 1 to cycles if page boundary is crossed
이 모든 정보를 사용하여 Atari 2600 (및 기타 6502 개발자)은 코드를 실행하는 데 걸리는 시간을 정확히 파악하고 필요한 작업을 수행하고 Atari의 TV 신호 타이밍 요구 사항을 준수하는 루틴을 구성 할 수있었습니다. 또한이 타이밍이 매우 정확하기 때문에 (특히 NOP와 같은 시간 낭비적인 지침에 대해) 그래픽을 그릴 때이를 사용하여 그래픽을 수정할 수도있었습니다.
물론, Atari의 6502는 매우 구체적인 경우이며,이 모든 것은 시스템에 다음이 모두 있기 때문에 가능합니다.
- RAM을 포함한 모든 것을 실행 한 마스터 시계. 최신 시스템은 CPU와 RAM에 대해 독립적 인 클럭을 가지고 있으며, RAM 클럭은 종종 느리고 두 개가 반드시 동기화되지는 않습니다.
- 어떤 종류의 캐싱도 없습니다. 6502는 항상 DRAM에 직접 액세스합니다. 최신 시스템에는 상태를 예측하기 어렵게하는 SRAM 캐시가 있습니다. 캐시가있는 시스템의 동작을 여전히 예측할 수는 있지만 확실히 더 어렵습니다.
- 동시에 실행되는 다른 프로그램이 없습니다. 카트리지의 프로그램이 시스템을 완전히 제어했습니다. 최신 시스템은 비 결정적 스케줄링 알고리즘을 사용하여 여러 프로그램을 한 번에 실행합니다.
- 신호가 제 시간에 시스템을 가로 질러 이동할 수있을 정도로 클럭 속도가 느립니다. 예를 들어 4GHz의 클럭 속도를 가진 최신 시스템 에서는 절반 미터 마더 보드의 길이를 이동하는 데 6.67 클럭 사이클 의 광자가 필요합니다. 보드의 신호가 장치에 도달하는 데에도 두 번 이상의주기가 걸리기 때문에 단 한 번의 주기로
- 잘 변하지 않는 잘 정의 된 클럭 속도 (아타리의 경우 1.19MHz)-최신 시스템의 CPU 속도는 항상 변경되는 반면, 아타리는 TV 신호에 영향을주지 않고는이를 수행 할 수 없습니다.
- 게시 된 사이클 타이밍-x86은 명령에 걸리는 시간을 정의하지 않습니다.
이 모든 것들이 합쳐져서 정확한 시간이 걸리는 명령 세트를 만들 수있는 시스템을 만들었습니다.이 응용 프로그램에서는 이것이 정확히 요구되었습니다. 대부분의 시스템은 단순히 필요하지 않기 때문에 이러한 정도의 정밀도를 갖지 않습니다. 계산이 완료 될 때 수행되거나 정확한 시간이 필요한 경우 독립적 인 클럭을 쿼리 할 수 있습니다. 그러나 일부 임베디드 시스템에서와 같이 요구가 옳다면 여전히 나타날 수 있으며 이러한 환경에서 코드를 실행하는 데 걸리는 시간을 정확하게 결정할 수 있습니다.
또한이 모든 것이 정확한 시간이 걸리는 일련의 조립 지침 을 구성 하는 데만 적용된다는 큰 면책 조항을 추가해야합니다 . 싶은 것은 심지어 이러한 환경에서, 조립의 어떤 임의의 조각을, 그리고 "? 얼마나 오래이 걸릴 실행할 않는다"요청하는 경우, 당신은 절대적으로 할 수 없어 -입니다 앞뒤가 맞지 문제 해결이 불가능 입증되었습니다.
편집 1 : 이 답변의 이전 버전에서 Atari 2600은 프로세서가 TV 신호의 위치를 프로세서에 알리는 방법이 없다고 말하면서 전체 프로그램을 계산하고 처음부터 동기화하도록 강요했습니다. 의견에서 나에게 지적한 것처럼 이것은 ZX 스펙트럼과 같은 일부 시스템에서는 사실이지만 Atari 2600에서는 그렇지 않습니다. 다음 수평 블랭킹 간격이 발생할 때까지 CPU를 정지시키는 하드웨어 레지스터와 수직 블랭킹 간격을 마음대로 시작하는 기능. 따라서 카운팅주기 문제는 각 스캔 라인으로 제한되며, 개발자가 스캔 라인을 그릴 때 내용을 변경하려는 경우에만 정확합니다.