* フロントエンドバイトコードの仕様 -(by [[K]], 2014.08.13) ** (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ビットモードのとき: |0|1|2|3|4|5|6| |0|1|2|3|4|rep0|-1| ---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つ前・・・の代入可能なラベルという意味に解釈されます。 -4: 第一プリフィックス命令 --44(reg): ---CND(Rxx);を生成します。 ---- --dc0: --dc1: --dc2~dfb: リザーブ --dfc(reg0): レジスタの値を10進数でコンソールに出力 --dfc(reg0): レジスタの値を16進数でコンソールに出力 ---reg0は以下のルールでエンコードされています。 ---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ビットモードのとき: |c00...c3f|R00~R3F| --dfd(reg0): レジスタの値を16進数でコンソールに出力 --dfd(reg0): レジスタの値を10進数でコンソールに出力 --dfe: リザーブ --dff: 特殊リマーク