/* copy a context structure according to the flags */ void copy_context( CONTEXT *to, const CONTEXT *from, unsigned int flags ) { if (flags & CONTEXT_CONTROL) { CREG(Msr); CREG(Ctr); CREG(Iar); to->ContextFlags |= CONTEXT_CONTROL; } if (flags & CONTEXT_INTEGER) { IREG(0); IREG(1); IREG(2); IREG(3); IREG(4); IREG(5); IREG(6); IREG(7); IREG(8); IREG(9); IREG(10); IREG(11); IREG(12); IREG(13); IREG(14); IREG(15); IREG(16); IREG(17); IREG(18); IREG(19); IREG(20); IREG(21); IREG(22); IREG(23); IREG(24); IREG(25); IREG(26); IREG(27); IREG(28); IREG(29); IREG(30); IREG(31); CREG(Xer); CREG(Cr); to->ContextFlags |= CONTEXT_INTEGER; } if (flags & CONTEXT_FLOATING_POINT) { FREG(0); FREG(1); FREG(2); FREG(3); FREG(4); FREG(5); FREG(6); FREG(7); FREG(8); FREG(9); FREG(10); FREG(11); FREG(12); FREG(13); FREG(14); FREG(15); FREG(16); FREG(17); FREG(18); FREG(19); FREG(20); FREG(21); FREG(22); FREG(23); FREG(24); FREG(25); FREG(26); FREG(27); FREG(28); FREG(29); FREG(30); FREG(31); CREG(Fpscr); to->ContextFlags |= CONTEXT_FLOATING_POINT; } }
/* Executa o programa */ int Mepa::exec(){ int op; if(detalha) { p->imprime(); /* Imprime o programa */ } op = p->next(); while( op != PARA ) { if(detalha) { debug(); } switch(op) { /* Funcoes MEPA */ case 0: { AMEM(); break; } case 1: { ARMI(); break; } case 2: { ARMP(); break; } case 3: { ARMZ(); break; } case 4: { CHPP(); break; } case 5: { CHPR(); break; } case 6: { CMAF(); break; } case 7: { CMAG(); break; } case 8: { CMDF(); break; } case 9: { CMDG(); break; } case 10: { CMEF(); break; } case 11: { CMEG(); break; } case 12: { CMIF(); break; } case 13: { CMIG(); break; } case 14: { CMMA(); break; } case 15: { CMMF(); break; } case 16: { CMME(); break; } case 17: { CMNF(); break; } case 18: { CONJ(); break; } case 19: { CRCT(); break; } case 20: { CRCF(); break; } case 21: { CREG(); break; } case 22: { CREN(); break; } case 23: { CRVI(); break; } case 24: { CRVL(); break; } case 25: { CRVP(); break; } case 26: { DISJ(); break; } case 27: { DIVF(); break; } case 28: { DIVI(); break; } case 29: { DMEM(); break; } case 30: { DSVF(); break; } case 31: { DSVS(); break; } case 32: { ENTR(); break; } case 33: { IMPC(); break; } case 34: { IMPF(); break; } case 35: { IMPR(); break; } case 36: { INPP(); break; } case 37: { INVF(); break; } case 38: { INVR(); break; } case 39: { LEIT(); break; } case 40: { LEIF(); break; } case 41: { MULF(); break; } case 42: { MULT(); break; } case 43: { NEGA(); break; } case 44: { RTPR(); break; } case 45: { SOMA(); break; } case 46: { SOMF(); break; } case 47: { SUBT(); break; } case 48: { SUBF(); break; } default:{ cerr << "O programa executou uma operacao invalida." << endl; cerr << "i = " << p->getI() << endl; abort(); } } op = p->next(); } return 0; }