diff --git a/befunge/src/main/kotlin/befide/befunge/b93/Befunge93Instructions.kt b/befunge/src/main/kotlin/befide/befunge/b93/B93Instructions.kt similarity index 74% rename from befunge/src/main/kotlin/befide/befunge/b93/Befunge93Instructions.kt rename to befunge/src/main/kotlin/befide/befunge/b93/B93Instructions.kt index 2f1323a..bcb97a3 100644 --- a/befunge/src/main/kotlin/befide/befunge/b93/Befunge93Instructions.kt +++ b/befunge/src/main/kotlin/befide/befunge/b93/B93Instructions.kt @@ -7,19 +7,19 @@ import befide.befunge.core.InstructionSet import befide.befunge.core.MutableInterpreter import befide.befunge.core.util.chooseOne -class Befunge93Instructions : InstructionSet { - override fun MutableInterpreter.handle() { +class B93Instructions : InstructionSet { + override fun MutableInterpreter.handle(): Boolean { when (mode) { - PointerMode.Terminated -> return + PointerMode.Terminated -> return true PointerMode.String -> when (instr.char) { - null -> Unit + null -> return false '"' -> mode = PointerMode.Normal else -> push(instr) } PointerMode.Normal -> when (instr.char) { - null -> Unit + null -> return false - in "0123456789abcdef" -> push(LongData(instr.char.toString().toLong(16))) + in "0123456789" -> push(LongData(instr.char.toString().toLong(16))) '+' -> pop(2).let { (b, a) -> push(a + b) } '-' -> pop(2).let { (b, a) -> push(a - b) } @@ -61,7 +61,31 @@ class Befunge93Instructions : InstructionSet { } '@' -> mode = PointerMode.Terminated + + else -> return false } } + + return true + } +} + +class B93Extras : InstructionSet { + override fun MutableInterpreter.handle(): Boolean { + when (mode) { + PointerMode.Terminated -> return true + PointerMode.String -> return false + PointerMode.Normal -> when (instr.char) { + null -> return false + + in "0123456789abcdef" -> push(LongData(instr.char.toString().toLong(16))) + + '\'' -> { + move() + push(instr) + } + } + } + return true } } \ No newline at end of file diff --git a/befunge/src/main/kotlin/befide/befunge/b93/Befunge93.kt b/befunge/src/main/kotlin/befide/befunge/b93/Befunge93.kt index 9bc073c..17cfce8 100644 --- a/befunge/src/main/kotlin/befide/befunge/b93/Befunge93.kt +++ b/befunge/src/main/kotlin/befide/befunge/b93/Befunge93.kt @@ -26,7 +26,7 @@ class Interpreter93(stdinSrc: PipedWriter, stdoutDest: PipedReader) override val stdin: PipedReader = PipedReader(stdinSrc) override val stdout: PipedWriter = PipedWriter(stdoutDest) - override val instructionSet = Befunge93Instructions() + override val instructionSet = B93Instructions() + B93Extras() override fun reset() { stdin.readAll() @@ -44,10 +44,12 @@ fun main(args: Array) { println(it.to.pos) } - int.funge.src = """2>:3g" "-!v\ g30 < - |!`"O":+1_:.:03p>03g+:"O"`| - @ ^ p3\" ":< -2 234567890123456789012345678901234567890123456789012345678901234567890123456789""" +// int.funge.src = """2>:3g" "-!v\ g30 < +// |!`"O":+1_:.:03p>03g+:"O"`| +// @ ^ p3\" ":< +//2 234567890123456789012345678901234567890123456789012345678901234567890123456789""" + + int.funge.src = """048ce.....@""" while (int.ip.mode != PointerMode.Terminated) { int.step() diff --git a/befunge/src/main/kotlin/befide/befunge/core/InstructionSet.kt b/befunge/src/main/kotlin/befide/befunge/core/InstructionSet.kt index 54659a8..c74cb69 100644 --- a/befunge/src/main/kotlin/befide/befunge/core/InstructionSet.kt +++ b/befunge/src/main/kotlin/befide/befunge/core/InstructionSet.kt @@ -3,7 +3,31 @@ package befide.befunge.core import befide.befunge.core.state.Data interface InstructionSet> { - fun MutableInterpreter.handle() + /** + * @return whether this instruction set handled the instruction. If true, the step will be completed + */ + fun MutableInterpreter.handle(): Boolean - fun step(inter: MutableInterpreter) = inter.handle() + fun step(inter: MutableInterpreter): Boolean = inter.handle() + + operator fun plus(o: InstructionSet): MultiInstructionSet = + MultiInstructionSet(this, o) + + operator fun plus(o: MultiInstructionSet): MultiInstructionSet = + MultiInstructionSet(listOf(this) + o.sets) +} + +class MultiInstructionSet> +(vararg val sets: InstructionSet) + : InstructionSet { + + constructor(sets: List>) : this(*sets.toTypedArray()) + + override fun MutableInterpreter.handle(): Boolean { + for (set in sets) if (set.step(this)) return true + return false + } + + override operator fun plus(o: InstructionSet): MultiInstructionSet = + MultiInstructionSet(sets.toList() + listOf(o)) } \ No newline at end of file