Guest User

Untitled

a guest
Jan 24th, 2018
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.65 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "vm.h"
  4.  
  5. void virtualMachineInit(VirtualMachine* vm, unsigned int* programMem, unsigned int* ram){
  6. vm->programMem = programMem;
  7. vm->ram = ram;
  8.  
  9. vm->instructionPointer = 0;
  10. for (size_t i = 0; i < 5; i++) vm->registers[i] = 0;
  11. for (size_t i = 0; i < 6; i++) vm->stateRegister[i] = 0;
  12. }
  13.  
  14. int virtualMachineStep(VirtualMachine* vm) {
  15. char temp;
  16. temp = 'A';
  17. switch (vm->programMem[vm->instructionPointer]) {
  18. case 0x00:
  19. return -1;
  20. break;
  21. case 0x01:
  22. vm->ram[vm->registers[vm->programMem[vm->instructionPointer+1]]] = vm->registers[vm->programMem[vm->instructionPointer+2]];
  23. vm->instructionPointer += 2;
  24. break;
  25. case 0x02:
  26. vm->registers[vm->programMem[vm->instructionPointer+1]] = vm->ram[vm->registers[vm->programMem[vm->instructionPointer+2]]];
  27. vm->instructionPointer += 2;
  28. break;
  29. case 0x03:
  30. vm->registers[vm->programMem[vm->instructionPointer+1]] = vm->registers[vm->programMem[vm->instructionPointer+2]];
  31. vm->instructionPointer += 2;
  32. break;
  33. case 0x04:
  34. vm->registers[vm->programMem[vm->instructionPointer+1]]++;
  35. vm->instructionPointer++;
  36. break;
  37. case 0x05:
  38. vm->registers[vm->programMem[vm->instructionPointer+1]]--;
  39. vm->instructionPointer++;
  40. break;
  41. case 0x06:
  42. vm->registers[vm->programMem[vm->instructionPointer+1]] = vm->programMem[vm->instructionPointer+2];
  43. vm->instructionPointer += 2;
  44. break;
  45. case 0x07:
  46. vm->registers[vm->programMem[vm->instructionPointer+1]] = vm->registers[vm->programMem[vm->instructionPointer+2]] + vm->registers[vm->programMem[vm->instructionPointer+3]];
  47. vm->instructionPointer += 3;
  48. break;
  49. case 0x08:
  50. vm->registers[vm->programMem[vm->instructionPointer+1]] = vm->registers[vm->programMem[vm->instructionPointer+2]] - vm->registers[vm->programMem[vm->instructionPointer+3]];
  51. vm->instructionPointer += 3;
  52. break;
  53. case 0x09:
  54. vm->registers[vm->programMem[vm->instructionPointer+1]] = vm->registers[vm->programMem[vm->instructionPointer+2]] * vm->registers[vm->programMem[vm->instructionPointer+3]];
  55. vm->instructionPointer += 3;
  56. break;
  57. case 0x0a:
  58. vm->registers[vm->programMem[vm->instructionPointer+1]] = (unsigned int)(vm->registers[vm->programMem[vm->instructionPointer+2]] == vm->registers[vm->programMem[vm->instructionPointer+3]]);
  59. vm->instructionPointer += 3;
  60. break;
  61. case 0x0b:
  62. vm->registers[vm->programMem[vm->instructionPointer+1]] = (unsigned int)(vm->registers[vm->programMem[vm->instructionPointer+2]] != vm->registers[vm->programMem[vm->instructionPointer+3]]);
  63. vm->instructionPointer += 3;
  64. break;
  65. case 0x0c:
  66. vm->registers[vm->programMem[vm->instructionPointer+1]] = (unsigned int)(vm->registers[vm->programMem[vm->instructionPointer+2]] > vm->registers[vm->programMem[vm->instructionPointer+3]]);
  67. vm->instructionPointer += 3;
  68. break;
  69. case 0x0d:
  70. vm->instructionPointer = vm->registers[vm->programMem[vm->instructionPointer+1]] - 1;
  71. break;
  72. case 0x0e:
  73. if(vm->registers[vm->programMem[vm->instructionPointer+1]] != 0) {
  74. vm->instructionPointer = vm->registers[vm->programMem[vm->instructionPointer+2]] - 1;
  75. } else {
  76. vm->instructionPointer += 2;
  77. }
  78. break;
  79. case 0x0f:
  80. vm->stateRegister[0] = vm->instructionPointer + 1;
  81. vm->stateRegister[1] = vm->registers[0];
  82. vm->stateRegister[2] = vm->registers[1];
  83. vm->stateRegister[3] = vm->registers[2];
  84. vm->stateRegister[4] = vm->registers[3];
  85. vm->stateRegister[5] = vm->registers[4];
  86. vm->instructionPointer = vm->registers[vm->programMem[vm->instructionPointer+1]] - 1;
  87. break;
  88. case 0x10:
  89. vm->instructionPointer = vm->stateRegister[0];
  90. vm->registers[0] = vm->stateRegister[1];
  91. vm->registers[1] = vm->stateRegister[2];
  92. vm->registers[2] = vm->stateRegister[3];
  93. vm->registers[3] = vm->stateRegister[4];
  94. vm->registers[4] = vm->stateRegister[5];
  95. break;
  96. case 0x11:
  97. printf("%d", (int)(vm->registers[vm->programMem[vm->instructionPointer+1]]));
  98. vm->instructionPointer++;
  99. break;
  100. case 0x12:
  101. printf("%c", (char)(vm->registers[vm->programMem[vm->instructionPointer+1]]));
  102. vm->instructionPointer++;
  103. break;
  104. case 0x13:
  105. scanf("%u", &(vm->registers[vm->programMem[vm->instructionPointer+1]]));
  106. vm->instructionPointer++;
  107. break;
  108. case 0x14:
  109. scanf("%c", &temp);
  110. vm->registers[vm->programMem[vm->instructionPointer+1]] = (unsigned int) temp;
  111. vm->instructionPointer++;
  112. break;
  113. default:
  114. break;
  115. };
  116. vm->instructionPointer++;
  117. return 0;
  118. }
  119.  
  120. int virtualMachinePeek(VirtualMachine* vm, size_t address) {
  121. 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]);
  122. return vm->ram[address];
  123. }
Add Comment
Please, Sign In to add comment