81 lines
945 B
ArmAsm
81 lines
945 B
ArmAsm
.seg
|
|
|
|
sp := r15
|
|
SP := rr14
|
|
|
|
.psec bss
|
|
.bss
|
|
L1:
|
|
.=.+80
|
|
|
|
.psec
|
|
.code
|
|
_signal::
|
|
{
|
|
ldm r0,|_stkseg+4|(sp),#3
|
|
cp r0,#%0014
|
|
jp uge,cerror
|
|
ld r3,r0 /* signo */
|
|
ld r4,r1
|
|
ld r5,r2 /* new function */
|
|
sla r3,#2
|
|
ldl rr6,L1(r3) /* old function */
|
|
ldl L1(r3),rr4
|
|
cpl rr4,#%00000000
|
|
jr eq,L2
|
|
cpl rr4,#%00000001
|
|
jr eq,L2
|
|
sra r3
|
|
lda rr4,L5(r3) /* intermediate function */
|
|
ld r1,r4
|
|
ld r2,r5
|
|
L2:
|
|
sc #48 /* sig */
|
|
bit r5,#0 /* SIG_IGN if on */
|
|
jr z,L3
|
|
ldl rr2,rr4
|
|
jr L4
|
|
L3:
|
|
ldl rr2,rr6
|
|
L4:
|
|
ret nc
|
|
jp cerror
|
|
L5:
|
|
calr L7
|
|
L6:
|
|
calr L7
|
|
calr L7
|
|
calr L7
|
|
calr L7
|
|
calr L7
|
|
calr L7
|
|
calr L7
|
|
calr L7
|
|
calr L7
|
|
calr L7
|
|
calr L7
|
|
calr L7
|
|
calr L7
|
|
calr L7
|
|
calr L7
|
|
calr L7
|
|
calr L7
|
|
calr L7
|
|
calr L7
|
|
L7:
|
|
sub sp,#28
|
|
ldm @SP,r0,#14
|
|
ld r7,SP(#30) /* return pc offset */
|
|
ldl rr4,#L6
|
|
sub r7,r5
|
|
sla r7 /* 4*signo */
|
|
ldl rr2,L1(r7)
|
|
srl r7,#2
|
|
push @SP,r7
|
|
call @rr2
|
|
inc sp,#2
|
|
ldm r0,@SP,#14
|
|
add sp,#32
|
|
sc #0 /* sysiret */
|
|
}
|