home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Simtel MSDOS 1992 December
/
simtel1292_SIMTEL_1292_Walnut_Creek.iso
/
msdos
/
info
/
mem3.arc
/
MEM.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1988-03-23
|
12KB
|
381 lines
Uses Crt, Dos;
{$M 10000,0,0} {$I-}
Type DumArr=Array[0..6] of Byte;
Const
HiInt :Word=$8000;
Clock :DumArr=($FC,$91,$74,$29,$2E,$FF,$2E);
ClkLoc :Word=$0120;
Pascal :DumArr=($32,$CE,$F6,$D1,$80,$E1,$80);
PasLoc :Word=$FFF0;
SupKey :DumArr=($E9,$57,$94,$34,$12,$43,$6F);
KeyLoc :Word=$0110;
Lightng:DumArr=($E9,$55,$83,$34,$12,$43,$6F);
LitLoc :Word=$0110;
PcTools:DumArr=($50,$43,$20,$54,$6F,$6F,$6C);
PCTLoc :Word=$15E9;
SideKik:DumArr=($E9,$E9,$03,$CD,$AB,$43,$6F);
SKLoc :Word=$0110;
Qega :DumArr=($E9,$05,$0E,$FE,$CA,$ED,$FE);
QEGLoc :Word=$0110;
Com3_3 :DumArr=($E9,$2D,$0D,$BA,$DA,$0A,$3D);
Com3_3L:Word=$0110;
DVUser :DumArr=($00,$55,$8B,$EC,$83,$C5,$06);
DVULoc :Word=$0110;
Cache :DumArr=($50,$43,$54,$4F,$4F,$4C,$53);
CacLoc :Word=$0113;
Hercul :DumArr=($00,$F0,$02,$35,$2D,$2E,$07);
HercLoc:Word=$0118;
DVAnsi :DumArr=($BE,$0A,$3B,$38,$13,$3B,$41);
AnsiLoc:Word=$0200;
PushD :DumArr=($50,$55,$53,$48,$44,$49,$52);
PushLoc:Word=$013C;
Var
Regs :Registers;
ForeGrn,BckGrn,OccCnt,FreCnt,SysMemX,SysMemY:Byte;
EnvSz,MCseg,Reported,HiY:Word;
FreSize,CurArena:Word;
CR :String[2];
PstEnv:Boolean;
Procedure Colors;
Var Z,X,Y,PrevVal,Fore,Back:Word; ReDir:Boolean;
Const MrkX=1; MrkY=25; MrkW=80; ModeSeg=$40; ModeOff=$49;
Begin
If Mem[ModeSeg:ModeOff]=7 then Z:=$B000 Else Z:=$B800;
PrevVal:=Mem[Z:(MrkY-1)*MrkW*2+(MrkX-1)]; X:=WhereX; Y:=WhereY;
GotoXY(MrkX,MrkY); Regs.AH:=2; Regs.DL:=$FF; MSDOS(Regs);
If (WhereX=MrkX) and (WhereY=MrkY) then Begin
DirectVideo:=False;
End Else Begin
If Mem[Z:(MrkY-1)*MrkW*2+(MrkX-1)]=$FF then
DirectVideo:=True
Else
DirectVideo:=False;
End;
GotoXY(X,Y); Mem[Z:(MrkY-1)*MrkW*2+(MrkX-1)]:=PrevVal;
Assign(Input,''); Reset(Input);
End;
Function RR(N:LongInt):Real;
Begin
RR:=N/1;
End;
Function HexW(N:Word):String; Forward;
Procedure SendAt(X,Y:Byte; S:String);
Begin
GotoXY(X,Y); Write(S);
End;
Procedure Frames;
Var T:Byte;
Begin
Window(1,1,80,25);
GotoXY(1,1); Write('╔══════════════════════════════════════╦═══════════════════════════════════════╗');
For T:=2 to 24 do Begin
GotoXY(1,T); Write('║'); GotoXY(40,T); Write('║');
GotoXY(80,T); Write('║');
End;
GotoXY(1,4); Write('╠══════════════════════════════════════╣');
GotoXY(40,3); Write('╠═══════════════════════════════════════╣');
End;
Procedure FindEnviron(S:String;var PSPS,PSPO:Word);
Var Count:Integer; Found:Boolean;
Begin
For Count:=1 to Length(S) do S[Count]:=UpCase(S[Count]);
S:=S+'=';
PSPO:=0; PSPS:=MemW[CSeg-$10:$2C];
Count:=1; Found:=False;
While (Count<=Length(S)) and (PSPO<32768) do Begin
If S[Count]<>Chr(Mem[PSPS:PSPO]) then Begin
Count:=1; While (PSPO<32768) and (Mem[PSPS:PSPO]<>0) do Inc(PSPO);
If (PSPO>=32768) then Found:=False Else Begin
Inc(PSPO); If Mem[PSPS:PSPO]=0 then Begin
PSPO:=$FFFF; Found:=False;
End;
End;
End Else Begin
Inc(Count); Inc(PSPO);
End;
End;
If Count>Length(S) then Found:=True Else Found:=False;
If Not Found then Begin
PSPS:=0; PSPO:=0;
End Else Begin
While (PSPO>0) and (Mem[PSPS:PSPO]<>0) do Dec(PSPO);
If Mem[PSPS:PSPO]=0 then Inc(PSPO);
End;
End;
Function GetEnviron(S:String):String;
Var Se,OOf:Word; St:String; T:Integer;
Begin
FindEnviron(S,Se,OOf);
If Se<>0 then Begin
St:=''; While (Mem[Se:OOf]<>Ord('=')) and (OOf<32768) do Inc(OOf);
Inc(OOf);
While (Mem[Se:OOf]<>0) and (OOf<32768) do Begin
St:=St+Chr(Mem[Se:OOf]); Inc(OOf);
End;
End Else St:='';
GetEnviron:=St;
End;
Function LstDrive:Char;
Var A:Char; S:String;
Begin
S:=GetEnviron('LastDrive'); If S='' then Begin
S:=ParamStr(1); If S='' then S:='Z' Else S:=S[1];
End;
LstDrive:=UpCase(S[1]);
End;
Function DoStr1(Num:LongInt;Y:Word):String;
Var S:String; X:Word;
Begin
Str(Num:0,S); X:=Length(S);
If X>9 then S:=Copy(S,1,X-9)+','+Copy(S,X-8,3)+','+Copy(S,X-6,3)+','+Copy(S,X-5,3)+','+Copy(S,X-2,30)
Else If X>6 then S:=Copy(S,1,X-6)+','+Copy(S,X-5,3)+','+Copy(S,X-2,30)
Else If X>3 then S:=Copy(S,1,X-3)+','+Copy(S,X-2,30);
While Length(S)<Y do S:=' '+S;
DoStr1:=S
End;
Function DoStr(Num:LongInt;Y:Word):String;
Var S:String; Start:Boolean; Fctr:Char; X:Byte;
Begin
Start:=True; Fctr:=#0; X:=Y;
While Start or (Length(S)>X) do Begin
If Start then Begin
Start:=False;
End Else Begin
Num:=Trunc(Num/1024+0.599999);
If Fctr='m' then Fctr:='g';
If Fctr='k' then Fctr:='m';
If Fctr=#0 then Fctr:='k';
X:=Y-1;
End;
S:=DoStr1(Num,X);
End;
If Fctr>#0 then S:=S+Fctr;
DoStr:=S;
End;
Function Hex(N:Byte):String;
Var X,T:Word; S,Numbers:String;
Begin
S:=''; Numbers:='0123456789ABCDEF';
X:=Trunc(N/16); N:=N Mod 16;
S:=S+Numbers[X+1]; X:=N;
S:=S+Numbers[X+1];
Hex:=S;
End;
Function HexW(N:Word):String;
Begin
HexW:=Hex(Hi(N))+Hex(Lo(N));
End;
Function CompArr(X:Word;Y:DumArr):Boolean;
Var W:Boolean; T:Byte;
Begin
W:=True;
For T:=0 to 6 do Begin
If Y[T]<>Mem[CurArena:T+X] then Begin W:=False; T:=6; End;
End;
CompArr:=W;
End;
Procedure GetOwner(S:Word);
Var T:Word; P:String;
Begin
P:=': resident';
If CompArr(ClkLoc,Clock) then P:=': CLOCK display';
If CompArr(PasLoc,Pascal) then P:=': PASCAL compiler';
If CompArr(KeyLoc,SupKey) then P:=': SUPERKEY';
If CompArr(LitLoc,Lightng) then P:=': LIGHTNING';
If CompArr(PcTLoc,PcTools) then P:=': PCTOOLS';
If CompArr(SKLoc ,SideKik) then P:=': SIDEKICK';
If CompArr(Com3_3L,Com3_3) then P:=': DOS command v 3.3';
If CompArr(QegLoc,Qega) then P:=': QEGA processor';
If CompArr(DVULoc,DVUser) then P:=': DesqView Users';
If CompArr(CacLoc,Cache) then P:=': PC disk Cache';
If CompArr(HercLoc,Hercul) then P:=': Hercules graphics';
If CompArr(PushLoc,PushD) then P:=': PUSHDIR';
If CompArr(AnsiLoc,DvAnsi) then P:=': DVAnsi driver';
If MemW[S:3]+S+2=MemW[S:1] then Begin
Write(': DOS environments'); GotoXY(1+4+3,WhereY);
EnvSz:=MemW[CurArena:3]+1; PstEnv:=True;
End Else Begin
If P=': resident' then If MemW[CurArena:1]<>CurArena+$1 then
P:=': allocated to '+HexW(MemW[CurArena:1]);
PstEnv:=False; EnvSz:=0; Write(P);
End;
End;
Procedure MemoryArena;
Var
T,NxtArena,LstArena,LrgCont,Contig,ArenaH:Word;
LstCont,Got,MeFound:Boolean; A:Char;
Begin
Window(2,5,39,24);
T:=$50; Got:=False; PstEnv:=False; MeFound:=False;
While (Not Got) and (T<Reported) do Begin
If MemW[T:$10]=$20CD then Begin
If MemW[T:1]+MemW[T:3]=MemW[T:$12] then Begin
Got:=True; CurArena:=T;
End;
End;
T:=T+1;
End;
If WhereY>1 then Write(CR);
Write('0000 - '+HexW(CurArena)+' '+DoStr(Trunc(RR(CurArena)*16),4)+' ');
Write(': BIOS/DOS');
FreSize:=0; LstArena:=0; LrgCont:=0; Contig:=0; LstCont:=False; ArenaH:=0;
While (CurArena>ArenaH) and
(CurArena<Reported) do Begin
If Keypressed then Begin
A:=ReadKey; If A=#3 then Halt; If A=#0 then A:=ReadKey;
A:=ReadKey;
End;
If WhereY>17 then Delay(300);
NxtArena:=CurArena+MemW[CurArena:3]+1;
If CurArena>ArenaH then ArenaH:=CurArena;
If MemW[CurArena:1]=0 then Begin PstEnv:=False; EnvSz:=0; End;
If Not PstEnv then Begin Write(CR+HexW(CurArena)+' - '); EnvSz:=0;
End Else Begin
ClrEol;
End;
Write(HexW(NxtArena)+' '+DoStr(Trunc(RR(MemW[CurArena:3]+1+EnvSz)*16),4)+' ');
If (MemW[CurArena:1]=0) or {NOT OWNED}
(MCSeg=CurArena) then Begin
If (MCSeg=CurArena) then Begin Write(': Me'); MeFound:=True; End
Else Write(': -- FREE! -- ');
Contig:=Contig+MemW[CurArena:3]+1;
LstCont:=True; PstEnv:=False; EnvSz:=0;
FreSize:=FreSize+MemW[CurArena:3]+1;
End Else Begin {OWNED}
GetOwner(CurArena);
If CompArr(PasLoc,Pascal) then Begin
FreSize:=FreSize+MemW[CurArena:3]+1;
Contig:=Contig+MemW[CurArena:3]+1;
LstCont:=True;
End Else If LstCont then Begin
If Contig>LrgCont then LrgCont:=Contig;
LstCont:=False; Contig:=0;
End;
End;
LstArena:=CurArena;
CurArena:=NxtArena;
If (CurArena<=LstArena) or
(CurArena>=Reported) and
(MeFound=False) then Begin
CurArena:=MCSeg; LstArena:=0; NxtArena:=CurArena+MemW[CurArena:3]+1;
End;
End;
If LstCont then Begin
If Contig>LrgCont then LrgCont:=Contig;
End;
{ Write(Cr+' My block = ',DoStr(Trunc(RR(MemW[CSeg-$10:02]-MCSeg)*16),9)); }
If FreSize=0 then Begin
FreSize:=1;
If LrgCont=0 then LrgCont:=1;
End;
If LrgCont<FreSize then
Write(CR+' LARGEST BLOCK : '+DoStr(Trunc(RR(LrgCont-1)*16),9));
If WhereY+5>=HiY then HiY:=WhereY+5;
Window(41,4,79,24); SendAt(SysMemX,SysMemY,DoStr(Trunc(RR(FreSize-1)*16),9)+' bytes');
End;
Procedure GetSpeed;
Var
NewTime:LongInt;
X,Fctr:Word;
Const NDirectFctr=63;
DirectFctr=165;
Begin
If DirectVideo then Fctr:=DirectFctr Else Fctr:=NDirectFctr;
SendAt(12,2,' Dos Speed:');
Regs.AX:=$2C00; MsDos(Regs);
Inc(Regs.DH); If Regs.DH>59 then Begin
Regs.DH:=0; Inc(Regs.CL); If Regs.CL>59 then Begin
Regs.CL:=0; Inc(Regs.CH); If Regs.CH>23 then Regs.CH:=0;
End;
End;
NewTime:=((Regs.CX shl 16) + Regs.DX); Regs.CX:=0; Regs.DX:=0;
X:=0; While ((Regs.CX shl 16) + Regs.DX<NewTime) and (X<(Fctr*10)) do
Begin X:=X+1; Regs.AX:=$2C00; MsDos(Regs);
GotoXY(13,3); Write((X/Fctr)*100:7:2,'%');
End;
If X>=Fctr*10 then Begin
SendAt(13,3,' MISSED ');
End;
Write(CR+CR);
End;
Function ValidDr(X:Byte):Boolean;
Begin
X:=X-1; If X<2 then Begin
Regs.AH:=0; Intr($13,Regs);
Regs.AH:=4; Regs.AL:=1; Regs.CH:=0; Regs.CL:=1;
Regs.DH:=0; Regs.DL:=X; Intr($13,Regs);
ValidDr:=((Regs.Flags and Fcarry)=0)
End Else Begin
ValidDr:=(DiskSize(X+1)>1024);
End;
End;
Procedure GetDrives;
Var Dr:Array[0..5] of Word; T,X,Fails:Byte; R:LongInt;
Begin
GotoXY(41,2); WriteLn(' Size / Available');
Window(41,4,79,24); Fails:=0;
T:=1; While T<=Ord(LstDrive)-64 do Begin
Regs.AH:=$0D; MsDos(Regs);
If ValidDr(T) then Begin
Write(' '+Chr(64+T)+': '+DoStr(DiskSize(T),10)+' / '+
DoStr(DiskFree(T),10)+' bytes');
End;
Inc(T);
End;
End;
Procedure GetExtended;
Var X:Word;
Begin
X:=MemW[0:$19C];
If X>0 then Begin
Regs.AX:=$4200; Intr($67,Regs);
If Regs.AX=0 then Begin
SendAt(40,WhereY,'AboveBoard: '+DoStr(Trunc(Regs.DX * (HiInt/2)),8)+' / '+
DoStr(Trunc(Regs.BX * (HiInt/2)),8)+' bytes')
End;
End;
End;
Procedure SystemMem;
Var Amount,Start,Ends:Word; Work:LongInt;
Begin
Intr($12,Regs); Reported:=Regs.AX; GotoXY(40,WhereY);
Write('System Mem: '+DoStr(Trunc(RR(Regs.AX)) Shl 10,8)+' / ');
SysMemX:=WhereX; SysMemY:=WhereY; HiY:=WhereY+4;
Reported:=Trunc(Reported/16*1024);
MemoryArena; WriteLn;
End;
Begin
Colors;
CR:=#13+#10;
ClrScr; MCseg:=CSeg-$11; Frames;
GetSpeed; GetDrives;
GetExtended;
SystemMem;
Window(1,HiY,80,25); ClrScr;
Write('╚══════════════════════════════════════╩═══════════════════════════════════════╝');
End.