今日の雑記

生きることでいっぱいいっぱい

久々の NCTMG

もうお忘れの方も多いと思いますけど。
なんとか最低限の命令が動く奴ができたっぽいです。まだテストが不十分なので公開はしませんが。
とりあえず、命令セットだけでものっけておきます。興味のある方は「続き」をどうぞ。
以下、マニュアルより抜粋。

<表記について>

iNN  整数レジスタ。 NN の部分は 00〜31。
fNN  浮動少数レジスタ。 NN の部分は 00〜31。
imm  整数直値。 32 ビット固定。
fimm 浮動少数直値。 float 固定。
adr  整数用アドレス値。 32 ビット固定。
fadr 浮動少数用アドレス値。 32 ビット固定。
lbl  ラベル。ジャンプやコールに使われる。

<命令セット>

サンプルについては、解りやすくするためのもので、実際にこの表記は使われません。

命令            サンプル        バイト数    説明
00h             NOP             4           何もしない。
01h             END             4           プログラムを終了する。
02h lbl         JMP,lbl         8           指定ラベルにジャンプする。
03h lbl         CALL,lbl        8           指定ラベルにコールする。
04h             RET             4           CALL で呼ばれたところに戻る。
05h             PUSH            4           全レジスタをプッシュする。
06h             POP             4           全レジスタをポップする。
07h             PRN_S           8           指定アドレスの文字列をコンソールに出力。
08h             PRN_I           8           整数直値をコンソールに出力。
09h             PRN_F           8           浮動少数直値をコンソールに出力。
0ah             PRN_IR          8           指定整数レジスタの値をコンソールに出力。
0bh             PRN_FR          8           指定浮動少数レジスタの値をコンソールに出力。

10h iNN imm     MOV iNN,imm     12          指定整数レジスタに直値を代入。
11h iNN iNN     MOV iNN,iNN     12          指定整数レジスタに指定整数レジスタ値を代入。
12h iNN adr     MOV iNN,adr     12          指定整数レジスタに指定アドレスの中の値を代入。
13h adr imm     MOV adr,imm     12          指定アドレスに直値を代入。
14h adr iNN     MOV adr,iNN     12          指定アドレスに指定整数レジスタ値を代入。
15h adr adr     MOV adr,adr     12          指定アドレスに指定アドレスの中の値を代入。

18h fNN fimm    MOV fNN,fimm    12          指定浮動少数レジスタに直値を代入。
19h fNN fNN     MOV fNN,fNN     12          指定浮動少数レジスタに指定浮動少数レジスタ値を代入。
1ah fNN fadr    MOV fNN,fadr    12          指定浮動少数レジスタに指定アドレスの中の値を代入。
1bh fadr fimm   MOV fadr,fimm   12          指定アドレスに直値を代入。
1ch fadr fNN    MOV fadr,fNN    12          指定アドレスに指定浮動少数レジスタ値を代入。
1dh fadr fadr   MOV fadr,fadr   12          指定アドレスに指定アドレスの中の値を代入。

20h iNN imm     ADD iNN,imm     12          指定整数レジスタに直値を加算。
21h iNN iNN     ADD iNN,iNN     12          指定整数レジスタに指定整数レジスタを加算。
22h iNN imm     SUB iNN,imm     12          指定整数レジスタに直値を減算。
23h iNN iNN     SUB iNN,iNN     12          指定整数レジスタに指定整数レジスタを減算。
24h iNN imm     MUL iNN,imm     12          指定整数レジスタに直値を乗算。
25h iNN iNN     MUL iNN,iNN     12          指定整数レジスタに指定整数レジスタを乗算。
26h iNN imm     DIV iNN,imm     12          指定整数レジスタに直値を除算。
27h iNN iNN     DIV iNN,iNN     12          指定整数レジスタに指定整数レジスタを除算。
28h iNN imm     MOD iNN,imm     12          指定整数レジスタに直値を余算。
29h iNN iNN     MOD iNN,iNN     12          指定整数レジスタに指定整数レジスタを余算。

30h fNN fimm    ADD fNN,fimm    12          指定浮動少数レジスタに直値を加算。
31h fNN fNN     ADD fNN,fNN     12          指定浮動少数レジスタに指定浮動少数レジスタを加算。
32h fNN fimm    SUB fNN,fimm    12          指定浮動少数レジスタに直値を減算。
33h fNN fNN     SUB fNN,fNN     12          指定浮動少数レジスタに指定浮動少数レジスタを減算。
34h fNN fimm    MUL fNN,fimm    12          指定浮動少数レジスタに直値を乗算。
35h fNN fNN     MUL fNN,fNN     12          指定浮動少数レジスタに指定浮動少数レジスタを乗算。
36h fNN fimm    DIV fNN,fimm    12          指定浮動少数レジスタに直値を除算。
37h fNN fNN     DIV fNN,fNN     12          指定浮動少数レジスタに指定浮動少数レジスタを除算。
38h fNN fimm    MOD fNN,fimm    12          指定浮動少数レジスタに直値を余算。
39h fNN fNN     MOD fNN,fNN     12          指定浮動少数レジスタに指定浮動少数レジスタを余算。

40h iNN imm     CMP iNN,imm     12          指定整数レジスタと直値を比較
41h iNN iNN     CMP iNN,iNN     12          指定整数レジスタと指定整数レジスタを比較
42h fNN fimm    CMP fNN,fimm    12          指定浮動少数レジスタと直値を比較
43h fNN fNN     CMP fNN,fNN     12          指定浮動少数レジスタと指定浮動少数レジスタを比較

50h lbl         JEQ,lbl         8           ステータスレジスタに「EQU」が立っていれば指定ラベルにジャンプする。
51h lbl         JGR,lbl         8           ステータスレジスタに「GRE」が立っていれば指定ラベルにジャンプする。
52h lbl         JGE,lbl         8           ステータスレジスタに「GRE|EQU」が立っていれば指定ラベルにジャンプする。
53h lbl         JLS,lbl         8           ステータスレジスタに「LES」が立っていれば指定ラベルにジャンプする。
54h lbl         JLE,lbl         8           ステータスレジスタに「LES|EQU」が立っていれば指定ラベルにジャンプする。