1145
|
1 **************************************************
|
|
2 * System Call: F$Fork
|
|
3 *
|
|
4 * Function: Starts a new child process
|
|
5 *
|
|
6 * Input: X = Address of module or filename
|
|
7 * Y = Parameter area size (256 byte pages)
|
|
8 * U = Address of parameter area
|
|
9 * A = Language/Type code
|
|
10 * B = Optional data area size (256 byte pages)
|
|
11 *
|
|
12 * Output: X = Updated past the name string
|
|
13 * A = Child's process ID
|
|
14 *
|
|
15 * Error: CC = C bit set; B = error code
|
|
16 *
|
|
17 FFork pshs u preserve register stack pointer
|
|
18 lbsr AllPrc setup a new process descriptor
|
|
19 bcc GotNPrc went ok, keep going
|
|
20 puls u,pc restore & return with error
|
|
21
|
|
22 * Copy user # & priority
|
|
23 GotNPrc pshs u save pointer to new descriptor
|
|
24 ldx <D.Proc get current process pointer
|
|
25 IFNE H6309
|
|
26 ldq P$User,x Get user # & priority from forking process
|
|
27 std P$User,u Save user # in new process
|
|
28 ste P$Prior,u Save priority in new process
|
|
29 ELSE
|
|
30 ldd P$User,x
|
|
31 std P$User,u
|
|
32 lda P$Prior,x
|
|
33 sta P$Prior,u
|
|
34 pshs x,u
|
|
35 ENDC
|
|
36 * Copy network I/O pointers to new descriptor
|
|
37 IFEQ Network-1
|
|
38 pshs x,u preserve pointers to descriptors
|
|
39 leax >P$NIO,x point to current NIO pointers
|
|
40 leau >P$NIO,u point to buffer for new ones
|
|
41 IFNE H6309
|
|
42 ldw #NefIOSiz get size
|
|
43 tfm x+,u+ move 'em
|
|
44 ELSE
|
|
45 ldb #NefIOSiz
|
|
46 L0250 lda ,x+
|
|
47 sta ,u+
|
|
48 decb
|
|
49 bne L0250
|
|
50 ENDC
|
|
51 puls x,u restore pointers to descriptors
|
|
52 ENDC
|
|
53 * Copy I/O pointers to new descriptor
|
|
54 leax P$DIO,x
|
|
55 leau P$DIO,u
|
|
56 IFNE H6309
|
|
57 ldw #DefIOSiz
|
|
58 tfm x+,u+
|
|
59 * Copy Standard paths to new descriptor
|
|
60 lde #3 get # paths
|
|
61 ELSE
|
|
62 ldb #DefIOSiz
|
|
63 L0261 lda ,x+
|
|
64 sta ,u+
|
|
65 decb
|
|
66 bne L0261
|
|
67 ldy #3
|
|
68 ENDC
|
|
69
|
|
70 * Duplicate 1st 3 paths
|
|
71 GetOPth lda ,x+ get a path #
|
|
72 beq SveNPth don't exist, go on
|
|
73 os9 I$Dup dupe it
|
|
74 bcc SveNPth no error, go on
|
|
75 clra clear it
|
|
76
|
|
77 * As std in/out/err
|
|
78 SveNPth sta ,u+ save new path #
|
|
79 IFNE H6309
|
|
80 dece done?
|
|
81 ELSE
|
|
82 leay -1,y
|
|
83 ENDC
|
|
84 bne GetOPth no, keep going
|
|
85 * Link to new module & setup task map
|
|
86 ldx ,s get pointer to new descriptor
|
|
87 ldu 2,s get pointer to register stack
|
|
88 lbsr L04B1 link to module & setup register stack
|
|
89 bcs L02CF exit if error
|
|
90 pshs d
|
|
91 os9 F$AllTsk allocate the task & setup MMU
|
|
92 bcs L02CF Error, skip ahead
|
|
93
|
|
94 * Copy parameters to new process
|
|
95 lda P$PagCnt,x get memory page count
|
|
96 clrb
|
|
97 subd ,s calculate destination
|
|
98 tfr d,u set parameter destination pointer
|
|
99 ldb P$Task,x get source task #
|
|
100 ldx <D.Proc get destination task #
|
|
101 lda P$Task,x
|
|
102 leax ,y point to parameters
|
|
103 puls y restore parameter count
|
|
104 os9 F$Move move parameters to new process
|
|
105
|
|
106 * Setup the new stack
|
|
107 ldx ,s get pointer to process descriptor
|
|
108 lda <D.SysTsk get task #
|
|
109 ldu P$SP,x get new stack pointer
|
|
110 leax >(P$Stack-R$Size),x point to register stack
|
|
111 ldy #R$Size get size of register stack
|
|
112 os9 F$Move move the register stack over
|
|
113 puls u,x
|
|
114 os9 F$DelTsk
|
|
115 ldy <D.Proc
|
|
116 lda P$ID,x
|
|
117 sta R$A,u
|
|
118 ldb P$CID,y
|
|
119 sta P$CID,y
|
|
120 lda P$ID,y
|
|
121 std P$PID,x
|
|
122 IFNE H6309
|
|
123 aim #^SysState,P$State,x switch to non-system state
|
|
124 ELSE
|
|
125 lda P$State,x
|
|
126 anda #^SysState
|
|
127 sta P$State,x
|
|
128 ENDC
|
|
129 * Put date & time of creation into descriptor
|
|
130 * pshs x preserve process pointer
|
|
131 * leax P$DatBeg,x point to time buffer
|
|
132 * os9 F$Time put date/time into it
|
|
133 * puls x restore pointer
|
|
134 os9 F$AProc and start the process
|
|
135 rts return
|
|
136
|
|
137 * Fork error goes here
|
|
138 L02CF puls x
|
|
139 pshs b save error
|
|
140 lbsr L05A5 close paths & unlink mem
|
|
141 lda P$ID,x get bad ID
|
|
142 lbsr L0386 delete proc desc & task #
|
|
143 comb set carry
|
|
144 puls pc,u,b pull error code & u & return
|