mirror of
https://github.com/curioustorvald/tsvm.git
synced 2026-06-13 16:04:05 +09:00
serial comm speed impl
This commit is contained in:
@@ -39,6 +39,8 @@ 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 = 115200.0,
|
||||||
|
val bitsPerChar: Int = 8
|
||||||
)
|
)
|
||||||
|
|
||||||
data class SuperGraphicsAddonConfig(
|
data class SuperGraphicsAddonConfig(
|
||||||
|
|||||||
@@ -8,6 +8,11 @@ import java.io.OutputStream
|
|||||||
|
|
||||||
class TTY(assetsRoot: String, val vm: VM) : GlassTty(TEXT_ROWS, TEXT_COLS) {
|
class TTY(assetsRoot: String, val vm: VM) : GlassTty(TEXT_ROWS, TEXT_COLS) {
|
||||||
|
|
||||||
|
@SuppressWarnings()
|
||||||
|
protected inline fun applyDelay() {
|
||||||
|
Thread.sleep(1L, 0)
|
||||||
|
}
|
||||||
|
|
||||||
override val typestring = VM.PERITYPE_GPU_AND_TERM
|
override val typestring = VM.PERITYPE_GPU_AND_TERM
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
@@ -56,6 +61,8 @@ class TTY(assetsRoot: String, val vm: VM) : GlassTty(TEXT_ROWS, TEXT_COLS) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
rawCursorPos = toTtyTextOffset(newx, newy)
|
rawCursorPos = toTtyTextOffset(newx, newy)
|
||||||
|
|
||||||
|
applyDelay()
|
||||||
}
|
}
|
||||||
private fun toTtyTextOffset(x: Int, y: Int) = y * TEXT_COLS + x
|
private fun toTtyTextOffset(x: Int, y: Int) = y * TEXT_COLS + x
|
||||||
|
|
||||||
@@ -82,11 +89,13 @@ class TTY(assetsRoot: String, val vm: VM) : GlassTty(TEXT_ROWS, TEXT_COLS) {
|
|||||||
val textOff = toTtyTextOffset(x, y)
|
val textOff = toTtyTextOffset(x, y)
|
||||||
textBuffer[memTextAttrOffset + textOff] = 0
|
textBuffer[memTextAttrOffset + textOff] = 0
|
||||||
textBuffer[memTextOffset + textOff] = text
|
textBuffer[memTextOffset + textOff] = text
|
||||||
|
applyDelay()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun resetTtyStatus() {
|
override fun resetTtyStatus() {
|
||||||
ttyFore = 0
|
ttyFore = 0
|
||||||
ttyInv = false
|
ttyInv = false
|
||||||
|
applyDelay()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun cursorUp(arg: Int) {
|
override fun cursorUp(arg: Int) {
|
||||||
|
|||||||
@@ -8,9 +8,37 @@ import com.badlogic.gdx.graphics.glutils.FrameBuffer
|
|||||||
import net.torvald.tsvm.VM
|
import net.torvald.tsvm.VM
|
||||||
import net.torvald.tsvm.kB
|
import net.torvald.tsvm.kB
|
||||||
import kotlin.math.absoluteValue
|
import kotlin.math.absoluteValue
|
||||||
|
import kotlin.math.floor
|
||||||
|
|
||||||
open class TexticsAdapterBase(assetsRoot: String, vm: VM, config: AdapterConfig) : GraphicsAdapter(assetsRoot, vm, config) {
|
open class TexticsAdapterBase(assetsRoot: String, vm: VM, config: AdapterConfig) : GraphicsAdapter(assetsRoot, vm, config) {
|
||||||
|
|
||||||
|
protected val sleepMillis = if (config.baudRate == 0.0 || config.baudRate >= 10000000.0) // sleep time of 100ns or less is considered as instant
|
||||||
|
0L
|
||||||
|
else
|
||||||
|
floor((1.0 / (config.baudRate / config.bitsPerChar)) * 1000).toLong()
|
||||||
|
|
||||||
|
protected val sleepNanos = if (config.baudRate == 0.0 || config.baudRate >= 10000000.0) // sleep time of 100ns or less is considered as instant
|
||||||
|
0
|
||||||
|
else
|
||||||
|
(((1.0 / (config.baudRate / config.bitsPerChar)) * 1000 * 1000000) % 1000000).toInt()
|
||||||
|
|
||||||
|
protected var slpcnt = 0L
|
||||||
|
|
||||||
|
init {
|
||||||
|
println("Baud: $sleepMillis ms $sleepNanos ns")
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings()
|
||||||
|
protected inline fun applyDelay() {
|
||||||
|
slpcnt += sleepMillis * 1000000L + sleepNanos
|
||||||
|
val millis = slpcnt / 1000000L
|
||||||
|
|
||||||
|
if (slpcnt >= 1000000L) {
|
||||||
|
Thread.sleep(millis, 0)
|
||||||
|
slpcnt -= millis * 1000000L
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// private val crtGradTex = Texture("$assetsRoot/crt_grad.png")
|
// private val crtGradTex = Texture("$assetsRoot/crt_grad.png")
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
@@ -26,6 +54,7 @@ open class TexticsAdapterBase(assetsRoot: String, vm: VM, config: AdapterConfig)
|
|||||||
in 0 until 250972 -> (-1).toByte()
|
in 0 until 250972 -> (-1).toByte()
|
||||||
else -> super.peek(addr)
|
else -> super.peek(addr)
|
||||||
}
|
}
|
||||||
|
applyDelay()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun poke(addr: Long, byte: Byte) {
|
override fun poke(addr: Long, byte: Byte) {
|
||||||
@@ -33,6 +62,17 @@ open class TexticsAdapterBase(assetsRoot: String, vm: VM, config: AdapterConfig)
|
|||||||
in 0 until 250972 -> { /*do nothing*/ }
|
in 0 until 250972 -> { /*do nothing*/ }
|
||||||
else -> super.poke(addr, byte)
|
else -> super.poke(addr, byte)
|
||||||
}
|
}
|
||||||
|
applyDelay()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun setCursorPos(x: Int, y: Int) {
|
||||||
|
super.setCursorPos(x, y)
|
||||||
|
applyDelay()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun putChar(x: Int, y: Int, text: Byte, foreColour: Byte, backColour: Byte) {
|
||||||
|
super.putChar(x, y, text, foreColour, backColour)
|
||||||
|
applyDelay()
|
||||||
}
|
}
|
||||||
|
|
||||||
private val TEX_HEIGHT = WIDTH * Math.sqrt(HEIGHT.toDouble() / WIDTH).toFloat()
|
private val TEX_HEIGHT = WIDTH * Math.sqrt(HEIGHT.toDouble() / WIDTH).toFloat()
|
||||||
@@ -82,7 +122,8 @@ class Term(assetsRoot: String, vm: VM) : TexticsAdapterBase(assetsRoot, vm, Adap
|
|||||||
256.kB(),
|
256.kB(),
|
||||||
"./hp2640.png",
|
"./hp2640.png",
|
||||||
0.32f,
|
0.32f,
|
||||||
GraphicsAdapter.TEXT_TILING_SHADER_MONOCHROME
|
GraphicsAdapter.TEXT_TILING_SHADER_MONOCHROME,
|
||||||
|
baudRate = 115200.0
|
||||||
))
|
))
|
||||||
|
|
||||||
class WpTerm(assetsRoot: String, vm: VM) : TexticsAdapterBase(assetsRoot, vm, AdapterConfig(
|
class WpTerm(assetsRoot: String, vm: VM) : TexticsAdapterBase(assetsRoot, vm, AdapterConfig(
|
||||||
|
|||||||
Reference in New Issue
Block a user