mirror of
https://github.com/microsoft/MS-DOS.git
synced 2024-11-29 17:15:47 +00:00
131 lines
3.0 KiB
NASM
131 lines
3.0 KiB
NASM
;
|
|
; process control system calls for MSDOS
|
|
;
|
|
|
|
INCLUDE DOSSEG.ASM
|
|
|
|
CODE SEGMENT BYTE PUBLIC 'CODE'
|
|
ASSUME SS:DOSGROUP,CS:DOSGROUP
|
|
|
|
.xlist
|
|
.xcref
|
|
INCLUDE DOSSYM.ASM
|
|
INCLUDE DEVSYM.ASM
|
|
.cref
|
|
.list
|
|
|
|
i_need CurrentPDB,WORD
|
|
i_need CreatePDB,BYTE
|
|
i_need NUMIO,BYTE
|
|
i_need Exit_type,BYTE
|
|
i_need INDOS,BYTE
|
|
i_need DMAADD,DWORD
|
|
i_need DidCTRLC,BYTE
|
|
|
|
SUBTTL $WAIT - return previous process error code
|
|
PAGE
|
|
;
|
|
; process control data
|
|
;
|
|
i_need exit_code,WORD ; code of exit
|
|
|
|
;
|
|
; Assembler usage:
|
|
; MOV AH, Wait
|
|
; INT int_command
|
|
; AX has the exit code
|
|
procedure $WAIT,NEAR
|
|
ASSUME DS:NOTHING,ES:NOTHING
|
|
MOV AX,[exit_code]
|
|
XOR DX,DX
|
|
MOV [exit_code],DX
|
|
transfer SYS_RET_OK
|
|
$WAIT ENDP
|
|
|
|
IF IBM
|
|
procedure $EXEC,NEAR
|
|
error error_invalid_function
|
|
$EXEC ENDP
|
|
ENDIF
|
|
IF NOT IBM
|
|
INCLUDE EXEC.ASM
|
|
ENDIF
|
|
|
|
SUBTTL Terminate and stay resident handler
|
|
PAGE
|
|
;
|
|
; Input: DX is an offset from CurrentPDB at which to
|
|
; truncate the current block.
|
|
;
|
|
; output: The current block is truncated (expanded) to be [DX+15]/16
|
|
; paragraphs long. An exit is simulated via resetting CurrentPDB
|
|
; and restoring the vectors.
|
|
;
|
|
procedure $Keep_process,NEAR
|
|
ASSUME DS:NOTHING,ES:NOTHING,SS:DOSGROUP
|
|
|
|
PUSH AX ; keep exit code around
|
|
MOV BYTE PTR [Exit_type],Exit_keep_process
|
|
MOV ES,[CurrentPDB]
|
|
CMP DX,6h ; keep enough space around for system
|
|
JAE Keep_shrink ; info
|
|
MOV DX,6h
|
|
keep_shrink:
|
|
MOV BX,DX
|
|
PUSH BX
|
|
PUSH ES
|
|
invoke $SETBLOCK ; ignore return codes.
|
|
POP DS
|
|
POP BX
|
|
JC keep_done ; failed on modification
|
|
MOV AX,DS
|
|
ADD AX,BX
|
|
MOV DS:[PDB_block_len],AX
|
|
|
|
keep_done:
|
|
POP AX
|
|
JMP SHORT exit_inner ; and let abort take care of the rest
|
|
|
|
$Keep_process ENDP
|
|
|
|
procedure Stay_resident,NEAR
|
|
ASSUME DS:NOTHING,ES:NOTHING,SS:NOTHING
|
|
MOV AX,(Keep_process SHL 8) + 0 ; Lower part is return code
|
|
ADD DX,15
|
|
MOV CL,4
|
|
SHR DX,CL
|
|
|
|
transfer COMMAND
|
|
Stay_resident ENDP
|
|
|
|
SUBTTL $EXIT - return to parent process
|
|
PAGE
|
|
;
|
|
; Assembler usage:
|
|
; MOV AL, code
|
|
; MOV AH, Exit
|
|
; INT int_command
|
|
; Error return:
|
|
; None.
|
|
;
|
|
procedure $EXIT,NEAR
|
|
ASSUME DS:NOTHING,ES:NOTHING,SS:DOSGROUP
|
|
XOR AH,AH
|
|
XCHG AH,BYTE PTR [DidCTRLC]
|
|
OR AH,AH
|
|
MOV BYTE PTR [Exit_type],exit_terminate
|
|
JZ exit_inner
|
|
MOV BYTE PTR [Exit_type],exit_ctrl_c
|
|
|
|
Exit_inner:
|
|
invoke get_user_stack
|
|
PUSH [CurrentPDB]
|
|
POP [SI.user_CS]
|
|
transfer abort_inner
|
|
$EXIT ENDP
|
|
|
|
do_ext
|
|
|
|
CODE ENDS
|
|
END
|