Add signal() and raise()

git-svn-id: svn://svn.cc65.org/cc65/trunk@2017 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
cuz 2003-03-14 00:02:58 +00:00
parent a39db251a2
commit c556f14e66
4 changed files with 139 additions and 0 deletions

View File

@ -44,8 +44,11 @@ C_OBJS = _afailed.o \
putchar.o \
puts.o \
qsort.o \
raise.o \
realloc.o \
rewind.o \
signal.o \
sigtable.o \
sscanf.o \
strftime.o \
strxfrm.o \

44
libsrc/common/raise.s Normal file
View File

@ -0,0 +1,44 @@
;
; 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

68
libsrc/common/signal.s Normal file
View File

@ -0,0 +1,68 @@
;
; 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

24
libsrc/common/sigtable.s Normal file
View File

@ -0,0 +1,24 @@
;
; 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