90 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| #
 | |
| ! $Source$
 | |
| ! $State$
 | |
| ! $Revision$
 | |
| 
 | |
| #
 | |
| #include "asm.h"
 | |
| 
 | |
| .define .trp
 | |
| .define EARRAY, ERANGE, ESET, EIOVFL, EFOVFL, EFUNFL, EIDIVZ, EIDIVZ
 | |
| .define EFDIVZ, EIUND, EFUND, ECONV, ESTACK, EHEAP, EILLINS, EODDZ
 | |
| .define ECASE, EMEMFLT, EBADPTR, EBADPC, EBADLAE, EBADMON, EBADLIN, EBADGTO
 | |
| .define EUNIMPL
 | |
| 
 | |
| ! Trap routine
 | |
| ! Expects trap number in A, and must be called directly from the code
 | |
| ! where execution should resume (for those traps which support it).
 | |
| ! Just returns if trap has to be ignored.
 | |
| ! Otherwise it calls a user-defined trap handler if provided.
 | |
| ! When no user-defined trap handler is provided or when the user-defined
 | |
| ! trap handler causes a new trap, a message is printed
 | |
| ! and control is returned to the monitor.
 | |
| 
 | |
| 	EARRAY	=  0
 | |
| 	ERANGE	=  1
 | |
| 	ESET	=  2
 | |
| 	EIOVFL	=  3
 | |
| 	EFOVFL	=  4
 | |
| 	EFUNFL	=  5
 | |
| 	EIDIVZ	=  6
 | |
| 	EFDIVZ	=  7
 | |
| 	EIUND	=  8
 | |
| 	EFUND	=  9
 | |
| 	ECONV	= 10
 | |
| 	ESTACK  = 16
 | |
| 	EHEAP	= 17
 | |
| 	EILLINS = 18
 | |
| 	EODDZ	= 19
 | |
| 	ECASE	= 20
 | |
| 	EMEMFLT	= 21
 | |
| 	EBADPTR = 22
 | |
| 	EBADPC  = 23
 | |
| 	EBADLAE = 24
 | |
| 	EBADMON = 25
 | |
| 	EBADLIN = 26
 | |
| 	EBADGTO = 27
 | |
| 	EUNIMPL = 63		! unimplemented em-instruction called
 | |
| 
 | |
| .trp:
 | |
| 	mov a,l
 | |
| 	cpi 16
 | |
| 	jnc 3f			! jump if trap cannot be ignored
 | |
| 
 | |
| ! check if trap has to be ignored
 | |
| 	xchg			! de = trap number
 | |
| 	lhld .ignmask
 | |
| 	push h			! hl = set to be tested
 | |
| 	push d
 | |
| 	call .inn2		! de = 1 if bit is set, 0 otherwise
 | |
| 	mov a,e
 | |
| 	rar
 | |
| 	jnc 3f			! jump if trap should not be ignored
 | |
| 	pop h			! remove trap number
 | |
| 	ret			! OGEN DICHT EN ... SPRING!!!
 | |
| 
 | |
| 3:
 | |
| .define .trapproc
 | |
| .trapproc = . + 1
 | |
| 	lxi h, 0            ! user defined trap handler held inline here
 | |
| 	mov a,l
 | |
| 	ora h
 | |
| 	jz 1f	     		! jump if there was not
 | |
| 	xra a
 | |
| 	sta .trapproc		! .trapproc := 0
 | |
| 	sta .trapproc+1
 | |
| 	lxi d,2f		
 | |
| 	push d
 | |
| 	pchl			! call user defined trap handler
 | |
| 2:
 | |
| 	pop d
 | |
| 	ret
 | |
| 1:
 | |
| 	lxi d, text
 | |
| 	mvi c, 9        ! write $-terminated string
 | |
| 	call 0x0005
 | |
| 	rst 0           ! abend
 | |
| 
 | |
| .sect .rom
 | |
| text: .ascii "TRAP!\r\n$"
 | |
| 
 |