public ScramblerRx(TypedCompositeActor container, String name)
      throws NameDuplicationException, IllegalActionException {
    super(container, name);

    input = new TypedIOPort(this, "input", true, false);
    input.setTypeEquals(ObjectToken.class);

    output = new TypedIOPort(this, "output", false, true);
    output.setTypeEquals(ObjectToken.class);

    LS0Bytes = new Parameter(this, "LS0Bytes", new IntToken(8));
    LS0Map = new Parameter(this, "LS0Map", new BooleanToken(false));

    S = new Parameter(this, "S", new IntToken(1));
  }
  public void fire() throws IllegalActionException {

    ObjectToken ot = (ObjectToken) input.get(0);
    MuxDataFrame mf = (MuxDataFrame) ot.getValue();
    int b;

    if (_frameCounter == 0) {
      b = _processFast(mf.getFastByte());
      mf.setFastByte(b);

      if (!_LS0Map) {
        for (int i = 0; i < _LS0Bytes; i++) {
          b = _processFast(mf.getLS0Byte(i));
          mf.setLS0Byte(b, i);
        }
      }

      if (mf.hasLEX()) {
        b = _processFast(mf.getLEXByte());
        mf.setLEXByte(b);
      }
    } else {
      b = _processInter(mf.getFastByte());
      mf.setFastByte(b);

      if (_LS0Map) {
        for (int i = 0; i < _LS0Bytes; i++) {
          b = _processInter(mf.getLS0Byte(i));
          mf.setLS0Byte(b, i);
        }
      }

      if (mf.hasLEX()) {
        b = _processInter(mf.getLEXByte());
        mf.setLEXByte(b);
      }
    }
    _frameCounter++;
    if (_frameCounter == 1 + _S) _frameCounter = 0;

    ot = new ObjectToken(mf);
    output.broadcast(ot);
  }