Mercurial > hg > Members > kono > nitros9-code
view level2/modules/kernel/ffork.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 | 90bad6d8388c |
children | 039ddb7c8ad7 |
line wrap: on
line source
************************************************** * System Call: F$Fork * * Function: Starts a new child process * * Input: X = Address of module or filename * Y = Parameter area size (256 byte pages) * U = Address of parameter area * A = Language/Type code * B = Optional data area size (256 byte pages) * * Output: X = Updated past the name string * A = Child's process ID * * Error: CC = C bit set; B = error code * FFork pshs u preserve register stack pointer lbsr AllPrc setup a new process descriptor bcc GotNPrc went ok, keep going puls u,pc restore & return with error * Copy user # & priority GotNPrc pshs u save pointer to new descriptor ldx <D.Proc get current process pointer IFNE H6309 ldq P$User,x Get user # & priority from forking process std P$User,u Save user # in new process ste P$Prior,u Save priority in new process ELSE ldd P$User,x std P$User,u lda P$Prior,x sta P$Prior,u ENDC * Copy network I/O pointers to new descriptor IFEQ Network-1 pshs x,u leax >P$NIO,x point to current NIO pointers leau >P$NIO,u point to buffer for new ones IFNE H6309 ldw #NefIOSiz get size tfm x+,u+ move 'em ELSE ldb #NefIOSiz L0250 lda ,x+ sta ,u+ decb bne L0250 ENDC puls x,u restore pointers to descriptors ENDC * Copy I/O pointers to new descriptor leax P$DIO,x leau P$DIO,u IFNE H6309 ldw #DefIOSiz tfm x+,u+ * Copy Standard paths to new descriptor lde #3 get # paths ELSE ldb #DefIOSiz L0261 lda ,x+ sta ,u+ decb bne L0261 ldy #3 ENDC * Duplicate 1st 3 paths GetOPth lda ,x+ get a path # beq SveNPth don't exist, go on os9 I$Dup dupe it bcc SveNPth no error, go on clra clear it * As std in/out/err SveNPth sta ,u+ save new path # IFNE H6309 dece done? ELSE leay -1,y ENDC bne GetOPth no, keep going * Link to new module & setup task map ldx ,s get pointer to new descriptor ldu 2,s get pointer to register stack lbsr L04B1 link to module & setup register stack bcs L02CF exit if error pshs d os9 F$AllTsk allocate the task & setup MMU bcs L02CF Error, skip ahead * Copy parameters to new process lda P$PagCnt,x get memory page count clrb subd ,s calculate destination tfr d,u set parameter destination pointer ldb P$Task,x get source task # ldx <D.Proc get destination task # lda P$Task,x leax ,y point to parameters puls y restore parameter count os9 F$Move move parameters to new process * Setup the new stack ldx ,s get pointer to process descriptor lda <D.SysTsk get task # ldu P$SP,x get new stack pointer leax >(P$Stack-R$Size),x point to register stack ldy #R$Size get size of register stack os9 F$Move move the register stack over puls u,x os9 F$DelTsk ldy <D.Proc lda P$ID,x sta R$A,u ldb P$CID,y sta P$CID,y lda P$ID,y std P$PID,x IFNE H6309 aim #^SysState,P$State,x switch to non-system state ELSE lda P$State,x anda #^SysState sta P$State,x ENDC * Put date & time of creation into descriptor * pshs x preserve process pointer * leax P$DatBeg,x point to time buffer * os9 F$Time put date/time into it * puls x restore pointer os9 F$AProc and start the process rts return * Fork error goes here L02CF puls x pshs b save error lbsr L05A5 close paths & unlink mem lda P$ID,x get bad ID lbsr L0386 delete proc desc & task # comb set carry puls pc,u,b pull error code & u & return