mirror of
https://github.com/curioustorvald/tsvm.git
synced 2026-06-10 23:04:04 +09:00
implementing 'hdk' to main system wip
This commit is contained in:
@@ -1253,15 +1253,80 @@ let injectIntChk = (s, n) => {
|
|||||||
return k;
|
return k;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _G = {} // The Glorious Global Table
|
||||||
|
|
||||||
|
const moduleCache = {}
|
||||||
|
|
||||||
// install other stuffs
|
// install other stuffs
|
||||||
var require = (absdir) => {
|
// js source-based impl
|
||||||
|
/*var require = (absdir) => {
|
||||||
let moduleFile = files.open(absdir)
|
let moduleFile = files.open(absdir)
|
||||||
if (!moduleFile.exists) throw Error("No such file: " + absdir)
|
if (!moduleFile.exists) throw Error("No such file: " + absdir)
|
||||||
let moduleScript = moduleFile.sread()
|
let moduleScript = moduleFile.sread()
|
||||||
var intchkFunName = `tvdosSIGTERM_${generateRandomHashStr(16)}`;
|
var intchkFunName = `tvdosSIGTERM_${generateRandomHashStr(16)}`;
|
||||||
return eval(`var ${intchkFunName} = function(){ ${checkTerm} };let exports = {}; ${injectIntChk(moduleScript, intchkFunName)}; Object.freeze(exports)`)
|
return eval(`var ${intchkFunName} = function(){ ${checkTerm} };let exports = {}; ${injectIntChk(moduleScript, intchkFunName)}; Object.freeze(exports)`)
|
||||||
|
}*/
|
||||||
|
// COCC-based impl
|
||||||
|
let loadImgToMem = (str) => {
|
||||||
|
let intent = str.charCodeAt(4) // 2 for executable, 3 for shared
|
||||||
|
let addrToLoad = (str.charCodeAt(5) << 16) | (str.charCodeAt(6) << 8) | (str.charCodeAt(7))
|
||||||
|
const imageSize = (str.charCodeAt(9) << 16) | (str.charCodeAt(10) << 8) | (str.charCodeAt(11))
|
||||||
|
|
||||||
|
if (addrToLoad == 0)
|
||||||
|
addrToLoad = sys.malloc(imageSize + 4)
|
||||||
|
else
|
||||||
|
sys.forceAlloc(addrToLoad, imageSize + 4)
|
||||||
|
|
||||||
|
dma.strToRam(str, addrToLoad, 0, str.length)
|
||||||
|
|
||||||
|
// write magic 0xA5 to the beginning of the image area
|
||||||
|
sys.poke(addrToLoad, 0xA5)
|
||||||
|
|
||||||
|
return addrToLoad
|
||||||
|
}
|
||||||
|
var require = (absdir) => {
|
||||||
|
let moduleFile = files.open(absdir)
|
||||||
|
if (!moduleFile.exists) throw Error("No such file: " + absdir)
|
||||||
|
let moduleScript = moduleFile.sread()
|
||||||
|
let moduleName = absdir.split("\\").last().substringBeforeLast(".")
|
||||||
|
|
||||||
|
// load the "string" into memory
|
||||||
|
let ptr = loadImgToMem(moduleScript)
|
||||||
|
let intent = sys.peek(ptr + 4)
|
||||||
|
|
||||||
|
// if it's a shared library, put it into the global table
|
||||||
|
if (3 == intent) {
|
||||||
|
// create the table if it's not there
|
||||||
|
if (!_G.SO)
|
||||||
|
_G.SO = {}
|
||||||
|
|
||||||
|
_G.SO[moduleName] = ptr
|
||||||
|
}
|
||||||
|
|
||||||
|
requireFromMemory(ptr)
|
||||||
|
}
|
||||||
|
let requireFromMemory = (ptr) => {
|
||||||
|
if (moduleCache[ptr]) return moduleCache[ptr]
|
||||||
|
|
||||||
|
const codeStr = sys.toObjectCode(ptr)
|
||||||
|
|
||||||
|
// expose args through a wrapper -- just like calling a syscall
|
||||||
|
const wrapper = new Function("require", "module", "exports", "args", `
|
||||||
|
${codeStr}
|
||||||
|
if (typeof module.exports === 'function') {
|
||||||
|
return module.exports(...args)
|
||||||
|
}
|
||||||
|
return module.exports
|
||||||
|
`)
|
||||||
|
|
||||||
|
const moduleRunner = (...args) => {
|
||||||
|
const exports = {}
|
||||||
|
const module = { exports }
|
||||||
|
return wrapper((id) => requireFromMemory(id), module, exports, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
moduleCache[moduleId] = moduleRunner
|
||||||
|
return moduleRunner
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1289,7 +1354,7 @@ var execApp = (cmdsrc, args, appname) => {
|
|||||||
|
|
||||||
// Boot script
|
// Boot script
|
||||||
serial.println(`TVDOS.SYS initialised on VM ${sys.getVmId()}, running boot script...`);
|
serial.println(`TVDOS.SYS initialised on VM ${sys.getVmId()}, running boot script...`);
|
||||||
var _G = {};
|
|
||||||
let cmdfile = files.open("A:/tvdos/bin/command.js")
|
let cmdfile = files.open("A:/tvdos/bin/command.js")
|
||||||
eval(`var _AUTOEXEC=function(exec_args){${cmdfile.sread()}\n};` +
|
eval(`var _AUTOEXEC=function(exec_args){${cmdfile.sread()}\n};` +
|
||||||
`_AUTOEXEC`)(["", "-c", "\\AUTOEXEC.BAT"])
|
`_AUTOEXEC`)(["", "-c", "\\AUTOEXEC.BAT"])
|
||||||
|
|||||||
@@ -102,4 +102,10 @@ class DMADelegate(private val vm: VM) {
|
|||||||
fun ramToRam(from: Int, to: Int, length: Int) {
|
fun ramToRam(from: Int, to: Int, length: Int) {
|
||||||
UnsafeHelper.memcpy(vm.usermem.ptr + from, vm.usermem.ptr + to, length.toLong())
|
UnsafeHelper.memcpy(vm.usermem.ptr + from, vm.usermem.ptr + to, length.toLong())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun strToRam(str: String, to: Int, srcOff: Int, length: Int) {
|
||||||
|
for (i in srcOff until srcOff + length) {
|
||||||
|
vm.poke(to.toLong() + i, str[i - srcOff].code.toByte())
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user