mirror of
https://github.com/cc65/cc65.git
synced 2024-12-25 17:29:50 +00:00
69 lines
1.6 KiB
ArmAsm
69 lines
1.6 KiB
ArmAsm
|
;
|
||
|
; 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
|
||
|
|