| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- 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.
|