5 //未定義の命令(WebCPU_Instructionと同値)
6 var WebCPU_Instruction_Undefined = WebCPU_Instruction;
8 var WebCPU_Instruction_NOP = function(instrID){
10 }.extend(WebCPU_Instruction, {
11 loadArguments: function(argBinStr, baseIndex){
14 instruction: function(env){
17 createBinaryString: function(env){
25 var WebCPU_Instruction_LB = function(instrID){
30 }.extend(WebCPU_Instruction, {
31 loadArguments: function(argBinStr, baseIndex){
33 this.fetchUnsignedInteger(argBinStr, baseIndex, 0, 1),
34 this.fetchSignedInteger(argBinStr, baseIndex, 1, 4)
38 setParameter: function(opt, labelID){
42 instruction: function(env){
45 createBinaryString: function(env){
46 return "01" + toHexString8(this.opt) + toHexString32(this.imm32);
49 return this.makeBinaryOperandString("LB", "opt:0x", this.opt, "0x", this.imm32);
53 var WebCPU_Instruction_LIMM = function(instrID){
57 }.extend(WebCPU_Instruction, {
58 loadArguments: function(argBinStr, baseIndex){
60 this.fetchUnsignedInteger(argBinStr, baseIndex, 0, 1),
61 this.fetchSignedInteger(argBinStr, baseIndex, 1, 4)
65 setParameter: function(destReg, imm32){
69 instruction: function(env){
70 env.registers.Integer[this.reg0] = this.imm32;
72 createBinaryString: function(env){
73 return "02" + toHexString8(this.reg0) + toHexString32(this.imm32);
76 return this.makeBinaryOperandString("LIMM", "R", this.reg0, "0x", this.imm32);
80 var WebCPU_Instruction_PLIMM = function(instrID){
84 }.extend(WebCPU_Instruction, {
85 loadArguments: function(argBinStr, baseIndex){
87 this.fetchUnsignedInteger(argBinStr, baseIndex, 0, 1),
88 this.fetchSignedInteger(argBinStr, baseIndex, 1, 4)
92 setParameter: function(destReg, imm32){
96 instruction: function(env){
97 var m = env.mainMemory.getMemoryPageInstanceFromLabelNumber(this.imm32);
99 throw new WebCPU_Exception(2, ["Label#0x" + this.imm32.toString(16).toUpperCase() + " notfound."]);
101 env.registers.Pointer[this.reg0] = new WebCPU_Pointer(m);
102 if(this.reg0 == 0x3F){
104 env.memoryPageCounter = env.mainMemory.getMemoryPageCountFromMemoryPageInstance(m);
105 env.memoryInstructionCounter = 0;
106 env.message("JMP:page " + env.memoryPageCounter+ "\n", 20);
110 createBinaryString: function(env){
111 return "03" + toHexString8(this.reg0) + toHexString32(this.imm32);
113 toString: function(){
114 return this.makeBinaryOperandString("PLIMM", "P", this.reg0, "0x", this.imm32);
118 var WebCPU_Instruction_CND = function(instrID){
121 }.extend(WebCPU_Instruction, {
122 loadArguments: function(argBinStr, baseIndex){
124 this.fetchUnsignedInteger(argBinStr, baseIndex, 0, 1)
128 setParameter: function(reg){
131 instruction: function(env){
132 if((env.registers.Integer[this.reg0R] & 0x01) != 0x01){
133 env.memoryInstructionCounter++;
136 createBinaryString: function(env){
137 return "04" + toHexString8(this.reg0R);
139 toString: function(){
140 return this.makeUnaryOperandString("CND", "R", this.reg0R);
144 var WebCPU_Instruction_LMEM = function(instrID){
146 WebCPU_Instruction_LMEM.base.apply(this, arguments);
147 }.extend(WebCPU_Instruction_MEM_Base, {
148 instruction: function(env){
149 var pointer = env.registers.Pointer[this.reg1P];
150 if(this.typ32 == pointer.memoryType){
151 var v = env.registers.Pointer[this.reg1P].readData(env);
152 env.message("Memory:Read:" + pointer.toString() + ":" + v + "\n", 20);
154 env.registers.Integer[this.reg0R] = v;
157 throw new WebCPU_Exception(2, ["Conflict type of pointer."]);
160 createBinaryString: function(env){
161 return "08" + toHexString8(this.reg0R) + toHexString32(this.typ32) + toHexString8(this.reg1P) + "00";
163 toString: function(){
164 return this.makeQuaternaryOperandString("LMEM", "R", this.reg0R, "typ:0x", this.typ32, "P", this.reg1P, "reserved:0x", this.reserved);
168 var WebCPU_Instruction_SMEM = function(instrID){
170 WebCPU_Instruction_SMEM.base.apply(this, arguments);
171 }.extend(WebCPU_Instruction_MEM_Base, {
172 instruction: function(env){
173 var pointer = env.registers.Pointer[this.reg1P];
174 if(this.typ32 == pointer.memoryType){
175 var d = env.registers.Integer[this.reg0R];
176 if(this.typ32 == 0x03){
179 } else if(this.typ32 == 0x06){
182 } else if(this.typ32 == 0x07){
185 d = (0xffffffff >> 1) + d;
188 } else if(this.typ32 == 0x09){
192 throw new WebCPU_Exception(0, ["Not implemented data type: 0x" + this.typ32.toString(16)]);
194 if(d != env.registers.Integer[this.reg0R]){
195 env.message("Data lost in type conversion 0x" + env.registers.Integer[this.reg0R].toString(16) + " to:0x" + d.toString(16));
197 env.message("Memory:Write:" + pointer.toString() + ":" + d +"\n", 20);
198 env.registers.Pointer[this.reg1P].writeData(env, d);
200 throw new WebCPU_Exception(2, ["Conflict type of pointer."]);
203 createBinaryString: function(env){
204 return "09" + toHexString8(this.reg0R) + toHexString32(this.typ32) + toHexString8(this.reg1P) + "00";
206 toString: function(){
207 return this.makeQuaternaryOperandString("SMEM", "R", this.reg0R, "typ:0x", this.typ32, "P", this.reg1P, "reserved:0x", this.reserved);
211 var WebCPU_Instruction_PADD = function(instrID){
217 }.extend(WebCPU_Instruction, {
218 loadArguments: function(argBinStr, baseIndex){
220 this.fetchUnsignedInteger(argBinStr, baseIndex, 0, 1),
221 this.fetchUnsignedInteger(argBinStr, baseIndex, 1, 4),
222 this.fetchUnsignedInteger(argBinStr, baseIndex, 5, 1),
223 this.fetchUnsignedInteger(argBinStr, baseIndex, 6, 1)
227 setParameter: function(regPdest, pType, regPsrc, regR){
228 this.reg0P = regPdest;
230 this.reg1P = regPsrc;
233 instruction: function(env){
234 if(this.reg0P != this.reg1P){
235 env.registers.Pointer[this.reg0P] = env.registers.Pointer[this.reg1P].getCopy();
237 env.registers.Pointer[this.reg0P].addressOffset += env.registers.Integer[this.reg2R];
239 createBinaryString: function(env){
240 return "0E" + toHexString8(this.reg0P) + toHexString32(this.typ32) + toHexString8(this.reg1P) + toHexString8(this.reg2R);
242 toString: function(){
243 return this.makeQuaternaryOperandString("PADD", "P", this.reg0P, "typ:0x", this.typ32, "P", this.reg1P, "R", this.reg2R);
247 var WebCPU_Instruction_PDIF = function(instrID){
253 }.extend(WebCPU_Instruction, {
254 loadArguments: function(argBinStr, baseIndex){
256 this.fetchUnsignedInteger(argBinStr, baseIndex, 0, 1),
257 this.fetchUnsignedInteger(argBinStr, baseIndex, 1, 4),
258 this.fetchUnsignedInteger(argBinStr, baseIndex, 5, 1),
259 this.fetchUnsignedInteger(argBinStr, baseIndex, 6, 1)
263 setParameter: function(regR, pType, reg1P, reg2P){
269 instruction: function(env){
270 throw new WebCPU_Exception(0, ["Not implemented:" + this.toString()]);
272 createBinaryString: function(env){
273 return "0F" + toHexString8(this.reg0R) + toHexString32(this.typ32) + toHexString8(this.reg1P) + toHexString8(this.reg2P);
275 toString: function(){
276 return this.makeQuaternaryOperandString("PDIF", "R", this.reg0R, "typ:0x", this.typ32, "P", this.reg1P, "P", this.reg2P);
280 var WebCPU_Instruction_PCP = function(instrID){
285 }.extend(WebCPU_Instruction, {
286 loadArguments: function(argBinStr, baseIndex){
288 this.fetchUnsignedInteger(argBinStr, baseIndex, 0, 1),
289 this.fetchUnsignedInteger(argBinStr, baseIndex, 1, 1)
293 setParameter: function(regPdest, regPsrc){
294 this.reg0P = regPdest;
295 this.reg1P = regPsrc;
297 instruction: function(env){
298 if(this.reg0P != this.reg1P){
299 env.registers.Pointer[this.reg0P] = env.registers.Pointer[this.reg1P].getCopy();
300 if(this.reg0P == 0x3F){
302 var type = env.registers.Pointer[0x3F].memoryType;
305 env.goToPointerRegister(0x3F);
306 } else if(type == 0xC0FFEE){
308 env.API.executeAPI(env);
310 throw new WebCPU_Exception(2, ["Attempt transfering execution to data section."]);
316 createBinaryString: function(env){
317 return "1E" + toHexString8(this.reg0P) + toHexString8(this.reg1P);
319 toString: function(){
320 return this.makeBinaryOperandString("PCP", "P", this.reg0P, "P", this.reg1P);
324 var WebCPU_Instruction_MALLOC = function(instrID){
328 this.reg2R = 0; //指定された型でのデータの個数
329 }.extend(WebCPU_Instruction, {
330 loadArguments: function(argBinStr, baseIndex){
331 this.reg0P = this.fetchUnsignedInteger(argBinStr, baseIndex, 0, 1);
332 this.reg1R = this.fetchUnsignedInteger(argBinStr, baseIndex, 1, 1);
333 this.reg2R = this.fetchUnsignedInteger(argBinStr, baseIndex, 2, 1);
336 instruction: function(env){
337 var m = env.mainMemory.allocateMemoryPage(env.registers.Integer[this.reg1R], env.registers.Integer[this.reg2R]);
338 env.registers.Pointer[this.reg0P] = new WebCPU_Pointer(m);
340 createBinaryString: function(env){
341 return "32" + toHexString8(this.reg0P) + toHexString8(this.reg1R) + toHexString8(this.reg2R);
343 toString: function(){
344 return this.makeTernaryOperandString("MALLOC", "P", this.reg0P, "R", this.reg1R, "R", this.reg2R);
348 var WebCPU_Instruction_DATA = function(instrID){
351 this.length = 0; //指定された型でのデータの個数
352 this.byteLength = 0; //バイト単位でのデータ部分の長さ
355 }.extend(WebCPU_Instruction, {
356 loadArguments: function(argBinStr, baseIndex){
357 this.type = this.fetchUnsignedInteger(argBinStr, baseIndex, 0, 4);
359 this.length = this.fetchUnsignedInteger(argBinStr, baseIndex, 4, 4);
360 this.data = new Array();
361 if(this.type == 0x03){
363 this.byteLength = this.length;
364 this.dataStr = argBinStr.substr(baseIndex + 8 * 2, this.byteLength * 2);
365 for(var i = 0; i < this.length; i++){
366 this.data.push(parseInt(this.dataStr.substr(i * 2, 2), 16));
368 } else if(this.type == 0x06){
370 this.byteLength = this.length * 4;
371 this.dataStr = argBinStr.substr(baseIndex + 8 * 2, this.byteLength * 2);
372 for(var i = 0; i < this.length; i++){
373 this.data.push(parseSignedInt32(this.dataStr.substr(i * 2 * 4, 4), 16));
375 } else if(this.type == 0x07){
377 this.byteLength = this.length * 4;
378 this.dataStr = argBinStr.substr(baseIndex + 8 * 2, this.byteLength * 2);
379 for(var i = 0; i < this.length; i++){
380 this.data.push(parseInt(this.dataStr.substr(i * 2 * 4, 4), 16));
382 } else if(this.type == 0x09){
384 this.byteLength = Math.ceil(this.length / 2);
385 this.dataStr = argBinStr.substr(baseIndex + 8 * 2, this.byteLength * 2);
386 for(var i = 0; i < this.length; i++){
387 this.data.push(parseInt(this.dataStr.substr(i, 1), 16));
390 return ("DATA:Not implemented data type: 0x" + this.type.toString(16));
392 return 1 + 4 + 4 + this.byteLength;
394 instruction: function(env){
397 createBinaryString: function(env){
398 return "34" + toHexString32(this.type) + toHexString32(this.length) + this.dataStr;
400 toString: function(){
401 return this.makeBinaryOperandString("DATA", "type:0x", this.type, "length:0x", this.length) + "[" + this.dataStr +"]";
405 var WebCPU_Instruction_REMARK = function(instrID){
409 }.extend(WebCPU_Instruction, {
410 loadArguments: function(argBinStr, baseIndex){
411 this.remLen = this.fetchUnsignedInteger(argBinStr, baseIndex, 0, 1);
412 this.remStr = argBinStr.substr(baseIndex + 1 * 2, this.remLen * 2);
413 return 2 + this.remLen;
415 instruction: function(env){
418 createBinaryString: function(env){
419 return "FE" + toHexString8(this.remLen) + this.remStr;
421 toString: function(){
422 return this.makeUnaryOperandString("REMARK", "len:0x", this.remLen) + "[" + this.remStr +"]";