{* 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; |