--- /dev/null
+;
+; Ullrich von Bassewitz, 2003-03-14
+;
+; int __fastcall__ raise (int sig);
+;
+
+ .import jmpvec
+
+ .include "signal.inc"
+
+
+;----------------------------------------------------------------------------
+; int __fastcall__ raise (int sig);
+
+
+_raise:
+ cpx #0
+ bne invalidsig
+ cmp #SIGCOUNT
+ bcs invalidsig
+
+; Save the signal number low byte, then setup the function vector
+
+ pha
+ asl a
+ tax
+ lda sigtable,x
+ sta jmpvec+1
+ lda sigtable+1,x
+ sta jmpvec+2
+
+; Restore the signal number and call the function
+
+ pla ; Low byte
+ ldx #0 ; High byte
+ jsr jmpvec ; Call signal function
+
+; raise() returns zero on success and any other value on failure
+
+ lda #0
+ tax
+invalidsig:
+ rts
+
--- /dev/null
+;
+; Ullrich von Bassewitz, 2002-12-16
+;
+; __sigfunc __fastcall__ signal (int sig, __sigfunc func);
+;
+
+ .import popax
+ .importzp ptr1
+
+ .include "signal.inc"
+ .include "errno.inc"
+
+
+; Default signal functions: The standard specifies explicitly that the values
+; for SIG_IGN and SIG_DFL must be distinct, so we make them so by using both
+; rts exits we have. This works because signal functions are __fastcall__, so
+; we don't have arguments on the stack.
+
+
+;----------------------------------------------------------------------------
+; __sigfunc __fastcall__ signal (int sig, __sigfunc func);
+
+
+_signal:
+ sta ptr1
+ stx ptr1+1 ; Remember func
+
+ jsr popax ; Get sig
+
+ cpx #0
+ bne invalidsig
+ cmp #SIGCOUNT
+ bcs invalidsig
+
+; Signal number is valid. Replace the pointer in the table saving the old
+; value temporarily on the stack.
+
+ asl a ; Prepare for word access
+ tax
+
+ lda sigtable,x
+ pha
+ lda ptr1
+ sta sigtable,x
+ lda sigtable+1,x
+ pha
+ lda ptr1+1
+ sta sigtable+1,x
+
+; Get the old value from the stack and return it
+
+ pla
+ tax
+ pla
+__sig_ign:
+ rts
+
+; Error entry: We use our knowledge that SIG_ERR is zero here to save a byte
+
+invalidsig:
+ lda #<EINVAL
+ sta __errno
+ lda #>EINVAL ; A = 0
+ sta __errno+1
+ tax ; A/X = 0
+__sig_dfl:
+ rts
+
--- /dev/null
+;
+; Ullrich von Bassewitz, 2002-12-16
+;
+; Signal vector table
+;
+
+ .export sigtable
+
+ .include "signal.inc"
+
+;----------------------------------------------------------------------------
+;
+
+.data
+
+sigtable:
+ .word __sig_dfl ; SIGABRT
+ .word __sig_dfl ; SIGFPE
+ .word __sig_dfl ; SIGILL
+ .word __sig_dfl ; SIGINT
+ .word __sig_dfl ; SIGSEGV
+ .word __sig_dfl ; SIGTERM
+
+