content: // Capstone Java binding
  /* M680X Backend by Wolfgang Schwotzer <wolfgang.schwotzer@gmx.net> 2017 */
  
  package capstone;
  
  import com.sun.jna.Structure;
  import com.sun.jna.Union;
  
  import java.util.List;
  import java.util.Arrays;
  
  import static capstone.M680x_const.*;
  
  public class M680x {
  
    public static class OpIndexed extends Structure {
      public int base_reg;
      public int offset_reg;
      public short offset;
      public short offset_addr;
      public byte offset_bits;
      public byte inc_dec;
      public byte flags;
  
      @Override
      public List getFieldOrder() {
        return Arrays.asList("base_reg", "offset_reg", "offset", "offset_addr", "offset_bits", "inc_dec", "flags");
      }
    }
  
    public static class OpRelative extends Structure {
      public short address;
      public short offset;
  
      @Override
      public List getFieldOrder() {
        return Arrays.asList("address", "offset");
      }
    }
  
    public static class OpExtended extends Structure {
      public short address;
      public byte indirect;
  
      @Override
      public List getFieldOrder() {
        return Arrays.asList("address", "indirect");
      }
    }
  
    public static class OpValue extends Union {
      public int imm;
      public int reg;
      public OpIndexed idx;
      public OpRelative rel;
      public OpExtended ext;
      public byte direct_addr;
      public byte const_val;
  
      @Override
      public List getFieldOrder() {
        return Arrays.asList("imm", "reg", "idx", "rel", "ext", "direct_addr", "const_val");
      }
    }
  
    public static class Operand extends Structure {
      public int type;
      public OpValue value;
      public byte size;
      public byte access;
  
      public void read() {
        readField("type");
        if (type == M680X_OP_IMMEDIATE)
          value.setType(Integer.TYPE);
        if (type == M680X_OP_REGISTER)
          value.setType(Integer.TYPE);
        if (type == M680X_OP_INDEXED)
          value.setType(OpIndexed.class);
        if (type == M680X_OP_RELATIVE)
          value.setType(OpRelative.class);
        if (type == M680X_OP_EXTENDED)
          value.setType(OpExtended.class);
        if (type == M680X_OP_DIRECT)
          value.setType(Integer.TYPE);
        if (type == M680X_OP_INVALID)
          return;
        readField("value");
        readField("size");
        readField("access");
      }
  
      @Override
      public List getFieldOrder() {
        return Arrays.asList("type", "value", "size", "access");
      }
    }
  
    public static class UnionOpInfo extends Capstone.UnionOpInfo {
      public byte flags;
      public byte op_count;
  
      public Operand [] op;
  
      public UnionOpInfo() {
        op = new Operand[9];
      }
  
      public void read() {
        readField("flags");
        readField("op_count");
        op = new Operand[op_count];
        if (op_count != 0)
          readField("op");
      }
  
      @Override
      public List getFieldOrder() {
        return Arrays.asList("flags", "op_count", "op");
      }
    }
  
    public static class OpInfo extends Capstone.OpInfo {
      public byte flags;
      public Operand [] op = null;
  
      public OpInfo(UnionOpInfo op_info) {
        flags = op_info.flags;
        op = op_info.op;
      }
    }
  }
  