@Override
 protected void onRisingClockEdge(Microinstruction m) {
   AccMicroinstr mi = (AccMicroinstr) getCurrentMicroinstruction();
   if (mi.pcw) {
     PC.clock();
   }
   if (mi.irw) {
     IR.clock();
   }
   if (mi.psww) {
     psw.clock();
   }
   if (mi.aw) {
     A.clock();
   }
   if (mi.mwr) {
     try {
       systemBus.write(ab, db, SystemBus.M_16);
     } catch (Exception ex) {
       System.out.println(ex.getMessage());
       System.exit(1);
     }
   }
 }
        @Override
        protected void onLogic(Microinstruction mi) {
          AccMicroinstr m = (AccMicroinstr) mi;
          short op1 = 0, op2 = 0;

          ab =
              (short)
                  ((!m.aoe)
                      ? 0xFFFF
                      : (m.asel == 0) ? IR.getQ() : (m.asel == 1) ? PC.getQ() : 0x10);

          if (m.moe) {
            if (!m.aoe) {
              java.lang.System.out.printf("Error: address bus in Z state\n");
              java.lang.System.exit(1);
            }
            if (m.doe) {
              java.lang.System.out.printf(
                  "Error: bus conflict on DB (moe and doe active simultaneously)\n");
              java.lang.System.exit(1);
            }

            try {
              db = systemBus.read(ab, SystemBus.M_16);
            } catch (Exception ex) {
              System.out.println(ex.getMessage());
              System.exit(1);
            }
          }

          switch (m.src1s) {
            case 0:
              op1 = IR.getQ();
              break;
            case 1:
              op1 = db;
              break;
            case 2:
              op1 = (short) m.k;
              break;
          }

          switch (m.src2s) {
            case 0:
              op2 = IR.getQ();
              break;
            case 1:
              op2 = PC.getQ();
              break;
            case 2:
              op2 = A.getQ();
              break;
            case 3:
              op2 = psw.output();
              break;
          }
          aluo = alu.exec(m.aluop, op1, op2, aluo, psw);

          if (m.asel == 2 && m.aoe) {
            ab = aluo;
          }

          if (m.doe) {
            db = aluo;
          } else if (!m.moe) {
            db = (short) 0xFFFF;
          }

          // BUSes -> Registers
          PC.setD(aluo);
          IR.setD(db);
          A.setD(aluo);

          if (controller.getState() == 0) {
            print(true);
          }
          print(false);
        }