| / | +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 | |