C.Ю.Соловьев

Методические материалы
по курсу
"Алгоритмы и алгоритмические языки"

Программа курса  >>  Пример "большой" программы  >>  Модуль OKHO_FMS

(* OKHO_FMS использует: TYPE_FMS  *)
(*                      UNIF_FMS  *)

{$A+,B-,D-,E+,F-,G-,I+,L+,N-,O-,R+,S+,V+,X-}
{$M 16384,0,655360}
Unit OKHO_FMS;          INTERFACE

Uses CRT, UNIF_FMS, TYPE_FMS;

TYPE    Todul = array [1..5] of String[5];

CONST   Podul:Todul = ('+++++',
                       '| | |',
                       '+++++',
                       '| | |',
                       '+++++');
        Wodul:Todul = ('+-+-+',
                       '| | |',
                       '+-+-+',
                       '| | |',
                       '+-+-+');

        TheSCR:byte = 0;  { Текущий номер видео страницы - см. PgSCR }

TYPE    EltSCR =  record txt : char; att : byte end;
        LinSCR =  array [1.. 80] of EltSCR;
        TypSCR =  array [1.. 25] of LinSCR;
        Alfa   =  String[80];

VAR        SCR : TypSCR  absolute $B800:$0000;
        AltSCR : TypSCR  absolute $B900:$0000;
        LinWRK : LinSCR;

procedure PgSCR(Pg : byte);

procedure    EmpWin(XH,YH,XK,YK : integer; A : integer);

procedure    LineOn(    L : integer                       );
procedure       ICH(    L : integer; C : char; A : integer);
procedure       ISC(  X,Y : integer; C : char; A : integer);
procedure In_LinWRK(var L : integer; S : alfa; A : integer);
procedure On_LinWRK(    L : integer; S : alfa; A : integer);
procedure Em_LinWRK(                       H,K,A : integer);

procedure OnScrXYA(X,Y,A : integer; S : String);
procedure OnScrCYA(Y,A   : integer; S : String);

procedure Line_25(S : String);

                        IMPLEMENTATION

{ PgSCR : Pg = 0 | 1 | .... - номер видимой страницы }

procedure PgSCR(Pg : byte);
begin   if Pg = TheSCR then Exit;
        TheSCR:=Pg;
        asm MOV AL, Pg
            MOV AH, 5
            INT $10
        end                  end;

procedure EmpWin(XH,YH,XK,YK : integer; A : integer);
   var I,J : integer;
         E : EltScr;
begin   E.txt:=' ';
        E.att:=A;
        for J:=XH to XK do if (1 <= J) and (J <= 80) then
        for I:=YH to YK do if (1 <= I) and (I <= 25) then SCR[I,J]:=E end;

procedure LineOn(L : integer);
   var LinFSC : LinSCR;
          H,K : integer;
   function NEQ(N : integer) : boolean;
   begin    NEQ:=(LinFSC[N].att <> LinWRK[N].att) or
                 (LinFSC[N].txt <> LinWRK[N].txt)
   end;
begin   LinFSC:=SCR[L];
        for H:=1      to 80 do if NEQ(H) then
        for K:=80 downto  H do if NEQ(K) then begin
           Move(LinWRK[H],SCR[L,H],2*(K-H+1));
           Exit
        end                                     end;

procedure ISC(X,Y : integer; C : char; A : integer);
begin   SCR[Y,X].txt:=C;
        SCR[Y,X].att:=A                         end;

procedure ICH(L : integer; C : char; A : integer);
begin   if  L < 1 then Exit;
        if 80 < L then Exit;
        LinWRK[L].txt:=C;
        LinWRK[L].att:=A                      end;

procedure In_LinWRK(var L : integer; S : alfa; A : integer);
   var I : integer;
begin   for I:=1 to Length(S) do begin
           L:=L+1;
           ICH(L,S[I],A)
        end                                             end;

procedure On_LinWRK(L : integer; S : alfa; A : integer);
begin     In_LinWRK(L,S,A)                          end;

procedure Em_LinWRK(H,K,A : integer);
   var I : integer;
begin   for I:=H to K do ICH(I,' ',A) end;

procedure OnScrXYA(X,Y,A : integer; S : String);
   var I : integer;
begin   X:=X-1;
        if (1 <= Y) and (Y <= 25) then
        for I:=X+1 to X+Length(S) do
        if (1 <= I) and (I <= 80) then ISC(I,Y,S[I-X],A)   end;

procedure OnScrCYA(Y,A : integer; S : String);
begin     ONScrXYA(41-Length(S) div 2,Y, A,S)      end;

procedure Line_25(S : String);
   const PLbar = $30;
   var L : integer;
       A : char;
begin   S:=Csps(6)+S;
        L:=-1;
        for A:='1' to '9' do begin
           In_LinWRK(L,       ' '+A        ,$07  );
           In_LinWRK(L,Copy(S,Pos(A,S)+1,6),PLbar)
        end;
        In_LinWRK(L,' 10'   ,  $07);
        In_LinWRK(L,'Выход ',PLbar);
        LineOn(25)                             end;

end.

Вопросы?