IDENTIFICATION DIVISION.
PROGRAM-ID. ASCII-MANDELBROT-ZOOM.

DATA DIVISION.
WORKING-STORAGE SECTION.
* --- Viewport and Camera Navigation Coordinates ---
01  CAM-X         DOUBLE VALUE -0.50.
01  CAM-Y         DOUBLE VALUE  0.00.
01  ZOOM          DOUBLE VALUE  1.00.

* --- Screen Grid Dimensions ---
01  SCREEN-WIDTH  INT VALUE 79.
01  SCREEN-HEIGHT INT VALUE 24.

* --- Loop Counters and Complex Geometry State ---
01  SCREEN-X      INT VALUE 0.
01  SCREEN-Y      INT VALUE 0.
01  ITERATION     INT VALUE 0.
01  MAX-ITER      INT VALUE 30.

* --- Escape Velocity Coordinates ---
01  CR            DOUBLE VALUE 0.0.
01  CI            DOUBLE VALUE 0.0.
01  ZR            DOUBLE VALUE 0.0.
01  ZI            DOUBLE VALUE 0.0.
01  ZR-NEXT       DOUBLE VALUE 0.0.
01  ZI-NEXT       DOUBLE VALUE 0.0.
01  MAGNITUDE-SQ  DOUBLE VALUE 0.0.

* --- Input / Output System ---
01  KEY-INPUT     INT VALUE 0.
01  COLOR-CODE    INT VALUE 0.

PROCEDURE DIVISION.
MAIN-LOOP.
    * 1. Refresh terminal window canvas
    clear
    color 7
    print "=== PROBOL Mandelbrot Zoomer ==="
    print "Controls: [W] Up  [S] Down  [A] Left  [D] Right  [I] Zoom In  [O] Zoom Out  [Q] Quit"
    
    * 2. Reset coordinate space scanning pointers
    MOVE 0 TO SCREEN-Y.

ROW-LOOP.
    IF SCREEN-Y >= SCREEN-HEIGHT GOTO INTERACTION-PROMPT.
    MOVE 0 TO SCREEN-X.

COL-LOOP.
    IF SCREEN-X >= SCREEN-WIDTH GOTO NEXT-ROW.

    * Calculate complex grid mapping scaled by current Zoom and Screen Aspect Ratio
    * Cr = CamX + (ScreenX - Width/2) * (3.5 / (Width * Zoom))
    * Ci = CamY + (ScreenY - Height/2) * (2.0 / (Height * Zoom))
    COMPUTE CR = CAM-X + (SCREEN-X - 40) * 3.5 / (80.0 * ZOOM).
    COMPUTE CI = CAM-Y + (SCREEN-Y - 12) * 2.5 / (24.0 * ZOOM).

    * Initialize complex iteration sequence parameters
    MOVE 0.0 TO ZR.
    MOVE 0.0 TO ZI.
    MOVE 0 TO ITERATION.

ITER-LOOP.
    IF ITERATION >= MAX-ITER GOTO PLOT-PIXEL.
    
    * Check divergence threshold: (Zr^2 + Zi^2) > 4.0
    COMPUTE MAGNITUDE-SQ = (ZR * ZR) + (ZI * ZI).
    IF MAGNITUDE-SQ > 4.0 GOTO PLOT-PIXEL.

    * Mandelbrot Formula Step: Z_next = Z^2 + C
    * Zr_next = Zr^2 - Zi^2 + Cr
    * Zi_next = 2 * Zr * Zi + Ci
    COMPUTE ZR-NEXT = (ZR * ZR) - (ZI * ZI) + CR.
    COMPUTE ZI-NEXT = (2.0 * ZR * ZI) + CI.

    MOVE ZR-NEXT TO ZR.
    MOVE ZI-NEXT TO ZI.
    COMPUTE ITERATION = ITERATION + 1.
    GOTO ITER-LOOP.

PLOT-PIXEL.
    * Map escape velocity iteration values to color codes
    IF ITERATION == MAX-ITER GOTO PLOT-BLACK.
    
    * Select ANSI terminal foreground coloring dynamically
    COMPUTE COLOR-CODE = (ITERATION % 6) + 1.
    color COLOR-CODE.
    
    * Dynamic text texture shading maps
    IF ITERATION < 4  putc ".".
    IF ITERATION >= 4 AND ITERATION < 8 putc "-".
    IF ITERATION >= 8 AND ITERATION < 15 putc "+".
    IF ITERATION >= 15 AND ITERATION < MAX-ITER putc "*".
    GOTO LOOP-COL-CONTINUE.

PLOT-BLACK.
    color 0.
    putc " ".

LOOP-COL-CONTINUE.
    COMPUTE SCREEN-X = SCREEN-X + 1.
    GOTO COL-LOOP.

NEXT-ROW.
    * Print newline feed at line segment completion
    print "".
    COMPUTE SCREEN-Y = SCREEN-Y + 1.
    GOTO ROW-LOOP.

INTERACTION-PROMPT.
    * Reset default text rendering colors
    color 7.
    print "".
    print "Command -> ".
    
    * Await user character stroke response
    getc KEY-INPUT.

    * Check input actions
    IF KEY-INPUT == 113 GOTO EXIT-PROGRAM.  * 'q' - Quit
    IF KEY-INPUT == 119 GOTO PAN-UP.       * 'w' - Move Camera Up
    IF KEY-INPUT == 115 GOTO PAN-DOWN.     * 's' - Move Camera Down
    IF KEY-INPUT == 97  GOTO PAN-LEFT.     * 'a' - Move Camera Left
    IF KEY-INPUT == 100 GOTO PAN-RIGHT.    * 'd' - Move Camera Right
    IF KEY-INPUT == 105 GOTO ZOOM-IN.      * 'i' - Zoom Frame In
    IF KEY-INPUT == 111 GOTO ZOOM-OUT.     * 'o' - Zoom Frame Out
    GOTO MAIN-LOOP.

PAN-UP.
    COMPUTE CAM-Y = CAM-Y - (0.1 / ZOOM).
    GOTO MAIN-LOOP.

PAN-DOWN.
    COMPUTE CAM-Y = CAM-Y + (0.1 / ZOOM).
    GOTO MAIN-LOOP.

PAN-LEFT.
    COMPUTE CAM-X = CAM-X - (0.1 / ZOOM).
    GOTO MAIN-LOOP.

PAN-RIGHT.
    COMPUTE CAM-X = CAM-X + (0.1 / ZOOM).
    GOTO MAIN-LOOP.

ZOOM-IN.
    COMPUTE ZOOM = ZOOM * 1.5.
    GOTO MAIN-LOOP.

ZOOM-OUT.
    COMPUTE ZOOM = ZOOM / 1.5.
    GOTO MAIN-LOOP.

EXIT-PROGRAM.
    clear.
    color 7.
    exit 0.