This commit is contained in:
minjaesong
2021-10-15 15:07:02 +09:00
parent 34437b83b0
commit 253ab0f328
3 changed files with 79 additions and 1 deletions

View File

@@ -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});

View File

@@ -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())
}
}

View File

@@ -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()