public override void Assemble(Assembly.Assembler assembler) { int keycode = Key.KeyCode; int dindex = ScripterUtil.GetDirectionIndex(Key); if (Duration is ValRegEx) { if (Duration is ValReg32) throw new Assembly.AssembleException(ErrorMessage.NotSupported); var reg = Duration as ValRegEx; assembler.Add(Assembly.Instructions.AsmStoreOp.Create(reg.Index)); assembler.Add(Assembly.Instructions.AsmStick_Standard.Create(keycode, dindex, 0)); ReleasePrevious(assembler); } else if (Duration is ValInstant) { int duration = (Duration as ValInstant).Val; var ins = Assembly.Instructions.AsmStick_Standard.Create(keycode, dindex, duration); if (ins.Success) { assembler.Add(ins); ReleasePrevious(assembler); } else if (ins == Assembly.Instruction.Failed.OutOfRange) { assembler.Add(Assembly.Instructions.AsmStick_Hold.Create(keycode, dindex)); ReleasePrevious(assembler); assembler.StickMapping[keycode] = assembler.Last() as Assembly.Instructions.AsmStick_Hold; assembler.Add(Assembly.Instructions.AsmWait.Create(duration)); assembler.Add(Assembly.Instructions.AsmEmpty.Create()); ReleasePrevious(assembler); } } else throw new Assembly.AssembleException(ErrorMessage.NotImplemented); }
public override void Assemble(Assembly.Assembler assembler) { assembler.Add(Assembly.Instructions.AsmBranch.Create()); assembler.ElseMapping[this] = assembler.Last() as Assembly.Instructions.AsmBranch; assembler.Add(Assembly.Instructions.AsmEmpty.Create()); assembler.IfMapping[If].Target = assembler.Last(); }
public override void Assemble(Assembly.Assembler assembler) { assembler.Add(Assembly.Instructions.AsmBranch.Create()); assembler.FunctionMapping[Label] = assembler.Last() as Assembly.Instructions.AsmBranch; assembler.Add(Assembly.Instructions.AsmEmpty.Create()); assembler.CallMapping[Label] = assembler.Last() as Assembly.Instructions.AsmEmpty; }
protected void ReleasePrevious(Assembly.Assembler assembler) { if (!assembler.StickMapping.ContainsKey(Key.KeyCode)) return; assembler.StickMapping[Key.KeyCode].HoldUntil = assembler.Last(); assembler.StickMapping.Remove(Key.KeyCode); }
public override void Assemble(Assembly.Assembler assembler) { if (RegDst is ValReg32) { throw new Assembly.AssembleException(ErrorMessage.NotSupported); } assembler.Add(Assembly.Instruction.CreateInstance(MetaInfo.InstructionType, RegDst.Index)); }
public override void Assemble(Assembly.Assembler assembler) { if (Level.Val <= 0) { return; } assembler.Add(Assembly.Instructions.AsmContinue.Create(0, Level.Val - 1)); }
public override void Assemble(Assembly.Assembler assembler) { int val = 0; if (For.Count is ValInstant) { val = (For.Count as ValInstant).Val; } assembler.Add(Assembly.Instructions.AsmNext.Create(val)); assembler.ForMapping[For].Next = assembler.Last() as Assembly.Instructions.AsmNext; }
public override void Assemble(Assembly.Assembler assembler) { if (Count is ValReg) { assembler.Add(Assembly.Instructions.AsmMov.Create(Assembly.Assembler.IReg, (int)((Count as ValReg).Index << 4))); assembler.Add(Assembly.Instructions.AsmStoreOp.Create(Assembly.Assembler.IReg)); } else if (Count is ValReg32) { throw new Assembly.AssembleException(ErrorMessage.NotSupported); } assembler.Add(Assembly.Instructions.AsmFor.Create()); assembler.ForMapping[this] = assembler.Last() as Assembly.Instructions.AsmFor; }
public override void Assemble(Assembly.Assembler assembler) { if (Duration is ValReg) { assembler.Add(Assembly.Instructions.AsmStoreOp.Create((Duration as ValReg).Index)); assembler.Add(Assembly.Instructions.AsmWait.Create(0)); } else if (Duration is ValInstant) { assembler.Add(Assembly.Instructions.AsmWait.Create((Duration as ValInstant).Val)); } else { throw new Assembly.AssembleException(ErrorMessage.NotSupported); } }
public override void Assemble(Assembly.Assembler assembler) { assembler.Add(Assembly.Instructions.AsmEmpty.Create()); if (If.Else == null) { assembler.IfMapping[If].Target = assembler.Last(); } else { assembler.ElseMapping[If.Else].Target = assembler.Last(); var @elif = If; while (@elif is ElseIf) { assembler.ElseMapping[@elif].Target = assembler.Last(); @elif = @elif.If; } } }
public override void Assemble(Assembly.Assembler assembler) { if (Left is not ValRegEx left) { throw new Assembly.AssembleException("外部变量仅限联机模式使用"); } if (Right is ValInstant) { assembler.Add(Assembly.Instructions.AsmMov.Create(Assembly.Assembler.IReg, Right)); assembler.Add(Operater.Assemble(left.Index, Assembly.Assembler.IReg)); } else { assembler.Add(Operater.Assemble(left.Index, (Right as ValReg).Index)); } assembler.Add(Assembly.Instructions.AsmBranchFalse.Create()); assembler.IfMapping[this] = assembler.Last() as Assembly.Instructions.AsmBranchFalse; }
public override void Assemble(Assembly.Assembler assembler) { if (RegDst is ValReg32) { throw new Assembly.AssembleException(ErrorMessage.NotSupported); } if (RegDst.Index >= Processor.OfflineMaxRegisterCount) { throw new Assembly.AssembleException(ErrorMessage.RegisterCountNotSupported); } if (Value is ValRegEx) { if ((Value as ValRegEx).Index >= Processor.OfflineMaxRegisterCount) { throw new Assembly.AssembleException(ErrorMessage.RegisterCountNotSupported); } } assembler.Add(Assembly.Instructions.AsmMov.Create(RegDst.Index, Value)); }
//[InlineData("variables.asm")] public void NasmTest(string filename) { var fullPath = Path.Combine("resources", "Assembler", filename); var fileContent = File.ReadAllText(fullPath); var expectedBytes = TestHelpers.NasmBuildBinFromString64(fileContent); Assert.NotNull(expectedBytes); var listing = new AssemblerParser().Parse(fileContent); var assembler = new Assembly.Assembler(); var error = assembler.Assemble(listing); if (!string.IsNullOrWhiteSpace(error)) { Assert.True(false, "\r\n" + error + "\r\n"); } var actualBytes = assembler.GetBytes(); Assert.NotNull(actualBytes); TestHelpers.AssertByteArrays(expectedBytes, actualBytes); }
public override void Assemble(Assembly.Assembler assembler) { assembler.Add(Assembly.Instructions.AsmFor.Create()); assembler.ForMapping[this] = assembler.Last() as Assembly.Instructions.AsmFor; }
public override void Assemble(Assembly.Assembler assembler) { assembler.Add(Assembly.Instructions.AsmKey_Hold.Create(Key.KeyCode)); ReleasePrevious(assembler); assembler.KeyMapping[Key.KeyCode] = assembler.Last() as Assembly.Instructions.AsmKey_Hold; }
public override void Assemble(Assembly.Assembler assembler) { var callfunc = assembler.CallMapping.GetValueOrDefault(Label, null); assembler.Add(Assembly.Instructions.AsmCall.Create(callfunc)); }
public override void Assemble(Assembly.Assembler assembler) { assembler.Add(Assembly.Instructions.AsmReturn.Create(0)); assembler.Add(Assembly.Instructions.AsmEmpty.Create()); assembler.FunctionMapping[this.Label].Target = assembler.Last(); }
public override void Assemble(Assembly.Assembler assembler) { assembler.Add(Assembly.Instructions.AsmSerialPrint.Create(Mem ? 1u : 0, Value)); }
public override void Assemble(Assembly.Assembler assembler) { assembler.Add(Assembly.Instructions.AsmStick_Hold.Create(Key.KeyCode, ScripterUtil.GetDirectionIndex(Key))); ReleasePrevious(assembler); assembler.StickMapping[Key.KeyCode] = assembler.Last() as Assembly.Instructions.AsmStick_Hold; }
public override void Assemble(Assembly.Assembler assembler) { throw new Assembly.AssembleException(ErrorMessage.NotSupported); }
public override void Assemble(Assembly.Assembler assembler) { }
public override void Assemble(Assembly.Assembler assembler) { assembler.Add(Assembly.Instruction.CreateInstance(MetaInfo.InstructionType, RegDst.Index, Value)); }
public abstract void Assemble(Assembly.Assembler assembler);
public override void Assemble(Assembly.Assembler assembler) { assembler.Add(Assembly.Instructions.AsmEmpty.Create()); ReleasePrevious(assembler); }