{* GY359MEM.INC - Casio CFX Speicherverwaltungsroutinen für GY359 *}
{* für ZX933 identisch, jedoch weichen die Startadressen und Größen der Pointertabellen ab *}
//---Konstantendefinitionen für Pointertabellen-----------------------------------------------------------------------------
const upbase = 0400h; //Startadresse der Grow - Up - Pointertabelle
downbase = 0648h; //Startadresse der Grow - Down - Tabelle, wäre 0640h für ZX933
maxup = 291; //maximaler Listenindex der Grow - Up Tabelle; 291, da 292 Einträge (wäre 287 für ZX933)
maxdown = 44; //maximaler Listenindex der Grow - Downtabelle; 44, da 45 Einträge (wäre 43 für ZX933)
maxramaddr = 7FFFh; //maximale Adresse im RAM; 0FFFFh für 64KB Systeme
freerambase = 0832h; //Startadresse des RAM Blocks, der durch Pointertabellen verwaltet wird
maxfreemem = maxramaddr-freerambase; //maximaler freier Speicher; 30699 für 32KB, 63437 für 64KB
//---Definition der Pointertabellen-----------------------------------------------------------------------------------------
var growup : mem[upbase ] = array[0..maxup+1 ] of word; //Grow - Up - Tabelle
growdown: mem[downbase] = array[0..maxdown+1] of record //Grow - Down - Tabelle
p,dummy: word; //Grow - Down - Eintrag = 32 Bit, nur 16 Bit verwendet
end;
//---Implementation von Speichevrerwaltungsroutinen-------------------------------------------------------------------------
function memreserved: word;
begin
memreserved := growup[maxup]-growup[0]+growdown[0].p+growdown[maxdown].p;
end;
function memavail: word;
begin
memavail := maxfreeram-memreserved;
end;
function getblocksizeup(n: word): word;
begin
getblocksizeup := growup[n+1]-growup[n];
end;
function getblocksizedown(n: word): dword;
begin
getblocksizedown := growdown[n].p-growdown[n+1].p;
end;
procedure getmemup(n,size: word);
var x: word;
begin
x := growup[maxup] - growup[n];
if x > 0 then move(ptr(growup[n]+size)^,ptr(growup[n])^,x);
if n < maxup then for x := n+1 to maxup do growup[x] := growup[x]+size;
end;
procedure getmemdown(n,size: word);
var x: word;
begin
x := growdown[n+1].p-growdown[maxdown].p+1;
move(ptr(growdown[n+1].p-size)^,ptr(growdown[n+1].p)^,x);
if n < maxdown then for x := n+1 to maxdown do grdown[x].p := grdown[x].p-size;
end;
procedure freememup(n: word);
var x,size: word;
begin
x := growup[maxup] - growup[n+1];
size := growup[n+1]+growup[n];
if x > 0 then move(ptr(growup[n])^,ptr(growup[n+1])^,x);
if n < maxup then for x := n+1 to maxup do growup[x] := growup[x]-size;
end;
procedure freememdown(n: word);
var x,size: word;
begin
x := growdown[n+1].p-growdown[maxdown].p;
size := growdown[n].p-growdown[n+1].p;
move(ptr(growdown[n+1].p-size)^,ptr(growdown[n+1].p)^,x);
if n < maxdown then for x := n+1 to maxdown do grdown[x].p := grdown[x].p+size;
end; |