Stack.mod 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. IMPLEMENTATION MODULE Stack ;
  2. FROM Memory IMPORT WriteSlot, ReadSlot ;
  3. FROM Local IMPORT GetSP, SetSP ;
  4. TYPE
  5. RealView = RECORD CASE : BOOLEAN OF
  6. | TRUE: r : REAL ;
  7. | FALSE: v : LONGCARD ;
  8. END ;
  9. END ;
  10. QuadView = RECORD CASE : BOOLEAN OF
  11. | TRUE: r : LONGREAL ;
  12. | FALSE: lo, hi : LONGCARD ;
  13. END ;
  14. END ;
  15. VAR
  16. rv : RealView ;
  17. qv : QuadView ;
  18. PROCEDURE Push (v: LONGCARD) ;
  19. BEGIN
  20. SetSP (GetSP () - 8) ;
  21. WriteSlot (GetSP (), v) ;
  22. END Push ;
  23. PROCEDURE Pop () : LONGCARD ;
  24. VAR v: LONGCARD ;
  25. BEGIN
  26. v := ReadSlot (GetSP ()) ;
  27. SetSP (GetSP () + 8) ;
  28. RETURN v ;
  29. END Pop ;
  30. PROCEDURE PushInt (v: INTEGER) ;
  31. BEGIN
  32. Push (VAL (LONGCARD, v)) ;
  33. END PushInt ;
  34. PROCEDURE PopInt () : INTEGER ;
  35. BEGIN
  36. RETURN VAL (INTEGER, VAL (CARDINAL, Pop ())) ;
  37. END PopInt ;
  38. PROCEDURE PushCard (v: CARDINAL) ;
  39. BEGIN
  40. Push (VAL (LONGCARD, v)) ;
  41. END PushCard ;
  42. PROCEDURE PopCard () : CARDINAL ;
  43. BEGIN
  44. RETURN VAL (CARDINAL, Pop ()) ;
  45. END PopCard ;
  46. PROCEDURE PushBool (v: BOOLEAN) ;
  47. BEGIN
  48. IF v THEN
  49. Push (1) ;
  50. ELSE
  51. Push (0) ;
  52. END ;
  53. END PushBool ;
  54. PROCEDURE PopBool () : BOOLEAN ;
  55. BEGIN
  56. RETURN Pop () # 0 ;
  57. END PopBool ;
  58. PROCEDURE PushLongInt (v: LONGINT) ;
  59. BEGIN
  60. Push (VAL (LONGCARD, v)) ;
  61. END PushLongInt ;
  62. PROCEDURE PopLongInt () : LONGINT ;
  63. BEGIN
  64. RETURN VAL (LONGINT, Pop ()) ;
  65. END PopLongInt ;
  66. PROCEDURE PushLongCard (v: LONGCARD) ;
  67. BEGIN
  68. Push (v) ;
  69. END PushLongCard ;
  70. PROCEDURE PopLongCard () : LONGCARD ;
  71. BEGIN
  72. RETURN Pop () ;
  73. END PopLongCard ;
  74. PROCEDURE PushReal (v: REAL) ;
  75. BEGIN
  76. rv.r := v ;
  77. Push (rv.v) ;
  78. END PushReal ;
  79. PROCEDURE PopReal () : REAL ;
  80. BEGIN
  81. rv.v := Pop () ;
  82. RETURN rv.r ;
  83. END PopReal ;
  84. PROCEDURE PushQuad (v: LONGREAL) ;
  85. BEGIN
  86. qv.r := v ;
  87. Push (qv.hi) ;
  88. Push (qv.lo) ;
  89. END PushQuad ;
  90. PROCEDURE PopQuad () : LONGREAL ;
  91. BEGIN
  92. qv.lo := Pop () ;
  93. qv.hi := Pop () ;
  94. RETURN qv.r ;
  95. END PopQuad ;
  96. PROCEDURE Reserve (n: CARDINAL) ;
  97. BEGIN
  98. SetSP (GetSP () - VAL (LONGCARD, n) * 8) ;
  99. END Reserve ;
  100. END Stack.