home *** CD-ROM | disk | FTP | other *** search
- Program ScrnPage;
-
- Const
- Cp = 255;
-
- Type
- Reg = Record
- AX,BX,CX,DX,DS,ES,FLAGS: Integer;
- end;
- AnyString = String[255];
- BkColor = Array[0..7] of Byte;
- TxColor = Array[0..7] of Byte;
-
- Var
- RegRec :Reg; (* GLOBAL RECORD OF 8088 REGISTERS *)
- TxtBk :BkColor; (* GLOBAL ARRAY OF SCREEN BACKGROUND COLORS *)
- TxtClr :TxColor; (* GLOBAL ARRAY OF SCREEN TEXT COLORS *)
-
- (*----------------------------- SET VIDEO MODE ------------------------------
-
- SET VIDEO MODE: CODE DESCRIPTION
- 0 :40 X 25 MONO
- 1 :40 X 25 COLOR
- 2 :80 X 25 MONO
- 3 :80 X 25 COLOR
- 4 :320 X 200 PIXEL COLOR
- 5 :320 X 200 PIXEL MONO
- 6 :640 X 200 PIXEL MONO
- 7 :80 X 25 MONO CARD ONLY
- *)
- Procedure SetVideoMod(M: Byte); (* SET VIDEO MODE 0-7. *)
- Type (* SETTING MODE TO MONO WITH A COLOR CARD *)
- Reg = Record (* MAY CAUSE YOUR COMPUTER TO LOCK UP. *)
- Ax,Bx,Cx,Dx,Bp,Si,Di,Ds,Es,Flags: Integer;
- end;
-
- Var
- RegRec: Reg;
- Ah,Al: Byte;
-
- begin
- Ah:=0; Al:=M;
- with RegRec do Ax:=Ah shl 8 + Al;
- Intr($10,RegRec);
- end;
-
- (*====================== END OF SET VIDEO MODE =============================*)
-
- (*------------------------- GET VIDEO MODE -----------------------------------
-
- TEST VIDEO MODE : CODE DESCRIPTION
- 0 :40 X 25 MONO
- 1 :40 X 25 COLOR
- 2 :80 X 25 MONO
- 3 :80 X 25 COLOR
- 4 :320 X 200 PIXEL COLOR
- 5 :320 X 200 PIXEL MONO
- 6 :640 X 200 PIXEL MONO
- 7 :80 X 25 MONO
- *)
-
- Function VideoMod: Byte;
- Type
- Reg = Record
- Ax,Bx,Cx,Dx,Bp,Si,Di,Ds,Es,Flags: Integer;
- end;
-
- Var
- RegRec: Reg;
- Ah,Al: Byte;
-
- begin
- AH:=15; AL:=0;
- with RegRec do Ax:=Ah shl 8 + Al;
- Intr($10,RegRec);
- with RegRec do VideoMod:=Lo(Ax);
- end;
-
- (*========================== END OF GET VIDEO MODE =========================*)
-
- Procedure Vid(AH,AL,BH,BL,CH,CL,DH,DL: Byte; DSeg,ESeg: Integer);
- begin (* A GENERAL PURPOSE VIDEO BIOS CALLING ROUTINE *)
- With RegRec do
- begin
- AX:=AH SHL 8 + AL;
- BX:=BH SHL 8 + BL;
- CX:=CH SHL 8 + CL;
- DX:=DH SHL 8 + DL;
- DS:=DSeg;
- ES:=ESeg;
- end;
- Intr($10,RegRec);
- end;
-
- Function Value(S: AnyString): integer; { RETURN THE INTEGER VALUE OF A STRING }
- var
- E,V: integer;
- label TryAgain;
- begin
- if length(S) > 5 then S:=copy(S,1,5);
- TryAgain: val(S,V,E);
- if (E <> 0)and(S <> '') then
- begin
- delete(S,E,1);
- goto TryAgain;
- end;
- Value:=V;
- end;
-
- Procedure TextBackGroundPg(Pg,Color: Byte);
- begin
- if (Color in[0..7])and(Pg in[0..7]) then TxtBk[Pg]:=Color;
- end;
-
- Procedure TextColorPg(Pg,Color: Byte);
- begin
- if (Color in[0..15])and(Pg in[0..7]) then TxtClr[Pg]:=Color;
- end;
-
- Function Att(Pg: Byte): Byte;
- Var
- Temp: Byte;
- begin
- Temp:=0;
- Temp:=Temp or TxtBk[Pg]; Temp:=Temp shl 4;
- Temp:=Temp or TxtClr[Pg];
- Att:=Temp;
- end;
-
- Function WhereYPg(Page: Byte): Byte; (* ROW *)
- begin
- Vid(3,0,Page,0,0,0,0,0,0,0);
- With RegRec do WhereYPg:=Hi(Dx)+1;
- end;
-
- Function WhereXPg(Page: Byte): Byte; (* COLUMN *)
- begin
- Vid(3,0,Page,0,0,0,0,0,0,0);
- With RegRec do WhereXPg:=Lo(Dx)+1;
- end;
-
- Procedure ScrollPg(UorD: Char; Ur,Uc,Lr,Lc,Page: Byte); (* SCROLL VIDEO PAGE *)
- Var (* ALSO USED TO INSERT AND DELETE A LINE *)
- AH,BH: Byte;
- begin
- BH:=Att(Page);
- if UorD = 'U' then AH:=6;
- if UorD = 'D' then AH:=7;
- Vid(AH,1,BH,0,Ur,Uc,Lr,Lc,0,0);
- end;
-
- Procedure InsLinePg(Pg: Byte); (* INSERT A LINE ON VIDEO PAGE *)
- Var
- R: Byte;
- begin
- R:=WhereYPg(Pg) - 1; (* SET TO CORRECT VALUE FOR SCROLL PAGE *)
- Case VideoMod of
- 0..1 : ScrollPg('D',R,0,24,39,Pg);
- 2..3 : ScrollPg('D',R,0,24,79,Pg);
- end; (* END CASE *)
- end;
-
- Procedure DelLinePg(Pg: Byte); (* DELETE A LINE ON VIDEO PAGE *)
- Var
- R: Byte;
- begin
- R:=WhereYPg(Pg) - 1;
- Case VideoMod of
- 0..1 : ScrollPg('U',R,0,24,39,Pg);
- 2..3 : ScrollPg('U',R,0,24,79,Pg);
- end; (* END CASE *)
- end;
-
- Procedure GotoXyPg(Col,Row,Pg: Byte); (* LOCATE THE CURSOR ON SELECTED PAGE *)
- begin
- Row:=Pred(Row); Col:=Pred(Col);
- Vid(2,0,Pg,0,0,0,Row,Col,0,0);
- end;
-
- Procedure ClrScrPg(Pg: Byte); (* CLEAR CURRENT ACTIVE A SCREEN PAGE *)
- Var
- BH,DH,DL: Byte;
- begin
- Case VideoMod of
- 0..1: begin
- DH:=24; DL:=39; (* CLEAR SCREEN IN FORTY COLUMN MODE *)
- end;
- 2..3: begin
- DH:=24; DL:=79; (* CLEAR SCREEN IN EIGHTY COLUMN MODE *)
- end;
- end; (* END CASE *)
- BH:=Att(Pg); (* SET ATTRIBUTE *)
- Vid(6,0,BH,0,0,0,DH,DL,0,0);
- GotoXyPg(1,1,Pg);
- end;
-
- Procedure SetVideoPage(Page: Byte); (* USES INTERRUPT # $10 *)
- Var
- AH,AL,BH,BL: Byte;
- begin
- if ((VideoMod in[0..1])and(Page in[0..7])) (* FORTY COLUMN MODE *)
- or
- ((VideoMod in[2..3])and(Page in[0..3])) then (* EIGHTY COLUMN MODE *)
- begin
- Vid(5,Page,0,0,0,0,0,0,0,0);
- end;
- end;
-
- Function ActPage:Byte; (* RETURNS THE ACTIVE SCREEN PAGE NUMBER *)
- Var (* SOME PROGRAMS SUCH AS SIDE-KICK (tm) CHANGE THE *)
- Pg: Byte; (* ACTIVE PAGE, USUALLY PAGE #0 *)
- begin
- Vid(15,0,0,0,0,0,0,0,0,0);
- With RegRec do Pg:=Hi(BX);
- ActPage:=Pg;
- end;
-
- Procedure WritePage(Pg,Cnt: Byte;Ch: Char); (* USES INTERRUPT # $10 *)
- (* PAGE NUMBER, COUNT, ATTRIBUTE, AND CHARCTER *)
- Var
- AL,BL: Byte;
- Begin
- AL:=ord(Ch); (* AL = ASCII VALUE OF Ch *)
- BL:=Att(Pg); (* BL = SCREEN ATTRIBUTE *)
- Vid(9,AL,Pg,BL,0,Cnt,0,0,0,0);
- end;
-
-
- Procedure WritePg(Pg: Byte; AStr: AnyString); (* PRINT A STRING *)
- Var
- I,R,C,MaxR,MaxC: Byte;
- begin
- MaxR:=25;
- if VideoMod in[0..1] then MaxC:=40;
- if VideoMod in[2..3] then MaxC:=80;
- R:=WhereYPg(Pg); C:=WhereXPg(Pg);
- For I:= 1 to Length(AStr) do
- begin
- WritePage(Pg,1,AStr[I]);
- if C < MaxC then C:=Succ(C)
- Else
- begin
- C:=1;
- if R = MaxR then
- begin
- if VideoMod in[0..1] then ScrollPg('U',0,0,24,39,Pg);
- if VideoMod in[2..3] then ScrollPg('U',0,0,24,79,Pg);
- end;
- if R < MaxR then R:=Succ(R);
- end;
- GotoXyPg(C,R,Pg);
- end;
- end;
-
- Procedure WriteLnPg(Pg: Byte; AStr: AnyString); (* PRINT A STRING *)
- Var
- I,R,C,Sz,MaxR,MaxC: Byte;
- begin
- MaxR:=25;
- if VideoMod in[0..1] then MaxC:=40;
- if VideoMod in[2..3] then MaxC:=80;
- R:=WhereYPg(Pg); C:=WhereXPg(Pg);
- For I:= 1 to Length(AStr) do
- begin
- WritePage(Pg,1,AStr[I]);
- if C < MaxC then C:=Succ(C)
- Else
- begin
- C:=1;
- if R = MaxR then
- begin
- if VideoMod < 2 then Sz:=39;
- if VideoMod in[2..3] then Sz:=79;
- if VideoMod > 3 then Exit;
- ScrollPg('U',0,0,24,Sz,Pg);
- end;
- if R < MaxR then R:=Succ(R);
- end;
- GotoXyPg(C,R,Pg);
- end;
- if R = MaxR then
- begin
- if VideoMod in[0..1] then Sz:=39;
- if VideoMod in[2..3] then Sz:=79;
- if VideoMod > 3 then Exit;
- ScrollPg('U',0,0,24,Sz,Pg);
- end;
- if R < MaxR then R:=Succ(R);
- C:=1;
- GotoXyPg(C,R,Pg);
- end;
-
- Procedure ClrEolPg(Page: Byte); (* CLEAR TO END OF LINE *)
- Var
- I,R,C: Byte;
- begin
- R:=WhereYPg(Page); C:=WhereXPg(Page);
- Case VideoMod of
- 0..1 : WritePage(Page,(41-C),' ');
- 2..3 : WritePage(Page,(81-C),' ');
- end; (* END CASE *)
- GotoXyPg(C,R,Page);
- end;
-
- Function ReadString(Pg,Len,NS: Byte): AnyString; (* MAX 80 CHARACTERS *)
- Var
- R,C: Byte;
- Ch: Char;
- TempStr: AnyString;
- Begin
- R:=WhereYPg(Pg); C:=WhereXPg(Pg); TempStr:=''; Ch:=Chr(0);
- Repeat
- Read(kbd,Ch);
- Case NS of
- 1 : if (Ch in['0'..'9','.','+','-'])and(Length(TempStr)<Len)
- then TempStr:=TempStr + Ch;
- 0 : if (Ch in[' '..'~'])and(Length(TempStr)<Len)
- then TempStr:=TempStr + Ch;
- end; (* END CASE *)
- if (Ch=Chr(8))and(Length(TempStr)>0) then
- begin
- Delete(TempStr,Length(TempStr),1);
- GotoXyPg(C,R,Pg);
- ClrEolPg(Pg);
- end;
- if (Length(TempStr)=Len)and(Ch<>Chr(13)) then Write(^G);
- GotoXyPg(C,R,Pg);
- WritePg(Pg,TempStr);
- Until (Ch = Chr(13));
- ReadString:=TempStr;
- end;
-
- (*----------------------- BEGIN MAIN CALLING LOOP --------------------------*)
-
- Var
- AStr,TStr :String[255];
- ScrnPage :Byte;
- I :Byte;
- Ch,Mh :Char;
-
- begin
- ScrnPage:=0;
- TStr:='';
- Repeat
- TextBackGroundPg(ScrnPage,7); TextColorPg(ScrnPage,0);
- if ActPage <> ScrnPage then SetVideoPage(ScrnPage);
- GotoXyPg(1,5,ScrnPage);
- WriteLnPg(ScrnPage,' Key Function ');
- WriteLnPg(ScrnPage,' ----- ---------------- ');
- WriteLnPg(ScrnPage,' - Previous Screen ');
- WriteLnPg(ScrnPage,' + Next Screen ');
- WriteLnPg(ScrnPage,' C Clear Screen ');
- WriteLnPg(ScrnPage,' D Delete Line ');
- WriteLnPg(ScrnPage,' E Enter Text ');
- WriteLnPg(ScrnPage,' I Insert Line ');
- WriteLnPg(ScrnPage,' V Set Video Mode ');
- WriteLnPg(ScrnPage,' <ESC> End Program ');
- Read(kbd,Ch); Ch:=UpCase(Ch);
- if ActPage <> ScrnPage then SetVideoPage(ScrnPage);
- Case VideoMod of
- 0..1: begin
- Case Ch of
- '-': if ScrnPage>0 then ScrnPage:=Pred(ScrnPage);
- '+': if ScrnPage<7 then ScrnPage:=Succ(ScrnPage);
- end;
- end;
- 2..3: begin
- Case Ch of
- '-': if ScrnPage>0 then ScrnPage:=Pred(ScrnPage);
- '+': if ScrnPage<3 then ScrnPage:=Succ(ScrnPage);
- end;
- end;
- end; { CASE VIDEOMOD }
- TextBackGroundPg(ScrnPage,0); TextColorPg(ScrnPage,15);
- Case Ch of
- 'E': begin
- WriteLnPg(ScrnPage,'Enter a string of text? ');
- TStr:=ReadString(ScrnPage,20,0);
- GotoXyPg(1,1,ScrnPage);
- for I:= 1 to 100 do WritePg(ScrnPage,' <> '+TStr);
- end;
- 'C': ClrScrPg(ScrnPage);
- 'V': begin
- GotoXyPg(1,25,ScrnPage); ClrEolPg(ScrnPage);
- WriteLnPg(ScrnPage,'F)orty or E)ighty column mode? ');
- Repeat
- Read(kbd,Mh); Mh:=UpCase(Mh);
- Until Mh in['F','E'];
- Case Mh of
- 'F' : SetVideoMod(1);
- 'E' : SetVideoMod(2);
- end; (* END CASE *)
- GotoXyPg(1,25,ScrnPage); ClrEolPg(ScrnPage);
- end;
- 'I': InsLinePg(ScrnPage);
- 'D': DelLinePg(ScrnPage);
- end;
- GotoXyPg(1,25,ScrnPage); ClrEolPg(ScrnPage);
- Str(ScrnPage:1,AStr);
- WritePg(ScrnPage,AStr);
- WritePg(ScrnPage,' <<< Page Number.');
- Until Ch = Chr(27);
- SetVideoMod(3);
- SetVideoPage(0);
- end.