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); }
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); }
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); }
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); }
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))); } }
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)); } }
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); }
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)); }
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); }
/// <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; }
static Ptr BindOff(AddressToken token, RomVersion version, Func <int, Ptr> func) { Addresser.TryGetOffset(token, version, out int temp); return(func(temp)); }
public AddressToken UpdateAddress(string id, int idx, AddressToken addressToken) { return(_userDetailsRepository.UpdateAddress(id, idx, addressToken.AsAddress()).AsToken()); }
public AddressToken AddAddress(string id, AddressToken addressToken) { return(_userDetailsRepository.AddAddress(id, addressToken.AsAddress()).AsToken()); }