IMPLEMENTATION MODULE Stack ; FROM Memory IMPORT WriteSlot, ReadSlot ; FROM Local IMPORT GetSP, SetSP ; TYPE RealView = RECORD CASE : BOOLEAN OF | TRUE: r : REAL ; | FALSE: v : LONGCARD ; END ; END ; QuadView = RECORD CASE : BOOLEAN OF | TRUE: r : LONGREAL ; | FALSE: lo, hi : LONGCARD ; END ; END ; VAR rv : RealView ; qv : QuadView ; PROCEDURE Push (v: LONGCARD) ; BEGIN SetSP (GetSP () - 8) ; WriteSlot (GetSP (), v) ; END Push ; PROCEDURE Pop () : LONGCARD ; VAR v: LONGCARD ; BEGIN v := ReadSlot (GetSP ()) ; SetSP (GetSP () + 8) ; RETURN v ; END Pop ; PROCEDURE PushInt (v: INTEGER) ; BEGIN Push (VAL (LONGCARD, v)) ; END PushInt ; PROCEDURE PopInt () : INTEGER ; BEGIN RETURN VAL (INTEGER, VAL (CARDINAL, Pop ())) ; END PopInt ; PROCEDURE PushCard (v: CARDINAL) ; BEGIN Push (VAL (LONGCARD, v)) ; END PushCard ; PROCEDURE PopCard () : CARDINAL ; BEGIN RETURN VAL (CARDINAL, Pop ()) ; END PopCard ; PROCEDURE PushBool (v: BOOLEAN) ; BEGIN IF v THEN Push (1) ; ELSE Push (0) ; END ; END PushBool ; PROCEDURE PopBool () : BOOLEAN ; BEGIN RETURN Pop () # 0 ; END PopBool ; PROCEDURE PushLongInt (v: LONGINT) ; BEGIN Push (VAL (LONGCARD, v)) ; END PushLongInt ; PROCEDURE PopLongInt () : LONGINT ; BEGIN RETURN VAL (LONGINT, Pop ()) ; END PopLongInt ; PROCEDURE PushLongCard (v: LONGCARD) ; BEGIN Push (v) ; END PushLongCard ; PROCEDURE PopLongCard () : LONGCARD ; BEGIN RETURN Pop () ; END PopLongCard ; PROCEDURE PushReal (v: REAL) ; BEGIN rv.r := v ; Push (rv.v) ; END PushReal ; PROCEDURE PopReal () : REAL ; BEGIN rv.v := Pop () ; RETURN rv.r ; END PopReal ; PROCEDURE PushQuad (v: LONGREAL) ; BEGIN qv.r := v ; Push (qv.hi) ; Push (qv.lo) ; END PushQuad ; PROCEDURE PopQuad () : LONGREAL ; BEGIN qv.lo := Pop () ; qv.hi := Pop () ; RETURN qv.r ; END PopQuad ; PROCEDURE Reserve (n: CARDINAL) ; BEGIN SetSP (GetSP () - VAL (LONGCARD, n) * 8) ; END Reserve ; END Stack.