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

#RETROF-16 部品実装（その４）

液晶モニタへの画像信号の生成回路（画像左上部分）以外はほぼ実装を終えた所

![R0010138.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535901/9e4f1d8a-359a-e598-9d76-8437944d8e6b.jpeg)


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

##各種アドレッシングモードの実装/試験

本機**RETROF-16**は全機械語命令共通の4つのアドレッシングモードを有します。以下がその概略です。**X**が命令種別、**A**がアドレッシングモード、そして **n**はアドレッシングモードにより意味が変わるビットです。

**本機の機械語命令コードの一般形**

|<sub>15</sub>|<sub>14</sub>|<sub>13</sub>|<sub>12</sub>|<sub>11</sub>|<sub>10</sub>|<sub>9</sub>|<sub>8</sub>|<sub>7</sub>|<sub>6</sub>|<sub>5</sub>|<sub>4</sub>|<sub>3</sub>|<sub>2</sub>|<sub>1</sub>|<sub>0</sub>|
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|**X**|**X**|**X**|**X**|**X**|**X**|<font color="Red">**A**</font>|<font color="Red">**A**</font>|**n**|**n**|**n**|**n**|**n**|**n**|**n**|**n**|



|<font color="Red">AA</font>|アドレッシングモード|
|---|---|
|**00**|**n**で示す値（0～255）がそのまま実効値（もしくは実効アドレス）となる
|**01**|**n**で示すレジスタ（0番レジスタ～255番レジスタのいずれか)の値が実効値（もしくは実効アドレス）となる
|**10**|**n**で示すレジスタが示すの主メモリの値（0～65535）が実効値（もしくは実効アドレス）となる
|**11**|**n**は無視され、この命令語の次の語の値（0～65535）が実効値（もしくは実効アドレス）となる。本モードは2ワード命令となる。

ここでは、このアドレッシングモードを一つずつ試験します。この試験には**74LS155(U31)**と、**F5～F11**の実装が必要です。（本記事冒頭の画像はこれらの実装をした後のものです）
アドレッシングモードは全機械語命令で共通ですので、その試験は最も単純な機械語命令である「無条件HALT命令」にて行います。この命令は停止時にアドレッシングモードとオペランドで決定する値をアドレスバスに放出しますので、結果の視認も簡単です。

####(1) 8bit即値アドレッシングモードによる無条件HALT命令の動作確認
命令コード**0CXX**を与えます。XXは任意の8bit値であり、この値（0～255）をアドレスバスに放出した状態で停止します。ここでは命令コードを**0C55**とし、それを0番地に書込み、0番地から実行します。


|Φ|アドレス<br>バスの値|データ<br>バスの値|IRの値|補足説明|
|:-:|:-:|:-:|:-:|:--|
|0|不定|**0000**|不定|**PC**の値がデータバスに放出される
|1|**0000**|**0000**|不定|**PC**の値が**WR**に転写される
|2|**0000**|**0C55**|不定|実行すべき命令のコードが<br>データバスに放出される
|3|**0055**|0055番地の<br>メモリの値|**0C**|命令コードの上位8bitが**IR**に、<br>下位8bitが**WR**に転写される<br>（**WR**の上位8bitはゼロクリア）
|4～7|同上|同上|同上|
|8～9|同上|**0001**|同上|データバスには次の命令の<br>アドレスが表示される
|10|同上|アドレスバスの<br>ビット反転値|同上|アドレスバスに**0055**を放出し停止。<br>これ以上STEPボタンを押しても<br>**Φ**の値は変化しない

####(2) レジスタアドレッシングモードによる無条件HALT命令の動作確認
命令コード**0DXX**を与えます。XXは任意の8bit値であり、この値（十進で0～255）をレジスタ番号として、そのレジスタに格納されている値をアドレスバスに放出して停止します。ここでは命令コードを**0D55**とし、それを0番地に書込み、0番地から実行します。
本機の汎用レジスタは全て仮想レジスタであり、その実態は主メモリの0000～00FF番地にマッピングされています。従ってレジスタ番号として55Hを指定する本試験は予め0055番地に特定の値(ここでは**1111**とした)を書き込んでおく必要があります。

|Φ|アドレス<br>バスの値|データ<br>バスの値|IRの値|補足説明|
|:-:|:-:|:-:|:-:|:--|
|0|不定|**0000**|不定|**PC**の値がデータバスに放出される
|1|**0000**|**0000**|不定|**PC**の値が**WR**に転写される
|2|**0000**|**0D55**|不定|実行すべき命令のコードが<br>データバスに放出される
|3|**0055**|**1111**<br>0055番地の<br>メモリの値|**0D**|命令コードの上位8bitが**IR**に、<br>下位8bitが**WR**に転写される<br>（**WR**の上位8bitはゼロクリア）
|4～6|同上|同上|同上|
|7|**1111**|1111番地の<br>メモリの値|同上|データバスの値が**WR**に複写される
|8～9|同上|**0001**|同上|データバスには次の命令の<br>アドレスが表示される
|10|同上|アドレスバスの<br>ビット反転値|同上|アドレスバスに**1111**を放出し停止。<br>これ以上STEPボタンを押しても<br>**Φ**の値は変化しない

####(3) レジスタ間接アドレッシングモードによる無条件HALT命令の動作確認
命令コード**0EXX**を与えます。XXは任意の8bit値であり、この値（十進で0～255）をレジスタ番号として、そのレジスタが示す主メモリの値をアドレスバスに放出して停止します。ここでは命令コードを**0E55**とし、それを0番地に書込み、0番地から実行します。
本試験は予め**0055番地**に特定の値(ここでは**1111**とした)を、更に**1111番地**に特定の値(ここでは**3333**とした)書き込んでおく必要があります。

|Φ|アドレス<br>バスの値|データ<br>バスの値|IRの値|補足説明|
|:-:|:-:|:-:|:-:|:--|
|0|不定|**0000**|不定|**PC**の値がデータバスに放出される
|1|**0000**|**0000**|不定|**PC**の値が**WR**に転写される
|2|**0000**|**0E55**|不定|実行すべき命令のコードが<br>データバスに放出される
|3|**0055**|**1111**<br>0055番地の<br>メモリの値|**0E
**|命令コードの上位8bitが**IR**に、<br>下位8bitが**WR**に転写される<br>（**WR**の上位8bitはゼロクリア）
|4|同上|同上|同上|
|5～6|**1111**|**3333**<br>1111番地の<br>メモリの値|同上|データバスの値が**WR**に複写される
|7|**3333**|3333番地の<br>メモリの値|同上|データバスの値が**WR**に複写される
|8～9|同上|**0001**|同上|データバスには次の命令の<br>アドレスが表示される
|10|同上|アドレスバスの<br>ビット反転値|同上|アドレスバスに**3333**を放出し停止。<br>これ以上STEPボタンを押しても<br>**Φ**の値は変化しない

####(4) 16bit即値アドレッシングモードによる無条件HALT命令の動作確認
このアドレッシングモードは2ワード命令となります。
は命令コード**0FXX、YYYY**を与えます。XXはこのモードでは意味を持ちません。YYYYは任意の16bit値であり、この値をアドレスバスに放出して停止します。
ここでは命令コードを**0F00、1234**とし、それを0番地と1番地に書込み、0番地から実行します。


|Φ|アドレス<br>バスの値|データ<br>バスの値|IRの値|補足説明|
|:-:|:-:|:-:|:-:|:--|
|0|不定|**0000**|不定|**PC**の値がデータバスに放出される
|1|**0000**|**0000**|不定|**PC**の値が**WR**に転写される
|2|**0000**|**0F00**|不定|実行すべき命令の第1ワードが<br>データバスに放出される
|3|**0000**|**0F00**<br>0000番地の<br>メモリの値|**0F**|命令コードの上位8bitが**IR**に、<br>下位8bitが**WR**に転写される<br>（**WR**の上位8bitはゼロクリア）
|4|**0000**|**0001**|同上|インクリメントされたPCの値が<br>データバスに放出される
|5|**0001**|**0001**|同上|**PC**の値が**WR**に転写される
|6|**0001**|**1234**<br>00001番地の<br>メモリの値|同上|データバスの値が**WR**に複写される
|7|**1234**|1234番地の<br>メモリの値|同上|データバスの値が**WR**に複写される
|8～9|同上|**0002**|同上|データバスには次の命令の<br>アドレスが表示される
|10|同上|アドレスバスの<br>ビット反転値|同上|アドレスバスに**1234**を放出し停止。<br>これ以上STEPボタンを押しても<br>**Φ**の値は変化しない