MN1610 (L-16A)
|
Panafacom MN1610 Data 16bit / Address Bus 16bit Cycle 2MHz〜4MHz (1975) |
MN1610はパナファコムから登場した日本初の16bitマイクロコンピュータシリーズ「L-16A」のCPUである。
1977年には一般向けにトレーニングキット「LKit-16」が販売された。
このCPUシリーズは、同社「C-xxx」やOEM製品であるナショナル「operate」などに採用された。
改良型:「MN1610A」
MN1610の4MHz動作タイプ。
後継型:「MN1613」
1981年に登場したMN1610の上位互換タイプ
クロック周波数は13.3MHzと大幅に高速化され、メモリ空間の拡張などにより演算速度の高速化を施した。
後継型:「MN1617」
MN1613をベースに浮動小数点対応などを施した。
●MN1610のピン配列
| Vbg | 1 | 40 | WRT | |
| BS15 | 2 | 39 | ADSD | |
| BS14 | 3 | 38 | ISYC | |
| BS13 | 4 | 37 | ADAK | |
| BS12 | 5 | 36 | BSRQ | |
| Vss | 6 | 35 | BSAV | |
| BS11 | 7 | 34 | CP2 | |
| BS10 | 8 | 33 | CP1 | |
| BS09 | 9 | 32 | DTAK | |
| BS08 | 10 | 31 | DTSD | |
| BS07 | 11 | 30 | FSYC | |
| BS06 | 12 | 29 | IOP | |
| BS05 | 13 | 28 | RST | |
| BS04 | 14 | 27 | HALT | |
| BS03 | 15 | 26 | CSRQ | |
| BS02 | 16 | 25 | IRQ2 | |
| BS01 | 17 | 24 | IRQ1 | |
| BS00 | 18 | 23 | IRQ0 | |
| Vdd | 19 | 22 | MANU | |
| Vgg | 20 | 21 | STRT |
※Vbgは-3Vという珍しい電圧だが、殆ど使われない部分なので-5V電源から分圧するなどして供給可能
●MN1610の特徴
| レジスタ名 | 説明 |
|---|---|
| Rn | →Register (n=0〜4) |
| SP | →Stack Pointer |
| STR | →Status Register |
| IC | →Instruction Counter (PC) |
レジスタは全て16bit幅である。
汎用レジスタであるRnレジスタのうち、R3とR4はインデックスレジスタも兼ねている。
「STR」は以下のような構成になっている。
bit7「M2」:割込マスク2
bit6「M1」:割込マスク1
bit5「M0」:割込マスク0
bit4「-」 :未使用
bit3「-」 :未使用
bit2「V」 :オーバーフローフラグ
bit1「-」 :未使用
bit0「E」 :拡張レジスタ
拡張レジスタは16bit以上の演算を実現するためのものである。
bit8〜15は「Pk」(Program key)であり、ユーザが自由に使えるフラグとなっている。
●MN1610の命令
命令(ニーモニック)は以下の構成となっている。
ニーモニック [OP1[,OP2[,OP3]]]
データの流れは命令によって異なる。
オペランド表記は以下の通りである。
※「R」 :レジスタ
※「Rd」 :レジスタ (DEST)
※「Rs」 :レジスタ (SRC)
汎用レジスタR3,R4はX0,X1という表記も可能。
メモリ操作命令はR0〜4、X0〜1、SPを指定可能。
それ以外では更にSTRも指定可能。
※「I2」 :2bitイミディエイト値
※「I4」 :4bitイミディエイト値
※「I8」 :8bitイミディエイト値
※「EA」 :アドレッシングモード指定 (D:8bit unsingned/d:8bit signed)
0 D : ゼロページ直接
1 (IC)+d : 相対直接
2 [D] : ゼロページ間接
3 [(IC)+d] : 相対間接
4 (X0)+D : 定数インデックス (X0)
5 (X1)+D : 定数インデックス (X1)
6 (X0)+[D] : ゼロページ間接インデックス (X0)
7 (X1)+[D] : ゼロページ間接インデックス (X1)
※「EM」 :「E」レジスタに対する操作モード指定
0 : 「E」レジスタ操作なし
1 RE : 0を「E」レジスタに格納
2 SE : 1を「E」レジスタに格納
3 CE : 「E」レジスタの否定値を「E」レジスタに格納
※「C」 :スキップ条件指定 (「Rd」←「Rd」op「Rs」の結果)
0 : スキップなし (「C」記述なし)
1 SKP : 無条件スキップ
2 M : 結果が負ならスキップ
3 PZ : 結果が正または0ならスキップ
4 Z|E : 結果が0ならスキップ
5 NZ|NE : 結果が0以外ならスキップ
6 MZ : 結果が負または0ならスキップ
7 P : 結果が正ならスキップ
8 EZ : 「E」レジスタが0ならスキップ
9 ENZ : 「E」レジスタが0以外ならスキップ
10 OZ : 「V」フラグが0ならスキップ
11 ONZ : 「V」フラグが0以外ならスキップ
12 LMZ : 結果が等しいか小なり(≦)ならスキップ
13 LP : 結果が大なり(>)ならスキップ
14 LPZ : 結果が等しいか大なり(≧)ならスキップ
15 LM : 結果が小なり(<)ならスキップ
●メモリ操作命令
| ニーモニック | オペランド | 動作 |
|---|---|---|
| L | R,EA | レジスタに指定したアドレスから値を格納 |
| ST | R,EA | レジスタから指定したアドレスに値を格納 |
| IMS | EA | 指定したアドレスの値をインクリメント、結果が0なら次の命令をスキップ |
| DMS | EA | 指定したアドレスの値をデクリメント、結果が0なら次の命令をスキップ |
●分岐命令
| ニーモニック | オペランド | 動作 |
|---|---|---|
| B | R,EA | 指定したアドレスの値に分岐 |
| BAL | R,EA | 指定したアドレスの値に分岐 (LinkをStackに保存=サブルーチンコール) |
| RET | サブルーチンから復帰 |
●算術演算命令
| ニーモニック | オペランド | 動作 |
|---|---|---|
| A | Rd,Rs[,C] | 「Rd」←「Rd」+「Rs」 |
| S | Rd,Rs[,C] | 「Rd」←「Rd」ー「Rs」 |
「E」レジスタ、「V」フラグに影響あり、「C」は全て使用可能。
●論理演算命令
| ニーモニック | オペランド | 動作 |
|---|---|---|
| AND | Rd,Rs[,C] | 「Rd」←「Rd」と「Rs」の論理積 |
| OR | Rd,Rs[,C] | 「Rd」←「Rd」と「Rs」の論理和 |
| EOR | Rd,Rs[,C] | 「Rd」←「Rd」と「Rs」の排他的論理和 |
| CLR | Rn | アセンブラマクロにより「EOR Rn,Rn」に変換される (0クリア) |
「E」レジスタ、「V」フラグに影響なし。
「E」レジスタを使う条件は命令以前の結果が反映される。
また、大小比較は意味を持たない。
●比較命令
| ニーモニック | オペランド | 動作 |
|---|---|---|
| C | Rd,Rs[,C] | 「Rd」ー「Rs」の結果判定(=比較) |
| CB | Rd,Rs[,C] | 「Rd」ー「Rs」の結果判定(下位8bit) |
●移動命令
| ニーモニック | オペランド | 動作 |
|---|---|---|
| MV | Rd,Rs[,C] | 「Rd」←「Rs」 |
| MVB | Rd,Rs[,C] | 「Rd」←「Rs」(下位8bit) |
「MV Rn,Rn」とすれば一般的な「NOP」と同じことになる。
●スワップ命令
| ニーモニック | オペランド | 動作 |
|---|---|---|
| BSWP | Rd,Rs[,C] | 「Rd」(上位8bit)←「Rs」(下位8bit)、「Rd」(下位8bit)←「Rs」(上位8bit) |
| DSWP | Rd,Rs[,C] | 「Rd」(bit0〜3/bit12〜15)←「Rs」(bit0〜3/bit12〜15)、「Rd」(bit8〜11/bit4〜7)←「Rs」(bit4〜7/bit8〜11) |
●十進補正命令
| ニーモニック | オペランド | 動作 |
|---|---|---|
| LAD | Rd,Rs[,C] | 「Rd」←「Rd」+「Rs」を行い、Carryが発生した桁に6、それ以外には0を格納 |
●シフト(ローテート)命令
| ニーモニック | オペランド | 動作 |
|---|---|---|
| SL | Rn,EM[,C] | 左シフト |
| SR | Rn,EM[,C] | 右シフト |
EMでRE(1)を指定したら単純シフトと同等。
「SR」実行前に「E」レジスタの正負を判定してから、内容に応じてRE(1)かSE(2)を指定すれば算術右シフトと同等。
●ビット操作・定数加減算命令
| ニーモニック | オペランド | 動作 |
|---|---|---|
| SBIT | Rn,I4[,C] | 4bitイミディエイト値で指定したレジスタのbitを1、結果を判定する |
| RBIT | Rn,I4[,C] | 4bitイミディエイト値で指定したレジスタのbitを0、結果を判定する |
| TBIT | Rn,I4[,C] | 4bitイミディエイト値で指定したレジスタのbitを判定する |
| AI | Rn,I4[,C] | 4bitイミディエイト値を指定レジスタに加算、結果を判定する |
| SI | Rn,I4[,C] | 4bitイミディエイト値を指定レジスタから減算、結果を判定する |
●定数格納命令
| ニーモニック | オペランド | 動作 |
|---|---|---|
| MVI | Rn,I8 | 8bitイミディエイト値を指定レジスタに格納 |
●入出力命令
| ニーモニック | オペランド | 動作 |
|---|---|---|
| RD | Rn,I8 | 8bitイミディエイト値で指定したI/Oアドレスの値を指定レジスタに格納(入力) |
| WT | Rn,I8 | 指定レジスタの値を8bitイミディエイト値で指定したI/Oアドレスに出力 |
●その他命令
| ニーモニック | オペランド | 動作 |
|---|---|---|
| LPSW | I2 | 2bitイミディエイト値で指定した割込レベルの割込から復帰 |
| H | プロセッサを停止状態に遷移 | |
| PUSH | Rn | スタックにレジスタを保存 |
| POP | Rn | スタックからレジスタを復元 |
「H」(halt)からの復帰は「STRT*」ポートからの信号入力で行われる。
なお、未定義命令は「H」命令とみなされる。