ヴァーチャルマシンpascの仕様を、以下に示します。
アセンブラのニーモニックが書かれた物ではなく、
アセンブル後のバイトコードが書かれたファイルを実行します。
ヴァーチャルマシンは、ファイルの先頭から実行を開始します。
基本的には、COMETと同じ物をサポートします。
しかし、COMETの命令セットでは十分ではないので、
直値をレジスタにロードするMoveの様な、いくつかの命令を追加します。
COMETでは、INやOUTをマクロ命令として実装し、
スーパーバイザコールなどに展開されますが、
pascでは、IN,OUTなどもマシンが直接実装します。
r,r1,r2はGR0〜GR4,bp,sp
xはGR0〜GR4,bp,sp
addrはアドレス
valueは値
をそれぞれ取ります。
OPの値は16進数です。
15-8 | 7-4 | 3-0 | 15-0 | ←ビット番号 | ||
---|---|---|---|---|---|---|
第一語 | 第2語 | 命令語長 | 機械語命令 | 解説 | ||
OP | r/r1 | r2/x | addr/value | |||
00 | - | - | - | 1 | NOP | No operation |
10 | 2 | Load r,addr,x | r <- (addr+x) | |||
11 | 2 | Store r,addr,x | (r) -> addr+x | |||
12 | 2 | LAD r,addr,x | r <- addr+x | |||
13 | 2 | Move r,value | r <- value | |||
14 | - | 1 | Load r1,r2 | r1 <- (r2) | ||
20 | 2 | AddA r,addr,x | r <- (r) + (addr+x) | |||
21 | - | 1 | AddA r1,r2 | r <- (r1) + (r2) | ||
22 | 2 | SubA r,addr,x | r <- (r) - (addr+x) | |||
23 | - | 1 | SubA r1,r2 | r <- (r1) - (r2) | ||
24 | 2 | MulA r,addr,x | r <- (r) * (addr+x) | |||
25 | - | 1 | MulA r1,r2 | r <- (r1) * (r2) | ||
26 | 2 | DivA r,addr,x | r <- (r) / (addr+x) | |||
27 | - | 1 | DivA r1,r2 | r <- (r1) / (r2) | ||
28 | 2 | ModA r,addr,x | r <- (r) % (addr+x) | |||
29 | - | 1 | ModA r1,r2 | r <- (r1) % (r2) | ||
30 | 2 | And r,addr,x | r <- (r) & (addr+x) | |||
31 | - | 1 | And r1,r2 | r <- (r1) & (r2) | ||
32 | 2 | Or r,addr,x | r <- (r) | (addr+x) | |||
33 | - | 1 | Or r1,r2 | r <- (r1) | (r2) | ||
34 | 2 | Xor r,addr,x | r <- (r) ^ (addr+x) | |||
35 | - | 1 | Xor r1,r2 | r <- (r1) ^ (r2) | ||
40 | 2 | CPA r1,adr,x | (r) == (addr+x) | |||
44 | - | 1 | CPA r1,r2 | (r1)== (r2) | ||
61 | - | 2 | JMI addr,x | Jump on minus | ||
62 | - | 2 | JNZ addr,x | Jump on non zero | ||
63 | - | 2 | JZE addr,x | Jump on zero | ||
64 | - | 2 | JUMP addr,x | Unconditional jump | ||
65 | - | 2 | JPL addr,x | Jump on plus | ||
70 | - | 2 | Push addr,x | (addr+x)をプッシュ | ||
71 | - | - | 1 | Pop r | rにポップ | |
72 | - | - | 1 | Push r | (r)をプッシュ | |
80 | - | 2 | Call addr,x | (addr+x)のroutineをcallする。 | ||
81 | - | - | - | 1 | Ret | routineから戻る |
F0 | - | 2 | OutIA addr,x | (addr+x)を整数で出力 | ||
F1 | - | - | 1 | OutI r | (r)を整数で出力 | |
F2 | - | 2 | OutBA addr,x | (addr+x)をboolで出力 | ||
F3 | - | - | 1 | OutB r | (r)をboolで出力 | |
F4 | - | 不定 | OutS value,.. | (value.)を文字列で出力 | ||
F5 | - | 2 | InA addr,x | addr+xに整数を入力 | ||
F6 | - | - | 1 | In r | rに整数を入力 |
(r1)と(r2)、又は(r)と(実効アドレス)の
算術比較又は論理比較を行い、
比較結果によって、FRに次の値を設定します。
比較結果 | FRの値 | |
---|---|---|
SF | ZF | |
(r1)>(r2) (r)>(実効アドレス) |
0 | 0 |
(r1)=(r2) (r)=(実効アドレス) |
0 | 1 |
(r1)<(r2) (r)<(実効アドレス) |
1 | 0 |
OutS命令のオペランドは、出力すべき文字列を先頭から順に指定します。
1文字は1WORD(2バイト)です。
エスケープ文字はバーチャルマシン側で処理します。
0x0000を読み込むと、文字列の終端と判断し、出力を終えます。