par_em4.e 978 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. mes 2,4,4
  2. exp $top_size
  3. pro $top_size, 20
  4. lol 0 ; s_brk
  5. lor 1 ; s_brk SP
  6. sbs 4 ; s_brk-SP
  7. ret 4 ; return size of block to be saved
  8. end 20
  9. exp $top_save
  10. pro $top_save, 0
  11. lde 0 ; load line number and file name
  12. lim ; ignore mask
  13. lor 0 ; LB
  14. lol 0 ; size of block
  15. lor 1 ; SP (the SP BEFORE pushing)
  16. lor 1 ; SP (address of stack top to save)
  17. lol 4 ; area
  18. lol 0 ; size
  19. bls 4 ; move whole block
  20. asp 24 ; remove the lot from the stack
  21. loc 1
  22. ret 4 ; return 1
  23. end 0
  24. exp $top_load
  25. pro $top_load, 0
  26. lol 0
  27. dup 4
  28. ste area ; copy area pointer from argument 0
  29. loi 4 ; load indirect to
  30. str 1 ; restore sp
  31. loe area ; load area, note that the SP is now correct
  32. lor 1 ; SP (the SP AFTER, see above)
  33. loe area
  34. lof 4 ; size of block
  35. bls 4 ; move block back (SP becomes the SP BEFORE again!)
  36. asp 4 ; drop size
  37. str 0 ; LB
  38. sim ; ignore mask
  39. sde 0 ; line and file
  40. loc 0
  41. ret 4 ; return 0
  42. end 0
  43. area
  44. bss 4,0,0