From 6746d96fd461c81f74a0a08408671b80ca6f8997 Mon Sep 17 00:00:00 2001 From: Giulio De Pasquale Date: Sat, 8 Jul 2017 23:26:14 +0200 Subject: [PATCH] Aggiunti controlli su argomenti --- vm/vm.cpp | 297 ++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 232 insertions(+), 65 deletions(-) diff --git a/vm/vm.cpp b/vm/vm.cpp index 6634a1e..6c90474 100644 --- a/vm/vm.cpp +++ b/vm/vm.cpp @@ -856,107 +856,274 @@ bool VM::execGRMN(void) { void VM::run(void) { uint8_t opcode; bool finished = false; + bool ret; while (!finished) { opcode = (uint8_t)as.code[regs[IP]]; if (opcode == OPS[MOVI]) { - execMOVI(); - regs[IP] += MOVI_SIZE; + ret = execMOVI(); + if (ret) { + regs[IP] += MOVI_SIZE; + } else { + DBG_ERROR(("MOVI FAILED.\n")); + finished = true; + } } else if (opcode == OPS[MOVR]) { - execMOVR(); - regs[IP] += MOVR_SIZE; + ret = execMOVR(); + if (ret) { + regs[IP] += MOVR_SIZE; + } else { + DBG_ERROR(("MOVR FAILED.\n")); + finished = true; + } } else if (opcode == OPS[LODI]) { - execLODI(); - regs[IP] += LODI_SIZE; + ret = execLODI(); + if (ret) { + regs[IP] += LODI_SIZE; + } else { + DBG_ERROR(("LODI FAILED.\n")); + finished = true; + } } else if (opcode == OPS[LODR]) { - execLODR(); + ret = execLODR(); + if (ret) { + regs[IP] += LODR_SIZE; + } else { + DBG_ERROR(("LODR FAILED.\n")); + finished = true; + } regs[IP] += LODR_SIZE; } else if (opcode == OPS[STRI]) { - execSTRI(); - regs[IP] += STRI_SIZE; + ret = execSTRI(); + if (ret) { + regs[IP] += STRI_SIZE; + } else { + DBG_ERROR(("MOVI FAILED.\n")); + finished = true; + } } else if (opcode == OPS[STRR]) { - execSTRR(); - regs[IP] += STRR_SIZE; + ret = execSTRR(); + if (ret) { + regs[IP] += STRR_SIZE; + } else { + DBG_ERROR(("STRR FAILED.\n")); + finished = true; + } } else if (opcode == OPS[ADDI]) { - execADDI(); - regs[IP] += ADDI_SIZE; + ret = execADDI(); + if (ret) { + regs[IP] += ADDI_SIZE; + } else { + DBG_ERROR(("ADDI FAILED.\n")); + finished = true; + } } else if (opcode == OPS[ADDR]) { - execADDR(); - regs[IP] += ADDR_SIZE; + ret = execADDR(); + if (ret) { + regs[IP] += ADDR_SIZE; + } else { + DBG_ERROR(("ADDR FAILED.\n")); + finished = true; + } } else if (opcode == OPS[SUBI]) { - execSUBI(); - regs[IP] += SUBI_SIZE; + ret = execSUBI(); + if (ret) { + regs[IP] += SUBI_SIZE; + } else { + DBG_ERROR(("SUBI FAILED.\n")); + finished = true; + } } else if (opcode == OPS[SUBR]) { - execSUBR(); - regs[IP] += SUBR_SIZE; + ret = execSUBR(); + if (ret) { + regs[IP] += SUBR_SIZE; + } else { + DBG_ERROR(("SUBR FAILED.\n")); + finished = true; + } } else if (opcode == OPS[ANDB]) { - execANDB(); - regs[IP] += ANDB_SIZE; + ret = execANDB(); + if (ret) { + regs[IP] += ANDB_SIZE; + } else { + DBG_ERROR(("ANDB FAILED.\n")); + finished = true; + } } else if (opcode == OPS[ANDW]) { - execANDW(); - regs[IP] += ANDW_SIZE; + ret = execANDW(); + if (ret) { + regs[IP] += ANDW_SIZE; + } else { + DBG_ERROR(("ANDW FAILED.\n")); + finished = true; + } } else if (opcode == OPS[ANDR]) { - execANDR(); - regs[IP] += ANDR_SIZE; + ret = execANDR(); + if (ret) { + regs[IP] += ANDR_SIZE; + } else { + DBG_ERROR(("ANDR FAILED.\n")); + finished = true; + } } else if (opcode == OPS[YORB]) { - execYORB(); - regs[IP] += YORB_SIZE; + ret = execYORB(); + if (ret) { + regs[IP] += YORB_SIZE; + } else { + DBG_ERROR(("YORB FAILED.\n")); + finished = true; + } } else if (opcode == OPS[YORW]) { - execYORW(); - regs[IP] += YORW_SIZE; + ret = execYORW(); + if (ret) { + regs[IP] += YORW_SIZE; + } else { + DBG_ERROR(("YORW FAILED.\n")); + finished = true; + } } else if (opcode == OPS[YORR]) { - execYORR(); - regs[IP] += YORR_SIZE; + ret = execYORR(); + if (ret) { + regs[IP] += YORR_SIZE; + } else { + DBG_ERROR(("YORR FAILED.\n")); + finished = true; + } } else if (opcode == OPS[XORB]) { - execXORB(); - regs[IP] += XORB_SIZE; + ret = execXORB(); + if (ret) { + regs[IP] += XORB_SIZE; + } else { + DBG_ERROR(("XORB FAILED.\n")); + finished = true; + } } else if (opcode == OPS[XORW]) { - execXORW(); - regs[IP] += XORW_SIZE; + ret = execXORW(); + if (ret) { + regs[IP] += XORW_SIZE; + } else { + DBG_ERROR(("XORW FAILED.\n")); + finished = true; + } } else if (opcode == OPS[XORR]) { - execXORR(); - regs[IP] += XORR_SIZE; + ret = execXORR(); + if (ret) { + regs[IP] += XORR_SIZE; + } else { + DBG_ERROR(("XORR FAILED.\n")); + finished = true; + } } else if (opcode == OPS[NOTR]) { - execNOTR(); - regs[IP] += NOTR_SIZE; + ret = execNOTR(); + if (ret) { + regs[IP] += NOTR_SIZE; + } else { + DBG_ERROR(("NOTR FAILED.\n")); + finished = true; + } } else if (opcode == OPS[MULI]) { - execMULI(); - regs[IP] += MULI_SIZE; + ret = execMULI(); + if (ret) { + regs[IP] += MULI_SIZE; + } else { + DBG_ERROR(("MULI FAILED.\n")); + finished = true; + } } else if (opcode == OPS[MULR]) { - execMULR(); - regs[IP] += MULR_SIZE; + ret = execMULR(); + if (ret) { + regs[IP] += MULR_SIZE; + } else { + DBG_ERROR(("MULR FAILED.\n")); + finished = true; + } } else if (opcode == OPS[DIVI]) { - execDIVI(); - regs[IP] += DIVI_SIZE; + ret = execDIVI(); + if (ret) { + regs[IP] += DIVI_SIZE; + } else { + DBG_ERROR(("DIVI FAILED.\n")); + finished = true; + } } else if (opcode == OPS[DIVR]) { - execDIVR(); - regs[IP] += DIVR_SIZE; + ret = execDIVR(); + if (ret) { + regs[IP] += DIVR_SIZE; + } else { + DBG_ERROR(("DIVR FAILED.\n")); + finished = true; + } } else if (opcode == OPS[SHLI]) { - execSHLI(); - regs[IP] += SHLI_SIZE; + ret = execSHLI(); + if (ret) { + regs[IP] += SHLI_SIZE; + } else { + DBG_ERROR(("SHLI FAILED.\n")); + finished = true; + } } else if (opcode == OPS[SHLR]) { - execSHLR(); - regs[IP] += SHLR_SIZE; + ret = execSHLR(); + if (ret) { + regs[IP] += SHLR_SIZE; + } else { + DBG_ERROR(("SHLR FAILED.\n")); + finished = true; + } } else if (opcode == OPS[SHRI]) { - execSHRI(); - regs[IP] += SHRI_SIZE; + ret = execSHRI(); + if (ret) { + regs[IP] += SHRI_SIZE; + } else { + DBG_ERROR(("SHRI FAILED.\n")); + finished = true; + } } else if (opcode == OPS[SHRR]) { - execSHRR(); - regs[IP] += SHRR_SIZE; + ret = execSHRR(); + if (ret) { + regs[IP] += SHRR_SIZE; + } else { + DBG_ERROR(("SHRR FAILED.\n")); + finished = true; + } } else if (opcode == OPS[PUSH]) { - execPUSH(); - regs[IP] += PUSH_SIZE; + ret = execPUSH(); + if (ret) { + regs[IP] += PUSH_SIZE; + } else { + DBG_ERROR(("PUSH FAILED.\n")); + finished = true; + } } else if (opcode == OPS[POOP]) { - execPOOP(); - regs[IP] += POOP_SIZE; + ret = execPOOP(); + if (ret) { + regs[IP] += POOP_SIZE; + } else { + DBG_ERROR(("POOP FAILED.\n")); + finished = true; + } } else if (opcode == OPS[CMPB]) { - execCMPB(); - regs[IP] += CMPB_SIZE; + ret = execCMPB(); + if (ret) { + regs[IP] += CMPB_SIZE; + } else { + DBG_ERROR(("CMPB FAILED.\n")); + finished = true; + } } else if (opcode == OPS[CMPW]) { - execCMPW(); - regs[IP] += CMPW_SIZE; + ret = execCMPW(); + if (ret) { + regs[IP] += CMPW_SIZE; + } else { + DBG_ERROR(("CMPW FAILED.\n")); + finished = true; + } } else if (opcode == OPS[CMPR]) { - execCMPR(); - regs[IP] += CMPR_SIZE; + ret = execCMPR(); + if (ret) { + regs[IP] += CMPR_SIZE; + } else { + DBG_ERROR(("CMPR FAILED.\n")); + finished = true; + } } else if (opcode == OPS[JMPI]) { execJMPI(); } else if (opcode == OPS[JMPR]) {