1P by GN⁺ | ★ favorite | 댓글 1개
  • 1976년 7월 출시된 Zilog Z80은 개인용·취미용 컴퓨터부터 임베디드·산업 장비까지 널리 쓰이며 8비트 마이크로프로세서 시대를 대표하게 됨
  • Intel 8080 바이너리 호환성을 유지하면서 레지스터·주소 지정·명령어·인터럽트 기능을 확장하고, 전기적 연결은 더 단순하게 설계함
  • 8008의 제한적인 스택과 14비트 주소 공간은 8080에서 메모리 스택과 16비트 주소 공간으로 개선됐고, Z80은 여기에 인덱스 레지스터·대체 레지스터 뱅크·블록 명령을 추가함
  • 단일 5V 전원·단일 클록과 MREQ·IORQ·RD·WR 제어 신호, 내장 DRAM 리프레시 덕분에 적은 주변 칩으로 컴퓨터를 구성할 수 있었음
  • Z80 계열은 Game Boy의 Sharp LR35902와 eZ80 등 여러 파생 제품을 낳았으며, 원래 Z80은 긴 산업용 수명을 거쳐 2024년 6월 단종

Datapoint 2200에서 Intel 8008로

  • Computer Terminal Corporation(CTC)은 개별 TTL 칩으로 만든 8비트 프로세서를 탑재한 Datapoint 2200 프로그래머블 터미널을 개발함
  • TTL 회로 일부를 맞춤형 IC로 대체하려던 계획은 전체 CPU를 단일 칩에 넣는 방향으로 확대됐고, Texas Instruments와 Intel이 각각 설계를 맡음
  • 두 회사 모두 기한 내 설계를 완성하지 못했으며, Intel의 칩이 준비됐을 때 CTC는 이미 TTL 기반 터미널을 판매하고 있었음
    • CTC 엔지니어들은 칩 성능에도 만족하지 않았고 차세대 터미널의 아키텍처도 변경한 상태였음
    • TI는 설계를 중단했지만 Intel은 원래 1201이던 제품을 마케팅 명칭인 8008로 바꿔 상용화함

8008의 구조와 한계

  • 8008은 A·B·C·D·E·H·L 7개 레지스터를 제공함
    • A는 누산기이고, H와 L은 메모리 포인터 HL을 구성함
    • 의사 레지스터 M은 HL이 가리키는 메모리 바이트를 나타냄
  • ALU 상태는 Carry·Parity·Zero·Sign 플래그로 유지되며 조건부 점프·호출·복귀에 사용됨
  • 프로그램 카운터는 직접 다루기 어려웠고, 함수 호출에는 프로세서 내부의 8단계 복귀 주소 스택을 사용함
    • Datapoint 2200이 직렬 메모리를 사용할 예정이어서 메모리 기반 호출 스택이 병목이 될 수 있다는 판단에 따른 설계였음
  • 메모리 주소는 14비트이며 별도 주소 공간에 32개 I/O 포트를 제공함
  • 인터럽트가 발생하면 주변 장치가 데이터 버스에 RST 명령을 올리고 CPU가 이를 실행함
    • RST는 주소 공간 앞부분의 8개 슬롯 중 하나를 호출함
    • 범용 메모리 스택이 없고 모든 메모리 접근에 HL이 필요해, 인터럽트 처리 중 레지스터를 저장하려면 I/O 버스의 외부 래치를 임시 레지스터로 써야 했음
  • 3,500개 트랜지스터와 DIP18 패키지를 사용했으며 주소·데이터 버스를 다중화함
    • 외부 회로가 버스를 래치하고 CPU의 내부 상태 신호를 해석해야 했음
    • 500kHz의 위상이 다른 두 클록과 +5V·-9V 전원이 필요했음

8008에서 8080으로

  • 8008 개발이 끝나기 전부터 한계를 개선하려는 논의가 시작됐지만, Intel 경영진은 시장 반응을 먼저 확인하려 함
  • Federico Faggin은 개선형 개발을 추진했으며, 경쟁사의 8비트 제품 발표까지 기다린 결과 Intel은 선행 기간 9개월을 잃음
  • Faggin은 프로젝트 승인 전부터 Busicom의 Masatoshi Shima를 영입해 8080 설계에 투입함
  • 잠재 고객이 8008 시연에서 제공한 비판과 피드백도 반영했으며, 초기부터 8008과의 바이너리 호환성을 포기하기로 결정함

8080 아키텍처

  • 8080은 8008과 유사한 레지스터 구성을 유지하면서 내부 복귀 주소 스택을 없애고, SP가 가리키는 메모리 스택을 도입함
    • BC·DE·HL·AF 레지스터 쌍을 스택에 넣거나 꺼낼 수 있음
    • Intel 어셈블리에서는 AF를 프로그램 상태 워드인 PSW라고 부름
  • 주소 공간은 16비트 64KB, I/O 포트는 256개로 늘어남
    • BC와 DE를 통한 제한적인 간접 접근이 가능해짐
    • 누산기와 HL을 즉시 지정한 주소에서 읽거나 저장할 수 있음
  • 레지스터 쌍 증감 등 16비트 연산이 추가돼 포인터 계산과 16비트 카운터를 처리할 수 있음
    • 이 연산 블록은 ALU 플래그에 영향을 주지 않으므로 BC를 감소시킨 뒤 두 바이트가 모두 0인지 별도로 검사해야 함
  • 인터럽트는 RST 기반 방식을 유지하면서 소프트웨어로 활성화하거나 비활성화할 수 있게 됨
    • 명시적인 메모리 스택 덕분에 레지스터 저장용 I/O 하드웨어가 필요 없어짐
  • Intel 8080 어셈블리는 니모닉과 opcode가 거의 1:1로 대응해 어셈블러 구현은 쉬웠지만 사람이 읽기에는 불편할 수 있었음
    • 레지스터 쌍 명령은 한쪽 레지스터 이름만 사용하며, INX의 X로 단일 바이트 INC와 구분함

8080의 전기적 인터페이스

  • 속도를 높이기 위해 NMOS 논리를 사용하면서 -5V·+5V·+12V의 세 전원과 위상이 다른 두 클록이 필요해짐
  • 40핀 패키지 덕분에 주소선과 데이터선을 분리했지만, 제어 상태 일부를 데이터 버스에 다중화해 외부 래치와 디코더가 여전히 필요했음
  • Intel은 상태 디코딩과 클록 생성을 위한 지원 칩을 판매했으며, 시스템에 따라 인터럽트 컨트롤러·타이머·DMA 컨트롤러도 필요했음
    • 프로그래머블 타이머는 최소한 DRAM 리프레시 구동에 활용할 수 있었음
  • 후속 8085는 단일 5V 전원과 단일 5V 클록을 사용하고 일부 제어 신호를 추가했지만, 여전히 특수 지원 칩이 필요했음

Zilog 설립과 Z80 개발

  • 8080 프로젝트 승인 지연과 Intel 경영진과의 갈등에 불만을 느낀 Faggin은 마이크로프로세서 부문 책임자 Ralph Ungermann과 Intel을 떠나 회사를 설립함
  • 처음에는 마이크로컨트롤러를 고려했지만 팹리스 반도체 스타트업이 감당하기에는 마진이 낮다고 판단함
  • 이후 8080 개선형인 Super 80을 설계하기로 했고, 이 제품이 Zilog Z80으로 이어짐
    • Exxon에서 자금을 확보하고 Shima도 Intel에서 영입함
    • 레이아웃과 소프트웨어 시뮬레이션 등을 맡는 팀은 총 11명으로 확대됨
  • 목표는 8080 바이너리 호환성을 유지하면서 레지스터·주소 지정 방식·명령어를 추가하고, 6800 같은 동시대 프로세서의 특징을 반영하는 것이었음
    • 8080보다 빠른 속도와 단순한 전기적 연결도 목표로 삼음
  • 작동하는 첫 프로토타입까지 약 40만 달러가 들었으며, Exxon에서 확보한 50만 달러 예산보다 적은 비용으로 일정을 맞춤
  • 생산은 처음 계약한 Synertek과의 갈등 이후 Mostek에 의존함
    • 이후 Exxon의 추가 투자로 자체 팹을 건설했지만 Z80의 복수 공급은 계속함

Z80 아키텍처의 확장

  • Z80은 8080 명령어 집합과 완전히 바이너리 호환
  • 6800에서 영감을 받은 16비트 인덱스 레지스터 IX와 IY를 추가함
    • opcode 접두사를 사용해 HL 대신 쓸 수 있으며 즉시 오프셋도 지원함
  • AF·BC·DE·HL 레지스터 쌍은 대체 뱅크를 갖춰 인터럽트 처리 시 빠르게 전환할 수 있음
  • 인터럽트는 세 가지 모드를 제공함
    • 모드 0은 8080 호환 방식임
    • 모드 1은 항상 고정 주소를 호출함
    • 모드 2는 버스의 값을 인덱스로 사용해 호출 테이블로 분기하며, 별도 레지스터가 테이블의 메모리 기준 주소를 지정함
  • 비트 회전·검사·설정, BCD 연산, BC를 카운터로 쓰는 반복 명령, 블록 전송·비교·문자열 연산을 추가함
    • 바이트 복사 루프 전체를 자체 반복 명령인 LDIR 하나로 대체할 수 있음
  • Intel이 어셈블리 니모닉 저작권을 주장했기 때문에 Z80은 자체 문법을 채택함
    • 피연산자를 더 명시적으로 적고 기본 니모닉을 오버로드해 8080 문법보다 읽기 쉽게 구성함

단순해진 버스 설계

  • Z80은 단일 5V 전원과 단일 클록만 필요함
  • 8080에서 외부 회로가 래치하고 해석하던 상태를 전용 신호로 직접 제공함
    • MREQ와 IORQ는 메모리·I/O 접근을 구분함
    • RD와 WR은 읽기·쓰기를 나타냄
    • M1은 현재 메모리 접근이 명령어 인출임을 알림
  • 주소선과 데이터선을 직접 연결하고 74xx138 하나로 EEPROM·RAM·UART를 선택하는 정도의 회로만으로 기본 컴퓨터를 만들 수 있음
  • 내부 리프레시 카운터가 명령어 디코딩 주기 중 주소 버스에 값을 출력하고 제어선을 활성화해 DRAM 리프레시를 처리함
  • 인터럽트 모드 1을 사용하면 외부 인터럽트 컨트롤러 없이 단일 장치를 인터럽트 핀에 연결할 수 있음
    • 여러 장치는 74xx148 우선순위 인코더와 래치 같은 단순 회로로 처리할 수 있음

Z80 이후의 전개

  • Z80이 1976년 7월 출시되기 전부터 16비트 Z8000의 초기 설계가 시작됐고, 제품은 Intel 8086 이후이자 Motorola 68000 이전인 1979년에 출시됨
  • Z8000은 8086처럼 분할 메모리를 사용했지만, 세그먼트 번호를 버스에 출력하고 외부 MMU가 선형 주소 변환과 범위·권한 검사를 담당함
  • 8086 명령어 집합에는 8080의 계보와 함께 Z80의 자체 반복 블록·문자열·루프 명령 특징도 반영됨
  • Z8000 MMU 설계는 286의 디스크립터 테이블 기반 16비트 보호 모드에도 영향을 줌

Exxon, IBM PC와 Zilog의 변화

  • Zilog은 마이크로프로세서가 논리회로 대체품으로 여겨지던 시기부터 컴퓨터 시장을 겨냥했지만, Exxon과의 관계는 IBM이 PC에 Zilog 대신 Intel 8088을 선택한 이유 중 하나가 됨
  • Exxon은 IBM에 맞서는 자체 컴퓨팅 사업군을 만들려 했으며 타자기·워드프로세서·프린터 제조사 등에 전략적으로 투자함
    • 이들 중 일부는 Zilog 부품 기반 제품을 설계해 IBM 제품의 시장 점유율을 잠식함
  • Exxon과의 긴밀한 관계는 Faggin과 Ungermann 사이에도 갈등을 일으켰고, Ungermann은 Zilog이 1980년 Exxon의 완전 자회사가 되기 전에 퇴사함
  • Zilog은 1989년 Exxon에서 다시 분리되고 1991년 상장함
    • 이후 사모펀드와 전자기업 사이에서 여러 차례 소유주가 바뀌었으며 현재는 Littelfuse가 소유함
  • Z80은 장기간 임베디드 프로세서로 사용된 뒤 2024년 6월 단종

개인적 Z80 경험과 장기적 영향

  • Z80과 바이너리 호환인 8080·8085는 8비트 마이크로컴퓨터의 사실상 하드웨어 표준 형성에 기여했고, CP/M과 Microsoft BASIC이 사실상 소프트웨어 표준으로 자리 잡는 기반이 됨
  • Z80은 초기 개인용 컴퓨터, 가정·취미용 컴퓨터와 다양한 임베디드·산업 시스템에 사용됨
    • 원조 Game Boy의 Sharp LR35902를 비롯한 복제품과 파생 아키텍처도 등장함
    • Zilog은 16·32비트 파생 제품군을 포기한 뒤 파이프라인과 높은 클록을 적용한 eZ80 등 Z80 기반 마이크로컨트롤러로 돌아감
  • 십 대 후반 전자부품 카탈로그에서 여전히 판매 중이던 Z80을 발견한 뒤 소형 컴퓨터를 설계하고, 학교 사진실을 밤에 빌려 PCB를 식각함
    • 교사들에게 오래된 가정용 컴퓨터와 콘솔, Tupperware 상자 안에 와이어 래핑으로 제작해 CP/M·WordStar를 실행한 컴퓨터 등의 경험을 들음
    • MCS-85 부품과 Z80·8085·6502·6522 칩도 받아 직접 만든 프로젝트에 사용함
  • 이 과정에서 안정적인 전원 켜짐 리셋이 예상보다 어렵고, 링커가 어셈블러보다 훨씬 구현하기 어려우며, 개인도 컴파일러를 실제로 만들 수 있다는 점을 배움

댓글과 토론

Hacker News 의견들
  • 1978년 어셈블리어로 프로그래밍을 시작했고, 소프트웨어뿐 아니라 하드웨어의 작동 원리도 알고 싶었음
    Z80 키트를 조립한 뒤 논리 프로브와 오실로스코프로 디지털 전자공학을 익히고, 설명서를 파고들며 명령어 집합을 배웠음. 이제 거의 70세지만 어제 일처럼 생생하며, Z80은 진정 훌륭한 CPU였음

    • 3년 뒤 6809 기반 4KB Radio Shack 컴퓨터로 시작했으며, 40년 넘게 6809 코드를 작성하지 않았는데도 아직 여러 연산 부호를 기억해 최근 retrocomputing.stackexchange.com의 까다로운 어셈블리어 버그 해결을 도왔음
      수업이나 책 없이 ROM을 역어셈블하고 Motorola 요약 카드를 참고하며 독학했지만, 이후 여러 스타트업을 창업하며 성공적인 경력을 쌓았음. 컴퓨터를 가장 낮은 계층의 제1원리부터 배우는 데는 여전히 대체 불가능한 가치가 있음
    • Turing Complete(https://turingcomplete.game/)를 추천함
      NAND 게이트로 기본 회로를 만들고 기능 장치와 명령어 디코더를 조합해 튜링 완전한 아키텍처를 구축한 뒤, 직접 정의한 어셈블리어로 프로그래밍하는 디지털 논리 시뮬레이션 게임. 새 연산 부호가 필요하면 직접 구현할 수 있어 어렵지만 큰 보람이 있으며, 정식 출시에 가까워졌고 예고편도 공개됐음
    • Z80과 6502는 모두 기업 내부에서 거절당한 설계로부터 탄생했음. 지금은 훨씬 복잡해졌지만 또 다른 설계자가 FORK86-64 같은 것을 내놓는 모습을 보고 싶음
    • 나도 ZX81용 외부 주변기기까지 직접 만들었음
  • 12살 때 TV 프로그램 ‘Klein Microcomputer Sebstgebaut und Programmiert’의 키트로 Z80 컴퓨터를 조립했음
    Märklin 변압기를 전원으로, Telefunken 테이프 녹음기를 데이터 저장 장치로 사용했으며, 달 착륙선 게임을 Z80 기계어로 입력한 뒤 프로그램을 잃을까 두려워 2주 동안 전원을 끄지 않았음

  • ZX Spectrum의 1980년대로 돌아간 느낌이며, 당시 128KB RAM은 감당하기 어려운 사치품이었음. 지금과도 조금 비슷함
    https://spectrumcomputing.co.uk/entry/2000237/Book/Mastering...
    http://www.primrosebank.net/computers/zxspectrum/docs/Comple...

  • ZX-81 사용자 설명서 끝의 Z80 명령어 참조표를 보며 아무것도 이해하지 못했던 기억이 있음. BASIC 같은 고수준 추상화와 달리 CPU가 실제로 프로그램을 실행하는 방식을 파악하기까지 꽤 오래 걸렸음

    • 12살 때는 오히려 BASIC의 단순한 구조 덕분에 Z80 어셈블리어를 이해하기 쉬웠음. 메모리 주소는 줄 번호, 레지스터는 변수, JPGOTO, CALLGOSUB, CPIF, JP ZTHEN GOTO, LDLET에 대응했음
    • 처음 산 컴퓨터가 키트형 ZX-81이었고, 작은 도시에서 정보기술의 선구자가 됐음. 모든 것이 복잡하면서도 단순했던 시절이며, RAM 1KB만으로 비행 시뮬레이터도 실행했음
    • ZX-81로 컴퓨터를 처음 접했으며, 고속 모드에서 화면을 끄는 방식과 하드웨어·소프트웨어 사이의 흥미로운 절충에 매료됐음
  • “Z80은 8080 명령어 집합과 완전히 이진 호환된다”는 표현은 플래그 레지스터까지 고려하면 사실이 아님. 일부 연산에서 패리티 플래그의 동작이 달랐음
    또한 8080의 미정의 연산 부호를 이용한 프로그램은 임의의 방식으로 실행될 수 있었지만, Z80은 그 연산 부호를 새 명령어에 재사용했음

    • 패리티 플래그를 완벽하게 호환하지 않은 것은 현명한 선택이었음. 기존 프로그램은 이를 거의 검사하지 않았고, Z80에서 다르게 동작하는 명령어 뒤에서는 사실상 전혀 검사하지 않았음
      덕분에 패리티 플래그를 오버플로 플래그로 재활용할 수 있었고, 이는 매우 유용한 확장이었음. Datapoint 2200, Intel 8008, Intel 8080과 RISC-V는 하드웨어가 오버플로를 감지하지 않는 드문 명령어 집합인데, 단순하고 저렴한 초기 설계들과 달리 RISC-V에는 변명의 여지가 없으며 이것이 가장 큰 실수라고 봄
    • 미정의 연산은 8080 명령어 집합의 일부가 아니므로, 이를 지원하는 것은 명령어 집합이 아니라 8080 실리콘과의 이진 호환성에 해당함. 다만 패리티 플래그 차이는 실제 호환성을 깨므로 “패리티 플래그 값을 제외하고 8080 명령어 집합에만 의존하는 코드와 이진 호환된다”가 정확함
  • 1983년 초 TRS-80 Model I에서 Z80 어셈블리어로 프로그래밍에 입문했음. Bill Barden의 책들과 80 Micro 잡지에 실린 Hardin Brothers의 ‘The Next Step’ 연재가 길을 열어줬으며, 당시 경험을 이 글에 정리했음

    • 1980년 무렵 십 대였을 때 동네 Radio Shack에서 형편이 되는 대로 책을 사 읽었고, TRS-80이 Z80을 사용했기에 Howard Sams가 출판한 Bill Barden의 Z80 책도 접했음
      아이도 이해할 만큼 명료해 처음부터 끝까지 읽었으며, 실제 Z80을 만져보지는 않았지만 6502와 8051·PIC 같은 초기 마이크로컨트롤러도 어렵지 않게 이해할 토대가 됐음. 지금도 현대 마이크로프로세서를 Z80에 빗대 이해하는 듯하며, 보통 사람이 전체를 파악할 만큼 단순한 8비트 마이크로프로세서 학습을 추천함
  • 고급 언어 컴파일러는 비싸고 셰어웨어도 오늘날의 오픈소스만큼 구하기 쉽지 않던 시절 Z80으로 시작했음. 기계에 무엇을 시키는지 이해하려면 누구나 어셈블리어를 조금은 배워야 하며, Z80은 추론하기에 충분히 단순했음

  • 35년 전에는 프로그램을 손으로 어셈블해 16진수 기계어를 보드에 입력해야 했음. 이를 편하게 하려고 어셈블러를 직접 작성했고, 그 경험이 개발 도구 분야를 거쳐 주요 C++ 컴파일러 작업으로 이어졌음

    • 1980년대에는 나를 포함해 많은 사람이 Z80 명령어의 16진수 코드를 기호식 어셈블리어만큼 쉽게 읽을 수 있었음. Microsoft CP/M BASIC 인터프리터나 FORTRAN 컴파일러를 역공학할 때 매우 유용했음
    • 그런 작업은 1970년대 후반 이야기 같지만 실제로는 1991년이었음. 프로그램이 매 순간 정확히 무엇을 하는지 알 수 있다는 점은 멋졌지만, 복잡한 것을 구현하려면 상당한 고역이었음
    • 어셈블리어를 CPU가 이해하는 유일한 언어인 기계어로 직접 변환한 것임
  • 지금도 미국 학생 수백만 명이 사용하며 BASIC으로 프로그래밍할 수 있는 TI-84 계산기가 빠졌음. 흑백 모델은 Z80, 컬러 화면 모델은 eZ80을 사용함

    • 유럽에서도 고등학교가 TI-84 Plus 구매를 지정했고, 지금도 매장에서 판매되는 것으로 보아 계속 사용 중인 듯함
      친구들과 TI-BASIC으로 작은 프로그램을 만들어 자랑하며 많은 시간을 보냈지만 Z80 어셈블리어까지 배우지는 못했음. TI-84 Plus용 Z80 어셈블리어 설명서를 전부 출력해 읽기 시작했지만 아직 한 줄도 작성하지 못했음
    • TI-84+ 는 가장 좋아하는 레트로 컴퓨터 중 하나일지도 모름
    • 내 것은 TI-83이었으며 그런 고급 기술은 없었음