ack/mach/proto/grind/par_misc.e
1991-09-16 11:47:43 +00:00

92 lines
1.7 KiB
Plaintext

#
;
; (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands.
; See the copyright notice in the ACK home directory, in the file "Copyright".
;
;
; Module: coroutine primitives
; Author: Kees Bot, Edwin Scheffer, Ceriel Jacobs
; Version: $Header$
;
; This has been taken from the ACK Modula-2 runtime system and adapted.
;
mes 2,EM_WSIZE,EM_PSIZE
;
; ___topsave: save the stack by sending it to the debugger
;
exp $___topsave
pro $___topsave, 0
mes 11
loe 0
lae 4 ; load line number and file name
loi EM_PSIZE
lim ; load ignore mask
lor 0 ; load LB
; now find the last argument base: first find the local base that has
; dynamic link 0.
lor 0
1
dup EM_PSIZE
dch
zer EM_PSIZE
cmp
zeq *2
dch
bra *1
2
lpb ; last argument base
; Now the stuff between the current stack pointer and this argument base
; is saved by sending it to the debugger.
lor 1
sbs EM_WSIZE
loc EM_WSIZE
adu EM_WSIZE ; gives size
lor 1 ; SP (the SP BEFORE pushing)
lor 1 ; SP (address of stack top to save)
cal $___sendtop ; ___sendtop(char *address, char *SP, unsigned size)
asp 4*EM_PSIZE+3*EM_WSIZE ; remove the lot from the stack
loc 1
ret EM_WSIZE ; return 1
end 0
exp $___topload
pro $___topload, 0
lal 0
loi EM_PSIZE
lxl 0
2
dup 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
str 1 ; restore SP
lor 1
adp -EM_PSIZE
cal $___restoretop ; ___restoretop(char *SP)
asp EM_PSIZE+EM_WSIZE
str 0 ; restore local base
sim ; ignore mask
lae 4
sti EM_PSIZE
ste 0 ; line and file
loc 0
ret EM_WSIZE ; return 0
end 0