// 代表启动计算机 public void start() { memory.read(); memory.write(); cpu.read(); cpu.write(); disk.read(); disk.write(); }
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."); } }