Advertisement
triclops200

Universal Machine VM

Feb 26th, 2012
261
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.00 KB | None | 0 0
  1. #include <cstring>
  2. #include <cstdio>
  3. #include <vector>
  4. #include "./getch.h"
  5. #define Ar reg[cr[0]]
  6. #define Br reg[cr[1]]
  7. #define Cr reg[cr[2]]
  8. #define ui32 unsigned int
  9. using namespace std;
  10. void resize(ui32** op,ui32 os, ui32 &ms){
  11.     ui32** tmp;
  12.     tmp = new ui32*[os];
  13.     memcpy(tmp, op, os*sizeof(ui32*));
  14.     delete[] op;
  15.     op = new ui32*[os*2];
  16.     memcpy(op, tmp, (os*2)*sizeof(ui32*));
  17.     delete[] tmp;
  18.     ms*=2;
  19. }
  20. int main(int argc, char** argv){
  21.     bool created = false;
  22.     int startsz = 1024;
  23.     ui32** arrays;
  24.     vector<int> sz;
  25.     ui32 masz = 32;
  26.     ui32 asz = 1;
  27.     arrays = new ui32*[32];
  28.     unsigned int reg[8];
  29.     memset(reg,0,32);
  30.     unsigned int cr[3];
  31.     unsigned char buf[4];
  32.     FILE * fp = fopen(argv[1],"rb");
  33.     int count = 0;
  34.     arrays[0]=new ui32[startsz];
  35.     sz.push_back(startsz);
  36.     while(fread(buf, 4, 1, fp)){
  37.         unsigned int c = 0;
  38.         for(int i = 0; i < 4; i++){
  39.             c = (c<<8)|buf[i];    
  40.         }
  41.         arrays[0][count]=c;
  42.         count++;
  43.         sz[0]=count;
  44.         if(count>=startsz){
  45.             ui32 * tmp = new ui32[startsz];
  46.             memcpy(tmp,arrays[0],sz[0]*4);
  47.             delete[] arrays[0];
  48.             arrays[0] = new ui32[startsz*2];
  49.             memcpy(arrays[0],tmp,sz[0]*4);
  50.             if(memcmp(tmp,arrays[0],startsz*4)){
  51.                 printf("fix your expand code!\n");
  52.             }
  53.             delete[] tmp;
  54.             startsz*=2;
  55.             //printf("sz[0] %i\n",sz[0]);
  56.         }
  57.     }
  58.     //printf("sz[0] %i\n",sz[0]);
  59.     int expos = 0;
  60.     int op=0;
  61.     while(expos < sz[0]){
  62.         memset(cr,0,12);
  63.         op = (arrays[0][expos]>>28);
  64.         if(op>13 || op<0){
  65.             printf("Invalid OPCODE %d\n",op);
  66.             return 1;
  67.         }
  68.         if(op<13){
  69.             cr[0] = (arrays[0][expos]>>6)&7;
  70.             cr[1] = (arrays[0][expos]>>3)&7;
  71.             cr[2] = (arrays[0][expos]>>0)&7;
  72.             expos++;
  73.             switch(op){
  74.                 case 0:
  75.                     if(Cr)
  76.                         Ar = Br;
  77.                     break;
  78.                 case 1:
  79.                     Ar = arrays[Br][Cr];
  80.                     break;
  81.                 case 2:
  82.                     if (Br>sz[Ar]){
  83.                         printf("\nInvalid Access, point to reach: %u, size of array: %u\n", Br, sz[Ar]);
  84.                         for(int i = 0; i < asz; i++){
  85.                             printf("I: %d, sz: %u\n",i,sz[i]);
  86.                         }
  87.                         return 1;
  88.                     }
  89.                     arrays[Ar][Br]=Cr;
  90.                     break;
  91.                 case 3:
  92.                     Ar = Br+Cr;
  93.                     break;
  94.                 case 4:
  95.                     Ar = Br*Cr;
  96.                     break;
  97.                 case 5:
  98.                     Ar = Br/Cr;
  99.                     break;
  100.                 case 6:
  101.                     Ar = ~(Br&Cr);
  102.                     break;
  103.                 case 7:
  104.                     return 0;
  105.                     break;
  106.                 case 8:
  107.                     //printf("Old size: %u ",asz);
  108.                     created=false;
  109.                     for(int i = 0; i < asz;i++){
  110.                         if(sz[i]==0&&!created){
  111.                             created = true;
  112.                             arrays[i] = new ui32[Cr];
  113.                             memset(arrays[i],0,Cr*4);
  114.                             Br = i;
  115.                             sz[i]=Cr;
  116.                         }
  117.                     }
  118.                     if(!created){
  119.                         Br = asz;
  120.                         arrays[asz] = new ui32[Cr];
  121.                         memset(arrays[asz],0,Cr*4);
  122.                         sz.push_back(Cr);
  123.                         asz++;
  124.                         if(asz >= masz){
  125.                             resize(arrays, asz, masz);
  126.                         }
  127.                     }
  128.                     /*printf("New size: %u, Cr: %u\n",asz, Cr);
  129.                     for(int i = 0; i < asz; i++){
  130.                             printf("I: %d, sz: %u\n",i,sz[i]);
  131.                         }*/
  132.  
  133.                     break;
  134.                 case 9:
  135.                     delete[] arrays[Cr];
  136.                     sz[Cr]=0;
  137.                     break;
  138.                 case 10:
  139.                     printf("%c",(unsigned char)Cr);
  140.                     break;
  141.                 case 11:
  142.                     Cr = mygetch();
  143.                     break;
  144.                 case 12:
  145.                     expos=Cr;
  146.                     sz[0] = sz[Br];
  147.                     if(Br==0)
  148.                         break;
  149.                     delete[] arrays[0];
  150.                     arrays[0] = new ui32[sz[Br]];
  151.                     memcpy(arrays[0],arrays[Br],sz[Br]*4);
  152.                     break;
  153.             }
  154.             //printf("Op: %d\n",op);
  155.         }
  156.         else{
  157.            cr[0] = (arrays[0][expos]>>25)&7;
  158.            Ar    = (arrays[0][expos]&0x01ffffff);
  159.            expos++;
  160.         }
  161.     }
  162. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement