144 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			144 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
#
 | 
						|
 | 
						|
 | 
						|
; $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 ?
 |