RETROF-16Mの命令構成

メモリ/レジスタ構成と入出力ポート

ソフトウエア側から意識できるメモリ/レジスタ/ポートは以下の通り

・主メモリ    16ビット×65536ワード
・画像メモリ   8ビット×65536ワード(主メモリとは独立した空間に配置)
・アキュムレータ 16ビット
・フラグレジスタ 3ビット C(Carry)、M(Minus)、F(Full)
・汎用レジスタ  16ビット×256本(仮想レジスタ、実体は主メモリの上位256ワード)
・出力ポート   32ビット(基板上の32個のLEDに直結)
・入力ポートA  16ビット(基板上の16個のトグルスイッチに直結)
・入力ポートB  16ビット(基板上に端子のみ設置、自由用途)

アドレッシングモード(全命令共通)

RETROF-16Mは全ての命令(一部の制御命令を除く)が以下の4種類のアドレッシングモードを持ちます。

8ビット即値アドレッシング

bit9,8が00ならば、bit7〜0の値がそのまま実効値となる。

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
  命令種別 0 0  即値(0〜255)


レジスタ直接アドレッシング

bit9,8が01ならば、指定レジスタが保持している値が実効値となる。

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
  命令種別 0 1 レジスタ番号(0〜255)


レジスタ間接アドレッシング

bit9,8が10ならば、指定レジスタが示す主メモリの内容が実効値となる。

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
  命令種別 1 0 レジスタ番号(0〜255)


24bit即値アドレッシング(命令長は2ワード32ビット)

bit9,8が11ならば、1ワード目の下位8bitと2ワード目で示す24bitが実効値となる。
但し24bit長のアドレス空間や24bit長の演算はサポートしていないので、実質的には下位16bitのみが有効となる。       

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
  命令種別 1 1 24bit即値 但し上位8ビットは将来の拡張用。指定可能な範囲は0〜65535  



フラグ

条件分岐用に3種類あり、全て演算命令(ロード命令含む)でのみ変化する。

Pフラグ

演算結果の最上位ビットが1なら立ち、0なら落ちる。

Fフラグ

演算結果が0xFFFFの場合に立つ。それ以外は落ちる。

Cフラグ

加算命令の場合はオーバーフロー(キャリー発生)なら立ち、それ以外は落ちる。
減算命令/比較命令の場合はアンダーフロー(ボロー発生)なら落ち、それ以外は立つ。
上記以外の演算命令(論理演算命令とロード命令)では不定(注)とする。

(注)厳密には以下の規則に従うがここでは不定扱いとする。
 ・ANDは被演算子のいずれかが0の場合にのみ立つ
 ・ORはアキュムレータ側の被演算子が0の場合に立つ
 ・XNORは同じ被演算子で加算を行った場合と同じ結果となる
 ・LDは転送前のアキュムレータの値が0の場合に立つ
 


分岐命令

15 14 13 12 11 10 9 8
0 分岐条件 方向 AM

・AMはアドレッシングモード
・相対分岐は、この命令の次の命令のアドレスが基点


分岐条件と分岐方向

条件 ニモニック  分岐する条件
 000  JMP  無条件
 001  JB  表示が水平ブランク期間
 010  JF  Fフラグが立っている
 011  JNF   Fフラグが立っていない
 100  JNM  Mフラグが立っていない
 101  JM  Mフラグが立っている
 110  JC Cフラグが立っている
 111  JNC Cフラグが立っていない
方向 分岐方向
 00  絶対
 01  前方相対
 10  後方相対
 11 無効命令

無効命令は実際には次の命令のアドレスと、実効値との論理積(AND)のアドレスへ分岐するが、利用方法は極めて限られるので、無効命令扱いとする。


JBP(水平ブランク期間分岐)についての補足 

後述するVRAMアクセス命令(液晶表示命令)はその命令を実行する際、一時的に画面表示を止めるので、見た目上、液晶画面にノイズ(ちらつき)が発生します。
これを避けるために、水平ブランク期間中になるまで画面表示をソフトウエア側で保留する際に用いる。

演算命令(ロード命令、比較命令を含む)

命令上位8bit

15 14 13 12 11 10 9 8
1 0 - 演算種別 AM

・AMはアドレッシングモード、bit13は任意


演算種別とフラグの変化

・実効値はアドレッシングモードの項を参照
・演算記号はC言語に準ずる。但し「^」はExclusiveORではなくExclusiveNOR

演算種別 ニモニック  動作
 000  LD   実効値 → Acc
 100  ADD  Acc + 実効値 → Acc
 010  SUB   Acc − 実効値 → Acc
 110   無効  ACC  → Acc
 001  AND  ACC & 実効値 → Acc
 101  OR  ACC | 実効値  → Acc
 110  XNR  ACC ^ 実効値 → Acc
 111  CMP  ACC − 実効値
全ての演算命令でフラグが変化する。
(詳細は、本頁のフラグの項を参照)

その他の命令

命令上位8bit

15 14 13 12 11 10 9 8
1 1 - 命令種別 AM

・AMはアドレッシングモード、bit13はIN命令のみ有効
・SFT/LPC/IN/HALTはアドレス指定に意味を持たない


その他の命令の詳細

命令種別 ニモニック  動作
 000  SFT   Accを1ビット右シフトする。
 001  LPC   次の命令のアドレス → Acc
 010  IN   入力ポートの状態 → Acc  (bit13が0ならポートA、1ならポートB)
 011  LDV    画像メモリの実効値で示されるアドレスの内容 → Acc
 100  STV   Acc → 画像メモリの実効値で示されるアドレス
 101  OUT  実効値で示される値 → 出力ポート上位、Acc → 出力ポート下位
 110  ST  Acc → 主メモリの実効値で示されるアドレス
 111  HALT  停止 




VRAMアクセスに関する補足

・VRAMは左上が0000番地、右下が7FFF番地。(256×256画素)
・1つの番地が1ピクセルに対応、
・VRAMのデータ幅は8bit。ライト時の上位8bitは無効でリード時の上位8bitは不定。

CPUからみたVRAM

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
 bit15〜bit8は無意味  未定   R   G   B

bit7とbit6の使用方法は未定です。「中間色表示用」、「ブリンク用」、「ゲーム時の隠れキャラ(見かけは同じだが値が違う事を利用する昔のゲームテクニック)」などの目的に利用予定です。(詳細は別途)