From 10beb96f210a24a7f11db65094e02f6fbb361911 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Thu, 1 Sep 2022 21:14:13 +0900 Subject: [PATCH] doc: builtin com and gzip libraries --- doc/implementation.tex | 66 +++++++++++++++---- doc/tsvmman.idx | 40 ++++++----- doc/tsvmman.ilg | 6 +- doc/tsvmman.ind | 33 +++++----- .../net/torvald/tsvm/CompressorDelegate.kt | 15 ++++- 5 files changed, 103 insertions(+), 57 deletions(-) diff --git a/doc/implementation.tex b/doc/implementation.tex index d9d1e5d..26934ac 100644 --- a/doc/implementation.tex +++ b/doc/implementation.tex @@ -34,10 +34,10 @@ Your Javascript program is stored into the Program Memory, and since its capacit \index{stdio (library)}These are standard input/output functions: \begin{outline} -\1\inlinesynopsis{print}{string}{prints a string without a new line.} -\1\inlinesynopsis{println}{string}{prints a string with a new line.} -\1\inlinesynopsis{printerr}{string}{prints a string to error output without a new line.} -\1\inlinesynopsis{printerrln}{string}{prints a string to error output with a new line.} +\1\inlinesynopsis{print}{String}{prints a string without a new line.} +\1\inlinesynopsis{println}{String}{prints a string with a new line.} +\1\inlinesynopsis{printerr}{String}{prints a string to error output without a new line.} +\1\inlinesynopsis{printerrln}{String}{prints a string to error output with a new line.} \1\inlinesynopsis{read}{}{reads a string from the keyboard. Hit the Return to finish reading.} \end{outline} @@ -49,30 +49,67 @@ Your Javascript program is stored into the Program Memory, and since its capacit \namespaceis{Console}{con} +Properties: \begin{outline} +\1\inlinesynopsis{KEY\_HOME}{A keycode for the Home key. 199} +\1\inlinesynopsis{KEY\_UP}{A keycode for the Up arrow key. 200} +\1\inlinesynopsis{KEY\_PAGE\_UP}{A keycode for the Page Up key. 201} +\1\inlinesynopsis{KEY\_LEFT}{A keycode for the Left arrow key. 203} +\1\inlinesynopsis{KEY\_RIGHT}{A keycode for the Right arrow key. 205} +\1\inlinesynopsis{KEY\_END}{A keycode for the End key. 207} +\1\inlinesynopsis{KEY\_DOWN}{A keycode for the Down arrow key. 208} +\1\inlinesynopsis{KEY\_PAGE\_DOWN}{A keycode for the Page Down key. 209} +\1\inlinesynopsis{KEY\_INSERT}{A keycode for the Insert key. 210} +\1\inlinesynopsis{KEY\_DELETE}{A keycode for the Delete key. 211} +\1\inlinesynopsis{KEY\_BACKSPACE}{A keycode for the Backspace key. 8} +\1\inlinesynopsis{KEY\_TAB}{A keycode for the Tab key. 9} +\1\inlinesynopsis{KEY\_RETURN}{A keycode for the Return key. 10} \end{outline} - - -\subsection{System} - -\index{system (library)}System library has the functions to get the status of the system. - -\namespaceis{System}{system} - +Functions: \begin{outline} -\1\inlinesynopsis{maxmem}{}{returns the size of the Scratchpad Memory in bytes.} +\1\formalsynopsis{getch}{}{Returns a key code read from the keyboard.} +\1\formalsynopsis{poll\_keys}{}[Array(8) of Keycodes]{Poll the keyboard, then returns the captured keycodes. If less than 8 keys were held down at the moment of the polling, 0 will be substituted.} +\1\formalsynopsis{move}{y: Int, x: Int}{Moves the text cursor to the given position. Note that the cursor position starts at 1.} +\1\formalsynopsis{addch}{char: Int}{Puts a character denoted by its code point to where the text cursor is. The cursor will not advance.} +\1\formalsynopsis{mvaddch}{y: Int, x: Int, char: Int}{Combination of \code{move} and \code{addch}.} +\1\formalsynopsis{getmaxyx}{}[Array(2) of Ints]{Returns the size of the terminal in row-column order.} +\1\formalsynopsis{getyx}{}[Array(2) of Ints]{Returns the current position of the text cursor in row-column order.} +\1\formalsynopsis{curs\_up}{}{Moves the text cursor up once.} +\1\formalsynopsis{curs\_down}{}{Moves the text cursor down once. Screen will scroll if the cursor moves out of the screen.} +\1\formalsynopsis{curs\_left}{}{Moves the text cursor left once.} +\1\formalsynopsis{curs\_right}{}{Moves the text cursor right once. Will wrap to the next line if the cursor moves out of the screen.} +\1\formalsynopsis{curs\_set}{mode: Int}{Hides or shows the text cursor. 0 to hide, nonzero to show.} +\1\formalsynopsis{hitterminate}{}[Boolean]{Polls the keyboard and returns true if the Ctrl-C combination were held down.} +\1\formalsynopsis{hiteof}{}[Boolean]{Polls the keyboard and returns true if the Ctrl-D combination were held down.} +\1\formalsynopsis{resetkeybuf}{}{Zero-fills the keyboard input buffer.} +\1\formalsynopsis{video\_reverse}{}{Swaps the foreground and background colour of the text.} +\1\formalsynopsis{color\_fore}{code: Int}{Defines the foreground colour of the text. 0 -- black, 1 -- red, 2 -- green, 3 -- yellow, 4 -- blue, 5 -- magenta, 6 -- cyan, 7 -- white, -1 -- transparent} +\1\formalsynopsis{color\_back}{code: Int}{Defines the background colour of the text.} +\1\formalsynopsis{color\_pair}{fore: Int, back: Int}{Defines the foreground and background colour of the text. Colour code for this function differs from the \textbf{color\_back} and \textbf{color\_fore}; please refer to the \ref{colourpalette}.} +\1\formalsynopsis{clear}{}{Clears the text buffer. The framebuffer (if any) will not be affected.} +\1\formalsynopsis{reset\_graphics}{}{Resets foreground and background colour to defaults and makes the cursor visible if it was hidden.} \end{outline} \subsection{Gzip} -\index{gzip (library)}TODO +\index{gzip (library)}Gzip allows texts and bytes and compressed and decompressed using the gzip format. \namespaceis{Gzip}{gzip} \begin{outline} +\1\formalsynopsis{comp}{String}[UintArray]{Compresses the given string.} +\1\formalsynopsis{comp}{UintArray}[UintArray]{Compresses the given bytes.} +\1\formalsynopsis{compTo}{str: String, outputptr: Int}[Int]{Compresses the given string onto the memory, then returns the size of the compressed bytes.} +\1\formalsynopsis{compTo}{bytes: UintArray, outputptr: Int}[Int]{Compresses the given bytes onto the memory, then returns the size of the compressed bytes.} +\1\formalsynopsis{compFromTo}{inputptr: Int, length: Int, outputptr: Int}[Int]{Compresses the bytes onto the memory, then returns the size of the compressed bytes.} +\1\formalsynopsis{decomp}{String}[UintArray]{Decompresses the given string (compressed bytes represented as series of characters)} +\1\formalsynopsis{decomp}{UintArray}[UintArray]{Decompresses the given bytes.} +\1\formalsynopsis{decompTo}{str: String, outputptr: Int}[Int]{Decompresses the given string onto the memory, then returns the size of the decompressed bytes.} +\1\formalsynopsis{decompTo}{bytes: UintArray, outputptr: Int}[Int]{Decompresses the given bytes onto the memory, then returns the size of the decompressed bytes.} +\1\formalsynopsis{decompFromTo}{inputptr: Int, length: Int, outputptr: Int}[Int]{Decompresses the bytes onto the memory, then returns the size of the decompressed bytes.} \end{outline} @@ -95,6 +132,7 @@ Sys library allows programmers to manipulate the system in low-level. \namespaceis{Sys}{sys} \begin{outline} +\1\formalsynopsis{maxmem}{}[Int]{returns the size of the Scratchpad Memory in bytes.} \end{outline} diff --git a/doc/tsvmman.idx b/doc/tsvmman.idx index 7a07fac..2b1f56f 100644 --- a/doc/tsvmman.idx +++ b/doc/tsvmman.idx @@ -2,24 +2,22 @@ \indexentry{stdio (library)|hyperpage}{8} \indexentry{console (library)|hyperpage}{8} \indexentry{con (library)|hyperpage}{8} -\indexentry{system (library)|hyperpage}{8} -\indexentry{system (library)|hyperpage}{8} -\indexentry{gzip (library)|hyperpage}{8} -\indexentry{gzip (library)|hyperpage}{8} -\indexentry{base64 (library)|hyperpage}{9} -\indexentry{base64 (library)|hyperpage}{9} -\indexentry{sys (library)|hyperpage}{9} -\indexentry{block communication|hyperpage}{10} -\indexentry{com (library)|hyperpage}{10} -\indexentry{com (library)|hyperpage}{10} -\indexentry{MMIO-com|hyperpage}{12} -\indexentry{keycodes|hyperpage}{14} -\indexentry{code page|hyperpage}{16} -\indexentry{colour palette|hyperpage}{18} -\indexentry{MMIO-graphics|hyperpage}{20} -\indexentry{boot process|hyperpage}{23} -\indexentry{filesystem (DOS)|hyperpage}{25} -\indexentry{file descriptor (DOS)|hyperpage}{25} -\indexentry{device file|hyperpage}{27} -\indexentry{input (DOS)|hyperpage}{29} -\indexentry{gl (DOS)|hyperpage}{29} +\indexentry{gzip (library)|hyperpage}{10} +\indexentry{gzip (library)|hyperpage}{10} +\indexentry{base64 (library)|hyperpage}{11} +\indexentry{base64 (library)|hyperpage}{11} +\indexentry{sys (library)|hyperpage}{12} +\indexentry{block communication|hyperpage}{13} +\indexentry{com (library)|hyperpage}{13} +\indexentry{com (library)|hyperpage}{13} +\indexentry{MMIO-com|hyperpage}{15} +\indexentry{keycodes|hyperpage}{17} +\indexentry{code page|hyperpage}{19} +\indexentry{colour palette|hyperpage}{21} +\indexentry{MMIO-graphics|hyperpage}{23} +\indexentry{boot process|hyperpage}{26} +\indexentry{filesystem (DOS)|hyperpage}{28} +\indexentry{file descriptor (DOS)|hyperpage}{28} +\indexentry{device file|hyperpage}{30} +\indexentry{input (DOS)|hyperpage}{32} +\indexentry{gl (DOS)|hyperpage}{32} diff --git a/doc/tsvmman.ilg b/doc/tsvmman.ilg index a180ea5..96b09dc 100644 --- a/doc/tsvmman.ilg +++ b/doc/tsvmman.ilg @@ -1,6 +1,6 @@ This is makeindex, version 2.16 [TeX Live 2022] (kpathsea + Thai support). -Scanning input file tsvmman.idx....done (25 entries accepted, 0 rejected). -Sorting entries....done (112 comparisons). -Generating output file tsvmman.ind....done (52 lines written, 0 warnings). +Scanning input file tsvmman.idx....done (23 entries accepted, 0 rejected). +Sorting entries....done (101 comparisons). +Generating output file tsvmman.ind....done (51 lines written, 0 warnings). Output written in tsvmman.ind. Transcript written in tsvmman.ilg. diff --git a/doc/tsvmman.ind b/doc/tsvmman.ind index d35751d..3e9e2a3 100644 --- a/doc/tsvmman.ind +++ b/doc/tsvmman.ind @@ -1,34 +1,34 @@ \begin{theindex} - \item base64 (library), \hyperpage{9} - \item block communication, \hyperpage{10} - \item boot process, \hyperpage{23} + \item base64 (library), \hyperpage{11} + \item block communication, \hyperpage{13} + \item boot process, \hyperpage{26} \indexspace - \item code page, \hyperpage{16} - \item colour palette, \hyperpage{18} - \item com (library), \hyperpage{10} + \item code page, \hyperpage{19} + \item colour palette, \hyperpage{21} + \item com (library), \hyperpage{13} \item con (library), \hyperpage{8} \item console (library), \hyperpage{8} \indexspace - \item device file, \hyperpage{27} + \item device file, \hyperpage{30} \indexspace - \item file descriptor (DOS), \hyperpage{25} - \item filesystem (DOS), \hyperpage{25} + \item file descriptor (DOS), \hyperpage{28} + \item filesystem (DOS), \hyperpage{28} \indexspace - \item gl (DOS), \hyperpage{29} - \item gzip (library), \hyperpage{8} + \item gl (DOS), \hyperpage{32} + \item gzip (library), \hyperpage{10} \indexspace - \item input (DOS), \hyperpage{29} + \item input (DOS), \hyperpage{32} \indexspace @@ -36,17 +36,16 @@ \indexspace - \item keycodes, \hyperpage{14} + \item keycodes, \hyperpage{17} \indexspace - \item MMIO-com, \hyperpage{12} - \item MMIO-graphics, \hyperpage{20} + \item MMIO-com, \hyperpage{15} + \item MMIO-graphics, \hyperpage{23} \indexspace \item stdio (library), \hyperpage{8} - \item sys (library), \hyperpage{9} - \item system (library), \hyperpage{8} + \item sys (library), \hyperpage{12} \end{theindex} diff --git a/tsvm_core/src/net/torvald/tsvm/CompressorDelegate.kt b/tsvm_core/src/net/torvald/tsvm/CompressorDelegate.kt index b62bd81..8a606d4 100644 --- a/tsvm_core/src/net/torvald/tsvm/CompressorDelegate.kt +++ b/tsvm_core/src/net/torvald/tsvm/CompressorDelegate.kt @@ -24,6 +24,15 @@ class CompressorDelegate(val vm: VM) { } } + fun compTo(str: String, output: Int): Int { + comp(str).let { + it.forEachIndexed { index, byte -> + vm.poke(output.toLong() + index, byte) + } + return it.size + } + } + fun compTo(ba: ByteArray, output: Int): Int { comp(ba).let { it.forEachIndexed { index, byte -> @@ -37,18 +46,20 @@ class CompressorDelegate(val vm: VM) { fun decomp(str: String) = Companion.decomp(str) fun decomp(ba: ByteArray) = Companion.decomp(ba) - fun decompTo(str: String, pointer: Int) { + fun decompTo(str: String, pointer: Int): Int { val bytes = decomp(str) bytes.forEachIndexed { index, byte -> vm.poke(pointer.toLong() + index, byte) } + return bytes.size } - fun decompTo(ba: ByteArray, pointer: Int) { + fun decompTo(ba: ByteArray, pointer: Int): Int { val bytes = decomp(ba) bytes.forEachIndexed { index, byte -> vm.poke(pointer.toLong() + index, byte) } + return bytes.size } /**