diff --git a/src/access_modifiers.rs b/src/access_modifiers.rs index e97f3f4..1922493 100644 --- a/src/access_modifiers.rs +++ b/src/access_modifiers.rs @@ -16,7 +16,7 @@ access_modifiers! { // UnkFFD2 = 0xFFD2, // UnkFFD3 = 0xFFD3, // UnkFFD4 = 0xFFD4, - // UnkFFD5 = 0xFFD5, + PtrDeref = 0xFFD5, // UnkFFD6 = 0xFFD6, // UnkFFD7 = 0xFFD7, Cache = 0xFFD8, @@ -45,8 +45,10 @@ access_modifiers! { // UnkFFEA = 0xFFEA, // UnkFFEB = 0xFFEB, // UnkFFEC = 0xFFEC, + // UnkFFED = 0xFFED, + PtrRef = 0xFFEF, } pub fn is_access_modifier(value: u32) -> bool { - value >= 0xFFCD && value <= 0xFFEC + value >= 0xFFCD && value <= 0xFFEF } diff --git a/src/instructions.rs b/src/instructions.rs index b82826a..375576c 100644 --- a/src/instructions.rs +++ b/src/instructions.rs @@ -121,7 +121,7 @@ instructions! { 0x08 = OutputFtp, 0x09 = OutputRun, // 0x0A - // 0x0B + 0x0B = Missile, 0x0C = Del, 0x0D = Test, 0x0E = Not, @@ -484,11 +484,33 @@ instructions! { 0x15B = PushCacheKey, 0x15C = PopCacheKey, 0x15D = Time2TextTZ(arg_count: u32), - // 0x15E + 0x15E = MakeGenerator, 0x15F = SpliceText, 0x160 = SpliceTextChar, 0x161 = RgbEx, // Used when the color space for rgb() cannot be found to be COLORSPACE_RGB at compile-time 0x162 = Rgb2Num, // This is technically a replacement for the original Rgb2Num which is somewhere else + // 0x163 + 0x164 = Gradient, + 0x165 = LoadResource, + // 0x166 + 0x167 = JsonEncodeFlags, + 0x168 = JsonDecodeFlags, + 0x169 = Ceil, + 0x16A = Trunc, + 0x16B = Fract, + 0x16C = IsNaN, + 0x16D = IsInf, + 0x16E = TrimText, + 0x16F = FTime, + 0x170 = BlockXYZ, + // 0x171 + 0x172 = NoiseHash, + 0x173 = PowSquare, // Optimization whenever x ** 2 or x ** x is used. + 0x174 = PowNegativeOne, // Optimization whenever x ** -1 is used. + 0x175 = GetStepsTo, + 0x176 = FloatMod, + 0x177 = AugFloatMod(var: Variable), + 0x178 = RefCount, 0x1337 = AuxtoolsDebugBreak, 0x1338 = AuxtoolsDebugBreakNop, diff --git a/src/operands.rs b/src/operands.rs index a75db28..84635b1 100644 --- a/src/operands.rs +++ b/src/operands.rs @@ -700,6 +700,8 @@ pub enum Variable { DynamicVerb(DMString), StaticProc(Proc), DynamicProc(DMString), + PtrRef(Box), + PtrDeref(Box), //RuntimeProcField(Box, Vec, DMString), } @@ -789,6 +791,14 @@ impl Operand for Variable { asm.emit(access_modifiers::StaticVerb); proc.assemble(asm)?; } + Variable::PtrRef(var) => { + asm.emit(access_modifiers::PtrRef); + var.assemble(asm)?; + } + Variable::PtrDeref(var) => { + asm.emit(access_modifiers::PtrDeref); + var.assemble(asm)?; + } } Ok(()) @@ -845,6 +855,10 @@ impl Operand for Variable { access_modifiers::DynamicVerb => Variable::DynamicVerb(DMString::disassemble(dism)?), access_modifiers::StaticProc => Variable::StaticProc(Proc::disassemble(dism)?), access_modifiers::StaticVerb => Variable::StaticVerb(Proc::disassemble(dism)?), + access_modifiers::PtrRef => Variable::PtrRef(Box::new(Variable::disassemble(dism)?)), + access_modifiers::PtrDeref => { + Variable::PtrDeref(Box::new(Variable::disassemble(dism)?)) + } other => { return Err(DisassembleError::UnknownAccessModifier { @@ -924,6 +938,14 @@ impl Operand for Variable { proc.serialize(f)?; write!(f, ")") } + Variable::PtrRef(var) => { + write!(f, "&")?; + var.serialize(f) + } + Variable::PtrDeref(var) => { + write!(f, "*")?; + var.serialize(f) + } } } }