// GOVERLAY.SR
// ** IF MORE BB FILES ARE ADDED, ADD fn MANIFESTS TO GINN.DF
// AND ADD FILE NAME BELOW IN openoverlay
get "BRAVO.DF";
get "HEAP.DF";
get "GINN.DF";
// Incoming Procedures
external [
errhlt
updatedisplay
ult
hpfree
makeroominheap
hpcompact
loadcore
qinit;
junta;
open
filldisplay
];
// Incoming Statics
external
[
vpzone
macww
rgdllast
rgmaxdl
rgcdlblank
rgcplast
rgmaccp
rgdoc
rgupdate
freet
mpfnof
]
// Outgoing Procedures
external [
overlay
initoverlay
hplay
opensomeoverlay
];
// Outgoing Statics
external [
ozone
ozonel
currentoverlay
modulel
currentbb
];
// Local Statics
static [
ozone
ozonel
currentoverlay
modulel
currentbb
];
let initoverlay() be
[
ozone = qinit-2-15 ;
ozonel = junta-ozone
if ozonel << odd then ozonel = ozonel - 1
currentbb = initmodule ;
]
and opensomeoverlay() = valof
[
for fnbb = firstfnbb to lastfnbb do
if mpfnof ! fnbb eq -1 then
[
openoverlay(fnbb)
resultis true
]
resultis false
]
and openoverlay(fnbb) = valof
[
let bname = nil ;
switchon fnbb into
[
case fnfilebb: bname = "GYPSYFILEX.BB" ; endcase
case fneditbb: bname = "GYPSYEDITX.BB" ; endcase
case fnwwbb: bname = "GYPSYWWX.BB" ; endcase
case fnmenubb: bname = "GYPSYMENUX.BB" ; endcase
case fndevbb: bname = "GYPSYDEVX.BB" ; endcase
default: errhlt("NBB")
]
unless open(fnbb,bname,false) do errhlt("MBB");
resultis mpfnof ! fnbb ;
]
and overlay(fnbb) be
[
if fnbb eq resmodule % fnbb eq currentbb then return ;
let of = mpfnof ! fnbb ;
if of eq -1 then of = openoverlay(fnbb) ;
let macpos = of >> OF.macpos;
modulel = (macpos rshift 1)+1 ;
if modulel << odd then modulel = modulel + 1
if modulel gr ozonel % modulel+worthcompact ls ozonel then
[
hplay(modulel-ozonel, true)
if modulel ls ozonel then filldisplay()
ozonel = modulel ;
];
loadcore(fnbb, ozone) ;
currentbb = fnbb ;
]
and hplay(shrinkamount, up) be
[
let zmin = vpzone >> ZONE.min
let zmax = vpzone >> ZONE.max
test shrinkamount gr 0 ifso
[
if shrinkamount gr vpzone>>ZONE.cfree then
makeroominheap(shrinkamount)
hpcompact(up,
vpzone >> ZONE.min + (not up? 0, shrinkamount),
vpzone >> ZONE.max + (up? 0, -shrinkamount)) ;
]
ifnot [ let newblock = nil;
test up ifso
[ vpzone >> ZONE.min = zmin+shrinkamount;
newblock = zmin+shrinkamount;
]
ifnot [ vpzone >> ZONE.max = zmax-shrinkamount;
newblock = zmax;
]
newblock >> HP.siz = -shrinkamount;
newblock >> HP.fp = 0;
rv(newblock-shrinkamount-bsiz) = -shrinkamount;
hpfree(lv (newblock >> HP.use));
]
]