home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / os2pm / screen.mod < prev    next >
Text File  |  2020-01-01  |  7KB  |  327 lines

  1. IMPLEMENTATION MODULE Screen;
  2. (* module to perform "low level" screen functions (via AVIO) *)
  3.  
  4.    IMPORT ASCII;
  5.  
  6.    FROM SYSTEM IMPORT
  7.       ADR;
  8.  
  9.    FROM Strings IMPORT
  10.       Length;
  11.  
  12.    FROM Conversions IMPORT
  13.       IntToString;
  14.  
  15.    FROM KH IMPORT
  16.       IDM_GREEN;
  17.  
  18.    FROM Vio IMPORT
  19.       VioSetCurPos, VioGetCurPos, VioScrollUp,
  20.       VioWrtNCell, VioWrtTTY, VioCell;
  21.  
  22.  
  23.    CONST
  24.       GREY = 07H;
  25.       WHITE = 0FH;
  26.       REV_GY = 70H;
  27.       GREEN = 02H;
  28.       LITE_GRN = 0AH;
  29.       REV_GRN = 20H;
  30.       AMBER = 06H;
  31.       LITE_AMB = 0EH;
  32.       REV_AMB = 60H;
  33.       RED = 0CH;
  34.       CY_BK = 0B0H;
  35.       CY_BL = 0B9H;
  36.       REV_RD = 0CFH;
  37.       REV_BL = 9FH;
  38.       MAGENTA = 05H;
  39.  
  40.  
  41.    VAR
  42.       (* From Definition Module
  43.       NORMAL : CARDINAL;
  44.       HIGHLIGHT : CARDINAL;
  45.       REVERSE : CARDINAL;
  46.         attribute : CARDINAL;
  47.       hvps : HVPS;
  48.       *)
  49.        x, y : CARDINAL;
  50.        bCell : VioCell;
  51.  
  52.  
  53.    PROCEDURE White;
  54.    (* Sets up colors: Monochrome White *)
  55.       BEGIN
  56.          NORMAL := GREY;
  57.          HIGHLIGHT := WHITE;
  58.          REVERSE := REV_GY;
  59.          attribute := NORMAL;
  60.       END White;
  61.  
  62.  
  63.    PROCEDURE Green;
  64.    (* Sets up colors: Monochrome Green *)
  65.       BEGIN
  66.          NORMAL := GREEN;
  67.          HIGHLIGHT := LITE_GRN;
  68.          REVERSE := REV_GRN;
  69.          attribute := NORMAL;
  70.       END Green;
  71.  
  72.  
  73.    PROCEDURE Amber;
  74.    (* Sets up colors: Monochrome Amber *)
  75.       BEGIN
  76.          NORMAL := AMBER;
  77.          HIGHLIGHT := LITE_AMB;
  78.          REVERSE := REV_AMB;
  79.          attribute := NORMAL;
  80.       END Amber;
  81.  
  82.  
  83.    PROCEDURE Color1;
  84.    (* Sets up colors: Blue, Red, Green *)
  85.       BEGIN
  86.          NORMAL := GREEN;
  87.          HIGHLIGHT := RED;
  88.          REVERSE := REV_BL;
  89.          attribute := NORMAL;
  90.       END Color1;
  91.  
  92.  
  93.    PROCEDURE Color2;
  94.    (* Sets up colors: Cyan Background; Black, Blue, White-on-Red *)
  95.       BEGIN
  96.          NORMAL := CY_BK;
  97.          HIGHLIGHT := CY_BL;
  98.          REVERSE := REV_RD;
  99.          attribute := NORMAL;
  100.       END Color2;
  101.  
  102.  
  103.    PROCEDURE HexToString (num : INTEGER;
  104.                           size : CARDINAL;
  105.                           VAR buf : ARRAY OF CHAR;
  106.                           VAR I : CARDINAL;
  107.                           VAR Done : BOOLEAN);
  108.    (* Local Procedure to convert a number to a string, represented in HEX *)
  109.  
  110.       CONST
  111.          ZERO = 30H;   (* ASCII code *)
  112.          A = 41H;
  113.  
  114.       VAR
  115.          i : CARDINAL;
  116.          h : CARDINAL;
  117.          t : ARRAY [0..10] OF CHAR;
  118.  
  119.       BEGIN
  120.          i := 0;
  121.          REPEAT
  122.             h := num MOD 16;
  123.             IF h <= 9 THEN
  124.                t[i] := CHR (h + ZERO);
  125.             ELSE
  126.                t[i] := CHR (h - 10 + A);
  127.             END;
  128.             INC (i);
  129.             num := num DIV 16;
  130.          UNTIL num = 0;
  131.  
  132.          IF (size > HIGH (buf)) OR (i > HIGH (buf)) THEN
  133.             Done := FALSE;
  134.             RETURN;
  135.          ELSE
  136.             Done := TRUE;
  137.          END;
  138.  
  139.          WHILE size > i DO
  140.             buf[I] := '0';   (* pad with zeros *)
  141.             DEC (size);
  142.             INC (I);
  143.          END;
  144.  
  145.          WHILE i > 0 DO
  146.             DEC (i);
  147.             buf[I] := t[i];
  148.             INC (I);
  149.          END;
  150.  
  151.          buf[I] := 0C;
  152.       END HexToString;
  153.  
  154.  
  155.    PROCEDURE ClrScr;
  156.    (* Clear the screen, and home the cursor *)
  157.       BEGIN
  158.          bCell.ch := ' ';     (* space = blank screen *)
  159.          bCell.attr := CHR (NORMAL);    (* Normal Video Attribute *)
  160.          VioScrollUp (0, 0, 24, 79, 25, bCell, hvps);
  161.          GotoXY (0, 0);
  162.       END ClrScr;
  163.  
  164.  
  165.  
  166.    PROCEDURE ClrEol;
  167.    (* clear from the current cursor position to the end of the line *)
  168.       BEGIN
  169.          GetXY (x, y);     (* current cursor position *)
  170.          bCell.ch := ' ';    (* space = blank *)
  171.          bCell.attr := CHR (NORMAL);   (* Normal Video Attribute *)
  172.          VioScrollUp (y, x, y, 79, 1, bCell, hvps);
  173.       END ClrEol;
  174.  
  175.  
  176.    PROCEDURE Right;
  177.    (* move cursor to the right *)
  178.       BEGIN
  179.          GetXY (x, y);
  180.          INC (x);
  181.          GotoXY (x, y);
  182.       END Right;
  183.  
  184.  
  185.    PROCEDURE Left;
  186.    (* move cursor to the left *)
  187.       BEGIN
  188.          GetXY (x, y);
  189.          DEC (x);
  190.          GotoXY (x, y);
  191.       END Left;
  192.  
  193.  
  194.    PROCEDURE Up;
  195.    (* move cursor up *)
  196.       BEGIN
  197.          GetXY (x, y);
  198.          DEC (y);
  199.          GotoXY (x, y);
  200.       END Up;
  201.  
  202.  
  203.    PROCEDURE Down;
  204.    (* move cursor down *)
  205.       BEGIN
  206.          GetXY (x, y);
  207.          INC (y);
  208.          GotoXY (x, y);
  209.       END Down;
  210.  
  211.  
  212.    PROCEDURE GotoXY (col, row : CARDINAL);
  213.    (* position cursor at column, row *)
  214.       BEGIN
  215.          IF (col <= 79) AND (row <= 24) THEN
  216.             VioSetCurPos (row, col, hvps);
  217.          END;
  218.       END GotoXY;
  219.  
  220.  
  221.    PROCEDURE GetXY (VAR col, row : CARDINAL);
  222.    (* determine current cursor position *)
  223.       BEGIN
  224.          VioGetCurPos (row, col, hvps);
  225.       END GetXY;
  226.  
  227.  
  228.    PROCEDURE Write (c : CHAR);
  229.    (* Write a Character *)
  230.       BEGIN
  231.          WriteAtt (c);
  232.       END Write;
  233.  
  234.  
  235.    PROCEDURE WriteString (str : ARRAY OF CHAR);
  236.    (* Write String *)
  237.  
  238.       VAR
  239.          i : CARDINAL;
  240.          c : CHAR;
  241.  
  242.       BEGIN
  243.          i := 0;
  244.          c := str[i];
  245.          WHILE c # 0C DO
  246.             Write (c);
  247.             INC (i);
  248.             c := str[i];
  249.          END;
  250.       END WriteString;
  251.  
  252.  
  253.    PROCEDURE WriteInt (n : INTEGER; s : CARDINAL);
  254.    (* Write Integer *)
  255.  
  256.       VAR
  257.          i : CARDINAL;
  258.          b : BOOLEAN;
  259.          str : ARRAY [0..6] OF CHAR;
  260.  
  261.       BEGIN
  262.          i := 0;
  263.          IntToString (n, s, str, i, b);
  264.          WriteString (str);
  265.       END WriteInt;
  266.  
  267.  
  268.    PROCEDURE WriteHex (n, s : CARDINAL);
  269.    (* Write a Hexadecimal Number *)
  270.  
  271.       VAR
  272.          i : CARDINAL;
  273.          b : BOOLEAN;
  274.          str : ARRAY [0..6] OF CHAR;
  275.  
  276.       BEGIN
  277.          i := 0;
  278.          HexToString (n, s, str, i, b);
  279.          WriteString (str);
  280.       END WriteHex;
  281.  
  282.  
  283.    PROCEDURE WriteLn;
  284.    (* Write <cr> <lf> *)
  285.       BEGIN
  286.          Write (ASCII.cr);   Write (ASCII.lf);
  287.       END WriteLn;
  288.  
  289.  
  290.    PROCEDURE WriteAtt (c : CHAR);
  291.    (* write character and attribute at cursor position *)
  292.  
  293.       VAR
  294.          s : ARRAY [0..1] OF CHAR;
  295.  
  296.       BEGIN
  297.          GetXY (x, y);
  298.          IF (c = ASCII.ht) THEN
  299.             bCell.ch := ' ';
  300.             bCell.attr := CHR (attribute);
  301.             REPEAT
  302.                VioWrtNCell (bCell, 1, y, x, hvps);
  303.                Right;
  304.             UNTIL (x MOD 8) = 0;
  305.          ELSIF (c = ASCII.cr) OR (c = ASCII.lf)
  306.           OR (c = ASCII.bel) OR (c = ASCII.bs) THEN
  307.             s[0] := c;    s[1] := 0C;
  308.             VioWrtTTY (ADR (s), 1, hvps);
  309.             IF c = ASCII.lf THEN
  310.                ClrEol;
  311.             END;
  312.          ELSE
  313.             bCell.ch := c;
  314.             bCell.attr := CHR (attribute);
  315.             VioWrtNCell (bCell, 1, y, x, hvps);
  316.             Right;
  317.          END;
  318.       END WriteAtt;
  319.  
  320. BEGIN     (* module initialization *)
  321.    ColorSet := IDM_GREEN;
  322.    NORMAL := GREEN;
  323.    HIGHLIGHT := LITE_GRN;
  324.    REVERSE := REV_GRN;
  325.    attribute := NORMAL;
  326. END Screen.
  327.