**************************************************
* System Call: F$Send
*
* Function: Send a signal to a process
*
* Input:  A = Receiver's process ID
*         B = Signal code
*
* Output: None
*
* Error:  CC = C bit set; B = error code
*
FSend    ldx   <D.Proc      get current process pointer
         lda   R$A,u        get destination ID
         bne   L0652        it's ok, go on
         inca               add one
* Send signal to ALL process's
L0647    cmpa  P$ID,x       find myself?
         beq   L064D        yes, skip it
         bsr   L0652        send the signal
L064D    inca               move to next process
         bne   L0647        go send it
         clrb               clear errors
         rts                return

* X   = process descriptor ptr of singal sender
* A   = process ID to send signal to
* R$B = signal code
L0652    lbsr  L0B2E        get pointer to destination descriptor
         pshs  cc,a,y,u     preserve registers
         bcs   L066A        error, can't get pointer return
         tst   R$B,u        kill signal?
         bne   L066D        no, go on
         ldd   P$User,x     get user #
         beq   L066D        he's super user, go on
         cmpd  P$User,y     does he own the process?
         beq   L066D        yes, send the signal
         ldb   #E$BPrcID    get bad process error
         inc   ,s           set Carry in CC on stack
L066A    puls  cc,a,y,u,pc  return

* Y = process descriptor of process receiving signal
L066D    orcc  #IntMasks    shut down IRQ's
         ldb   R$B,u        get signal code
         bne   L067B        not a kill signal, skip ahead
         ldb   #E$PrcAbt    get error 228
         IFNE  H6309
         oim   #Condem,P$State,y condem process
L067B    aim   #^Suspend,P$State,y   take process out of suspend state
         ELSE
         lda   P$State,y
         ora   #Condem
         sta   P$State,y
L067B    lda   P$State,y
         anda  #^Suspend
         sta   P$State,y
         ENDC
         lda   <P$Signal,y  already have a pending signal?
         beq   L068F        nope, go on
         deca               is it a wakeup signal?
         beq   L068F        yes, skip ahead
         inc   ,s           set carry on stack
         ldb   #E$USigP     get pending signal error
         puls  cc,a,y,u,pc  return

* Update sleeping process queue
L068F    stb   P$Signal,y   save signal code in descriptor
         ldx   #(D.SProcQ-P$Queue) get pointer to sleeping process queue
         IFNE  H6309
         clrd               Faster than 2 memory clears
         ELSE
         clra
         clrb
         ENDC
L0697    leay  ,x           point Y to this process
         ldx   P$Queue,x    get pointer to next process in chain
         beq   L06D3        last one, go check waiting list
         ldu   P$SP,x       get process stack pointer
         addd  R$X,u        add his sleep count
         cmpx  2,s          is it destination process?
         bne   L0697        no, skip to next process
         pshs  d            save sleep count
         IFNE  H6309
         tim   #TimSleep,P$State,x
         ELSE
         lda   P$State,x
         bita  #TimSleep
         ENDC
         beq   L06CF        no, update queue
         ldd   ,s
         beq   L06CF
         ldd   R$X,u
         IFNE  H6309
         ldw   ,s
         stw   R$X,u
         ELSE
         pshs  d
         ldd   2,s
         std   R$X,u
         puls  d
         ENDC
         ldu   P$Queue,x
         beq   L06CF
         std   ,s
         IFNE   H6309
         tim   #TimSleep,P$State,u
         ELSE
         lda   P$State,u
         bita  #TimSleep
         ENDC
         beq   L06CF
         ldu   P$SP,u
         ldd   ,s
         addd  R$X,u
         std   R$X,u
L06CF    leas  2,s
         bra   L06E0
L06D3    ldx   #(D.WProcQ-P$Queue)
L06D6    leay  ,x
         ldx   P$Queue,x
         beq   L06F4
         cmpx  2,s
         bne   L06D6
L06E0    ldd   P$Queue,x
         std   P$Queue,y
         lda   P$Signal,x
         deca
         bne   L06F1
         sta   P$Signal,x
         lda   ,s
         tfr   a,cc
L06F1    os9   F$AProc      activate the process
L06F4    puls  cc,a,y,u,pc  restore & return
