public void GetSetBlBhTest() { var registers = new Registers(); registers.Set(Reg8.bl, 15); registers.Set(Reg8.bh, 16); Assert.AreEqual(15, registers.Get(Reg8.bl)); Assert.AreEqual(16, registers.Get(Reg8.bh)); }
private static long Solve(Registers registers, string[] lines) { int i = 0; while (i < lines.Length) { string[] splits = lines[i].Split(" "); string inst = splits[0]; switch (inst) { case "cpy": { string src = splits[1]; string destReg = splits[2]; int value = char.IsDigit(src[0]) ? int.Parse(src) : registers.Get(src); registers.Set(destReg, value); i++; break; } case "inc": { string reg = splits[1]; registers.Transform(reg, v => v + 1); i++; break; } case "dec": { string reg = splits[1]; registers.Transform(reg, v => v - 1); i++; break; } case "jnz": { string cmpValueRaw = splits[1]; int cmpValue = char.IsDigit(cmpValueRaw[0]) ? int.Parse(cmpValueRaw) : registers.Get(cmpValueRaw); int jmpAmount = cmpValue == 0 ? 1 : int.Parse(splits[2]); i += jmpAmount; break; } } } return(registers.Get("a")); }
public void GetSetAlTest() { var registers = new Registers(); registers.Set(Reg8.al, 4); Assert.AreEqual(4, registers.Get(Reg8.al)); }
public void GetSetAhTest() { var registers = new Registers(); registers.Set(Reg8.ah, 8); Assert.AreEqual(8, registers.Get(Reg8.ah)); }
protected ulong getValue(Registers regs, Stack stack, string expr, uint size = 4) { if (expr[0] == '%') // register { return(regs.Get(expr.Substring(1))); } if (expr[0] == '$') // number { return((ulong)long.Parse(expr.Substring(1))); } int leftBracket = expr.IndexOf('('); int rightBracket = expr.IndexOf(')'); if (leftBracket != -1 && rightBracket > leftBracket) // memory address pointed by register { int disp = (leftBracket == 0 ? 0 : int.Parse(expr.Substring(0, leftBracket))); string baseExpr = expr.Substring(leftBracket + 1, rightBracket - leftBracket - 1); uint baseAddr = (uint)getValue(regs, stack, baseExpr); uint realAddr = (uint)(baseAddr + disp); return(stack.MemGet(realAddr, size)); } throw new ArgumentException("Unrecognized expression: " + expr); }
public void GetSetClChCxTest() { var registers = new Registers(); registers.Set(Reg8.ch, 0x23); registers.Set(Reg8.cl, 0x42); Assert.AreEqual(0x2342, registers.Get(Reg16.cx)); }
public void PushValue(ushort Value) { var sp = registers.Get(Reg16.sp) - 2; BinaryHelper.Write16Bit(memory, (registers.Get(Segments.ss) << 4) + sp, Value); registers.Set(Reg16.sp, (ushort)sp); }
private static long Solve(Registers registers, string[] lines) { List <Command> commands = lines.Select(Parse).ToList(); int j = 0; int i = 0; while (i < commands.Count) { int iStart = i; j++; Command c = commands[i]; switch (c.Type) { case CommandType.Copy: { int value = c.Arg1IsInt ? int.Parse(c.Arg1) : registers.Get(c.Arg1); if (c.Arg2IsString) { registers.Set(c.Arg2, value); } i++; break; } case CommandType.Increment: { if (c.Arg1IsString) { registers.Transform(c.Arg1, v => v + 1); } i++; break; } case CommandType.Decrement: { if (c.Arg1IsString) { registers.Transform(c.Arg1, v => v - 1); } i++; break; } case CommandType.JumpNotZero: { int cmpValue = c.Arg1IsInt ? int.Parse(c.Arg1) : registers.Get(c.Arg1); int jmpAmount = cmpValue == 0 ? 1 : c.Arg2IsInt ? int.Parse(c.Arg2) : registers.Get(c.Arg2); i += jmpAmount; break; } case CommandType.Toggle: { int offsetValue = c.Arg1IsInt ? int.Parse(c.Arg1) : registers.Get(c.Arg1); int targetIdx = i + offsetValue; if (targetIdx >= 0 && targetIdx < commands.Count) { Command tgt = commands[targetIdx]; switch (tgt.Type) { case CommandType.Increment: commands[targetIdx] = new Command(CommandType.Decrement, tgt.Arg1); break; case CommandType.Decrement: case CommandType.Toggle: commands[targetIdx] = new Command(CommandType.Increment, tgt.Arg1); break; case CommandType.Copy: commands[targetIdx] = new Command(CommandType.JumpNotZero, tgt.Arg1, tgt.Arg2); break; case CommandType.JumpNotZero: commands[targetIdx] = new Command(CommandType.Copy, tgt.Arg1, tgt.Arg2); break; } } i++; break; } } } return(registers.Get("a")); }
private byte readProgramByte(int offset = 0) { return(memory[registers.Get(FcRegister.C) + offset]); }