diff --git a/src/net/torvald/tsvm/VM.kt b/src/net/torvald/tsvm/VM.kt index 97a3c26..cff3e06 100644 --- a/src/net/torvald/tsvm/VM.kt +++ b/src/net/torvald/tsvm/VM.kt @@ -54,7 +54,8 @@ import kotlin.random.Random */ class VM( - _memsize: Long + _memsize: Long, + val worldInterface: WorldInterface ) { val id = java.util.Random().nextInt() diff --git a/src/net/torvald/tsvm/VMGUI.kt b/src/net/torvald/tsvm/VMGUI.kt index 894c3df..8d96fc2 100644 --- a/src/net/torvald/tsvm/VMGUI.kt +++ b/src/net/torvald/tsvm/VMGUI.kt @@ -11,7 +11,7 @@ import java.io.FileReader class VMGUI(val appConfig: LwjglApplicationConfiguration) : ApplicationAdapter() { - val vm = VM(64.kB()) + val vm = VM(64.kB(), TheRealWorld()) lateinit var gpu: GraphicsAdapter lateinit var batch: SpriteBatch diff --git a/src/net/torvald/tsvm/VMJSR223Delegate.kt b/src/net/torvald/tsvm/VMJSR223Delegate.kt index d7a9278..22f1202 100644 --- a/src/net/torvald/tsvm/VMJSR223Delegate.kt +++ b/src/net/torvald/tsvm/VMJSR223Delegate.kt @@ -1,6 +1,6 @@ package net.torvald.tsvm -import net.torvald.tsvm.peripheral.GraphicsAdapter +import net.torvald.terrarum.modulecomputers.virtualcomputer.tvd.toUlong /** * Pass the instance of the class to the ScriptEngine's binding, preferably under the namespace of "vm" @@ -13,6 +13,23 @@ class VMJSR223Delegate(val vm: VM) { fun malloc(size: Int) = vm.malloc(size) fun free(ptr: Int) = vm.free(ptr) + fun uptime(): Long { + vm.poke(-69, -1) + var r = 0L + for (i in 0L..7L) { + r = r or vm.peek(-73 - i)!!.toUlong().shl(8 * i.toInt()) + } + return r + } + fun currentTimeInMills(): Long { + vm.poke(-69, -1) + var r = 0L + for (i in 0L..7L) { + r = r or vm.peek(-81 - i)!!.toUlong().shl(8 * i.toInt()) + } + return r + } + fun print(s: String) { //System.out.print("[Nashorn] $s") vm.getPrintStream().write(s.toByteArray()) diff --git a/src/net/torvald/tsvm/WorldInterface.kt b/src/net/torvald/tsvm/WorldInterface.kt new file mode 100644 index 0000000..994f42c --- /dev/null +++ b/src/net/torvald/tsvm/WorldInterface.kt @@ -0,0 +1,12 @@ +package net.torvald.tsvm + +interface WorldInterface { + fun currentTimeInMills(): Long +} + +/** + * Real world interface for non-ingame testing. For the Ingame, implement your own. + */ +class TheRealWorld : WorldInterface { + override fun currentTimeInMills(): Long = System.currentTimeMillis() +} \ No newline at end of file diff --git a/src/net/torvald/tsvm/peripheral/IOSpace.kt b/src/net/torvald/tsvm/peripheral/IOSpace.kt index d59ac95..af7f9cf 100644 --- a/src/net/torvald/tsvm/peripheral/IOSpace.kt +++ b/src/net/torvald/tsvm/peripheral/IOSpace.kt @@ -209,7 +209,7 @@ class IOSpace(val vm: VM) : PeriBase, InputProcessor { if (RTClatched) { RTClatched = false - rtc = System.currentTimeMillis() + rtc = vm.worldInterface.currentTimeInMills() } }