From 73ae5ec252dceef64b42bd6d06d54986b7a1669b Mon Sep 17 00:00:00 2001 From: minjaesong Date: Fri, 15 May 2020 12:02:52 +0900 Subject: [PATCH] qnd input impl with slow spinning --- src/net/torvald/tsvm/VMGUI.kt | 7 ++---- src/net/torvald/tsvm/VMJSR223Delegate.kt | 1 + .../tsvm/peripheral/GraphicsAdapter.kt | 22 ++++++++++++++++++- src/net/torvald/tsvm/peripheral/IOSpace.kt | 6 +++-- 4 files changed, 28 insertions(+), 8 deletions(-) diff --git a/src/net/torvald/tsvm/VMGUI.kt b/src/net/torvald/tsvm/VMGUI.kt index 934c42f..33f31f4 100644 --- a/src/net/torvald/tsvm/VMGUI.kt +++ b/src/net/torvald/tsvm/VMGUI.kt @@ -46,7 +46,7 @@ class VMGUI(val appConfig: LwjglApplicationConfiguration) : ApplicationAdapter() vm.printStream = gpu.getPrintStream() vm.errorStream = gpu.getErrorStream() - //inputStream = gpu.getInputStream() + vm.inputStream = gpu.getInputStream() // TEST PRG vmRunner = VMRunnerFactory(vm, "js") @@ -267,10 +267,7 @@ println(""); print("C:\\\\>"); while (true) { - var mx = vm.peek(-33) + vm.peek(-34) * 256; - var my = vm.peek(-35) + vm.peek(-36) * 256; - println("mx: "+mx+", my: "+my); - graphics.plotPixel(mx, my, (mx + my) % 255); + print(String.fromCharCode(vm.readKey())); } """.trimIndent() diff --git a/src/net/torvald/tsvm/VMJSR223Delegate.kt b/src/net/torvald/tsvm/VMJSR223Delegate.kt index 5aad572..4e90a13 100644 --- a/src/net/torvald/tsvm/VMJSR223Delegate.kt +++ b/src/net/torvald/tsvm/VMJSR223Delegate.kt @@ -22,6 +22,7 @@ class VMJSR223Delegate(val vm: VM) { vm.printStream.write((s + '\n').toByteArray()) } + fun readKey() = vm.inputStream.read() } class VMSerialDebugger(val vm: VM) { diff --git a/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt b/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt index b0b62b1..8bc6556 100644 --- a/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt +++ b/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt @@ -413,7 +413,27 @@ class GraphicsAdapter(val vm: VM, val lcdMode: Boolean = false) : GlassTty(Compa } override fun getInputStream(): InputStream { - TODO("Not yet implemented") + try { + return INPUTSTREAM_INSTANCE + } + catch (e: UninitializedPropertyAccessException) { + INPUTSTREAM_INSTANCE = object : InputStream() { + + override fun read(): Int { + var key: Byte + do { + Thread.sleep(4L) // if spinning rate is too fast, this function fail. + // Possible cause: Input event handling of GDX is done on separate thread + key = vm.getIO().mmio_read(37L)!! + } while (key == (-1).toByte()) + + println("[stdin] key = $key") + return key.toInt().and(255) + } + } + + return INPUTSTREAM_INSTANCE + } } override fun dispose() { diff --git a/src/net/torvald/tsvm/peripheral/IOSpace.kt b/src/net/torvald/tsvm/peripheral/IOSpace.kt index 9f6a968..a83446d 100644 --- a/src/net/torvald/tsvm/peripheral/IOSpace.kt +++ b/src/net/torvald/tsvm/peripheral/IOSpace.kt @@ -67,8 +67,10 @@ class IOSpace(val vm: VM) : PeriBase, InputProcessor { } override fun keyTyped(p0: Char): Boolean { - keyboardBuffer.appendTail(p0.toByte()) - println("[IO] Key typed: $p0") + try { + keyboardBuffer.appendTail(p0.toByte()) + } + catch (e: StackOverflowError) { /* if stack overflow, simply stop reading more keys */ } return true }