From 253ab0f328b83609570e8b2107031fe7f6334e2f Mon Sep 17 00:00:00 2001 From: minjaesong Date: Fri, 15 Oct 2021 15:07:02 +0900 Subject: [PATCH] dma --- src/net/torvald/tsvm/AppLoader.java | 2 +- src/net/torvald/tsvm/DMADelegate.kt | 77 +++++++++++++++++++++++++ src/net/torvald/tsvm/VMRunnerFactory.kt | 1 + 3 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 src/net/torvald/tsvm/DMADelegate.kt diff --git a/src/net/torvald/tsvm/AppLoader.java b/src/net/torvald/tsvm/AppLoader.java index 8ace1cc..dc3b70f 100644 --- a/src/net/torvald/tsvm/AppLoader.java +++ b/src/net/torvald/tsvm/AppLoader.java @@ -32,7 +32,7 @@ public class AppLoader { // VM vm = new VM(64 << 10, new TheRealWorld(), new VMProgramRom[]{OEMBios.INSTANCE, BasicRom.INSTANCE}); // VM vm = new VM(64 << 10, new TheRealWorld(), new VMProgramRom[]{TandemBios.INSTANCE, BasicRom.INSTANCE}); // VM vm = new VM(128 << 10, new TheRealWorld(), new VMProgramRom[]{BasicBios.INSTANCE, WPBios.INSTANCE}); - VM vm = new VM(128 << 10, new TheRealWorld(), new VMProgramRom[]{TsvmBios.INSTANCE}); + VM vm = new VM(2048 << 10, new TheRealWorld(), new VMProgramRom[]{TsvmBios.INSTANCE}); // uncomment to target the TerranBASIC runner // VM vm = new VM(64 << 10, new TheRealWorld(), new VMProgramRom[]{TBASRelBios.INSTANCE}); diff --git a/src/net/torvald/tsvm/DMADelegate.kt b/src/net/torvald/tsvm/DMADelegate.kt new file mode 100644 index 0000000..0318295 --- /dev/null +++ b/src/net/torvald/tsvm/DMADelegate.kt @@ -0,0 +1,77 @@ +package net.torvald.tsvm + +import net.torvald.UnsafeHelper +import net.torvald.tsvm.peripheral.GraphicsAdapter + +/** + * Created by minjaesong on 2021-10-15. + */ +class DMADelegate(val vm: VM) { + + private val READ = "READ".toByteArray(VM.CHARSET) + private val FLUSH = "FLUSH".toByteArray(VM.CHARSET) + private val CLOSE = "CLOSE".toByteArray(VM.CHARSET) + + private fun WRITE(n: Int) = "WRITE$n".toByteArray(VM.CHARSET) + + fun ramToFrame(from: Int, devnum: Int, offset: Int, length: Int) { + (vm.peripheralTable[devnum].peripheral as? GraphicsAdapter)?.let { + val data = ByteArray(length) + UnsafeHelper.memcpyRaw(null, vm.usermem.ptr + from, data, UnsafeHelper.getArrayOffset(data), length.toLong()) + it.framebuffer.pixels.position(offset) + it.framebuffer.pixels.put(data) + } + } + + fun ramToFrame(from: Int, to: Int, length: Int) { + for (i in 0..7) { + if (vm.peripheralTable[i].type == VM.PERITYPE_GPU_AND_TERM) { + ramToFrame(from, i, to, length) + return + } + } + } + + fun frameToRam(from: Int, to: Int, devnum: Int, length: Int) { + (vm.peripheralTable[devnum].peripheral as? GraphicsAdapter)?.let { + val data = ByteArray(length) + it.framebuffer.pixels.position(from) + it.framebuffer.pixels.get(data) + UnsafeHelper.memcpyRaw(data, UnsafeHelper.getArrayOffset(data), null, vm.usermem.ptr + to, length.toLong()) + } + } + + fun frameToRam(from: Int, to: Int, length: Int) { + for (i in 0..7) { + if (vm.peripheralTable[i].type == VM.PERITYPE_GPU_AND_TERM) { + frameToRam(from, to, i, length) + return + } + } + } + + fun comToRam(portNo: Int, srcOff: Int, destOff: Int, length: Int) { + SerialHelper.sendMessage(vm, portNo, READ) + val response = SerialHelper.getStatusCode(vm, portNo) + if (response == 0) { + val file = SerialHelper.pullMessage(vm, portNo) + UnsafeHelper.memcpyRaw(file, UnsafeHelper.getArrayOffset(file) + srcOff.toLong(), null, vm.usermem.ptr + destOff, length.toLong()) + } + } + + fun ramToCom(srcOff: Int, portNo: Int, length: Int) { + SerialHelper.sendMessage(vm, portNo, WRITE(length)) + val response = SerialHelper.getStatusCode(vm, portNo) + if (response == 0) { + val msg = ByteArray(length) + UnsafeHelper.memcpyRaw(null, vm.usermem.ptr + srcOff, msg, UnsafeHelper.getArrayOffset(msg), length.toLong()) + SerialHelper.sendMessage(vm, portNo, msg) + SerialHelper.sendMessage(vm, portNo, FLUSH) + SerialHelper.sendMessage(vm, portNo, CLOSE) + } + } + + fun ramToRam(from: Int, to: Int, length: Int) { + UnsafeHelper.memcpy(vm.usermem.ptr + from, vm.usermem.ptr + to, length.toLong()) + } +} \ No newline at end of file diff --git a/src/net/torvald/tsvm/VMRunnerFactory.kt b/src/net/torvald/tsvm/VMRunnerFactory.kt index a4af1f3..1996ef8 100644 --- a/src/net/torvald/tsvm/VMRunnerFactory.kt +++ b/src/net/torvald/tsvm/VMRunnerFactory.kt @@ -66,6 +66,7 @@ object VMRunnerFactory { bind.putMember("gzip", CompressorDelegate) bind.putMember("base64", Base64Delegate) bind.putMember("com", SerialHelperDelegate(vm)) + bind.putMember("dma", DMADelegate(vm)) val fr = FileReader("./assets/JS_INIT.js") val prg = fr.readText()