145 lines
2.8 KiB
Plaintext
145 lines
2.8 KiB
Plaintext
#
|
|
|
|
|
|
; $Header$
|
|
; (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
|
;
|
|
; This product is part of the Amsterdam Compiler Kit.
|
|
;
|
|
; Permission to use, sell, duplicate or disclose this software must be
|
|
; obtained in writing. Requests for such permissions may be sent to
|
|
;
|
|
; Dr. Andrew S. Tanenbaum
|
|
; Wiskundig Seminarium
|
|
; Vrije Universiteit
|
|
; Postbox 7161
|
|
; 1007 MC Amsterdam
|
|
; The Netherlands
|
|
;
|
|
|
|
mes 2,EM_WSIZE,EM_PSIZE
|
|
|
|
; procedure encaps(procedure p; procedure(q(n:integer));
|
|
; {call q if a trap occurs during the execution of p}
|
|
; {if q returns, continue execution of p}
|
|
|
|
|
|
inp $handler
|
|
|
|
#define PIISZ 2*EM_PSIZE
|
|
|
|
#define PARG 0
|
|
#define QARG PIISZ
|
|
#define E_ELB -EM_PSIZE
|
|
#define E_EHA -2*EM_PSIZE
|
|
|
|
; encaps is called with two parameters:
|
|
; - procedure instance identifier of q (QARG)
|
|
; - procedure instance identifier of p (PARG)
|
|
; and two local variables:
|
|
; - the lb of the previous encaps (E_ELB)
|
|
; - the procedure identifier of the previous handler (E_EHA)
|
|
;
|
|
; One static variable:
|
|
; - the lb of the currently active encaps (enc_lb)
|
|
|
|
enc_lb
|
|
bss EM_PSIZE,0,0
|
|
|
|
exp $encaps
|
|
pro $encaps,PIISZ
|
|
; save lb of previous encaps
|
|
lae enc_lb
|
|
loi EM_PSIZE
|
|
lal E_ELB
|
|
sti EM_PSIZE
|
|
; set new lb
|
|
lxl 0
|
|
lae enc_lb
|
|
sti EM_PSIZE
|
|
; save old handler id while setting up the new handler
|
|
lpi $handler
|
|
sig
|
|
lal E_EHA
|
|
sti EM_PSIZE
|
|
; handler is ready, p can be called
|
|
; p doesn't expect parameters except possibly the static link
|
|
; always passing the link won't hurt
|
|
lal PARG
|
|
loi PIISZ
|
|
cai
|
|
asp EM_PSIZE
|
|
; reinstate old handler
|
|
lal E_ELB
|
|
loi EM_PSIZE
|
|
lae enc_lb
|
|
sti EM_PSIZE
|
|
lal E_EHA
|
|
loi EM_PSIZE
|
|
sig
|
|
asp EM_PSIZE
|
|
ret 0
|
|
end ?
|
|
|
|
#define TRAP 0
|
|
#define H_ELB -EM_PSIZE
|
|
|
|
; handler is called with one parameter:
|
|
; - trap number (TRAP)
|
|
; one local variable
|
|
; - the current LB of the enclosing encaps (H_ELB)
|
|
|
|
|
|
pro $handler,EM_PSIZE
|
|
; save LB of nearest encaps
|
|
lae enc_lb
|
|
loi EM_PSIZE
|
|
lal H_ELB
|
|
sti EM_PSIZE
|
|
; fetch setting for previous encaps via LB of nearest
|
|
lal H_ELB
|
|
loi EM_PSIZE
|
|
adp E_ELB
|
|
loi EM_PSIZE ; LB of previous encaps
|
|
lae enc_lb
|
|
sti EM_PSIZE
|
|
lal H_ELB
|
|
loi EM_PSIZE
|
|
adp E_EHA
|
|
loi EM_PSIZE ; previous handler
|
|
sig
|
|
asp EM_PSIZE
|
|
; previous handler is re-instated, time to call Q
|
|
lol TRAP ; the one and only real parameter
|
|
lal H_ELB
|
|
loi EM_PSIZE
|
|
lpb ; argument base of enclosing encaps
|
|
adp QARG
|
|
loi PIISZ
|
|
exg EM_PSIZE
|
|
dup EM_PSIZE ; The static link is now on top
|
|
zer EM_PSIZE
|
|
cmp
|
|
zeq *1
|
|
; non-zero LB
|
|
exg EM_PSIZE
|
|
cai
|
|
asp EM_WSIZE+EM_PSIZE
|
|
bra *2
|
|
1
|
|
; zero LB
|
|
asp EM_PSIZE
|
|
cai
|
|
asp EM_WSIZE
|
|
2
|
|
; now reinstate handler for continued execution of p
|
|
lal H_ELB
|
|
loi EM_PSIZE
|
|
lae enc_lb
|
|
sti EM_PSIZE
|
|
lpi $handler
|
|
sig
|
|
asp EM_PSIZE
|
|
rtt
|
|
end ?
|