[Back to TEXTFILE SWAG index] [Back to Main SWAG index] [Original]

    {
    After much trial and error, and finding some helpful code from the SWAG
    support team (thanks!) this is what I came up with.  It can handle text
    files up to 750,000 bytes and does basically what I'm looking for, but
    the scrolling isn't as smooth as it should be.  Also, the lines of
    text are limited to 79 characters...  (The source code can probably be
    streamlined a lot too, like I said, I'm fairly new at this...)
    }

     Program Reader;

     uses Crt, Dos;

    {$R-,S- }

    Procedure GetFileMode; Assembler;

    Asm
               CLC
               CMP    ES:[DI].TextRec.Mode, fmInput
               JE     @1
               MOV    [InOutRes], 104         { 'File not opened For reading' }
               xor    AX, AX                  { Zero out Function result }
               xor    DX, DX
               STC
    @1:
    end;  { GetFileMode }

    Function TextFilePos(Var f : Text) : LongInt; Assembler;

    Asm
            LES    DI, f
            CALL   GetFileMode
            JC     @1

            xor    CX, CX                  { Get position of File Pointer }
            xor    DX, DX
            MOV    BX, ES:[DI].TextRec.handle
            MOV    AX, 4201h
            inT    21h                     { offset := offset-Bufend+BufPos }
                                    xor    BX, BX
            SUB    AX, ES:[DI].TextRec.Bufend
            SBB    DX, BX
            ADD    AX, ES:[DI].TextRec.BufPos
            ADC    DX, BX
    @1:
    end;  { TextFilePos }

    Function TextFileSize(Var f : Text) : LongInt; Assembler;

    Asm
                LES    DI, f
                CALL   GetFileMode
                JC     @1

                xor    CX, CX                  { Get position of File Pointer }
        xor    DX, DX
        MOV    BX, ES:[DI].TextRec.handle
        MOV    AX, 4201h
                inT    21h
        PUSH   DX                      { Save current offset on the stack }
                PUSH   AX
        xor    DX, DX                  { Move File Pointer to Eof }
        MOV    AX, 4202h
        inT    21h
        POP    SI
        POP    CX
                PUSH   DX                      { Save Eof position }
        PUSH   AX
        MOV    DX, SI                  { Restore old offset }
        MOV    AX, 4200h
        inT    21h
        POP    AX                      { Return result}
        POP    DX
    @1:
    end;  { TextFileSize }

    Procedure TextSeek(Var f : Text; n : LongInt); Assembler;

    Asm
        LES    DI, f
              CALL   GetFileMode
        JC     @2

        MOV    CX, Word Ptr n+2        { Move File Pointer }
        MOV    DX, Word Ptr n
        MOV    BX, ES:[DI].TextRec.Handle
              MOV    AX, 4200h
              inT    21h
              JNC    @1                      { Carry flag = reading past Eof }
              MOV    [InOutRes], AX
              JMP    @2

                               { Force read next time }
    @1:  MOV    AX, ES:[DI].TextRec.Bufend
                           MOV    ES:[DI].TextRec.BufPos, AX
    @2:
    end;  { TextSeek }
        {end TextUtil }

      Procedure HideCursor;  assembler;
      asm
        mov      ah,$01  { Function number }
        mov      ch,$20
        mov      cl,$00
        Int      $10     { Call BIOS }
      end;  { HideCursor }

      Procedure RestoreCursor;  assembler;
      asm
        mov      ah,$01  { Function number }
        mov      ch,$06  { Starting scan line }
        mov      cl,$07  { Ending scan line }
        int      $10     { Call BIOS }
      end; { RestoreCursor }

     Var
         TxtFile : text;
         s : string[79];
         Cee : CHAR;

     Label RWLoop, Final, FileSizeError, WrongKey, NoParamError;

     Var
        Size : Longint;
        YY, GG, Counter : LongInt;
        LineNumArray : Array[0..15000] Of LongInt;
        MyText : Array[0..23] Of String[79];
        InstructStr : String[79];
        OrigColor, ColorSwitch : Integer;
        LineNo : String[5];
     Begin
       OrigColor := TextAttr;
       TextColor(11);
       TextBackground(1);
       InstructStr := 'Scroll (^) up - (v) down - (Page up/down) - (Home) - (End) - (ESC) Quit';
       If ParamStr(1) = '' Then GoTo NoParamError;
       Assign(TxtFile, ParamStr(1)); {'TEXTFILE.DOC';}
       Reset(TxtFile);
       Counter := -1;
       ClrScr;
       HideCursor;
       If (TextFileSize(TxtFile)) >= 750000 Then GoTo FileSizeError;
       While Not EOF(TxtFile) Do
         Begin
           Inc(Counter,1);
           LineNumArray[Counter] := TextFilePos(TxtFile);
           ReadLn(TxtFile);
         End;
       Inc(Counter,1);
       YY:=0;

       RWLoop:
         For GG:=0+YY TO 23+YY DO
           Begin
             TextSeek(TxtFile,LineNumArray[GG]);
             ReadLn(TxtFile,S);
             MyText[GG-YY]:=S;
           End;
         GoToXY(1,1);
         ColorSwitch := TextAttr;
         Str(yy+23:5,LineNo);

         Repeat Until Port[$3DA] And 8 = 8; { Wait For Vertical retrace }

         For GG:=0 TO 23 DO
           Begin
             ClrEOL;
             WriteLn(MyText[GG]);
           End;
         GoToXY(2,25);
         TextColor(14);
         Write(LineNo);
         GoToXY(8,25);
         TextColor(15);
         Write(InstructStr);
         TextAttr:=ColorSwitch;

         Delay(1);
       WrongKey:
         Repeat
         Until KeyPressed;
         Cee := ReadKey;

         If Cee=Chr(27) Then GoTo Final
         Else If Cee=Chr(72) Then   {UP ARROW}
           Begin
             If YY>0 Then Dec(YY,1);
             GoTo RWLoop;
           End
         Else If Cee=Chr(80) Then  {DOWN ARROW}
           Begin
             Inc(YY,1);
             If YY>=Counter-23 Then YY:= Counter-24;
             GoTo RWLoop;
           End
         Else If Cee=Chr(73) Then {PAGE UP}
           Begin
             YY:=YY-24;
             If YY<1 Then YY:=0;
             GoTo RWLoop;
           End
         Else If Cee=Chr(81) Then {PAGEDOWN}
           Begin
             YY:= YY+24;
             If YY>=Counter-23 Then YY:= Counter-24;
             GoTo RWLoop;
           End
         Else If Cee=Chr(71) Then  {HOME}
           Begin
             YY:=0;
             GoTo RWLoop;
           End
         Else If Cee=Chr(79) Then  {End}
           Begin
             YY:= Counter-24;
             GoTo RWLoop;
           End;

       GoTo WrongKey;

      FileSizeError:
        WriteLn;
        WriteLn('ERROR...');
        WriteLn;
        WriteLn('File Size Larger Than 750,000');
        GoTo Final;

      NoParamError:
        WriteLn;
        WriteLn('ERROR...');
        WriteLn;
        WriteLn('Command line syntax is Reader C:\TextFile.txt');
        GoTo Final;

      Final:
        Close(TxtFile);
        TextAttr := OrigColor;
        RestoreCursor;
        ClrScr;
     End.

[Back to TEXTFILE SWAG index] [Back to Main SWAG index] [Original]