par_em2.e 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. mes 2,2,4
  2. exp $top_size
  3. pro $top_size, 14
  4. ldl 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 14
  9. exp $top_save
  10. pro $top_save, 0
  11. loe 0
  12. lde 4 ; load line number and file name
  13. lim ; ignore mask
  14. lor 0 ; LB
  15. ldl 0 ; size of block
  16. loc 4
  17. loc 2
  18. cuu
  19. dup 2
  20. stl 0 ; push & store size in 2 bytes
  21. lor 1 ; SP (the SP BEFORE pushing)
  22. lor 1 ; SP (address of stack top to save)
  23. ldl 4 ; area
  24. lol 0 ; size
  25. bls 2 ; move whole block
  26. asp 18 ; remove the lot from the stack
  27. loc 1
  28. ret 2 ; return 1
  29. end 0
  30. exp $top_load
  31. pro $top_load, 0
  32. ldl 0
  33. dup 4
  34. sde area ; copy area pointer from argument 0
  35. loi 4 ; load indirect to
  36. str 1 ; restore SP
  37. lde area ; load area, note that the SP is now correct
  38. lor 1 ; SP (the SP AFTER, see above)
  39. lde area
  40. lof 4 ; size of block
  41. bls 2 ; move block back (SP becomes the SP BEFORE again!)
  42. asp 2 ; drop size
  43. str 0 ; LB
  44. sim ; ignore mask
  45. sde 4
  46. ste 0 ; line and file
  47. loc 0
  48. ret 2 ; return 0
  49. end 0
  50. area
  51. bss 4,0,0