RETROF-16 部品実装（その３）

⇒ [本記事に対応する最新回路図はこちらです](https://qiita.com/RETROF/items/08aec337163b24c49cff)
⇒ [RETROF-16 部品実装（その１）はこちらです](https://qiita.com/RETROF/items/dc597ef541080021b495)
⇒ [RETROF-16 部品実装（その２）はこちらです](https://qiita.com/RETROF/items/93dcc2996150c8328ac5)


#無条件HALT命令の実装/試験
ここからは、各々の機械語命令を一つずつ試験します。
具体的には試験をする機械語命令に必要な部品を実装後、手動でクロックを与え、基板上のLEDを見ながらその動きが正しいことを順次確認します。

まずは最も単純な命令である無条件HALT命令の実装/試験を行います。まず、**74LS155（U26）**と**LED1**を実装します。**LED1**は通常は常時点灯ですが、HALT命令を検出した時のみ消灯します。
無条件HAL命令の機械語コードは**0C00**（下位8bitは任意）ですから、これを主メモリ上の任意の番地（ここでは**8000H**とした）に書き込み、その番地から1クロックずつ実行をします。結果は以下の通りとなります。

表中の**Φ**はステージカウンタ（**74LS163**）の値を示します。他の略称は以下の通りです。
**IR**：インストラクションレジスタ（命令レジスタ）
**PC**：プログラムカウンタ
**WR**：ワーキングレジスタ（アドレス指定レジスタ兼被演算子レジスタ）


|Φ|アドレス<br>バスの値|データ<br>バスの値|IRの値|補足説明|
|:-:|:-:|:-:|:-:|:--|
|0|不定|**8000**|不定|**PC**の値がデータバスに放出される
|1|**8000**|**8000**|不定|**PC**の値が**WR**に転写される
|2|**8000**|**0C00**|不定|実行すべき命令のコードが<br>データバスに放出される
|3|**0000**|**0000**|**0C**|命令コードの上位8bitが**IR**に<br>下位8bitが**WR**に転写される<br>（**WR**の上位8bitはゼロクリア）
|4～9|同上|同上|同上|
|10|同上|同上|同上|LED1が消灯する<br>これ以上STEPボタンを押しても<br>**Φ**の値は変化しない

#無条件分岐命令の実装/試験

RETROF-16は様々なアドレッシングモードを有しますが、この時点ではまだ「8bitリテラルアドレッシング」しか使えません。分岐命令は分岐先が**00H番地**～**FFH番地**に限定されます。ここでは**0010H**番地に**0010H**（10H番地に無条件分岐する命令）を書き込み、**0010H**番地から実行し、「無限ループ」が形成されることを1クロック単位で確認します。

尚、この命令の試験にはWRの値をPCに与える経路が必要です。**74LS138(U25)**と、ダイオード**G5**、**G6**の実装によりこの経路が形成されます。また他にも**F22**と**F30**の実装が必要です。

試験の結果が以下となれば正常です。

|Φ|アドレス<br>バスの値|データ<br>バスの値|IRの値|補足説明|
|:-:|:-:|:-:|:-:|:--|
|0|不定|**0010**|不定|**PC**の値がデータバスに放出される
|1|**0010**|**0010**|不定|**PC**の値が**WR**に転写される
|2|**0010**|**0010**|不定|実行すべき命令のコードが<br>データバスに放出される
|3|**0010**|**0010**|**00**|命令コードの上位8bitが**IR**に<br>下位8bitが**WR**に転写される<br>（**WR**の上位8bitはゼロクリア）
|4～7|同上|同上|同上|
|8|**0010**|**0011**|**00**|データバスには**+1**された<br>**PC**の値が表示される
|9|同上|同上|同上|
|10|**0010**|**0010**|**00**|データバスには上書きされた<br>**PC**の値（分岐先）が表示される
|11～12|同上|同上|同上|以降はΦ0から無限に繰り返す

#実クロックでの無条件分岐命令の試験

**OSC1**を実装して、前項と全く同じ試験を実クロック（16.000MHz）で行います。手動クロック動作と実クロック動作の切替は**SW25**で行ないます。この試験の成否はオシロやロジアナがあれば完璧ですが、基板上のLEDの目視のみでも十分可能です。具体的には前項のプログラムに従った無限ループ中はアドレスバス監視用のLEDもアドレスバス監視用のLEDも殆どのステージで0010Hを表示します。データバスは稀に0011にもなりますので最下位のLEDも淡く光ります。IRのLEDは常に00Hを表示します。これらの状態を視認できれば、この試験は合格だと言えます。

|この時点で実装されているダイオード|
|---|
|D1、D2、F1～F4、F22、F30、F40～F44、G5、G11|
&nbsp;&nbsp;**この時点の基板外観**
![R0010118.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535901/d4a319ca-965f-123b-1d45-aca91d264dc9.jpeg)


#ロード命令の実装/試験

アキュムレータ（以下**Acc**）に任意の値をセットする試験です。この時点ではまだ「8bitリテラルモード」しか使えませんので、セットできる値も**00H**～**FFH**に限定されます。ここでは10（10進）を書き込みます。機械語命令コードは**800AH**で、これを**0番地**に書込み、**0番地**から実行します。

本試験は**74LS395**の実装が必要です。
試験の結果が以下となれば正常です。

|Φ|アドレス<br>バスの値|データ<br>バスの値|IRの値|補足説明|
|:-:|:-:|:-:|:-:|:--|
|0|不定|**0000**|不定|**PC**の値がデータバスに放出される
|1|**0000**|**0000**|不定|**PC**の値が**WR**に転写される
|2|**0000**|**800A**|不定|実行すべき命令のコードが<br>データバスに放出される
|3|**000A**|000A番地<br>の値|**80**|命令コードの上位8bitが**IR**に<br>下位8bitが**WR**に転写される<br>（**WR**の上位8bitはゼロクリア）
|4～7|同上|同上|同上|
|8|**000A**|Accの値<br>(不定)|**80**|データバスには**+1**された<br>**PC**の値が放出される
|9～11|同上|同上|同上|
|12|**000A**|**000A**|**00**|データバスには更新された<br>**Acc**の値（=10）が放出される


#加算命令（10+20=30）の実装/試験

アキュムレータ（以下**Acc**）に任意の値を加え込む試験です。この時点ではまだ「8bitリテラルモード」しか使えませんので、ここでは20（10進）を加え込みます。この試験は先に前項の「Accに10をロードする命令」と組み合わせて行います。

|番地|命令コード|ニモニック|補足説明|
|---|---|---|---|
|**0000**|**800A**|LDS 10|Accに10をセットする|
|**0001**|**8414**|ADDS 20|Accに20を加える|


<!--
尚、この命令の試験にはWRの値をPCに与える経路が必要です。**74LS138(U25)**と、ダイオード**G5**、**G6**の実装によりこの経路が形成されます。また他にも**F22**と**F30**の実装が必要です。
-->

試験の結果が以下となれば正常です。

|Φ|アドレス<br>バスの値|データ<br>バスの値|IRの値|補足説明|
|:-:|:-:|:-:|:-:|:--|
|<font color="Red">**0～12**</font>|---|---|---|<font color="Red">**1つ目の命令の詳細は前項参照**</font>
|0|*000A*|**0001**|*80*|**PC**の値がデータバスに放出される
|1|**0001**|**0001**|*80*|**PC**の値が**WR**に転写される
|2|**0001**|**8414**|*80*|実行すべき命令のコードが<br>データバスに放出される
|3|**0014**|不定|**84**|命令コードの上位8bitが**IR**に<br>下位8bitが**WR**に転写される<br>（**WR**の上位8bitはゼロクリア）
|4～7|同上|同上|同上|
|8|**0014**|**000A**|**84**|データバスには**+1**された<br>**PC**の値が表示される
|9～11|同上|同上|同上|
|12|**0014**|**FFFF**|**84**|データバスには上書きされた<br>**PC**の値（分岐先）が表示される

最後のステップ（Φ=12）でのLEDの表示状態。
上段は加え込んだ値（10）を下段は加え込んだ結果（30）を表示している。

![R0010133.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535901/e0f2c66e-eae9-193c-e2b5-87584df5957a.jpeg)




#その他の演算命令の試験
同様の手順で他の演算の試験をします。まず、**74LS181**に与える演算コードを生成するダイオードマトリクスを構成する全てのダイオード（**G1~G16**）を実装します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535901/3e889f82-8778-f335-6761-602a25cff5c0.jpeg" width=75%>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535901/62efb7ef-3411-060a-90ae-653c02206c8c.jpeg" width=75%>


命令コードが異なるだけで試験手順は加算命令の試験と同じですので詳細は割愛します。命令コードの違いは以下の表を参照願います

|命令コード<br>（16進）|命令コード<br>（2進）|補足説明|
|---|---|---|---|
|**80XX**|**100<font color="Red">000</font>00_XXXXXXXX**|**Acc**に**00XX**を格納|
|**84XX**|**100<font color="Red">001</font>00_XXXXXXXX**|**Acc**と**00XX**を加算し**Acc**に格納|
|**88XX**|**100<font color="Red">010</font>00_XXXXXXXX**|**Acc**から**00XX**を減算し**Acc**に格納|
|**8CXX**|**100<font color="Red">011</font>00_XXXXXXXX**|**Acc**に**00XX**のビット反転値を格納|
|**90XX**|**100<font color="Red">100</font>00_XXXXXXXX**|**Acc**と**00XX**の**AND**を**Acc**に格納|
|**94XX**|**100<font color="Red">101</font>00_XXXXXXXX**|**Acc**と**00XX**の**OR**を**Acc**に格納|
|**98XX**|**100<font color="Red">110</font>00_XXXXXXXX**|**Acc**と**00XX**の**XOR**を**Acc**に格納|
|**9CXX**|**100<font color="Red">111</font>00_XXXXXXXX**|**Acc**と**00XX**の**XOR**の<br>ビット反転値**Acc**に格納|