Guest User

Untitled

a guest
Sep 27th, 2014
1,874
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.95 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3. #define MEM_SIZE 16
  4.  
  5. #define CONSTRAIN(x) (x) % 16
  6.  
  7. typedef void (*instruction)(void);
  8.  
  9. int memory[MEM_SIZE];
  10.  
  11. int pc;
  12. int is;
  13. int r0;
  14. int r1;
  15.  
  16. void add () {
  17.    pc = CONSTRAIN (pc + 1);
  18.    r0 = CONSTRAIN (r0 + r1);
  19. }
  20.  
  21. void sub () {
  22.    pc = CONSTRAIN (pc + 1);
  23.    r0 = CONSTRAIN (r0 - r1);
  24. }
  25.  
  26. void incR0 () {
  27.    pc = CONSTRAIN (pc + 1);
  28.    r0 = CONSTRAIN (r0 + 1);
  29. }
  30.  
  31. void incR1 () {
  32.    pc = CONSTRAIN (pc + 1);
  33.    r1 = CONSTRAIN (r1 + 1);
  34. }
  35.  
  36. void decR0 () {
  37.    pc = CONSTRAIN (pc + 1);
  38.    r0 = CONSTRAIN (r0 - 1);
  39. }
  40.  
  41. void decR1 () {
  42.    pc = CONSTRAIN (pc + 1);
  43.    r1 = CONSTRAIN (r1 + 1);
  44. }
  45.  
  46. void ding () {
  47.    pc = CONSTRAIN (pc + 1);
  48.    printf("DING!\n");
  49. }
  50.  
  51. void out () {
  52.    printf("%d\n", CONSTRAIN (memory[pc + 1]));
  53.    pc = CONSTRAIN (pc + 2);
  54. }
  55.  
  56. void loadR0 () {
  57.    r0 = memory[memory[CONSTRAIN (pc + 1)]];
  58.    pc = CONSTRAIN (pc + 2);
  59. }
  60.  
  61. void loadR1 () {
  62.    r1 = memory[memory[CONSTRAIN (pc + 1)]];
  63.    pc = CONSTRAIN (pc + 2);
  64. }
  65.  
  66. void storeR0 () {
  67.    memory[memory[CONSTRAIN (pc + 1)]] = r0;
  68.    pc = CONSTRAIN (pc + 2);
  69. }
  70.  
  71. void storeR1 () {
  72.    memory[memory[CONSTRAIN (pc + 1)]] = r1;
  73.    pc = CONSTRAIN (pc + 2);
  74. }
  75.  
  76. void jmp () {
  77.    pc = memory[CONSTRAIN (pc + 1)];
  78. }
  79.  
  80. void jmpR0 () {
  81.    if (r0 == 0) {
  82.       jmp();
  83.    } else {
  84.       pc = CONSTRAIN (pc + 1);
  85.    }
  86. }
  87.  
  88. void jmpNotR0 () {
  89.    if (r0 != 0) {
  90.       jmp();
  91.    } else {
  92.       pc = CONSTRAIN (pc + 1);
  93.    }
  94. }
  95.  
  96. instruction instructions[16] = {add, sub, incR0, incR1, decR0, decR1, ding, out, loadR0, loadR1, storeR0, storeR1, jmp, jmpR0, jmpNotR0};
  97.  
  98. int main (int argc, char ** argv) {
  99.  
  100.    int i;
  101.     for (i=0;i<argc - 1;i++) {
  102.       memory[i] = CONSTRAIN(atoi(argv[i + 1]));
  103.    }
  104.    for (;i<=MEM_SIZE;i++) {
  105.       memory[i] = 0;
  106.    }
  107.  
  108.    pc = is = r0 = r1 = 0;
  109.    
  110.    while (1) {
  111.       is = memory[pc];
  112.       if (is == 0) {
  113.          break;
  114.       }
  115.       instructions[is - 1]();
  116.    }
  117.    
  118.     return 0;
  119. }
Advertisement
Add Comment
Please, Sign In to add comment