戻る

MC68000

Motorola MC68000
Data 16/32bit / Address Bus 24bit
Cycle 4.0MHz〜20.0MHz
(1980)

姉妹型:「MC68EC000」
外部データバスが8bitの廉価版。
「MC68010」以降で追加された一部命令(BKPTなど)が使用可能。

姉妹型:「MC68008」
外部データバスが8bit、アドレスバスが20bitの廉価版。

後継型:「MC68010」
仮想記憶と仮想マシン実現用の機能などが追加された。

後継型:「MC68020」(参考)
完全に32bit対応をした。
そのため、アドレッシングモードやスーパーバイザーモードで使用できるレジスタが拡張されている。
基本的には互換性があるため、拡張されたアドレッシングに影響しないプログラムはそのまま動くことが多い。
命令キャッシュを持つ。
apple社「Macintosh」、Commodore社「Amiga」などに採用された。

後継型:「MC68030」(参考)
「MC68020」に「MMU」(Memory Managing Unit:メモリ管理装置)を内蔵した。
更にデータキャッシュも追加された。
apple社「Macintosh」、Commodore社「Amiga」、シャープ「X68030」などに採用された。
ただし「X68030」に使用されたのは、「MMU」が削除された「MC68EC030」であったため、「MC68030」に換装するユーザもいた。

後継型:「MC68040」(参考)
「MC68030」に「FPU」(Float Processing Unit:浮動小数点演算装置)を内蔵した。
命令パイプラインを持つ。
apple社「Macintosh」、Commodore社「Amiga」などに採用された。

後継型:「MC68060」(参考)
「MC68040」とピン互換ではあるが、アーキテクチャは新しく設計されている。
「デュアルパイプライン」「スーパースケーラ」を採用し、Intel社の「Pentium」を意識したものになっている。
ただ、この後に発表された「PowerPC」にMotorola社が注力したため、Commodore社「Amiga」など採用は限られてしまった。

●68000のピン配列

D41 64D5
D32 63D6
D23 62D7
D14 61D8
D05 60D9
AS6 59D10
UDS7 58D11
LDS8 57D12
R/W9 56D13
DTACK10 55D14
BG11 54D15
BGACK12 53Vss
BR13 52A23
Vcc14 51A22
CLK15 50A21
Vss16 49Vcc
HALT17 48A20
RESET18 47A19
VMA19 46A18
E20 45A17
VPA21 44A16
BERR22 43A15
IPL223 42A14
IPL124 41A13
IPL025 40A12
FC226 39A11
FC127 38A10
FC028 37A9
A129 36A8
A230 35A7
A331 34A6
A432 33A5

●68000の特徴

アドレッシングモードは「MC6809」より洗練されたといえる。
なお、インクリメント・デクリメントはオペランドのサイズによって変わる。
(アドレッシングの表記はMotorola社準拠のものではなく、X68000のアセンブラに準拠した)

レジスタ直接アドレッシング備考
データレジスタ直接Dn
アドレスレジスタ直接An
レジスタ間接アドレッシング備考
アドレスレジスタ間接(An)
ポストインクリメント付きアドレスレジスタ間接(An)+
プリデクリメント付きアドレスレジスタ間接-(An)
16bitディスプレースメント付きアドレスレジスタ間接$0002(An)
8bitインデックス付きアドレスレジスタ間接$02(An,Dn)
絶対アドレッシング備考
絶対ショート$001000($000000〜$007FFF/$FF8000〜$FFFFFF)
32bit絶対ロング$12345678(任意の値)
プログラムカウンタ相対アドレッシング備考
16bitディスプレースメント付き相対$0002(PC)
8bitインデックス付き相対$02(PC,Dn)
イミディエートデータアドレッシング備考
イミディエート#$12345678
クイックイミディエート#n(n:1〜8)
インプライドアドレッシング備考
インプライドレジスタ命令は固有のアドレッシングしか持たない

●68000のレジスタ構造

レジスタセットは以下の構成となっている。
ステータスレジスタ以外は全て32bitである。
スタックポインタはユーザモード時は「USP」、スーパーバイザモード時は「SSP」が使われる。
(特権状態はMPUの状態で切り替わる)

レジスタ名備考
D0-D7データレジスタ
A0-A6アドレスレジスタ
SP(A7)スタックポインタ(USP/SSP)
PCプログラムカウンタ
SR16bitステータスレジスタ

「SR」で示されるフラグの内容は以下の構成となっている。
上位8bitが「システムバイト」、下位8bitが「ユーザバイト」である。
ユーザモード時はユーザバイトのみが変更可能。

bit略号機能セットされるケース
15Tトレースモードセット時シングルステップ実行モード
13Sスーパーバイザフラグセット時特権モード
10I2割込マスク2-
9I1割込マスク1-
8I0割込マスク0-
以下、ユーザバイト
4X拡張フラグ32bitを超える桁上がり(Carry)が発生した場合
3NマイナスフラグMSB(Most Significant Bit:最上位bit)が「1」の場合 (負数)
2Zゼロフラグ0になった場合
1Vオーバーフローフラグオーバーフローの場合
0CキャリーフラグCarryがあった場合、もしくは桁下がり(Borrow)がない場合

●68000の命令構成

  ニーモニック.size [SRC][,DEST]

データの流れは「SRC」→「DEST」となる。
「.size」はオペランドのサイズ指定。

オペランドは0〜2個。

Dnデータレジスタ直接
Anアドレスレジスタ直接
(An)アドレスレジスタ間接
(An)+ポストインクリメント付きアドレスレジスタ間接
-(An)プリデクリメント付きアドレスレジスタ間接
d16(An)16bitディスプレースメント付きアドレスレジスタ間接
d8(An,Xn)8bitインデックス付きアドレスレジスタ間接
d16.w絶対ショート
d32.l32bit絶対ロング
d16(PC)8bitインデックス付き相対
d8(PC,Xn)16bitディスプレースメント付き相対
#iイミディエート
#qiクイックイミディエート(1〜8)
Xnインデックスレジスタ(Dn,An)
CCRコンディションコードレジスタ(ユーザバイト)
SRスタックレジスタ
USPユーザスタックポインタ
LISTレジスタリスト
LABEL8/16bitラベル(分岐用)
VECベクタ値:0〜15(TRAP割込用)
CR/Rcコントロールレジスタ(MC68010)
Rn汎用レジスタ(Dn,An)(MC68010)

命令セット内の略号は以下の通りである。

dL(Left)/R(Right)ローテーションやシフトなどの方向
ccCondition条件は下表の通り

条件(cc)は以下の通りである。

CC/HSC=0≦:Unsigned
CS/LOC=1>:Unsigned
HIC XOR Z=0<:Unsigned
LSC XOR Z=1≧:Unsigned
VCV=0オーバーフローではない
VSV=1オーバーフロー発生
NE/FZ=0≠0
EQ/TZ=1=0
PLM=0正数
MIM=1負数
GEN XOR V=0≧:Signed
LTN XOR V=1<:Signed
GTZ OR (N XOR V)=0>:Signed
LEZ OR (N XOR V)=1≦:Signed

●68000の命令セット

命令(ニーモニック)は以下の構成となっている。
「特権命令」はスーパーバイザーモード時で実行可能であり、ユーザモード時は「特権命令違反」となる。

●レジスタ操作命令

ニーモニックサイズOP1OP2アドレッシングモード説明
MOVE.bwlSRC,DESTDnAn(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l#id16(PC)d8(PC,Xn)データをロード(読込)
Dn-(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l---
.wSRC,CCRDn-(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l#id16(PC)d8(PC,Xn)
.wSRC,USPDn-(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l---(特権命令)
.wUSP,DESTDn-(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l---(特権命令)
[MC68010]
.wCCR,DESTDn-(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l---
.wSRC,SRDn-(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l---(特権命令)
[MC68EC000/MC68010]
.wSR,DESTDn-(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l---(特権命令)
MOVEQ.l#qi,Dn------------クイック即値をロード
MOVEA.wlSRC,AnDnAn(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l#id16(PC)d8(PC,Xn)アドレスをロード
MOVEM.wlLIST,DEST--(An)--(An)d16(An)d8(An,Xn)d16.wd32.l---複数レジスタを転送
SRC,LIST--(An)(An)+-d16(An)d8(An,Xn)d16.wd32.l-d16(PC)d8(PC,Xn)
MOVEP.wlDn,d16(An)------------(ペリフェラル)データを転送
d16(An),Dn------------
[MC68010]
MOVEC.lRc,Rn------------CRを転送(特権命令)
  Rn,Rc------------(特権命令)
[MC68010]
MOVES.bwlSRC,Rn--(An)(An)+-d16(An)d8(An,Xn)d16.wd32.l---CRを転送(特権命令)
  Rn,DEST--(An)(An)+-d16(An)d8(An,Xn)d16.wd32.l---(特権命令)
LEA.lSRC,An--(An)--d16(An)d8(An,Xn)d16.wd32.l-d16(PC)d8(PC,Xn)アドレスをロード
PEA.lSRC --(An)--d16(An)d8(An,Xn)d16.wd32.l-d16(PC)d8(PC,Xn)アドレスをプッシュ
EXT.wlDn ------------符号拡張
CHK.wSRC,DnDn-(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l#id16(PC)d8(PC,Xn)レジスタチェック
SWAP.wDn ------------レジスタの上位・下位を交換
EXG.lDn,Dn------------レジスタ交換
SRC,AnDnAn----------

●算術演算命令

ニーモニックサイズOP1OP2アドレッシングモード説明
ADD.bwlSRC,DnDnAn(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l#id16(PC)d8(PC,Xn)加算(データ)
Dn,DEST--(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l---
ADDA.wlSRC,AnDnAn(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l#id16(PC)d8(PC,Xn)加算(アドレス)
ADDI.bwl#i,DESTDn-(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l---加算(即値)
ADDQ.bwl#qi,DESTDn-(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l---加算(クイック即値)
ADDX.bwlSRC,DnDn-----------拡張付き加算(データ)
-(An)DEST -----(An)-------
SUB.bwlSRC,DnDnAn(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l#id16(PC)d8(PC,Xn)減算(データ)
Dn,DEST--(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l---
SUBA.wlSRC,AnDnAn(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l#id16(PC)d8(PC,Xn)減算(アドレス)td>
SUBI.bwl#i,DESTDn-(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l---減算(即値)
SUBQ.bwl#qi,DESTDn-(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l---減算(クイック即値)
SUBX.bwlSRC,DnDn-----------拡張付き減算(データ)
-(An)DEST -----(An)-------
MULS.wSRC,DnDn-(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l#id16(PC)d8(PC,Xn)符号付き乗算(データ)
(上位16bitと下位16bitを乗算)
MULU.wSRC,DnDn-(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l#id16(PC)d8(PC,Xn)符号なし乗算(データ)
DIVS.wSRC,DnDn-(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l#id16(PC)d8(PC,Xn)符号付き除算(データ)
(上位16bitに剰余、下位16bitに商を格納)
DIVU.wSRC,DnDn-(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l#id16(PC)d8(PC,Xn)符号なし除算(データ)
ABCD.bSRC,DnDn-----------拡張付きBCD加算
-(An)DEST -----(An)-------
SBCD.bSRC,DnDn-----------拡張付きBCD減算
-(An)DEST -----(An)-------
NBCD.bSRC Dn-(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l---拡張付きBCD符号反転

●論理演算命令

ニーモニックサイズOP1OP2アドレッシングモード説明
AND.bwlSRC,DnDn-(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l#id16(PC)d8(PC,Xn)論理積(データ)
Dn,DEST--(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l---
ANDI.bwl#i,DESTDn-(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l---論理積(即値)
.b#i,CCR------------
.w#i,SR------------(特権命令)
OR.bwlSRC,DnDn-(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l#id16(PC)d8(PC,Xn)論理和(データ)
Dn,DEST--(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l---
ORI.bwl#i,DESTDn-(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l---論理和(即値)
.b#i,CCR------------
.w#i,SR------------(特権命令)
EOR.bwlDn,DESTDn-(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l---排他的論理和(データ)
EORI.bwl#i,DESTDn-(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l---排他的論理和(即値)
.b#i,CCR------------
.w#i,SR------------(特権命令)
NOT.bwlSRC Dn-(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l---否定(データ)
NEG.bwlSRC Dn-(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l---符号反転(データ)
NEGX.bwlSRC Dn-(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l---拡張付き符号反転(データ)

●ビット操作命令

ニーモニックサイズOP1OP2アドレッシングモード説明
ROd.bwlSRC,DnDn--------#i--拡張なしローテーション
SRC --(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l---
ROXd.bwlSRC,DnDn--------#i--拡張付きローテーション
SRC --(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l---
ASd.bwlSRC,DnDn--------#i--算術シフト
SRC --(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l---
LSd.bwlSRC,DnDn--------#i--論理シフト
SRC --(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l---
BTST.blDn,DESTDn-(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l#id16(PC)d8(PC,Xn)bitテスト
#i,DESTDn-(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l-d16(PC)d8(PC,Xn)
BCHG.blDn,DESTDn-(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l---bitテスト&交換
#i,DESTDn-(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l---
BCLR.blDn,DESTDn-(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l---bitテスト&クリア
#i,DESTDn-(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l---
BSET.blDn,DESTDn-(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l---bitテスト&セット
#i,DESTDn-(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l---
Scc.bSRC Dn-(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l---条件付きセット
CLR.bwlSRC Dn-(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l---SRCをクリア
TST.bwlSRC DnAn(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l#id16(PC)d8(PC,Xn)テスト
TAS.bwlSRC Dn-(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l---テスト&セット
CMP.bwlSRC,DnDnAn(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l#id16(PC)d8(PC,Xn)比較(データ)
CMPA.bwlSRC,AnDnAn(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l#id16(PC)d8(PC,Xn)比較(アドレス)
CMPI.bwl#i,DESTDn-(An)(An)+-(An)d16(An)d8(An,Xn)d16.wd32.l-d16(PC)d8(PC,Xn)比較(即値)
CMPM.bwl(An)+(An)+------------メモリ比較

●分岐命令

ニーモニックサイズOP1OP2アドレッシングモード説明
Bcc.bwLABEL ------------条件分岐
DBcc.wDn,LABEL------------Dnをデクリメント
Dnが負数になるまで条件分岐
DBFはDBRAと同等
BRA.bwLABEL ------------分岐
BSR.bwLABEL ------------サブルーチンコール
DBRA.wDn,LABEL------------Dnをデクリメント
Dnが負数になるまで分岐
JMP-SRC --(An)--d16(An)d8(An,Xn)d16.wd32.l-d16(PC)d8(PC,Xn)ジャンプ
JSR-SRC --(An)--d16(An)d8(An,Xn)d16.wd32.l-d16(PC)d8(PC,Xn)サブルーチンジャンプ
RTS- ------------サブルーチンリターン
RTR- ------------サブルーチンリターン(CCR復帰)
RTE- ------------エラー処理ルーチンからリターン(特権命令)
RTD- ------------サブルーチンリターン(領域解放)

●その他命令

ニーモニックサイズOP1OP2アドレッシングモード説明
LINK.wAn#i------------アドレスをプッシュ(領域確保)
UNLK-An ------------アドレスをポップ(領域解放)
TRAP-#VEC ------------TRAP割込発生(特権モード移行など)
TRAPV- ------------V=1の時、TRAP7割込発生(特権命令)
ILLEGAL- ------------エラー処理(TRAP4)発生
RESET- ------------外部デバイスにRESET信号送信(特権命令)
STOP-#i ------------即値をSRにロードして割込待ち(特権命令)
NOP- ------------何もしない
[MC68EC000/MC68010]
BKPT-#i ------------ブレイクポイント設定(#i:0〜7)

[TOPに戻る]