145 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			145 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
		
			Executable File
		
	
	
	
	
| #
 | |
| 
 | |
| 
 | |
| ; $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   0-_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   0-_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 ?
 | 
