	$48 MALLOC



	void *Malloc( long anzahl );



Die MALLOC-Funktion und die zwei Aufrufe MFREEMFREE und SETBLOCKMSHRINK befassen 
sich mit der Speicherorganisation des GEMDOS. Wie bei der Funktion 
$31, KEEP PROCESS..\PEXEC\PTERMRES erwhnt, wird einem Programm nach dem Laden der 
gesamte Speicherbereich zugeordnet. Das ist in vielen Fllen 
unkritisch, da nur ein einziges Programm laufen soll.



Es ist aber gerade unter GEM wesentlich, zumindest einen Teil des 
Speichers nach dem Start des Programms wieder freizugeben, da 
verschiedene GEM-Funktionen Speicher mit der MALLOC-Funktion 
anfordern. Ein gutes Beispiel ist der Fileselector, der auch bei 
korrekter Programmierung nicht erscheint, wenn kein freier Speicher 
mehr zur Verfgung steht.



Andere Anwendungen sind z.B. Programme, die mit Overlays arbeiten. Um 
ein Overlay von der Diskette laden zu knnen, mu dem GEMDOS freier 
Speicher zur Verfgung stehen. Aus diesem Grunde sollte jedes 
Programm immer nur den Platz reservieren, den es tatschlich als 
Programm- und Datenbereich bentigt. Der nicht bentigte Speicher 
kann dann an GEMDOS mittels SETBLOCKMSHRINK zurckgegeben werden.



Sollte ein Programm jedoch nach der Freigabe des nicht bentigten 
Speichers doch weiteren Speicher bentigen, so kann es den Speicher 
vom GEMDOS ber die Funktion MALLOC (Memory Allocate) anfordern. Dazu 
wird mit der Funktion MALLOC die Anzahl der bentigten Bytes 
mitgeteilt. Als Return-Wert in D0 erhlt man die Startadresse des 
durch den Aufruf reservierten Speicherbereichs oder eine 
Fehlermeldung, wenn versucht wird, mehr Speicher zu reservieren als 
berhaupt noch frei ist.



Wird als Anzahl der zu allocierenden Bytes -1L bergeben, so erhlt 
man die Gre des grten zusammenhngenden freien Speicherbereiches 
in Bytes in D0 zurck.



----------------------------------------------------------------------
	1. Beispiel



MOVE.L	#-1,-(SP)	* Anzahl freier Bytes ermitteln

MOVE.W	#$48,-(SP)	* Funktionsnummer

TRAP	#1

ADDQ.L	#6,SP		* Anzahl freier Bytes in D0



	2. Beispiel



MOVE.L	#$1000,-(SP)	* Hex 1000 Bytes dem Programm zuteilen

MOVE.W	#$48,-(SP)	* Funktionsnummer

TRAP	#1

ADDQ.L	#6,SP

TST.L	D0		* Fehler oder Adresse des Speichers ?

BMI	error		* negative Long-Werte = Fehler!

MOVE.L	D0,mstart	* sonst Start-Adresse des reservierten

...			* Bereichs

mstart: DS.L	1

----------------------------------------------------------------------
