Exemple #1
0
        public void IncludeString(string value)
        {
            var label = $@"""{value}""";

            if (LabelDefs.ContainsKey(label))
            {
                return;
            }

            Compilation.ConstData.Add(ConstRef(typeof(string).Id(), this));
            ConstDef(label).Label(label);
            Compilation.ConstData.Add(value.Length);
            Compilation.ConstData.AddRange(value.Select(c => (int)c));
        }
Exemple #2
0
        public void PatchLabels()
        {
            foreach (var labelRef in LabelRefs)
            {
                if (labelRef.RemoveCall)
                {
                    CurrentLabelAddress = labelRef.Value;

                    while (Compilation.Opcodes[CurrentLabelAddress] == Opcode.PFX0)
                    {
                        EmitOpcodes(Opcode.NOP);
                    }

                    if (Compilation.Opcodes[CurrentLabelAddress] == Opcode.PSH &&
                        Compilation.Opcodes[CurrentLabelAddress + 1] == Opcode.JSR)
                    {
                        EmitOpcodes(Opcode.NOP, Opcode.NOP);
                    }

                    continue;
                }

                Debug.Assert(LabelDefs.ContainsKey(labelRef.Name));

                var labelDef   = LabelDefs[labelRef.Name];
                var labelValue = labelDef.IsAddressSlot ? Config.AddrIdxToAddrSlot(labelDef.Value) : labelDef.Value;

                if (labelRef.IsAddressSlot)
                {
                    CurrentLabelAddress = labelRef.Value;
                    EmitValue(labelValue, Config.BitsPerMemoryUnit);
                }
                else
                {
                    Debug.Assert(labelRef.Value >= Config.ConstStart && labelRef.Value < Config.ConstStart + Config.ConstSize);
                    Compilation.ConstData[labelRef.Value - Config.ConstStart] = labelValue;
                }
            }
        }