자일로그 Z80

날짜=2012-10-24 support status = **자일로그 Z80**(Zilog Z80)은 미국 자일로그 사에서 개발한 마이크로프로세서이다. 1976년에 발표되어 1980년대 중순까지 개인용 컴퓨터의 CPU 등 다양한 용도로 사용됐다. 시마 마사토시를 비롯하여 인텔에서 나온 인텔 8080의 개발자가 설계했기 때문에 8080과 바이너리 수준에서 호환된다. 2.5 MHz의 Z80, 4 MHz의 Z80A, 6 MHz의 Z80B, 8 MHz의 Z80H, Z80M 등의 변종과 타사의 세컨드 소스 제품이 있다. Z80과 그 호환 CPU는 NEC의 PC-6001, 6601, 8001, 8801 시리즈, 샤프의 MZ, X1 시리즈, MSX 컴퓨터, 세가의 게임기 등에 탑재되었다. 또, Z80에서 명령을 몇 개 뺀 간략판이 닌텐도의 게임보이에 사용되었다. S1 MP3 플레이어에도 사용된다. 자일로그 사는 Z80을 16비트(자일로그 Z800, 자일로그 Z8000, 자일로그 Z180, 자일로그 Z280) 32비트 (자일로그 Z80000, 자일로그 Z380)로 확장하려고 노력하였으나, 다른 회사에서 이미 앞서는 바람에 좌절되었다. 자일로그 사에서 발표한 가장 최근의 중앙처리장치는 자일로그 eZ80이며, Z80을 24 MB의 어드레싱 능력을 가지도록 만든 빠른 CPU이다. 그 밖에도 8080에 있던 주변 회로 IC 8251(SIO)·8253(CTC/PIT)·8255(PIO)에 대응하는 Z80SIO, Z80CTC, Z80PIO, Z80DMA 등의 계열이 있다. MS-DOS의 전신인, CP/M은 인텔 8080 프로세서를 위해 만들어졌으나 실제 이용은 Z80으로 많이 사용되었다.
# 개요
Z80은 인텔 8080 마이크로프로세서의 개량형이라고 할 수 있는 제품이며, 8080에 비해 약간의 아키텍처 확장, 전원 5V 단일화 및 보다 높은 클럭 주파수 대응 등을 도모할 수 있었다. 주소 공간은 16비트(64KB)로 그 이상으로 확장할 때에는 MMU 등으로 뱅크 교환을 한다. 8080의 개발진들이 회사를 나와 설립한 회사가 자일로그였으며, Z80은 8080과 소프트웨어와 호환되도록 설계되었다. 8080에 더 많은 명령어, 인터럽트 모드가 추가되었다. DRAM 리프레시 회로도 포함하고 있다. 또한 최대 클럭 주파수의 차이는 Z80A (4 MHz), Z80B (6 MHz) 등 말미에 붙인 알파벳으로 구분된다. 아키텍처 확장은 DRAM 정보를 유지(리프레쉬)하는 기능을 내장하기 위한 레지스터를 추가했고, 8080에서는 1묶음인 범용 레지스터군을 바꾸어 사용할 수 있는 앞과 뒤, 2묶음으로 했으며, 또, 2개의 인덱스 레지스터를 사용한 메모리 조작을 포함한 명령의 증강, 인터럽트 제어의 강화, 와이어드 로직에 의한 명령의 실행 등이 이루어졌다. 곱셈과 나눗셈 명령은 8080과 마찬가지로 존재하지 않는다. 또, 본래 16비트 고정의 인덱스 레지스터를 8비트 단위로 사용할 수 있는 기능은 로직 설계상에서 파생되었다고 생각되며, 명령어 표에는 없는 숨겨진 명령이 존재했다.
# 어셈블러 사양
8080에 대해서 상위 호환성을 가지며, 8080용 바이너리를 그대로 실행할 수 있다. 어셈블리어 프로그래밍 시 명령어를 표시하기 위한 '니모닉'은 8080과 완전히 다르다. 보다 쉽게 기술할 수 있도록 정리된 것이다. 이는 초보자도 알기 쉽다고 여겨지는 반면 다른 CPU의 니모닉과 비교하면, 주소 지정 방식(addressing mode)이 불확실하다는 결점도 있었다. 오퍼랜드의 순서는 데스티네이션이 앞이고 소스가 뒤이다.
# 특징
Z80에는 ' 특정 명령의 조합을 썼을 때, 평상시 명령을 썼을 때보다도 실행에 필요한 클럭 수나 명령의 총 바이트 수를 적게' 할 수 있는 테크닉이 많이 존재하며 이것들은 '최적화', '클럭 줄임' 등으로 불렸다. 예를 들어, 추가된 블록 전송 명령이나 인덱스 레지스터 명령은 다른 명령으로 대신 쓰는 경우보다 소요 클럭수가 증대된다는 장점이 있으며 명령의 메모리 공간상 점유율과 처리 속도의 상충 관계가 있다. 또 Z80는 같은 기간에 새로 개발된 타사의 8비트 CPU와 비교했을 때, 상대 점프는 할 수 있는 곳의 범위가 좁은 등 재배치 가능한 구성이 어렵고, 이진수화한 코드를 재배치 가능하도록 배치하여 작동시키는 드라이버나 디버거, 운영체제 등의 환경을 만드는 데는 부적합하다고 생각되었다. 재배치 불가능한 일반적인 바이너리는 배치 주소를 변경한 정도로 다시 컴파일이나 재링크가 필요하다. 또, 주소를 참조할 때의 오프셋도 범용 레지스터 사용시에는 지정되지 않고, 인덱스 레지스터 사용에서는 오프셋 지정이 -128~0~127의 범위로 제한되었기 때문에 C 언어의 포인터와의 궁합이 맞지 않는 면이 있다. 또한 Z80는 주소 지정 방식이 적어서, 각 명령 코드를 16 진수로 기억하는 일도 그렇게 어렵지는 않았다.
# 디자인

## 레지스터 집합
(괄호 안은 레지스터 크기: 비트 수) A, B, C, D, E, H, L는 8080의 같은 이름의 레지스터와 기능을 가진다. F, F'는 8080 호환의 플래그 레지스터이다. * 범용 레지스터표(8) ** A F ** B C ** D E ** H L * 범용 레지스터뒤(8) ** A' F' ** B' C' ** D' E' ** H' L' * 인덱스 레지스터(16) ** IX ** IY * 프로그램 카운터(16) ** PC * 스택 포인터(16) ** SP * 리프레시 카운터(7) ** R * 인터럽트 벡터 레지스터(8) ** I 데이터 버스 8비트, 주소 버스 16비트의 하드웨어에 A, F, B, C, D, E, H, L, IX, IY, R 등의 레지스터가 있다. 이 중 IX, IY는 16비트 길이의 인덱스 레지스터로 Z80에 추가된 것이다. 또 A, F, B, C, D, E, H, L은 각각 이면 레지스터 A', F', B', C', D', E', H', L'가 존재하므로 서로 전환해가며 사용할 수 있다. 레지스터 중 B, C, D, E, H, L의 8비트 레지스터들은 각각 BC, DE, HL로 묶어서 16비트 레지스터로 사용할 수 있다.
## 입출력 포트
Z80에는 8080과 같이 메모리 주소와는 별도로 0부터 FF(255)까지의 입출력 포트 주소를 가지고 있었다. 포트 주소는 주소 버스의 하위 8비트로 출력되었지만, 상위 8비트에도 동시에 값이 출력되는 사양이 되었다(이 값에는 입출력 주소를 C레지스터로 지정하는 명령의 경우는 B레지스터, 그 밖의 명령은 A 레지스터의 값이 이용된다). 이 사양을 이용하면 입출력 포트 공간을 16비트 주소로 취급할 수 있으며, 그래픽 메모리를 여기에 할당하여 메인 메모리가 그래픽 메모리에 의해서 압박 받는 것을 막을 수 있다. 같은 구성을 사용한 것은 샤프의 X1가 대표적으로, 그 밖에 Bubcom80 등이 있다.
## 예제 코드
; memcpy -- ; Copy a block of memory from one location to another. ; ; Entry registers ; BC - Number of bytes to copy ; DE - Address of source data block ; HL - Address of target data block ; ; Return registers ; BC - Zero 1000 org 1000h ;Origin at 1000h; 1000 memcpy public 1000 78 loop ld a,b ;Test BC, 1001 B1 or c ;If BC = 0, 1002 C8 retz ;Return 1003 1A ld a,(de) ;Load A from (DE) 1004 77 ld (hl),a ;Store A into (HL) 1005 13 inc de ;Increment DE 1006 23 inc hl ;Increment HL 1007 0B dec bc ;Decrement BC 1008 C3 00 10 jp loop ;Repeat the loop 100B end
# 복제품

## 자일로그 호환의 Z80
세컨드 소스 계약에 의하여 핀 수가 호환 가능한 호환 제품의 생산이 다른 회사에서도 이뤄졌다. 이러한 제품에는 샤프의 'LH0080', 모스텍의 'MK3880' 등이 있다. 또, 일본전기(NEC)가 독자적으로 호환 'μPD780'를 출하했던 것에 대해 자이로그는 칩 저작권 침해라며 소송을 걸었지만 최종적으로는 양자가 화해하여 제조 및 판매가 계속되었다. 원래는 NMOS 프로세스로 제조되었지만, 일부 세컨드 소스 제조사들은 독자적으로 CMOS 프로세스화해 소비 전력 감소를 도모한 제품(NEC 'μPD70008', 샤프 'LH5080', 도시바 'TMPZ84C00' 등)도 출시되고 있다. 또, 내셔널 반도체에서는 CMOS화와 더불어 인텔 8085과 같이 주소 버스의 하위와 데이터 버스를 같게 하고 Z80와 소프트웨어의 호환성을 가지도록 한 'NSC800'가 제조되었다. 아직까지 제어, 조입용으로서 메모리 및 주변기기의 제어용 회로를 단일의 패키지에 집적한 LSI가 제조되고 있으며, ASIC의 IP코어로서 Z80의 호환 프로세서를 준비하는 장치 제조사도 많다. 또, 최근에는 2002년에 샤프가 시스템 액정의 데몬스트레이션으로 유리 기판상에 Z80를 형성하였으며, MZ80C의 CPU와 교환해 동작시켰다.
## 다른 주된 Z80 호환 CPU
고속화를 목표로 하거나 주변 기기를 집적시킨 것들이다. * HD64180 - 히타치 제작소(현 르네사스테크놀러지)가 개발했다. 빅터의 MSX2, HC-90, 95에 탑재되었다. 후지쯔의 FM TOWNS HR 등의 CD-ROM 컨트롤러에도 사용되었다. * ASCII R800 - ASCII가 개발하였으며, 내부 16비트의 고속판 Z80 호환 CPU이다. 곱셈 명령을 확장했지만 계산 결과가 부정확한 결점이 있다. MSX turboR에 탑재되었다. MMU나 DMA를 가지지만 같은 turboR에서는 사용되지 않았다. * μPD9002 - 일본 전기가 개발한 16비트 PC PC-88VA에 탑재된 CPU. V30가 8080 호환 모드를 가지는 것과 같이 V30 모드와 Z80 호환 모드를 가진다. * KC80 - 가와사키 마이크로일렉트로닉스(구 가와사키 제철)의, Z80 호환의 고속판 CPU. 곱셈·나눗셈 명령을 가진다. KC80를 코어로 MMU등을 추가한 편입용 IC로서 KL5C8012, KL5C8016, KL5C8400가 판매되고 있다. 16비트판으로 상위 호환인 KC160도 판매되고 있다.