       IDENTIFICATION DIVISION.
       PROGRAM-ID. ANSITIMERFINAL_FLICKERFREE.

       DATA DIVISION.
       WORKING-STORAGE SECTION.

       01 ESC PIC X VALUE X"1B".

       01 ARG-LINE        PIC X(20).
       01 IN-HHMM         PIC 9(4).
       01 IN-HH           PIC 99.
       01 IN-MM           PIC 99.

       01 NOW-DT.
           05 NOW-YYYY PIC 9(4).
           05 NOW-MO   PIC 9(2).
           05 NOW-DD   PIC 9(2).
           05 NOW-HH   PIC 9(2).
           05 NOW-MM   PIC 9(2).
           05 NOW-SS   PIC 9(2).
           05 FILLER   PIC X(9).

       01 NOWSEC         PIC 9(7).
       01 TARGETSEC      PIC 9(7).
       01 DIFFSEC        PIC S9(7).

       01 OH             PIC S99.
       01 OM             PIC S99.
       01 OS             PIC S99.

       01 STATUS-TEXT    PIC X(80).
       01 COLOR-CODE     PIC X(4).
       01 FULL-LINE      PIC X(300).

       PROCEDURE DIVISION.
       MAIN-LOGIC.

      * CLEAR SCREEN EENMALIG
           STRING
               ESC "[2J" DELIMITED BY SIZE
               ESC "[H"  DELIMITED BY SIZE
               INTO FULL-LINE
           END-STRING
           DISPLAY FULL-LINE

      * ZET CURSOR OP REGEL 4 (statische positie)
           DISPLAY ESC "[4;1H"

      * LEES ARGUMENT
           ACCEPT ARG-LINE FROM COMMAND-LINE
           MOVE ARG-LINE(1:4) TO IN-HHMM

           MOVE IN-HHMM(1:2) TO IN-HH
           MOVE IN-HHMM(3:2) TO IN-MM

           COMPUTE TARGETSEC =
               (IN-HH * 3600) +
               (IN-MM * 60)

      * TIMER LOOP
           PERFORM UNTIL 1 = 2
               CALL "C$SLEEP" USING 1
               PERFORM UPDATE-STATUS
           END-PERFORM.

       UPDATE-STATUS.
      * TIJD BEREKENEN
           MOVE FUNCTION CURRENT-DATE TO NOW-DT

           COMPUTE NOWSEC =
               (NOW-HH * 3600) +
               (NOW-MM * 60) +
                NOW-SS

           COMPUTE DIFFSEC = TARGETSEC - NOWSEC

           MOVE SPACES TO STATUS-TEXT
           MOVE SPACES TO COLOR-CODE

      * STATUS + KLEUR
           IF DIFFSEC > 10800
               MOVE "MEER DAN 3 UUR TE VROEG" TO STATUS-TEXT
               MOVE "[35m" TO COLOR-CODE
           ELSE
               IF DIFFSEC < -10800
                   MOVE "MEER DAN 3 UUR TE LAAT" TO STATUS-TEXT
                   MOVE "[91m" TO COLOR-CODE
               ELSE
                   IF DIFFSEC >= 0 AND DIFFSEC <= 59
                       MOVE "OP TIJD" TO STATUS-TEXT
                       MOVE "[33m" TO COLOR-CODE
                   ELSE
                       DIVIDE DIFFSEC BY 3600
                           GIVING OH
                           REMAINDER DIFFSEC
                       DIVIDE DIFFSEC BY 60
                           GIVING OM
                           REMAINDER OS

                       IF DIFFSEC > 0
                           MOVE "NOG " TO STATUS-TEXT(1:4)
                           MOVE OH TO STATUS-TEXT(5:2)
                           MOVE " UUR " TO STATUS-TEXT(7:5)
                           MOVE OM TO STATUS-TEXT(12:2)
                           MOVE " MIN " TO STATUS-TEXT(14:5)
                           MOVE OS TO STATUS-TEXT(19:2)
                           MOVE " SEC" TO STATUS-TEXT(21:4)
                           MOVE "[32m" TO COLOR-CODE
                       ELSE
                           COMPUTE OH = OH * -1
                           COMPUTE OM = OM * -1
                           COMPUTE OS = OS * -1

                           MOVE OH TO STATUS-TEXT(1:2)
                           MOVE " UUR " TO STATUS-TEXT(3:5)
                           MOVE OM TO STATUS-TEXT(8:2)
                           MOVE " MIN " TO STATUS-TEXT(10:5)
                           MOVE OS TO STATUS-TEXT(15:2)
                           MOVE " SEC TE LAAT" TO STATUS-TEXT(17:13)
                           MOVE "[31m" TO COLOR-CODE
                       END-IF
                   END-IF
               END-IF
           END-IF

      * ÉÉN STRING → ÉÉN DISPLAY → GEEN FLICKER
           MOVE SPACES TO FULL-LINE
           STRING
               ESC "[4;1H" DELIMITED BY SIZE   *> cursor naar regel 4
               ESC "[2K"   DELIMITED BY SIZE   *> wis regel 4
               ESC "[1G"   DELIMITED BY SIZE   *> cursor naar kolom 1
               ESC COLOR-CODE DELIMITED BY SIZE
               STATUS-TEXT DELIMITED BY SIZE
               ESC "[0m"   DELIMITED BY SIZE
               INTO FULL-LINE
           END-STRING

           DISPLAY FULL-LINE WITH NO ADVANCING.

