123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- #
- mes 2,EM_WSIZE,EM_PSIZE
- exp $top_size
- #ifdef __sparc
- inp $top_size2
- pro $top_size, 0
- mes 11
- zer EM_PSIZE
- lal 0
- loi EM_PSIZE
- cal $top_size2
- asp 2*EM_PSIZE
- lfr EM_WSIZE
- ret EM_WSIZE
- end 0
- pro $top_size2, 3*EM_WSIZE+3*EM_PSIZE
- #else
- pro $top_size, 3*EM_WSIZE+3*EM_PSIZE
- #endif
- mes 11
- lal 0
- loi EM_PSIZE ; s_brk
- lor 1 ; s_brk SP
- sbs EM_PSIZE ; s_brk-SP
- ret EM_PSIZE ; return size of block to be saved
- end 3*EM_WSIZE+3*EM_PSIZE
- exp $top_save
- #ifdef __sparc
- inp $top_save2
- pro $top_save,0
- mes 11
- lal 0
- loi 2*EM_PSIZE
- cal $top_save2
- asp 2*EM_PSIZE
- lfr EM_WSIZE
- ret EM_WSIZE
- end 0
- pro $top_save2,0
- #else
- pro $top_save, 0
- #endif
- mes 11
- loe 0
- lae 4 ; load line number and file name
- loi EM_PSIZE
- lim ; ignore mask
- lor 0 ; LB
- lal 0
- loi EM_PSIZE ; size of block
- loc EM_PSIZE
- loc EM_WSIZE
- cuu
- dup EM_WSIZE
- stl 0 ; push & store size in 2 bytes
- lor 1 ; SP (the SP BEFORE pushing)
- lor 1 ; SP (address of stack top to save)
- lal EM_PSIZE ; area
- loi EM_PSIZE
- lol 0 ; size
- bls EM_WSIZE ; move whole block
- asp 3*EM_PSIZE+3*EM_WSIZE ; remove the lot from the stack
- loc 1
- ret EM_WSIZE ; return 1
- end 0
- sv
- bss EM_PSIZE, 0, 0
- exp $top_load
- #ifdef __sparc
- inp $top_load1
- pro $top_load,0
- lal 0
- loi EM_PSIZE
- cal $top_load1
- asp EM_PSIZE
- lfr EM_WSIZE
- ret EM_WSIZE
- end 0
- pro $top_load1, 0
- #else
- pro $top_load, 0
- #endif
- mes 11
- lal 0
- loi EM_PSIZE
- lae sv
- sti EM_PSIZE
- lxl 0
- 2
- dup EM_PSIZE
- adp -3*EM_PSIZE
- lal 0
- loi EM_PSIZE ; compare target SP with current LB to see if we must
- loi EM_PSIZE
- cmp ; find another LB first
- zgt *1
- dch ; just follow dynamic chain to make sure we find
- ; a legal one
- bra *2
- 1
- str 0
- lae sv
- loi EM_PSIZE
- loi EM_PSIZE
- str 1 ; restore SP
- asp -EM_PSIZE
- lae sv
- loi EM_PSIZE
- lor 1 ; SP (the SP AFTER, see above)
- adp EM_PSIZE
- lae sv
- loi EM_PSIZE
- lof EM_PSIZE ; size of block
- bls EM_WSIZE ; move block back (SP becomes the SP BEFORE again!)
- asp EM_WSIZE+EM_PSIZE ; drop size + SP
- str 0 ; LB
- sim ; ignore mask
- lae 4
- sti EM_PSIZE
- ste 0 ; line and file
- loc 0
- ret EM_WSIZE ; return 0
- end 0
|