/ | +0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 | +8 | +9 | +A | +B | +C | +D | +E | +F |
+00 | NOP | LB | LIMM | PLIMM | CND | +5 | +6 | +7 | LMEM | SMEM | +A | +B | +C | +D | PADD | PDIF |
+10 | CP/OR | XOR | AND | +3 | ADD | SUB | MUL | +7 | SHL | SAR | DIV | MOD | +C | +D | PCP | +F |
+20 | CMPE | CMPNE | CMPL | CMPGE | CMPLE | CMPG | TSTZ | TSTNZ | PCMPE | PCMPNE | PCMPL | PCMPGE | PCMPLE | PCMPG | +E | +F |
+30 | +0 | +1 | MALLOC | +3 | DATA | +5 | +6 | +7 | +8 | +9 | +A | +B | +C | +D | +E | +F |
+40 | +0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 | +8 | +9 | +A | +B | +C | +D | +E | +F |
+50 | +0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 | +8 | +9 | +A | +B | +C | +D | +E | +F |
+60 | +0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 | +8 | +9 | +A | +B | +C | +D | +E | +F |
+70 | +0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 | +8 | +9 | +A | +B | +C | +D | +E | +F |
+80 | +0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 | +8 | +9 | +A | +B | +C | +D | +E | +F |
+90 | +0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 | +8 | +9 | +A | +B | +C | +D | +E | +F |
+A0 | +0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 | +8 | +9 | +A | +B | +C | +D | +E | +F |
+B0 | +0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 | +8 | +9 | +A | +B | +C | +D | +E | +F |
+C0 | +0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 | +8 | +9 | +A | +B | +C | +D | +E | +F |
+D0 | +0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 | +8 | +9 | +A | +B | +C | +D | +E | +F |
+E0 | +0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 | +8 | +9 | +A | +B | +C | +D | +E | +F |
+F0 | +0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 | +8 | +9 | +A | +B | +C | +D | REMARK | +F |
OSECPU | OSECPU | OSECPU | OSECPU | OSECPU | OSECPU | OSECPU | OSECPU | OSECPU | OSECPU | OSECPU | OSECPU | OSECPU | OSECPU | OSECPU | OSECPU |
オペコード | デバッグモード表記 | 説明 | |||||||||
...1... | ...2... | ...3... | ...4... | ...5... | ...6... | ...7... | ...8... | ...9... | ..10... | ||
00 | NOP(); | (No operation) | |||||||||
01 | opt | imm32 | LB(opt, imm32); | set label#imm32 to current address. | |||||||
02 | reg0R | imm32 | LIMM(reg0R, imm32); | reg0R = imm32; | |||||||
03 | reg0R | imm32 | PLIMM(reg0R, imm32); | reg0R = Pointer of label #imm32; | |||||||
04 | reg0R | CND(reg0R); | if((reg0R & 1) == 1){ execute next; } else { pass next; } | ||||||||
08 | reg0R | typ32 | reg1P | 00 | LMEM(reg0R, typ32, reg1P, 0); | reg0R = *((typ32 *) reg1P); | |||||
09 | reg0R | typ32 | reg1P | 00 | SMEM(reg0R, typ32, reg1P, 0); | *((typ32 *) reg1P) = reg0R; | |||||
0E | reg0P | typ32 | reg1P | reg2R | PADD(reg0P, typ32, reg1P, reg2R); | reg0P = reg1P + reg2R; | |||||
0F | reg0R | typ32 | reg1P | reg2P | PDIF(reg0R, typ32, reg1P, reg2P); | reg0R = reg1P - reg2P; | |||||
10 | reg0R | reg1R | FF | CP(reg0R, reg1R); | reg0R = reg1R; | ||||||
10 | reg0R | reg1R | reg2R | OR(reg0R, reg1R, reg2R); | reg0R = (reg1R | reg2R); | ||||||
11 | reg0R | reg1R | reg2R | XOR(reg0R, reg1R, reg2R); | reg0R = (reg1R ^ reg2R); | ||||||
12 | reg0R | reg1R | reg2R | AND(reg0R, reg1R, reg2R); | reg0R = (reg1R & reg2R); | ||||||
14 | reg0R | reg1R | reg2R | ADD(reg0R, reg1R, reg2R); | reg0R = (reg1R + reg2R); | ||||||
15 | reg0R | reg1R | reg2R | SUB(reg0R, reg1R, reg2R); | reg0R = (reg1R - reg2R); | ||||||
16 | reg0R | reg1R | reg2R | MUL(reg0R, reg1R, reg2R); | reg0R = (reg1R * reg2R); | ||||||
18 | reg0R | reg1R | reg2R | SHL(reg0R, reg1R, reg2R); | reg0R = (reg1R << reg2R); | ||||||
19 | reg0R | reg1R | reg2R | SAR(reg0R, reg1R, reg2R); | reg0R = (reg1R >> reg2R); | ||||||
1A | reg0R | reg1R | reg2R | DIV(reg0R, reg1R, reg2R); | reg0R = (reg1R / reg2R); | ||||||
1B | reg0R | reg1R | reg2R | MOD(reg0R, reg1R, reg2R); | reg0R = (reg1R % reg2R); | ||||||
1E | reg0P | reg1P | PCP(reg0P, reg1P); | reg0P = reg1P | |||||||
20 | reg0R | reg1R | reg2R | CMPE(reg0R, reg1R, reg2R); | reg0R = (reg1R == reg2R) ? -1 : 0; | ||||||
21 | reg0R | reg1R | reg2R | CMPNE(reg0R, reg1R, reg2R); | reg0R = (reg1R != reg2R) ? -1 : 0; | ||||||
22 | reg0R | reg1R | reg2R | CMPL(reg0R, reg1R, reg2R); | reg0R = (reg1R < reg2R) ? -1 : 0; | ||||||
23 | reg0R | reg1R | reg2R | CMPGE(reg0R, reg1R, reg2R); | reg0R = (reg1R >= reg2R) ? -1 : 0; | ||||||
24 | reg0R | reg1R | reg2R | CMPLE(reg0R, reg1R, reg2R); | reg0R = (reg1R <= reg2R) ? -1 : 0; | ||||||
25 | reg0R | reg1R | reg2R | CMPG(reg0R, reg1R, reg2R); | reg0R = (reg1R > reg2R) ? -1 : 0; | ||||||
26 | reg0R | reg1R | reg2R | TSTZ(reg0R, reg1R, reg2R); | reg0R = ((reg1R & reg2R) == 0) ? -1 : 0; | ||||||
27 | reg0R | reg1R | reg2R | TSTNZ(reg0R, reg1R, reg2R); | reg0R = ((reg1R & reg2R) != 0) ? -1 : 0; | ||||||
28 | reg0R | reg1P | reg2P | PCMPE(reg0R, reg1P, reg2P); | reg0R = (reg1P == reg2P) ? -1 : 0; | ||||||
29 | reg0R | reg1P | reg2P | PCMPNE(reg0R, reg1P, reg2P); | reg0R = (reg1P != reg2P) ? -1 : 0; | ||||||
2A | reg0R | reg1P | reg2P | PCMPL(reg0R, reg1P, reg2P); | reg0R = (reg1P < reg2P) ? -1 : 0; | ||||||
2B | reg0R | reg1P | reg2P | PCMPGE(reg0R, reg1P, reg2P); | reg0R = (reg1P >= reg2P) ? -1 : 0; | ||||||
2C | reg0R | reg1P | reg2P | PCMPLE(reg0R, reg1P, reg2P); | reg0R = (reg1P <= reg2P) ? -1 : 0; | ||||||
2D | reg0R | reg1P | reg2P | PCMPG(reg0R, reg1P, reg2P); | reg0R = (reg1P > reg2P) ? -1 : 0; | ||||||
32 | reg0P | reg1R | reg2R | MALLOC(reg0P, reg1R, reg2R); | reg0P = &(reg1R *)[reg2R]; | ||||||
34 | typ32 | len32 | data... | DATA(type32, length32);[data] | |||||||
FE | len | ... | REMARK(len);[...] |
ちなみにx86版では、R00~R02までが実レジスタに割り当てられていて、残りはメモリを使ってレジスタをエミュレーションしています。
From | To | 本数 | 用途 |
00 | 1F | 32 | 関数ローカルな汎用レジスタです。他の関数を呼び出しても値は破壊されません。 |
20 | 27 | 8 | グローバルな汎用レジスタです。他の関数を呼び出すと、値が破壊されるかもしれません。アプリが自由に用途を決められます。 |
28 | 2F | 8 | グローバルな汎用レジスタです。他の関数を呼び出すと、値が破壊されるかもしれません。OSが用途を決めています。 |
30 | 3B | 12 | テンポラリレジスタです。汎用ではありますが、関数との引数・戻り値のやりとりや、ASKAにおける数式の計算に利用されるので値が破壊されやすいです。 |
3C | 3E | 3 | Reserved. 将来の拡張のために予約されています。 |
3F | 1 | 定数即値指定などの特殊用途に利用するもので、レジスタとして値を格納するのには使えません。 |
ちなみにx86版では、P00~P02までが実レジスタに割り当てられていて、残りはメモリを使ってレジスタをエミュレーションしています。
From | To | 本数 | 用途 |
00 | 1 | 予約済み(ベースポインタ)です。未実装なので使用できません。 | |
01 | 1F | 31 | 関数ローカルな汎用レジスタです。他の関数を呼び出しても値は破壊されません。 |
20 | 27 | 8 | グローバルな汎用レジスタです。他の関数を呼び出すと、値が破壊されるかもしれません。アプリが自由に用途を決められます。 |
28 | 2F | 8 | グローバルな汎用レジスタです。他の関数を呼び出すと、値が破壊されるかもしれません。OSが用途を決めています。 |
30 | 3B | 12 | テンポラリレジスタです。汎用ではありますが、関数との引数・戻り値のやりとりや、ASKAにおける数式の計算に利用されるので値が破壊されやすいです。 |
3C | 3E | 3 | Reserved. 将来の拡張のために予約されています。 |
3F | 1 | 無条件分岐などの特殊用途に利用するもので、レジスタとして値を格納するのには使えません。(内部的には命令ポインタといえる?) |
typ32 | 型名 | 説明 |
0x00 | Undefined | |
0x01 | VPtr | プログラムコード領域? |
0x02 | SINT8 | signed char. |
0x03 | UINT8 | |
0x04 | SINT16 | short. |
0x05 | UINT16 | |
0x06 | SINT32 | |
0x07 | UINT32 | |
0x08 | SINT4 | |
0x09 | UINT4 | |
0x0A | SINT2 | |
0x0B | UINT2 | |
0x0C | SINT1 | bool.代入できるのは0か-1のみ. |
0x0D | UINT1 | |
0x0E | SINT12 | |
0x0F | UINT12 | |
0x10 | SINT20 | |
0x11 | UINT20 | |
0x12 | SINT24 | |
0x13 | UINT24 | |
0x14 | SINT28 | |
0x15 | UINT28 |
この命令は何もしません。JITコンパイラはこの命令を翻訳せず、実CPUに対してNOP命令は発行されません。
1 | 2 | 3 | 4 | 5 | 6 |
LB | opt | imm32 |
ラベルを定義します。OSECPUでは、ラベルの場所に対してのみ実行を転送できます。 ラベル番号は同一アプリケーション中で重複してはなりません。
ラベル番号は本来は32ビットの任意の整数(負の数もOK)なのですが、現状の実装では0~4095までしか処理できません。すみません手抜きです。
1 | 2 | 3 | 4 | 5 | 6 | |
LIMM | 02 | reg0R | imm32 |
1 | 2 | 3 | 4 | 5 | 6 | |
PLIMM | 03 | reg0P | imm32 |
1 | 2 | ||
CND | 04 | reg0R | ... |
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
LMEM | 08 | reg0R | typ32 | reg1P | 00 | |||
SMEM | 09 | reg0R | typ32 | reg1P | 00 |
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
PADD | 0E | reg0P | typ32 | reg1P | reg2R |
reg1Pのポインタ位置にreg2Rの値を加えた結果、指し示す位置のポインタをreg0Pに代入します。
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
PDIF | 0F | reg0R | typ32 | reg1P | reg2P |
reg0R = reg1P - reg2Pとなるよう、二つのポインタの差分をreg0Rに代入します。
1 | 2 | 3 | 4 | |
CP | 10 | reg0R | reg1R | FF |
OR | 10 | reg0R | reg1R | reg2R |
(other) | OpCode | reg0R | reg1R | reg2R |
OR | XOR | AND | ADD | SUB | MUL | SHL | SAR | DIV | MOD | |
OpCode | 10 | 11 | 12 | 14 | 15 | 16 | 18 | 19 | 1A | 1B |
APIID(R30) | API名 | ...R31... | ...R32... | ...R33... | ...R34... | ...R35... | ...R36... | 説明 |
FF40 | openWin | xSize | ySize | |||||
FF41 | flushWin | xSize | ySize | x0 | y0 | 終了時に自動で呼ばれる。 | ||
FF44 | drawPoint | mode | x | y | col | |||
FF45 | drawLine | mode | x0 | y0 | x1 | y1 | col | |
FF46 | fillRect | mode | xSize | ySize | x0 | y0 | col | |
FF47 | fillOval | mode | xSize | ySize | x0 | y0 | col |
コメント | お名前 | NameLink | |