Added reference to Bibi-binary
[fifth.git] / doc / index.html
1 <?xml version="1.0" encoding="utf-8"?>
2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
3 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
4 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
5 <head>
6 <!-- 2022-04-17 Sun 18:14 -->
7 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
8 <meta name="viewport" content="width=device-width, initial-scale=1" />
9 <title>Fifth - virtual machine, operating system, programming language</title>
10 <meta name="generator" content="Org mode" />
11 <meta name="author" content="Svjatoslav Agejenko" />
12 <style type="text/css">
13  <!--/*--><![CDATA[/*><!--*/
14   .title  { text-align: center;
15              margin-bottom: .2em; }
16   .subtitle { text-align: center;
17               font-size: medium;
18               font-weight: bold;
19               margin-top:0; }
20   .todo   { font-family: monospace; color: red; }
21   .done   { font-family: monospace; color: green; }
22   .priority { font-family: monospace; color: orange; }
23   .tag    { background-color: #eee; font-family: monospace;
24             padding: 2px; font-size: 80%; font-weight: normal; }
25   .timestamp { color: #bebebe; }
26   .timestamp-kwd { color: #5f9ea0; }
27   .org-right  { margin-left: auto; margin-right: 0px;  text-align: right; }
28   .org-left   { margin-left: 0px;  margin-right: auto; text-align: left; }
29   .org-center { margin-left: auto; margin-right: auto; text-align: center; }
30   .underline { text-decoration: underline; }
31   #postamble p, #preamble p { font-size: 90%; margin: .2em; }
32   p.verse { margin-left: 3%; }
33   pre {
34     border: 1px solid #ccc;
35     box-shadow: 3px 3px 3px #eee;
36     padding: 8pt;
37     font-family: monospace;
38     overflow: auto;
39     margin: 1.2em;
40   }
41   pre.src {
42     position: relative;
43     overflow: visible;
44     padding-top: 1.2em;
45   }
46   pre.src:before {
47     display: none;
48     position: absolute;
49     background-color: white;
50     top: -10px;
51     right: 10px;
52     padding: 3px;
53     border: 1px solid black;
54   }
55   pre.src:hover:before { display: inline;}
56   /* Languages per Org manual */
57   pre.src-asymptote:before { content: 'Asymptote'; }
58   pre.src-awk:before { content: 'Awk'; }
59   pre.src-C:before { content: 'C'; }
60   /* pre.src-C++ doesn't work in CSS */
61   pre.src-clojure:before { content: 'Clojure'; }
62   pre.src-css:before { content: 'CSS'; }
63   pre.src-D:before { content: 'D'; }
64   pre.src-ditaa:before { content: 'ditaa'; }
65   pre.src-dot:before { content: 'Graphviz'; }
66   pre.src-calc:before { content: 'Emacs Calc'; }
67   pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
68   pre.src-fortran:before { content: 'Fortran'; }
69   pre.src-gnuplot:before { content: 'gnuplot'; }
70   pre.src-haskell:before { content: 'Haskell'; }
71   pre.src-hledger:before { content: 'hledger'; }
72   pre.src-java:before { content: 'Java'; }
73   pre.src-js:before { content: 'Javascript'; }
74   pre.src-latex:before { content: 'LaTeX'; }
75   pre.src-ledger:before { content: 'Ledger'; }
76   pre.src-lisp:before { content: 'Lisp'; }
77   pre.src-lilypond:before { content: 'Lilypond'; }
78   pre.src-lua:before { content: 'Lua'; }
79   pre.src-matlab:before { content: 'MATLAB'; }
80   pre.src-mscgen:before { content: 'Mscgen'; }
81   pre.src-ocaml:before { content: 'Objective Caml'; }
82   pre.src-octave:before { content: 'Octave'; }
83   pre.src-org:before { content: 'Org mode'; }
84   pre.src-oz:before { content: 'OZ'; }
85   pre.src-plantuml:before { content: 'Plantuml'; }
86   pre.src-processing:before { content: 'Processing.js'; }
87   pre.src-python:before { content: 'Python'; }
88   pre.src-R:before { content: 'R'; }
89   pre.src-ruby:before { content: 'Ruby'; }
90   pre.src-sass:before { content: 'Sass'; }
91   pre.src-scheme:before { content: 'Scheme'; }
92   pre.src-screen:before { content: 'Gnu Screen'; }
93   pre.src-sed:before { content: 'Sed'; }
94   pre.src-sh:before { content: 'shell'; }
95   pre.src-sql:before { content: 'SQL'; }
96   pre.src-sqlite:before { content: 'SQLite'; }
97   /* additional languages in org.el's org-babel-load-languages alist */
98   pre.src-forth:before { content: 'Forth'; }
99   pre.src-io:before { content: 'IO'; }
100   pre.src-J:before { content: 'J'; }
101   pre.src-makefile:before { content: 'Makefile'; }
102   pre.src-maxima:before { content: 'Maxima'; }
103   pre.src-perl:before { content: 'Perl'; }
104   pre.src-picolisp:before { content: 'Pico Lisp'; }
105   pre.src-scala:before { content: 'Scala'; }
106   pre.src-shell:before { content: 'Shell Script'; }
107   pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
108   /* additional language identifiers per "defun org-babel-execute"
109        in ob-*.el */
110   pre.src-cpp:before  { content: 'C++'; }
111   pre.src-abc:before  { content: 'ABC'; }
112   pre.src-coq:before  { content: 'Coq'; }
113   pre.src-groovy:before  { content: 'Groovy'; }
114   /* additional language identifiers from org-babel-shell-names in
115      ob-shell.el: ob-shell is the only babel language using a lambda to put
116      the execution function name together. */
117   pre.src-bash:before  { content: 'bash'; }
118   pre.src-csh:before  { content: 'csh'; }
119   pre.src-ash:before  { content: 'ash'; }
120   pre.src-dash:before  { content: 'dash'; }
121   pre.src-ksh:before  { content: 'ksh'; }
122   pre.src-mksh:before  { content: 'mksh'; }
123   pre.src-posh:before  { content: 'posh'; }
124   /* Additional Emacs modes also supported by the LaTeX listings package */
125   pre.src-ada:before { content: 'Ada'; }
126   pre.src-asm:before { content: 'Assembler'; }
127   pre.src-caml:before { content: 'Caml'; }
128   pre.src-delphi:before { content: 'Delphi'; }
129   pre.src-html:before { content: 'HTML'; }
130   pre.src-idl:before { content: 'IDL'; }
131   pre.src-mercury:before { content: 'Mercury'; }
132   pre.src-metapost:before { content: 'MetaPost'; }
133   pre.src-modula-2:before { content: 'Modula-2'; }
134   pre.src-pascal:before { content: 'Pascal'; }
135   pre.src-ps:before { content: 'PostScript'; }
136   pre.src-prolog:before { content: 'Prolog'; }
137   pre.src-simula:before { content: 'Simula'; }
138   pre.src-tcl:before { content: 'tcl'; }
139   pre.src-tex:before { content: 'TeX'; }
140   pre.src-plain-tex:before { content: 'Plain TeX'; }
141   pre.src-verilog:before { content: 'Verilog'; }
142   pre.src-vhdl:before { content: 'VHDL'; }
143   pre.src-xml:before { content: 'XML'; }
144   pre.src-nxml:before { content: 'XML'; }
145   /* add a generic configuration mode; LaTeX export needs an additional
146      (add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
147   pre.src-conf:before { content: 'Configuration File'; }
148
149   table { border-collapse:collapse; }
150   caption.t-above { caption-side: top; }
151   caption.t-bottom { caption-side: bottom; }
152   td, th { vertical-align:top;  }
153   th.org-right  { text-align: center;  }
154   th.org-left   { text-align: center;   }
155   th.org-center { text-align: center; }
156   td.org-right  { text-align: right;  }
157   td.org-left   { text-align: left;   }
158   td.org-center { text-align: center; }
159   dt { font-weight: bold; }
160   .footpara { display: inline; }
161   .footdef  { margin-bottom: 1em; }
162   .figure { padding: 1em; }
163   .figure p { text-align: center; }
164   .equation-container {
165     display: table;
166     text-align: center;
167     width: 100%;
168   }
169   .equation {
170     vertical-align: middle;
171   }
172   .equation-label {
173     display: table-cell;
174     text-align: right;
175     vertical-align: middle;
176   }
177   .inlinetask {
178     padding: 10px;
179     border: 2px solid gray;
180     margin: 10px;
181     background: #ffffcc;
182   }
183   #org-div-home-and-up
184    { text-align: right; font-size: 70%; white-space: nowrap; }
185   textarea { overflow-x: auto; }
186   .linenr { font-size: smaller }
187   .code-highlighted { background-color: #ffff00; }
188   .org-info-js_info-navigation { border-style: none; }
189   #org-info-js_console-label
190     { font-size: 10px; font-weight: bold; white-space: nowrap; }
191   .org-info-js_search-highlight
192     { background-color: #ffff00; color: #000000; font-weight: bold; }
193   .org-svg { width: 90%; }
194   /*]]>*/-->
195 </style>
196 <link rel="stylesheet" type="text/css" href="https://thomasf.github.io/solarized-css/solarized-dark.min.css" />
197 <script type="text/javascript">
198 /*
199 @licstart  The following is the entire license notice for the
200 JavaScript code in this tag.
201
202 Copyright (C) 2012-2020 Free Software Foundation, Inc.
203
204 The JavaScript code in this tag is free software: you can
205 redistribute it and/or modify it under the terms of the GNU
206 General Public License (GNU GPL) as published by the Free Software
207 Foundation, either version 3 of the License, or (at your option)
208 any later version.  The code is distributed WITHOUT ANY WARRANTY;
209 without even the implied warranty of MERCHANTABILITY or FITNESS
210 FOR A PARTICULAR PURPOSE.  See the GNU GPL for more details.
211
212 As additional permission under GNU GPL version 3 section 7, you
213 may distribute non-source (e.g., minimized or compacted) forms of
214 that code without the copy of the GNU GPL normally required by
215 section 4, provided you include this license notice and a URL
216 through which recipients can access the Corresponding Source.
217
218
219 @licend  The above is the entire license notice
220 for the JavaScript code in this tag.
221 */
222 <!--/*--><![CDATA[/*><!--*/
223  function CodeHighlightOn(elem, id)
224  {
225    var target = document.getElementById(id);
226    if(null != target) {
227      elem.cacheClassElem = elem.className;
228      elem.cacheClassTarget = target.className;
229      target.className = "code-highlighted";
230      elem.className   = "code-highlighted";
231    }
232  }
233  function CodeHighlightOff(elem, id)
234  {
235    var target = document.getElementById(id);
236    if(elem.cacheClassElem)
237      elem.className = elem.cacheClassElem;
238    if(elem.cacheClassTarget)
239      target.className = elem.cacheClassTarget;
240  }
241 /*]]>*///-->
242 </script>
243 <script type="text/x-mathjax-config">
244     MathJax.Hub.Config({
245         displayAlign: "center",
246         displayIndent: "0em",
247
248         "HTML-CSS": { scale: 100,
249                         linebreaks: { automatic: "false" },
250                         webFont: "TeX"
251                        },
252         SVG: {scale: 100,
253               linebreaks: { automatic: "false" },
254               font: "TeX"},
255         NativeMML: {scale: 100},
256         TeX: { equationNumbers: {autoNumber: "AMS"},
257                MultLineWidth: "85%",
258                TagSide: "right",
259                TagIndent: ".8em"
260              }
261 });
262 </script>
263 <script type="text/javascript"
264         src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS_HTML"></script>
265 </head>
266 <body>
267 <div id="content">
268 <h1 class="title">Fifth - virtual machine, operating system, programming language</h1>
269 <div id="table-of-contents">
270 <h2>Table of Contents</h2>
271 <div id="text-table-of-contents">
272 <ul>
273 <li><a href="#org53aa659">1. General</a>
274 <ul>
275 <li><a href="#org0222a82">1.1. Source code</a></li>
276 </ul>
277 </li>
278 <li><a href="#org1ba4dab">2. !Project deprecated!</a></li>
279 <li><a href="#org27a9291">3. Introduction</a>
280 <ul>
281 <li><a href="#org7b05666">3.1. screenshots</a></li>
282 </ul>
283 </li>
284 <li><a href="#org5c0e3c1">4. Installation</a></li>
285 <li><a href="#org064502d">5. Fifth distribution directory tree description</a></li>
286 <li><a href="#orge5e54fa">6. Requirements</a>
287 <ul>
288 <li><a href="#org6f95f4b">6.1. Software</a></li>
289 <li><a href="#org51eb820">6.2. Hardware</a></li>
290 <li><a href="#org5d390fa">6.3. Human</a></li>
291 </ul>
292 </li>
293 <li><a href="#org05c7be5">7. Numbers representation within Fifth</a></li>
294 <li><a href="#org06c8993">8. Disk file map, and it's data structures</a>
295 <ul>
296 <li><a href="#org84aa87e">8.1. Disk allocation</a></li>
297 <li><a href="#org524c276">8.2. FAT entry format:</a></li>
298 <li><a href="#org21c233b">8.3. File entry format</a></li>
299 </ul>
300 </li>
301 <li><a href="#orga899cc5">9. Core architecture</a>
302 <ul>
303 <li><a href="#org4df227c">9.1. Dictionary entry format</a></li>
304 <li><a href="#org3ba785a">9.2. Possible module types</a></li>
305 <li><a href="#org787b6e1">9.3. Memory map</a></li>
306 </ul>
307 </li>
308 <li><a href="#org3debeac">10. Virtual machine</a>
309 <ul>
310 <li><a href="#org85776a5">10.1. instruction set</a>
311 <ul>
312 <li><a href="#org10947e1">10.1.1. overview table</a></li>
313 <li><a href="#org42eed2a">10.1.2. kbd@ - read scancode of pressed or released key</a></li>
314 <li><a href="#org3c170f3">10.1.3. vidput - put image1 into image2, at location x, y</a></li>
315 <li><a href="#org4c1b71f">10.1.4. cmove - copy memory array</a></li>
316 <li><a href="#org050fd93">10.1.5. tvidput - put image with transparency support</a></li>
317 <li><a href="#orgfcf732b">10.1.6. charput - draw text character</a></li>
318 </ul>
319 </li>
320 </ul>
321 </li>
322 <li><a href="#org3b7244d">11. Fifth source format</a>
323 <ul>
324 <li><a href="#org3078f68">11.1. FSCII</a></li>
325 </ul>
326 </li>
327 <li><a href="#org7ab9dd0">12. Fifth commands</a>
328 <ul>
329 <li><a href="#orgc19ed00">12.1. Compilation &amp; miscellaneous</a></li>
330 <li><a href="#org52d6182">12.2. Conditionals &amp; control flow</a></li>
331 <li><a href="#org9a1c44e">12.3. Disk &amp; file access</a></li>
332 <li><a href="#orgb7a0ec7">12.4. Dynamic memory</a></li>
333 <li><a href="#orgc2cfe7c">12.5. Graphics and text</a></li>
334 <li><a href="#org0644b6a">12.6. Math, memory &amp; stack manipulation</a></li>
335 <li><a href="#org6965f88">12.7. Dynamic &amp; static strings</a></li>
336 </ul>
337 </li>
338 <li><a href="#orge322491">13. Dynamically loadable modules</a>
339 <ul>
340 <li><a href="#orgc575c29">13.1. Keyboard driver</a></li>
341 <li><a href="#org7c5c975">13.2. Mouse driver</a></li>
342 <li><a href="#org7e9e6e4">13.3. 2D graphic library</a></li>
343 <li><a href="#org53b108e">13.4. Trigonometry functions</a>
344 <ul>
345 <li><a href="#orga868964">13.4.1. sin ( a &#x2013; result )</a></li>
346 <li><a href="#org7e217b7">13.4.2. cos ( a &#x2013; result )</a></li>
347 </ul>
348 </li>
349 </ul>
350 </li>
351 </ul>
352 </div>
353 </div>
354
355 <div id="outline-container-org53aa659" class="outline-2">
356 <h2 id="org53aa659"><span class="section-number-2">1</span> General</h2>
357 <div class="outline-text-2" id="text-1">
358 <ul class="org-ul">
359 <li>This program is free software: released under Creative Commons Zero
360 (CC0) license</li>
361
362 <li>Program author:
363 <ul class="org-ul">
364 <li>Svjatoslav Agejenko</li>
365 <li>Homepage: <a href="https://svjatoslav.eu">https://svjatoslav.eu</a></li>
366 <li>Email: <a href="mailto://svjatoslav@svjatoslav.eu">mailto://svjatoslav@svjatoslav.eu</a></li>
367 </ul></li>
368
369 <li><a href="https://www.svjatoslav.eu/projects/">Other software projects hosted at svjatoslav.eu</a></li>
370 </ul>
371 </div>
372 <div id="outline-container-org0222a82" class="outline-3">
373 <h3 id="org0222a82"><span class="section-number-3">1.1</span> Source code</h3>
374 <div class="outline-text-3" id="text-1-1">
375 <ul class="org-ul">
376 <li><a href="https://www2.svjatoslav.eu/gitweb/?p=fifth.git;a=snapshot;h=HEAD;sf=tgz">Download latest snapshot in TAR GZ format</a></li>
377
378 <li><a href="https://www2.svjatoslav.eu/gitweb/?p=fifth.git;a=summary">Browse Git repository online</a></li>
379
380 <li><p>
381 Clone Git repository using command:
382 </p>
383 <pre class="example">
384 git clone https://www2.svjatoslav.eu/git/fifth.git
385 </pre></li>
386 </ul>
387 </div>
388 </div>
389 </div>
390
391 <div id="outline-container-org1ba4dab" class="outline-2">
392 <h2 id="org1ba4dab"><span class="section-number-2">2</span> !Project deprecated!</h2>
393 <div class="outline-text-2" id="text-2">
394 <p>
395 Current implementation does not support object oriented
396 programming. While working on Fifth I got lots of cool new ideas that
397 require reimplementation of everything.
398 </p>
399
400 <p>
401 Currently I try to implement those new ideas in the project called
402 <a href="https://www3.svjatoslav.eu/projects/sixth/">Sixth</a>.
403 </p>
404
405 <p>
406 System is built many years ago when I was still using DOS as a primary
407 operating system.
408 </p>
409 </div>
410 </div>
411 <div id="outline-container-org27a9291" class="outline-2">
412 <h2 id="org27a9291"><span class="section-number-2">3</span> Introduction</h2>
413 <div class="outline-text-2" id="text-3">
414 <p>
415 Fifth is programming lanquage &amp; operating system, running on <a href="#org3debeac">virtual
416 machine</a>, with custom instruction set. It is much like Charles Chunk
417 Moore's Forth, it also uses stack architecture, and many commands are
418 similar. Basically I got familiar with concepts of Forth, and being
419 inspired created my own system.
420 </p>
421
422 <ul class="org-ul">
423 <li><a href="5TH_ET.txt">Example Fifth source file - text editor</a></li>
424 </ul>
425 </div>
426 <div id="outline-container-org7b05666" class="outline-3">
427 <h3 id="org7b05666"><span class="section-number-3">3.1</span> screenshots</h3>
428 <div class="outline-text-3" id="text-3-1">
429
430 <div class="figure">
431 <p><img src="screenshots/start.png" alt="start.png" />
432 </p>
433 </div>
434
435 <p>
436 Startup screen diplaying Fifth logo and full file list.
437 </p>
438
439
440 <div class="figure">
441 <p><img src="screenshots/dictionary.png" alt="dictionary.png" />
442 </p>
443 </div>
444
445 <p>
446 Sample words defined. Most of the words are commands that can be
447 executed interactively from command line or from file. When executed
448 they can be selectively compiled or interpreted.
449 </p>
450
451
452
453 <div class="figure">
454 <p><img src="screenshots/text editor.png" alt="text editor.png" />
455 </p>
456 </div>
457
458 <p>
459 Built in text editor.
460 </p>
461 </div>
462 </div>
463 </div>
464
465 <div id="outline-container-org5c0e3c1" class="outline-2">
466 <h2 id="org5c0e3c1"><span class="section-number-2">4</span> Installation</h2>
467 <div class="outline-text-2" id="text-4">
468 <p>
469 Just unpack all files, witout altering original directory structure,
470 somewhere in your hard disk. For example: C:\MISC\FIFTH\&#x2026;.  To run
471 fifth you need minimally just 2 files.  emulator itself ( EMULATOR.EXE
472 or EMULATOR.COM ), and virtual disk file ( DISK.RAW ).
473 </p>
474
475 <p>
476 Read more about <a href="#org064502d">Fifth distribution directory tree description</a>.
477 </p>
478 </div>
479 </div>
480
481 <div id="outline-container-org064502d" class="outline-2">
482 <h2 id="org064502d"><span class="section-number-2">5</span> Fifth distribution directory tree description</h2>
483 <div class="outline-text-2" id="text-5">
484 <p>
485 After downloading and unpacking the ZIP file you shoud get directory
486 tree similar to this:
487 </p>
488
489 <p class="verse">
490 <b>DOC</b>                   - Fifth documentation<br />
491 &#xa0;&#xa0;<b>commands</b>            - documentation on Fifth built-in commands<br />
492 &#xa0;&#xa0;<b>modules</b>             - documentation on additional commands, realized as loadable modules<br />
493 &#xa0;&#xa0;<b>shots</b>               - Fifth screenshots<br />
494 <br />
495 <b>imageFile</b>             - files contained within 'disk.raw', just an extracted form.<br />
496 <br />
497 <b>source</b>                - source files<br />
498 &#xa0;&#xa0;<b>emulator</b>            - emulator source<br />
499 &#xa0;&#xa0;<b>util</b>                - utilites<br />
500 <br />
501 <b>disk.raw</b>                - Virtual disk file, has filesystem inside.<br />
502 <b>emulator.com</b>            - main executable.<br />
503 </p>
504 </div>
505 </div>
506
507 <div id="outline-container-orge5e54fa" class="outline-2">
508 <h2 id="orge5e54fa"><span class="section-number-2">6</span> Requirements</h2>
509 <div class="outline-text-2" id="text-6">
510 </div>
511 <div id="outline-container-org6f95f4b" class="outline-3">
512 <h3 id="org6f95f4b"><span class="section-number-3">6.1</span> Software</h3>
513 <div class="outline-text-3" id="text-6-1">
514 <ul class="org-ul">
515 <li>MS-DOS 6.22, with HIMEM.SYS loaded.</li>
516 <li>Mouse driver if you have a mouse.</li>
517 <li>Does work only when CPU is in real mode.</li>
518 <li>To recompile ASM sources I used FASM (Flat Assembler).</li>
519 <li>I ran QBasic utilities on QB 4.5 .</li>
520 <li>VESA support by BIOS, or external driver (UNIVBE).</li>
521 </ul>
522 </div>
523 </div>
524 <div id="outline-container-org51eb820" class="outline-3">
525 <h3 id="org51eb820"><span class="section-number-3">6.2</span> Hardware</h3>
526 <div class="outline-text-3" id="text-6-2">
527 <ul class="org-ul">
528 <li>Minimum CPU 386.</li>
529 <li>64 KB free RAM below 640KB,</li>
530 <li>2 MB of free XMS.</li>
531 <li>VESA compatible video card.</li>
532 </ul>
533 </div>
534 </div>
535 <div id="outline-container-org5d390fa" class="outline-3">
536 <h3 id="org5d390fa"><span class="section-number-3">6.3</span> Human</h3>
537 <div class="outline-text-3" id="text-6-3">
538 <ul class="org-ul">
539 <li>Beginner level Forth knowledge is recommended.</li>
540 <li>Lots of enthusiasm.</li>
541 </ul>
542 </div>
543 </div>
544 </div>
545 <div id="outline-container-org05c7be5" class="outline-2">
546 <h2 id="org05c7be5"><span class="section-number-2">7</span> Numbers representation within Fifth</h2>
547 <div class="outline-text-2" id="text-7">
548 <p>
549 Because we are in full experimentation mode here (no regard for
550 compatibility whatsoever), why not to try also alternative number
551 representation ?
552 </p>
553
554 <p>
555 Here alternative hexadecimal number representation format is devised:
556 </p>
557
558
559 <div class="figure">
560 <p><a href="numbers.png"><img src="numbers.png" alt="numbers.png" /></a>
561 </p>
562 </div>
563
564 <p>
565 Essentially square is split into 4 triangles. Each triangle represents
566 one bit.
567 </p>
568
569 <p>
570 Fifth uses this hexadecimal format as primary throughout entire
571 system.
572 </p>
573
574 <p>
575 See also: <a href="https://en.wikipedia.org/wiki/Bibi-binary">Bibi-binary</a>.
576 </p>
577 </div>
578 </div>
579
580 <div id="outline-container-org06c8993" class="outline-2">
581 <h2 id="org06c8993"><span class="section-number-2">8</span> Disk file map, and it's data structures</h2>
582 <div class="outline-text-2" id="text-8">
583 <p>
584 Core and high-level boot code is stored outside of the filesystem to
585 allow easy access to it, at early booting time, when filesystem is not
586 yet initialized.
587 </p>
588 </div>
589 <div id="outline-container-org84aa87e" class="outline-3">
590 <h3 id="org84aa87e"><span class="section-number-3">8.1</span> Disk allocation</h3>
591 <div class="outline-text-3" id="text-8-1">
592 <table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
593
594
595 <colgroup>
596 <col  class="org-left" />
597
598 <col  class="org-left" />
599
600 <col  class="org-left" />
601 </colgroup>
602 <thead>
603 <tr>
604 <th scope="col" class="org-left">offset</th>
605 <th scope="col" class="org-left">length</th>
606 <th scope="col" class="org-left">description</th>
607 </tr>
608 </thead>
609 <tbody>
610 <tr>
611 <td class="org-left">0</td>
612 <td class="org-left">~4 Kb</td>
613 <td class="org-left">Fifth core</td>
614 </tr>
615
616 <tr>
617 <td class="org-left">4 Kb</td>
618 <td class="org-left">~32 Kb</td>
619 <td class="org-left">high-level boot code</td>
620 </tr>
621
622 <tr>
623 <td class="org-left">37 Kb</td>
624 <td class="org-left">~65 Kb</td>
625 <td class="org-left">FAT</td>
626 </tr>
627
628 <tr>
629 <td class="org-left">101 Kb</td>
630 <td class="org-left">~16 MB</td>
631 <td class="org-left">filesystem data area</td>
632 </tr>
633 </tbody>
634 </table>
635 </div>
636 </div>
637 <div id="outline-container-org524c276" class="outline-3">
638 <h3 id="org524c276"><span class="section-number-3">8.2</span> FAT entry format:</h3>
639 <div class="outline-text-3" id="text-8-2">
640 <table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
641
642
643 <colgroup>
644 <col  class="org-right" />
645
646 <col  class="org-left" />
647 </colgroup>
648 <thead>
649 <tr>
650 <th scope="col" class="org-right">code</th>
651 <th scope="col" class="org-left">meaning</th>
652 </tr>
653 </thead>
654 <tbody>
655 <tr>
656 <td class="org-right">-2</td>
657 <td class="org-left">last sector</td>
658 </tr>
659
660 <tr>
661 <td class="org-right">-1</td>
662 <td class="org-left">empty sector</td>
663 </tr>
664
665 <tr>
666 <td class="org-right">0 --</td>
667 <td class="org-left">.. pointer to next block</td>
668 </tr>
669 </tbody>
670 </table>
671 </div>
672 </div>
673 <div id="outline-container-org21c233b" class="outline-3">
674 <h3 id="org21c233b"><span class="section-number-3">8.3</span> File entry format</h3>
675 <div class="outline-text-3" id="text-8-3">
676 <table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
677
678
679 <colgroup>
680 <col  class="org-right" />
681
682 <col  class="org-right" />
683
684 <col  class="org-left" />
685 </colgroup>
686 <thead>
687 <tr>
688 <th scope="col" class="org-right">offset</th>
689 <th scope="col" class="org-right">length</th>
690 <th scope="col" class="org-left">description</th>
691 </tr>
692 </thead>
693 <tbody>
694 <tr>
695 <td class="org-right">0</td>
696 <td class="org-right">4</td>
697 <td class="org-left">extension</td>
698 </tr>
699
700 <tr>
701 <td class="org-right">4</td>
702 <td class="org-right">16</td>
703 <td class="org-left">name</td>
704 </tr>
705
706 <tr>
707 <td class="org-right">20</td>
708 <td class="org-right">4</td>
709 <td class="org-left">entry point</td>
710 </tr>
711
712 <tr>
713 <td class="org-right">24</td>
714 <td class="org-right">4</td>
715 <td class="org-left">size</td>
716 </tr>
717
718 <tr>
719 <td class="org-right">28</td>
720 <td class="org-right">4</td>
721 <td class="org-left">last modification time</td>
722 </tr>
723 </tbody>
724 </table>
725 </div>
726 </div>
727 </div>
728 <div id="outline-container-orga899cc5" class="outline-2">
729 <h2 id="orga899cc5"><span class="section-number-2">9</span> Core architecture</h2>
730 <div class="outline-text-2" id="text-9">
731 <p>
732 Fifth core is simply some amount of already compiled into machine code
733 and linked together modules (entries in other words). In compilation
734 process modules is compiled one by one and simply stored on top of
735 already existing and growing core. Separately from core is kept
736 dictionary, this is special list that contain names of compiled
737 modules, variables etc. and they locations in core. Constants use
738 dictionary space only. Random word can be removed from dictionary at
739 any time. Currently dictionary can contain at most 1000 entries.
740 </p>
741 </div>
742 <div id="outline-container-org4df227c" class="outline-3">
743 <h3 id="org4df227c"><span class="section-number-3">9.1</span> Dictionary entry format</h3>
744 <div class="outline-text-3" id="text-9-1">
745 <table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
746
747
748 <colgroup>
749 <col  class="org-right" />
750
751 <col  class="org-right" />
752
753 <col  class="org-left" />
754 </colgroup>
755 <thead>
756 <tr>
757 <th scope="col" class="org-right">offset</th>
758 <th scope="col" class="org-right">length</th>
759 <th scope="col" class="org-left">description</th>
760 </tr>
761 </thead>
762 <tbody>
763 <tr>
764 <td class="org-right">0</td>
765 <td class="org-right">4</td>
766 <td class="org-left">0 &amp;lt; previous entry</td>
767 </tr>
768
769 <tr>
770 <td class="org-right">&#xa0;</td>
771 <td class="org-right">&#xa0;</td>
772 <td class="org-left">0 = last</td>
773 </tr>
774
775 <tr>
776 <td class="org-right">&#xa0;</td>
777 <td class="org-right">&#xa0;</td>
778 <td class="org-left">-1 = empty</td>
779 </tr>
780 </tbody>
781 <tbody>
782 <tr>
783 <td class="org-right">4</td>
784 <td class="org-right">15</td>
785 <td class="org-left">module name string</td>
786 </tr>
787 </tbody>
788 <tbody>
789 <tr>
790 <td class="org-right">19</td>
791 <td class="org-right">1</td>
792 <td class="org-left">entry type</td>
793 </tr>
794 </tbody>
795 <tbody>
796 <tr>
797 <td class="org-right">20</td>
798 <td class="org-right">4</td>
799 <td class="org-left">entry data</td>
800 </tr>
801 </tbody>
802 </table>
803
804 <p>
805 Core headers as linked list of module names make up something like
806 dictionary.  When some entry address is needed compiler can quickly
807 run through headers backwards and find needed entry.
808 </p>
809 </div>
810 </div>
811 <div id="outline-container-org3ba785a" class="outline-3">
812 <h3 id="org3ba785a"><span class="section-number-3">9.2</span> Possible module types</h3>
813 <div class="outline-text-3" id="text-9-2">
814 <table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
815
816
817 <colgroup>
818 <col  class="org-right" />
819
820 <col  class="org-left" />
821
822 <col  class="org-left" />
823 </colgroup>
824 <thead>
825 <tr>
826 <th scope="col" class="org-right">type</th>
827 <th scope="col" class="org-left">description</th>
828 <th scope="col" class="org-left">"execute" action</th>
829 </tr>
830 </thead>
831 <tbody>
832 <tr>
833 <td class="org-right">0</td>
834 <td class="org-left">data</td>
835 <td class="org-left">compile "num" instruction</td>
836 </tr>
837
838 <tr>
839 <td class="org-right">&#xa0;</td>
840 <td class="org-left">&#xa0;</td>
841 <td class="org-left">with address to module</td>
842 </tr>
843 </tbody>
844 <tbody>
845 <tr>
846 <td class="org-right">1</td>
847 <td class="org-left">submodule</td>
848 <td class="org-left">compile "call" instruction</td>
849 </tr>
850
851 <tr>
852 <td class="org-right">&#xa0;</td>
853 <td class="org-left">&#xa0;</td>
854 <td class="org-left">with address to module</td>
855 </tr>
856 </tbody>
857 <tbody>
858 <tr>
859 <td class="org-right">2</td>
860 <td class="org-left">imm. submodule</td>
861 <td class="org-left">immediately call to module</td>
862 </tr>
863 </tbody>
864 </table>
865 </div>
866 </div>
867 <div id="outline-container-org787b6e1" class="outline-3">
868 <h3 id="org787b6e1"><span class="section-number-3">9.3</span> Memory map</h3>
869 <div class="outline-text-3" id="text-9-3">
870 <table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
871
872
873 <colgroup>
874 <col  class="org-right" />
875
876 <col  class="org-left" />
877
878 <col  class="org-left" />
879 </colgroup>
880 <thead>
881 <tr>
882 <th scope="col" class="org-right">location</th>
883 <th scope="col" class="org-left">size</th>
884 <th scope="col" class="org-left">description</th>
885 </tr>
886 </thead>
887 <tbody>
888 <tr>
889 <td class="org-right">0</td>
890 <td class="org-left">~4096</td>
891 <td class="org-left">core</td>
892 </tr>
893
894 <tr>
895 <td class="org-right">1500000</td>
896 <td class="org-left">~32000</td>
897 <td class="org-left">highlevel Fifth boot code</td>
898 </tr>
899
900 <tr>
901 <td class="org-right">200000h</td>
902 <td class="org-left">&#xa0;</td>
903 <td class="org-left">core startup messages area</td>
904 </tr>
905
906 <tr>
907 <td class="org-right">5200000</td>
908 <td class="org-left">&#xa0;</td>
909 <td class="org-left">end of dynamic memory space</td>
910 </tr>
911 </tbody>
912 </table>
913 </div>
914 </div>
915 </div>
916 <div id="outline-container-org3debeac" class="outline-2">
917 <h2 id="org3debeac"><span class="section-number-2">10</span> Virtual machine</h2>
918 <div class="outline-text-2" id="text-10">
919 <p>
920 Using CPU emulator slows it down but I shouldn't now think too mutch
921 about, and waste my time on batteling with problems whitch results on
922 complex design of PC hardware. Also it allows me to use existing DOS
923 and resident drivers services in real mode. So I don't need to deal
924 with hardware too mutch. It also allows me to use all free XMS for
925 flat code &amp; data storage.
926 </p>
927
928 <p>
929 Current emulator emulates 1 CPU. It has 2 stacks, ~50 instructions,
930 and 4GB flat address space (theoretically).  I'm not sure that DOS
931 6.22 that I currently prefer can handle more than 64 MB of RAM. While
932 I tried to keep instructionset simple, I was forced to put in lot of
933 complex instructions to make it's performance acceptable on
934 emulator. On actual silicon ~20 instructions is enaugh (I think).
935 </p>
936
937 <p>
938 Maybe one day similar system will run directly on custom silicon chip :)
939 </p>
940
941
942 <p>
943 CPU has following registers:
944 </p>
945 <table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
946
947
948 <colgroup>
949 <col  class="org-left" />
950
951 <col  class="org-left" />
952 </colgroup>
953 <tbody>
954 <tr>
955 <td class="org-left">IP</td>
956 <td class="org-left">instruction pointer</td>
957 </tr>
958
959 <tr>
960 <td class="org-left">DSP</td>
961 <td class="org-left">data stack pointer</td>
962 </tr>
963
964 <tr>
965 <td class="org-left">RSP</td>
966 <td class="org-left">return stack pointer</td>
967 </tr>
968 </tbody>
969 </table>
970 </div>
971 <div id="outline-container-org85776a5" class="outline-3">
972 <h3 id="org85776a5"><span class="section-number-3">10.1</span> instruction set</h3>
973 <div class="outline-text-3" id="text-10-1">
974 </div>
975 <div id="outline-container-org10947e1" class="outline-4">
976 <h4 id="org10947e1"><span class="section-number-4">10.1.1</span> overview table</h4>
977 <div class="outline-text-4" id="text-10-1-1">
978 <p>
979 Virtual CPU, commands (most of them are avaiable as ordinary commands
980 in programming language):
981 </p>
982
983
984 <table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
985
986
987 <colgroup>
988 <col  class="org-right" />
989
990 <col  class="org-left" />
991
992 <col  class="org-left" />
993
994 <col  class="org-left" />
995 </colgroup>
996 <thead>
997 <tr>
998 <th scope="col" class="org-right">#</th>
999 <th scope="col" class="org-left">name</th>
1000 <th scope="col" class="org-left">stack footprint</th>
1001 <th scope="col" class="org-left">description</th>
1002 </tr>
1003 </thead>
1004 <tbody>
1005 <tr>
1006 <td class="org-right">0</td>
1007 <td class="org-left">nop</td>
1008 <td class="org-left">--</td>
1009 <td class="org-left">does nothing</td>
1010 </tr>
1011
1012 <tr>
1013 <td class="org-right">1</td>
1014 <td class="org-left">halt</td>
1015 <td class="org-left">--</td>
1016 <td class="org-left">halt CPU ( return to DOS on emulator )</td>
1017 </tr>
1018
1019 <tr>
1020 <td class="org-right">2</td>
1021 <td class="org-left"><a href="#org42eed2a">kbd@</a></td>
1022 <td class="org-left">&#x2013; c</td>
1023 <td class="org-left">read scancode of pressed or released key</td>
1024 </tr>
1025
1026 <tr>
1027 <td class="org-right">3</td>
1028 <td class="org-left">num &lt;dword&gt;</td>
1029 <td class="org-left">&#x2013; n</td>
1030 <td class="org-left">put immidiate number into datastack</td>
1031 </tr>
1032
1033 <tr>
1034 <td class="org-right">4</td>
1035 <td class="org-left">jmp &lt;dword&gt;</td>
1036 <td class="org-left">--</td>
1037 <td class="org-left">jump to specified code</td>
1038 </tr>
1039
1040 <tr>
1041 <td class="org-right">5</td>
1042 <td class="org-left">call &lt;dword&gt;</td>
1043 <td class="org-left">&#xa0;</td>
1044 <td class="org-left">jump to specified code, save return address to return stack</td>
1045 </tr>
1046
1047 <tr>
1048 <td class="org-right">6</td>
1049 <td class="org-left">1+</td>
1050 <td class="org-left">n &#x2013; n+1</td>
1051 <td class="org-left">&#xa0;</td>
1052 </tr>
1053
1054 <tr>
1055 <td class="org-right">7</td>
1056 <td class="org-left">1-</td>
1057 <td class="org-left">n &#x2013; n-1</td>
1058 <td class="org-left">&#xa0;</td>
1059 </tr>
1060
1061 <tr>
1062 <td class="org-right">8</td>
1063 <td class="org-left">dup</td>
1064 <td class="org-left">n &#x2013; n n</td>
1065 <td class="org-left">duplicate top of data stack</td>
1066 </tr>
1067
1068 <tr>
1069 <td class="org-right">9</td>
1070 <td class="org-left">drop</td>
1071 <td class="org-left">n --</td>
1072 <td class="org-left">drop last element in data stack</td>
1073 </tr>
1074
1075 <tr>
1076 <td class="org-right">10</td>
1077 <td class="org-left">if &lt;dword&gt;</td>
1078 <td class="org-left">n --</td>
1079 <td class="org-left">jump to addr if top element was 0</td>
1080 </tr>
1081
1082 <tr>
1083 <td class="org-right">11</td>
1084 <td class="org-left">ret</td>
1085 <td class="org-left">&#xa0;</td>
1086 <td class="org-left">jump to code, specified in return stack.</td>
1087 </tr>
1088
1089 <tr>
1090 <td class="org-right">12</td>
1091 <td class="org-left">c@</td>
1092 <td class="org-left">addr &#x2013; n</td>
1093 <td class="org-left">read byte from memory at specified address</td>
1094 </tr>
1095
1096 <tr>
1097 <td class="org-right">13</td>
1098 <td class="org-left">c!</td>
1099 <td class="org-left">n addr --</td>
1100 <td class="org-left">store byte to specified memory</td>
1101 </tr>
1102
1103 <tr>
1104 <td class="org-right">14</td>
1105 <td class="org-left">push</td>
1106 <td class="org-left">DSTK -&gt; RSTK</td>
1107 <td class="org-left">move top of datastack to returnstack</td>
1108 </tr>
1109
1110 <tr>
1111 <td class="org-right">15</td>
1112 <td class="org-left">pop</td>
1113 <td class="org-left">RSTK -&gt; DSTK</td>
1114 <td class="org-left">move top of returnstack to datastack</td>
1115 </tr>
1116
1117 <tr>
1118 <td class="org-right">16</td>
1119 <td class="org-left">&lt;unused&gt;</td>
1120 <td class="org-left">&#xa0;</td>
1121 <td class="org-left">&#xa0;</td>
1122 </tr>
1123
1124 <tr>
1125 <td class="org-right">17</td>
1126 <td class="org-left">rot</td>
1127 <td class="org-left">n1 n2 n3 &#x2013; n2 n3 n1</td>
1128 <td class="org-left">rotate stack elements</td>
1129 </tr>
1130
1131 <tr>
1132 <td class="org-right">18</td>
1133 <td class="org-left">disk@</td>
1134 <td class="org-left">FromDiskSect ToMem --</td>
1135 <td class="org-left">read 1KB from disk into RAM</td>
1136 </tr>
1137
1138 <tr>
1139 <td class="org-right">19</td>
1140 <td class="org-left">disk!</td>
1141 <td class="org-left">FromMem ToDiskSect --</td>
1142 <td class="org-left">write 1KB to disk</td>
1143 </tr>
1144
1145 <tr>
1146 <td class="org-right">20</td>
1147 <td class="org-left">@</td>
1148 <td class="org-left">addr &#x2013; n</td>
1149 <td class="org-left">read 32 bit number from memory</td>
1150 </tr>
1151
1152 <tr>
1153 <td class="org-right">21</td>
1154 <td class="org-left">!</td>
1155 <td class="org-left">n addr --</td>
1156 <td class="org-left">store 32 bit number to memory</td>
1157 </tr>
1158
1159 <tr>
1160 <td class="org-right">22</td>
1161 <td class="org-left">over</td>
1162 <td class="org-left">n1 n2 &#x2013; n1 n2 n1</td>
1163 <td class="org-left">&#xa0;</td>
1164 </tr>
1165
1166 <tr>
1167 <td class="org-right">23</td>
1168 <td class="org-left">swap</td>
1169 <td class="org-left">n1 n2 &#x2013; n2 n1</td>
1170 <td class="org-left">&#xa0;</td>
1171 </tr>
1172
1173 <tr>
1174 <td class="org-right">24</td>
1175 <td class="org-left">+</td>
1176 <td class="org-left">n1 n2 &#x2013; n1+n2</td>
1177 <td class="org-left">&#xa0;</td>
1178 </tr>
1179
1180 <tr>
1181 <td class="org-right">25</td>
1182 <td class="org-left">-</td>
1183 <td class="org-left">n1 n2 &#x2013; n1-n2</td>
1184 <td class="org-left">&#xa0;</td>
1185 </tr>
1186
1187 <tr>
1188 <td class="org-right">26</td>
1189 <td class="org-left">*</td>
1190 <td class="org-left">n1 n2 &#x2013; n1*n2</td>
1191 <td class="org-left">&#xa0;</td>
1192 </tr>
1193
1194 <tr>
1195 <td class="org-right">27</td>
1196 <td class="org-left">/</td>
1197 <td class="org-left">n1 n2 &#x2013; n1/n2</td>
1198 <td class="org-left">&#xa0;</td>
1199 </tr>
1200
1201 <tr>
1202 <td class="org-right">28</td>
1203 <td class="org-left">&gt;</td>
1204 <td class="org-left">n1 n2 &#x2013; result</td>
1205 <td class="org-left">is true when n1 &gt; n2</td>
1206 </tr>
1207
1208 <tr>
1209 <td class="org-right">29</td>
1210 <td class="org-left">&lt;</td>
1211 <td class="org-left">n1 n2 &#x2013; result</td>
1212 <td class="org-left">is true when n1 &lt; n2</td>
1213 </tr>
1214
1215 <tr>
1216 <td class="org-right">30</td>
1217 <td class="org-left">not</td>
1218 <td class="org-left">n1 &#x2013; not_n1</td>
1219 <td class="org-left">logical not</td>
1220 </tr>
1221
1222 <tr>
1223 <td class="org-right">31</td>
1224 <td class="org-left">i</td>
1225 <td class="org-left">&#x2013; n</td>
1226 <td class="org-left">copies top of return stack into datastack</td>
1227 </tr>
1228
1229 <tr>
1230 <td class="org-right">32</td>
1231 <td class="org-left">cprt@</td>
1232 <td class="org-left">addr &#x2013; n</td>
1233 <td class="org-left">read one byte from hardware port</td>
1234 </tr>
1235
1236 <tr>
1237 <td class="org-right">33</td>
1238 <td class="org-left">cprt!</td>
1239 <td class="org-left">n addr --</td>
1240 <td class="org-left">store one byte to hardware port</td>
1241 </tr>
1242
1243 <tr>
1244 <td class="org-right">34</td>
1245 <td class="org-left">i2</td>
1246 <td class="org-left">&#x2013; n</td>
1247 <td class="org-left">like "i" but takes second top stack element</td>
1248 </tr>
1249
1250 <tr>
1251 <td class="org-right">35</td>
1252 <td class="org-left">i3</td>
1253 <td class="org-left">&#x2013; n</td>
1254 <td class="org-left">like "i" but takes third top stack element.</td>
1255 </tr>
1256
1257 <tr>
1258 <td class="org-right">36</td>
1259 <td class="org-left">shl</td>
1260 <td class="org-left">n amount &#x2013; n</td>
1261 <td class="org-left">left bit shift</td>
1262 </tr>
1263
1264 <tr>
1265 <td class="org-right">37</td>
1266 <td class="org-left">shr</td>
1267 <td class="org-left">n amount &#x2013; n</td>
1268 <td class="org-left">right bit shift</td>
1269 </tr>
1270
1271 <tr>
1272 <td class="org-right">38</td>
1273 <td class="org-left">or</td>
1274 <td class="org-left">n1 n2 &#x2013; n</td>
1275 <td class="org-left">logical or</td>
1276 </tr>
1277
1278 <tr>
1279 <td class="org-right">39</td>
1280 <td class="org-left">xor</td>
1281 <td class="org-left">n1 n2 &#x2013; n</td>
1282 <td class="org-left">exclusive logical or</td>
1283 </tr>
1284
1285 <tr>
1286 <td class="org-right">40</td>
1287 <td class="org-left">vidmap</td>
1288 <td class="org-left">addr --</td>
1289 <td class="org-left">copy memory from "addr" to video memory.</td>
1290 </tr>
1291
1292 <tr>
1293 <td class="org-right">41</td>
1294 <td class="org-left">mouse@</td>
1295 <td class="org-left">&#x2013; x y button</td>
1296 <td class="org-left">read mouse coordinates &amp; buttons</td>
1297 </tr>
1298
1299 <tr>
1300 <td class="org-right">42</td>
1301 <td class="org-left"><a href="#org3c170f3">vidput</a></td>
1302 <td class="org-left">addr1 addr2 x y --</td>
1303 <td class="org-left">put image1 into image2, at location x, y</td>
1304 </tr>
1305
1306 <tr>
1307 <td class="org-right">43</td>
1308 <td class="org-left"><a href="#org4c1b71f">cmove</a></td>
1309 <td class="org-left">addr1 addr2 amount</td>
1310 <td class="org-left">move memory from addr1 to addr2</td>
1311 </tr>
1312
1313 <tr>
1314 <td class="org-right">44</td>
1315 <td class="org-left">cfill</td>
1316 <td class="org-left">c addr amount --</td>
1317 <td class="org-left">fill memory starting at "addr" with "c" bytes.</td>
1318 </tr>
1319
1320 <tr>
1321 <td class="org-right">45</td>
1322 <td class="org-left"><a href="#org050fd93">tvidput</a></td>
1323 <td class="org-left">addr1 addr2 x y --</td>
1324 <td class="org-left">put image with transparency support</td>
1325 </tr>
1326
1327 <tr>
1328 <td class="org-right">46</td>
1329 <td class="org-left">depth</td>
1330 <td class="org-left">&#x2013; depth</td>
1331 <td class="org-left">returns current depth of data stack.</td>
1332 </tr>
1333
1334 <tr>
1335 <td class="org-right">47</td>
1336 <td class="org-left"><a href="#orgfcf732b">charput</a></td>
1337 <td class="org-left">colorfg colorbg addrsrc addrdest x y</td>
1338 <td class="org-left">draw text character</td>
1339 </tr>
1340 </tbody>
1341 </table>
1342 </div>
1343 </div>
1344
1345 <div id="outline-container-org42eed2a" class="outline-4">
1346 <h4 id="org42eed2a"><span class="section-number-4">10.1.2</span> kbd@ - read scancode of pressed or released key</h4>
1347 <div class="outline-text-4" id="text-10-1-2">
1348 <p>
1349 Returns 0 if no data available.
1350 </p>
1351 </div>
1352 </div>
1353 <div id="outline-container-org3c170f3" class="outline-4">
1354 <h4 id="org3c170f3"><span class="section-number-4">10.1.3</span> vidput - put image1 into image2, at location x, y</h4>
1355 <div class="outline-text-4" id="text-10-1-3">
1356 <p>
1357 Does clipping, so part of a big image can be mapped into smaller one.
1358 </p>
1359 </div>
1360 </div>
1361 <div id="outline-container-org4c1b71f" class="outline-4">
1362 <h4 id="org4c1b71f"><span class="section-number-4">10.1.4</span> cmove - copy memory array</h4>
1363 <div class="outline-text-4" id="text-10-1-4">
1364 <p>
1365 Move memory from addr1 to addr2. If addr1 is greater than addr2 then
1366 count address foward while moving, elseway starts from end and counts
1367 backwards, so no data loss occurs when memory regions partially
1368 overlap.
1369 </p>
1370 </div>
1371 </div>
1372 <div id="outline-container-org050fd93" class="outline-4">
1373 <h4 id="org050fd93"><span class="section-number-4">10.1.5</span> tvidput - put image with transparency support</h4>
1374 <div class="outline-text-4" id="text-10-1-5">
1375 <p>
1376 Stack footprint
1377 </p>
1378 <pre class="example">
1379 addr1 addr2 x y --
1380 </pre>
1381
1382
1383 <p>
1384 Put image1 into image2, at location x, y with transparency support
1385 </p>
1386
1387 <p>
1388 Color 255 in source image is treated as transparent.
1389 </p>
1390 </div>
1391 </div>
1392 <div id="outline-container-orgfcf732b" class="outline-4">
1393 <h4 id="orgfcf732b"><span class="section-number-4">10.1.6</span> charput - draw text character</h4>
1394 <div class="outline-text-4" id="text-10-1-6">
1395 <p>
1396 Draw character to image buffer located at "addrdest" to specified x &amp;
1397 y location. Decodes 8 bytes from source to bits, used to draw
1398 character.
1399 </p>
1400 </div>
1401 </div>
1402 </div>
1403 </div>
1404
1405 <div id="outline-container-org3b7244d" class="outline-2">
1406 <h2 id="org3b7244d"><span class="section-number-2">11</span> Fifth source format</h2>
1407 <div class="outline-text-2" id="text-11">
1408 <p>
1409 Fifth uses a different character table and codes than ASCII (still
1410 almost similar). I call it FSCII (Fifth Standard Code for Information
1411 Interchange) for example space character is not 32 but 255 instead.  I
1412 plan to use mainly HEX numbers, and create new characters to represent
1413 numeric values. So typical nemric characters "0123&#x2026;"  is treated
1414 like ordinary letters.
1415 </p>
1416 </div>
1417 <div id="outline-container-org3078f68" class="outline-3">
1418 <h3 id="org3078f68"><span class="section-number-3">11.1</span> FSCII</h3>
1419 <div class="outline-text-3" id="text-11-1">
1420 <table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
1421
1422
1423 <colgroup>
1424 <col  class="org-right" />
1425
1426 <col  class="org-left" />
1427
1428 <col  class="org-left" />
1429 </colgroup>
1430 <thead>
1431 <tr>
1432 <th scope="col" class="org-right">DEC</th>
1433 <th scope="col" class="org-left">HEX</th>
1434 <th scope="col" class="org-left">function</th>
1435 </tr>
1436 </thead>
1437 <tbody>
1438 <tr>
1439 <td class="org-right">0 - 15</td>
1440 <td class="org-left">0 - F</td>
1441 <td class="org-left">HEX numbers</td>
1442 </tr>
1443
1444 <tr>
1445 <td class="org-right">252</td>
1446 <td class="org-left">FC</td>
1447 <td class="org-left">backspace</td>
1448 </tr>
1449
1450 <tr>
1451 <td class="org-right">253</td>
1452 <td class="org-left">FD</td>
1453 <td class="org-left">tabulator (TAB)</td>
1454 </tr>
1455
1456 <tr>
1457 <td class="org-right">254</td>
1458 <td class="org-left">FE</td>
1459 <td class="org-left">carriage return (CR)</td>
1460 </tr>
1461
1462 <tr>
1463 <td class="org-right">255</td>
1464 <td class="org-left">FF</td>
1465 <td class="org-left">space</td>
1466 </tr>
1467
1468 <tr>
1469 <td class="org-right">else</td>
1470 <td class="org-left">&#xa0;</td>
1471 <td class="org-left">ordinary characters, same as in ASCII.</td>
1472 </tr>
1473 </tbody>
1474 </table>
1475 </div>
1476 </div>
1477 </div>
1478 <div id="outline-container-org7ab9dd0" class="outline-2">
1479 <h2 id="org7ab9dd0"><span class="section-number-2">12</span> Fifth commands</h2>
1480 <div class="outline-text-2" id="text-12">
1481 </div>
1482 <div id="outline-container-orgc19ed00" class="outline-3">
1483 <h3 id="orgc19ed00"><span class="section-number-3">12.1</span> Compilation &amp; miscellaneous</h3>
1484 <div class="outline-text-3" id="text-12-1">
1485 <p class="verse">
1486 init    module  ( &#x2013; )<br />
1487 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;First module, control is passed to on startup. Contains<br />
1488 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;initialization routines. Also it is the last core module.<br />
1489 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;All new modules on top of it comes as result of executing<br />
1490 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;external source files.<br />
1491 <br />
1492 head &lt;name&gt;     ( &#x2013; )  compiles new dictionary entry without specifying<br />
1493 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;new module type.<br />
1494 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;ex: head myentry<br />
1495 <br />
1496 : &lt;name&gt;        ( &#x2013; )  creates new code module<br />
1497 ;               ( &#x2013; )  ends module (immideate)<br />
1498 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;ex: : hello ." hi there" ;<br />
1499 <br />
1500 const &lt;name&gt;    ( n &#x2013; ) defines new constant.<br />
1501 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;ex: 2147483647 const max<br />
1502 <br />
1503 :i &lt;name&gt;       ( &#x2013; ) same as ":" but this module will be executed<br />
1504 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;immideately even in compile mode.<br />
1505 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;ex: :i ( 41 scan ;<br />
1506 <br />
1507 create &lt;name&gt;   ( &#x2013; ) same as "head" , but specify module type as data.<br />
1508 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;ex: create LotoResults 5 , 13 , 52 , 12 , 11 , 3 ,<br />
1509 <br />
1510 allot           ( n &#x2013; ) allocate n bytes in dictionary.<br />
1511 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;ex: create MyArray 100 allot<br />
1512 <br />
1513 " &lt;string&gt;"     ( &#x2013; ) compile string and its size into core.<br />
1514 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;ex: create Mystring " This is it's contects"<br />
1515 <br />
1516 str &lt;name&gt; &lt;string&gt;" ( &#x2013; ) just shorter way for defining strings.<br />
1517 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;ex: str Mystring This is it's contenc"<br />
1518 <br />
1519 var &lt;name&gt;      ( &#x2013; ) define new 32 bit variable.<br />
1520 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;ex: var result<br />
1521 <br />
1522 ' &lt;module&gt;      ( &#x2013; n ) return memory address of given entry.<br />
1523 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;ex: ' init<br />
1524 <br />
1525 forget &lt;name&gt;   ( &#x2013; ) erases from RAM given entry and all entries what was<br />
1526 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;defined after it.<br />
1527 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;ex: forget myprog<br />
1528 <br />
1529 [               ( &#x2013; )  set interpret mode (immideate)<br />
1530 ]               ( n &#x2013; ) set compile mode and compile top stack element<br />
1531 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;in as literal. Together [ &#x2026;. ] cobination provides good<br />
1532 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;way to compute some values only once, at compile time,<br />
1533 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;rather than every time while program is running.<br />
1534 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;ex: : calculate - [ 4 MyConst1 + MyConst2 * ] ;<br />
1535 <br />
1536 defer &lt;name&gt;    ( &#x2013; ) creates new module, with jump instruction.<br />
1537 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Later address where to jump can be modified by "is" command.<br />
1538 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;This provides method of foward referencing. So you can use<br />
1539 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;modules what not jet exist.<br />
1540 is              ( address1 address2 &#x2013; ) address1 - where to jump, address2 -<br />
1541 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;address of module created by defer command.<br />
1542 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;ex:     defer dispver<br />
1543 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;: run dispver ." running &#x2026;" ;<br />
1544 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#x2026; whatever &#x2026;<br />
1545 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;: (dispver ." Version 9.99 " ;<br />
1546 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;' (dispver ' dispver is<br />
1547 <br />
1548 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Now if I type "run" on the screen appears:<br />
1549 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Version 9.99 running &#x2026;<br />
1550 <br />
1551 asc &lt;char&gt;      ( &#x2013; ) reads char ascii code and treats it as literal.<br />
1552 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;(immideate)<br />
1553 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;ex: : BreakLine 30 do asc - emit loop ;<br />
1554 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;same as:<br />
1555 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;: BreakLine 30 do    45 emit loop ;<br />
1556 <br />
1557 dyninc          ( handle &#x2013; ) execute code in dynamic memory handle.<br />
1558 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;automatically deallocates it when done.<br />
1559 <br />
1560 include         ( filenumber &#x2013; ) execute code in specified file.<br />
1561 <br />
1562 words           ( &#x2013; ) display existing blocks in core.<br />
1563 <br />
1564 bye             ( &#x2013; ) exit from Fifth<br />
1565 <br />
1566 fkey            ( &#x2013; c )<br />
1567 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Read one byte from input stream.<br />
1568 <br />
1569 sadd            ( c addr &#x2013; )<br />
1570 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Add one byte "c" to string located at "addr" and updates<br />
1571 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;string length.<br />
1572 <br />
1573 scan            ( c &#x2013; )<br />
1574 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Read input stream and store it to  pad   until it finds  c  .<br />
1575 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;It ignores all "c" bytes until it finds any non "c" byte.<br />
1576 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;in other words:<br />
1577 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;c  is:  "<br />
1578 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;input stream:  """"This is test !"aoeu idh<br />
1579 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;result:  This is test !<br />
1580 <br />
1581 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Is useful for breaking text lines into words.<br />
1582 <br />
1583 skey            ( &#x2013; c )<br />
1584 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;So called safe "fkey". Reads data from input stream<br />
1585 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;but converts characters with ASCII codes: 9 13 10<br />
1586 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;to spaces.<br />
1587 <br />
1588 str=str?        ( adr1 adr2 &#x2013; result )<br />
1589 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Compares string at "adr1" with string at "adr2", returns<br />
1590 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;true flag if they are equal or false if they are not.<br />
1591 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;true = -1<br />
1592 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;false = 0<br />
1593 <br />
1594 find            ( &#x2013; addr )<br />
1595 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Searches whole dictionary for word in "pad". If found,<br />
1596 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;returns it address, if not, returns 0.<br />
1597 <br />
1598 execute         ( &#x2013; )<br />
1599 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Execute word located in "pad". Depending on "mode".<br />
1600 <br />
1601 dta             ( addr &#x2013; DataAddr )<br />
1602 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Calculates address of dictionary entry data area, from<br />
1603 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;entry point.<br />
1604 <br />
1605 2num            ( &#x2013; num result )<br />
1606 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Attempt to convert string located in "pad" into numeric<br />
1607 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;value. If succeed returns number and true as result.<br />
1608 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;If not, returns whatever and false as result.<br />
1609 <br />
1610 dadd            ( addr length &#x2013; )<br />
1611 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Add to dictionary data located at "addr", with specified<br />
1612 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;length.<br />
1613 <br />
1614 lit             ( n &#x2013; )<br />
1615 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Act with number depending on "mode". When interpreting,<br />
1616 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;leaves it in stack.<br />
1617 <br />
1618 <br />
1619 incmod          ( addr &#x2013; )<br />
1620 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Add to dictionary data located at "addr"+1 , length is taken<br />
1621 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;from "addr".<br />
1622 <br />
1623 here            ( &#x2013; n )<br />
1624 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;return "h" contents.<br />
1625 <br />
1626 mode    var     8 bit<br />
1627 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Holds input stream parser operation mode.<br />
1628 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;0 = interpreting<br />
1629 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;1 = compiling<br />
1630 <br />
1631 pad     var     128 bytes<br />
1632 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Holds temprorary strings.<br />
1633 <br />
1634 h       var     32 bit<br />
1635 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Pointer to free byte in memory, always at the end of the<br />
1636 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;dictionary. Each time when something is stored<br />
1637 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;by "c," command, pointer is incareased.<br />
1638 <br />
1639 lp      var     32 bit<br />
1640 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Pointer to last dictionary word. Each time when new word is<br />
1641 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;compiled or erased by "forget", this pointer is updated.<br />
1642 <br />
1643 modulechk       ( Dstr&lt;filename&gt; &#x2013; ) check if module is loaded, if not<br />
1644 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;immideately load it.<br />
1645 <br />
1646 ne              ( entrydata entrytype &#x2013; ) Compile new dictionary entry.<br />
1647 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;It's name must be in "pad".<br />
1648 </p>
1649 </div>
1650 </div>
1651 <div id="outline-container-org52d6182" class="outline-3">
1652 <h3 id="org52d6182"><span class="section-number-3">12.2</span> Conditionals &amp; control flow</h3>
1653 <div class="outline-text-3" id="text-12-2">
1654 <p class="verse">
1655 if              ( flag &#x2013; )   (immideate)<br />
1656 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;"if 1.. else 2.. then" or<br />
1657 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;"if 1.. then" construction. Conditional execution.<br />
1658 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Performs "1.." if "flag" was true,<br />
1659 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;elseway performs "2.." if exist. Execution continues after<br />
1660 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;word "then".<br />
1661 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;ex: 1 if ." nonzero" else ." zero" then<br />
1662 <br />
1663 &gt;=              ( n1 n2 &#x2013; result ) true if (n1 = n2) or (n1 &gt; n2)<br />
1664 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;ex: 5 3 &gt;= if ." first number is greater or equal" then<br />
1665 <br />
1666 &lt;=              ( n1 n2 &#x2013; result ) true if (n1 = n2) or (n1 &lt; n2)<br />
1667 =               ( n1 n2 &#x2013; result ) true if n1 = n2<br />
1668 <br />
1669 do              ( count &#x2013; )  (immideate)<br />
1670 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;"do .. loop" construction. Performs ".." "count" times.<br />
1671 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;In every step "count" is decareased until it is 0.<br />
1672 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;ex: : test 5 do i .d loop ;<br />
1673 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;result: 4 3 2 1 0<br />
1674 <br />
1675 doexit         ( &#x2013; ) exit from "do .. loop"<br />
1676 <br />
1677 for             ( count top &#x2013; )   (immideate)<br />
1678 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;"for .. loop" construction. Performs ".." (top - count)  times.<br />
1679 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;In every step "count" is incareased until it reaches "top" .<br />
1680 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;ex: : test 4 10 for i .d loop ;<br />
1681 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;result: 4 5 6 7 8 9<br />
1682 <br />
1683 forexit         ( &#x2013; ) exit from "for .. loop"<br />
1684 <br />
1685 until           ( &#x2013; )  (immideate)<br />
1686 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;"until .. loop" construction. Performs ".." until flag become<br />
1687 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;true. False by default. Top of return stack holds flag.<br />
1688 <br />
1689 done            ( &#x2013; ) exit from "until .. loop"<br />
1690 <br />
1691 </p>
1692 </div>
1693 </div>
1694 <div id="outline-container-org9a1c44e" class="outline-3">
1695 <h3 id="org9a1c44e"><span class="section-number-3">12.3</span> Disk &amp; file access</h3>
1696 <div class="outline-text-3" id="text-12-3">
1697 <p class="verse">
1698 diskload ( FromDisk ToMem amount &#x2013; )<br />
1699 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Load specified abount of bytes from disk into memory.<br />
1700 <br />
1701 disksave ( FromMem ToDisk amount &#x2013; )<br />
1702 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;save specified abount of bytes from memory into disk.<br />
1703 <br />
1704 format ( &#x2013; )   Erase all files.<br />
1705 <br />
1706 fsDfilesize@ ( handle &#x2013; size )<br />
1707 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Return size of opened file.<br />
1708 <br />
1709 fsDcurloc@ ( handle &#x2013; location )<br />
1710 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Return current location in file.<br />
1711 <br />
1712 fsDupdated@ ( handle &#x2013; updated? )<br />
1713 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Return true if file was updated,<br />
1714 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;ie. write operations occured.<br />
1715 <br />
1716 fssave ( FromMem DestFileHandle amount &#x2013; )<br />
1717 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Save data to file.<br />
1718 <br />
1719 fsload ( SrcFileHandle ToMem amount &#x2013; )<br />
1720 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Load data from file.<br />
1721 <br />
1722 fseof ( handle &#x2013; bytesLeft )<br />
1723 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Return amount of bytes left till end of file.<br />
1724 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Useful before read operation.<br />
1725 <br />
1726 fsls ( &#x2013; )     List all files and lists (directories,folders)<br />
1727 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;in current path.<br />
1728 <br />
1729 fslsr ( &#x2013; )    Same as "fsls" but recursively scans also sub lists.<br />
1730 <br />
1731 fscl ( DynStrHand &#x2013; )<br />
1732 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Change list (path)<br />
1733 <br />
1734 fscreate ( DynStrHand &#x2013; DescPnt )<br />
1735 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Create new file or list. Can create multiple lists at once.<br />
1736 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;ex: when creating:<br />
1737 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;"\listGAMES\listSTRATEGY\listSIMWORLD\5th-runme"<br />
1738 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;and only "\listGAMES\" already exist, then<br />
1739 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;"listSTRATEGY" and "listSIMWORLD" lists will be created,<br />
1740 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;and empty file "5th-runme" placed in there.<br />
1741 <br />
1742 fsDsave ( DynHand&lt;data&gt; DynStrHand&lt;filename&gt; &#x2013; )<br />
1743 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Create new file and save all data from dynamic memory<br />
1744 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;block to it.<br />
1745 <br />
1746 fsDload ( DynStr&lt;SrcFileName&gt; DynHand&lt;DataDest&gt; &#x2013; )<br />
1747 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Load whole file into dynamic memory block.<br />
1748 <br />
1749 fsDloadnew ( DynStr&lt;SrcFileName&gt; &#x2013; DynHand&lt;DataDest&gt; )<br />
1750 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Load whole file into new dynamic memory block.<br />
1751 </p>
1752 </div>
1753 </div>
1754 <div id="outline-container-orgb7a0ec7" class="outline-3">
1755 <h3 id="orgb7a0ec7"><span class="section-number-3">12.4</span> Dynamic memory</h3>
1756 <div class="outline-text-3" id="text-12-4">
1757 <p class="verse">
1758 dynal ( size &#x2013; handle )<br />
1759 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Allocate dynamic memory block and return it's handle.<br />
1760 <br />
1761 dynde ( handle &#x2013; )<br />
1762 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Deallocate dynamic memory block.<br />
1763 <br />
1764 dynp ( handle &#x2013; addr )<br />
1765 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Returns pointer to memory where dynamic block<br />
1766 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;data begins.<br />
1767 <br />
1768 dyns ( handle &#x2013; size )<br />
1769 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Returns size of dynamic block.<br />
1770 <br />
1771 dynresize ( NewSize handle &#x2013; )<br />
1772 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Nondestructively resize dynamic block.<br />
1773 <br />
1774 dync@ ( addr handle )<br />
1775 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Read one byte from dynamic block.<br />
1776 <br />
1777 dync! ( byte addr dynhandle )<br />
1778 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Write one byte to dynamic block.<br />
1779 <br />
1780 dyn@ ( addr handle )<br />
1781 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Read 32 bit number from dynamic block.<br />
1782 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Address will spacify, whitch number, not byte.<br />
1783 <br />
1784 dyn! ( 32BitNum addr dynhandle )<br />
1785 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Write 32 bit number to dynamic block.<br />
1786 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Address will spacify, whitch number, not byte.<br />
1787 <br />
1788 dyncon ( size "name" &#x2013; )<br />
1789 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Allocate dynamic block with specified size, and<br />
1790 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;create constant honding its handle.<br />
1791 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;ex: 100 dyncon MyNewBlock<br />
1792 <br />
1793 dyn. ( handle &#x2013; )<br />
1794 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Write contenc of dynamic memory block to screen.<br />
1795 </p>
1796 </div>
1797 </div>
1798 <div id="outline-container-orgc2cfe7c" class="outline-3">
1799 <h3 id="orgc2cfe7c"><span class="section-number-3">12.5</span> Graphics and text</h3>
1800 <div class="outline-text-3" id="text-12-5">
1801 <p class="verse">
1802 .               ( n &#x2013; ) print number on screen<br />
1803 <br />
1804 d.              ( n &#x2013; ) print number on screen in decimal<br />
1805 <br />
1806 ?               ( addr &#x2013; ) print 32 bit value located at addr.<br />
1807 <br />
1808 ." &lt;string&gt;"    ( &#x2013; ) print string into screen. Immideately<br />
1809 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;compiles.<br />
1810 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;ex: : greeting ." Hello, World" ;<br />
1811 <br />
1812 tab.            ( &#x2013; ) print tabulator<br />
1813 <br />
1814 calccol         ( b g r &#x2013; c ) calculate color what best matches given<br />
1815 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Blue Green &amp; Red values. Values must be in range 0 - 255.<br />
1816 <br />
1817 imgalloc        ( xsize ysize &#x2013; imgbuf ) allocate image buffer for<br />
1818 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;specified size.<br />
1819 <br />
1820 imgsize         ( imgbuf &#x2013; ) print on the screen X &amp; Y size of image<br />
1821 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;buffer.<br />
1822 <br />
1823 point           ( x y imgbuf &#x2013; addr ) returns memory address for specified<br />
1824 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;pixel.<br />
1825 <br />
1826 pset            ( color x y imgbuf &#x2013; ) set graphic point<br />
1827 <br />
1828 boxf            ( x1 x2 y1 y2 imgbuf color &#x2013; ) draw filled box<br />
1829 <br />
1830 cls             ( imgbuf &#x2013; ) clear image buffer<br />
1831 <br />
1832 setpal          ( b g r color &#x2013; ) set palette value for specified color.<br />
1833 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;values bust be in size 0 - 63.<br />
1834 <br />
1835 putchar         ( char color x y imgbuf &#x2013; ) put graphic character in<br />
1836 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;imagebuffer to specified (x &amp; y) location.<br />
1837 <br />
1838 scroll          ( x y imgbuf &#x2013; ) scroll in imgbuf.<br />
1839 <br />
1840 scrollf         ( color x y screen &#x2013; )  scroll and fill empty space with<br />
1841 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;given color.<br />
1842 <br />
1843 at!             ( x y &#x2013; ) set cursor location<br />
1844 curc!           ( color &#x2013; ) set text color<br />
1845 curb!           ( solor &#x2013; ) set backround color<br />
1846 <br />
1847 colnorm         ( &#x2013; ) set text color to normal<br />
1848 colneg          ( &#x2013; ) set text color to negative (selected)<br />
1849 <br />
1850 dyntype         ( dynhandle &#x2013; ) display contenc of dynamic memory on screen<br />
1851 fsdisp          ( file &#x2013; ) clear screen, display file, and wait for key<br />
1852 <br />
1853 type            ( addr length &#x2013; )<br />
1854 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Types on the screen string, from memory at  addr  and<br />
1855 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;specified length.<br />
1856 <br />
1857 write           ( addr &#x2013; )<br />
1858 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Types on the screen string, from memory at "addr"+1<br />
1859 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;length is taken from "addr" .<br />
1860 <br />
1861 screen  const   32 bit<br />
1862 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Holds handle of screen buffer.<br />
1863 <br />
1864 copyscreen      ( SrcImgHandle DestImgHandle &#x2013; ) copy contenc of source<br />
1865 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;image to destination image. Source and destination images<br />
1866 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;must have same size.<br />
1867 </p>
1868 </div>
1869 </div>
1870 <div id="outline-container-org0644b6a" class="outline-3">
1871 <h3 id="org0644b6a"><span class="section-number-3">12.6</span> Math, memory &amp; stack manipulation</h3>
1872 <div class="outline-text-3" id="text-12-6">
1873 <p class="verse">
1874 off             ( n &#x2013; ) writes 0 to given address, good for zeroing variable.<br />
1875 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;ex: MyVariable off<br />
1876 on              ( n &#x2013; ) writes -1 (true flag) to given address.<br />
1877 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;ex: MyVariable on<br />
1878 <br />
1879 2dup            ( n1 n2 &#x2013; n1 n2 n1 n2 )<br />
1880 2drop           ( n1 n2 &#x2013; )<br />
1881 nip             ( n1 n2 &#x2013; n2 )<br />
1882 neg             ( n1 &#x2013; -n1 ) negotiate<br />
1883 bit@            ( n bit &#x2013; result ) return specified bit from n.<br />
1884 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;ex: 38 2 bit@   (result will be 1)<br />
1885 to32bit         ( n1 n2 n3 n4 &#x2013; n32 ) treat 4 last stack elements as bytes<br />
1886 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;and unite them into 32 bit dword. Most significant byte<br />
1887 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;on top.<br />
1888 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;ex: 12 76 23 11 to32bit   result: 186076172<br />
1889 <br />
1890 to8bit          ( n32 &#x2013; n1 n2 n3 n4 ) break 32 bit number into 4 bytes.<br />
1891 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Useful if you need to send 32 bit numbers thru 8 bit COM<br />
1892 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;port.<br />
1893 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;ex: 186076172 to8bit   result: 12 76 23 11<br />
1894 <br />
1895 mod             ( n1 n2 &#x2013; reminder ) divide n1 by n2 and returns reminder.<br />
1896 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;ex: 12 5 mod   result: 2<br />
1897 <br />
1898 bound           ( low n high &#x2013; n ) check if n is in given bounds,<br />
1899 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;if not then incarease/decarease it to match bounds.<br />
1900 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;ex: 5 80 15 bound    result: 15<br />
1901 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;5 10 15 bound    result: 10<br />
1902 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;5 -10 15 bound   result: 5<br />
1903 <br />
1904 bound?          ( low n high &#x2013; result ) returns true if n is in the<br />
1905 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;given bounds.<br />
1906 <br />
1907 tab             ( col &#x2013; spaces) calculate amount of spaces to add<br />
1908 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;ta reach next tabulation from given column.<br />
1909 <br />
1910 count           ( addr &#x2013; addr+1 n )<br />
1911 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Useful for returning bytes from constantly incareasing<br />
1912 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;address. Module "type" is nice example.<br />
1913 <br />
1914 c,              ( n &#x2013; )<br />
1915 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;store one byte at memory specified by "h". And incarease<br />
1916 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;"h" by 1.<br />
1917 <br />
1918 ,               ( n &#x2013; )<br />
1919 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;store 32 bit number at memory specified by "h". And<br />
1920 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;incarease "h" by 4.<br />
1921 <br />
1922 cmove           ( addr1 addr2 n &#x2013; )<br />
1923 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;copy "n" amount of bytes from memory at "addr1" to memory<br />
1924 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;at "addr2".<br />
1925 <br />
1926 rnd             ( limit &#x2013; result )<br />
1927 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;generates random number in range 0 to "limit"-1.<br />
1928 <br />
1929 abs             ( n &#x2013; |n| )<br />
1930 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;returns absolute value of "n"<br />
1931 </p>
1932 </div>
1933 </div>
1934 <div id="outline-container-org6965f88" class="outline-3">
1935 <h3 id="org6965f88"><span class="section-number-3">12.7</span> Dynamic &amp; static strings</h3>
1936 <div class="outline-text-3" id="text-12-7">
1937 <p>
1938 Fifth supports both static and dynamic strings. Static strings must
1939 have predefined space reserved, and string mustn't exceed this
1940 length. They manipulation is faster. But they use more memory. Static
1941 string memory address is used to refer to the string.
1942 </p>
1943
1944 <p>
1945 Dynamic strings can have at any time length form 0 to 0FFh, They take
1946 up only memory they currently need. They are held in dynamic memory
1947 blocks, so dynamic block handle is used to refer to this string.
1948 </p>
1949
1950 <p>
1951 Both types of strings are stored in the way, where first (0th) byte
1952 holds current string length, following bytes are string itself.
1953 </p>
1954
1955
1956 <p class="verse">
1957 Dynamic:<br />
1958 <br />
1959 Dstral ( &#x2013; handle )<br />
1960 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Allocate new string.<br />
1961 <br />
1962 Dstrlen ( handle &#x2013; length )<br />
1963 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Return string length.<br />
1964 <br />
1965 c+Dstr ( chr handle &#x2013; )<br />
1966 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Add one byte to end of the string.<br />
1967 <br />
1968 c+lDstr ( chr handle &#x2013; )<br />
1969 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Add one byte to left side (beginning) of the string.<br />
1970 <br />
1971 Dstr. ( handle &#x2013; )<br />
1972 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Write contec of string into screen.<br />
1973 <br />
1974 Dstrsure ( size Dstr &#x2013; )<br />
1975 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Makes sure that at least rquested<br />
1976 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;"size" (amount of characters) is allocated for given<br />
1977 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;dynamic string.<br />
1978 <br />
1979 Dstr2str ( handle address &#x2013; )<br />
1980 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Copy dyamic string into static memory space.<br />
1981 <br />
1982 str2Dstr ( address handle &#x2013; )<br />
1983 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Copy static string into dyamic string.<br />
1984 <br />
1985 Dstr+str ( Dstr addr &#x2013; )<br />
1986 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Add contenc of dynamic string to static string.<br />
1987 <br />
1988 D" any string" ( &#x2013; Dstr )<br />
1989 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Moves specified string into dynamic string called "defDstr".<br />
1990 <br />
1991 D&gt; any_string ( &#x2013; Dstr )<br />
1992 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Moves specified string into dynamic string called "defDstr".<br />
1993 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Space marks end of string!<br />
1994 <br />
1995 D&gt;2 any_string ( &#x2013; Dstr )<br />
1996 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Moves specified string into dynamic string called "defDstr2".<br />
1997 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Space marks end of string!<br />
1998 <br />
1999 Dstr+Dstr ( Dstr1 Dstr2 &#x2013; )<br />
2000 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Adds "Dstr1" to "Dstr2" and places result into "Dstr2".<br />
2001 <br />
2002 Dstrclear ( Dstr &#x2013; )<br />
2003 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Clears contenc of dynamic string.<br />
2004 <br />
2005 Dstr2Dstr ( Dstr1 Dstr2 &#x2013; )<br />
2006 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Moves "Dstr1" to "Dstr2".<br />
2007 Dstr ( data" name &#x2013; )<br />
2008 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Creates new dynamic string and moves specified data into it.<br />
2009 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Then creates new constant with given "name" holding created<br />
2010 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;dynamic string handle.<br />
2011 <br />
2012 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;ex: Dstr Hello, my name is Sven!" message      \ creates it<br />
2013 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;message Dstr.                              \ tests it<br />
2014 <br />
2015 Dstrlscan ( char Dstr &#x2013; loc )<br />
2016 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Searches dynamic string for "char", from left to right,<br />
2017 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;returns first found "char" location in string, or 0,<br />
2018 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;if not found.<br />
2019 <br />
2020 Dstrrscan ( char Dstr &#x2013; loc )<br />
2021 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Searches dynamic string for "char", from right to left,<br />
2022 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;returns first found "char" location in string, or 0,<br />
2023 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;if not found.<br />
2024 <br />
2025 Dstrlscane ( char Dstr &#x2013; loc )<br />
2026 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Same as "Dstrlscan" buf returns string length+1 as location.<br />
2027 ÿ<br />
2028 Dstrleft ( amo Dstr &#x2013; )<br />
2029 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Only specified amount of characters from left remains<br />
2030 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;in dynamic string. ie. cut right part out.<br />
2031 <br />
2032 Dstrright ( amo Dstr &#x2013; )<br />
2033 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Only specified amount of characters from right remains<br />
2034 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;in dynamic string. ie. cut left part out.<br />
2035 <br />
2036 Dstrcutl ( amo Dstr &#x2013; )<br />
2037 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Cut specified amount of characters from left of dynamic<br />
2038 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;string out.<br />
2039 <br />
2040 Dstrsp ( char Dstr1 Dstr2 &#x2013; )<br />
2041 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Separate dynamic string in Dstr1 into two parts,<br />
2042 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;using "char" as separator. First part will be stored in<br />
2043 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;"Dstr2", second part in "Dstr1".<br />
2044 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;ex: asc \                               \ ..separator<br />
2045 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;D&gt; listF\listLIB\5TH_DRVMOUSE       \ ..separate from<br />
2046 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;defDstr2                            \ ..place result in<br />
2047 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Dstrsp              \ separation command<br />
2048 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;defDstr Dstr.       \ will be: listLIB\5TH_DRVMOUSE<br />
2049 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;defDstr2 Dstr.      \ will be: listF<br />
2050 <br />
2051 Dv ( addr &#x2013; )<br />
2052 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Allocates empty dynamic string, and places it's handle<br />
2053 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;into given address.<br />
2054 <br />
2055 Df ( addr &#x2013; )<br />
2056 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;Reads dynamic string handle from given address and<br />
2057 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;deallocates (frees) it.<br />
2058 <br />
2059 ex:     var mystring1<br />
2060 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;: testmodule<br />
2061 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;mystring1 Dv            \ allocates string<br />
2062 <br />
2063 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&lt;whatever&gt;<br />
2064 <br />
2065 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;mystring1 Df ;          \ deallocates it again when no longer needed.<br />
2066 </p>
2067 </div>
2068 </div>
2069 </div>
2070 <div id="outline-container-orge322491" class="outline-2">
2071 <h2 id="orge322491"><span class="section-number-2">13</span> Dynamically loadable modules</h2>
2072 <div class="outline-text-2" id="text-13">
2073 </div>
2074 <div id="outline-container-orgc575c29" class="outline-3">
2075 <h3 id="orgc575c29"><span class="section-number-3">13.1</span> Keyboard driver</h3>
2076 <div class="outline-text-3" id="text-13-1">
2077 <p class="verse">
2078 <br />
2079 KBD_@           ( &#x2013; code ) get scancodes for pressed keys from keyboard.<br />
2080 KBD_down?       ( key &#x2013; result ) check is key with specified scancode<br />
2081 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;currently pressed down.<br />
2082 KBD_SC2FSCII    ( code &#x2013; FSCII ) convert key scancode into FSCII code,<br />
2083 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;or in FSK (Fifth standard keycode).<br />
2084 KBD_F@          ( &#x2013; FSCII ) read pressed key FSCII or FSK, returns -1 if no<br />
2085 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;keys are pressed.<br />
2086 KBD_FW@         ( &#x2013; FSCII ) read pressed key FSCII or FSK, if no keys is<br />
2087 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;are pressed then waits until there is.<br />
2088 <br />
2089 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;FSK<br />
2090 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#x2014;<br />
2091 In HEX.<br />
2092 <br />
2093 FC      backspace<br />
2094 FD      TAB<br />
2095 FE      enter<br />
2096 FF      space<br />
2097 <br />
2098 400     ESC<br />
2099 401 &#x2026; F1 &#x2026;<br />
2100 410     up<br />
2101 411     right<br />
2102 412     down<br />
2103 413     left<br />
2104 414     INS<br />
2105 415     DEL<br />
2106 416     home<br />
2107 417     end<br />
2108 418     PG/UP<br />
2109 419     PG/DN<br />
2110 </p>
2111 </div>
2112 </div>
2113 <div id="outline-container-org7c5c975" class="outline-3">
2114 <h3 id="org7c5c975"><span class="section-number-3">13.2</span> Mouse driver</h3>
2115 <div class="outline-text-3" id="text-13-2">
2116 <p class="verse">
2117 mousex  var     Mouse x coordinate.<br />
2118 mousey  var     Mouse y coordinate.<br />
2119 mousekeyl var   Mouse left key.<br />
2120 mousekeym var   Mouse middle key.<br />
2121 mousekeyr var   Mouse right key.<br />
2122 mousec  var     Display current mouse coordinates in top left part of screen,<br />
2123 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;if true. (good for debugging)<br />
2124 mousepointer var  Image buffer, holding current mouse pointer.<br />
2125 mouseadd        ( ModuleAddr x1 x2 y1 y2 &#x2013; ) Add specified area on screen,<br />
2126 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;into mause click buffer. If any mouse button is clicked on<br />
2127 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;that area, module at "ModuleAddr" will be executed.<br />
2128 mousebe var     Amount of buffer elements.<br />
2129 mousedo         ( &#x2013; ) Updates mouse coordinates and keys. Parse mouse<br />
2130 &#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;&#xa0;click buffer, and draw mouse cursor to "screen".<br />
2131 </p>
2132 </div>
2133 </div>
2134 <div id="outline-container-org7e9e6e4" class="outline-3">
2135 <h3 id="org7e9e6e4"><span class="section-number-3">13.3</span> 2D graphic library</h3>
2136 <div class="outline-text-3" id="text-13-3">
2137 <dl class="org-dl">
2138 <dt>lineh ( color len x y imgbuf &#x2013; )</dt><dd>draws horisontal line from X,Y
2139 coordinates to right, with specified length.</dd>
2140
2141 <dt>linev ( color len x y imgbuf &#x2013; )</dt><dd>draws vertical line down, from
2142 coordinates X,Y, with specified length.</dd>
2143
2144 <dt>box ( color x2 x1 y2 y1 imgbuf &#x2013; )</dt><dd><p>
2145 draws rectangular box. x2
2146 bust be &gt;= x1, y2 must be &gt;= y1.
2147 </p>
2148
2149 <pre class="example">
2150 x1,y1-----------+
2151   |             |
2152   |             |
2153   +-----------x2,y2
2154 </pre></dd>
2155
2156 <dt>flipv ( imgbuf &#x2013; )</dt><dd>flip image vertically.</dd>
2157
2158 <dt>imgcoltrans ( ImgBuf Color ToColor &#x2013; )</dt><dd>Translate all pixels in
2159 specified image with "Color" into "ToColor".</dd>
2160
2161 <dt>imgfill ( color x y imgbuf &#x2013; )</dt><dd>Fill image region starting at
2162 location X &amp; Y with specified color.</dd>
2163 </dl>
2164 </div>
2165 </div>
2166
2167
2168 <div id="outline-container-org53b108e" class="outline-3">
2169 <h3 id="org53b108e"><span class="section-number-3">13.4</span> Trigonometry functions</h3>
2170 <div class="outline-text-3" id="text-13-4">
2171 </div>
2172 <div id="outline-container-orga868964" class="outline-4">
2173 <h4 id="orga868964"><span class="section-number-4">13.4.1</span> sin ( a &#x2013; result )</h4>
2174 <div class="outline-text-4" id="text-13-4-1">
2175 <p>
2176 Return sinus from given angle "a", 360ø is 2000. So 1000 represents
2177 180ø angle.  Result will be in range -10'000 to 10'000, instead of ñ1.
2178 </p>
2179 </div>
2180 </div>
2181 <div id="outline-container-org7e217b7" class="outline-4">
2182 <h4 id="org7e217b7"><span class="section-number-4">13.4.2</span> cos ( a &#x2013; result )</h4>
2183 <div class="outline-text-4" id="text-13-4-2">
2184 <p>
2185 Return cosinus from given angle.  Parameters are like in <a href="#orga868964">sin</a> function.
2186 </p>
2187 </div>
2188 </div>
2189 </div>
2190 </div>
2191 </div>
2192 <div id="postamble" class="status">
2193 <p class="author">Author: Svjatoslav Agejenko</p>
2194 <p class="date">Created: 2022-04-17 Sun 18:14</p>
2195 <p class="validation"><a href="http://validator.w3.org/check?uri=referer">Validate</a></p>
2196 </div>
2197 </body>
2198 </html>