From 2d04cacc5322951f187bb17e017c12920ac8ebe2 Mon Sep 17 00:00:00 2001 From: Mark Zbikowski Date: Thu, 25 Apr 2024 21:24:10 +0100 Subject: MZ is back! --- v4.0/src/DOS/SRVCALL.ASM | 306 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 306 insertions(+) create mode 100644 v4.0/src/DOS/SRVCALL.ASM (limited to 'v4.0/src/DOS/SRVCALL.ASM') 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 @@ +; SCCSID = @(#)srvcall.asm 1.4 85/08/02 +TITLE SRVCALL - Server DOS call +NAME SRVCALL +; +; Server DOS call functions +; +; +; $ServerCall +; +; Modification history: +; +; Created: ARR 08 August 1983 +; + +.xlist +; +; get the appropriate segment definitions +; +include dosseg.asm + +CODE SEGMENT BYTE PUBLIC 'CODE' + ASSUME SS:DOSGROUP,CS:DOSGROUP + +.xcref +INCLUDE DOSSYM.INC +INCLUDE DEVSYM.INC +.cref +.list + +AsmVars + +include dpl.asm + +Installed = TRUE + + i_need USER_ID,WORD + i_need PROC_ID,WORD + i_need SaveBX,WORD + i_need SaveDS,WORD + i_need SWAP_START,BYTE + i_need SWAP_ALWAYS,BYTE + i_need SWAP_END,BYTE + I_Need ThisSFT,DWORD + I_need fSharing,BYTE + i_need OpenBuf,128 + I_Need ExtErr,WORD + I_Need ExtErr_Action,BYTE + I_Need ExtErrPt,DWORD + I_Need EXTERR_LOCUS,BYTE ; Extended Error Locus + i_need JShare,DWORD + i_need SWAP_AREA_TABLE,BYTE + i_need SWAP_ALWAYS_AREA,DWORD + i_need SWAP_ALWAYS_AREA_LEN,WORD + i_need SWAP_AREA_LEN,WORD + +BREAK + +TABLE SEGMENT +Public SRVC001S,SRVC001E +SRVC001S label byte + +ServerTab DW DOSGroup:Server_Disp +SERVERLEAVE DW DOSGROUP:ServerReturn +SERVER_DISP DB (SERVER_DISP_END-SERVER_DISP-1)/2 + DW OFFSET DOSGROUP:SRV_CALL ; 0 + DW OFFSET DOSGROUP:COMMIT_ALL ; 1 + DW OFFSET DOSGROUP:CLOSE_NAME ; 2 + DW OFFSET DOSGROUP:CLOSE_UID ; 3 + DW OFFSET DOSGROUP:CLOSE_UID_PID ; 4 + DW OFFSET DOSGROUP:GET_LIST ; 5 + DW OFFSET DOSGROUP:GET_DOS_DATA ; 6 + DW OFFSET DOSGROUP:SPOOL_OPER ; 7 + DW OFFSET DOSGROUP:SPOOL_OPER ; 8 + DW OFFSET DOSGROUP:SPOOL_OPER ; 9 + DW OFFSET DOSGroup:$setExtendedError ; 10 +SERVER_DISP_END LABEL BYTE + +SRVC001E label byte + +TABLE ENDS + +; Inputs: +; DS:DX -> DPL (except calls 7,8,9) +; Function: +; AL=0 Server DOS call +; AL=1 Commit All files +; AL=2 Close file by name (SHARING LOADED ONLY) DS:DX in DPL -> name +; AL=3 Close all files for DPL_UID +; AL=4 Close all files for DPL_UID/PID_PID +; AL=5 Get open file list entry +; IN: BX File Index +; CX User Index +; OUT:ES:DI -> Name +; BX = UID +; CX = # locked blocks held by this UID +; AL=6 Get DOS data area +; OUT: DS:SI -> Start +; CX size in bytes of swap if indos +; DX size in bytes of swap always +; AL=7 Get truncate flag +; AL=8 Set truncate flag +; AL=9 Close all spool files +; AL=10 SetExtendedError +; AL=11 DOS4.00 Get DOS data area +; DS:SI -> swap table + + procedure $ServerCall,NEAR +ASSUME DS:NOTHING,ES:NOTHING + CMP AL,7 + JB SET_STUFF + CMP AL,9 + JBE NO_SET_ID ; No DPL on calls 7,8,9 + CMP AL,11 ;IFS. ;AN000; + JNZ SET_STUFF ;IFS. ;AN000; + MOV DI,OFFSET DOSGROUP:SWAP_AREA_TABLE ;IFS. ;AN000; + PUSH SS ;IFS. ;AN000; + POP ES ;IFS. ;AN000; + invoke GET_USER_STACK ;IFS. ;AN000; + MOV [SI.user_DS],ES ;IFS. ds:si -> swap tab ;AN000; + MOV [SI.user_SI],DI ;IFS. ;AN000; + transfer SYS_RET_OK ;IFS. ;AN000; +SET_STUFF: + MOV SI,DX ; Point to DPL with DS:SI + MOV BX,[SI.DPL_UID] + MOV [USER_ID],BX ; Set UID + MOV BX,[SI.DPL_PID] + MOV [PROC_ID],BX ; Set process ID +NO_SET_ID: + PUSH SERVERLEAVE ; push return address + PUSH ServerTab ; push table address + PUSH AX + Invoke TableDispatch + MOV EXTERR_LOCUS,errLoc_Unk ; Extended Error Locus + error error_invalid_function +ServerReturn: + return + +; Commit - iterate through the open file list and make sure that the +; directory entries are correctly updated. + +COMMIT_ALL: +ASSUME DS:NOTHING,ES:NOTHING + XOR BX,BX ; for (i=0; ThisSFT=getSFT(i); i++) + Context DS + EnterCrit critSFT ; Gonna scan SFT cache, lock it down +CommitLoop: + SaveReg + Invoke SFFromSFN + JC CommitDone + CMP ES:[DI].sf_Ref_Count,0 ; if (ThisSFT->refcount != 0) + JZ CommitNext + CMP ES:[DI].sf_Ref_Count,sf_busy ; BUSY SFTs have god knows what + JZ CommitNext ; in them. +; TEST ES:[DI].sf_flags,sf_isnet + invoke Test_IFS_Remote ;IFS. ;AN000; + JNZ CommitNext ; Skip Network SFTs so the SERVER + ; doesn't deadlock + MOV WORD PTR ThisSFT,DI + MOV WORD PTR ThisSFT+2,ES + Invoke DOS_Commit ; DOSCommit (); +CommitNext: + RestoreReg + INC BX + JMP CommitLoop +CommitDone: + LeaveCrit critSFT + RestoreReg + transfer Sys_Ret_OK + +CLOSE_NAME: +ASSUME DS:NOTHING,ES:NOTHING + +if installed + Call JShare + 5 * 4 +else + Call MFTcloN +endif +CheckReturns: + JC func_err + transfer SYS_RET_OK +func_err: + transfer SYS_RET_ERR + +CLOSE_UID: +ASSUME DS:NOTHING,ES:NOTHING + +if installed + Call JShare + 3 * 4 +else + Call MFTclU +endif + JMP CheckReturns + +CLOSE_UID_PID: +ASSUME DS:NOTHING,ES:NOTHING + +if installed + Call JShare + 4 * 4 +else + Call MFTCloseP +endif + JMP CheckReturns + +GET_LIST: +ASSUME DS:NOTHING,ES:NOTHING +if installed + Call JShare + 9 * 4 +else + Call MFT_get +endif + JC func_err + invoke get_user_stack + MOV [SI.user_BX],BX + MOV [SI.user_DI],DI + MOV [SI.user_ES],ES +SetCXOK: + MOV [SI.user_CX],CX + transfer SYS_RET_OK + +SRV_CALL: +ASSUME DS:NOTHING,ES:NOTHING + POP AX ; get rid of call to $srvcall + SaveReg + invoke GET_USER_STACK + RestoreReg +; +; DS:SI point to stack +; ES:DI point to DPL +; + invoke XCHGP +; +; DS:SI point to DPL +; ES:DI point to stack +; +; We now copy the registers from DPL to save stack +; + SaveReg + MOV CX,6 + REP MOVSW ; Put in AX,BX,CX,DX,SI,DI + INC DI + INC DI ; Skip user_BP + MOVSW ; DS + MOVSW ; ES + RestoreReg ; DS:SI -> DPL + MOV AX,[SI.DPL_AX] + MOV BX,[SI.DPL_BX] + MOV CX,[SI.DPL_CX] + MOV DX,[SI.DPL_DX] + MOV DI,[SI.DPL_DI] + MOV ES,[SI.DPL_ES] + PUSH [SI.DPL_SI] + MOV DS,[SI.DPL_DS] + POP SI + MOV [SaveDS],DS + MOV [SaveBX],BX + MOV fSharing,-1 ; set no redirect flag + transfer REDISP + +GET_DOS_DATA: +ASSUME DS:NOTHING,ES:NOTHING + LES DI,[SWAP_ALWAYS_AREA] ;IFS. get beginning addr of swap ;AC000; + MOV DX,[SWAP_ALWAYS_AREA_LEN] ;IFS. get swap always area len ;AC000; + AND DX,7FFFH ;IFS. clear high bit ;AC000; + MOV CX,[SWAP_AREA_LEN] ;IFS. get swap len ;AC000; + invoke GET_USER_STACK + MOV [SI.user_DS],ES ; set user regs + MOV [SI.user_SI],DI ; + MOV [SI.user_DX],DX ; + JMP SetCXOK ; ;AN000; + +SPOOL_OPER: +ASSUME DS:NOTHING,ES:NOTHING + CallInstall NETSpoolOper,multNet,37,AX,BX + JC func_err2 + transfer SYS_RET_OK +func_err2: + transfer SYS_RET_ERR + +Break <$SetExtendedError - set extended error for later retrieval> + +; +; $SetExtendedError takes extended error information and loads it up for the +; next extended error call. This is used by interrupt-level proccessors to +; mask their actions. +; +; Inputs: DS:SI points to DPL which contains all registers +; Outputs: none +; + +$SetExtendedError: + ASSUME DS:NOTHING,ES:NOTHING + MOV AX,[SI].dpl_AX + MOV [EXTERR],AX + MOV AX,[SI].dpL_di + MOV WORD PTR ExtErrPt,AX + MOV AX,[SI].dpL_ES + MOV WORD PTR ExtErrPt+2,AX + MOV AX,[SI].dpL_BX + MOV WORD PTR [EXTERR_ACTION],AX + MOV AX,[SI].dpL_CX + MOV [EXTERR_LOCUS],AH + return +EndProc $ServerCall + +CODE ENDS + END -- cgit v1.2.3