mes 2,2,4 exp $top_size pro $top_size, 14 ldl 0 ; s_brk lor 1 ; s_brk SP sbs 4 ; s_brk-SP ret 4 ; return size of block to be saved end 14 exp $top_save pro $top_save, 0 loe 0 lde 4 ; load line number and file name lim ; ignore mask lor 0 ; LB ldl 0 ; size of block loc 4 loc 2 cuu dup 2 stl 0 ; push & store size in 2 bytes lor 1 ; SP (the SP BEFORE pushing) lor 1 ; SP (address of stack top to save) ldl 4 ; area lol 0 ; size bls 2 ; move whole block asp 18 ; remove the lot from the stack loc 1 ret 2 ; return 1 end 0 exp $top_load pro $top_load, 0 ldl 0 dup 4 sde area ; copy area pointer from argument 0 loi 4 ; load indirect to str 1 ; restore SP lde area ; load area, note that the SP is now correct lor 1 ; SP (the SP AFTER, see above) lde area lof 4 ; size of block bls 2 ; move block back (SP becomes the SP BEFORE again!) asp 2 ; drop size str 0 ; LB sim ; ignore mask sde 4 ste 0 ; line and file loc 0 ret 2 ; return 0 end 0 area bss 4,0,0