SHARE
TWEET

stp 5 fvm

vikt144 Feb 3rd, 2020 1 in 208 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. /* Part of the project take  from retro forth
  3. http://forthworks.com/retro/
  4. */
  5. package forth;  
  6.  
  7. public class FVM {
  8.  
  9.         public fas as;
  10.  
  11.         public int IMAGE_SIZE=2024;  //my   this is param for imgsize
  12.  
  13.         private int sp = 0, rsp = 0, ip = 0; // указатели стека, стека возвратов и адрес команды
  14.  
  15.         public STACK stack,adrStack;    //стеки  
  16.  
  17.         public short[] image=null;  // память
  18.  
  19.         public int [] ports;  // порты ввода вывода
  20.  
  21.  
  22.   public static final int
  23.     VM_NOP = 0 ,
  24.     VM_LIT = 1 ,  // положить 16 битное значение на стек
  25.     VM_DUP = 2 ,    VM_DROP = 3 ,  VM_SWAP = 4 ,
  26.     VM_PUSH = 5 ,    VM_POP = 6 ,
  27.     VM_CALL = 7 ,    VM_JUMP = 8 ,    VM_RETURN = 9 ,
  28.     VM_GT/*_JUMP*/ = 10 ,VM_LT/*_JUMP*/ = 11 , VM_EQ /*VM_NE_JUMP*/ = 12 ,  VM_EQ_JUMP = 13 ,  //  >  <  =  =+jump
  29.     VM_FETCH = 14 ,  VM_STORE = 15 ,  // @  !
  30.     VM_ADD = 16 ,    VM_SUB = 17 ,    VM_MUL = 18 ,  VM_DIVMOD = 19 , // + - *  /
  31.     VM_AND = 20 , VM_OR = 21 , VM_XOR = 22 ,
  32.  
  33.     VM_SHL = 23 ,    VM_SHR = 24 ,    VM_ZERO_EXIT = 25 ,
  34.     VM_INC = 26 ,  VM_DEC = 27 ,
  35.     VM_IN = 28 ,  VM_OUT = 29 ,  VM_WAIT = 30, // записсь чтение портов , ожидание
  36.    
  37.     VM_LIT32 = 31 ,// положить 32 битное значение на стек
  38.     VM_FETCH16 = 32 ,  VM_STORE16 = 33   // c@  c!  
  39.      ;
  40.  
  41.   private void handleDevices() {  // от ретро, // вызывается командой wait
  42.         //зависит от реализации
  43.   }
  44.  
  45.  private void callService(int port, int y) { // вызывается во время записи в порт (out)
  46.         // зависит от реализации
  47.    
  48.    if (port != 0) System.out.println("нетот порт "+ port);
  49.      else
  50.      {
  51.      switch (y) {
  52.        case 0 : _HALT=true; break;
  53.        case 1 : System.out.println("st= "+stack.pop() ); /*_HALT=true; */ break;
  54.        case 2 :  as.proc(); /* _HALT=true; */  break;
  55.        case 3 :  as.ret(); /* _HALT=true; */ System.out.println("ret");  break;
  56.        case 4 :   as.cre1(); System.out.println("fvm create ");  break;
  57.        case 5 :   as.allot(); break;
  58.        case 6 :   as.does_(); break;
  59.        case 7 :   as.comma();     break;  
  60.        case 8 :   as.here() ;    break;      
  61.        case 9 :   as.compile();     break;  
  62.        case 10 :        as.immediate();     break;  
  63.        case 11 :   as.resolve_();     break;  
  64.        case 12 :   as._resolve();     break;
  65.        case 13 :   as.loadScr();     break;
  66.        case 14 :   as.comment();     break;
  67.        case 15 :   as._loop_();      break;
  68.        case 16 :   as.compile2();     break;                
  69. //      case 6 :   as.     break;          
  70.              //as.colon1(); _HALT=true;  break;          
  71.       } //switch
  72.    }//else
  73.  }
  74.  
  75.   /**    * Process a single opcode*/
  76. //
  77. //  public int magicValue = 200; //  если опкод превысит это значение  то или call или jump туда
  78.  
  79.  
  80.   private void process() {
  81.  
  82.   int x, y, z,tmp,  op;
  83.   op = image[ip];
  84.         switch(op) {
  85.  
  86.     case VM_NOP:
  87.       break;
  88.     case VM_LIT:    ip++;stack.push(image[ip]); // положить 16 битное значение на стек
  89.       break;
  90.     case VM_DUP:    tmp=stack.pop(); stack.push(tmp);stack.push(tmp);
  91.       break;
  92.     case VM_DROP:  stack.drop(1);
  93.       break;
  94.     case VM_SWAP:  x = stack.pop(); y= stack.pop(); stack.push(x);stack.push(y);
  95.       break;
  96.     case VM_PUSH:  x = stack.pop();  adrStack.push(x); // со стека данных на адресный стек >R
  97.       break;
  98.     case VM_POP:    x = adrStack.pop(); stack.push(x); // обратно  R>
  99.       break;
  100.  
  101.  
  102.     case VM_CALL:  ip++; adrStack.push(ip); ip=image[ip]-1;
  103.       break;
  104.     case VM_JUMP:  ip++;    ip = image[ip]-1;
  105.       break;
  106.     case VM_RETURN:
  107.       ip = adrStack.pop();
  108.       break;
  109.     case VM_GT : //    //    0 В ФОРТЕ -- FALSE
  110.       x = stack.pop();  if (x>0) x=-1; else x=0; stack.push(x);
  111.       break;
  112.     case VM_LT :
  113.       x = stack.pop();  if (x<0)  x=-1; else x=0 ; stack.push(x);      
  114.       break;
  115.     case VM_EQ : // ip++;
  116.       x = stack.pop();  if (x==0)  x=-1; else x=0 ; stack.push(x);
  117.       break;
  118.     case VM_EQ_JUMP:  ip++;
  119.      x = stack.pop(); if (x==0) ip = image[ip] - 1;    
  120.       break;
  121.    
  122.    
  123.     case VM_FETCH: /// @
  124.       tmp=stack.pop();                        // со стека снимается адрес
  125.       x=image[tmp]; tmp++; y=image[tmp];      // с этого адреса снимаются две соседние
  126.       stack.push(x << 16  | y & 0xffff  );  // 16битные ячейки и с помощью сдвига и AND
  127.       break;              // объединяются в 32 битное значение и кладутся на стек
  128.  
  129.  
  130.     case VM_STORE:  //    //  обратная операция 32 битное знач. разлагается
  131.     x = stack.pop(); y= stack.pop(); // на два 16 битных с помощью сдвигов
  132.     short a=(short)y ,  b = (short) (y >> 16);
  133.     image[x]=b; x++ ;  image[x]=a;
  134.       break;
  135.  
  136.     case VM_ADD:    x = stack.pop(); y= stack.pop();stack.push(y+x);
  137.       break;
  138.     case VM_SUB:    x = stack.pop(); y= stack.pop();stack.push(y-x);
  139.       break;
  140.     case VM_MUL:    x = stack.pop(); y= stack.pop();stack.push(y*x);
  141.       break;
  142.     case VM_DIVMOD:    //my relize div 0
  143.       x = stack.pop(); y= stack.pop();  
  144.       stack.push(y % x);  stack.push(y/x); // на стеке остаток и целое
  145.       break;    // иожно добавить проверку /0 если не отлавливаются исключения
  146.     case VM_AND:    x = stack.pop(); y= stack.pop();stack.push(x & y);
  147.       break;
  148.     case VM_OR:      x = stack.pop(); y= stack.pop();stack.push(x | y);
  149.       break;
  150.     case VM_XOR:  x = stack.pop(); y= stack.pop();stack.push(x ^ y);
  151.       break;
  152.     case VM_SHL:    x = stack.pop(); y= stack.pop();stack.push(  y << x );  // сдвиг битов влево
  153.       break;
  154.     case VM_SHR:  x = stack.pop(); y= stack.pop();stack.push( y >>= x );  //  вправо
  155.       break;
  156.     case VM_ZERO_EXIT:    // выход из подпрограммы, если на стеке 0
  157.       if (stack.peek() == 0)
  158.       {
  159.         stack.drop(1);
  160.         ip = adrStack.pop();
  161.       }
  162.       break;
  163.     case VM_INC:  x = stack.pop(); x++; stack.push(x);
  164.     break;
  165.     case VM_DEC:  x = stack.pop(); x--; stack.push(x);
  166.     break;
  167.  
  168.   case VM_IN:          // чтение порта
  169.       x = stack.pop();
  170.       y = ports[x];
  171.       stack.push(y);
  172.       ports[x] = 0;
  173.       break;
  174.     case VM_OUT:  // вершина номер порта
  175.       x=stack.pop();
  176.       y=stack.pop();
  177.       ports[x]=y;//
  178.       callService(x,y);  //вызов внешней функции
  179.       break;
  180.     case VM_WAIT:  handleDevices(); // наследство от  ретро
  181.       break;
  182.  
  183.     case VM_LIT32:  // положить 32 битное значение
  184.       ip++; x=image[ip]; ip++; y=image[ip];  stack.push( x << 16  | y & 0xffff );
  185.       break; //2 16 битные ячейки объединяются в 32 битную с помощью сдвигов
  186.  
  187.     case VM_FETCH16: /// c@
  188.       tmp=stack.pop();                        // со стека снимается адрес
  189.       x=image[tmp];  
  190.       stack.push(x );
  191.       break;          
  192.  
  193.  
  194.     case VM_STORE16:  // c!   //  обратная операция 32 битное знач. разлагается
  195.     x = stack.pop(); y= stack.pop(); // на два 16 битных с помощью сдвигов
  196.    // short
  197.      b = (short) (y);
  198.     image[x]=b;
  199.       break;
  200.  
  201.  
  202.   }
  203. }
  204.  
  205.  
  206.   public boolean _HALT =  false;  //Переменной Halt присваиваются значение во время выполнения
  207.                                 //callService, при исполнении инструкции out
  208.  
  209.  public void processImage( int startIP ) {
  210.   ip=startIP;
  211.   _HALT=false;
  212.   while  (ip<IMAGE_SIZE  && ! _HALT) {
  213.       process();
  214.       ip++;}
  215.   } //void
  216.  
  217.    public void processImageQ( int startIP ) {ip=startIP;  process();}
  218. }  //all
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Top