From d8f7bb39735e9e643cfcb6cc4dff18666234c9c8 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Fri, 30 Oct 2020 11:45:22 +0900 Subject: [PATCH] stuffs --- FontROM7x14.kra | 4 +- FontROM7x14.png | Bin 3864 -> 3874 bytes assets/tvdos/TVDOS.SYS | 1 + assets/tvdos/command.js | 5 +- assets/tvdos/flsh.js | 106 ++++++++++++++++++ serialdev.txt | 6 + src/net/torvald/tsvm/VMGUI.kt | 3 +- .../torvald/tsvm/peripheral/TestDiskDrive.kt | 2 +- 8 files changed, 120 insertions(+), 7 deletions(-) create mode 100644 assets/tvdos/flsh.js diff --git a/FontROM7x14.kra b/FontROM7x14.kra index 4c52aa9..e9ca39e 100644 --- a/FontROM7x14.kra +++ b/FontROM7x14.kra @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6a07aa23462393b9bf250c01ba5e2e7bd73ce3c2d9426fc66e9d718243095e5b -size 99883 +oid sha256:b927d6be493319d3c8d21e69e3e3ca76420f016d3a849fcb199499dcbdcfefb2 +size 99990 diff --git a/FontROM7x14.png b/FontROM7x14.png index e4874a3d3fe2bc8f819f6fe1eaadc0aef1698bc8..dd5e7022020ba6ea57874a096a2aebd14a771520 100644 GIT binary patch delta 3860 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 Wf&7>srDXsB00{s|MNUMnLSTXhH#BaqFx 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 LNkvXXu0mjfghOaH diff --git a/assets/tvdos/TVDOS.SYS b/assets/tvdos/TVDOS.SYS index 348778a..37f29e8 100644 --- a/assets/tvdos/TVDOS.SYS +++ b/assets/tvdos/TVDOS.SYS @@ -1,5 +1,6 @@ // Boot script var _TVDOS = {}; +_TVDOS.VERSION = "1.0"; _TVDOS.DRIVES = {}; // Object where key-value pair is : [serial-port, drive-number] // actually figure out the drive letter association // Drive A is always the device we're currently on diff --git a/assets/tvdos/command.js b/assets/tvdos/command.js index fae013b..ffe6c70 100644 --- a/assets/tvdos/command.js +++ b/assets/tvdos/command.js @@ -1,10 +1,9 @@ -const DOS_VERSION = "1.0"; -let PROMPT_TEXT = ">"; +const PROMPT_TEXT = ">"; let CURRENT_DRIVE = "A"; let shell_pwd = [""]; -const welcome_text = "TSVM Disk Operating System, version " + DOS_VERSION; +const welcome_text = "TSVM Disk Operating System, version " + _TVDOS.VERSION; function get_prompt_text() { return CURRENT_DRIVE + ":\\" + shell_pwd.join("\\") + PROMPT_TEXT; diff --git a/assets/tvdos/flsh.js b/assets/tvdos/flsh.js new file mode 100644 index 0000000..75756e8 --- /dev/null +++ b/assets/tvdos/flsh.js @@ -0,0 +1,106 @@ +let CURRENT_DRIVE = "A"; + +let shell_pwd = [""]; + +const welcome_text = "TSVM Disk Operating System, version " + _TVDOS.VERSION; + +function print_prompt_text() { + // oh-my-zsh-like prompt + con.color_pair(239,161); + print(" "+CURRENT_DRIVE); + con.color_pair(161,253); + con.addch(16); + con.color_pair(0,253); + print("\\"+shell_pwd.join("\\")); + con.color_pair(253,255); + con.addch(16); + con.addch(32); + con.color_pair(239,255); +} + +function greet() { + con.color_pair(0,253); + //print(welcome_text + " ".repeat(_fsh.scrwidth - welcome_text.length)); + print(welcome_text + " ".repeat(80 - welcome_text.length)); + con.color_pair(239,255); + println(); +} + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +con.clear(); + +greet(); + +let cmdHistory = []; // zeroth element is the oldest +let cmdHistoryScroll = 0; // 0 for outside-of-buffer, 1 for most recent +while (true) { + print_prompt_text(); + + let cmdbuf = ""; + + while (true) { + let key = con.getch(); + + // printable chars + if (key >= 32 && key <= 126) { + let s = String.fromCharCode(key); + cmdbuf += s; + print(s); + } + // backspace + else if (key === 8 && cmdbuf.length > 0) { + cmdbuf = cmdbuf.substring(0, cmdbuf.length - 1); + print(String.fromCharCode(key)); + } + // enter + else if (key === 10 || key === 13) { + println(); + try { + println("You entered: " + cmdbuf); + } + catch (e) { + println(e); + } + finally { + if (cmdbuf.trim().length > 0) + cmdHistory.push(cmdbuf); + + cmdHistoryScroll = 0; + break; + } + } + // up arrow + else if (key === 19 && cmdHistory.length > 0 && cmdHistoryScroll < cmdHistory.length) { + cmdHistoryScroll += 1; + + // back the cursor in order to type new cmd + let x = 0; + for (x = 0; x < cmdbuf.length; x++) print(String.fromCharCode(8)); + cmdbuf = cmdHistory[cmdHistory.length - cmdHistoryScroll]; + // re-type the new command + print(cmdbuf); + + } + // down arrow + else if (key === 20) { + if (cmdHistoryScroll > 0) { + // back the cursor in order to type new cmd + let x = 0; + for (x = 0; x < cmdbuf.length; x++) print(String.fromCharCode(8)); + cmdbuf = cmdHistory[cmdHistory.length - cmdHistoryScroll]; + // re-type the new command + print(cmdbuf); + + cmdHistoryScroll -= 1; + } + else { + // back the cursor in order to type new cmd + let x = 0; + for (x = 0; x < cmdbuf.length; x++) print(String.fromCharCode(8)); + cmdbuf = ""; + } + } + } +} \ No newline at end of file diff --git a/serialdev.txt b/serialdev.txt index 696e3f5..b15d1dd 100644 --- a/serialdev.txt +++ b/serialdev.txt @@ -111,6 +111,12 @@ Description: closes any file that is open. Description: loads a file onto the main memory. The pointer to the file will be sent back to the host device. + LOADBOOT, + +Description: loads a bootloader so that it can be read by the host device through the serial connection. + Technically there's no limit on the size of the bootloader but it's up to the BIOS to read more than + a single block. + CHTYPE,, Description: changes the open file's file type (or its extension) diff --git a/src/net/torvald/tsvm/VMGUI.kt b/src/net/torvald/tsvm/VMGUI.kt index 8bd7aa1..f7eb732 100644 --- a/src/net/torvald/tsvm/VMGUI.kt +++ b/src/net/torvald/tsvm/VMGUI.kt @@ -72,8 +72,9 @@ class VMGUI(val appConfig: LwjglApplicationConfiguration) : ApplicationAdapter() //val fr = FileReader("./assets/tvdos/command.js") //val fr = FileReader("./assets/zippytest.js") - val fr = FileReader("./assets/serialtest.js") + //val fr = FileReader("./assets/serialtest.js") //val fr = FileReader("./assets/tvdos/fsh.js") + val fr = FileReader("./assets/tvdos/flsh.js") //val fr = FileReader("./assets/tbas/basic.js") //val fr = FileReader("./assets/jscon.js") val prg = fr.readText() diff --git a/src/net/torvald/tsvm/peripheral/TestDiskDrive.kt b/src/net/torvald/tsvm/peripheral/TestDiskDrive.kt index c783b1a..06776b1 100644 --- a/src/net/torvald/tsvm/peripheral/TestDiskDrive.kt +++ b/src/net/torvald/tsvm/peripheral/TestDiskDrive.kt @@ -106,7 +106,7 @@ class TestDiskDrive(private val driveNum: Int) : BlockTransferInterface(false, t override fun writeoutImpl(inputData: ByteArray) { if (writeMode) { if (!fileOpen) throw InternalError("File is not open but the drive is in write mode") - + inputData.forEach { if (writeModeLength > 0) { //writeBuffer.write(it.toInt())