summaryrefslogtreecommitdiff
path: root/v4.0/src/DOS/SRVCALL.ASM
diff options
context:
space:
mode:
authorGravatar Mark Zbikowski2024-04-25 21:24:10 +0100
committerGravatar Microsoft Open Source2024-04-25 22:32:27 +0000
commit2d04cacc5322951f187bb17e017c12920ac8ebe2 (patch)
tree80ee017efa878dfd5344b44249e6a241f2a7f6e2 /v4.0/src/DOS/SRVCALL.ASM
parentMerge pull request #430 from jpbaltazar/typoptbr (diff)
downloadms-dos-main.tar.gz
ms-dos-main.tar.xz
ms-dos-main.zip
MZ is back!HEADmain
Diffstat (limited to 'v4.0/src/DOS/SRVCALL.ASM')
-rw-r--r--v4.0/src/DOS/SRVCALL.ASM306
1 files changed, 306 insertions, 0 deletions
diff --git a/v4.0/src/DOS/SRVCALL.ASM b/v4.0/src/DOS/SRVCALL.ASM
new file mode 100644
index 0000000..26064c8
--- /dev/null
+++ b/v4.0/src/DOS/SRVCALL.ASM
@@ -0,0 +1,306 @@
1; SCCSID = @(#)srvcall.asm 1.4 85/08/02
2TITLE SRVCALL - Server DOS call
3NAME SRVCALL
4;
5; Server DOS call functions
6;
7;
8; $ServerCall
9;
10; Modification history:
11;
12; Created: ARR 08 August 1983
13;
14
15.xlist
16;
17; get the appropriate segment definitions
18;
19include dosseg.asm
20
21CODE SEGMENT BYTE PUBLIC 'CODE'
22 ASSUME SS:DOSGROUP,CS:DOSGROUP
23
24.xcref
25INCLUDE DOSSYM.INC
26INCLUDE DEVSYM.INC
27.cref
28.list
29
30AsmVars <Installed>
31
32include dpl.asm
33
34Installed = TRUE
35
36 i_need USER_ID,WORD
37 i_need PROC_ID,WORD
38 i_need SaveBX,WORD
39 i_need SaveDS,WORD
40 i_need SWAP_START,BYTE
41 i_need SWAP_ALWAYS,BYTE
42 i_need SWAP_END,BYTE
43 I_Need ThisSFT,DWORD
44 I_need fSharing,BYTE
45 i_need OpenBuf,128
46 I_Need ExtErr,WORD
47 I_Need ExtErr_Action,BYTE
48 I_Need ExtErrPt,DWORD
49 I_Need EXTERR_LOCUS,BYTE ; Extended Error Locus
50 i_need JShare,DWORD
51 i_need SWAP_AREA_TABLE,BYTE
52 i_need SWAP_ALWAYS_AREA,DWORD
53 i_need SWAP_ALWAYS_AREA_LEN,WORD
54 i_need SWAP_AREA_LEN,WORD
55
56BREAK <ServerCall -- Server DOS call>
57
58TABLE SEGMENT
59Public SRVC001S,SRVC001E
60SRVC001S label byte
61
62ServerTab DW DOSGroup:Server_Disp
63SERVERLEAVE DW DOSGROUP:ServerReturn
64SERVER_DISP DB (SERVER_DISP_END-SERVER_DISP-1)/2
65 DW OFFSET DOSGROUP:SRV_CALL ; 0
66 DW OFFSET DOSGROUP:COMMIT_ALL ; 1
67 DW OFFSET DOSGROUP:CLOSE_NAME ; 2
68 DW OFFSET DOSGROUP:CLOSE_UID ; 3
69 DW OFFSET DOSGROUP:CLOSE_UID_PID ; 4
70 DW OFFSET DOSGROUP:GET_LIST ; 5
71 DW OFFSET DOSGROUP:GET_DOS_DATA ; 6
72 DW OFFSET DOSGROUP:SPOOL_OPER ; 7
73 DW OFFSET DOSGROUP:SPOOL_OPER ; 8
74 DW OFFSET DOSGROUP:SPOOL_OPER ; 9
75 DW OFFSET DOSGroup:$setExtendedError ; 10
76SERVER_DISP_END LABEL BYTE
77
78SRVC001E label byte
79
80TABLE ENDS
81
82; Inputs:
83; DS:DX -> DPL (except calls 7,8,9)
84; Function:
85; AL=0 Server DOS call
86; AL=1 Commit All files
87; AL=2 Close file by name (SHARING LOADED ONLY) DS:DX in DPL -> name
88; AL=3 Close all files for DPL_UID
89; AL=4 Close all files for DPL_UID/PID_PID
90; AL=5 Get open file list entry
91; IN: BX File Index
92; CX User Index
93; OUT:ES:DI -> Name
94; BX = UID
95; CX = # locked blocks held by this UID
96; AL=6 Get DOS data area
97; OUT: DS:SI -> Start
98; CX size in bytes of swap if indos
99; DX size in bytes of swap always
100; AL=7 Get truncate flag
101; AL=8 Set truncate flag
102; AL=9 Close all spool files
103; AL=10 SetExtendedError
104; AL=11 DOS4.00 Get DOS data area
105; DS:SI -> swap table
106
107 procedure $ServerCall,NEAR
108ASSUME DS:NOTHING,ES:NOTHING
109 CMP AL,7
110 JB SET_STUFF
111 CMP AL,9
112 JBE NO_SET_ID ; No DPL on calls 7,8,9
113 CMP AL,11 ;IFS. ;AN000;
114 JNZ SET_STUFF ;IFS. ;AN000;
115 MOV DI,OFFSET DOSGROUP:SWAP_AREA_TABLE ;IFS. ;AN000;
116 PUSH SS ;IFS. ;AN000;
117 POP ES ;IFS. ;AN000;
118 invoke GET_USER_STACK ;IFS. ;AN000;
119 MOV [SI.user_DS],ES ;IFS. ds:si -> swap tab ;AN000;
120 MOV [SI.user_SI],DI ;IFS. ;AN000;
121 transfer SYS_RET_OK ;IFS. ;AN000;
122SET_STUFF:
123 MOV SI,DX ; Point to DPL with DS:SI
124 MOV BX,[SI.DPL_UID]
125 MOV [USER_ID],BX ; Set UID
126 MOV BX,[SI.DPL_PID]
127 MOV [PROC_ID],BX ; Set process ID
128NO_SET_ID:
129 PUSH SERVERLEAVE ; push return address
130 PUSH ServerTab ; push table address
131 PUSH AX
132 Invoke TableDispatch
133 MOV EXTERR_LOCUS,errLoc_Unk ; Extended Error Locus
134 error error_invalid_function
135ServerReturn:
136 return
137
138; Commit - iterate through the open file list and make sure that the
139; directory entries are correctly updated.
140
141COMMIT_ALL:
142ASSUME DS:NOTHING,ES:NOTHING
143 XOR BX,BX ; for (i=0; ThisSFT=getSFT(i); i++)
144 Context DS
145 EnterCrit critSFT ; Gonna scan SFT cache, lock it down
146CommitLoop:
147 SaveReg <BX>
148 Invoke SFFromSFN
149 JC CommitDone
150 CMP ES:[DI].sf_Ref_Count,0 ; if (ThisSFT->refcount != 0)
151 JZ CommitNext
152 CMP ES:[DI].sf_Ref_Count,sf_busy ; BUSY SFTs have god knows what
153 JZ CommitNext ; in them.
154; TEST ES:[DI].sf_flags,sf_isnet
155 invoke Test_IFS_Remote ;IFS. ;AN000;
156 JNZ CommitNext ; Skip Network SFTs so the SERVER
157 ; doesn't deadlock
158 MOV WORD PTR ThisSFT,DI
159 MOV WORD PTR ThisSFT+2,ES
160 Invoke DOS_Commit ; DOSCommit ();
161CommitNext:
162 RestoreReg <BX>
163 INC BX
164 JMP CommitLoop
165CommitDone:
166 LeaveCrit critSFT
167 RestoreReg <BX>
168 transfer Sys_Ret_OK
169
170CLOSE_NAME:
171ASSUME DS:NOTHING,ES:NOTHING
172
173if installed
174 Call JShare + 5 * 4
175else
176 Call MFTcloN
177endif
178CheckReturns:
179 JC func_err
180 transfer SYS_RET_OK
181func_err:
182 transfer SYS_RET_ERR
183
184CLOSE_UID:
185ASSUME DS:NOTHING,ES:NOTHING
186
187if installed
188 Call JShare + 3 * 4
189else
190 Call MFTclU
191endif
192 JMP CheckReturns
193
194CLOSE_UID_PID:
195ASSUME DS:NOTHING,ES:NOTHING
196
197if installed
198 Call JShare + 4 * 4
199else
200 Call MFTCloseP
201endif
202 JMP CheckReturns
203
204GET_LIST:
205ASSUME DS:NOTHING,ES:NOTHING
206if installed
207 Call JShare + 9 * 4
208else
209 Call MFT_get
210endif
211 JC func_err
212 invoke get_user_stack
213 MOV [SI.user_BX],BX
214 MOV [SI.user_DI],DI
215 MOV [SI.user_ES],ES
216SetCXOK:
217 MOV [SI.user_CX],CX
218 transfer SYS_RET_OK
219
220SRV_CALL:
221ASSUME DS:NOTHING,ES:NOTHING
222 POP AX ; get rid of call to $srvcall
223 SaveReg <DS,SI>
224 invoke GET_USER_STACK
225 RestoreReg <DI,ES>
226;
227; DS:SI point to stack
228; ES:DI point to DPL
229;
230 invoke XCHGP
231;
232; DS:SI point to DPL
233; ES:DI point to stack
234;
235; We now copy the registers from DPL to save stack
236;
237 SaveReg <SI>
238 MOV CX,6
239 REP MOVSW ; Put in AX,BX,CX,DX,SI,DI
240 INC DI
241 INC DI ; Skip user_BP
242 MOVSW ; DS
243 MOVSW ; ES
244 RestoreReg <SI> ; DS:SI -> DPL
245 MOV AX,[SI.DPL_AX]
246 MOV BX,[SI.DPL_BX]
247 MOV CX,[SI.DPL_CX]
248 MOV DX,[SI.DPL_DX]
249 MOV DI,[SI.DPL_DI]
250 MOV ES,[SI.DPL_ES]
251 PUSH [SI.DPL_SI]
252 MOV DS,[SI.DPL_DS]
253 POP SI
254 MOV [SaveDS],DS
255 MOV [SaveBX],BX
256 MOV fSharing,-1 ; set no redirect flag
257 transfer REDISP
258
259GET_DOS_DATA:
260ASSUME DS:NOTHING,ES:NOTHING
261 LES DI,[SWAP_ALWAYS_AREA] ;IFS. get beginning addr of swap ;AC000;
262 MOV DX,[SWAP_ALWAYS_AREA_LEN] ;IFS. get swap always area len ;AC000;
263 AND DX,7FFFH ;IFS. clear high bit ;AC000;
264 MOV CX,[SWAP_AREA_LEN] ;IFS. get swap len ;AC000;
265 invoke GET_USER_STACK
266 MOV [SI.user_DS],ES ; set user regs
267 MOV [SI.user_SI],DI ;
268 MOV [SI.user_DX],DX ;
269 JMP SetCXOK ; ;AN000;
270
271SPOOL_OPER:
272ASSUME DS:NOTHING,ES:NOTHING
273 CallInstall NETSpoolOper,multNet,37,AX,BX
274 JC func_err2
275 transfer SYS_RET_OK
276func_err2:
277 transfer SYS_RET_ERR
278
279Break <$SetExtendedError - set extended error for later retrieval>
280
281;
282; $SetExtendedError takes extended error information and loads it up for the
283; next extended error call. This is used by interrupt-level proccessors to
284; mask their actions.
285;
286; Inputs: DS:SI points to DPL which contains all registers
287; Outputs: none
288;
289
290$SetExtendedError:
291 ASSUME DS:NOTHING,ES:NOTHING
292 MOV AX,[SI].dpl_AX
293 MOV [EXTERR],AX
294 MOV AX,[SI].dpL_di
295 MOV WORD PTR ExtErrPt,AX
296 MOV AX,[SI].dpL_ES
297 MOV WORD PTR ExtErrPt+2,AX
298 MOV AX,[SI].dpL_BX
299 MOV WORD PTR [EXTERR_ACTION],AX
300 MOV AX,[SI].dpL_CX
301 MOV [EXTERR_LOCUS],AH
302 return
303EndProc $ServerCall
304
305CODE ENDS
306 END