2010-01-29 8 views
6

인터럽트는 어떻게 인텔 8080에서 작동합니까? 나는 Google과 Intel의 공식 문서 (197X)에서 수색했으며, 이것에 대한 설명은 거의 발견하지 못했습니다. 이 CPU를 에뮬레이트하기 위해 그것에 대한 자세한 설명이 필요합니다.인터럽트는 어떻게 인텔 8080에서 작동합니까?

답변

1

드디어 찾았습니다!

나는 interrupt opcode가가는 bus라는 변수를 생성합니다. 중단을 필요로 할 때

void i8080::interruption() 
{ 
    // only for RST 
    cycles -= cycles_table[bus]; 
    instruction[bus](); 
    INT = false; 
} 

INT는 사실이다 : 그런 다음, 나는 중단을 처리하는 함수를 호출. EI 및 DI 명령어는 INTE를 처리합니다.

INT 및 INTE가 참일 때 인터럽트가 실행됩니다.

+0

"opcode가가는"변수 인 경우 "opcode"라고 부르지 않을까요? –

+0

opcode가 데이터의 유형으로 사용되는데, 알다시피, 인터럽트의 opcode가 8080의 외부 버스로 연결되기 때문에 괜찮다고 생각합니다. 감사합니다. – Facon

3

인터럽트 핸들러에 대한 함수 포인터는 저용량 메모리에 저장됩니다. 첫 번째 주소의 약 32 정도는 하드웨어 인터럽트입니다. 하드웨어가 트리거됩니다.

다음 32 개 정도의 주소는 사용자가 트리거 할 수 있으며 소프트웨어 인터럽트라고합니다. 그들은 INT 명령에 의해 트리거됩니다.

INT 매개 변수는 소프트웨어 인터럽트 벡터 번호이며 호출되는 인터럽트입니다.

인터럽트에서 돌아가려면 IRET 명령어를 사용해야합니다.

인터럽트를 입력 할 때 제일 먼저 할 일은 인터럽트를 비활성화해야 할 가능성이 높습니다.

자세한 내용은 사용중인 특정 프로세서 모델에 대한 설명서를 참조해야합니다.

+0

이것은 8080이 아니라 8080을 설명합니다. –

1

8080은 인터럽트 처리를 제어하기 위해 외부 하드웨어에 의존하므로 일반화가 불가능합니다. 인텔 8214 또는 8259 인터럽트 컨트롤러에 대한 정보를 찾으십시오.

+0

하지만 버스에서 오는 것입니까? – Facon

3

인터럽트는 다른 뭔가를 처리하기 위해 통지와 CPU를 중단하는 방법이다, 나는 인텔 8080 칩의 특정 아니지만, 내 경험에서, 인터럽트를 설명하는 가장 좋은 방법은 이것이다 :

CS:IP (코드 세그먼트 : 명령 포인터)은 메모리 주소 0x0000 : 0020에서이 명령어를 실행합니다. 인텔 8086 명령어 인 을 사용하여 설명하기 위해 예제로 사용 된 어셈블러는 횡설수설이며 실제 의미가 없습니다 ... 지침 상상력이있다

 
0x0000:001C MOV AH, 07 
0x0000:001D CMP AH, 0 
0x0000:001E JNZ 0x0020 
0x0000:001F MOV BX, 20 
0x0000:0020 MOV CH, 10 ; CS:IP is pointing here 
0x0000:0021 INT 0x15 

CS : IP가 다음 줄을 가리키고 0x15 진수 15 진수가 발행되면 CPU는 스택에 레지스터와 플래그를 푸시 한 다음 0x15000으로 서비스를 실행하는 0x1000 : 0100에서 코드를 실행합니다. IP 지시가 0x1000에 명중 : 다음 CS 때 예를 들어

 
0x1000:0100 PUSH AX 
0x1000:0101 PUSH BX 
0x1000:0102 PUSH CX 
0x1000:0103 PUSH DX 
0x1000:0104 PUSHF 
0x1000:0105 MOV ES, CS 
0x1000:0106 INC AX 
0x1000:0107 .... 
0x1000:014B IRET 

모든 레지스터를 팝업 및 상태를 복원 014B, IRET (인터럽트 귀국일), 발행과는 CPU의 CS 실행됩니다 때 : IP는 0x0000 : 0021의 명령 뒤에 여기서 다시 가리 킵니다.

 
0x0000:0022 CMP AX, 0 
0x0000:0023 .... 

인터럽트 벡터 테이블을 기반으로 특정 오프셋으로 이동합니다,이 인터럽트 벡터 테이블은 BIOS의 특정 위치에있는 BIOS에서 설정되는 경우 CPU가 알고있는 방법, 그 결과는 다음과 같습니다

 
INT BIOS's LOCATION OF INSTRUCTION POINTER 
--- -------------------------------------- 
0  0x3000 
1  0x2000 
..  .... 
15  0x1000 <--- THIS IS HOW THE CPU KNOWS WHERE TO JUMP TO 

그 테이블은 BIOS에 저장되고 INT 15이 실행되면, BIOS는 CS 라우팅 것이다 인터럽트를 처리하는 서비스의 코드를 실행하는 BIOS의 위치로 IP를.

옛 터보 C에서는 실제 인터럽트 처리기가 자신의 것으로 재 라우팅 된 setvectgetvect 함수를 사용하여 인터럽트 처리 함수로 인터럽트 벡터 테이블 루틴을 오버라이드하는 방법이있었습니다 암호.

내가 잘 설명했으면 좋겠어. 오케이, 인텔 8080이 아니지만 그건 내 이해이며, 인텔 x86 칩 제품군과 개념이 같다는 것을 확신 할 수있다.

+0

좋은 설명! 고맙습니다. – Leonardo

+0

이것은 8086을위한 것이지 080이 아닙니다 –

10

8080에는 인터럽트 라인 (핀 14)이 있습니다. 모든 주변 장치는 일반적으로 "wire-OR"구성 (즉, 인터럽트 요청 출력이 오픈 콜렉터이고 인터럽트 핀이 저항으로 하이로 풀링 됨)으로이 핀에 연결됩니다. 내부적으로 프로세서에는 인터럽트 활성화 비트가 있습니다. EI와 DI의 두 명령어가이 비트를 설정하고 지 웁니다. 따라서 전체 인터럽트 시스템이 켜지거나 꺼지기 때문에 "베어 (bare)"8080에서 개별 인터럽트를 마스킹 할 수 없습니다. 장치가 인터럽트를 발행하면 프로세서는 "인터럽트 승인"신호 (~ INTA)로 응답합니다. 이 신호는 "메모리 읽기"(~ MEMR) 신호와 동일한 타이밍을 가지며 주변 장치가 데이터 버스에 "다시 시작"명령을 내 리도록 유도합니다. 인터럽트 확인 신호는 기본적으로 명령 페치 사이클이며 인터럽트에 대해서만 발생합니다.

RST 0 - RST 7의 재시작 명령어가 8 개 있습니다. RST 7은 opcode "0xFF"입니다. 재시작 명령어는 프로세서가 스택에서 프로그램 카운터를 밀어 넣고 재시작 벡터 위치에서 실행을 시작하도록합니다. RST 0 ~ 0x0000 벡터, RST 1 ~ 0x0008 벡터, RST 2 ~ 0x0010 벡터 등등. 7 벡터를 0x0038로 다시 시작하십시오. 이러한 벡터 주소는 실행 코드, 일반적으로 인터럽트 서비스 루틴으로의 점프 명령을 포함합니다. 인터럽트 서비스 루틴은 서브 루틴 (RET, opcode 0xC9)을 종료하는 동일한 리턴 명령을 통해 사용되는 모든 레지스터를 스택에 넣고 필요한 I/O 기능을 수행하고 모든 레지스터를 언 스택하고 메인 프로그램으로 리턴합니다.

재시작 명령어는 실제 opcode이므로 프로그램 실행 중에 메모리에서 패치 된 경우 동일한 작업을 수행합니다. 초기 EPROM은 일반적으로 각 빈 위치에 0xFF를 포함하기 때문에 Restart 7을 키보드 모니터/디버거 프로그램의 "warm restart"로 사용하는 것이 편리했습니다. EPROM을 공백으로 실행했다면, 뭔가 잘못되었다는 것을 의미했기 때문에 어쨌든 모니터로 돌아가고 싶었을 것입니다.

RESET과 동일한 메모리 위치에있는 RST 0 벡터는 모두 0x0000에서 실행되기 시작합니다. 그러나 RST 0은 리턴 주소를 스택에 남겨 둡니다. 어떤 식 으로든, RESET은 8080이 가질 수있는 유일한 마스크 불가능한 인터럽트라고 생각할 수 있습니다.

인터럽트 신호는 인터럽트 비트도 지우므로 인터럽트 서비스 루틴은 일반적으로 RET 직전에 EI 명령을 실행해야합니다. 그렇지 않으면 시스템이 하나의 인터럽트 이벤트에만 응답합니다.

CP/M은 시스템 사용을위한 첫 번째 256 바이트의 메모리를 예약했으며 - 해당 인터럽트 벡터 맵은 처음 64 바이트 (재시작 명령어 당 8 바이트)를 사용했습니다.CP/M 시스템에서 RAM은 0x0000에서 시작되었고 모든 ROM은 메모리의 맨 끝에서 살았습니다. 이 시스템은 시스템 ROM에 점프 명령을 제공하여 부팅 시퀀스를 시작할 수 있도록 EPROM 또는 RESET 직후에 전환하기 위해 영리한 뱅크 전환 방식을 사용했습니다. 메모리 맵의 하단에 ROM이있는 시스템은 RAM에있는 벡터에 대한 JUMP 명령어를 처음 64 바이트로 프로그래밍했습니다. 이러한 시스템은 시작할 때 RAM 벡터를 초기화해야했습니다.