Aggiunto controllo argomenti

This commit is contained in:
Giulio De Pasquale 2017-07-08 23:12:47 +02:00
parent 7eb95ac130
commit 07dcd98e86

View File

@ -159,8 +159,9 @@ bool VM::execMOVI(void) {
dst = as.code[regs[IP] + 1];
imm = *((uint16_t *)&as.code[regs[IP] + 2]);
DBG_INFO(("MOVI %s, 0x%x\n", getRegName(dst), imm));
if (!dstRegCheck(dst))
if (!dstRegCheck(dst)) {
return false;
}
regs[dst] = imm;
return true;
}
@ -175,9 +176,7 @@ bool VM::execMOVR(void) {
dst = as.code[regs[IP] + 1] >> 4;
src = as.code[regs[IP] + 1] & 0b00001111;
DBG_INFO(("MOVR %s, %s\n", getRegName(dst), getRegName(src)));
if (dst == IP || src == IP || dst == SP || src == SP || dst == RP ||
src == RP) {
DBG_ERROR(("MOVR: Invalid register!\n"));
if (!srcDstRegCheck(src, dst)) {
return false;
}
regs[dst] = regs[src];
@ -193,6 +192,9 @@ bool VM::execLODI(void) {
dst = as.code[regs[IP] + 1];
src = *((uint16_t *)&as.code[regs[IP] + 2]);
DBG_INFO(("LODI %s, 0x%x\n", getRegName(dst), src));
if (!dstRegCheck(dst)) {
return false;
}
regs[dst] = *((uint16_t *)&as.data[src]);
return true;
}
@ -206,6 +208,9 @@ bool VM::execLODR(void) {
dst = as.code[regs[IP] + 1] >> 4;
src = as.code[regs[IP] + 1] & 0b00001111;
DBG_INFO(("LODR %s, %s\n", getRegName(dst), getRegName(src)));
if (!srcDstRegCheck(src, dst)) {
return false;
}
regs[dst] = *((uint16_t *)&as.data[regs[src]]);
return true;
}
@ -218,6 +223,9 @@ bool VM::execSTRI(void) {
dst = *((uint16_t *)&as.code[regs[IP] + 1]);
src = as.code[regs[IP] + 3];
DBG_INFO(("STRI 0x%x, %s\n", dst, getRegName(src)));
if (!dstRegCheck(dst)) {
return false;
}
*((uint16_t *)&as.data[dst]) = regs[src];
return true;
}
@ -232,6 +240,9 @@ bool VM::execSTRR(void) {
dst = as.code[regs[IP] + 1] >> 4;
src = as.code[regs[IP] + 1] & 0b00001111;
DBG_INFO(("STRR %s, %s\n", getRegName(dst), getRegName(src)));
if (!srcDstRegCheck(src, dst)) {
return false;
}
*((uint16_t *)&as.data[regs[dst]]) = regs[src];
return true;
}
@ -246,6 +257,9 @@ bool VM::execADDI(void) {
dst = as.code[regs[IP] + 1];
src = *((uint16_t *)&as.code[regs[IP] + 2]);
DBG_INFO(("ADDI %s, 0x%x\n", getRegName(dst), src));
if (!dstRegCheck(dst)) {
return false;
}
regs[dst] += src;
return true;
}
@ -260,6 +274,9 @@ bool VM::execADDR(void) {
dst = as.code[regs[IP] + 1] >> 4;
src = as.code[regs[IP] + 1] & 0b00001111;
DBG_INFO(("ADDR %s, 0x%x\n", getRegName(dst), src));
if (!srcDstRegCheck(src, dst)) {
return false;
}
regs[dst] += regs[src];
return true;
}
@ -274,6 +291,9 @@ bool VM::execSUBI(void) {
dst = as.code[regs[IP] + 1];
src = *((uint16_t *)&as.code[regs[IP] + 2]);
DBG_INFO(("SUBI %s, 0x%x\n", getRegName(dst), src));
if (!dstRegCheck(dst)) {
return false;
}
regs[dst] -= src;
return true;
}
@ -287,6 +307,9 @@ bool VM::execSUBR(void) {
dst = as.code[regs[IP] + 1] >> 4;
src = as.code[regs[IP] + 1] & 0b00001111;
DBG_INFO(("SUBR %s, 0x%x\n", getRegName(dst), src));
if (!srcDstRegCheck(src, dst)) {
return false;
}
regs[dst] -= regs[src];
return true;
}
@ -300,6 +323,9 @@ bool VM::execANDB(void) {
dst = as.code[regs[IP] + 1];
src = as.code[regs[IP] + 2];
DBG_INFO(("ANDB %s, 0x%x\n", getRegName(dst), src));
if (!dstRegCheck(dst)) {
return false;
}
regs[dst] &= src;
return true;
}
@ -313,6 +339,9 @@ bool VM::execANDW(void) {
dst = as.code[regs[IP] + 1];
src = *((uint16_t *)&as.code[regs[IP] + 2]);
DBG_INFO(("XORW %s, 0x%x\n", getRegName(dst), src));
if (!dstRegCheck(dst)) {
return false;
}
regs[dst] &= src;
return true;
}
@ -326,6 +355,9 @@ bool VM::execANDR(void) {
dst = as.code[regs[IP] + 1] >> 4;
src = as.code[regs[IP] + 1] & 0b00001111;
DBG_INFO(("ANDR %s, 0x%x\n", getRegName(dst), src));
if (!srcDstRegCheck(src, dst)) {
return false;
}
regs[dst] &= regs[src];
return true;
}
@ -339,6 +371,9 @@ bool VM::execYORB(void) {
dst = as.code[regs[IP] + 1];
src = as.code[regs[IP] + 2];
DBG_INFO(("YORB %s, 0x%x\n", getRegName(dst), src));
if (!dstRegCheck(dst)) {
return false;
}
regs[dst] |= src;
return true;
}
@ -352,6 +387,9 @@ bool VM::execYORW(void) {
dst = as.code[regs[IP] + 1];
src = *((uint16_t *)&as.code[regs[IP] + 2]);
DBG_INFO(("XORW %s, 0x%x\n", getRegName(dst), src));
if (!dstRegCheck(dst)) {
return false;
}
regs[dst] |= src;
return true;
}
@ -365,6 +403,9 @@ bool VM::execYORR(void) {
dst = as.code[regs[IP] + 1] >> 4;
src = as.code[regs[IP] + 1] & 0b00001111;
DBG_INFO(("XORR %s, 0x%x\n", getRegName(dst), src));
if (!srcDstRegCheck(src, dst)) {
return false;
}
regs[dst] |= regs[src];
return true;
}
@ -378,6 +419,9 @@ bool VM::execXORB(void) {
dst = as.code[regs[IP] + 1];
src = as.code[regs[IP] + 2];
DBG_INFO(("XORB %s, 0x%x\n", getRegName(dst), src));
if (!dstRegCheck(dst)) {
return false;
}
regs[dst] ^= src;
return true;
}
@ -391,6 +435,9 @@ bool VM::execXORW(void) {
dst = as.code[regs[IP] + 1];
src = *((uint16_t *)&as.code[regs[IP] + 2]);
DBG_INFO(("XORW %s, 0x%x\n", getRegName(dst), src));
if (!dstRegCheck(dst)) {
return false;
}
regs[dst] ^= src;
return true;
}
@ -404,6 +451,9 @@ bool VM::execXORR(void) {
dst = as.code[regs[IP] + 1] >> 4;
src = as.code[regs[IP] + 1] & 0b00001111;
DBG_INFO(("XORR %s, 0x%x\n", getRegName(dst), src));
if (!srcDstRegCheck(src, dst)) {
return false;
}
regs[dst] ^= regs[src];
return true;
}
@ -417,6 +467,9 @@ bool VM::execNOTR(void) {
dst = as.code[regs[IP] + 1] >> 4;
src = as.code[regs[IP] + 1] & 0b00001111;
DBG_INFO(("NOTR %s, 0x%x\n", getRegName(dst), src));
if (!srcDstRegCheck(src, dst)) {
return false;
}
regs[dst] = ~regs[src];
return true;
}
@ -430,6 +483,9 @@ bool VM::execMULI(void) {
dst = as.code[regs[IP] + 1];
src = *((uint16_t *)&as.code[regs[IP] + 2]);
DBG_INFO(("SUBI %s, 0x%x\n", getRegName(dst), src));
if (!dstRegCheck(dst)) {
return false;
}
regs[dst] *= src;
return true;
}
@ -443,6 +499,9 @@ bool VM::execMULR(void) {
dst = as.code[regs[IP] + 1] >> 4;
src = as.code[regs[IP] + 1] & 0b00001111;
DBG_INFO(("MULR %s, 0x%x\n", getRegName(dst), src));
if (!srcDstRegCheck(src, dst)) {
return false;
}
regs[dst] *= regs[src];
return true;
}
@ -456,6 +515,9 @@ bool VM::execDIVI(void) {
dst = as.code[regs[IP] + 1];
src = *((uint16_t *)&as.code[regs[IP] + 2]);
DBG_INFO(("DIVI %s, 0x%x\n", getRegName(dst), src));
if (!dstRegCheck(dst)) {
return false;
}
regs[dst] /= src;
return true;
}
@ -469,6 +531,9 @@ bool VM::execDIVR(void) {
dst = as.code[regs[IP] + 1] >> 4;
src = as.code[regs[IP] + 1] & 0b00001111;
DBG_INFO(("DIVR %s, 0x%x\n", getRegName(dst), src));
if (!srcDstRegCheck(src, dst)) {
return false;
}
regs[dst] /= regs[src];
return true;
}
@ -482,6 +547,9 @@ bool VM::execSHLI(void) {
dst = as.code[regs[IP] + 1];
src = *((uint16_t *)&as.code[regs[IP] + 2]);
DBG_INFO(("SHLI %s, 0x%x\n", getRegName(dst), src));
if (!dstRegCheck(dst)) {
return false;
}
regs[dst] = regs[dst] << src;
return true;
}
@ -495,6 +563,9 @@ bool VM::execSHLR(void) {
dst = as.code[regs[IP] + 1] >> 4;
src = as.code[regs[IP] + 1] & 0b00001111;
DBG_INFO(("SHLR %s, 0x%x\n", getRegName(dst), src));
if (!srcDstRegCheck(src, dst)) {
return false;
}
regs[dst] = regs[dst] << regs[src];
return true;
}
@ -508,6 +579,9 @@ bool VM::execSHRI(void) {
dst = as.code[regs[IP] + 1];
src = *((uint16_t *)&as.code[regs[IP] + 2]);
DBG_INFO(("SHRI %s, 0x%x\n", getRegName(dst), src));
if (!dstRegCheck(dst)) {
return false;
}
regs[dst] = regs[dst] >> src;
return true;
}
@ -521,6 +595,9 @@ bool VM::execSHRR(void) {
dst = as.code[regs[IP] + 1] >> 4;
src = as.code[regs[IP] + 1] & 0b00001111;
DBG_INFO(("SHRR %s, 0x%x\n", getRegName(dst), src));
if (!srcDstRegCheck(src, dst)) {
return false;
}
regs[dst] = regs[dst] >> regs[src];
return true;
}