Using AI to improve code readability
authorSvjatoslav Agejenko <svjatoslav@svjatoslav.eu>
Sat, 26 Oct 2024 07:10:18 +0000 (10:10 +0300)
committerSvjatoslav Agejenko <svjatoslav@svjatoslav.eu>
Sat, 26 Oct 2024 07:10:18 +0000 (10:10 +0300)
Graphics/Animations/matrix.bas

index c44486c..565bbf1 100755 (executable)
@@ -1,5 +1,13 @@
-' Svjatoslav Agejenko\r
-' year: 2002\r
+' Program renders animation/screensaver.\r
+' It is inspired by The Matrix movie.\r
+'\r
+' By Svjatoslav Agejenko.\r
+' Email: svjatoslav@svjatoslav.eu\r
+' Homepage: http://www.svjatoslav.eu\r
+'\r
+' Changelog:\r
+' 2002, Initial version\r
+' 2024, Improved program readability using AI\r
 \r
 DECLARE SUB adus (a%)\r
 DECLARE SUB pt (x%, y%)\r
@@ -24,297 +32,458 @@ usm = 8
 \r
 start\r
 \r
+' Main loop of the program\r
 2\r
 FOR a = 1 TO usm\r
-IF uso(a) = 0 THEN adus a\r
-addn usx(a), usy(a)\r
-usy(a) = usy(a) + 1\r
-IF usy(a) > 13 THEN usy(a) = 0\r
-uso(a) = uso(a) - 1\r
-NEXT a\r
+    ' Check if the usage count is zero\r
+    IF uso(a) = 0 THEN adus a\r
+\r
+    ' Add new position to the current object\r
+    addn usx(a), usy(a)\r
 \r
+    ' Update the y-coordinate of the current object\r
+    usy(a) = usy(a) + 1\r
 \r
+    ' Check if the y-coordinate exceeds the screen height\r
+    IF usy(a) > 13 THEN usy(a) = 0\r
+\r
+    ' Decrease the usage count of the current object\r
+    uso(a) = uso(a) - 1\r
+NEXT a\r
+\r
+' Update the screen\r
 FOR y = 0 TO 13\r
-FOR x = 0 TO 18\r
-a = pat(x, y)\r
-a = a + 1\r
-IF a = 2 THEN pah(x, y) = 2: pt x, y\r
-IF a = 5 THEN pah(x, y) = 3: pt x, y\r
-IF a = 30 THEN pag(x, y) = 0: pt x, y\r
-pat(x, y) = a\r
-NEXT x\r
+    FOR x = 0 TO 18\r
+        ' Get the current pixel value\r
+        a = pat(x, y)\r
+\r
+        ' Increment the pixel value\r
+        a = a + 1\r
+\r
+        ' Check if the pixel value is equal to 2\r
+        IF a = 2 THEN\r
+            pah(x, y) = 2\r
+            pt x, y\r
+\r
+        ' Check if the pixel value is equal to 5\r
+        ELSEIF a = 5 THEN\r
+            pah(x, y) = 3\r
+            pt x, y\r
+\r
+        ' Check if the pixel value is equal to 30\r
+        ELSEIF a = 30 THEN\r
+            pag(x, y) = 0\r
+            pt x, y\r
+        END IF\r
+\r
+        ' Update the pixel value\r
+        pat(x, y) = a\r
+    NEXT x\r
 NEXT y\r
 \r
+' Wait for a short period of time\r
 3\r
 IF ABS(tmr - TIMER) < .1 THEN GOTO 3\r
+\r
+' Update the timer\r
 tmr = TIMER\r
+\r
+' Check if any key is pressed\r
 IF INKEY$ <> "" THEN SYSTEM\r
+\r
+' Go back to the main loop\r
 GOTO 2\r
 \r
 SUB addn (x, y)\r
-pag(x, y) = RND * 8 + 1\r
-pah(x, y) = 1\r
-pat(x, y) = 0\r
-pt x, y\r
+    ' Set a random font for the new pixel\r
+    pag(x, y) = RND * 8 + 1\r
+\r
+    ' Set the palette index for the new pixel\r
+    pah(x, y) = 1\r
 \r
+    ' Initialize the pixel value\r
+    pat(x, y) = 0\r
 \r
+    ' Draw the new pixel on the screen\r
+    pt x, y\r
 END SUB\r
 \r
 SUB adus (a)\r
-usx(a) = RND * 18\r
-usy(a) = RND * 13\r
-uso(a) = RND * 5 + 3\r
+    ' Set random initial positions for the object\r
+    usx(a) = RND * 18\r
+    usy(a) = RND * 13\r
+\r
+    ' Set a random usage count for the object\r
+    uso(a) = RND * 5 + 3\r
 END SUB\r
 \r
 SUB getfnt\r
-FOR a = 1 TO 9\r
-LOCATE 1, 1\r
-PRINT "Loading:" + STR$(a * 10) + "%"\r
-LINE (49, 49)-(83, 83), 0, BF\r
-putsym 50, 50, a\r
-smo 50, 50, 82, 82, 1\r
-GET (50, 50)-(82, 82), font1(1, a)\r
-\r
-LINE (49, 49)-(83, 83), 0, BF\r
-putsym 50, 50, a\r
-smo 50, 50, 82, 82, 2\r
-GET (50, 50)-(82, 82), font2(1, a)\r
-\r
-LINE (49, 49)-(83, 83), 0, BF\r
-putsym 50, 50, a\r
-smo 50, 50, 82, 82, 3\r
-GET (50, 50)-(82, 82), font3(1, a)\r
+    ' Load fonts from the screen\r
+    FOR a = 1 TO 9\r
+        LOCATE 1, 1\r
 \r
-NEXT a\r
-CLS\r
-END SUB\r
+        ' Print the loading progress\r
+        PRINT "Loading: " + STR$(a * 10) + "%"\r
 \r
-SUB pt (x, y)\r
-x1 = x * 32 + 12\r
-y1 = y * 32 + 15\r
-\r
-a = pag(x, y)\r
-b = pah(x, y)\r
-\r
-IF a = 0 THEN\r
-LINE (x1, y1)-(x1 + 32, y1 + 32), 0, BF\r
-ELSE\r
-SELECT CASE b\r
-CASE 1\r
-PUT (x1, y1), font1(1, a), PSET\r
-CASE 2\r
-PUT (x1, y1), font2(1, a), PSET\r
-CASE 3\r
-PUT (x1, y1), font3(1, a), PSET\r
-END SELECT\r
-END IF\r
+        ' Draw a square on the screen\r
+        LINE (49, 49)-(83, 83), 0, BF\r
 \r
-END SUB\r
+        ' Draw a symbol on the screen\r
+        putsym 50, 50, a\r
 \r
-SUB putsym (x, y, a)\r
-SELECT CASE a\r
-CASE 1\r
-LINE (x + 10, y + 5)-(x + 10, y + 20), 14\r
-LINE (x + 5, y + 15)-(x + 20, y + 15), 14\r
-LINE (x + 15, y + 25)-(x + 20, y + 25), 14\r
-LINE (x + 20, y + 25)-(x + 25, y + 20), 14\r
-LINE (x + 25, y + 20)-(x + 25, y + 5), 14\r
-CASE 2\r
-LINE (x + 5, y + 15)-(x + 25, y + 10), 14\r
-LINE (x + 15, y + 5)-(x + 10, y + 25), 14\r
-LINE (x + 25, y + 5)-(x + 20, y + 20), 14\r
-LINE (x + 20, y + 30)-(x + 30, y + 20), 14\r
-CASE 3\r
-LINE (x + 5, y + 5)-(x + 5, y + 25), 14\r
-LINE (x + 5, y + 5)-(x + 25, y + 25), 14\r
-LINE (x + 5, y + 25)-(x + 25, y + 25), 14\r
-LINE (x + 10, y + 10)-(x + 25, y + 5), 14\r
-CASE 4\r
-LINE (x + 10, y + 5)-(x + 20, y + 5), 14\r
-LINE (x + 20, y + 5)-(x + 25, y + 10), 14\r
-LINE (x + 25, y + 20)-(x + 20, y + 25), 14\r
-LINE (x + 20, y + 25)-(x + 10, y + 25), 14\r
-LINE (x + 10, y + 25)-(x + 10, y + 5), 14\r
-LINE (x + 5, y + 15)-(x + 20, y + 15), 14\r
-CASE 5\r
-LINE (x + 5, y + 5)-(x + 10, y + 10), 14\r
-LINE (x + 10, y + 10)-(x + 10, y + 25), 14\r
-LINE (x + 10, y + 25)-(x + 5, y + 30), 14\r
-LINE (x + 10, y + 25)-(x + 15, y + 30), 14\r
-LINE (x + 15, y + 30)-(x + 25, y + 30), 14\r
-LINE (x + 10, y + 20)-(x + 25, y + 20), 14\r
-CASE 6\r
-LINE (x + 5, y + 5)-(x + 10, y + 5), 14\r
-LINE (x + 5, y + 5)-(x + 5, y + 10), 14\r
-LINE (x + 10, y + 10)-(x + 10, y + 15), 14\r
-LINE (x + 10, y + 15)-(x + 20, y + 30), 14\r
-LINE (x + 20, y + 30)-(x + 25, y + 30), 14\r
-LINE (x + 5, y + 30)-(x + 10, y + 30), 14\r
-LINE (x + 25, y + 15)-(x + 10, y + 30), 14\r
-CASE 7\r
-LINE (x + 5, y + 15)-(x + 10, y + 15), 14\r
-LINE (x + 10, y + 15)-(x + 25, y + 5), 14\r
-LINE (x + 5, y + 25)-(x + 10, y + 25), 14\r
-LINE (x + 10, y + 25)-(x + 15, y + 5), 14\r
-LINE (x + 20, y + 5)-(x + 20, y + 20), 14\r
-PSET (x + 15, y + 25), 14\r
-PSET (x + 22, y + 25), 14\r
-CASE 8\r
-'line (x+,y+)-(x+,y+),15\r
-LINE (x + 15, y + 10)-(x + 15, y + 25), 14\r
-LINE (x + 20, y + 15)-(x + 20, y + 25), 14\r
-LINE (x + 5, y + 20)-(x + 10, y + 25), 14\r
-LINE (x + 10, y + 25)-(x + 25, y + 25), 14\r
-CASE 9\r
-LINE (x + 5, y + 5)-(x + 25, y + 5), 14\r
-LINE (x + 15, y + 5)-(x + 5, y + 20), 14\r
-LINE (x + 15, y + 5)-(x + 25, y + 20), 14\r
-LINE (x + 15, y + 5)-(x + 15, y + 25), 14\r
-LINE (x + 5, y + 30)-(x + 20, y + 20), 14\r
-\r
-END SELECT\r
+        ' Smooth the symbol\r
+        smo 50, 50, 82, 82, 1\r
+\r
+        ' Get the smoothed symbol from the screen\r
+        GET (50, 50)-(82, 82), font1(1, a)\r
+\r
+        ' Draw another square on the screen\r
+        LINE (49, 49)-(83, 83), 0, BF\r
+\r
+        ' Draw another symbol on the screen\r
+        putsym 50, 50, a\r
+\r
+        ' Smooth the other symbol\r
+        smo 50, 50, 82, 82, 2\r
+\r
+        ' Get the smoothed symbol from the screen\r
+        GET (50, 50)-(82, 82), font2(1, a)\r
+\r
+        ' Draw yet another square on the screen\r
+        LINE (49, 49)-(83, 83), 0, BF\r
 \r
+        ' Draw yet another symbol on the screen\r
+        putsym 50, 50, a\r
 \r
+        ' Smooth the last symbol\r
+        smo 50, 50, 82, 82, 3\r
 \r
+        ' Get the smoothed symbol from the screen\r
+        GET (50, 50)-(82, 82), font3(1, a)\r
+    NEXT a\r
 \r
+    ' Clear the screen\r
+    CLS\r
+END SUB\r
+\r
+SUB pt (x, y)\r
+    ' Calculate the screen coordinates for the pixel\r
+    x1 = x * 32 + 12\r
+    y1 = y * 32 + 15\r
+\r
+    ' Get the current font and palette index\r
+    a = pag(x, y)\r
+    b = pah(x, y)\r
+\r
+    ' Check if the pixel is empty\r
+    IF a = 0 THEN\r
+        ' Draw an empty square on the screen\r
+        LINE (x1, y1)-(x1 + 32, y1 + 32), 0, BF\r
+    ELSE\r
+        ' Select the appropriate font based on the palette index\r
+        SELECT CASE b\r
+            CASE 1\r
+                ' Draw the pixel using the first font\r
+                PUT (x1, y1), font1(1, a), PSET\r
+            CASE 2\r
+                ' Draw the pixel using the second font\r
+                PUT (x1, y1), font2(1, a), PSET\r
+            CASE 3\r
+                ' Draw the pixel using the third font\r
+                PUT (x1, y1), font3(1, a), PSET\r
+        END SELECT\r
+    END IF\r
+END SUB\r
+\r
+SUB putsym (x, y, a)\r
+    ' Select the appropriate symbol based on the input value\r
+    SELECT CASE a\r
+        CASE 1\r
+            ' Draw the first symbol\r
+            LINE (x + 10, y + 5)-(x + 10, y + 20), 14\r
+            LINE (x + 5, y + 15)-(x + 20, y + 15), 14\r
+            LINE (x + 15, y + 25)-(x + 20, y + 25), 14\r
+            LINE (x + 20, y + 25)-(x + 25, y + 20), 14\r
+            LINE (x + 25, y + 20)-(x + 25, y + 5), 14\r
+        CASE 2\r
+            ' Draw the second symbol\r
+            LINE (x + 5, y + 15)-(x + 25, y + 10), 14\r
+            LINE (x + 15, y + 5)-(x + 10, y + 25), 14\r
+            LINE (x + 25, y + 5)-(x + 20, y + 20), 14\r
+            LINE (x + 20, y + 30)-(x + 30, y + 20), 14\r
+        CASE 3\r
+            ' Draw the third symbol\r
+            LINE (x + 5, y + 5)-(x + 5, y + 25), 14\r
+            LINE (x + 5, y + 5)-(x + 25, y + 25), 14\r
+            LINE (x + 5, y + 25)-(x + 25, y + 25), 14\r
+            LINE (x + 10, y + 10)-(x + 25, y + 5), 14\r
+        CASE 4\r
+            ' Draw the fourth symbol\r
+            LINE (x + 10, y + 5)-(x + 20, y + 5), 14\r
+            LINE (x + 20, y + 5)-(x + 25, y + 10), 14\r
+            LINE (x + 25, y + 20)-(x + 20, y + 25), 14\r
+            LINE (x + 20, y + 25)-(x + 10, y + 25), 14\r
+            LINE (x + 10, y + 25)-(x + 10, y + 5), 14\r
+            LINE (x + 5, y + 15)-(x + 20, y + 15), 14\r
+        CASE 5\r
+            ' Draw the fifth symbol\r
+            LINE (x + 5, y + 5)-(x + 10, y + 10), 14\r
+            LINE (x + 10, y + 10)-(x + 10, y + 25), 14\r
+            LINE (x + 10, y + 25)-(x + 5, y + 30), 14\r
+            LINE (x + 10, y + 25)-(x + 15, y + 30), 14\r
+            LINE (x + 15, y + 30)-(x + 25, y + 30), 14\r
+            LINE (x + 10, y + 20)-(x + 25, y + 20), 14\r
+        CASE 6\r
+            ' Draw the sixth symbol\r
+            LINE (x + 5, y + 5)-(x + 10, y + 5), 14\r
+            LINE (x + 5, y + 5)-(x + 5, y + 10), 14\r
+            LINE (x + 10, y + 10)-(x + 10, y + 15), 14\r
+            LINE (x + 10, y + 15)-(x + 20, y + 30), 14\r
+            LINE (x + 20, y + 30)-(x + 25, y + 30), 14\r
+            LINE (x + 5, y + 30)-(x + 10, y + 30), 14\r
+            LINE (x + 25, y + 15)-(x + 10, y + 30), 14\r
+        CASE 7\r
+            ' Draw the seventh symbol\r
+            LINE (x + 5, y + 15)-(x + 10, y + 15), 14\r
+            LINE (x + 10, y + 15)-(x + 25, y + 5), 14\r
+            LINE (x + 5, y + 25)-(x + 10, y + 25), 14\r
+            LINE (x + 10, y + 25)-(x + 15, y + 5), 14\r
+            LINE (x + 20, y + 5)-(x + 20, y + 20), 14\r
+            PSET (x + 15, y + 25), 14\r
+            PSET (x + 22, y + 25), 14\r
+        CASE 8\r
+            ' Draw the eighth symbol\r
+            LINE (x + 15, y + 10)-(x + 15, y + 25), 14\r
+            LINE (x + 20, y + 15)-(x + 20, y + 25), 14\r
+            LINE (x + 5, y + 20)-(x + 10, y + 25), 14\r
+            LINE (x + 10, y + 25)-(x + 25, y + 25), 14\r
+        CASE 9\r
+            ' Draw the ninth symbol\r
+            LINE (x + 5, y + 5)-(x + 25, y + 5), 14\r
+            LINE (x + 15, y + 5)-(x + 5, y + 20), 14\r
+            LINE (x + 15, y + 5)-(x + 25, y + 20), 14\r
+            LINE (x + 15, y + 5)-(x + 15, y + 25), 14\r
+            LINE (x + 5, y + 30)-(x + 20, y + 20), 14\r
+    END SELECT\r
 END SUB\r
 \r
 SUB setpal (b)\r
-SELECT CASE b\r
-CASE 2\r
-FOR a = 0 TO 14\r
-OUT &H3C8, a\r
-OUT &H3C9, a * 2\r
-OUT &H3C9, a * 4.5\r
-OUT &H3C9, a * 3\r
-NEXT a\r
-CASE 1\r
-FOR a = 0 TO 14\r
-OUT &H3C8, a\r
-OUT &H3C9, 0\r
-OUT &H3C9, 0\r
-OUT &H3C9, 0\r
-NEXT a\r
-OUT &H3C8, 15\r
-OUT &H3C9, 20\r
-OUT &H3C9, 63\r
-OUT &H3C9, 63\r
-END SELECT\r
+    ' Set the color palette based on the input value\r
+    SELECT CASE b\r
+        CASE 2\r
+            ' Set the colors for palette 2\r
+            FOR a = 0 TO 14\r
+                OUT &H3C8, a\r
+                OUT &H3C9, a * 2\r
+                OUT &H3C9, a * 4.5\r
+                OUT &H3C9, a * 3\r
+            NEXT a\r
+        CASE 1\r
+            ' Set the colors for palette 1\r
+            FOR a = 0 TO 14\r
+                OUT &H3C8, a\r
+                OUT &H3C9, 0\r
+                OUT &H3C9, 0\r
+                OUT &H3C9, 0\r
+            NEXT a\r
+            ' Set the color for the background\r
+            OUT &H3C8, 15\r
+            OUT &H3C9, 20\r
+            OUT &H3C9, 63\r
+            OUT &H3C9, 63\r
+    END SELECT\r
 END SUB\r
 \r
 SUB smo (x1, y1, x2, y2, r)\r
+    ' Initialize the smoothing variable\r
+    c1 = 0\r
 \r
-c1 = 0\r
+    ' Perform horizontal smoothing\r
+    FOR y = y1 TO y2\r
+        FOR x = x1 TO x2\r
+            ' Get the current pixel value\r
+            c = POINT(x, y)\r
 \r
-FOR y = y1 TO y2\r
-FOR x = x1 TO x2\r
-c = POINT(x, y)\r
-c1 = c1 - 5\r
-IF c1 < 0 THEN c1 = 0\r
-IF c > c1 THEN c1 = c\r
-PSET (x, y), c1\r
-NEXT x\r
-NEXT y\r
+            ' Update the smoothing variable\r
+            c1 = c1 - 5\r
 \r
-FOR x = x1 TO x2\r
-c1 = 0\r
-FOR y = y1 TO y2\r
-c = POINT(x, y)\r
-c1 = c1 - 5\r
-IF c1 < 0 THEN c1 = 0\r
-IF c > c1 THEN c1 = c\r
-PSET (x, y), c1\r
-NEXT y\r
-NEXT x\r
\r
-\r
-FOR y = y1 TO y2\r
-c1 = 0\r
-FOR x = x2 TO x1 STEP -1\r
-c = POINT(x, y)\r
-c1 = c1 - 5\r
-IF c1 < 0 THEN c1 = 0\r
-IF c > c1 THEN c1 = c\r
-PSET (x, y), c1\r
-NEXT x\r
-NEXT y\r
+            ' Ensure the smoothing variable is non-negative\r
+            IF c1 < 0 THEN c1 = 0\r
 \r
+            ' Update the smoothing variable if the current pixel value is greater\r
+            IF c > c1 THEN c1 = c\r
+\r
+            ' Set the smoothed pixel value\r
+            PSET (x, y), c1\r
+        NEXT x\r
+    NEXT y\r
 \r
-FOR x = x1 TO x2\r
-c1 = 0\r
-FOR y = y2 TO y1 STEP -1\r
-c = POINT(x, y)\r
-c1 = c1 - 5\r
-IF c1 < 0 THEN c1 = 0\r
-IF c > c1 THEN c1 = c\r
-PSET (x, y), c1\r
-NEXT y\r
-NEXT x\r
+    ' Perform vertical smoothing\r
+    FOR x = x1 TO x2\r
+        c1 = 0\r
+        FOR y = y1 TO y2\r
+            ' Get the current pixel value\r
+            c = POINT(x, y)\r
 \r
+            ' Update the smoothing variable\r
+            c1 = c1 - 5\r
 \r
+            ' Ensure the smoothing variable is non-negative\r
+            IF c1 < 0 THEN c1 = 0\r
+\r
+            ' Update the smoothing variable if the current pixel value is greater\r
+            IF c > c1 THEN c1 = c\r
+\r
+            ' Set the smoothed pixel value\r
+            PSET (x, y), c1\r
+        NEXT y\r
+    NEXT x\r
+\r
+    ' Perform diagonal smoothing\r
+    FOR y = y1 TO y2\r
+        c1 = 0\r
+        FOR x = x1 TO x2\r
+            ' Get the current pixel value\r
+            c = POINT(x, y)\r
 \r
+            ' Update the smoothing variable\r
+            c1 = c1 - 5\r
 \r
-IF r = 1 THEN GOTO 1\r
-rr = r + 1\r
+            ' Ensure the smoothing variable is non-negative\r
+            IF c1 < 0 THEN c1 = 0\r
+\r
+            ' Update the smoothing variable if the current pixel value is greater\r
+            IF c > c1 THEN c1 = c\r
+\r
+            ' Set the smoothed pixel value\r
+            PSET (x, y), c1\r
+        NEXT x\r
+    NEXT y\r
+\r
+    ' Perform diagonal smoothing in the opposite direction\r
+    FOR x = x1 TO x2\r
+        c1 = 0\r
+        FOR y = y2 TO y1 STEP -1\r
+            ' Get the current pixel value\r
+            c = POINT(x, y)\r
+\r
+            ' Update the smoothing variable\r
+            c1 = c1 - 5\r
 \r
+            ' Ensure the smoothing variable is non-negative\r
+            IF c1 < 0 THEN c1 = 0\r
 \r
-FOR y = y1 TO y2\r
-c1 = 0\r
-FOR x = x1 TO x2\r
-c = POINT(x, y)\r
-c1 = (c1 * r + c) / rr\r
-c2 = c1 - r\r
-IF c2 < 0 THEN c2 = 0\r
-PSET (x, y), c2\r
-NEXT x\r
-NEXT y\r
+            ' Update the smoothing variable if the current pixel value is greater\r
+            IF c > c1 THEN c1 = c\r
 \r
-FOR x = x1 TO x2\r
-c1 = 0\r
-FOR y = y1 TO y2\r
-c = POINT(x, y)\r
-c1 = c1 - 5\r
-IF c1 < 0 THEN c1 = 0\r
-IF c > c1 THEN c1 = c\r
-PSET (x, y), c1\r
-NEXT y\r
-NEXT x\r
-\r
-\r
-FOR y = y1 TO y2\r
-c1 = 0\r
-FOR x = x2 TO x1 STEP -1\r
-c = POINT(x, y)\r
-c1 = c1 - 5\r
-IF c1 < 0 THEN c1 = 0\r
-IF c > c1 THEN c1 = c\r
-PSET (x, y), c1\r
-NEXT x\r
-NEXT y\r
+            ' Set the smoothed pixel value\r
+            PSET (x, y), c1\r
+        NEXT y\r
+    NEXT x\r
 \r
+    ' Check if the recursion depth is equal to 1\r
+    IF r = 1 THEN GOTO 1\r
 \r
-FOR x = x1 TO x2\r
-c1 = 0\r
-FOR y = y2 TO y1 STEP -1\r
-c = POINT(x, y)\r
-c1 = c1 - 5\r
-IF c1 < 0 THEN c1 = 0\r
-IF c > c1 THEN c1 = c\r
-PSET (x, y), c1\r
-NEXT y\r
-NEXT x\r
+    ' Increment the recursion depth\r
+    rr = r + 1\r
 \r
-1\r
+    ' Perform horizontal smoothing with averaging\r
+    FOR y = y1 TO y2\r
+        c1 = 0\r
+        FOR x = x1 TO x2\r
+            ' Get the current pixel value\r
+            c = POINT(x, y)\r
+\r
+            ' Update the smoothed pixel value using averaging\r
+            c1 = (c1 * r + c) / rr\r
+\r
+            ' Ensure the smoothed pixel value is non-negative\r
+            c2 = c1 - r\r
+\r
+            IF c2 < 0 THEN c2 = 0\r
+\r
+            ' Set the final smoothed pixel value\r
+            PSET (x, y), c2\r
+        NEXT x\r
+    NEXT y\r
 \r
+    ' Perform vertical smoothing with averaging\r
+    FOR x = x1 TO x2\r
+        c1 = 0\r
+        FOR y = y1 TO y2\r
+            ' Get the current pixel value\r
+            c = POINT(x, y)\r
+\r
+            ' Update the smoothing variable\r
+            c1 = c1 - 5\r
 \r
+            ' Ensure the smoothing variable is non-negative\r
+            IF c1 < 0 THEN c1 = 0\r
 \r
+            ' Update the smoothing variable if the current pixel value is greater\r
+            IF c > c1 THEN c1 = c\r
+\r
+            ' Set the smoothed pixel value\r
+            PSET (x, y), c1\r
+        NEXT y\r
+    NEXT x\r
+\r
+    ' Perform diagonal smoothing with averaging\r
+    FOR y = y1 TO y2\r
+        c1 = 0\r
+        FOR x = x2 TO x1 STEP -1\r
+            ' Get the current pixel value\r
+            c = POINT(x, y)\r
+\r
+            ' Update the smoothing variable\r
+            c1 = c1 - 5\r
+\r
+            ' Ensure the smoothing variable is non-negative\r
+            IF c1 < 0 THEN c1 = 0\r
+\r
+            ' Update the smoothing variable if the current pixel value is greater\r
+            IF c > c1 THEN c1 = c\r
+\r
+            ' Set the smoothed pixel value\r
+            PSET (x, y), c1\r
+        NEXT x\r
+    NEXT y\r
+\r
+    ' Perform diagonal smoothing in the opposite direction with averaging\r
+    FOR x = x1 TO x2\r
+        c1 = 0\r
+        FOR y = y2 TO y1 STEP -1\r
+            ' Get the current pixel value\r
+            c = POINT(x, y)\r
+\r
+            ' Update the smoothing variable\r
+            c1 = c1 - 5\r
+\r
+            ' Ensure the smoothing variable is non-negative\r
+            IF c1 < 0 THEN c1 = 0\r
+\r
+            ' Update the smoothing variable if the current pixel value is greater\r
+            IF c > c1 THEN c1 = c\r
+\r
+            ' Set the smoothed pixel value\r
+            PSET (x, y), c1\r
+        NEXT y\r
+    NEXT x\r
+\r
+1\r
 END SUB\r
 \r
 SUB start\r
-SCREEN 12\r
-setpal 1\r
-getfnt\r
-setpal 2\r
+    ' Set the screen mode to 12\r
+    SCREEN 12\r
+\r
+    ' Set the color palette to 1\r
+    setpal 1\r
+\r
+    ' Load the fonts\r
+    getfnt\r
 \r
+    ' Set the color palette to 2\r
+    setpal 2\r
 END SUB\r
 \r