From 0e5c200556d8799f5384bca34b6e321ddd923aa4 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Thu, 22 Oct 2020 16:28:35 +0900 Subject: [PATCH] working multiblock transfer (kinda) --- assets/JS_INIT.js | 9 +++++ assets/serialtest.js | 4 +-- src/net/torvald/tsvm/SerialHelper.kt | 15 ++++---- src/net/torvald/tsvm/VMRunnerFactory.kt | 2 ++ src/net/torvald/tsvm/peripheral/IOSpace.kt | 6 ++-- .../torvald/tsvm/peripheral/TestDiskDrive.kt | 4 +-- .../tsvm/peripheral/TestFunctionGenerator.kt | 34 ++++++++----------- 7 files changed, 39 insertions(+), 35 deletions(-) diff --git a/assets/JS_INIT.js b/assets/JS_INIT.js index 99e015b..405c229 100644 --- a/assets/JS_INIT.js +++ b/assets/JS_INIT.js @@ -272,6 +272,15 @@ if ('function' !== typeof Array.prototype.reduceRight) { load = undefined loadWithNewGlobal = undefined +// +function javaArrayToJs(jarr) { + if (!jarr.toString.startsWith("[")) return jarr; + var arr = []; + for (var k = 0; k < jarr.length; k++) { + arr.push(jarr[k]); + } + return arr; +} // standard print functions function print(s) { sys.print(s); diff --git a/assets/serialtest.js b/assets/serialtest.js index 70dfff8..eefd4ce 100644 --- a/assets/serialtest.js +++ b/assets/serialtest.js @@ -1,12 +1,12 @@ var ba = com.sendMessageGetBytes(0, [0x44,0x45,0x56,0x4e,0x41,0x4d,0x17]); serial.println(ba); -for (let k = 0; k < 4096; k++) { +for (let k = 0; k < ba.length; k++) { serial.print(String.fromCharCode(ba[k])); } serial.print("\n"); ba = com.pullMessage(0) -for (let k = 0; k < 4096; k++) { +for (let k = 0; k < ba.length; k++) { serial.print(String.fromCharCode(ba[k])); } serial.print("\n"); diff --git a/src/net/torvald/tsvm/SerialHelper.kt b/src/net/torvald/tsvm/SerialHelper.kt index 22e8e7a..9e1e0de 100644 --- a/src/net/torvald/tsvm/SerialHelper.kt +++ b/src/net/torvald/tsvm/SerialHelper.kt @@ -61,15 +61,11 @@ object SerialHelper { waitUntilReady(vm, portNo) val transStat = getBlockTransferStatus(vm, portNo) - val incomingMsg = ByteArray(transStat.first) - UnsafeHelper.memcpyRaw( - null, vm.getIO().blockTransferRx[portNo].ptr, - incomingMsg, UnsafeHelper.getArrayOffset(incomingMsg), - transStat.first.toLong() - ) + for (k in 0 until minOf(BLOCK_SIZE, transStat.first)) { + msgBuffer.write(vm.getIO().blockTransferRx[portNo][k.toLong()].toInt()) + } - msgBuffer.write(incomingMsg) } while (transStat.second) getReady(vm, portNo) @@ -122,8 +118,9 @@ object SerialHelper { private fun getBlockTransferStatus(vm: VM, portNo: Int): Pair { val bits = vm.getIO().mmio_read(4084L + (portNo * 2))!!.toUint() or (vm.getIO().mmio_read(4085L + (portNo * 2))!!.toUint() shl 8) - val rawcnt = bits.and(BLOCK_SIZE - 1) - return (if (rawcnt == 0) BLOCK_SIZE else rawcnt) to (bits < 0) + val rawcnt = bits.and(4095) + //FIXME return (if (rawcnt == 0) BLOCK_SIZE else rawcnt) to (bits < 0) + return (if (rawcnt == 0) BLOCK_SIZE else rawcnt) to (vm.getIO().blockTransferPorts[portNo].doYouHaveNext()) } diff --git a/src/net/torvald/tsvm/VMRunnerFactory.kt b/src/net/torvald/tsvm/VMRunnerFactory.kt index 310c5e7..21b0017 100644 --- a/src/net/torvald/tsvm/VMRunnerFactory.kt +++ b/src/net/torvald/tsvm/VMRunnerFactory.kt @@ -1,6 +1,8 @@ package net.torvald.tsvm import jdk.nashorn.api.scripting.NashornScriptEngineFactory +import jdk.nashorn.api.scripting.ScriptUtils +import jdk.nashorn.internal.runtime.regexp.joni.Syntax.Java import net.torvald.tsvm.peripheral.GraphicsAdapter import net.torvald.tsvm.vdc.Videotron2K import java.io.FileReader diff --git a/src/net/torvald/tsvm/peripheral/IOSpace.kt b/src/net/torvald/tsvm/peripheral/IOSpace.kt index 4b6778a..ed38f83 100644 --- a/src/net/torvald/tsvm/peripheral/IOSpace.kt +++ b/src/net/torvald/tsvm/peripheral/IOSpace.kt @@ -33,7 +33,7 @@ class IOSpace(val vm: VM) : PeriBase, InputProcessor { UnsafeHelper.allocate(4096), UnsafeHelper.allocate(4096) ) - private val blockTransferPorts = Array(4) { BlockTransferPort(vm, it) } + /*private*/ val blockTransferPorts = Array(4) { BlockTransferPort(vm, it) } private val keyEventBuffers = ByteArray(8) @@ -56,11 +56,11 @@ class IOSpace(val vm: VM) : PeriBase, InputProcessor { blockTransferPorts[portno].ready = bits.and(0b0000_0010) != 0.toByte() if (bits.and(0b0000_0100) != 0.toByte()) { if (blockTransferPorts[portno].getMode()) { - println("[IOSpace] startSend()") + //println("[IOSpace] startSend()") blockTransferPorts[portno].startSend() } else { - println("[IOSpace] startRead()") + //println("[IOSpace] startRead()") blockTransferPorts[portno].startRead() } } diff --git a/src/net/torvald/tsvm/peripheral/TestDiskDrive.kt b/src/net/torvald/tsvm/peripheral/TestDiskDrive.kt index 2e75643..7158412 100644 --- a/src/net/torvald/tsvm/peripheral/TestDiskDrive.kt +++ b/src/net/torvald/tsvm/peripheral/TestDiskDrive.kt @@ -79,7 +79,7 @@ class TestDiskDrive(private val driveNum: Int) : BlockTransferInterface(false, t override fun hasNext(): Boolean { - return (blockSendCount * BLOCK_SIZE <= blockSendBuffer.size) + return (blockSendCount * BLOCK_SIZE < blockSendBuffer.size) } /** Computer's attempt to startRead() will result in calling this very function. @@ -93,7 +93,7 @@ class TestDiskDrive(private val driveNum: Int) : BlockTransferInterface(false, t } recipient.writeout(ByteArray(BLOCK_SIZE) { - val i = (blockSendCount + 1) * BLOCK_SIZE + val i = blockSendCount * BLOCK_SIZE if (i + it >= blockSendBuffer.size) { 0.toByte() } diff --git a/src/net/torvald/tsvm/peripheral/TestFunctionGenerator.kt b/src/net/torvald/tsvm/peripheral/TestFunctionGenerator.kt index f757035..ac7ac66 100644 --- a/src/net/torvald/tsvm/peripheral/TestFunctionGenerator.kt +++ b/src/net/torvald/tsvm/peripheral/TestFunctionGenerator.kt @@ -84,8 +84,6 @@ Nunc mollis nibh vitae sapien consequat, ut vestibulum sem pharetra. Aliquam iac private var fileOpen = false - private var readModeLength = -1 - private var blockSendBuffer = ByteArray(1) private var blockSendCount = 0 @@ -102,8 +100,6 @@ Nunc mollis nibh vitae sapien consequat, ut vestibulum sem pharetra. Aliquam iac } override fun startSend() { - println("[TestFunctionGenerator] startSend()") - recipient?.let { recipient -> if (blockSendCount == 0) { //blockSendBuffer = messageComposeBuffer.toByteArray() @@ -111,7 +107,7 @@ Nunc mollis nibh vitae sapien consequat, ut vestibulum sem pharetra. Aliquam iac } recipient.writeout(ByteArray(BLOCK_SIZE) { - val i = (blockSendCount + 1) * BLOCK_SIZE + val i = blockSendCount * BLOCK_SIZE if (i + it >= blockSendBuffer.size) { 0.toByte() } @@ -121,37 +117,37 @@ Nunc mollis nibh vitae sapien consequat, ut vestibulum sem pharetra. Aliquam iac }) blockSendCount += 1 - } - println("[TestFunctionGenerator] startSend() end") + } } - override fun hasNext(): Boolean = false + override fun hasNext(): Boolean { + + return (blockSendCount * BLOCK_SIZE < blockSendBuffer.size) + } override fun writeout(inputData: ByteArray) { val inputString = inputData.toString(VM.CHARSET) - println("InputString: $inputString") - if (inputString.startsWith("DEVRST\u0017")) { - readModeLength = -1 fileOpen = false + blockSendCount = 0 } else if (inputString.startsWith("DEVTYP\u0017")) - startSend { it.writeout(composeSerialAns("STOR")) } - else if (inputString.startsWith("DEVNAM\u0017")) { - println("Device name?") - startSend { it.writeout(composeSerialAns("Testtec Virtual Disk Drive")) } - } + recipient?.writeout(composeSerialAns("STOR")) + else if (inputString.startsWith("DEVNAM\u0017")) + recipient?.writeout(composeSerialAns("Testtec Virtual Disk Drive")) else if (inputString.startsWith("OPENR\"")) fileOpen = true else if (inputString.startsWith("CLOSE")) fileOpen = false - else if (inputString.startsWith("READ")) - readModeLength = inputString.substring(4 until inputString.length).toInt() + //else if (inputString.startsWith("READ")) + // readModeLength = inputString.substring(4 until inputString.length).toInt() else if (inputString.startsWith("LIST")) - startSend { it.writeout("\"LOREM.TXT\" TXT\nTotal 1 files on the disk".toByteArray()) } + recipient?.writeout("\"LOREM.TXT\" TXT\nTotal 1 files on the disk".toByteArray()) + + blockSendCount = 0 } override fun setMode(sendmode: Boolean) {