*** omod:module/txt/OberonLib.mod Thu Dec 30 13:28:20 1993 --- OberonLib.mod Sun Jan 30 03:21:41 1994 *************** *** 3,8 **** --- 3,9 ---- (* Amiga Oberon Library Module: OberonLib Date: 02-Nov-92 *) (* *) (* © 1992 by Fridtjof Siebert *) + (* Additional memory management by Lars Düning *) (* *) (*-------------------------------------------------------------------------*) *************** *** 22,27 **** --- 23,34 ---- * create this module by compiling OberonLib.mod with "SET LibLink". After * compilation, you have to rename the created object file from * "obj/OberonLib.obj*" to "obj/LibOberonLib.obj*". + *------------------------------------------------------------------------- + * This is a modified version of OberonLib which is able to use an external + * memory manager module named 'ExtMemory'. Just compile with "SET ExternMem" + * for the proper routine calles. + * For proper linkage you have to import 'ExtMemory' at least once into your + * program. * *) *************** *** 383,394 **** (* $IF LibLink *) OpenOk["LibraryHead.OpenOk"]: BOOLEAN; ! (* $END *) (*-------------------------------------------------------------------------*) (* * Memory list: --- 390,402 ---- (* $IF LibLink *) OpenOk["LibraryHead.OpenOk"]: BOOLEAN; ! (* $END *) (*-------------------------------------------------------------------------*) + (* $IFNOT ExternMem *) (* * Memory list: *************** *** 407,412 **** --- 415,424 ---- VAR first: MinList; el1,el2: MemElementPtr; + + (* $END *) + + VAR m: LONGINT; (* *************** *** 466,471 **** --- 478,484 ---- (*------ Memory functions: ------*) + (* $IFNOT ExternMem *) PROCEDURE New*(VAR adr: APTR; size: LONGINT); *************** *** 494,500 **** Forbid; (* Disable Taskswitching to make NEW() reentrant *) mem := AllocMem(size,MemReqs); ! IF mem=NIL THEN adr := NIL; ELSE --- 507,513 ---- Forbid; (* Disable Taskswitching to make NEW() reentrant *) mem := AllocMem(size,MemReqs); ! IF mem=NIL THEN adr := NIL; ELSE *************** *** 515,521 **** Forbid; END; UNTIL mem#NIL; ! mem.size := size; AddHead(first,mem); --- 528,534 ---- Forbid; END; UNTIL mem#NIL; ! mem.size := size; AddHead(first,mem); *************** *** 550,558 **** --- 563,594 ---- END; END Dispose; + (* $ELSE *) + + PROCEDURE MemBegin {"ExtMemory.Begin"}; + PROCEDURE MemClose {"ExtMemory.Close"}; + PROCEDURE MemNew {"ExtMemory.new"} (VAR adr: APTR; size: LONGINT); + PROCEDURE MemAllocate {"ExtMemory.allocate"} (VAR adr: APTR; size: LONGINT); + PROCEDURE MemDispose {"ExtMemory.dispose"} (VAR adr: APTR); + + + PROCEDURE New * (VAR adr: APTR; size: LONGINT); + BEGIN + (* $IFNOT LibLink *) + MemNew(adr, size); + (* $ELSE *) + MemAllocate(adr, size); + (* $END *) + END New; + + PROCEDURE Dispose * (VAR adr: APTR); + BEGIN MemDispose(adr); END Dispose; + (* $END *) + (*------ Allocate: ------*) + (* $IFNOT ExternMem *) PROCEDURE Allocate*(VAR adr: APTR; size: LONGINT); *************** *** 588,593 **** --- 624,635 ---- END Allocate; + (* $ELSE *) + + PROCEDURE Allocate * (VAR adr: APTR; size: LONGINT); + BEGIN MemAllocate(adr, size); END Allocate; + + (* $END *) (*------ String Copy: ------*) *************** *** 664,672 **** 06302H, (* BLS.S ok; THEN *) 04E42H, (* TRAP #2 TRAP #2 *) 02A5FH); (* ok: MOVEA.L (A7)+,A5 END; *) ! (* $END *) ! END StackChk; --- 706,714 ---- 06302H, (* BLS.S ok; THEN *) 04E42H, (* TRAP #2 TRAP #2 *) 02A5FH); (* ok: MOVEA.L (A7)+,A5 END; *) ! (* $END *) ! END StackChk; *************** *** 885,896 **** HaltProc := Halt; OpenOk := TRUE; ! (* $ELSE *) dosCmdLen := SYSTEM.REG(0); dosCmdBuf := SYSTEM.REG(8); ! Me := SYSTEM.VAL(Process,execBase.thisTask); taskTrapData.a5 := SYSTEM.REG(13); --- 927,938 ---- HaltProc := Halt; OpenOk := TRUE; ! (* $ELSE *) dosCmdLen := SYSTEM.REG(0); dosCmdBuf := SYSTEM.REG(8); ! Me := SYSTEM.VAL(Process,execBase.thisTask); taskTrapData.a5 := SYSTEM.REG(13); *************** *** 927,940 **** --- 969,992 ---- MemReqs := LONGSET{memClear}; + (* $IFNOT ExternMem *) + first.head := SYSTEM.ADR(first.tail); first.tailPred := SYSTEM.ADR(first.head); first.tail := NIL; + (* $ELSE *) + + MemBegin; + + (* $END *) + usedUser := LONGSET{}; CLOSE + (* $IFNOT ExternMem *) + el1 := first.head; LOOP el2 := el1.node.succ; *************** *** 942,948 **** FreeMem(el1,el1.size); el1 := el2 END; ! (* $IFNOT LibLink *) Me.task.trapCode := oldTrapProc; (* remove Traphandler *) --- 994,1006 ---- FreeMem(el1,el1.size); el1 := el2 END; ! ! (* $ELSE *) ! ! MemClose; ! ! (* $END *) ! (* $IFNOT LibLink *) Me.task.trapCode := oldTrapProc; (* remove Traphandler *) *************** *** 957,965 **** END; SYSTEM.SETREG(0,Result); ! (* $END *) END OberonLib. - - --- 1015,1021 ---- END; SYSTEM.SETREG(0,Result); ! (* $END *) END OberonLib.