2

我目前正在用 Java 创建一个 8080 仿真器作为一个丰富项目,并且目前正在尝试创建一个 switch/case 表来获取操作码,然后做一些事情,因为这似乎是一种获取 PC 字节和做事情的有效方式。

例如,0b01000000 到 0b01111111 都是 MOV 指令,除了 0b01110110 是 HALT。

因此,我希望能够按照以下方式创建一些代码

public void decode(){
    switch(PC){
        case 0b01110110: halt(); break;
        case (PC & 0B01000000): mov(); break;
    }
}

可悲的是,案例必须是静态的,不能在表格中评估。有没有办法解决这个问题?如果可能的话,我想避免使用 if() 语句,因为我觉得如果做一些在电路中不可能的事情,我会失去项目的完整性。

到目前为止,我只使用与非门实现了算术和逻辑核心,我想保持简约主题,但如果没有追索权,我愿意放弃它。

4

1 回答 1

0

我建议您mov通过位掩码选择功能并将检测延迟hlt到逻辑的进一步下方。

public static final int MOVMatch = 0b01000000;
public static final int MOVMask = 0b00111111;
// I am guessing 3 bits per register - check this in the spec.
public static final int MOVFrom = 0b00111000;
public static final int MOVTo = 0b00000111;
public static final int MOVHLT = 0b00110110;
if ( (PC & MOVMatch) == MOVMatch) {
  if ( (PC & MOVMatch) != MOVHLT ) {
    int movFrom = PC & MOVFrom;
    int movTo = PC & MOVTo;
    // ...
  } else {
    // HLT!
  }

}

另一种模式是将过程编码为一组命令。这样的事情可能是一个公平的起点:

public class Test {
  enum Reg {
    A, B, C, D, E, H, L, M, None;
  }

  static class Op {
    final Act act;
    final Reg f;
    final Reg t;

    // Default missing params to none.
    public Op(Act act, Reg f) {
      this(act, f, Reg.None);
    }

    public Op(Act act) {
      this(act, Reg.None, Reg.None);
    }

    public Op(Act act, Reg f, Reg t) {
      this.act = act;
      this.f = f;
      this.t = t;
    }

    // Perform the action.
    public void act() {
      act.act(f, t);
    }

  }

  enum Act {
    Mov {
      @Override
      void act(Reg f, Reg t) {
        // Do something to the state of machine state that emulates a move from f to t.
        // For demo, just print.
        super.act(f, t);
      }

    },
    Hlt {
      @Override
      void act(Reg f, Reg t) {
        // Do something to the state of machine state that halts.
        // For demo, just print.
        super.act(f, t);
      }

    };

    // All instructions should have an action.
    void act(Reg f, Reg t) {
      // Default action just prints.
      System.out.println(this + " " + f + "," + t);
    }

  }

  enum Inst {
    b01000000(new Op(Act.Mov, Reg.B, Reg.B)),
    b01000001(new Op(Act.Mov, Reg.B, Reg.C)),
    b01110110(new Op(Act.Hlt));
    final Op op;

    Inst(Op op) {
      this.op = op;
    }

    void act () {
      op.act();
    }
  }

  public void test() {
    for ( Inst i : Inst.values() ) {
      i.act();
    }
  }

  public static void main(String args[]) {
    try {
      new Test().test();
    } catch (Throwable t) {
      t.printStackTrace(System.err);
    }
  }

}
于 2013-09-05T08:20:42.303 回答