ritualka-plang/source/vm-src.cpp
2023-05-08 12:07:58 +03:00

125 lines
5.5 KiB
C++

#include "vector"
#include "vm-src.h"
#include "stack.h"
#include "command-exec.h"
#include <iostream>
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<sizeof(bytes);i++) {
std::cout << showByte(bytes[i]);
}
return (const unsigned char *)"";
}
/*byte* convertVectorToBytes (vector<byte> 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<byte> 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<byte> com : subprog.commandBytes) {
cout << vmSrc_showBytes(com) << "\n";
}*/
}
vector<vector<byte>> VirtualMachine::parseCommands (byte allByteCode[], int byteCodeLength) {
vector<vector<byte>> parsedData {};
vector<byte> activeCommand {};
vector<byte> 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 |
|_______________________________|
*/
}