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 e4874a3..dd5e702 100644 Binary files a/FontROM7x14.png and b/FontROM7x14.png differ 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())