[Back to EXEC SWAG index] [Back to Main SWAG index] [Original]
(*
BW>> I'm programming a very big program in Turbo Pascal 5.5, and when
BW>> I compil VB--}it, I've the error Code segment too large. I can't split
BW>> my amin program VB--}units because many procedures call many others
BW>> who call back the first. VB--}How can I solve that ?
BW>> Sounds like you need some overlays. Better study up on them.
MC> Nope, overlays are about the last thing he needs to try. The normal
MC> solution to this problem is Units. They can always be (re)designed to
MC> do what's needed, structurally and functionally. Overlays are a
MC> solution to a very specific set of problems in TP/BP programming, and
MC> this error isn't one of them...
MC> ... CAUTION! DO NOT LOOK AT LASER WITH REMAINING EYE!
cool tag...
anyway, overlays may not be what he needs but have this anyways guys & girls.
tested in tp 6.0 & 7.0
This was written by Arron Cusimano of ACT Australia.
(*ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Copyright (c)Arron Cusimano 1994 All Rights Reserved Worldwide.
Conditions of use:
1) I will not be held responisble for any adverse effects of this code.
2) compliation of this code constitutes agreement to these conditions.
3) have fun with it... :)
Use of this unit :
To use *.OVR files with a program, you must place {$O+} at the
begining of each unit and {$F+} at the start of the program.
Also, just after your uses clause in your program,
a {$O unitname} statment is required for each unit.
( "unitname" is the name of unit you wish to be in the overlay )
Make sure THIS unit is in your uses clause!
Compile to disk (cannot run in memory).
***** NOTE : This unit MUST NOT be overlaid! *****
Initial buffer size can be set by changing: OverlayBufferSize: longint;
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ*)
UNIT ovlinit ;
{ LEAVE next line alone! }
{$O-,I-,F+}
{ modify next line as you wish. }
{$R-,S-,D-,L-,G+,A+}
INTERFACE
USES Dos, Overlay;
procedure add_ovl_buffer_size(extrasize: longint; add: boolean);
IMPLEMENTATION
var
ovr_file_name: pathstr;
OverlayBufferSize: longint;
procedure RemapMemory;
{ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
MOVE "OVRHEAPORG" & "OVRHEAPEND" TO TOP OF MEMORY.
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ}
begin
HeapOrg:= Ptr(OvrHeapOrg, 0) ;
HeapPtr:= HeapOrg ;
FreeList:= HeapOrg ;
OvrHeapOrg:= PrefixSeg + MemW[pred(PrefixSeg):3] - OverlayBufferSize div
16; while (OverlayBufferSize MOD 16) <> 0 do inc(OvrHeapOrg);
OvrHeapPtr:= OvrHeapOrg;
OvrHeapEnd:= OvrHeapOrg + OverlayBufferSize div 16;
HeapEnd:= Ptr(OvrHeapOrg, 0);
end ;
procedure InitOverlays(ovr_name: pathstr);
{ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ACTIVATE OVERLAYS
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ}
begin
OvrFileMode := $20; { Read-Only + Deny-write }
OvrInit(ovr_name);
case OvrResult of
ovrNoMemory: writeln('Not enough memory for overlay!'#7);
ovrIOerror : writeln('Error reading overlay file!'#7);
ovrError : writeln('OVERLAY ERROR!'#7);
else
begin
OvrSetBuf (OverlayBufferSize);
OvrSetRetry (OvrGetBuf div 3);
EXIT;
end;
end ; { case }
HALT(1);
end ;
procedure search_for_overlay_file;
{ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
CHECK .EXE FILE DIRECTORY THEN PATH OR QUIT
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ}
var
dir : dirstr;
name: namestr;
ext : extstr;
begin
if Lo (DosVersion) > 2 then ovr_file_name := system.ParamStr(0)
else { get dos version or quit }
begin
write('Yuck...dos version less than 3.0'+ #13#10#7);
halt(1);
end;
ovr_file_name:= FExpand(ovr_file_name); { get full path name of exe file }
FSplit(ovr_file_name, Dir, Name, Ext) ; { split it up }
ovr_file_name:= FSearch(Name + '.OVR', Dir);{ ovr_file_name.EXE =
ovr_file_name.OVR }
if ovr_file_name = '' then { if not found, check PATH }
ovr_file_name:= FSearch(Name + '.OVR', GetEnv('PATH')) ;
if ovr_file_name = '' then { if still not found, quit }
begin
writeln('Overlay not found in current directory or on PATH'#7);
halt(1);
end;
ovr_file_name := FExpand(ovr_file_name) ;
end;
procedure add_ovl_buffer_size(extrasize: longint; add: boolean);
{ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
___,/|
\ o_o| Set boolean to true for addition to buffer -
=(_|_)=
/ | set to false for subtraction.
/ \
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ}
begin
case add of
true:
begin
OvrSetBuf(OvrGetBuf+ExtraSize);
if OvrResult = OvrError then exit;
end;
false:
begin
OvrSetBuf(OvrGetBuf-ExtraSize);
if OvrResult = OvrError then exit;
end;
end;{case}
end;{procedure}
BEGIN { * INIT * }
OverlayBufferSize := 16000; { adjust as needed,
if performance is sluggish make bigger }
Search_for_overlay_file;
if OvrGetBuf > 0 then
begin
RemapMemory ;
InitOverlays(ovr_file_name) ;
end;
END. { * END INIT * }
[Back to EXEC SWAG index] [Back to Main SWAG index] [Original]