コンピュータアーキテクチャ 参考資料 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
© Copyright 2024 ExpyDoc