public PacketClass(OPCODES opcode) { Array.Resize(ref Data, 6); Data[0] = 0; Data[1] = 4; Data[2] = (byte)(Conversions.ToShort(opcode) % 256); Data[3] = (byte)(Conversions.ToShort(opcode) / 256); Data[4] = 0; Data[5] = 0; }
private ushort getInstruction(OPCODES opcode, VALUES b, VALUES a) { int word = (ushort)opcode; word += (ushort)b << 5; word += (ushort)a << 10; return (ushort) word; }
public int DO_OP(OPCODES op) { switch(op) { case OPCODES.NOP: PC++; break; case OPCODES.EXT: External(); PC++; break; case OPCODES.LIT: PC++; dataStack.Push(memory[PC]); PC++; break; case OPCODES.LT: TOS = dataStack.Pop(); SOS = dataStack.Pop(); dataStack.Push(SOS < TOS ? -1 : 0); PC++; break; case OPCODES.EQ: TOS = dataStack.Pop(); SOS = dataStack.Pop(); dataStack.Push(TOS == SOS ? -1 : 0); PC++; break; case OPCODES.GT: TOS = dataStack.Pop(); SOS = dataStack.Pop(); dataStack.Push(SOS > TOS ? -1 : 0); PC++; break; case OPCODES.AND: TOS = dataStack.Pop(); SOS = dataStack.Pop(); dataStack.Push(TOS & SOS); PC++; break; case OPCODES.OR: TOS = dataStack.Pop(); SOS = dataStack.Pop(); dataStack.Push(TOS | SOS); PC++; break; case OPCODES.XOR: TOS = dataStack.Pop(); SOS = dataStack.Pop(); dataStack.Push(TOS ^ SOS); PC++; break; case OPCODES.NOT: TOS = dataStack.Pop(); dataStack.Push(~TOS); PC++; break; case OPCODES.ADD: TOS = dataStack.Pop(); SOS = dataStack.Pop(); dataStack.Push(TOS + SOS); PC++; break; case OPCODES.SUB: TOS = dataStack.Pop(); SOS = dataStack.Pop(); dataStack.Push(SOS - TOS); PC++; break; case OPCODES.MULT: TOS = dataStack.Pop(); SOS = dataStack.Pop(); dataStack.Push(TOS * SOS); PC++; break; case OPCODES.DIVMOD: TOS = dataStack.Pop(); SOS = dataStack.Pop(); dataStack.Push(SOS / TOS); dataStack.Push(SOS % TOS); PC++; break; case OPCODES.SHL: TOS = dataStack.Pop(); dataStack.Push(TOS << 1); PC++; break; case OPCODES.SHR: TOS = dataStack.Pop(); dataStack.Push(TOS >> 1); PC++; break; case OPCODES.LOAD: TOS = dataStack.Pop(); dataStack.Push(memory[TOS]); PC++; break; case OPCODES.STORE: TOS = dataStack.Pop(); SOS = dataStack.Pop(); memory[TOS] = SOS; PC++; break; case OPCODES.PUSH: returnStack.Push(dataStack.Pop()); PC++; break; case OPCODES.POP: dataStack.Push(returnStack.Pop()); PC++; break; case OPCODES.DROP: dataStack.Pop(); PC++; break; case OPCODES.DUP: TOS = dataStack.Pop(); dataStack.Push(TOS); dataStack.Push(TOS); PC++; break; case OPCODES.SWAP: TOS = dataStack.Pop(); SOS = dataStack.Pop(); dataStack.Push(TOS); dataStack.Push(SOS); PC++; break; case OPCODES.OVER: TOS = dataStack.Pop(); SOS = dataStack.Pop(); dataStack.Push(SOS); dataStack.Push(TOS); dataStack.Push(SOS); PC++; break; case OPCODES.ROT: TOS = dataStack.Pop(); SOS = dataStack.Pop(); A = dataStack.Pop(); dataStack.Push(SOS); dataStack.Push(TOS); dataStack.Push(A); PC++; break; case OPCODES.HLT: PC = -1; break; case OPCODES.IF: TOS = dataStack.Pop(); SOS = dataStack.Pop(); dataStack.Push(dataStack.Pop() == -1 ? SOS : TOS); PC++; break; case OPCODES.RETURN: rlabel: PC = returnStack.Pop(); PC++; break; case OPCODES.ZRETURN: TOS = dataStack.Pop(); if(TOS == 0) goto rlabel; else PC++; break; case OPCODES.GOTO: PC = dataStack.Pop(); break; case OPCODES.DO: returnStack.Push(PC); PC = dataStack.Pop(); break; default: break; } return (int)op; }
private bool SyncSendReceive(OPCODES opcode, out int result) { result = 0; int recCount; String query = _provider.GetOpCodeBytes(opcode); if (String.IsNullOrEmpty(query) || !IsInitialized) { return false; } try { lock (_sock.Locker) { if (Send(query) > 0) { Wait(); // receive: if (_sock.Available > 0) { byte[] data = new byte[_sock.Available]; recCount = _sock.Receive(data); if (recCount > 0) { return TryParseData(data, out result); } } } } } catch { } return false; }
public int SendMessage(OPCODES opcode, int arg) { return SendString(_provider.GetOpCodeBytes(opcode, arg)); }
public String PtuOpcode(OPCODES opcode, int data) { return _provider.GetOpCodeBytes(opcode, data); }
public String PtuOpcode(OPCODES opcode) { return _provider.GetOpCodeBytes(opcode); }
public String GetOpCodeBytes(OPCODES opcode, int arg) { String cmd = String.Empty; if (_asciiCodes.TryGetValue(opcode, out cmd)) { cmd += arg.ToString(); cmd += Environment.NewLine; } return cmd; }