모토로라 68000

섬네일
**모토로라 68000**(Motorola 68000, **MC68000**)은 모토로라(현재 반도체 사업 부분은 프리스케일 세미컨덕터로 독립)가 개발한 16/32비트 CISC 마이크로프로세서로 1979년 HMOS 공정을 사용한 첫 제품이 출시된 이후 여러 방면에서 널리 사용되었다.

## 역사
68000은 1976년 MACSS(Motorola Advanced Computer System on Silicon) 프로젝터에서 시작되어 고성능을 위해 기존의 6800과의 호환성을 고려하지 않고 완전히 새로운 아키텍처로 개발되었다. 그 결과 6800의 주변 장치들을 사용하기 위한 버스 프로토콜 호환 모드만이 남게 되었다. 설계자들은 앞으로의 32비트 명령어 아키텍처에 중점을 두었는데 CPU 레지스터가 32비트로 구성되어있는 것이 그 증거이다. MACSS 팀은 PDP-11과 VAX 시스템같은 미니컴퓨터 프로세서의 설계에 영향을 받아 비슷한 구조로 설계하게 되었다.

1960년대 중반 8비트 프로세서 제조사들은 16비트 제품을 개발하느라 경쟁하고 있었다. 내셔널 세미컨덕터는 1973-1975년 IMP-16과 PACE 프로세서를 개발하였지만 성능에 문제가 있었는데 1977년 인텔 8086이 출시되어 인기를 얻었다. 경쟁자들이 엎치락뒤치락하는 동안 16비트 전쟁에 늦게 뛰어든 모토로라는 만회할 무기로 더 많은 트랜지스터 집적과 32비트 매크로 명령어를 도입해 갈채를 받았다.

오리지널 MC68000는 HMOS 3.5µm 공정으로 제조되었는데 초기 엔지니어링 샘플은 1979년 말 출시되었으며 1980년 양산되기 시작하여 초기 제품의 속도는 4, 6, 8MHz였다. 1981년 10&nbsp;MHz, 1982년 12.5&nbsp;MHz 제품이 출시되었으며 오리지널 HMOS 칩 중 가장 빠른 16.67&nbsp;MHz "12F" 버전은 1980년대 말까지 출시되지 못했다.

68000은 고성능 설계로 말미암아 썬 워크스테이션과 아폴로/도메인 워크스테이션을 포함한 유닉스 계열 워크스테이션의 주요 CPU로 사용되었다. 또한 아미가나 아타리 ST, 애플 리사(Lisa)와 매킨토시같은 초창기 컴퓨터에서도 찾아볼 수 있으며 애플 레이저라이터(LaserWriter) 데스크톱 레이저 프린터에도 사용되었다.

1982년에는 가상 메모리 지원을 포함해 Popek과 Goldberg 가상화를 추가한 68010을 출시하였으며 32비트 어드레스 버스를 가진 더 확장된 버전의 68012도 출시하였다. 또한 저가형으로 8비트 데이터 버스와 20비트 어드레스 버스를 가진 68008도 출시하였다. 1982년이후 모토로라는 68020과 88000 개발에 힘을 기울였다.

### 세컨드 소스
히타치 (HD68000), 모스텍 (MK68000), 락웰 (R68000), 시그네틱스 (SCN68000), 톰슨/SGS-톰슨 (EF68000 나중에 TS68000로 변경), 도시바 (TMP68000) 같은 다른 회사들도 세컨드 소스로 HMOS 68000을 제조하였다. 도시바는 CMOS 68HC000 (TMP68HC000)의 세컨드 소스 제조사이기도 하다.

### CMOS 버전
68HC000은 68000의 CMOS 버전으로 히다치가 설계하여 1985년 공동으로 출시하였는데 모토로라 버전은 MC68HC000, 히다치는 HD68HC000로 표기했다. 68HC000은 8 ~ 20&nbsp;MHz 속도로 출시되었으며 CMOS 회로를 사용했음에도 HMOS MC68000과 동일했지만 소모 전력은 크게 줄어들었다. 오리지널 HMOS MC68000은 25&nbsp;°C의 온도에서 사용시 클럭 속도에 상관없이 1.35와트의 전력을 소비하는 반면 MC68HC000는 8&nbsp;MHz 제품은 0.13와트, 20&nbsp;MHz 제품은 0.38와트의 전력만을 소비한다. (CMOS 회로와 다르게 HMOS는 아이들시에도 전류가 흐르기 때문에 클럭 속도에 따라 전력 소모의 차이가 적다.)

모토로라는 1990년 MC68008을 MC68HC001로 교체하였다. 이 칩은 68HC000과 대부분 비슷한데 리셋시 데이터 버스 핀에 입력되는 신호에 따라 데이터 버스가 16비트나 8비트 모드로 동작한다. 그래서 68008과 같이 값 싼 8비트 메모리를 사용할 수 있다.

68000은 임베디드 컨트롤러로도 변화하였는데 68EC000와 SCM68000는 어드레스 버스를 32비트로 확장하였고 M6800 주변기기 버스를 없애고 유저 모드 프로그램에서 SR의 MOVE 명령어를 삭제하였다. 1996년 모토로라는 완전한 스태틱 회로로 저전력 모드에서 0.5 µW의 전력만 소비하는 MC68SEC000을 출시하였다.

1996년 모토로라는 HMOS MC68000와 MC68008의 생산을 멈추었지만 모토로라에서 분리된 프리스케일 세미컨덕터에서 MC68HC000과 MC68HC001, MC68EC000, MC68SEC000을 비롯해 MC68302와 MC68306 마이크로컨트롤러, 드래곤볼 시리즈를 판매하고 있으며 68000 아키텍처의 후계로 680x0, CPU32, 콜드파이어 또한 판매하고 있다.

### 마이크로컨트롤러 코어
68000은 진짜 32비트 마이크로프로세서로서 성공한 이후 많은 마이크로컨트롤러 코어로도 사용되었다. 1989년 모토로라는 MC68302 통신 프로세서를 출시하였다.

## 사용처
68000은 1980년대 초에는 고가 시스템에 사용되었다. WICAT 150 https://web.archive.org/web/20121012060639/http://www.old-computers.com/museum/computer.asp?c=254 과 초기의 Alpha Microsystems 컴퓨터, 탠디 TRS-80 Model 16, Fortune 32:16같은 멀티유저 마이크로컴퓨터와 휴렛 팩커드의 HP 9000 시리즈 200 시스템, 최초의 Apollo/Domain 시스템, 썬 마이크로시스템즈의 Sun-1, Corvus Concept같은 싱글유저 워크스테이션, DEC(Digital Equipment Corporation)의 VAXstation 100, 실리콘 그래픽스 IRIS 1000/1200같은 그래픽 단말기 등이 포함된다. 이후 유닉스 시스템들은 더 강력한 68K의 후속 제품을 사용하였다.

1980년대 중반에는 개인용 컴퓨터와 가정용 컴퓨터에 사용되었는데 애플의 리사(Lisa)와 매킨토시를 시작으로 코모도어 아미가, 아타리 ST, 샤프 X68000 등에 사용되었다. 68008을 사용한 컴퓨터로는 Sinclair QL과 그 자매품인 ICL One Per Desk이 있다.

68000은 컨트롤러로도 널리 사용되었는데 1981년초 Imagen Imprint-10 레이저 프린터는 68000이 내장된 외부 컨트롤러로 작동되었다. 최초의 HP 레이저젯(LaserJet)은 1984년 출시되었는데 8&nbsp;MHz 68000이 내장된 컨트롤러를 사용하였다. 이와 유사한 68000 기반의 통합 컨트롤러는 1985년 출시된 최초의 포스트스크립트 레이저 프린터인 애플 레이저라이터(LaserWriter)를 비롯해 많은 레이저 프린터에서 사용되었다. 68000은 1980년대 말까지 레이저 프린터에 폭넓게 사용되었고 1990년대에도 저가형 프린터에는 계속 사용되었다.

기업용이나 가정용 컴퓨터 외에도 68000은 산업용 제어 시스템 영역에서도 널리 사용되었다. 이런 시스템에는 68000과 거기에서 파생된 프로그래머블 로직 컨트롤러(PLC)가 주로 사용되었다. 그러한 시스템의 사용자는 구식 제품일지라도 일반 사용자처럼 사용 중단하는 일이 없어서 설치된 지 20년이 넘었어도 계속 사용하는 경우가 많으며 21세기가 되어도 많은 68000 기반의 컨트롤러가 안정적으로 작동하고 있다.

기술의 발전으로 68000이 컴퓨터 시장에서 단독으로 사용되는 일은 없어졌지만 컨슈머(consumer)와 임베디드 용도에서는 사용이 증가하였다. 비디오 게임 제조사들은 아케이드 게임과 가정용 게임 콘솔에 68000을 주력으로 사용하였다. 아타리가 1983년 출시한 푸드 파이트(Food Fight)는 68000을 사용한 첫 번째 아케이드 게임이다. 68000은 1980년대 말에서 1990년대 초까지 아케이드 게임기의 메인 CPU로 사용되었는데 그 예로 세가의 시스템 16, 캡콤의 CPS-1과 CPS-2, SNK의 네오지오 등이 있다. 아웃런같이 다수의 아케이드 시스템에서는 2개이상의 68000을 사용했다. 68000은 90년대까지 아케이드 시스템에 널리 사용되었으며 2000년대 초에도 IGS PGM같은 기기에 사용되었다.

68000은 1980년대 말 ~ 1990년대 초반의 가정용 게임 콘솔에 핵심 프로세서로 사용되었는데 세가의 메가 드라이브와 메가 CD, 가정용 게임기 버전의 네오지오 등이 있다. 최근의 게임 콘솔에서는 메인 CPU 외에 다른 용도로 사용되는 경우가 있는데 세가 새턴에서는 사운드 제어용으로, 아타리 재규어에서는 그래픽과 사운드 칩 제어용으로 사용된다.

68000 기반의 683XX 마이크로컨트롤러는 네트워크/전화 설비, 텔레비전 셋탑 박스, 실험실과 의료 기기 등 다용도로 널리 사용되었다. MC68302는 Cisco, 3com, Ascend, Marconi, Cyclades등의 통신 기기에서 사용되었으며 드래곤볼 시리즈는 팜 컴퓨팅의 팜(Palm) PDA와 핸드스프링 바이저 시리즈에서 사용되었으나 팜은 점차 ARM 프로세서로 바뀌게 된다. 휴대형 워드프로세서인 알파스마트(AlphaSmart)의 후기 모델도 드래곤볼을 사용했다.

텍사스 인스트루먼트는 TI-89과 TI-92, Voyage 200 같은 고급형 그래픽 계산기에 68000을 사용하였는데 초기 버전은 스태틱 68EC000 코어의 전용 마이크로컨트롤러를 사용하였지만 나중에는 MC68SEC000 프로세서를 사용했다.

## 아키텍처
### 어드레스 버스
68000은 24비트의 외부 어드레스 버스를 가지고 있지만 A0 핀은 2가지 바이트 선택 신호로 대체할 수 있기 때문에 16 MB의 실제 메모리를 바이트 단위로 이용 가능하다. 어드레스의 저장과 계산은 32비트지만 핀 부족으로 상위 바이트는 무시된다. 또한 32비트의 플랫(flat) 메모리 공간을 사용하는 소프트웨어를 실행할 수 있는데 현대적인 정의로 이것은 68000이 32비트 마이크로프로세서라는 의미가 된다. 모토로라가 내부 32비트 어드레스를 채용한 의도는 소프트웨어 작성에서 상위 호환성을 염두에 둔 것이다.

하지만 이점은 프로그래머들이 호환성없는 프로그램을 제작하는 것을 예방하지는 못했다. 24비트 소프트웨어는 상위(upper) 어드레스 바이트를 무시하거나 어드레싱 용도외에 다른 용도로 사용되었기 때문에 32비트 68K에서는 실행할 수 없었다.

### 내부 레지스터
68000에는 32비트 범용 데이터 레지스터 8개(D0-D7)와 어드레스 레지스터 8개(A0-A7)가 있는데 마지막 A7 어드레스 레지스터는 스택 포인터로도 사용된다. 내장된 레지스터 수는 여러 가지로 적당한 숫자였는데 68000이 인터럽트에 재빨리 응답하기에 충분한 정도로 작고 대부분의 연산을 빠르게 실행하는데 충분한 만큼 컸다.

데이터와 어드레스 2종류의 레지스터는 당시에는 생소한 것이었지만 배우고 사용하는데 어렵지는 않았다. 들리는 바에 따르면 데이터와 어드레스를 나눔으로서 설계자들이 더 높은 수준으로 어드레스 레지스터 보조 실행 유닛의 병렬화를 설계하는데 기여했다고 한다. 또 68000 시리즈의 정수 표시는 빅엔디언 방식을 사용한다.

### 상태(Status) 레지스터
68000은 비교, 산술 연산과 논리 연산에서 그 결과를 상태 레지스터에 비트 플래그로 설정해 나중에 조건 분기에서 사용할 수 있다. 비트 플래그에는 e**X**tend, **N**egative, **Z**ero, o**V**erflow, **C**arry 가 있다. 이중 eXtend 플래그는 다정밀도(Multiprecision)의 산술 연산과 논리, 시프트 연산에서 특별한 비트로 사용된다.

### 명령어 셋
설계자들은 어셈블리어가 직교성(orthogonal)을 가지도록 시도하였다. 명령어는 오퍼랜드와 어드레스 모드로 구별되며 대부분의 어드레스 모드는 모든 명령어를 사용할 수 있다. 비트 레벨에서 어셈블러로 작성된 명령어가 어떤 오프코드(op-code)로 변환되는지 명확히 알 수 있는데 이것은 직교성 있는 머신으로의 편의성과 CPU 설계자들이 오프코드 표를 자유롭게 작성하는데 좋은 타협점이 되었다.

56개의 명령어만이 최소 크기의 명령어로 당시에는 거대한 16비트 크기였다. 더군다나 많은 명령어와 어드레스 모드에는 어드레스와 어드레스 모드 비트등을 담은 여분의 워드(word)를 추가로 사용한다. 많은 설계자들은 MC68000 아키텍처가 비용에 걸맞은 컴팩트한 코드를 생성한다고 믿고 있었는데(특히 컴파일러로 코드를 생성할 경우) 이 컴팩트한 코드에 대한 믿음은 아키텍처가 널리 오랫동안 사용하게 되는데 도움이 되었다. 이러한 믿음 혹은 특징은 ARM 아키텍처의 썸(Thumb) 명령어 셋이 발표될 때까지 계속 이어졌다.

### 특권 레벨
이 CPU와 이후 모든 시리즈는 2종류의 특권 레벨을 가지는데 유저 레벨은 인터럽트 레벨의 컨트롤을 제외한 모든 액세스가 가능하며 슈퍼바이저(Supervisor) 레벨은 모든 액세스가 가능하다. 인터럽트가 발생하면 슈퍼바이저 모드로 변경된다. 슈퍼바이저 비트는 상태 레지스터에 저장되며 유저 프로그램에서 볼 수 있다.

이 시스템의 장점으로 슈퍼바이저 레벨은 별도의 스택 포인터를 가진다는 점이다. 이것은 멀티태스킹 시스템에서 작업(task)에 사용되는 스택의 크기를 줄일 수 있는데 설계자가 인터럽트의 최대 스택 프레임을 고려해 메모리를 할당할 필요가 없었다.

### 인터럽트
이 CPU에는 7단계의 인터럽트 레벨이 있는데 레벨 1에서 7까지 우선권이 있다. 높은 숫자의 인터럽트는 낮은 숫자의 인터럽트에 언제나 끼어들 수 있다. 상태 레지스터에서 특권 명령어로 인터럽트 레벨을 설정할 수 있으며 낮은 우선권을 가진 인터럽트는 차단할 수 있다. 인터럽트 레벨 7은 NMI(non-maskable interrupt)로 끼어들거나 차단할 수 없다. 인터럽트 레벨은 상태 레지스터에 저장되며 유저 레벨의 프로그램으로 볼 수 있다.

하드웨어 인터럽트는 인터럽트 우선 순위에 따라 인코드되어 3개의 신호로 CPU에 전달된다.별도의 인터럽트 컨트롤러는 일반적으로 인터럽트 인코딩에 필요하지만 시스템에 3개이하의 하드웨어 인터럽트를 사용할 경우 직접 연결해 인터럽트 신호를 입력받을 수 있지만 소프트웨어의 복잡성이 증가한다. 인터럽트 컨트롤러는 간단한 74LS148 우선권 인코더부터 MC68901과 같이 UART와 타이머, 병렬 I/O 기능이 포함된 다기능 VLSI 주변 칩 등도 사용할 수 있다.

예외 테이블(인터럽트 벡터 어드레스)는 어드레스 0에서 1023까지로 고정되어 있으며 256개의 32비트 벡터로 표시된다. 첫 번째 벡터는 시동 스택 어드레스이며 두 번째는 시동 코드 어드레스이다. 벡터 3부터 15는 각종 에러 보고에 사용되는데 버스 에러나 어드레스 에러, 부정 명령어, 0으로 나눗셈, CHK과 CHK2 벡터, 특권 위반, 그리고 Line 1010 에뮬레이터, Line 1111 에뮬레이터와 하드웨어 정지지점(breakpoint)같은 예약된 벡터가 포합된다. 벡터 24부터 실제 인터럽트가 시작되는데 하드웨어에서 인정되지 않는 가짜(spurious) 인터럽트, 레벨 1에서 7까지의 벡터, 15개의 트랩 벡터, 몇가지의 예약된 벡터, 사용자 정의 벡터의 순서로 나열된다.

리셋시에는 최소한 시동 코드 어드레스 벡터에 유효한 어드레스가 있어야 하기 때문에 시스템에서는 일반적으로 0번지에 들어갈 벡터와 부트스트랩 코드를 저장한 비휘발성 메모리(ROM 같은)를 장착하고 있다. 하지만 일반적인 시스템에서는 실행중인 운영체제가 벡터를 변경할 수 있도록 하는 게 바람직하다. 이것을 실현하기 위해 ROM의 벡터가 RAM의 점프 테이블을 가리키거나 뱅크 스위칭으로 RAM을 ROM으로 대체하여 사용하기도 한다.

68000은 Popek과 Goldberg의 가상화 요구 조건과 일치하지 않는데 그 이유는 유저 모드 소프트웨어가 특권 상태를 읽어들일 수 있고 특권이 없는 "MOVE from SR" 명령어 하나 때문이었다.

68000은 가상 메모리 지원이 불가능했는데 이것은 메모리 액세스 실패시 트랩과 복구 기능이 필요했다. 68000은 트랩에 사용되는 버스 에러 예외를 준비해 놓았지만 운영체제에서 예외 사항을 처리하는 경우 잘못된 명령어를 다시 시작하기 위한 프로세서의 상태를 저장하지 않았다. 몇몇 회사는 2개의 68000칩을 사용해 가상 메모리가 작동하는 유닉스 워크스테이션을 제작하기도 하였다. "leading" 68000가 잘못된 메모리 액세스를 접하면 "main" 68000가 잘못된 메모리 액세스하는 것을 방지하기 위해 끼어들어 가상 메모리 기능을 처리하고 올바른 상태를 유지하게 되면 인터럽트를 반환해서 "main" 68000를 작동시켰다.

이런 문제점들은 MC68010에서 수정되었다. 버스 에러와 어드레스 에러가 발생할 경우 내부 상태를 슈퍼바이저 스택에 밀어 넣는 것으로 본래의 작업으로 복귀가 가능했다. “MOVE from SR” 명령어는 특권 명령어로 변경되었고 유저 모드 소프트웨어 용도로 특권없는 명령어 "MOVE from CCR"이 추가되어 운영체제에서 트랩과 유저모드에서 “MOVE from SR” 명령어를 에뮬레이터 할 수 있었다.

## 어드레스 모드
기본적인 어드레스 모드는 다음과 같다.

* 레지스터 직접 지정 (Register direct)
** 데이터 레지스터, 예 "D0"
** 어드레스 레지스터, 예 "A6"
* 레지스터 간접 지정 (Register indirect)
** 단순 레지스터 (Simple address), 예 (A0)
** 후증가 어드레스 (Address with post-increment), 예 (A0)+
** 전감소 어드레스 (Address with pre-decrement), 예 -(A0)
** 16비트 부호 오프셋 어드레스 (Address with a 16-bit signed offset), 예 16(A0)
** 8비트 부호 오프셋 인덱스 레지스터 간접 지정 (Indexed register indirect with 8-bit signed offset) 예 8(A0, D0) 또는 8(A0, A1)

(A0)+ 과 -(A0)에서 실제로 증가되거나 감소되는 값은 피연산자의 크기에 따라 결정된다. 바이트 액세스시에는 어드레스 레지스터가 1 증가하며 워드일 때는 2, 롱(32비트)일 때는 4 증가한다.

* 프로그램 카운터 상대 지정 (Program counter relative with displacement)
** 16비트 부호 오프셋 (Relative 16-bit signed offset), 예 16(PC). 이 모드는 매우 유용하다.
** 인덱스 8비트 부호 오프셋 (Relative with 8-bit signed offset with index), 예 8(PC, D2)
* 절댓 어드레싱 (Absolute memory location)
** "$4000"같은 수치나 어셈블러가 번역하는 상직적인 이름(symbolic name)
** 68000 어셈블러는 16진수를 표시하는 기호로 "0x" 보다는 "$"를 사용한다.
* 즉시 모드 (Immediate mode)
** 명령어에 데이터가 포함된다, 예 "#400".
* 빠른 즉시 모드 (Quick Immediate mode)
** 오프코드에 데이터 값으로 속도가 빠르다.
** addq와 subq, 3비트의 부호없는 정수값 (0 ~ 8)
** moveq, 8비트의 부호 정수값 (-128 ~ 127), 예 moveq.l #0,d0는 clr.l d0 보다 빠르다.

추가: 상태 레지스터로의 액세스, 이후 모델에서는 다른 특수 레지스터도 같다.
## 명령어 셋
대부분 명령어에는 처리 단위로서 점 문자의 접미사가 붙는데 8비트 byte (".b"), 16비트 word (”.w”), 32비트 long (”.l”)으로 지정한다

대부분 명령어는 출발지(source)와 목적지(destination)를 가지며 목적지는 변경할 수 있다. 주요 명령어는 다음과 같다.

* 산술 연산: ADD, SUB, MULU (부호없는 수치 곱셈), MULS (부호있는 수치 곱셈), DIVU, DIVS, NEG (네가티브 덧셈), CMP (뺄셈의 일종으로 상태 비트만 설정하고 결과값은 저장하지 않는다.)
* 이진화 십진(Binary Coded Decimal) 연산: ABCD 와 SBCD
* 논리 연산: EOR (Exclusive OR), AND, NOT, OR
* 시프트 연산:
** 논리 시프트, 오른쪽으로 비트를 이동한 후 최상위 비트를 제로로 채운다: LSL, LSR
** 산술 시프트, 최상위 비트의 부호확장을 한다: ASR, ASL
** eXtend를 사용하거나 사용하지 않는 로테이트(Rotates): ROXL, ROXR, ROL, ROR
* 메모리의 비트 조작(manipulation): BSET (1로 조작), BCLR (0으로 조작), BTST (SR의 Zero비트 설정)
* 멀티프로세서 제어: TAS(test-and-set), 하나의 메모리를 공유하는 다수의 프로세서를 일치시키는 세마포어(semaphore)를 실행하는 분할할 수 없는(indivisible) 버스 연산
* 플로우 제어: JMP (점프), JSR (서브루틴으로 점프), BSR (상대 어드레스에서 서브루틴으로 점프), RTS (서브루틴에서 복귀), RTE (인터럽트같은 예외에서 복귀), TRAP (소프트웨어 인터럽트와 비슷한 소프트웨어 예외를 발생), CHK (조건부 소프트웨어 예외)
* 분기: Bcc (”cc”는 분기 조건으로 16종류의 상태 레지스터의 테스트 조건중 하나를 지정: equal, greater than, less-than, carry, 그리고 상태 레지스터의 모든 조합과 논리 반전)
* 감소 분기 (Decrement-and-branch): DBcc (”cc”은 분기 명령과 같은 의미) 지정한 데이터 레지스터가 감소된 후 지정된 조건이 참이고 감소 결과가 -1이 아니면 분기된다. 0 대신 -1을 체크하는 것은 루프를 작성할 때 코드를 단순화하기 위해서이다. 루프 카운터가 처음부터 0으로 지정되었을 경우 감소되어 -1이 되므로 분기되지 않는다. 따라서 0인지 아닌지를 루프에 들어가기 미리 확인할 필요가 없다.

## 어셈블리어 예제

```68000devpac
; strtolower:
                     ; Copy a null-terminated ASCII string, converting
                     ; all alphabetic characters to lower case.
                     ;
                     ; Entry parameters:
                     ;   (SP+0): Source string address
                     ;   (SP+4): Target string address

                                     org     $00100000       ;Start at 00100000
00100000             strtolower      public
00100000  CE56 0000                  link    a6,#0           ;Set up stack frame
00100004  206E 0004                  movea   4(a6),a0        ;A0 = src, from stack
00100008  226E 0008                  movea   8(a6),a1        ;A1 = dst, from stack
0010000C  1018       loop            move.b  (a0)+,d0        ;Load D0 from (src)
0010000E  0C00 0041                  cmpi    #'A',d0         ;If D0 < 'A',
00100012  650A                       blo     copy            ;skip
00100014  0C00 0059                  cmpi    #'Z',d0         ;If D0 > 'Z',
00100018  6204                       bhi     copy            ;skip
0010001A  0600 0020                  addi    #'a'-'A',d0     ;D0 = lowercase(D0)
0010001E  12E0       copy            move.b  d0,(a1)+        ;Store D0 to (dst)
00100020  66E8                       bne     loop            ;Repeat while D0 <> NUL
00100022  4E5E                       unlk    a6              ;Restore stack frame
00100024  4E75                       rts                     ;Return
00100026                             end
```


## 68EC000
68EC000은 모토로라에서 출시한 마이크로프로세서이다. 68000의 저가형 버전으로 임베디드 컨트롤러용으로 설계되었다. 68EC000은 리셋시 8비트나 16비트로 데이터 버스를 바꿀 수 있다.

이 프로세서는 8 ~ 16&nbsp;MHz 속도로 작동하는데 각각 2,100 ~ 4,376 드라이스톤(Dhrystone)의 성능을 낼 수 있다. EC 시리즈는 부동소수점 장치가 내장되지 않았으며 보조 프로세서 사용에 필수적인 명령어가 삭제되었기 때문에 MC68881/2 FPU 보조 프로세서를 사용하기가 힘들다.

68EC000는 오디오 기기의 컨트롤러로 널리 사용되었는데 엔소닉(Ensoniq) 전자 악기와 사운드카드에 미디 신시사이저의 한 부분으로 사용되었다. 엔소닉 사운드 카드는 CPU를 사용하지 않은 경쟁자들의 제품과 비교해 몇가지 장점이 있었다. CPU는 사용한 카드는 TRS 프로그램을 사용하지 않고도 MPU-401 미디 신서사이즈나 MT-32 에뮬레이션 같은 여러 가지 오디오 작업을 구성, 실행할 수 있었다. 이것은 소프트웨어 호환성이 높고 CPU 사용률이 적으며 컴퓨터의 메모리 사용량도 무시할 수 있었다.

모토로라 68EC000 코어는 모토로라/프리스케일에서 출시한 드래곤볼에 사용되었다.

세가 새턴 게임 콘솔과 90년대 중반 휴렛 팩커드의 레이저젯 프린터용 젯다이렉트(JetDirect) 이더넷 컨트롤러에도 사용되었다.

## 같이 보기
* 모토로라 6800

## 각주

## 참고 문서
* Motorola MC68000 Family Programmer's Reference Manual 
* comp.sys.m68k FAQ

## 외부 링크

* Descriptions of assembler instructions
* 68000 images and descriptions at cpu-collection.de
* 'Chips : Of Diagnostics & Debugging' Article
* A microprocessor simulation framework, useful for working with Motorola 68000 
* Integrated Development Environment for the 68000 microcomputer
* The Vintage Mac Museum: 9inch/mono Display 68000 ONLY
* EASy68K, an open-source 68k assembler for Windows.
* CAST, Inc. (68000 IP provider)

분류:68k 마이크로프로세서
분류:1979년 도입된 제품
분류:32비트 마이크로프로세서