DEFINITION MODULE M2Loader; (* C. Vetterli, 22-Dec-85 / 22-Dec-85 *) FROM SYSTEM IMPORT ADDRESS; FROM GEMX IMPORT BasePage; CONST MaxPrograms = 6; TYPE Status = (normal, moduleNotFound, fileNotFound, illegalKey, readError, badSyntax, noMemory, alreadyLoaded, killed, tooManyPrograms, continue, noApplication); ModuleName = ARRAY[0..21] OF CHAR; (* 16 Byte for name *) (* 3 Words for key *) ProcEntryPtr = POINTER TO ProcEntryDesc; ProcEntryDesc = RECORD flags: INTEGER; procModRef: ARRAY[0..255] OF LONGINT END; ModulePtr = POINTER TO ModuleDesc; ModuleDesc = RECORD link: ModulePtr; modPtr: ADDRESS; modSize: LONGINT; dataPtr: ProcEntryPtr; valA4: LONGINT; mName: ModuleName; numOfMods, numOfProcs, codeLen, level: INTEGER; leaveLoaded: BOOLEAN END; ErrMessProc = PROCEDURE(Status); BeginHaltProc = PROC; (*DS*) EndHaltProc = PROCEDURE(BOOLEAN); (*TRUE:PRG Weiter, FALSE:PRG Abbruch *) VAR DisplayLoaderStatus: ErrMessProc; (* link your own message handler *) BasePagePtr: POINTER TO BasePage; SystemDrive: CHAR; SystemPath: ARRAY [0..63] OF CHAR; curLevel: INTEGER; (*DS*) debugResident: BOOLEAN; (*DS*) BeginHalt: BeginHaltProc; (* wird am Anfang bzw. am Ende des *) EndHalt: EndHaltProc; (* HaltHandlers aufgerufen *) (* fuer die Beschreibung der folgenden Funktionen siehe MacMETH User Manual *) PROCEDURE Allocate (VAR ptr: ADDRESS; size : LONGINT); PROCEDURE Deallocate (VAR ptr : ADDRESS); PROCEDURE Call (module, cmdline: ARRAY OF CHAR; leaveLoaded: BOOLEAN; VAR status: Status); PROCEDURE Terminate (status: Status); PROCEDURE DisplayStatus (status: Status); PROCEDURE GetProcessStatus (VAR err: ARRAY OF CHAR); PROCEDURE GetNextModule (VAR modNo: INTEGER; VAR dataBase: LONGINT; VAR modName: ARRAY OF CHAR); PROCEDURE GetNextProcedure (VAR modNo: INTEGER; VAR dataBase: LONGINT; VAR relPC: INTEGER); PROCEDURE InitProcedure (init: PROC; VAR done: BOOLEAN); PROCEDURE TermProcedure (term: PROC; VAR done: BOOLEAN); PROCEDURE FindModule (dataBase, pc: LONGINT; VAR modPtr: ModulePtr; VAR relPC, modNo: INTEGER; VAR found: BOOLEAN); PROCEDURE SetError (errMP, errPC, errA4: LONGINT; errNum: INTEGER); (* Implementierung einer Suchstrategie fr die Bibliotheksmoduln. Sucht ben”tigte Files, die nicht im aktuellen Directory stehen, in den Directories, die im File mit dem Namen FName (aktuelles Dir) eingetragen sind. Achtung: Der eingetragene Pfadname muss so sein, dass der Filename gerade noch angeh„ngt zu werden braucht ! Das betrifft insbesondere die Delimiter!! *) CONST maxNameLen = 39; tablesize = 20; TYPE nametype = ARRAY [0..maxNameLen] OF CHAR; Path = POINTER TO nametype; VAR Table: ARRAY [1..tablesize] OF Path; paths: ARRAY [1..tablesize] OF nametype; PROCEDURE FindPath (VAR p: Path; VAR FileName: ARRAY OF CHAR; VAR i: INTEGER); PROCEDURE AddPath (p: Path; VAR relFileName: ARRAY OF CHAR; VAR absFileName: ARRAY OF CHAR); END M2Loader.