From cf1430d9e990b5c0dac689830188f4960f3da618 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Wed, 21 Oct 2020 19:14:29 +0900 Subject: [PATCH] oh my --- src/net/torvald/tsvm/FilesystemDelegate.kt | 9 ++++++--- src/net/torvald/tsvm/SerialHelper.kt | 9 +++++---- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/net/torvald/tsvm/FilesystemDelegate.kt b/src/net/torvald/tsvm/FilesystemDelegate.kt index dd6d546..3c84b55 100644 --- a/src/net/torvald/tsvm/FilesystemDelegate.kt +++ b/src/net/torvald/tsvm/FilesystemDelegate.kt @@ -11,11 +11,13 @@ class VmFilesystemDelegate(val vm: VM, val portNo: Int) { class DiskDriveFileInputStream(vm: VM, portNo: Int, path: String) : InputStream() { - private val contents = SerialHelper.sendMessageGetBytes(vm, portNo, "OPENR\"$path\"".toByteArray(VM.CHARSET)) + private val contents: ByteArray private var readCursor = 0 init { - contents.toString() // meaningless statement to NOT lazy eval the property + SerialHelper.sendMessage(vm, portNo, "OPENR\"$path\"".toByteArray(VM.CHARSET)) + SerialHelper.waitUntilReady(vm, portNo) + contents = SerialHelper.sendMessageGetBytes(vm, portNo, "READ".toByteArray(VM.CHARSET)) } override fun markSupported() = true @@ -60,4 +62,5 @@ class DiskDriveFileInputStream(vm: VM, portNo: Int, path: String) : InputStream( override fun close() { TODO() } -} \ No newline at end of file +} + diff --git a/src/net/torvald/tsvm/SerialHelper.kt b/src/net/torvald/tsvm/SerialHelper.kt index 33adb4f..9042dd6 100644 --- a/src/net/torvald/tsvm/SerialHelper.kt +++ b/src/net/torvald/tsvm/SerialHelper.kt @@ -13,10 +13,7 @@ object SerialHelper { fun sendMessageGetBytes(vm: VM, portNo: Int, message: ByteArray): ByteArray { sendMessage(vm, portNo, message) - - // wait until it is ready - while (!checkIfDeviceIsReady(vm, portNo)) { Thread.sleep(SLEEP_TIME) } - + waitUntilReady(vm, portNo) return getMessage(vm, portNo) } @@ -55,6 +52,10 @@ object SerialHelper { return msgBuffer.toByteArray() } + fun waitUntilReady(vm: VM, portNo: Int) { + while (!checkIfDeviceIsReady(vm, portNo)) { Thread.sleep(SLEEP_TIME) } + } + private fun checkIfDeviceIsThere(vm: VM, portNo: Int) = (vm.getIO().mmio_read(4092L + portNo)!! and 1.toByte()) == 1.toByte()