public static Reg GetRegPart(Reg r, int size) { if (r == EAX || r == AL || r == AH) { if (size == 1) { return AL; } else if (size == 2) { return AH; } else if (size == 4) { return EAX; } } else if (r == EBX || r == BL || r == BH) { if (size == 1) { return BL; } else if (size == 2) { return BH; } else if (size == 4) { return EBX; } } else if (r == ECX || r == CL || r == CH) { if (size == 1) { return CL; } else if (size == 2) { return CH; } else if (size == 4) { return ECX; } } else if (r == EDX || r == DL || r == DH) { if (size == 1) { return DL; } else if (size == 2) { return DH; } else if (size == 4) { return EDX; } } return null; }
public Addr(Addr addr) { this.reg = addr.reg; this.offset = addr.offset; this.addr = addr.addr; this.size = addr.size; this.cast = addr.cast; this.variable = addr.variable; }
public MatchCollection Matchs(Regex regex, string input) { var r = new Reg(regex, input); r.OnMatchComplete += MatchCompleteHandler; var t = new Thread(r.Matchs); t.Start(); Sleep(t); return _mc; }
public FCodeEmit(FTypeEmit parent, FBuf fcode, CILInstructions code, Reg[] regs, FTypeRef ret) { this.pod = parent.pod; this.emitter = parent.emitter; this.parent = parent; this.buf = fcode.m_buf; this.len = fcode.m_len; this.code = code; this.podClass = FanUtil.toDotnetTypeName(pod.m_podName, "$Pod", false); this.jumps = new Jumps(code); this.regs = regs; this.ret = ret; }
public void CGenTest(Env env, Reg ret, CGenState state) { // test cond switch (ret) { case Reg.EAX: state.TESTL(Reg.EAX, Reg.EAX); break; case Reg.ST0: /// Compare expr with 0.0 /// < see cref = "BinaryArithmeticComp.OperateFloat(CGenState)" /> state.FLDZ(); state.FUCOMIP(); state.FSTP(Reg.ST0); break; default: throw new InvalidProgramException(); } }
public void Init(int rate) { Free(); _reg = new Reg(); for (int i = 0; i < _chip.Length; i++) { _chip[i] = new OplChip(); } _emulator = new Chip(); InitTables(); _emulator.Setup(rate); if (_type == OplType.DualOpl2) { // Setup opl3 mode in the hander _emulator.WriteReg(0x105, 1); } _rate = rate; }
public void CMPL(Int32 imm, Reg ee) => CMPL($"${imm}", RegToString(ee));
public void DIVL(Reg er) => DIVL(RegToString(er));
public void CMPL(Reg er, Reg ee) => CMPL(RegToString(er), RegToString(ee));
public void SUBL(Reg er, Reg ee, String comment = "") => SUBL(RegToString(er), RegToString(ee), comment);
public void IDIVL(Reg er) => IDIVL(RegToString(er));
public Int32 CGenPushLong(Reg src) { PUSHL(src); this.StackSize += 4; return this.StackSize; }
private void FILDL(Int32 offset, Reg dst) => FILDL($"{offset}({RegToString(dst)})");
public void SHRL(Reg er, Reg ee) => SHRL(RegToString(er), RegToString(ee));
public void Registration() { var registration = new Reg(); registration.ShowDialog(); }
public void SALL(Reg er, Reg ee) { SALL(RegToString(er), RegToString(ee)); }
public static String RegToString(Reg reg) => reg_strs[reg];
public void ORL(Reg er, Reg ee, String comment = "") { ORL(RegToString(er), RegToString(ee), comment); }
public void ANDB(Int32 er, Reg ee) => ANDB($"${er}", RegToString(ee));
public void ANDL(Reg er, Reg ee) => ANDL(RegToString(er), RegToString(ee));
public void TESTL(Reg er, Reg ee) => TESTL(RegToString(er), RegToString(ee));
public void ADDL(Reg er, Reg ee, String comment = "") => ADDL(RegToString(er), RegToString(ee), comment);
public void SETNA(Reg dst) => SETNA(RegToString(dst));
public void IMUL(Reg er) { IMUL(RegToString(er)); }
public void CGenPopLong(Int32 saved_size, Reg dst) { if (this.StackSize == saved_size) { POPL(dst); this.StackSize -= 4; } else { MOVL(-saved_size, Reg.EBP, dst); } }
public void MUL(Reg er) { MUL(RegToString(er)); }
public void SHRL(Int32 er, Reg ee) => SHRL($"${er}", RegToString(ee));
public void SUBL(Int32 er, Reg ee, String comment = "") => SUBL($"${er}", RegToString(ee), comment);
private int GetRegLocalization(Reg reg) { int loc = 0; switch (reg) { case Reg.BatWing: loc = 1023960; break; case Reg.GraveDust: loc = 1023983; break; case Reg.DaemonBlood: loc = 1023965; break; case Reg.NoxCrystal: loc = 1023982; break; case Reg.PigIron: loc = 1023978; break; case Reg.Bone: loc = 1023966; break; case Reg.DragonBlood: loc = 1023970; break; case Reg.FertileDirt: loc = 1023969; break; case Reg.DaemonBone: loc = 1023968; break; } if (loc == 0) loc = 1044353 + (int)reg; return loc; }
public void XORL(Reg er, Reg ee) { XORL(RegToString(er), RegToString(ee)); }