Describe data <-> audio CODEC
authorSvjatoslav Agejenko <svjatoslav@svjatoslav.eu>
Thu, 31 Jul 2025 00:12:02 +0000 (03:12 +0300)
committerSvjatoslav Agejenko <svjatoslav@svjatoslav.eu>
Thu, 31 Jul 2025 00:12:02 +0000 (03:12 +0300)
29 files changed:
2D GFX/Fractals/index.html
2D GFX/Spirals/index.html
2D GFX/Textures/index.html
3D GFX/3D Synthezier/doc/index.html
3D GFX/Miscellaneous/index.html
3D GFX/Space/index.html
Math/Plotting/index.html
Math/Simulation/index.html
Math/Truth table/index.html
Miscellaneous/Mouse driver/index.html
Networking/Digital data over analog audio channel/INPUT.TXT [deleted file]
Networking/Digital data over analog audio channel/OUTPUT.TXT [deleted file]
Networking/Digital data over analog audio channel/SOUND.XI [deleted file]
Networking/Digital data over analog audio channel/aver.bas [deleted file]
Networking/Digital data over analog audio channel/index.org [deleted file]
Networking/Digital data over analog audio channel/msg2xi.bas [deleted file]
Networking/Digital data over analog audio channel/screenshot.png [deleted file]
Networking/Digital data over analog audio channel/xi2msg.bas [deleted file]
Networking/Digital data over analog audio/INPUT.TXT [new file with mode: 0644]
Networking/Digital data over analog audio/OUTPUT.TXT [new file with mode: 0644]
Networking/Digital data over analog audio/SOUND.XI [new file with mode: 0644]
Networking/Digital data over analog audio/aver.bas [new file with mode: 0644]
Networking/Digital data over analog audio/index.html [new file with mode: 0644]
Networking/Digital data over analog audio/index.org [new file with mode: 0755]
Networking/Digital data over analog audio/msg2xi.bas [new file with mode: 0644]
Networking/Digital data over analog audio/screenshot.png [new file with mode: 0755]
Networking/Digital data over analog audio/xi2msg.bas [new file with mode: 0644]
Tools/Update web site
index.org

index 14c08e3..9002ff2 100644 (file)
@@ -3,7 +3,7 @@
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
 <head>
-<!-- 2025-07-30 ke 08:54 -->
+<!-- 2025-07-30 ke 12:27 -->
 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
 <meta name="viewport" content="width=device-width, initial-scale=1" />
 <title>Fractals</title>
 <h2>Table of Contents</h2>
 <div id="text-table-of-contents" role="doc-toc">
 <ul>
-<li><a href="#org9db4739">1. Fractal circles</a></li>
-<li><a href="#org701e05b">2. Fractal circles animated</a></li>
-<li><a href="#org18874d5">3. Fractal of squares</a></li>
-<li><a href="#orgc9aa92c">4. Fractal of squares animated</a></li>
-<li><a href="#org95a64d0">5. Fractal of trees</a></li>
+<li><a href="#orgdb5ca43">1. Fractal circles</a></li>
+<li><a href="#orgf97f64c">2. Fractal circles animated</a></li>
+<li><a href="#org341855f">3. Fractal of squares</a></li>
+<li><a href="#org7f2b476">4. Fractal of squares animated</a></li>
+<li><a href="#orgbcfd4b5">5. Fractal of trees</a></li>
 </ul>
 </div>
 </div>
 </style>
 
 
-<div id="outline-container-org9db4739" class="outline-2">
-<h2 id="org9db4739"><span class="section-number-2">1.</span> Fractal circles</h2>
+<div id="outline-container-orgdb5ca43" class="outline-2">
+<h2 id="orgdb5ca43"><span class="section-number-2">1.</span> Fractal circles</h2>
 <div class="outline-text-2" id="text-1">
 <p>
 This QBasic program generates a visually captivating spiral fractal
@@ -247,7 +247,7 @@ geometry, recursive programming, and graphical design.
 </p>
 
 
-<div id="org0b4ece3" class="figure">
+<div id="orgfa586bb" class="figure">
 <p><a href="fractal circles.bas" class="responsive-img"><img src="fractal%20circles.png" alt="fractal%20circles.png" class="responsive-img" /></a>
 </p>
 </div>
@@ -266,8 +266,8 @@ indefinitely.</dd>
 </div>
 </div>
 
-<div id="outline-container-org701e05b" class="outline-2">
-<h2 id="org701e05b"><span class="section-number-2">2.</span> Fractal circles animated</h2>
+<div id="outline-container-orgf97f64c" class="outline-2">
+<h2 id="orgf97f64c"><span class="section-number-2">2.</span> Fractal circles animated</h2>
 <div class="outline-text-2" id="text-2">
 <p>
 This QBasic program creates an animated fractal composed of circles,
@@ -287,29 +287,29 @@ system to control the animation's progression.
 </div>
 </div>
 
-<div id="outline-container-org18874d5" class="outline-2">
-<h2 id="org18874d5"><span class="section-number-2">3.</span> Fractal of squares</h2>
+<div id="outline-container-org341855f" class="outline-2">
+<h2 id="org341855f"><span class="section-number-2">3.</span> Fractal of squares</h2>
 <div class="outline-text-2" id="text-3">
 <p>
 This QBasic program generates and displays a fractal pattern composed of squares.
 </p>
 
 
-<div id="org8c7f23b" class="figure">
+<div id="org61d6183" class="figure">
 <p><a href="fractal squares.bas" class="responsive-img"><img src="fractal%20squares,%201.png" alt="fractal%20squares,%201.png" class="responsive-img" /></a>
 </p>
 </div>
 
 
-<div id="org7f10394" class="figure">
+<div id="org9c7662d" class="figure">
 <p><a href="fractal squares.bas" class="responsive-img"><img src="fractal%20squares,%202.png" alt="fractal%20squares,%202.png" class="responsive-img" /></a>
 </p>
 </div>
 </div>
 </div>
 
-<div id="outline-container-orgc9aa92c" class="outline-2">
-<h2 id="orgc9aa92c"><span class="section-number-2">4.</span> Fractal of squares animated</h2>
+<div id="outline-container-org7f2b476" class="outline-2">
+<h2 id="org7f2b476"><span class="section-number-2">4.</span> Fractal of squares animated</h2>
 <div class="outline-text-2" id="text-4">
 <p>
 This QBasic program generates an animated fractal pattern composed of
@@ -331,8 +331,8 @@ resulting in a dynamic and ever-changing geometric pattern.
 </div>
 </div>
 
-<div id="outline-container-org95a64d0" class="outline-2">
-<h2 id="org95a64d0"><span class="section-number-2">5.</span> Fractal of trees</h2>
+<div id="outline-container-orgbcfd4b5" class="outline-2">
+<h2 id="orgbcfd4b5"><span class="section-number-2">5.</span> Fractal of trees</h2>
 <div class="outline-text-2" id="text-5">
 <p>
 QBasic program that generates a visually appealing fractal tree
@@ -355,7 +355,7 @@ resembles a tree, with branches that grow and change over time.
 </div>
 </div>
 <div id="postamble" class="status">
-<p class="date">Created: 2025-07-30 ke 08:54</p>
+<p class="date">Created: 2025-07-30 ke 12:27</p>
 <p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
 </div>
 </body>
index 3508025..191b6f8 100644 (file)
@@ -3,7 +3,7 @@
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
 <head>
-<!-- 2025-07-30 ke 08:54 -->
+<!-- 2025-07-30 ke 12:27 -->
 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
 <meta name="viewport" content="width=device-width, initial-scale=1" />
 <title>Spiral series</title>
 <h2>Table of Contents</h2>
 <div id="text-table-of-contents" role="doc-toc">
 <ul>
-<li><a href="#org5adfb8a">1. Spiral with increasing density</a></li>
-<li><a href="#orgda27966">2. Spiral with varying height</a></li>
-<li><a href="#orgc02cc8c">3. Shaded spiral</a></li>
-<li><a href="#org82de458">4. Sphere forming spiral</a></li>
-<li><a href="#org2c1423d">5. Textured spherical spiral</a></li>
-<li><a href="#org48d246f">6. Textured and shaded spherical spiral</a></li>
+<li><a href="#org975cad1">1. Spiral with increasing density</a></li>
+<li><a href="#org3cc3142">2. Spiral with varying height</a></li>
+<li><a href="#org1afb223">3. Shaded spiral</a></li>
+<li><a href="#org86798cd">4. Sphere forming spiral</a></li>
+<li><a href="#org290b12d">5. Textured spherical spiral</a></li>
+<li><a href="#orgcc9ea12">6. Textured and shaded spherical spiral</a></li>
 </ul>
 </div>
 </div>
   }
 </style>
 
-<div id="outline-container-org5adfb8a" class="outline-2">
-<h2 id="org5adfb8a"><span class="section-number-2">1.</span> Spiral with increasing density</h2>
+<div id="outline-container-org975cad1" class="outline-2">
+<h2 id="org975cad1"><span class="section-number-2">1.</span> Spiral with increasing density</h2>
 <div class="outline-text-2" id="text-1">
 
-<div id="org029fdf0" class="figure">
+<div id="orgc90ba51" class="figure">
 <p><img src="spiral.png" alt="spiral.png" class="responsive-img" />
 </p>
 </div>
@@ -320,11 +320,11 @@ userInput$ = <span style="color: #88aaee;">INPUT$</span>(1)
 </div>
 </div>
 
-<div id="outline-container-orgda27966" class="outline-2">
-<h2 id="orgda27966"><span class="section-number-2">2.</span> Spiral with varying height</h2>
+<div id="outline-container-org3cc3142" class="outline-2">
+<h2 id="org3cc3142"><span class="section-number-2">2.</span> Spiral with varying height</h2>
 <div class="outline-text-2" id="text-2">
 
-<div id="orgabbae9a" class="figure">
+<div id="orgce0bd16" class="figure">
 <p><img src="spiral, 2.png" alt="spiral, 2.png" class="responsive-img" />
 </p>
 </div>
@@ -391,11 +391,11 @@ a$ = <span style="color: #88aaee;">INPUT$</span>(1)
 </div>
 </div>
 
-<div id="outline-container-orgc02cc8c" class="outline-2">
-<h2 id="orgc02cc8c"><span class="section-number-2">3.</span> Shaded spiral</h2>
+<div id="outline-container-org1afb223" class="outline-2">
+<h2 id="org1afb223"><span class="section-number-2">3.</span> Shaded spiral</h2>
 <div class="outline-text-2" id="text-3">
 
-<div id="orgedfa863" class="figure">
+<div id="org45bbde4" class="figure">
 <p><img src="spiral, 3.png" alt="spiral, 3.png" class="responsive-img" />
 </p>
 </div>
@@ -497,8 +497,8 @@ a$ = <span style="color: #88aaee;">INPUT$</span>(1)
 </div>
 </div>
 
-<div id="outline-container-org82de458" class="outline-2">
-<h2 id="org82de458"><span class="section-number-2">4.</span> Sphere forming spiral</h2>
+<div id="outline-container-org86798cd" class="outline-2">
+<h2 id="org86798cd"><span class="section-number-2">4.</span> Sphere forming spiral</h2>
 <div class="outline-text-2" id="text-4">
 <p>
 Similar to previous spiral, Line segments are connected between the
@@ -507,7 +507,7 @@ multiple linked spherical shapes. Initially point cloud in shown:
 </p>
 
 
-<div id="org7ed384e" class="figure">
+<div id="org9708799" class="figure">
 <p><img src="spiral, 4, 1.png" alt="spiral, 4, 1.png" class="responsive-img" />
 </p>
 </div>
@@ -517,7 +517,7 @@ In the next step, points are connected using lines:
 </p>
 
 
-<div id="orgd650278" class="figure">
+<div id="orga4fad57" class="figure">
 <p><img src="spiral, 4, 2.png" alt="spiral, 4, 2.png" class="responsive-img" />
 </p>
 </div>
@@ -622,11 +622,11 @@ a$ = <span style="color: #88aaee;">INPUT$</span>(1)
 </div>
 </div>
 
-<div id="outline-container-org2c1423d" class="outline-2">
-<h2 id="org2c1423d"><span class="section-number-2">5.</span> Textured spherical spiral</h2>
+<div id="outline-container-org290b12d" class="outline-2">
+<h2 id="org290b12d"><span class="section-number-2">5.</span> Textured spherical spiral</h2>
 <div class="outline-text-2" id="text-5">
 
-<div id="org081a30f" class="figure">
+<div id="orge958d77" class="figure">
 <p><img src="spiral, 5.png" alt="spiral, 5.png" class="responsive-img" />
 </p>
 </div>
@@ -749,11 +749,11 @@ a$ = <span style="color: #88aaee;">INPUT$</span>(1)
 </div>
 </div>
 
-<div id="outline-container-org48d246f" class="outline-2">
-<h2 id="org48d246f"><span class="section-number-2">6.</span> Textured and shaded spherical spiral</h2>
+<div id="outline-container-orgcc9ea12" class="outline-2">
+<h2 id="orgcc9ea12"><span class="section-number-2">6.</span> Textured and shaded spherical spiral</h2>
 <div class="outline-text-2" id="text-6">
 
-<div id="orgdd30f60" class="figure">
+<div id="org50929b9" class="figure">
 <p><img src="spiral, 6.png" alt="spiral, 6.png" class="responsive-img" />
 </p>
 </div>
@@ -937,7 +937,7 @@ yStep2 = (oppositePointY2 - oppositePointY1) / stepCount
 </div>
 </div>
 <div id="postamble" class="status">
-<p class="date">Created: 2025-07-30 ke 08:54</p>
+<p class="date">Created: 2025-07-30 ke 12:27</p>
 <p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
 </div>
 </body>
index 913d1b4..850d28f 100644 (file)
@@ -3,7 +3,7 @@
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
 <head>
-<!-- 2025-07-30 ke 08:54 -->
+<!-- 2025-07-30 ke 12:27 -->
 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
 <meta name="viewport" content="width=device-width, initial-scale=1" />
 <title>Algorithmic textures</title>
 <h2>Table of Contents</h2>
 <div id="text-table-of-contents" role="doc-toc">
 <ul>
-<li><a href="#org194bd84">1. Circular waves</a></li>
-<li><a href="#org6816183">2. Diamond square clouds</a></li>
-<li><a href="#org80d23b0">3. Old paper</a></li>
-<li><a href="#org8cffacc">4. Wood</a></li>
-<li><a href="#org2f5742a">5. Yellow flame</a></li>
+<li><a href="#orgecb4537">1. Circular waves</a></li>
+<li><a href="#org3ba73ad">2. Diamond square clouds</a></li>
+<li><a href="#org96f0dfa">3. Old paper</a></li>
+<li><a href="#org034a978">4. Wood</a></li>
+<li><a href="#orge0f3962">5. Yellow flame</a></li>
 </ul>
 </div>
 </div>
   }
 </style>
 
-<div id="outline-container-org194bd84" class="outline-2">
-<h2 id="org194bd84"><span class="section-number-2">1.</span> Circular waves</h2>
+<div id="outline-container-orgecb4537" class="outline-2">
+<h2 id="orgecb4537"><span class="section-number-2">1.</span> Circular waves</h2>
 <div class="outline-text-2" id="text-1">
 <p>
 This QBasic program creates visually captivating circular wave
@@ -313,8 +313,8 @@ algorithms can produce intricate and visually appealing results.
 </div>
 </div>
 
-<div id="outline-container-org6816183" class="outline-2">
-<h2 id="org6816183"><span class="section-number-2">2.</span> Diamond square clouds</h2>
+<div id="outline-container-org3ba73ad" class="outline-2">
+<h2 id="org3ba73ad"><span class="section-number-2">2.</span> Diamond square clouds</h2>
 <div class="outline-text-2" id="text-2">
 <p>
 This QBasic program demonstrates the Diamond-Square algorithm, a
@@ -429,8 +429,8 @@ WAITa$ = <span style="color: #88aaee;">INPUT$</span>(1)
 </div>
 </div>
 
-<div id="outline-container-org80d23b0" class="outline-2">
-<h2 id="org80d23b0"><span class="section-number-2">3.</span> Old paper</h2>
+<div id="outline-container-org96f0dfa" class="outline-2">
+<h2 id="org96f0dfa"><span class="section-number-2">3.</span> Old paper</h2>
 <div class="outline-text-2" id="text-3">
 <p>
 This QBasic program generates a procedural texture that simulates the
@@ -527,8 +527,8 @@ inputKey$ = <span style="color: #88aaee;">INPUT$</span>(1)
 </div>
 </div>
 
-<div id="outline-container-org8cffacc" class="outline-2">
-<h2 id="org8cffacc"><span class="section-number-2">4.</span> Wood</h2>
+<div id="outline-container-org034a978" class="outline-2">
+<h2 id="org034a978"><span class="section-number-2">4.</span> Wood</h2>
 <div class="outline-text-2" id="text-4">
 <p>
 This QBasic program creates a visually appealing simulation of a wood
@@ -622,8 +622,8 @@ exitKey$ = <span style="color: #88aaee;">INPUT$</span>(1)
 </div>
 </div>
 
-<div id="outline-container-org2f5742a" class="outline-2">
-<h2 id="org2f5742a"><span class="section-number-2">5.</span> Yellow flame</h2>
+<div id="outline-container-orge0f3962" class="outline-2">
+<h2 id="orge0f3962"><span class="section-number-2">5.</span> Yellow flame</h2>
 <div class="outline-text-2" id="text-5">
 <p>
 "Yellow Flame" is a visually captivating program written in QBasic
@@ -702,7 +702,7 @@ userInput$ = <span style="color: #88aaee;">INPUT$</span>(1)
 </div>
 </div>
 <div id="postamble" class="status">
-<p class="date">Created: 2025-07-30 ke 08:54</p>
+<p class="date">Created: 2025-07-30 ke 12:27</p>
 <p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
 </div>
 </body>
index 1e0b353..2042d46 100644 (file)
@@ -3,7 +3,7 @@
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
 <head>
-<!-- 2025-07-30 ke 08:55 -->
+<!-- 2025-07-30 ke 12:28 -->
 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
 <meta name="viewport" content="width=device-width, initial-scale=1" />
 <title>3D Synthezier</title>
@@ -1103,39 +1103,39 @@ hsAddReviewPanels();
 <h2>Table of Contents</h2>
 <div id="text-table-of-contents" role="doc-toc">
 <ul>
-<li><a href="#orgd9b8680">1. Operating principle</a>
+<li><a href="#orgcb48ea0">1. Operating principle</a>
 <ul>
-<li><a href="#org0e66f66">1.1. Rectangular city</a></li>
-<li><a href="#orgd699ac6">1.2. Hexagonal city</a></li>
+<li><a href="#org74909cb">1.1. Rectangular city</a></li>
+<li><a href="#org9c20741">1.2. Hexagonal city</a></li>
 </ul>
 </li>
-<li><a href="#org069cbd6">2. Scene description language</a>
+<li><a href="#org4184df1">2. Scene description language</a>
 <ul>
-<li><a href="#org42a8697">2.1. here</a></li>
-<li><a href="#org6a8395b">2.2. p</a></li>
-<li><a href="#orgf8e5df6">2.3. f</a></li>
-<li><a href="#org5b684c9">2.4. warn</a></li>
-<li><a href="#orgd6c7f9d">2.5. end</a></li>
-<li><a href="#org6d38d71">2.6. mtl</a></li>
-<li><a href="#org0839b89">2.7. mtlrnd</a></li>
-<li><a href="#orgaee3ec5">2.8. obj</a></li>
-<li><a href="#org439d79f">2.9. rnd</a></li>
-<li><a href="#orgeff8de3">2.10. #</a></li>
-<li><a href="#org3fddc12">2.11. out</a></li>
-<li><a href="#org3a377b2">2.12. set</a></li>
-<li><a href="#orgd1088af">2.13. variables usage</a></li>
-<li><a href="#org8dabc15">2.14. cmp</a></li>
-<li><a href="#orgcf941b0">2.15. ?</a></li>
-<li><a href="#org5316ce5">2.16. dum</a></li>
+<li><a href="#orgfa47201">2.1. here</a></li>
+<li><a href="#org25f7a07">2.2. p</a></li>
+<li><a href="#orgc7305e7">2.3. f</a></li>
+<li><a href="#orge092d7b">2.4. warn</a></li>
+<li><a href="#org91dc227">2.5. end</a></li>
+<li><a href="#orgb7ffae4">2.6. mtl</a></li>
+<li><a href="#org0bcaa7b">2.7. mtlrnd</a></li>
+<li><a href="#orgc0632e7">2.8. obj</a></li>
+<li><a href="#org4e62096">2.9. rnd</a></li>
+<li><a href="#orgf81c443">2.10. #</a></li>
+<li><a href="#org26c545e">2.11. out</a></li>
+<li><a href="#org4e5c2b0">2.12. set</a></li>
+<li><a href="#org0b63a1f">2.13. variables usage</a></li>
+<li><a href="#orgba5cc69">2.14. cmp</a></li>
+<li><a href="#orgd16a527">2.15. ?</a></li>
+<li><a href="#org0f19c61">2.16. dum</a></li>
 </ul>
 </li>
-<li><a href="#org1509f08">3. Installation</a>
+<li><a href="#orgda9265a">3. Installation</a>
 <ul>
-<li><a href="#org938ea8f">3.1. System requirements</a></li>
-<li><a href="#orgcf089f3">3.2. Directory layout</a></li>
+<li><a href="#org3502c1e">3.1. System requirements</a></li>
+<li><a href="#org65c6c2e">3.2. Directory layout</a></li>
 </ul>
 </li>
-<li><a href="#org393308b">4. Usage</a></li>
+<li><a href="#org3ed8023">4. Usage</a></li>
 </ul>
 </div>
 </div>
@@ -1157,8 +1157,8 @@ hsAddReviewPanels();
 </style>
 
 
-<div id="outline-container-orgd9b8680" class="outline-2">
-<h2 id="orgd9b8680"><span class="section-number-2">1.</span> Operating principle</h2>
+<div id="outline-container-orgcb48ea0" class="outline-2">
+<h2 id="orgcb48ea0"><span class="section-number-2">1.</span> Operating principle</h2>
 <div class="outline-text-2" id="text-1">
 <p>
 Parses scene definition language and creates 3D world based on
@@ -1221,60 +1221,60 @@ They were produced by importing generated <a href="https://en.wikipedia.org/wiki
 </p>
 </div>
 
-<div id="outline-container-org0e66f66" class="outline-3">
-<h3 id="org0e66f66"><span class="section-number-3">1.1.</span> Rectangular city</h3>
+<div id="outline-container-org74909cb" class="outline-3">
+<h3 id="org74909cb"><span class="section-number-3">1.1.</span> Rectangular city</h3>
 <div class="outline-text-3" id="text-1-1">
 
-<div id="orgddb612b" class="figure">
+<div id="org628eaae" class="figure">
 <p><img src="rectangular city, 1.jpeg" alt="rectangular city, 1.jpeg" class="responsive-img" />
 </p>
 </div>
 
 
-<div id="org491aa98" class="figure">
+<div id="org3fad009" class="figure">
 <p><img src="rectangular city, 2.jpeg" alt="rectangular city, 2.jpeg" class="responsive-img" />
 </p>
 </div>
 
 
-<div id="org4934254" class="figure">
+<div id="org007bf4c" class="figure">
 <p><img src="rectangular city, 3.jpeg" alt="rectangular city, 3.jpeg" class="responsive-img" />
 </p>
 </div>
 </div>
 </div>
-<div id="outline-container-orgd699ac6" class="outline-3">
-<h3 id="orgd699ac6"><span class="section-number-3">1.2.</span> Hexagonal city</h3>
+<div id="outline-container-org9c20741" class="outline-3">
+<h3 id="org9c20741"><span class="section-number-3">1.2.</span> Hexagonal city</h3>
 <div class="outline-text-3" id="text-1-2">
 
-<div id="org8c2b994" class="figure">
+<div id="orgd2a1640" class="figure">
 <p><img src="hexagonal city, 1.jpeg" alt="hexagonal city, 1.jpeg" class="responsive-img" />
 </p>
 </div>
 
 
-<div id="org36089f7" class="figure">
+<div id="org9b78137" class="figure">
 <p><img src="hexagonal city, 2.jpeg" alt="hexagonal city, 2.jpeg" class="responsive-img" />
 </p>
 </div>
 
 
-<div id="orge9eded1" class="figure">
+<div id="org7763082" class="figure">
 <p><img src="hexagonal city, 3.jpeg" alt="hexagonal city, 3.jpeg" class="responsive-img" />
 </p>
 </div>
 </div>
 </div>
 </div>
-<div id="outline-container-org069cbd6" class="outline-2">
-<h2 id="org069cbd6"><span class="section-number-2">2.</span> Scene description language</h2>
+<div id="outline-container-org4184df1" class="outline-2">
+<h2 id="org4184df1"><span class="section-number-2">2.</span> Scene description language</h2>
 <div class="outline-text-2" id="text-2">
 <p>
 See also examples.
 </p>
 </div>
-<div id="outline-container-org42a8697" class="outline-3">
-<h3 id="org42a8697"><span class="section-number-3">2.1.</span> here</h3>
+<div id="outline-container-orgfa47201" class="outline-3">
+<h3 id="orgfa47201"><span class="section-number-3">2.1.</span> here</h3>
 <div class="outline-text-3" id="text-2-1">
 <pre class="example">
 here
@@ -1285,8 +1285,8 @@ defines new segment
 </p>
 </div>
 </div>
-<div id="outline-container-org6a8395b" class="outline-3">
-<h3 id="org6a8395b"><span class="section-number-3">2.2.</span> p</h3>
+<div id="outline-container-org25f7a07" class="outline-3">
+<h3 id="org25f7a07"><span class="section-number-3">2.2.</span> p</h3>
 <div class="outline-text-3" id="text-2-2">
 <pre class="example">
 p  x y z
@@ -1297,8 +1297,8 @@ defines new point
 </p>
 </div>
 </div>
-<div id="outline-container-orgf8e5df6" class="outline-3">
-<h3 id="orgf8e5df6"><span class="section-number-3">2.3.</span> f</h3>
+<div id="outline-container-orgc7305e7" class="outline-3">
+<h3 id="orgc7305e7"><span class="section-number-3">2.3.</span> f</h3>
 <div class="outline-text-3" id="text-2-3">
 <pre class="example">
 f  p1 p2 p3 p4
@@ -1309,8 +1309,8 @@ defines new polygon,  p4  may be unused
 </p>
 </div>
 </div>
-<div id="outline-container-org5b684c9" class="outline-3">
-<h3 id="org5b684c9"><span class="section-number-3">2.4.</span> warn</h3>
+<div id="outline-container-orge092d7b" class="outline-3">
+<h3 id="orge092d7b"><span class="section-number-3">2.4.</span> warn</h3>
 <div class="outline-text-3" id="text-2-4">
 <pre class="example">
 warn  &lt;message&gt;
@@ -1321,8 +1321,8 @@ displays warning message, and wait for key
 </p>
 </div>
 </div>
-<div id="outline-container-orgd6c7f9d" class="outline-3">
-<h3 id="orgd6c7f9d"><span class="section-number-3">2.5.</span> end</h3>
+<div id="outline-container-org91dc227" class="outline-3">
+<h3 id="org91dc227"><span class="section-number-3">2.5.</span> end</h3>
 <div class="outline-text-3" id="text-2-5">
 <pre class="example">
 end
@@ -1333,8 +1333,8 @@ terminates parser
 </p>
 </div>
 </div>
-<div id="outline-container-org6d38d71" class="outline-3">
-<h3 id="org6d38d71"><span class="section-number-3">2.6.</span> mtl</h3>
+<div id="outline-container-orgb7ffae4" class="outline-3">
+<h3 id="orgb7ffae4"><span class="section-number-3">2.6.</span> mtl</h3>
 <div class="outline-text-3" id="text-2-6">
 <pre class="example">
 mtl  material
@@ -1345,8 +1345,8 @@ selects material
 </p>
 </div>
 </div>
-<div id="outline-container-org0839b89" class="outline-3">
-<h3 id="org0839b89"><span class="section-number-3">2.7.</span> mtlrnd</h3>
+<div id="outline-container-org0bcaa7b" class="outline-3">
+<h3 id="org0bcaa7b"><span class="section-number-3">2.7.</span> mtlrnd</h3>
 <div class="outline-text-3" id="text-2-7">
 <pre class="example">
 mtlrnd  material ...
@@ -1357,8 +1357,8 @@ selects random material from list
 </p>
 </div>
 </div>
-<div id="outline-container-orgaee3ec5" class="outline-3">
-<h3 id="orgaee3ec5"><span class="section-number-3">2.8.</span> obj</h3>
+<div id="outline-container-orgc0632e7" class="outline-3">
+<h3 id="orgc0632e7"><span class="section-number-3">2.8.</span> obj</h3>
 <div class="outline-text-3" id="text-2-8">
 <pre class="example">
 obj  object xz45 xy20 x+3 y*2
@@ -1373,14 +1373,14 @@ directly from file, and not chached, to allow loading of greater than
 </p>
 
 
-<div id="orga6f9f50" class="figure">
+<div id="orgca1d883" class="figure">
 <p><img src="rotation.png" alt="rotation.png" />
 </p>
 </div>
 </div>
 </div>
-<div id="outline-container-org439d79f" class="outline-3">
-<h3 id="org439d79f"><span class="section-number-3">2.9.</span> rnd</h3>
+<div id="outline-container-org4e62096" class="outline-3">
+<h3 id="org4e62096"><span class="section-number-3">2.9.</span> rnd</h3>
 <div class="outline-text-3" id="text-2-9">
 <pre class="example">
 rnd  p^1^2^3 p^7^2^1
@@ -1391,8 +1391,8 @@ select random command to execute, ^ will be converted to spaces.
 </p>
 </div>
 </div>
-<div id="outline-container-orgeff8de3" class="outline-3">
-<h3 id="orgeff8de3"><span class="section-number-3">2.10.</span> #</h3>
+<div id="outline-container-orgf81c443" class="outline-3">
+<h3 id="orgf81c443"><span class="section-number-3">2.10.</span> #</h3>
 <div class="outline-text-3" id="text-2-10">
 <pre class="example">
 # whatever text
@@ -1403,8 +1403,8 @@ comment
 </p>
 </div>
 </div>
-<div id="outline-container-org3fddc12" class="outline-3">
-<h3 id="org3fddc12"><span class="section-number-3">2.11.</span> out</h3>
+<div id="outline-container-org26c545e" class="outline-3">
+<h3 id="org26c545e"><span class="section-number-3">2.11.</span> out</h3>
 <div class="outline-text-3" id="text-2-11">
 <pre class="example">
 out  file
@@ -1415,8 +1415,8 @@ specify output file name, must be first command
 </p>
 </div>
 </div>
-<div id="outline-container-org3a377b2" class="outline-3">
-<h3 id="org3a377b2"><span class="section-number-3">2.12.</span> set</h3>
+<div id="outline-container-org4e5c2b0" class="outline-3">
+<h3 id="org4e5c2b0"><span class="section-number-3">2.12.</span> set</h3>
 <div class="outline-text-3" id="text-2-12">
 <pre class="example">
 set  variable  contents
@@ -1428,8 +1428,8 @@ string. max variables is 100. first is 0.
 </p>
 </div>
 </div>
-<div id="outline-container-orgd1088af" class="outline-3">
-<h3 id="orgd1088af"><span class="section-number-3">2.13.</span> variables usage</h3>
+<div id="outline-container-org0b63a1f" class="outline-3">
+<h3 id="org0b63a1f"><span class="section-number-3">2.13.</span> variables usage</h3>
 <div class="outline-text-3" id="text-2-13">
 <pre class="example">
 anycommand %1 anything
@@ -1440,8 +1440,8 @@ inserts variable 1 contents info line
 </p>
 </div>
 </div>
-<div id="outline-container-org8dabc15" class="outline-3">
-<h3 id="org8dabc15"><span class="section-number-3">2.14.</span> cmp</h3>
+<div id="outline-container-orgba5cc69" class="outline-3">
+<h3 id="orgba5cc69"><span class="section-number-3">2.14.</span> cmp</h3>
 <div class="outline-text-3" id="text-2-14">
 <pre class="example">
 cmp  flag string1 string2
@@ -1452,8 +1452,8 @@ compares strings, and inserts TRUE to flag, if they are equal, else inserts FALS
 </p>
 </div>
 </div>
-<div id="outline-container-orgcf941b0" class="outline-3">
-<h3 id="orgcf941b0"><span class="section-number-3">2.15.</span> ?</h3>
+<div id="outline-container-orgd16a527" class="outline-3">
+<h3 id="orgd16a527"><span class="section-number-3">2.15.</span> ?</h3>
 <div class="outline-text-3" id="text-2-15">
 <pre class="example">
 ?flag anycommand
@@ -1468,8 +1468,8 @@ exapmle: ?3 obj car z*2 xy45
 </p>
 </div>
 </div>
-<div id="outline-container-org5316ce5" class="outline-3">
-<h3 id="org5316ce5"><span class="section-number-3">2.16.</span> dum</h3>
+<div id="outline-container-org0f19c61" class="outline-3">
+<h3 id="org0f19c61"><span class="section-number-3">2.16.</span> dum</h3>
 <div class="outline-text-3" id="text-2-16">
 <pre class="example">
 dum
@@ -1482,16 +1482,16 @@ dummy function, does notheing
 </div>
 </div>
 
-<div id="outline-container-org1509f08" class="outline-2">
-<h2 id="org1509f08"><span class="section-number-2">3.</span> Installation</h2>
+<div id="outline-container-orgda9265a" class="outline-2">
+<h2 id="orgda9265a"><span class="section-number-2">3.</span> Installation</h2>
 <div class="outline-text-2" id="text-3">
 <p>
 Edit <b>bin/3dparse.bas</b> file and update include path in there.
 </p>
 </div>
 
-<div id="outline-container-org938ea8f" class="outline-3">
-<h3 id="org938ea8f"><span class="section-number-3">3.1.</span> System requirements</h3>
+<div id="outline-container-org3502c1e" class="outline-3">
+<h3 id="org3502c1e"><span class="section-number-3">3.1.</span> System requirements</h3>
 <div class="outline-text-3" id="text-3-1">
 <table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
 
@@ -1522,8 +1522,8 @@ Edit <b>bin/3dparse.bas</b> file and update include path in there.
 </div>
 </div>
 
-<div id="outline-container-orgcf089f3" class="outline-3">
-<h3 id="orgcf089f3"><span class="section-number-3">3.2.</span> Directory layout</h3>
+<div id="outline-container-org65c6c2e" class="outline-3">
+<h3 id="org65c6c2e"><span class="section-number-3">3.2.</span> Directory layout</h3>
 <div class="outline-text-3" id="text-3-2">
 <dl class="org-dl">
 <dt>bin</dt><dd><dl class="org-dl">
@@ -1540,8 +1540,8 @@ Edit <b>bin/3dparse.bas</b> file and update include path in there.
 </div>
 </div>
 
-<div id="outline-container-org393308b" class="outline-2">
-<h2 id="org393308b"><span class="section-number-2">4.</span> Usage</h2>
+<div id="outline-container-org3ed8023" class="outline-2">
+<h2 id="org3ed8023"><span class="section-number-2">4.</span> Usage</h2>
 <div class="outline-text-2" id="text-4">
 <p>
 Make sure you have QB binaries in your PATH.  Execute
@@ -1566,7 +1566,7 @@ Visualize scene with your favourite renderer.
 </div>
 </div>
 <div id="postamble" class="status">
-<p class="date">Created: 2025-07-30 ke 08:55</p>
+<p class="date">Created: 2025-07-30 ke 12:28</p>
 <p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
 </div>
 </body>
index 69acd20..5f4e084 100644 (file)
@@ -3,7 +3,7 @@
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
 <head>
-<!-- 2025-07-30 ke 08:55 -->
+<!-- 2025-07-30 ke 12:29 -->
 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
 <meta name="viewport" content="width=device-width, initial-scale=1" />
 <title>Miscellaneous 3D graphics demos</title>
 <h2>Table of Contents</h2>
 <div id="text-table-of-contents" role="doc-toc">
 <ul>
-<li><a href="#orgc78d249">1. Rotating exclamation mark</a></li>
-<li><a href="#orgb2f9057">2. 3D bouncing ball</a></li>
-<li><a href="#org194c108">3. 3D text in a room</a></li>
-<li><a href="#org2544c8a">4. 3D bouncing cubes on grid floor</a></li>
-<li><a href="#orgdf2dd1e">5. Matrix math for rotation in 3D space</a></li>
-<li><a href="#org28227eb">6. Maze explorer</a></li>
-<li><a href="#orge1c373c">7. Tank animation</a></li>
-<li><a href="#org853da96">8. Tiled room</a></li>
+<li><a href="#org00a0fea">1. Rotating exclamation mark</a></li>
+<li><a href="#orgb65348b">2. 3D bouncing ball</a></li>
+<li><a href="#org4b63f7c">3. 3D text in a room</a></li>
+<li><a href="#org623a062">4. 3D bouncing cubes on grid floor</a></li>
+<li><a href="#orgc1fa852">5. Matrix math for rotation in 3D space</a></li>
+<li><a href="#org0a76ec7">6. Maze explorer</a></li>
+<li><a href="#org4dd3bb2">7. Tank animation</a></li>
+<li><a href="#orga21329b">8. Tiled room</a></li>
 </ul>
 </div>
 </div>
   }
 </style>
 
-<div id="outline-container-orgc78d249" class="outline-2">
-<h2 id="orgc78d249"><span class="section-number-2">1.</span> Rotating exclamation mark</h2>
+<div id="outline-container-org00a0fea" class="outline-2">
+<h2 id="org00a0fea"><span class="section-number-2">1.</span> Rotating exclamation mark</h2>
 <div class="outline-text-2" id="text-1">
 <p>
 Wireframe 3D model of a rotating exclamation mark.
@@ -258,8 +258,8 @@ Wireframe 3D model of a rotating exclamation mark.
 </div>
 </div>
 
-<div id="outline-container-orgb2f9057" class="outline-2">
-<h2 id="orgb2f9057"><span class="section-number-2">2.</span> 3D bouncing ball</h2>
+<div id="outline-container-orgb65348b" class="outline-2">
+<h2 id="orgb65348b"><span class="section-number-2">2.</span> 3D bouncing ball</h2>
 <div class="outline-text-2" id="text-2">
 <p>
 This QBasic program creates a visually engaging 3D animation of a
@@ -280,8 +280,8 @@ of early computer graphics techniques.
 </div>
 </div>
 
-<div id="outline-container-org194c108" class="outline-2">
-<h2 id="org194c108"><span class="section-number-2">3.</span> 3D text in a room</h2>
+<div id="outline-container-org4b63f7c" class="outline-2">
+<h2 id="org4b63f7c"><span class="section-number-2">3.</span> 3D text in a room</h2>
 <div class="outline-text-2" id="text-3">
 <p>
 Wireframe 3D text hanging in a wireframe 3D room. User can look and
@@ -301,8 +301,8 @@ fly around in all directions.
 </div>
 </div>
 
-<div id="outline-container-org2544c8a" class="outline-2">
-<h2 id="org2544c8a"><span class="section-number-2">4.</span> 3D bouncing cubes on grid floor</h2>
+<div id="outline-container-org623a062" class="outline-2">
+<h2 id="org623a062"><span class="section-number-2">4.</span> 3D bouncing cubes on grid floor</h2>
 <div class="outline-text-2" id="text-4">
 <p>
 3D wireframe cubes bouncing on a grid floor, creating an immersive and
@@ -322,8 +322,8 @@ dynamic visual effect.
 </div>
 </div>
 
-<div id="outline-container-orgdf2dd1e" class="outline-2">
-<h2 id="orgdf2dd1e"><span class="section-number-2">5.</span> Matrix math for rotation in 3D space</h2>
+<div id="outline-container-orgc1fa852" class="outline-2">
+<h2 id="orgc1fa852"><span class="section-number-2">5.</span> Matrix math for rotation in 3D space</h2>
 <div class="outline-text-2" id="text-5">
 <p>
 Instead of combining simple 2D rotors, pixels in this 3D space are
@@ -343,8 +343,8 @@ rotated by using matrix multiplications.
 </div>
 </div>
 
-<div id="outline-container-org28227eb" class="outline-2">
-<h2 id="org28227eb"><span class="section-number-2">6.</span> Maze explorer</h2>
+<div id="outline-container-org0a76ec7" class="outline-2">
+<h2 id="org0a76ec7"><span class="section-number-2">6.</span> Maze explorer</h2>
 <div class="outline-text-2" id="text-6">
 <p>
 The Evolving 3D Maze Explorer is a QBasic program that generates and
@@ -355,7 +355,7 @@ changes as they navigate through it.
 </p>
 
 
-<div id="orgd31decb" class="figure">
+<div id="orgce49d77" class="figure">
 <p><a href="Maze%20explorer.bas" class="responsive-img"><img src="Maze%20explorer.png" alt="Maze%20explorer.png" class="responsive-img" /></a>
 </p>
 </div>
@@ -366,8 +366,8 @@ changes as they navigate through it.
 </div>
 </div>
 
-<div id="outline-container-orge1c373c" class="outline-2">
-<h2 id="orge1c373c"><span class="section-number-2">7.</span> Tank animation</h2>
+<div id="outline-container-org4dd3bb2" class="outline-2">
+<h2 id="org4dd3bb2"><span class="section-number-2">7.</span> Tank animation</h2>
 <div class="outline-text-2" id="text-7">
 <p>
 Animated tank driving through the bridge back and forward. User can
@@ -387,8 +387,8 @@ look and fly around in all directions.
 </div>
 </div>
 
-<div id="outline-container-org853da96" class="outline-2">
-<h2 id="org853da96"><span class="section-number-2">8.</span> Tiled room</h2>
+<div id="outline-container-orga21329b" class="outline-2">
+<h2 id="orga21329b"><span class="section-number-2">8.</span> Tiled room</h2>
 <div class="outline-text-2" id="text-8">
 <p>
 Room with some tiles on the wall and on the floor. User can freely fly
@@ -409,7 +409,7 @@ around.
 </div>
 </div>
 <div id="postamble" class="status">
-<p class="date">Created: 2025-07-30 ke 08:55</p>
+<p class="date">Created: 2025-07-30 ke 12:29</p>
 <p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
 </div>
 </body>
index 7355761..e3257ab 100644 (file)
@@ -3,7 +3,7 @@
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
 <head>
-<!-- 2025-07-30 ke 08:56 -->
+<!-- 2025-07-30 ke 12:29 -->
 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
 <meta name="viewport" content="width=device-width, initial-scale=1" />
 <title>Space themed 3D graphics</title>
 <h2>Table of Contents</h2>
 <div id="text-table-of-contents" role="doc-toc">
 <ul>
-<li><a href="#orgc0d8309">1. Galaxy explorer</a></li>
-<li><a href="#org4cc6b4a">2. Rocket simulator</a></li>
-<li><a href="#org53ccbc2">3. Stars</a></li>
-<li><a href="#orge2db8d0">4. Universe explorer</a></li>
+<li><a href="#org9ee68ab">1. Galaxy explorer</a></li>
+<li><a href="#org3084c19">2. Rocket simulator</a></li>
+<li><a href="#org8dbb7ff">3. Stars</a></li>
+<li><a href="#org38fc047">4. Universe explorer</a></li>
 </ul>
 </div>
 </div>
   }
 </style>
 
-<div id="outline-container-orgc0d8309" class="outline-2">
-<h2 id="orgc0d8309"><span class="section-number-2">1.</span> Galaxy explorer</h2>
+<div id="outline-container-org9ee68ab" class="outline-2">
+<h2 id="org9ee68ab"><span class="section-number-2">1.</span> Galaxy explorer</h2>
 <div class="outline-text-2" id="text-1">
 <p>
 This QBasic program renders a navigable 3D point cloud galaxy,
@@ -245,7 +245,7 @@ galaxy with stars distributed in a spiral pattern.
 </p>
 
 
-<div id="org12a0c2b" class="figure">
+<div id="orge37e684" class="figure">
 <p><a href="Galaxy%20explorer.bas" class="responsive-img"><img src="Galaxy%20explorer.png" alt="Galaxy%20explorer.png" class="responsive-img" /></a>
 </p>
 </div>
@@ -256,8 +256,8 @@ galaxy with stars distributed in a spiral pattern.
 </div>
 </div>
 
-<div id="outline-container-org4cc6b4a" class="outline-2">
-<h2 id="org4cc6b4a"><span class="section-number-2">2.</span> Rocket simulator</h2>
+<div id="outline-container-org3084c19" class="outline-2">
+<h2 id="org3084c19"><span class="section-number-2">2.</span> Rocket simulator</h2>
 <div class="outline-text-2" id="text-2">
 <p>
 QBasic program that simulates the takeoff and flight of a rocket from
@@ -279,8 +279,8 @@ observe the rocket's trajectory from various angles.
 </div>
 </div>
 
-<div id="outline-container-org53ccbc2" class="outline-2">
-<h2 id="org53ccbc2"><span class="section-number-2">3.</span> Stars</h2>
+<div id="outline-container-org8dbb7ff" class="outline-2">
+<h2 id="org8dbb7ff"><span class="section-number-2">3.</span> Stars</h2>
 <div class="outline-text-2" id="text-3">
 <p>
 The 3D Starfield Simulation is a QBasic program that creates a
@@ -320,8 +320,8 @@ based on its distance, with closer stars appearing brighter.</dd>
 </div>
 </div>
 
-<div id="outline-container-orge2db8d0" class="outline-2">
-<h2 id="orge2db8d0"><span class="section-number-2">4.</span> Universe explorer</h2>
+<div id="outline-container-org38fc047" class="outline-2">
+<h2 id="org38fc047"><span class="section-number-2">4.</span> Universe explorer</h2>
 <div class="outline-text-2" id="text-4">
 <p>
 This QBasic program that simulates a navigable 3D universe. Users can
@@ -358,19 +358,19 @@ limiting the number of rendered objects based on distance.</dd>
 </dl>
 
 
-<div id="orgc4b3925" class="figure">
+<div id="org23b084c" class="figure">
 <p><a href="Universe%20explorer/Universe%20explorer.bas" class="responsive-img"><img src="Universe%20explorer/1.png" alt="1.png" class="responsive-img" /></a>
 </p>
 </div>
 
 
-<div id="org872ba15" class="figure">
+<div id="org10479cc" class="figure">
 <p><a href="Universe%20explorer/Universe%20explorer.bas" class="responsive-img"><img src="Universe%20explorer/2.png" alt="2.png" class="responsive-img" /></a>
 </p>
 </div>
 
 
-<div id="org472a2f8" class="figure">
+<div id="orge437bae" class="figure">
 <p><a href="Universe%20explorer/Universe%20explorer.bas" class="responsive-img"><img src="Universe%20explorer/3.png" alt="3.png" class="responsive-img" /></a>
 </p>
 </div>
@@ -382,7 +382,7 @@ limiting the number of rendered objects based on distance.</dd>
 </div>
 </div>
 <div id="postamble" class="status">
-<p class="date">Created: 2025-07-30 ke 08:56</p>
+<p class="date">Created: 2025-07-30 ke 12:29</p>
 <p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
 </div>
 </body>
index ff4d269..29cc33d 100644 (file)
@@ -3,7 +3,7 @@
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
 <head>
-<!-- 2025-07-30 ke 08:56 -->
+<!-- 2025-07-30 ke 12:29 -->
 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
 <meta name="viewport" content="width=device-width, initial-scale=1" />
 <title>Plotting</title>
 <h2>Table of Contents</h2>
 <div id="text-table-of-contents" role="doc-toc">
 <ul>
-<li><a href="#org606157c">1. 2D graph</a></li>
-<li><a href="#org8371fa8">2. 3D graph</a></li>
-<li><a href="#org6fcf670">3. Deriviative calculator</a></li>
-<li><a href="#orgd112640">4. Sine and cosine table</a></li>
+<li><a href="#org45148cb">1. 2D graph</a></li>
+<li><a href="#orgd092199">2. 3D graph</a></li>
+<li><a href="#orgd47dfc9">3. Deriviative calculator</a></li>
+<li><a href="#org7bce8b5">4. Sine and cosine table</a></li>
 </ul>
 </div>
 </div>
   }
 </style>
 
-<div id="outline-container-org606157c" class="outline-2">
-<h2 id="org606157c"><span class="section-number-2">1.</span> 2D graph</h2>
+<div id="outline-container-org45148cb" class="outline-2">
+<h2 id="org45148cb"><span class="section-number-2">1.</span> 2D graph</h2>
 <div class="outline-text-2" id="text-1">
 <p>
 The 2D Graph Plotter is a simple yet effective program written in
@@ -251,7 +251,7 @@ based on a user-defined mathematical function.
 </p>
 
 
-<div id="org9b4bdcf" class="figure">
+<div id="orgea3056b" class="figure">
 <p><a href="2D%20graph%20plot.bas" class="responsive-img"><img src="2D%20graph%20plot.png" alt="2D%20graph%20plot.png" class="responsive-img" /></a>
 </p>
 </div>
@@ -262,8 +262,8 @@ based on a user-defined mathematical function.
 </div>
 </div>
 
-<div id="outline-container-org8371fa8" class="outline-2">
-<h2 id="org8371fa8"><span class="section-number-2">2.</span> 3D graph</h2>
+<div id="outline-container-orgd092199" class="outline-2">
+<h2 id="orgd092199"><span class="section-number-2">2.</span> 3D graph</h2>
 <div class="outline-text-2" id="text-2">
 <p>
 The 3D Heightmap Explorer is a QBasic program designed to visualize
@@ -299,7 +299,7 @@ grid.
 </p>
 
 
-<div id="org21a4083" class="figure">
+<div id="org077c47f" class="figure">
 <p><a href="3D%20graph.bas" class="responsive-img"><img src="3D%20graph.png" alt="3D%20graph.png" class="responsive-img" /></a>
 </p>
 </div>
@@ -310,8 +310,8 @@ grid.
 </div>
 </div>
 
-<div id="outline-container-org6fcf670" class="outline-2">
-<h2 id="org6fcf670"><span class="section-number-2">3.</span> Deriviative calculator</h2>
+<div id="outline-container-orgd47dfc9" class="outline-2">
+<h2 id="orgd47dfc9"><span class="section-number-2">3.</span> Deriviative calculator</h2>
 <div class="outline-text-2" id="text-3">
 <p>
 This QBasic program is designed to compute and plot an arbitrary
@@ -324,7 +324,7 @@ visualized.
 </p>
 
 
-<div id="org2f0f312" class="figure">
+<div id="orga32bb22" class="figure">
 <p><a href="Deriviative%20calculator.bas" class="responsive-img"><img src="Deriviative%20calculator.png" alt="Deriviative%20calculator.png" class="responsive-img" /></a>
 </p>
 </div>
@@ -335,8 +335,8 @@ visualized.
 </div>
 </div>
 
-<div id="outline-container-orgd112640" class="outline-2">
-<h2 id="orgd112640"><span class="section-number-2">4.</span> Sine and cosine table</h2>
+<div id="outline-container-org7bce8b5" class="outline-2">
+<h2 id="org7bce8b5"><span class="section-number-2">4.</span> Sine and cosine table</h2>
 <div class="outline-text-2" id="text-4">
 <p>
 The SIN &amp; COS Table Generator is a QBasic program designed to visually
@@ -346,7 +346,7 @@ visual representation of these fundamental trigonometric functions.
 </p>
 
 
-<div id="org7b2669b" class="figure">
+<div id="org7bcbdf8" class="figure">
 <p><a href="Sine%20and%20cosine%20table.bas" class="responsive-img"><img src="Sine%20and%20cosine%20table.png" alt="Sine%20and%20cosine%20table.png" class="responsive-img" /></a>
 </p>
 </div>
@@ -358,7 +358,7 @@ visual representation of these fundamental trigonometric functions.
 </div>
 </div>
 <div id="postamble" class="status">
-<p class="date">Created: 2025-07-30 ke 08:56</p>
+<p class="date">Created: 2025-07-30 ke 12:29</p>
 <p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
 </div>
 </body>
index d446fdb..ead8f08 100644 (file)
@@ -3,7 +3,7 @@
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
 <head>
-<!-- 2025-07-30 ke 08:56 -->
+<!-- 2025-07-30 ke 12:29 -->
 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
 <meta name="viewport" content="width=device-width, initial-scale=1" />
 <title>Simulation</title>
 <h2>Table of Contents</h2>
 <div id="text-table-of-contents" role="doc-toc">
 <ul>
-<li><a href="#org68d895a">1. Explosion simulator</a></li>
-<li><a href="#orgf6ba3ac">2. Gravity in 2D</a></li>
-<li><a href="#orgc96821f">3. Gravity in 3D</a></li>
-<li><a href="#org0b3ffba">4. Interference</a></li>
-<li><a href="#orga57850a">5. Interferogram</a></li>
-<li><a href="#org602eb83">6. Surface tension</a></li>
-<li><a href="#org468ff0b">7. Wave 1</a></li>
-<li><a href="#orgc8f6c62">8. Wave 2</a></li>
+<li><a href="#orgdb57575">1. Explosion simulator</a></li>
+<li><a href="#orgfc07a76">2. Gravity in 2D</a></li>
+<li><a href="#org586f4fe">3. Gravity in 3D</a></li>
+<li><a href="#orgceed08f">4. Interference</a></li>
+<li><a href="#orga886cdf">5. Interferogram</a></li>
+<li><a href="#orge4dea1b">6. Surface tension</a></li>
+<li><a href="#orgeb267f3">7. Wave 1</a></li>
+<li><a href="#orgb315c6d">8. Wave 2</a></li>
 </ul>
 </div>
 </div>
   }
 </style>
 
-<div id="outline-container-org68d895a" class="outline-2">
-<h2 id="org68d895a"><span class="section-number-2">1.</span> Explosion simulator</h2>
+<div id="outline-container-orgdb57575" class="outline-2">
+<h2 id="orgdb57575"><span class="section-number-2">1.</span> Explosion simulator</h2>
 <div class="outline-text-2" id="text-1">
 <p>
 This QBasic program simulates the propagation of shock waves in a gas
@@ -265,7 +265,7 @@ conditions by setting velocities to zero at wall boundaries.
 </p>
 
 
-<div id="org6df3fa0" class="figure">
+<div id="org1835bd3" class="figure">
 <p><a href="Explosion%20simulator.bas" class="responsive-img"><img src="Explosion%20simulator.png" alt="Explosion%20simulator.png" class="responsive-img" /></a>
 </p>
 </div>
@@ -276,8 +276,8 @@ conditions by setting velocities to zero at wall boundaries.
 </div>
 </div>
 
-<div id="outline-container-orgf6ba3ac" class="outline-2">
-<h2 id="orgf6ba3ac"><span class="section-number-2">2.</span> Gravity in 2D</h2>
+<div id="outline-container-orgfc07a76" class="outline-2">
+<h2 id="orgfc07a76"><span class="section-number-2">2.</span> Gravity in 2D</h2>
 <div class="outline-text-2" id="text-2">
 <p>
 The Gravitation Simulation program is a simple yet insightful QBasic
@@ -289,7 +289,7 @@ educational tool for understanding basic orbital mechanics.
 </p>
 
 
-<div id="org5d1eb55" class="figure">
+<div id="org16c07f9" class="figure">
 <p><a href="Gravity%20in%202D.bas" class="responsive-img"><img src="Gravity%20in%202D.png" alt="Gravity%20in%202D.png" class="responsive-img" /></a>
 </p>
 </div>
@@ -300,8 +300,8 @@ educational tool for understanding basic orbital mechanics.
 </div>
 </div>
 
-<div id="outline-container-orgc96821f" class="outline-2">
-<h2 id="orgc96821f"><span class="section-number-2">3.</span> Gravity in 3D</h2>
+<div id="outline-container-org586f4fe" class="outline-2">
+<h2 id="org586f4fe"><span class="section-number-2">3.</span> Gravity in 3D</h2>
 <div class="outline-text-2" id="text-3">
 <p>
 This QBasic program simulates the gravitational interactions between
@@ -335,8 +335,8 @@ will reach stable configuration.
 </div>
 </div>
 
-<div id="outline-container-org0b3ffba" class="outline-2">
-<h2 id="org0b3ffba"><span class="section-number-2">4.</span> Interference</h2>
+<div id="outline-container-orgceed08f" class="outline-2">
+<h2 id="orgceed08f"><span class="section-number-2">4.</span> Interference</h2>
 <div class="outline-text-2" id="text-4">
 <p>
 This QBasic program simulates the interference pattern created by two
@@ -364,8 +364,8 @@ displayed as a third waveform.
 </div>
 </div>
 
-<div id="outline-container-orga57850a" class="outline-2">
-<h2 id="orga57850a"><span class="section-number-2">5.</span> Interferogram</h2>
+<div id="outline-container-orga886cdf" class="outline-2">
+<h2 id="orga886cdf"><span class="section-number-2">5.</span> Interferogram</h2>
 <div class="outline-text-2" id="text-5">
 <p>
 This QBasic program simulates the interference pattern created by
@@ -375,7 +375,7 @@ used in physics and engineering to analyze wave interactions.
 </p>
 
 
-<div id="org2acd9c4" class="figure">
+<div id="org71fca94" class="figure">
 <p><a href="Interferogram.bas" class="responsive-img"><img src="Interferogram.png" alt="Interferogram.png" class="responsive-img" /></a>
 </p>
 </div>
@@ -386,8 +386,8 @@ used in physics and engineering to analyze wave interactions.
 </div>
 </div>
 
-<div id="outline-container-org602eb83" class="outline-2">
-<h2 id="org602eb83"><span class="section-number-2">6.</span> Surface tension</h2>
+<div id="outline-container-orge4dea1b" class="outline-2">
+<h2 id="orge4dea1b"><span class="section-number-2">6.</span> Surface tension</h2>
 <div class="outline-text-2" id="text-6">
 <p>
 This QBasic program simulates the behavior of water spills and the
@@ -411,7 +411,7 @@ water cell if surrounded by a high density of water cells.
 </p>
 
 
-<div id="org0329a16" class="figure">
+<div id="org2d7e97d" class="figure">
 <p><a href="Surface%20tension.bas" class="responsive-img"><img src="Surface%20tension.png" alt="Surface%20tension.png" class="responsive-img" /></a>
 </p>
 </div>
@@ -422,8 +422,8 @@ water cell if surrounded by a high density of water cells.
 </div>
 </div>
 
-<div id="outline-container-org468ff0b" class="outline-2">
-<h2 id="org468ff0b"><span class="section-number-2">7.</span> Wave 1</h2>
+<div id="outline-container-orgeb267f3" class="outline-2">
+<h2 id="orgeb267f3"><span class="section-number-2">7.</span> Wave 1</h2>
 <div class="outline-text-2" id="text-7">
 <p>
 This QBasic program simulates the propagation of waves across a
@@ -439,7 +439,7 @@ loss.
 </p>
 
 
-<div id="orge277df4" class="figure">
+<div id="orgb928ba7" class="figure">
 <p><a href="Wave%201.bas" class="responsive-img"><img src="Wave%201.png" alt="Wave%201.png" class="responsive-img" /></a>
 </p>
 </div>
@@ -450,8 +450,8 @@ loss.
 </div>
 </div>
 
-<div id="outline-container-orgc8f6c62" class="outline-2">
-<h2 id="orgc8f6c62"><span class="section-number-2">8.</span> Wave 2</h2>
+<div id="outline-container-orgb315c6d" class="outline-2">
+<h2 id="orgb315c6d"><span class="section-number-2">8.</span> Wave 2</h2>
 <div class="outline-text-2" id="text-8">
 <p>
 This QBasic program simulates and visualizes the behavior of water
@@ -463,7 +463,7 @@ understanding wave mechanics.
 </p>
 
 
-<div id="org773b542" class="figure">
+<div id="org2ae6082" class="figure">
 <p><a href="Wave%202.bas" class="responsive-img"><img src="Wave%202.png" alt="Wave%202.png" class="responsive-img" /></a>
 </p>
 </div>
@@ -475,7 +475,7 @@ understanding wave mechanics.
 </div>
 </div>
 <div id="postamble" class="status">
-<p class="date">Created: 2025-07-30 ke 08:56</p>
+<p class="date">Created: 2025-07-30 ke 12:29</p>
 <p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
 </div>
 </body>
index ca59ad0..44eb04e 100644 (file)
@@ -3,7 +3,7 @@
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
 <head>
-<!-- 2025-07-30 ke 08:57 -->
+<!-- 2025-07-30 ke 12:30 -->
 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
 <meta name="viewport" content="width=device-width, initial-scale=1" />
 <title>Truth table calculator</title>
@@ -1103,20 +1103,20 @@ hsAddReviewPanels();
 <h2>Table of Contents</h2>
 <div id="text-table-of-contents" role="doc-toc">
 <ul>
-<li><a href="#org6ff8d10">1. Implemented logical operations</a>
+<li><a href="#org76ad210">1. Implemented logical operations</a>
 <ul>
-<li><a href="#org34525d9">1.1. Equivalent ( â‡” , 1 )</a></li>
-<li><a href="#orgf5b7cc9">1.2. Implies ( â‡’ , 2 )</a></li>
-<li><a href="#org54f0ebb">1.3. OR ( âˆ¨ , 3 )</a></li>
-<li><a href="#org7ae6d33">1.4. AND ( âˆ§ , 4 )</a></li>
-<li><a href="#orgcd6785f">1.5. NOT ( Â¬ , 5 )</a></li>
+<li><a href="#org32078da">1.1. Equivalent ( â‡” , 1 )</a></li>
+<li><a href="#org21eb9de">1.2. Implies ( â‡’ , 2 )</a></li>
+<li><a href="#org2639967">1.3. OR ( âˆ¨ , 3 )</a></li>
+<li><a href="#org8dd63d1">1.4. AND ( âˆ§ , 4 )</a></li>
+<li><a href="#org4018a60">1.5. NOT ( Â¬ , 5 )</a></li>
 </ul>
 </li>
-<li><a href="#org2c0e81d">2. Examples</a>
+<li><a href="#org248499d">2. Examples</a>
 <ul>
-<li><a href="#org335f235">2.1. Example: (A âˆ§ B) âˆ¨ Â¬C</a></li>
-<li><a href="#orgfa48512">2.2. Example: A â‡’ (B âˆ¨ Â¬C)</a></li>
-<li><a href="#org6f17529">2.3. Example: (A â‡” B) âˆ§ C</a></li>
+<li><a href="#org8ffdf82">2.1. Example: (A âˆ§ B) âˆ¨ Â¬C</a></li>
+<li><a href="#orge603e80">2.2. Example: A â‡’ (B âˆ¨ Â¬C)</a></li>
+<li><a href="#orgf2d4f3c">2.3. Example: (A â‡” B) âˆ§ C</a></li>
 </ul>
 </li>
 </ul>
@@ -1133,12 +1133,12 @@ the input variables, with the corresponding output value. Truth tables are cruci
 designing and understanding digital circuits, Boolean algebra, and logical expressions.
 </p>
 
-<div id="outline-container-org6ff8d10" class="outline-2">
-<h2 id="org6ff8d10"><span class="section-number-2">1.</span> Implemented logical operations</h2>
+<div id="outline-container-org76ad210" class="outline-2">
+<h2 id="org76ad210"><span class="section-number-2">1.</span> Implemented logical operations</h2>
 <div class="outline-text-2" id="text-1">
 </div>
-<div id="outline-container-org34525d9" class="outline-3">
-<h3 id="org34525d9"><span class="section-number-3">1.1.</span> Equivalent ( â‡” , 1 )</h3>
+<div id="outline-container-org32078da" class="outline-3">
+<h3 id="org32078da"><span class="section-number-3">1.1.</span> Equivalent ( â‡” , 1 )</h3>
 <div class="outline-text-3" id="text-1-1">
 <p>
 The equivalent operation, also known as logical biconditional, is true if and only if
@@ -1196,8 +1196,8 @@ Truth Table:
 </div>
 </div>
 
-<div id="outline-container-orgf5b7cc9" class="outline-3">
-<h3 id="orgf5b7cc9"><span class="section-number-3">1.2.</span> Implies ( â‡’ , 2 )</h3>
+<div id="outline-container-org21eb9de" class="outline-3">
+<h3 id="org21eb9de"><span class="section-number-3">1.2.</span> Implies ( â‡’ , 2 )</h3>
 <div class="outline-text-3" id="text-1-2">
 <p>
 An implication asserts that if the first proposition is true, the
@@ -1255,8 +1255,8 @@ Truth table:
 </div>
 </div>
 
-<div id="outline-container-org54f0ebb" class="outline-3">
-<h3 id="org54f0ebb"><span class="section-number-3">1.3.</span> OR ( âˆ¨ , 3 )</h3>
+<div id="outline-container-org2639967" class="outline-3">
+<h3 id="org2639967"><span class="section-number-3">1.3.</span> OR ( âˆ¨ , 3 )</h3>
 <div class="outline-text-3" id="text-1-3">
 <p>
 The OR operation, also known as logical disjunction, is true if at
@@ -1314,8 +1314,8 @@ Truth table:
 </div>
 </div>
 
-<div id="outline-container-org7ae6d33" class="outline-3">
-<h3 id="org7ae6d33"><span class="section-number-3">1.4.</span> AND ( âˆ§ , 4 )</h3>
+<div id="outline-container-org8dd63d1" class="outline-3">
+<h3 id="org8dd63d1"><span class="section-number-3">1.4.</span> AND ( âˆ§ , 4 )</h3>
 <div class="outline-text-3" id="text-1-4">
 <p>
 The AND operation, also known as logical conjunction, is true if and
@@ -1372,8 +1372,8 @@ Truth table:
 </div>
 </div>
 
-<div id="outline-container-orgcd6785f" class="outline-3">
-<h3 id="orgcd6785f"><span class="section-number-3">1.5.</span> NOT ( Â¬ , 5 )</h3>
+<div id="outline-container-org4018a60" class="outline-3">
+<h3 id="org4018a60"><span class="section-number-3">1.5.</span> NOT ( Â¬ , 5 )</h3>
 <div class="outline-text-3" id="text-1-5">
 <p>
 The NOT operation, also known as logical negation, inverts the value
@@ -1414,12 +1414,12 @@ Truth Table:
 </div>
 </div>
 </div>
-<div id="outline-container-org2c0e81d" class="outline-2">
-<h2 id="org2c0e81d"><span class="section-number-2">2.</span> Examples</h2>
+<div id="outline-container-org248499d" class="outline-2">
+<h2 id="org248499d"><span class="section-number-2">2.</span> Examples</h2>
 <div class="outline-text-2" id="text-2">
 </div>
-<div id="outline-container-org335f235" class="outline-3">
-<h3 id="org335f235"><span class="section-number-3">2.1.</span> Example: (A âˆ§ B) âˆ¨ Â¬C</h3>
+<div id="outline-container-org8ffdf82" class="outline-3">
+<h3 id="org8ffdf82"><span class="section-number-3">2.1.</span> Example: (A âˆ§ B) âˆ¨ Â¬C</h3>
 <div class="outline-text-3" id="text-2-1">
 <table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
 
@@ -1502,8 +1502,8 @@ Truth Table:
 </div>
 </div>
 
-<div id="outline-container-orgfa48512" class="outline-3">
-<h3 id="orgfa48512"><span class="section-number-3">2.2.</span> Example: A â‡’ (B âˆ¨ Â¬C)</h3>
+<div id="outline-container-orge603e80" class="outline-3">
+<h3 id="orge603e80"><span class="section-number-3">2.2.</span> Example: A â‡’ (B âˆ¨ Â¬C)</h3>
 <div class="outline-text-3" id="text-2-2">
 <table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
 
@@ -1586,8 +1586,8 @@ Truth Table:
 </div>
 </div>
 
-<div id="outline-container-org6f17529" class="outline-3">
-<h3 id="org6f17529"><span class="section-number-3">2.3.</span> Example: (A â‡” B) âˆ§ C</h3>
+<div id="outline-container-orgf2d4f3c" class="outline-3">
+<h3 id="orgf2d4f3c"><span class="section-number-3">2.3.</span> Example: (A â‡” B) âˆ§ C</h3>
 <div class="outline-text-3" id="text-2-3">
 <p>
 Truth Table:
@@ -1676,7 +1676,7 @@ Truth Table:
 </div>
 </div>
 <div id="postamble" class="status">
-<p class="date">Created: 2025-07-30 ke 08:57</p>
+<p class="date">Created: 2025-07-30 ke 12:30</p>
 <p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
 </div>
 </body>
index 678471b..1beacac 100644 (file)
@@ -3,7 +3,7 @@
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
 <head>
-<!-- 2025-07-30 ke 08:57 -->
+<!-- 2025-07-30 ke 12:31 -->
 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
 <meta name="viewport" content="width=device-width, initial-scale=1" />
 <title>Mouse driver for QBasic programs</title>
 <h2>Table of Contents</h2>
 <div id="text-table-of-contents" role="doc-toc">
 <ul>
-<li><a href="#orgf16be01">1. Overview</a></li>
-<li><a href="#org6d01472">2. High-level idea</a></li>
-<li><a href="#orgc61712f">3. Terminate and Stay Resident module</a></li>
-<li><a href="#org6191dd0">4. QBasic demonstration program</a></li>
+<li><a href="#org494c62e">1. Overview</a></li>
+<li><a href="#org15ce1af">2. High-level idea</a></li>
+<li><a href="#org6c46f87">3. Terminate and Stay Resident module</a></li>
+<li><a href="#org6fbada4">4. QBasic demonstration program</a></li>
 </ul>
 </div>
 </div>
 
-<div id="outline-container-orgf16be01" class="outline-2">
-<h2 id="orgf16be01"><span class="section-number-2">1.</span> Overview</h2>
+<div id="outline-container-org494c62e" class="outline-2">
+<h2 id="org494c62e"><span class="section-number-2">1.</span> Overview</h2>
 <div class="outline-text-2" id="text-1">
 <p>
 QBasic, a popular programming language in the DOS era, lacks native
@@ -230,8 +230,8 @@ workaround that allows QBasic to use mouse input.
 </div>
 </div>
 
-<div id="outline-container-org6d01472" class="outline-2">
-<h2 id="org6d01472"><span class="section-number-2">2.</span> High-level idea</h2>
+<div id="outline-container-org15ce1af" class="outline-2">
+<h2 id="org15ce1af"><span class="section-number-2">2.</span> High-level idea</h2>
 <div class="outline-text-2" id="text-2">
 <p>
 Workaround to access mouse involves a Terminate and Stay Resident
@@ -264,8 +264,8 @@ TSR keeps updating it with latest mouse state simultaneously.
 </div>
 </div>
 
-<div id="outline-container-orgc61712f" class="outline-2">
-<h2 id="orgc61712f"><span class="section-number-2">3.</span> Terminate and Stay Resident module</h2>
+<div id="outline-container-org6c46f87" class="outline-2">
+<h2 id="org6c46f87"><span class="section-number-2">3.</span> Terminate and Stay Resident module</h2>
 <div class="outline-text-2" id="text-3">
 <p>
 A DOS TSR program that hooks into the system's interrupt mechanism to
@@ -351,8 +351,8 @@ meanwhile.</dd>
 </div>
 </div>
 
-<div id="outline-container-org6191dd0" class="outline-2">
-<h2 id="org6191dd0"><span class="section-number-2">4.</span> QBasic demonstration program</h2>
+<div id="outline-container-org6fbada4" class="outline-2">
+<h2 id="org6fbada4"><span class="section-number-2">4.</span> QBasic demonstration program</h2>
 <div class="outline-text-2" id="text-4">
 <p>
 A QBasic program that reads mouse data from the memory location
@@ -362,7 +362,7 @@ clicks.
 
 
 
-<div id="org290bca1" class="figure">
+<div id="org0375a41" class="figure">
 <p><a href="mousedrv.bas" class="responsive-img"><img src="screenshot.png" alt="screenshot.png" class="responsive-img" /></a>
 </p>
 </div>
@@ -383,7 +383,7 @@ used: Within <a href="https://www3.svjatoslav.eu/projects/qbasicapps/3D%20GFX/Sp
 </div>
 </div>
 <div id="postamble" class="status">
-<p class="date">Created: 2025-07-30 ke 08:57</p>
+<p class="date">Created: 2025-07-30 ke 12:31</p>
 <p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
 </div>
 </body>
diff --git a/Networking/Digital data over analog audio channel/INPUT.TXT b/Networking/Digital data over analog audio channel/INPUT.TXT
deleted file mode 100644 (file)
index 9d26a9b..0000000
+++ /dev/null
@@ -1 +0,0 @@
-This is sample encoded message!\r
diff --git a/Networking/Digital data over analog audio channel/OUTPUT.TXT b/Networking/Digital data over analog audio channel/OUTPUT.TXT
deleted file mode 100644 (file)
index 9d26a9b..0000000
+++ /dev/null
@@ -1 +0,0 @@
-This is sample encoded message!\r
diff --git a/Networking/Digital data over analog audio channel/SOUND.XI b/Networking/Digital data over analog audio channel/SOUND.XI
deleted file mode 100644 (file)
index 60a4fcc..0000000
Binary files a/Networking/Digital data over analog audio channel/SOUND.XI and /dev/null differ
diff --git a/Networking/Digital data over analog audio channel/aver.bas b/Networking/Digital data over analog audio channel/aver.bas
deleted file mode 100644 (file)
index e984ed5..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-' Noise reduction\r
-' made by Svjatoslav Agejenko\r
-' in 2003.12\r
-' H-Page: svjatoslav.eu\r
-' E-Mail: svjatoslav@svjatoslav.eu\r
\r
-\r
-\r
-DECLARE SUB start ()\r
-DEFINT A-Y\r
-DIM SHARED avb(1 TO 100)\r
-DIM SHARED byte AS STRING * 1\r
-DIM SHARED po, pod\r
-DIM SHARED file1$, file2$\r
-\r
-start\r
-\r
-INPUT "average factor:", po\r
-INPUT "divide factor:", pod\r
-\r
-OPEN file2$ FOR BINARY AS #1\r
-OPEN file1$ FOR BINARY AS #2\r
-\r
-SCREEN 12\r
-px = 0\r
-1\r
-GET #1, , byte\r
-c = ASC(byte)\r
-IF c > 127 THEN c = c - 255\r
-\r
-FOR a = 1 TO po - 1\r
-avb(a) = avb(a + 1)\r
-NEXT a\r
-avb(po) = c\r
-\r
-b = 0\r
-FOR a = 1 TO po\r
-b = b + avb(a)\r
-NEXT a\r
-\r
-b = b / pod\r
-'LINE (px + 1, 0)-(px + 1, 260), 14\r
-LINE (px, 0)-(px, 260), 0\r
-PSET (px, c + 130), 12\r
-PSET (px, b + 130), 14\r
-px = px + 1\r
-IF px > 639 THEN px = 1\r
-IF b < 0 THEN b = b + 255\r
-IF b > 255 THEN b = 255\r
-byte = CHR$(b)\r
-PUT #2, , byte\r
-'c$ = INPUT$(1)\r
-IF EOF(1) = 0 THEN GOTO 1\r
-\r
-CLOSE #2\r
-CLOSE #1\r
-\r
-SUB start\r
-\r
-IF COMMAND$ = "" THEN END\r
-b$ = COMMAND$\r
-file2$ = b$\r
-file1$ = ""\r
-FOR a = 1 TO LEN(b$)\r
-c$ = RIGHT$(LEFT$(b$, a), 1)\r
-IF c$ = "." OR c$ = " " THEN GOTO 2\r
-file1$ = file1$ + c$\r
-NEXT a\r
-2\r
-file1$ = file1$ + ".awe"\r
-\r
-END SUB\r
-\r
diff --git a/Networking/Digital data over analog audio channel/index.org b/Networking/Digital data over analog audio channel/index.org
deleted file mode 100755 (executable)
index 83bf69b..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-* data in sound\r
-\r
-Utility to encode/decode digital information into wave sound file.\r
-You can later record it on the tape or send it acustically or\r
-for example over telephone line. Decoding utility\r
-is petty noise tolerant.\r
-\r
-\r
-[[file:screenshot.png]]\r
diff --git a/Networking/Digital data over analog audio channel/msg2xi.bas b/Networking/Digital data over analog audio channel/msg2xi.bas
deleted file mode 100644 (file)
index 45c1c9b..0000000
+++ /dev/null
@@ -1,163 +0,0 @@
-' Utility that encodes arbitrary text message into 8 bit sound file.
-' This audio can be now transferred over telephone line or recorded to magnetic tape.
-' This program is free software: released under Creative Commons Zero (CC0) license
-' by Svjatoslav Agejenko.
-' Email: svjatoslav@svjatoslav.eu
-' Homepage: http://www.svjatoslav.eu
-'
-' Changelog:
-' 2001, Initial version
-' 2024.09, Improved program readability
-
-DECLARE SUB StartProgram ()
-DECLARE SUB AddIWave ()
-DECLARE SUB AddOWave ()
-DECLARE SUB ByteToSound (soundByte AS SINGLE)
-
-DIM SHARED iwaveArray(1 TO 20)
-DIM SHARED owaveArray(1 TO 41)
-DIM SHARED iwaveData$
-DIM SHARED owaveData$
-DIM SHARED inputFile$
-DIM SHARED outputFile$
-DIM SHARED byte AS STRING * 1
-
-StartProgram
-
-inputFile$ = "input.txt"
-outputFile$ = "sound.xi"
-
-' Open the input and output files for binary access
-OPEN inputFile$ FOR BINARY AS #2
-OPEN outputFile$ FOR BINARY AS #1
-
-' Add data start header/marker to the audio file
-FOR a = 1 TO 50
-    AddIWave
-NEXT a
-AddOWave
-
-' Read each byte from the input file and convert it to sound
-2
-GET #2, , byte
-ByteToSound ASC(byte)
-IF EOF(2) = 0 THEN GOTO 2
-
-' Close the files after processing
-CLOSE #2
-CLOSE #1
-
-PRINT "Encoding of message into sound completed"
-
-SUB ByteToSound (soundByte AS SINGLE)
-' Convert a byte to 8-bit wave sound data
-    soundByte = soundByte + 1
-
-    ' Check if the byte value is greater than 128.
-    ' If yes, set most significant bit to 1, otherwise 0
-    IF soundByte > 128 THEN
-        soundByte = soundByte - 128
-        AddIWave
-    ELSE
-        AddOWave
-    END IF
-
-    ' Check if the byte value is greater than 64 to set next bit
-    IF soundByte > 64 THEN
-        soundByte = soundByte - 64
-        AddIWave
-    ELSE
-        AddOWave
-    END IF
-
-    IF soundByte > 32 THEN
-        soundByte = soundByte - 32
-        AddIWave
-    ELSE
-        AddOWave
-    END IF
-
-    IF soundByte > 16 THEN
-        soundByte = soundByte - 16
-        AddIWave
-    ELSE
-        AddOWave
-    END IF
-
-    IF soundByte > 8 THEN
-        soundByte = soundByte - 8
-        AddIWave
-    ELSE
-        AddOWave
-    END IF
-
-    IF soundByte > 4 THEN
-        soundByte = soundByte - 4
-        AddIWave
-    ELSE
-        AddOWave
-    END IF
-
-    IF soundByte > 2 THEN
-        soundByte = soundByte - 2
-        AddIWave
-    ELSE
-        AddOWave
-    END IF
-
-    ' Check if the byte value is greater than 1
-    IF soundByte > 1 THEN
-        AddIWave
-    ELSE
-        AddOWave
-    END IF
-END SUB
-
-SUB AddIWave
-' Write iwaveData to the output file
-    PUT #1, , iwaveData$
-END SUB
-
-SUB AddOWave
-' Write owaveData to the output file
-    PUT #1, , owaveData$
-END SUB
-
-SUB StartProgram
-' Initialize wave data arrays
-
-    pi = 3.141592653999996#
-
-    ' Generate sine wave values to represent 1
-    b = 0
-    FOR a = pi / 2 TO 2.5 * pi STEP (2 * pi / 20)
-        b = b + 1
-        iwaveArray(b) = SIN(a) * 100
-        IF iwaveArray(b) < 0 THEN
-            iwaveArray(b) = iwaveArray(b) + 255
-        END IF
-    NEXT a
-
-    ' Generate sine wave values to represent 0
-    b = 0
-    FOR a = pi / 2 TO 2.5 * pi STEP (2 * pi / 40)
-        b = b + 1
-        owaveArray(b) = SIN(a) * 100
-        IF owaveArray(b) < 0 THEN
-            owaveArray(b) = owaveArray(b) + 255
-        END IF
-    NEXT a
-
-' Convert wave arrays to string data
-
-    ' Convert iwaveArray to string because strings are more computationally efficient to write into output file.
-    FOR a = 1 TO 20
-        iwaveData$ = iwaveData$ + CHR$(iwaveArray(a))
-    NEXT a
-
-    ' Convert owaveArray to string
-    FOR a = 1 TO 40
-        owaveData$ = owaveData$ + CHR$(owaveArray(a))
-    NEXT a
-
-END SUB
diff --git a/Networking/Digital data over analog audio channel/screenshot.png b/Networking/Digital data over analog audio channel/screenshot.png
deleted file mode 100755 (executable)
index 87a3a0a..0000000
Binary files a/Networking/Digital data over analog audio channel/screenshot.png and /dev/null differ
diff --git a/Networking/Digital data over analog audio channel/xi2msg.bas b/Networking/Digital data over analog audio channel/xi2msg.bas
deleted file mode 100644 (file)
index caa0b24..0000000
+++ /dev/null
@@ -1,332 +0,0 @@
-' Utility that decodes text message from 8 bit audio recording.
-' This program is free software: released under Creative Commons Zero (CC0) license
-' by Svjatoslav Agejenko.
-' Email: svjatoslav@svjatoslav.eu
-' Homepage: http://www.svjatoslav.eu
-'
-' Changelog:
-' 2001, Initial version
-' 2024 - 2025, Improved program readability
-'
-' Data is encoded in the audio by using frequency modulation.
-' When decoding data, program locates peaks between waveforms.
-' Then it calculates distance between peaks.
-' Long between peak distance is interpreted as 0 bit, short distance is 1 bit.
-' Bits 0 and 1 are then sequentially added into bytes and complete
-' message is decoded and shown on the screen. In addition, message is written out to
-' the file.
-'
-' Frequency modulation was chosen over amplitude modulation because
-' my tests with cassette tape recorder showed that distortions affect mostly
-' signal amplitude, but do not affect signal frequency that much.
-'
-' Data carrying audio is preceded with special header tone. Program detects header tone
-' and uses it to calculate baseline signal frequency that it will use later to decode bits.
-' Also header allows to mark precise data starting point.
-
-DEFINT A-Y
-DECLARE SUB bysf (a$, d)
-DECLARE SUB messa (a$)
-DECLARE SUB pfo (f, t, it)
-DECLARE SUB anal ()
-DECLARE SUB start ()
-DECLARE SUB iadd ()
-DECLARE SUB oadd ()
-DECLARE SUB byt (a)
-
-DIM SHARED file1$
-DIM SHARED file2$
-
-' Contains the actual audio waveform samples
-DIM SHARED audioBuffer(-100 TO 10000)
-DIM SHARED bus AS STRING * 1000
-DIM SHARED bufi
-DIM SHARED bg
-DIM SHARED sm
-DIM SHARED beg
-DIM SHARED wai
-DIM SHARED old2
-
-' Statistical Analysis Array (contains measured peak distances)
-DIM SHARED statisticalArray(1 TO 10)
-DIM SHARED statl
-DIM SHARED aver
-DIM SHARED byte AS STRING * 1
-DIM SHARED avv
-
-DIM SHARED li
-DIM SHARED oc
-DIM SHARED px
-
-start
-messa "Searching for beginning..."
-
-OPEN "output.txt" FOR BINARY AS #1
-OPEN "sound.xi" FOR BINARY AS #2
-SEEK #2, 360
-
-2
-GET #2, , bus
-FOR a = 1 TO 1000
-    b$ = RIGHT$(LEFT$(bus, a), 1)
-    bufi = bufi + 1
-    c = ASC(b$)
-    IF c > 127 THEN c = c - 255
-    audioBuffer(bufi) = c
-NEXT a
-IF (EOF(2) = 0) AND (bufi < 8000) THEN GOTO 2
-anal
-IF EOF(2) = 0 THEN GOTO 2
-
-CLOSE #2
-CLOSE #1
-
-SYSTEM
-
-SUB anal
-    ' Draw a vertical line to represent the buffer data
-    LINE (1, 170)-(200, 430), 0, BF
-
-    FOR a = 1 TO bufi - (avv - 1)
-        ' Draw horizontal lines at key points
-        LINE (100, 170)-(100, 430), 13
-        LINE (old2 - a + 100, 170)-(old2 - a + 100, 430), 11
-        LINE (0, 300)-(200, 300), 13
-
-        ' Plot the buffer data points
-        FOR b = 0 TO 200
-            PSET (b, audioBuffer(b + a - 101) + 300), 0
-            PSET (b, audioBuffer(b + a - 100) + 300), 14
-        NEXT b
-
-        LINE (old2 - a + 100, 170)-(old2 - a + 100, 430), 0
-
-        ' Calculate the average value of the buffer segment
-        c = 0
-        FOR b = a TO a + (avv - 1)
-            c = c + audioBuffer(b)
-        NEXT b
-        c = c / (avv / 2)
-
-        ' Determine if we are in a high or low state
-        IF c > oc THEN
-            IF li = -1 THEN
-                li = 1
-                pfo a + ((avv - 1) / 2 - 1), 1, oc
-                GOTO 3
-            END IF
-        END IF
-
-        IF c < oc THEN
-            IF li = 1 THEN
-                li = -1
-                pfo a + ((avv - 1) / 2 - 1), 2, oc
-                GOTO 3
-            END IF
-        END IF
-
-    3
-        ' Update the current average value
-        oc = c
-    NEXT a
-
-    ' Shift the buffer data to the left
-    FOR a = bufi - (avv - 2) TO bufi
-        audioBuffer(a - (bufi - (avv - 2)) + 1) = audioBuffer(a)
-    NEXT a
-
-    ' Update the starting index of the buffer
-    old2 = old2 - (bufi - (avv - 2)) + 1
-    bufi = avv - 1
-
-END SUB
-
-SUB bysf (a$, d)
-    ' Draw a horizontal line to represent the byte data
-    LINE (201, 170)-(639, 430), 1, B
-
-    IF d = 10 THEN px = 0: a$ = "": GOTO 5
-
-    px = px + 1
-    IF px > 53 THEN
-        px = 1
-    5
-    DIM tempr(1 TO 32000)
-    GET (201, 186)-(639, 430), tempr(1)
-    PUT (201, 170), tempr(1), PSET
-    LINE (201, 414)-(639, 430), 0, BF
-    END IF
-
-    ' Print the byte data to the screen
-    LOCATE 26, 26 + px
-    PRINT a$
-
-    ' Convert the byte value to a character and write it to the output file
-    byte = CHR$(d)
-    PUT #1, , byte
-
-END SUB
-
-SUB byt (a)
-
-    ' Draw a horizontal line to represent the bit data
-    LINE (410, 0)-(639, 169), 1, B
-
-    statl = statl + 1
-    IF statl > 8 THEN
-        statl = 1
-        b = 0
-        IF statisticalArray(1) = 1 THEN b = b + 128
-        IF statisticalArray(2) = 1 THEN b = b + 64
-        IF statisticalArray(3) = 1 THEN b = b + 32
-        IF statisticalArray(4) = 1 THEN b = b + 16
-        IF statisticalArray(5) = 1 THEN b = b + 8
-        IF statisticalArray(6) = 1 THEN b = b + 4
-        IF statisticalArray(7) = 1 THEN b = b + 2
-        IF statisticalArray(8) = 1 THEN b = b + 1
-
-        ' Print the byte value to the screen
-        LOCATE 10, 69
-        PRINT b
-
-        ' Print the hexadecimal representation of the byte value
-        LOCATE 10, 75
-        PRINT HEX$(b)
-
-        ' Print the character representation of the byte value
-        LOCATE 10, 79
-        c$ = CHR$(b)
-
-        ' Replace control characters with a space
-        IF b = 7 OR b = 8 OR b = 10 OR b = 12 OR b = 13 THEN c$ = " "
-
-        PRINT c$
-
-        bysf c$, b
-
-    DIM tempr(1 TO 10000)
-    GET (410, 16)-(639, 169), tempr(1)
-    PUT (410, 0), tempr(1), PSET
-    LINE (410, 153)-(639, 169), 0, BF
-    END IF
-
-    ' Print the bit value to the screen
-    LOCATE 10, 50 + (statl * 2)
-
-    statisticalArray(statl) = a
-
-    PRINT a
-
-END SUB
-
-SUB messa (a$)
-    ' Draw a horizontal line to represent the message data
-    LINE (0, 0)-(409, 169), 1, B
-
-    DIM tempr(1 TO 20000)
-
-    GET (0, 16)-(409, 169), tempr(1)
-
-    PUT (0, 0), tempr(1), PSET
-
-    LINE (0, 153)-(409, 169), 0, BF
-
-    ' Print the message to the screen
-    LOCATE 10, 1
-
-    PRINT a$
-
-END SUB
-
-SUB pfo (f, t, it)
-    IF t = 2 THEN
-        bg = it
-
-        IF wai > 0 THEN wai = wai - 1
-
-        ' Check if we have found data start header
-        IF (bg - sm > 6) AND (beg = 0) THEN
-            beg = 1
-            wai = 10
-            messa "Beginning point found!"
-        END IF
-
-        ' Perform statistical analysis if needed
-        IF (wai = 0) AND (beg = 1) THEN
-            IF statl = 0 THEN messa "Beginning statistical analyze"
-
-            statl = statl + 1
-
-            IF statl > 10 THEN
-                FOR a = 1 TO 10
-                    aver = aver + statisticalArray(a)
-                NEXT a
-
-                aver = aver * 1.5 / 10
-
-                beg = 2
-
-                statl = 1
-
-                messa "Statistical analyze completed!"
-            END IF
-
-            ' Store the current frame index
-            statisticalArray(statl) = f - old2
-        END IF
-
-        ' Decode the bits if we are in the decoding state
-        IF beg = 2 THEN
-            IF f - old2 >= aver THEN
-                beg = 3
-
-                statl = 0
-
-                FOR a = 1 TO 8
-                    statisticalArray(a) = 0
-                NEXT a
-
-                GOTO 4
-            END IF
-        END IF
-
-        ' Decode the bits based on the current state
-        IF beg = 3 THEN
-            IF f - old2 >= aver THEN
-                byt 0
-            ELSE
-                byt 1
-            END IF
-        END IF
-
-    4
-
-        old2 = f
-    ELSE
-        sm = it
-    END IF
-END SUB
-
-SUB start
-
-    ' Set the screen mode to graphics
-    SCREEN 12
-
-    ' Initialize buffer index and other variables
-    bufi = 0
-
-    beg = 0
-
-    statl = 0
-
-    aver = 0
-
-    px = 0
-
-    avv = 7
-
-    li = 1
-
-    oc = -9999
-
-END SUB
\ No newline at end of file
diff --git a/Networking/Digital data over analog audio/INPUT.TXT b/Networking/Digital data over analog audio/INPUT.TXT
new file mode 100644 (file)
index 0000000..9d26a9b
--- /dev/null
@@ -0,0 +1 @@
+This is sample encoded message!\r
diff --git a/Networking/Digital data over analog audio/OUTPUT.TXT b/Networking/Digital data over analog audio/OUTPUT.TXT
new file mode 100644 (file)
index 0000000..9d26a9b
--- /dev/null
@@ -0,0 +1 @@
+This is sample encoded message!\r
diff --git a/Networking/Digital data over analog audio/SOUND.XI b/Networking/Digital data over analog audio/SOUND.XI
new file mode 100644 (file)
index 0000000..60a4fcc
Binary files /dev/null and b/Networking/Digital data over analog audio/SOUND.XI differ
diff --git a/Networking/Digital data over analog audio/aver.bas b/Networking/Digital data over analog audio/aver.bas
new file mode 100644 (file)
index 0000000..950896f
--- /dev/null
@@ -0,0 +1,77 @@
+' Utility that reduces high frequency noise/hiss in audio file.\r
+' In some casus it can help when recovering digital data from sound file.\r
+'\r
+' This program is free software: released under Creative Commons Zero (CC0) license\r
+' by Svjatoslav Agejenko.\r
+' Email: svjatoslav@svjatoslav.eu\r
+' Homepage: http://www.svjatoslav.eu\r
+'\r
+' Changelog:\r
+' 2003.12, Initial version\r
+\r
+\r
+DECLARE SUB start ()\r
+DEFINT A-Y\r
+DIM SHARED avb(1 TO 100)\r
+DIM SHARED byte AS STRING * 1\r
+DIM SHARED po, pod\r
+DIM SHARED file1$, file2$\r
+\r
+start\r
+\r
+INPUT "average factor:", po\r
+INPUT "divide factor:", pod\r
+\r
+OPEN file2$ FOR BINARY AS #1\r
+OPEN file1$ FOR BINARY AS #2\r
+\r
+SCREEN 12\r
+px = 0\r
+1\r
+GET #1, , byte\r
+c = ASC(byte)\r
+IF c > 127 THEN c = c - 255\r
+\r
+FOR a = 1 TO po - 1\r
+avb(a) = avb(a + 1)\r
+NEXT a\r
+avb(po) = c\r
+\r
+b = 0\r
+FOR a = 1 TO po\r
+b = b + avb(a)\r
+NEXT a\r
+\r
+b = b / pod\r
+'LINE (px + 1, 0)-(px + 1, 260), 14\r
+LINE (px, 0)-(px, 260), 0\r
+PSET (px, c + 130), 12\r
+PSET (px, b + 130), 14\r
+px = px + 1\r
+IF px > 639 THEN px = 1\r
+IF b < 0 THEN b = b + 255\r
+IF b > 255 THEN b = 255\r
+byte = CHR$(b)\r
+PUT #2, , byte\r
+'c$ = INPUT$(1)\r
+IF EOF(1) = 0 THEN GOTO 1\r
+\r
+CLOSE #2\r
+CLOSE #1\r
+\r
+SUB start\r
+\r
+IF COMMAND$ = "" THEN END\r
+b$ = COMMAND$\r
+file2$ = b$\r
+file1$ = ""\r
+FOR a = 1 TO LEN(b$)\r
+c$ = RIGHT$(LEFT$(b$, a), 1)\r
+IF c$ = "." OR c$ = " " THEN GOTO 2\r
+file1$ = file1$ + c$\r
+NEXT a\r
+2\r
+file1$ = file1$ + ".awe"\r
+\r
+END SUB\r
+\r
diff --git a/Networking/Digital data over analog audio/index.html b/Networking/Digital data over analog audio/index.html
new file mode 100644 (file)
index 0000000..337dacc
--- /dev/null
@@ -0,0 +1,350 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
+<head>
+<!-- 2025-07-31 to 03:01 -->
+<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
+<meta name="viewport" content="width=device-width, initial-scale=1" />
+<title>Data over analog audio</title>
+<meta name="generator" content="Org Mode" />
+<style>
+  #content { max-width: 60em; margin: auto; }
+  .title  { text-align: center;
+             margin-bottom: .2em; }
+  .subtitle { text-align: center;
+              font-size: medium;
+              font-weight: bold;
+              margin-top:0; }
+  .todo   { font-family: monospace; color: red; }
+  .done   { font-family: monospace; color: green; }
+  .priority { font-family: monospace; color: orange; }
+  .tag    { background-color: #eee; font-family: monospace;
+            padding: 2px; font-size: 80%; font-weight: normal; }
+  .timestamp { color: #bebebe; }
+  .timestamp-kwd { color: #5f9ea0; }
+  .org-right  { margin-left: auto; margin-right: 0px;  text-align: right; }
+  .org-left   { margin-left: 0px;  margin-right: auto; text-align: left; }
+  .org-center { margin-left: auto; margin-right: auto; text-align: center; }
+  .underline { text-decoration: underline; }
+  #postamble p, #preamble p { font-size: 90%; margin: .2em; }
+  p.verse { margin-left: 3%; }
+  pre {
+    border: 1px solid #e6e6e6;
+    border-radius: 3px;
+    background-color: #f2f2f2;
+    padding: 8pt;
+    font-family: monospace;
+    overflow: auto;
+    margin: 1.2em;
+  }
+  pre.src {
+    position: relative;
+    overflow: auto;
+  }
+  pre.src:before {
+    display: none;
+    position: absolute;
+    top: -8px;
+    right: 12px;
+    padding: 3px;
+    color: #555;
+    background-color: #f2f2f299;
+  }
+  pre.src:hover:before { display: inline; margin-top: 14px;}
+  /* Languages per Org manual */
+  pre.src-asymptote:before { content: 'Asymptote'; }
+  pre.src-awk:before { content: 'Awk'; }
+  pre.src-authinfo::before { content: 'Authinfo'; }
+  pre.src-C:before { content: 'C'; }
+  /* pre.src-C++ doesn't work in CSS */
+  pre.src-clojure:before { content: 'Clojure'; }
+  pre.src-css:before { content: 'CSS'; }
+  pre.src-D:before { content: 'D'; }
+  pre.src-ditaa:before { content: 'ditaa'; }
+  pre.src-dot:before { content: 'Graphviz'; }
+  pre.src-calc:before { content: 'Emacs Calc'; }
+  pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
+  pre.src-fortran:before { content: 'Fortran'; }
+  pre.src-gnuplot:before { content: 'gnuplot'; }
+  pre.src-haskell:before { content: 'Haskell'; }
+  pre.src-hledger:before { content: 'hledger'; }
+  pre.src-java:before { content: 'Java'; }
+  pre.src-js:before { content: 'Javascript'; }
+  pre.src-latex:before { content: 'LaTeX'; }
+  pre.src-ledger:before { content: 'Ledger'; }
+  pre.src-lisp:before { content: 'Lisp'; }
+  pre.src-lilypond:before { content: 'Lilypond'; }
+  pre.src-lua:before { content: 'Lua'; }
+  pre.src-matlab:before { content: 'MATLAB'; }
+  pre.src-mscgen:before { content: 'Mscgen'; }
+  pre.src-ocaml:before { content: 'Objective Caml'; }
+  pre.src-octave:before { content: 'Octave'; }
+  pre.src-org:before { content: 'Org mode'; }
+  pre.src-oz:before { content: 'OZ'; }
+  pre.src-plantuml:before { content: 'Plantuml'; }
+  pre.src-processing:before { content: 'Processing.js'; }
+  pre.src-python:before { content: 'Python'; }
+  pre.src-R:before { content: 'R'; }
+  pre.src-ruby:before { content: 'Ruby'; }
+  pre.src-sass:before { content: 'Sass'; }
+  pre.src-scheme:before { content: 'Scheme'; }
+  pre.src-screen:before { content: 'Gnu Screen'; }
+  pre.src-sed:before { content: 'Sed'; }
+  pre.src-sh:before { content: 'shell'; }
+  pre.src-sql:before { content: 'SQL'; }
+  pre.src-sqlite:before { content: 'SQLite'; }
+  /* additional languages in org.el's org-babel-load-languages alist */
+  pre.src-forth:before { content: 'Forth'; }
+  pre.src-io:before { content: 'IO'; }
+  pre.src-J:before { content: 'J'; }
+  pre.src-makefile:before { content: 'Makefile'; }
+  pre.src-maxima:before { content: 'Maxima'; }
+  pre.src-perl:before { content: 'Perl'; }
+  pre.src-picolisp:before { content: 'Pico Lisp'; }
+  pre.src-scala:before { content: 'Scala'; }
+  pre.src-shell:before { content: 'Shell Script'; }
+  pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
+  /* additional language identifiers per "defun org-babel-execute"
+       in ob-*.el */
+  pre.src-cpp:before  { content: 'C++'; }
+  pre.src-abc:before  { content: 'ABC'; }
+  pre.src-coq:before  { content: 'Coq'; }
+  pre.src-groovy:before  { content: 'Groovy'; }
+  /* additional language identifiers from org-babel-shell-names in
+     ob-shell.el: ob-shell is the only babel language using a lambda to put
+     the execution function name together. */
+  pre.src-bash:before  { content: 'bash'; }
+  pre.src-csh:before  { content: 'csh'; }
+  pre.src-ash:before  { content: 'ash'; }
+  pre.src-dash:before  { content: 'dash'; }
+  pre.src-ksh:before  { content: 'ksh'; }
+  pre.src-mksh:before  { content: 'mksh'; }
+  pre.src-posh:before  { content: 'posh'; }
+  /* Additional Emacs modes also supported by the LaTeX listings package */
+  pre.src-ada:before { content: 'Ada'; }
+  pre.src-asm:before { content: 'Assembler'; }
+  pre.src-caml:before { content: 'Caml'; }
+  pre.src-delphi:before { content: 'Delphi'; }
+  pre.src-html:before { content: 'HTML'; }
+  pre.src-idl:before { content: 'IDL'; }
+  pre.src-mercury:before { content: 'Mercury'; }
+  pre.src-metapost:before { content: 'MetaPost'; }
+  pre.src-modula-2:before { content: 'Modula-2'; }
+  pre.src-pascal:before { content: 'Pascal'; }
+  pre.src-ps:before { content: 'PostScript'; }
+  pre.src-prolog:before { content: 'Prolog'; }
+  pre.src-simula:before { content: 'Simula'; }
+  pre.src-tcl:before { content: 'tcl'; }
+  pre.src-tex:before { content: 'TeX'; }
+  pre.src-plain-tex:before { content: 'Plain TeX'; }
+  pre.src-verilog:before { content: 'Verilog'; }
+  pre.src-vhdl:before { content: 'VHDL'; }
+  pre.src-xml:before { content: 'XML'; }
+  pre.src-nxml:before { content: 'XML'; }
+  /* add a generic configuration mode; LaTeX export needs an additional
+     (add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
+  pre.src-conf:before { content: 'Configuration File'; }
+
+  table { border-collapse:collapse; }
+  caption.t-above { caption-side: top; }
+  caption.t-bottom { caption-side: bottom; }
+  td, th { vertical-align:top;  }
+  th.org-right  { text-align: center;  }
+  th.org-left   { text-align: center;   }
+  th.org-center { text-align: center; }
+  td.org-right  { text-align: right;  }
+  td.org-left   { text-align: left;   }
+  td.org-center { text-align: center; }
+  dt { font-weight: bold; }
+  .footpara { display: inline; }
+  .footdef  { margin-bottom: 1em; }
+  .figure { padding: 1em; }
+  .figure p { text-align: center; }
+  .equation-container {
+    display: table;
+    text-align: center;
+    width: 100%;
+  }
+  .equation {
+    vertical-align: middle;
+  }
+  .equation-label {
+    display: table-cell;
+    text-align: right;
+    vertical-align: middle;
+  }
+  .inlinetask {
+    padding: 10px;
+    border: 2px solid gray;
+    margin: 10px;
+    background: #ffffcc;
+  }
+  #org-div-home-and-up
+   { text-align: right; font-size: 70%; white-space: nowrap; }
+  textarea { overflow-x: auto; }
+  .linenr { font-size: smaller }
+  .code-highlighted { background-color: #ffff00; }
+  .org-info-js_info-navigation { border-style: none; }
+  #org-info-js_console-label
+    { font-size: 10px; font-weight: bold; white-space: nowrap; }
+  .org-info-js_search-highlight
+    { background-color: #ffff00; color: #000000; font-weight: bold; }
+  .org-svg { }
+</style>
+<style type="text/css">
+               body {
+                 max-width: 35cm !important;
+               }
+               #content {
+                 max-width: 80em !important;
+                 width: 90%;
+               }
+               </style>
+<link rel="stylesheet" type="text/css" href="https://thomasf.github.io/solarized-css/solarized-dark.min.css" />
+</head>
+<body>
+<div id="content" class="content">
+<h1 class="title">Data over analog audio</h1>
+<div id="table-of-contents" role="doc-toc">
+<h2>Table of Contents</h2>
+<div id="text-table-of-contents" role="doc-toc">
+<ul>
+<li><a href="#org84c4b8c">1. msg2xi: Text to Sound Encoder</a></li>
+<li><a href="#org0fbcf65">2. xi2msg: Sound to Text Decoder</a></li>
+<li><a href="#org6b92b85">3. aver</a></li>
+</ul>
+</div>
+</div>
+
+<div id="outline-container-org84c4b8c" class="outline-2">
+<h2 id="org84c4b8c"><span class="section-number-2">1.</span> msg2xi: Text to Sound Encoder</h2>
+<div class="outline-text-2" id="text-1">
+<p>
+<b>msg2xi</b> is a utility designed to encode arbitrary text messages into an
+8-bit sound file. This program allows users to convert digital data
+into analog audio signals, making it possible to transmit text
+messages over traditional analog mediums such as telephone lines or
+magnetic tapes.
+</p>
+
+<p>
+<b>How It Works:</b> The program reads text from an input file, processing
+it byte by byte. Each byte is broken down into its constituent bits.
+For each bit, a sine wave is generated. Different waveforms represent
+'1's and '0's (implementing frequency modulation). The generated
+waveforms are combined into a single audio file, encoding the original
+text message. A special pure sinewave header tone is added to the
+beginning of the audio file to mark the start of the encoded message,
+facilitating synchronization during decoding.
+</p>
+
+<p>
+Download source code: <a href="msg2xi.bas">Source code</a>
+</p>
+</div>
+</div>
+
+<div id="outline-container-org0fbcf65" class="outline-2">
+<h2 id="org0fbcf65"><span class="section-number-2">2.</span> xi2msg: Sound to Text Decoder</h2>
+<div class="outline-text-2" id="text-2">
+<p>
+The <b>xi2msg</b> utility is designed to decode digital information from an
+audio file, specifically an 8-bit sound file. This program is part of
+a suite of utilities that enable the transmission of digital data over
+analog audio mediums, such as telephone lines or magnetic tapes.
+</p>
+
+<p>
+The <b>xi2msg</b> utility works by analyzing the audio file to locate peaks
+between waveforms. It calculates the distance between these peaks to
+determine whether each segment represents a '0' or a '1' bit. This
+process involves several key steps:
+</p>
+
+<dl class="org-dl">
+<dt>Header Detection</dt><dd>The program starts by searching for a special
+header tone in the audio file. This header tone marks the beginning
+of the encoded message and helps synchronize the decoding process.</dd>
+
+<dt>Peak Analysis</dt><dd>The utility measures the distance between peaks in
+the audio waveform. Long distances between peaks are interpreted as
+'0' bits, while short distances are interpreted as '1' bits.</dd>
+
+<dt>Bit Assembly</dt><dd>The detected bits are sequentially assembled into
+bytes. Each byte is then converted into its corresponding character.</dd>
+
+<dt>Output</dt><dd>The decoded message is displayed on the screen and written
+to an output file, making it accessible for further use or analysis.</dd>
+</dl>
+
+<p>
+The program relies on frequency modulation for decoding data, which
+was chosen for its resilience to amplitude distortions that can occur
+during analog transmission. This makes the utility particularly
+effective for decoding messages recorded on cassette tapes or
+transmitted over telephone lines.
+</p>
+
+
+<div id="orgaea1c2e" class="figure">
+<p><img src="screenshot.png" alt="screenshot.png" />
+</p>
+</div>
+
+
+<p>
+Download source code: <a href="xi2msg.bas">Source code</a>
+</p>
+</div>
+</div>
+
+<div id="outline-container-org6b92b85" class="outline-2">
+<h2 id="org6b92b85"><span class="section-number-2">3.</span> aver</h2>
+<div class="outline-text-2" id="text-3">
+<p>
+The <b>aver.bas</b> utility is designed to reduce noise in digitized audio
+files by smoothing out noise peaks, which is particularly beneficial
+for audio files transmitted over analog mediums like telephone lines
+or magnetic tapes, where noise interference is common.
+</p>
+
+<p>
+The program starts by asking the user for two critical factors: the
+averaging factor and the divide factor. These parameters determine the
+intensity of the noise reduction applied.
+</p>
+
+<p>
+For each byte read from the input file, the program stores the last N
+values (where N is the averaging factor). These values are averaged,
+and the result is scaled by the divide factor. This averaging
+technique helps to smooth out noise spikes in the audio data.
+</p>
+
+<p>
+The program provides a graphical representation of the original and
+smoothed audio. This allows for visual comparison of the original and
+processed signals on the screen. The smoothed audio data is written to
+an output file, which should have reduced noise compared to the input
+file.
+</p>
+
+<p>
+The program uses command-line input to determine the filenames for
+input and output, defaulting to appending .awe to the input filename
+for the output file.
+</p>
+
+<p>
+Download source code: <a href="aver.bas">Source code</a>
+</p>
+</div>
+</div>
+</div>
+<div id="postamble" class="status">
+<p class="date">Created: 2025-07-31 to 03:01</p>
+<p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
+</div>
+</body>
+</html>
diff --git a/Networking/Digital data over analog audio/index.org b/Networking/Digital data over analog audio/index.org
new file mode 100755 (executable)
index 0000000..17d1b39
--- /dev/null
@@ -0,0 +1,92 @@
+#+TITLE: Data over analog audio\r
+#+LANGUAGE: en\r
+#+LATEX_HEADER: \usepackage[margin=1.0in]{geometry}\r
+#+LATEX_HEADER: \usepackage{parskip}\r
+#+LATEX_HEADER: \usepackage[none]{hyphenat}\r
+\r
+#+OPTIONS: H:20 num:20\r
+#+OPTIONS: author:nil\r
+\r
+* msg2xi: Text to Sound Encoder\r
+\r
+*msg2xi* is a utility designed to encode arbitrary text messages into an\r
+8-bit sound file. This program allows users to convert digital data\r
+into analog audio signals, making it possible to transmit text\r
+messages over traditional analog mediums such as telephone lines or\r
+magnetic tapes.\r
+\r
+*How It Works:* The program reads text from an input file, processing\r
+it byte by byte. Each byte is broken down into its constituent bits.\r
+For each bit, a sine wave is generated. Different waveforms represent\r
+'1's and '0's (implementing frequency modulation). The generated\r
+waveforms are combined into a single audio file, encoding the original\r
+text message. A special pure sinewave header tone is added to the\r
+beginning of the audio file to mark the start of the encoded message,\r
+facilitating synchronization during decoding.\r
+\r
+Download source code: [[file:msg2xi.bas][Source code]]\r
+\r
+* xi2msg: Sound to Text Decoder\r
+\r
+The *xi2msg* utility is designed to decode digital information from an\r
+audio file, specifically an 8-bit sound file. This program is part of\r
+a suite of utilities that enable the transmission of digital data over\r
+analog audio mediums, such as telephone lines or magnetic tapes.\r
+\r
+The *xi2msg* utility works by analyzing the audio file to locate peaks\r
+between waveforms. It calculates the distance between these peaks to\r
+determine whether each segment represents a '0' or a '1' bit. This\r
+process involves several key steps:\r
+\r
+- Header Detection :: The program starts by searching for a special\r
+  header tone in the audio file. This header tone marks the beginning\r
+  of the encoded message and helps synchronize the decoding process.\r
+\r
+- Peak Analysis :: The utility measures the distance between peaks in\r
+  the audio waveform. Long distances between peaks are interpreted as\r
+  '0' bits, while short distances are interpreted as '1' bits.\r
+\r
+- Bit Assembly :: The detected bits are sequentially assembled into\r
+  bytes. Each byte is then converted into its corresponding character.\r
+\r
+- Output :: The decoded message is displayed on the screen and written\r
+  to an output file, making it accessible for further use or analysis.\r
+\r
+The program relies on frequency modulation for decoding data, which\r
+was chosen for its resilience to amplitude distortions that can occur\r
+during analog transmission. This makes the utility particularly\r
+effective for decoding messages recorded on cassette tapes or\r
+transmitted over telephone lines.\r
+\r
+[[file:screenshot.png]]\r
+\r
+\r
+Download source code: [[file:xi2msg.bas][Source code]]\r
+\r
+* aver\r
+\r
+The *aver.bas* utility is designed to reduce noise in digitized audio\r
+files by smoothing out noise peaks, which is particularly beneficial\r
+for audio files transmitted over analog mediums like telephone lines\r
+or magnetic tapes, where noise interference is common.\r
+\r
+The program starts by asking the user for two critical factors: the\r
+averaging factor and the divide factor. These parameters determine the\r
+intensity of the noise reduction applied.\r
+\r
+For each byte read from the input file, the program stores the last N\r
+values (where N is the averaging factor). These values are averaged,\r
+and the result is scaled by the divide factor. This averaging\r
+technique helps to smooth out noise spikes in the audio data.\r
+\r
+The program provides a graphical representation of the original and\r
+smoothed audio. This allows for visual comparison of the original and\r
+processed signals on the screen. The smoothed audio data is written to\r
+an output file, which should have reduced noise compared to the input\r
+file.\r
+\r
+The program uses command-line input to determine the filenames for\r
+input and output, defaulting to appending .awe to the input filename\r
+for the output file.\r
+\r
+Download source code: [[file:aver.bas][Source code]]\r
diff --git a/Networking/Digital data over analog audio/msg2xi.bas b/Networking/Digital data over analog audio/msg2xi.bas
new file mode 100644 (file)
index 0000000..660304e
--- /dev/null
@@ -0,0 +1,164 @@
+' Utility that encodes arbitrary text message into 8 bit sound file.
+' This audio can be now transferred over telephone line or recorded to magnetic tape.
+'
+' This program is free software: released under Creative Commons Zero (CC0) license
+' by Svjatoslav Agejenko.
+' Email: svjatoslav@svjatoslav.eu
+' Homepage: http://www.svjatoslav.eu
+'
+' Changelog:
+' 2001, Initial version
+' 2024.09, Improved program readability
+
+DECLARE SUB StartProgram ()
+DECLARE SUB AddIWave ()
+DECLARE SUB AddOWave ()
+DECLARE SUB ByteToSound (soundByte AS SINGLE)
+
+DIM SHARED iwaveArray(1 TO 20)
+DIM SHARED owaveArray(1 TO 41)
+DIM SHARED iwaveData$
+DIM SHARED owaveData$
+DIM SHARED inputFile$
+DIM SHARED outputFile$
+DIM SHARED byte AS STRING * 1
+
+StartProgram
+
+inputFile$ = "input.txt"
+outputFile$ = "sound.xi"
+
+' Open the input and output files for binary access
+OPEN inputFile$ FOR BINARY AS #2
+OPEN outputFile$ FOR BINARY AS #1
+
+' Add data start header/marker to the audio file
+FOR a = 1 TO 50
+    AddIWave
+NEXT a
+AddOWave
+
+' Read each byte from the input file and convert it to sound
+2
+GET #2, , byte
+ByteToSound ASC(byte)
+IF EOF(2) = 0 THEN GOTO 2
+
+' Close the files after processing
+CLOSE #2
+CLOSE #1
+
+PRINT "Encoding of message into sound completed"
+
+SUB ByteToSound (soundByte AS SINGLE)
+' Convert a byte to 8-bit wave sound data
+    soundByte = soundByte + 1
+
+    ' Check if the byte value is greater than 128.
+    ' If yes, set most significant bit to 1, otherwise 0
+    IF soundByte > 128 THEN
+        soundByte = soundByte - 128
+        AddIWave
+    ELSE
+        AddOWave
+    END IF
+
+    ' Check if the byte value is greater than 64 to set next bit
+    IF soundByte > 64 THEN
+        soundByte = soundByte - 64
+        AddIWave
+    ELSE
+        AddOWave
+    END IF
+
+    IF soundByte > 32 THEN
+        soundByte = soundByte - 32
+        AddIWave
+    ELSE
+        AddOWave
+    END IF
+
+    IF soundByte > 16 THEN
+        soundByte = soundByte - 16
+        AddIWave
+    ELSE
+        AddOWave
+    END IF
+
+    IF soundByte > 8 THEN
+        soundByte = soundByte - 8
+        AddIWave
+    ELSE
+        AddOWave
+    END IF
+
+    IF soundByte > 4 THEN
+        soundByte = soundByte - 4
+        AddIWave
+    ELSE
+        AddOWave
+    END IF
+
+    IF soundByte > 2 THEN
+        soundByte = soundByte - 2
+        AddIWave
+    ELSE
+        AddOWave
+    END IF
+
+    ' Check if the byte value is greater than 1
+    IF soundByte > 1 THEN
+        AddIWave
+    ELSE
+        AddOWave
+    END IF
+END SUB
+
+SUB AddIWave
+' Write iwaveData to the output file
+    PUT #1, , iwaveData$
+END SUB
+
+SUB AddOWave
+' Write owaveData to the output file
+    PUT #1, , owaveData$
+END SUB
+
+SUB StartProgram
+' Initialize wave data arrays
+
+    pi = 3.141592653999996#
+
+    ' Generate sine wave values to represent 1
+    b = 0
+    FOR a = pi / 2 TO 2.5 * pi STEP (2 * pi / 20)
+        b = b + 1
+        iwaveArray(b) = SIN(a) * 100
+        IF iwaveArray(b) < 0 THEN
+            iwaveArray(b) = iwaveArray(b) + 255
+        END IF
+    NEXT a
+
+    ' Generate sine wave values to represent 0
+    b = 0
+    FOR a = pi / 2 TO 2.5 * pi STEP (2 * pi / 40)
+        b = b + 1
+        owaveArray(b) = SIN(a) * 100
+        IF owaveArray(b) < 0 THEN
+            owaveArray(b) = owaveArray(b) + 255
+        END IF
+    NEXT a
+
+' Convert wave arrays to string data
+
+    ' Convert iwaveArray to string because strings are more computationally efficient to write into output file.
+    FOR a = 1 TO 20
+        iwaveData$ = iwaveData$ + CHR$(iwaveArray(a))
+    NEXT a
+
+    ' Convert owaveArray to string
+    FOR a = 1 TO 40
+        owaveData$ = owaveData$ + CHR$(owaveArray(a))
+    NEXT a
+
+END SUB
diff --git a/Networking/Digital data over analog audio/screenshot.png b/Networking/Digital data over analog audio/screenshot.png
new file mode 100755 (executable)
index 0000000..87a3a0a
Binary files /dev/null and b/Networking/Digital data over analog audio/screenshot.png differ
diff --git a/Networking/Digital data over analog audio/xi2msg.bas b/Networking/Digital data over analog audio/xi2msg.bas
new file mode 100644 (file)
index 0000000..bc97e9f
--- /dev/null
@@ -0,0 +1,333 @@
+' Utility that decodes text message from 8 bit audio recording.
+'
+' This program is free software: released under Creative Commons Zero (CC0) license
+' by Svjatoslav Agejenko.
+' Email: svjatoslav@svjatoslav.eu
+' Homepage: http://www.svjatoslav.eu
+'
+' Changelog:
+' 2001, Initial version
+' 2024 - 2025, Improved program readability
+'
+' Data is encoded in the audio by using frequency modulation.
+' When decoding data, program locates peaks between waveforms.
+' Then it calculates distance between peaks.
+' Long between peak distance is interpreted as 0 bit, short distance is 1 bit.
+' Bits 0 and 1 are then sequentially added into bytes and complete
+' message is decoded and shown on the screen. In addition, message is written out to
+' the file.
+'
+' Frequency modulation was chosen over amplitude modulation because
+' my tests with cassette tape recorder showed that distortions affect mostly
+' signal amplitude, but do not affect signal frequency that much.
+'
+' Data carrying audio is preceded with special header tone. Program detects header tone
+' and uses it to calculate baseline signal frequency that it will use later to decode bits.
+' Also header allows to mark precise data starting point.
+
+DEFINT A-Y
+DECLARE SUB bysf (a$, d)
+DECLARE SUB messa (a$)
+DECLARE SUB pfo (f, t, it)
+DECLARE SUB anal ()
+DECLARE SUB start ()
+DECLARE SUB iadd ()
+DECLARE SUB oadd ()
+DECLARE SUB byt (a)
+
+DIM SHARED file1$
+DIM SHARED file2$
+
+' Contains the actual audio waveform samples
+DIM SHARED audioBuffer(-100 TO 10000)
+DIM SHARED bus AS STRING * 1000
+DIM SHARED bufi
+DIM SHARED bg
+DIM SHARED sm
+DIM SHARED beg
+DIM SHARED wai
+DIM SHARED old2
+
+' Statistical Analysis Array (contains measured peak distances)
+DIM SHARED statisticalArray(1 TO 10)
+DIM SHARED statl
+DIM SHARED aver
+DIM SHARED byte AS STRING * 1
+DIM SHARED avv
+
+DIM SHARED li
+DIM SHARED oc
+DIM SHARED px
+
+start
+messa "Searching for beginning..."
+
+OPEN "output.txt" FOR BINARY AS #1
+OPEN "sound.xi" FOR BINARY AS #2
+SEEK #2, 360
+
+2
+GET #2, , bus
+FOR a = 1 TO 1000
+    b$ = RIGHT$(LEFT$(bus, a), 1)
+    bufi = bufi + 1
+    c = ASC(b$)
+    IF c > 127 THEN c = c - 255
+    audioBuffer(bufi) = c
+NEXT a
+IF (EOF(2) = 0) AND (bufi < 8000) THEN GOTO 2
+anal
+IF EOF(2) = 0 THEN GOTO 2
+
+CLOSE #2
+CLOSE #1
+
+SYSTEM
+
+SUB anal
+    ' Draw a vertical line to represent the buffer data
+    LINE (1, 170)-(200, 430), 0, BF
+
+    FOR a = 1 TO bufi - (avv - 1)
+        ' Draw horizontal lines at key points
+        LINE (100, 170)-(100, 430), 13
+        LINE (old2 - a + 100, 170)-(old2 - a + 100, 430), 11
+        LINE (0, 300)-(200, 300), 13
+
+        ' Plot the buffer data points
+        FOR b = 0 TO 200
+            PSET (b, audioBuffer(b + a - 101) + 300), 0
+            PSET (b, audioBuffer(b + a - 100) + 300), 14
+        NEXT b
+
+        LINE (old2 - a + 100, 170)-(old2 - a + 100, 430), 0
+
+        ' Calculate the average value of the buffer segment
+        c = 0
+        FOR b = a TO a + (avv - 1)
+            c = c + audioBuffer(b)
+        NEXT b
+        c = c / (avv / 2)
+
+        ' Determine if we are in a high or low state
+        IF c > oc THEN
+            IF li = -1 THEN
+                li = 1
+                pfo a + ((avv - 1) / 2 - 1), 1, oc
+                GOTO 3
+            END IF
+        END IF
+
+        IF c < oc THEN
+            IF li = 1 THEN
+                li = -1
+                pfo a + ((avv - 1) / 2 - 1), 2, oc
+                GOTO 3
+            END IF
+        END IF
+
+    3
+        ' Update the current average value
+        oc = c
+    NEXT a
+
+    ' Shift the buffer data to the left
+    FOR a = bufi - (avv - 2) TO bufi
+        audioBuffer(a - (bufi - (avv - 2)) + 1) = audioBuffer(a)
+    NEXT a
+
+    ' Update the starting index of the buffer
+    old2 = old2 - (bufi - (avv - 2)) + 1
+    bufi = avv - 1
+
+END SUB
+
+SUB bysf (a$, d)
+    ' Draw a horizontal line to represent the byte data
+    LINE (201, 170)-(639, 430), 1, B
+
+    IF d = 10 THEN px = 0: a$ = "": GOTO 5
+
+    px = px + 1
+    IF px > 53 THEN
+        px = 1
+    5
+    DIM tempr(1 TO 32000)
+    GET (201, 186)-(639, 430), tempr(1)
+    PUT (201, 170), tempr(1), PSET
+    LINE (201, 414)-(639, 430), 0, BF
+    END IF
+
+    ' Print the byte data to the screen
+    LOCATE 26, 26 + px
+    PRINT a$
+
+    ' Convert the byte value to a character and write it to the output file
+    byte = CHR$(d)
+    PUT #1, , byte
+
+END SUB
+
+SUB byt (a)
+
+    ' Draw a horizontal line to represent the bit data
+    LINE (410, 0)-(639, 169), 1, B
+
+    statl = statl + 1
+    IF statl > 8 THEN
+        statl = 1
+        b = 0
+        IF statisticalArray(1) = 1 THEN b = b + 128
+        IF statisticalArray(2) = 1 THEN b = b + 64
+        IF statisticalArray(3) = 1 THEN b = b + 32
+        IF statisticalArray(4) = 1 THEN b = b + 16
+        IF statisticalArray(5) = 1 THEN b = b + 8
+        IF statisticalArray(6) = 1 THEN b = b + 4
+        IF statisticalArray(7) = 1 THEN b = b + 2
+        IF statisticalArray(8) = 1 THEN b = b + 1
+
+        ' Print the byte value to the screen
+        LOCATE 10, 69
+        PRINT b
+
+        ' Print the hexadecimal representation of the byte value
+        LOCATE 10, 75
+        PRINT HEX$(b)
+
+        ' Print the character representation of the byte value
+        LOCATE 10, 79
+        c$ = CHR$(b)
+
+        ' Replace control characters with a space
+        IF b = 7 OR b = 8 OR b = 10 OR b = 12 OR b = 13 THEN c$ = " "
+
+        PRINT c$
+
+        bysf c$, b
+
+    DIM tempr(1 TO 10000)
+    GET (410, 16)-(639, 169), tempr(1)
+    PUT (410, 0), tempr(1), PSET
+    LINE (410, 153)-(639, 169), 0, BF
+    END IF
+
+    ' Print the bit value to the screen
+    LOCATE 10, 50 + (statl * 2)
+
+    statisticalArray(statl) = a
+
+    PRINT a
+
+END SUB
+
+SUB messa (a$)
+    ' Draw a horizontal line to represent the message data
+    LINE (0, 0)-(409, 169), 1, B
+
+    DIM tempr(1 TO 20000)
+
+    GET (0, 16)-(409, 169), tempr(1)
+
+    PUT (0, 0), tempr(1), PSET
+
+    LINE (0, 153)-(409, 169), 0, BF
+
+    ' Print the message to the screen
+    LOCATE 10, 1
+
+    PRINT a$
+
+END SUB
+
+SUB pfo (f, t, it)
+    IF t = 2 THEN
+        bg = it
+
+        IF wai > 0 THEN wai = wai - 1
+
+        ' Check if we have found data start header
+        IF (bg - sm > 6) AND (beg = 0) THEN
+            beg = 1
+            wai = 10
+            messa "Beginning point found!"
+        END IF
+
+        ' Perform statistical analysis if needed
+        IF (wai = 0) AND (beg = 1) THEN
+            IF statl = 0 THEN messa "Beginning statistical analyze"
+
+            statl = statl + 1
+
+            IF statl > 10 THEN
+                FOR a = 1 TO 10
+                    aver = aver + statisticalArray(a)
+                NEXT a
+
+                aver = aver * 1.5 / 10
+
+                beg = 2
+
+                statl = 1
+
+                messa "Statistical analyze completed!"
+            END IF
+
+            ' Store the current frame index
+            statisticalArray(statl) = f - old2
+        END IF
+
+        ' Decode the bits if we are in the decoding state
+        IF beg = 2 THEN
+            IF f - old2 >= aver THEN
+                beg = 3
+
+                statl = 0
+
+                FOR a = 1 TO 8
+                    statisticalArray(a) = 0
+                NEXT a
+
+                GOTO 4
+            END IF
+        END IF
+
+        ' Decode the bits based on the current state
+        IF beg = 3 THEN
+            IF f - old2 >= aver THEN
+                byt 0
+            ELSE
+                byt 1
+            END IF
+        END IF
+
+    4
+
+        old2 = f
+    ELSE
+        sm = it
+    END IF
+END SUB
+
+SUB start
+
+    ' Set the screen mode to graphics
+    SCREEN 12
+
+    ' Initialize buffer index and other variables
+    bufi = 0
+
+    beg = 0
+
+    statl = 0
+
+    aver = 0
+
+    px = 0
+
+    avv = 7
+
+    li = 1
+
+    oc = -9999
+
+END SUB
\ No newline at end of file
index cdb8798..acd87ee 100755 (executable)
@@ -42,6 +42,7 @@ export_org_to_html "Math/Truth table"
 
 export_org_to_html "Miscellaneous/Mouse driver"
 
+export_org_to_html "Networking/Digital data over analog audio"
 
 # Upload project homepage to the server.
 rsync -avz --delete  -e 'ssh -p 10006' ./ \
index 9666ec6..f7eb122 100644 (file)
--- a/index.org
+++ b/index.org
@@ -1,5 +1,5 @@
 #+SETUPFILE: ~/.emacs.d/org-styles/html/darksun.theme
-#+TITLE:  BASIC applications collection
+#+TITLE: BASIC applications collection
 #+LANGUAGE: en
 #+LATEX_HEADER: \usepackage[margin=1.0in]{geometry}
 #+LATEX_HEADER: \usepackage{parskip}
@@ -381,7 +381,7 @@ scene is rendered frame by frame.
 </div>
 #+end_export
 
-[[file:Math/Game%20of%20life%20in%203D.bas][Source code]]
+Download source code: [[file:Math/Game%20of%20life%20in%203D.bas][Source code]]
 
 ** Game of life studio
 
@@ -772,9 +772,7 @@ message.
 
 Download source code: [[file:Miscellaneous/Password%20lock/passw.bas][passw.bas]]
 
-
 * Networking
-
 ** LPT port pin control
 
 This QBasic program is designed to control the voltage on individual
@@ -796,6 +794,17 @@ The program uses bit manipulation to control individual pins.
 
 Download source code: [[file:Networking/LPT%20pin%20control.bas][LPT pin control.bas]]
 
+** Data over analog audio CODEC
+
+Utilities to encode digital data to sound file and back.
+
+#+attr_html: :class responsive-img
+#+attr_latex: :width 1000px
+[[file:Networking/Digital%20data%20over%20analog%20audio/index.html][file:Networking/Digital%20data%20over%20analog%20audio/screenshot.png]]
+
+[[file:Networking/Digital%20data%20over%20analog%20audio/index.html][Read more]]
+
+
 ** Morse
 
 This QBasic program allows users to input text and hear it played back