From b453978afc994eec4cd328f7b9348a1e263e097f Mon Sep 17 00:00:00 2001 From: RogueAI42 Date: Mon, 19 Jun 2017 17:03:51 +1000 Subject: MindBlow tweaks * MindBlow now lets you reset memory before you start a new program, and kill one that is still executing * The MindBlow site now uses the correct button theme --- ShiftOS_TheReturn/BFInterpreter.cs | 110 ++++++++++++++++++------------------- 1 file changed, 53 insertions(+), 57 deletions(-) (limited to 'ShiftOS_TheReturn') diff --git a/ShiftOS_TheReturn/BFInterpreter.cs b/ShiftOS_TheReturn/BFInterpreter.cs index f2463a4..985e2ee 100644 --- a/ShiftOS_TheReturn/BFInterpreter.cs +++ b/ShiftOS_TheReturn/BFInterpreter.cs @@ -62,69 +62,65 @@ namespace ShiftOS.Engine Reset(); lst = listener; } - public void Execute() + public void Execute(string program) { + int c = 0; lock (lck) - for (int iptr = 0; iptr < prg.Length; iptr++) + while (c < program.Length) + switch (program[c++]) { - if (lst != null) - lst.IPtrMoved(iptr); - switch (prg[iptr]) - { - case '>': - ptr++; - if (lst != null) - lst.PointerMoved(ptr); - break; - case '<': - ptr--; - if (lst != null) - lst.PointerMoved(ptr); - break; - case '+': - mem[ptr]++; - if (lst != null) - lst.MemChanged(ptr, mem[ptr]); - break; - case '-': - mem[ptr]--; - if (lst != null) - lst.MemChanged(ptr, mem[ptr]); - break; - case '.': - str.WriteByte(mem[ptr]); - break; - case ',': - mem[ptr] = (byte)str.ReadByte(); - if (lst != null) - lst.MemChanged(ptr, mem[ptr]); - break; - case '[': - if (mem[ptr] == 0) - while (prg[iptr] != ']') - { - iptr++; - if (lst != null) - lst.IPtrMoved(iptr); - } - break; - case ']': - if (mem[ptr] != 0) - while (prg[iptr] != '[') - { - iptr--; - if (lst != null) - lst.IPtrMoved(iptr); - } - break; - } + case '<': + ptr--; + if (lst != null) + lst.PointerMoved(ptr); + break; + case '>': + ptr++; + if (lst != null) + lst.PointerMoved(ptr); + break; + case '+': + mem[ptr]++; + if (lst != null) + lst.MemChanged(ptr, mem[ptr]); + break; + case '-': + mem[ptr]--; + if (lst != null) + lst.MemChanged(ptr, mem[ptr]); + break; + case '.': + str.WriteByte(mem[ptr]); + break; + case ',': + mem[ptr] = (byte)str.ReadByte(); + if (lst != null) + lst.MemChanged(ptr, mem[ptr]); + break; + case '[': + int b; + int oldc = c; + for (b = 1; b != 0 && c < program.Length; c++) + { + if (program[c] == '[') + b++; + else if (program[c] == ']') + b--; + } + if (b == 0) + { + string block = program.Substring(oldc, c - oldc - 1); + while (mem[ptr] != 0) + Execute(block); + } + break; + case ']': + throw new Exception("Unbalanced brackets"); } } - public void Execute(string program) + public void Execute() { - lock (lck) - prg = program; - Execute(); + Execute(prg); } public void Reset() { -- cgit v1.2.3