diff --git a/src/compiler/OPM.Mod b/src/compiler/OPM.Mod index 7c88f8fc..e59435eb 100644 --- a/src/compiler/OPM.Mod +++ b/src/compiler/OPM.Mod @@ -4,7 +4,7 @@ MODULE OPM; (* RC 6.3.89 / 28.6.89, J.Templ 10.7.89 / 22.7.96 *) 31.1.2007 jt synchronized with BlackBox version, in particular PromoteIntConstToLInt added *) - IMPORT SYSTEM, Texts, Files, Platform, Out, Configuration, VT100, Strings; + IMPORT SYSTEM, Texts, Files, Platform, Modules, Out, Configuration, VT100, Strings; CONST OptionChar* = "-"; @@ -233,7 +233,7 @@ MODULE OPM; (* RC 6.3.89 / 28.6.89, J.Templ 10.7.89 / 22.7.96 *) PROCEDURE OpenPar*(): BOOLEAN; (* prepare for a sequence of translations *) VAR s: ARRAY 256 OF CHAR; BEGIN - IF Platform.ArgCount = 1 THEN + IF Modules.ArgCount = 1 THEN LogWLn; LogWStr("Oberon-2 compiler v"); LogWStr(Configuration.versionLong); LogW("."); LogWLn; LogWStr("Based on Ofront by J. Templ and Software Templ OEG."); LogWLn; @@ -290,10 +290,10 @@ MODULE OPM; (* RC 6.3.89 / 28.6.89, J.Templ 10.7.89 / 22.7.96 *) Options := {inxchk, typchk, ptrinit, assert}; (* Default options *) (* Pick up global option changes from start of command line *) - S:=1; s:=""; Platform.GetArg(S, s); + S:=1; s:=""; Modules.GetArg(S, s); WHILE s[0] = OptionChar DO ScanOptions(s); - INC(S); s:=""; Platform.GetArg(S, s) + INC(S); s:=""; Modules.GetArg(S, s) END; (* Record global option settings for this command line *) @@ -328,10 +328,10 @@ MODULE OPM; (* RC 6.3.89 / 28.6.89, J.Templ 10.7.89 / 22.7.96 *) BEGIN Options := GlobalOptions; Model:=GlobalModel; Alignment := GlobalAlignment; AddressSize := GlobalAddressSize; - s:=""; Platform.GetArg(S, s); + s:=""; Modules.GetArg(S, s); WHILE s[0] = OptionChar DO ScanOptions(s); - INC(S); s:=""; Platform.GetArg(S, s) + INC(S); s:=""; Modules.GetArg(S, s) END; IF mainlinkstat IN Options THEN INCL(Options, mainprog) END; @@ -369,9 +369,9 @@ MODULE OPM; (* RC 6.3.89 / 28.6.89, J.Templ 10.7.89 / 22.7.96 *) BEGIN done := FALSE; curpos := 0; - IF S >= Platform.ArgCount THEN RETURN END ; + IF S >= Modules.ArgCount THEN RETURN END ; - s:=""; Platform.GetArg(S, s); + s:=""; Modules.GetArg(S, s); NEW(T); Texts.Open(T, s); LogWStr(s); LogWStr(" "); diff --git a/src/library/v4/Args.Mod b/src/library/v4/Args.Mod index a196b5c5..578ac7e5 100644 --- a/src/library/v4/Args.Mod +++ b/src/library/v4/Args.Mod @@ -3,7 +3,7 @@ MODULE Args; (* jt, 8.12.94 *) (* command line argument handling for voc (jet backend) *) - IMPORT Platform, SYSTEM; + IMPORT Platform, Modules, SYSTEM; TYPE ArgPtr = POINTER TO ARRAY 1024 OF CHAR; @@ -14,9 +14,9 @@ MODULE Args; (* jt, 8.12.94 *) argv-: SYSTEM.ADDRESS; -PROCEDURE Get* (n: INTEGER; VAR val: ARRAY OF CHAR); BEGIN Platform.GetArg(n, val) END Get; -PROCEDURE GetInt*(n: INTEGER; VAR val: LONGINT); BEGIN Platform.GetIntArg(n, val) END GetInt; -PROCEDURE Pos* (s: ARRAY OF CHAR): INTEGER; BEGIN RETURN Platform.ArgPos(s) END Pos; +PROCEDURE Get* (n: INTEGER; VAR val: ARRAY OF CHAR); BEGIN Modules.GetArg(n, val) END Get; +PROCEDURE GetInt*(n: INTEGER; VAR val: LONGINT); BEGIN Modules.GetIntArg(n, val) END GetInt; +PROCEDURE Pos* (s: ARRAY OF CHAR): INTEGER; BEGIN RETURN Modules.ArgPos(s) END Pos; PROCEDURE GetEnv*(var: ARRAY OF CHAR; VAR val: ARRAY OF CHAR); BEGIN Platform.GetEnv(var, val) END GetEnv; @@ -26,6 +26,6 @@ BEGIN RETURN Platform.getEnv(var, val) END getEnv; BEGIN - argc := Platform.ArgCount; - argv := Platform.ArgVector; + argc := Modules.ArgCount; + argv := Modules.ArgVector; END Args. diff --git a/src/runtime/Heap.Mod b/src/runtime/Heap.Mod index e368ae88..6407f27d 100644 --- a/src/runtime/Heap.Mod +++ b/src/runtime/Heap.Mod @@ -495,8 +495,8 @@ MODULE Heap; END END FINALL; - PROCEDURE -ExternMainStackFrame "extern ADDRESS Platform_MainStackFrame;"; - PROCEDURE -PlatformMainStackFrame(): S.ADDRESS "Platform_MainStackFrame"; + PROCEDURE -ExternMainStackFrame "extern ADDRESS Modules_MainStackFrame;"; + PROCEDURE -ModulesMainStackFrame(): S.ADDRESS "Modules_MainStackFrame"; PROCEDURE MarkStack(n: S.ADDRESS; VAR cand: ARRAY OF S.ADDRESS); VAR @@ -510,7 +510,7 @@ MODULE Heap; END ; IF n = 0 THEN nofcand := 0; sp := S.ADR(frame); - stack0 := PlatformMainStackFrame(); + stack0 := ModulesMainStackFrame(); (* check for minimum alignment of pointers *) inc := S.ADR(align.p) - S.ADR(align); IF sp > stack0 THEN inc := -inc END ; @@ -572,8 +572,8 @@ MODULE Heap; END RegisterFinalizer; -PROCEDURE -ExternHeapInit "extern void *Heap__init();"; -PROCEDURE -HeapModuleInit 'Heap__init()'; + PROCEDURE -ExternHeapInit "extern void *Heap__init();"; + PROCEDURE -HeapModuleInit 'Heap__init()'; PROCEDURE InitHeap*; (* InitHeap is called by Platform.init before any module bodies have been @@ -596,7 +596,7 @@ PROCEDURE -HeapModuleInit 'Heap__init()'; FileCount := 0; modules := NIL; - bigBlocks := 0; + bigBlocks := 0; fin := NIL; interrupted := FALSE; diff --git a/src/runtime/Modules.Mod b/src/runtime/Modules.Mod index 970bc547..8e9c1851 100644 --- a/src/runtime/Modules.Mod +++ b/src/runtime/Modules.Mod @@ -3,7 +3,7 @@ MODULE Modules; (* jt 6.1.96 *) (* access to list of modules and commands, based on ETH Oberon *) - IMPORT SYSTEM, Heap, Platform; + IMPORT SYSTEM, Platform, Heap; (* Note, must import Platform before Heap *) CONST ModNameLen* = 20; @@ -35,6 +35,66 @@ MODULE Modules; (* jt 6.1.96 *) resMsg*: ARRAY 256 OF CHAR; imported*, importing*: ModuleName; + MainStackFrame-: SYSTEM.ADDRESS; + ArgCount-: INTEGER; + ArgVector-: SYSTEM.ADDRESS; + + +(* Program startup *) + + PROCEDURE -ExternInitHeap "extern void Heap_InitHeap();"; + PROCEDURE -InitHeap "Heap_InitHeap()"; + PROCEDURE -ExternInitModulesInit "extern void *Modules__init(void);"; + PROCEDURE -ModulesInit() "Modules__init()"; + + PROCEDURE Init*(argc: SYSTEM.INT32; argvadr: SYSTEM.ADDRESS); + (* This start code is called by the __INIT macro generated by the compiler + as the C main program. *) + TYPE ArgVecPtr = POINTER TO ARRAY 1 OF SYSTEM.ADDRESS; + VAR av: ArgVecPtr; + BEGIN + MainStackFrame := argvadr; + ArgCount := SYSTEM.VAL(INTEGER, argc); + av := SYSTEM.VAL(ArgVecPtr, argvadr); + ArgVector := av[0]; + + InitHeap; (* Initailse heap varaibles neded for compiler generated *__inits *) + ModulesInit(); (* Our own __init code will run the Platform and Heap __init code. *) + END Init; + + + PROCEDURE GetArg*(n: INTEGER; VAR val: ARRAY OF CHAR); + TYPE + ArgPtr = POINTER TO ARRAY 1024 OF CHAR; + ArgVec = POINTER TO ARRAY 1024 OF ArgPtr; + VAR av: ArgVec; + BEGIN + IF n < ArgCount THEN + av := SYSTEM.VAL(ArgVec, ArgVector); + COPY(av[n]^, val) + END + END GetArg; + + PROCEDURE GetIntArg*(n: INTEGER; VAR val: LONGINT); + VAR s: ARRAY 64 OF CHAR; k, d, i: LONGINT; + BEGIN + s := ""; GetArg(n, s); i := 0; + IF s[0] = "-" THEN i := 1 END ; + k := 0; d := ORD(s[i]) - ORD("0"); + WHILE (d >= 0 ) & (d <= 9) DO k := k*10 + d; INC(i); d := ORD(s[i]) - ORD("0") END ; + IF s[0] = "-" THEN k := -k; DEC(i) END ; + IF i > 0 THEN val := k END + END GetIntArg; + + PROCEDURE ArgPos*(s: ARRAY OF CHAR): INTEGER; + VAR i: INTEGER; arg: ARRAY 256 OF CHAR; + BEGIN + i := 0; GetArg(i, arg); + WHILE (i < ArgCount) & (s # arg) DO INC(i); GetArg(i, arg) END ; + RETURN i + END ArgPos; + + PROCEDURE Append(VAR a: ARRAY OF CHAR; b: ARRAY OF CHAR); VAR i, j: INTEGER; @@ -95,7 +155,7 @@ MODULE Modules; (* jt 6.1.96 *) PROCEDURE errch(c: CHAR); (* Here we favour simplicity over efficiency, so no buffering. *) VAR e: Platform.ErrorCode; - BEGIN e := Platform.Write(1, SYSTEM.ADR(c), 1) + BEGIN e := Platform.Write(Platform.StdOut, SYSTEM.ADR(c), 1) END errch; PROCEDURE errstring(s: ARRAY OF CHAR); diff --git a/src/runtime/Oberon.Mod b/src/runtime/Oberon.Mod index fbc3abd4..c67dcf17 100644 --- a/src/runtime/Oberon.Mod +++ b/src/runtime/Oberon.Mod @@ -2,7 +2,7 @@ MODULE Oberon; (* this version should not have dependency on graphics -- noch *) - IMPORT Platform, Texts, Out; + IMPORT Platform, Modules, Texts, Out; TYPE ParList* = POINTER TO ParRec; @@ -38,11 +38,11 @@ PROCEDURE PopulateParams; BEGIN Texts.OpenWriter(W); i := 1; (* skip program name *) - WHILE i < Platform.ArgCount DO - Platform.GetArg(i, str); Texts.WriteString(W, str); Texts.Write(W, " "); + WHILE i < Modules.ArgCount DO + Modules.GetArg(i, str); Texts.WriteString(W, str); Texts.Write(W, " "); INC(i) END; - Texts.Append (Par^.text, W.buf); + Texts.Append(Par^.text, W.buf); END PopulateParams; PROCEDURE GetSelection*(VAR text: Texts.Text; VAR beg, end, time: LONGINT); diff --git a/src/runtime/Platformunix.Mod b/src/runtime/Platformunix.Mod index fa22d7ee..79ae5e7f 100644 --- a/src/runtime/Platformunix.Mod +++ b/src/runtime/Platformunix.Mod @@ -7,7 +7,6 @@ CONST StdErr- = 2; TYPE - HaltProcedure = PROCEDURE(n: SYSTEM.INT32); SignalHandler = PROCEDURE(signal: SYSTEM.INT32); ErrorCode* = INTEGER; @@ -19,21 +18,13 @@ TYPE mtime: LONGINT; (* File modification time, value is system dependent *) END; - EnvPtr = POINTER TO ARRAY 1024 OF CHAR; - ArgPtr = POINTER TO ARRAY 1024 OF CHAR; - ArgVec = POINTER TO ARRAY 1024 OF ArgPtr; - ArgVecPtr = POINTER TO ARRAY 1 OF SYSTEM.ADDRESS; - - VAR LittleEndian-: BOOLEAN; - MainStackFrame-: SYSTEM.ADDRESS; PID-: INTEGER; (* Note: Must be updated by Fork implementation *) CWD-: ARRAY 256 OF CHAR; ArgCount-: INTEGER; ArgVector-: SYSTEM.ADDRESS; - HaltHandler: HaltProcedure; TimeStart: LONGINT; SeekSet-: INTEGER; @@ -118,72 +109,24 @@ PROCEDURE OSFree*(address: SYSTEM.ADDRESS); BEGIN free(address) END OSFree; -(* Program startup *) - -PROCEDURE -ExternInitHeap "extern void Heap_InitHeap();"; -PROCEDURE -HeapInitHeap() "Heap_InitHeap()"; - -PROCEDURE Init*(argc: SYSTEM.INT32; argvadr: SYSTEM.ADDRESS); -VAR av: ArgVecPtr; -BEGIN - MainStackFrame := argvadr; - ArgCount := SYSTEM.VAL(INTEGER, argc); - av := SYSTEM.VAL(ArgVecPtr, argvadr); - ArgVector := av[0]; - - (* This function (Platform.Init) is called at program startup BEFORE any - modules have been initalised. In turn we must initialise the heap - before module startup (xxx__init) code is run. *) - HeapInitHeap(); -END Init; - - - - (* Program arguments and environment access *) -PROCEDURE -getenv(var: ARRAY OF CHAR): EnvPtr "(Platform_EnvPtr)getenv((char*)var)"; +PROCEDURE -getenv(var: ARRAY OF CHAR): SYSTEM.ADDRESS "getenv((char*)var)"; PROCEDURE getEnv*(var: ARRAY OF CHAR; VAR val: ARRAY OF CHAR): BOOLEAN; - VAR p: EnvPtr; +TYPE EnvPtr = POINTER TO ARRAY 1024 OF CHAR; +VAR p: EnvPtr; BEGIN - p := getenv(var); + p := SYSTEM.VAL(EnvPtr, getenv(var)); IF p # NIL THEN COPY(p^, val) END; RETURN p # NIL; END getEnv; PROCEDURE GetEnv*(var: ARRAY OF CHAR; VAR val: ARRAY OF CHAR); BEGIN - IF ~ getEnv(var, val) THEN val[0] := 0X END; + IF ~getEnv(var, val) THEN val[0] := 0X END; END GetEnv; -PROCEDURE GetArg*(n: INTEGER; VAR val: ARRAY OF CHAR); - VAR av: ArgVec; -BEGIN - IF n < ArgCount THEN - av := SYSTEM.VAL(ArgVec,ArgVector); - COPY(av[n]^, val) - END -END GetArg; - -PROCEDURE GetIntArg*(n: INTEGER; VAR val: LONGINT); - VAR s: ARRAY 64 OF CHAR; k, d, i: LONGINT; -BEGIN - s := ""; GetArg(n, s); i := 0; - IF s[0] = "-" THEN i := 1 END ; - k := 0; d := ORD(s[i]) - ORD("0"); - WHILE (d >= 0 ) & (d <= 9) DO k := k*10 + d; INC(i); d := ORD(s[i]) - ORD("0") END ; - IF s[0] = "-" THEN k := -k; DEC(i) END ; - IF i > 0 THEN val := k END -END GetIntArg; - -PROCEDURE ArgPos*(s: ARRAY OF CHAR): INTEGER; - VAR i: INTEGER; arg: ARRAY 256 OF CHAR; -BEGIN - i := 0; GetArg(i, arg); - WHILE (i < ArgCount) & (s # arg) DO INC(i); GetArg(i, arg) END ; - RETURN i -END ArgPos; diff --git a/src/runtime/Platformwindows.Mod b/src/runtime/Platformwindows.Mod index 808e2e0d..44337f22 100644 --- a/src/runtime/Platformwindows.Mod +++ b/src/runtime/Platformwindows.Mod @@ -8,7 +8,6 @@ IMPORT SYSTEM; TYPE - HaltProcedure = PROCEDURE(n: SYSTEM.INT32); SignalHandler = PROCEDURE(signal: SYSTEM.INT32); ErrorCode* = INTEGER; @@ -22,22 +21,10 @@ TYPE mtimelow: LONGINT; (* File modification time, value is system dependent *) END; - EnvPtr = POINTER TO ARRAY 1024 OF CHAR; - ArgPtr = POINTER TO ARRAY 1024 OF CHAR; - ArgVec = POINTER TO ARRAY 1024 OF ArgPtr; - ArgVecPtr = POINTER TO ARRAY 1 OF SYSTEM.ADDRESS; - - VAR LittleEndian-: BOOLEAN; - MainStackFrame-: SYSTEM.ADDRESS; - HaltCode-: LONGINT; PID-: INTEGER; (* Note: Must be updated by Fork implementation *) CWD-: ARRAY 4096 OF CHAR; - ArgCount-: INTEGER; - - ArgVector-: SYSTEM.ADDRESS; - HaltHandler: HaltProcedure; TimeStart: LONGINT; SeekSet-: INTEGER; @@ -117,29 +104,6 @@ PROCEDURE OSFree*(address: SYSTEM.ADDRESS); BEGIN free(address) END OSFree; -(* Program startup *) - -PROCEDURE -ExternInitHeap "extern void Heap_InitHeap();"; -PROCEDURE -HeapInitHeap() "Heap_InitHeap()"; - -PROCEDURE Init*(argc: SYSTEM.INT32; argvadr: SYSTEM.ADDRESS); -VAR av: ArgVecPtr; -BEGIN - MainStackFrame := argvadr; - ArgCount := SYSTEM.VAL(INTEGER, argc); - av := SYSTEM.VAL(ArgVecPtr, argvadr); - ArgVector := av[0]; - HaltCode := -128; - - (* This function (Platform.Init) is called at program startup BEFORE any - modules have been initalised. In turn we must initialise the heap - before module startup (xxx__init) code is run. *) - HeapInitHeap(); -END Init; - - - - (* Program arguments and environmet access *) PROCEDURE -getenv(name: ARRAY OF CHAR; VAR buf: ARRAY OF CHAR): INTEGER @@ -164,34 +128,6 @@ BEGIN IF ~getEnv(var, val) THEN val[0] := 0X END; END GetEnv; -PROCEDURE GetArg*(n: INTEGER; VAR val: ARRAY OF CHAR); - VAR av: ArgVec; -BEGIN - IF n < ArgCount THEN - av := SYSTEM.VAL(ArgVec,ArgVector); - COPY(av[n]^, val) - END -END GetArg; - -PROCEDURE GetIntArg*(n: INTEGER; VAR val: LONGINT); - VAR s: ARRAY 64 OF CHAR; k, d, i: LONGINT; -BEGIN - s := ""; GetArg(n, s); i := 0; - IF s[0] = "-" THEN i := 1 END ; - k := 0; d := ORD(s[i]) - ORD("0"); - WHILE (d >= 0 ) & (d <= 9) DO k := k*10 + d; INC(i); d := ORD(s[i]) - ORD("0") END ; - IF s[0] = "-" THEN k := -k; DEC(i) END ; - IF i > 0 THEN val := k END -END GetIntArg; - -PROCEDURE ArgPos*(s: ARRAY OF CHAR): INTEGER; - VAR i: INTEGER; arg: ARRAY 256 OF CHAR; -BEGIN - i := 0; GetArg(i, arg); - WHILE (i < ArgCount) & (s # arg) DO INC(i); GetArg(i, arg) END ; - RETURN i -END ArgPos; - @@ -559,8 +495,6 @@ PROCEDURE -getpid(): INTEGER "(INTEGER)GetCurrentProcessId()"; BEGIN TestLittleEndian; - HaltCode := -128; - HaltHandler := NIL; TimeStart := 0; TimeStart := Time(); CWD := ""; getCurrentDirectory(CWD); PID := getpid(); diff --git a/src/runtime/SYSTEM.h b/src/runtime/SYSTEM.h index ff4c724d..f6936068 100644 --- a/src/runtime/SYSTEM.h +++ b/src/runtime/SYSTEM.h @@ -258,10 +258,10 @@ extern void Heap_INCREF(); // Main module initialisation, registration and finalisation -extern void Platform_Init(INT32 argc, ADDRESS argv); +extern void Modules_Init(INT32 argc, ADDRESS argv); extern void Heap_FINALL(); -#define __INIT(argc, argv) static void *m; Platform_Init(argc, (ADDRESS)&argv); +#define __INIT(argc, argv) static void *m; Modules_Init(argc, (ADDRESS)&argv); #define __REGMAIN(name, enum) m = Heap_REGMOD((CHAR*)name,enum) #define __FINI Heap_FINALL(); return 0 diff --git a/src/tools/browser/BrowserCmd.Mod b/src/tools/browser/BrowserCmd.Mod index d463c22d..14df830f 100644 --- a/src/tools/browser/BrowserCmd.Mod +++ b/src/tools/browser/BrowserCmd.Mod @@ -3,7 +3,7 @@ MODULE BrowserCmd; (* RC 29.10.93 *) (* object model 4.12.93, command line ver IMPORT OPM, OPS, OPT, OPV, Texts, Strings, Files, Out, - Oberon, Platform, SYSTEM, Configuration; + Oberon, Modules, SYSTEM, Configuration; CONST OptionChar = "-"; @@ -265,13 +265,13 @@ MODULE BrowserCmd; (* RC 29.10.93 *) (* object model 4.12.93, command line ver PROCEDURE ShowDef*; VAR S, vname, name: OPS.Name; BEGIN - option := 0X; Platform.GetArg(1, S); - IF Platform.ArgCount > 2 THEN - IF S[0] = OptionChar THEN option := S[1]; Platform.GetArg(2, S) - ELSE Platform.GetArg(2, vname); option := vname[1] + option := 0X; Modules.GetArg(1, S); + IF Modules.ArgCount > 2 THEN + IF S[0] = OptionChar THEN option := S[1]; Modules.GetArg(2, S) + ELSE Modules.GetArg(2, vname); option := vname[1] END END; - IF Platform.ArgCount >= 2 THEN + IF Modules.ArgCount >= 2 THEN Ident(S, name); OPT.Init(name, {}); OPT.SelfName := "AvoidErr154"; WModule(name, Oberon.Log);