home *** CD-ROM | disk | FTP | other *** search
/ POINT Software Programming / PPROG1.ISO / pascal / visionix / vansiu.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1993-12-23  |  29.9 KB  |  1,344 lines

  1. {
  2.  ════════════════════════════════════════════════════════════════════════════
  3.  
  4.  Visionix ANSI Functions unit (VANSIu)
  5.    Version 0.2
  6.  Copyright 1991,92,93 Visionix
  7.  ALL RIGHTS RESERVED
  8.  
  9.  ────────────────────────────────────────────────────────────────────────────
  10.  
  11.  ** revision history in reverse chronological order **
  12.  
  13.  Initials  Date      Comment
  14.  ────────  ────────  ────────────────────────────────────────────────────────
  15.  
  16.  jrt       12/23/93  Added more documentation.
  17.  
  18.  jrt       11/01/93  Moved drivers out to vansiiou.
  19.  
  20.  mep       05/08/93  Drivers (local and buffer) might work now - doubt it :)
  21.  
  22.  mep       04/29/93  Created.
  23.  
  24.  ────────────────────────────────────────────────────────────────────────────
  25. }
  26.  
  27. (*-
  28.  
  29. [SECTION: Section 2: The Text I/O Libraries]
  30. [CHAPTER: Chapter 1: The ANSI Functions library]
  31.  
  32. [TEXT]
  33.  
  34. <Overview>
  35.  
  36.  
  37. This unit mainly provides functions which generate ANSI command strings.
  38. Each function returns a string which is the ANSI command equivalent
  39. of the function.
  40.  
  41. For example, The ANSIClrScr function returns the ANSI Clear screen
  42. command as a string, '<ESC>[2J'.
  43.  
  44. <IBM ANSI Graphics Specification:>
  45.  
  46.  
  47.   ESC[   ANSI Start Sequence, follwed by the following commands:
  48.  
  49.   0;30m  Black FG                    40m    Black BC
  50.   0;34m  Blue FG                     44m    Blue BC
  51.   0;32m  Green FG                    42m    Green BC
  52.   0;36m  Cyan FG                     46m    Cyan BC
  53.   0;31m  Red FG                      41m    Red BC
  54.   0;35m  Magenta FG                  45m    Magenta BC
  55.   0;33m  Brown FG                    43m    Brown BC
  56.   0;37m  LightGray FG                47m    LightGray BC
  57.  
  58.   1;30m  DarkGray FG
  59.   1;34m  LightBlue FG                0m     Attr OFF
  60.   1;32m  LightGreen FG               1m     Bold ON
  61.   1;36m  LightCyan FG                2m     Faint/Dim (not Bold) ON
  62.   1;31m  LightRed FG                 3m     Italic ON
  63.   1;35m  LightMagenta FG             4m     Underline ON
  64.   1;33m  Yellow FG                   5m     Blink ON
  65.   1;37m  White FG                    6m     Fast Blink ON
  66.                                      7m     Rev. Video ON
  67.   H      Home (upper left)           8m     Concealed/Invisible ON
  68.   f      Home (upper left)           9m     Subscript ON
  69.                                      10m    Superscript ON
  70.   #H     Home (then down # rows)
  71.   #f     Home (then down # rows)     2J     ClrScr
  72.                                      1J     ClrScr (before cursor position)
  73.   r;cH   GotoXY (X=c, Y=r)           J      ClrScr (after cursor position)
  74.   r;cf   GotoXY (X=c, Y=r)
  75.                                      K      ClrEol
  76.   A      Up one line                 1K     ClrEol (before cursor position)
  77.   #A     Up # lines                  2K     ClrEol (whole line)
  78.  
  79.   B      Down one line               L      InsLine
  80.   #B     Down # lines                #L     InsLine # lines
  81.  
  82.   C      Right one line              M      DelLine
  83.   #C     Right # lines               #M     DelLine # lines
  84.  
  85.   D      Left one line
  86.   #D     Left # lines
  87.  
  88.   6n     Cursor Positon Request -
  89.            console returns Cursor Position Report defined as: r;cR
  90.  
  91.   s      Save pos
  92.   u      Restore pos
  93.  
  94.   =7h,   Wrap at EOL
  95.   ?7h
  96.  
  97.   =7l,   No wrap at EOL
  98.   ?7l
  99.  
  100.   =h,    Set screen to mode #
  101.   =#h,
  102.   ?#h,
  103.   #h
  104.  
  105.   =l     Reset screen to mode #
  106.   =#l,
  107.   ?#l,
  108.   #l
  109.  
  110.   #;#p   Redefine keyboard (ASCII-value key to ASCII value)
  111.   #p     Redefine keyboard (clears key)
  112.   #;"s"p Redefine keyboard (change first # to following string)
  113.  
  114.   22m    Bold OFF
  115.   24m    Underline OFF
  116.   25m    Blink OFF
  117.   27m    Rev. Video OFF
  118.  
  119.   #@     Inserts # blank characters at cursor position
  120.  
  121.   #P     Deletes # characters including cursor character
  122.  
  123.   M{string}^C    ANSI Music (same as BASICA's PLAY command)
  124.  
  125.  
  126. <Interface>
  127.  
  128. -*)
  129.  
  130.  
  131. Unit VANSIu;
  132.  
  133. Interface
  134.  
  135. Uses
  136.  
  137.   DOS,
  138.   VTypesu,
  139.   VStringu,
  140.   VGenu;
  141.  
  142. {────────────────────────────────────────────────────────────────────────────}
  143.  
  144. {────────────────────────────────────────────────────────────────────────────}
  145.  
  146. Function  ANSITextColor(          FG             : BYTE      ) : STRING;
  147.  
  148. Function  ANSITextBackground(     BG             : BYTE      ) : STRING;
  149.  
  150. Function  ANSITextAttr(           Attr           : BYTE      ) : STRING;
  151.  
  152. Function  ANSIHome                                             : STRING;
  153.  
  154. Function  ANSIHomeRow(            Rows           : BYTE      ) : STRING;
  155.  
  156. Function  ANSIGotoXY(             X              : BYTE;
  157.                                   Y              : BYTE      ) : STRING;
  158.  
  159. Function  ANSIUp                                               : STRING;
  160.  
  161. Function  ANSIUpCount(            Rows           : BYTE      ) : STRING;
  162.  
  163. Function  ANSIDown                                             : STRING;
  164.  
  165. Function  ANSIDownCount(          Rows           : BYTE      ) : STRING;
  166.  
  167. Function  ANSIRight                                            : STRING;
  168.  
  169. Function  ANSIRightCount(         Cols           : BYTE      ) : STRING;
  170.  
  171. Function  ANSILeft                                             : STRING;
  172.  
  173. Function  ANSILeftCount(          Cols           : BYTE      ) : STRING;
  174.  
  175. Function  ANSIClrScr                                           : STRING;
  176.  
  177. Function  ANSIClrScrBefore                                     : STRING;
  178.  
  179. Function  ANSIClrScrAfter                                      : STRING;
  180.  
  181. Function  ANSIClrEol                                           : STRING;
  182.  
  183. Function  ANSIClrSol                                           : STRING;
  184.  
  185. Function  ANSIClrLine                                          : STRING;
  186.  
  187. Function  ANSIInsLine                                          : STRING;
  188.  
  189. Function  ANSIInsLineCount(       Rows           : BYTE      ) : STRING;
  190.  
  191. Function  ANSIDelLine                                          : STRING;
  192.  
  193. Function  ANSIDelLineCount(       Rows           : BYTE      ) : STRING;
  194.  
  195. Function  ANSISavePos                                          : STRING;
  196.  
  197. Function  ANSIRestorePos                                       : STRING;
  198.  
  199. Function  ANSIWrapEol                                          : STRING;
  200.  
  201. Function  ANSINoWrapEol                                        : STRING;
  202.  
  203. Function  ANSIRequestXY                                        : STRING;
  204.  
  205. Function  ANSIReportXY                                         : STRING;
  206.  
  207. Function  ANSIMusic(              Play           : STRING    ) : STRING;
  208.  
  209. { NOTE: These next two functions are probably going to be yanked.}
  210.  
  211.  
  212. Function  ANSIMisc(               Params         : STRING    ) : STRING;
  213.  
  214. (*
  215. Procedure ANSIWrite(              Ch             : CHAR      );
  216. *)
  217.  
  218. {────────────────────────────────────────────────────────────────────────────}
  219.  
  220. Implementation
  221.  
  222. Const
  223.  
  224.   Black          = 0;
  225.   Blue           = 1;
  226.   Green          = 2;
  227.   Cyan           = 3;
  228.   Red            = 4;
  229.   Magenta        = 5;
  230.   Brown          = 6;
  231.   LightGray      = 7;
  232.   DarkGray       = 8;
  233.   LightBlue      = 9;
  234.   LightGreen     = 10;
  235.   LightCyan      = 11;
  236.   LightRed       = 12;
  237.   LightMagenta   = 13;
  238.   Yellow         = 14;
  239.   White          = 15;
  240.   Blink          = 128;
  241.  
  242.   BackBlack      = 0 SHL 4;
  243.   BackBlue       = 1 SHL 4;
  244.   BackGreen      = 2 SHL 4;
  245.   BackCyan       = 3 SHL 4;
  246.   BackRed        = 4 SHL 4;
  247.   BackMagenta    = 5 SHL 4;
  248.   BackBrown      = 6 SHL 4;
  249.   BackLightGray  = 7 SHL 4;
  250.  
  251.  
  252. {────────────────────────────────────────────────────────────────────────────}
  253.  
  254. Type
  255.  
  256.   TANSIEmu = RECORD
  257.  
  258.     Cmd        : STRING;
  259.     StringMode : BOOLEAN;
  260.     AttrBold   : BYTE;
  261.     SaveX      : BYTE;
  262.     SaveY      : BYTE;
  263.  
  264.     X          : BYTE;
  265.     Y          : BYTE;
  266.     N          : BYTE;
  267.     TmpS       : STRING;
  268.  
  269.   END;
  270.  
  271.   PAnsiEmu = ^TAnsiEmu;
  272.  
  273. Var
  274.  
  275.   ANSIEmu : TANSIEmu;
  276.  
  277. {────────────────────────────────────────────────────────────────────────────}
  278.  
  279. Function  ANSITextColor(          FG             : BYTE      ) : STRING;
  280.  
  281. Var
  282.  
  283.   S : STRING[40];
  284.  
  285. BEGIN
  286.  
  287.   S := ESC + '[';
  288.  
  289.   Case FG of
  290.  
  291.     Black        : S := S + '0;30';
  292.     Blue         : S := S + '0;34';
  293.     Green        : S := S + '0;32';
  294.     Cyan         : S := S + '0;36';
  295.     Red          : S := S + '0;31';
  296.     Magenta      : S := S + '0;35';
  297.     Brown        : S := S + '0;33';
  298.     LightGray    : S := S + '0;37';
  299.     DarkGray     : S := S + '1;30';
  300.     LightBlue    : S := S + '1;34';
  301.     LightGreen   : S := S + '1;32';
  302.     LightCyan    : S := S + '1;36';
  303.     LightRed     : S := S + '1;31';
  304.     LightMagenta : S := S + '1;35';
  305.     Yellow       : S := S + '1;33';
  306.     White        : S := S + '1;37';
  307.  
  308.   End;
  309.  
  310.   ANSITextColor := S + 'm';
  311.  
  312. END;
  313.  
  314. {────────────────────────────────────────────────────────────────────────────}
  315.  
  316. Function  ANSITextBackground(     BG             : BYTE      ) : STRING;
  317.  
  318. Var
  319.  
  320.   S : STRING[40];
  321.  
  322. BEGIN
  323.  
  324.   S := ESC + '[';
  325.  
  326.   Case BG of
  327.  
  328.     Black        : S := S + '0;40';
  329.     Blue         : S := S + '0;44';
  330.     Green        : S := S + '0;42';
  331.     Cyan         : S := S + '0;46';
  332.     Red          : S := S + '0;41';
  333.     Magenta      : S := S + '0;45';
  334.     Brown        : S := S + '0;43';
  335.     LightGray    : S := S + '0;47';
  336. (*
  337.     DarkGray     : S := S + '1;40';
  338.     LightBlue    : S := S + '1;44';
  339.     LightGreen   : S := S + '1;42';
  340.     LightCyan    : S := S + '1;46';
  341.     LightRed     : S := S + '1;41';
  342.     LightMagenta : S := S + '1;45';
  343.     Yellow       : S := S + '1;43';
  344.     White        : S := S + '1;47';
  345. *)
  346.   End;
  347.  
  348.   ANSITextBackground := S + 'm';
  349.  
  350. END;
  351.  
  352. {────────────────────────────────────────────────────────────────────────────}
  353.  
  354. Function  ANSITextAttr(           Attr           : BYTE      ) : STRING;
  355.  
  356. Var
  357.  
  358.   FG    : BYTE;
  359.   BG    : BYTE;
  360.   Blink : BOOLEAN;
  361.   S     : STRING;
  362.  
  363. BEGIN
  364.  
  365.   FG    := (Attr AND $0F);
  366.   BG    := (Attr AND $70) SHR 4;
  367.   Blink := ( (Attr AND $80) SHR 7 ) <> 0;
  368.   S     := ESC + '[';
  369.  
  370.   Case FG of
  371.  
  372.     Black        : S := S + '0;30';
  373.     Blue         : S := S + '0;34';
  374.     Green        : S := S + '0;32';
  375.     Cyan         : S := S + '0;36';
  376.     Red          : S := S + '0;31';
  377.     Magenta      : S := S + '0;35';
  378.     Brown        : S := S + '0;33';
  379.     LightGray    : S := S + '0;37';
  380.     DarkGray     : S := S + '1;30';
  381.     LightBlue    : S := S + '1;34';
  382.     LightGreen   : S := S + '1;32';
  383.     LightCyan    : S := S + '1;36';
  384.     LightRed     : S := S + '1;31';
  385.     LightMagenta : S := S + '1;35';
  386.     Yellow       : S := S + '1;33';
  387.     White        : S := S + '1;37';
  388.  
  389.   End;
  390.  
  391.   S := S + ';';
  392.  
  393.   Case BG of
  394.  
  395.     Black        : S := S + '40';
  396.     Blue         : S := S + '44';
  397.     Green        : S := S + '42';
  398.     Cyan         : S := S + '46';
  399.     Red          : S := S + '41';
  400.     Magenta      : S := S + '45';
  401.     Brown        : S := S + '43';
  402.     LightGray    : S := S + '47';
  403. (*
  404.     DarkGray     : S := S + '1;40';
  405.     LightBlue    : S := S + '1;44';
  406.     LightGreen   : S := S + '1;42';
  407.     LightCyan    : S := S + '1;46';
  408.     LightRed     : S := S + '1;41';
  409.     LightMagenta : S := S + '1;45';
  410.     Yellow       : S := S + '1;43';
  411.     White        : S := S + '1;47';
  412. *)
  413.   End;
  414.  
  415.   If Blink Then
  416.     S := S + ';5';
  417.  
  418.   ANSITextAttr := S + 'm';
  419.  
  420. END;
  421.  
  422. {────────────────────────────────────────────────────────────────────────────}
  423.  
  424. Function  ANSIHome                                             : STRING;
  425.  
  426. BEGIN
  427.  
  428.   ANSIHome := ESC + '[H';
  429.  
  430. END;
  431.  
  432. {────────────────────────────────────────────────────────────────────────────}
  433.  
  434. Function  ANSIHomeRow(            Rows           : BYTE      ) : STRING;
  435.  
  436. BEGIN
  437.  
  438.   ANSIHomeRow := ESC + '[' + IntToStr(Rows) + 'H';
  439.  
  440. END;
  441.  
  442. {────────────────────────────────────────────────────────────────────────────}
  443.  
  444. Function  ANSIGotoXY(             X              : BYTE;
  445.                                   Y              : BYTE      ) : STRING;
  446.  
  447. BEGIN
  448.  
  449.   ANSIGotoXY := ESC + '[' + IntToStr(Y) + ';' + IntToStr(X) + 'H';
  450.  
  451. END;
  452.  
  453. {────────────────────────────────────────────────────────────────────────────}
  454.  
  455. Function  ANSIUp                                               : STRING;
  456.  
  457. BEGIN
  458.  
  459.   ANSIUp := ESC + '[A';
  460.  
  461. END;
  462.  
  463. {────────────────────────────────────────────────────────────────────────────}
  464.  
  465. Function  ANSIUpCount(            Rows           : BYTE      ) : STRING;
  466.  
  467. BEGIN
  468.  
  469.   ANSIUpCount := ESC + '[' + IntToStr(Rows) + 'A';
  470.  
  471. END;
  472.  
  473. {────────────────────────────────────────────────────────────────────────────}
  474.  
  475. Function  ANSIDown                                             : STRING;
  476.  
  477. BEGIN
  478.  
  479.   ANSIDown := ESC + '[B';
  480.  
  481. END;
  482.  
  483. {────────────────────────────────────────────────────────────────────────────}
  484.  
  485. Function  ANSIDownCount(          Rows           : BYTE      ) : STRING;
  486.  
  487. BEGIN
  488.  
  489.   ANSIDownCount := ESC + '[' + IntToStr(Rows) + 'B';
  490.  
  491. END;
  492.  
  493. {────────────────────────────────────────────────────────────────────────────}
  494.  
  495. Function  ANSIRight                                            : STRING;
  496.  
  497. BEGIN
  498.  
  499.   ANSIRight := ESC + '[C';
  500.  
  501. END;
  502.  
  503. {────────────────────────────────────────────────────────────────────────────}
  504.  
  505. Function  ANSIRightCount(         Cols           : BYTE      ) : STRING;
  506.  
  507. BEGIN
  508.  
  509.   ANSIRightCount := ESC + '[' + IntToStr(Cols) + 'C';
  510.  
  511. END;
  512.  
  513. {────────────────────────────────────────────────────────────────────────────}
  514.  
  515. Function  ANSILeft                                             : STRING;
  516.  
  517. BEGIN
  518.  
  519.   ANSILeft := ESC + '[D';
  520.  
  521. END;
  522.  
  523. {────────────────────────────────────────────────────────────────────────────}
  524.  
  525. Function  ANSILeftCount(          Cols           : BYTE      ) : STRING;
  526.  
  527. BEGIN
  528.  
  529.   ANSILeftCount := ESC + '[' + IntToStr(Cols) + 'D';
  530.  
  531. END;
  532.  
  533. {────────────────────────────────────────────────────────────────────────────}
  534.  
  535. Function  ANSIClrScr                                           : STRING;
  536.  
  537. BEGIN
  538.  
  539.   ANSIClrScr := ESC + '[2J';
  540.  
  541. END;
  542.  
  543. {────────────────────────────────────────────────────────────────────────────}
  544.  
  545. Function  ANSIClrScrBefore                                     : STRING;
  546.  
  547. BEGIN
  548.  
  549.   ANSIClrScrBefore := ESC + '[1J';
  550.  
  551. END;
  552.  
  553. {────────────────────────────────────────────────────────────────────────────}
  554.  
  555. Function  ANSIClrScrAfter                                      : STRING;
  556.  
  557. BEGIN
  558.  
  559.   ANSIClrScrAfter := ESC + '[J';
  560.  
  561. END;
  562.  
  563. {────────────────────────────────────────────────────────────────────────────}
  564.  
  565. Function  ANSIClrEol                                           : STRING;
  566.  
  567. BEGIN
  568.  
  569.   ANSIClrEol := ESC + '[K';
  570.  
  571. END;
  572.  
  573. {────────────────────────────────────────────────────────────────────────────}
  574.  
  575. Function  ANSIClrSol                                           : STRING;
  576.  
  577. BEGIN
  578.  
  579.   ANSIClrSol := ESC + '[1K';
  580.  
  581. END;
  582.  
  583. {────────────────────────────────────────────────────────────────────────────}
  584.  
  585. Function  ANSIClrLine                                          : STRING;
  586.  
  587. BEGIN
  588.  
  589.   ANSIClrLIne := ESC + '[2K';
  590.  
  591. END;
  592.  
  593. {────────────────────────────────────────────────────────────────────────────}
  594.  
  595. Function  ANSIInsLine                                          : STRING;
  596.  
  597. BEGIN
  598.  
  599.   ANSIInsLine := ESC + '[L';
  600.  
  601. END;
  602.  
  603. {────────────────────────────────────────────────────────────────────────────}
  604.  
  605. Function  ANSIInsLineCount(       Rows           : BYTE      ) : STRING;
  606.  
  607. BEGIN
  608.  
  609.   ANSIInsLineCount := ESC + '[' + IntToStr(Rows) + 'L';
  610.  
  611. END;
  612.  
  613. {────────────────────────────────────────────────────────────────────────────}
  614.  
  615. Function  ANSIDelLine                                          : STRING;
  616.  
  617. BEGIN
  618.  
  619.   ANSIDelLine := ESC + '[M';
  620.  
  621. END;
  622.  
  623. {────────────────────────────────────────────────────────────────────────────}
  624.  
  625. Function  ANSIDelLineCount(       Rows           : BYTE      ) : STRING;
  626.  
  627. BEGIN
  628.  
  629.   ANSIDelLineCount := ESC + '[' + IntToStr(Rows) + 'M';
  630.  
  631. END;
  632.  
  633. {────────────────────────────────────────────────────────────────────────────}
  634.  
  635. Function  ANSISavePos                                          : STRING;
  636.  
  637. BEGIN
  638.  
  639.   ANSISavePos := ESC + '[s';
  640.  
  641. END;
  642.  
  643. {────────────────────────────────────────────────────────────────────────────}
  644.  
  645. Function  ANSIRestorePos                                       : STRING;
  646.  
  647. BEGIN
  648.  
  649.   ANSIRestorePos := ESC + '[u';
  650.  
  651. END;
  652.  
  653. {────────────────────────────────────────────────────────────────────────────}
  654.  
  655. Function  ANSIWrapEol                                          : STRING;
  656.  
  657. BEGIN
  658.  
  659.   ANSIWrapEol := ESC + '[=7h';
  660.  
  661. END;
  662.  
  663. {────────────────────────────────────────────────────────────────────────────}
  664.  
  665. Function  ANSINoWrapEol                                        : STRING;
  666.  
  667. BEGIN
  668.  
  669.   ANSINoWrapEol := ESC + '[=7l';
  670.  
  671. END;
  672.  
  673. {────────────────────────────────────────────────────────────────────────────}
  674.  
  675. Function  ANSIRequestXY                                        : STRING;
  676.  
  677. BEGIN
  678.  
  679.   ANSIRequestXY := ESC + '[6n';
  680.  
  681. END;
  682.  
  683. {────────────────────────────────────────────────────────────────────────────}
  684.  
  685. Function  ANSIReportXY                                         : STRING;
  686.  
  687. BEGIN
  688.  
  689. {  ANSIReportXY := ESC + '[' + IntToStr(WhereY) + ';' + IntToStr(WhereX) + 'R'; }
  690.  
  691. END;
  692.  
  693. {────────────────────────────────────────────────────────────────────────────}
  694.  
  695. Function  ANSIMusic(              Play           : STRING    ) : STRING;
  696.  
  697. BEGIN
  698.  
  699.   ANSIMusic := ESC + '[M' + Play + #3;
  700.  
  701. END;
  702.  
  703. {────────────────────────────────────────────────────────────────────────────}
  704.  
  705. Function  ANSIMisc(               Params         : STRING    ) : STRING;
  706.  
  707. Var
  708.  
  709.   Param : STRING;
  710.   S     : STRING;
  711.  
  712. BEGIN
  713.  
  714.   S := '';
  715.  
  716.   Param := '';
  717.   REPEAT
  718.  
  719.     Param := GetNextParam( Param, Params );
  720.  
  721.     If (Param <> '') Then
  722.     BEGIN
  723.  
  724.     END;
  725.  
  726.   UNTIL (Param = '');
  727.  
  728.   ANSIMisc := S;
  729.  
  730. END;
  731.  
  732. {────────────────────────────────────────────────────────────────────────────}
  733.  
  734. Function ANSITakeParam( Var Cmd : STRING ) : STRING;
  735.  
  736. Var
  737.  
  738.   Idx  : BYTE;
  739.   Cnt  : BYTE;
  740.  
  741. BEGIN
  742.  
  743.   Idx := Pos(';', Cmd);
  744.  
  745.   If Idx = 0 Then
  746.   BEGIN
  747.  
  748.     Cnt := Byte(Cmd[0]) - 2;
  749.  
  750.     ANSITakeParam := Copy(Cmd, 3, Cnt);
  751.     Delete(Cmd, 3, Cnt);
  752.  
  753.   END
  754.   Else
  755.   BEGIN
  756.  
  757.     Dec(Idx);
  758.     Cnt := Idx - 2;
  759.  
  760.     ANSITakeParam := Copy(Cmd, 3, Cnt);
  761.     Delete(Cmd, 3, Succ(Cnt));
  762.  
  763.   END;
  764.  
  765. END;
  766.  
  767. {────────────────────────────────────────────────────────────────────────────}
  768.  
  769. Function ANSITakeInt( Var Cmd : STRING ) : INTEGER;
  770.  
  771. BEGIN
  772.  
  773.   ANSITakeInt := StrToInt( ANSITakeParam(Cmd) );
  774.  
  775. END;
  776.  
  777. {────────────────────────────────────────────────────────────────────────────}
  778.  
  779. Function ANSINextParam( Var Cmd : STRING ) : INTEGER;
  780.  
  781. { -1 = no parameter        }
  782. {  1 = string parameter    }
  783. {  2 = command             }
  784. {  3 = number parameter    }
  785. {  4 = blank parameter ';' }
  786.  
  787. BEGIN
  788.  
  789.   If Byte(Cmd[0]) < 3 Then
  790.     ANSINextParam := -1
  791.   Else
  792.   If Cmd[Byte(Cmd[0])] = '"' Then
  793.     ANSINextParam := 1
  794.   Else
  795.   If NOT IsNum(Cmd[Byte(Cmd[0])]) Then
  796.     ANSINextParam := 2
  797.   Else
  798.   If Cmd[3] = ';' Then
  799.   BEGIN
  800.     Delete(Cmd, 3, 1);   { yuck - but works! }
  801.     ANSINextParam := 4;
  802.   END
  803.   Else
  804.     ANSINextParam := 3;
  805.  
  806. END;
  807.  
  808. {────────────────────────────────────────────────────────────────────────────}
  809.  
  810. Procedure ResetCmd;
  811.  
  812. BEGIN
  813.  
  814.   ANSIEmu.Cmd := '';
  815.  
  816. END;
  817.  
  818. {────────────────────────────────────────────────────────────────────────────}
  819. (*
  820. Procedure ANSIWrite(              Ch             : CHAR      );
  821.  
  822. Var
  823.  
  824.   L1 : INTEGER;
  825.   L2 : BYTE;
  826.   L3 : BYTE;
  827.  
  828. BEGIN
  829.  
  830.   With ANSIEmu Do
  831.   BEGIN
  832.  
  833.     If Cmd[0] > NUL Then
  834.     BEGIN
  835.  
  836.       If Byte(Cmd[0]) = 1 Then
  837.       BEGIN
  838.  
  839.         If Ch = '[' Then
  840.           Cmd := Cmd + Ch
  841.         Else
  842.         BEGIN
  843.  
  844.           Write(Ch);
  845.           ResetCmd;
  846.  
  847.         END;
  848.  
  849.       END
  850.       Else
  851.       BEGIN
  852.  
  853.         If StringMode AND (Ch <> '"') Then
  854.           Cmd := Cmd + Ch
  855.         Else
  856.         Case Ch of
  857.  
  858.           '0'..'9', { inputing number(s) values }
  859.           ';' :
  860.             Cmd := Cmd + Ch;
  861.  
  862.           'A' :     { Up Row }
  863.  
  864.             BEGIN
  865.  
  866.               If ANSINextParam(Cmd) = 3 Then
  867.                 L1 := ANSITakeInt(Cmd)
  868.               Else
  869.                 L1 := 1;
  870.               For L2 := 1 to L1 Do
  871.               BEGIN
  872.  
  873.                 L3 := WhereY;
  874.                 Inc(L3, Hi(WindMin));
  875.  
  876.                 If ( L3 > Hi(WindMin) ) Then
  877.                   GotoXY(WhereX, Pred(WhereY));
  878.  
  879.               END;
  880.  
  881.               ResetCmd;
  882.  
  883.             END;
  884.  
  885.           'B' :     { Down Row }
  886.  
  887.             BEGIN
  888.  
  889.               If ANSINextParam(Cmd) = 3 Then
  890.                 L1 := ANSITakeInt(Cmd)
  891.               Else
  892.                 L1 := 1;
  893.               For L2 := 1 to L1 Do
  894.               BEGIN
  895.  
  896.                 L3 := WhereY;
  897.                 Inc(L3, Hi(WindMin));
  898.  
  899.                 If ( L3 < Hi(WindMax) ) Then
  900.                   GotoXY(WhereX, Succ(WhereY));
  901.  
  902.               END;
  903.  
  904.               ResetCmd;
  905.  
  906.             END;
  907.  
  908.           'C' :     { Right Col }
  909.  
  910.             BEGIN
  911.  
  912.               If ANSINextParam(Cmd) = 3 Then
  913.                 L1 := ANSITakeInt(Cmd)
  914.               Else
  915.                 L1 := 1;
  916.               For L2 := 1 to L1 Do
  917.               BEGIN
  918.  
  919.                 L3 := WhereX;
  920.                 Inc(L3, Lo(WindMin));
  921.  
  922.                 If ( L3 < Lo(WindMax) ) Then
  923.                   GotoXY(Succ(WhereX), WhereY);
  924.  
  925.               END;
  926.  
  927.               ResetCmd;
  928.  
  929.             END;
  930.  
  931.           'D' :     { Left Col }
  932.  
  933.             BEGIN
  934.  
  935.               If ANSINextParam(Cmd) = 3 Then
  936.                 L1 := ANSITakeInt(Cmd)
  937.               Else
  938.                 L1 := 1;
  939.               For L2 := 1 to L1 Do
  940.               BEGIN
  941.  
  942.                 L3 := WhereX;
  943.                 Inc(L3, Lo(WindMin));
  944.  
  945.                 If ( L3 > Lo(WindMin) ) Then
  946.                   GotoXY(Pred(WhereX), WhereY);
  947.  
  948.               END;
  949.  
  950.               ResetCmd;
  951.  
  952.             END;
  953.  
  954.           'H',      { Home/GotoRC }
  955.           'f' :
  956.  
  957.             BEGIN
  958.  
  959.               With ANSIEmu Do
  960.               BEGIN
  961.  
  962.                 X := Succ(Lo(WindMin));
  963.                 Y := Succ(Hi(WindMin));
  964.  
  965.                 If ANSINextParam(Cmd) = 3 Then
  966.                   Inc( Y, Pred(ANSITakeInt(Cmd)) );
  967.                 If ANSINextParam(Cmd) = 3 Then
  968.                   Inc( X, Pred(ANSITakeInt(Cmd)) );
  969.  
  970.                 GotoXY( LesserInt(X, Succ(Lo(WindMax))),
  971.                         LesserInt(Y, Succ(Hi(WindMax))) );
  972.  
  973.               END;
  974.  
  975.               ResetCmd;
  976.  
  977.             END;
  978.  
  979.           's' :     { Save Cursor Position }
  980.  
  981.             BEGIN
  982.  
  983.               ANSIEmu.SaveX := WhereX;
  984.               ANSIEmu.SaveY := WhereY;
  985.  
  986.               ResetCmd;
  987.  
  988.             END;
  989.  
  990.           'u' :     { Restore Cursor Position }
  991.  
  992.             BEGIN
  993.  
  994.               If (ANSIEmu.SaveX > 0) and
  995.                  (ANSIEmu.SaveY > 0) Then
  996.                 GotoXY(ANSIEmu.SaveX, ANSIEmu.SaveY);
  997.  
  998.               ResetCmd;
  999.  
  1000.             END;
  1001.  
  1002.           'm' :     { Graphics }
  1003.  
  1004.             BEGIN
  1005.  
  1006.               While ( ANSINextParam(Cmd) = 3 ) Do
  1007.               BEGIN
  1008.  
  1009.                 With ANSIEmu Do
  1010.                 BEGIN
  1011.  
  1012.                   L3 := ANSITakeInt(Cmd);
  1013.  
  1014.                   Case L3 of
  1015.  
  1016.                     0  :   { Attrs OFF }
  1017.                       BEGIN
  1018.  
  1019.                         AttrBold := 0;
  1020.                         TextAttr := 7;
  1021.  
  1022.                       END;
  1023.  
  1024.                     1  :   { Bold ON }
  1025.                       BEGIN
  1026.  
  1027.                         AttrBold := 8;
  1028.                         TextAttr := TextAttr OR $8;
  1029.  
  1030.                       END;
  1031.  
  1032.                     5  : TextAttr := TextAttr OR $80;  { Blink ON }
  1033.                     7  : TextAttr := TextAttr XOR $FF; { Rev. Video ON }
  1034.                     22 : AttrBold := 0; { Bold OFF }
  1035.                     25 : TextAttr := TextAttr AND NOT $80; { Blink OFF }
  1036.                     27 : TextAttr := TextAttr XOR $FF; { Rev. Video OFF }
  1037.                     30 : TextColor(Black + AttrBold);
  1038.                     31 : TextColor(Red + AttrBold);
  1039.                     32 : TextColor(Green + AttrBold);
  1040.                     33 : TextColor(Brown + AttrBold);
  1041.                     34 : TextColor(Blue + AttrBold);
  1042.                     35 : TextColor(Magenta + AttrBold);
  1043.                     36 : TextColor(Cyan + AttrBold);
  1044.                     37 : TextColor(LightGray + AttrBold);
  1045.                     40 : TextBackGround(Black);
  1046.                     41 : TextBackGround(Red);
  1047.                     42 : TextBackGround(Green);
  1048.                     43 : TextBackGround(Brown);
  1049.                     44 : TextBackGround(Blue);
  1050.                     45 : TextBackGround(Magenta);
  1051.                     46 : TextBackGround(Cyan);
  1052.                     47 : TextBackGround(LightGray);
  1053.  
  1054.                   End;
  1055.  
  1056.                 END;
  1057.  
  1058.               END;
  1059.  
  1060.               ResetCmd;
  1061.  
  1062.             END;
  1063.  
  1064.           'J' :     { ClrScr }
  1065.  
  1066.             BEGIN
  1067.  
  1068.               With ANSIEmu Do
  1069.               BEGIN
  1070.  
  1071.                 If ANSINextParam(Cmd) = 3 Then
  1072.                   L3 := ANSITakeInt(Cmd)
  1073.                 Else
  1074.                 BEGIN  { ClrScr >= }
  1075.  
  1076.                   X  := WhereX;
  1077.                   Y  := WhereY;
  1078.                   L1 := X;
  1079.                   L2 := Y;
  1080.  
  1081.                   While ( L2 <= Hi(WindMax)) Do
  1082.                   BEGIN
  1083.  
  1084.                     While (L1 <= Lo(WindMax)) Do
  1085.                     BEGIN
  1086.  
  1087.                       Inc(L1);
  1088.                       Write(SP);
  1089.  
  1090.                     END;
  1091.  
  1092.                     Inc(L2);
  1093.                     L1 := Lo(WindMin);
  1094.                     GotoXY(L1, L2);
  1095.  
  1096.                   END;
  1097.  
  1098.                   GotoXY(X, Y);
  1099.  
  1100.                 END;
  1101.  
  1102.                 If L3 = 2 Then  { ClrScr }
  1103.                 BEGIN
  1104.  
  1105.                   ClrScr;
  1106.                   TextAttr := 7;
  1107.  
  1108.                 END
  1109.                 Else
  1110.                 If L3 = 1 Then  { ClrScr <= }
  1111.                 BEGIN
  1112.  
  1113.                   With ANSIEmu Do
  1114.                   BEGIN
  1115.  
  1116.                     X  := WhereX;
  1117.                     Y  := WhereY;
  1118.                     L1 := X;
  1119.                     L2 := Y;
  1120.  
  1121.                     GotoXY( Lo(WindMin), Hi(WindMin) );
  1122.                     While (WhereY < L2) Do
  1123.                     BEGIN
  1124.  
  1125.                       While ( WhereX < Lo(WindMax) ) Do
  1126.                       BEGIN
  1127.  
  1128.                         GotoXY(Succ(WhereX), WhereY);
  1129.                         Write(SP);
  1130.  
  1131.                       END;
  1132.  
  1133.                       GotoXY( Lo(WindMin), Succ(WhereY));
  1134.  
  1135.                     END;
  1136.  
  1137.                     While (WhereX <= L1) Do
  1138.                     BEGIN
  1139.  
  1140.                       GotoXY(Succ(WhereX), WhereY);
  1141.                       Write(SP);
  1142.  
  1143.                     END;
  1144.  
  1145.                     GotoXY(X, Y);
  1146.  
  1147.                   END;
  1148.  
  1149.                 END;
  1150.  
  1151.               END;
  1152.  
  1153.               ResetCmd;
  1154.  
  1155.             END;
  1156.  
  1157.           'K' :     { ClrEol }
  1158.  
  1159.             BEGIN
  1160.  
  1161.               ClrEol;
  1162.  
  1163.               ResetCmd;
  1164.  
  1165.             END;
  1166.  
  1167.           'L' :     { InsLine }
  1168.  
  1169.             BEGIN
  1170.  
  1171.               If ANSINextParam(Cmd) = 3 Then
  1172.                 L1 := ANSITakeInt(Cmd)
  1173.               Else
  1174.                 L1 := 1;
  1175.               For L2 := 1 to L1 Do
  1176.                 InsLine;
  1177.  
  1178.               ResetCmd;
  1179.  
  1180.             END;
  1181.  
  1182.           'M' :     { DelLine }
  1183.  
  1184.             BEGIN
  1185.  
  1186.               If ANSINextParam(Cmd) = 3 Then
  1187.                 L1 := ANSITakeInt(Cmd)
  1188.               Else
  1189.                 L1 := 1;
  1190.               For L2 := 1 to L1 Do
  1191.                 DelLine;
  1192.  
  1193.               ResetCmd;
  1194.  
  1195.             END;
  1196.  
  1197.           'n' :     { Device Status Report }
  1198.  
  1199.             BEGIN
  1200.  
  1201.               If ANSINextParam(Cmd) = 3 Then
  1202.                 L1 := ANSITakeInt(Cmd)
  1203.               Else
  1204.                 L1 := 1;
  1205.  
  1206.               If L1 = 6 Then
  1207.                 Write('[' + IntToStr(WhereY) + ';' + IntToStr(WhereX) + 'R');
  1208.  
  1209.               ResetCmd;
  1210.  
  1211.             END;
  1212.  
  1213.           '@' :     { Inserts Characters on Line }
  1214.  
  1215.             BEGIN
  1216.  
  1217.               If ANSINextParam(Cmd) = 3 Then
  1218.                 L1 := ANSITakeInt(Cmd)
  1219.               Else
  1220.                 L1 := 1;
  1221.               For L2 := 1 to L1 Do
  1222.               BEGIN
  1223.  
  1224.               END;
  1225.  
  1226.               ResetCmd;
  1227.  
  1228.             END;
  1229.  
  1230.           'P' :     { Deletes Characters on Line }
  1231.  
  1232.             BEGIN
  1233.  
  1234.               If ANSINextParam(Cmd) = 3 Then
  1235.                 L1 := ANSITakeInt(Cmd)
  1236.               Else
  1237.                 L1 := 1;
  1238.               For L2 := 1 to L1 Do
  1239.               BEGIN
  1240.  
  1241.               END;
  1242.  
  1243.               ResetCmd;
  1244.  
  1245.             END;
  1246.  
  1247.           'h' :     { Set Graphic Modes }
  1248.  
  1249.             BEGIN
  1250.  
  1251.               If (ANSINextParam(Cmd) = 3) Then
  1252.               BEGIN
  1253.  
  1254.                 L3 := Byte(ANSITakeInt(Cmd));
  1255.  
  1256.                 ASM
  1257.  
  1258.                   MOV AH, 0
  1259.                   MOV AL, L3
  1260.                   INT 10h
  1261.  
  1262.                 END;
  1263.  
  1264.               END;
  1265.  
  1266.               ResetCmd;
  1267.  
  1268.             END;
  1269.  
  1270.           'l' :     { Reset Graphic Modes }
  1271.  
  1272.             BEGIN
  1273.  
  1274.               If (ANSINextParam(Cmd) = 3) Then
  1275.               BEGIN
  1276.  
  1277.                 L3 := Byte(ANSITakeInt(Cmd));
  1278.  
  1279.                 ASM
  1280.  
  1281.                   MOV AH, 0
  1282.                   MOV AL, L3
  1283.                   INT 10h
  1284.  
  1285.                 END;
  1286.  
  1287.               END;
  1288.  
  1289.               ResetCmd;
  1290.  
  1291.             END;
  1292.  
  1293.           'p' :     { Keyboard Redefination }
  1294.             BEGIN
  1295.  
  1296.               ResetCmd;
  1297.  
  1298.             END;
  1299.  
  1300.           '"' :     { inputing a string value }
  1301.             BEGIN
  1302.  
  1303.               StringMode := NOT StringMode;
  1304.               Cmd := Cmd + Ch;
  1305.  
  1306.             END;
  1307.  
  1308.           '?',
  1309.           '=' :
  1310.             Cmd := Cmd + Ch;
  1311.          Else
  1312.          BEGIN
  1313.  
  1314.            Write(Ch);
  1315.            ResetCmd;
  1316.  
  1317.          END
  1318.  
  1319.         End;{of case}
  1320.  
  1321.       END;
  1322.  
  1323.     END
  1324.     Else
  1325.     If Ch = #27 Then
  1326.       Cmd := Cmd + Ch
  1327.     Else
  1328.       Write(Ch);
  1329.  
  1330.   END;
  1331.  
  1332. END;
  1333. *)
  1334.  
  1335. {────────────────────────────────────────────────────────────────────────────}
  1336. {────────────────────────────────────────────────────────────────────────────}
  1337. {────────────────────────────────────────────────────────────────────────────}
  1338.  
  1339. BEGIN
  1340.  
  1341.   FillChar( ANSIEmu, SizeOf(TANSIEmu), 0 );
  1342.  
  1343. END.
  1344.