Ⅲ-2.マイクロコンピュータの実験

Ⅲ-2.マイクロコンピュータの実験 - 1
1.目的
(1)基本的なマイクロコンピュ-タの構成を学ぶとともに、各部の機能を理
解する。
(2)マイクロコンピュ-タの機械語プログラムの理解を深める。
2.マイクロコンピュ-タの動作
図1は、8ビットマイクロプロセッサ Z80 を用いたマイクロコンピュ-タシ
ステムのブロック図である。以下に、このマイクロコンピュ-タを例にとり、
各部の動作を説明する。
記憶部
RAM 5116
ROM 2816A
中央処理部
(CPU)
Z80
入出力部
(I/O ポート)
8255
クロック発生回路
図1
実験システムのブロック図
(1)CPU
CPUチップには、アキュムレータ,演算レジスタ,インデックスレジスタ,
スタックポインタ,フラグレジスタ,プログラムカウンタなど種々のレジスタ
群、ALU(Arithmetic and Logic Unit),命令デコーダ,バス制御回路,割込み
制御回路および命令の解釈実行を進める制御回路などが集積されている。この
ように、CPUチップにはディジタルコンピュ-タの中心的な部分が収められ
ており、主記憶および入力装置を接続するだけで簡単なコンピュ-タを構成で
きる。Z80 の機械語は全部で 157 種類あり、8ビットのデ-タ転送(LOAD)や加減
算等の基本的な命令をはじめとして、16ビットの加減算、主記憶内でのブロ
ック転送、一連のデ-タブロックの入出力などが用意されている。
(2)クロック発生回路
CPUチップでは、クロック信号に同期してチップ内の各機能ユニットを動
作させる。このクロック信号は、外付けのクロック発生回路で供給する。実験
12
回路では、2つのNOT回路と水晶振動子を用いて約 2.5MHz の信号を発生さ
せている。さらに必要に応じてこれを 1/4 に分周し、high 周期と low 周期の長
さを等しくして安定化したクロック信号を用いる。この様子を図2に示す。C
PUチップは、クロック信号に同期して命令を実行するので、命令の実行速度
はクロック信号の周波数によって決定される。例えば、8ビットデ-タのレジ
スタ間転送には4クロックサイクルが必要なので、614KHz のクロックを用いた
場合、実行時間は 6.5μsec となる。
図2
クロック発生回路
(3)RAM,ROM
ROM (Read Only Memory)とRAM (Random Access Memory)は、ともに
主記憶として用いられる半導体メモリである。ROMは読み出し専用メモリで
あり、頻繁に利用され、かつ変更されることのないプログラムやデ-タなどが
記憶される。また、主記憶は図3に示す「メモリ空間」の構成になっている。
しかし、実際の回路はデコード用ICを省略して簡素化したアドレスデコード
を行なっているので、800H 以上(800H-7FFFH,8800H-FFFFH)のアドレスに対して
は正しくデコードしない。
0000H
07FFH
メモリマップ
ROM
8000H
87FFH
RAM
I/O ポート
I/O
A Port
00H
B Port
01H
C Port
02H
Control Word
03H
FFFFH
図3
メモリ・I/O空間マップ
13
(4)I/Oポート
I/Oポートは、8ビットの入出力用レジスタで、入出力装置とCPUチッ
プ間のデ-タ転送を仲介する。I/Oポートの主な役割は、入出力デ-タのバ
ッファリング(Buffering)である。I/Oポートの動作をデ-タ出力の場合につ
いて説明する。CPUが出力命令を実行すると、出力デ-タは図4に示すよう
にデ-タバス上のデ-タをポート内部のレジスタに取込み固定する。従って出
力装置はI/Oポートのラッチ出力からデ-タを受取れば、任意の速度で動作
することができる。I/Oポート用LSI(8255)には3つの独立した
I/Oポート(Port A,B,C)と1つの制御レジスタ(control word)が集積されてい
る。1つのシステムには複数のI/OポートLSIが使われているのが普通で
ある。各ポートを識別するために主記憶と同様なアドレス付けを行なっている。
図1のシステムの場合は、図3の8ビットの「I/O空間」を持つ。Z80で
はI/O空間とメモリ空間は全く独立の空間である。例えばI/O空間の 01H
に入出力を行なっても、主記憶の 0001H には何も影響を与えない。I/Oポー
トと主記憶が同一のアドレスバス、デ-タバスを使いながら、このように空間
を分離できるのは、CPUがバス制御信号 MREQ,IORQ によってバスを使い分け
ているからである。なお実験回路ではI/O空間のデコードも一部簡略化して
いるので、例えば8255のポートAは、I/Oアドレス(*****000)で読出し
書込みができる(*で示すビットは 0 でも 1 でもよい)。
MREQ
CPU
ROM
アドレスバス
データバス
IORQ
I/O ポート
図4
I/Oリード/ライト
14
RAM
3.Z80 アセンブラ・プログラミング
3-1.アセンブラ記述のルールと機械語への変換方法
次のプログラムはメモリ・アドレス 8020H 番地の内容を 8021H 番地に移動す
るためのプログラムである。まず、処理手順をニモニックで記述し、その内容
を解りやすくコメントで説明する。次にニモニック-機械語変換表を利用して
機械語に変換する。ニモニック表記の段階ではプログラムを格納するメモリの
番地(アドレス)がまだ特定されていないため、ラベル(適当な名前をつける)を使用
してそのプログラム位置を表し、機械語変換後は具体的なメモリ・アドレスを
指定する。
* 8020H の H は 8020 が 16 進数(Hexadecimal number)であることを表す。
ラベル
ニモニック
LOOP1: LD A,(8020H)
LD (8021H),A
HALT
コメント
メモリアドレス
;8020H 番地の内容をレジスタに格納
;レジスタの内容を 8021H に格納
;命令実行の停止・割り込み待ち
#0000
機械語
3A2080
322180
76
Z80 アセンブラで利用可能な命令には,主に次のようなものがある。
a.ロード命令(レジスタやメモリの間でデータを移動する)
b.算術論理演算命令(加算、減算、論理和、論理積など)
c.シフト命令(指定レジスタ内のデータをビット単位で移動)
d.ジャンプ命令(プログラムの流れを条件に応じて変更する)
e.入出力命令(スイッチの検査、LED の点灯などに利用)
3-2.Fレジスタとフラグ変化
Fレジスタは6つのフラグより構成され、演算命令やローテート命令、入出
力命令などの実行結果によって変化する。
Cフラグは、最上位ビットからの桁上り、桁下がりにより或いはローテー
トシフトで変化する。
Zフラグは、実行結果がゼロになったときに“1”にセットされる。
Sフラグは、実行の結果が符号付算術演算の結果として負の数になったとき
1になる。
P/Vフラグは、命令によりパリティフラグとオーバーフローフラグに使い
分ける。
Hフラグは、8ビット演算で下4ビットからの桁上げ、桁下がりがあったと
き1になる。
Nフラグは、加算系、減算系であるかによって変化する。
15
3-3.実験回路の使い方
メモリアドレスは 4 桁で 16 進数(0-9,A-F)で表される。
# X1 X2 X3 X4 H
(例 #0058H, #80A2H)
最上位桁 X1 は、下記④のスイッチで指定し(0 or 8)、X2 は 0 に固定。
下位 2 桁 X3 X4 は、⑥のスイッチと⑧プリセットにより指定。
①4桁数字表示器
A,Bは、アドレスの下位2桁の値を表示
C,Dは、メモリ格納データ値
A B C D
②プログラ ムの実行スイッチ
プログラムの入力・確認時は
”書込/読出”側にし、
プログラム実行時に
”実行”側にする。
④メモリ切 り替え
ROM側でアドレス上位が"0"、
RAM側でアドレス上位が"8"となる
例)ROM側にし、4桁数字表示器が
1234である時、アドレスは0012Hの
指定。
③リセット
スイッチ
実行
書込/読出
⑤電源スイ ッチ
0にする
書込
読出
⑥命令変換 スイッチ
図5
⑦書込読出
⑧プリセッ ト
⑨クリア
⑩書込読出 制御スイッチ
マイクロコンピュータ実験回路
16
[実験の手順]
A.プログラムの作成(機械語への変換)
例)LOOP1: LD A,(8020H)
LD (8021),A
HALT
#0000
3A 20 80
32 21 80
76
B.プログラムの入力
1)②を書込/読出,④を ROM にし,⑤の電源スイッチをオンにする。
2)⑩を書込にし,書込表示 LED が点灯することを確認する。
3)書込読出制御の⑨クリアスイッチを押す。①4 桁数字表示器の上位 2 桁
(X1X2)が 0 となることを確認する。
4)⑥命令変換スイッチで 3A を入力し,⑦書込読出スイッチを押す。
*4)-10)の過程で①4 桁数字表示器の状態を確認していくこと。
5)⑥命令変換スイッチで 20 を入力し,⑦書込読出スイッチを押す。
6)⑥命令変換スイッチで 80 を入力し,⑦書込読出スイッチを押す。
7)⑥命令変換スイッチで 32 を入力し,⑦書込読出スイッチを押す。
8)⑥命令変換スイッチで 21 を入力し,⑦書込読出スイッチを押す。
9)⑥命令変換スイッチで 80 を入力し,⑦書込読出スイッチを押す。
10) ⑥命令変換スイッチで 76 を入力し,⑦書込読出スイッチを押す。
11) ⑩を読出にする。
C.プログラムの確認
1)②が書込/読出,④が ROM,⑩が読出 であることを確認する。
2)⑨クリアスイッチを押す。①の上位 2 桁が 00 となり,下位 2 桁(X3X4)に
プログラムデータ(例の場合では 3A)が表示されていることを確認する。
3)⑦書込読出スイッチを押し,①の下位 2 桁にプログラムデータが順次表示
されることを確認する。(例の場合では,80 から 76 まで)
D.実行前のメモリデータの確認
1)②が書込/読出,④が RAM,⑩が読出 であることを確認する。
1)メモリアドレス 8020H のデータを確認するには,
最上位が 8 -> ④を RAM,
下位 2 桁が 20 -> ⑥で 2 0,次に⑧のプリセットを押す。
①の上位 2 桁が 20 となり,格納されているメモリデータが①の下位 2 桁に
表示される。*表示されるデータを記録しておくこと。
17
E.プログラムの実行
1)⑩が読出になっていることを確認する。
2)②を実行側にし,③のリセットスイッチを 1 度押す。
F.実行後のメモリデータの確認
D.実行前のメモリデータの確認と同様に、対象になっているメモリデータの値
を確認し、記録する。
4.実 験
4-1.メモリアドレス 8020H 番地と 8021H 番地に 55H の値を格納する。
*以下の予習 1~3 を行った方は実験前に見せて下さい。[+10 点]
予習 1
以下のプログラムを機械語に変換せよ。
<ラベル><ニモニック>
<アドレス><機 械 語>
START: LD
A,55H
#0000H
3E (
)
LD
(8020H),A
#0002H
32
20
80
LD
(8021H),A
#0005H (
)(
)(
)
HALT
#0008H
76
実 験
① プログラム(機械語データ)の入力と確認
② 実行前のメモリ 8020H と 8021H の内容を確認し、下表に記録
③ プログラム実行後、メモリの内容を確認し、下表に記録
*メモリデータの記録
実行前
実行後
8020H
8021H
18
4-2.8020H 番地から 807FH 番地までに 00H の値を格納する。
ヒ ン ト ① HL レジスタにより間接アドレッシングを行なう。
② 条件付きジャンプ命令を利用する。
例)
LD
B,05H
LOOP1: XXXXX
XXXXX
LOOP1 のルーチンは 5 回
DEC B
繰り返される
JP
NZ,LOOP1
予習 2
以下のプログラムを機械語に変換せよ。
<ラベル><ニモニック>
<アドレス><機 械 語>
START: LD HL, 8020H
#0000H (
) 20
LD B, 60H
#0003H
06
60
LD A, 00H
#0005H
3E
00
LOOP1: LD (HL), A
#0007H (
)
INC HL
#0008H
23
DEC B
#0009H (
)
JP
NZ,LOOP1
#000AH (
) 07
HALT
#000DH
76
80
00
実 験
① プログラム(機械語データ)の入力と確認
② 実行前のメモリ 8020H から 807FH までの範囲で5箇所の内容を確認し、
下表に記録
③ プログラム実行後、メモリの内容を確認し、下表に記録
*メモリデータの記録
アドレス
実行前
実行後
19
4-3.8020H 番地から 804FH 番地までの間に 00H から 2FH の値を格納する。
ヒ ン ト ①4-2では、格納するデータ0がアドレス A に入っている。
この A のデータを増やしていくには?「INC A」命令を利用する。
②8020H から 804FH までのメモリは 30H ある。(10 進数では 48)
予習 3
下線部に適切な命令語または値を入れ、プログラムを完成させよ。
START: LD HL,8020H
LD
LD A, 00H
LOOP1: LD (HL), A
INC HL
DEC B
JP NZ, LOOP1
実 験
① ニモニックから機械語への変換
② プログラム(機械語データ)の入力と確認
③ 実行前のメモリ 8020H から 804FH までの範囲で5箇所の内容を確認し、
下表に記録
④ プログラム実行後、メモリの内容を確認し、下表に記録
*メモリデータの記録
アドレス
実行前
実行後
20
4-4.8020H 番地の内容が 65H より 1)大きい,2)小さい,3)等しいの判定を
行い,その結果に基づいて 8021H 番地に 1)01H,2)02H,3)03H の値
を格納する。
ヒ ン ト
処理の流れをフローチャートで表すと以下のようになる。65H との
比較を行うには比較命令「CP n」を利用する方法がある。
Start
(8020H)→A
>
A:65
<
=
01H
02H
03H
→(8021H)
→(8021H)
→(8021H)
End
START:
LD
CP
JP
JP
JP
OKII: LD
LD
HALT
TIISAI: LD
A,(8020H)
65H
Z,HITOSHI
C,TIISAI
OKII
A,01H
(8021),A
HITOSHI:LD
A,
;メモリ 8020H の内容を
;65H とレジスタ A の比較(A-65H の減算)
;減算 A-65H の結果がゼロなら HITOSHI へ
;
A-65H <0 (負)なら TIISAI へ
;無条件(A-65H >0)なら OKII へ
A,02H
21
実 験
① ニモニックから機械語への変換
② プログラム(機械語データ)の入力と確認
③ 実行前のメモリ 8020H と 8021H の内容を確認し、下表に記録。
8020H のデータを変更するには、
メモリ切り替えスイッチを RAM →命令変換スイッチで 2,0 を押す
→プリセットボタンを押す→書込読出制御スイッチを書込み
→命令変換スイッチで変更データを押す→書込み読出しボタンを押す
④ プログラム実行後、メモリの内容を確認し、下表に記録。
*メモリデータの記録
<65H より大きい場合>
アドレス
実行前
8020H
8021H
実行後
<65H より小さい場合>
アドレス
実行前
実行後
8020H
8021H
<65H と等しい場合>
アドレス
実行前
8020H
65H
8021H
実行後
22
5.課 題
(1)以下のプログラムは 10 進数を 16 進数に変換するためのものである。各
行にコメントを追加し,レジスタ A, B, C, D の最終的な値を示せ。
[+10 点]
LP1:
LP2:
LP3:
LD
LD
AND
SRL
SRL
SRL
SRL
LD
LD
DEC
JP
ADD
JP
LD
LD
AND
ADD
HALT
A,63H
C,A
F0H
A
A
A
A
B,A
A,00H
B
M,LP3
A,0AH
LP2
D,A
A,C
0FH
A,D
(2)種々のRAM、ROMについて調べ、ぞれぞれの長所・短所を示せ。
[+10 点]
(3)マイクロコンピュータが組み込まれている製品を3つあげ,どのような
目的で利用されているかをそれぞれ説明せよ。
[+10 点]
6.参考図書
1)太平洋工業株式会社,制御用マイコン,日刊工業新聞社,1994
2)横田英一,Z80の使い方,オーム社,1989
23
代表的な Z80 命令語
No
ニモニック
機械語
■ ロード命令
LD A,n
3E n
LD (mn),A
32 n m
LD A,(mn)
3A n m
LD A,(HL)
7E
LD A,C
79
LD B,n
06 n
LD B,A
47
LD C,A
4F
LD D,A
57
LD L,A
6F
LD HL,mn
21 n m
LD (HL),A
77
■ 算術論理演算命令
CP n
FE n
ADD A,n
C6 n
ADD A,D
82
ADD A,L
85
INC A
3C
INC HL
23
DEC B
05
AND n
E6 n
XOR n
EE n
■ シフト命令
SRL A
CB 3F
■ ジャンプ命令
JP mn
C3 n m
JP Z,mm
CA n m
JP NZ,mn
C2 n m
JP C,mn
DA n m
JP M,mn
FA n m
■ CPU コントロール
HALT
76
■ ビット操作命令
BIT 0,A
CB 47
■ 入出力命令
IN A,(n)
DB n
OUT (n),A
D3 n
[ニモニック-機械語変換表]
説
明
8 ビット定数 n をレジスタ A に格納
レジスタ A の値をメモリ mn 番地に格納
メモリ mn 番地の値をレジスタ A に格納
レジスタ HL で指定するメモリの値をレジスタ A に格納
レジスタ C の値をレジスタ A に格納
8 ビット定数 n をレジスタ B に格納
レジスタ A の値をレジスタ B に格納
レジスタ A の値をレジスタ C に格納
レジスタ A の値をレジスタ D に格納
レジスタ Ano 値をレジスタ L に格納
16 ビット定数 mn をレジスタ HL に格納(m→H,n→L)
レジスタ A の値を HL で指定のメモリに格納
レジスタ A と 8 ビット定数 n を比較し(実際は A-n の減算)、
レジスタ F(Z フラグ,C フラグなど)に結果を残す
レジスタ A に 8 ビット定数 n の値を加える
レジスタ A にレジスタ D の値を加える
レジスタ A にレジスタ L の値を加える
レジスタ A の値に1を加える
レジスタ HL の値に1を加える
レジスタ B の値を1減らす
レジスタ A と 8 ビット定数 n の論理積をとり、A に保存
レジスタ A と n の排他的論理和をとり、A に保存
最上位 0 づめ右1ビットシフト、C には最下位ビット保存
無条件分岐
Z フラグが1(ゼロ)なら mn 番地へジャンプ
Z フラグが0(ゼロではない)なら mn 番地へジャンプ
C フラグが1(キャリー発生)なら mn 番地へジャンプ
M フラグが1(マイナス)なら mn 番地へジャンプ
CPU 動作停止
レジスタ A の 0 ビットを調べ、Z フラグを設定
n 番地のポートから入力した値をレジスタ A に格納
レジスタ A の値を n 番地のポートに出力
24