2013-06-04 4 views
4

저는 6502 프로세서를 에뮬레이트하고 있습니다. (거의 테스트 단계입니다.) 그리고 nesdev 사이트에서 일부 NES 테스트를 사용하고 있으며, 인터럽트 플래그와 사용되지 않은 5th 플래그가 처음에 1로 설정되어 있다고 가정합니다 (즉, 인터럽트를 비활성화합니다). 그러나 그 이유는 무엇입니까? 사용하지 않은 플래그 부분을 이해할 수 있습니다. 사용하지는 않았지만 인터럽트 플래그를 이해하지 못합니다. Google에서 검색을 시도했지만 일부 사이트에서는 1로 설정되어 있다고 확인했지만 아무도 그 이유를 설명하지 않습니다. 인터럽트가 프로그램 시작시 차단되는 이유는 무엇입니까?6502의 인터럽트 플래그의 초기 상태가 1 인 이유는 무엇입니까?

답변

9

전원이 켜지면 상태 레지스터의 '사용되지 않음'비트가 CPU의 내부 회로에 의해 논리 '1'로 고정 배선됩니다. 내부 플래그 또는 레지스터에 의해 제어되지 않지만 '하이'신호선에 대한 물리적 연결에 의해 결정되므로 '1'이외의 다른 값일 수 없습니다.

상태 레지스터의 'I'플래그는 CPU 리셋 로직에 의해 '1'로 초기화되며 물론 'SEI'및 'CLI'프로그램 지침과 CPU 자체에 의해 수정 될 수 있습니다 예 : IRQ 처리 중). 기본 상태가 '1'(인터럽트 비활성화 플래그 설정) 인 이유는 호스트 시스템이 IRQ 어설 션을 고려하고 정리할 필요없이 시작/재설정 코드를 실행할 수 있기 때문입니다.

많은 6502 호스트 시스템은 IRQ 및 NMI 어설 션을위한 일부 외부 트리거 소스에 의존합니다. 종종 이것은 구성 가능한 타이머 및 기타 이벤트 응답자를 갖춘 인터페이스 어댑터로서 MOS Technology에서 설계 한 VIA 또는 CIA 도우미 칩입니다 미리 정해진 하드웨어 조건에 대한 응답으로 인터럽트를 발생시키기 위해 6502와 완벽하게 호환됩니다. 이러한 컴패니언 칩 자체는 하드웨어 이벤트를 관찰하고 그에 따라 인터럽트를 발생시키기 위해 알려진 상태로 설정하기 위해 프로그램 기반 구성을 필요로합니다.

이러한 칩은 잠재적으로 불확정 상태로 하드웨어 초기화 될 수 있으므로 6502는 이러한 인터럽트가 완전히 가짜 일 수 있으므로 즉시 인터럽트를 처리하기를 원하지 않습니다. 기본적으로 'I'플래그를 'on'으로 설정하면 CPU가 VIA 및 CIA와 같은 지원 칩을 포함하여 나머지 호스트 시스템을 초기화 할 수 있음을 알리는 프로그램 실행을 시작합니다. 전체 시스템이 처리 될 수있는 상태가되기 전에. 예를 들어, ROM의 CPU IRQ 벡터가 RESET 코드에 의해 IRQ 서비스 루틴 주소로 초기화되는 RAM의 간접 벡터를 가리키는 시나리오를 생각해보십시오. RESET 코드가 RAM 벡터를 초기화하기 전에 IRQ가 발생하면 거의 확실하게 임의의 주소 ($ 0000 일 수는 있지만 반드시 보장되지는 않음)를 가리키며 시스템 충돌이 발생할 가능성이 큽니다.'I'플래그가 기본적으로 설정되어 있으면 IRQ는 RAM 벡터 주소가 올바른 IRQ 서비스 루틴을 가리 키도록 올바르게 초기화 된 후 프로그램이 'CLI'를 실행할 때까지 발생할 수 없습니다.

6502 RESET 코드의 일반적인 예를 살펴보면 호스트 환경 (IRQ 생성을위한 지원 칩 타이머 레지스터 포함)을 설정하기위한 시스템 초기화 루틴 집합의 반복되는 주제와 함께 ' CLI의 지시문은 코드가 수행하는 마지막 작업 중 하나입니다. 대부분의 환경은 본질적으로 IRQ로 구동되는 경향이있어 정확한 간격 (예 : 비디오 프레임 당 한 번)으로 가사 및 서비스 루틴을 수행하므로 RESET 코드가 'CLI'로 끝나기 때문에 IRQ 생성 설정을 포함한 초기화가 완료되고 IRQ 서비스가 시작될 수 있습니다.

지금까지 말했듯이, RESET 처리 중에 NMI가 어설 션되는 것을 막으려면 어떨까요? CPU는 RESET 프로그램을 부지런히 중단하고 NMI ROM 벡터를 통해 점프합니다. 'I'플래그는 효과가 없습니다 (NMI는 마스크 불가능이므로 무시할 수 없습니다). 아이러니하게도, 스레 어스 또는 조숙 한 IRQ에서 RESET 코드를 보호하기 위해 'I'플래그가 '1'로 설정되어 있지만, 차단 될 수없는 가짜 NMI의 ​​가능성이 존재하며 항상 존재할 수 있습니다 벡터가 RAM을 가리키는 경우 (직접 또는 간접적으로) 문제.

그런 NMI가 발생하면 효과가 없거나 적어도 RESET 처리를 방해하지 않는 NMI를 관리하는 방법을 찾는 것이 프로그래머의 임무입니다. 따라서 소프트웨어가 해당 시나리오를 충족시켜야한다면 IRQ에 대해 동일한 작업을 수행하는 데 그다지 많은 노력을 기울이지 않습니다. 즉 'I'플래그가 '1'로 설정된 것이 CPU 초기화 회로에서 삭제 될 수 있음을 의미합니다. 또는 NMI가 RESET 중에 무시되도록 하드 와이어해야합니다. 그러나 물론, 모든 경우에 Non Maskable이 아니기 때문에 상태 레지스터에 특별한 'RESET'플래그가 있어야 CPU가 RESET 처리가 완료되었고 NMI가 될 수 있다고 말할 수 있습니다 정상적으로 서비스를 제공합니다. 그러나 나는 빗 나간다. ;)

+0

이 답변은 ... 와우. 고마워. 이것은 단지 간단한 질문 만 남겨 둡니다. 이 모든 정보는 어디에서 얻습니까? 대부분의 6502 (및 변종) 문서는 내부적 인 작동을 이해하는 것만 큼 시스템을 모방하기에 충분한 정보를 거의 제공하지 않습니다. – ZimZim

+1

ㅎ. 힘들게 벌어 들인 30 년 이상의 경험은 주제에 대한 합리적 깊이있는 이해를 가져온다. 나는 6502 코드를 1982 년에 쓰기 시작했다. :) 저기에 6502에 대한 많은 정보가 있지만, 여러 소스에 분산되어 있으며 일반적으로 칩의 특정 측면에만 해당됩니다 (예 : IRQ 처리, BRK 명령어, 문서화되지 않은 opcode 등에 대한 토론). 6502.org는 오랜 커뮤니티로서 시작하기에 분명할만한 곳입니다. 그리고 Visual6502.org는 아주 최근의 신참이지만 유용한 정보를 가지고 있습니다. 그리고 내 블로그. ;) –

4

일반적으로 컴퓨터는 인터럽트를 수신하기 전에 전역 상태를 설정해야합니다. 인터럽트가 처음에 활성화 된 경우 초기화 된 내용과 인터럽트 루틴에 포함되지 않은 내용을 알지 못합니다.

그래서 그것은 알려진 상태 이벤트 전에 부과하는 롤링 시작 허용에 대해 년대 NES에

특별히 아마 약간의 차이가 -. (가) 내장 하드웨어 마스크 불가능 인터럽트를 생성하고, 그렇게하지 않습니다 시작할 때까지. 표준 인터럽트 생성 하드웨어가있는 대부분의 카트리지는 인터럽트 생성을 시작하기 위해 사전에 알려야하며 전원을 켤 때 발생하지 않도록하십시오.

그러나이 6502 동작은 해당 부품에 대한 일반적인 사항입니다. 그들이 피하려고 시도하는 예가 2 초의 시작 시간과 인터럽트를 생성하는 키보드 일 수 있습니다. 인터럽트 루틴은 키 누름을 버퍼링 할 수 있습니다. 그러나 시스템이 달리 설정되기 전에 그렇게하려고하면 메모리의 임의의 위치에 바이트를 쓰게됩니다.