]> wirehaze git hosting - MS-DOS.git/blob - v4.0/src/BIOS/SYSCONF.ASM

wirehaze git hosting

MZ is back!
[MS-DOS.git] / v4.0 / src / BIOS / SYSCONF.ASM
1 PAGE ,132 ;\ f
2 ; SCCSID = @(#)sysconf.asm 0.0 86/10/20
3 TITLE BIOS SYSTEM INITIALIZATION
4 %OUT ...SYSCONF
5
6 ;==============================================================================
7 ;REVISION HISTORY:
8 ;AN000 - New for DOS Version 4.00 - J.K.
9 ;AC000 - Changed for DOS Version 4.00 - J.K.
10 ;AN00x - PTM number for DOS Version 4.00 - J.K.
11 ;==============================================================================
12 ;AN001; P132 Multiple character device installation problem. 06/27/87 J.K.
13 ;AN002; D24 MultiTrack= command added. 06/29/87 J.K.
14 ;AN003; D41 REM command in CONFIG.SYS. 07/6/87 J.K.
15 ;AN004; D184 Set DEVMARK for MEM command 08/25/87 J.K.
16 ;AN005; P568 CONFIG.SYS parsing error with FCBS=10,15 08/31/87 J.K.
17 ;AN006; P887 STACKS=0 does not show "ERROR in CONFIG.SYS..." 09/09/87 J.K.
18 ;AN007; D246, P976 Show "Bad command or parameters - ..." msg 09/22/87 J.K.
19 ;AN008; P1299 Set the second entry of DEVMARK for MEM command 09/25/87 J.K.
20 ;AN009; P1326 New Extended attribute 09/28/87 J.K.
21 ;AN010; P1820 New message SKL file 10/20/87 J.K.
22 ;AN011; P1970 AUTOTEST FCBS= command error msg inconsistent 10/23/87 J.K.
23 ;AN012; P2211 Setting the EA=7 for ANSI.SYS hangs the system 11/02/87 J.K.
24 ;AN013; P2342 REM not allowed after INSTALL command 11/09/87 J.K.
25 ;AN014; P2546 DEVICE= command still allowed after IFS= 11/17/87 J.K.
26 ;AN015; D358 New device driver INIT function package 12/03/87 J.K.
27 ;AN016; D285 Undo the extended error handling 12/17/87 J.K.
28 ;AN017; P3170 Do not call block device driver when drive # > 26 01/20/88 J.K.
29 ;AN018; P3111 Take out the order dependency of the INSTALL= 01/25/88 J.K.
30 ;AN019; D479 New option to disable extended INT 16h function call 02/12/88 J.K.
31 ;AN020; P3607 MEM does not give correct filename 02/24/88 J.K.
32 ;AN021; D493 Undo D358 & do not show error message for device driv 02/24/88 J.K.
33 ;AN022; P3807 Single buffer unprotected - System hangs 03/10/88 J.K.
34 ;AN023; P3797 An INSTALL cmd right after Bad cmd is not executed 03/10/88 J.K.
35 ;AN024; D503 Version change to 4.0 - IBMCACHE.SYS is an exception 03/15/88 J.K.
36 ;AN025; D474 Change BUFFERS= /E option to /X for expanded memory 03/16/88 J.K.
37 ;AN026; D506 Take out the order dependency of the IFS= 03/28/88 J.K.
38 ;AN027; P3957 Undo D503 - IBMCACHE.SYS version check problem 03/30/88 J.K.
39 ;AN028; P4086 Memory allocation error when loading share.exe 03/31/88 J.K.
40 ;AN029; D528 Install XMAEM.SYS first before everything else 04/29/88 J.K.
41 ;AN030; P4759 INT2f, INT 67h handlers for XMA 05/11/88 J.K.
42 ;AN031; P4889 Should check the validity of INT 67h call 05/17/88 G.A.
43 ;AN032; P4934 P4759 INT 2fh number should be changed to 1Bh 05/20/88 J.K.
44 ;AN033; P5002 EMS w/single page allocated now works 05/20/88 G.A.
45 ;AN034; P5128 EMS INT 2FH HANDLER BUG 06/24/88
46 ;==============================================================================
47
48 TRUE EQU 0FFFFh
49 FALSE EQU 0
50 LF equ 10
51 CR equ 13
52 TAB equ 9
53 SEMICOLON equ ';'
54
55 IBMVER EQU TRUE
56 IBM EQU IBMVER
57 STACKSW EQU TRUE ;Include Switchable Hardware Stacks
58 IBMJAPVER EQU FALSE ;If TRUE set KANJI true also
59 MSVER EQU FALSE
60 ALTVECT EQU FALSE ;Switch to build ALTVECT version
61 KANJI EQU FALSE
62
63 HAVE_INSTALL_CMD equ 00000001b ;AN018; CONFIG.SYS has INSTALL= commands
64 HAS_INSTALLED equ 00000010b ;AN018; SYSINIT_BASE installed.
65
66 IS_IFS equ 00000001b ;IFS command?
67 NOT_IFS equ 11111110b
68 ;
69 ;AN016; Undo the extended attribute handling
70 ;;Extended attribute value
71 ;EA_UNSPECIFIED equ 0 ;AN009;
72 ;EA_DEVICE_DRIVER equ 6 ;AN009;
73 ;EA_IFS_DRIVER equ 7 ;AN009;
74
75 DEFAULT_FILENUM = 8
76 ;
77 IF IBMJAPVER
78 NOEXEC EQU TRUE
79 ELSE
80 NOEXEC EQU FALSE
81 ENDIF
82
83 DOSSIZE EQU 0A000H
84 ;dossize equ 0C000H ;J.K. for the debugging version of IBMDOS.
85
86 .xlist
87 ; INCLUDE dossym.INC
88 include smdossym.inc ;J.K. Reduced version of DOSSYM.INC
89 INCLUDE devsym.INC
90 include ioctl.INC
91 include BIOSTRUC.INC
92 include smifssym.inc ;AN000; Reduced version of IFSSYM.INC.
93 include DEVMARK.inc ;AN004;
94 include version.inc
95 .list
96
97 IF NOT IBMJAPVER
98 EXTRN RE_INIT:FAR
99 ENDIF
100
101 ;
102
103 ;J.K. 6/29/87 External variable defined in IBMBIO module for Multi-track
104 MULTRK_ON EQU 10000000B ;User spcified Mutitrack=on, or System turns
105 ; it on after handling CONFIG.SYS file as a
106 ; default value, if MulTrk_flag = MULTRK_OFF1.
107 MULTRK_OFF1 EQU 00000000B ;initial value. No "Multitrack=" command entered.
108 MULTRK_OFF2 EQU 00000001B ;User specified Multitrack=off.
109
110 CODE segment public 'code'
111 EXTRN MulTrk_flag:word ;AN002;
112 extrn KEYRD_Func:byte ;AN019;
113 extrn KEYSTS_Func:byte ;AN019;
114 CODE ends
115 ;J.K. 6/29/87 End of Multi-track definition.
116
117 SYSINITSEG SEGMENT PUBLIC 'SYSTEM_INIT'
118
119 ASSUME CS:SYSINITSEG,DS:NOTHING,ES:NOTHING,SS:NOTHING
120
121 EXTRN BADOPM:BYTE,CRLFM:BYTE,BADCOM:BYTE,BADMEM:BYTE,BADBLOCK:BYTE
122 EXTRN BADSIZ_PRE:BYTE,BADLD_PRE:BYTE
123 ; EXTRN BADSIZ_POST:BYTE,BADLD_POST:BYTE
124 EXTRN BADSTACK:BYTE,BADCOUNTRYCOM:BYTE
125 EXTRN SYSSIZE:BYTE,BADCOUNTRY:BYTE,INSUFMEMORY:BYTE
126 EXTRN CONDEV:BYTE,AUXDEV:BYTE,PRNDEV:BYTE,COMMND:BYTE,CONFIG:BYTE
127 EXTRN Cntry_Drv:BYTE,Cntry_Root:BYTE,Cntry_Path:BYTE
128 EXTRN DeviceParameters:byte
129 EXTRN MEMORY_SIZE:word
130 EXTRN BUFFERS:word
131 EXTRN FILES:byte,NUM_CDS:byte
132 EXTRN DOSINFO:dword,ENTRY_POINT:dword
133 EXTRN FCBS:byte,KEEP:byte
134 EXTRN CONFBOT:word,ALLOCLIM:word,COMMAND_LINE:byte
135 EXTRN ZERO:byte,SEPCHR:byte
136 EXTRN COUNT:word,CHRPTR:word,CNTRYFILEHANDLE:word
137 EXTRN MEMLO:word,MEMHI:word,PRMBLK:word,LDOFF:word
138 EXTRN PACKET:byte,UNITCOUNT:byte,BREAK_ADDR:dword
139 EXTRN BPB_ADDR:dword,DRIVENUMBER:byte,SYSI_COUNTRY:dword
140 extrn Config_Size:word ;AN000;
141 extrn Install_Flag:word ;AN000;
142 extrn BadOrder:byte ;AN000;
143 extrn Errorcmd:byte ;AN000;
144 extrn LineCount:word ;AN000;
145 extrn ShowCount:byte ;AN000;
146 extrn Buffer_LineNum:word ;AN000;
147 extrn IFS_Flag:word ;AN000;
148 extrn IFS_RH:byte ;AN000;
149 extrn H_Buffers:word ;AN000;
150 extrn Buffer_Slash_X:byte ;AN000;AN025;
151 extrn Badparm:byte ;AN007;
152 extrn ConfigMsgFlag:Word ;AN015;
153 extrn Org_Count:Word ;AN018;
154 extrn Multi_Pass_Id:byte ;AN026;
155
156 EXTRN MEM_ERR:NEAR,SetDOSCountryInfo:NEAR
157 EXTRN PARAROUND:NEAR,TEMPCDS:NEAR
158 EXTRN Set_Country_Path:NEAR,Move_ASCIIZ:NEAR,DELIM:NEAR
159 EXTRN BADFIL:NEAR,ROUND:NEAR
160 extrn Do_Install_Exec:NEAR ;AN018;
161 extrn SetDevMark:NEAR ;AN030;
162
163 ;AN016; Undo the extended attribute handling
164 ; extrn Get_Ext_Attribute:near ;AN009;
165
166 IF STACKSW
167
168 ; Internal Stack Parameters
169 EntrySize equ 8
170
171 MinCount equ 8
172 DefaultCount equ 9
173 MaxCount equ 64
174
175 MinSize equ 32
176 DefaultSize equ 128
177 MaxSize equ 512
178
179 extrn stack_count:word
180 extrn stack_size:word
181 extrn stack_addr:dword
182
183 ENDIF
184
185 PUBLIC DOCONF
186 PUBLIC GETCHR
187 public Multi_Pass ;AN018;AN026;
188
189 public MultDeviceFlag
190 MultDeviceFlag db 0 ;AN001;
191 public DevMark_Addr
192 DevMark_Addr dw ? ;AN004;Segment address for DEVMARK.
193 public SetDevMarkFlag
194 SetDevMarkFlag db 0 ;AN004;Flag used for DEVMARK
195
196 EMS_Stub_Installed db 0 ;AN030;
197
198 Badparm_Ptr label dword
199 Badparm_Off dw 0 ;AN007;
200 Badparm_Seg dw 0 ;AN007;
201
202 XMAEM_file db 'XMAEM.SYS',0 ;AN029;
203
204 ;IBMCACHE_file db 'IBMCACHE.SYS',0;AN024;AN026;To cope with the IBMCACHE.SYS
205 ; problem of DOS version checking.
206
207 ;******************************************************************************
208 ;Take care of Config.sys file.
209 ;SYSTEM parser data and code.
210 ;******************************************************************************
211 .xlist
212 include PSOPTION.INC ;Parsing options for SYSCONF.
213 include PARSE.ASM ;together with PSDATA.INC
214 .list
215 ;Control block definitions for PARSER.
216 ;---------------------------------------------------
217 ; BUFFER = [n | n,m] {/E}
218
219 Buf_Parms label byte ;AN000;
220 dw Buf_Parmsx ;AN000;
221 db 1 ;AN000; An extra delimeter list
222 db 1 ;AN000; length is 1
223 db SEMICOLON ;AN000;
224
225 Buf_Parmsx label byte ;AN000;
226 db 1,2 ;AN000; Min 1, Max 2 positional
227 dw Buf_Pos1 ;AN000;
228 dw Buf_Pos2 ;AN000;
229 db 1 ;AN000; 1 switch
230 dw SW_X_Ctrl ;AN000;AN025; /X control
231 db 0 ;AN000; no keywords
232
233 Buf_Pos1 label word ;AN000;
234 dw 8000h ;AN000; Numeric value
235 dw 0 ;AN000; no function
236 dw Result_Val ;AN000; Result value buffer
237 dw Buf_Range_1 ;AN000; value list
238 db 0 ;AN000; no switches/keywords
239
240 Buf_Range_1 label byte ;AN000; value definition
241 db 1 ;AN000; range definition
242 db 1 ;AN000; 1 definition of range
243 db 1 ;AN000; item tag for this range
244 dd 1,10000 ;AN000; from 1 to 10000
245
246 Buf_Pos2 label word ;AN000;
247 dw 8001h ;AN000; Numeric value, Optional
248 dw 0 ;AN000; no function
249 dw Result_Val ;AN000; Result value buffer
250 dw Buf_Range_2 ;AN000; value list
251 db 0 ;AN000; no switches/keywords
252
253 Buf_Range_2 label byte ;AN000; value definition
254 db 1 ;AN000; range definition
255 db 1 ;AN000; 1 definition of range
256 db 1 ;AN000; item tag for this range
257 dd 0,8 ;AN000; from 0 to 8.
258
259 SW_X_Ctrl label word ;AN000;AN025;
260 dw 0 ;AN000; no matching flag
261 dw 0 ;AN000; no function
262 dw Result_Val ;AN000; return value
263 dw NoVal ;AN000; no value definition
264 db 1 ;AN000; # of switches
265 Switch_X label byte ;AN000;AN025;
266 db '/X',0 ;AN000;AN025;
267 ;local variables
268 P_Buffers dw 0 ;AN000;
269 P_H_Buffers dw 0 ;AN000;
270 P_Buffer_Slash_X db 0 ;AN000;AN025;
271 Buffer_Pre_Scan db 0 ;AN030;
272
273 ;Common definitions -------------
274 NoVal db 0 ;AN000;
275
276 Result_Val label byte ;AN000;
277 db ? ;AN000; type returned
278 db ? ;AN000; item tag returned
279 dw ? ;AN000; ES:offset of the switch defined
280 RV_Byte label byte ;AN000;
281 RV_Dword label dword ;AN000;
282 dd ? ;AN000; value if number, or seg:offset to string.
283 ;--------------------------------
284
285 ; BREAK = [ ON | OFF ]
286
287 Brk_Parms label byte ;AN000;
288 dw Brk_Parmsx ;AN000;
289 db 1 ;AN000; An extra delimeter list
290 db 1 ;AN000; length is 1
291 db SEMICOLON ;AN000;
292
293 Brk_Parmsx label byte ;AN000;
294 db 1,1 ;AN000; Min 1, Max 1 positional
295 dw Brk_Pos ;AN000;
296 db 0 ;AN000; no switches
297 db 0 ;AN000; no keywords
298
299 Brk_Pos label word ;AN000;
300 dw 2000h ;AN000; Simple string
301 dw 0 ;AN000; No functions
302 dw Result_Val ;AN000;
303 dw On_Off_String ;AN000; ON,OFF string descriptions
304 db 0 ;AN000; no keyword/switch synonyms
305
306 On_Off_String label byte ;AN000;
307 db 3 ;AN000; signals that there is a string choice
308 db 0 ;AN000; no range definition
309 db 0 ;AN000; no numeric values choice
310 db 2 ;AN000; 2 strings for choice
311 db 1 ;AN000; the 1st string tag
312 dw On_String ;AN000;
313 db 2 ;AN000; the 2nd string tag
314 dw Off_String ;AN000;
315
316 On_String db "ON",0 ;AN000;
317 Off_String db "OFF",0 ;AN000;
318 ;local variable
319 P_Ctrl_Break db 0 ;AN000; local variable
320
321 ;--------------------------------
322
323 ; COUNTRY = n {m {path}}
324 ; or
325 ; COUNTRY = n,,path
326
327 Cntry_Parms label byte ;AN000;
328 dw Cntry_Parmsx ;AN000;
329 db 1 ;AN000; An extra delimeter list
330 db 1 ;AN000; length is 1
331 db SEMICOLON ;AN000;
332
333 Cntry_Parmsx label byte ;AN000;
334 db 1,3 ;AN000; Min 1, Max 3 positional
335 dw Cntry_Pos1 ;AN000;
336 dw Cntry_Pos2 ;AN000;
337 dw Cntry_Pos3 ;AN000;
338 db 0 ;AN000; no switches
339 db 0 ;AN000; no keywords
340
341 Cntry_Pos1 label word ;AN000; control definition for positional 1
342 dw 8000h ;AN000; Numeric value
343 dw 0 ;AN000; no functions
344 dw Result_Val ;AN000;
345 dw Cntry_Codepage_Range ;AN000; country id code range description
346 db 0 ;AN000; no switch/keyword synonyms
347
348 Cntry_Codepage_Range label byte ;AN000;
349 db 1 ;AN000; # of value definitions
350 db 1 ;AN000; # of ranges
351 db 1 ;AN000; Tag for this range
352 dd 1,999 ;AN000;
353
354 Cntry_Pos2 label word ;AN000; control definition for positional 2
355 dw 8001h ;AN000; Numeric value, optional
356 dw 0 ;AN000; no functions
357 dw Result_Val ;AN000;
358 dw Cntry_Codepage_Range ;AN000; code page range descriptions.
359 db 0 ;AN000; no switch/keyword synonyms
360
361 Cntry_Pos3 label word ;AN000; control definition for positional 3
362 dw 0201h ;AN000; File spec, optional
363 dw 0 ;AN000; No functions. Don't need to CAP.
364 dw Result_Val ;AN000;
365 dw NoVal ;AN000; no value list
366 db 0 ;AN000; no switch/keyword synonyms
367
368 ;Local variables
369 P_Cntry_Code dw 0 ;AN000;
370 P_Code_Page dw 0 ;AN000;
371
372 ;--------------------------------
373
374 ; FILES = n
375
376 Files_Parms label byte ;AN000;
377 dw Files_Parmsx ;AN000;
378 db 1 ;AN000; An extra delimeter list
379 db 1 ;AN000; length is 1
380 db SEMICOLON ;AN000;
381
382 Files_Parmsx label byte ;AN000;
383 db 1,1 ;AN000; Min 1, Max 1 positional
384 dw Files_Pos ;AN000;
385 db 0 ;AN000; no switches
386 db 0 ;AN000; no keywords
387
388 Files_Pos label byte ;AN000;
389 dw 8000h ;AN000; Numeric value
390 dw 0 ;AN000; no functions
391 dw Result_Val ;AN000;
392 dw Files_Range ;AN000; Files range description
393 db 0 ;AN000; no switch/keyword synonyms
394
395 Files_Range label byte ;AN000;
396 db 1 ;AN000; # of value definitions
397 db 1 ;AN000; # of ranges
398 db 1 ;AN000; Tag for this range
399 dd 8,255 ;AN000;
400 ;local variable
401 P_Files db 0 ;AN000;
402
403 ;--------------------------------
404
405 ; FCBS = n,m
406
407 FCBS_Parms label byte ;AN000;
408 dw FCBS_Parmsx ;AN000;
409 db 1 ;AN000; An extra delimeter list
410 db 1 ;AN000; length is 1
411 db SEMICOLON ;AN000;
412
413 FCBS_Parmsx label byte ;AN000;
414 db 2,2 ;AN000; Min 2, Max 2 positional
415 dw FCBS_Pos_1 ;AN000;
416 dw FCBS_Pos_2 ;AN000;
417 db 0 ;AN000; no switches
418 db 0 ;AN000; no keywords
419
420 FCBS_Pos_1 label byte ;AN000;
421 dw 8000h ;AN000; Numeric value
422 dw 0 ;AN000; no functions
423 dw Result_Val ;AN000;
424 dw FCBS_Range ;AN000; FCBS range descriptions
425 db 0 ;AN000; no switch/keyword synonyms
426
427 FCBS_Range label byte ;AN000;
428 db 1 ;AN000; # of value definitions
429 db 1 ;AN000; # of ranges
430 db 1 ;AN000; Tag for this range
431 dd 1,255 ;AN000;
432
433 FCBS_Pos_2 label byte ;AN000;
434 dw 8000h ;AN000; Numeric value
435 dw 0 ;AN000; no functions
436 dw Result_Val ;AN000;
437 dw FCBS_Keep_Range ;AN000; FCBS KEEP range descriptions
438 db 0 ;AN000; no switch/keyword synonyms
439
440 FCBS_Keep_Range label byte ;AN000;
441 db 1 ;AN000; # of value definitions
442 db 1 ;AN000; # of ranges
443 db 1 ;AN000; Tag for this range
444 dd 0,255 ;AN000;
445
446 ;local variable
447 P_Fcbs db 0 ;AN000;
448 P_Keep db 0 ;AN000;
449 ;--------------------------------
450
451 ; LASTDRIVE = x
452
453 LDRV_Parms label byte ;AN000;
454 dw LDRV_Parmsx ;AN000;
455 db 1 ;AN000; An extra delimeter list
456 db 1 ;AN000; length is 1
457 db SEMICOLON ;AN000;
458
459 LDRV_Parmsx label byte ;AN000;
460 db 1,1 ;AN000; Min 1, Max 1 positional
461 dw LDRV_Pos ;AN000;
462 db 0 ;AN000; no switches
463 db 0 ;AN000; no keywords
464
465 LDRV_Pos label byte ;AN000;
466 dw 0110h ;AN000; Drive only, Ignore colon.
467 dw 0010h ;AN000; Remove colon at end
468 dw Result_Val ;AN000;
469 dw NoVal ;AN000; No value list
470 db 0 ;AN000; no switch/keyword synonyms
471
472 ;local variable
473 P_Ldrv db 0 ;AN000;
474 ;--------------------------------
475
476 ; STACKS = n,m
477
478 STKS_Parms label byte ;AN000;
479 dw STKS_Parmsx ;AN000;
480 db 1 ;AN000; An extra delimeter list
481 db 1 ;AN000; length is 1
482 db SEMICOLON ;AN000;
483
484 STKS_Parmsx label byte ;AN000;
485 db 2,2 ;AN000; Min 2, Max 2 positional
486 dw STKS_Pos_1 ;AN000;
487 dw STKS_Pos_2 ;AN000;
488 db 0 ;AN000; no switches
489 db 0 ;AN000; no keywords
490
491 STKS_Pos_1 label byte ;AN000;
492 dw 8000h ;AN000; Numeric value
493 dw 0 ;AN000; no functions
494 dw Result_Val ;AN000;
495 dw STKS_Range ;AN000; number of stack range descriptions
496 db 0 ;AN000; no switch/keyword synonyms
497
498 STKS_Range label byte ;AN000;
499 db 1 ;AN000; # of value definitions
500 db 1 ;AN000; # of ranges
501 db 1 ;AN000; Tag for this range
502 dd 0,64 ;AN000;
503
504 STKS_Pos_2 label byte ;AN000;
505 dw 8000h ;AN000; Numeric value
506 dw 0 ;AN000; no functions
507 dw Result_Val ;AN000;
508 dw STK_SIZE_Range ;AN000; stack size range descriptions
509 db 0 ;AN000; no switch/keyword synonyms
510
511 STK_SIZE_Range label byte ;AN000;
512 db 1 ;AN000; # of value definitions
513 db 1 ;AN000; # of ranges
514 db 1 ;AN000; Tag for this range
515 dd 0,512 ;AN000;
516 ;local variables
517 P_Stack_Count dw 0 ;AN000;
518 P_Stack_Size dw 0 ;AN000;
519
520 ;--------------------------------
521
522 ; MULTITRACK = [ ON | OFF ]
523
524 MTrk_Parms label byte ;AN002;
525 dw MTrk_Parmsx ;AN002;
526 db 1 ;AN002; An extra delimeter list
527 db 1 ;AN002; length is 1
528 db SEMICOLON ;AN002;
529
530 MTrk_Parmsx label byte ;AN002;
531 db 1,1 ;AN002; Min 1, Max 1 positional
532 dw MTrk_Pos ;AN002;
533 db 0 ;AN002; no switches
534 db 0 ;AN002; no keywords
535
536 MTrk_Pos label word ;AN002;
537 dw 2000h ;AN002; Simple string
538 dw 0 ;AN002; No functions
539 dw Result_Val ;AN002;
540 dw On_Off_String ;AN002; ON,OFF string descriptions
541 db 0 ;AN002; no keyword/switch synonyms
542
543 ;local variables
544 P_Mtrk db 0 ;AN002;
545 ;--------------------------------
546
547 ; CPSW = [ ON | OFF ]
548
549 CPSW_Parms label byte ;AN002;
550 dw CPSW_Parmsx ;AN002;
551 db 1 ;AN002; An extra delimeter list
552 db 1 ;AN002; length is 1
553 db SEMICOLON ;AN002;
554
555 CPSW_Parmsx label byte ;AN002;
556 db 1,1 ;AN002; Min 1, Max 1 positional
557 dw CPSW_Pos ;AN002;
558 db 0 ;AN002; no switches
559 db 0 ;AN002; no keywords
560
561 CPSW_Pos label word ;AN002;
562 dw 2000h ;AN002; Simple string
563 dw 0 ;AN002; No functions
564 dw Result_Val ;AN002;
565 dw On_Off_String ;AN002; ON,OFF string descriptions
566 db 0 ;AN002; no keyword/switch synonyms
567
568 ;local variables
569 P_CPSW db 0 ;AN002;
570
571 ;--------------------------------
572 ; SWITCHES=/K
573
574 Swit_Parms label byte ;AN019;
575 dw Swit_Parmsx ;AN019;
576 db 1 ;AN019; An extra delimeter list
577 db 1 ;AN019; length is 1
578 db SEMICOLON ;AN019;
579
580 Swit_Parmsx label byte ;AN019;
581 db 0,0 ;AN019; No positionals
582 db 1 ;AN019; 1 switch for now.
583 dw Swit_K_Ctrl ;AN019; /K control
584 db 0 ;AN019; no keywords
585
586 Swit_K_Ctrl label word ;AN019;
587 dw 0 ;AN019; no matching flag
588 dw 0 ;AN019; no function
589 dw Result_Val ;AN019; return value
590 dw NoVal ;AN019; no value definition
591 db 1 ;AN019; # of switches
592 Swit_K label byte ;AN019;
593 db '/K',0 ;AN019;
594 ;local variables
595 P_Swit_K db 0 ;AN019;
596
597 ;******************************************************************************
598
599 DOCONF:
600 PUSH CS
601 POP DS
602 ASSUME DS:SYSINITSEG
603
604 MOV AX,(CHAR_OPER SHL 8) ;GET SWITCH CHARACTER
605 INT 21H
606 MOV [COMMAND_LINE+1],DL ; Set in default command line
607
608 MOV DX,OFFSET CONFIG ;NOW POINTING TO FILE DESCRIPTION
609 MOV AX,OPEN SHL 8 ;OPEN FILE "CONFIG.SYS"
610 STC ;IN CASE OF INT 24
611 INT 21H ;FUNCTION REQUEST
612 ; JC ENDCONF ;Wasn't there, or couldn't open (sickness)
613 jc No_Config_sys ;AN028;
614 JMP NOPROB ;PROBLEM WITH OPEN
615 No_Config_sys: ;AN028;
616 mov Multi_Pass_Id, 11 ;AN028; set it to unreasonable number
617 ENDCONF:
618 return
619
620
621 BADOP: MOV DX,OFFSET BADOPM ;WANT TO PRINT COMMAND ERROR "Unrecognized command..."
622 invoke PRINT
623 call Error_Line ;show "Error in CONFIG.SYS ..." .
624 JMP COFF
625
626 Badop_p proc near ;AN000;
627 ;Same thing as BADOP, but will make sure to set DS register back to SYSINITSEG
628 ;and return back to the calller.
629 push cs
630 pop ds ;set ds to CONFIGSYS seg.
631 mov dx, offset badopm
632 invoke PRINT
633 call Error_Line
634 ret
635 Badop_p endp
636
637 Badparm_p proc near ;AN007;
638 ;Show "Bad command or parameters - xxxxxx"
639 ;In Badparm_seg, Badparm_off -> xxxxx
640 ;
641 cmp cs:Buffer_Pre_Scan, 1 ;AN030; Pre scanning Buffers ... /X?
642 je BadParmp_Ret ;AN030; then do not show any message.
643 push ds ;AN007;
644 push dx ;AN007;
645 push si ;AN007;
646
647 push cs ;AN007;
648 pop ds ;AN007;
649 mov dx, offset Badparm ;AN007;
650 invoke PRINT ;AN007;"Bad command or parameters - "
651 lds si, Badparm_ptr ;AN007;
652 Badparm_Prt: ;AN007;print "xxxx" until CR.
653 mov dl, byte ptr [si] ;AN007;
654 mov ah,STD_CON_OUTPUT ;AN007;
655 int 21h ;AN007;
656 inc si ;AN007;
657 cmp dl, CR ;AN007;
658 jne Badparm_Prt ;AN007;
659 push cs ;AN007;
660 pop ds ;AN007;
661 mov dx, offset CRLFM ;AN007;
662 invoke PRINT ;AN007;
663 call Error_Line ;AN007;
664 pop si ;AN007;
665 pop dx ;AN007;
666 pop ds ;AN007;
667 BadParmp_Ret: ;AN030;
668 ret ;AN007;
669 Badparm_p endp
670
671 NOPROB: ;GET FILE SIZE (NOTE < 64K!!)
672 MOV BX,AX
673 XOR CX,CX
674 XOR DX,DX
675 MOV AX,(LSEEK SHL 8) OR 2
676 INT 21H
677 MOV [COUNT],AX
678 XOR DX,DX
679 MOV AX,LSEEK SHL 8 ;Reset pointer to beginning of file
680 INT 21H
681 ; MOV DX,CS
682 mov dx, [ConfBot] ;AN022;Use current CONFBOT value
683 MOV AX,[COUNT]
684 mov [config_size], ax ;save the size of config.sys file.
685 call ParaRound
686 SUB DX,AX
687 SUB DX,11H ;ROOM FOR HEADER
688 MOV [CONFBOT],DX ; Config starts here. New CONBOT value.
689 CALL TEMPCDS ; Finally get CDS to "safe" location
690 ASSUME DS:NOTHING,ES:NOTHING
691
692 MOV DX,[CONFBOT]
693 MOV DS,DX
694 MOV ES,DX
695 XOR DX,DX
696 MOV CX,[COUNT]
697 MOV AH,READ
698 STC ;IN CASE OF INT 24
699 INT 21H ;Function request
700 PUSHF
701 ;
702 ; Find the EOF mark in the file. If present, then trim length.
703
704 SaveReg <AX,DI,CX>
705 MOV AL,1Ah ; eof mark
706 MOV DI,DX ; point ro buffer
707 JCXZ PutEOL ; no chars
708 REPNZ SCASB ; find end
709 JNZ PutEOL ; none found and count exahusted
710 ;
711 ; We found a 1A. Back up
712 ;
713 DEC DI ; backup past 1A
714 ;
715 ; Just for the halibut, stick in an extra EOL
716 ;
717 PutEOL:
718 MOV AL,CR
719 STOSB ; CR
720 MOV AL,LF
721 STOSB ; LF
722 SUB DI,DX ; difference moved
723 MOV Count,DI ; new count
724 ;
725 ; Restore registers
726 ;
727 RestoreReg <CX,DI,AX>
728
729 PUSH CS
730 POP DS
731 ASSUME DS:SYSINITSEG
732 PUSH AX
733 MOV AH,CLOSE
734 INT 21H
735 POP AX
736 POPF
737 JC CONFERR ;IF NOT WE'VE GOT A PROBLEM
738 CMP CX,AX
739 JZ GETCOM ;COULDN'T READ THE FILE
740 CONFERR:
741 MOV DX,OFFSET CONFIG ;WANT TO PRINT CONFIG ERROR
742 CALL BADFIL
743 ENDCONV:JMP ENDCONF
744
745 Multi_Pass: ;AN018;AN026; called to execute IFS=, INSTALL= commands
746 push cs ;AN018;
747 pop ds ;AN018;
748 cmp Multi_Pass_id, 10 ;J.K.
749 jae Endconv ;J.K. Do nothing. Just return.
750 push Confbot ;AN018;
751 pop es ;AN018; ES -> Confbot
752 mov si, Org_Count ;AN018;
753 mov Count, si ;AN018; set Count
754 xor si,si ;AN018;
755 mov Chrptr, si ;AN018; reset Chrptr, LineCount
756 mov LineCount, si ;AN018;
757 call GetChr ;AN018;
758 jmp Conflp ;AN018;
759 GETCOM:
760 invoke ORGANIZE ;ORGANIZE THE FILE
761 CALL GETCHR
762
763 CONFLP: JC ENDCONV
764 call Reset_DOS_Version ;AN024;AN026; Still need to reset version even IBMDOS handles this through
765 ; function 4Bh call, since IBMDOS does not know when Load/Overlay call finishes.
766
767 IF NOT BUFFERFLAG
768 call EMS_Stub_handler ;AN030;
769 ENDIF
770
771 inc LineCount ;AN000; Increase LineCount.
772 mov Buffer_Pre_Scan, 0 ;AN030; Reset Buffer_Pre_Scan.
773 mov MultDeviceFlag,0 ;AN001; Reset MultDeviceFlag.
774 mov SetDevMarkFlag,0 ;AN004; Reset SetDevMarkFlag.
775 cmp al, LF ;AN000; LineFeed?
776 je Blank_Line ;AN000; then ignore this line.
777 MOV AH,AL
778 CALL GETCHR
779 jnc TryI ;AN000;
780 cmp Multi_Pass_ID, 2 ;AN026;
781 jae Endconv ;AN026;Do not show Badop again for multi_pass.
782 JMP BADOP
783
784 COFF: PUSH CS
785 POP DS
786 invoke NEWLINE
787 JMP CONFLP
788 Blank_Line: ;AN000;
789 call Getchr ;AN000;
790 jmp CONFLP ;AN000;
791
792 COFF_P:
793 push cs
794 pop ds
795
796
797 ;J.K. 1/27/88 ;;;;;;;;;;;;;;;;;;
798 ;To handle INSTALL= commands, we are going to use multi-pass.
799 ;The first pass handles the other commands and only set Install_Flag when
800 ;it finds any INSTALL command. The second pass will only handle the
801 ;INSTALL= command.
802
803 ;------------------------------------------------------------------------------
804 ;INSTALL command
805 ;------------------------------------------------------------------------------
806 TRYI:
807 cmp Multi_Pass_Id, 0 ;AN029; the initial pass for XMAEM.SYS
808 je Multi_Try_XMAEM ;AN029; and BUFFERS= ... /X pre scan.
809 cmp Multi_Pass_Id, 2 ;AN026; the second pass for IFS= ?
810 je Multi_Try_J ;AN026;
811 cmp Multi_Pass_Id, 3 ;AN026; the third pass for INSTALL= ?
812 je Multi_Try_I ;AN026;
813 cmp ah, 'I' ;AN018; INSTALL= command?
814 jne TryB ;AN018; the first pass is for normal operation.
815 or Install_Flag, HAVE_INSTALL_CMD ;AN018; Set the flag
816 jmp coff ;AN018; and handles the next command
817
818 Multi_Try_XMAEM: ;AN029;
819 cmp ah, 'D' ;AN029; device= command?
820 jne Multi_Try_Buff ;AN029; no skip it.
821 call Chk_XMAEM ;AN029; is it for XMAEM.SYS?
822 jnz Multi_Pass_FIlter ;AN029; no skip it.
823 mov byte ptr es:[si-1], 0FFh ;AN029; mark this command as a Null command for the next pass.
824 jmp TryDJ ;AN029; execute this command.
825 Multi_Try_Buff: ;AN030;
826 cmp ah, 'B' ;AN030; Buffers= command?
827 jne Multi_Pass_Filter ;AN030;
828 mov Buffer_Pre_Scan, 1 ;AN030; Set Buffer_Pre_Scan
829 jmp TryB ;AN030; TryB will set P_Buffer_Slash_X to non-zero value.
830
831 Multi_Try_J: ;AN026;
832 cmp ah, 'J' ;AN026; IFS= command?
833 jne Multi_Pass_Filter ;AN026; No. Ignore this.
834 jmp GotJ ;AN026; Handles IFS= command.
835
836 Multi_Try_I: ;AN026;
837 cmp ah, 'I' ;AN026; INSTALL= command?
838 jne Multi_Pass_Filter ;AN026; No. Ignore this.
839 call Do_Install_Exec ;Install it.
840 jmp Coff ;to handle next Install= command.
841
842 Multi_Pass_Filter: ;AN023;AN026;
843 cmp ah, 'Y' ;AN023; Comment?
844 je Multi_Pass_Adjust ;AN023;
845 cmp ah, 'Z' ;AN023; Bad command?
846 je Multi_Pass_Adjust ;AN023;
847 cmp ah, '0' ;AN023; REM?
848 jne Multi_Pass_Coff ;AN023; ignore the rest of the commands.
849 Multi_Pass_Adjust: ;AN023; These commands need to
850 dec Chrptr ;AN023; adjust chrptr, count
851 inc Count ;AN023; for NEWLINE proc.
852 Multi_Pass_Coff: ;AN023;
853 jmp Coff ;AN018; To handle next INSTALL= commands.
854
855 ;------------------------------------------------------------------------------
856
857 Sysinit_Parse proc
858 ;Set up registers for SysParse
859 ;In) ES:SI -> command line in CONFBOT
860 ; DI -> offset of the parse control defintion.
861 ;
862 ;Out) Calls SYSPARSE.
863 ; Carry will set if Parse error.
864 ; *** The caller should check the EOL condition by looking at AX
865 ; *** after each call.
866 ; *** If no parameters are found, then AX will contain a error code.
867 ; *** If the caller needs to look at the SYNOMYM@ of the result,
868 ; *** the caller should use CS:@ instead of ES:@.
869 ; CX register should be set to 0 at the first time the caller calls this
870 ; procedure.
871 ; AX - exit code
872 ; BL - TErminated delimeter code
873 ; CX - new positional ordinal
874 ; SI - set to pase scanned operand
875 ; DX - selected result buffer
876
877 push es ;save es,ds
878 push ds
879
880 push es
881 pop ds ;now DS:SI -> command line
882 push cs
883 pop es ;now ES:DI -> control definition
884
885 mov cs:Badparm_Seg,ds ;AN007;Save the pointer to the parm
886 mov cs:Badparm_Off,si ;AN007; we are about to parse for Badparm msg.
887 mov dx, 0
888 call SysParse
889 cmp ax, $P_NO_ERROR ;no error
890 ; $IF E,OR
891 JE $$LL1
892 cmp ax, $P_RC_EOL ;or the end of line?
893 ; $IF E
894 JNE $$IF1
895 $$LL1:
896 clc
897 ; $ELSE
898 JMP SHORT $$EN1
899 $$IF1:
900 stc
901 ; $ENDIF
902 $$EN1:
903 pop ds
904 pop es ;restore es,ds
905 ret
906 Sysinit_Parse endp
907
908 ;------------------------------------------------------------------------------
909 ; Buffer command
910 ;------------------------------------------------------------------------------
911 ;*******************************************************************************
912 ; *
913 ; Function: Parse the parameters of buffers= command. *
914 ; *
915 ; Input : *
916 ; ES:SI -> parameters in command line. *
917 ; Output: *
918 ; Buffers set *
919 ; Buffer_Slash_X flag set if /X option chosen. *
920 ; H_Buffers set if secondary buffer cache specified. *
921 ; *
922 ; Subroutines to be called: *
923 ; Sysinit_Parse *
924 ; Logic: *
925 ; { *
926 ; Set DI points to Buf_Parms; /*Parse control definition*/ *
927 ; Set DX,CX to 0; *
928 ; Reset Buffer_Slash_X; *
929 ; While (End of command line) *
930 ; { Sysinit_parse; *
931 ; if (no error) then *
932 ; if (Result_Val.$P_SYNONYM_ptr == Slash_E) then /*Not a switch *
933 ; Buffer_Slash_X = 1 *
934 ; else if (CX == 1) then /* first positional */ *
935 ; Buffers = Result_Val.$P_Picked_Val; *
936 ; else H_Buffers = Result_Val.$P_Picked_Val; *
937 ; else {Show Error message;Error Exit} *
938 ; }; *
939 ; If (Buffer_Slash_X is off & Buffers > 99) then Show_Error; *
940 ; }; *
941 ; *
942 ;*******************************************************************************
943 ;TryB: CMP AH,'B' ;BUFFER COMMAND?
944 ; JNZ TRYC
945 ; invoke GETNUM
946 ; JZ TryBBad ; Gotta have at least one
947 ; CMP AX,100 ; check for max number
948 ; JB SaveBuf
949 ;TryBBad:JMP BadOp
950 ;SaveBuf:
951 ; MOV [BUFFERS],AX
952 ;CoffJ1: JMP COFF
953
954 TryB:
955 CMP AH,'B'
956 JNZ TryC
957 mov P_Buffer_Slash_X, 0 ;AN000;AN025;
958 mov di, offset Buf_Parms ;AN000;
959 xor cx, cx ;AN000;
960 mov dx, cx ;AN000;
961
962 ; $SEARCH ;AN000;
963 $$DO4:
964 call Sysinit_Parse ;AN000;
965 ; $EXITIF C ;AN000; Parse Error,
966 JNC $$IF4
967 call Badparm_p ;AN007; and Show messages and end the search loop.
968 ; $ORELSE ;AN000;
969 JMP SHORT $$SR4
970 $$IF4:
971 cmp ax, $P_RC_EOL ;AN000; End of Line?
972 ; $LEAVE E ;AN000; then jmp to $Endloop for semantic check.
973 JE $$EN4
974 cmp Result_Val.$P_SYNONYM_PTR, offset Switch_X ;AN000;AN025;
975 ; $IF E ;AN000;
976 JNE $$IF8
977 mov P_Buffer_Slash_X, 1 ;AN000;AN025; set the flag
978 ; $ELSE ;AN000;
979 JMP SHORT $$EN8
980 $$IF8:
981 mov ax, word ptr Result_Val.$P_PICKED_VAL ;AN000;
982 cmp cx, 1 ;AN000;
983 ; $IF E ;AN000;
984 JNE $$IF10
985 mov P_Buffers, ax ;AN000;
986 ; $ELSE ;AN000;
987 JMP SHORT $$EN10
988 $$IF10:
989 mov P_H_Buffers, ax ;AN000;
990 ; $ENDIF ;AN000;
991 $$EN10:
992 ; $ENDIF ;AN000;
993 $$EN8:
994 ; $ENDLOOP ;AN000;
995 JMP SHORT $$DO4
996 $$EN4:
997 cmp P_Buffers, 99 ;AN000;
998 ; $IF A,AND ;AN000;
999 JNA $$IF15
1000 cmp P_Buffer_Slash_X, 0 ;AN000;AN025;
1001 ; $IF E ;AN000;
1002 JNE $$IF15
1003 call Badparm_p ;AN000;
1004 mov P_H_Buffers, 0 ;AN000;
1005 ; $ELSE ;AN000;
1006 JMP SHORT $$EN15
1007 $$IF15:
1008 mov ax, P_Buffers ;AN000; We don't have any problem.
1009 mov Buffers, ax ;AN000; Now, let's set it really.
1010 mov ax, P_H_Buffers ;AN000;
1011 mov H_Buffers, ax ;AN000;
1012 mov al, P_Buffer_Slash_X ;AN000;AN025;
1013 mov Buffer_Slash_X, al ;AN000;AN025;
1014 mov ax, LineCount ;AN000;
1015 mov Buffer_LineNum, ax ;AN000; Save the line number for the future use.
1016 ; $ENDIF ;AN000;
1017 $$EN15:
1018 ; $ENDSRCH ;AN000;
1019 $$SR4:
1020 jmp Coff
1021
1022 ;------------------------------------------------------------------------------
1023 ; Break command
1024 ;------------------------------------------------------------------------------
1025 ;*******************************************************************************
1026 ; *
1027 ; Function: Parse the parameters of Break = command. *
1028 ; *
1029 ; Input : *
1030 ; ES:SI -> parameters in command line. *
1031 ; Output: *
1032 ; Turn the Control-C check on or off. *
1033 ; *
1034 ; Subroutines to be called: *
1035 ; Sysinit_Parse *
1036 ; Logic: *
1037 ; { *
1038 ; Set DI to Brk_Parms; *
1039 ; Set DX,CX to 0; *
1040 ; While (End of command line) *
1041 ; { Sysinit_Parse; *
1042 ; if (no error) then *
1043 ; if (Result_Val.$P_Item_Tag == 1) then /*ON */ *
1044 ; Set P_Ctrl_Break, on; *
1045 ; else /*OFF */ *
1046 ; Set P_Ctrl_Break, off; *
1047 ; else {Show message;Error_Exit}; *
1048 ; }; *
1049 ; If (no error) then *
1050 ; DOS function call to set Ctrl_Break check according to *
1051 ; }; *
1052 ; *
1053 ;********************************************************************************
1054 ;TryC: CMP AH,'C'
1055 ; JZ GOTC
1056 ; JMP TRYDJ
1057 ;GOTC:
1058 ; CMP AL,'O' ;FIRST LETTER OF "ON" or "OFF"
1059 ; JNZ TryCBad
1060 ; CALL GETCHR
1061 ; JC TryCBad
1062 ; CMP AL,'N' ;SECOND LETTER OF "ON"
1063 ; JNZ TryCoff
1064 ; MOV AH,SET_CTRL_C_TRAPPING ;TURN ON CONTROL-C CHECK
1065 ; MOV AL,1
1066 ; MOV DL,AL
1067 ; INT 21H
1068 ;CoffJ2: JMP Coff
1069 ;TryCOff:CMP AL,'F'
1070 ; JNZ TryCBad ; Check for "OFF"
1071 ; CALL GetChr
1072 ; JC TryCBad
1073 ; CMP AL,'F'
1074 ; JZ COffJ2
1075 ;TryCBad:JMP BadOp
1076 ;
1077 TryC:
1078 CMP AH,'C'
1079 JNZ TRYM
1080 mov di, offset Brk_Parms ;AN000;
1081 xor cx,cx ;AN000;
1082 mov dx,cx ;AN000;
1083 ; $SEARCH ;AN000;
1084 $$DO19:
1085 call Sysinit_Parse ;AN000;
1086 ; $EXITIF C ;AN000; Parse error
1087 JNC $$IF19
1088 call Badparm_p ;AN007; Show message and end the serach loop.
1089 ; $ORELSE ;AN000;
1090 JMP SHORT $$SR19
1091 $$IF19:
1092 cmp ax, $P_RC_EOL ;AN000; End of Line?
1093 ; $LEAVE E ;AN000; then end the $ENDLOOP
1094 JE $$EN19
1095 cmp Result_Val.$P_ITEM_TAG, 1 ;AN000;
1096 ; $IF E ;AN000;
1097 JNE $$IF23
1098 mov P_Ctrl_Break, 1 ;AN000; Turn it on
1099 ; $ELSE ;AN000;
1100 JMP SHORT $$EN23
1101 $$IF23:
1102 mov P_Ctrl_Break, 0 ;AN000; Turn it off
1103 ; $ENDIF ;AN000;
1104 $$EN23:
1105 ; $ENDLOOP ;AN000; we actually set the ctrl break
1106 JMP SHORT $$DO19
1107 $$EN19:
1108 mov ah, SET_CTRL_C_TRAPPING ;AN000; if we don't have any parse error.
1109 mov al, 1 ;AN000;
1110 mov dl, P_Ctrl_Break ;AN000;
1111 Int 21h ;AN000;
1112 ; $ENDSRCH ;AN000;
1113 $$SR19:
1114 jmp Coff
1115
1116 ;------------------------------------------------------------------------------
1117 ; MultiTrack command
1118 ;------------------------------------------------------------------------------
1119 ;*******************************************************************************
1120 ; *
1121 ; Function: Parse the parameters of MultiTrack= command. *
1122 ; *
1123 ; Input : *
1124 ; ES:SI -> parameters in command line. *
1125 ; Output: *
1126 ; Turn MulTrk_Flag on or off. *
1127 ; *
1128 ; Subroutines to be called: *
1129 ; Sysinit_Parse *
1130 ; Logic: *
1131 ; { *
1132 ; Set DI to Brk_Parms; *
1133 ; Set DX,CX to 0; *
1134 ; While (End of command line) *
1135 ; { Sysinit_Parse; *
1136 ; if (no error) then *
1137 ; if (Result_Val.$P_Item_Tag == 1) then /*ON */ *
1138 ; Set P_Mtrk, on; *
1139 ; else /*OFF */ *
1140 ; Set P_Mtrk, off; *
1141 ; else {Show message;Error_Exit}; *
1142 ; }; *
1143 ; If (no error) then *
1144 ; DOS function call to set MulTrk_Flag according to P_Mtrk. *
1145 ; *
1146 ; }; *
1147 ; *
1148 ;********************************************************************************
1149 TryM: ;AN002;
1150 CMP AH,'M' ;AN002;
1151 JNZ TRYW ;AN002;
1152 mov di, offset Mtrk_Parms ;AN002;
1153 xor cx,cx ;AN002;
1154 mov dx,cx ;AN002;
1155 ; $SEARCH ;AN002;
1156 $$DO28:
1157 call Sysinit_Parse ;AN002;
1158 ; $EXITIF C ;AN002; Parse error
1159 JNC $$IF28
1160 call Badparm_p ;AN007; Show message and end the serach loop.
1161 ; $ORELSE ;AN002;
1162 JMP SHORT $$SR28
1163 $$IF28:
1164 cmp ax, $P_RC_EOL ;AN002; End of Line?
1165 ; $LEAVE E ;AN002; then end the $ENDLOOP
1166 JE $$EN28
1167 cmp Result_Val.$P_ITEM_TAG, 1 ;AN002;
1168 ; $IF E ;AN002;
1169 JNE $$IF32
1170 mov P_Mtrk, 1 ;AN002; Turn it on temporarily.
1171 ; $ELSE ;AN002;
1172 JMP SHORT $$EN32
1173 $$IF32:
1174 mov P_Mtrk, 0 ;AN002; Turn it off temporarily.
1175 ; $ENDIF ;AN002;
1176 $$EN32:
1177 ; $ENDLOOP ;AN002; we actually set the MulTrk_Flag here.
1178 JMP SHORT $$DO28
1179 $$EN28:
1180 push ds ;AN002;
1181 mov ax, Code ;AN002;
1182 mov ds, ax ;AN002;
1183 assume ds:Code
1184 cmp P_Mtrk, 0 ;AN002;
1185 ; $IF E ;AN002;
1186 JNE $$IF36
1187 mov MulTrk_Flag, MULTRK_OFF2 ;AN002; 0001h
1188 ; $ELSE ;AN002;
1189 JMP SHORT $$EN36
1190 $$IF36:
1191 mov MulTrk_Flag, MULTRK_ON ;AN002; 8000h
1192 ; $ENDIF ;AN002;
1193 $$EN36:
1194 pop ds ;AN002;
1195 assume ds:SYSINITSEG
1196 ; $ENDSRCH ;AN002;
1197 $$SR28:
1198 jmp Coff ;AN002;
1199
1200 ;------------------------------------------------------------------------------
1201 ; CPSW command
1202 ;------------------------------------------------------------------------------
1203 ;*******************************************************************************
1204 ; *
1205 ; Function: Parse the parameters of CPSW= command. *
1206 ; *
1207 ; Input : *
1208 ; ES:SI -> parameters in command line. *
1209 ; Output: *
1210 ; Turn CPSW on or off. *
1211 ; *
1212 ; Subroutines to be called: *
1213 ; Sysinit_Parse *
1214 ; Logic: *
1215 ; { *
1216 ; Set DI to CPSW_Parms; *
1217 ; Set DX,CX to 0; *
1218 ; While (End of command line) *
1219 ; { Sysinit_Parse; *
1220 ; if (no error) then *
1221 ; if (Result_Val.$P_Item_Tag == 1) then /*ON */ *
1222 ; Set P_CPSW, on; *
1223 ; else /*OFF */ *
1224 ; Set P_CPSW, off; *
1225 ; else {Show message;Error_Exit}; *
1226 ; }; *
1227 ; If (no error) then *
1228 ; DOS function call to set CPSW according to P_CPSW. *
1229 ; }; *
1230 ; *
1231 ;********************************************************************************
1232 TryW: ;AN002;
1233 CMP AH,'W' ;AN002;
1234 JNZ TRYDJ ;AN002;
1235 mov di, offset CPSW_Parms ;AN002;
1236 xor cx,cx ;AN002;
1237 mov dx,cx ;AN002;
1238 ; $SEARCH ;AN002;
1239 $$DO40:
1240 call Sysinit_Parse ;AN002;
1241 ; $EXITIF C ;AN002; Parse error
1242 JNC $$IF40
1243 call Badparm_p ;AN007; Show message and end the serach loop.
1244 ; $ORELSE ;AN002;
1245 JMP SHORT $$SR40
1246 $$IF40:
1247 cmp ax, $P_RC_EOL ;AN002; End of Line?
1248 ; $LEAVE E ;AN002; then end the $ENDLOOP
1249 JE $$EN40
1250 cmp Result_Val.$P_ITEM_TAG, 1 ;AN002;
1251 ; $IF E ;AN002;
1252 JNE $$IF44
1253 mov P_CPSW, 1 ;AN002; Turn it on temporarily.
1254 ; $ELSE ;AN002;
1255 JMP SHORT $$EN44
1256 $$IF44:
1257 mov P_CPSW, 0 ;AN002; Turn it off temporarily.
1258 ; $ENDIF ;AN002;
1259 $$EN44:
1260 ; $ENDLOOP ;AN002; we actually set the MulTrk_Flag here.
1261 JMP SHORT $$DO40
1262 $$EN40:
1263 mov ah, SET_CTRL_C_TRAPPING ;AN000; The same function number as Ctrl_Break
1264 mov al, 4 ;AN000; Set CPSW state function
1265 mov dl, P_CPSW ;AN000; 0=off, 1=on
1266 Int 21h ;AN000;
1267 ; $ENDSRCH ;AN002;
1268 $$SR40:
1269 jmp Coff ;AN002;
1270
1271 ;------------------------------------------------------------------------------
1272 ; Device command
1273 ;------------------------------------------------------------------------------
1274 TRYDJ:
1275 and cs:IFS_Flag, NOT_IFS ;AN000; Reset the flag
1276 CMP AH,'D'
1277 JZ GOTDJ
1278 CMP AH,'J'
1279 jz GOTJ
1280 JMP TRYQ
1281 GOTJ: ;AN000; IFS= command.
1282 or cs:[IFS_Flag], IS_IFS ;AN000; set the flag.
1283 cmp Multi_Pass_Id, 2 ;second pass?
1284 je GOTDJ ;then proceed
1285 jmp Coff ;else ignore this until the second pass.
1286
1287 ; jmp GOTDJ_Cont
1288 ;GOTD:
1289 ; test cs:[IFS_Flag], HAD_IFS ;AN000; Cannot have DEVICE= command after IFS= command.
1290 ; jz GOTDJ_Cont ;AN000;
1291 ; call Incorrect_Order ;AN000; Display "Incorrect order ..." msg.
1292 ; jmp COFF ;AN000;
1293
1294 GOTDJ:
1295 MOV BX,CS ;DEVICE= or IFS= command.
1296 MOV DS,BX
1297
1298 MOV WORD PTR [BPB_ADDR],SI
1299 MOV WORD PTR [BPB_ADDR+2],ES
1300
1301 ;J.K. In case it is for IFS=, then set the parameter pointer.
1302 mov word ptr [ifs_rh.IFSR_PARMS@], SI ;AN000; for IFS
1303 mov word ptr [ifs_rh.IFSR_PARMS@+2], ES ;AN000;
1304
1305 CALL ROUND
1306 ;J.K. Set up the DEVMARK entries here for MEM command.
1307 ;J.K. Only the DEVMARK_ID and DEVMARK_FILENAME will be set.
1308 ;J.K. DEVMARK_SIZE should be set after a successful process of this file.
1309 call Set_DevMark ;AN004;
1310 inc [MEMHI] ;AN004;Size of DEVMARK is a paragraph!!
1311 ;Don't forget decrease MEMHI
1312 ; with an unsuccessful process of this file!!.
1313 XOR AX,AX
1314 MOV WORD PTR [ENTRY_POINT],AX
1315 MOV AX,[MEMHI]
1316 MOV WORD PTR [ENTRY_POINT+2],AX ;SET ENTRY POINT
1317
1318 IF NOT NOEXEC
1319 MOV [LDOFF],AX ;SET LOAD OFFSET
1320 ENDIF
1321
1322 PUSH ES
1323 POP DS
1324 ASSUME DS:NOTHING
1325 MOV DX,SI ;DS:DX POINTS TO FILE NAME
1326
1327 IF NOEXEC
1328 LES BX,DWORD PTR CS:[MEMLO]
1329 CALL LDFIL ;LOAD IN THE DEVICE DRIVER
1330 ELSE
1331 ; We are going to open the cdevice driver and size it as is done
1332 ; in LDFIL. The reason we must do this is that EXEC does NO checking
1333 ; for us. We must make sure there is room to load the device without
1334 ; trashing SYSINIT. This code is not
1335 ; perfect (for instance .EXE device drivers are possible) because
1336 ; it does its sizing based on the assumption that the file being loaded
1337 ; is a .COM file. It is close enough to correctness to be usable.
1338 MOV ES,AX ;ES:0 is LOAD addr
1339 MOV AX,OPEN SHL 8 ;OPEN THE FILE
1340 STC ;IN CASE OF INT 24
1341 INT 21H
1342 JC BADLDRESET
1343 MOV BX,AX ;Handle in BX
1344 ;AN016; UNDO THE EXTENDED ATTRIBUTE HANDLING
1345 ; call Get_Ext_Attribute ;AN009;
1346 ; jc BadLdReset ;AN009;
1347 ; test cs:[IFS_Flag], IS_IFS ;AN009;
1348 ; jnz Chk_Ext_Attr_IFS ;AN009;
1349 ; cmp al, EA_UNSPECIFIED ;AN009;Check the extended attr. for device driver
1350 ; je Ext_Attr_Ok ;AN009; Allow 0 and EA_DEVICE_DRIVER
1351 ; cmp al, EA_DEVICE_DRIVER ;AN009;
1352 ; je Ext_Attr_Ok ;AN009;
1353 ; stc ;AN012;BadLdReset depends on the carry bit.
1354 ; jmp BadLdReset ;AN009;
1355 ;Chk_Ext_Attr_IFS: ;AN009;
1356 ; cmp al, EA_IFS_DRIVER ;AN009;
1357 ; je Ext_Attr_Ok ;AN012;
1358 ; stc ;AN012;
1359 ; jmp BadLdReset ;AN012;
1360 ;Ext_Attr_Ok: ;AN009;
1361 PUSH DX ; Save pointer to name
1362 XOR CX,CX
1363 XOR DX,DX
1364 MOV AX,(LSEEK SHL 8) OR 2
1365 STC ;IN CASE OF INT 24
1366 INT 21H ; Get file size in DX:AX
1367 JNC GO_AHEAD_LOAD
1368 MOV AH,CLOSE ; Close file
1369 INT 21H
1370 POP DX ; Clean stack
1371 STC ; Close may clear carry
1372 JMP SHORT BADLDRESET
1373
1374 GO_AHEAD_LOAD:
1375 ; Convert size in DX:AX to para in AX
1376 ADD AX,15 ; Round up size for conversion to para
1377 ADC DX,0
1378 MOV CL,4
1379 SHR AX,CL
1380 MOV CL,12
1381 SHL DX,CL ; Low nibble of DX to high nibble
1382 OR AX,DX ; AX is now # of para for file
1383
1384 MOV CX,ES ; CX:0 is xaddr
1385 ADD CX,AX ; New device will take up to here
1386 JC MEM_ERRJY ; WOW!!!!
1387 CMP CX,CS:[ALLOCLIM]
1388 JB OKLDX
1389 MEM_ERRJY:
1390 JMP MEM_ERR
1391
1392 OKLDX:
1393 POP DX ; Recover name pointer
1394 MOV AH,CLOSE ; Close file
1395 INT 21H
1396 MOV BX,CS
1397 MOV ES,BX
1398 MOV BX,OFFSET PRMBLK ;ES:BX POINTS TO PARAMETERS
1399 MOV AL,3
1400 MOV AH,EXEC
1401 STC ;IN CASE OF INT 24
1402 INT 21H ;LOAD IN THE DEVICE DRIVER
1403 ENDIF
1404
1405 BADLDRESET:
1406 PUSH DS
1407 POP ES ;ES:SI BACK TO CONFIG.SYS
1408 PUSH CS
1409 POP DS ;DS BACK TO SYSINIT
1410 ASSUME DS:SYSINITSEG
1411 JNC GOODLD
1412 BADBRK:
1413 test cs:[SetDevMarkFlag],SETBRKDONE ;AN004;If already Set_Break is done,
1414 jnz Skip0_ResetMEMHI ;AN004; then do not
1415 dec cs:[MEMHI] ;AN004;Adjust MEMHI by a paragrah of DEVMARK.
1416 Skip0_ResetMEMHI:
1417 cmp byte ptr es:[si], CR ;file name is CR? (Somebody entered "device=" without filename)
1418 jne BADBRK_1
1419 jmp BADOP ;show "Unrecognized command in CONFIG.SYS"
1420 BADBRK_1:
1421 invoke BADLOAD
1422 JMP COFF
1423
1424 GOODLD:
1425 ;J.K. If it is IFS=, then we should set IFS_DOSCALL@ field in IFSHEADER.
1426 test cs:[IFS_Flag], IS_IFS ;AN000;
1427 jz Skip_IFSHEADER_Set ;AN000;
1428 push es ;AN000;
1429 push di ;AN000;
1430 push ds ;AN000;
1431 mov bx, word ptr cs:[ENTRY_POINT+2] ;AN000;
1432 mov ds, bx ;AN000; DS:0 will be the header
1433 les di, cs:[DosInfo] ;AN000;
1434 mov bx, word ptr es:[di.SYSI_IFS_DOSCALL@] ;AN000;
1435 mov word ptr ds:[IFS_DOSCALL@], bx ;AN000;
1436 mov bx, word ptr es:[di.SYSI_IFS_DOSCALL@]+2 ;AN000;
1437 mov word ptr ds:[IFS_DOSCALL@]+2, bx ;AN000;
1438 pop ds ;AN000;
1439 pop di ;AN000;
1440 pop es ;AN000;
1441 Skip_IFSHEADER_Set: ;AN000;
1442 SaveReg <ES,SI> ;INITIALIZE THE DEVICE
1443 ; call Chk_IBMCACHE ;AN024 IBMCACHE.SYS problem.;AN026;IBMDOS will handles this thru 4Bh call.
1444 Restore:MOV BL,ES:[SI] ; while ((c=*p) != 0)
1445 OR BL,BL
1446 JZ Got
1447 INC SI ; p++;
1448 JMP Restore
1449 Got: MOV BYTE PTR ES:[SI],' ' ; *p = ' ';
1450 SaveReg <ES,SI>
1451 PUSH CS
1452 POP ES
1453
1454 test cs:[IFS_Flag], IS_IFS ;AN000;
1455 jz Got_Device_Com ;AN000;
1456 mov bx, IFS_CALL@ ;AN000; offset from the start of IFSHEADER
1457 call CallIFS ;AN000;
1458 jmp short End_Init_Call
1459 Got_Device_Com:
1460 push ds ;AN017;
1461 push si ;AN017;
1462 lds si, cs:[ENTRY_POINT] ;AN017; Peeks the header attribute
1463 test word ptr ds:[si.SDEVATT], DEVTYP ;AN017;Block device driver?
1464 jnz Got_Device_Com_Cont ;AN017;No.
1465 lds si, cs:[DOSINFO] ;AN017; DS:SI -> SYS_VAR
1466 cmp ds:[si.SYSI_NUMIO], 26 ;AN017; No more than 26 drive number
1467 jb Got_Device_Com_Cont ;AN017;
1468 pop si ;AN017;
1469 pop ds ;AN017;
1470 pop si ;AN017;clear the stack
1471 pop es ;AN017;
1472 jmp BadNumBlock ;AN017;
1473 Got_Device_Com_Cont: ;AN017;
1474 pop si ;AN017;
1475 pop ds ;AN017;
1476 MOV BX,SDEVSTRAT
1477 invoke CALLDEV ; CallDev (SDevStrat);
1478 MOV BX,SDEVINT
1479 invoke CALLDEV ; CallDev (SDevInt);
1480 End_Init_Call:
1481 RestoreReg <SI,DS>
1482 MOV BYTE PTR [SI],0 ; *p = 0;
1483
1484 PUSH CS
1485 POP DS
1486
1487 test [IFS_Flag], IS_IFS ;AN000;
1488 jz Was_Device_Com ;AN000;
1489 cmp [ifs_rh.IFSR_RETCODE], 0 ;AN000; Was a success ?
1490 jne Erase_Dev_do ;AN000;
1491 pop si ;AN000; restore es:si to clean up the
1492 pop es ;AN000; stack for Set_Break call.
1493 mov ax, word ptr [Entry_Point+2] ;AN000; Get the loaded segment
1494 add ax, word ptr [ifs_rh.IFSR_RESSIZE] ;AN000;
1495 mov word ptr [Break_addr], 0 ;AN000;
1496 mov word ptr [Break_addr+2], ax ;AN000;
1497 or cs:[SetDevMarkFlag], FOR_DEVMARK ;AN004;
1498 invoke Set_Break ;AN000; Will also check the memory size too.
1499 push es ;AN000; Save it again, in case, for Erase_Dev_Do.
1500 push si ;AN000;
1501 jc Erase_Dev_do ;AN000;
1502 Link_IFS: ;AN000;
1503 les di, cs:[dosinfo] ;AN000;
1504 mov cx, word ptr es:[di.SYSI_IFS] ;AN000; save old pointer
1505 mov dx, word ptr es:[di.SYSI_IFS+2] ;AN000;
1506 lds si, cs:[Entry_Point] ;AN000;
1507 mov word ptr es:[di.SYSI_IFS],si ;AN000;
1508 mov word ptr es:[di.SYSI_IFS+2], ds ;AN000;
1509 mov word ptr ds:[si], cx ;AN000; We don't permit multiple IFSs.
1510 mov word ptr ds:[si+2], dx ;AN000;
1511 pop si ;AN000; Restore es:si for the next command.
1512 pop es ;AN000;
1513 ; mov cs:[IFS_Flag], HAD_IFS ;AN014; Set the flag.
1514 jmp COFF ;AN000;
1515
1516 ERASE_DEV_do: ;AC000;; Modified to show message "Error in CONFIG.SYS..."
1517 pop si
1518 pop es
1519 push cs
1520 pop ds
1521 test [SetDevMarkFlag],SETBRKDONE ;AN004;If already Set_Break is done,
1522 jnz Skip1_ResetMEMHI ;AN004; then do not
1523 dec [MEMHI] ;AN004;Adjust MEMHI by a paragrah of DEVMARK.
1524 Skip1_ResetMEMHI:
1525 cmp ConfigMsgFlag, 0 ;AN015;
1526 je No_Error_Line_Msg ;AN015;
1527 call Error_Line ;AN021; No "Error in CONFIG.SYS" msg for device driver. DCR D493
1528 mov ConfigMsgFlag, 0 ;AN015;AN021;Set the default value again.
1529 No_Error_Line_Msg: ;AN015;
1530 JMP Coff
1531
1532 Was_Device_Com: ;AN000;
1533 MOV AX,WORD PTR [BREAK_ADDR+2]
1534 CMP AX,[MEMORY_SIZE]
1535 JB BREAKOK
1536 POP SI
1537 POP ES
1538 JMP BADBRK
1539
1540 BREAKOK:
1541 LDS DX,[ENTRY_POINT] ;SET DS:DX TO HEADER
1542 MOV SI,DX
1543 ADD SI,SDEVATT ;DS:SI POINTS TO ATTRIBUTES
1544 LES DI,CS:[DOSINFO] ;ES:DI POINT TO DOS INFO
1545 MOV AX,DS:[SI] ;GET ATTRIBUTES
1546 TEST AX,DEVTYP ;TEST IF BLOCK DEV
1547 JZ ISBLOCK
1548 or cs:[SetDevMarkFlag],FOR_DEVMARK ;AN004;
1549 invoke Set_Break ; Go ahead and alloc mem for device
1550 jc Erase_Dev_do ;device driver's Init routien failed.
1551 TEST AX,ISCIN ;IS IT A CONSOLE IN?
1552 JZ TRYCLK
1553 MOV WORD PTR ES:[DI.SYSI_CON],DX
1554 MOV WORD PTR ES:[DI.SYSI_CON+2],DS
1555
1556 TRYCLK: TEST AX,ISCLOCK ;IS IT A CLOCK DEVICE?
1557 JZ GOLINK
1558 MOV WORD PTR ES:[DI+SYSI_CLOCK],DX
1559 MOV WORD PTR ES:[DI+SYSI_CLOCK+2],DS
1560 GOLINK: JMP LINKIT
1561
1562 ISBLOCK:
1563 MOV AL,CS:[UNITCOUNT] ;IF NO UNITS FOUND, erase the device
1564 OR AL,AL
1565 jz Erase_Dev_do
1566 ; JNZ PERDRV
1567 ; MOV AX, -1
1568 ; JMP ENDDEV
1569
1570 PERDRV:
1571 CBW ; WARNING NO DEVICE > 127 UNITS
1572 MOV CX,AX
1573 MOV DH,AH
1574 MOV DL,ES:[DI.SYSI_NUMIO] ;GET NUMBER OF DEVICES
1575 MOV AH,DL
1576 ADD AH,AL ; Check for too many devices
1577 CMP AH,26 ; 'A' - 'Z' is 26 devices
1578 JBE OK_BLOCK
1579 BadNumBlock: ;AN017;
1580 PUSH CS
1581 POP DS
1582 MOV DX,OFFSET BADBLOCK
1583 invoke PRINT
1584 JMP ERASE_DEV_do
1585
1586 OK_BLOCK:
1587 or cs:[SetDevMarkFlag],FOR_DEVMARK ;AN004;
1588 invoke SET_BREAK ; Alloc the device
1589 ADD ES:[DI.SYSI_NUMIO],AL ;UPDATE THE AMOUNT
1590 ADD CS:DriveNumber,AL ; remember amount for next device
1591 LDS BX,CS:[BPB_ADDR] ;POINT TO BPB ARRAY
1592 PERUNIT:
1593 LES BP,CS:[DOSINFO]
1594 LES BP,DWORD PTR ES:[BP.SYSI_DPB] ;GET FIRST DPB
1595
1596 SCANDPB:CMP WORD PTR ES:[BP.DPB_NEXT_DPB],-1
1597 JZ FOUNDPB
1598 LES BP,ES:[BP.DPB_NEXT_DPB]
1599 JMP SCANDPB
1600 FOUNDPB:
1601 MOV AX,CS:[MEMLO]
1602 MOV WORD PTR ES:[BP.DPB_NEXT_DPB],AX
1603 MOV AX,CS:[MEMHI]
1604 MOV WORD PTR ES:[BP.DPB_NEXT_DPB+2],AX
1605 LES BP,DWORD PTR CS:[MEMLO]
1606 ADD WORD PTR CS:[MEMLO],DPBSIZ
1607 or cs:[SetDevMarkFlag], FOR_DEVMARK ;AN004;Add DPB area for this unit
1608 CALL ROUND ;Check for alloc error
1609 MOV WORD PTR ES:[BP.DPB_NEXT_DPB],-1
1610 MOV ES:[BP.DPB_FIRST_ACCESS],-1
1611
1612 MOV SI,[BX] ;DS:SI POINTS TO BPB
1613 INC BX
1614 INC BX ;POINT TO NEXT GUY
1615 MOV WORD PTR ES:[BP.DPB_DRIVE],DX
1616 MOV AH,SETDPB ;HIDDEN SYSTEM CALL
1617 INT 21H
1618 MOV AX,ES:[BP.DPB_SECTOR_SIZE]
1619 PUSH ES
1620 LES DI,CS:[DOSINFO] ;ES:DI POINT TO DOS INFO
1621 CMP AX,ES:[DI.SYSI_MAXSEC]
1622 POP ES
1623 ja Bad_BPB_Size_Sector
1624 PUSH DS
1625 PUSH DX
1626 LDS DX,CS:[ENTRY_POINT]
1627 MOV WORD PTR ES:[BP.DPB_DRIVER_ADDR],DX
1628 MOV WORD PTR ES:[BP.DPB_DRIVER_ADDR+2],DS
1629 POP DX
1630 POP DS
1631 INC DX
1632 INC DH
1633 LOOP PERUNIT
1634 PUSH CS
1635 POP DS
1636 CALL TEMPCDS ; Set CDS for new drives
1637
1638 LINKIT:
1639 LES DI,CS:[DOSINFO] ;ES:DI = DOS TABLE
1640 MOV CX,WORD PTR ES:[DI.SYSI_DEV] ;DX:CX = HEAD OF LIST
1641 MOV DX,WORD PTR ES:[DI.SYSI_DEV+2]
1642
1643 LDS SI,CS:[ENTRY_POINT] ;DS:SI = DEVICE LOCATION
1644 MOV WORD PTR ES:[DI.SYSI_DEV],SI ;SET HEAD OF LIST IN DOS
1645 MOV WORD PTR ES:[DI.SYSI_DEV+2],DS
1646 MOV AX,DS:[SI] ;GET POINTER TO NEXT DEVICE
1647 MOV WORD PTR CS:[ENTRY_POINT],AX ;AND SAVE IT
1648
1649 MOV WORD PTR DS:[SI],CX ;LINK IN THE DRIVER
1650 MOV WORD PTR DS:[SI+2],DX
1651 ENDDEV:
1652 POP SI
1653 POP ES
1654 INC AX ;AX = FFFF (no more devs if YES)?
1655 JZ COFFJ3
1656 inc cs:MultDeviceFlag ;AN001; Possibly multiple device driver.
1657 JMP GOODLD ;OTHERWISE PRETEND WE LOADED IT IN
1658 COFFJ3: mov cs:MultDeviceFlag, 0 ;AN001; Reset the flag
1659 JMP COFF
1660
1661 Bad_BPB_Size_Sector:
1662 POP SI
1663 POP ES
1664 MOV DX,OFFSET BADSIZ_PRE
1665 ; MOV BX,OFFSET BADSIZ_POST
1666 mov bx, offset CRLFM ;AN???;
1667 invoke PRNERR
1668 test [SetDevMarkFlag],SETBRKDONE ;AN004;If already Set_Break is done,
1669 jnz Skip2_ResetMEMHI ;AN004; then do not
1670 dec [MEMHI] ;AN004;Adjust MEMHI by a paragrah of DEVMARK.
1671 Skip2_ResetMEMHI:
1672 JMP COFF
1673
1674
1675 ;------------------------------------------------------------------------------
1676 ; Country command
1677 ; J.K. The syntax is:
1678 ; COUNTRY=country id {,codepage {,path}}
1679 ; COUNTRY=country id {,,path} :Default CODEPAGE ID in DOS
1680 ;------------------------------------------------------------------------------
1681 TRYQ:
1682 CMP AH,'Q'
1683 JZ TRYQ_CONT
1684 JMP TRYF
1685 TRYQ_CONT:
1686
1687 ; invoke GETNUM
1688 ; JZ TryQBad ; 0 is never a valid code, or number is
1689 ; ; bad
1690 ; MOV BX,AX ; Country code in BX
1691 ;
1692 ; ;J.K. 5/26/86
1693 ; MOV DX,0 ; assume no code page id
1694 ;
1695 ; invoke skip_delim ;skip the delimeters after the first num
1696 ; jc TryQ_Def_File ;no more characters left? then use default file
1697 ; cmp al, CR ;
1698 ; je TryQ_Def_File
1699 ; cmp al, LF
1700 ; jne TRYQ_YES_EXTENDED
1701 ; inc [COUNT] ;This is for NEWLINE routine in COFF.
1702 ; dec [CHRPTR]
1703 ;COFFJ41:
1704 ; JMP TryQ_Def_File ;O.K. no code page, no path specified. Use default path.
1705 ;
1706 ;TRYQ_YES_EXTENDED:
1707 ; cmp al, ',' ;was the second comma?
1708 ; jne TryQ_GETNUM
1709 ; invoke skip_delim ;Yes, skip ',' and other possible delim
1710 ; jmp short TRYQ_PATH ;and No code page id entered.
1711 ;TRYQ_GETNUM:
1712 ; invoke GETNUM
1713 ; jc TryQBadCOM ;"Country=xxx,path" will not be accepted.
1714 ;; jc TRYQ_PATH ;Codepage is not specified. No code page.
1715 ;; ;At this point, AL already contain the
1716 ;; ;first char of the PATH.
1717 ; jz TryQBad ;codepage=0 entered. Error
1718 ; mov DX, AX ;save code page in DX
1719 ; invoke skip_delim ;move CHRPTR to the path string
1720 ; jc TryQ_Def_File ;no more char? then use default filename
1721 ; cmp al, CR
1722 ; je TryQ_Def_File
1723 ; cmp al, LF
1724 ; jne TryQ_PATH ;path entered.
1725 ; inc [COUNT]
1726 ; dec [CHRPTR]
1727 ;TryQ_Def_File:
1728 ; push dx ;save code page
1729 ; mov cs:CNTRY_DRV, 0 ;flag that the default path has been used!!!
1730 ; mov dx, offset CNTRY_ROOT ;the default path
1731 ; jmp TRYQ_OPEN
1732 ;
1733 ;TryQBad: ;"Invalid country code or code page"
1734 ; STC
1735 ; MOV DX,OFFSET BADCOUNTRY
1736 ; jmp TryQChkErr
1737 ;
1738 ;TryQBadCOM: ;Error in COUNTRY command
1739 ; STC
1740 ; MOV DX,OFFSET BADCOUNTRYCOM
1741 ; jmp TryQChkErr
1742 ;
1743 ;TRYQ_PATH: ;DS - sysinitseg, ES - CONFBOT,
1744 ; mov CX, [COUNT] ;AL - the first char of path
1745 ; inc CX ;BX - country id, DX - codepage id, 0 = No code page
1746 ; mov DI, SI
1747 ;TRYQ_PATH_LOOP: ;find the end of path to put 0 after that.
1748 ; mov AL, byte ptr ES:[DI]
1749 ; call delim
1750 ; jz TRYQ_PATH_END
1751 ; cmp al, 13
1752 ; jz TRYQ_PATH_END
1753 ; inc DI
1754 ; jmp short TRYQ_PATH_LOOP
1755 ;TryQBad_Brg:jmp short TryQBad
1756 ;TRYQ_PATH_END:
1757 ; mov es:byte ptr [di], 0 ;make it a ASCIIZ string. (Organize did not handle this string)
1758 ; push ds ;switch ds,es
1759 ; push es
1760 ; pop ds
1761 ; pop es
1762 ;
1763 ; mov di, offset CNTRY_DRV ;move the user specified path to CNTRY_DRV
1764 ; call Move_ASCIIZ
1765 ;
1766 ; push ds ;restore ds,es
1767 ; push es
1768 ; pop ds
1769 ; pop es
1770 ;
1771 ;; call Set_Country_Path ;set CNTRY_DRV
1772 ;
1773 ; push dx ;save DX
1774 ; mov dx, offset CNTRY_DRV ;Now DS:DX -> CNTRY_DRV
1775
1776 mov Cntry_Drv, 0 ;AN000; Reset the drive,path to default value.
1777 mov P_Code_Page,0 ;AN000;
1778 mov di, offset Cntry_Parms ;AN000;
1779 xor cx,cx ;AN000;
1780 mov dx,cx ;AN000;
1781 ; $SEARCH ;AN000;
1782 $$DO49:
1783 call Sysinit_Parse ;AN000;
1784 ; $EXITIF C ;AN000; Parse error, check the error code and
1785 JNC $$IF49
1786 call Cntry_Error ;AN000; Show message and end the serach loop.
1787 mov P_Cntry_Code, -1 ;AN000; Signals that parse error.
1788 ; $ORELSE ;AN000;
1789 JMP SHORT $$SR49
1790 $$IF49:
1791 cmp ax, $P_RC_EOL ;AN000; End of Line?
1792 ; $LEAVE E ;AN000; then end the $SEARCH LOOP
1793 JE $$EN49
1794 cmp Result_Val.$P_TYPE, $P_NUMBER ;AN000; Numeric?
1795 ; $IF E ;AN000;
1796 JNE $$IF53
1797 mov ax, word ptr Result_Val.$P_PICKED_VAL ;AN000;
1798 cmp cx, 1 ;AN000;
1799 ; $IF E ;AN000;
1800 JNE $$IF54
1801 mov P_Cntry_Code, ax ;AN000;
1802 ; $ELSE ;AN000;
1803 JMP SHORT $$EN54
1804 $$IF54:
1805 mov P_Code_Page, ax ;AN000;
1806 ; $ENDIF ;AN000;
1807 $$EN54:
1808 ; $ELSE ;AN000; Path entered.
1809 JMP SHORT $$EN53
1810 $$IF53:
1811 push ds ;AN000;
1812 push es ;AN000;
1813 push si ;AN000;
1814 push di ;AN000;
1815 push cs ;AN000;
1816 pop es ;AN000;
1817 lds si, RV_Dword ;AN000; Move the path to known place.
1818 mov di, offset CNTRY_Drv ;AN000;
1819 call Move_ASCIIZ ;AN000;
1820 pop di ;AN000;
1821 pop si ;AN000;
1822 pop es ;AN000;
1823 pop ds ;AN000;
1824 ; $ENDIF ;AN000;
1825 $$EN53:
1826 ; $ENDLOOP
1827 JMP SHORT $$DO49
1828 $$EN49:
1829 ; $ENDSRCH ;AN000;
1830 $$SR49:
1831 cmp P_Cntry_Code, -1 ;AN000; Had a parse error?
1832 jne TRYQ_OPEN ;AN000;
1833 jmp Coff ;AN000;
1834
1835 TryQBad: ;"Invalid country code or code page"
1836 STC
1837 MOV DX,OFFSET BADCOUNTRY
1838 jmp TryQChkErr
1839
1840 TRYQ_OPEN:
1841 cmp CNTRY_Drv, 0 ;AC000;
1842 je TRYQ_Def ;AC000;
1843 mov dx, offset CNTRY_Drv ;AC000;
1844 jmp TryQ_Openit ;AC000;
1845 TRYQ_Def: ;AC000;
1846 mov dx, offset CNTRY_Root ;AC000;
1847 TryQ_Openit:
1848 mov ax, 3d00h ;open a file
1849 stc
1850 int 21h
1851 jc TryQFileBad ;open failure
1852
1853 mov cs:CntryFileHandle, ax ;save file handle
1854 mov bx, ax
1855 mov ax, cs:P_Cntry_Code ;AN000;
1856 mov dx, cs:P_Code_Page ;AN000; Now, AX=country id, bx=filehandle
1857 ; xchg ax, bx ;now, AX = country id, BX = file handle
1858 mov cx, cs:[MEMHI]
1859 add cx, 128 ;I need 2K buffer to handle COUNTRY.SYS
1860 cmp cx, cs:[ALLOCLIM]
1861 ja TryQMemory ;cannot allocate the buffer for country.sys
1862
1863 mov si, offset CNTRY_DRV ;DS:SI -> CNTRY_DRV
1864 cmp byte ptr [si],0 ;default path?
1865 jne TRYQ_Set_for_DOS
1866 inc si
1867 inc si ;DS:SI -> CNTRY_ROOT
1868 TRYQ_Set_for_DOS:
1869 les di, cs:SYSI_Country ;ES:DI -> country info tab in DOS
1870 push di ;save di
1871 add di, ccPath_CountrySys
1872 call MOVE_ASCIIZ ;Set the path to COUNTRY.SYS in DOS.
1873 pop di ;ES:DI -> country info tab again.
1874 mov cx, cs:[MEMHI]
1875 mov ds, cx
1876 xor si, si ;DS:SI -> 2K buffer to be used.
1877 call SetDOSCountryInfo ;now do the job!!!
1878 jnc TryQchkERR ;read error or could not find country,code page combination
1879 cmp cx, -1 ;Could not find matching country_id,code page?
1880 je TryQBad ;then "Invalid country code or code page"
1881 TryQFileBad:
1882 push cs ;AN000;
1883 pop es ;AN000;
1884 cmp cs:CNTRY_DRV,0 ;Is the default file used?
1885 je TryQDefBad
1886 ; mov si, cs:[CONFBOT]
1887 ; mov es, si
1888 ; mov si, cs:[CHRPTR]
1889 ; dec si ;ES:SI -> path in CONFBOT
1890 mov si, offset CNTRY_Drv
1891 jmp short TryQBADLOAD
1892 TryQDefBad: ;Default file has been used.
1893 ; push cs
1894 ; pop es
1895 mov si, offset CNTRY_ROOT ;ES:SI -> \COUNTRY.SYS in SYSINIT_SEG
1896 TryQBADLOAD:
1897 call BADLOAD ;DS will be restored to SYSINIT_SEG
1898 mov cx, cs:[CONFBOT]
1899 mov es, cx ;Restore ES -> CONFBOT.
1900 jmp short CoffJ4
1901 TryQMemory:
1902 MOV DX,OFFSET INSUFMEMORY
1903 TryQChkErr:
1904 mov cx, cs:[CONFBOT]
1905 mov es, cx ;restore ES -> CONFBOT seg
1906 push cs
1907 pop ds ;retore DS to SYSINIT_SEG
1908 jnc CoffJ4 ;if no error, then exit
1909 invoke PRINT ;else show error message
1910 call Error_Line ;AN000;
1911 CoffJ4:
1912 mov bx, CntryFileHandle
1913 mov ah, 3eh
1914 int 21h ;close a file. Don't care even if it fails.
1915 JMP COFF
1916
1917 Cntry_Error proc near
1918 ;Function: Show "Invalid country code or code page" messages, or
1919 ; "Error in COUNTRY command" depending on the error code
1920 ; in AX returned by SYSPARSE;
1921 ;In: AX - error code
1922 ; DS - Sysinitseg
1923 ; ES - CONFBOT
1924 ;Out: Show message. DX destroyed.
1925
1926 cmp ax, $P_OUT_OF_RANGE
1927 ; $IF E
1928 JNE $$IF61
1929 mov dx, offset BadCountry ;"Invalid country code or code page"
1930 ; $ELSE
1931 JMP SHORT $$EN61
1932 $$IF61:
1933 mov dx, offset BadCountryCom ;"Error in CONTRY command"
1934 ; $ENDIF
1935 $$EN61:
1936 invoke Print
1937 call Error_Line
1938 ret
1939 Cntry_Error endp
1940
1941 ;------------------------------------------------------------------------------
1942 ; Files command
1943 ;------------------------------------------------------------------------------
1944 ;*******************************************************************************
1945 ; Function: Parse the parameters of FILES= command. *
1946 ; *
1947 ; Input : *
1948 ; ES:SI -> parameters in command line. *
1949 ; Output: *
1950 ; Variable FILES set. *
1951 ; *
1952 ; Subroutines to be called: *
1953 ; Sysinit_Parse *
1954 ; Logic: *
1955 ; { *
1956 ; Set DI points to FILES_Parms; *
1957 ; Set DX,CX to 0; *
1958 ; While (End of command line) *
1959 ; { Sysinit_parse; *
1960 ; if (no error) then *
1961 ; Files = Result_Val.$P_Picked_Val *
1962 ; else *
1963 ; Error Exit; *
1964 ; }; *
1965 ; }; *
1966 ; *
1967 ;*******************************************************************************
1968 TRYF:
1969 CMP AH,'F'
1970 JNZ TRYL
1971
1972 ; invoke GETNUM
1973 ; CMP AX,5 ;j.k. change it to 8!!!!!!!!
1974 ; JB TryFBad ; Gotta have at least 5
1975 ; CMP AX,256
1976 ; JAE TryFBad ; Has to be a byte
1977 ; MOV [FILES],AL
1978 ;CoffJ5: JMP COFF
1979 ;TryFBad:JMP BadOp
1980
1981 mov di, offset Files_Parms ;AN000;
1982 xor cx, cx ;AN000;
1983 mov dx, cx ;AN000;
1984
1985 ; $SEARCH ;AN000;
1986 $$DO64:
1987 call Sysinit_Parse ;AN000;
1988 ; $EXITIF C ;AN000; Parse Error,
1989 JNC $$IF64
1990 call Badparm_p ;AN007; and Show messages and end the search loop.
1991 ; $ORELSE ;AN000;
1992 JMP SHORT $$SR64
1993 $$IF64:
1994 cmp ax, $P_RC_EOL ;AN000; End of Line?
1995 ; $LEAVE E ;AN000; then end the $ENDLOOP
1996 JE $$EN64
1997 mov al, byte ptr Result_Val.$P_PICKED_VAL ;AN000;
1998 mov P_Files, al ;AN000; Save it temporarily
1999 ; $ENDLOOP ;AN000;
2000 JMP SHORT $$DO64
2001 $$EN64:
2002 mov al, P_Files ;AN000;
2003 mov Files, al ;AN000; No error. Really set the value now.
2004 ; $ENDSRCH ;AN000;
2005 $$SR64:
2006 jmp Coff
2007
2008 ;------------------------------------------------------------------------------
2009 ; LastDrive command
2010 ;------------------------------------------------------------------------------
2011 ;*******************************************************************************
2012 ; Function: Parse the parameters of LASTDRIVE= command. *
2013 ; *
2014 ; Input : *
2015 ; ES:SI -> parameters in command line. *
2016 ; Output: *
2017 ; Set the variable NUM_CDS. *
2018 ; *
2019 ; Subroutines to be called: *
2020 ; Sysinit_Parse *
2021 ; Logic: *
2022 ; { *
2023 ; Set DI points to LDRV_Parms; *
2024 ; Set DX,CX to 0; *
2025 ; While (End of command line) *
2026 ; { Sysinit_Parse; *
2027 ; if (no error) then *
2028 ; Set NUM_CDS to the returned value; *
2029 ; else /*Error exit*/ *
2030 ; Error Exit; *
2031 ; }; *
2032 ; }; *
2033 ; *
2034 ;*******************************************************************************
2035 TRYL:
2036 CMP AH,'L'
2037 JNZ TRYP
2038
2039 ; OR AL,020h
2040 ; SUB AL,'a'
2041 ; JB TryLBad
2042 ; INC AL
2043 ; CMP AL,26 ; a-z are allowed
2044 ; JA TryLBad
2045 ; MOV [NUM_CDS],AL
2046 ;CoffJ6: JMP COFF
2047 ;TryLBad:JMP BadOp
2048
2049 mov di, offset LDRV_Parms ;AN000;
2050 xor cx, cx ;AN000;
2051 mov dx, cx ;AN000;
2052
2053 ; $SEARCH ;AN000;
2054 $$DO70:
2055 call Sysinit_Parse ;AN000;
2056 ; $EXITIF C ;AN000; Parse Error,
2057 JNC $$IF70
2058 call Badparm_p ;AN007; and Show messages and end the search loop.
2059 ; $ORELSE ;AN000;
2060 JMP SHORT $$SR70
2061 $$IF70:
2062 cmp ax, $P_RC_EOL ;AN000; End of Line?
2063 ; $LEAVE E ;AN000; then end the $ENDLOOP
2064 JE $$EN70
2065 mov al, RV_Byte ;AN000; Pick up the drive number
2066 mov P_Ldrv, al ;AN000; Save it temporarily
2067 ; $ENDLOOP ;AN000;
2068 JMP SHORT $$DO70
2069 $$EN70:
2070 mov al, P_Ldrv ;AN000;
2071 ; sub al, 'A' ;AN000; Convert it to drive number
2072 ; inc al ;AN000; make it to be a number of drives.
2073 mov Num_CDS, al ;AN000; No error. Really set the value now.
2074 ; $ENDSRCH ;AN000;
2075 $$SR70:
2076 jmp Coff
2077
2078
2079 ;-------------------------------------------------------------------------------
2080 ; Setting Drive Parameters
2081 ;-------------------------------------------------------------------------------
2082 TRYP:
2083 CMP AH,'P'
2084 JNZ TRYK
2085 invoke PARSELINE
2086 JC TryPBad
2087 invoke SETPARMS
2088 INVOKE DIDDLEBACK
2089 jc TryPBad
2090 JMP COFF
2091 TryPBad:jmp Badop
2092 ;-------------------------------------------------------------------------------
2093 ; Setting Internal Stack Parameters
2094 ; STACKS=M,N where
2095 ; M is the number of stacks (range 8 to 64, default 9)
2096 ; N is the stack size (range 32 to 512 bytes, default 128)
2097 ; J.K. 5/5/86: STACKS=0,0 implies no stack installation.
2098 ; Any combinations that are not within the specified limits will
2099 ; result in "Unrecognized command" error.
2100 ;-------------------------------------------------------------------------------
2101 ;*******************************************************************************
2102 ; *
2103 ; Function: Parse the parameters of STACKS= command. *
2104 ; The minimum value for "number of stacks" and "stack size" is *
2105 ; 8 and 32 each. In the definition of SYSPARSE value list, they *
2106 ; are set to 0. This is for accepting the exceptional case of *
2107 ; STACKS=0,0 case (,which means do not install the stack.) *
2108 ; So, after SYSPARSE is done, we have to check if the entered *
2109 ; values (STACK_COUNT, STACK_SIZE) are within the actual range, *
2110 ; (or if "0,0" pair has been entered.) *
2111 ; Input : *
2112 ; ES:SI -> parameters in command line. *
2113 ; Output: *
2114 ; Set the variables STACK_COUNT, STACK_SIZE. *
2115 ; *
2116 ; Subroutines to be called: *
2117 ; Sysinit_Parse *
2118 ; Logic: *
2119 ; { *
2120 ; Set DI points to STKS_Parms; *
2121 ; Set DX,CX to 0; *
2122 ; While (End of command line) *
2123 ; { Sysinit_Parse; *
2124 ; if (no error) then *
2125 ; { if (CX == 1) then /* first positional = stack count */ *
2126 ; P_Stack_Count = Result_Val.$P_Picked_Val; *
2127 ; if (CX == 2) then /* second positional = stack size */ *
2128 ; P_Stack_Size = Result_Val.$P_Picked_Val; *
2129 ; } *
2130 ; else /*Error exit*/ *
2131 ; Error Exit; *
2132 ; }; *
2133 ; Here check P_STACK_COUNT,P_STACK_SIZE if it meets the condition; *
2134 ; If O.K., then set Stack_Count, Stack_Size; *
2135 ; else Error_Exit; *
2136 ; }; *
2137 ;*******************************************************************************
2138 TRYK:
2139 CMP AH,'K'
2140 JE Do_TryK
2141 jmp TRYS
2142
2143 IF STACKSW
2144
2145 ; MOV SepChr,','
2146 ; INVOKE GetNum ; Get number of stacks
2147 ; MOV SepChr,0
2148 ; cmp ax, 0 ;J.K. 5/5/86
2149 ; je TRYK_0 ;J.K. Let's accept 0.
2150 ; CMP AX, MinCount ; 8 <= Number of Stacks <= 64
2151 ; JB TryKBad
2152 ; CMP AX, MaxCount
2153 ; JA TryKBad
2154 ;TRYK_0:
2155 ; MOV [STACK_COUNT], AX
2156 ;
2157 ; Skip delimiters after the first number.
2158 ;
2159 ; invoke Skip_delim ;J.K.
2160 ; JC TryKBad
2161 ;
2162 ; INVOKE GetNum ; Get size of individual stack
2163 ; JC TryKBad ; Number bad
2164 ;
2165 ; cmp ax, 0 ;J.K. 5/5/86
2166 ; je TRYK_SIZE0 ;J.K. 5/5/86. Accept 0
2167 ;
2168 ; CMP AX, MinSize ; 32 <= Stack Size <= 512
2169 ; JB TryKBad
2170 ; CMP AX, MaxSize
2171 ; JA TryKBad
2172 ;TRYK_SIZE0:
2173 ; MOV [STACK_SIZE], AX
2174 ; cmp ax,0
2175 ; je TRYK_BOTH0
2176 ;TRYK_OK:
2177 ; mov word ptr [stack_addr], -1 ;set the flag that the user entered stacks= command.
2178 ; JMP COFF
2179 ;TRYK_BOTH0:
2180 ; cmp [STACK_COUNT],0 ;stack_size = 0. Stack_Count = 0 too?
2181 ; je TRYK_OK ;yes. accepted.
2182 ;TryKBad:
2183 ; MOV DX, OFFSET BADSTACK ;J.K. 5/26/86 "Invalid stack parameter"
2184 ; invoke PRINT
2185 ; JMP COFF
2186
2187 Do_TryK:
2188 mov di, offset STKS_Parms ;AN000;
2189 xor cx, cx ;AN000;
2190 mov dx, cx ;AN000;
2191
2192 ; $SEARCH ;AN000;
2193 $$DO76:
2194 call Sysinit_Parse ;AN000;
2195 ; $EXITIF C ;AN000; Parse Error,
2196 JNC $$IF76
2197 mov dx, offset BadStack ;AN000; "Invalid stack parameter"
2198 call Print ;AN000; and Show messages and end the search loop.
2199 call Error_Line ;AN006;
2200 ; $ORELSE ;AN000;
2201 JMP SHORT $$SR76
2202 $$IF76:
2203 cmp ax, $P_RC_EOL ;AN000; End of Line?
2204 ; $LEAVE E ;AN000; then end the $ENDLOOP
2205 JE $$EN76
2206 mov ax, word ptr Result_Val.$P_PICKED_VAL ;AN000;
2207 cmp cx, 1 ;AN000;
2208 ; $IF E ;AN000;
2209 JNE $$IF80
2210 mov P_Stack_Count, ax ;AN000;
2211 ; $ELSE ;AN000;
2212 JMP SHORT $$EN80
2213 $$IF80:
2214 mov P_Stack_Size, ax ;AN000;
2215 ; $ENDIF ;AN000;
2216 $$EN80:
2217 ; $ENDLOOP ;AN000;
2218 JMP SHORT $$DO76
2219 $$EN76:
2220 cmp P_Stack_Count, 0 ;AN000;
2221 ; $IF NE ;AN000;
2222 JE $$IF84
2223 cmp P_Stack_Count, MINCOUNT ;AN000;
2224 ; $IF B,OR ;AN000;
2225 JB $$LL85
2226 cmp P_Stack_Size, MINSIZE ;AN000;
2227 ; $IF B ;AN000;
2228 JNB $$IF85
2229 $$LL85:
2230 mov P_Stack_Count, -1 ;AN000; Invalid
2231 ; $ENDIF ;AN000;
2232 $$IF85:
2233 ; $ELSE ;AN000;
2234 JMP SHORT $$EN84
2235 $$IF84:
2236 cmp P_Stack_Size, 0 ;AN000;
2237 ; $IF NE ;AN000;
2238 JE $$IF88
2239 mov P_Stack_Count, -1 ;AN000; Invalid
2240 ; $ENDIF ;AN000;
2241 $$IF88:
2242 ; $ENDIF ;AN000;
2243 $$EN84:
2244 cmp P_Stack_Count, -1 ;AN000; Invalid?
2245 ; $IF E ;AN000;
2246 JNE $$IF91
2247 mov Stack_Count, DEFAULTCOUNT ;AN000;Reset to default value.
2248 mov Stack_Size, DEFAULTSIZE ;AN000;
2249 mov word ptr STACK_ADDR, 0 ;AN000;
2250 mov dx, offset BadStack ;AN000;
2251 call Print ;AN000;
2252 call Error_Line ;AN006;
2253 ; $ELSE ;AN000;
2254 JMP SHORT $$EN91
2255 $$IF91:
2256 mov ax, P_Stack_Count ;AN000;
2257 mov Stack_Count, ax ;AN000;
2258 mov ax, P_Stack_Size ;AN000;
2259 mov Stack_Size, ax ;AN000;
2260 mov word ptr Stack_Addr, -1 ;AN000;STACKS= been accepted.
2261 ; $ENDIF ;AN000;
2262 $$EN91:
2263 ; $ENDSRCH ;AN000;
2264 $$SR76:
2265 jmp Coff
2266 ENDIF
2267 ;------------------------------------------------------------------------------
2268 ; Switch command ;No longer supported.
2269 ;------------------------------------------------------------------------------
2270 ;TRYW:
2271 ; CMP AH,'W'
2272 ; JNZ TRYA
2273 ; JMP BadOp ; no longer implemented
2274 ; MOV DL,AL
2275 ; MOV AX,(CHAR_OPER SHL 8) OR 1 ;SET SWITCH CHARACTER
2276 ; MOV [COMMAND_LINE+1],DL
2277 ; INT 21H
2278 ; JMP COFF
2279 ;------------------------------------------------------------------------------
2280 ; Availdev command ;No longer supported.
2281 ;------------------------------------------------------------------------------
2282 ;TRYA:
2283 ; CMP AH,'A'
2284 ; JNZ TRYS
2285 ; JMP BadOp ; NO LONGER IMPLEMENTED
2286 ; CMP AL,'F' ;FIRST LETTER OF "FALSE"
2287 ; JNZ COFFJ7
2288 ; MOV AX,(CHAR_OPER SHL 8) OR 3 ;TURN ON "/DEV" PREFIX
2289 ; XOR DL,DL
2290 ; INT 21H
2291 ;COFFJ7: JMP COFF
2292
2293 ;------------------------------------------------------------------------------
2294 ; shell command
2295 ;------------------------------------------------------------------------------
2296 TRYS:
2297 CMP AH,'S'
2298 JNZ TRYX
2299 MOV [COMMAND_LINE+1],0
2300 MOV DI,OFFSET COMMND + 1
2301 MOV [DI-1],AL
2302 STORESHELL:
2303 CALL GETCHR
2304 OR AL,AL
2305 JZ GETSHPARMS
2306 CMP AL," "
2307 JB ENDSH
2308 MOV [DI],AL
2309 INC DI
2310 JMP STORESHELL
2311
2312 ENDSH:
2313 MOV BYTE PTR [DI],0
2314 CALL GETCHR
2315 CMP AL,LF
2316 JNZ CONV
2317 CALL GETCHR
2318 CONV: JMP CONFLP
2319
2320 GETSHPARMS:
2321 MOV BYTE PTR [DI],0
2322 MOV DI,OFFSET COMMAND_LINE+1
2323 PARMLOOP:
2324 CALL GETCHR
2325 CMP AL," "
2326 JB ENDSH
2327 MOV [DI],AL
2328 INC DI
2329 JMP PARMLOOP
2330
2331 ;------------------------------------------------------------------------------
2332 ; FCBS Command
2333 ;------------------------------------------------------------------------------
2334 ;*******************************************************************************
2335 ; Function: Parse the parameters of FCBS= command. *
2336 ; *
2337 ; Input : *
2338 ; ES:SI -> parameters in command line. *
2339 ; Output: *
2340 ; Set the variables FCBS, KEEP. *
2341 ; *
2342 ; Subroutines to be called: *
2343 ; Sysinit_Parse *
2344 ; Logic: *
2345 ; { *
2346 ; Set DI points to FCBS_Parms; *
2347 ; Set DX,CX to 0; *
2348 ; While (End of command line) *
2349 ; { SYSPARSE; *
2350 ; if (no error) then *
2351 ; { if (CX == 1) then /* first positional = FCBS */ *
2352 ; FCBS = Result_Val.$P_Picked_Val; *
2353 ; if (CX == 2) then /* second positional = KEEP */ *
2354 ; KEEP = Result_Val.$P_Picked_Val; *
2355 ; } *
2356 ; else /*Error exit*/ *
2357 ; Error Exit; *
2358 ; }; *
2359 ; }; *
2360 ;*******************************************************************************
2361 TRYX:
2362 CMP AH,'X'
2363 JNZ TRYY
2364 ; invoke GETNUM
2365 ; JZ TryXBad ; gotta have at least one
2366 ; CMP AX,256
2367 ; JAE TryXBad ; Can't be more than 8 bits worth
2368 ; MOV [FCBS],AL
2369 ;
2370 ; Skip delimiters after the first number including ","
2371 ;
2372 ; invoke Skip_delim ;J.K.
2373 ; jc tryxbad
2374 ; invoke GetNum
2375 ; JC TryXBad ; Number bad (Zero is OK here)
2376 ; CMP AX,256
2377 ; JAE TryXBad
2378 ; CMP AL,FCBS
2379 ; JA TryXBad
2380 ; MOV Keep,AL
2381 ; JMP COFF
2382 ;TryXBad:JMP BadOp
2383
2384 mov di, offset FCBS_Parms ;AN000;
2385 xor cx, cx ;AN000;
2386 mov dx, cx ;AN000;
2387
2388 ; $SEARCH ;AN000;
2389 $$DO95:
2390 call Sysinit_Parse ;AN000;
2391 ; $EXITIF C ;AN000; Parse Error,
2392 JNC $$IF95
2393 call Badparm_p ;AN007; and Show messages and end the search loop.
2394 ; $ORELSE ;AN000;
2395 JMP SHORT $$SR95
2396 $$IF95:
2397 cmp ax, $P_RC_EOL ;AN000; End of Line?
2398 ; $LEAVE E ;AN000; then end the $ENDLOOP
2399 JE $$EN95
2400 mov al, byte ptr Result_Val.$P_PICKED_VAL ;AN000;
2401 cmp cx, 1 ;AN000; The first positional?
2402 ; $IF E ;AN000;
2403 JNE $$IF99
2404 mov P_Fcbs, al ;AN000;
2405 ; $ELSE ;AN000;
2406 JMP SHORT $$EN99
2407 $$IF99:
2408 mov P_Keep, al ;AN000;
2409 ; $ENDIF ;AN000;
2410 $$EN99:
2411 ; $ENDLOOP ;AN000;
2412 JMP SHORT $$DO95
2413 $$EN95:
2414 mov al, P_Fcbs ;AN005;make sure P_Fcbs >= P_Keep
2415 cmp al, P_Keep ;AN005;
2416 ; $IF B ;AN005;
2417 JNB $$IF103
2418 ; call Badop_p ;AN005;
2419 call Badparm_p ;AN011;show "Bad parameter -" msg.
2420 mov P_Keep, 0 ;AN005;
2421 ; $ELSE ;AN005;
2422 JMP SHORT $$EN103
2423 $$IF103:
2424 mov Fcbs, al ;AN000; No error. Really set the value now.
2425 mov al, P_Keep ;AN000;
2426 mov Keep, al ;AN000;
2427 ; $ENDIF ;AN005;
2428 $$EN103:
2429 ; $ENDSRCH ;AN000;
2430 $$SR95:
2431 jmp Coff
2432
2433 ;------------------------------------------------------------------------------
2434 ; Comment= Do nothing. Just decrese CHRPTR, and increase COUNT for correct
2435 ; line number
2436 ;------------------------------------------------------------------------------
2437 TRYY: ;AN000;
2438 cmp ah, 'Y' ;AN000;
2439 jne Try0 ;AN000;
2440 DoNothing:
2441 dec CHRPTR ;AN000;
2442 inc COUNT ;AN000;
2443 jmp COFF ;AN000;
2444
2445 ;------------------------------------------------------------------------------
2446 ; REM command
2447 ;------------------------------------------------------------------------------
2448 Try0: ;AN003;do nothing with this line.
2449 cmp ah, '0' ;AN003;
2450 je DoNothing ;AN003;
2451
2452 ;------------------------------------------------------------------------------
2453 ; SWITCHES command
2454 ;------------------------------------------------------------------------------
2455 ;*******************************************************************************
2456 ; *
2457 ; Function: Parse the option switches specified. *
2458 ; Note - This command is intended for the future use also. When we need to *
2459 ; to set system data flag, use this command. *
2460 ; *
2461 ; Input : *
2462 ; ES:SI -> parameters in command line. *
2463 ; Output: *
2464 ; P_Swit_K set if /K option chosen. *
2465 ; *
2466 ; Subroutines to be called: *
2467 ; Sysinit_Parse *
2468 ; Logic: *
2469 ; { *
2470 ; Set DI points to Swit_Parms; /*Parse control definition*/ *
2471 ; Set DX,CX to 0; *
2472 ; While (End of command line) *
2473 ; { Sysinit_parse; *
2474 ; if (no error) then *
2475 ; if (Result_Val.$P_SYNONYM_ptr == Swit_K) then *
2476 ; P_Swit_K = 1 *
2477 ; endif *
2478 ; else {Show Error message;Error Exit} *
2479 ; }; *
2480 ; }; *
2481 ; *
2482 ;*******************************************************************************
2483
2484 cmp ah, '1' ;AN019;Switches= command entered?
2485 jne Tryz ;AN019;
2486
2487 mov di, offset Swit_Parms ;AN019;
2488 xor cx, cx ;AN019;
2489 mov dx, cx ;AN019;
2490
2491 ; $SEARCH ;AN019;
2492 $$DO107:
2493 call Sysinit_Parse ;AN019;
2494 ; $EXITIF C ;AN019; Parse Error,
2495 JNC $$IF107
2496 call Badparm_p ;AN019; and Show messages and end the search loop.
2497 ; $ORELSE ;AN019;
2498 JMP SHORT $$SR107
2499 $$IF107:
2500 cmp ax, $P_RC_EOL ;AN019; End of Line?
2501 ; $LEAVE E ;AN019; then jmp to $Endloop for semantic check.
2502 JE $$EN107
2503 cmp Result_Val.$P_SYNONYM_PTR, offset Swit_K ;AN019;
2504 ; $IF E ;AN019;
2505 JNE $$IF111
2506 mov P_Swit_K, 1 ;AN019; set the flag
2507 ; $ENDIF ;AN019;
2508 $$IF111:
2509 ; $ENDLOOP ;AN019;
2510 JMP SHORT $$DO107
2511 $$EN107:
2512 cmp P_Swit_K, 1 ;AN019;If /K entered,
2513 push ds ;AN019;
2514 mov ax, Code ;AN019;
2515 mov ds, ax ;AN019;
2516 assume ds:Code ;AN019;
2517 ; $IF E ;AN019;
2518 JNE $$IF114
2519 mov KEYRD_Func, 0 ;AN019;Use the conventional keyboard functions
2520 mov KEYSTS_Func, 1 ;AN019;
2521 ; $ENDIF ;AN019;
2522 $$IF114:
2523 pop ds ;AN019;
2524 assume ds:SYSINITSEG ;AN019;
2525 ; $ENDSRCH ;AN019;
2526 $$SR107:
2527 jmp Coff ;AN019;
2528
2529 ;------------------------------------------------------------------------------
2530 ; Bogus command
2531 ;------------------------------------------------------------------------------
2532 TRYZ:
2533 cmp ah, 0FFh ;AN029;
2534 je TryFF ;AN029;
2535 dec CHRPTR
2536 inc COUNT
2537 JMP BADOP
2538
2539 ;------------------------------------------------------------------------------
2540 ; Null command
2541 ;------------------------------------------------------------------------------
2542 TryFF: ;AN029;Skip this command.
2543 jmp DoNothing ;AN029;
2544
2545 GETCHR:
2546 PUSH CX
2547 MOV CX,COUNT
2548 JCXZ NOCHAR
2549 MOV SI,CHRPTR
2550 MOV AL,ES:[SI]
2551 DEC COUNT
2552 INC CHRPTR
2553 CLC
2554 GET_RET:
2555 POP CX
2556 return
2557 NOCHAR: STC
2558 JMP SHORT GET_RET
2559
2560 Incorrect_Order proc near ;AN000;
2561 ;Show "Incorrect order in CONFIG.SYS ..." message.
2562 mov dx, offset BADORDER ;AN000;
2563 call print ;AN000;
2564 call ShowLineNum ;AN000;
2565 ret ;AN000;
2566 Incorrect_Order endp ;AN000;
2567 ;
2568 public Error_Line
2569 Error_Line proc near ;AN000;
2570 ;Show "Error in CONFIG.SYS ..." message.
2571 push cs ;AN000;
2572 pop ds ;AN000;
2573 mov dx, offset ErrorCmd ;AN000;
2574 call print ;AN000;
2575 call ShowLineNum ;AN000;
2576 ret ;AN000;
2577 Error_Line endp ;AN000;
2578 ;
2579 ShowLineNum proc near ;AN000;
2580 ;J.K. Convert the binary LineCount to Decimal ASCII string in ShowCount
2581 ;and Display Showcount at the current curser position.
2582 ;In.) LineCount
2583 ;
2584 ;Out) the number is printed.
2585 push es ;AN000;
2586 push ds ;AN000;
2587 push di ;AN000;
2588
2589 push cs ;AN000;
2590 pop es ;AN000; es=cs
2591 push cs ;AN000;
2592 pop ds ;AN000;
2593
2594 ; mov ax, ' '
2595 ; mov di, offset ShowCount ;clean it up.
2596 ; stosw
2597 ; stosw
2598 ; stosb ;lenght of ShowCount is 5.
2599 ; dec di ;let DI points to the least significant ASCII field.
2600
2601 mov di, offset ShowCount+4 ;AN000; DI -> the least significant decimal field.
2602 mov cx, 10 ;AN000; decimal devide factor
2603 mov ax, cs:LineCount ;AN000;
2604 SLN_Loop: ;AN000;
2605 cmp ax, 10 ;AN000; < 10?
2606 jb SLN_Last ;AN000;
2607 xor dx,dx ;AN000;
2608 div cx ;AN000;
2609 or dl, 30h ;AN000; add "0" (= 30h) to make it an ascii.
2610 mov [di],dl ;AN000;
2611 dec di ;AN000;
2612 jmp SLN_Loop ;AN000;
2613 SLN_Last: ;AN000;
2614 or al, 30h ;AN000;
2615 mov [di],al ;AN000;
2616 mov dx, di ;AN000;
2617 call print ;AN000; show it.
2618 pop di ;AN000;
2619 pop ds ;AN000;
2620 pop es ;AN000;
2621 ret ;AN000;
2622 ShowLineNum endp ;AN000;
2623
2624
2625 CallIFS proc near ;AN000;
2626 ;*******************************************************************************
2627 ; Function: Interface to IFS call. This procedure will call IFS_CALL@ *
2628 ; *
2629 ; Input : *
2630 ; Entry_Point - Segment:Offset of loaded IFS. *
2631 ; BX = IFS_CALL@ (offset of IFS_CALL@ from the IFS header) *
2632 ; ES = Segment of IFS request header *
2633 ; IFS_Packet - IFS Request packet *
2634 ; *
2635 ; Output: Nothing *
2636 ;*******************************************************************************
2637 push ax ;AN000;
2638 mov ds, word ptr cs:[Entry_Point+2] ;AN000;
2639 add bx, word ptr cs:[Entry_Point] ;AN000; DS:[BX] = Real IFS_CALL@ addr.
2640 mov ax, ds:[bx] ;AN000; save it
2641 push word ptr cs:[Entry_Point] ;AN000; save Entry point offset
2642 mov word ptr cs:[Entry_Point], ax ;AN000; set for the call
2643 mov bx, offset IFS_RH ;AN000; Now, ES:BX -> Request packet
2644 call cs:[Entry_Point] ;AN000; Far call
2645 pop word ptr cs:[Entry_Point] ;AN000; Restore Entry point offset
2646 pop ax ;AN000;
2647 ret ;AN000;
2648 CallIFS endp ;AN000;
2649
2650
2651 Set_DevMark proc near ;AN004;
2652 ;*******************************************************************************
2653 ; Function: Set a paragraph of informations infront of a Device file or *
2654 ; an IFS file to be loaded for MEM command. *
2655 ; The structure is: *
2656 ; DEVMARK_ID byte "D" for device, "I" for IFS *
2657 ; DEVMARK_SIZE size in para for the device loaded *
2658 ; DEVMARK_FILENAME 11 bytes. Filename *
2659 ; *
2660 ; Input : *
2661 ; [MEMHI] = address to set up DEVMARK. *
2662 ; [MEMLO] = 0 *
2663 ; ES:SI -> pointer to [drive][path]filename,0 *
2664 ; [IFS_Flag] = IS_IFS bit set if IFS= command. *
2665 ; *
2666 ; Output: DEVMARK_ID, DEVMARK_FILENAME set *
2667 ; cs:[DevMark_addr] set. *
2668 ; AX, CX register destroyed. *
2669 ;*******************************************************************************
2670 push ds ;AN004;
2671 push si ;AN004;
2672 push es ;AN004;
2673 push di ;AN004;
2674
2675 mov di, cs:[MEMHI] ;AN004;
2676 mov ds, di ;AN004;
2677 assume ds:nothing ;AN004;
2678 mov [DevMark_Addr], di ;AN004; save the DEVMARK address for the future.
2679 test [IFS_Flag], IS_IFS ;AN004;
2680 jnz SDVMK_IFS ;AN004;
2681 mov al, DEVMARK_DEVICE ;AN004; ='D'
2682 jmp short SDVMK_ID ;AN004;
2683 SDVMK_IFS:
2684 mov al, DEVMARK_IFS ;AN004; ='I'
2685 SDVMK_ID: ;AN004;
2686 mov ds:[DEVMARK_ID], al ;AN004;
2687 inc di ;AN008;
2688 mov ds:[DEVMARK_SEG], di ;AN008;
2689 xor al,al ;AN004;
2690 push si ;AN004;
2691 pop di ;AN004; now es:si = es:di = [path]filename,0
2692 mov cx, 128 ;AN004; Maximum 128 char
2693 repnz scasb ;AN004; find 0
2694 dec di ;AN020; Now es:di-> 0
2695 SDVMK_Backward: ;AN004; find the pointer to the start of the filename.
2696 mov al, byte ptr es:[di] ;AN004;;AN020;We do this by check es:di backward until
2697 cmp al, '\' ;AN004;;AN020; DI = SI or DI -> '\' or DI -> ':'.
2698 je SDVMK_GotFile ;AN004;;AN020;
2699 cmp al, ':' ;AN004;
2700 je SDVMK_GotFile ;AN004;
2701 cmp di, si ;AN004;
2702 je SDVMK_FilePtr ;AN004;
2703 dec di ;AN004;
2704 jmp SDVMK_BackWard ;AN004;
2705 SDVMK_GotFile: ;AN004;
2706 inc di ;AN004;
2707 SDVMK_FilePtr: ;AN004; now es:di -> start of file name
2708 push di ;AN004;
2709 pop si ;AN004; save di to si.
2710 push ds ;AN004; switch es, ds
2711 push es ;AN004;
2712 pop ds ;AN004;
2713 pop es ;AN004; now, ds:si -> start of filename
2714 mov di, DEVMARK_FILENAME ;AN004;
2715 push di ;AN004;
2716 mov al, ' ' ;AN004;
2717 mov cx, 8 ;AN004;
2718 rep stosb ;AN004; Clean up Memory.
2719 pop di ;AN004;
2720 mov cx, 8 ;AN004; Max 8 char. only
2721 SDVMK_Loop: ;AN004;
2722 lodsb ;AN004;
2723 cmp al, '.' ;AN004;
2724 je SDVMK_Done ;AN004;
2725 cmp al, 0 ;AN004;
2726 je SDVMK_Done ;AN004;
2727 stosb ;AN004;
2728 loop SDVMK_Loop ;AN004;
2729 SDVMK_Done: ;AN004;
2730 pop di ;AN004;
2731 pop es ;AN004;
2732 pop si ;AN004;
2733 pop ds ;AN004;
2734 ret ;AN004;
2735 Set_DevMark endp ;AN004;
2736
2737 Chk_XMAEM proc near ;AN029;
2738 ;Function: Check XMAEM.SYS file name.
2739 ;In: ES:SI -> path, filename, 0
2740 ;out: if XMAEM.SYS, then zero flag set.
2741
2742 push es ;AN029;
2743 push si ;AN029;
2744 push ds ;AN029;
2745 push di ;AN029;
2746 push cx ;AN029;
2747 mov di, si ;AN029;save current starting pointer
2748 CX_Cmp: ;AN029;
2749 cmp byte ptr es:[si], 0 ;AN029;
2750 je CX_Endfile ;AN029;
2751 inc si ;AN029;
2752 jmp CX_Cmp ;AN029;
2753 CX_Endfile: ;AN029;
2754 dec si ;AN029;
2755 cmp byte ptr es:[si], '\' ;AN029;
2756 je CX_Got_Tail ;AN029;
2757 cmp byte ptr es:[si], ':' ;AN029;
2758 je CX_Got_Tail ;AN029;
2759 cmp di, si ;AN029;
2760 je CX_Got_Tail0 ;AN029;
2761 jmp CX_Endfile ;AN029;
2762 CX_Got_Tail: ;AN029;
2763 inc si ;AN029;
2764 CX_Got_Tail0: ;AN029;
2765 push cs ;AN029;
2766 pop ds ;AN029;
2767 push si ;AN029;
2768 pop di ;AN029;now es:di -> filename,0
2769 mov cx, 9 ;AN029;
2770 mov si, offset XMAEM_File ;AN029;ds:si -> XMAEM.SYS,0
2771 repe cmpsb ;AN029;
2772 CX_Ret: ;AN029;
2773 pop cx ;AN029;
2774 pop di ;AN029;
2775 pop ds ;AN029;
2776 pop si ;AN029;
2777 pop es ;AN029;
2778 ret ;AN029;
2779 Chk_XMAEM endp
2780
2781 ;Chk_IBMCACHE proc near ;AN024;AN026; Don't need this any more.
2782 ; IBMDOS is going to handle this through 4Bh call.
2783 ;Function: IBMCACHE.SYS does not handle a DOS version 4.0 or above.
2784 ; So, this procedure will check if the device driver is IBMCACHE.SYS.
2785 ; If it is, through new INT 2fh interface "Set/Restore DOS version"
2786 ; AX=122Fh
2787 ; DX= 0 ; reset
2788 ; otherwise ; DH = minor version, DL = major version
2789 ; INT 2fh
2790 ;In: ES:SI -> path, filename, 0
2791 ;out: if IBMCACHE.SYS, then DOS version changed to 4.00 temporarily.
2792 ; Reset_Dos_Version proc will later reset it back to current DOS version 4.0.
2793
2794 ; push es ;AN024;
2795 ; push si ;AN024;
2796 ; push ds ;AN024;
2797 ; push di ;AN024;
2798 ; push cx ;AN024;
2799 ; mov di, si ;AN024;save current starting pointer
2800 ;CIC_Cmp: ;AN024;
2801 ; cmp byte ptr es:[si], 0 ;AN024;
2802 ; je CIC_Endfile ;AN024;
2803 ; inc si ;AN024;
2804 ; jmp CIC_Cmp ;AN024;
2805 ;CIC_Endfile: ;AN024;
2806 ; dec si ;AN024;
2807 ; cmp byte ptr es:[si], '\' ;AN024;
2808 ; je CIC_Got_Tail ;AN024;
2809 ; cmp byte ptr es:[si], ':' ;AN024;
2810 ; je CIC_Got_Tail ;AN024;
2811 ; cmp di, si ;AN024;
2812 ; je CIC_Got_Tail0 ;AN024;
2813 ; jmp CIC_Endfile ;AN024;
2814 ;CIC_Got_Tail: ;AN024;
2815 ; inc si ;AN024;
2816 ;CIC_Got_Tail0: ;AN024;
2817 ; push cs ;AN024;
2818 ; pop ds ;AN024;
2819 ; push si ;AN024;
2820 ; pop di ;AN024;now es:di -> filename,0
2821 ; mov cx, 12 ;AN024;
2822 ; mov si, offset IBMCACHE_File ;AN024;ds:si -> IBMCACHE.SYS,0
2823 ; repe cmpsb ;AN024;
2824 ; jnz CIC_ret ;AN024;
2825 ; mov ax, 122Fh ;AN024;Change DOS version to
2826 ; mov dx, 2803h ;AN024; DOS 3.4 temporarily.
2827 ; int 2fh ;AN024;
2828 ;CIC_Ret: ;AN024;
2829 ; pop cx ;AN024;
2830 ; pop di ;AN024;
2831 ; pop ds ;AN024;
2832 ; pop si ;AN024;
2833 ; pop es ;AN024;
2834 ; ret ;AN024;
2835 ;Chk_IBMCACHE endp
2836 ;
2837
2838 Reset_DOS_Version proc near ;AN024;
2839 ;Function: issue AX=122Fh, DX=0, INT 2fh to restore the DOS version.
2840 push ax ;AN024;
2841 push dx ;AN024;
2842 mov ax, 122Fh ;AN024;
2843 mov dx, 0 ;AN024;
2844 int 2fh ;AN024;
2845 pop dx ;AN024;
2846 pop ax ;AN024;
2847 ret ;AN024;
2848 Reset_DOS_Version endp
2849
2850
2851 ;Int 2F EMS handler + Int 67h handler for EMS
2852 ;=========================================================================
2853 ; Int_2F_EMS - This routine provides support for VDISK,
2854 ; FASTOPEN, and BUFFERS to determine the physical
2855 ; EMS pages available for their usage.
2856 ;
2857 ; Inputs : AH - Function code (18h) to return available phys. page
2858 ; DI - FEh (Signals to return useable page for VDISK & FASTOPEN)
2859 ; FFh (Signals to return useable page for BUFFERS)
2860 ;
2861 ; AL = 0 is for installation check. - J.K.
2862 ;
2863 ; Outputs : ES - Segment value for physical page
2864 ; DI - Physical Page number
2865 ; AH - Non-zero (physical page not available)
2866 ; Zero (valid physical page data returned)
2867 ;
2868 ; For installation check, AL = 0FFh for being present. - J.K.
2869 ; For the other functions, AX = 0 for successful op.
2870 ; AX = -1 for an error.
2871 ;
2872 ; Date : 5/5/88
2873 ; Release : DOS 4.0
2874 ;=========================================================================
2875
2876 ;Int_2F_Handler proc ;traps Int_2f and checks for EMS ;an000; dms;
2877
2878 EMS_STUB_START label byte ;AN030;J.K.
2879 ;Dummy DEVICE HEADER for other dummy ;AN031; Symphony assumes int 67h handler seg as a device driver!
2880 DD -1 ;AN031;becomes pointer to next device header
2881 DW 0C040H ;AN031;attribute (character device)
2882 DW 0000 ;AN031;pointer to harzard area. System will hang.
2883 DW 0000 ;AN031;pointer to harzard area. System will hang.
2884 DB 'EMMXXXX0' ;AN031;device name
2885
2886 INTV2F equ $-EMS_STUB_START ;AN030;J.K.pointer to old 2Fh handler ;an000; dms;
2887 IntV2FO DW ? ;AN030;;offset ;an000; dms;
2888 IntV2FS DW ? ;AN030;;segment ;an000; dms;
2889
2890 OLDINT67_VECTOR equ $-EMS_STUB_START ;AN030;J.K.
2891 OldInt67 dd ? ;AN030;; save pointer to old INT 67 handler here
2892
2893 IF BUFFERFLAG
2894
2895 LOCKFLAG equ $-EMS_STUB_START
2896 LOCK_FLAG db ?
2897
2898 ELSE
2899
2900 EMSPAGE_CNT equ $-EMS_STUB_START ;AN030;J.K.
2901 EMSPageCount dw ? ;AN030;; save count of EMS mappable pages here
2902
2903 EMSReservedArray_X label word ;AN030;;J.K. For initialization routine
2904 EMSRESERVEDARRAY equ $-EMS_STUB_START ;AN030;;J.K.
2905 dw 0ffffh,0ffffh ;AN030;; array of reserved pages
2906 dw 0ffffh,0ffffh ;AN030;; phys_page_segment, phys_page_number * 2 entries
2907 MappableArray_X label word ;AN030;;J.K. for initialization routine
2908 MAPPABLEARRAY equ $-EMS_STUB_START ;AN030;;J.K.
2909 dw 64 dup (0,0) ;AN030;; table to get addresses from old INT 67 handler
2910
2911 ENDIF
2912 ; 64 entries * 2 words
2913 NEWEMS2F_OFF equ $-EMS_STUB_START;AN030;
2914 Int_2F_EMS: ;AN030;;J.K. Name changed.
2915 cmp ah,1Bh ;AN030;;AN032;2Fh trap for Mappable Phys. Add. Array ;an000; dms;
2916 je Int_2F_EMS_MINE ;AN030;;This one we want ;an000; dms;
2917
2918 jmp dword ptr cs:IntV2F ;AN030;;go to old interrupt handler ;an000; dms;
2919
2920 Int_2F_EMS_MINE: ;AN030;
2921 or al, al ;AN030;;J.K. Installation check?
2922 jnz Int_2F_5800_Func ;AN030;;J.K.
2923 mov al, 0FFh ;AN030;;J.K. Yes, I am here!
2924 iret ;AN030;;J.K.
2925
2926 Int_2F_5800_Func: ;AN030;
2927
2928 IF BUFFERFLAG
2929 ; int 3
2930 cmp di, 80h
2931 jne st_flag
2932 mov byte ptr cs:LOCKFLAG, 0
2933 jmp Int_2f_5800_Good_Exit
2934 st_flag:
2935 cmp di, 81h
2936 jne Int_2f_5800_Err_Exit
2937 mov byte ptr cs:LOCKFLAG, 1
2938 jmp Int_2f_5800_Good_Exit
2939 ELSE
2940
2941 push si ;AN030;; ;an000; dms;
2942
2943 ; mov si,offset EMSReservedArray ;point to array containing pages ;an000; dms;
2944 mov si, EMSRESERVEDARRAY ;AN030;;J.K.
2945
2946 cmp di,0feh ;AN030;;VDISK or FASTOPEN request? ;an000; dms;
2947 jne Int_2F_5800_Buff_Ck ;AN030;;no - check for buffers ;an000; dms;
2948
2949 cmp word ptr cs:[si],0ffffh ;AN030;;valid entry? ;an000; dms;
2950 je Int_2F_5800_Err_Exit ;AN030;;no - exit ;an000; dms;
2951
2952 mov es,word ptr cs:[si] ;AN030;;get segment value ;an000; dms;
2953 mov di,word ptr cs:[si+2] ;AN030;;get physical page value ;an000; dms;
2954 jmp Int_2F_5800_Good_Exit ;AN030;;exit routine ;an000; dms;
2955
2956 Int_2F_5800_Buff_Ck: ;AN030;
2957
2958 cmp di,0ffh ;AN030;;BUFFERS request? ;an000; dms;
2959 jne Int_2F_5800_Err_Exit ;AN030;;no - exit with error ;an000; dms;
2960
2961 add si,4 ;AN030;;point to second element in array ;an000; dms;
2962
2963 cmp word ptr cs:[si],0ffffh ;AN034;;valid entry? ;an000; dms;
2964 je Int_2F_5800_Err_Exit ;AN034;;no - exit ;an000; dms;
2965
2966 mov es,word ptr cs:[si] ;AN030;;get segment value ;an000; dms;
2967 mov di,word ptr cs:[si+2] ;AN030;;get physical page value ;an000; dms;
2968
2969 ENDIF
2970
2971 Int_2F_5800_Good_Exit: ;AN030;
2972
2973 xor ax,ax ;AN030;;signal good return ;an000; dms;
2974 jmp Int_2F_Exit ;AN030;;exit routine ;an000; dms;
2975
2976 Int_2F_5800_Err_Exit: ;AN030;
2977
2978 mov ax,0ffffh ;AN030;;signal error ;an000; dms;
2979
2980 Int_2F_Exit: ;AN030;
2981
2982
2983 IF NOT BUFFERFLAG
2984 pop si ;AN030;;restore regs ;an000; dms;
2985 ENDIF
2986 iret ;AN030;;return to caller ;an000; dms;
2987
2988
2989
2990 ;-------------------------------------------------------------------
2991 ;
2992 ; INT 67h Filter
2993 ;
2994 ; This routine filters INT 67's looking for AH=58h. When initialized,
2995 ; the original INT 67 handler is called and the mappable address array
2996 ; is changed to "reserve" two pages for DOS use. This new array is
2997 ; then returned to the calling program when INT 67 AH=58h is found.
2998 ;
2999 ; Information about the two pages "reserved" for DOS is returned
3000 ; via an unpublished INT 2Fh interface.
3001 ;
3002 ; 5/10/88 for DOS 4.0.
3003 ;-------------------------------------------------------------------
3004
3005 IF NOT BUFFERFLAG
3006
3007 GetMappableArray equ 58h ; INT 67 function code for Get Mappable Array
3008 GetPageFrame equ 41h ; function code for getting the page frame address
3009 null equ 0 ; zero value
3010 I67Error8F equ 8fh ;AN031;; invalid sub-function error
3011
3012 ENDIF
3013
3014 ;-------------------------------------------------------------------
3015 NEW67_OFFSET equ $-EMS_STUB_START ;J.K.
3016 Int67Filter: ;AN030;
3017
3018 IF BUFFERFLAG
3019 ; int 3
3020 cmp byte ptr cs:LOCKFLAG, 1
3021 jne PassThru
3022 mov ah, 80h
3023 stc
3024 iret
3025 ELSE
3026 cmp ah,GETMAPPABLEARRAY ;AN030;; is this the INT 67 call we are interested in?
3027 jne PassThru ;AN030;; no, pass it to old INT 67 handler
3028 ;AN030;; yes ...
3029 cmp al,0 ;AN031;; AL=0 return count and table
3030 je I67Fcn0
3031
3032 cmp al,1 ;AN031;; AL=1 return count only
3033 jne I67Error ;AN031;; otherwise, error
3034
3035
3036 ; return count of mappable pages
3037
3038 sti ;AN031;; turn interrupts on
3039
3040 mov cx,word ptr cs:EMSPAGE_CNT ;AN031;J.K. get number of mappable pages in fake table
3041 xor ah,ah ;AN031;; good return code
3042 iret
3043
3044 ; return invalid sub-function code
3045
3046 I67Error:
3047 sti ;AN031;; turn interrupts on
3048 mov ah,I67Error8F ;AN031;; invalid sub-function error
3049 iret
3050
3051
3052 I67Fcn0: ;AN031
3053
3054 ; copy the fake table to user's buffer
3055
3056 sti ;AN030;; turn interrupts on
3057
3058 push ds ;AN030; save some regs
3059 push di ;AN030;
3060 push si ;AN030;
3061
3062 mov cx,word ptr cs:EMSPAGE_CNT ;AN030;J.K. get number of mappable pages in fake table
3063 shl cx,1 ;AN030;; count * 2 = number of words to copy
3064
3065 push cs ;AN030;; point DS:SI to fake table
3066 pop ds ;AN030;
3067 ; lea si,MappableArray
3068 mov si, MAPPABLEARRAY ;AN030;;J.K.
3069
3070 rep movsw ;AN030;; copy CX words from DS:SI to ES:DI
3071
3072 xor ah,ah ;AN030;; good return code
3073 mov cx,word ptr cs:EMSPAGE_CNT ;AN030;; page count returned to user in CX
3074
3075
3076 pop si ;AN030;; restore some regs
3077 pop di ;AN030;
3078 pop ds ;AN030;
3079
3080 iret ;AN030;; end of INT 67 filter routine
3081
3082 ENDIF
3083
3084 ;-------------------------------------------------------------------
3085 ;
3086 ; PassThru - send request to old INT 67 handler
3087 ;
3088 ;-------------------------------------------------------------------
3089
3090 PassThru:
3091 jmp dword ptr cs:OldINT67_VECTOR ;AN030;;J.K. jump to old INT 67 handler
3092 ; (IRET will return to calling program)
3093
3094
3095 EMS_STUB_END label byte ;AN030;
3096 ;-------------------------------------------------------------------
3097
3098 IF NOT BUFFERFLAG
3099 ;-------------------------------------------------------------------
3100 ;
3101 ; Int67FilterInit - This routine is called to initialize the INT 67
3102 ; filter. It should be called as soon as possible after installation.
3103 ;
3104 ;-------------------------------------------------------------------
3105
3106 Int67FilterInit: ;AN030;
3107 push es ;AN030;; save caller's ES:DI
3108 push di ;AN030;
3109
3110 push cs ;AN030;; make ES:DI point to our array
3111 pop es ;AN030;
3112 mov di,offset MappableArray_X ;AN030;
3113
3114 ; call dword ptr cs:OldInt67 ; get mappable array from EMS DD
3115
3116 mov ah, GetMappableArray ;AN030;
3117 xor al,al ;AN030;
3118 int 67h ;AN030;;J.K.
3119
3120
3121 ;------------------------
3122 ; scan table looking for highest phys_page_number
3123
3124 xor ax,ax ;AN030;;
3125
3126 cmp cx,0 ;AN033;; are the any pages left?
3127 je NoMoreEMSPages ;AN033;; no, don't bother looking any more
3128
3129 call GetHighestPage ;AN030;; get highest entry from table
3130
3131 mov EMSReservedArray_X+4,bx ;AN030;; phys_page_segment
3132 mov EMSReservedArray_X+6,ax ;AN030;; phys_page_number
3133
3134 cmp cx,0 ;AN033;; are the any pages left?
3135 je NoMoreEMSPages ;AN033;; no, don't bother looking any more
3136
3137 call GetHighestPage ;AN030;; get next highest entry from table
3138
3139 mov EMSReservedArray_X+0,bx ;AN030;; phys_page_segment
3140 mov EMSReservedArray_X+2,ax ;AN030;; phys_page_number
3141
3142 NoMoreEMSPages: ;AN033;;
3143 mov EMSPageCount,cx ;AN030;; save new page count for INT 67 filter
3144
3145 pop di
3146 pop es
3147 ret ;AN030;; return to calling program
3148
3149
3150 page
3151 ;-------------------------------------------------------------------
3152 ;
3153 ; GetHighestPage - returns highest physical page number in AX
3154 ; and segment for it in BX. A -1 means no valid page found.
3155 ;
3156 ;-------------------------------------------------------------------
3157 GetHighestPage:
3158
3159 xor ax,ax ;AN030;; zero candidate register
3160 mov bx,ax ;AN030;; zero pointer to candidate page
3161
3162 push cx ;AN030;; save count
3163 push dx ;AN030;
3164 push di ;AN030;; save pointer
3165
3166 PageScanLoop: ;AN030;
3167 cmp ax,ES:[di+2] ;AN030;; get phys_page_number
3168 ja LookAtNextPage ;AN030;; this one is lower than the one we are holding
3169
3170 cmp es:[di], 0a000h ; Only reserve pages in memory above 640K..
3171 jb LookAtNextPage ; fix for ps2emm and m20emm with motherboard
3172 ; disabled. 7/25/88. HKN.
3173
3174 mov ax,ES:[di+2] ;AN030;; this one is higher, make it new candidate
3175 mov bx,di ;AN030;; pointer to new candidate page, used to zero
3176 ; it later so we don't get the same one again
3177 mov dx,cx ;AN030;; save count where we found candidate
3178
3179 LookAtNextPage: ;AN030;
3180 add di,4 ;AN030;; point to next entry in mappable table
3181
3182 loop PageScanLoop ;AN030;; look at next entry
3183
3184 cmp bx,null ;AN030;; did we find any pages?
3185 jne FoundOne ;AN030;; yes, exit
3186
3187 jmp ReturnError ;AN030;
3188
3189 ;------------------------
3190 FoundOne: ;AN030;
3191 cmp ax,3 ;AN030;; could the one we found be part of a page frame
3192 ja NotFrame ;AN030;; no, carry on
3193
3194 ; yes, find out if it is part of frame
3195
3196 push ax ;AN030;; save physical page number
3197 push bx ;an030;; dms; bx destroyed by call
3198 mov ah,GetPageFrame ;AN030;; function code to get page frame ...
3199 ; call dword ptr cs:OldInt67 ; ... from the EMS DD
3200 int 67h ;AN030;;J.K.
3201 or ah,ah ;an030;;dms; error?
3202 pop bx ;an030;;dms; restore bx
3203 pop ax ;AN030;; restore phys page number
3204 jnz NotFrame ;AN030;; no frame available, carry on
3205
3206 ; there is a frame, this page is part of frame, so return -1's
3207
3208 ReturnError: ;AN030;
3209 mov ax,0ffffh ;AN030;; indicate failure
3210 mov bx,ax ;AN030;; ax and bx = -1
3211
3212 pop di ;AN030;; restore pointer
3213 pop dx
3214 pop cx ;AN030;; restore count
3215
3216 jmp GHPExit ;AN030;
3217
3218
3219
3220
3221 ;------------------------
3222 ; Found a page, and it is not part of a page frame, so re-pack table
3223 ; and return info. The entry we "reserve" for DOS must be removed
3224 ; from the table and the other entries moved up to repack the table.
3225 ; The count must be reduced by 1 to reflect this change.
3226
3227 Notframe: ;AN030;
3228
3229 mov di,bx ;AN030;; make ES:DI point to highest page table entry
3230
3231 mov bx,ES:[di] ;AN030;; get segment address of page
3232
3233 mov cx,dx ;AN030;; get count from candidate page
3234
3235 push ax ;AN030;
3236 PackLoop: ;AN030;
3237 mov ax, es:[di+4] ;AN030;
3238 mov es:[di+0], ax ;AN030;
3239 mov ax, es:[di+6] ;AN030;
3240 mov es:[di+2], ax ;AN030;
3241 add di, 4 ;AN030;
3242 loop PackLoop ;AN030;; do it until done
3243 pop ax ;AN030;
3244
3245 pop di ;AN030;; restore pointer
3246 pop dx ;AN030;
3247 pop cx ;AN030;; restore count
3248
3249 sub cx,1 ;AN030;; reduce count by one, one less page in table now
3250
3251 GHPExit: ;AN030;
3252
3253 ret ;AN030;; return to caller
3254
3255 ENDIF
3256
3257 ;=========================================================================
3258 ; EMS_Install_Check : THIS MODULE DETERMINES WHETHER OR NOT EMS IS
3259 ; INSTALLED FOR THIS SESSION.
3260 ;
3261 ; INPUTS : NONE
3262 ;
3263 ; OUTPUTS : ES:BX - FRAME ARRAY
3264 ; CY - EMS NOT AVAILABLE
3265 ; NC - EMS AVAILABLE
3266 ;
3267 ; Date : 5/6/88
3268 ;=========================================================================
3269
3270 EMS_Install_Check proc near ;AN030;; check if EMS is installed ;an000; dms;
3271
3272 push ax ;AN030;; save regs ;an000; dms;
3273
3274 push ds ;AN030;; save ds ;an000; dms;
3275 xor ax,ax ;AN030;; set ax to 0 ;an000; dms;
3276 mov ds,ax ;AN030;; set ds to 0 ;an000; dms;
3277 cmp ds:word ptr[067h*4+0],0 ;AN030;; see if int 67h is there ;an000; dms;
3278 pop ds ;AN030;; restore ds ;an000; dms;
3279 je EMS_Install_Ck_Err_Exit ;AN030;; exit routine - EMS not loaded ;an000; dms;
3280
3281 mov ah,40h ;AN030;; Get Status function ;an000; dms;
3282 xor al,al ;AN030;; clear al ;an000; dms;
3283 int 67h ;AN030;; ;an000; dms;
3284 or ah,ah ;AN030;; EMS installed? ;an000; dms;
3285 jnz EMS_Install_Ck_Err_Exit ;AN030;; exit routine - EMS not loaded ;an000; dms;
3286
3287 mov ah,46h ;AN030;; Get Version number ;an000; dms;
3288 xor al,al ;AN030;; clear al ;an000; dms;
3289 int 67h ;AN030;; ;an000; dms;
3290 cmp al,40h ;AN030;; Version 4.0? ;an000; dms;
3291 jb EMS_Install_Ck_Err_Exit ;AN030;; exit routine - wrong EMS loaded ;an000; dms;
3292
3293 clc ;AN030;; signal EMS loaded ;an000; dms;
3294 jmp EMS_Install_Ck_Exit ;AN030;; exit routine ;an000; dms;
3295
3296 EMS_Install_Ck_Err_Exit: ;AN030;
3297
3298 stc ;AN030;; signal EMS not loaded ;an000; dms;
3299
3300 EMS_Install_Ck_Exit: ;AN030;
3301
3302 pop ax ;AN030;; restore regs ;an000; dms;
3303
3304 ret ;AN030;; return to caller ;an000; dms;
3305
3306 EMS_Install_Check endp ; ;an000; dms;
3307
3308 EMS_Stub_Handler proc near ;AN030;
3309 ;At the request of Architecture Group, this logic is implemented.
3310 ;Function: If (Buffer_Slash_X <> 0 and EMS_Stub_Installed == 0),
3311 ; then { call Chk_EMS;
3312 ; if EMS is there, then install EMS_Stub dynamically
3313 ; and initialize it.}
3314 ; Note: EMS_Stub consists of INT 2fh EMS handler and INT 67h handler.
3315 ; When EMS_Stub is installed, EMS_Stub_Installed will be set to 1.
3316
3317 push es ;AN030;
3318 push si ;AN030;
3319 push ds ;AN030;
3320 push di ;AN030;
3321 push ax ;AN030;
3322 push cx ;AN030;
3323 cmp EMS_Stub_Installed, 0 ;AN030;
3324 je EMS_Stub_X ;AN030;
3325 jmp EMS_SH_Ret ;AN030;
3326 EMS_Stub_X: ;AN030;
3327 cmp Buffer_Slash_X, 0 ;AN030;
3328 je EMS_SH_Ret ;AN030;
3329 call EMS_Install_Check ;AN030;
3330 jc EMS_SH_Ret ;AN030;
3331 ;Install EMS_Stub. ;AN030;
3332 EMS_Stub_Do:
3333 push es ;AN030;
3334 xor ax,ax ;AN030;save current Int 2fh, 67h vectors.
3335 mov es, ax ;AN030;
3336 mov ax, word ptr es:[2fh*4] ;AN030;
3337 mov IntV2FO, ax ;AN030;
3338 mov ax, word ptr es:[2fh*4+2] ;AN030;
3339 mov IntV2FS, ax ;AN030;
3340 mov ax, word ptr es:[67h*4] ;AN030;
3341 mov word ptr cs:[OldInt67], ax ;AN030;
3342 mov ax, word ptr es:[67h*4+2] ;AN030;
3343 mov word ptr cs:[OldInt67+2], ax ;AN030;
3344 pop es ;AN030;
3345
3346 IF NOT BUFFERFLAG
3347 ;initalize tables in INT 67h handler
3348 call Int67FilterInit ;AN030;
3349 cmp ax, 0ffffh ; if the page found was part of a lim 4.0 page frame
3350 je EMS_SH_ret ; do not install stub. 7/24/88. HKN
3351 ENDIF
3352 call Round ;AN030;
3353 mov ax, DEVMARK_EMS_STUB ;AN030;
3354 call SetDevMark ;AN030;
3355 mov ax, [memhi] ;AN030;
3356 mov es, ax ;AN030;
3357 assume es:nothing ;AN030;
3358 xor di, di ;AN030;
3359 push cs ;AN030;
3360 pop ds ;AN030;
3361 mov cx, offset EMS_STUB_END ;AN030;
3362 mov si, offset EMS_STUB_START ;AN030;
3363 sub cx, si ;AN030;cx = size in byte
3364 mov [memlo], cx ;AN030;
3365 rep movsb ;AN030;
3366 or [SetDevMarkFlag], FOR_DEVMARK ;AN030;set the devmark_size for MEM command.
3367 call Round ;AN030;and get the next [memhi] avaiable.
3368 mov EMS_Stub_Installed, 1 ;AN030;
3369
3370 xor ax, ax ;AN030;
3371 mov ds, ax ;AN030;
3372 cli ;AN030;
3373 mov word ptr ds:[2Fh*4],NEWEMS2F_OFF;AN030;set the new int 2fh, 67h vectors.
3374 mov word ptr ds:[2Fh*4+2], es ;AN030;
3375 mov word ptr ds:[67h*4],NEW67_OFFSET;AN030;
3376 mov word ptr ds:[67h*4+2], es ;AN030;
3377 sti ;AN030;
3378 EMS_SH_Ret: ;AN030;
3379 pop cx ;AN030;
3380 pop ax ;AN030;
3381 pop di ;AN030;
3382 pop ds ;AN030;
3383 pop si ;AN030;
3384 pop es ;AN030;
3385 ret ;AN030;
3386
3387 EMS_Stub_Handler endp ;AN030;
3388
3389
3390 SYSINITSEG ENDS
3391 END
3392 \1a