ack/mach/vax4/libem/trp.s
1990-01-12 10:29:26 +00:00

52 lines
1.2 KiB
ArmAsm

.sect .text; .sect .rom; .sect .data; .sect .bss; .sect .text
.define .trp
! $Header$
.trp:
pushl r0
movl 8(sp),r0
movl 4(sp),8(sp)
movl (sp)+,(sp)
cmpl r0,$16
bgequ I1 ! a trapnumber >= 16 cannot be ignored
bbc r0,.trpim,I1
movl (sp)+,r0
rsb
I1:
pushr $017776 ! save registers
pushl r0 ! trapnumber on stack
movl .trppc,r0
beql I2 ! is there a user defined traphandler?
clrl .trppc
calls $1,(r0) ! if so, call it
popr $017776 ! restore registers
movl (sp)+,r0
rsb
I2:
! Put the (octal) trapnumber in the zeroes in Iemes[].
movl $Iemesend-9,r1 ! Addres after last '0'.
movl $5,r2 ! Max number of digits.
movl (sp),r0 ! Trap number in r0.
I3:
bicw3 $0177770,r0,r3 ! Lower 3 bits form lower octal digit.
bisb2 r3,-(r1) ! Put them in the '0'.
ashl $-3,r0,r0 ! Shift the 3 bits off.
sobgtr r2,I3
movl ap,r2
movl $Iwr,ap
chmk $4 ! write
movl r2,ap
bpt
.sect .data
Iemes:
.data1 'E','M',' ','t','r','a','p',' ','0','0','0','0','0',' ','(','o','c','t','a','l',')',0xa
Iemesend:
.align 2
Iwr:
.data4 3 ! 3 arguments.
.data4 2 ! File descriptor 2.
.data4 Iemes ! Address of character buffer.
.data4 Iemesend - Iemes ! Number of characters to write.