Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include "vm.h"
- void virtualMachineInit(VirtualMachine* vm, unsigned int* programMem, unsigned int* ram){
- vm->programMem = programMem;
- vm->ram = ram;
- vm->instructionPointer = 0;
- for (size_t i = 0; i < 5; i++) vm->registers[i] = 0;
- for (size_t i = 0; i < 6; i++) vm->stateRegister[i] = 0;
- }
- int virtualMachineStep(VirtualMachine* vm) {
- char temp;
- temp = 'A';
- switch (vm->programMem[vm->instructionPointer]) {
- case 0x00:
- return -1;
- break;
- case 0x01:
- vm->ram[vm->registers[vm->programMem[vm->instructionPointer+1]]] = vm->registers[vm->programMem[vm->instructionPointer+2]];
- vm->instructionPointer += 2;
- break;
- case 0x02:
- vm->registers[vm->programMem[vm->instructionPointer+1]] = vm->ram[vm->registers[vm->programMem[vm->instructionPointer+2]]];
- vm->instructionPointer += 2;
- break;
- case 0x03:
- vm->registers[vm->programMem[vm->instructionPointer+1]] = vm->registers[vm->programMem[vm->instructionPointer+2]];
- vm->instructionPointer += 2;
- break;
- case 0x04:
- vm->registers[vm->programMem[vm->instructionPointer+1]]++;
- vm->instructionPointer++;
- break;
- case 0x05:
- vm->registers[vm->programMem[vm->instructionPointer+1]]--;
- vm->instructionPointer++;
- break;
- case 0x06:
- vm->registers[vm->programMem[vm->instructionPointer+1]] = vm->programMem[vm->instructionPointer+2];
- vm->instructionPointer += 2;
- break;
- case 0x07:
- vm->registers[vm->programMem[vm->instructionPointer+1]] = vm->registers[vm->programMem[vm->instructionPointer+2]] + vm->registers[vm->programMem[vm->instructionPointer+3]];
- vm->instructionPointer += 3;
- break;
- case 0x08:
- vm->registers[vm->programMem[vm->instructionPointer+1]] = vm->registers[vm->programMem[vm->instructionPointer+2]] - vm->registers[vm->programMem[vm->instructionPointer+3]];
- vm->instructionPointer += 3;
- break;
- case 0x09:
- vm->registers[vm->programMem[vm->instructionPointer+1]] = vm->registers[vm->programMem[vm->instructionPointer+2]] * vm->registers[vm->programMem[vm->instructionPointer+3]];
- vm->instructionPointer += 3;
- break;
- case 0x0a:
- vm->registers[vm->programMem[vm->instructionPointer+1]] = (unsigned int)(vm->registers[vm->programMem[vm->instructionPointer+2]] == vm->registers[vm->programMem[vm->instructionPointer+3]]);
- vm->instructionPointer += 3;
- break;
- case 0x0b:
- vm->registers[vm->programMem[vm->instructionPointer+1]] = (unsigned int)(vm->registers[vm->programMem[vm->instructionPointer+2]] != vm->registers[vm->programMem[vm->instructionPointer+3]]);
- vm->instructionPointer += 3;
- break;
- case 0x0c:
- vm->registers[vm->programMem[vm->instructionPointer+1]] = (unsigned int)(vm->registers[vm->programMem[vm->instructionPointer+2]] > vm->registers[vm->programMem[vm->instructionPointer+3]]);
- vm->instructionPointer += 3;
- break;
- case 0x0d:
- vm->instructionPointer = vm->registers[vm->programMem[vm->instructionPointer+1]] - 1;
- break;
- case 0x0e:
- if(vm->registers[vm->programMem[vm->instructionPointer+1]] != 0) {
- vm->instructionPointer = vm->registers[vm->programMem[vm->instructionPointer+2]] - 1;
- } else {
- vm->instructionPointer += 2;
- }
- break;
- case 0x0f:
- vm->stateRegister[0] = vm->instructionPointer + 1;
- vm->stateRegister[1] = vm->registers[0];
- vm->stateRegister[2] = vm->registers[1];
- vm->stateRegister[3] = vm->registers[2];
- vm->stateRegister[4] = vm->registers[3];
- vm->stateRegister[5] = vm->registers[4];
- vm->instructionPointer = vm->registers[vm->programMem[vm->instructionPointer+1]] - 1;
- break;
- case 0x10:
- vm->instructionPointer = vm->stateRegister[0];
- vm->registers[0] = vm->stateRegister[1];
- vm->registers[1] = vm->stateRegister[2];
- vm->registers[2] = vm->stateRegister[3];
- vm->registers[3] = vm->stateRegister[4];
- vm->registers[4] = vm->stateRegister[5];
- break;
- case 0x11:
- printf("%d", (int)(vm->registers[vm->programMem[vm->instructionPointer+1]]));
- vm->instructionPointer++;
- break;
- case 0x12:
- printf("%c", (char)(vm->registers[vm->programMem[vm->instructionPointer+1]]));
- vm->instructionPointer++;
- break;
- case 0x13:
- scanf("%u", &(vm->registers[vm->programMem[vm->instructionPointer+1]]));
- vm->instructionPointer++;
- break;
- case 0x14:
- scanf("%c", &temp);
- vm->registers[vm->programMem[vm->instructionPointer+1]] = (unsigned int) temp;
- vm->instructionPointer++;
- break;
- default:
- break;
- };
- vm->instructionPointer++;
- return 0;
- }
- int virtualMachinePeek(VirtualMachine* vm, size_t address) {
- printf("IP: %u R0: %u R1: %u R2: %u R3: %u R4: %u Address $%zu: %u\n------\n", vm->instructionPointer, vm->registers[0],vm->registers[1],vm->registers[2],vm->registers[3],vm->registers[4], address, vm->ram[address]);
- return vm->ram[address];
- }
Add Comment
Please, Sign In to add comment