public T this[IndexingRegister reg] { get { var copy = new T(); copy.Copy(Vars[0]); copy.Name = Name; copy.Index = reg; return(copy); } }
private StructType _makeCopy(StructType original, IndexingRegister index) { var newInstance = ((StructType?)Activator.CreateInstance(_baseInstance.GetType()))?.Copy(original); foreach (var p in newInstance.GetType().GetProperties().Where(x => typeof(Var).IsAssignableFrom(x.PropertyType)).ToList()) //user-defined Var properties { ((Var)p.GetGetMethod().Invoke(newInstance, null)).Index = index; } return(newInstance); }
public static VByte Ref(Address addr, IndexingRegister index, string name) { var v = new VByte { Address = new Address[] { addr }, Index = index, Name = string.IsNullOrEmpty(name) ? addr.ToString() : name }; return(v); }
//TODO: for each method, test if loop executed already, exception of true public LoopBlock Ascend(IndexingRegister reg) { if (reg != null) { throw new Exception("Loop index already set"); } Reg = reg; Ascending = true; return(this); }
public static void AscendWhile(IndexingRegister reg, Func <Condition> condition, Action <LoopLabels> block) { var labels = new LoopLabels(); Do_old(_ => { var before = reg.State.Hash; block.Invoke(labels); reg.State.Verify(before); Context.Write(labels.ContinueLabel); reg.Inc(); }).While(condition); Context.Write(labels.BreakLabel); }
public static void Descend_Pre(IndexingRegister reg, Action <LoopLabels> block) { var labels = new LoopLabels(); Do_old(_ => { Context.Write(labels.ContinueLabel); reg.Dec(); var before = reg.State.Hash; block.Invoke(labels); reg.State.Verify(before); }).While(() => reg is RegisterX ? X.NotEquals(0) : Y.NotEquals(0)); Context.Write(labels.BreakLabel); }
/// <summary> /// /// </summary> /// <param name="start">Inclusive</param> /// <param name="length">Exclusive</param> /// <param name="block"></param> public static void Repeat(IndexingRegister reg, int length, Action <LoopLabels> block) { var labels = new LoopLabels(); //X.Reset(); var lblStart = Labels.New(); Context.Write(lblStart); Context.New(() => { var before = reg.State.Hash; block.Invoke(labels); reg.State.Verify(before); Context.Write(labels.ContinueLabel); reg.Inc(); if (Context.StartBranchable) { if (length < 256) { if (reg is RegisterX) { CPU6502.CPX((U8)length); } else { CPU6502.CPY((U8)length); } } CPU6502.BNE(Context.Start); } else { //TODO: verify this works! if (length < 256) { if (reg is RegisterX) { CPU6502.CPX((U8)length); } else { CPU6502.CPY((U8)length); } } CPU6502.BEQ(3); GoTo(lblStart); } }); Context.Write(labels.BreakLabel); }
public VByte Set(IndexingRegister reg) { if (Index != null && Index == reg) { throw new NotImplementedException(); } if (reg is RegisterX) { CPU6502.STX(this); } else { CPU6502.STY(this); } return(this); }
public static void ForEach <T>(IndexingRegister index, StructOfArrays <T> items, Action <T, LoopLabels> block) where T : Struct, new() { if (index is RegisterX) { AscendWhile(X.Set(0), () => X.NotEquals(items.Length == 256 ? 0 : items.Length), lblsX => { var before = X.State.Hash; block?.Invoke(items[X], lblsX); X.State.Verify(before); }); } else { AscendWhile(Y.Set(0), () => Y.NotEquals(items.Length == 256 ? 0 : items.Length), lblsY => { var before = Y.State.Hash; block?.Invoke(items[Y], lblsY); Y.State.Verify(before); }); } }
public LabelIndexed(Label label, IndexingRegister reg) { Label = label; ((IIndexable)this).Index = reg; }
public LabelIndexed this[IndexingRegister reg] => new LabelIndexed(this, reg);
public StructType this[IndexingRegister reg] => _makeCopy(_structs[0], reg);
public VByte this[IndexingRegister r] => Ref(Address[0], r, Name);
public static LoopBlock Descend(IndexingRegister reg) => new LoopBlock().Descend(reg);
//TODO: figure out how to handle indexing reg's. They should never get into GenericAssembler, but they should also act as operands for higher level stuff. //Vars shouldn't have to specify a second Set function just for specifying IndexingRegister params. public RegisterA Set(IndexingRegister u8) => Set((IOperand)u8);
public AddressIndexed this[IndexingRegister r] => new AddressIndexed(this, r);
//public IndexingRegister? Index = null; public AddressIndexed(ushort value, IndexingRegister reg) : base(value) => Index = reg;
public StructType this[IndexingRegister index] => _makeCopy(0, index);