mirror of
https://github.com/curioustorvald/tsvm.git
synced 2026-06-09 14:44:05 +09:00
read() without inputstream
This commit is contained in:
@@ -92,7 +92,8 @@ function getRGBfromScr(x, y) {
|
|||||||
return [(rg >>> 4) / 15.0, (rg & 15) / 15.0, (ba >>> 4) / 15.0]
|
return [(rg >>> 4) / 15.0, (rg & 15) / 15.0, (ba >>> 4) / 15.0]
|
||||||
}
|
}
|
||||||
|
|
||||||
let oldBgcol = [0.0, 0.0, 0.0]
|
const BIAS_LIGHTING_MIN = 1.0 / 16.0
|
||||||
|
let oldBgcol = [BIAS_LIGHTING_MIN, BIAS_LIGHTING_MIN, BIAS_LIGHTING_MIN]
|
||||||
let stopPlay = false
|
let stopPlay = false
|
||||||
if (interactive) {
|
if (interactive) {
|
||||||
con.move(1,1)
|
con.move(1,1)
|
||||||
@@ -197,9 +198,9 @@ while (!stopPlay && seqread.getReadCount() < FILE_LENGTH) {
|
|||||||
out[1] += rgb[1]
|
out[1] += rgb[1]
|
||||||
out[2] += rgb[2]
|
out[2] += rgb[2]
|
||||||
})
|
})
|
||||||
out[0] = out[0] / samples.length / 2.0 // darken a bit
|
out[0] = BIAS_LIGHTING_MIN + (out[0] / samples.length / 2.0) // darken a bit
|
||||||
out[1] = out[1] / samples.length / 2.0
|
out[1] = BIAS_LIGHTING_MIN + (out[1] / samples.length / 2.0)
|
||||||
out[2] = out[2] / samples.length / 2.0
|
out[2] = BIAS_LIGHTING_MIN + (out[2] / samples.length / 2.0)
|
||||||
|
|
||||||
let bgr = (oldBgcol[0]*5 + out[0]) / 6.0
|
let bgr = (oldBgcol[0]*5 + out[0]) / 6.0
|
||||||
let bgg = (oldBgcol[1]*5 + out[1]) / 6.0
|
let bgg = (oldBgcol[1]*5 + out[1]) / 6.0
|
||||||
@@ -255,9 +256,9 @@ while (!stopPlay && seqread.getReadCount() < FILE_LENGTH) {
|
|||||||
out[1] += rgb[1]
|
out[1] += rgb[1]
|
||||||
out[2] += rgb[2]
|
out[2] += rgb[2]
|
||||||
})
|
})
|
||||||
out[0] = out[0] / samples.length / 2.0 // darken a bit
|
out[0] = BIAS_LIGHTING_MIN + (out[0] / samples.length / 2.0) // darken a bit
|
||||||
out[1] = out[1] / samples.length / 2.0
|
out[1] = BIAS_LIGHTING_MIN + (out[1] / samples.length / 2.0)
|
||||||
out[2] = out[2] / samples.length / 2.0
|
out[2] = BIAS_LIGHTING_MIN + (out[2] / samples.length / 2.0)
|
||||||
|
|
||||||
let bgr = (oldBgcol[0]*5 + out[0]) / 6.0
|
let bgr = (oldBgcol[0]*5 + out[0]) / 6.0
|
||||||
let bgg = (oldBgcol[1]*5 + out[1]) / 6.0
|
let bgg = (oldBgcol[1]*5 + out[1]) / 6.0
|
||||||
|
|||||||
@@ -76,6 +76,7 @@ MMIO
|
|||||||
t: STOP button (should raise SIGTERM)
|
t: STOP button (should raise SIGTERM)
|
||||||
r: RESET button (hypervisor should reset the system)
|
r: RESET button (hypervisor should reset the system)
|
||||||
q: SysRq button (hypervisor should respond to it)
|
q: SysRq button (hypervisor should respond to it)
|
||||||
|
49: set to 1 if a key has pushed into key buffer (or, if the system has a key press to pull) via MMIO 38; othewise 0
|
||||||
|
|
||||||
64..67 RO: User area memory size in bytes
|
64..67 RO: User area memory size in bytes
|
||||||
68 WO: Counter latch
|
68 WO: Counter latch
|
||||||
|
|||||||
@@ -1,11 +1,9 @@
|
|||||||
package net.torvald.tsvm
|
package net.torvald.tsvm
|
||||||
|
|
||||||
import net.torvald.UnsafeHelper
|
import net.torvald.UnsafeHelper
|
||||||
import net.torvald.UnsafePtr
|
|
||||||
import net.torvald.terrarum.modulecomputers.virtualcomputer.tvd.toUint
|
import net.torvald.terrarum.modulecomputers.virtualcomputer.tvd.toUint
|
||||||
import net.torvald.terrarum.modulecomputers.virtualcomputer.tvd.toUlong
|
import net.torvald.terrarum.modulecomputers.virtualcomputer.tvd.toUlong
|
||||||
import net.torvald.tsvm.peripheral.*
|
import net.torvald.tsvm.peripheral.*
|
||||||
import java.nio.charset.Charset
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Pass the instance of the class to the ScriptEngine's binding, preferably under the namespace of "vm"
|
* Pass the instance of the class to the ScriptEngine's binding, preferably under the namespace of "vm"
|
||||||
@@ -177,10 +175,24 @@ class VMJSR223Delegate(private val vm: VM) {
|
|||||||
* ^A-^Z: 1 through 26
|
* ^A-^Z: 1 through 26
|
||||||
*/
|
*/
|
||||||
fun readKey(): Int {
|
fun readKey(): Int {
|
||||||
val inputStream = vm.getInputStream()
|
/*val inputStream = vm.getInputStream()
|
||||||
var key: Int = inputStream.read()
|
var key: Int = inputStream.read()
|
||||||
inputStream.close()
|
inputStream.close()
|
||||||
return key
|
return key*/
|
||||||
|
|
||||||
|
// impl that doesn't rely on InputStream
|
||||||
|
vm.getIO().let {
|
||||||
|
it.mmio_write(38, 1)
|
||||||
|
|
||||||
|
vm.isIdle.set(true)
|
||||||
|
while (it.mmio_read(49L) == 0.toByte()) {
|
||||||
|
Thread.sleep(6L)
|
||||||
|
}
|
||||||
|
vm.isIdle.set(false)
|
||||||
|
|
||||||
|
it.mmio_write(38, 0)
|
||||||
|
return it.mmio_read(37L)!!.toUint()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -188,11 +200,12 @@ class VMJSR223Delegate(private val vm: VM) {
|
|||||||
* characters (e.g. arrow keys) won't work.
|
* characters (e.g. arrow keys) won't work.
|
||||||
*/
|
*/
|
||||||
fun read(): String {
|
fun read(): String {
|
||||||
val inputStream = vm.getInputStream()
|
// val inputStream = vm.getInputStream()
|
||||||
val sb = StringBuilder()
|
val sb = StringBuilder()
|
||||||
var key: Int
|
var key: Int
|
||||||
do {
|
do {
|
||||||
key = inputStream.read()
|
// key = inputStream.read()
|
||||||
|
key = readKey()
|
||||||
|
|
||||||
if ((key == 8 && sb.isNotEmpty()) || key in 0x20..0x7E) {
|
if ((key == 8 && sb.isNotEmpty()) || key in 0x20..0x7E) {
|
||||||
this.print("${key.toChar()}")
|
this.print("${key.toChar()}")
|
||||||
@@ -205,7 +218,7 @@ class VMJSR223Delegate(private val vm: VM) {
|
|||||||
} while (key != 13 && key != 10)
|
} while (key != 13 && key != 10)
|
||||||
this.print("\n") // printout \n
|
this.print("\n") // printout \n
|
||||||
|
|
||||||
inputStream.close()
|
// inputStream.close()
|
||||||
return sb.toString()
|
return sb.toString()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -214,11 +227,12 @@ class VMJSR223Delegate(private val vm: VM) {
|
|||||||
* characters (e.g. arrow keys) won't work.
|
* characters (e.g. arrow keys) won't work.
|
||||||
*/
|
*/
|
||||||
fun readNoEcho(): String {
|
fun readNoEcho(): String {
|
||||||
val inputStream = vm.getInputStream()
|
// val inputStream = vm.getInputStream()
|
||||||
val sb = StringBuilder()
|
val sb = StringBuilder()
|
||||||
var key: Int
|
var key: Int
|
||||||
do {
|
do {
|
||||||
key = inputStream.read()
|
// key = inputStream.read()
|
||||||
|
key = readKey()
|
||||||
|
|
||||||
when (key) {
|
when (key) {
|
||||||
8 -> if (sb.isNotEmpty()) sb.deleteCharAt(sb.lastIndex)
|
8 -> if (sb.isNotEmpty()) sb.deleteCharAt(sb.lastIndex)
|
||||||
@@ -227,7 +241,7 @@ class VMJSR223Delegate(private val vm: VM) {
|
|||||||
} while (key != 13 && key != 10)
|
} while (key != 13 && key != 10)
|
||||||
this.println() // printout \n
|
this.println() // printout \n
|
||||||
|
|
||||||
inputStream.close()
|
// inputStream.close()
|
||||||
return sb.toString()
|
return sb.toString()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1003,6 +1003,7 @@ open class GraphicsAdapter(private val assetsRoot: String, val vm: VM, val confi
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun read(): Int {
|
override fun read(): Int {
|
||||||
|
vm.getIO().mmio_write(49L, 0)
|
||||||
var key: Byte
|
var key: Byte
|
||||||
do {
|
do {
|
||||||
Thread.sleep(4L) // if spinning rate is too fast, this function will fail.
|
Thread.sleep(4L) // if spinning rate is too fast, this function will fail.
|
||||||
@@ -1011,6 +1012,7 @@ open class GraphicsAdapter(private val assetsRoot: String, val vm: VM, val confi
|
|||||||
} while (key == (-1).toByte())
|
} while (key == (-1).toByte())
|
||||||
|
|
||||||
//println("[stdin] key = $key")
|
//println("[stdin] key = $key")
|
||||||
|
vm.getIO().mmio_write(49L, 1)
|
||||||
return key.toInt().and(255)
|
return key.toInt().and(255)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -104,6 +104,7 @@ class IOSpace(val vm: VM) : PeriBase("io"), InputProcessor {
|
|||||||
39L -> rawInputFunctionLatched.toInt().toByte()
|
39L -> rawInputFunctionLatched.toInt().toByte()
|
||||||
in 40..47 -> keyEventBuffers[adi - 40]
|
in 40..47 -> keyEventBuffers[adi - 40]
|
||||||
48L -> (vm.resetDown.toInt(7) or vm.sysrqDown.toInt(6) or vm.stopDown.toInt()).toByte()
|
48L -> (vm.resetDown.toInt(7) or vm.sysrqDown.toInt(6) or vm.stopDown.toInt()).toByte()
|
||||||
|
49L -> keyPushed.toInt().toByte()
|
||||||
|
|
||||||
in 64..67 -> vm.memsize.shr((adi - 64) * 8).toByte()
|
in 64..67 -> vm.memsize.shr((adi - 64) * 8).toByte()
|
||||||
68L -> (uptimeCounterLatched.toInt() or RTClatched.toInt(1)).toByte()
|
68L -> (uptimeCounterLatched.toInt() or RTClatched.toInt(1)).toByte()
|
||||||
@@ -161,6 +162,7 @@ class IOSpace(val vm: VM) : PeriBase("io"), InputProcessor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private val hyveArea = ByteArray(2048)
|
private val hyveArea = ByteArray(2048)
|
||||||
|
private var keyPushed = false
|
||||||
|
|
||||||
override fun mmio_write(addr: Long, byte: Byte) {
|
override fun mmio_write(addr: Long, byte: Byte) {
|
||||||
val adi = addr.toInt()
|
val adi = addr.toInt()
|
||||||
@@ -180,6 +182,7 @@ class IOSpace(val vm: VM) : PeriBase("io"), InputProcessor {
|
|||||||
|
|
||||||
39L -> rawInputFunctionLatched = (byte.isNonZero())
|
39L -> rawInputFunctionLatched = (byte.isNonZero())
|
||||||
in 40..47 -> keyEventBuffers[adi - 40] = byte
|
in 40..47 -> keyEventBuffers[adi - 40] = byte
|
||||||
|
49L -> keyPushed = (bi != 0)
|
||||||
68L -> {
|
68L -> {
|
||||||
uptimeCounterLatched = byte.and(0b01).isNonZero()
|
uptimeCounterLatched = byte.and(0b01).isNonZero()
|
||||||
RTClatched = byte.and(0b10).isNonZero()
|
RTClatched = byte.and(0b10).isNonZero()
|
||||||
@@ -341,10 +344,14 @@ class IOSpace(val vm: VM) : PeriBase("io"), InputProcessor {
|
|||||||
override fun keyTyped(p0: Char): Boolean {
|
override fun keyTyped(p0: Char): Boolean {
|
||||||
if (keyboardInputRequested && p0.toInt() > 0) {
|
if (keyboardInputRequested && p0.toInt() > 0) {
|
||||||
//println("[IO] key typed = ${p0.toInt()}")
|
//println("[IO] key typed = ${p0.toInt()}")
|
||||||
|
keyPushed = true
|
||||||
keyboardBuffer.appendHead(p0.toByte())
|
keyboardBuffer.appendHead(p0.toByte())
|
||||||
|
Thread.sleep(6L)
|
||||||
|
keyPushed = false
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
keyPushed = false
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,8 +43,8 @@ public class AppLoader {
|
|||||||
// VM vm = new VM("./assets", 64 << 10, new TheRealWorld(), new VMProgramRom[]{OEMBios.INSTANCE, BasicRom.INSTANCE}, 8, watchdogs);
|
// VM vm = new VM("./assets", 64 << 10, new TheRealWorld(), new VMProgramRom[]{OEMBios.INSTANCE, BasicRom.INSTANCE}, 8, watchdogs);
|
||||||
// VM vm = new VM("./assets", 64 << 10, new TheRealWorld(), new VMProgramRom[]{TandemBios.INSTANCE, BasicRom.INSTANCE}, 2, watchdogs);
|
// VM vm = new VM("./assets", 64 << 10, new TheRealWorld(), new VMProgramRom[]{TandemBios.INSTANCE, BasicRom.INSTANCE}, 2, watchdogs);
|
||||||
// VM vm = new VM("./assets", 128 << 10, new TheRealWorld(), new VMProgramRom[]{BasicBios.INSTANCE, WPBios.INSTANCE}, 2, watchdogs);
|
// VM vm = new VM("./assets", 128 << 10, new TheRealWorld(), new VMProgramRom[]{BasicBios.INSTANCE, WPBios.INSTANCE}, 2, watchdogs);
|
||||||
// VM vm = new VM("./assets", 8192 << 10, new TheRealWorld(), new VMProgramRom[]{TsvmBios.INSTANCE}, 8, watchdogs);
|
VM vm = new VM("./assets", 8192 << 10, new TheRealWorld(), new VMProgramRom[]{TsvmBios.INSTANCE}, 8, watchdogs);
|
||||||
VM vm = new VM("./assets", 8192 << 10, new TheRealWorld(), new VMProgramRom[]{Mon.INSTANCE, HyveRom.INSTANCE}, 8, watchdogs);
|
// VM vm = new VM("./assets", 8192 << 10, new TheRealWorld(), new VMProgramRom[]{Mon.INSTANCE, HyveRom.INSTANCE}, 8, watchdogs);
|
||||||
// VM vm = new VM("./assets", 8192 << 10, new TheRealWorld(), new VMProgramRom[]{OpenBios.INSTANCE}, 8, watchdogs);
|
// VM vm = new VM("./assets", 8192 << 10, new TheRealWorld(), new VMProgramRom[]{OpenBios.INSTANCE}, 8, watchdogs);
|
||||||
// VM pipvm = new VM("./assets", 4096, new TheRealWorld(), new VMProgramRom[]{PipBios.INSTANCE, PipROM.INSTANCE}, 8, watchdogs);
|
// VM pipvm = new VM("./assets", 4096, new TheRealWorld(), new VMProgramRom[]{PipBios.INSTANCE, PipROM.INSTANCE}, 8, watchdogs);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user