RETROF-16Mの命令構成
メモリ/レジスタ構成と入出力ポート
ソフトウエア側から意識できるメモリ/レジスタ/ポートは以下の通り
・画像メモリ 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の使用方法は未定です。「中間色表示用」、「ブリンク用」、「ゲーム時の隠れキャラ(見かけは同じだが値が違う事を利用する昔のゲームテクニック)」などの目的に利用予定です。(詳細は別途)