view level2/modules/kernel/fsend.asm @ 2758:e4a0f58a5f9b

Found that people who do not have the envirornment variable NITROS9DIR set before building the project get a error missing file "/rules.mak". Found this is caused do to the fact that the code to set this envirornment variable is in the rules.mak which can't get loaded. To fix this the code needed to set the envirornment variable that is in the rules.mak is now in the makefile(s) right before the include for the rules.mak file. This should fix the problem for those who do not have the NITROS9DIR envirornment variable preset.
author drencor-xeen
date Mon, 14 Jan 2013 14:37:46 -0600
parents ca83286ded5b
children 039ddb7c8ad7
line wrap: on
line source

**************************************************
* 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