home *** CD-ROM | disk | FTP | other *** search
- program MakeVP; { program for creating a unit }
- { that has virtual pointers }
- Const
- NUMPAGES = 50; { this is the number of pointers}
- { available for the system }
- Var { maximum is about 512 }
- OutFile : Text;
- Loop : word;
-
- {---------------------------------------------------------------------------}
-
- begin
- assign(OutFile,'STI_VPTR.PAS');
- rewrite(OutFile);
- WriteLn(OutFile,'Unit STI_VPTR;');
- WriteLn(OutFile,'{$V-}');
- WriteLn(OutFile,'');
- WriteLn(OutFile,'interface');
- WriteLn(OutFile,'');
- WriteLn(OutFile,'Const');
- WriteLn(OutFile,' NUMPAGES = ',NUMPAGES,';');
- WriteLn(OutFile,'');
- WriteLn(OutFile,'Type');
- WriteLn(OutFile,' STI_VPointer = function : pointer;');
- WriteLn(OutFile,'');
- WriteLn(OutFile,'procedure STI_VPGetMem(Var Point : STI_VPointer);');
- WriteLn(OutFile,'procedure STI_VPFreeMem(Point : pointer);');
- WriteLn(OutFile,'Procedure STI_VPInitialise(Name : string; Pages,SizePage : word);');
- WriteLn(OutFile,'procedure STI_VPClose;');
- WriteLn(OutFile,'');
- WriteLn(OutFile,'implementation');
- WriteLn(OutFile,'');
- WriteLn(OutFile,'Var');
- WriteLn(OutFile,' VMCallArray : array[1..',NUMPAGES,'] of STI_VPointer;');
- WriteLn(OutFile,' VMFlags : array[1..',NUMPAGES,'] of byte; ');
- WriteLn(OutFile,' PageNumber : word;');
- WriteLn(OutFile,' PageSize : word;');
- WriteLn(OutFile,' Point : pointer;');
- WriteLn(OutFile,' SwapFile : File;');
- WriteLn(OutFile,'');
- WriteLn(OutFile,
- '{---------------------------------------------------------------------------}');
- WriteLn(OutFile,'');
- WriteLn(OutFile,'procedure PutPage;');
- WriteLn(OutFile,'');
- WriteLn(OutFile,'begin');
- WriteLn(OutFile,' Seek(SwapFile,PageNumber);');
- WriteLn(OutFile,' BlockWrite(SwapFile,Point^,1);');
- WriteLn(OutFile,' if VMFlags[PageNumber] > 200 then');
- WriteLn(OutFile,' Dec(VMFlags[PageNumber],200);');
- WriteLn(OutFile,'end;');
- WriteLn(OutFile,'');
- WriteLn(OutFile,
- '{---------------------------------------------------------------------------}');
- WriteLn(OutFile,'');
- WriteLn(OutFile,'function GetPage(PageNum : word) : pointer;');
- WriteLn(OutFile,'');
- WriteLn(OutFile,'begin');
- WriteLn(OutFile,' if PageNum <> PageNumber then');
- WriteLn(OutFile,' PutPage;');
- WriteLn(OutFile,' if (PageNum < FileSize(SwapFile)) and (VMFlags[PageNum] < 200) then');
- WriteLn(OutFile,' begin');
- WriteLn(OutFile,' Seek(SwapFile,PageNum);');
- WriteLn(OutFile,' BlockRead(SwapFile,Point^,1);');
- WriteLn(OutFile,' Inc(VMFlags[PageNum],200);');
- WriteLn(OutFile,' end; ');
- WriteLn(OutFile,' PageNumber := PageNum;');
- WriteLn(OutFile,' GetPage := Point;');
- WriteLn(OutFile,'end;');
- WriteLn(OutFile,'');
- WriteLn(OutFile,
- '{---------------------------------------------------------------------------}');
- WriteLn(OutFile,'');
- WriteLn(OutFile,'procedure STI_VPGetMem(Var Point : STI_VPointer);');
- WriteLn(OutFile,'');
- WriteLn(OutFile,'Var');
- WriteLn(OutFile,' Loop : word;');
- WriteLn(OutFile,' Dummy1 : pointer absolute Point;');
- WriteLn(OutFile,' Dummy2 : array[1..NUMPAGES] of pointer absolute VMCallArray;');
- WriteLn(OutFile,'');
- WriteLn(OutFile,'begin');
- WriteLn(OutFile,' for Loop := 1 to NUMPAGES do');
- WriteLn(OutFile,' begin');
- WriteLn(OutFile,' if VMFlags[Loop] < 1 then');
- WriteLn(OutFile,' begin');
- WriteLn(OutFile,' Dummy1 := Dummy2[Loop];');
- WriteLn(OutFile,' VMFlags[Loop] := 1;');
- WriteLn(OutFile,' Exit;');
- WriteLn(OutFile,' end;');
- WriteLn(OutFile,' end;');
- WriteLn(OutFile,' WriteLn(''Virtual Memory OverFlow'');');
- WriteLn(OutFile,' Halt;');
- WriteLn(OutFile,'end;');
- WriteLn(OutFile,'');
- WriteLn(OutFile,
- '{---------------------------------------------------------------------------}');
- WriteLn(OutFile,'');
- WriteLn(OutFile,'procedure STI_VPFreeMem(Point : pointer);');
- WriteLn(OutFile,'');
- WriteLn(OutFile,'Var');
- WriteLn(OutFile,' Loop : word;');
- WriteLn(OutFile,' Dummy1 : pointer absolute Point;');
- WriteLn(OutFile,' Dummy2 : array[1..NUMPAGES] of pointer absolute VMCallArray;');
- WriteLn(OutFile,'');
- WriteLn(OutFile,'begin');
- WriteLn(OutFile,' for Loop := 1 to NUMPAGES do');
- WriteLn(OutFile,' begin');
- WriteLn(OutFile,' if Dummy1 = Dummy2[Loop] then');
- WriteLn(OutFile,' begin');
- WriteLn(OutFile,' VMFlags[Loop] := 0;');
- WriteLn(OutFile,' Exit;');
- WriteLn(OutFile,' end;');
- WriteLn(OutFile,' end;');
- WriteLn(OutFile,'end;');
- WriteLn(OutFile,'');
- WriteLn(OutFile,
- '{---------------------------------------------------------------------------}');
- for Loop := 1 to NUMPAGES do
- begin
- WriteLn(OutFile,'{$F+}');
- WriteLn(OutFile,'function PageCall',Loop,' : Pointer;');
- WriteLn(OutFile,'{$F-}');
- WriteLn(OutFile,'begin');
- WriteLn(OutFile,' PageCall',Loop,' := GetPage(',Loop,');');
- WriteLn(OutFile,'end;');
- WriteLn(OutFile,
- '{---------------------------------------------------------------------------}');
- end;
-
- WriteLn(OutFile,'Procedure STI_VPInitialise(Name : string; Pages,SizePage : word);');
- WriteLn(OutFile,'');
- WriteLn(OutFile,'Var');
- WriteLn(OutFile,' Dummy : string;');
- WriteLn(OutFile,' Loop : word;');
- WriteLn(OutFile,'');
- WriteLn(OutFile,'begin');
- for Loop := 1 to NUMPAGES do
- begin
- WriteLn(OutFile,' VMCallArray[',Loop:5,'] := PageCall',Loop,';');
- end;
- WriteLn(OutFile,' For Loop := 1 to NUMPAGES do');
- WriteLn(OutFile,' begin');
- WriteLn(OutFile,' VMFlags[Loop] := 0;');
- WriteLn(OutFile,' end;');
- WriteLn(OutFile,' PageNumber := 1;');
- WriteLn(OutFile,' PageSize := SizePage;');
- WriteLn(OutFile,' Assign(SwapFile,Name);');
- WriteLn(OutFile,' Rewrite(SwapFile,SizePage);');
- WriteLn(OutFile,' GetMem(Point,SizePage);');
- WriteLn(OutFile,' FillChar(Point^,SizePage,#32);');
- WriteLn(OutFile,' Dummy := ''STIVPTR''+#26+''Virtual Memory Management System Copyright (C) 1990,1991 by STI'';');
- WriteLn(OutFile,' Seek(SwapFile,0);');
- WriteLn(OutFile,' BlockWrite(SwapFile,Dummy[1],0);');
- WriteLn(OutFile,'end;');
- WriteLn(OutFile,'');
- WriteLn(OutFile,
- '{---------------------------------------------------------------------------}');
- WriteLn(OutFile,'');
- WriteLn(OutFile,'procedure STI_VPClose;');
- WriteLn(OutFile,'');
- WriteLn(OutFile,'begin');
- WriteLn(OutFile,' Close(SwapFile);');
- WriteLn(OutFile,' Erase(SwapFile);');
- WriteLn(OutFile,' FreeMem(Point,PageSize);');
- WriteLn(OutFile,'end;');
- WriteLn(OutFile,'');
- WriteLn(OutFile,
- '{---------------------------------------------------------------------------}');
- WriteLn(OutFile,'');
- WriteLn(OutFile,'begin');
- WriteLn(OutFile,'end.');
- flush(OutFile);
- Close(OutFile);
- end.
-
-