Пример #1
0
 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);
 }
Пример #2
0
 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();
 }
Пример #3
0
 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;
 }
Пример #4
0
 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);
 }
Пример #5
0
 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));
 }
Пример #6
0
 public override void Assemble(Assembly.Assembler assembler)
 {
     if (Level.Val <= 0)
     {
         return;
     }
     assembler.Add(Assembly.Instructions.AsmContinue.Create(0, Level.Val - 1));
 }
Пример #7
0
        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;
        }
Пример #8
0
 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;
 }
Пример #9
0
 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);
     }
 }
Пример #10
0
 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;
         }
     }
 }
Пример #11
0
 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;
 }
Пример #12
0
        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));
        }
Пример #13
0
        //[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);
        }
Пример #14
0
 public override void Assemble(Assembly.Assembler assembler)
 {
     assembler.Add(Assembly.Instructions.AsmFor.Create());
     assembler.ForMapping[this] = assembler.Last() as Assembly.Instructions.AsmFor;
 }
Пример #15
0
 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;
 }
Пример #16
0
        public override void Assemble(Assembly.Assembler assembler)
        {
            var callfunc = assembler.CallMapping.GetValueOrDefault(Label, null);

            assembler.Add(Assembly.Instructions.AsmCall.Create(callfunc));
        }
Пример #17
0
 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();
 }
Пример #18
0
 public override void Assemble(Assembly.Assembler assembler)
 {
     assembler.Add(Assembly.Instructions.AsmSerialPrint.Create(Mem ? 1u : 0, Value));
 }
Пример #19
0
 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;
 }
Пример #20
0
 public override void Assemble(Assembly.Assembler assembler)
 {
     throw new Assembly.AssembleException(ErrorMessage.NotSupported);
 }
Пример #21
0
 public override void Assemble(Assembly.Assembler assembler)
 {
 }
Пример #22
0
 public override void Assemble(Assembly.Assembler assembler)
 {
     assembler.Add(Assembly.Instruction.CreateInstance(MetaInfo.InstructionType, RegDst.Index, Value));
 }
Пример #23
0
 public abstract void Assemble(Assembly.Assembler assembler);
Пример #24
0
 public override void Assemble(Assembly.Assembler assembler)
 {
     assembler.Add(Assembly.Instructions.AsmEmpty.Create());
     ReleasePrevious(assembler);
 }