60 lines
		
	
	
	
		
			890 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			60 lines
		
	
	
	
		
			890 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
.define trp, fatal
 | 
						|
.sect .text
 | 
						|
.sect .rom
 | 
						|
.sect .data
 | 
						|
.sect .bss
 | 
						|
.sect .text
 | 
						|
 | 
						|
fatal:
 | 
						|
	push	*RR14, R1
 | 
						|
	inc	R15, $2
 | 
						|
	popl	saveret, *RR14
 | 
						|
	pop	R1, *RR14	!trap number in R1
 | 
						|
	push	*RR14, R1
 | 
						|
	push	*RR14, R1
 | 
						|
	dec	R15, $4
 | 
						|
	pop	R1, *RR14	!restore R1
 | 
						|
	inc	R15, $2
 | 
						|
	pushl	*RR14, saveret
 | 
						|
	calr	trp
 | 
						|
	push	*RR14, $1
 | 
						|
	jr	EXIT
 | 
						|
	!NOTREACHED
 | 
						|
 | 
						|
trp:
 | 
						|
	push	*RR14, R1
 | 
						|
	inc	R15, $2
 | 
						|
	popl	saveret, *RR14
 | 
						|
	pop	R1, *RR14	!trap number in R1
 | 
						|
	pushl	*RR14, saveret
 | 
						|
	push	*RR14, R0
 | 
						|
	dec	R15, $2
 | 
						|
	cp	R1, $16
 | 
						|
	jr	UGE, 1f
 | 
						|
	ld	R0, trpim
 | 
						|
	bit	R0, R1
 | 
						|
	jr	NE, 2f		!ignore
 | 
						|
1:	sub	R15, $24
 | 
						|
	ldm	*RR14, R2, $12
 | 
						|
	push	*RR14, R1
 | 
						|
	ld	R1, trppc
 | 
						|
	cp	R1, $0
 | 
						|
	jr	EQ, 3f
 | 
						|
	clr	trppc
 | 
						|
	call	0(R1)
 | 
						|
	inc	R15, $2
 | 
						|
	ldm	R2, *RR14, $12
 | 
						|
	add	R15, $24
 | 
						|
2:	pop	R1, *RR14
 | 
						|
	pop	R0, *RR14
 | 
						|
	ret
 | 
						|
3:	pop	R1, *RR14
 | 
						|
	push	*RR14, R1
 | 
						|
	push	*RR14, R1
 | 
						|
	push	*RR14, $err
 | 
						|
	calr	printf
 | 
						|
	push	*RR14, $1
 | 
						|
	jr	EXIT
 | 
						|
	!NOTREACHED
 | 
						|
.sect .data
 | 
						|
err:	.asciz	"trap error %d\n"
 |