private static bool ISP_4(uint uInstr, MilStd1750Disassembler dasm)
        {
            var imm = bf4_4.Read(uInstr) + 1u;

            dasm.ops.Add(ImmediateOperand.Word16((ushort)imm));
            return(true);
        }
        private static bool N(uint uInstr, MilStd1750Disassembler dasm)
        {
            var n = (ushort)bf4_4.Read(uInstr);

            dasm.ops.Add(ImmediateOperand.Word16(n));
            return(true);
        }
        /// <summary>
        /// IC-relative
        /// </summary>
        private static bool ICR(uint uInstr, MilStd1750Disassembler dasm)
        {
            var disp    = bf0_8.ReadSigned(uInstr);
            var addrDst = dasm.addr + disp;

            dasm.ops.Add(AddressOperand.Create(addrDst));
            return(true);
        }
 /// <summary>
 /// 16-bit immedate following the instruction word.
 /// </summary>
 private static bool IM(uint uInstr, MilStd1750Disassembler dasm)
 {
     if (!dasm.rdr.TryReadUInt16(out ushort imm))
     {
         return(false);
     }
     dasm.ops.Add(ImmediateOperand.Word16(imm));
     return(true);
 }
        /// <summary>
        /// XIO command decoder
        /// </summary>
        private static bool Xio(uint uInstr, MilStd1750Disassembler dasm)
        {
            if (!dasm.rdr.TryReadBeUInt16(out ushort cmd))
            {
                return(false);
            }
            var ra = Registers.GpRegs[bf4_4.Read(uInstr)];

            switch (cmd >> 12)
            {
            case 0:
                dasm.mnemonic = Mnemonic.xio_po;
                dasm.ops.Add(new RegisterOperand(ra));
                dasm.ops.Add(ImmediateOperand.Word16((ushort)(cmd & 0x03FF)));
                return(true);

            case 0x4:
                switch (cmd)
                {
                case 0x4000:
                    dasm.mnemonic = Mnemonic.xio_co;
                    dasm.ops.Add(new RegisterOperand(ra));
                    return(true);

                case 0x4001:
                    dasm.mnemonic = Mnemonic.xio_clc;
                    return(true);
                }
                break;

            case 0xA:
                switch (cmd)
                {
                case 0xAD51:
                    // 'MQ': Seems to be legit, but can't find documentation for it.
                    dasm.mnemonic = Mnemonic.xio_unknown;
                    dasm.ops.Add(ImmediateOperand.UInt16(cmd));
                    return(true);
                }
                break;
            }
            var testGenSvc = dasm.arch.Services.GetService <ITestGenerationService>();

            testGenSvc?.ReportMissingDecoder("MS1750Dis", dasm.addr, dasm.rdr, $"xio {cmd:X4}");
            return(false);
        }
        /// <summary>
        /// Address or indexed address
        /// </summary>
        private static bool Ax(uint uInstr, MilStd1750Disassembler dasm)
        {
            if (!dasm.rdr.TryReadBeUInt16(out ushort imm))
            {
                return(false);
            }
            var ixReg = bf0_4.Read(uInstr);

            if (ixReg != 0)
            {
                var op = new ImmediateOperand(Constant.Create(PrimitiveType.Word16, imm));
                dasm.ops.Add(op);
                var xReg = Registers.GpRegs[ixReg];
                dasm.ops.Add(new RegisterOperand(xReg));
            }
            else
            {
                var op = AddressOperand.Ptr16(imm);
                dasm.ops.Add(op);
            }
            return(true);
        }
 private static bool Imm8(uint uInstr, MilStd1750Disassembler dasm)
 {
     dasm.ops.Add(ImmediateOperand.Word16((ushort)bf0_8.Read(uInstr)));
     return(true);
 }