フロントエンドバイトコードの仕様
(1)
- 1: LB命令
- 1:
- LB(0, ...);を生成します。optはゼロで、ラベル番号は直前に生成したラベル番号+1が自動的に指定されます。
- 41(op):
- LB(opt, no);を生成します。opt=op&0xff;で、no=「直前に生成したラベル番号+1」+op/256;になります。
- 2: LIMM命令, CP命令
- 2(imm)(reg0):
- immの値が定数を表しているときは、LIMM(32, reg0, imm);命令を生成します。32の部分をほかの数値にさせることもできて、その際はimmやreg0の部分でプリフィックスをつけて指定することになります。
- immの値がレジスタを表しているときは、CP(32, reg0, reg1);命令を生成します。32の部分をほかの数値にさせることもできて、その際はimmやreg0の部分でプリフィックスをつけて指定することになります。
- immは以下のルールでエンコードされています。
- 4ビットモードのとき:
- rep0はリピートレジスタ0を表していて、直前に代入されたRxxレジスタを意味します。
- 8ビットモードのとき:
80...96 | 0x0~0x16 | 97...9f | 下記の表を参照 | a0...ae | R00~R0E | af | R3F | b0...b7 | rep0~rep7 | b8...bf | -0x8~-0x1 |
97 | 98 | 99 | 9a | 9b | 9c | 9d | 9e | 9f | 0x20 | 0x18 | 0x40 | 0x80 | 0x100 | 0xff | 0x7f | 0x3f | 0x1f |
- 12ビットモードのとき:
c00...cee | 0x0~0xee | cef...cff | 下記の表を参照 | d70...dff | -0x90~-0x1 | d00...d3f | R00~R3F | d60...d6f | 0x20000, 0x40000, ..., 0x100000000 | d50...d56 | bit1, bit2, bit4, bit8, ..., bit64 (プリフィクス) | d57 | 更に柔軟なbit指定プリフィクス | d58...d5e | リザーブ(将来の拡張用) | d5f | 10のベキ指定プリフィクス |
- d5f-x-y と書くと、imm=x*10^(3+y)と解釈されます。
cef | cf0 | cf1 | cf2 | cf3 | cf4 | cf5 | cf6 | cf7 | 0x200 | 0xf0 | 0x400 | 0x800 | 0x1000 | 0x2000 | 0x4000 | 0x8000 | 0x10000 |
cf8 | cf9 | cfa | cfb | cfc | cfd | cfe | cff | 0xffff | 0x7fff | 0x3fff | 0x1fff | 0xfff | 0x7ff | 0x3ff | 0x1ff |
- 16ビットモードのとき:
e000...e7de | 0x0~0x7de | e9e0...efff | -0x620~-0x1 | e7df...e7ff | リザーブ(将来の拡張用) | e800...e9df | リザーブ(将来の拡張用) |
- reg0の部分は単純にRxxの番号を符号なしのhh4で記述したものです。
(早くも力尽きた・・・)
- 3: PLIMM命令
- 3(imm):
- PLIMM(P3F, ...);を生成します。ラベル番号は直前に生成したラベル番号+immが使われます。しかし、この命令がデータラベルを指し示すことはないため、ラベル番号は単純な加算、減算ではなく、1つ先、2つ先、1つ前、2つ前・・・の分岐可能なラベルという意味に解釈されます。またoptが2や3のラベルを指し示すこともできず、それらもスキップしながら目的のラベル番号を探します。
- 43(imm)(preg):
- PLIMM(Pxx, ...);を生成します。ラベル番号は直前に生成したラベル番号+immが使われます。しかし、この命令がopt=1以外のラベルを指し示すことはないため、ラベル番号は単純な加算、減算ではなく、1つ先、2つ先、1つ前、2つ前・・・の代入可能なラベルという意味に解釈されます。
- dc0:
- dc1:
- dc2~dfb: リザーブ
- dfc(reg0): レジスタの値を16進数でコンソールに出力
- 4ビットモードのとき:
0 | 1 | 2 | 3 | 4 | 5 | 6 | R00 | rep0 | rep1 | rep2 | rep3 | rep4 | rep5 |
- 8ビットモードのとき:
80...9f | R00~R1F | a0...af | rep0~rep15 | b0...bf | R30~R3F |
- 12ビットモードのとき:
- dfd(reg0): レジスタの値を10進数でコンソールに出力
- dfe: リザーブ
- dff: 特殊リマーク
|