diff --git a/assets/DOSBOOT.tevd.original b/assets/DOSBOOT.tevd.original index c1e54bd..cd387c3 100644 Binary files a/assets/DOSBOOT.tevd.original and b/assets/DOSBOOT.tevd.original differ diff --git a/assets/disk0/!BOOTSEC b/assets/disk0/!BOOTSEC index cc49c78..5e24980 100644 --- a/assets/disk0/!BOOTSEC +++ b/assets/disk0/!BOOTSEC @@ -1 +1 @@ -let p=_BIOS.FIRST_BOOTABLE_PORT;com.sendMessage(p[0],"DEVRST\x17");com.sendMessage(p[0],'OPENR"tvdos/TVDOS.SYS",'+p[1]);let r=com.getStatusCode(p[0]);if(0==r)if(com.sendMessage(p[0],"READ"),r=com.getStatusCode(p[0]),0==r){let g=com.pullMessage(p[0]);eval(g)}else println("I/O Error");else println("TVDOS.SYS not found");println("Shutting down...");println("It is now safe to turn off the power") \ No newline at end of file +let p=_BIOS.FIRST_BOOTABLE_PORT;com.sendMessage(p[0],"DEVRST\x17");com.sendMessage(p[0],'OPENR"tvdos/hyve.SYS",'+p[1]);let r=com.getStatusCode(p[0]);if(0==r)if(com.sendMessage(p[0],"READ"),r=com.getStatusCode(p[0]),0==r){let g=com.pullMessage(p[0]);eval(g)}else println("I/O Error");else println("TVDOS.SYS not found");println("Shutting down...");println("It is now safe to turn off the power") \ No newline at end of file diff --git a/assets/disk0/!BOOTSEC_old b/assets/disk0/!BOOTSEC_old new file mode 100644 index 0000000..cc49c78 --- /dev/null +++ b/assets/disk0/!BOOTSEC_old @@ -0,0 +1 @@ +let p=_BIOS.FIRST_BOOTABLE_PORT;com.sendMessage(p[0],"DEVRST\x17");com.sendMessage(p[0],'OPENR"tvdos/TVDOS.SYS",'+p[1]);let r=com.getStatusCode(p[0]);if(0==r)if(com.sendMessage(p[0],"READ"),r=com.getStatusCode(p[0]),0==r){let g=com.pullMessage(p[0]);eval(g)}else println("I/O Error");else println("TVDOS.SYS not found");println("Shutting down...");println("It is now safe to turn off the power") \ No newline at end of file diff --git a/assets/disk0/tvdos/hyve.SYS b/assets/disk0/tvdos/hyve.SYS new file mode 100644 index 0000000..011fdad --- /dev/null +++ b/assets/disk0/tvdos/hyve.SYS @@ -0,0 +1,63 @@ +/* +hyve is a hypervisor for tsvm. + +## hyve boot sequence + +0. bios starts up +1. bootloader calls hyve.js +2. hyve sets up itself, spawns new context which runs TVDOS.SYS +3. hands the control over to the TVDOS until SysRq sequence is struck +*/ + +let context = parallel.spawnNewContext() +let bios = ` +// probe bootable device + +var _BIOS = {}; + +// Syntax: [Port, Drive-number] +// Port #0-3: Serial port 1-4 +// #4+ : Left for future extension +// Drive-number always starts at 1 +_BIOS.FIRST_BOOTABLE_PORT = [0,1]; // ah screw it + +Object.freeze(_BIOS); + +/////////////////////////////////////////////////////////////////////////////// + +// load a bootsector using 'LOADBOOT' +let portNumber = 0; +let driveStatus = 0; +let guestExit = false; +while (portNumber < 4) { + if (com.areYouThere(portNumber)) { + com.sendMessage(portNumber,"DEVRST\x17"); + com.sendMessage(portNumber, 'OPENR"tvdos/TVDOS.SYS",'+_BIOS.FIRST_BOOTABLE_PORT[1]); + driveStatus = com.getStatusCode(portNumber); + if (driveStatus == 0) break; + } + portNumber += 1; +} +if (portNumber < 4) { + com.sendMessage(portNumber,"READ"); + let r = com.getStatusCode(portNumber); + if (r == 0) { + let g = com.pullMessage(portNumber); + eval(g); + } + else { + println("I/O Error"); + } +} +else { + printerrln("No bootable medium found."); +} +` +let runner = parallel.attachProgram("TVDOS", context, bios) +parallel.launch(runner) + +while (parallel.isRunning(runner)) { + sys.sleep(1000) +} + +println(" LX4 cya!") \ No newline at end of file diff --git a/terranmon.txt b/terranmon.txt index 3c849e3..20891ea 100644 --- a/terranmon.txt +++ b/terranmon.txt @@ -104,6 +104,8 @@ MMIO 90 RO: BMS calculated battery percentage where 255 is 100% 91 RO: BMS battery voltage multiplied by 10 (127 = "12.7 V") +92..127 RW: Used by the hypervisor + 1024..2047 RW: Reserved for integrated peripherals (e.g. built-in status display) 4076..4079 RW: 8-bit status code for the port diff --git a/tsvm_core/src/net/torvald/tsvm/VMJSR223Delegate.kt b/tsvm_core/src/net/torvald/tsvm/VMJSR223Delegate.kt index 72502ca..0e6a6ff 100644 --- a/tsvm_core/src/net/torvald/tsvm/VMJSR223Delegate.kt +++ b/tsvm_core/src/net/torvald/tsvm/VMJSR223Delegate.kt @@ -293,6 +293,7 @@ class Parallel(private val vm: VM) { thread.interrupt() vm.contexts.remove(thread) } + fun isRunning(thread: Thread) = thread.isAlive fun getThreadPool() = vm.contexts } diff --git a/tsvm_core/src/net/torvald/tsvm/VMRunnerFactory.kt b/tsvm_core/src/net/torvald/tsvm/VMRunnerFactory.kt index c12dc6e..2604c5c 100644 --- a/tsvm_core/src/net/torvald/tsvm/VMRunnerFactory.kt +++ b/tsvm_core/src/net/torvald/tsvm/VMRunnerFactory.kt @@ -54,7 +54,7 @@ object VMRunnerFactory { "js" -> { object : VMRunner(extension) { private val ringOneParallel = Parallel(vm) - private val ringTwoParallel = ParallelDummy() + private val ringTwoParallel = Parallel(vm)//ParallelDummy() private val context = Context.newBuilder("js") .allowHostAccess(HostAccess.ALL)