Advertisement
Guest User

Universal Machine

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