From 37691dc7fa4a68ed3369da924f977ce36c397904 Mon Sep 17 00:00:00 2001 From: rnentjes Date: Sun, 17 Aug 2025 20:32:12 +0200 Subject: [PATCH] Refactor rewind functionality with circular buffer, update `BufferedImageData` handling in `DisplayView`, enhance `ConsoleView` rendering updates, and integrate `SnakeCode` data. --- build.gradle.kts | 2 +- .../mtmc/asm/instructions/Instruction.kt | 4 +- .../instructions/JumpRegisterInstruction.kt | 12 +- .../kotlin/mtmc/emulator/BufferedImage.kt | 2 + .../kotlin/mtmc/emulator/MTMCDisplay.kt | 15 +- .../mtmc/emulator/MonTanaMiniComputer.kt | 25 +- .../kotlin/mtmc/emulator/RewindStep.kt | 2 +- src/jsMain/kotlin/mtmc/Code.kt | 4817 ++++++++++++++++ src/jsMain/kotlin/mtmc/Main.kt | 4819 +---------------- .../kotlin/mtmc/emulator/BufferedImage.js.kt | 45 +- .../kotlin/mtmc/util/PlatformSpecific.js.kt | 4 +- src/jsMain/kotlin/mtmc/view/ConsoleView.kt | 6 +- src/jsMain/kotlin/mtmc/view/DisplayView.kt | 11 +- .../kotlin/mtmc/emulator/BufferedImage.jvm.kt | 4 + .../kotlin/mtmc/util/PlatformSpecific.jvm.kt | 2 +- 15 files changed, 4916 insertions(+), 4854 deletions(-) create mode 100644 src/jsMain/kotlin/mtmc/Code.kt diff --git a/build.gradle.kts b/build.gradle.kts index 84bd6d3..7eff4b1 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -67,7 +67,7 @@ kotlin { } val jsMain by getting { dependencies { - implementation("nl.astraeus:kotlin-komponent:1.2.5") + implementation("nl.astraeus:kotlin-komponent:1.2.8") } } val jsTest by getting diff --git a/src/commonMain/kotlin/mtmc/asm/instructions/Instruction.kt b/src/commonMain/kotlin/mtmc/asm/instructions/Instruction.kt index 867a240..f84f7c3 100644 --- a/src/commonMain/kotlin/mtmc/asm/instructions/Instruction.kt +++ b/src/commonMain/kotlin/mtmc/asm/instructions/Instruction.kt @@ -57,7 +57,7 @@ abstract class Instruction( if (ls != null) { return ls } - val jumpReg = JumpInstruction.disassemble(instruction) + val jumpReg = JumpRegisterInstruction.disassemble(instruction) if (jumpReg != null) { return jumpReg } @@ -65,7 +65,7 @@ abstract class Instruction( if (jump != null) { return jump } - return "" + return "" } } } diff --git a/src/commonMain/kotlin/mtmc/asm/instructions/JumpRegisterInstruction.kt b/src/commonMain/kotlin/mtmc/asm/instructions/JumpRegisterInstruction.kt index 7e8596f..967179d 100644 --- a/src/commonMain/kotlin/mtmc/asm/instructions/JumpRegisterInstruction.kt +++ b/src/commonMain/kotlin/mtmc/asm/instructions/JumpRegisterInstruction.kt @@ -26,10 +26,16 @@ class JumpRegisterInstruction( companion object { fun disassemble(instruction: Short): String? { - if (BinaryUtils.getBits(16, 5, instruction).toInt() == 9) { + if (BinaryUtils.getBits(16, 4, instruction).toInt() == 9) { val reg = BinaryUtils.getBits(4, 4, instruction) - val sb = StringBuilder("jr") - sb.append(fromInteger(reg.toInt())) + if (reg.toInt() == 11) { + return "ret" + } else { + val sb = StringBuilder("jr") + sb.append(" ") + sb.append(fromInteger(reg.toInt())) + return sb.toString() + } } return null } diff --git a/src/commonMain/kotlin/mtmc/emulator/BufferedImage.kt b/src/commonMain/kotlin/mtmc/emulator/BufferedImage.kt index b61ed27..cc3de2e 100644 --- a/src/commonMain/kotlin/mtmc/emulator/BufferedImage.kt +++ b/src/commonMain/kotlin/mtmc/emulator/BufferedImage.kt @@ -2,6 +2,8 @@ package mtmc.emulator expect fun createBufferedImage(width: Int, height: Int): BufferedImage +expect fun createCanvasImage(width: Int, height: Int): BufferedImage + interface BufferedImage { val width: Int val height: Int diff --git a/src/commonMain/kotlin/mtmc/emulator/MTMCDisplay.kt b/src/commonMain/kotlin/mtmc/emulator/MTMCDisplay.kt index e50107b..6be2bd8 100644 --- a/src/commonMain/kotlin/mtmc/emulator/MTMCDisplay.kt +++ b/src/commonMain/kotlin/mtmc/emulator/MTMCDisplay.kt @@ -3,7 +3,7 @@ package mtmc.emulator import kotlin.math.min class MTMCDisplay(private val computer: MonTanaMiniComputer) { - private val buffer: BufferedImage? = null + val buffer: BufferedImage = createCanvasImage(COLS, ROWS) private var currentColor: DisplayColor? = null private var graphics: Array = arrayOf() private var byteArray: ByteArray = ByteArray(0) @@ -107,11 +107,11 @@ class MTMCDisplay(private val computer: MonTanaMiniComputer) { } fun setPixel(col: Int, row: Int, color: DisplayColor) { - buffer?.setRGB(col, row, color.intVal) + buffer.setRGB(col, row, color.intVal) } fun getPixel(col: Int, row: Int): Short { - val rgb = buffer?.getRGB(col, row) ?: 0 + val rgb = buffer.getRGB(col, row) return DisplayColor.indexFromInt(rgb) } @@ -123,10 +123,11 @@ class MTMCDisplay(private val computer: MonTanaMiniComputer) { } fun drawRectangle(startCol: Short, startRow: Short, width: Short, height: Short) { -// val graphics = buffer.getGraphics() -// graphics.setColor(currentColor!!.javaColor) -// graphics.fillRect(startCol.toInt(), startRow.toInt(), width.toInt(), height.toInt()) -// graphics.dispose() + for (x in startCol..() + + var rewindSteps = Array(MAX_REWIND_STEPS) { null } + var rewindIndex = -1 // listeners private val observers = mutableListOf() @@ -46,12 +48,12 @@ class MonTanaMiniComputer { registerFile = ShortArray(Register.entries.size) memory = ByteArray(MEMORY_SIZE) breakpoints = ByteArray(MEMORY_SIZE) - rewindSteps.clear() + rewindIndex = -1 setRegisterValue( Register.SP, MEMORY_SIZE.toShort().toInt() ) // default the stack pointer to the top of memory - rewindSteps.clear() + rewindIndex = -1 observers.forEach { obj -> obj.computerReset() } @@ -134,7 +136,8 @@ class MonTanaMiniComputer { fun fetchAndExecute() { currentRewindStep = RewindStep() currentRewindStep?.let { - rewindSteps.add(0, it) + rewindIndex = (rewindIndex + 1) % rewindSteps.size + rewindSteps.set(rewindIndex, it) } fetchCurrentInstruction() val instruction = getRegisterValue(Register.IR) @@ -795,11 +798,8 @@ class MonTanaMiniComputer { } private fun addRewindStep(runnable: Runnable?) { - if (currentRewindStep != null && rewindSteps != null) { + if (currentRewindStep != null) { currentRewindStep!!.addSubStep(runnable) - if (rewindSteps.size > MAX_REWIND_STEPS) { - rewindSteps.removeLast() - } } } @@ -954,12 +954,15 @@ class MonTanaMiniComputer { } fun rewind() { - val latestRewindStep = rewindSteps.removeFirst() - latestRewindStep.rewind() + if (rewindIndex >= 0) { + val latestRewindStep = rewindSteps[rewindIndex] + rewindIndex-- + latestRewindStep?.rewind() + } } val isBackAvailable: Boolean - get() = !rewindSteps!!.isEmpty() + get() = rewindIndex >= 0 enum class ComputerStatus { READY, diff --git a/src/commonMain/kotlin/mtmc/emulator/RewindStep.kt b/src/commonMain/kotlin/mtmc/emulator/RewindStep.kt index 4de124f..3bf4e47 100644 --- a/src/commonMain/kotlin/mtmc/emulator/RewindStep.kt +++ b/src/commonMain/kotlin/mtmc/emulator/RewindStep.kt @@ -3,7 +3,7 @@ package mtmc.emulator import mtmc.util.Runnable class RewindStep { - var subSteps: MutableList = ArrayList() + var subSteps: MutableList = mutableListOf() fun rewind() { subSteps.reversed().forEach({ obj: Runnable? -> obj!!.invoke() }) diff --git a/src/jsMain/kotlin/mtmc/Code.kt b/src/jsMain/kotlin/mtmc/Code.kt new file mode 100644 index 0000000..92e94a6 --- /dev/null +++ b/src/jsMain/kotlin/mtmc/Code.kt @@ -0,0 +1,4817 @@ +package mtmc + +val snakeCode: ByteArray = arrayOf( + -128, + 0, + 3, + -94, + -128, + 16, + 3, + -92, + -122, + 0, + 3, + -66, + -122, + 16, + 4, + 14, + -16, + 36, + -15, + 6, + -15, + -120, + -14, + -114, + -15, + 78, + -15, + -24, + -14, + -42, + -13, + 58, + -64, + 18, + 0, + 0, + 32, + -67, + -113, + 96, + 5, + -96, + -13, + -110, + -124, + -96, + 3, + -96, + -128, + 0, + 3, + -94, + -128, + 16, + 3, + -92, + -124, + 0, + 3, + -90, + -124, + 16, + 3, + -88, + -122, + 0, + 3, + -66, + -122, + 16, + 4, + 14, + -16, + 82, + -16, + 124, + -14, + -8, + 33, + -67, + -112, + 11, + 32, + -67, + -128, + 0, + 3, + -86, + -128, + 16, + 3, + -84, + 1, + 32, + 18, + 33, + -113, + 48, + 0, + 0, + -113, + 64, + 0, + 0, + -128, + 80, + 3, + -96, + 16, + 83, + -121, + 69, + 0, + 0, + 2, + 49, + 52, + 50, + -32, + 104, + 33, + -67, + -112, + 11, + 32, + -67, + -128, + 0, + 3, + -86, + -128, + 16, + 3, + -84, + -113, + 48, + 0, + 0, + -113, + 64, + 0, + 1, + -128, + 80, + 3, + -96, + 16, + 83, + -121, + 69, + 0, + 0, + 2, + 49, + 52, + 48, + -32, + -114, + -113, + 48, + 0, + 0, + -113, + 64, + 0, + 1, + -128, + 80, + 3, + -96, + 16, + 83, + -121, + 69, + 5, + 120, + 2, + 49, + 52, + 48, + -32, + -90, + -113, + 48, + 0, + 0, + -113, + 64, + 0, + 1, + -113, + 80, + 0, + 0, + -128, + 0, + 3, + -96, + 16, + 5, + -121, + 64, + 0, + 0, + -128, + 0, + 3, + -86, + -128, + 16, + 3, + -84, + 2, + 49, + 16, + 80, + 52, + 49, + -32, + -62, + -113, + 48, + 0, + 0, + -113, + 64, + 0, + 1, + -113, + 80, + 0, + 39, + -128, + 0, + 3, + -96, + 16, + 5, + -121, + 64, + 0, + 0, + -128, + 0, + 3, + -86, + -128, + 16, + 3, + -84, + 2, + 49, + 16, + 80, + 52, + 49, + -32, + -24, + 33, + -67, + -112, + 11, + 32, + -67, + -128, + 0, + 3, + -76, + -128, + 16, + 3, + -74, + -113, + 32, + 0, + 0, + -128, + 48, + 3, + -72, + -125, + 96, + 3, + -66, + -125, + 112, + 4, + 14, + -128, + -128, + 3, + -86, + -128, + -112, + 3, + -84, + 1, + 72, + 18, + 71, + 16, + 70, + 32, + 13, + -128, + 0, + 3, + -96, + 16, + 4, + -113, + 80, + 0, + 1, + -121, + 80, + 0, + 0, + 33, + 13, + 2, + 1, + 20, + 3, + 2, + 33, + 52, + 33, + -31, + 24, + 33, + -67, + -112, + 11, + 32, + -67, + -128, + 0, + 3, + -74, + -128, + 16, + 3, + -68, + 52, + 1, + -31, + -124, + -128, + 80, + 3, + -76, + -125, + 5, + 3, + -66, + -125, + 21, + 4, + 14, + -128, + 32, + 3, + -86, + -128, + 48, + 3, + -84, + 1, + 65, + 18, + 66, + 16, + 64, + -128, + 0, + 3, + -96, + 16, + 4, + -113, + 80, + 0, + 0, + -121, + 80, + 0, + 0, + 33, + -67, + -112, + 11, + 32, + -67, + 0, + 48, + -128, + 0, + 3, + -86, + -128, + 16, + 3, + -84, + -113, + 32, + 0, + 0, + -113, + 48, + 0, + 4, + -113, + -128, + 0, + 4, + -113, + -112, + 0, + 4, + 1, + 80, + 18, + 81, + -128, + 0, + 3, + -86, + 1, + 98, + 20, + 96, + 18, + 99, + 1, + 114, + 19, + 112, + 18, + 115, + -128, + 16, + 3, + -96, + 16, + 18, + -125, + 65, + 0, + 0, + 56, + 65, + -47, + -56, + 0, + 52, + 2, + 33, + 52, + 37, + -31, + -88, + -113, + 96, + 0, + 1, + 0, + 59, + -128, + 96, + 4, + 94, + -128, + 112, + 4, + 96, + 18, + 99, + 18, + 115, + 0, + 52, + 0, + 53, + 33, + -67, + -112, + 11, + 32, + -67, + -128, + 0, + 3, + -90, + -128, + 16, + 3, + -88, + -128, + 80, + 3, + -80, + -128, + 64, + 3, + -104, + 21, + 69, + 57, + 64, + -46, + 4, + 3, + 17, + -62, + 46, + -128, + 64, + 3, + -102, + 21, + 69, + 57, + 64, + -46, + 18, + 2, + 17, + -62, + 46, + -128, + 64, + 3, + -100, + 21, + 69, + 57, + 64, + -46, + 32, + 3, + 1, + -62, + 46, + -128, + 64, + 3, + -98, + 21, + 69, + 57, + 64, + -46, + 46, + 2, + 1, + -62, + 46, + -124, + 0, + 3, + -90, + -124, + 16, + 3, + -88, + -128, + 32, + 3, + -76, + -128, + 48, + 3, + -74, + -128, + 64, + 3, + -72, + 16, + 35, + 20, + 36, + -121, + 2, + 3, + -66, + -121, + 18, + 4, + 14, + -128, + 64, + 3, + -68, + 52, + 52, + -46, + 94, + 2, + 49, + -124, + 48, + 3, + -74, + -62, + 110, + -128, + 32, + 3, + -76, + -128, + 48, + 3, + -72, + 2, + 33, + 20, + 35, + -124, + 32, + 3, + -76, + -128, + 32, + 3, + -86, + -128, + 48, + 3, + -84, + 1, + 65, + 18, + 66, + 16, + 64, + -128, + 16, + 3, + -96, + 16, + 20, + -125, + 81, + 0, + 0, + -124, + 80, + 3, + -78, + 33, + -67, + -112, + 11, + 32, + -67, + -128, + 96, + 3, + -82, + 0, + 34, + 0, + 58, + 1, + 42, + -128, + 48, + 3, + -104, + 21, + 50, + 57, + 48, + -30, + -60, + -128, + 48, + 3, + -102, + 21, + 50, + 57, + 48, + -30, + -60, + -128, + 48, + 3, + -100, + 21, + 50, + 57, + 48, + -30, + -60, + -128, + 48, + 3, + -98, + 21, + 50, + 57, + 48, + -30, + -60, + -62, + -56, + -124, + 48, + 3, + -80, + -128, + 96, + 0, + 0, + 0, + 34, + 56, + -96, + -46, + -106, + 33, + -67, + -112, + 11, + 32, + -67, + -128, + 0, + 3, + -78, + 56, + 1, + -30, + -28, + 33, + -67, + -112, + 11, + -113, + 96, + 4, + 98, + 0, + 6, + -113, + 96, + 4, + -124, + 0, + 6, + -113, + 96, + 4, + 98, + 0, + 6, + 0, + 0, + 32, + -67, + -128, + 96, + 0, + 1, + -128, + 112, + 3, + -86, + 3, + 113, + 0, + 32, + 1, + 10, + -128, + 96, + 0, + 1, + -128, + 112, + 3, + -84, + 3, + 113, + 0, + 32, + 1, + 26, + -128, + 32, + 3, + -86, + 1, + 65, + 18, + 66, + 16, + 64, + -128, + 48, + 3, + -96, + 16, + 52, + -125, + 83, + 0, + 0, + 56, + 81, + -30, + -6, + -124, + 0, + 4, + 94, + -124, + 16, + 4, + 96, + 33, + -67, + -112, + 11, + 32, + -67, + -128, + 0, + 3, + -90, + -128, + 16, + 3, + -88, + -128, + 32, + 4, + 94, + -128, + 48, + 4, + 96, + 48, + 2, + -45, + -114, + 48, + 19, + -45, + -114, + -14, + -8, + -128, + 0, + 3, + -68, + -128, + 16, + 3, + -72, + 52, + 1, + -45, + -114, + -128, + 64, + 3, + -70, + -113, + 80, + 0, + 0, + 52, + 1, + -45, + -114, + 2, + 1, + -124, + 0, + 3, + -68, + 2, + 81, + 52, + 84, + -29, + 106, + 2, + 65, + -124, + 64, + 3, + -70, + -128, + 0, + 3, + -82, + -113, + 16, + 0, + 10, + 17, + 1, + -124, + 0, + 3, + -82, + 33, + -67, + -112, + 11, + 1, + -82, + 16, + -26, + -112, + 11 +).toByteArray() +val snakeData: ByteArray = arrayOf( + 0, + -128, + 0, + 64, + 0, + 32, + 0, + 16, + -1, + -1, + 0, + 20, + 0, + 18, + 0, + 20, + 0, + 18, + 0, + 40, + 0, + 36, + 0, + -56, + 0, + -128, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 80, + 0, + 1, + 0, + 3, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 45, + 10, + 0, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 32, + 42, + 42, + 67, + 82, + 65, + 83, + 72, + 42, + 42, + 10, + 32, + 32, + 71, + 97, + 109, + 101, + 32, + 111, + 118, + 101, + 114, + 44, + 32, + 109, + 97, + 110, + 46, + 32, + 71, + 97, + 109, + 101, + 32, + 79, + 118, + 101, + 114, + 33, + 10, + 0, + 32, + 0 +).toByteArray() + +val lifeCode: ByteArray = arrayOf( + -15, + -116, + -14, + 100, + -16, + 10, + -64, + 2, + 0, + 0, + 32, + -67, + -113, + 96, + 8, + 111, + -113, + 112, + 2, + -49, + -113, + -128, + 5, + -96, + 0, + 64, + 4, + 96, + 4, + 112, + 15, + -1, + -113, + -112, + 2, + -49, + -15, + 68, + 1, + -118, + 32, + -115, + -16, + 70, + 33, + -115, + 1, + -102, + -16, + -86, + 2, + 97, + 31, + 100, + 0, + 40, + -32, + 32, + 2, + 113, + 31, + 116, + 0, + 36, + -32, + 30, + 33, + -67, + -112, + 11, + 32, + -67, + 4, + 0, + 3, + 97, + 3, + 113, + -113, + -128, + 2, + -49, + -15, + 68, + 16, + 10, + 2, + 97, + -113, + -128, + 2, + -49, + -15, + 68, + 16, + 10, + 2, + 97, + -113, + -128, + 2, + -49, + -15, + 68, + 16, + 10, + 3, + 98, + 2, + 113, + -113, + -128, + 2, + -49, + -15, + 68, + 16, + 10, + 2, + 98, + -113, + -128, + 2, + -49, + -15, + 68, + 16, + 10, + 3, + 98, + 2, + 113, + -113, + -128, + 2, + -49, + -15, + 68, + 16, + 10, + 2, + 97, + -113, + -128, + 2, + -49, + -15, + 68, + 16, + 10, + 2, + 97, + -113, + -128, + 2, + -49, + -15, + 68, + 3, + 97, + 3, + 113, + 16, + 10, + 1, + -96, + 33, + -67, + -112, + 11, + 32, + -67, + 4, + 0, + 56, + -128, + -48, + -70, + 56, + -109, + -48, + -60, + 4, + 1, + -64, + -60, + 58, + -111, + -48, + -60, + 60, + -108, + -48, + -60, + 4, + 1, + -113, + -128, + 8, + 111, + 1, + -112, + -15, + 124, + 33, + -67, + -112, + 11, + 60, + 96, + -48, + -40, + 4, + -96, + -112, + 11, + -113, + -96, + 0, + 39, + 50, + 106, + -48, + -28, + 4, + -96, + -112, + 11, + 60, + 112, + -48, + -20, + 4, + -96, + -112, + 11, + -113, + -96, + 0, + 35, + 50, + 122, + -48, + -8, + 4, + -96, + -112, + 11, + 1, + 70, + 1, + 87, + 31, + 82, + 0, + 40, + 16, + 84, + 1, + 69, + 31, + 67, + 0, + 8, + 31, + 84, + 0, + 8, + 90, + -124, + 4, + 65, + 24, + 69, + 21, + -92, + 29, + -96, + 29, + -96, + -112, + 11, + 1, + 6, + 1, + 23, + 31, + 18, + 0, + 40, + 16, + 16, + 1, + 1, + 31, + 3, + 0, + 8, + 31, + 20, + 0, + 8, + 82, + -128, + 4, + 49, + 24, + 49, + 56, + -111, + -47, + 60, + 22, + 35, + -63, + 64, + 28, + 48, + 21, + 35, + 114, + -128, + -112, + 11, + 60, + 96, + -47, + 76, + 4, + -96, + -112, + 11, + -113, + -96, + 0, + 39, + 50, + 106, + -47, + 88, + 4, + -96, + -112, + 11, + 60, + 112, + -47, + 96, + 4, + -96, + -112, + 11, + -113, + -96, + 0, + 35, + 50, + 122, + -47, + 108, + 4, + -96, + -112, + 11, + 1, + 70, + 1, + 87, + 31, + 82, + 0, + 40, + 16, + 84, + 1, + 69, + 90, + -124, + -112, + 11, + 1, + 6, + 1, + 23, + 31, + 18, + 0, + 40, + 16, + 16, + 1, + 1, + 121, + -128, + -112, + 11, + 56, + 96, + -47, + -108, + -113, + 96, + 2, + -80, + -113, + 112, + 8, + 111, + -113, + -128, + 0, + 40, + -113, + -112, + 0, + 36, + 0, + 16, + 56, + -96, + -31, + -82, + -113, + 96, + 2, + -64, + 0, + 6, + 0, + 0, + -113, + 0, + 0, + 0, + -113, + 16, + 0, + 0, + -113, + 32, + 5, + -96, + -125, + 48, + 8, + 111, + -113, + 64, + 0, + 1, + 21, + 67, + -121, + 65, + 2, + -49, + -113, + 64, + 0, + 1, + 25, + 52, + 2, + 17, + -113, + 64, + 0, + 1, + 21, + 67, + -121, + 65, + 2, + -49, + -113, + 64, + 0, + 1, + 25, + 52, + 2, + 17, + -113, + 64, + 0, + 1, + 21, + 67, + -121, + 65, + 2, + -49, + -113, + 64, + 0, + 1, + 25, + 52, + 2, + 17, + -113, + 64, + 0, + 1, + 21, + 67, + -121, + 65, + 2, + -49, + -113, + 64, + 0, + 1, + 25, + 52, + 2, + 17, + -113, + 64, + 0, + 1, + 21, + 67, + -121, + 65, + 2, + -49, + -113, + 64, + 0, + 1, + 25, + 52, + 2, + 17, + -113, + 64, + 0, + 1, + 21, + 67, + -121, + 65, + 2, + -49, + -113, + 64, + 0, + 1, + 25, + 52, + 2, + 17, + -113, + 64, + 0, + 1, + 21, + 67, + -121, + 65, + 2, + -49, + -113, + 64, + 0, + 1, + 25, + 52, + 2, + 17, + -113, + 64, + 0, + 1, + 21, + 67, + -121, + 65, + 2, + -49, + -113, + 64, + 0, + 1, + 25, + 52, + 2, + 17, + 2, + 1, + 52, + 18, + -31, + -70, + -113, + 96, + 2, + -49, + -113, + 112, + 8, + 111, + -113, + -128, + 5, + -96, + 0, + 64, + -112, + 11, + 0, + 48, + 32, + -67, + 4, + 96, + 4, + 112, + 15, + -1, + 32, + 109, + -113, + -128, + 8, + 111, + -15, + 68, + 56, + -96, + -46, + 126, + 4, + 99, + -62, + -128, + 4, + 96, + 0, + 59, + 33, + 109, + 31, + 98, + 0, + 4, + 31, + 114, + 0, + 4, + 4, + -124, + 4, + -108, + 0, + 52, + 31, + 99, + 0, + 4, + 31, + 115, + 0, + 4, + 2, + 97, + 31, + 100, + 0, + 40, + -30, + 110, + 2, + 113, + 31, + 116, + 0, + 36, + -30, + 108, + 0, + 53, + 33, + -67, + -112, + 11 +).toByteArray() +val lifeData: ByteArray = arrayOf( + 47, + 100, + 97, + 116, + 97, + 47, + 103, + 117, + 110, + 46, + 99, + 101, + 108, + 108, + 115, + 0, + 70, + 73, + 76, + 69, + 32, + 78, + 79, + 84, + 32, + 70, + 79, + 85, + 78, + 68, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 +).toByteArray() diff --git a/src/jsMain/kotlin/mtmc/Main.kt b/src/jsMain/kotlin/mtmc/Main.kt index cd2030d..d3e0436 100644 --- a/src/jsMain/kotlin/mtmc/Main.kt +++ b/src/jsMain/kotlin/mtmc/Main.kt @@ -10,4825 +10,8 @@ val computer = MonTanaMiniComputer() val mainView = MTMCView(computer) val display = DisplayView(computer) - -private val snakeCode: ByteArray = arrayOf( - -128, - 0, - 3, - -94, - -128, - 16, - 3, - -92, - -122, - 0, - 3, - -66, - -122, - 16, - 4, - 14, - -16, - 36, - -15, - 6, - -15, - -120, - -14, - -114, - -15, - 78, - -15, - -24, - -14, - -42, - -13, - 58, - -64, - 18, - 0, - 0, - 32, - -67, - -113, - 96, - 5, - -96, - -13, - -110, - -124, - -96, - 3, - -96, - -128, - 0, - 3, - -94, - -128, - 16, - 3, - -92, - -124, - 0, - 3, - -90, - -124, - 16, - 3, - -88, - -122, - 0, - 3, - -66, - -122, - 16, - 4, - 14, - -16, - 82, - -16, - 124, - -14, - -8, - 33, - -67, - -112, - 11, - 32, - -67, - -128, - 0, - 3, - -86, - -128, - 16, - 3, - -84, - 1, - 32, - 18, - 33, - -113, - 48, - 0, - 0, - -113, - 64, - 0, - 0, - -128, - 80, - 3, - -96, - 16, - 83, - -121, - 69, - 0, - 0, - 2, - 49, - 52, - 50, - -32, - 104, - 33, - -67, - -112, - 11, - 32, - -67, - -128, - 0, - 3, - -86, - -128, - 16, - 3, - -84, - -113, - 48, - 0, - 0, - -113, - 64, - 0, - 1, - -128, - 80, - 3, - -96, - 16, - 83, - -121, - 69, - 0, - 0, - 2, - 49, - 52, - 48, - -32, - -114, - -113, - 48, - 0, - 0, - -113, - 64, - 0, - 1, - -128, - 80, - 3, - -96, - 16, - 83, - -121, - 69, - 5, - 120, - 2, - 49, - 52, - 48, - -32, - -90, - -113, - 48, - 0, - 0, - -113, - 64, - 0, - 1, - -113, - 80, - 0, - 0, - -128, - 0, - 3, - -96, - 16, - 5, - -121, - 64, - 0, - 0, - -128, - 0, - 3, - -86, - -128, - 16, - 3, - -84, - 2, - 49, - 16, - 80, - 52, - 49, - -32, - -62, - -113, - 48, - 0, - 0, - -113, - 64, - 0, - 1, - -113, - 80, - 0, - 39, - -128, - 0, - 3, - -96, - 16, - 5, - -121, - 64, - 0, - 0, - -128, - 0, - 3, - -86, - -128, - 16, - 3, - -84, - 2, - 49, - 16, - 80, - 52, - 49, - -32, - -24, - 33, - -67, - -112, - 11, - 32, - -67, - -128, - 0, - 3, - -76, - -128, - 16, - 3, - -74, - -113, - 32, - 0, - 0, - -128, - 48, - 3, - -72, - -125, - 96, - 3, - -66, - -125, - 112, - 4, - 14, - -128, - -128, - 3, - -86, - -128, - -112, - 3, - -84, - 1, - 72, - 18, - 71, - 16, - 70, - 32, - 13, - -128, - 0, - 3, - -96, - 16, - 4, - -113, - 80, - 0, - 1, - -121, - 80, - 0, - 0, - 33, - 13, - 2, - 1, - 20, - 3, - 2, - 33, - 52, - 33, - -31, - 24, - 33, - -67, - -112, - 11, - 32, - -67, - -128, - 0, - 3, - -74, - -128, - 16, - 3, - -68, - 52, - 1, - -31, - -124, - -128, - 80, - 3, - -76, - -125, - 5, - 3, - -66, - -125, - 21, - 4, - 14, - -128, - 32, - 3, - -86, - -128, - 48, - 3, - -84, - 1, - 65, - 18, - 66, - 16, - 64, - -128, - 0, - 3, - -96, - 16, - 4, - -113, - 80, - 0, - 0, - -121, - 80, - 0, - 0, - 33, - -67, - -112, - 11, - 32, - -67, - 0, - 48, - -128, - 0, - 3, - -86, - -128, - 16, - 3, - -84, - -113, - 32, - 0, - 0, - -113, - 48, - 0, - 4, - -113, - -128, - 0, - 4, - -113, - -112, - 0, - 4, - 1, - 80, - 18, - 81, - -128, - 0, - 3, - -86, - 1, - 98, - 20, - 96, - 18, - 99, - 1, - 114, - 19, - 112, - 18, - 115, - -128, - 16, - 3, - -96, - 16, - 18, - -125, - 65, - 0, - 0, - 56, - 65, - -47, - -56, - 0, - 52, - 2, - 33, - 52, - 37, - -31, - -88, - -113, - 96, - 0, - 1, - 0, - 59, - -128, - 96, - 4, - 94, - -128, - 112, - 4, - 96, - 18, - 99, - 18, - 115, - 0, - 52, - 0, - 53, - 33, - -67, - -112, - 11, - 32, - -67, - -128, - 0, - 3, - -90, - -128, - 16, - 3, - -88, - -128, - 80, - 3, - -80, - -128, - 64, - 3, - -104, - 21, - 69, - 57, - 64, - -46, - 4, - 3, - 17, - -62, - 46, - -128, - 64, - 3, - -102, - 21, - 69, - 57, - 64, - -46, - 18, - 2, - 17, - -62, - 46, - -128, - 64, - 3, - -100, - 21, - 69, - 57, - 64, - -46, - 32, - 3, - 1, - -62, - 46, - -128, - 64, - 3, - -98, - 21, - 69, - 57, - 64, - -46, - 46, - 2, - 1, - -62, - 46, - -124, - 0, - 3, - -90, - -124, - 16, - 3, - -88, - -128, - 32, - 3, - -76, - -128, - 48, - 3, - -74, - -128, - 64, - 3, - -72, - 16, - 35, - 20, - 36, - -121, - 2, - 3, - -66, - -121, - 18, - 4, - 14, - -128, - 64, - 3, - -68, - 52, - 52, - -46, - 94, - 2, - 49, - -124, - 48, - 3, - -74, - -62, - 110, - -128, - 32, - 3, - -76, - -128, - 48, - 3, - -72, - 2, - 33, - 20, - 35, - -124, - 32, - 3, - -76, - -128, - 32, - 3, - -86, - -128, - 48, - 3, - -84, - 1, - 65, - 18, - 66, - 16, - 64, - -128, - 16, - 3, - -96, - 16, - 20, - -125, - 81, - 0, - 0, - -124, - 80, - 3, - -78, - 33, - -67, - -112, - 11, - 32, - -67, - -128, - 96, - 3, - -82, - 0, - 34, - 0, - 58, - 1, - 42, - -128, - 48, - 3, - -104, - 21, - 50, - 57, - 48, - -30, - -60, - -128, - 48, - 3, - -102, - 21, - 50, - 57, - 48, - -30, - -60, - -128, - 48, - 3, - -100, - 21, - 50, - 57, - 48, - -30, - -60, - -128, - 48, - 3, - -98, - 21, - 50, - 57, - 48, - -30, - -60, - -62, - -56, - -124, - 48, - 3, - -80, - -128, - 96, - 0, - 0, - 0, - 34, - 56, - -96, - -46, - -106, - 33, - -67, - -112, - 11, - 32, - -67, - -128, - 0, - 3, - -78, - 56, - 1, - -30, - -28, - 33, - -67, - -112, - 11, - -113, - 96, - 4, - 98, - 0, - 6, - -113, - 96, - 4, - -124, - 0, - 6, - -113, - 96, - 4, - 98, - 0, - 6, - 0, - 0, - 32, - -67, - -128, - 96, - 0, - 1, - -128, - 112, - 3, - -86, - 3, - 113, - 0, - 32, - 1, - 10, - -128, - 96, - 0, - 1, - -128, - 112, - 3, - -84, - 3, - 113, - 0, - 32, - 1, - 26, - -128, - 32, - 3, - -86, - 1, - 65, - 18, - 66, - 16, - 64, - -128, - 48, - 3, - -96, - 16, - 52, - -125, - 83, - 0, - 0, - 56, - 81, - -30, - -6, - -124, - 0, - 4, - 94, - -124, - 16, - 4, - 96, - 33, - -67, - -112, - 11, - 32, - -67, - -128, - 0, - 3, - -90, - -128, - 16, - 3, - -88, - -128, - 32, - 4, - 94, - -128, - 48, - 4, - 96, - 48, - 2, - -45, - -114, - 48, - 19, - -45, - -114, - -14, - -8, - -128, - 0, - 3, - -68, - -128, - 16, - 3, - -72, - 52, - 1, - -45, - -114, - -128, - 64, - 3, - -70, - -113, - 80, - 0, - 0, - 52, - 1, - -45, - -114, - 2, - 1, - -124, - 0, - 3, - -68, - 2, - 81, - 52, - 84, - -29, - 106, - 2, - 65, - -124, - 64, - 3, - -70, - -128, - 0, - 3, - -82, - -113, - 16, - 0, - 10, - 17, - 1, - -124, - 0, - 3, - -82, - 33, - -67, - -112, - 11, - 1, - -82, - 16, - -26, - -112, - 11 -).toByteArray() -private val snakeData: ByteArray = arrayOf( - 0, - -128, - 0, - 64, - 0, - 32, - 0, - 16, - -1, - -1, - 0, - 20, - 0, - 18, - 0, - 20, - 0, - 18, - 0, - 40, - 0, - 36, - 0, - -56, - 0, - -128, - 0, - 0, - 0, - 0, - 0, - 1, - 0, - 80, - 0, - 1, - 0, - 3, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 45, - 45, - 45, - 45, - 45, - 45, - 45, - 45, - 45, - 45, - 45, - 45, - 45, - 45, - 45, - 45, - 45, - 45, - 45, - 45, - 45, - 45, - 45, - 45, - 45, - 45, - 45, - 45, - 45, - 45, - 45, - 45, - 10, - 0, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 32, - 42, - 42, - 67, - 82, - 65, - 83, - 72, - 42, - 42, - 10, - 32, - 32, - 71, - 97, - 109, - 101, - 32, - 111, - 118, - 101, - 114, - 44, - 32, - 109, - 97, - 110, - 46, - 32, - 71, - 97, - 109, - 101, - 32, - 79, - 118, - 101, - 114, - 33, - 10, - 0, - 32, - 0 -).toByteArray() - -private val lifeCode: ByteArray = arrayOf( - -15, - -116, - -14, - 100, - -16, - 10, - -64, - 2, - 0, - 0, - 32, - -67, - -113, - 96, - 8, - 111, - -113, - 112, - 2, - -49, - -113, - -128, - 5, - -96, - 0, - 64, - 4, - 96, - 4, - 112, - 15, - -1, - -113, - -112, - 2, - -49, - -15, - 68, - 1, - -118, - 32, - -115, - -16, - 70, - 33, - -115, - 1, - -102, - -16, - -86, - 2, - 97, - 31, - 100, - 0, - 40, - -32, - 32, - 2, - 113, - 31, - 116, - 0, - 36, - -32, - 30, - 33, - -67, - -112, - 11, - 32, - -67, - 4, - 0, - 3, - 97, - 3, - 113, - -113, - -128, - 2, - -49, - -15, - 68, - 16, - 10, - 2, - 97, - -113, - -128, - 2, - -49, - -15, - 68, - 16, - 10, - 2, - 97, - -113, - -128, - 2, - -49, - -15, - 68, - 16, - 10, - 3, - 98, - 2, - 113, - -113, - -128, - 2, - -49, - -15, - 68, - 16, - 10, - 2, - 98, - -113, - -128, - 2, - -49, - -15, - 68, - 16, - 10, - 3, - 98, - 2, - 113, - -113, - -128, - 2, - -49, - -15, - 68, - 16, - 10, - 2, - 97, - -113, - -128, - 2, - -49, - -15, - 68, - 16, - 10, - 2, - 97, - -113, - -128, - 2, - -49, - -15, - 68, - 3, - 97, - 3, - 113, - 16, - 10, - 1, - -96, - 33, - -67, - -112, - 11, - 32, - -67, - 4, - 0, - 56, - -128, - -48, - -70, - 56, - -109, - -48, - -60, - 4, - 1, - -64, - -60, - 58, - -111, - -48, - -60, - 60, - -108, - -48, - -60, - 4, - 1, - -113, - -128, - 8, - 111, - 1, - -112, - -15, - 124, - 33, - -67, - -112, - 11, - 60, - 96, - -48, - -40, - 4, - -96, - -112, - 11, - -113, - -96, - 0, - 39, - 50, - 106, - -48, - -28, - 4, - -96, - -112, - 11, - 60, - 112, - -48, - -20, - 4, - -96, - -112, - 11, - -113, - -96, - 0, - 35, - 50, - 122, - -48, - -8, - 4, - -96, - -112, - 11, - 1, - 70, - 1, - 87, - 31, - 82, - 0, - 40, - 16, - 84, - 1, - 69, - 31, - 67, - 0, - 8, - 31, - 84, - 0, - 8, - 90, - -124, - 4, - 65, - 24, - 69, - 21, - -92, - 29, - -96, - 29, - -96, - -112, - 11, - 1, - 6, - 1, - 23, - 31, - 18, - 0, - 40, - 16, - 16, - 1, - 1, - 31, - 3, - 0, - 8, - 31, - 20, - 0, - 8, - 82, - -128, - 4, - 49, - 24, - 49, - 56, - -111, - -47, - 60, - 22, - 35, - -63, - 64, - 28, - 48, - 21, - 35, - 114, - -128, - -112, - 11, - 60, - 96, - -47, - 76, - 4, - -96, - -112, - 11, - -113, - -96, - 0, - 39, - 50, - 106, - -47, - 88, - 4, - -96, - -112, - 11, - 60, - 112, - -47, - 96, - 4, - -96, - -112, - 11, - -113, - -96, - 0, - 35, - 50, - 122, - -47, - 108, - 4, - -96, - -112, - 11, - 1, - 70, - 1, - 87, - 31, - 82, - 0, - 40, - 16, - 84, - 1, - 69, - 90, - -124, - -112, - 11, - 1, - 6, - 1, - 23, - 31, - 18, - 0, - 40, - 16, - 16, - 1, - 1, - 121, - -128, - -112, - 11, - 56, - 96, - -47, - -108, - -113, - 96, - 2, - -80, - -113, - 112, - 8, - 111, - -113, - -128, - 0, - 40, - -113, - -112, - 0, - 36, - 0, - 16, - 56, - -96, - -31, - -82, - -113, - 96, - 2, - -64, - 0, - 6, - 0, - 0, - -113, - 0, - 0, - 0, - -113, - 16, - 0, - 0, - -113, - 32, - 5, - -96, - -125, - 48, - 8, - 111, - -113, - 64, - 0, - 1, - 21, - 67, - -121, - 65, - 2, - -49, - -113, - 64, - 0, - 1, - 25, - 52, - 2, - 17, - -113, - 64, - 0, - 1, - 21, - 67, - -121, - 65, - 2, - -49, - -113, - 64, - 0, - 1, - 25, - 52, - 2, - 17, - -113, - 64, - 0, - 1, - 21, - 67, - -121, - 65, - 2, - -49, - -113, - 64, - 0, - 1, - 25, - 52, - 2, - 17, - -113, - 64, - 0, - 1, - 21, - 67, - -121, - 65, - 2, - -49, - -113, - 64, - 0, - 1, - 25, - 52, - 2, - 17, - -113, - 64, - 0, - 1, - 21, - 67, - -121, - 65, - 2, - -49, - -113, - 64, - 0, - 1, - 25, - 52, - 2, - 17, - -113, - 64, - 0, - 1, - 21, - 67, - -121, - 65, - 2, - -49, - -113, - 64, - 0, - 1, - 25, - 52, - 2, - 17, - -113, - 64, - 0, - 1, - 21, - 67, - -121, - 65, - 2, - -49, - -113, - 64, - 0, - 1, - 25, - 52, - 2, - 17, - -113, - 64, - 0, - 1, - 21, - 67, - -121, - 65, - 2, - -49, - -113, - 64, - 0, - 1, - 25, - 52, - 2, - 17, - 2, - 1, - 52, - 18, - -31, - -70, - -113, - 96, - 2, - -49, - -113, - 112, - 8, - 111, - -113, - -128, - 5, - -96, - 0, - 64, - -112, - 11, - 0, - 48, - 32, - -67, - 4, - 96, - 4, - 112, - 15, - -1, - 32, - 109, - -113, - -128, - 8, - 111, - -15, - 68, - 56, - -96, - -46, - 126, - 4, - 99, - -62, - -128, - 4, - 96, - 0, - 59, - 33, - 109, - 31, - 98, - 0, - 4, - 31, - 114, - 0, - 4, - 4, - -124, - 4, - -108, - 0, - 52, - 31, - 99, - 0, - 4, - 31, - 115, - 0, - 4, - 2, - 97, - 31, - 100, - 0, - 40, - -30, - 110, - 2, - 113, - 31, - 116, - 0, - 36, - -30, - 108, - 0, - 53, - 33, - -67, - -112, - 11 -).toByteArray() -private val lifeData: ByteArray = arrayOf( - 47, - 100, - 97, - 116, - 97, - 47, - 103, - 117, - 110, - 46, - 99, - 101, - 108, - 108, - 115, - 0, - 70, - 73, - 76, - 69, - 32, - 78, - 79, - 84, - 32, - 70, - 79, - 85, - 78, - 68, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 -).toByteArray() - fun main() { - computer.speed = 1 // default to 1hz + computer.speed = 2000000 // default to 1hz computer.load(lifeCode, lifeData) Komponent.create(document.body!!, mainView) diff --git a/src/jsMain/kotlin/mtmc/emulator/BufferedImage.js.kt b/src/jsMain/kotlin/mtmc/emulator/BufferedImage.js.kt index ecc5dfc..d57d0f4 100644 --- a/src/jsMain/kotlin/mtmc/emulator/BufferedImage.js.kt +++ b/src/jsMain/kotlin/mtmc/emulator/BufferedImage.js.kt @@ -1,5 +1,12 @@ package mtmc.emulator +import kotlinx.browser.document +import org.khronos.webgl.get +import org.khronos.webgl.set +import org.w3c.dom.CanvasRenderingContext2D +import org.w3c.dom.HTMLCanvasElement +import org.w3c.dom.ImageData + actual fun createBufferedImage( width: Int, height: Int @@ -25,10 +32,44 @@ class BufferedImageImpl( check(x in 0 until width && y in 0 until height) val offset = (x + y * width) * 4 - display[offset + 0] = intVal.toByte() + display[offset + 0] = (intVal shr 16).toByte() display[offset + 1] = (intVal shr 8).toByte() - display[offset + 2] = (intVal shr 16).toByte() + display[offset + 2] = intVal.toByte() display[offset + 3] = 255.toByte() } } +class BufferedImageData( + val imageData: ImageData, +) : BufferedImage { + override val width: Int = imageData.width + override val height: Int = imageData.height + + override fun getRGB(x: Int, y: Int): Int { + check(x in 0 until width && y in 0 until height) + + val offset = (x * 4 + y * width * 4) + val display = imageData.data + return (display[offset + 0].toInt() and 0xff) shl 16 + + (display[offset + 1].toInt() and 0xff) shl 8 + + (display[offset + 2].toInt() and 0xff) + } + + override fun setRGB(x: Int, y: Int, intVal: Int) { + check(x in 0 until width && y in 0 until height) + + val offset = (x * 4 + y * width * 4) + val display = imageData.data + display[offset + 0] = ((intVal shr 16) and 0xff).toShort().asDynamic() + display[offset + 1] = ((intVal shr 8) and 0xff).toShort().asDynamic() + display[offset + 2] = (intVal and 0xff).toShort().asDynamic() + display[offset + 3] = 255.toShort().asDynamic() + } +} + +val canvas = document.createElement("canvas") as HTMLCanvasElement +val ctx = canvas.getContext("2d") as CanvasRenderingContext2D + +actual fun createCanvasImage(width: Int, height: Int): BufferedImage { + return BufferedImageData(ctx.createImageData(width.toDouble(), height.toDouble())); +} diff --git a/src/jsMain/kotlin/mtmc/util/PlatformSpecific.js.kt b/src/jsMain/kotlin/mtmc/util/PlatformSpecific.js.kt index f1e0683..1d9563d 100644 --- a/src/jsMain/kotlin/mtmc/util/PlatformSpecific.js.kt +++ b/src/jsMain/kotlin/mtmc/util/PlatformSpecific.js.kt @@ -1,6 +1,7 @@ package mtmc.util import kotlinx.browser.window +import mtmc.display import mtmc.mainView import kotlin.js.Date @@ -11,8 +12,9 @@ actual fun requestAnimationFrame(action: (Double) -> Unit) { window.requestAnimationFrame { action(it) - mainView.registerView.requestUpdate() + display.requestUpdate() if (currentTimeMillis() - lastMemoryUpdate > 100) { + mainView.registerView.requestUpdate() mainView.memoryView.requestUpdate() lastMemoryUpdate = currentTimeMillis() } diff --git a/src/jsMain/kotlin/mtmc/view/ConsoleView.kt b/src/jsMain/kotlin/mtmc/view/ConsoleView.kt index 0c6d7f1..26c7cc4 100644 --- a/src/jsMain/kotlin/mtmc/view/ConsoleView.kt +++ b/src/jsMain/kotlin/mtmc/view/ConsoleView.kt @@ -6,6 +6,7 @@ import kotlinx.html.input import kotlinx.html.js.onClickFunction import kotlinx.html.js.onKeyUpFunction import kotlinx.html.span +import mtmc.display import mtmc.emulator.MonTanaMiniComputer import mtmc.mainView import mtmc.os.shell.Shell @@ -65,7 +66,10 @@ class ConsoleView( Shell.execCommand(input, computer) input = "" - mainView.requestUpdate() + mainView.registerView.requestUpdate() + mainView.memoryView.requestUpdate() + display.requestUpdate() + requestUpdate() } } diff --git a/src/jsMain/kotlin/mtmc/view/DisplayView.kt b/src/jsMain/kotlin/mtmc/view/DisplayView.kt index a9e7076..0e38338 100644 --- a/src/jsMain/kotlin/mtmc/view/DisplayView.kt +++ b/src/jsMain/kotlin/mtmc/view/DisplayView.kt @@ -3,13 +3,13 @@ package mtmc.view import kotlinx.html.canvas import kotlinx.html.div import mtmc.display +import mtmc.emulator.BufferedImageData import mtmc.emulator.MonTanaMiniComputer import nl.astraeus.komp.HtmlBuilder import nl.astraeus.komp.Komponent import nl.astraeus.komp.currentElement import org.w3c.dom.CanvasRenderingContext2D import org.w3c.dom.HTMLCanvasElement -import org.w3c.dom.ImageData class DiplayControlView( val computer: MonTanaMiniComputer @@ -26,7 +26,6 @@ class DisplayView( val computer: MonTanaMiniComputer ) : Komponent() { var ctx: CanvasRenderingContext2D? = null - var imageData: ImageData? = null override fun HtmlBuilder.render() { canvas("display-canvas") { @@ -37,16 +36,16 @@ class DisplayView( ctx = cv?.getContext("2d")?.unsafeCast() - ctx?.fillStyle = "#404040" + ctx?.fillStyle = "#400040" ctx?.fillRect(0.0, 0.0, 160.0, 144.0) - imageData = ctx?.getImageData(0.0, 0.0, 160.0, 144.0) } } override fun renderUpdate() { // move data to canvas - imageData?.let { id -> - ctx?.putImageData(id, 0.0, 0.0) + val buffer = computer.display.buffer + if (buffer is BufferedImageData) { + ctx?.putImageData(buffer.imageData, 0.0, 0.0) } } } diff --git a/src/jvmMain/kotlin/mtmc/emulator/BufferedImage.jvm.kt b/src/jvmMain/kotlin/mtmc/emulator/BufferedImage.jvm.kt index 2abb527..846cc33 100644 --- a/src/jvmMain/kotlin/mtmc/emulator/BufferedImage.jvm.kt +++ b/src/jvmMain/kotlin/mtmc/emulator/BufferedImage.jvm.kt @@ -2,4 +2,8 @@ package mtmc.emulator actual fun createBufferedImage(width: Int, height: Int): BufferedImage { TODO("Not yet implemented") +} + +actual fun createCanvasImage(width: Int, height: Int): BufferedImage { + TODO("Not yet implemented") } \ No newline at end of file diff --git a/src/jvmMain/kotlin/mtmc/util/PlatformSpecific.jvm.kt b/src/jvmMain/kotlin/mtmc/util/PlatformSpecific.jvm.kt index 39e911a..24b9fbb 100644 --- a/src/jvmMain/kotlin/mtmc/util/PlatformSpecific.jvm.kt +++ b/src/jvmMain/kotlin/mtmc/util/PlatformSpecific.jvm.kt @@ -5,4 +5,4 @@ actual fun requestAnimationFrame(action: (Double) -> Unit) { error("requestAnimationFrame is not supported on JVM") } -actual fun immediateTimeout(action: (Double) -> Unit): Int {} \ No newline at end of file +actual fun immediateTimeout(action: (Double) -> Unit): Int = 0 \ No newline at end of file