Aggiunti controlli su argomenti
This commit is contained in:
parent
07dcd98e86
commit
6746d96fd4
297
vm/vm.cpp
297
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]) {
|
||||
|
Loading…
Reference in New Issue
Block a user