#include "vector" #include "vm-src.h" #include "stack.h" #include "command-exec.h" #include using std::vector; using std::byte; using std::cout; const unsigned char showByte (byte b) { return char(b); } const unsigned char * showBytes (byte* bytes) { for (int i=0;i v) { int vectorLength = v.size(); byte bytes[vectorLength]; for (int i = 0; i < vectorLength; i++) { bytes[i] = v.at(i); } for (byte item : bytes) { std::cout << ">> " << showByte(item) << "\n"; } return (byte*)bytes; }*/ std::string vmSrc_getByteText (byte b) { std::string bytes[256] = {"0x00 ","0x01 ","0x02 ","0x03 ","0x04 ","0x05 ","0x06 ","0x07 ","0x08 ","0x09 ","0x0a ","0x0b ","0x0c ","0x0d ","0x0e ","0x0f ","0x10 ","0x11 ","0x12 ","0x13 ","0x14 ","0x15 ","0x16 ","0x17 ","0x18 ","0x19 ","0x1a ","0x1b ","0x1c ","0x1d ","0x1e ","0x1f ","0x20 ","0x21 ","0x22 ","0x23 ","0x24 ","0x25 ","0x26 ","0x27 ","0x28 ","0x29 ","0x2a ","0x2b ","0x2c ","0x2d ","0x2e ","0x2f ","0x30 ","0x31 ","0x32 ","0x33 ","0x34 ","0x35 ","0x36 ","0x37 ","0x38 ","0x39 ","0x3a ","0x3b ","0x3c ","0x3d ","0x3e ","0x3f ","0x40 ","0x41 ","0x42 ","0x43 ","0x44 ","0x45 ","0x46 ","0x47 ","0x48 ","0x49 ","0x4a ","0x4b ","0x4c ","0x4d ","0x4e ","0x4f ","0x50 ","0x51 ","0x52 ","0x53 ","0x54 ","0x55 ","0x56 ","0x57 ","0x58 ","0x59 ","0x5a ","0x5b ","0x5c ","0x5d ","0x5e ","0x5f ","0x60 ","0x61 ","0x62 ","0x63 ","0x64 ","0x65 ","0x66 ","0x67 ","0x68 ","0x69 ","0x6a ","0x6b ","0x6c ","0x6d ","0x6e ","0x6f ","0x70 ","0x71 ","0x72 ","0x73 ","0x74 ","0x75 ","0x76 ","0x77 ","0x78 ","0x79 ","0x7a ","0x7b ","0x7c ","0x7d ","0x7e ","0x7f ","0x80 ","0x81 ","0x82 ","0x83 ","0x84 ","0x85 ","0x86 ","0x87 ","0x88 ","0x89 ","0x8a ","0x8b ","0x8c ","0x8d ","0x8e ","0x8f ","0x90 ","0x91 ","0x92 ","0x93 ","0x94 ","0x95 ","0x96 ","0x97 ","0x98 ","0x99 ","0x9a ","0x9b ","0x9c ","0x9d ","0x9e ","0x9f ","0xa0 ","0xa1 ","0xa2 ","0xa3 ","0xa4 ","0xa5 ","0xa6 ","0xa7 ","0xa8 ","0xa9 ","0xaa ","0xab ","0xac ","0xad ","0xae ","0xaf ","0xb0 ","0xb1 ","0xb2 ","0xb3 ","0xb4 ","0xb5 ","0xb6 ","0xb7 ","0xb8 ","0xb9 ","0xba ","0xbb ","0xbc ","0xbd ","0xbe ","0xbf ","0xc0 ","0xc1 ","0xc2 ","0xc3 ","0xc4 ","0xc5 ","0xc6 ","0xc7 ","0xc8 ","0xc9 ","0xca ","0xcb ","0xcc ","0xcd ","0xce ","0xcf ","0xd0 ","0xd1 ","0xd2 ","0xd3 ","0xd4 ","0xd5 ","0xd6 ","0xd7 ","0xd8 ","0xd9 ","0xda ","0xdb ","0xdc ","0xdd ","0xde ","0xdf ","0xe0 ","0xe1 ","0xe2 ","0xe3 ","0xe4 ","0xe5 ","0xe6 ","0xe7 ","0xe8 ","0xe9 ","0xea ","0xeb ","0xec ","0xed ","0xee ","0xef ","0xf0 ","0xf1 ","0xf2 ","0xf3 ","0xf4 ","0xf5 ","0xf6 ","0xf7 ","0xf8 ","0xf9 ","0xfa ","0xfb ","0xfc ","0xfd ","0xfe ","0xff "}; return bytes[int(b)]; } std::string vmSrc_showBytes (vector bytes) { std::string showTxt = ""; for (byte b : bytes) { // showTxt += char(b); showTxt += vmSrc_getByteText(b); } return showTxt; } void VirtualMachine::includeVoid (Subprog subprog) { this->subprogs.push_back(subprog); // Отладка /*cout << "Function ( " << vmSrc_showBytes(subprog.id) << "):\n"; for (vector com : subprog.commandBytes) { cout << vmSrc_showBytes(com) << "\n"; }*/ } vector> VirtualMachine::parseCommands (byte allByteCode[], int byteCodeLength) { vector> parsedData {}; vector activeCommand {}; vector buffer {}; int activeCommandLength = 0; for (int i = 0; i < byteCodeLength; i++) { buffer.push_back(allByteCode[i]); //std::cout << vmSrc_getByteText(allByteCode[i]) << "\n"; if (activeCommandLength == 0) { //byte activeCommand[] = { allByteCode[i] }; activeCommand.push_back(allByteCode[i]); activeCommandLength = 1; } else if (activeCommandLength == 1) { activeCommand.push_back(allByteCode[i]); activeCommandLength = 2; } else { // Начинаем парсинг //std::cout << vmSrc_showBytes(allByteCode) << "\n"; Stack stack; CommandExecutor comExec(buffer, stack); if (comExec.isCommandDefined) { if (comExec.isEnded) { parsedData.push_back(comExec.bytes); activeCommand.clear(); activeCommandLength = 0; buffer.clear(); } } else { // (!) Тут выдать ошибку : undefined command std::cout << int(activeCommand[0]) << "x" << int(activeCommand[1]) << " -> Required definitation\n"; } } } return parsedData; } void VirtualMachine::bindStopPoints (int* stopPoints) {} VirtualMachine::VirtualMachine (bool isDebugModeOn) { this->isDebugging = isDebugModeOn; } void VirtualMachine::debugModeOutput () { /* Out conditions of stacks, functions, heap, etc.*/ /* Example: */ /* |==========DEBUG MODE===========| |Program condition | |_______________________________| |Condition |Value | |Stack used |11 bytes | |Heap used | | |_______________________________| |Stack | |_______________________________| |Void_id |ID|Length|Data | |0x00000000|2 |2 |0x1AFE | |0x00000000|1 |3 |0x1FEA00 | |0x00000000|0 |1 |0xDE | |0x000000FA|1 |4 |0x00FA9077| |0x000000FA|0 |1 |0xFF | |_______________________________| */ }