===============================================================================
       IDENTIFICATION DIVISION.
       PROGRAM-ID. PROBOL-MANDEL-ASCII-GFX.
       AUTHOR. PER-LINDHOLM.
       PURPOSE. SYSTEM-CALL-LEVEL CHARACTER DENSITY SHADER FOR TERMINAL GFX.
===============================================================================
       DATA DIVISION.
       WORKING-STORAGE SECTION.

       *> Spatial framing for terminal aspect ratios (~2:1 character spacing)
       01  X-MIN            DECIMAL(4,3) VALUE -2.000.
       01  X-MAX            DECIMAL(4,3) VALUE  0.500.
       01  Y-MIN            DECIMAL(4,3) VALUE -1.250.
       01  Y-MAX            DECIMAL(4,3) VALUE  1.250.
       
       *> High resolution step intervals for clear rendering density
       01  STEP-X           DECIMAL(4,5) VALUE  0.03125.
       01  STEP-Y           DECIMAL(4,5) VALUE  0.05000.

       *> Scalar looping controls
       01  ITER-COUNT       PIC 9(3) VALUE 0.
       01  MAX-ITER         PIC 9(3) VALUE 30.
       01  CURR-X           DECIMAL(4,3).
       01  CURR-Y           DECIMAL(4,3).

       *> CCT Probabilistic Tensors (Mathematical Vector Space)
       01  CR               PROB-DECIMAL(6,4).
       01  CI               PROB-DECIMAL(6,4).
       01  ZR               PROB-DECIMAL(6,4).
       01  ZI               PROB-DECIMAL(6,4).
       01  ZR-SQ            PROB-DECIMAL(6,4).
       01  ZI-SQ            PROB-DECIMAL(6,4).
       01  ZR-ZI            PROB-DECIMAL(6,4).
       01  MAGNITUDE-SQ     PROB-DECIMAL(6,4).

       *> Realized measurement target for conditional branching
       01  REALIZED-MAG     DECIMAL(6,4).

===============================================================================
       PROCEDURE DIVISION.
       MAIN-LINE.
           DISPLAY "--- STARTING PROBOL MANDELBROT ASCII ENGINE ---".
           DISPLAY "REPRESENTATION MODE: RAW LINUX REGISTERS VIA SYSTEM CALLS".
           DISPLAY-NEWLINE.
           
           MOVE Y-MIN TO CURR-Y.
           PERFORM LOOP-Y UNTIL CURR-Y > Y-MAX.
           
           DISPLAY-NEWLINE.
           DISPLAY "--- RENDERING COMPLETE ---".
           STOP RUN.

       LOOP-Y.
           MOVE X-MIN TO CURR-X.
           PERFORM LOOP-X UNTIL CURR-X > X-MAX.
           
           *> Carriage return + Newline to sweep down to next pixel line
           DISPLAY-NEWLINE.
           ADD STEP-Y TO CURR-Y.

       LOOP-X.
           *> Initialize probabilistic coordinates with absolute certainty (Value:Weight)
           VALUE {CURR-X : 1.0} GIVING CR.
           VALUE {CURR-Y : 1.0} GIVING CI.
           VALUE {0.0000 : 1.0} GIVING ZR.
           VALUE {0.0000 : 1.0} GIVING ZI.
           MOVE 0 TO ITER-COUNT.

           PERFORM ESCAPE-ITERATION UNTIL ITER-COUNT >= MAX-ITER.

           *> ASCII GFX Density Shader Matrix Selection
           IF ITER-COUNT = MAX-ITER
               DISPLAY " " NO ADVANCING
           ELSE
               IF ITER-COUNT > 20
                   DISPLAY "." NO ADVANCING
               ELSE
                   IF ITER-COUNT > 12
                       DISPLAY ":" NO ADVANCING
                   ELSE
                       IF ITER-COUNT > 6
                           DISPLAY "x" NO ADVANCING
                       ELSE
                           DISPLAY "#" NO ADVANCING
                       END-IF
                   END-IF
               END-IF
           END-IF.

           ADD STEP-X TO CURR-X.

       ESCAPE-ITERATION.
           *> Compute complex squares and multiplication convolutions natively
           MULTIPLYP ZR BY ZR GIVING ZR-SQ.
           MULTIPLYP ZI BY ZI GIVING ZI-SQ.
           MULTIPLYP ZR BY ZI GIVING ZR-ZI.

           *> Z_real = ZR^2 - ZI^2 + CR
           ADDP ZR-SQ BY CR GIVING ZR.
           SUBTRACTP ZI-SQ FROM ZR GIVING ZR.

           *> Z_imag = 2*ZR*ZI + CI
           ADDP ZR-ZI BY ZR-ZI GIVING ZI.
           ADDP ZI BY CI GIVING ZI.

           *> Evaluate Escape Velocity Magnitude: |Z|^2 = ZR^2 + ZI^2
           MULTIPLYP ZR BY ZR GIVING ZR-SQ.
           MULTIPLYP ZI BY ZI GIVING ZI-SQ.
           ADDP ZR-SQ BY ZI-SQ GIVING MAGNITUDE-SQ.

           *> Critical CCT Operation: Collapse probability to evaluate boundary
           MEAS MAGNITUDE-SQ INTO REALIZED-MAG.

           IF REALIZED-MAG > 4.0000
               MOVE MAX-ITER TO ITER-COUNT
           ELSE
               ADD 1 TO ITER-COUNT
           END-IF.