示例#1
0
        public static int GetRom(RomFileToken file, RomVersion version, AddressToken token)
        {
            int addr;
            var block = GetBlock(version, file.ToString());

            if (token == AddressToken.__Start)
            {
                TryGetStart(block, version, Domain.ROM, out addr);
            }
            else
            {
                TryMagicConverter(block, token, version, Domain.ROM, out addr);
            }
            return(addr);
        }
示例#2
0
        public static bool TryGetRam(AddressToken token, RomVersion version, out int v)
        {
            v = 0;
            if (!TryGetBlock(version, token, out Block block))
            {
                return(false);
            }

            if (!TryMagicConverter(block, token, version, Domain.RAM, out v))
            {
                return(false);
            }

            return(true);
        }
示例#3
0
        private static bool TryGetBlock(RomVersion version, AddressToken token, out Block block)
        {
            string ident = token.ToString();
            var    game  = (from a in AddressDoc.Game
                            where a.name.ToString() == version.Game.ToString()
                            select a).Single();

            block = (from b in game.Block
                     where b.Identifier.Any(x => x.id == ident)
                     select b).SingleOrDefault();
            if (block != null)
            {
                return(true);
            }

            return(false);
        }
示例#4
0
        public static bool TryGetSymbolRef(AddressToken token, RomVersion version, out MapBinding o)
        {
            o = null;
            if (!TryGetBlock(version, token, out Block block))
            {
                return(false);
            }

            var identifier = block.Identifier.SingleOrDefault(x => x.id == token.ToString());

            if (identifier == null)
            {
                return(false);
            }

            o = identifier.MapBinding;
            return(true);
        }
示例#5
0
        public IHttpActionResult SaveAddress(SNAPME.Web.Models.Api.Account.AddressToken address)
        {
            var addressToken = new AddressToken
            {
                name     = address.name,
                line1    = address.line1,
                line2    = address.line2,
                city     = address.city,
                state    = address.state,
                zip_code = address.zip_code
            };

            if (address.idx == -1)
            {
                return(Ok(_accountService.AddAddress(User.Identity.GetUserId(), addressToken)));
            }
            else
            {
                return(Ok(_accountService.UpdateAddress(User.Identity.GetUserId(), address.idx, addressToken)));
            }
        }
示例#6
0
 static Ptr BindPtr(AddressToken token, RomVersion version, Func <int, Ptr> func)
 {
     if (Options.MapfileOptions.CanUseMap(version))
     {
         if (Addresser.TryGetSymbolRef(token, version, out MapBinding binding) && binding != null &&
             Options.MapfileOptions.SymbolMap.TryGetSymbolAddress(binding, out N64Ptr ptr))
         {
             return(func(ptr));
         }
         Console.WriteLine($"{token} symbol not found");
         return(SPtr.New(0));
     }
     else if (Addresser.TryGetRam(token, version, out int temp))
     {
         return(func(temp));
     }
     else
     {
         return(SPtr.New(0));
     }
 }
示例#7
0
        public static bool TryGetOffset(AddressToken token, RomVersion version, out int v)
        {
            v = 0;

            if (!TryGetBlock(version, token, out Block block))
            {
                return(false);
            }

            var lookupAddr = block.Identifier.SingleOrDefault(x => x.id == token.ToString());

            if (!(lookupAddr.Item.Count > 0 && lookupAddr.Item[0] is Offset))
            {
                return(false);
            }

            var lookupSet = lookupAddr.Item.Cast <Offset>().ToList();

            var group = version.GetGroup();

            Offset offset = lookupSet.SingleOrDefault(x => x.id == version.GetGroup());

            if (offset == null && group != null)
            {
                offset = lookupSet.SingleOrDefault(x => x.id == null);
            }

            if (offset == null)
            {
                return(false);
            }


            if (!TryGetOffsetValue(offset, out v))
            {
                return(false);
            }
            return(true);
        }
示例#8
0
        public static bool TryGetRam(AddressToken token, RomFileToken file, RomVersion version, out int v)
        {
            var block = GetBlock(version, file.ToString());

            return(TryMagicConverter(block, token, version, Domain.RAM, out v));
        }
示例#9
0
        private static bool TryMagicConverter(Block block, AddressToken token, RomVersion version, Domain domain, out int result)
        {
            string ident = token.ToString();

            result = 0;
            int lookup = 0;

            var lookupAddr = block.Identifier.SingleOrDefault(x => x.id == ident);

            if (lookupAddr == null)
            {
                return(false);
            }

            if (lookupAddr.Item.Count > 0)
            {
                if (lookupAddr.Item[0] is Addr addr)
                {
                    if (!TryGetAddrValue(addr, version, out lookup))
                    {
                        return(false);
                    }

                    //if lookup is absolute, and in the same space, we have it

                    if (addr.reftype == AddressType.absolute &&
                        addr.domain == domain)
                    {
                        result = lookup;
                        return(true);
                    }

                    //if lookup is absolute, but not in the same space, convert to offset
                    if (addr.reftype == AddressType.absolute && addr.domain != domain)
                    {
                        Addr altStartAddr;

                        altStartAddr = block.Start.SingleOrDefault(x => x.domain == addr.domain);

                        if (altStartAddr == null ||
                            !TryGetAddrValue(altStartAddr, version, out int altStart))
                        {
                            return(false);
                        }

                        lookup -= altStart;
                    }
                }
                else if (lookupAddr.Item[0] is Offset)
                {
                    var lookupSet = lookupAddr.Item.Cast <Offset>().ToList();

                    Offset offset = lookupSet.SingleOrDefault(x => x.id == version.GetGroup());

                    if (offset == null)
                    {
                        return(false);
                    }

                    if (!TryGetOffsetValue(offset, out lookup))
                    {
                        return(false);
                    }
                }
            }

            if (!TryGetStart(block, version, domain, out int start))
            {
                return(false);
            }

            result = start + lookup;

            return(true);
        }
示例#10
0
        /// <summary>
        /// Identifies and resolves Labels and Variables
        /// </summary>
        /// <param name="asmSource"></param>
        public static void ResolveLabelsAndDirectives(AsmSource asmSource)
        {
            var programAddress    = 0;
            var varAddress        = 0xc00;
            var defMemLastAddress = 0;

            foreach (var line in asmSource.Lines)
            {
                if (line.IsLabelDefinition())
                {
                    asmSource.Labels.Add(new KeyValuePair <string, int>(
                                             line.Tokens[0].Text,
                                             programAddress));
                }
                else if (line.IsVariableDefinition())
                {
                    asmSource.Variables.Add(new KeyValuePair <string, int>(
                                                line.Tokens[1].Text,
                                                varAddress));

                    varAddress++;
                }
                else if (line.IsOrgDirective())
                {
                    programAddress = ((LiteralToken)line.Tokens[1]).NumericValue;
                }
                else if (line.IsDefMemDirective())
                {
                    var address = 0;
                    var value   = 0;
                    if (line.Tokens.Count == 3)
                    {
                        address           = ((LiteralToken)line.Tokens[1]).NumericValue;
                        defMemLastAddress = address;

                        value = ((LiteralToken)line.Tokens[2]).NumericValue;
                    }
                    else if (line.Tokens.Count == 2)
                    {
                        defMemLastAddress++;
                        address = defMemLastAddress;

                        value = ((LiteralToken)line.Tokens[1]).NumericValue;
                    }


                    asmSource.DefMems.Add(new KeyValuePair <int, int>(
                                              address,
                                              value));
                }
                else
                {
                    line.Address    = programAddress;
                    programAddress += 3;
                }
            }

            IList <Line> newLines = new List <Line>();

            foreach (var line in asmSource.Lines)
            {
                try
                {
                    // if is label definition or defbyte, drop line
                    if (line.IsLabelDefinition() ||
                        line.IsVariableDefinition() ||
                        line.IsOrgDirective() ||
                        line.IsDefMemDirective())
                    {
                        continue;
                    }

                    // if has label or variable in line, resolve it
                    // (convert to corresponding memory address)
                    IList <Token> newTokens = new List <Token>();
                    foreach (var token in line.Tokens)
                    {
                        if (token is LabelToken)
                        {
                            var literal      = asmSource.Labels[token.Text].ToString();
                            var literalToken = new LiteralToken(literal);

                            newTokens.Add(literalToken);
                        }
                        else if (token is DirectiveToken)
                        {
                            var address      = asmSource.Variables[token.Text].ToString();
                            var addressToken = new AddressToken(address);

                            newTokens.Add(addressToken);
                        }
                        else
                        {
                            newTokens.Add(token);
                        }
                    }
                    line.Tokens.Clear();
                    line.Tokens = newTokens;

                    newLines.Add(line);
                }
                catch (Exception ex)
                {
                    throw new Exception("Error in line: " + line.Text, ex);
                }
            }
            asmSource.Lines.Clear();
            asmSource.Lines = newLines;
        }
示例#11
0
 static Ptr BindOff(AddressToken token, RomVersion version, Func <int, Ptr> func)
 {
     Addresser.TryGetOffset(token, version, out int temp);
     return(func(temp));
 }
示例#12
0
 public AddressToken UpdateAddress(string id, int idx, AddressToken addressToken)
 {
     return(_userDetailsRepository.UpdateAddress(id, idx, addressToken.AsAddress()).AsToken());
 }
示例#13
0
 public AddressToken AddAddress(string id, AddressToken addressToken)
 {
     return(_userDetailsRepository.AddAddress(id, addressToken.AsAddress()).AsToken());
 }