/// <summary> /// Compare two variables and set the flags. /// </summary> public static HITResult Cmp(HITThread thread) //same as sub, but does not set afterwards. { var dest = thread.ReadByte(); var src = thread.ReadByte(); var result = thread.ReadVar(dest) - thread.ReadVar(src); thread.SetFlags(result); return(HITResult.CONTINUE); }
//0x10 /// <summary> /// Increment a "dest" variable by a "src" variable. /// </summary> public static HITResult Add(HITThread thread) { var dest = thread.ReadByte(); var src = thread.ReadByte(); var result = thread.ReadVar(dest) + thread.ReadVar(src); thread.WriteVar(dest, result); thread.SetFlags(result); return HITResult.CONTINUE; }
/// <summary> /// Load a track ("index" variable) from a hitlist ("table" variable). /// </summary> public static HITResult SmartIndex(HITThread thread) { var dest = thread.ReadVar(thread.ReadByte()); var index = thread.ReadVar(thread.ReadByte()); thread.LoadHitlist((byte)index); int TrackID = (int)thread.LoadTrack(index); thread.WriteVar(dest, TrackID); return(HITResult.CONTINUE); //Appears to be unused. }
/// <summary> /// Load a track ("index" variable) from a hitlist ("table" variable). /// </summary> public static HITResult SmartIndex(HITThread thread) { var dest = thread.ReadVar(thread.ReadByte()); var index = thread.ReadVar(thread.ReadByte()); thread.LoadHitlist((byte)index); //Converting this to an int is a hack because WriteVar only takes an int... o_O int TrackID = (int)thread.LoadTrack(index); thread.WriteVar(dest, TrackID); return(HITResult.CONTINUE); //Appears to be unused. }
/// <summary> /// Multiply a "dest" variable by a "src" variable. /// </summary> public static HITResult Mul(HITThread thread) { var dest = thread.ReadByte(); var src = thread.ReadByte(); var result = thread.ReadVar(dest) * thread.ReadVar(src); thread.WriteVar(dest, result); thread.SetFlags(result); return(HITResult.CONTINUE); }
public static HITResult GetSrcDataField(HITThread thread) { var dest = thread.ReadByte(); var src = thread.ReadByte(); var field = thread.ReadByte(); int ObjectVar = thread.ReadVar(src); ObjectVar = thread.ReadVar(10010 + ObjectVar); thread.WriteVar(dest, ObjectVar); thread.SetFlags(ObjectVar); return(HITResult.CONTINUE); }
/// <summary> /// Wait until two variables are equal. /// </summary> public static HITResult WaitEqual(HITThread thread) { var dest = thread.ReadByte(); var src = thread.ReadByte(); if (thread.ReadVar(dest) != thread.ReadVar(dest)) { thread.PC -= 3; return(HITResult.HALT); } else { return(HITResult.CONTINUE); } }
/// <summary> /// Choose a global hitlist, or 0 for the one local to the track (source: defaultsyms.txt). /// </summary> public static HITResult SmartSetList(HITThread thread) { //sets the hitlist var src = thread.ReadByte(); thread.LoadHitlist((uint)thread.ReadVar(src)); return(HITResult.CONTINUE); }
/// <summary> /// Examine a variable and set the flags. /// </summary> public static HITResult Test(HITThread thread) { var value = thread.ReadVar(thread.ReadByte()); thread.SetFlags(value); return(HITResult.CONTINUE); }
/// <summary> /// Copy the contents of one variable into another. /// </summary> public static HITResult Set(HITThread thread) { var dest = thread.ReadByte(); var src = thread.ReadVar(thread.ReadByte()); thread.WriteVar(dest, src); thread.SetFlags(src); return(HITResult.CONTINUE); }
/// <summary> /// Find the lower of a "dest" variable and a "src" constant and store the result in the variable. /// </summary> public static HITResult Min(HITThread thread) { var dest = thread.ReadByte(); var src = thread.ReadInt32(); var result = Math.Min(thread.ReadVar(dest), src); thread.WriteVar(dest, result); thread.SetFlags(result); return(HITResult.CONTINUE); //unused in the sims }
/// <summary> /// Wait for a length of time in milliseconds, specified by a variable. /// </summary> public static HITResult Wait(HITThread thread) { var src = thread.ReadByte(); if (thread.WaitRemain == -1) { thread.WaitRemain = thread.ReadVar(src); } thread.WaitRemain -= 16; //assuming tick rate is 60 times a second if (thread.WaitRemain > 0) { thread.PC -= 2; return(HITResult.HALT); } else { thread.WaitRemain = -1; return(HITResult.CONTINUE); } }
/// <summary> /// Jump to a given address. /// </summary> public static HITResult Jump(HITThread thread) { var read = thread.ReadByte(); if (read > 15) //literal { thread.PC--; //backtraaackkk thread.PC = PCTrans(thread.ReadUInt32(), thread); } else //no idea if there are collisions. if there are i'm blaming fatbag. >:) { thread.PC = PCTrans((uint)thread.ReadVar(read), thread); if (thread.ReadByte() == 0) { thread.PC += 2; //if next is no-op, the operand is 4 byte } else { thread.PC--; //operand is 1 byte (next is an instruction), backtrack } } return(HITResult.CONTINUE); }
/// <summary> /// Jump to a given address. /// </summary> public static HITResult Jump(HITThread thread) { var read = thread.ReadByte(); if (read > 15) //literal { thread.PC--; //backtraaackkk thread.PC = thread.ReadUInt32(); } else //no idea if there are collisions. if there are i'm blaming fatbag. >:) { thread.PC = (uint)thread.ReadVar(read); if (thread.ReadByte() == 0) thread.PC += 2; //if next is no-op, the operand is 4 byte else thread.PC--; //operand is 1 byte (next is an instruction), backtrack } return HITResult.CONTINUE; }
/// <summary> /// Find the lower of a "dest" variable and a "src" constant and store the result in the variable. /// </summary> public static HITResult Min(HITThread thread) { var dest = thread.ReadByte(); var src = thread.ReadInt32(); var result = Math.Min(thread.ReadVar(dest), src); thread.WriteVar(dest, result); thread.SetFlags(result); return HITResult.CONTINUE; //unused in the sims }
public static HITResult GetSrcDataField(HITThread thread) { var dest = thread.ReadByte(); var src = thread.ReadByte(); var field = thread.ReadByte(); int ObjectVar = thread.ReadVar(src); ObjectVar = thread.ReadVar(10010 + ObjectVar); thread.WriteVar(dest, ObjectVar); thread.SetFlags(ObjectVar); return HITResult.CONTINUE; }
/// <summary> /// Copy the contents of one variable into another. /// </summary> public static HITResult Set(HITThread thread) { var dest = thread.ReadByte(); var src = thread.ReadVar(thread.ReadByte()); thread.WriteVar(dest, src); thread.SetFlags(src); return HITResult.CONTINUE; }
/// <summary> /// Wait until two variables are equal. /// </summary> public static HITResult WaitEqual(HITThread thread) { var dest = thread.ReadByte(); var src = thread.ReadByte(); if (thread.ReadVar(dest) != thread.ReadVar(dest)) { thread.PC -= 3; return HITResult.HALT; } else return HITResult.CONTINUE; }
/// <summary> /// Wait for a length of time in milliseconds, specified by a variable. /// </summary> public static HITResult Wait(HITThread thread) { var src = thread.ReadByte(); if (thread.WaitRemain == -1) thread.WaitRemain = thread.ReadVar(src); thread.WaitRemain -= 16; //assuming tick rate is 60 times a second if (thread.WaitRemain > 0) { thread.PC -= 2; return HITResult.HALT; } else { thread.WaitRemain = -1; return HITResult.CONTINUE; } }
/// <summary> /// Examine a variable and set the flags. /// </summary> public static HITResult Test(HITThread thread) { var value = thread.ReadVar(thread.ReadByte()); thread.SetFlags(value); return HITResult.CONTINUE; }
/// <summary> /// Choose a global hitlist, or 0 for the one local to the track (source: defaultsyms.txt). /// </summary> public static HITResult SmartSetList(HITThread thread) { //sets the hitlist var src = thread.ReadByte(); thread.LoadHitlist((uint)thread.ReadVar(src)); return HITResult.CONTINUE; }
/// <summary> /// Load a track ("index" variable) from a hitlist ("table" variable). /// </summary> public static HITResult SmartIndex(HITThread thread) { var dest = thread.ReadVar(thread.ReadByte()); var index = thread.ReadVar(thread.ReadByte()); thread.LoadHitlist((byte)index); //Converting this to an int is a hack because WriteVar only takes an int... o_O int TrackID = (int)thread.LoadTrack(index); thread.WriteVar(dest, TrackID); return HITResult.CONTINUE; //Appears to be unused. }