예제 #1
0
 // 代表启动计算机
 public void start() {
   memory.read();
   memory.write();
   cpu.read();
   cpu.write();
   disk.read();
   disk.write();
 }
예제 #2
0
  public void run() {
    try {
      int opCode;

      while (true) {

        opCode = programMemory.read(programCounter);
        programCounter++;

        ioSystem.displayRuntimeError("@" + (programCounter - 1) + ": ");
        switch (opCode) {
          case HALT:
            {
              this.ioSystem.displayProgramTermination();
              return;
            }
          case PUSH:
            {
              expStack.push(programMemory.read(programCounter));
              programCounter++;
              break;
            }
          case ADD:
            {
              int a = expStack.pop();
              int b = expStack.pop();
              expStack.push(a + b);
              break;
            }
          case SUB:
            {
              int a = expStack.pop();
              int b = expStack.pop();
              expStack.push(a - b);
              break;
            }
          case MUL:
            {
              int a = expStack.pop();
              int b = expStack.pop();
              expStack.push(a * b);
              break;
            }
          case DIV:
            {
              int a = expStack.pop();
              int b = expStack.pop();
              expStack.push(a / b);
              break;
            }
          case MOD:
            {
              int a = expStack.pop();
              int b = expStack.pop();
              expStack.push(a % b);
              break;
            }
          case NEG:
            {
              int a = expStack.pop();
              expStack.push(-a);
              break;
            }
          case LT:
            {
              int a = expStack.pop();
              int b = expStack.pop();
              expStack.push(b < a ? 0 : 1);
              break;
            }
          case LE:
            {
              int a = expStack.pop();
              int b = expStack.pop();
              expStack.push(b <= a ? 0 : 1);
              break;
            }
          case GT:
            {
              int a = expStack.pop();
              int b = expStack.pop();
              expStack.push(b > a ? 0 : 1);
              break;
            }
          case GE:
            {
              int a = expStack.pop();
              int b = expStack.pop();
              expStack.push(b >= a ? 0 : 1);
              break;
            }
          case EQ:
            {
              int a = expStack.pop();
              int b = expStack.pop();
              expStack.push(b == a ? 0 : 1);
              break;
            }
          case NE:
            {
              int a = expStack.pop();
              int b = expStack.pop();
              expStack.push(b != a ? 0 : 1);
              break;
            }
          case IN:
            {
              int a = ioSystem.read();
              expStack.push(a);
              break;
            }
          case OUT:
            {
              ioSystem.write(expStack.pop());
              break;
            }
          case CALL:
            {
              callStack.push(programCounter);
              break;
            }
          case RET:
            {
              programCounter = callStack.pop();
              break;
            }
          case JP:
            {
              programCounter = programMemory.read(programCounter);
              break;
            }
          case JZ:
            {
              int a = expStack.pop();
              if (a == 0) programCounter = a;
              break;
            }
          case DUP:
            {
              expStack.dup();
              break;
            }
          case POP:
            {
              expStack.pop();
              break;
            }
          default:
            {
              ioSystem.displayRuntimeError("Bad instruction");
              return;
            }
        }
      }
    } catch (AddressOutOfBoundsException e) {
      ioSystem.displayRuntimeError("Adress out of bounds.");
    } catch (IOException e) {
      ioSystem.displayRuntimeError("Error with IO system.");
    } catch (StackOverflowException e) {
      ioSystem.displayRuntimeError("Stack overflow.");
    } catch (StackUnderflowException e) {
      ioSystem.displayRuntimeError("Stack underflow.");
    }
  }