From 8eebf53b606957bcee2fc7d3b883558684f84060 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Thu, 29 Sep 2022 21:28:58 +0900 Subject: [PATCH] doc update --- doc/implementation.tex | 129 +++++++++++++++++++++++++++++++---------- doc/tsvmcp.png | Bin 28786 -> 28797 bytes doc/tsvmman.idx | 29 --------- doc/tsvmman.ilg | 6 -- doc/tsvmman.ind | 62 -------------------- doc/tsvmman.tex | 1 + doc/tvdos.tex | 12 ++-- 7 files changed, 103 insertions(+), 136 deletions(-) delete mode 100644 doc/tsvmman.idx delete mode 100644 doc/tsvmman.ilg delete mode 100644 doc/tsvmman.ind diff --git a/doc/implementation.tex b/doc/implementation.tex index 8bbb0f2..b924977 100644 --- a/doc/implementation.tex +++ b/doc/implementation.tex @@ -244,7 +244,7 @@ if (0 == status){ \section{Communication MMIO and How It Actually Works} -\index{MMIO-com}The status flags and transfer/receive blocks are memory-mapped to these address: +\index{MMIO-com}\label{comm-mmio}The status flags and transfer/receive blocks are memory-mapped to these address: \footnote{RW stands for read-write status. RW means both reading and writing is posseble, RO means it's read-only} @@ -538,6 +538,41 @@ The MMIO Area is further divided as shown: \draw(3,0.5) node[anchor=mid] {\memlabel{MMIO for Peripheral \#7}}; \end{tikzpicture} + +\section{MMIO for Main Hardwares} + +Some internal hardwares are memory-mapped and can be controled by poking and peeking. + +Multibyte values are stored in Little Endian. + +\index{main hardware memory mapping} +\begin{tabulary}{\textwidth}{rcL} +Address & RW & Description \\ +\hline +-1..-32 & RO & Raw Keyboard Input Buffer (raw means the values are not shifted around) \\ +-33..-34 & RO & Mouse X Pos (latched by -40) \\ +-35..-36 & RO & Mouse Y Pos (latched by -40) \\ +-37 & RO & Mouse Button Down (1 if True) \\ +-38 & RW & The head key on the Keyboard Input Buffer \\ +-39 & RW & Text Input Stream control. Write nonzero value to open it. The Keyboard Input Buffer will be cleared whenever the Input Stream is opened. \\ +-40 & WO & Latch Keyboard and Mouse input \\ +-41..-48 & RO & List of pressed keys (latched by -40) \\ +-49 & RO & System Flags A (code{0b r000 000t}, where r: RESET button held, t: STOP button held) \\ +-50..-52 & RO & Unused System Flags \\ +-65..-68 & RO & Size of the Scratchpad Memory \\ +-69 & WO & Counter Latch (\code{0b01}--Uptime, \code{0b10}--RTC) \\ +-73..-80 & RO & System Uptime in nanoseconds (latched by -69) \\ +-81..-88 & RO & RTC in nanoseconds (latched by -69) \\ +-89 & RW & ROM Mapping \\ +-1025..-2048 & RW & Reserved for the integrated peripherals \\ +-4077..-20480 & $ \ast $ & See \ref{comm-mmio} \\ +-65537..-131072 & RO & Contents in the mapped ROM +\end{tabulary} + + + + + \chapter{Text and Graphics Display} TODO: Textbuf, pixelbuf, graphics mode, chart of the draw order @@ -548,8 +583,38 @@ While the graphics adapters can be plugged into any peripheral slot, it is highl \index{text buffer}The reference text buffer stores 80 columns, 32 rows of characters and 256 foreground and background colours are assigned separately for each character cell. -Text buffer is memory-mapped to the following address offset: +\subsection{Escape Sequences} +\newcommand{\csi}{{\condensedfont{CSI}}} + +Printing out certain sequences of string can invoke special functions on the graphics, and such sequneces are called Escape Sequences. + +For the following chart, please interpret \csi\ as \code{\rs{}x1B [}. + +\begin{tabulary}{\textwidth}{lL} +Sequence & Description \\ +\hline +\csi\ \emph{n} A & Moves the cursor up by \emph{n} (default \code{1}) \\ +\csi\ \emph{n} B & Moves the cursor down by \emph{n} (default \code{1}) \\ +\csi\ \emph{n} C & Moves the cursor right by \emph{n} (default \code{1}) \\ +\csi\ \emph{n} D & Moves the cursor left by \emph{n (default \code{1})} \\ +\csi\ \emph{n} E & Moves the cursor to the beginning of the line \emph{n} (default \code{1}) lines down \\ +\csi\ \emph{n} F & Moves the cursor to the beginning of the line \emph{n} (default \code{1}) lines up \\ +\csi\ \emph{n} G & Moves the cursor to the \emph{n}th (default \code{1}) column \\ +\csi\ \emph{n} ; \emph{m} H & Moves the cursor to \emph{n}th row, \emph{m}th column \\ +\csi\ 2 J & Clears the entire text buffer \\ +\csi\ \emph{n} S & Scoll the entire page up by \emph{n} (default \code{1}) lines \\ +\csi\ \emph{n} T & Scoll the entire page down by \emph{n} (default \code{1}) lines \\ +\csi\ m & Resets the text attributes to the default status \\ +\csi\ 7 m & Inverts the text by swapping the foreground and background colour \\ +\csi\ 30-37 m & Changes the foreground colour. 30--Black, 31--Red, 32--Green, 33--Yellow, 34--Blue, 35--Magenta, 36--Cyan, 37--White \\ +\csi\ 40-47 m & Changes the background colour. 40--Black, 41--Red, 42--Green, 43--Yellow, 44--Blue, 45--Magenta, 46--Cyan, 47--White \\ +\csi\ 38 ; 5 ; \emph{col} m & Changes the foreground colour using the Colour Palette \\ +\csi\ 48 ; 5 ; \emph{col} m & Changes the foreground colour using the Colour Palette \\ +\csi\ ? 25 h & Shows the text cursor \\ +\csi\ ? 25 l & Hides the text cursor \\ +{\condensedfont{\rs{}x84} \emph{charcode}} u & Prints out the symbol corresponds to the given charcode +\end{tabulary} \subsection{Code Page} \label{codepage} @@ -886,35 +951,35 @@ TODO Multibyte values are stored in Little Endian. \index{graphics adapter memory mapping} -\begin{tabulary}{\textwidth}{rL} -Address & Description \\ +\begin{tabulary}{\textwidth}{rcL} +Address & RW & Description \\ \hline --131073..-131074 & Framebuffer Width \\ --131075..-131076 & Framebuffer Height \\ --131077 & Text Columns \\ --131078 & Text Rows \\ --131079 & Text Mode Attributes \\ --131080 & Graphics Mode Attributes \\ --131081 & Last Used Colour for the Framebuffer \\ --131082 & Text Foreground Colour \\ --131083 & Text Background Colour \\ --131084 & Number of Graphics Memory Banks (1--4) \\ --131085 & Current Graphics Mode \\ --131086 & Current Layer Arrangement Index \\ --131087..-131088 & Framebuffer Horizontal Scroll \\ --131089..-131090 & Framebuffer Vertical Scroll \\ --132097..-131120 & Scanline Offsets \\ --1048577..-1299456 & First Framebuffer \\ --1299457 & Screen Background RED \\ --1299458 & Screen Background GREEN \\ --1299459 & Screen Background BLUE \\ --1299460 & Command \\ --1299461..-1299472 & Command Arguments \\ --1300607..-1302526 & Font ROM Mapping Area \\ --1302527..-1302528 & Text Cursor Position in $row \times 80 + col$ \\ --1302529..-1305088 & Text Foreground Colours \\ --1305089..-1307648 & Text Background Colours \\ --1307649..-1310208 & Text Buffer \\ --1310209..-1310720 & Palettes in This Pattern: {\ttfamily 0b RRRR GGGG; 0b BBBB AAAA} \\ --1310721..-1561600 & Second Framebuffer \\ +-131073..-131074 & RO & Framebuffer Width \\ +-131075..-131076 & RO & Framebuffer Height \\ +-131077 & RO & Text Columns \\ +-131078 & RO & Text Rows \\ +-131079 & RW & Text Mode Attributes \\ +-131080 & RW & Graphics Mode Attributes \\ +-131081 & RO & Last Used Colour for the Framebuffer \\ +-131082 & RW & Text Foreground Colour \\ +-131083 & RW & Text Background Colour \\ +-131084 & RO & Number of Graphics Memory Banks (1--4) \\ +-131085 & RW & Current Graphics Mode \\ +-131086 & RW & Current Layer Arrangement Index \\ +-131087..-131088 & RW & Framebuffer Horizontal Scroll \\ +-131089..-131090 & RW & Framebuffer Vertical Scroll \\ +-132097..-131120 & RW & Scanline Offsets \\ +-1048577..-1299456 & RW & First Framebuffer \\ +-1299457 & RW & Screen Background RED \\ +-1299458 & RW & Screen Background GREEN \\ +-1299459 & RW & Screen Background BLUE \\ +-1299460 & RW & Command \\ +-1299461..-1299472 & RW & Command Arguments \\ +-1300607..-1302526 & RW & Font ROM Mapping Area \\ +-1302527..-1302528 & RW & Text Cursor Position in $row \times 80 + col$ \\ +-1302529..-1305088 & RW & Text Foreground Colours \\ +-1305089..-1307648 & RW & Text Background Colours \\ +-1307649..-1310208 & RW & Text Buffer \\ +-1310209..-1310720 & RW & Palettes in This Pattern: {\ttfamily 0b RRRR GGGG; 0b BBBB AAAA} \\ +-1310721..-1561600 & RW & Second Framebuffer \\ \end{tabulary} diff --git a/doc/tsvmcp.png b/doc/tsvmcp.png index 42fac240bcf935f702f66b7d6c17b93afa5f4a98..445b1d71f83100e18fa964a5ce83fcb61a112464 100644 GIT binary patch literal 28797 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 literal 28786 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 diff --git a/doc/tsvmman.idx b/doc/tsvmman.idx deleted file mode 100644 index 2153f10..0000000 --- a/doc/tsvmman.idx +++ /dev/null @@ -1,29 +0,0 @@ -\indexentry{js extensions|hyperpage}{7} -\indexentry{stdio (library)|hyperpage}{9} -\indexentry{console (library)|hyperpage}{9} -\indexentry{con (library)|hyperpage}{9} -\indexentry{gzip (library)|hyperpage}{12} -\indexentry{gzip (library)|hyperpage}{12} -\indexentry{base64 (library)|hyperpage}{13} -\indexentry{base64 (library)|hyperpage}{13} -\indexentry{sys (library)|hyperpage}{13} -\indexentry{block communication|hyperpage}{16} -\indexentry{com (library)|hyperpage}{16} -\indexentry{com (library)|hyperpage}{16} -\indexentry{MMIO-com|hyperpage}{18} -\indexentry{keycodes|hyperpage}{20} -\indexentry{code page|hyperpage}{22} -\indexentry{colour palette|hyperpage}{24} -\indexentry{graphics (library)|hyperpage}{26} -\indexentry{graphics (library)|hyperpage}{26} -\indexentry{MMIO-graphics|hyperpage}{26} -\indexentry{boot process|hyperpage}{29} -\indexentry{coreutils (DOS)|hyperpage}{30} -\indexentry{built-in apps (DOS)|hyperpage}{31} -\indexentry{user apps (DOS)|hyperpage}{33} -\indexentry{pipe (DOS)|hyperpage}{35} -\indexentry{filesystem (DOS)|hyperpage}{37} -\indexentry{file descriptor (DOS)|hyperpage}{37} -\indexentry{device file|hyperpage}{39} -\indexentry{input (DOS)|hyperpage}{41} -\indexentry{gl (DOS)|hyperpage}{43} diff --git a/doc/tsvmman.ilg b/doc/tsvmman.ilg deleted file mode 100644 index 88cfddc..0000000 --- a/doc/tsvmman.ilg +++ /dev/null @@ -1,6 +0,0 @@ -This is makeindex, version 2.16 [TeX Live 2022] (kpathsea + Thai support). -Scanning input file tsvmman.idx....done (29 entries accepted, 0 rejected). -Sorting entries....done (142 comparisons). -Generating output file tsvmman.ind....done (62 lines written, 0 warnings). -Output written in tsvmman.ind. -Transcript written in tsvmman.ilg. diff --git a/doc/tsvmman.ind b/doc/tsvmman.ind deleted file mode 100644 index cfa5177..0000000 --- a/doc/tsvmman.ind +++ /dev/null @@ -1,62 +0,0 @@ -\begin{theindex} - - \item base64 (library), \hyperpage{13} - \item block communication, \hyperpage{16} - \item boot process, \hyperpage{29} - \item built-in apps (DOS), \hyperpage{31} - - \indexspace - - \item code page, \hyperpage{22} - \item colour palette, \hyperpage{24} - \item com (library), \hyperpage{16} - \item con (library), \hyperpage{9} - \item console (library), \hyperpage{9} - \item coreutils (DOS), \hyperpage{30} - - \indexspace - - \item device file, \hyperpage{39} - - \indexspace - - \item file descriptor (DOS), \hyperpage{37} - \item filesystem (DOS), \hyperpage{37} - - \indexspace - - \item gl (DOS), \hyperpage{43} - \item graphics (library), \hyperpage{26} - \item gzip (library), \hyperpage{12} - - \indexspace - - \item input (DOS), \hyperpage{41} - - \indexspace - - \item js extensions, \hyperpage{7} - - \indexspace - - \item keycodes, \hyperpage{20} - - \indexspace - - \item MMIO-com, \hyperpage{18} - \item MMIO-graphics, \hyperpage{26} - - \indexspace - - \item pipe (DOS), \hyperpage{35} - - \indexspace - - \item stdio (library), \hyperpage{9} - \item sys (library), \hyperpage{13} - - \indexspace - - \item user apps (DOS), \hyperpage{33} - -\end{theindex} diff --git a/doc/tsvmman.tex b/doc/tsvmman.tex index 9d30329..f5590ea 100644 --- a/doc/tsvmman.tex +++ b/doc/tsvmman.tex @@ -102,6 +102,7 @@ \newcommand\forceindent{\hskip1.5em} %% BASIC operators %% +\newcommand\rs{\symbol{92}} \newcommand\tildechar{{\large\raisebox{-0.22ex}{\char`\~}}} \newcommand{\instbit}[1]{\mbox{\scriptsize #1}} \newcommand{\instbitrange}[2]{~\instbit{#1} \hfill \instbit{#2}~} diff --git a/doc/tvdos.tex b/doc/tvdos.tex index e830db6..0ce38d0 100644 --- a/doc/tvdos.tex +++ b/doc/tvdos.tex @@ -4,12 +4,10 @@ All \thedos-related features requires the DOS to be fully loaded. -On this documentation, what would be a reverse solidus (e.g. directory separators) are typesetted using a slash; while they \emph{are} interchangeable, using the reverse solidus are recommended for path input. - \chapter{Bootstrapping} -\index{boot process}\thedos\ goes through follwing progress to deliver the \code{A:/} prompt: +\index{boot process}\thedos\ goes through follwing progress to deliver the \code{A:\rs} prompt: \section{Probing Bootable Devices} BIOS @@ -17,10 +15,10 @@ BIOS \section{The Bootloader} LOADBOOT -Then the Bootsector will try to read and execute \code{A:/tvdos/TVDOS.SYS} +Then the Bootsector will try to read and execute \code{A:\rs{}tvdos\rs{}TVDOS.SYS} \section{TVDOS.SYS} -\thedos.SYS will load system libraries and variables and then will try to run the boot script by executing \code{A:/AUTOEXEC.BAT} +\thedos.SYS will load system libraries and variables and then will try to run the boot script by executing \code{A:\rs{}AUTOEXEC.BAT} \section{AUTOEXEC.BAT} @@ -191,7 +189,7 @@ Functions: \section{The Device Files} -\index{device file}Some devices are also virtualised through the file descriptor, and they are given a special drive letter of \code{\$}. (e.g. \code{\$:/RND}) +\index{device file}Some devices are also virtualised through the file descriptor, and they are given a special drive letter of \code{\$}. (e.g. \code{\$:\rs{}RND}) \begin{outline} \1\inlinesynopsis{RND}{returns random bytes upon reading} @@ -222,7 +220,7 @@ Functions: \dosnamespaceis{Input}{input} \begin{outline} -\1\inlinesynopsis{changeKeyLayout}[layoutName]{Changes the key layout. The key layout file must be stored as \code{A:/tvdos/layoutName.key}} +\1\inlinesynopsis{changeKeyLayout}[layoutName]{Changes the key layout. The key layout file must be stored as \code{A:\rs{}tvdos\rs{}layoutName.key}} \1\inlinesynopsis{withEvent}[callback]{Invokes the callback function when an input event is available.} \end{outline}