* system calls - file 9

 name Syscals9

 text

 ext _errno,ret3,ret3a,ret5,ret5a

 lib sysdef

* SIGNAL(signum, handler)

  global _signal
_signal  ldd 2,s beq 9f error
  cmpd #12
  bhi 9f error
  decb remove bias
  std snum save signal number
  lslb set up index
  ldx #stbl
  leax b,x point to entry
  ldd 0,x get entry
  pshs d save old value
  ldd 6,s get new handler address
  std 0,x save in table
  beq 2f is it 0 or 1?
  cmpd #1
  beq 2f
  ldd snum calculate address
  lslb mult by 5
  lslb
  addd snum
  addd #hcode
2 pshs d set up system call
  ldd snum
  incb
  pshs d
  ldb #cpint
  pshs b
  leax 0,s
  sys indx
  leas 5,s
  ldx 0,s get old handler
  cmpx #-1 was it known?
  bne 3f
  std 0,s save OS response
3 puls d get return value
  tfr d,x
  rts return
9 ldd #12 set error
  std _errno
  ldd #-1 return error
  tfr d,x
  rts

* handler code

hcode ldd #1
 bra 5f
 ldd #2
 bra 5f
 ldd #3
 bra 5f
 ldd #4
 bra 5f
 ldd #5
 bra 5f
 ldd #6
 bra 5f
 ldd #7
 bra 5f
 ldd #8
 bra 5f
 ldd #9
 bra 5f
 ldd #10
 bra 5f
 ldd #11
 bra 5f
 ldd #12
5 pshs d save sig num as arg
 ldx #stbl get address
 decb
 lslb calc index
 ldx b,x
 jsr 0,x
 leas 2,s remove arg
 rti return from int

 data

* tables and storage

snum fdb 0 temp for sig num

stbl fdb -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1

 text

 end
