RETROF-16 機械語命令一覧

#RETROF-16（令和版）の 機械語命令一覧

##概略

RETROF-16の命令語はワード長が1ワード（16bit）もしくは2ワード（32bit）であり、「分岐命令」「演算命令」「その他の命令」の3群に大別されます。本記事ではRETROF-16の全ての命令の機能と、そのビット構成を示します。
尚、アセンブリ表現（ニモニック等）は本記事とは別に定めるものとします。

###■分岐命令概略

* **C**は分岐条件を指定（詳細後述）
* **D**は絶対分岐か相対分岐かなどを指定（詳細後述）
* **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>|
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|**0**|**C**|**C**|**C**|**D**|**D**|**A**|**A**|**n**|**n**|**n**|**n**|**n**|**n**|**n**|**n**|

###■ 演算命令概略

* **X**は将来の拡張用（0でも1でも同じだが0を推奨）
* **P**は演算種別を指定（詳細後述）
* **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>|
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|**1**|**0**|**X**|**P**|**P**|**P**|**A**|**A**|**n**|**n**|**n**|**n**|**n**|**n**|**n**|**n**|

###■ その他の命令概略

* **K**は命令種別を指定（詳細後述）
* **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>|
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|**1**|**1**|**K**|**K**|**K**|**K**|**A**|**A**|**n**|**n**|**n**|**n**|**n**|**n**|**n**|**n**|

###■ 全命令共通のアドレッシングモード

アドレッシングモード指定ビットの意は以下の通り。これは全ての命令で共通です。

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

----------
##分岐命令

###■ 分岐命令のビット構成

|<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>|
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|**0**|**C**|**C**|**C**|**D**|**D**|**A**|**A**|**n**|**n**|**n**|**n**|**n**|**n**|**n**|**n**|



###■ 分岐条件指定ビット

|CCC|意味|
|---|---|
|000|無条件分岐
|001|水平ポーチ期間以外なら分岐
|010|ZEROフラグが立っていれば分岐
|011|ZEROフラグが落ちていれば分岐
|100|CARRYフラグが立っていれば分岐
|101|CARRYフラグが落ちていれば分岐
|110|MINUSフラグが立っていれば分岐
|111|MINUSフラグが落ちていれば分岐

「水平ポーチ期間以外なら分岐」は、LCDへの描画時のチラツキを軽減させるための特殊な命令です。ここではその詳細説明は割愛します。

###■ 分岐方向指定ビット

|DD|意味|
|---|---|
|00|未定義命令となる（HALT扱いとなる）
|01|実効アドレスへ分岐
|10|実効値を相対距離として前方相対分岐
|11|実効値を相対距離として後方相対分岐

相対分岐は、当該分岐命令の次の命令が基準点（距離ゼロ）になります。従って、前方相対分岐、後方相対分岐共に分岐距離ゼロを与えると、分岐しなかった場合と同じ動作になります。

##演算命令

###■ 演算命令のビット構成
**X**は将来の拡張用（0でも1でも同じだが0を推奨）

|<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>|
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|**1**|**0**|**X**|**P**|**P**|**P**|**A**|**A**|**n**|**n**|**n**|**n**|**n**|**n**|**n**|**n**|

###■ 演算種別指定ビット

|PPP|意味
|---|---|---|
|000|Accと実効値のAND演算を行い結果をAccへ
|001|Accと実効値のOR演算を行い結果をAccへ
|010|Accと実効値のXOR演算を行い結果をAccへ
|011|Accと実効値のXNOR演算を行い結果をAccへ
|100|未定義演算（HALT扱いとなる）
|101|実効値をAccに格納（ロード命令）
|110|Accに実効値を加え結果をAccへ
|111|Accから実効値を引き結果をAccへ



##その他の命令

|<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>|
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|**1**|**1**|**K**|**K**|**K**|**K**|**A**|**A**|**n**|**n**|**n**|**n**|**n**|**n**|**n**|**n**|

|KKKK|　命令
|---|---|---|
|x000|Accの値を主メモリの有効アドレスで示される番地にセーブする<br>xは0/1任意
|x001|Accの値を主メモリの有効アドレスで示される番地からロードする<br>xは0/1任意
|x010|Accの値を画像メモリの有効アドレスで示される番地にセーブする<br>xは0/1任意
|x011|Accの値を画像メモリの有効アドレスで示される番地からロードする<br>xは0/1任意
|x100|実効値を基板LEDの上列へ、Accの値を基板LED下段に表示する<br>xは0/1任意
|x101|プログラムカウンタの値をAccに格納しますする<br>xは0/1任意（オペランドは意味を持たない）
|x110|Accの値を右にシフトする。MSBには0が補填される<br>xは0/1任意（オペランドは意味を持たない）
|0111|ポートA（基板上の16個のトグルスイッチ）の内容をAccへ格納<br>（オペランドは意味を持たない）
|0111|ポートB（基板上のコネクタ）の内容をAccへ格納<br>（オペランドは意味を持たない）




##フラグの変化条件

|フラグ|変化条件
|---|---|---|
|EQUAL|ロード命令以外は、2つの被演算子の値が等しい時にフラグが立ち、等しくない時に落ちます。<br>ロード命令は代入前のAccの値と代入後のAccの値が等しい時にフラグが立ち、等しくない時に落ちる。
|CARRY|加算命令ではキャリーが発生した時に立つ<br>減算命令ではボローが**発生しなかったとき**に立つ<br><br>ロード命令と論理演算命令実行後は**不定**（再考中、仕様が変わる可能性有）
|MINUS|演算種別に関わらず、演算後のAccの最上位ビットがHの時に立ち、それ以外では落ちる。

##その他補足事項

###■ 画像メモリについて

本機に接続可能な液晶ディスプレイは、その解像度が1280（横）×1024（縦）であるもの（SXGA）に限ります。本機はその液晶ディスプレイを横5画素毎、縦4画素毎に同一色を表示し、見かけ上、256×256画素のディスプレイとして扱います。
画像メモリのアドレスは0000Hが左上の画素、00FFHが右上の画素、FF00Hが左下の画素、FFFFHが右下の画素にそれぞれ対応します。
各画素の色は6bitで表現します。本機は16bit機ですのが、画像メモリのアクセスは下位6bitのデータのみが意味を持ちます。

|<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|x|x|y|y|**R**|**R**|**G**|**G**|**B**|**B**|

* xで示されるビットはメモリが実装されていない、リード時の値は不定となる
* yで示されるビットはメモリは実装されているが、その値は表示内容に影響しない
* **R**は2bitで表現される赤色成分の明るさ
* **G**は2bitで表現される緑色成分の明るさ
* **B**は2bitで表現される青色成分の明るさ

###■ ロード命令に関する補足

本機のロード命令（Accに値を設定する命令）は、演算命令の一種としてのロード命令と、その他の命令としてのロード命令があります。下記の表はそれを一覧形式にしたものですが、2番と5番、3番と6番は実質的に同じ命令となります。

||命令種別|命令コード|動作|
|---|---|---|---|
|1|演算|1000 1100 nnnn nnnn|nの値（0～255）をロード
|2|演算|1000 1101 nnnn nnnn|n番レジスタの値をロード
|3|演算|1000 1110 nnnn nnnn|n番レジスタが示す主メモリの内容をロード
|4|演算|1000 1111 nnnn nnnn|次のワード（0～65535）をロード
|5|その他|1100 0000 nnnn nnnn|n番レジスタの値をロード
|6|その他|1100 0001 nnnn nnnn|n番レジスタが示す主メモリの内容をロード
|7|その他|1100 0010 nnnn nnnn|n番レジスタが示す主メモリの内容をアドレスとして<br>その主メモリ内容をロード
|8|その他|1100 0011 nnnn nnnn|次のワードが示す主メモリの内容をアドレスとして<br>その主メモリ内容をロード