Raw File
1 ; _____________________________________________
2 ; | |
3 ; | Project: APPLER |
4 ; | File: TASKCTRL.ASM |
5 ; | Compiler: 16-bit TASM (2.5) |
6 ; | |
7 ; | Subject: Task Manager |
8 ; | |
9 ; | Author: Emil Dotchevski |
10 ; |_____________________________________________|
11
12 include GLOBALS.INC
13 include INTERFAC.INC
14
15 TaskControl segment public
16 assume CS:TaskControl,DS:TaskControl,ES:Emulate,SS:Data
17
18 PROCESSES_NUM = 9
19
20 CurrentProcessID db PID_EMULATOR
21 Stacks dw SP_Emulator
22 dw SP_Debugger
23 dw SP_FileManager
24 dw SP_FloppyDiskManager
25 dw SP_KeyboardSetup
26 dw SP_AboutScreen
27 dw SP_HelpScreen
28 dw SP_DosShell
29 dw SP_QuitAppler
30 PackedSPs dw PROCESSES_NUM dup (0)
31 StackPointers dw PROCESSES_NUM dup (0)
32
33 INinits dd EmulatorInInit,DebugInInit,FMInInit,DMInInit
34 dd KBDsetupInInit,AboutInInit,HelpInInit,NoInit,NoInit
35 OUTinits dd EmulatorOutInit,DebugOutInit,FMOutInit,DMOutInit
36 dd KBDsetupOutInit,AboutOutInit,HelpOutInit,NoInit,NoInit
37
38 EnableTaskSwitch db 1
39 PreviousProcessID db PID_DONT_SWITCH
40 TaskSwitch proc far ; Proces ID in AL
41 pushf
42 SaveAll
43 cmp cs:EnableTaskSwitch,0
44 jz TS_DontSwitch
45 cmp al,PID_DONT_SWITCH
46 je TS_DontSwitch
47 cmp al,PID_PREVIOUS_PROCESS
48 jne TS_NotPrevious
49 mov al,cs:PreviousProcessID
50 TS_NotPrevious: cli
51 mov bx,ss
52 mov ds,bx
53 mov es,bx
54 xor bh,bh
55 mov bl,cs:CurrentProcessID
56 mov cs:PreviousProcessID,bl
57 mov cs:CurrentProcessID,al
58 shl bx,1
59 mov cs:StackPointers[bx],sp
60 shl bx,1
61 call cs:OUTinits[bx]
62 shr bx,1
63 mov si,sp
64 mov cx,offset SP_MainStack
65 sub cx,sp
66 mov di,cs:Stacks[bx]
67 sub di,cx
68 mov cs:PackedSPs[bx],di
69 shr cx,1
70 cld
71 rep movsw
72 xor bh,bh
73 mov bl,cs:CurrentProcessID
74 shl bx,1
75 mov si,cs:PackedSPs[bx]
76 mov di,cs:StackPointers[bx]
77 mov sp,di
78 mov cx,offset SP_MainStack
79 sub cx,di
80 shr cx,1
81 rep movsw
82 shl bx,1
83 call cs:INinits[bx]
84 TS_DontSwitch: RestoreAll
85 popf
86 ret
87 TaskSwitch endp
88
89 S_Address struc
90 RetSegment dw ?
91 RetOffset dw ?
92 S_Address ends
93 StartupAdr macro Adr
94 S_Address <seg Adr, offset Adr>
95 endm
96 RetAddresses label S_Address
97 StartupAdr ?
98 StartupAdr DebugMainRet
99 StartupAdr FM_MainRet
100 StartupAdr DM_MainRet
101 StartupAdr KBDsetupRET
102 StartupAdr AboutMainRet
103 StartupAdr HelpMainRet
104 StartupAdr CtrlAltEsc
105 StartupAdr CtrlAltDel
106
107 CALLpowerON proc far
108 cli
109 mov ax,18*4
110 mov cx,seg HelpMessage
111 mov dx,offset HelpMessage
112 call TimerReq
113 push cs
114 pop ds
115 mov cx,PROCESSES_NUM
116 xor bx,bx
117 mov si,bx
118 mov ax,7200h ; Valid flags
119 InitStacksLoop: mov sp,Stacks[si]
120 push RetAddresses[bx].RetSegment
121 push RetAddresses[bx].RetOffset
122 push ax ; Valid flags
123 sub sp,9*2
124 mov PackedSPs[si],sp
125 mov StackPointers[si],offset SP_MainStack - (1+1+1+9)*2
126 add bx,4
127 add si,2
128 loop InitStacksLoop
129 mov ax,Emulate
130 mov es,ax
131 mov CurrentProcessID,PID_EMULATOR
132 mov sp,offset SP_MainStack
133 mov SaveStack,sp
134 jmp far ptr PowerON
135 CALLpowerON endp
136
137
138
139 HelpMsg db ' Press <F10> for Help '
140 HelpMessage proc far
141 push ax cx si di ds es
142 mov ah,0Fh
143 int 10h
144 cmp al,1
145 jne HM_Ret
146 push cs
147 pop ds
148 mov ax,Video
149 mov es,ax
150 mov si,offset HelpMsg
151 mov di,40*24*2+9*2
152 mov cx,offset HelpMessage - offset HelpMsg
153 mov ah,2Fh
154 HM_Loop: lodsb
155 stosw
156 loop HM_Loop
157 mov ax,18*7
158 mov cx,seg HideHelpMessage
159 mov dx,offset HideHelpMessage
160 call TimerReq
161 HM_Ret: pop es ds di si cx ax
162 ret
163 HelpMessage endp
164
165 HideHelpMessage proc far
166 push ax cx di es
167 mov ah,0Fh
168 int 10h
169 cmp al,1
170 jne HHM_Ret
171 mov ax,Video
172 mov es,ax
173 mov di,40*24*2+9*2
174 mov cx,offset HelpMessage- offset HelpMsg
175 mov ax,0
176 rep stosw
177 HHM_Ret: pop es di cx ax
178 ret
179 HideHelpMessage endp
180
181
182 assume CS:TaskControl,DS:nothing,ES:nothing,SS:Data
183 WIE_HELP dw 0
184 WIE_Counter dw 1
185 WaitInstrEnd proc far
186 xchg bp,sp
187 cmp byte ptr [bp],0
188 je WaitInstrEnd1
189 xchg sp,bp
190 iret
191 WaitInstrEnd1: cmp word ptr [bp+2],Emulate
192 je WaitInstrEnd2
193 xchg sp,bp
194 iret
195 WaitInstrEnd2: mov [WIE_HELP],ax
196 mov ax,[bp]
197 cmp ah,DS:[si-1]
198 mov ax,[WIE_HELP]
199 xchg sp,bp
200 je WaitInstrEnd3
201 iret
202 WaitInstrEnd3: dec [WIE_Counter]
203 jz WaitInstrEnd4
204 iret
205 WaitInstrEnd4: mov ax,seg F1_or_Invalid?
206 mov es,ax
207 assume es:seg F1_or_Invalid?
208 mov byte ptr es:F1_or_Invalid?,0
209 pop ax
210 pop es
211 pop ax
212 jmp DO_RETapple
213 WaitInstrEnd endp
214
215 assume DS:TaskControl, ES:Emulate
216
217 r_A db 0
218 r_X db 0
219 r_Y db 0
220 r_S db 0
221 r_P db 0
222 r_PC dw 0
223 T_Iflags db 00000010b
224 RetWhere? db 0
225 Emulator proc far
226 RETapple: pushf ; Invalid Opcode Entry Point
227 xor ax,ax
228 push ax
229 popf
230 mov ax,Debug
231 mov es,ax
232 assume es:Debug
233 mov es:F1_or_Invalid?,1
234 mov cs:RetWhere?,PID_DEBUGGER
235 pop ax
236 DO_RETapple: push cs ; WaitInstrEnd Entry Point
237 pop ds
238 mov bx,Emulate
239 mov es,bx
240 assume es:Emulate
241 and al,11000000b
242 shl ax,1
243 rol al,3
244 shr ax,1
245 or al,dh
246 or al,AppleFlags
247 mov r_P,al
248 mov r_A,dl
249 mov r_X,cl
250 mov ax,bp
251 mov r_Y,al
252 mov ax,AppleSP
253 mov r_S,al
254 dec si
255 mov r_PC,si
256
257 mov sp,offset SP_MainStack
258 mov al,RetWhere?
259 call TaskSwitch
260
261 cli
262 push cs
263 pop ds
264 mov ax,Emulate
265 mov es,ax
266 mov SaveStack,sp
267 mov dl,r_A
268 xor ax,ax
269 mov al,r_X
270 mov cx,ax
271 mov al,r_Y
272 mov bp,ax
273 mov al,r_S
274 mov byte ptr AppleSP,al
275 mov si,r_PC
276 mov al,r_P
277 mov ah,al
278 mov bh,al
279 mov dh,al
280 and ah,00111100b
281 and bh,00001000b
282 and dh,01000001b
283 mov AppleFlags,ah
284 cbw
285 shr al,1
286 ror al,1
287 shr ax,1
288 xor ah,ah
289 mov bl,ah
290 or ah,T_Iflags
291 shl bh,2
292 or bh,0D8h
293 push ax
294 push es
295 push bx
296 mov ax,Apple
297 mov bx,Video
298 mov ds,ax
299 mov es,bx
300 xor bl,bl
301 mov cs:WIE_Counter,2
302 iret
303 Emulator endp
304
305 EmulatorInInit proc far
306 mov cs:RetWhere?,PID_DEBUGGER
307 ret
308 EmulatorInInit endp
309
310 EmulatorOutInit proc far
311 push ax cx di es
312 mov ax,seg SwapFlag
313 mov es,ax
314 assume es:seg SwapFlag
315 mov es:SwapFlag,1
316 assume es:Emulate
317 mov ax,Apple
318 mov es,ax
319 mov di,0C700h
320 mov cx,11
321 xor al,al
322 rep stosb
323 pop es di cx ax
324 ret
325 EmulatorOutInit endp
326
327 CtrlAltEsc: call DosShell
328 SwitchToProcess PID_EMULATOR
329 jmp CtrlAltEsc
330
331 CtrlAltDel: call QuitAppler
332 jmp CtrlAltDel
333
334 NoInit proc far
335 ret
336 NoInit endp
337
338 TaskControl ends
339
340
341 DATA segment stack 'stack'
342
343 dw 24+000h dup (0)
344 SP_Emulator label word
345 dw 24+080h dup (0)
346 SP_Debugger label word
347 dw 24+060h dup (0)
348 SP_FileManager label word
349 dw 24+060h dup (0)
350 SP_FloppyDiskManager label word
351 dw 24+060h dup (0)
352 SP_KeyboardSetup label word
353 dw 24+030h dup (0)
354 SP_AboutScreen label word
355 dw 24+030h dup (0)
356 SP_HelpScreen label word
357 dw 24+020h dup (0)
358 SP_DosShell label word
359 dw 24+000h dup (0)
360 SP_QuitAppler label word
361 dw 0C0h dup (0)
362 SP_MainStack label word
363
364 DATA ends
365
366 END
367
Generated by GNU Enscript 1.6.6, and GophHub 1.3.