public static void doLDI(CpuContext ctx)
 {
     //ctx->tstates += 2;
     byte val = ctx.ReadMemory1(ctx.HL);
     ctx.WriteMemory1(ctx.DE, val);
     ctx.DE++;
     ctx.HL++;
     ctx.BC--;
     ctx.VALFLAG(Z80Flags.F_5, ((ctx.A + val) & 0x02) != 0);
     ctx.VALFLAG(Z80Flags.F_3, ((Z80Flags)(ctx.A + val) & Z80Flags.F_3) != 0);
     ctx.RESFLAG(Z80Flags.F_H | Z80Flags.F_N);
     ctx.VALFLAG(Z80Flags.F_PV, ctx.BC != 0);
 }
 public static void doOUTI(CpuContext ctx)
 {
     var value = ctx.ReadMemory1(ctx.HL);
     ctx.B = doIncDec(ctx, ctx.B, true);
     ctx.ioWrite(ctx.BC, value);
     ctx.HL++;
     int flag_value = value + ctx.L;
     ctx.VALFLAG(Z80Flags.F_N, (value & 0x80) != 0);
     ctx.VALFLAG(Z80Flags.F_H, flag_value > 0xff);
     ctx.VALFLAG(Z80Flags.F_C, flag_value > 0xff);
     ctx.VALFLAG(Z80Flags.F_PV, parityBit[(flag_value & 7) ^ ctx.B]);
     adjustFlags(ctx, ctx.B);
 }
 public static byte doCP_HL(CpuContext ctx)
 {
     byte val = ctx.ReadMemory1(ctx.HL);
     byte result = doArithmeticByte(ctx, ctx.A, val, false, true);
     adjustFlags(ctx, val);
     return result;
 }