223 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			223 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| .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
 | |
| .sect .text
 | |
| .sect .rom
 | |
| .sect .data
 | |
| .sect .bss
 | |
| .sect .text
 | |
| 
 | |
| ! Trap routine
 | |
| ! Expects trap number on stack.
 | |
| ! 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
 | |
| 
 | |
| earray:	lxi h,EARRAY
 | |
| 	push h
 | |
| 	call .trp
 | |
| 	ret
 | |
| 
 | |
| erange:	lxi h,ERANGE
 | |
| 	push h
 | |
| 	call .trp
 | |
| 	ret
 | |
| 
 | |
| eset:	lxi h,ESET
 | |
| 	push h
 | |
| 	call .trp
 | |
| 	ret
 | |
| 
 | |
| eiovfl:	lxi h,EIOVFL
 | |
| 	push h
 | |
| 	call .trp
 | |
| 	ret
 | |
| 
 | |
| efovfl:	lxi h,EFOVFL
 | |
| 	push h
 | |
| 	call .trp
 | |
| 	ret
 | |
| 
 | |
| efunfl:	lxi h,EFUNFL
 | |
| 	push h
 | |
| 	call .trp
 | |
| 	ret
 | |
| 
 | |
| eidivz:	lxi h,EIDIVZ
 | |
| 	push h
 | |
| 	call .trp
 | |
| 	ret
 | |
| 
 | |
| efdivz:	lxi h,EFDIVZ
 | |
| 	push h
 | |
| 	call .trp
 | |
| 	ret
 | |
| 
 | |
| eiund:	lxi h,EIUND
 | |
| 	push h
 | |
| 	call .trp
 | |
| 	ret
 | |
| 
 | |
| efund:	lxi h,EFUND
 | |
| 	push h
 | |
| 	call .trp
 | |
| 	ret
 | |
| 
 | |
| econv:	lxi h,ECONV
 | |
| 	push h
 | |
| 	call .trp
 | |
| 	ret
 | |
| 
 | |
| estack:	lxi h,ESTACK
 | |
| 	push h
 | |
| 	call .trp
 | |
| 	ret
 | |
| 
 | |
| eheap:	lxi h,EHEAP
 | |
| 	push h
 | |
| 	call .trp
 | |
| 	ret
 | |
| 
 | |
| eillins:lxi h,EILLINS
 | |
| 	push h
 | |
| 	call .trp
 | |
| 	ret
 | |
| 
 | |
| eoddz:	lxi h,EODDZ
 | |
| 	push h
 | |
| 	call .trp
 | |
| 	ret
 | |
| 
 | |
| ecase:	lxi h,ECASE
 | |
| 	push h
 | |
| 	call .trp
 | |
| 	ret
 | |
| 
 | |
| ememflt:lxi h,EMEMFLT
 | |
| 	push h
 | |
| 	call .trp
 | |
| 	ret
 | |
| 
 | |
| ebadptr:lxi h,EBADPTR
 | |
| 	push h
 | |
| 	call .trp
 | |
| 	ret
 | |
| 
 | |
| ebadpc:	lxi h,EBADPC
 | |
| 	push h
 | |
| 	call .trp
 | |
| 	ret
 | |
| 
 | |
| ebadlae:lxi h,EBADLAE
 | |
| 	push h
 | |
| 	call .trp
 | |
| 	ret
 | |
| 
 | |
| ebadmon:lxi h,EBADMON
 | |
| 	push h
 | |
| 	call .trp
 | |
| 	ret
 | |
| 
 | |
| ebadlin:lxi h,EBADLIN
 | |
| 	push h
 | |
| 	call .trp
 | |
| 	ret
 | |
| 
 | |
| ebadgto:lxi h,EBADGTO
 | |
| 	push h
 | |
| 	call .trp
 | |
| 	ret
 | |
| 
 | |
| eunimpl:lxi h,EUNIMPL
 | |
| 	push h
 | |
| 	call .trp
 | |
| 	ret
 | |
| 
 | |
| .trp:
 | |
| 	pop h
 | |
| 	xthl
 | |
| 	push h			! trap number and return address exchanged
 | |
| 	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:
 | |
| 	lhld .trapproc		! user defined trap handler?
 | |
| 	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:
 | |
| 	mvi a,0x0A		!newline
 | |
| 	call putchar
 | |
| 	lxi d,text1
 | |
| 	call prstring
 | |
| 	pop h
 | |
| 	call prdec
 | |
| 	lxi d,text2
 | |
| 	call prstring
 | |
| 	lhld hol0
 | |
| 	call prdec
 | |
| 	lxi d,text3
 | |
| 	call prstring
 | |
| 	lhld hol0+4
 | |
| 	xchg
 | |
| 	call prstring
 | |
| 	mvi a,0x0A		!newline
 | |
| 	call putchar
 | |
| 	jmp .stop
 | |
| 
 | |
| 
 | |
| text1:	.asciz "trap number "
 | |
| text2:	.asciz "\nline "
 | |
| text3:	.asciz " of file "
 | |
| 
 |