int main(int argc, char* argv[]) { (void) argc; (void) argv; Mem* mem; NEW(mem); instantiateMem(mem, MEM_SEG_LEN); UM_Word index = mapSegment(mem, 10); printf("mapped index: %u\n", index); verifyMapped(mem->mappedIDs, mem->unmappedIDs); UM_Word value = 20; segmentedStore(mem, 0, 9, value); if(segmentedLoad(mem, 0, 9) != value) { fprintf(stderr, "incorrect load and store"); exit(1); } else { printf("value: %u\n", segmentedLoad(mem, 0, 9)); printf("Woohoo! Correct seg store and load!\n"); } unmapSegment(mem, index); verifyMapped(mem->mappedIDs, mem->unmappedIDs); freeMem(mem); return 0; }
int main(int argc, char* argv[]) { (void) argc; (void) argv; Mem* mem; NEW(mem); instantiateMem(mem, MEM_SEG_LEN); printf("Verifying after instantiate:\n"); verifyMapped(mem->mappedIDs, mem->unmappedIDs); mapSegment(mem, 0, 10); verifyMapped(mem->mappedIDs, mem->unmappedIDs); UM_Word value = 0; segmentedStore(mem, 0, 9, value); if(segmentedLoad(mem, 0, 9) != value) { fprintf(stderr, "incorrect load and store"); exit(1); } else { printf("value at memseg: %u\n", segmentedLoad(mem, 0, 9)); printf("Woohoo! Correct seg store and load!\n"); } printf("resizing\n"); mapSegment(mem, 11, 1); printf("verifying index 1 mapping\n"); verifyMapped(mem->mappedIDs, mem->unmappedIDs); unmapSegment(mem, 0); printf("verifying index 0 unmapping\n"); verifyMapped(mem->mappedIDs, mem->unmappedIDs); unmapSegment(mem, 11); printf("verifying index 1 unmapping\n"); verifyMapped(mem->mappedIDs, mem->unmappedIDs); freeMem(mem); return 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; } } }