From 883736192c8f17793f84f3c18c63544a1e5f0884 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Wed, 17 Aug 2022 15:43:20 +0900 Subject: [PATCH] CON device file --- assets/disk0/tvdos/TVDOS.SYS | 85 +++++++++++++++++-- assets/disk0/tvdos/bin/command.js | 2 +- .../torvald/tsvm/GraphicsJSR223Delegate.kt | 4 + tsvm_core/src/net/torvald/tsvm/VM.kt | 7 ++ 4 files changed, 91 insertions(+), 7 deletions(-) diff --git a/assets/disk0/tvdos/TVDOS.SYS b/assets/disk0/tvdos/TVDOS.SYS index 47cd3fc..c4b1845 100644 --- a/assets/disk0/tvdos/TVDOS.SYS +++ b/assets/disk0/tvdos/TVDOS.SYS @@ -396,8 +396,8 @@ _TVDOS.DRV.FS.DEVRND.pread = (fd, ptr, count, offset) => { } _TVDOS.DRV.FS.DEVRND.pwrite = (fd, ptr, count, offset) => {} -_TVDOS.DRV.FS.DEVRND.bwrite = (bytes) => {} -_TVDOS.DRV.FS.DEVRND.swrite = (string) => {} +_TVDOS.DRV.FS.DEVRND.bwrite = (fd, bytes) => {} +_TVDOS.DRV.FS.DEVRND.swrite = (fd, string) => {} _TVDOS.DRV.FS.DEVRND.flush = () => {} _TVDOS.DRV.FS.DEVRND.close = () => {} @@ -408,7 +408,6 @@ _TVDOS.DRV.FS.DEVRND.mkDir = () => {} _TVDOS.DRV.FS.DEVRND.mkFile = () => {} _TVDOS.DRV.FS.DEVRND.remove = () => {} - Object.freeze(_TVDOS.DRV.FS.DEVRND) /////////////////////////////////////////////////////////////////////////////// @@ -424,8 +423,8 @@ _TVDOS.DRV.FS.DEVNUL.bread = (fd) => { return [] } _TVDOS.DRV.FS.DEVNUL.sread = (fd) => { return "" } _TVDOS.DRV.FS.DEVNUL.pwrite = (fd, ptr, count, offset) => {} -_TVDOS.DRV.FS.DEVNUL.bwrite = (bytes) => {} -_TVDOS.DRV.FS.DEVNUL.swrite = (string) => {} +_TVDOS.DRV.FS.DEVNUL.bwrite = (fd, bytes) => {} +_TVDOS.DRV.FS.DEVNUL.swrite = (fd, string) => {} _TVDOS.DRV.FS.DEVNUL.flush = () => {} _TVDOS.DRV.FS.DEVNUL.close = () => {} @@ -436,11 +435,85 @@ _TVDOS.DRV.FS.DEVNUL.mkDir = () => {} _TVDOS.DRV.FS.DEVNUL.mkFile = () => {} _TVDOS.DRV.FS.DEVNUL.remove = () => {} - Object.freeze(_TVDOS.DRV.FS.DEVNUL) /////////////////////////////////////////////////////////////////////////////// +_TVDOS.DRV.FS.DEVZERO = {} + +_TVDOS.DRV.FS.DEVZERO.pread = (fd, ptr, count, offset) => { + for (let i = 0; i < count; i++) { + sys.poke(ptr + i, 0) + } +} + +_TVDOS.DRV.FS.DEVZERO.pwrite = (fd, ptr, count, offset) => {} +_TVDOS.DRV.FS.DEVZERO.bwrite = (fd, bytes) => {} +_TVDOS.DRV.FS.DEVZERO.swrite = (fd, string) => {} + +_TVDOS.DRV.FS.DEVZERO.flush = () => {} +_TVDOS.DRV.FS.DEVZERO.close = () => {} +_TVDOS.DRV.FS.DEVZERO.isDirectory = () => false +_TVDOS.DRV.FS.DEVZERO.listFiles = () => undefined +_TVDOS.DRV.FS.DEVZERO.touch = () => {} +_TVDOS.DRV.FS.DEVZERO.mkDir = () => {} +_TVDOS.DRV.FS.DEVZERO.mkFile = () => {} +_TVDOS.DRV.FS.DEVZERO.remove = () => {} + +Object.freeze(_TVDOS.DRV.FS.DEVZERO) + +/////////////////////////////////////////////////////////////////////////////// + +_TVDOS.DRV.FS.DEVCON = {} + +_TVDOS.DRV.FS.DEVCON.pread = (fd, ptr, count, offset) => { + let mem = graphics.getGpuMemBase() + let consize = Math.min(count, grapihcs.getTermDimension().sum()) + for (let i = 0; i < consize; i++) { + sys.poke(ptr + i, sys.peek(mem - 5122 - i)) + } +} +_TVDOS.DRV.FS.DEVCON.bread = (fd) => { + let mem = graphics.getGpuMemBase() + let consize = Math.min(count, grapihcs.getTermDimension().sum()) + let r = new Uint8Array(consize) + for (let i = 0; i < consize; i++) { + r[i] = sys.peek(mem - 5122 - i) + } + return r +} +_TVDOS.DRV.FS.DEVCON.sread = (fd) => { + let mem = graphics.getGpuMemBase() + let consize = Math.min(count, grapihcs.getTermDimension().sum()) + let r = '' + for (let i = 0; i < consize; i++) { + r += String.fromCharCode(sys.peek(mem - 5122 - i)) + } + return r +} + +_TVDOS.DRV.FS.DEVCON.pwrite = (fd, ptr, count, offset) => {} +_TVDOS.DRV.FS.DEVCON.bwrite = (fd, bytes) => { + let string = String.fromCharCode.apply(null, bytes) // no spreading: has length limit + _TVDOS.DRV.FS.DEVZERO.swrite(fd, string) +} +_TVDOS.DRV.FS.DEVCON.swrite = (fd, string) => { + print(string) +} + +_TVDOS.DRV.FS.DEVCON.flush = () => {} +_TVDOS.DRV.FS.DEVCON.close = () => {} +_TVDOS.DRV.FS.DEVCON.isDirectory = () => false +_TVDOS.DRV.FS.DEVCON.listFiles = () => undefined +_TVDOS.DRV.FS.DEVCON.touch = () => {} +_TVDOS.DRV.FS.DEVCON.mkDir = () => {} +_TVDOS.DRV.FS.DEVCON.mkFile = () => {} +_TVDOS.DRV.FS.DEVCON.remove = () => {} + +Object.freeze(_TVDOS.DRV.FS.DEVCON) + +/////////////////////////////////////////////////////////////////////////////// + // Legacy Serial filesystem, !!pending for removal!! const filesystem = {}; diff --git a/assets/disk0/tvdos/bin/command.js b/assets/disk0/tvdos/bin/command.js index 3a0df6a..1f7b091 100644 --- a/assets/disk0/tvdos/bin/command.js +++ b/assets/disk0/tvdos/bin/command.js @@ -590,7 +590,7 @@ shell.execute = function(line) { sendLcdMsg(_G.shellProgramTitles[_G.shellProgramTitles.length - 1]); //serial.println(_G.shellProgramTitles); - errorlevel = execApp(programCode, tokens, `tvdosExec$${cmd}$` + searchPath.replaceAll(/[^A-Za-z0-9_]/g, "$")); // return value of undefined will cast into 0 + errorlevel = execApp(programCode, tokens, `tvdosExec$${cmd}$${searchPath}`.replaceAll(/[^A-Za-z0-9_]/g, "$")); // return value of undefined will cast into 0 } catch (e) { gotError = true; diff --git a/tsvm_core/src/net/torvald/tsvm/GraphicsJSR223Delegate.kt b/tsvm_core/src/net/torvald/tsvm/GraphicsJSR223Delegate.kt index 125e9ad..91e47f7 100644 --- a/tsvm_core/src/net/torvald/tsvm/GraphicsJSR223Delegate.kt +++ b/tsvm_core/src/net/torvald/tsvm/GraphicsJSR223Delegate.kt @@ -14,6 +14,10 @@ class GraphicsJSR223Delegate(val vm: VM) { return vm.findPeribyType(VM.PERITYPE_GPU_AND_TERM)?.peripheral as? GraphicsAdapter } + fun getGpuMemBase(): Int { + return -1 - (1048576 * (vm.findPeriIndexByType(VM.PERITYPE_GPU_AND_TERM) ?: 0)) + } + fun getVramSize() { getFirstGPU()?.mmio_read(11) } diff --git a/tsvm_core/src/net/torvald/tsvm/VM.kt b/tsvm_core/src/net/torvald/tsvm/VM.kt index fa7ff69..f7384e2 100644 --- a/tsvm_core/src/net/torvald/tsvm/VM.kt +++ b/tsvm_core/src/net/torvald/tsvm/VM.kt @@ -103,6 +103,13 @@ class VM( return null } + fun findPeriIndexByType(searchTerm: String): Int? { + for (i in 0 until peripheralSlots) { + if (peripheralTable[i].type == searchTerm) return i + } + return null + } + fun update(delta: Float) { getIO().update(delta) }