*/
Got something to write about? Check out our Article Builder.
*/

View \DDSCOTT.PAS

DDPLUS 7.1 Turbo Pascal 7.0 Door Kit

Submitted By: WEBMASTER
Rating: starstarstarstar (Rate It)


unit ddscott;

interface
uses dos,crt;
type
 adaptertype= (MDA,CGA,EGAMono,EGAColor);
 datetype=string[6];
 screentype= array[1..4000] of byte;
 screenptr=^screentype;
var
 Tasker  : byte;
 screen: screenptr;
 x,y: integer;
 ch: char;
 DOS_Major,DOS_Minor,Os2Vers : Word;
 hexon,OS2OK,WinOK,WinNTOK,DVOK : Boolean;

function va(n: integer): string;
function wva(n: word): string;
function lva(n: longint): string;
function rva(n: real): string;
function stu(s: string): string;
function locase(c: char): char;
function stl(s: string): string;
function namestr(s: string): string;
function exist(file_name: string): boolean;
procedure delete_file(fn: string);
procedure setmode(modenumber: byte);
{ procedure set43lines; }
procedure set25lines;
function isega: boolean;
function queryadaptertype: adaptertype;
function determinepoints: integer;
procedure cursoron;
procedure cursoroff;
procedure cursorblock;
function screenaddress: word;
procedure savescreen;
procedure restorescreen;
function date: datetype;
function bitcheck(n: word; b: byte): boolean;
procedure setbit(var n: word; b: byte);
procedure resetbit(var n: word; b: byte);
function hex(i: byte): string;
procedure HexFilt(var s: string);
procedure HexToDec(var s: string);

implementation

function hex(i: byte): string;
const
 ss: string='0123456789ABCDEF';
var
 hibyte,lobyte: byte;
begin;
 hibyte:=i div 16;
 lobyte:=i-((i div 16)*16);
 hex:=ss[hibyte+1]+ss[lobyte+1];
end;

procedure HexFilt(var s: string);
var
 s2,s3: string;
 numst: string;
 r: real;
 a,b: integer;
 e: integer;
 d: longint;
 c: array[1..4] of byte absolute d;
begin;
 s:=s+#13;
 s2:='';
 numst:='';
 for a:=1 to length(S) do begin;
  if s[a] in ['0'..'9'] then numst:=numst+s[a] else begin;
   if (numst<>'') then begin;
    val(numst,r,b);
    str(r:0:0,s3);
    val(s3,r,b);
    e:=a-1;
    b:=0;
    repeat
     e:=e+1;
     if upcase(s[e])='H' then b:=1;
    until (s[e]=' ') or (e>=length(s)) or (s[e]=#13) or (s[e]=#10);
    if (r<2000000000) and (b=0) then begin;
     d:=trunc(r);
     numst:=hex(c[4])+hex(c[3])+hex(c[2])+hex(c[1]);
     while (length(numst)>0) and (numst[1]='0') do delete(numst,1,1);
     if (length(numst)=0) or (not (numst[1] in ['0'..'9'])) then numst:='0'+numst;
     numst:=numst+'h';
    end;
    s2:=s2+numst;
    numst:='';
   end;
   s2:=s2+s[a];
  end;
 end;
 delete(s2,length(s2),1);
 s:=s2;
end;

procedure HexToDec(var s: string);
const
 ss: string ='0123456789ABCDEF';
var
 d: longint;
 c: array[1..4] of byte absolute d;
begin;
 if length(s)=0 then exit;
 if upcase(s[length(s)])<>'H' then exit;
 if not (s[1] in ['0'..'9']) then exit;
 delete(s,length(s),1);
 if length(s)=0 then exit;
 while length(s)<8 do s:='0'+s;
 c[1]:=(pos(upcase(s[8]),ss)-1)+(pos(upcase(s[7]),ss)-1)*16;
 c[2]:=(pos(upcase(s[6]),ss)-1)+(pos(upcase(s[5]),ss)-1)*16;
 c[3]:=(pos(upcase(s[4]),ss)-1)+(pos(upcase(s[3]),ss)-1)*16;
 c[4]:=(pos(upcase(s[2]),ss)-1)+(pos(upcase(s[1]),ss)-1)*16;
 str(d,s);
end;

procedure delete_file(fn: string);
var
 f: file;
begin;
 assign(f,fn);
 erase(f);
end;

function va(n: integer): string;
var
 v: string;
begin;
 str(n,v);
 if hexon then hexfilt(v);
 va:=v;
end;

function wva(n: word): string;
var
 v: string;
begin;
 str(n,v);
 if hexon then hexfilt(v);
 wva:=v;
end;

function lva(n: longint): string;
var
 v: string;
begin;
 str(n,v);
 if hexon then hexfilt(v);
 lva:=v;
end;

function rva(n: real): string;
var
 v: string;
begin;
 str(n:0:0,v);
 if hexon then hexfilt(v);
 rva:=v;
end;

function stu(s: string): string;
var
 a: integer;
begin;
 for a:=1 to length(s) do s[a]:=upcase(s[a]);
 stu:=s;
end;

function locase(c: char): char;
begin;
 if (c>='A') and (c<='Z') then c:=chr(ord(c)+32);
 locase:=c;
end;

function stl(s: string): string;
var
 a: integer;
begin;
 for a:=1 to length(s) do s[a]:=locase(s[a]);
 stl:=s;
end;

Function exist(file_name: string): boolean;
var
 f: text;
 b: boolean;
begin;
 assign(f,file_name);
 {$I-} reset(f); {$I+}
 if ioresult<>0 then b:=false else b:=true;
 if b then close(f);
 exist:=b;
end;

function namestr(s: string): string;
var
 a: integer;
begin;
 s:=stl(s);
 if length(s)>2 then begin;
  s[1]:=upcase(s[1]);
  for a:=1 to length(s) do begin;
   if (s[a] in ['.',' ',',',':',';','-','_','(',')']) and (a+1<length(s)) then s[a+1]:=upcase(s[a+1]);
  end;
 end;
 namestr:=s;
end;

procedure setmode(modenumber: byte);
var
 regs: registers;
begin;
 regs.ah:=0;
 regs.al:=modenumber;
 intr($10,regs);
end;

procedure set25lines;
var
 regs: registers;
begin;
 regs.ax:=$1111;
 regs.bx:=0;
 intr($10,regs);
 mem[$40:$87]:=mem[$40:$87] or $01;
 regs.ax:=$100;
 regs.bx:=0;
 regs.cx:=$0C00;
 intr($10,regs);
end;

function isega: boolean;
var
 regs: registers;
begin;
 regs.ah:=$12;
 regs.bx:=$10;
 intr($10,regs);
 if regs.bx=$10 then isega:=false else isega:=true;
end;

function QueryAdapterType: Adaptertype;
var
 regs: registers;
 code: byte;
begin;
 if isega then begin;
  regs.ah:=$12;
  regs.bx:=$10;
  intr($10,regs);
  if (regs.bh=0) then queryadaptertype:=egacolor else queryadaptertype:=egamono;
 end else begin;
  intr($11,regs);
  code:=(regs.al and $30) shr 4;
  case code of
   1: queryadaptertype:=cga;
   2: queryadaptertype:=cga;
   3: queryadaptertype:=mda;
  else queryadaptertype:=cga;
  end;
 end;
end;

procedure cursoroff;
var
 regs: registers;
begin;
 regs.ax:=$0100;
 regs.cx:=$2000;
 intr($10,regs);
end;

function determinepoints: integer;
var
 regs: registers;
begin;
 case queryadaptertype of
  cga: determinepoints:=8;
  mda: determinepoints:=14;
  egamono, egacolor: begin;
                      regs.ax:=$1130;
                      regs.bx:=0;
                      intr($10,regs);
                      determinepoints:=regs.cx;
                     end;
 end;
end;

procedure cursoron;
var
 regs: registers;
begin;
 regs.ax:=$0100;
 regs.ch:=determinepoints-2;
 regs.cl:=determinepoints-1;
 intr($10,regs);
end;

procedure cursorblock;
var
 regs: registers;
begin;
 regs.ax:=$0100;
 regs.ch:=1;
 regs.cl:=determinepoints-1;
 intr($10,regs);
end;

function screenaddress: word;
begin;
 case queryadaptertype of
  cga: screenaddress:=$B800;
  mda: screenaddress:=$b000;
  egamono: screenaddress:=$b000;
  egacolor: screenaddress:=$b800;
 end;
end;

procedure savescreen;
var
 sc1: byte absolute $b000:0;
 sc2: byte absolute $b800:0;
begin;
 if screenaddress=$b000 then move(sc1,screen^,4000);
 if screenaddress=$b800 then move(sc2,screen^,4000);
 x:=wherex;
 y:=wherey;
end;

procedure restorescreen;
var
 sc1: byte absolute $b800:0;
 sc2: byte absolute $b000:0;
begin;
 if screenaddress=$b000 then move(screen^, sc2,4000);
 if screenaddress=$b800 then move(screen^, sc1,4000);
 gotoxy(x,y);
end;

function date: datetype;
var
 d,m,y,dow: word;
 s,s2: string[6];
begin;
 getdate(y,m,d,dow);
 y:=y-1900;
 s:=va(m);
 if length(s)=1 then s:='0'+s;
 s2:=va(d);
 if length(s2)=1 then s2:='0'+s2;
 s:=s+s2;
 s2:=va(y);
 if length(s2)=1 then s2:='0'+s2;
 s:=s+s2;
 date:=s;
end;

function bitcheck(n: word; b: byte): boolean;
var
 a,c: integer;
begin;
 a:=2;
 for c:=1 to b do a:=a*2;
 if (a and n)<>0 then bitcheck:=true else bitcheck:=false;
end;

procedure setbit(var n: word; b: byte);
var
 a,c: integer;
begin;
 a:=2;
 for c:=1 to b do a:=a*2;
 n:=(a or n);
end;

procedure resetbit(var n: word; b: byte);
var
 a,c: integer;
begin;
 a:=2;
 for c:=1 to b do a:=a*2;
 a:= not a;
 n:=(a and n);
end;

function TrueDosVer (var WinNtOK :boolean): Word;
var
 Regs: Registers;
Begin
  with Regs do
  begin
    Ax := $3306;
    MsDos(Regs);
    If Bx = $3205 then
      WinNtOK := true
    else
      WinNtOK := false;
    TrueDosVer := Bl;
  end;
end;

function DosVer(var Minor,OS2Ver : Word) : Word;
var
 Regs: Registers;
Begin
  OS2Ver := 0;
  with Regs do
  begin
    Ax := $3000;
    MsDos(Regs);
    DosVer := Al;
    Minor  := Ah;
    If Al = $0A then
      OS2Ver := 1
    else
    If Al = $14 then
      OS2Ver := 2;
  end;
end;

Function Win3_Check_On: boolean;
const
  Multplx_intr = $2F;
var
  Regs : registers;
begin
  With Regs do
  begin
    AX := $1600;
    Intr(Multplx_intr,regs);                { $00 no Win 2.x or 3.x      }
    if AL in [$00,$01,$80,$FF] then         { $01 Win/386 2.x running    }
      Win3_Check_On := false                { $80 obsolete XMS installed }
    else                                    { $FF Win/386 2.x running    }
      Win3_Check_On := true;
   end;
end;

Function DV_Check_On : boolean;
var
  Regs : registers;
begin
  DV_Check_On := false;
  With Regs do
  begin
    Ax := $2B01;
    Cx := $4445;
    Dx := $5351;
    Intr($21,Regs);
  end;
  If (Regs.AL = $FF) then
     DV_Check_On := false
  else
     DV_Check_On := true;
end;

Procedure FindTaskerType;  { Find what tasker if any is being used      }
var
 D5 : word;
begin
 D5 := 0;
 Tasker := 0;
 DVOK  := false;
 OS2OK := false;
 WinOK := false;
 WinNtOK := false;    { This could also be just plain old Dos 5.0+ }

 DOS_Major := DosVer(DOS_Minor,Os2Vers);
 If Os2Vers in [1,2] then
   Os2OK := true
 else
   DVOK := DV_Check_On;

 If (not DVOK) and (not Os2OK) then
  begin
    WinOK := Win3_Check_On;
    If Not WinOK then
      Case Dos_Major of
         5..9  : D5 := TrueDosVer(WinNtOK);
       end;
   end;

  If DVOK then
       Tasker := 1
  else
  If WinOK then
       Tasker := 2
  else
  If Os2OK then
       Tasker := 3
  else
  If WinNtOK then
      Tasker := 4
  else
  if D5 >= 5 then
      Tasker := 5;
end;

begin
 FindTaskerType;
 hexon:=false;
 new(screen);
end.

corner
© 1996-2008 CommunityHeaven LLC. All rights reserved. Reproduction in whole or in part, in any form or medium without express written permission is prohibited.
Violators of this policy may be subject to legal action. Please read our Terms Of Use and Privacy Statement for more information.
North American business development: Nicolai Wadstrom. Publisher: Lars Hagelin.