Пример #1
0
void testBitwiseNAND(){
    for(UM_Word i = 0; i < numReg; i++){
        if(i%2) registers[i] = 0;
        else registers[i] = ~0;
    }
    UM_Word expected = 0;
    for(UM_Word i = 1; i < numReg; i++){
        bitwiseNAND(registers, 0, i, i-1);
        if(registers[0] != expected){
           printf("testBitWiseNAND failed at iteration: %u\n", i);
        }
    }
    printf("BitwiseNAND test passed.\n");
}
Пример #2
0
/*
 * Executes the Instruction based on the opcode.
 */
static inline void execute_instruction(Instruction instr){
    switch(instr.op) {
        case MOVE:{
            conditionalMove(registers, instr.reg1, instr.reg2, instr.reg3);
            programCounter++;
            break;
        }
        case SEGLOAD:{
            UM_Word ID = registers[instr.reg2];
            UM_Word offset = registers[instr.reg3];
            UM_Word toStore = segmentedLoad(memorySegments, ID, offset);
            registers[instr.reg1] = toStore;
            programCounter++;
            break;
        }
        case SEGSTORE:{
            UM_Word ID = registers[instr.reg1];
            UM_Word offset = registers[instr.reg2];
            UM_Word value = registers[instr.reg3];
            segmentedStore(memorySegments, ID, offset, value);
            programCounter++;
            break;
        }
        case ADD:{
            addition(registers, instr.reg1, instr.reg2, instr.reg3);
            programCounter++;
            break;
        }
        case MULTIPLY:{
            multiplication(registers, instr.reg1, instr.reg2, instr.reg3);
            programCounter++;
            break;
        }
        case DIVIDE:{
            division(registers, instr.reg1, instr.reg2, instr.reg3);
            programCounter++;
            break;
        }
        case NAND:{
            bitwiseNAND(registers, instr.reg1, instr.reg2, instr.reg3);
            programCounter++;
            break;
        }
        case HALT: {
            programCounter = 0;
            break;
        }
        case MAP:{
            UM_Word length = registers[instr.reg3];
            registers[instr.reg2] = mapSegment(memorySegments, length);
            programCounter++;
            break;
        }
        case UNMAP:{
            UM_Word ID = registers[instr.reg3];
            unmapSegment(memorySegments, ID);
            programCounter++;
            break;
        }
        case OUTPUT:{
            output(registers, instr.reg3);
            programCounter++;
            break;
        }
        case INPUT:{
            input(registers, instr.reg3);
            programCounter++;
            break;
        }
        case LOADPROG:{
            UM_Word ID = registers[instr.reg2];
            if(ID != 0){
                loadProgram(memorySegments, ID);
                numInstructions = instructionLength(memorySegments);
                //programPointer = getInstructions(memorySegments);
            }
            programCounter = registers[instr.reg3];
            break;
        }
        case LOADVAL:{
            registers[instr.reg1] = instr.value;
            programCounter++;
            break;
        }
    }
}