{$TITLE:'Epson MX-100 TabSet Procedure',$PAGESIZE:57,$LINESIZE:132,$LINE+}

{This program is another version of the preceding program; this version
 shows how the same functions can be done by accessing the printer as
 as a binary file with PUTs.}

PROGRAM TabTest (Input,Output);

VAR
  I, Col, Count: INTEGER;
  Flag: BOOLEAN;
  Answer: CHAR;
  Tabs: ARRAY[1..132] OF BOOLEAN;
  Printer: FILE OF CHAR;

PROCEDURE TabSet (TabCol: INTEGER; VerifyFlag: BOOLEAN);

CONST
  Escape = CHR(27);
  CarRet = CHR(13);
  LineFeed = CHR(10);
  HorTab = CHR(9);
  NullChar = CHR(0);
     
BEGIN

  IF TabCol < 0 THEN
    BEGIN
      Count:= 0;
      FOR I:= 1 TO 132 DO
        Tabs[I]:= FALSE
    END
  
  ELSE IF (TabCol >= 1) AND (TabCol <= 132) AND (Count < 12) THEN
    BEGIN
      Count:= Count+1;
      Tabs[TabCol]:= TRUE
    END

  ELSE IF TabCol = 0 THEN
    BEGIN
      ASSIGN (Printer,'LPT1:'); { Open print file }
      Printer.Mode:= TERMINAL;
      REWRITE (Printer);
      Printer^:= Escape; { Send Escape D }
      PUT (Printer);
      Printer^:= 'D';
      PUT (Printer);
      FOR I:= 2 TO 132 DO { Send column numbers for tab settings }
        IF Tabs[I] THEN
          BEGIN
            Printer^:= CHR(I-1);
            PUT (Printer)
          END;
      Printer^:= NullChar; { Send null to terminate sequence }
      PUT (Printer);
            
      IF VerifyFlag = TRUE THEN
        BEGIN
          Printer^:= '-';
          PUT (Printer);
          FOR I:=2 TO 132 DO
            BEGIN
              IF Tabs[I] THEN 
                Printer^:= '+'
              ELSE
                Printer^:= '-';
              PUT (Printer)
            END;
          Printer^:= CarRet;
          PUT (Printer);
          Printer^:= LineFeed;
          PUT (Printer);
          FOR I:= 1 TO Count DO
            BEGIN
              Printer^:= HorTab;
              PUT (Printer);
              Printer^:= '+';
              PUT (Printer)
            END;
          Printer^:= CarRet;
          PUT (Printer);
          Printer^:= LineFeed;
          PUT (Printer)
        END;
      CLOSE (Printer)
    END;
END;
  
BEGIN
  WRITE ('Will You Want To Display Tab Settings (Y/N)? ');
  READLN (Answer);
  IF (Answer='Y') OR (Answer='y') THEN
    BEGIN
      Flag:= TRUE;
      WRITELN ('Tab Settings Will Be Displayed . . .')
    END
  ELSE
    BEGIN
      Flag:= FALSE;
      WRITELN ('Tab Settings Will Not Be Displayed . . .')
    END;
  TabSet (-1,Flag);
  WRITELN;
  WRITELN ('Enter Up To Ten Tabs, Each On A Separate Line.');
  WRITELN ('Enter A "0" To Stop Column Prompts . . .');
  WRITELN;
  REPEAT
    READLN (Col);
    TabSet (Col,Flag);
    IF Col <>0
      THEN WRITELN ('A Tab Will Be Set in Column ', Col:1)
      ELSE WRITELN ('Tab Setting Completed.')
  UNTIL Col=0
END.