diff options
Diffstat (limited to 'v4.0/src/DOS/SRVCALL.ASM')
| -rw-r--r-- | v4.0/src/DOS/SRVCALL.ASM | 306 |
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 | ||
| 2 | TITLE SRVCALL - Server DOS call | ||
| 3 | NAME 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 | ; | ||
| 19 | include dosseg.asm | ||
| 20 | |||
| 21 | CODE SEGMENT BYTE PUBLIC 'CODE' | ||
| 22 | ASSUME SS:DOSGROUP,CS:DOSGROUP | ||
| 23 | |||
| 24 | .xcref | ||
| 25 | INCLUDE DOSSYM.INC | ||
| 26 | INCLUDE DEVSYM.INC | ||
| 27 | .cref | ||
| 28 | .list | ||
| 29 | |||
| 30 | AsmVars <Installed> | ||
| 31 | |||
| 32 | include dpl.asm | ||
| 33 | |||
| 34 | Installed = 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 | |||
| 56 | BREAK <ServerCall -- Server DOS call> | ||
| 57 | |||
| 58 | TABLE SEGMENT | ||
| 59 | Public SRVC001S,SRVC001E | ||
| 60 | SRVC001S label byte | ||
| 61 | |||
| 62 | ServerTab DW DOSGroup:Server_Disp | ||
| 63 | SERVERLEAVE DW DOSGROUP:ServerReturn | ||
| 64 | SERVER_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 | ||
| 76 | SERVER_DISP_END LABEL BYTE | ||
| 77 | |||
| 78 | SRVC001E label byte | ||
| 79 | |||
| 80 | TABLE 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 | ||
| 108 | ASSUME 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; | ||
| 122 | SET_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 | ||
| 128 | NO_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 | ||
| 135 | ServerReturn: | ||
| 136 | return | ||
| 137 | |||
| 138 | ; Commit - iterate through the open file list and make sure that the | ||
| 139 | ; directory entries are correctly updated. | ||
| 140 | |||
| 141 | COMMIT_ALL: | ||
| 142 | ASSUME 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 | ||
| 146 | CommitLoop: | ||
| 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 (); | ||
| 161 | CommitNext: | ||
| 162 | RestoreReg <BX> | ||
| 163 | INC BX | ||
| 164 | JMP CommitLoop | ||
| 165 | CommitDone: | ||
| 166 | LeaveCrit critSFT | ||
| 167 | RestoreReg <BX> | ||
| 168 | transfer Sys_Ret_OK | ||
| 169 | |||
| 170 | CLOSE_NAME: | ||
| 171 | ASSUME DS:NOTHING,ES:NOTHING | ||
| 172 | |||
| 173 | if installed | ||
| 174 | Call JShare + 5 * 4 | ||
| 175 | else | ||
| 176 | Call MFTcloN | ||
| 177 | endif | ||
| 178 | CheckReturns: | ||
| 179 | JC func_err | ||
| 180 | transfer SYS_RET_OK | ||
| 181 | func_err: | ||
| 182 | transfer SYS_RET_ERR | ||
| 183 | |||
| 184 | CLOSE_UID: | ||
| 185 | ASSUME DS:NOTHING,ES:NOTHING | ||
| 186 | |||
| 187 | if installed | ||
| 188 | Call JShare + 3 * 4 | ||
| 189 | else | ||
| 190 | Call MFTclU | ||
| 191 | endif | ||
| 192 | JMP CheckReturns | ||
| 193 | |||
| 194 | CLOSE_UID_PID: | ||
| 195 | ASSUME DS:NOTHING,ES:NOTHING | ||
| 196 | |||
| 197 | if installed | ||
| 198 | Call JShare + 4 * 4 | ||
| 199 | else | ||
| 200 | Call MFTCloseP | ||
| 201 | endif | ||
| 202 | JMP CheckReturns | ||
| 203 | |||
| 204 | GET_LIST: | ||
| 205 | ASSUME DS:NOTHING,ES:NOTHING | ||
| 206 | if installed | ||
| 207 | Call JShare + 9 * 4 | ||
| 208 | else | ||
| 209 | Call MFT_get | ||
| 210 | endif | ||
| 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 | ||
| 216 | SetCXOK: | ||
| 217 | MOV [SI.user_CX],CX | ||
| 218 | transfer SYS_RET_OK | ||
| 219 | |||
| 220 | SRV_CALL: | ||
| 221 | ASSUME 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 | |||
| 259 | GET_DOS_DATA: | ||
| 260 | ASSUME 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 | |||
| 271 | SPOOL_OPER: | ||
| 272 | ASSUME DS:NOTHING,ES:NOTHING | ||
| 273 | CallInstall NETSpoolOper,multNet,37,AX,BX | ||
| 274 | JC func_err2 | ||
| 275 | transfer SYS_RET_OK | ||
| 276 | func_err2: | ||
| 277 | transfer SYS_RET_ERR | ||
| 278 | |||
| 279 | Break <$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 | ||
| 303 | EndProc $ServerCall | ||
| 304 | |||
| 305 | CODE ENDS | ||
| 306 | END | ||