コンピュータアーキテクチャ 参考資料;pdf

コンピュータアーキテクチャ
参考資料
1. この授業で勉強すること
1.1. 今までに勉強したこと
組み合わせ論理回路 … 加算器、比較器など
電子の
半導体
素子
振る舞い
論理素子
(入力のみによって結果が決まる)
(NAND
など)
(トランジ
スタなど)
電子デバイスで勉強
順序論理回路 … FF, レジスタ、カウンタ,
パルス発生器など
(入力と状態によって結果が決まる)
ディジタル回路で勉強
1.2. この授業で勉強すること
論理回路
コンピュータ
• コンピュータの動作原理(機械語)
• アセンブラ(アセンブリ言語)
• I/O(入出力)装置の制御
• 各自,自由なテーマで周辺機器を用いたプログラム作成
2. コンピュータの基本構成
データの流れ
入力装置
記憶装置
命令
出力装置
演算装置
制御信号の流れ
制御装置
1
3. ストアドプログラム方式
「あらかじめ情報処理の方式や順序
情報処理の方式や順序を数値データに変換
記憶装置に記憶
情報処理の方式や順序 数値データに変換し、記憶装置に
数値データに変換
記憶装置に記憶させ、この命令デ
記憶
ータに従って時系列的
時系列的に処理装置を稼動
稼動させる方式」
時系列的
稼動
【例】3+4 → [20 番地]
記憶装置(メモリ)
アドレス
(番地)
0
1
2
3
4
5
99
3
4
20
2
7(3+4)
命令表(0~255)
コード
(機械語)
20
内容
(次の番地の内容)+(次の次の番地の内
99 容)の結果を次の次の次に書いてある番地
に格納
2 STOP
8bit(0∼255)
4. マイコンの構成
4.1. CPU 8085A
C
P
U
演算
制御
記憶
(レジスタ)
アドレスバス(16 本) A0∼A7, A8∼A15
メモリ
データバス(8 本)
I/O装置
D0∼D7
コントロールバス
• 8bit…データバスが 8 本
28、0∼255 の数を表現可能
• アドレスバス…16 本、216=64K、64K 個の番地を指定可能
• 構成…
演算 ALU(算術論理装置)
制御 タイミング制御部、割り込み制御部、シリアル I/O 制御部
メモリの一部 レジスタ群
2
4.2. レジスタ群
CPU
データバス(8bit)
8bit
命令レジスタ
命令デコーダ
マシンサイクル
エンコーダ
アドレス
A レジスタ
F レジスタ
0
99
B
C
1
3
D
E
2
4
H
L
3
20
4
2
SP(スタックポインタ)
各種制御信号生成
(制御装置)
PC(プログラムカウンタ)
アドレスバス
(16bit)
16bit
5
メモリ
各部への制御信号
(1) 汎用レジスタ
CPU 8085A には A レジスタ、B レジスタ、C レジスタ、D レジスタ、E レジスタ、H レジス
タ、L レジスタの7つの汎用レジスタ(多目的に利用できるレジスタ)が内蔵されていま
す。これらの各レジスタはそれぞれ 8bit(1 バイト)の記憶容量があります。すなわち、
各レジスタは 8 個の F.F.(フリップフロップ)を並べたものです。
A レジスタは、アキュムレータとも呼ばれます。また B レジスタと C レジスタは、2つま
とめて 16bit のレジスタとして使用することもできます。B レジスタと C レジスタを2つ
まとめて 16bit のレジスタとして使用する場合、BC ペアレジスタと呼びます。同様に D レ
ジスタと E レジスタをまとめて 16bit の DE ペアレジスタとして使用できます。H レジスタ
と L レジスタもまとめて 16bit の HL ペアレジスタとして使用できます。
(2) F レジスタ
F レジスタは、8bit のレジスタです。演算結果が正、零、負、桁上がりなどに対応して、
各 bit の値が自動的に変化します。例えば、演算結果が零であれば、あるビットが1にな
ります。このビットを見れば、演算結果が零であるかどうかを1または0(旗をあげる/
あげない)で知ることができます。このため F レジスタはフラグ(旗を意味する)レジス
タと呼ばれます。
(3) 命令レジスタ
命令レジスタも 8bit のレジスタで、メモリ上に記憶されている命令データ(機械語コー
ド)を一時的に記憶するためのレジスタです。命令レジスタに記憶された機械語コードは
命令デコーダなどで各部への制御信号に変換されます(上図参照)
。
(4) PC(プログラムカウンタ)
プログラムカウンタ(PC)は、次に実行する命令が書かれているメモリの番地(アドレス)
を格納するためのレジスタです。
3
PC は起動時に0にリセットされるため、前ページの図のように、まず0がアドレスバス
を通じてメモリに番地として与えられます。つぎに0番地のデータ(99)がデータバスを通
じて命令レジスタに転送されます。この命令データは、命令デコーダ及び制御装置で各部
への制御信号(タイミングパルス)が生成され命令が実行されます。ここで PC の値は、次
の命令が書かれている番地になるまで(例では4つ)増えます。このような操作をプログ
ラムの終了命令(STOP 命令)があるまで繰り返します。
PC=0
起動
PC の内容がアドレスバスに出力
(PC)番地のメモリの内容がデータバスに出力
命令デコーダ、制御装置
(PC)番地のメモリが指定
命令レジスタ
各種タイミングパルス発生(命令実行)
(PC)←(PC)+α
(5) SP(スタックポインタ)
スタックポインタ(SP)は、割り込み処理やサブルーチンを終了したときに、実行すべき
番地が書かれている番地を格納するためのレジスタで、スタックの一番上の番地を記憶し
ています。
【例1】
1回のサブルーチンコール(SP の初期値が 500 の場合)
メイン
ルーチン
0 番地
サブ
ルーチン
100 番地
(a)
20 番
21 番
(b) リターン時
(PC)←[(SP+1)],[(SP)]
(SP)←(SP)+2
(b)
メモリ
(a) サブルーチンコール時
[(SP−1)],[(SP−2)]←21
(SP)←(SP)−2
(PC)←100
150 番地
498 番地
499
500 番地
メインルーチンでの
スタックの状態(空)
SP の値
(500)
21
500
サブルーチンでの
スタックの状態
4
SP の値
(498)
アドレスを
格納するに
は 2 バイト
必要
【例2】2重のサブルーチンコール(SP の初期値が 500 の場合)
メイン
ルーチン
0 番地
20 番
21 番
(a)
(d)
メモリ
500 番地
メインルーチンでの
スタックの状態(空)
498 番地
499
21
500
サブルーチン 1 での
スタックの状態
496 番地
497
498
499
130
21
500
サブ
ルーチン 1
100 番地
(b)
サブ
ルーチン 2
200 番地
129 番地
130 番地
150 番地
(c)
250 番地
SP の値
(500)
(a) サブルーチン 1 コール時
[(SP−1)],[(SP−2)]←21
(SP)←(SP)−2
(PC)←100
SP の値
(498)
(b) サブルーチン 2 コール時
[(SP−1)],[(SP−2)]←130
(SP)←(SP)−2
(PC)←200
アドレスを
格納するに
は 2 バイト
必要
SP の値
(496)
(c) サブルーチン 1 にリターン時
(PC)←[(SP+1)],[(SP)]
(SP)←(SP)+2
(d) メインルーチンにリターン時
(PC)←[(SP+1)],[(SP)]
(SP)←(SP)+2
サブルーチン 2 での
スタックの状態
5
4.3. 演算部
演 算 結 果
ALU
加算器
A レジスタ
8bit
AND
OR
T レジスタ
NOT
B
C
D
E
H
L
マルチ
プレクサ
フラグ
生成回路
EX-OR
制御信号
F レジスタ
CPU 8085A の場合、T レジスタ(一時レジスタ)に B,C,D,E,H,L などのレジスタの内容が転送
され、演算は A レジスタと T レジスタとの間で行われます。A レジスタと T レジスタの内容は
ALU(Arithmetic and Logical Unit, 演算論理ユニット)に入力され、ALU 内で演算が実行され
ます。ALU には加算器、AND 回路、OR 回路、NOT 回路、EX-OR 回路がそれぞれ 8bit 分内蔵され
ています。どの演算を実行するかは、命令データから生成された制御信号を ALU 内のマルチプ
レクサに与えることによって選択されます。
演算結果は A レジスタに格納されます。例えば A レジスタの初期値が0、B レジスタの初期
値が2の場合、A+B の加算命令を実行する度に A レジスタの内容は 2,4,6,…と結果が累算され
ていくため、A レジスタはアキュムレータ(accumulator,累算器)とも呼ばれています。また
減算なども実行できるように、A レジスタには補数機能、左右シフト機能などが備えられてい
ます。
一方、演算結果はフラグを生成する論理回路にも入力され、Fレジスタに演算結果に対応し
たフラグがセットされます。
4.4. 条件分岐
(1) フラグ
F レジスタ
S
Z
AC
P
CY
MSB
最上位
Z=1
CY=1
S=1
P=1
AC=1
…
…
…
…
…
LSB
最下位
演算結果が0
桁上げあり
MSB が1(2の補数では負)
1 が偶数個
4bit 目から 5bit 目に桁上げあり
6
Z=0
CY=0
S=0
P=0
…
…
…
…
演算結果が0でない
桁上げなし
MSB が0(2の補数では正)
1 が奇数個
(2) 条件判定
【例 1】if(A==B) goto L1; (もし A=B なら L1 番地にジャンプしたいとき)
(a) A-B を計算→フラグが変化(A=B なら演算結果が0になるため、Z=1 になる)
(b) Z=1 なら goto L1
PC←L1
【例2】if(条件) goto L1; (もし条件を満たせば L1 番地にジャンプしたいとき)
(a) A-B を計算→フラグが以下のように変化
符号なし
(0∼255)
符号あり
(-128∼
127)
条件
A = B
A ≧B
A < B
A ≧B
A < B
Z
1
CY
S
0
1
0
1
(b) 以上のフラグを用いて条件分岐を行う。たとえば、if(A<B)goto L1;の場合で A,B の
値を符号なし(unsigned)のときには、CY=1 なら L1 番地にジャンプする命令を実行す
ればよい。
【4bit 符号なしの場合のフラグの変化】
A = B の場合
A > B の場合 1 A > B の場合 2
A
9 1001
9 1001
9 1001
- 9 + 0111
- 7 + 1001 - 1 + 1111
- B
0 10000
2 10010
8 11000
CY=0
CY=0
CY=0
S=0
S=0
S=1
Z=1
Z=0
Z=0
A < B の場合
7 0111
- 9 + 0111
-2 1110
CY=1
S=1
Z=0
【4bit 符号あり(2の補数表現)の場合のフラグの変化】
A = B の場合
A > B の場合 1 A > B の場合 2
A < B の場合
A
6 0110
6 0110
6 0110
2 0010
- 6 + 1010
- 2 + 1110 - (-1) + 0001
- 6 + 1010
- B
0 10000
4 10100
7 0111
-4 1100
CY=0
CY=0
CY=1
CY=1
S=0
S=0
S=0
S=1
Z=1
Z=0
Z=0
Z=0
7
【4bit コード表(参考)
】
2 進数 10 進数(符号なし)10 進数(符号あり)
0000
0
0
0001
1
1
0010
2
2
0011
3
3
0100
4
4
0101
5
5
0110
6
6
0111
7
7
1000
8
-8
1001
9
-7
1010
10
-6
1011
11
-5
1100
12
-4
1101
13
-3
1110
14
-2
1111
15
-1
4.5. 制御入出力信号
【制御入力信号】
RESET IN (36 番ピン)
…0を入力すると、CPU をリセットして、0番地から命令
を実行
(上にバーが付いているときは、負論理なので0を入力する
と RESET される。
)
【制御出力信号】
IO / M (34 番ピン) …入出力装置(I/O)とメモリの区別をする
1が出力されたときは、IO に対する読み書き
0が出力されたときは、メモリーに対する読み書き
RD(32 番ピン)
…0が出力されたとき、CPU が IO あるいはメモリからデータ
を読み込みたいので、データを出力してほしいことを意味
する
WR(31 番ピン)
…0が出力されたとき、CPU が IO あるいはメモリにデータを
出力したので、データを読み込んでほしいことを意味する
8
4.6. CPU とメモリの接続
(1) CPU8085A と 64k 番地×8bit メモリとの接続
メモリ
CPU
64k×8bit
8085A
上位アドレス
A8-A15
ALE
8
A8-A15
下位アドレス
8
A0-A7
データバス
8
D0-D7
ラッチ
AD0-AD7
WE
RD
CS
WR
IO / M
メモリ
WE … 0:書き込み、1:読み込み
CS … 0 を入力したとき、指定された番地のメモリとデータバスを電気的に接続
メモリ WE ← CPU WR
メモリ CS ← CPU M・(RD + WR)
メモリに対する操作でかつ、read または write のとき、Chip Select(CS)すればよ
い。
(2) 2-4 デコーダ(複数のメモリを使用する際に使用するアドレスデコーダなどに使用)
以下の真理値表のように動作するデコーダ回路を示せ。
2-4
入力信号
出力信号
E I1 I2
O3 O2 O1 O0
0
0
0
1
1
1
0
0
0
1
1
1
0
1
0
1
0
1
0
1
1
0
1
1
0
1
1
1
1
0
0
1
1
1
1
1
0
1
1
1
1
1
1
1
0
1
1
1
1
デコーダ
I0
O0
I1
O1
E
O2
O3
9
(3) CPU8085A と 1k 番地×8bit×4個のメモリとの接続
メモリ
CPU
A9
2-4
デコーダ
8085A
A15
A14
A13
A12
A0-A7
O0
D0-D7
I1
O1
WE
CS
O2
メモリ
O3
A9
A10
A8
1k×8bit
A0-A7
A8-A9
ALE
1k×8bit
I0
E
A11
A8
D0-D7
WE
CS
ラッチ
メモリ
AD0-AD7
A9
A8
RD
1k×8bit
A0-A7
D0-D7
WR
WE
CS
IO / M
メモリ
A9
A8
1k×8bit
A0-A7
D0-D7
WE
CS
(4) 同様に CPU8085A と 1k 番地×4bit×4個のメモリとの結線を行え。
CPU
8085A
A15
A14
A13
A8-A9
A12
A0-A7
A11
メモリ0
1k×
4bit
D4-D7
WE
A10
CS
A8-A9
A0-A7
メモリ2
1k×
4bit
D4-D7
WE
CS
A8-A9
ALE
ラッチ
AD4-AD7
AD0-AD3
RD
A8-A9
A0-A7
WR
D0-D3
WE
IO / M
10
メモリ1
メモリ3
1k×
A8-A9
1k×
4bit
A0-A7
4bit
D0-D3
CS
WE
CS
4.7. マシンサイクル([2] p.39∼p.40)
1つの命令 … 数個のマシンサイ
マシンサイクル
マシンサイクル
マシンサイクル … 数個のステート
ステート(クロックパルス1周期分)
ステート
(1) マシンサイクルの種類(一部)
OPECODE FETCH(OF)
命令データの読み込み
MEMORY READ(MR)
(メモリ)→ (A レジスタ)
MEMORY WRITE(MW)
(A レジスタ)→(メモリ)
I/O READ(IOR)
(入出力装置)→ (A レジスタ)
I/O WRITE(IOW)
(A レジスタ)→(入出力装置)
(2) 1234H 番地のメモリの内容(56H)を CPU 内の A レジスタに転送する場合
この命令は、OF マシンサイクルと MR マシンサイクルからなる。また、MR マシンサイクル
は以下の3つのステート(クロック3周期)からなる。以下の図は MR マシンサイクルを表して
いる。
【MR マシンサイクル】
最初のステート(T1)
(1) IO / M が0になり、メモリに対する操作であることが指定さ
れる。A8-A15 には上位アドレス(12H)が出力される。また ALE
が1になり、AD0-AD7 には下位アドレス(34H)が出力され、ラ
ッチに記憶される。
(2) 上位アドレスとラッチに記憶された下位アドレスがメモリに
与えられる。
2番目のステート(T2) (3) RD が0になる。
(4) CS に0が与えられる。
(5) 1234H 番地のメモリとデータバスが電気的に接続され、デー
タバスにメモリの内容(56H)が出力される。
3番目のステート(T3) (6) データバスの値(56H)が CPU 内の A レジスタに取り込まれる。
11
MR マシンサイクル
T1
T2
T3
クロック
時刻
IO / M
(1)
A8-A15
(1)上位アドレス出力 (12H)
(1)
ALE
AD0-AD7
(1)下位
アドレス
(5)データ
(56H)
(23H)
(6)A レジスタへ
(3)
RD
メモリ
CPU
64k×8bit
8085A
A8-A15 (1) 12H
ALE
(1)
A8-A15
8
(3) 0
(2) 34H
ラッチ
8
データバス
AD0-AD7
RD
8
下位アドレス
(1)
(6) A レジ
上位アドレス
(5) 56H
A0-A7
56H
D0-D7
WE
RD+WR
1234H 番地
CS
1
スタへ
WR
IO / M
(4) 0
(1) 0
12
4.8. メモリ([2] p.60∼p.73)
RWM(リードライトメモリ)
等速呼び出しメモリ
PROM
ROM(リードオンリーメモリ)
IC メモリ
非等速呼び出しメモリ
(1) SRAM
消去可
EPROM(紫外線)
EEPROM(電気的)
消去不可
マスクROM
+VCC
Q
D
SRAM(スタテックRAM)
DRAM(ダイナミックRAM)
D
Q
D
S
D
S
NMOS-SRAM のメモリセル
エンハンスメント型 NMOS FET
D
G
G=1 のとき ON
G=0 のとき OFF
S
G
D
Vd
Vg
S
D
出力
Vd
入力
出力
0
1
1
0
入力 Vg
Q
Q
D
S=0 のとき
2状態(Q=1, Q=0 または Q=0,Q=1)の
いずれかを保持
Write 時
S=1 にして D=1, D=0 → Q=1
D=0, D=1 → Q=0
S: 1 のとき SW ON
0のとき SW OFF
Read 時
S=1 にして D > D → 1 と判定
D < D → 0 と判定
13
(2) SRAM の構成例(8192 ワード×8bit 構成)
I/O0∼I/O7
CS・WE
A1
アドレスデコーダ
A0
CS・WE
A12
13-8192 アドレスデコーダ
D
A5
D
D
S
0
D
D
S
D
S
A6
行デコーダ︵ 8-256
︶
A12
D
1
D
255
D
D
S
D
D
S
D
D
S
D
S
D
D
S
D
S
CS・WE
+
−
IO
0
1
31
列デコーダ(5-32 デコーダ)
CS・WE
A0 A1
14
A4
5. アセンブリ言語(Z80)
5.1. 命令形式
(1) 1バイト命令
例: A レジスタの内容を B レジスタにコピー
機械語コード ニーモニック
メモ
47H
LD B,A
B ←A
(2) 2バイト命令
例: C レジスタに 12H を代入
機械語コード ニーモニック
メモ
OEH 12H
LD C,12H
C ← 12H
(3) 3バイト命令
例: A レジスタの内容を 1234H 番地にコピー
機械語コード
ニーモニック
32H 34H 12H
LD (1234H),A
B1 B2 B3
A
F レジスタ
B
C
D
E
H
L
A
F レジスタ
B
C
D
E
H
L
メモ
(1234H) ← A
32H
オペレーションコード(オペコード)B1
34H 12H
オペランド B2 B3
(8085A や Z80 の場合、アドレスは下位アドレス上位アドレスの順に指定する)
CPU
データバス(8bit)
8bit
A
F レジスタ
0
B
C
1
D
E
H
L
SP(スタックポインタ)
PC(プログラムカウンタ)
アドレス
1234H
アドレスバス
(16bit)
メモリ
16bit
5.2. アセンブリ言語
アセンブリ言語 … 主として機械語と1対1に対応するニーモニックの集まり
アセンブラ … アセンブリ言語を機械語に変換するプログラム(コンパイラ)
15
12H
5.3. 命令の種類 (CPU Z80 の場合)
(1) データ転送命令1
r A
B
C
D
E
LD A, r
7F 78 79 7A 7B
LD B, r
47 40 41 42 43
LD C, r
4F 48 49 4A 4B
LD D, r
57 50 51 52 53
LD E, r
5F 58 59 5A 5B
LD H, r
67 60 61 62 63
LD L, r
6F 68 69 6A 6B
LD (HL), r
77 70 71 72 73
LD r, B2
3E 06 0E 16 1E
例1
ニーモニック
LD B,C
例2
例3
コメント
; B←C
H
7C
44
4C
54
5C
64
6C
74
26
L
7D
45
4D
55
5D
65
6D
75
2E
(HL)
7E
46
4E
56
5E
66
6E
36
メモ
AÅ r
BÅr
CÅr
DÅr
EÅr
HÅr
LÅr
HL Å r
r Å 1バイトの数値 B2
マシンコード
41H
; C←D
LD H,A
;
例4
;
68H
例5
LD B,12
; B ← 12
06H 0CH
例6
LD B,0CH
; B ← 0CH
06H 0CH
例7
LD D,32H
;
例8
LD H,12H
LD L,34H
LD (HL),A
;
;
;
;
H ← 12H
26H 12H
L ← 34H
2EH 34H
(HL) ← A
77H
結局、(1234H) ← A と同等
CPU
データバス(8bit)
8bit
A
F レジスタ
0
B
C
1
D
E
H (12H)
L (34H)
SP(スタックポインタ)
PC(プログラムカウンタ)
アドレス
1234H
アドレスバス
(16bit)
16
メモリ
例9
ニーモニック
LD H,12H
LD L,34H
LD C,(HL)
;
;
;
;
コメント
マシンコード
H ← 12H
26H 12H
L ← 34H
2EH 34H
C ← (HL)
4EH
即ち、C ← (1234H)、1234H 番地の内容を C レジスタにコピー
例 10
8100H 番地の内容を C レジスタにコピー
;
;
;
例 11
B レジスタの内容を 8200H 番地にコピー
;
;
;
(2) 演算命令
r A
ADD A, r
87
ADC A, r
8F
SUB r
97
SBC A, r
9F
B
80
88
90
98
C
81
89
91
99
L
85
8D
95
9D
(HL)
86
8E
96
9E
AND r
XOR r
OR r
CP r
INC r
DEC r
A0
A8
B0
B8
04
05
A1 A2 A3 A4 A5
A9 AA AB AC AD
B1 B2 B3 B4 B5
B9 BA BB BC BD
0C 14 1C 24 2C
0D 15 1D 25 2D
A6
AE
B6
BE
34
35
例1
A7
AF
B7
BF
3C
3D
ニーモニック
ADD A,B
D
82
8A
92
9A
E
83
8B
93
9B
H
84
8C
94
9C
コメント
; A ← A+ B
メモ
AÅA+ r
A Å A + r + CY
AÅA– r
A Å A – r - CY
A Å A AND r
A Å A Ex-OR r
A Å A OR r
A – r フラグのみ変化
rÅr+1
rÅr – 1
マシンコード
80H
演 算 結 果
ALU
加算器
A レジスタ
8bit
AND
OR
T レジスタ
NOT
B
C
D
E
H
L
マルチプ
レクサ
フラグ生
成回路
EX-OR
制御信号
17
F レジスタ
ニーモニック
ADC A,C
例2
F レジスタ
コメント
; A ← A + C + CY(キャリーフラグ)
S
Z
AC
P
MSB
35
+ 17
52
3+1+1(CY)=5
例3
SUB D
例4
SBC A,E
35
− 17
18
3−1−1(CY)=1
マシンコード
89H
CY
LSB
3 FF
+ 2 02
6 01
3+2+1(CY)=6
; A←A−D
H
; A ← A − E − CY
3 01
− 2 02
0 FF
3−2−1(CY)=0
H
例5
AND H
; A ← A AND H
H
例6
OR L
; A ← A OR L
H
例7
XOR B
; A←A ⊕ B
排他的論理和(EX-OR)
各ビットごとの論理演算
1100
1100
OR 1010
AND 1010
1000
1110
例8
H
1100
⊕ 1010
0110
比較命令(結果を保存しない.フラグのみ変化)
CP D
; A−D
if(
){ }
ここに使う
H
例9
INC E
; E ← E+1
H
例 10
DEC H
; H ←H−1
H
18
例 11
ADD A, 23H
; A ← A + 23H
C6 23
例 12
SBC A, 0F0H
; A ← A − F0H − CY
例 13
CP 12
; A − 12(10 進)
Z80
ADD A, B2
ADC A, B2
SUB B2
SBC A, B2
コード
C6
CE
D6
DE
AND B2
XOR B2
OR B2
CP B2
E6
EE
F6
FE
メモ
A Å A + B2
A Å A + B2 + CY
A Å A - B2
A Å A - B2 - CY
A Å A AND B2
A Å A Ex-OR B2
A Å A OR B2
A - B2
フラグのみ変化
(3) ペアレジスタを用いた命令
例1
LD HL, 1234
; HL ← 1234(10 進)
例2
LD BC, 8000H
; BC ← 8000H
例3
ADD HL, BC
例4
例5
例6
r1r2 BC DE HL SP
メモ
LD r1r2, B3B2 01 11 21 31 r1r2 Å B3B2
ADD HL, r1r2
INC r1r2
09
03
19
13
29
23
39 HL Å HL + r1r2
33 r1r2 Å r1r2 + 1
DEC r1r2
0B
1B
2B
3B r1r2 Å r1r2 - 1
; HL ← HL + BC
; HL ← HL + DE
INC BC
; BC ← BC + 1
; HL ← HL − 1
例7
(1234H 番地) ← A
(方法1) LD BC, 1234H ; BC ← 1234H
LD (BC), A
; (BC) ← A
(方法2) LD DE, 1234H ; DE ← 1234H
LD (BC), A
; (DE) ← A
(方法3) LD HL, 1234H ; HL ← 1234H
LD (HL), A
; (HL) ← A
(方法4) LD (1234H), A ; (1234H) ← A
19
Z80
LD (BC), A
LD A, (BC)
LD (DE), A
LD A, (DE)
LD (B3B2), A
LD A, (B3B2)
コード
02
0A
12
1A
32
3A
メモ
(BC) Å A
A Å (BC)
(DE) Å A
A Å (DE)
(B3B2)Å A
A Å (B3B2)
例8
A ← (1234H 番地)
(方法1)
(方法2)
(方法3)
(方法4)
例9
例 10
LD (1234H), HL
; (1234H) ← L
; (1235H) ← H
LD HL, (1234H)
; L ← (1234H)
; H ← (1235H)
Z80
LD (B3B2), HL
LD HL, (B3B2)
EX (SP), HL
EX DE, HL
JP (HL)
LD SP,HL
例 11
EX (SP), HL
; (SP) ←→ L 値の交換(入れ替え)
; (SP+1) ←→ H
例 12
JP (HL)
コード
メモ
22
(B3B2)Å L
(B3B2+1)Å H
2A
L Å (B3B2)
H Å (B3B2+1)
E3
(SP)
L
(SP+1) H
EB
DE
HL
E9
PC Å HL
F9
SP Å HL
; PC ← HL HL 番地にジャンプ
(4) ジャンプ命令
例1
JP 1234H
C3 34 12
; 1234H 番地にジャンプ
JP
JP
JP
JP
JP
JP
JP
JP
JP
例2
Z80
B3B2
Z, B3B2
NZ, B3B2
C, B3B2
NC, B3B2
PE, B3B2
PO, B3B2
M, B3B2
P, B3B2
コード
C3
CA
C2
DA
D2
EA
E2
FA
F2
条件付きジャンプ(分岐命令)
JP 条件, 1234H ; 条件を満たせば 1234H 番地に
ジャンプ
条件:Z
Z フラグ=1
直前の演算結果が0なら
NZ
Z フラグ=0
直前の演算結果が0でない
C
CY フラグ=1
例えば直前の演算結果が負
(符号なし引き算の場合)
NC
CY フラグ=0
例えば直前の演算結果が正または0(符号なし引き算の場合)
M
S フラグ=1
例えば直前の演算結果が負(2の補数引き算の場合)
P
S フラグ=0
例えば直前の演算結果が正または0(2の補数引き算の場合)
PE
パリティフラグ=1
直前の演算結果の1の数が偶数個
PO
パリティフラグ=0
直前の演算結果の1の数が奇数個
20
(5) コール命令、リターン命令
コール命令
Z80
コード
CALL B3B2
CD
CALL Z, B3B2
CC
CALL NZ, B3B2
C4
CALL C, B3B2
DC
CALL NC, B3B2
D4
CALL PE, B3B2
EC
CALL PO, B3B2
E4
CALL M, B3B2
FC
CALL P, B3B2
F4
例1
メイン
ルーチン
0 番地
サブ
ルーチン
100H 番地
(a)
20 番地
21 番地
(b)
150H 番地
メモリ
(a) サブルーチンコール時
CALL 100H
CD 00 01
RET
RET
RET
RET
RET
RET
RET
RET
RET
(b) リターン時
RET
C9
例2
条件付きコール命令
CALL 条件, 1234H
; 条件を満たせば 1234H 番地に
サブルーチンコール
条件:Z
NZ
C
NC
M
P
PE
PO
例2
リターン命令
Z80
コード
C9
Z
C8
NZ
C0
C
D8
NC
D0
PE
E8
PO
E0
M
F8
P
F0
フラグレジスタ
S
MSB
Z フラグ=1
Z フラグ=0
CY フラグ=1
Z
0
AC 0
P
1
CY
LSB
直前の演算結果が0なら
直前の演算結果が0でない
例えば直前の演算結果が負
(符号なし引き算の場合)
CY フラグ=0
例えば直前の演算結果が正または0(符号なし引き算の場合)
S フラグ=1
例えば直前の演算結果が負(2の補数引き算の場合)
S フラグ=0
例えば直前の演算結果が正または0(2の補数引き算の場合)
パリティフラグ=1
直前の演算結果の1の数が偶数個
パリティフラグ=0
直前の演算結果の1の数が奇数個
条件付きリターン命令
RET 条件 ; 条件を満たせばリターン
21
5.4. プログラム作成例
1+2+…+20を求めて結果を SUM 番地(9000H 番地)に格納する。
(1) 高級言語(C言語)の場合
#include <stdio.h>
void
main(void)
{
int
A, B;
A = 0;
for(B = 20; B > 0; B - -){
A = A + B;
}
}
(2) まず、全体の処理概要を段階的に箇条書きにしてみる
初期化
1. A を0に初期化
2. B に20を代入
1+2+…+20を求める 3. A に A+B を代入
4. B を1つ減らす
5. B が0になるまで 3, 4 を繰り返す
6. SUM 番地に A をコピー
結果を格納
(3) フローチャートを作成
start
A←0
B←20
L1
A←A+B
B←B−1
Y
B≠0
(SUM)←A
STOP
22
(4) コメントを作成
アドレス マシン語
ニーモニック
; コメント
;A ← 0
; B ← 20
;A ← A+ B
; B ← B−1
; if(B≠0) goto L1
; if(Z フラグ=0) goto L1
; (SUM) ← A
; stop
L1:
SUM:
; SUM 番地(9000H 番地)に0を入
; れておく
(5) コメントに従ってニーモニックを書く
アドレス マシン語
ニーモニック
ORG 8000H
LD A, 0
LD B, 20
L1:
ADD A, B
DEC B
JP NZ, L1
; コメント
; 8000H 番地からプログラムを記述
;A ← 0
; B ← 20
;A ← A+ B
; B ← B−1
; if(B≠0) goto L1
; if(Z フラグ=0) goto L1
LD (SUM), A ; (SUM) ← A
HALT
; stop
SUM:
ORG 9000H
DB 0
END
; SUM 番地(9000H 番地)に0を入
; れておく
(6) ニーモニックをマシンコードを変換(不明なアドレスは空白にしておく)
アドレス マシン語
ニーモニック
; コメント
ORG 8000H ; 8000H 番地からプログラムを記述
LD A, 0
;A ← 0
3E 00
LD B, 20
; B ← 20
06 14
L1:
ADD A, B
;A ← A+ B
80
DEC B
; B ← B−1
05
JP NZ, L1
; if(B≠0) goto L1
C2
; if(Z フラグ=0) goto L1
32 00 90
LD (SUM), A ; (SUM) ← A
76
HALT
; stop
00
SUM:
ORG 9000H
DB 0
END
23
; SUM 番地(9000H 番地)に0を入
; れておく
(7) アドレスを記入する
アドレス マシン語
8000H
8002H
8004H
8005H
8006H
3E 00
06 14
80
05
C2
8009H
800CH
32 00 90
76
; コメント
; 8000H 番地からプログラムを記述
;A ← 0
; B ← 20
;A ← A+ B
; B ← B−1
; if(B≠0) goto L1
; if(Z フラグ=0) goto L1
LD (SUM), A ; (SUM) ← A
HALT
; stop
00
ORG 9000H
DB 0
9000H
L1:
SUM:
ニーモニック
ORG 8000H
LD A, 0
LD B, 20
ADD A, B
DEC B
JP NZ, L1
END
; SUM 番地(9000H 番地)に0を入
; れておく
(8) マシン語の空白のアドレスを埋めて、完成
アドレス マシン語
ニーモニック
ORG 8000H
LD A, 0
8000H
3E 00
LD B, 20
8002H
06 14
L1:
ADD A, B
8004H
80
DEC B
8005H
05
JP NZ, L1
8006H
C2 04 80
8009H
800CH
32 00 90
76
9000H
00
; コメント
; 8000H 番地からプログラムを記述
;A ← 0
; B ← 20
;A ← A+ B
; B ← B−1
; if(B≠0) goto L1
; if(Z フラグ=0) goto L1
LD (SUM), A ; (SUM) ← A
HALT
; stop
SUM:
ORG 9000H
DB 0
END
; SUM 番地(9000H 番地)に0を入
; れておく
(9) 説明書に従って、マシンコードをメモリに格納
(10) 実行して、9000H の内容が1から20までの和になっているか確認
24
(11) 1から3までの和を求めるプログラムに変更してトレース実行してみる
プログラムで使用しているレジスタ、フラグ、メモリ内容を順次記録する。
アドレス マシンコード
ニーモニック
初期状態
8000
8002
8004
3E 00
06 03
80
LD A, 0 ; A ← 0
LD B, 3 ; B ← 3
L1: ADD A, B ; A ← A + B
DEC B ; B ← B−1
JP NZ, L1 ; if(B≠0) goto L1
L1: ADD A, B ; A ← A + B
DEC B ; B ← B−1
JP NZ, L1 ; if(B≠0) goto L1
L1: ADD A, B ; A ← A + B
DEC B ; B ← B−1
JP NZ, L1 ; if(B≠0) goto L1
LD (SUM), A ; (SUM) ← A
HALT
; stop
25
A
B
Z
9000H
番地
PC
00
00
00
03
00
00
03
03
0
0
0
0
00
00
00
00
8000
8002
8004
8005
5.5. 条件分岐(if 文)
(1) C言語の場合
Yes
条件式
処理1
if (条件式) {
No
処理1
処理2
}
else {
処理2
}
(2) 条件とフラグ
A レジスタの内容とrレジスタの内容を比較する場合
A - r を計算 CP r
→フラグが以下のように変化
符号なし
(0∼255)
符号あり
(-128∼127)
条件
A = B
A != B
A ≧B
A < B
A ≧B
A < B
Z
1
0
CY
S
ニーモニック
JP Z, PROC1
JP NZ, PROC1
JP NC, PROC1
JP C, PROC1
JP P, PROC1
JP M, PROC1
0
1
0
1
(3) アセンブラによる if 文の実現(方法1)
if (A = = B) {
CP B
; A−B
JP Z, PROC1 ; if(A != B) {(Z フラグが1ならPROC1 にジャンプ)
処理1
;
処理2
処理2
}
else {
JP ENDIF
;}
PROC1:
; else {
処理2
;
処理1
処理1
}
ENDIF:
;}
(4) アセンブラによる if 文の実現(方法 2)
if (A = = B) {
CP B
; A−B
JP NZ, PROC2 ; if(A = = B) {(Z フラグが0 ならPROC2 にジャンプ)
処理1
;
処理1
処理1
}
else {
JP ENDIF
;}
PROC2:
; else {
処理2
;
処理2
処理2
}
ENDIF:
;}
26
(5) 練習問題
D1 番地(8100H)の内容がD2番地(8101H)の内容より小さければ D3 番地(8
102H)番地に1を、小さくなければ0を代入するプログラムを作成し、トレース実行によ
って各レジスタ等の値を調べ、動作を確認せよ。なお、D1,D2 番地には符号ありの整数が入っ
ているものとする。
5.6. 指定回数ループ
(1) 100回ループ
D←100
L1
処理
D←D−1
Y
D≠0
N
(2) 練習問題
XX(8100H 番地)から始まる100 個のデータをYY(8200H 番地)以降にコピーするプログラムを
作成せよ。
start
HL←XX(コピー元)
BC←YY(コピー先)
D←100
アドレス
XX(8100H)
8101H
¦
8163H
L1
A ← (HL)
(BC) ← A
YY(8200H)
HL←HL+1
BC←BC+1
8201H
¦
8263H
D←D−1
Y
コピー
メモリ
D≠0
N
STOP
27
5.7. for 文(繰り返し処理 2)P.53
(1) C 言語の場合
for (初期設定; 条件; 増分) {
初期設定
処理
}
条件
No
Yes
処理
増分
(2) アセンブラによる for 文の実現
初期設定
F:
条件を満たしてなければENDF にジャンプ
(演算、フラグ変化、条件付きジャンプ)
処理
増分
JP F
ENDF:
(3) 練習問題
1+3+…+19 を計算し、結果を 8100H に格納するプログラムを作成せよ。
28
5.8. while 文
(1) 書式
while (条件式) {
条件式
No
処理
}
Yes
処理
(2) アセンブラによる while 文の実現
W:
条件を満たしてなければENDW にジャンプ
(演算、フラグ変化、条件付きジャンプ)
処理
JP W
ENDW
5.9. 練習問題
DATA(8200H)番地以降のデータの正または0の数を POS(8100H)番地に、負の数を
NEG(8101H)番地に格納する。ただし、80H はデータの終了を意味するものとする。
29
(ヒント)
DATA(8200H)番地以降のデータの正または0の数を POS(8100H)番地に、負の数を
NEG(8101H)番地に格納する。ただし、80H はデータの終了を意味するものとする。
start
アドレス
BC←0
B…正の数、C…負の数
HL←DATA
POS(8100H)
3
NEG(8101H)
2
¦
DATA(8200H)
W
A ← (HL)
A − 80H
Y
Z=1
N
(POS)←B
(NEG)←C
正負の集計
HL←HL+1
STOP
正負の集計
A← A AND A
N
A< 0
Y
C ++
B ++
return
30
03H
正
0FEH
負
0FFH
負
23H
正
34H
正
80H
データの終了
¦
メモリ
5.10. bit 演算
(1) bit の取り出し
下から3bit 目と4bit 目を取り出す。
x ⋅1 = x
x⋅0 = 0
1100 1010 (元データ)
AND 0000 1100
0000 1000
(2) bit のセット
下から2bit 目、3bit 目、4bit 目を1にセットする。
x +1 = 1
1100 1010 (元データ)
x+0 = x
OR 0000 1110
1100 1110
(3) bit のリセット
上位4bit を0にリセットする。
AND
x⋅0 = 0
x ⋅1 = x
1100 1010 (元データ)
0000 1111
0000 1010
(4) bit の反転
下位4bit を反転する。
EX-OR
x⊕0 = x
x ⊕1 = x
1100 1010 (元データ)
0000 1111
1100 0101
a
0
0
1
1
b
0
1
0
1
a⊕b
0
1
1
0
(例題)8100H 番地の下位 4bit と 8101H 番地の下位 4bit が一致すれば 8102 番地に1を、
一致しなければ0を格納するプログラムを作成せよ。
31
5.11. 回転シフト命令
(1) RLCA
A レジスタ
CY
1
0
1
1
0
0
0
0
0
1
0
0
0
0
0
RLCA
CY
1
0
0
1
1
0
0
(2) RRCA
A レジスタ
CY
1
0
1
1
RRCA
CY
0
0
0
1
0
1
1
0
(3) RLA
CY
A レジスタ
(4) RRA
CY
A レジスタ
(5) シフト演算を用いた掛け算
8100H 番地(AP 番地)の内容と 8101H 番地(AQ 番地)の内容を掛け算し、その結果を
8102H, 8103H 番地(AR,AR+1 番地)に格納するプログラムを作成せよ。
32
【ヒント】(AP 番地)×(AQ 番地) → (AR 番地)(AR+1 番地)
8 bit
8 bit
16 bit
0111 (7)
× 1011 (11)
0111
0111
0
0111
1001101
DE ← (AP 番地)
A ← (AQ 番地)
HL ← 0,
HL ← HL + DE
DE 左 1bit シフト, HL ← HL + DE
DE 左 1bit シフト
DE 左 1bit シフト, HL ← HL + DE
(AR 番地)(AR+1 番地) ← HL
start
(1)
A の LSB を CY に入れる
D←0
E ← (AP 番地)
A ← (AQ 番地)
HL ← 0
CY→A→
(2)
Y
LOOP
HL ← HL + DE
SKIP
CY ← 0
A=0 ?
Y
CY=1 ?
N
N
(3)
DE 左1bit シフト
(4)
(AR 番地)(AR+1 番地)
← HL
stop
CY
(1)
(2)
(3)
(4)
(2)
(3)
(4)
(2)
(3)
(4)
(2)
(3)
(4)
1
1
1
1
0
0
1
1
A
1011
101
101
101
10
10
10
1
1
1
0
0
0
DE
0111
0111
0111
01110
01110
01110
011100
011100
011100
0111000
0111000
0111000
01110000
HL
0
0
0111
0111
0111
10101
10101
10101
10101
10101
10101
1001101
1001101
33
CY ← A の LSB
HL ← HL + DE
DE 左 1bit シフト
CY ← A の LSB
HL ← HL + DE
DE 左 1bit シフト
CY ← A の LSB
DE 左 1bit シフト
CY ← A の LSB
HL ← HL + DE
DE 左 1bit シフト
DE 左1bit シフト
HL ←→ DE
HL ← HL+HL
HL ←→ DE
return
5.12. サブルーチン
・プログラムがわかりやすくなる。
・同一処理を繰り返し使うとき、メモリー効率が良くなる。
【例1】(HL)←B+C
; メインルーチン
ORG 8000H
8000H
LD B,1
8002H
LD C,2
8004H
LD HL, 8100H
8007H
CALL ADD_BC
800AH
HALT
; B←1
; C←2
; HL←8100H
; サブルーチン (HL)←B+C
ADD_BC:
800BH
LD A,B
; A←B
ADD A,C
; A←A+C
LD (HL),A
; (HL)←A
RET
サブ
メイン
ルーチン
ルーチン
8000H 番地
800BH 番地
(a)
8007H 番地
800AH 番地
(b)
(b) リターン時
RET
PC←(SP+1),(SP)
SP←SP+2
メモリ
(1) 初期状態
(3) RET 後
8350H 番
メインルーチンでの
スタックの状態(空)
(a) サブルーチンコール時
CALL 800BH
PC←PC+3
(SP−1),(SP−2)←PC
SP←SP−2
PC←800BH
(2) CALL 後
SP の値
8350H
834EH 番
0AH
834FH
80H
8350H
サブルーチンでの
スタックの状態
34
SP の値
834EH
アドレスを
格納するに
は 2 バイト
必要
【例2】かけ算サブルーチン (HL)←E×A
MLT:
PUSH AF ; AF をスタックに退避
PUSH DE ; DE をスタックに退避
かけ算
; この部分で AF, DE の内容が変化してもサブルーチン終了後の
; AF, DE の内容は元の値に戻る
POP DE ; スタックに保存されている内容を DE に戻す
POP AF ; スタックに保存されている内容を AF に戻す
RET
(1) 初期状態
(7) RET 後
(2) CALL 後
(6) POP AF 後
8350H 番
スタックの状態(空)
SP の値
8350H
(3) PUSH AF 後
(5) POP DE 後
834EH 番
0DH
834FH
80H
メインルーチンへ戻
8350H
る際のアドレス
(4) PUSH DE 後
834AH 番
(E)
834BH
(D)
834CH
(F)
834DH
(A)
834CH 番
(F)
834DH
(A)
834EH
0DH
834EH
0DH
834FH
80H
834FH
80H
8350H
SP の値
834EH
SP の値
834CH
8350H
35
SP の値
834AH
6. 周辺機器制御
(1) CPU8085A と 64k 番地×8bit メモリとの接続
メモリ
64k×8bit
CPU
8085A
8
上位アドレス
A8-A15
ALE
A8-A15
下位アドレス
8
A0-A7
データバス
8
D0-D7
ラッチ
AD0-AD7
WE
RD
CS
WR
IO / M
メモリ
WE … 0:書き込み、1:読み込み
CS … 0 を入力したとき、指定された番地のメモリとデータバスを電気的に接続
メモリ WE ← CPU WR
メモリ CS ← CPU M・(RD + WR)
(2) CPU8085A と周辺機器(I/O)との接続
インターフェースIC
アドレスデコーダ
0
1
CPU
8085A
8255A (1)
M
A8-A15
ラッチ
ALE
AD0-AD7
RD
A0-7
6
A2-7
2
60
61
62
63
A0-1
D0-7
RD
WR
ポートA
SW
ポートB
LED
ポートC
CWR
リレー
8 データバス
インターフェースIC
RD・IO
8255A (2)
CS
WR
IO / M
CS
I/O
A0-1
WR・IO
D0-7
RD
WR
36
ポートA
I/O
DA1
ポートB
ポートC
CWR
DA2
(3) アドレスデコーダ回路
CPU
8255A
A0
A0
A1
A1
74LS139
A2
Y0
8255A(1)のCS
A3
Y1
8255A(2)のCS
Y2
Y3
CS
A4
A5
A6
A7
A4
1
A5
1
A6
1
1
8255A
(1)
8255A
(2)
A4 A5 A6 A7
A7
ポート A
ポート B
ポート C
CWR
ポート A
ポート B
ポート C
CWR
A7
1
1
1
1
1
1
1
1
A6
1
1
1
1
1
1
1
1
A5
1
1
1
1
1
1
1
1
A4
1
1
1
1
1
1
1
1
A3
0
0
0
0
0
0
0
0
A2
0
0
0
0
1
1
1
1
A1
0
0
1
1
0
0
1
1
A0
0
1
0
1
0
1
0
1
IO アドレス
0F0H
0F1H
0F2H
0F3H
0F4H
0F5H
0F6H
0F7H
SW など
LED
リレーなど
コントロールワードレジスタ
DA
DA
コントロールワードレジスタ
(4) インターフェース IC 8255A
インターフェースIC
8255A
8255A(1)
8255A(2)
ポートA
SW(入力)
DA(出力)
ポートB
LED(出力)
(出力)
ポートC
リレー(出力)
DA(出力)
A0
データバス
8
A1
CWR
CWR(コントロールワードレジスタ)… ここに保存されているデータによって、各ポートと
データバス間のデータの流れの方向を決める。
従って、8255A を使用するには、各ポートに入力装置が接続されているのか、出力装置が接
続されているのかを CWR に値をセットして指定しなければならない。
37
CWR(コントロールワードレジスタ)
MSB
1
モード
設定の
とき1
0
0
モード指定
モード0
ポートA
入力:1
出力:0
1
0
LSB
0
ポートC
(上位)
入力:1
出力:0
0
0
ポートB
入力:1
出力:0
ポートC
(下位)
入力:1
出力:0
モード
指定
従って、
8255A(1)の CWR には 90H、
8255A(2)の CWR には
をセットする必要がある。
【例1】以下のように LED を光らせる。
ORG 8000H
LD A, 90H
OUT (0F3H), A
LD A, 80H
OUT (0F7H), A
; A←90H
; 8255A(1)の CWR に 90H をセット
; A←80H
; 8255A(2)の CWR に 80H をセット
LD A, 00011001B
OUT (0F1H), A ; (LED)←A
HALT
; A に 2 進数で 00011001 を代入
【例2】例 1 で光らせた LED を左にシフトさせながら表示し続ける。
時刻1
時間待ち
時刻 2
wait
時刻 3
時刻 4
時刻 5
時刻 6
38
【例3】押した SW に対応する LED を点灯させる。
ORG 8000H
CALL INIT
; 初期化
LOOP: IN A,(SW)
; A <-- (SW)
XOR 0FFH
; A の全 bit を反転
AND 0FH
; A の下位 4bit 取り出し
OUT (LED),A ; (LED) <-- A
JP LOOP
; LOOP へ戻る
INIT:
LD A,90H
OUT (CWR1),A
LD A,80H
OUT (CWR2),A
RET
SW:
LED:
CWR1:
CWR2:
END
EQU
EQU
EQU
EQU
0F0H
0F1H
0F3H
0F7H
【例4】4つの SW を 4bit の2進数入力とみなし、その数だけ LED に表示する値を増加させ
る。すなわち、sw0 が押されたとき LED に表示する値を1増やし、sw1 押されたときは LED
に表示する値を 2 増やす。ただし、LED に表示する初期値を0とする。また、スイッチ入力
されたとき、8255A(1)A ポートの下位 4bit の内、対応する bit が0になる(スイッチ入力され
ていないときは、1になる)
。さらにスイッチのチャタリングに注意すること。
ORG 8000H
CALL INIT
; 初期化
LD C,0
; C <-- 0
LOOP: IN A,(SW)
; A <-- (SW)
XOR 0FFH
; A の全 bit を反転
AND 0FH
; A の下位 4bit 取り出し
JP Z,LOOP
; スイッチ入力がなければ LOOP へ
ADD A,C
; A <-- A + C
LD C,A
; C <-- A
OUT (LED),A ; (LED) <-- A
CALL SWOFF ; SW が離されたことを確認
JP LOOP
; LOOP へ戻る
SWOFF:
; SW が離されたことを確認
CALL DELAY ; 時間稼ぎ
IN A,(SW)
; A <-- (SW)
XOR 0FFH
; A の全 bit を反転
AND 0FH
; A の下位 4bit 取り出し
JP NZ,SWOFF; スイッチが押されていたら SWOFF へ
RET
39
INIT:
LD A,90H
OUT (CWR1),A
LD A,80H
OUT (CWR2),A
RET
DELAY: PUSH AF
PUSH DE
LD DE,0681H
DELAY1:
DEC DE
LD A,D
OR E
JP NZ,DELAY1
POP DE
POP AF
RET
SW:
LED:
CWR1:
CWR2:
END
EQU
EQU
EQU
EQU
0F0H
0F1H
0F3H
0F7H
8255A の初期化
INIT
start
8255A の初期化
INIT
(C)←0
LED 出力の初期値
LOOP
(A) ← (SW)
(A)の全 bit を反転
下位 4bit 取り出し
(A)=0?
N
Y
(A)←(A)+(C)
(C)←(A)
(LED)←(A)
SW が離されたことを
確認 SWOFF
(CWR1)←90H
(CWR2)←80H
return
SW が離されたことを
確認 SWOFF
時間稼ぎ DELAY
(A) ← (SW)
(A)の全 bit を反転
下位 4bit 取り出し
N
(A)=0?
Y
return
40
【例5】スピーカ制御
;-------------------------------------------------------------------------------------------------; スピーカ制御
; 連続的に低い音から高い音に変化して繰り返す音
; スピーカ接続 --- 8255A(1) C ポートの MSB
;
ここに 0,1 を交互に出力すれば良い。
;
低い音=周波数が低い -- 0,1 の反転時間が長い
;
高い音=周波数が高い -- 0,1 の反転時間が短い
; 8255A(1) C ポートのMSB の bit 設定 -- CWR を使用する。
;-------------------------------------------------------------------------------------------------ORG 8000H
CALL INIT
; 初期化
L0:
LD B,9FH
CALL SOUND
JP L0
; B <-- 9FH
; 低い音から高い音に変化して繰り返す音を出す
; 8255A(1),(2)の初期化
INIT:
LD A,90H
OUT (CWR1),A
LD A,80H
OUT (CWR2),A
RET
;低い音から高い音に変化して繰り返す音を出す
SOUND: CALL SPK_ON ; スピーカに1を出力
CALL SPK_OFF ; スピーカに 0 を出力
DEC B
; B の値を 1 減らす
RET Z
; B が0になったらRETURN
JP SOUND
; スピーカに 1 を出力
SPK_ON:LD A,0FH
OUT (CWR1),A
CALL DELAY
RET
; 8255A(1)のCWR に0FH を出力し、
; C ポートのMSB をセット
; B に対応する時間待ち
; スピーカに 0 を出力
SPK_OFF: LD A,0EH
OUT (CWR1),A
CALL DELAY
RET
; 8255A(1)のCWR に0EH を出力し、
; C ポートのMSB をリセット
; B に対応する時間待ち
; B に対応する時間待ち
DELAY: LD A,B
DD:
DEC A
JP NZ,DD
RET
CWR1:
CWR2:
END
EQU
EQU
0F3H
0F7H
41
周期 1ms =
7. AD 変換,DA 変換
7.1. スペクトルとは
1
1kHz
1
f (t )
図(a)は、1kHz の方形波である。
この方形波は、(b)~(e)の波形の和で
近似できる。
0.5
0
1.5
時刻 t →
(a) 方形波
直流(0Hz), 1kHz と 3kHz の sin 波
を足し算した場合
1
0.5
1
0
(b)
0.5
+
1
2
(直流 0Hz)
1
0
0.5
0
-0.5
-0.5
-1
1.5
2
(c) 1kHz の sin 波
直流(0Hz), 1kHz,3kHz,5kHz の sin 波
を足し算した場合
π
sin( 2πf 0 t )
0.5
1
0
-0.5
0.5
+
0
21
sin( 2π 5 f 0 t )
π
5
21
sin( 2π 3 f 0 t )
(d) 3kHz のsin 波
π 3
(e) 5kHz の sin 波
0.5
0
-0.5
-0.5
(e) 5kHz の sin 波
足し算した直流(0Hz), 1kHz,
3kHz,5kHz の成分の大きさを
グラフにすると…
0.7
0.6
0.5
大きさ 0.4
0.3
0.2
0.1
0
0
1
3
5
周波数 [kHz]
0.7
0.6
0.5
大きさ 0.4
0.3
0.2
0.1
0
21
sin( 2π 5 f 0t )
π5
スペクトル:
元の波形(方形波)がどのような
周波数成分からなるか表したもの
0
1
3
5
7
9 11 13 15 17 19 21 23 25 27 29
周波数 [kHz]
42
7.2. サンプリング定理(標本化定理)
信号の帯域が F [Hz]以下であるとき( F [Hz]より大きい周波数成分を持たないとき)、
1
[sec]周期以下( 2 F [Hz]以上)でサンプリング(標本化)すれば、完全に元の信号を復元
2F
できる。
高い周波数成分を
含んでいる。
アナログ信号(連続信号)
t
低域通過フィ
ルタ(LPF)
高い周波数成分が
カットされている。
t
AD
コンバータ
1 [sec]以下
2F
レベル(大きさ)
も離散化
(量子化)
ディジタル信号
8bit 量子化
→256 段階に離散化
時間的に離散化(サンプリング,標本化)
DA
コンバータ
t
50,75,115,125,135,…
低域通過フィ
ルタ(LPF)
t
階段波形
(高い周波数成分
が残っている)
元の波形が復元さ
れている。
アナログ信号
t
7.3. DA 変換(ディジタル信号→アナログ信号)
【例】4 bit でレベル(大きさ)を表現した(4 bit 量子化された)ディジタル信号の場合
10 進数
0
1
2
|
15
D3
0
0
0
|
1
ディジタル値
D2 D1 D0
0
0
0
|
1
0
0
1
|
1
0
1
0
|
1
ディジタル値 離(散的 )
ディジタル値とアナログ電圧の対応例
15
アナログ
電圧 [V]
14
0.0
0.1
0.2
|
1.5
3
2
1
量子化誤差
±0.05[V]
0
0.0 0.1 0.2 0.3 … 1.4 1.5
アナログ電圧 [V] (連続的)
43
【R−2R はしご型 DA コンバータ回路例】
R
アナログ
R
R
アナログ出力
出力Vout
2R
2R
D3 E
2R
D2 E
D1 E
2R
Vout=
2R
↑レベル
ポートB
IO アドレス
0F6H
ポートC
CWR
5 [v]
時刻→
オシロスコープへの出力波形
オシロスコープ
(150,250)
インターフェースIC
IO アドレス
0F4H
ポートA
(2 3 D3 + 2 2 D 2 + 2 D1 + D0 )
0 [v]
【三角形の表示】
8255A (2)
2
4
E=1.6[V]とすれば左上の表の
ような対応になる。
D0 E
【のこぎり波の表示】
オシロスコープに右図に示すのこぎり波が
表示される Z80 アセンブリプログラムを作成
してみよう。
ただし、
IO アドレス 0F4H は 8255A(2) A
ポートに対応し、8bitDA コンバータが接続さ
れている。また 8bitDA コンバータ出力は、オ
シロスコープにあらかじめ接続してあるもの
とする。なお、この 8bitDA コンバータでは、
ディジタル値 0H が 0 [V], ディジタル値 0FFH
が 5 [V] のアナログ電圧に対応するものとする。
E
I/O
DA1
アナログ信号
(X ch)
DA2
アナログ信号
(Y ch)
Y ch
(50,50)
(250,50)
X ch
オシロスコープに上図に示す三角形が表示されるZ80アセンブリプログラムを作成してみよう。
(ヒント)
250
X 100
50
t
250
Y 100
50
t
7.4. AD 変換(アナログ信号→ディジタル信号)
(1) AD コンバータの種類
低速用…カウンタランプ型,2重積分型
中速用…逐次比較型
高速用…並列比較型
44
(2) AD コンバータの構成
アナログ
マルチプレクサ
アナログ入力
音
00
温度
01
光
10
外部入力
11
C1
AD
変換
サンプル
ホールド
回路
(標本化)
(時間を
離散化)
ディジタル
出力
(量子化)
(レベルを
離散化)
1 [sec]
2F
以下
C0
チャネル選択信号
t
50,75,115,125,135,…
8bit 量子化
→256 段階に離散化
(3) サンプルホールド回路例
アナログ入力 Vi
アナログ
スイッチ
+
-
制御信号Sが1のとき
スイッチON
(抵抗R)
+
-
階段波形 Vo
C
制御信号S
【S=1 → スイッチ ON→急速充電】
R
入力
Vi
出力
Vo
C
t

−

V o = V i  1 − e RC




 

Vi
出力
Vo
t
【S=0 → スイッチ OFF→ゆっくり放電】
出力
Vo
C
Vo = Vie
−
t
RiC
Ri
Vi
出力
Vo
(OP アンプの入力抵抗:大きい)
t
充電
放電
t
制御信号 S
45
(4) 量子化(逐次比較型)
【りんごの重さを量るとき】
(a)
【アナログ入力電圧を測るとき】
72g
10 進数
0
1
2
|
15
80g
りんご < 80g
取り除く
(b)
(a)
D3
0
0
0
|
1
0
0
0
|
1
0
0
1
|
1
0
1
0
|
1
アナログ
電圧 [V]
0.0
0.1
0.2
|
1.5
アナログ入力電圧 < 基準電圧 0.8[V]
1000(D3 のみ1)
0.72[V]
40g
ディジタル値
D2 D1 D0
取り除く
(b)
アナログ入力電圧 > 基準電圧 0.4[V]
0100(D2 のみ1)
そのまま
(c)
アナログ入力電圧 > 基準電圧 0.6[V]
0110(D1 を1に)
そのまま
(d)
アナログ入力電圧 > 基準電圧 0.7[V]
0111(D0 を1に)
そのまま
りんご > 40g
そのまま
(c)
40g
20g
りんご > 60g
そのまま
(d)
40g 20g
アナログ入力電圧(0.72[V])
→ 0111の 4 bit ディジタル値に変換
10g
りんご > 70g
そのまま
46
【4bit 逐次比較型 AD 変換回路例】
アナログ入力電圧 Vi=0.72[V]のとき
(a) クロック→
リングカウンタ Q1 Q2 Q3 Q4 Q5
100 0 0
(Q1=1) → FF3 の Set 端子
→ DA コンバータ入力:1000
→ DA 出力(基準電圧Vd):0.8[V]
アナログ入力電圧Vi>基準電圧Vd なら
DA出力
Vd
入力
Vi
Q
Q
Q
Q
FF3
FF2
FF1
FF0
RS
RS
RS
RS
−+
比較器
Vc
シリアル
AD 出力
A3
A2
A1
A0
Q D
CLK
比較器出力Vc=0(おもりはそのまま)
アナログ入力電圧Vi<基準電圧Vd なら
DA コンバータ
クロック
比較器出力Vc=1(おもりを取り除く)
Q1
Q2
Q3
Q4
Q5
リングカウンタ
(b) クロック → 前段の結果(D3=0)がシリアル出力される
リングカウンタ Q1 Q2 Q3 Q4 Q5 (Q2=1)
010 0 0
→ Q2=1, Vc=1 が A3 に入力 → FF3 の Reset 端子に1入力 → FF3 出力:0
→ Q2=1が FF2 の Set 端子に入力 → FF2 出力:1
→ DA コンバータ入力:0100 → DA 出力(基準電圧Vd):0.4[V]
→アナログ入力電圧Vi>基準電圧Vd なので、比較器出力Vc=0(おもりはそのまま)
(c) クロック → 前段の結果(D2=1)がシリアル出力される
リングカウンタ Q1 Q2 Q3 Q4 Q5 (Q3=1)
001 0 0
→ Q3=1, Vc=0 が A3 に入力 → FF2 の Reset 端子に0入力 → FF2 出力:1のまま
→ Q3=1が FF1 の Set 端子に入力 → FF1 出力:1
→ DA コンバータ入力:0110 → DA 出力(基準電圧Vd):0.6[V]
→アナログ入力電圧Vi>基準電圧Vd なので、比較器出力Vc=0(おもりはそのまま)
(d) クロック → 前段の結果(D1=1)がシリアル出力される
リングカウンタ Q1 Q2 Q3 Q4 Q5 (Q4=1)
000 1 0
→ Q4=1, Vc=0 が A3 に入力 → FF1 の Reset 端子に0入力 → FF1 出力:1のまま
→ Q4=1が FF0 の Set 端子に入力 → FF0 出力:1
→ DA コンバータ入力:0111 → DA 出力(基準電圧Vd):0.7[V]
→アナログ入力電圧Vi>基準電圧Vd なので、比較器出力Vc=0(おもりはそのまま)
(e) クロック → 前段の結果(D0=1)がシリアル出力される
以上のように、入力電圧と基準電圧を逐次比較することで AD 変換を行える。
47
(5) IO ボードの AD 変換部
100 倍の増幅器
逐次比較型
AD 用 LSI
100k
アナログ入力
1k
+
音(マイク)
A0
温度
DATA
AD 出力
CLK
クロック入力
A1
CS
A2
C1
C0
光
A3
外部入力
(1 bit ずつ
シリアルに
出力)
チップセレクト
音 温度 光 外部
0 0 1 1
0 1 0 1
A0∼A3 のいずれ
を AD するか選択
8255A(1)
ポートA のMSB(A7)
(IO アドレス 0F0H)
ポート C の 3bit 目(C3)
(IO アドレス 0F2H)
ポート C の 2bit 目(C2)
(IO アドレス 0F2H)
ポート C の 1bit 目(C1)
ポート C の 0bit 目(C0)
(IO アドレス 0F2H)
①
チップセレクト
CS
チャネル選択信号 C0,C1
ポート C の 2bit 目(C2) (IO アドレス 0F2H)
③
② A0∼A3 のいずれを AD するかを示す選択信号(ポート C, C1, C0)
④
⑤
⑦
ポート C の 2bit 目(C2)
(IO アドレス 0F2H)
クロック入力 CLK
AD 出力 DATA
(IO アドレス 0F2H)
⑥ ⑧ ⑩
⑫
⑭
⑯
⑱
⑳
MSB 2SB 3SB 4SB 5SB 6SB 7SB LSB ポートA のMSB(A7)
(IO アドレス 0F0H)
9 個のクロックで 8bit ディジタル値が MSB から順次得られる
(6) AD 変換プログラム例
;****************************************
; AD 変換
; 音(0)、温度(1)、光(2)、外部入力(4)
; のいずれかを AD 変換し、結果を LED に
; 表示する。
;****************************************
; メインルーチン
ORG 8000H
; 8000H 番地から
LD A,90H
; 1 つめの8255A を
OUT (CWR1),A
; A:入力、B,C:出力に初期化
LD A,80H
; 2 つめの8255A を
OUT (CWR2),A
; A,B,C:出力に初期化
LD A,4
① OUT (PORTC1),A
LOOP:
LD C,SELECT
CALL ADC
OUT (PORTB1),A
JP LOOP
; __
; CS <-- High
; 入力を選択 音(0)、温度(1)、光(2)、外部入力(4)
; AD 変換 (結果は A レジスタに格納)
; AD 変換結果を LED に出力
48
; AD 変換サブルーチン
; 入力: C レジスタ 音(0)、温度(1)、光(2)、外部入力(3)
; 出力: A レジスタ AD 変換結果
ORG
8100H
; 8100H 番地から
ADC:
PUSH BC
; BC を退避(サブルーチン終了後、元に戻すため)
PUSH DE
; DE を退避
LD A,C
AND 3
LD C,A
; C の下位2bit のみ
;
を取り出す
;
A レジスタ
C1 C0
C レジスタ 0 0 0 0 0 0 C1 C0
リレー
スピーカ
IN A,(PORTC1)
AND 0F0H
; PORTC1 の
; 上位4bit を取り出し
OR C
;
;
;
;
;
;
;
XOR 4
② OUT (PORTC1),A
XOR 4
③ OUT (PORTC1),A
LD C,9
LD DE,0706H
ADC1:
LD A,D
④⑤⑦… OUT (CWR1),A
LD A,E
OUT (CWR1),A
⑥⑧… IN A,(PORTA1)
RLA
LD A,B
RLA
LD B,A
PORTA1:
PORTB1:
PORTC1:
CWR1:
CWR2:
SELECT:
;
; Clock --> High
;
; Clock --> Low
A の MSB:A7 <-- AD 結果
CY <-- A7
A <-- B
A0 <-- CY
B <-- A
; C -; 9 回ループ
LD A,5
OUT (CWR1),A
; __
; CS --> High
LD A,B
POP DE
POP BC
RET
; A <-- B AD 結果
; DE を元に戻す
; BC を元に戻す
EQU
EQU
EQU
EQU
EQU
EQU
;
;
;
;
;
;
END
ポート C の
あるビットを
1/0 にする
; 9 回ループ
; D<--7 E<-- 6
;
;
;
;
;
0 0 0 0
下位 2bit(C0,C1)に選択されたAD変換元(0∼4)をセット
__
A レジスタ
0 0 C1 C0
CS --> High (反転)
0 1 C1 C0
__
CS --> Low (反転)
0 0 C1 C0
DEC C
JP NZ,ADC1
0F0H
0F1H
0F2H
0F3H
0F7H
2
A レジスタ
3bit 目を 1 にする
CWR 0 x x x 0 1 1 1
3bit 目を0にする
CWR 0 x x x 0 1 1 1
A レジスタAD x x x SW SW SW SW
CY
AD
x x x SW SW SW SW
CY
AD
B7 B6 B5 B4 B3 B2 B1 B0
CY
B7
B6 B5 B4 B3 B2 B1 B0 AD
B レジスタへ
B レジスタの値
④
B7
B6
B5
B4
B3
B2
B1
⑥
B6
B5
B4
B3
B2
B1
B0 MSB
⑧
B5
B4
B3
B2
B1
B0 MSB 2SB
MSB: AD 結果
⑳ MSB 2SB 3SB 4SB
LED
__
C0,C1: AD 入力選択 C2: CS C3: Clock
1 つめの8255A のコントロールワードレジスタ
2 つめの8255A のコントロールワードレジスタ
音(0)、温度(1)、光(2)、外部入力(3)
;プログラム記述終了
49
B0
5SB 6SB 7SB LSB
7.5. 入出力割込み
(1) 入出力割込みとは
いつ起こるかわからない事象(イベント)
(例:自動ドア、スイッチが押される)
↓
CPU で常時監視
↓
アクション
入出力割込み処理:
効
率
が
悪
い
ハードウェアで実現
(CPU には
割込み要求端子がある)
IN A, (0F0H)
判定
No
Yes
アクション
CPU には別の仕事をさせておき、ハード的に事象が起こったことを検出し処理する。
【8085A RST7.5 割込みの場合】
メインルーチン
CPU のRST7.5 割込み
端子に1が入力
ハード的に CALL 3CH
という命令が挿入
割込みサブルーチン
(2) 入出力割込みの種類
ノンマスカブル割込み … いつでも割込み可(割込みを禁止できない)
マスカブル割込み
… 割込みを禁止することができる。
リスタート割込み … 割込みが発生したら特定番地から再開
ベクトル割込み … 割込み発生後、選択用データ(ベクトル)を周辺機器から送り、
どのような処理をさせるかを指示
(3) CPU 8085A の割込み
特定番地
5 つの割込み要求端子
RST5.5 → CALL 2CH
リスタート割込み,マスカブル割込み
RST6.5 → CALL 34H
RST7.5 → CALL 3CH
TRAP → CALL 24H
… リスタート割込み,ノンマスカブル割込み
INTR
… ベクトル割込み, マスカブル割込み
【INTR】
INTR 端子に1(High) が入力→INTA (割込み許可端子) に0が出力
→外部からデータバスに命令(ベクトル)を入れる
選択用データ:RST 1, RST2, RST3, RST4, RST 5, RST 6, RST7(1バイト命令)
50
【RST7.5】
RST 7.5FF
CPU の
RST7.5
割込み端子
に1が入力
1ならハード的
に CALL 3CH
を実行
D Q
1
CLK
② SIM 命令
Reset
SIM 命令
マスク
例: LD A,1BH
DB 30H ; SIM 命令のマシンコード
FF
このビットが1のとき、RST7.5
マスク FF 等に値がセットされる
RST7.5 割込みを許可:0
RST7.5 割込みを禁止:1
使用せず
A レジスタ
③ EI 命令
S
DI 命令
R
割込み
イネー
ブル
RST 7.5FF
を Reset
FF
割込み全体を許可:1
割込み全体を禁止:0
RST 5.5FF
RST 6.5FF
RST 7.5FF
0:割込み可
1:割込み不可
アドレス
R
O
M
領
域
メモリ
3CH
C3
3DH
BD
3EH
04
C3 BD 04 :JP 04BDH
¦
04BDH
C3
04BEH
1E
04BFH
FF
¦
CPU の
RST7.5
割込み端子
に1が入力
0 0 0 1 1 0 1 1
8000H
C3 1E FF :JP FF1EH
ハード的に
CALL 3CH
を実行
メイン
ルーチン
¦
8200H
RET
割込み ④
ルーチン
¦
FF1EH
C3
FF1FH
00
FF20H
82
51
C3 00 82 :JP 8200H
割込みルーチンの先頭アドレス
①(ユーザーが設定)
(4) RST7.5 割込みプログラム例
;*****************************************
;* 割り込みを使用した例
*
;* 通常は音をならしておき、割り込み
*
;* 発生時(割り込みボタンが押されたら) *
;* リレーを 2 回 ON/OFF させる。
*
;*****************************************
; メインルーチン
ORG 8000H
; 初期設定
LD A,90H
OUT (CWR1),A
LD A,80H
OUT (CWR2),A
LD A,4
OUT (PORTC1),A
LD
LD
LD
LD
A,0C3H;
(0FF1EH),A
HL,INT;
(0FF1FH),HL
; 8000H 番地から
; 1 つめの8255A を
; A:入力、B,C:出力に初期化
; 2 つめの8255A を
; A,B,C:出力に初期化
;
__
; AD CS <-- High
; (0FF1EH 番地) <-- 0C3H (JP 命令) ;
; JP INT
; (0FF1FH, 0FF20H 番地) <-- INT
;
① 割込みルーチンの
先頭アドレスを設定
②RST7.5
LD A,1BH ; 割り込みボタンに接続されている RST7.5 割り込み
割込みを
DB 30H
; 端子の割り込みが可能になるように割り込みマスクをセット(SIM 命令)
許可
③ EI
; 割り込み全体を許可
; 通常ルーチン(音を鳴らす)
SOUND: LD A,0FH
; スピーカが接続されているビット(Port C MSB)
CALL OUTPC7
; を High にする
LD A,0EH
; スピーカが接続されているビット(Port C MSB)
CALL OUTPC7
; を Low にする
JP SOUND
OUTPC7: OUT (CWR1),A
LD A,9FH
DELAY: DEC A
JP NZ,DELAY
RET
; スピーカが接続されているビットを 1/0 にする
; 時間稼ぎ
④ ; 割り込みルーチン
; リレーを 2 回 ON/OFF させる
INT:
PUSH AF
; AF を退避(サブルーチン終了後、元に戻すため)
PUSH HL
; HL を退避
LD A,09H
CALL INT5
LD A,08H
CALL INT5
LD A,09H
; リレー1(Port C 4bit 目)
; を ON にする。
; リレー1(Port C 4bit 目)
; を OFF にする。
; リレー1(Port C 4bit 目)
52
CALL INT5
LD A,08H
CALL INT5
; を ON にする。
; リレー1(Port C 4bit 目)
; を OFF にする。
LD A,10H
DB 30H
; 割り込みボタンに接続されている RST7.5 割り込み FF
; をリセットする(SIM 命令)
POP HL
POP AF
; HL を元に戻す
; AF を元に戻す
EI
; 割り込み解除
RET
INT5:
INT6:
OUT (CWR1),A
LD HL,0C000H
DEC HL
LD A,H
OR L
JP NZ,INT6
RET
PORTC1: EQU 0F2H
CWR1:
EQU 0F3H
CWR2:
EQU 0F7H
END
; リレー1 が接続されているビットを 1/0 にする。
;
; 時間稼ぎ(wait)
;
;
;
; C7: スピーカ C4: リレー
; 1 つめの8255A のコントロールワードレジスタ
; 2 つめの8255A のコントロールワードレジスタ
;プログラム記述終了
53
8. コンピュータアーキテクチャ
8.1. アドレス部(オペランド部)
(1) 機械語命令
命令部
操作の種類
アドレス部(オペランド部)
操作対象の値,レジスタ指定,アドレス
(2) 1オペランド命令(1アドレス命令)…アドレス部に1つのアドレスを指定
ADD A,B ; 80H
(マシンコード)
10
000
レジスタとの 000 はADD
演算
A ← A + B
アキュムレータに対
して操作することを
前提としている。
000
このアドレスだけを
指定する。
B レジスタ:000
C レジスタ:001
D レジスタ:010
|
アキュムレータ
アキュムレータ型
計算機
演算回路
セレクタ
レジスタや
メモリ
(3) 2オペランド命令(2アドレス命令)…アドレス部に2つのアドレスを指定
命令部
第1アドレス部 第2アドレス部
ADD
【例】LD B, C
LD r, r’
01 000 001
C
B,
(マシンコード41H)
; B ← B+C
2つのオペランドを指定
レジスタ0
レジスタ1
レジスタ型計算機
|
レジスタn
演算回路
セレクタ
メモリ
54
(4) 3オペランド命令(3アドレス命令)
…アドレス部(オペランド部)に2つのアドレス(オペランド)を指定
命令部
第1アドレス部 第2アドレス部 第3アドレス部
D
←
B
+
C
(5) 0アドレス計算機(スタックマシン)…アドレス指定なし
pop
pop
命令部
20
ADD
30
20 + 30
push
50
100
100
スタック
8.2. アドレス修飾
有効アドレス(実効アドレス)…命令の操作対象のデータが格納されているメモリ上の番地
アドレス修飾…有効アドレスを指定するためのさまざまな規則
CPU
(1) 直接アドレス指定方式
命令語のアドレス部で、直接
有効アドレスを指定する方式
【例】LD A, (1234H)
レジスタ
アドレス
(命令語のアドレス部)→ 有効アドレス
レジスタ間接
アドレス
命令レジスタ
(2) 間接アドレス指定方式
命令語のアドレス部で指定されたレジスタ
またはメインメモリに有効アドレスが格納
されており、レジスタまたはメインメモリ
を介して間接的に有効アドレスを指定する
方式([3] p.49 図 2.7 参照)
【例】LD A, (HL)
・レジスタ等を経由することでアドレス
を指定するための bit 数を節約できる
・アドレスを順次変更しながら柔軟な処理
を行える
(XX 番地から 100 個のデータを YY 番地
にコピーする例 p.27 5.6 (2)参照)
(命令語のアドレス部)
→ (レジスタまたはメインメモリ)→有効アドレス
55
メモリ
データ
メモリ間接
アドレス
アドレス
データ
データ
直接
アドレス
(3) 基底(ベース)アドレス指定方式
命令語のアドレス部の値にベースレジスタ
の値を加算したものを有効アドレスとする
方式([3] p.49 図 2.8 参照)
CPU
PC
レジスタ
ベース
命令語の
+
アドレス部
5
+
ベース
レジスタ
有効
→
アドレス
・命令語のアドレス部の bit 数を短縮できる
・プログラムの再配置が容易になる
(4) PC 相対アドレス指定方式
命令語のアドレス部の値に PC の値を加算
したものを有効アドレスとする方式
命令語の
+
アドレス部
3
+
PC
→
+
b+a
プログラムの先
プログラム
→ 頭から5番目の
の先頭番地
アドレス
p
b
メモリ
b+a
データ
a
データ
p+a
データ
a
+
a
命令レジスタ
ベース相対
アドレス
絶対アドレス a
PC 相対アドレス
有効
アドレス
現在実行中の
現在実行中
→ 番地から 3 番
の番地
目のアドレス
・命令語のアドレス部の bit 数を短縮できる
・プログラムの再配置が容易になる
(5) 指標(インデックス)アドレス指定方式
命令語のアドレス部の値にインデックス
レジスタの値を加算したものを有効アド
レスとする方式
インデック
命令語の
有効
+ スレジスタ →
アドレス部
アドレス
配列 a の先
+
頭アドレス
2
→
CPU
レジスタ
ベース
b
インデックス
i
メモリ
b+a+i
56
a
命令レジスタ
+
b+a+i
a[2]の
アドレス
インデックスレジスタの
bit 数は小さくてもよい
+
データ
ベース相対アドレス
にインデックス修飾
を行った場合
p+a
(6) ビッグエンディアン(big endian )とリトルエンディアン(little endian)
2つ以上のアドレスにまたがってデータを格納する際に、
データの下位の桁を大きいアドレスに割り振る場合→ビッグエンディアン
データの下位の桁を小さいアドレスに割り振る場合→リトルエンディアン
【例】
・リトルエンディアン(windows PC など)
データ 1234H→ 600 番地:34H (下位)
601 番地:12H (上位)
・ビッグエンディアン(Mac, Sun ワークステーションなど)
データ 1234H→ 600 番地:12H (上位)
601 番地:34H (下位)
8.3. CPU の基本動作と命令パイプライン([1] p.58∼p.60)
(1) 命令実行手順
命令サイクル
F:命令のフェッチ(命令の取り出し)
D:命令のデコード(命令の解読)
E:有効アドレスの計算と命令の実行
WB:演算結果をメインメモリに書き戻す
(2) 逐次制御方式
時刻(クロック) 1
命令1
F
命令2
2
D
平均命令実行時間(CPI)=
3
E
4
WB
5
6
7
8
F
D
E
WB
5
6
7
8
WB
E
D
F
WB
E
D
WB
E
WB
総クロック数 8クロック
=
=4
実行命令数
2命令
(3) 先行制御方式(命令パイプライン制御方式)
時刻(クロック) 1
命令1
F
命令2
命令3
命令4
命令5
2
D
F
平均命令実行時間(CPI)=
3
E
D
F
4
WB
E
D
F
総クロック数 8クロック
=
=1.6
実行命令数
5命令
(4) パイプラインの乱れ([3] p.97∼105 参照)
各ステージの処理が1クロックで終了しない場合
機能回路の競合
分岐命令による乱れ
命令間のオペランドの依存関係
57
8.4. キャッシュメモリ([1] p.60∼p.66, [3] p.109∼p.125)
(1) 仕組み
【キャッシュメモリなし】
高速
データ読み出し要求
CPU
データ転送
低速
メイン
メモリ
応答に時間がかかる→CPUが待ち状態(メモリ遅延)
【キャッシュメモリあり】
高速
CPU
データ読み出し要求
データ転送
高速(SRAM など)
キャッシュ
先読み
メモリ
低速(DRAM など)
メイン
メモリ
キャッシュメモリに必要なデータがあれば(ヒットすれば)
メモリ遅延が少なくてすむ
ヒット率=必要なデータがキャッシュメモリ内にある確率
【例】[3] p.109
キャッシュメモリのアクセス時間=10 ns
メインメモリのアクセス時間=200 ns
ヒット率=0.95
+200 ns×
平均メモリアクセス時間=10 ns×
・ キャッシュメモリなし 200 ns に比べて約 10 倍高速
・ ヒット率の向上が重要
=19.5 ns
【ヒット率向上のための方法】([1] p.62)
① 命令キャッシュとデータキャッシュを分離する
(命令とデータの格納場所が異なることが多いため)
② 複数のキャッシュを用いる
CPU−1次キャッシュ−2次キャッシュ−メインメモリ
(2) キャッシュライン(ブロック)とマッピング
キャッシュライン(ブロック)…キャッシュメモリの単位(128∼256 bit 程度)
マッピング(対応づけ、連想方式)
メインメモリ
① 直接マップ方式(ダイレクトマッピング(direct mapping)方式)
対応づけが番地ごとにあらかじめ決定されている方式
② 完全連想方式(フルアソシエイティブ(fully associative mapping)方式)
メインメモリの任意のブロックをキャッシュの任意のブロックにマッピングでき
る方式
③ 群連想方式(set associative mapping) ①と②の中間にあたる方式
58
【例】([3] p.113~p.114)
1番地あたりの記憶容量 1 byte
キャッシュライン(ブロック)の大きさ 1 ブロック = 64 byte = 2 6 byte = 2 6 番地
キャッシュメモリ容量 64 k byte = 216 byte = 210 ブロック = 0 ~1023 ブロック
4G byte = 2 32 byte = 2 26 ブロック
メインメモリ容量
① 直接マップ方式(direct mapping)の例 ([3] p.114)
メインメモリのブロックとキャッシュメモリのブロックの
対応づけがあらかじめ決定されている方式
0
2048
[キャッシュメモリ]
1 行×1024 列に配置
1
1
2
1026
ブロック番号 3071
のデータを保持
1023
3071
…
キャッシュメモリの1つのブロックが
あらかじめ決められた 16 ブロックの
2
メインメモリに対応
0 0
1
1 1024 1025
2 2048 2049
[メインメモリ]
群内ブロック番号
(行番号,Tag)
M
1023
2050
…
…
…
M
O
M
…
2 26 -1
2
1026
M
216 -1
0
1
1 ブロック
6
= 2 番地
2047
3071
2
1023
群番号(列番号,Index)
群番号(列番号,Index) = キャッシュメモリの列数 = 210
群内ブロック番号(行番号,Tag)=メインメモリ容量( 2 26
ブロック)/
群番号( 210 )= 216
【例】メインメモリのアドレス(ブロック番号 1026 のデータが要求された時)
群内ブロック番号(16bit) 群番号(10bit)
0000 0000 0000 0001
キャッシュメモリにどの群内ブロ
ック番号(行番号)に対応するメイ
ンメモリの内容が記憶されている
かをディレクトリ(連想メモリ)と
呼ばれるレジスタに保存しておく。
00 0000 0010 ブロック内アドレス(6bit)
1
2
比較:
一致していれば hit
[ディレクトリ(連想メモリ)]
0
2
1
0
2
1
…
1023
2
[キャッシュメモリ]
2048
1
1026
…
3071
《特徴》 ・マッピングが簡単
・ヒット率が低下する可能性が高い
59
群内ブロック番号
(行番号,16bit)
② 完全連想方式(fully associative mapping)の例 ([3] p.113)
メインメモリの任意のブロックをキャッシュの任意のブロックにマッピングできる方式
[キャッシュメモリ]
1024 行×1 列に配置
[ディレクトリ(連想メモリ)]
0
1
群内ブロック番号(26bit)
メインメモリとの対応を記憶しておく
レジスタ(ディレクトリ)が非常に大
きくなる。
(26bit×1024 行)
群内ブロック番号(26bit)
M
M
1023
群内ブロック番号(26bit)
[メインメモリ]
0
1
2
CPU から指定された群内ブロック番号(行番号)
に一致する行を検索(1024 行を検索する必要がある)
:一致すれば hit
(データがキャッシュ内に存在)
群内ブロック番号
(行番号) 2 26 個=
M
メインメモリ容量( 2 26 ブロック)
2 26 -1
/群番号(1)
群番号1個
メインメモリのアドレス
ブロック内アドレス(6bit)
群内ブロック番号(行番号,26bit)
③ 群連想方式(set associative mapping)の例
①と②の中間にあたる方式。キャッシュメモリをn行m列とした場合、
各行について完全連想方式、各列について直接マップ方式とする方式。
n行の場合、nウェイ群連想方式という。
[ディレクトリ(連想メモリ)]
[キャッシュメモリ]16 行×64
列に配置
10
(16 ウェイ群連想方式)
64
16( 24 )行
16 ウェイ
2
25
M
26 列 = 2 ブロック 4
2 ウェイ
127
1
65
…
…
2 26 -1
20
M
O
M
1
[キャッシュ
メモリ]
2
0
1
64
群内
ブロック
M
番号
(行番号) 2 20 -1 2 25
220 個
0
メインメモリ容量 ( 2 26 ブロック)
0
63
65
127
M
O
M
…
2 26 -1
1
M
O
1
2
20
-1
M
1
63(群番号,行番号)
0 列の連想メモリの中で
2 20 -1 に一致する行を検索(16 行を検索する必要)
:一致すれば hit
(データがキャッシュ内に存在)
63
群番号(列番号)
=キャッシュメモリの列数=26 個
メインメモリのアドレス
(ブロック番号 2
-1
…
…
…
…
…
1
0
M
…
0
1
列番号 (2 6 )
キャッシュメモリの各ブロックに対応
記憶しているメインメモリブロックの行番号(20bit)を保持
25
のデータが要求された時)
60
2 20 -1
1111 1111 1111 1111 1111
群内ブロック番号
(行番号 20bit)
0
000000
(6bit)
群番号 ブロック内
(列番号 アドレス
6bit)
【練習】キャッシュメモリの容量が 128K バイト、主記憶の最大容量が 4G バイトのメモリ系において、ブロ
ックの大きさが 32 バイトの8ウェイ set associative mapping を採用したとき、メインメモリブロックの
列(群番号、Index)及び行(群内ブロック番号、Tag)の指定に何ビット必要か。またディレクトリ全体で
何ビット必要か。
([3]p.116 練習問題 3.11)
(3) キャッシュメモリの書き込み方式 ([1] p.65)
・ライトスルー方式…CPUがキャッシュライン(ブロック)の内容を書き換えたら、メイ
ンメモリ上の内容もすぐに書き換える方式
《利点》メインメモリの内容とキャッシュラインとの整合を常にとるため安全
《欠点》書き込み時のメモリ遅延はほとんど改善されない
・ライトバック方式…CPUがキャッシュライン(ブロック)の内容を書き換えても、すぐ
にはメインメモリに対して書き換え要求を出さず、CPUの処理がひ
まな時を見計らって書き換える方式
《欠点》メインメモリの内容とキャッシュラインとの内容が異なることが多いため、
高度なキャッシュ管理システムが必要
《利点》書き込み時のメモリ遅延が発生しにくい
(4) 置き換えアルゴリズム ([3] p.119)
キャッシュメモリ中の空きブロック枠がなくなった場合に、どのブロック枠を置き換えるか
を決める方法
・乱数法…順番にブロック枠を選ぶ
n ウェイの場合、n回の書き換えの間、キャッシュに残るため、ウェイ数が大き
ければ悪い方法ではない。
(一番古いキャッシュを書き換えることになる。first-in first-out)
・usage bit 法…各ブロック枠に対応して 1bit の usage bit を設け、アクセスがあると 1 にす
る。書き換えが必要な場合は、usage bit が 0 のブロック枠を乱数法で選ぶ。
なお、すべての usage bit が1になったら、全ての usage bit を 0 にする。
8.5. CISC とRISC([1] p.66∼p.68)
(1) CISC (Complex Instruction Set Computer, 複合命令セットコンピュータ)
1個の命令で複雑な機能を実現する命令セットを備えた CPU
(2) RISC (Reduced Instruction Set Computer, 縮小命令セットコンピュータ)
使用頻度の高い単純な命令に限定した CPU
(3) RISC で処理を行う CISC
命令は CISC でありながら、内部的には RISC で処理を行う
CISC 命令→内部で RISC 命令に変換→RISC コアで命令実行
CISC
RISC
RISC+CISC
高速
利点 高度な機能を数少な 高速
・1命令当たりの実行時間が大幅に短縮 CISC 命令との互換性あ
い命令で実現可能
・パイプライン効率も良好
り
・ハードウェアのみでデコード可能
欠点
高速化が難しい
限定された命令しか使用できない
・1命令当たりのクロッ CISC 命令との互換性がない
ク数が増加
・回路が複雑化
制 御 マイクロプログラム
方式
布線論理
(ワイヤドロジック)
61
マイクロプログラム
+ワイヤドロジック
8.6. 制御アーキテクチャ
(1) 制御回路の役割
PC→メモリ(命令データ) → IR(命令レジスタ)
→ 制御回路(命令のデコード:命令解読) → 制御信号により各部の配線を切り替え
各部の配線切り替え方法1(制御ゲートを使用)
バス1 バス2 制御信号 4
バス3
レジスタ1
制御ゲート
制御信号 8
(スリーステートバッファ)
制御信号 1
制御信号 5
制御信号が1のとき
スイッチ ON
レジスタ2
制御信号 9
制御信号 2
例えば、制御信号1,5,11,10 が
制御信号 6
「1」であれば、レジスタ1の値と
レジスタ2の値で演算が行われ、そ
レジスタ3
の結果がレジスタ3に格納される。
制御信号 10
制御信号 3
演算器
制御信号 11
メモリ
制御信号 7
制御信号 12
各部の配線切り替え方法2(マルチプレクサを使用)
バス3
バス1 バス2
マルチ
プレクサ1
制御信号1
(2bit)
レジスタ1
制御信号 4
制御信号1が 00,
制御信号2が 01,
レジスタ2
制御信号 5
マルチ
プレクサ2
例えば、
レジスタ3
制御信号7が0,
制御信号 6 が1,
その他が0であれば、レジ
制御信号 6
スタ1の値とレジスタ2の
値で演算が行われ、その結
果がレジスタ3に格納され
制御信号 2 (2bit)
る。
演算器
マルチ
プレク
サ3
メモリ
制御信号 3
制御信号 7 (1bit)
62
一般的な構成例
制御信号 4
バス1 バス2
バス3
R0
マルチ
プレクサ1
R1
¦
Rn
制御信号 1
マルチ
プレクサ2
制御信号 5
制御信号
制御信号 6
命令
デコーダ
PC
制御信号 2
アドレス
計算回路
演算器
制御信号 7
IR
マルチ
プレク
サ3
制御
信号 10
MDR
制御信号 3
制御信号 8
MAR
制御信号 9
メモリ系
(2) 状態遷移図
命令サイクル例 F:命令のフェッチ(命令の取り出し)
D:命令のデコード(命令の解読)
E:有効アドレスの計算と命令の実行
WB:演算結果をメインメモリに書き戻す
制御信号の系列
F ①制御信号2が11、制御信号8が00、制御信号9が1、制御信号 10 が1
PC→マルチプレクサ2→バス2→アドレス計算回路→マルチプレクサ3→MAR→メモリ→IR
D ②IR→命令デコーダ→制御信号(命令に従い制御信号の時系列が生成)
E ③実行
命令によって変化
CPU の内部状態によって変化
メモリ系の状態によって変化
F
D
E
WB
状態遷移図
63
(3) 制御方式
・布線論理(ワイヤドロジック)制御方式
制御用論理回路を直接ハードウェアによる順序回路で実現する方式
【利点】高速
【欠点】制御回路の設計や修正が困難
RISC で用いられることが多い
・マイクロプログラム制御方式
制御用論理回路をマイクロプログラム(firmware; ファームウェア)という一種のプ
ログラム(ソフトウェア)によって制御する方式
【利点】制御回路の設計や修正が容易
ハードウェアとソフトウェアの役割分担の調整が容易
【欠点】布線論理制御方式より低速
CISC で用いられることが多い
(4) 布線論理(ワイヤドロジック)制御方式
ステートマシン(state machine)
IR
D
組み合わせ
順序論理回路
F
D
D
D
E
制御信号
制御信号
D
WB
制御信号
各部の制御信号の時系列
この制御メモリには,超高速
(5) マイクロプログラム制御方式
メモリを使用する必要あり。
【水平型】
マイクロプログラム
・マイクロプログラムの容量が
次命令アドレス
マイクロ命令
大きくなる。
10行
11
0011000001110
アドレス
デコーダ
マイクロ命令
アドレス
20行
20
0
マイクロプログラムカウンタ
条件信号
IR
1110001110000
1111111111111
マイクロ命令レジスタ
各部の制御信号
制御ゲート数分(20~100bit)
64
【垂直型】
・マイクロプログラムの容量が小さい。
・水平型より低速。
アドレス
デコーダ
短い
次命令アドレス マイクロ命令
マイクロ命令
アドレス
マイクロプログラムカウンタ
条件信号
マイクロ命
令レジスタ
IR
デコーダ
各部の制御信号
(6) 仮想マシン
マイクロプログラム制御コンピュータの制御メモリが書き換え可能であれば、
マイクロプログラムを書き換えることによって、命令セット等を変更することができる。
→書き換えたマイクロプログラムによって様々なマシンをエミュレーション(模擬)する
ことができる。このようなコンピュータを仮想マシンという。
(7) 制御回路
同期式: 無駄時間あり
回路が簡単で、設計保守が容易
非同期式:高速
ハザードが問題となるため、回路が複雑になり、設計保守が困難
(8) 制御回路の設計手順
① 制御回路への入出力信号を考え、ブロック図を作成
② 制御状態(state)を決定
③ 状態遷移図作成
④ 真理値表作成し、論理回路の最適化(この部分は、自動化プログラムを使用することが
多い)
65
参考文献
[1]
[2]
[3]
[4]
伊勢雅英「よくわかる最新 PC アーキテクチャの基本と仕組み」
(秀和システム)
原田益水「マイクロコンピュータのすべて」
(電波新聞社)
橋本昭洋「計算機アーキテクチャ」
(昭晃堂)
松島 守「Z− 80アセンブラ・シミュレータ SEASON/Win」
http://www.ishikawa-nct.ac.jp/lab/E/www/matsu.html
66
付録 命令コード表
r
LD
LD
LD
LD
LD
LD
LD
LD
LD
A, r
B, r
C, r
D, r
E, r
H, r
L, r
(HL), r
r, B2
r
ADD
ADC
SUB
SBC
AND
XOR
OR
CP
INC
DEC
A, r
A, r
r
A, r
r
r
r
r
r
r
ADD
ADC
SUB
SBC
AND
XOR
OR
CP
Z80
A, B2
A, B2
B2
A, B2
B2
B2
B2
B2
A
7F
47
4F
57
5F
67
6F
77
3E
A
87
8F
97
9F
A7
AF
B7
BF
3C
3D
B
78
40
48
50
58
60
68
70
06
B
80
88
90
98
A0
A8
B0
B8
04
05
C
79
41
49
51
59
61
69
71
0E
C
81
89
91
99
A1
A9
B1
B9
0C
0D
D
7A
42
4A
52
5A
62
6A
72
16
(1) データ転送命令1
E
H
L (HL)
7B 7C 7D
7E
43 44 45
46
4B 4C 4D
4E
53 54 55
56
5B 5C 5D
5E
63 64 65
66
6B 6C 6D
6E
73 74 75
1E 26 2E
36
D
82
8A
92
9A
A2
AA
B2
BA
14
15
(2) 演算命令
H
L (HL)
84 85
86
8C 8D
8E
94 95
96
9E
9C 9D
A4 A5
A6
AE
AC AD
B6
B4 B5
BC BD
BE
24 2C
34
25 2D
35
E
83
8B
93
9B
A3
AB
B3
BB
1C
1D
(3) 数値演算命令
コード
メモ
C6
A Å A + B2
CE
A Å A + B2 + CY
D6
A Å A - B2
DE
A Å A - B2 - CY
E6
A Å A AND B2
EE
A Å A Ex-OR B2
A Å A OR B2
F6
FE
A - B2
フラグのみ変化
LD
LD
LD
LD
LD
LD
LD
(4) 2バイトデータの命令
r1r2 BC DE HL SP
メモ
LD r1r2,B3B2 01 11 21 31 r1r2ÅB3B2
ADD HL,r1r2
INC r1r2
09 19 29 39 HLÅHL+r1r2
03 13 23 33 r1r2År1r2+1
DEC r1r2
0B 1B 2B 3B r1r2År1r2-1
LD
EX
EX
JP
LD
67
メモ
A Å r
B Å r
C Å r
D Å r
E Å r
H Å r
L Å r
HL Å r
r Å 1バイトの数値 B2
メモ
A
A
A
A
A
A
A
A
r
r
Å A
Å A
Å A
Å A
Å A
Å A
Å A
– r
Å r
Å r
+ r
+ r + CY
– r
– r - CY
AND r
Ex-OR r
OR r
フラグのみ変化
+ 1
– 1
(5)データ転送命令2
Z80
コード
メモ
(BC), A
02
(BC) Å A
A, (BC)
0A
A Å (BC)
(DE), A
12
(DE) Å A
A, (DE)
1A
A Å (DE)
(B3B2), A
32
(B3B2)Å A
A, (B3B2)
3A
A Å (B3B2)
(6)データ転送命令3
Z80
コード
メモ
(B3B2), HL
22
(B3B2)Å L
(B3B2+1)Å H
HL, (B3B2)
2A
L Å (B3B2)
H Å (B3B2+1)
(SP), HL
E3
(SP)
L
(SP+1)
H
DE, HL
EB
DE
HL
(HL)
E9
PC Å HL
SP,HL
F9
SP Å HL
JP
JP
JP
JP
JP
JP
JP
JP
JP
(7) ジャンプ命令
Z80
コード
B3B2
C3
Z, B3B2
CA
NZ, B3B2
C2
C, B3B2
DA
NC, B3B2
D2
PE, B3B2
EA
PO, B3B2
E2
M, B3B2
FA
P, B3B2
F2
Z80
RLCA
RRCA
RLA
RRA
(12) 入出力・割り込み命令
メモ
Z80
コード
OUT (B2), A
D3
(IO B2) Å A
IN A, (B2)
DB
A Å (IO B2)
DI
F3
割り込み禁止
EI
FB
割り込み許可
RIM
20
AÅマスクの状態
SIM
30
マスクの状態ÅA
(8) コール命令
Z80
コード
CALL B3B2
CD
CALL Z, B3B2
CC
CALL NZ, B3B2
C4
CALL C, B3B2
DC
CALL NC, B3B2
D4
CALL PE, B3B2
EC
CALL PO, B3B2
E4
CALL M, B3B2
FC
CALL P, B3B2
F4
Z80
DAA
CPL
SFC
CCF
NOP
HALT
(9) リターン命令
Z80
コード
RET
C9
RET Z
C8
RET NZ
C0
RET C
D8
RET NC
D0
RET PE
E8
RET PO
E0
RET M
F8
RET P
F0
S
Z
MSB
フラグレジスタ
P
1
0
AC 0
C1
D1
E1
(13) その他の命令
コード
メモ
27
BCD コード Å A
2F
A Å A の反転
37
CYÅ1
3F
CYÅCY の反転
00
No Operation
76
STOP
(14) アセンブラの擬似命令
メモ
擬似命令
ORG
プログラム・データの先頭番地
を示す。
END
プログラムの最後につける。
EQU
ラベルに数値を割り当てる。
DB
1バイト単位のデータを定義す
る。
DW
2バイト単位のデータを定義す
る。
DS
メモリ領域をバイト単位で確保
する。
CY
LSB
(10) プッシュ・ポップ命令
r1r2 BC DE HL AF
PUSH r1r2,
C5 D5 E5 F5
POP r1r2
(11) 回転命令
メモ
コード
07
CY Å A7
A0 Å A7
0F
CY Å A0
A7 Å A0
17
CY Å A7
A0 Å CY
1F
CYÅ A0
A7 Å CY
F1
68
1