diff --git a/WEGA/contrib/lcc/lib/libc/u8k/sys/signal.s b/WEGA/contrib/lcc/lib/libc/u8k/sys/signal.s new file mode 100644 index 0000000..fec08f1 --- /dev/null +++ b/WEGA/contrib/lcc/lib/libc/u8k/sys/signal.s @@ -0,0 +1,80 @@ + .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 */ + }