diff --git a/tsvm_core/src/net/torvald/tsvm/peripheral/BlockTransferInterface.kt b/tsvm_core/src/net/torvald/tsvm/peripheral/BlockTransferInterface.kt index 1865f63..cb3284d 100644 --- a/tsvm_core/src/net/torvald/tsvm/peripheral/BlockTransferInterface.kt +++ b/tsvm_core/src/net/torvald/tsvm/peripheral/BlockTransferInterface.kt @@ -1,18 +1,19 @@ package net.torvald.tsvm.peripheral import java.util.concurrent.atomic.AtomicBoolean +import java.util.concurrent.atomic.AtomicInteger abstract class BlockTransferInterface(val isMaster: Boolean, val isSlave: Boolean) { protected var recipient: BlockTransferInterface? = null - @Volatile val ready = AtomicBoolean(true) - @Volatile val busy = AtomicBoolean(false) + val ready = AtomicBoolean(true) + val busy = AtomicBoolean(false) - @Volatile var statusCode = 0 + val statusCode = AtomicInteger(0) protected var sendmode = false; private set - @Volatile var blockSize = 0 + val blockSize = AtomicInteger(0) open fun attachDevice(device: BlockTransferInterface?) { recipient = device @@ -33,7 +34,7 @@ abstract class BlockTransferInterface(val isMaster: Boolean, val isSlave: Boolea ready.setRelease(false) recipient?.let { - this.blockSize = startSendImpl(it) + this.blockSize.set(startSendImpl(it)) //println("[BlockTransferInterface.startSend()] recipients blocksize = ${this.blockSize}") } @@ -59,14 +60,14 @@ abstract class BlockTransferInterface(val isMaster: Boolean, val isSlave: Boolea fun writeout(inputData: ByteArray) { busy.setRelease(true) ready.setRelease(false) - blockSize = minOf(inputData.size, BLOCK_SIZE) + blockSize.setRelease(minOf(inputData.size, BLOCK_SIZE)) writeoutImpl(inputData) busy.setRelease(false) ready.setRelease(true) } abstract fun hasNext(): Boolean open fun doYouHaveNext(): Boolean = recipient?.hasNext() ?: false - open fun yourBlockSize(): Int = recipient?.blockSize ?: 0 + open fun yourBlockSize(): Int = recipient?.blockSize?.get() ?: 0 fun getYourStatusCode() = recipient?.statusCode ?: 0 diff --git a/tsvm_core/src/net/torvald/tsvm/peripheral/BlockTransferPort.kt b/tsvm_core/src/net/torvald/tsvm/peripheral/BlockTransferPort.kt index c7d8487..8e60a8a 100644 --- a/tsvm_core/src/net/torvald/tsvm/peripheral/BlockTransferPort.kt +++ b/tsvm_core/src/net/torvald/tsvm/peripheral/BlockTransferPort.kt @@ -2,20 +2,21 @@ package net.torvald.tsvm.peripheral import net.torvald.UnsafeHelper import net.torvald.tsvm.VM +import java.util.concurrent.atomic.AtomicBoolean /** * Implementation of single COM port */ class BlockTransferPort(val vm: VM, val portno: Int) : BlockTransferInterface(true, false) { - internal var hasNext = false + val hasNext = AtomicBoolean(false) override fun startSendImpl(recipient: BlockTransferInterface): Int { recipient.writeout(ByteArray(BLOCK_SIZE) { vm.getIO().blockTransferTx[portno][it.toLong()] }) - return blockSize // use MMIO to modify this variable + return blockSize.get() // use MMIO to modify this variable } - override fun hasNext(): Boolean = hasNext + override fun hasNext(): Boolean = hasNext.get() override fun writeoutImpl(inputData: ByteArray) { //val copySize = minOf(BLOCK_SIZE, inputData.size).toLong() diff --git a/tsvm_core/src/net/torvald/tsvm/peripheral/HttpModem.kt b/tsvm_core/src/net/torvald/tsvm/peripheral/HttpModem.kt index d9abc53..6034bae 100644 --- a/tsvm_core/src/net/torvald/tsvm/peripheral/HttpModem.kt +++ b/tsvm_core/src/net/torvald/tsvm/peripheral/HttpModem.kt @@ -40,7 +40,7 @@ class HttpModem(private val vm: VM, private val artificialDelayBlockSize: Int = init { - statusCode = TestDiskDrive.STATE_CODE_STANDBY + statusCode.set(TestDiskDrive.STATE_CODE_STANDBY) } override fun hasNext(): Boolean { @@ -105,17 +105,17 @@ class HttpModem(private val vm: VM, private val artificialDelayBlockSize: Int = if (inputString.startsWith("DEVRST\u0017")) { printdbg("Device Reset") selfReset() - statusCode = TestDiskDrive.STATE_CODE_STANDBY + statusCode.set(TestDiskDrive.STATE_CODE_STANDBY) } else if (inputString.startsWith("DEVSTU\u0017")) - recipient?.writeout(composePositiveAns("${statusCode.toChar()}", TestDiskDrive.errorMsgs[statusCode])) + recipient?.writeout(composePositiveAns("${statusCode.get().toChar()}", TestDiskDrive.errorMsgs[statusCode.get()])) else if (inputString.startsWith("DEVTYP\u0017")) recipient?.writeout(composePositiveAns("HTTP")) else if (inputString.startsWith("DEVNAM\u0017")) recipient?.writeout(composePositiveAns("Wget Company HTTP Modem")) else if (inputString.startsWith("GET ")) { if (cnxUrl != null) { - statusCode = TestDiskDrive.STATE_CODE_FILE_ALREADY_OPENED + statusCode.set(TestDiskDrive.STATE_CODE_FILE_ALREADY_OPENED) return } @@ -127,8 +127,8 @@ class HttpModem(private val vm: VM, private val artificialDelayBlockSize: Int = printdbg("URL: $cnxUrl") - this.ready = false - this.busy = true + this.ready.setRelease(false) + this.busy.setRelease(true) var httpIn: InputStream? = null var bufferedOut: OutputStream? = null @@ -156,14 +156,14 @@ class HttpModem(private val vm: VM, private val artificialDelayBlockSize: Int = catch (e: InterruptedException) {} } } - statusCode = TestDiskDrive.STATE_CODE_STANDBY + statusCode.set(TestDiskDrive.STATE_CODE_STANDBY) } catch (e: MalformedURLException) { - statusCode = STATE_CODE_NO_SUCH_FILE_EXISTS // MalformedUrl + statusCode.set(STATE_CODE_NO_SUCH_FILE_EXISTS) // MalformedUrl printdbg("Malformed URL: $cnxUrl") } catch (e: IOException) { - statusCode = STATE_CODE_SYSTEM_IO_ERROR // IoException + statusCode.set(STATE_CODE_SYSTEM_IO_ERROR) // IoException printdbg("IOException: $cnxUrl") } finally { @@ -173,7 +173,7 @@ class HttpModem(private val vm: VM, private val artificialDelayBlockSize: Int = httpIn?.close() } catch (e: IOException) { - statusCode = STATE_CODE_OPERATION_FAILED // UnableToCloseOutputStream + statusCode.set(STATE_CODE_OPERATION_FAILED) // UnableToCloseOutputStream printdbg("Unable to close: $cnxUrl") } finally { @@ -183,7 +183,7 @@ class HttpModem(private val vm: VM, private val artificialDelayBlockSize: Int = } } else - statusCode = TestDiskDrive.STATE_CODE_ILLEGAL_COMMAND + statusCode.set(TestDiskDrive.STATE_CODE_ILLEGAL_COMMAND) } diff --git a/tsvm_core/src/net/torvald/tsvm/peripheral/IOSpace.kt b/tsvm_core/src/net/torvald/tsvm/peripheral/IOSpace.kt index e6967af..82d2e11 100644 --- a/tsvm_core/src/net/torvald/tsvm/peripheral/IOSpace.kt +++ b/tsvm_core/src/net/torvald/tsvm/peripheral/IOSpace.kt @@ -56,14 +56,14 @@ class IOSpace(val vm: VM) : PeriBase, InputProcessor { return blockTransferPorts[portno].isMaster.toInt().shl(5) or blockTransferPorts[portno].isSlave.toInt().shl(4) or blockTransferPorts[portno].getMode().toInt().shl(3) or - blockTransferPorts[portno].busy.toInt().shl(2) or + blockTransferPorts[portno].busy.get().toInt().shl(2) or blockTransferPorts[portno].areYouReady().toInt().shl(1) or blockTransferPorts[portno].cableConnected().toInt() } private fun setBlockTransferPortStatus(portno: Int, bits: Byte) { blockTransferPorts[portno].setMode(bits.and(0b0000_1000) != 0.toByte()) - blockTransferPorts[portno].ready = bits.and(0b0000_0010) != 0.toByte() + blockTransferPorts[portno].ready.set(bits.and(0b0000_0010) != 0.toByte()) if (bits.and(0b0000_0100) != 0.toByte()) { if (blockTransferPorts[portno].getMode()) { //println("[IOSpace] startSend()") @@ -167,30 +167,42 @@ class IOSpace(val vm: VM) : PeriBase, InputProcessor { in 1024..2047 -> peripheralFast[addr - 1024] = byte - 4076L -> blockTransferPorts[0].statusCode = bi - 4077L -> blockTransferPorts[1].statusCode = bi - 4078L -> blockTransferPorts[2].statusCode = bi - 4079L -> blockTransferPorts[3].statusCode = bi + 4076L -> blockTransferPorts[0].statusCode.set(bi) + 4077L -> blockTransferPorts[1].statusCode.set(bi) + 4078L -> blockTransferPorts[2].statusCode.set(bi) + 4079L -> blockTransferPorts[3].statusCode.set(bi) - 4084L -> blockTransferPorts[0].blockSize = blockTransferPorts[0].blockSize.and(0xFF00) or byte.toInt().and(255) + 4084L -> + blockTransferPorts[0].blockSize.getAcquire().let { + blockTransferPorts[0].blockSize.setRelease(it.and(0xFF00) or byte.toInt().and(255)) } 4085L -> { - blockTransferPorts[0].hasNext = (byte < 0) - blockTransferPorts[0].blockSize = blockTransferPorts[0].blockSize.and(0x00FF) or byte.toInt().and(15) + blockTransferPorts[0].hasNext.set(byte < 0) + blockTransferPorts[0].blockSize.getAcquire().let { + blockTransferPorts[0].blockSize.setRelease(it.and(0x00FF) or byte.toInt().and(15)) } } - 4086L -> blockTransferPorts[1].blockSize = blockTransferPorts[1].blockSize.and(0xFF00) or byte.toInt().and(255) + + 4086L -> blockTransferPorts[1].blockSize.getAcquire().let { + blockTransferPorts[1].blockSize.setRelease(it.and(0xFF00) or byte.toInt().and(255)) } 4087L -> { - blockTransferPorts[1].hasNext = (byte < 0) - blockTransferPorts[1].blockSize = blockTransferPorts[1].blockSize.and(0x00FF) or byte.toInt().and(15) + blockTransferPorts[1].hasNext.set(byte < 0) + blockTransferPorts[1].blockSize.getAcquire().let { + blockTransferPorts[1].blockSize.setRelease(it.and(0x00FF) or byte.toInt().and(15)) } } - 4088L -> blockTransferPorts[2].blockSize = blockTransferPorts[2].blockSize.and(0xFF00) or byte.toInt().and(255) + + 4088L -> blockTransferPorts[2].blockSize.getAcquire().let { + blockTransferPorts[2].blockSize.setRelease(it.and(0xFF00) or byte.toInt().and(255)) } 4089L -> { - blockTransferPorts[2].hasNext = (byte < 0) - blockTransferPorts[2].blockSize = blockTransferPorts[2].blockSize.and(0x00FF) or byte.toInt().and(15) + blockTransferPorts[2].hasNext.set(byte < 0) + blockTransferPorts[2].blockSize.getAcquire().let { + blockTransferPorts[2].blockSize.setRelease(it.and(0x00FF) or byte.toInt().and(15)) } } - 4090L -> blockTransferPorts[3].blockSize = blockTransferPorts[3].blockSize.and(0xFF00) or byte.toInt().and(255) + + 4090L -> blockTransferPorts[3].blockSize.getAcquire().let { + blockTransferPorts[3].blockSize.setRelease(it.and(0xFF00) or byte.toInt().and(255)) } 4091L -> { - blockTransferPorts[3].hasNext = (byte < 0) - blockTransferPorts[3].blockSize = blockTransferPorts[3].blockSize.and(0x00FF) or byte.toInt().and(15) + blockTransferPorts[3].hasNext.set(byte < 0) + blockTransferPorts[3].blockSize.getAcquire().let { + blockTransferPorts[3].blockSize.setRelease(it.and(0x00FF) or byte.toInt().and(15)) } } in 4092..4095 -> setBlockTransferPortStatus(adi - 4092, byte) diff --git a/tsvm_core/src/net/torvald/tsvm/peripheral/TestDiskDrive.kt b/tsvm_core/src/net/torvald/tsvm/peripheral/TestDiskDrive.kt index a9d7db7..0185203 100644 --- a/tsvm_core/src/net/torvald/tsvm/peripheral/TestDiskDrive.kt +++ b/tsvm_core/src/net/torvald/tsvm/peripheral/TestDiskDrive.kt @@ -79,7 +79,7 @@ class TestDiskDrive(private val vm: VM, private val driveNum: Int, theRootPath: init { - statusCode = STATE_CODE_STANDBY + statusCode.set(STATE_CODE_STANDBY) if (!rootPath.exists()) { rootPath.mkdirs() @@ -160,12 +160,12 @@ class TestDiskDrive(private val vm: VM, private val driveNum: Int, theRootPath: fileOpenMode = -1 file = File(rootPath.toURI()) blockSendCount = 0 - statusCode = STATE_CODE_STANDBY + statusCode.set(STATE_CODE_STANDBY) writeMode = false writeModeLength = -1 } else if (inputString.startsWith("DEVSTU\u0017")) - recipient?.writeout(composePositiveAns("${statusCode.toChar()}", errorMsgs[statusCode])) + recipient?.writeout(composePositiveAns("${statusCode.get().toChar()}", errorMsgs[statusCode.get()])) else if (inputString.startsWith("DEVTYP\u0017")) recipient?.writeout(composePositiveAns("STOR")) else if (inputString.startsWith("DEVNAM\u0017")) @@ -173,7 +173,7 @@ class TestDiskDrive(private val vm: VM, private val driveNum: Int, theRootPath: else if (inputString.startsWith("OPENR\"") || inputString.startsWith("OPENW\"") || inputString.startsWith("OPENA\"")) { if (fileOpen) { - statusCode = STATE_CODE_FILE_ALREADY_OPENED + statusCode.set(STATE_CODE_FILE_ALREADY_OPENED) return } @@ -190,7 +190,7 @@ class TestDiskDrive(private val vm: VM, private val driveNum: Int, theRootPath: } // sanity check if path is actually enclosed with double-quote if (commaIndex != 6 && inputString[commaIndex - 1] != '"') { - statusCode = STATE_CODE_ILLEGAL_COMMAND + statusCode.set(STATE_CODE_ILLEGAL_COMMAND) return } val pathStr = inputString.substring(6, if (commaIndex == 6) inputString.lastIndex else commaIndex - 1) @@ -205,11 +205,11 @@ class TestDiskDrive(private val vm: VM, private val driveNum: Int, theRootPath: if (openMode == 'R' && !file.exists()) { printdbg("! file not found") - statusCode = STATE_CODE_NO_SUCH_FILE_EXISTS + statusCode.set(STATE_CODE_NO_SUCH_FILE_EXISTS) return } - statusCode = STATE_CODE_STANDBY + statusCode.set(STATE_CODE_STANDBY) fileOpen = true fileOpenMode = when (openMode) { 'W' -> 1 @@ -220,18 +220,18 @@ class TestDiskDrive(private val vm: VM, private val driveNum: Int, theRootPath: } else if (inputString.startsWith("DELETE")) { if (!fileOpen) { - statusCode = STATE_CODE_NO_FILE_OPENED + statusCode.set(STATE_CODE_NO_FILE_OPENED) return } try { file.delete() } catch (e: SecurityException) { - statusCode = STATE_CODE_SYSTEM_SECURITY_ERROR + statusCode.set(STATE_CODE_SYSTEM_SECURITY_ERROR) return } catch (e1: IOException) { - statusCode = STATE_CODE_SYSTEM_IO_ERROR + statusCode.set(STATE_CODE_SYSTEM_IO_ERROR) return } } @@ -239,7 +239,7 @@ class TestDiskDrive(private val vm: VM, private val driveNum: Int, theRootPath: // TODO temporary behaviour to ignore any arguments resetBuf() if (!fileOpen) { - statusCode = STATE_CODE_NO_FILE_OPENED + statusCode.set(STATE_CODE_NO_FILE_OPENED) return } try { @@ -250,19 +250,19 @@ class TestDiskDrive(private val vm: VM, private val driveNum: Int, theRootPath: messageComposeBuffer.write(lsfile.name.toByteArray(VM.CHARSET)) } - statusCode = STATE_CODE_STANDBY + statusCode.set(STATE_CODE_STANDBY) } else { - statusCode = STATE_CODE_NOT_A_DIRECTORY + statusCode.set(STATE_CODE_NOT_A_DIRECTORY) return } } catch (e: SecurityException) { - statusCode = STATE_CODE_SYSTEM_SECURITY_ERROR + statusCode.set(STATE_CODE_SYSTEM_SECURITY_ERROR) return } catch (e1: IOException) { - statusCode = STATE_CODE_SYSTEM_IO_ERROR + statusCode.set(STATE_CODE_SYSTEM_IO_ERROR) return } } @@ -270,28 +270,28 @@ class TestDiskDrive(private val vm: VM, private val driveNum: Int, theRootPath: // TODO temporary behaviour to ignore any arguments resetBuf() if (!fileOpen) { - statusCode = STATE_CODE_NO_FILE_OPENED + statusCode.set(STATE_CODE_NO_FILE_OPENED) return } messageComposeBuffer.write(getSizeStr().toByteArray(VM.CHARSET)) - statusCode = STATE_CODE_STANDBY + statusCode.set(STATE_CODE_STANDBY) } else if (inputString.startsWith("LIST")) { // TODO temporary behaviour to ignore any arguments resetBuf() if (!fileOpen) { - statusCode = STATE_CODE_NO_FILE_OPENED + statusCode.set(STATE_CODE_NO_FILE_OPENED) return } messageComposeBuffer.write(getReadableLs().toByteArray(VM.CHARSET)) - statusCode = STATE_CODE_STANDBY + statusCode.set(STATE_CODE_STANDBY) } else if (inputString.startsWith("CLOSE")) { fileOpen = false fileOpenMode = -1 - statusCode = STATE_CODE_STANDBY + statusCode.set(STATE_CODE_STANDBY) } else if (inputString.startsWith("READ")) { //readModeLength = inputString.substring(4 until inputString.length).toInt() @@ -300,14 +300,14 @@ class TestDiskDrive(private val vm: VM, private val driveNum: Int, theRootPath: if (file.isFile) { try { messageComposeBuffer.write(file.readBytes()) - statusCode = STATE_CODE_STANDBY + statusCode.set(STATE_CODE_STANDBY) } catch (e: IOException) { - statusCode = STATE_CODE_SYSTEM_IO_ERROR + statusCode.set(STATE_CODE_SYSTEM_IO_ERROR) } } else { - statusCode = STATE_CODE_OPERATION_NOT_PERMITTED + statusCode.set(STATE_CODE_OPERATION_NOT_PERMITTED) return } } @@ -324,7 +324,7 @@ class TestDiskDrive(private val vm: VM, private val driveNum: Int, theRootPath: val bootFile = File(rootPath, "!BOOTSEC") if (!bootFile.exists()) { - statusCode = STATE_CODE_NO_SUCH_FILE_EXISTS + statusCode.set(STATE_CODE_NO_SUCH_FILE_EXISTS) return } val fis = FileInputStream(bootFile) @@ -332,10 +332,10 @@ class TestDiskDrive(private val vm: VM, private val driveNum: Int, theRootPath: val retMsg = ByteArray(BLOCK_SIZE) fis.read(retMsg) recipient?.writeout(retMsg) - statusCode = STATE_CODE_STANDBY + statusCode.set(STATE_CODE_STANDBY) } catch (e: IOException) { - statusCode = STATE_CODE_SYSTEM_IO_ERROR + statusCode.set(STATE_CODE_SYSTEM_IO_ERROR) return } finally { @@ -344,70 +344,70 @@ class TestDiskDrive(private val vm: VM, private val driveNum: Int, theRootPath: } else if (inputString.startsWith("MKDIR")) { if (!fileOpen) { - statusCode = STATE_CODE_NO_FILE_OPENED + statusCode.set(STATE_CODE_NO_FILE_OPENED) return } if (fileOpenMode < 1) { - statusCode = STATE_CODE_OPERATION_NOT_PERMITTED + statusCode.set(STATE_CODE_OPERATION_NOT_PERMITTED) return } try { val status = file.mkdir() - statusCode = if (status) 0 else 1 + statusCode.set(if (status) 0 else 1) } catch (e: SecurityException) { - statusCode = STATE_CODE_SYSTEM_SECURITY_ERROR + statusCode.set(STATE_CODE_SYSTEM_SECURITY_ERROR) } } else if (inputString.startsWith("MKFILE")) { if (!fileOpen) { - statusCode = STATE_CODE_NO_FILE_OPENED + statusCode.set(STATE_CODE_NO_FILE_OPENED) return } if (fileOpenMode < 1) { - statusCode = STATE_CODE_OPERATION_NOT_PERMITTED + statusCode.set(STATE_CODE_OPERATION_NOT_PERMITTED) return } try { val f1 = file.createNewFile() - statusCode = if (f1) STATE_CODE_STANDBY else STATE_CODE_OPERATION_FAILED + statusCode.set(if (f1) STATE_CODE_STANDBY else STATE_CODE_OPERATION_FAILED) return } catch (e: IOException) { - statusCode = STATE_CODE_SYSTEM_IO_ERROR + statusCode.set(STATE_CODE_SYSTEM_IO_ERROR) } catch (e1: SecurityException) { - statusCode = STATE_CODE_SYSTEM_SECURITY_ERROR + statusCode.set(STATE_CODE_SYSTEM_SECURITY_ERROR) } } else if (inputString.startsWith("TOUCH")) { if (!fileOpen) { - statusCode = STATE_CODE_NO_FILE_OPENED + statusCode.set(STATE_CODE_NO_FILE_OPENED) return } if (fileOpenMode < 1) { - statusCode = STATE_CODE_OPERATION_NOT_PERMITTED + statusCode.set(STATE_CODE_OPERATION_NOT_PERMITTED) return } try { val f1 = file.setLastModified(vm.worldInterface.currentTimeInMills()) - statusCode = if (f1) STATE_CODE_STANDBY else STATE_CODE_OPERATION_FAILED + statusCode.set(if (f1) STATE_CODE_STANDBY else STATE_CODE_OPERATION_FAILED) return } catch (e: IOException) { - statusCode = STATE_CODE_SYSTEM_IO_ERROR + statusCode.set(STATE_CODE_SYSTEM_IO_ERROR) } catch (e1: SecurityException) { - statusCode = STATE_CODE_SYSTEM_SECURITY_ERROR + statusCode.set(STATE_CODE_SYSTEM_SECURITY_ERROR) } } else if (inputString.startsWith("WRITE")) { if (!fileOpen) { - statusCode = STATE_CODE_NO_FILE_OPENED + statusCode.set(STATE_CODE_NO_FILE_OPENED) return } if (fileOpenMode < 0) { - statusCode = STATE_CODE_OPERATION_NOT_PERMITTED + statusCode.set(STATE_CODE_OPERATION_NOT_PERMITTED) return } if (fileOpenMode == 1) { writeMode = true; appendMode = false } @@ -415,10 +415,10 @@ class TestDiskDrive(private val vm: VM, private val driveNum: Int, theRootPath: writeModeLength = inputString.substring(5, inputString.length).toInt() writeBuffer = ByteArray(writeModeLength) writeBufferUsage = 0 - statusCode = STATE_CODE_STANDBY + statusCode.set(STATE_CODE_STANDBY) } else - statusCode = STATE_CODE_ILLEGAL_COMMAND + statusCode.set(STATE_CODE_ILLEGAL_COMMAND) } } diff --git a/tsvm_core/src/net/torvald/tsvm/peripheral/TestFunctionGenerator.kt b/tsvm_core/src/net/torvald/tsvm/peripheral/TestFunctionGenerator.kt index ef7224a..a0c121a 100644 --- a/tsvm_core/src/net/torvald/tsvm/peripheral/TestFunctionGenerator.kt +++ b/tsvm_core/src/net/torvald/tsvm/peripheral/TestFunctionGenerator.kt @@ -169,10 +169,10 @@ Nunc mollis nibh vitae sapien consequat, ut vestibulum sem pharetra. Aliquam iac else if (inputString.startsWith("WRITE")) { writeMode = true writeModeLength = inputString.substring(5, inputString.length).toInt() - statusCode = 0 + statusCode.set(0) } else - statusCode = 128 + statusCode.set(128) blockSendCount = 0 } diff --git a/tsvm_core/src/net/torvald/tsvm/peripheral/TevdDiskDrive.kt b/tsvm_core/src/net/torvald/tsvm/peripheral/TevdDiskDrive.kt index d1d4df0..ff2a4b9 100644 --- a/tsvm_core/src/net/torvald/tsvm/peripheral/TevdDiskDrive.kt +++ b/tsvm_core/src/net/torvald/tsvm/peripheral/TevdDiskDrive.kt @@ -39,7 +39,7 @@ class TevdDiskDrive(private val vm: VM, private val driveNum: Int, private val t private val hasChanges = AtomicBoolean(false) init { - statusCode = TestDiskDrive.STATE_CODE_STANDBY + statusCode.set(TestDiskDrive.STATE_CODE_STANDBY) if (!tevdPath.exists()) { throw FileNotFoundException("Disk file '${theTevdPath}' not found") @@ -148,15 +148,15 @@ class TevdDiskDrive(private val vm: VM, private val driveNum: Int, private val t fileOpenMode = -1 file = TevdFileDescriptor(DOM, "") blockSendCount = 0 - statusCode = TestDiskDrive.STATE_CODE_STANDBY + statusCode.set(TestDiskDrive.STATE_CODE_STANDBY) writeMode = false writeModeLength = -1 } else if (inputString.startsWith("DEVSTU\u0017")) recipient?.writeout( TestDiskDrive.composePositiveAns( - "${statusCode.toChar()}", - TestDiskDrive.errorMsgs[statusCode] + "${statusCode.get().toChar()}", + TestDiskDrive.errorMsgs[statusCode.get()] ) ) else if (inputString.startsWith("DEVTYP\u0017")) @@ -166,7 +166,7 @@ class TevdDiskDrive(private val vm: VM, private val driveNum: Int, private val t else if (inputString.startsWith("OPENR\"") || inputString.startsWith("OPENW\"") || inputString.startsWith("OPENA\"")) { if (fileOpen) { - statusCode = TestDiskDrive.STATE_CODE_FILE_ALREADY_OPENED + statusCode.set(TestDiskDrive.STATE_CODE_FILE_ALREADY_OPENED) return } @@ -183,7 +183,7 @@ class TevdDiskDrive(private val vm: VM, private val driveNum: Int, private val t } // sanity check if path is actually enclosed with double-quote if (commaIndex != 6 && inputString[commaIndex - 1] != '"') { - statusCode = TestDiskDrive.STATE_CODE_ILLEGAL_COMMAND + statusCode.set(TestDiskDrive.STATE_CODE_ILLEGAL_COMMAND) return } val pathStr = inputString.substring(6, if (commaIndex == 6) inputString.lastIndex else commaIndex - 1) @@ -198,16 +198,16 @@ class TevdDiskDrive(private val vm: VM, private val driveNum: Int, private val t if (openMode == 'R' && !file.exists()) { printdbg("! file not found") - statusCode = TestDiskDrive.STATE_CODE_NO_SUCH_FILE_EXISTS + statusCode.set(TestDiskDrive.STATE_CODE_NO_SUCH_FILE_EXISTS) return } else if (DOM.isReadOnly && (openMode == 'W' || openMode == 'A')) { printdbg("! disk is read-only") - statusCode = TestDiskDrive.STATE_CODE_READ_ONLY + statusCode.set(TestDiskDrive.STATE_CODE_READ_ONLY) return } - statusCode = TestDiskDrive.STATE_CODE_STANDBY + statusCode.set(TestDiskDrive.STATE_CODE_STANDBY) fileOpen = true fileOpenMode = when (openMode) { 'W' -> 1 @@ -218,7 +218,7 @@ class TevdDiskDrive(private val vm: VM, private val driveNum: Int, private val t } else if (inputString.startsWith("DELETE")) { if (!fileOpen) { - statusCode = TestDiskDrive.STATE_CODE_NO_FILE_OPENED + statusCode.set(TestDiskDrive.STATE_CODE_NO_FILE_OPENED) return } try { @@ -226,11 +226,11 @@ class TevdDiskDrive(private val vm: VM, private val driveNum: Int, private val t hasChanges.getAndSet(true) } catch (e: SecurityException) { - statusCode = TestDiskDrive.STATE_CODE_SYSTEM_SECURITY_ERROR + statusCode.set(TestDiskDrive.STATE_CODE_SYSTEM_SECURITY_ERROR) return } catch (e1: IOException) { - statusCode = TestDiskDrive.STATE_CODE_SYSTEM_IO_ERROR + statusCode.set(TestDiskDrive.STATE_CODE_SYSTEM_IO_ERROR) return } } @@ -238,7 +238,7 @@ class TevdDiskDrive(private val vm: VM, private val driveNum: Int, private val t // TODO temporary behaviour to ignore any arguments resetBuf() if (!fileOpen) { - statusCode = TestDiskDrive.STATE_CODE_NO_FILE_OPENED + statusCode.set(TestDiskDrive.STATE_CODE_NO_FILE_OPENED) return } try { @@ -249,19 +249,19 @@ class TevdDiskDrive(private val vm: VM, private val driveNum: Int, private val t messageComposeBuffer.write(lsfile.name.toByteArray(VM.CHARSET)) } - statusCode = TestDiskDrive.STATE_CODE_STANDBY + statusCode.set(TestDiskDrive.STATE_CODE_STANDBY) } else { - statusCode = TestDiskDrive.STATE_CODE_NOT_A_DIRECTORY + statusCode.set(TestDiskDrive.STATE_CODE_NOT_A_DIRECTORY) return } } catch (e: SecurityException) { - statusCode = TestDiskDrive.STATE_CODE_SYSTEM_SECURITY_ERROR + statusCode.set(TestDiskDrive.STATE_CODE_SYSTEM_SECURITY_ERROR) return } catch (e1: IOException) { - statusCode = TestDiskDrive.STATE_CODE_SYSTEM_IO_ERROR + statusCode.set(TestDiskDrive.STATE_CODE_SYSTEM_IO_ERROR) return } } @@ -269,28 +269,28 @@ class TevdDiskDrive(private val vm: VM, private val driveNum: Int, private val t // TODO temporary behaviour to ignore any arguments resetBuf() if (!fileOpen) { - statusCode = TestDiskDrive.STATE_CODE_NO_FILE_OPENED + statusCode.set(TestDiskDrive.STATE_CODE_NO_FILE_OPENED) return } messageComposeBuffer.write(getSizeStr().toByteArray(VM.CHARSET)) - statusCode = TestDiskDrive.STATE_CODE_STANDBY + statusCode.set(TestDiskDrive.STATE_CODE_STANDBY) } else if (inputString.startsWith("LIST")) { // TODO temporary behaviour to ignore any arguments resetBuf() if (!fileOpen) { - statusCode = TestDiskDrive.STATE_CODE_NO_FILE_OPENED + statusCode.set(TestDiskDrive.STATE_CODE_NO_FILE_OPENED) return } messageComposeBuffer.write(getReadableLs().toByteArray(VM.CHARSET)) - statusCode = TestDiskDrive.STATE_CODE_STANDBY + statusCode.set(TestDiskDrive.STATE_CODE_STANDBY) } else if (inputString.startsWith("CLOSE")) { fileOpen = false fileOpenMode = -1 - statusCode = TestDiskDrive.STATE_CODE_STANDBY + statusCode.set(TestDiskDrive.STATE_CODE_STANDBY) } else if (inputString.startsWith("READ")) { //readModeLength = inputString.substring(4 until inputString.length).toInt() @@ -299,14 +299,14 @@ class TevdDiskDrive(private val vm: VM, private val driveNum: Int, private val t if (file.isFile) { try { messageComposeBuffer.write(file.readBytes()) - statusCode = TestDiskDrive.STATE_CODE_STANDBY + statusCode.set(TestDiskDrive.STATE_CODE_STANDBY) } catch (e: IOException) { - statusCode = TestDiskDrive.STATE_CODE_SYSTEM_IO_ERROR + statusCode.set(TestDiskDrive.STATE_CODE_SYSTEM_IO_ERROR) } } else { - statusCode = TestDiskDrive.STATE_CODE_OPERATION_NOT_PERMITTED + statusCode.set(TestDiskDrive.STATE_CODE_OPERATION_NOT_PERMITTED) return } } @@ -323,88 +323,88 @@ class TevdDiskDrive(private val vm: VM, private val driveNum: Int, private val t val bootFile = TevdFileDescriptor(DOM, "!BOOTSEC") if (!bootFile.exists()) { - statusCode = TestDiskDrive.STATE_CODE_NO_SUCH_FILE_EXISTS + statusCode.set(TestDiskDrive.STATE_CODE_NO_SUCH_FILE_EXISTS) return } try { val retMsg = bootFile.getHeadBytes(BLOCK_SIZE) recipient?.writeout(retMsg) - statusCode = TestDiskDrive.STATE_CODE_STANDBY + statusCode.set(TestDiskDrive.STATE_CODE_STANDBY) } catch (e: IOException) { - statusCode = TestDiskDrive.STATE_CODE_SYSTEM_IO_ERROR + statusCode.set(TestDiskDrive.STATE_CODE_SYSTEM_IO_ERROR) return } } else if (inputString.startsWith("MKDIR")) { if (!fileOpen) { - statusCode = TestDiskDrive.STATE_CODE_NO_FILE_OPENED + statusCode.set(TestDiskDrive.STATE_CODE_NO_FILE_OPENED) return } if (fileOpenMode < 1) { - statusCode = TestDiskDrive.STATE_CODE_OPERATION_NOT_PERMITTED + statusCode.set(TestDiskDrive.STATE_CODE_OPERATION_NOT_PERMITTED) return } try { val status = file.mkdir() - statusCode = if (status) 0 else 1 + statusCode.set(if (status) 0 else 1) if (status) hasChanges.getAndSet(true) } catch (e: SecurityException) { - statusCode = TestDiskDrive.STATE_CODE_SYSTEM_SECURITY_ERROR + statusCode.set(TestDiskDrive.STATE_CODE_SYSTEM_SECURITY_ERROR) } } else if (inputString.startsWith("MKFILE")) { if (!fileOpen) { - statusCode = TestDiskDrive.STATE_CODE_NO_FILE_OPENED + statusCode.set(TestDiskDrive.STATE_CODE_NO_FILE_OPENED) return } if (fileOpenMode < 1) { - statusCode = TestDiskDrive.STATE_CODE_OPERATION_NOT_PERMITTED + statusCode.set(TestDiskDrive.STATE_CODE_OPERATION_NOT_PERMITTED) return } try { val f1 = file.createNewFile() - statusCode = if (f1) TestDiskDrive.STATE_CODE_STANDBY else TestDiskDrive.STATE_CODE_OPERATION_FAILED + statusCode.set(if (f1) TestDiskDrive.STATE_CODE_STANDBY else TestDiskDrive.STATE_CODE_OPERATION_FAILED) if (f1) hasChanges.getAndSet(true) return } catch (e: IOException) { - statusCode = TestDiskDrive.STATE_CODE_SYSTEM_IO_ERROR + statusCode.set(TestDiskDrive.STATE_CODE_SYSTEM_IO_ERROR) } catch (e1: SecurityException) { - statusCode = TestDiskDrive.STATE_CODE_SYSTEM_SECURITY_ERROR + statusCode.set(TestDiskDrive.STATE_CODE_SYSTEM_SECURITY_ERROR) } } else if (inputString.startsWith("TOUCH")) { if (!fileOpen) { - statusCode = TestDiskDrive.STATE_CODE_NO_FILE_OPENED + statusCode.set(TestDiskDrive.STATE_CODE_NO_FILE_OPENED) return } if (fileOpenMode < 1) { - statusCode = TestDiskDrive.STATE_CODE_OPERATION_NOT_PERMITTED + statusCode.set(TestDiskDrive.STATE_CODE_OPERATION_NOT_PERMITTED) return } try { val f1 = file.setLastModified(vm.worldInterface.currentTimeInMills()) - statusCode = if (f1) TestDiskDrive.STATE_CODE_STANDBY else TestDiskDrive.STATE_CODE_OPERATION_FAILED + statusCode.set(if (f1) TestDiskDrive.STATE_CODE_STANDBY else TestDiskDrive.STATE_CODE_OPERATION_FAILED) if (f1) hasChanges.getAndSet(true) return } catch (e: IOException) { - statusCode = TestDiskDrive.STATE_CODE_SYSTEM_IO_ERROR + statusCode.set(TestDiskDrive.STATE_CODE_SYSTEM_IO_ERROR) } catch (e1: SecurityException) { - statusCode = TestDiskDrive.STATE_CODE_SYSTEM_SECURITY_ERROR + statusCode.set(TestDiskDrive.STATE_CODE_SYSTEM_SECURITY_ERROR) } } else if (inputString.startsWith("WRITE")) { if (!fileOpen) { - statusCode = TestDiskDrive.STATE_CODE_NO_FILE_OPENED + statusCode.set(TestDiskDrive.STATE_CODE_NO_FILE_OPENED) return } if (fileOpenMode < 0) { - statusCode = TestDiskDrive.STATE_CODE_OPERATION_NOT_PERMITTED + statusCode.set(TestDiskDrive.STATE_CODE_OPERATION_NOT_PERMITTED) return } if (fileOpenMode == 1) { writeMode = true; appendMode = false } @@ -412,10 +412,10 @@ class TevdDiskDrive(private val vm: VM, private val driveNum: Int, private val t writeModeLength = inputString.substring(5, inputString.length).toInt() writeBuffer = ByteArray(writeModeLength) writeBufferUsage = 0 - statusCode = TestDiskDrive.STATE_CODE_STANDBY + statusCode.set(TestDiskDrive.STATE_CODE_STANDBY) } else - statusCode = TestDiskDrive.STATE_CODE_ILLEGAL_COMMAND + statusCode.set(TestDiskDrive.STATE_CODE_ILLEGAL_COMMAND) } } diff --git a/tsvm_executable/src/net/torvald/terrarum/modulecomputers/tsvmperipheral/WorldRadar.kt b/tsvm_executable/src/net/torvald/terrarum/modulecomputers/tsvmperipheral/WorldRadar.kt index 9b7cbf9..fd359fb 100644 --- a/tsvm_executable/src/net/torvald/terrarum/modulecomputers/tsvmperipheral/WorldRadar.kt +++ b/tsvm_executable/src/net/torvald/terrarum/modulecomputers/tsvmperipheral/WorldRadar.kt @@ -29,7 +29,7 @@ class WorldRadar(pngfile: FileHandle) : BlockTransferInterface(false, true) { private val STONE_OUT = 7.toByte() init { - statusCode = TestDiskDrive.STATE_CODE_STANDBY + statusCode.set(TestDiskDrive.STATE_CODE_STANDBY) val worldTex = Pixmap(pngfile) for (y in 0 until worldTex.height) { for (x in 0 until worldTex.width) { @@ -129,11 +129,11 @@ class WorldRadar(pngfile: FileHandle) : BlockTransferInterface(false, true) { oldCmdbuf = cmdbuf - statusCode = TestDiskDrive.STATE_CODE_STANDBY + statusCode.set(TestDiskDrive.STATE_CODE_STANDBY) } else { resetBuf() - statusCode = TestDiskDrive.STATE_CODE_ILLEGAL_COMMAND + statusCode.set(TestDiskDrive.STATE_CODE_ILLEGAL_COMMAND) } } } \ No newline at end of file