DIRECTORY Basics USING [DoubleAnd, DoubleShiftRight, LongNumber], BasicTime USING [GetClockPulses, PulsesToMicroseconds], Commander USING [CommandProc, Register], IO USING [time, PutFR, STREAM], PascalBasic, Process USING [priorityNormal, SetPriority], Rope USING [Fetch, Length], SafeStorage USING [GetSystemZone], UnsafeStorage USING [GetSystemUZone]; PascalBasicImpl: CEDAR MONITOR IMPORTS Basics, BasicTime, Commander, IO, Process, Rope, SafeStorage, UnsafeStorage EXPORTS PascalBasic = BEGIN OPEN PascalBasic; PascalZone: PUBLIC UNCOUNTED ZONE; PascalStaticZone: PUBLIC UNCOUNTED ZONE; z: PUBLIC ZONE; -- for the runtime's own use subsystemName: PUBLIC ROPE; commandLineTail: PUBLIC ROPE; clientData: PUBLIC REF ANY; ttyInputStream: PUBLIC IO.STREAM; ttyOutputStream: PUBLIC IO.STREAM; startTime: LONG CARDINAL; NumericInputError: PUBLIC SIGNAL = CODE; PascalHalt: PUBLIC SIGNAL = CODE; AttemptToDisposeInvalidPointer: PUBLIC SIGNAL = CODE; SubsystemProcRec: PUBLIC ProcRec; ExclusiveProc: PUBLIC ENTRY CommandProc = TRUSTED BEGIN ENABLE UNWIND => Process.SetPriority[Process.priorityNormal]; commandLineTail_cmd.commandLine; clientData_cmd.procData.clientData; ttyInputStream_cmd.in; ttyOutputStream_cmd.out; SubsystemProcRec.p[]; END; PascalShiftR: PROC [t: --nonneg-- INT, lg: NAT] RETURNS [INT] = INLINE { RETURN [Basics.DoubleShiftRight[[li[t]],lg].li] }; PascalDIVPower2: PUBLIC PROC [i: INT, lg: NAT] RETURNS [INT] = { RETURN [IF i >= 0 THEN PascalShiftR[i, lg] ELSE -PascalShiftR[-i, lg]]; }; PascalMask: PROC [a, b: INT] RETURNS [INT] = INLINE { RETURN [Basics.DoubleAnd[[li[a]], [li[b]]].li] }; PascalMODPower2Mask: PUBLIC PROC [i: INT, mask: --nonneg-- INT] RETURNS [INT] = { RETURN [IF i >= 0 THEN PascalMask[i, mask] ELSE -PascalMask[-i, mask]]; }; PascalRegister: PUBLIC PROCEDURE[name: ROPE, proc: UnsafeCommandProc] = BEGIN SubsystemProcRec.p _ proc; subsystemName _ name; Commander.Register[key: name, proc: ExclusiveProc, doc: "A Pascal program"]; END; PascalDATE: PUBLIC PROCEDURE [a: LONG POINTER TO Alfa] = TRUSTED BEGIN OPEN IO, Rope; s: ROPE _ PutFR[v1: IO.time[]]; i: CARDINAL; day, yr: INT; FOR day _ 1, day+1 WHILE Fetch[s, day-1]#' DO ENDLOOP; FOR yr _ day+1, yr+1 WHILE Fetch[s, yr-1]#' DO ENDLOOP; IF Fetch[s, day+1] NOT IN ['0..'9] THEN day _ day-1; FOR i IN [0..1] DO a[1+i] _ Fetch[s, day+i] ENDLOOP; a[3] _ '-; FOR i IN [0..2] DO a[4+i] _ Fetch[s, i] ENDLOOP; a[7] _ '-; FOR i IN [0..1] DO a[8+i] _ Fetch[s, yr+2+i] ENDLOOP; FOR i IN [10..LAST[AlfaIndex]] DO a[i] _ ' ENDLOOP; END; -- of PascalDATE PascalTIME: PUBLIC PROCEDURE [a: LONG POINTER TO Alfa] = TRUSTED BEGIN OPEN IO, Rope; s: ROPE _ PutFR[v1: IO.time[]]; i: CARDINAL; time, j: INT _ 0; FOR group: [1..3] IN [1..3] DO FOR time _ time+1, time+1 WHILE Fetch[s, time-1]#' DO ENDLOOP; ENDLOOP; i _ 1; FOR j IN [time..Length[s]) DO a[i] _ Fetch[s, j]; i _ i+1 ENDLOOP; FOR i IN [i..LAST[AlfaIndex]] DO a[i] _ ' ENDLOOP; END; -- of PascalTIME PascalReadClock: PUBLIC PROCEDURE RETURNS [PascalInteger] = BEGIN RETURN[(BasicTime.PulsesToMicroseconds[BasicTime.GetClockPulses[]]-startTime+500)/1000]; END; -- ms since program start TRUSTED {PascalZone _ UnsafeStorage.GetSystemUZone[]; PascalStaticZone _ UnsafeStorage.GetSystemUZone[]}; z _ SafeStorage.GetSystemZone[]; startTime _ BasicTime.PulsesToMicroseconds[BasicTime.GetClockPulses[]]; END. -- PascalBasicImpl Hfile: PascalBasicImpl.mesa last modified by Ramshaw, February 3, 1984 8:45 pm written by McCreight, December 19, 1980 10:44 AM Changed by Pavel on May 9, 1985 5:17:19 pm PDT Michael Plass, September 27, 1985 10:06:40 am PDT the basics of Pascal runtime support in Cedar: storage, arithmetic, date, time, stringcompare, and CommandProc stuff May 9, 1985: Pavel changed this into a MONITOR with ExclusiveProc as its only ENTRY as part of moving it to Cedar6.0. This replaced a scheme involving Resource.Acquire on the atom which was the name of the program. V A R I A B L E S Note: These variables are the reason why the Pascal runtime environment isn't re-entrant at the moment. S I G N A L S P R O C E D U R E S s contains something like "March 26, 1982 2:47 pm" s contains something like "March 26, 1982 2:47 pm" Initialization Κί˜Jšœ™Jšœ2™2šœ`™`Icode™1—J˜Jšœ.™.JšœE™EJ™J™ΧJ˜šΟk ˜ Jšœœ+˜7Jšœ œ(˜7Jšœ œ˜(Jšœœœ˜J˜ Jšœœ˜,Jšœœ˜Jšœ œ˜"Jšœœ˜%J˜—šœœ˜š˜Jšœœ+˜K—Jšœ˜J˜Jšœœ ˜J˜J˜Jšœ™J˜Jšœ3™3Jšœ3™3J˜Jšœ œ œœ˜"Jšœœ œœ˜(JšœœœΟc˜.J˜Jšœœœ˜Jšœ œ˜Jšœ  œœ˜Jšœœœœ˜!Jšœœœœ˜"J˜Jšœ œœ˜J˜J˜Jšœ ™ J˜Jšœœœœ˜(Jšœ œœœ˜!Jšœ œœœ˜5J˜J˜Jšœ™J˜Jšœœ ˜!J˜šœ œ˜)Jšœ˜ šœœ˜Jšœ,˜,—J˜J˜ Jšœ#˜#Jšœ˜Jšœ˜J˜Jšœ˜J˜—šΟn œœž œœœœœœ˜HKšœ)˜/Kšœ˜K˜—šŸœœœœœœœ˜@Kšœœœœ˜GKšœ˜K˜—š Ÿ œœœœœœ˜5Kšœ(˜.Kšœ˜K˜—šŸœœœœž œœœœ˜QKšœœœœ˜GKšœ˜K˜—šŸœœ œœ˜GJš˜J˜J˜J˜LJšœ˜J˜—š Ÿ œœ œœœœ˜8Jšœœœœ˜Jšœœ œ ˜Jšœ2™2Jšœœ˜ Jšœ œ˜ Jšœœœœ˜7Jšœœœœ˜8Jšœœœ œ ˜4Jšœœœœ˜4J˜ Jšœœœœ˜0J˜ Jšœœœœ˜5Jš œœœ œ œ˜3Jšœž˜J˜J˜—š Ÿ œœ œœœœ˜8Jšœœœœ˜Jšœœ œ ˜Jšœ2™2Jšœœ˜ Jšœ œ˜šœœ˜Jšœœœœ˜?Jšœ˜—J˜Jšœœœœ˜BJš œœœ œ œ˜3Jšœž˜J˜J˜—šŸœœ œœ˜;Jš˜JšœR˜XJšœž˜J˜—Jšœ™J˜Jšœ.˜5J˜3J˜ J˜J˜GJ˜Jšœž˜J˜J˜J˜J˜——…— Ls