mirror of
https://github.com/curioustorvald/tsvm.git
synced 2026-06-09 06:34:04 +09:00
vm idle indicator
This commit is contained in:
@@ -36,15 +36,15 @@ const COL_HL_EXT = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const EXEC_FUNS = {
|
const EXEC_FUNS = {
|
||||||
"wav": (f) => _G.shell.execute(`playwav ${f} -i`),
|
"wav": (f) => _G.shell.execute(`playwav "${f}" -i`),
|
||||||
"adpcm": (f) => _G.shell.execute(`playwav ${f} -i`),
|
"adpcm": (f) => _G.shell.execute(`playwav "${f}" -i`),
|
||||||
"mp3": (f) => _G.shell.execute(`playmp3 ${f} -i`),
|
"mp3": (f) => _G.shell.execute(`playmp3 "${f}" -i`),
|
||||||
"mp2": (f) => _G.shell.execute(`playmp2 ${f} -i`),
|
"mp2": (f) => _G.shell.execute(`playmp2 "${f}" -i`),
|
||||||
"mov": (f) => _G.shell.execute(`playmov ${f} -i`),
|
"mov": (f) => _G.shell.execute(`playmov "${f}" -i`),
|
||||||
"pcm": (f) => _G.shell.execute(`playpcm ${f} -i`),
|
"pcm": (f) => _G.shell.execute(`playpcm "${f}" -i`),
|
||||||
"ipf1": (f) => _G.shell.execute(`decodeipf ${f} -i`),
|
"ipf1": (f) => _G.shell.execute(`decodeipf "${f}" -i`),
|
||||||
"ipf2": (f) => _G.shell.execute(`decodeipf ${f} -i`),
|
"ipf2": (f) => _G.shell.execute(`decodeipf "${f}" -i`),
|
||||||
"bas": (f) => _G.shell.execute(`basic ${f}`)
|
"bas": (f) => _G.shell.execute(`basic "${f}"`)
|
||||||
}
|
}
|
||||||
|
|
||||||
let windowMode = 0 // 0 == left, 1 == right
|
let windowMode = 0 // 0 == left, 1 == right
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import java.io.InputStream
|
|||||||
import java.io.OutputStream
|
import java.io.OutputStream
|
||||||
import java.nio.charset.Charset
|
import java.nio.charset.Charset
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
import java.util.concurrent.atomic.AtomicBoolean
|
||||||
import kotlin.math.ceil
|
import kotlin.math.ceil
|
||||||
|
|
||||||
|
|
||||||
@@ -77,6 +78,8 @@ class VM(
|
|||||||
val isRunning: Boolean
|
val isRunning: Boolean
|
||||||
get() = !disposed &&startTime >= 0
|
get() = !disposed &&startTime >= 0
|
||||||
|
|
||||||
|
val isIdle = AtomicBoolean(true)
|
||||||
|
|
||||||
init {
|
init {
|
||||||
println("[VM] Creating new VM with ID of $id, memsize $memsize")
|
println("[VM] Creating new VM with ID of $id, memsize $memsize")
|
||||||
|
|
||||||
|
|||||||
@@ -229,16 +229,22 @@ class VMJSR223Delegate(private val vm: VM) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun spin() {
|
fun spin() {
|
||||||
|
vm.isIdle.set(true)
|
||||||
Thread.sleep(4L)
|
Thread.sleep(4L)
|
||||||
|
vm.isIdle.set(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun sleep(time: Long) {
|
fun sleep(time: Long) {
|
||||||
|
vm.isIdle.set(true)
|
||||||
Thread.sleep(time)
|
Thread.sleep(time)
|
||||||
|
Thread.sleep(4L)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun waitForMemChg(addr: Int, andMask: Int, xorMask: Int) {
|
fun waitForMemChg(addr: Int, andMask: Int, xorMask: Int) {
|
||||||
while ((peek(addr) xor xorMask) and andMask == 0) {
|
while ((peek(addr) xor xorMask) and andMask == 0) {
|
||||||
|
vm.isIdle.set(true)
|
||||||
Thread.sleep(1L)
|
Thread.sleep(1L)
|
||||||
|
vm.isIdle.set(false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fun waitForMemChg(addr: Int, andMask: Int) = waitForMemChg(addr, andMask, 0)
|
fun waitForMemChg(addr: Int, andMask: Int) = waitForMemChg(addr, andMask, 0)
|
||||||
|
|||||||
@@ -19,10 +19,13 @@ import net.torvald.terrarum.DefaultGL32Shaders
|
|||||||
import net.torvald.terrarum.modulecomputers.virtualcomputer.tvd.toUint
|
import net.torvald.terrarum.modulecomputers.virtualcomputer.tvd.toUint
|
||||||
import net.torvald.tsvm.*
|
import net.torvald.tsvm.*
|
||||||
import net.torvald.tsvm.peripheral.GraphicsAdapter.Companion.DRAW_SHADER_FRAG
|
import net.torvald.tsvm.peripheral.GraphicsAdapter.Companion.DRAW_SHADER_FRAG
|
||||||
|
import java.io.IOException
|
||||||
import java.io.InputStream
|
import java.io.InputStream
|
||||||
import java.io.OutputStream
|
import java.io.OutputStream
|
||||||
|
import java.util.*
|
||||||
import kotlin.experimental.and
|
import kotlin.experimental.and
|
||||||
import kotlin.math.floor
|
import kotlin.math.floor
|
||||||
|
import kotlin.math.min
|
||||||
|
|
||||||
data class AdapterConfig(
|
data class AdapterConfig(
|
||||||
val theme: String,
|
val theme: String,
|
||||||
@@ -39,7 +42,7 @@ data class AdapterConfig(
|
|||||||
val paletteShader: String = DRAW_SHADER_FRAG,
|
val paletteShader: String = DRAW_SHADER_FRAG,
|
||||||
val drawScale: Float = 1f,
|
val drawScale: Float = 1f,
|
||||||
val scaleFiltered: Boolean = false,
|
val scaleFiltered: Boolean = false,
|
||||||
val baudRate: Double = 10_240_000.0,//57600.0,
|
val baudRate: Double = 16_384_000.0,//57600.0,
|
||||||
val bitsPerChar: Int = 10 // start bit + 8 data bits + stop bit
|
val bitsPerChar: Int = 10 // start bit + 8 data bits + stop bit
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -934,6 +937,20 @@ open class GraphicsAdapter(private val assetsRoot: String, val vm: VM, val confi
|
|||||||
override fun write(p0: Int) {
|
override fun write(p0: Int) {
|
||||||
writeOut(p0.toByte())
|
writeOut(p0.toByte())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun write(b: ByteArray) {
|
||||||
|
this.write(b, 0, b.size)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun write(b: ByteArray, off: Int, len: Int) {
|
||||||
|
vm.isIdle.set(true)
|
||||||
|
Objects.checkFromIndexSize(off, len, b.size)
|
||||||
|
|
||||||
|
for (i in 0 until len) {
|
||||||
|
writeOut(b[off + i])
|
||||||
|
}
|
||||||
|
vm.isIdle.set(false)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return PRINTSTREAM_INSTANCE
|
return PRINTSTREAM_INSTANCE
|
||||||
@@ -951,15 +968,22 @@ open class GraphicsAdapter(private val assetsRoot: String, val vm: VM, val confi
|
|||||||
private val SGI_RESET = byteArrayOf(0x1B, 0x5B, 0x6D)
|
private val SGI_RESET = byteArrayOf(0x1B, 0x5B, 0x6D)
|
||||||
|
|
||||||
override fun write(p0: Int) {
|
override fun write(p0: Int) {
|
||||||
|
vm.isIdle.set(true)
|
||||||
SGI_RED.forEach { writeOut(it) }
|
SGI_RED.forEach { writeOut(it) }
|
||||||
writeOut(p0.toByte())
|
writeOut(p0.toByte())
|
||||||
SGI_RESET.forEach { writeOut(it) }
|
SGI_RESET.forEach { writeOut(it) }
|
||||||
|
vm.isIdle.set(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun write(p0: ByteArray) {
|
override fun write(b: ByteArray, off: Int, len: Int) {
|
||||||
|
Objects.checkFromIndexSize(off, len, b.size)
|
||||||
|
vm.isIdle.set(true)
|
||||||
SGI_RED.forEach { writeOut(it) }
|
SGI_RED.forEach { writeOut(it) }
|
||||||
p0.forEach { writeOut(it) }
|
for (i in 0 until len) {
|
||||||
|
writeOut(b[off + i])
|
||||||
|
}
|
||||||
SGI_RESET.forEach { writeOut(it) }
|
SGI_RESET.forEach { writeOut(it) }
|
||||||
|
vm.isIdle.set(false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2242,7 +2266,8 @@ void main() {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
val LAYERORDERS4 = listOf( // [drawn first, second, third, fourth], zero-indexed
|
val LAYERORDERS4 = listOf(
|
||||||
|
// [drawn first, second, third, fourth], zero-indexed
|
||||||
"1234",
|
"1234",
|
||||||
"1243",
|
"1243",
|
||||||
"1324",
|
"1324",
|
||||||
@@ -2269,7 +2294,8 @@ void main() {
|
|||||||
"4321",
|
"4321",
|
||||||
).map { s -> (0..3).map { s[it].toInt() - 49 } }
|
).map { s -> (0..3).map { s[it].toInt() - 49 } }
|
||||||
|
|
||||||
val LAYERORDERS2 = listOf( // [drawn first, second], zero-indexed
|
val LAYERORDERS2 = listOf(
|
||||||
|
// [drawn first, second], zero-indexed
|
||||||
"12",
|
"12",
|
||||||
"12",
|
"12",
|
||||||
"12",
|
"12",
|
||||||
|
|||||||
@@ -166,7 +166,12 @@ class IOSpace(val vm: VM) : PeriBase("io"), InputProcessor {
|
|||||||
37L -> keyboardBuffer.appendHead(byte)
|
37L -> keyboardBuffer.appendHead(byte)
|
||||||
38L -> {
|
38L -> {
|
||||||
keyboardInputRequested = (byte.isNonZero())
|
keyboardInputRequested = (byte.isNonZero())
|
||||||
if (keyboardInputRequested) keyboardBuffer.clear()
|
if (keyboardInputRequested) {
|
||||||
|
keyboardBuffer.clear()
|
||||||
|
vm.isIdle.set(true)
|
||||||
|
}
|
||||||
|
else
|
||||||
|
vm.isIdle.set(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
39L -> rawInputFunctionLatched = (byte.isNonZero())
|
39L -> rawInputFunctionLatched = (byte.isNonZero())
|
||||||
|
|||||||
@@ -201,6 +201,7 @@ class ProfilesMenu(parent: VMEmuExecutable, x: Int, y: Int, w: Int, h: Int) : Em
|
|||||||
batch.setColourBy { theVM?.isRunning == true }
|
batch.setColourBy { theVM?.isRunning == true }
|
||||||
FONT.draw(batch, STR_PLAY, 398f, 382f)
|
FONT.draw(batch, STR_PLAY, 398f, 382f)
|
||||||
batch.setColourBy(Color.RED, Color.LIME) { (theVM?.peek(-90)?.and(-128) ?: 0.toByte()).toInt() != 0 }
|
batch.setColourBy(Color.RED, Color.LIME) { (theVM?.peek(-90)?.and(-128) ?: 0.toByte()).toInt() != 0 }
|
||||||
|
batch.setColourBy(Color.YELLOW, batch.color) { theVM?.isIdle?.get() == true }
|
||||||
FONT.draw(batch, STR_POWER, 419f, 382f)
|
FONT.draw(batch, STR_POWER, 419f, 382f)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user