Ⅲ-2. マイクロコンピュータの実験 - 1 1. 目的 (1) 基本的なマイクロコンピュ-タの構成を学ぶとともに 各部の機能を理解する (2) マイクロコンピュ-タの機械語プログラムの理解を深める 2. マイクロコンピュ-タの動作図 1は 8ビットマイクロプロセッサ Z80 を用いたマイクロコンピュ-タシステムのブロック図である 以下に このマイクロコンピュ-タを例にとり 各部の動作を説明する 記憶部 中央処理部 入出力部 RAM 5116 (CPU) (I/O ポート ) ROM 2816A Z80 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 メモリマップ I/O ポート ROM I/O A Port 00H B Port 01H 8000H RAM C Port 02H 87FFH 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 RAM アドレスバス データバス IORQ I/O ポート 図 4 I/O リード / ライト 14
3.Z80 アセンブラ プログラミング 3-1. アセンブラ記述のルールと機械語への変換方法次のプログラムはメモリ アドレス 8020H 番地の内容を 8021H 番地に移動するためのプログラムである まず 処理手順をニモニックで記述し その内容を解りやすくコメントで説明する 次にニモニック- 機械語変換表を利用して機械語に変換する ニモニック表記の段階ではプログラムを格納するメモリの番地 ( アト レス ) がまだ特定されていないため ラベル ( 適当な名前をつける ) を使用してそのプログラム位置を表し 機械語変換後は具体的なメモリ アドレスを指定する * 8020H のHは8020 が 16 進数 (Hexadecimal number) であることを表す ラベルニモニックコメントメモリアドレス機械語 LOOP1: LD A,(8020H) ;8020H 番地の内容をレジスタに格納 #0000 3A2080 LD (8021H),A ; レジスタの内容を 8021H に格納 322180 HALT ; 命令実行の停止 割り込み待ち 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 は 下記 4のスイッチで指定し (0 or 8) X2 は 0 に固定 下位 2 桁 X3 X4 は 6のスイッチと8プリセットにより指定 14 桁数字表示器 A,B は アドレスの下位 2 桁の値を表示 C,D は メモリ格納データ値 A B C D 2プログラムの実行スイッチプログラムの入力 確認時は 書込 / 読出 側にし プログラム実行時に 実行 側にする 4 メモリ切り替え ROM 側でアドレス上位が "0" RAM 側でアドレス上位が "8" となる例 )ROM 側にし 4 桁数字表示器が 1234 である時 アドレスは 0012H の指定 5 電源スイッチ 実行 書込 / 読出 3 リセットスイッチ 0 にする 書込 読出 6 命令変換スイッチ 7 書込読出 8 プリセット 9 クリア 10 書込読出制御スイッチ 図 5 マイクロコンピュータ実験回路 16
[ 実験の手順 ] A. プログラムの作成 ( 機械語への変換 ) 例 )LOOP1: LD A,(8020H) #0000 3A 20 80 LD (8021),A 32 21 80 HALT 76 B. プログラムの入力 1)2を書込 / 読出,4を ROM にし,5の電源スイッチをオンにする 2)10を書込にし, 書込表示 LED が点灯することを確認する 3) 書込読出制御の9クリアスイッチを押す 14 桁数字表示器の上位 2 桁 (X1X2) が 0 となることを確認する 4)6 命令変換スイッチで 3A を入力し,7 書込読出スイッチを押す *4)-10) の過程で14 桁数字表示器の状態を確認していくこと 5)6 命令変換スイッチで 20 を入力し,7 書込読出スイッチを押す 6)6 命令変換スイッチで 80 を入力し,7 書込読出スイッチを押す 7)6 命令変換スイッチで 32 を入力し,7 書込読出スイッチを押す 8)6 命令変換スイッチで 21 を入力し,7 書込読出スイッチを押す 9)6 命令変換スイッチで 80 を入力し,7 書込読出スイッチを押す 10) 6 命令変換スイッチで 76 を入力し,7 書込読出スイッチを押す 11) 10を読出にする C. プログラムの確認 1)2が書込 / 読出,4が ROM,10が読出であることを確認する 2)9クリアスイッチを押す 1の上位 2 桁が 00 となり, 下位 2 桁 (X3X4) にプログラムデータ ( 例の場合では 3A) が表示されていることを確認する 3)7 書込読出スイッチを押し,1の下位 2 桁にプログラムデータが順次表示されることを確認する ( 例の場合では,80 から 76 まで ) D. 実行前のメモリデータの確認 1)2が書込 / 読出,4が RAM,10が読出であることを確認する 1) メモリアドレス 8020H のデータを確認するには, 最上位が 8 -> 4を RAM, 下位 2 桁が 20 -> 6で 2 0, 次に8のプリセットを押す 1の上位 2 桁が 20 となり, 格納されているメモリデータが1の下位 2 桁に表示される * 表示されるデータを記録しておくこと 17
E. プログラムの実行 1)10が読出になっていることを確認する 2)2を実行側にし,3のリセットスイッチを 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 実験 1 プログラム ( 機械語データ ) の入力と確認 2 実行前のメモリ 8020H と 8021H の内容を確認し 下表に記録 3 プログラム実行後 メモリの内容を確認し 下表に記録 * メモリデータの記録実行前実行後 8020H 8021H 18
4-2.8020H 番地から 807FH 番地までに 00H の値を格納する ヒント 1 HL レシ スタにより間接アドレッシングを行なう 2 条件付きジャンプ命令を利用する 例 ) LD B,05H LOOP1: XXXXX XXXXX LOOP1 のルーチンは 5 回 DEC B 繰り返される JP NZ,LOOP1 予習 2 以下のプログラムを機械語に変換せよ < ラベル >< ニモニック > < アドレス >< 機械語 > START: LD HL, 8020H #0000H ( ) 20 80 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 00 HALT #000DH 76 実験 1 プログラム ( 機械語データ ) の入力と確認 2 実行前のメモリ 8020H から 807FH までの範囲で5 箇所の内容を確認し 下表に記録 3 プログラム実行後 メモリの内容を確認し 下表に記録 * メモリデータの記録アドレス実行前実行後 19
4-3.8020H 番地から 804FH 番地までの間に 00H から 2FH の値を格納する ヒント 14-2では 格納するデータ0がアドレス A に入っている この A のデータを増やしていくには? INC A 命令を利用する 28020H から 804FH までのメモリは 30H ある (10 進数では 48) 予習 3 下線部に適切な命令語または値を入れ プログラムを完成させよ START: LD HL,8020H LD LD A, 00H LOOP1: LD (HL), A INC HL DEC B JP NZ, LOOP1 実験 1 ニモニックから機械語への変換 2 プログラム ( 機械語データ ) の入力と確認 3 実行前のメモリ 8020H から 804FH までの範囲で5 箇所の内容を確認し 下表に記録 4 プログラム実行後 メモリの内容を確認し 下表に記録 * メモリデータの記録アドレス実行前実行後 20
4-4.8020H 番地の内容が 65H より 1) 大きい,2) 小さい,3) 等しいの判定を行い, その結果に基づいて 8021H 番地に 1)01H,2)02H,3)03H の値を格納する ヒント処理の流れをフローチャートで表すと以下のようになる 65H との比較を行うには比較命令 CP n を利用する方法がある Start (8020H) A > A:65 = < 01H (8021H) 02H (8021H) 03H (8021H) End START: LD A,(8020H) ; メモリ 8020H の内容を CP 65H ;65H とレジスタ A の比較 (A-65H の減算 ) JP Z,HITOSHI ; 減算 A-65H の結果がゼロなら HITOSHI へ JP C,TIISAI ; A-65H <0 ( 負 ) なら TIISAI へ JP OKII ; 無条件 (A-65H >0) なら OKII へ OKII: LD A,01H LD (8021),A HALT TIISAI: LD A,02H HITOSHI:LD A, 21
実験 1 ニモニックから機械語への変換 2 プログラム ( 機械語データ ) の入力と確認 3 実行前のメモリ 8020H と 8021H の内容を確認し 下表に記録 8020H のデータを変更するには メモリ切り替えスイッチを RAM 命令変換スイッチで 2,0 を押す プリセットボタンを押す 書込読出制御スイッチを書込み 命令変換スイッチで変更データを押す 書込み読出しボタンを押す 4 プログラム実行後 メモリの内容を確認し 下表に記録 * メモリデータの記録 <65H より大きい場合 > アドレス 実行前 実行後 8020H 8021H <65H より小さい場合 > アドレス 実行前 実行後 8020H 8021H <65H と等しい場合 > アドレス 実行前 実行後 8020H 65H 8021H 22
5. 課題 (1) 以下のプログラムは 10 進数を 16 進数に変換するためのものである 各行にコメントを追加し, レシ スタ A, B, C, D の最終的な値を示せ [+10 点 ] LP1: LD A,63H LD C,A AND F0H SRL A SRL A SRL A SRL A LD B,A LD A,00H LP2: DEC B JP M,LP3 ADD A,0AH JP LP2 LP3: LD D,A LD A,C AND 0FH ADD A,D HALT (2) 種々の RAM ROM について調べ ぞれぞれの長所 短所を示せ [+10 点 ] (3) マイクロコンピュータが組み込まれている製品を3つあげ, どのような目的で利用されているかをそれぞれ説明せよ [+10 点 ] 6. 参考図書 1) 太平洋工業株式会社, 制御用マイコン, 日刊工業新聞社,1994 2) 横田英一,Z80の使い方, オーム社,1989 23
代表的な Z80 命令語 [ ニモニック - 機械語変換表 ] No ニモニック 機械語 説明 ロード命令 LD A,n 3E n 8 ビット定数 n をレジスタ A に格納 LD (mn),a 32 n m レジスタ A の値をメモリ mn 番地に格納 LD A,(mn) 3A n m メモリ mn 番地の値をレジスタ A に格納 LD A,(HL) 7E レジスタ HL で指定するメモリの値をレジスタ A に格納 LD A,C 79 レジスタ C の値をレジスタ A に格納 LD B,n 06 n 8 ビット定数 n をレジスタ B に格納 LD B,A 47 レジスタ A の値をレジスタ B に格納 LD C,A 4F レジスタ A の値をレジスタ C に格納 LD D,A 57 レジスタ A の値をレジスタ D に格納 LD L,A 6F レジスタ Ano 値をレジスタ L に格納 LD HL,mn 21 n m 16 ビット定数 mn をレジスタ HL に格納 (m H,n L) LD (HL),A 77 レジスタ A の値を HL で指定のメモリに格納 算術論理演算命令 CP n FE n レジスタ A と 8 ビット定数 n を比較し ( 実際は A-n の減算 ) レジスタ F(Z フラグ,C フラグなど ) に結果を残す ADD A,n C6 n レジスタ A に 8 ビット定数 n の値を加える ADD A,D 82 レジスタ A にレジスタ D の値を加える ADD A,L 85 レジスタ A にレジスタ L の値を加える INC A 3C レジスタ A の値に1を加える INC HL 23 レジスタ HL の値に1を加える DEC B 05 レジスタ B の値を1 減らす AND n E6 n レジスタ A と 8 ビット定数 n の論理積をとり A に保存 XOR n EE n レジスタ A と n の排他的論理和をとり A に保存 シフト命令 SRL A CB 3F 最上位 0 づめ右 1ビットシフト C には最下位ビット保存 ジャンプ命令 JP mn C3 n m 無条件分岐 JP Z,mm CA n m Z フラグが1( ゼロ ) なら mn 番地へジャンプ JP NZ,mn C2 n m Z フラグが0( ゼロではない ) なら mn 番地へジャンプ JP C,mn DA n m C フラグが1( キャリー発生 ) なら mn 番地へジャンプ JP M,mn FA n m M フラグが1( マイナス ) なら mn 番地へジャンプ CPU コントロール HALT 76 CPU 動作停止 ビット操作命令 BIT 0,A CB 47 レジスタ A の 0 ビットを調べ Z フラグを設定 入出力命令 IN A,(n) DB n n 番地のポートから入力した値をレジスタ A に格納 OUT (n),a D3 n レジスタ A の値を n 番地のポートに出力 24