-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTASKMGR.PAS
More file actions
206 lines (177 loc) · 4.25 KB
/
TASKMGR.PAS
File metadata and controls
206 lines (177 loc) · 4.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
{ @author: Sylvain Maltais (support@gladir.com)
@created: 2023
@website(https://www.gladir.com/CODER/DRDOSLIB-TP)
@abstract(Target: Turbo Pascal 7)
}
Unit TASKMGR;
INTERFACE
Const
PseudoMaxTasks=5000;
Type
TaskName=String[8];
IDTable=Array[0..PseudoMaxTasks]of Word;
PIDTable=^IDTable;
TaskNameC=Array[0..7]of Char;
NameTable=Array[0..PseudoMaxTasks]of TaskNameC;
PNameTable=^NameTable;
Function TaskMgrCheckOpenFiles(TaskIndex:word):Word;
Function TaskMgrGetForegroundTaskIndex:Word;
Function TaskMgrGetNameTablePointer:PNameTable;
Function TaskMgrGetPerTaskEMSlimit:Word;
Procedure TaskMgrGetStatus(Var Tasks,MaximumTasks,ForegroundTaskIndex:Word);
Procedure TaskMgrGetSwapSpaceInfo(Var AvailableKB,TotalKB:Word);
Function TaskMgrGetTaskName(Index:Word):TaskName;
Procedure TaskMgrGetVersion(Var MajorVersion,MinorVersion:Byte);
Function TaskMgrIDToIndex(ID:Word):Word;
Function TaskMgrIndexToID(Index:Word):Word;
Function TaskMgrInstall:Boolean;
Procedure TaskMgrNameTask(TaskIndex:Word;Const Name:TaskName;Var Flag:Byte;Var ID:Word);
Procedure TaskMgrNameTaskC(TaskIndex,NSeg,NOfs:Word;Var Flag:Byte;Var ID:Word);
Function TaskMgrReleaseTimeSlice:Boolean;
Procedure TaskMgrShell(Const ComLine:String);
Procedure TaskMgrSwitchTo(TaskIndex:Word);
Procedure TaskMgrSwitchToTaskManager;
IMPLEMENTATION
Uses DOS;
Function TaskMgrInstall:Boolean;Assembler;ASM
MOV AX,02700h
INT 02Fh
CMP AL,0FFh
MOV AL,000h
JNZ @@F01non
INC AX
@@F01non:
END;
Procedure TaskMgrGetStatus(Var Tasks,MaximumTasks,ForegroundTaskIndex:Word);Assembler;ASM
MOV AX,02701h
INT 02Fh
LES DI,Tasks
MOV ES:[DI],CX
LES DI,MaximumTasks
MOV ES:[DI],AX
LES DI,ForegroundTaskIndex
MOV ES:[DI],BX
END;
Procedure TaskMgrGetVersion(Var MajorVersion,MinorVersion:Byte);Assembler;ASM
MOV AX,02701h
INT 02Fh
LES DI,MajorVersion
MOV ES:[DI],DL
LES DI,MinorVersion
MOV ES:[DI],DH
END;
Function TaskMgrGetNameTablePointer:PNameTable;Assembler;ASM
MOV AX,02701h
INT 02Fh
MOV DX,ES
XCHG AX,DI {resultat <- Pointeur(DX,AX) }
END;
Function TaskMgrGetForegroundTaskIndex:Word;Assembler;ASM
MOV AX,02701h
INT 02Fh
XCHG AX,BX
END;
Function TaskMgrGetPerTaskEMSlimit:Word;Assembler;ASM
MOV AX,02702h
INT 02Fh
XCHG AX,DX
END;
Procedure TaskMgrSetPerTaskEMSLimit(Limit:Word;Var NewLimit:Word);Assembler;ASM
MOV AX,02703h
MOV DX,Limit
INT 02Fh
LES DI,NewLimit
MOV ES:[DI],DX
END;
Procedure TaskMgrSwitchTo(TaskIndex:Word);Assembler;ASM
MOV AX,02706h
MOV DX,TaskIndex
INT 02Fh
END;
Procedure TaskMgrSwitchToTaskManager;Assembler;ASM
MOV AX,02715h
INT 02Fh
END;
Function TaskMgrReleaseTimeSlice:Boolean;Assembler;ASM
MOV AX,01680h
INT 02Fh
AND AX,AX
MOV AL,0
JNZ @PasDepret
INC AX
@PasDepret:
END;
Function TaskMgrGetTaskName(Index:Word):TaskName;
Var
R:TaskName;
N:TaskNameC;
Begin
N:=TaskMgrGetNameTablePointer^[Index];
R:='';
While(Length(R)<=7)and(N[length(R)]<>#0)do R:=R+N[Length(R)];
TaskMgrGetTaskName:=R
End;
Procedure TaskMgrNameTaskC(TaskIndex,NSeg,NOfs:Word;Var Flag:Byte;Var ID:Word);Assembler;ASM
PUSH DS
MOV AX,02709h
MOV DX,TaskIndex
MOV BX,NSeg
MOV CX,NOfs
MOV DS,BX
MOV SI,CX
INT 02Fh
LES DI,Flag
MOV ES:[DI],AL
LES DI,ID
MOV ES:[DI],BX
POP DS
END;
Procedure TaskMgrNameTask(TaskIndex:Word;Const Name:TaskName;Var Flag:Byte;Var ID:Word);
Var
NameC:TaskNameC;
I,L:Byte;
Begin
FillChar(NameC,SizeOf(NameC),0);
L:=Length(Name);
If L>8Then L:=8;
For I:=1to(L)do NameC[I-1]:=Name[I];
TaskMgrNameTaskC(TaskIndex,Seg(NameC),Ofs(NameC),Flag,ID);
End;
Function TaskMgrIndexToID(Index:Word):Word;Assembler;ASM
MOV AX,0270Ah
MOV DX,Index
INT 02Fh
XCHG AX,DX
END;
Function TaskMgrIDToIndex(ID:Word):Word;Assembler;ASM
MOV AX,0270Bh
MOV DX,ID
INT 02Fh
XCHG AX,DX
END;
Function TaskMgrCheckOpenFiles(TaskIndex:word):Word;Assembler;ASM
MOV AX,0270Ch
MOV DX,TaskIndex
INT 02Fh
END;
Procedure TaskMgrGetSwapSpaceInfo(Var AvailableKB,TotalKB:Word);Assembler;ASM
MOV AX,02714h
INT 02Fh
LES DI,AvailableKB
MOV ES:[DI],DX
LES DI,TotalKB
MOV ES:[DI],CX
END;
Procedure TaskMgrShell(Const ComLine:String);
Procedure Command(Const CP:String);Begin
SwapVectors;
Exec(GetEnv('OPENDOSCFG')+'\TASKMGR.EXE','/C'+CP);
SwapVectors
End;
Begin
If(TaskMgrInstall)Then Begin
If ComLine=''Then Command(GetEnv('COMSPEC'))
Else Command(ComLine)
End;
End;
END.