summaryrefslogtreecommitdiff
path: root/v2.0/source/INIT.ASM
diff options
context:
space:
mode:
authorGravatar Rich Turner1983-08-12 17:53:34 -0700
committerGravatar Rich Turner2018-09-21 17:53:34 -0700
commit80ab2fddfdf30f09f0a0a637654cbb3cd5c7baa6 (patch)
treeee4357f7f3dd0f2ded59b9c6e7384432d85e7ec9 /v2.0/source/INIT.ASM
parentMS-DOS v1.25 Release (diff)
downloadms-dos-80ab2fddfdf30f09f0a0a637654cbb3cd5c7baa6.tar.gz
ms-dos-80ab2fddfdf30f09f0a0a637654cbb3cd5c7baa6.tar.xz
ms-dos-80ab2fddfdf30f09f0a0a637654cbb3cd5c7baa6.zip
MS-DOS v2.0 Release
Diffstat (limited to 'v2.0/source/INIT.ASM')
-rw-r--r--v2.0/source/INIT.ASM939
1 files changed, 939 insertions, 0 deletions
diff --git a/v2.0/source/INIT.ASM b/v2.0/source/INIT.ASM
new file mode 100644
index 0000000..0ea86f5
--- /dev/null
+++ b/v2.0/source/INIT.ASM
@@ -0,0 +1,939 @@
1TITLE COMMAND Initialization
2
3 INCLUDE COMSW.ASM
4
5.xlist
6.xcref
7 INCLUDE DOSSYM.ASM
8 INCLUDE DEVSYM.ASM
9 INCLUDE COMSEG.ASM
10.list
11.cref
12
13 INCLUDE COMEQU.ASM
14
15ENVIRONSIZ EQU 0A0H ;Must agree with values in EVIRONMENT segment
16ENVIRONSIZ2 EQU 092H
17
18CODERES SEGMENT PUBLIC
19 EXTRN RSTACK:WORD,SETVECT:NEAR,LODCOM:NEAR,CONTC:NEAR,INT_2E:NEAR
20 EXTRN LOADCOM:NEAR,CHKSUM:NEAR
21
22 IF IBMVER
23 EXTRN EXECHK:NEAR,SYSCALL:NEAR
24 ENDIF
25
26CODERES ENDS
27
28DATARES SEGMENT PUBLIC
29 EXTRN DATARESEND:BYTE,LTPA:WORD,MYSEG:WORD,MYSEG1:WORD,MYSEG2:WORD
30 EXTRN MEMSIZ:WORD,TRNSEG:WORD,ENVIRSEG:WORD,RSWITCHAR:BYTE
31 EXTRN COMDRV:BYTE,COMLET:BYTE,PERMCOM:BYTE,SINGLECOM:WORD
32 EXTRN PARENT:WORD,IO_SAVE:WORD,COM_PTR:DWORD,COM_FCB1:DWORD
33 EXTRN COM_FCB2:DWORD,SUM:WORD,BATCH:WORD,COMSPEC:BYTE
34
35 IF IBMVER
36 EXTRN SYS_CALL:DWORD,EXESEG:WORD,EXESUM:WORD
37 ENDIF
38
39DATARES ENDS
40
41ENVIRONMENT SEGMENT PUBLIC
42 EXTRN ENVIREND:BYTE,PATHSTRING:BYTE,ECOMSPEC:BYTE
43ENVIRONMENT ENDS
44
45TRANCODE SEGMENT PUBLIC
46 EXTRN DATINIT:FAR
47TRANCODE ENDS
48
49TRANSPACE SEGMENT PUBLIC
50 EXTRN TRANSPACEEND:BYTE
51TRANSPACE ENDS
52
53ZEXEC_DATA SEGMENT PUBLIC
54 IF IBM
55 EXTRN ZEXECDATAEND:BYTE
56 ENDIF
57ZEXEC_DATA ENDS
58
59; *******************************************************************
60; START OF INIT PORTION
61; This code is overlayed the first time the TPA is used.
62
63INIT SEGMENT PUBLIC PARA
64
65 EXTRN HEADER:BYTE
66 EXTRN BADCOMLKMES:BYTE
67
68 PUBLIC CONPROC
69
70ASSUME CS:RESGROUP,DS:RESGROUP,ES:RESGROUP,SS:RESGROUP
71
72 ORG 0
73ZERO = $
74
75CONPROC:
76 MOV SP,OFFSET RESGROUP:RSTACK
77
78 IF HIGHMEM
79 MOV BX,WORD PTR DS:[PDB_block_len]
80 MOV AX,OFFSET RESGROUP:ENVIREND + 15
81 MOV CL,4
82 SHR AX,CL
83 PUSH AX ; Save size to alloc
84 INC AX ; Plus one for arena
85 SUB BX,AX ; Subtract size of resident
86 MOV WORD PTR DS:[PDB_block_len],BX
87 MOV AX,CS
88 SUB BX,AX
89 MOV AH,SETBLOCK
90 INT 21H
91 POP BX ; Get back size to alloc
92 MOV AH,ALLOC
93 INT 21H
94 MOV [REALRES],AX
95 MOV ES,AX
96 XOR SI,SI
97 MOV DI,SI
98 MOV CX,OFFSET RESGROUP:ENVIREND
99 SHR CX,1 ; Length of resident and environment in words
100 ; Last byte doesn't matter
101 REP MOVSW ; Move to end of memory
102 MOV DS,AX
103 MOV BX,AX
104 MOV AH,SET_CURRENT_PDB
105 INT 21H
106 MOV AX,BX
107 MOV BX,OFFSET RESGROUP:DATARESEND + 15
108 MOV CL,4
109 SHR BX,CL ; BX is size for SETBLOCK
110 MOV WORD PTR DS:[PDB_block_len],BX
111 ADD WORD PTR DS:[PDB_block_len],AX
112 MOV [LTPA],CS
113 MOV AH,SETBLOCK
114 INT 21H ;Shrink to not include environment
115 MOV BX,(ENVIRONSIZ + 15) / 16
116 MOV AH,ALLOC
117 INT 21H ;Allocate the environment
118 MOV [ENVIRSEG],AX
119 MOV CS:[ENVIRSEGSAV],AX
120 MOV ES,AX
121ASSUME ES:ENVIRONMENT
122 XOR DI,DI
123 MOV SI,OFFSET RESGROUP:PATHSTRING
124 MOV CX,ENVIRONSIZ
125 REP MOVSB
126 MOV AX,WORD PTR CS:[PDB_block_len]
127 ENDIF
128
129 IF NOT HIGHMEM
130 MOV AX,OFFSET RESGROUP:ENVIREND + 15
131 MOV CL,4
132 SHR AX,CL
133 MOV CX,CS
134 ADD AX,CX ; Compute segment of TPA
135 MOV [LTPA],AX ; Good enough for the moment
136 MOV AX,WORD PTR DS:[PDB_block_len]
137 ENDIF
138
139 MOV [MYSEG1],DS
140 MOV [MYSEG2],DS
141 MOV [MYSEG],DS
142 MOV [MEMSIZ],AX
143
144 MOV DX,OFFSET TRANGROUP:TRANSPACEEND + 15
145 MOV CL,4
146 SHR DX,CL
147
148 IF IBM
149 PUSH DX
150 MOV DX,OFFSET EGROUP:ZEXECDATAEND + 15
151 MOV CL,4
152 SHR DX,CL
153 POP CX
154 ADD DX,CX
155 ENDIF
156
157 SUB AX,DX
158 MOV [TRNSEG],AX ; Read it in here
159 MOV AX,DS:[PDB_environ]
160 OR AX,AX
161 JZ BUILDENV ; Need to make an environment
162
163 IF HIGHMEM
164 INC BYTE PTR CS:[CHUCKENV] ; Flag no ENVIRONSEG
165 ELSE
166 INC BYTE PTR [CHUCKENV] ; Flag no ENVIRONSEG
167 ENDIF
168
169 JMP SHORT ENVIRONPASSED
170
171BUILDENV:
172
173 IF NOT HIGHMEM
174 MOV AX,OFFSET RESGROUP:PATHSTRING ; Figure environment pointer
175 MOV CL,4
176 SHR AX,CL
177 MOV DX,DS
178 ADD AX,DX
179 ELSE
180 JMP SHORT GOTTHEENVIR
181 ENDIF
182
183ENVIRONPASSED:
184 MOV [ENVIRSEG],AX
185
186 IF HIGHMEM
187 DEC AX
188 MOV ES,AX
189 INC AX
190 MOV ES:[arena_owner],DS ; Adjust owner of passed envir
191 ENDIF
192
193 MOV ES,AX
194ASSUME ES:ENVIRONMENT
195
196GOTTHEENVIR:
197 MOV AX,CHAR_OPER SHL 8
198 INT int_command
199 MOV [RSWITCHAR],DL
200
201 CMP DL,'/'
202 JNZ IUSESLASH
203
204 IF HIGHMEM
205 MOV CS:[COMSPECT],'\'
206 ELSE
207 MOV [COMSPECT],'\'
208 ENDIF
209
210 IF HIGHMEM
211 CMP BYTE PTR CS:[CHUCKENV],0
212 ELSE
213 CMP BYTE PTR [CHUCKENV],0
214 ENDIF
215
216 JNZ IUSESLASH
217
218 MOV ES:[ECOMSPEC-10H],'\'
219IUSESLASH:
220
221IF IBMVER
222 PUSH ES
223 MOV AX,(Get_interrupt_vector SHL 8) + int_command
224 INT int_command
225 MOV WORD PTR [SYS_CALL],BX
226 MOV WORD PTR [SYS_CALL+2],ES
227 MOV DX,OFFSET RESGROUP:SYSCALL
228 MOV AX,(Set_interrupt_vector SHL 8) + int_command
229 INT int_command
230 POP ES
231ENDIF
232
233 MOV AL,BYTE PTR DS:[FCB] ; get drive spec for default
234 MOV AH,DRVCHAR
235 MOV [COMDRV],AL
236 ADD AL,40H ; Convert to letter
237 CMP AL,40H
238 JZ NOCOMDRV
239 STD
240 IF HIGHMEM
241 CMP BYTE PTR CS:[CHUCKENV],0
242 ELSE
243 CMP BYTE PTR [CHUCKENV],0
244 ENDIF
245
246 JNZ NOTWIDENV
247
248 PUSH DS
249 PUSH ES
250 POP DS
251 MOV DI,OFFSET ENVIRONMENT:ECOMSPEC + ENVIRONSIZ2 - 1 - 10H
252 MOV SI,OFFSET ENVIRONMENT:ECOMSPEC + ENVIRONSIZ2 - 3 - 10H
253 MOV CX,ENVIRONSIZ2 - 2
254 REP MOVSB
255
256 POP DS
257 MOV WORD PTR ES:[ECOMSPEC-10H],AX
258
259NOTWIDENV:
260 CLD
261 IF HIGHMEM
262 MOV WORD PTR CS:[AUTOBAT],AX
263 ELSE
264 MOV WORD PTR [AUTOBAT],AX
265 ENDIF
266
267 MOV [COMLET],AL
268NOCOMDRV:
269 CALL SETVECT ; Set the vectors
270
271 MOV SI,80H
272 LODSB
273 MOV CL,AL
274 XOR CH,CH
275 JCXZ COMRETURNSJ ; No parameters
276 MOV SI,81H ; Start of parms
277CHKARG:
278 LODSB
279 CMP AL,' '
280 JZ NEXTCH
281 CMP AL,9 ; Tab only other delimiter
282 JZ NEXTCH
283 CMP AL,[RSWITCHAR] ; Switch?
284 JNZ CHKOTHERARGS ; No
285 DEC CX
286 JCXZ ARGSDONEJ ; oops
287 LODSB
288 OR AL,20H ; Lower case
289 CMP AL,'p' ; PERMCOM switch
290 JNZ NEXTCH
291 JMP SETPERM
292
293NEXTCH:
294 CMP AL,'d'
295 JNZ NEXTCH3
296
297 IF HIGHMEM
298 MOV BYTE PTR CS:[PRDATTM],1 ; User explicitly says no date time
299 ELSE
300 MOV BYTE PTR [PRDATTM],1 ; User explicitly says no date time
301 ENDIF
302
303 LOOP CHKARG
304 JMP SHORT ARGSDONEJ
305NEXTCH3:
306 CMP AL,'c'
307 JNZ NEXTCH2 ; SINGLECOM switch 2
308 MOV [SINGLECOM],SI ; Point to the rest of the command line
309 MOV [PERMCOM],0 ; A SINGLECOM must not be a PERMCOM
310
311 IF HIGHMEM
312 MOV BYTE PTR CS:[PRDATTM],1 ; No date or time either, explicit
313 ELSE
314 MOV BYTE PTR [PRDATTM],1 ; No date or time either, explicit
315 ENDIF
316
317ARGSDONEJ:
318 JMP ARGSDONE
319
320NEXTCH2:
321 LOOP CHKARG
322
323COMRETURNSJ:
324 JMP COMRETURNS
325
326CHKOTHERARGS:
327 DEC SI
328 MOV DX,SI
329 PUSH CX
330 PUSH SI
331CONTRLOOP:
332 LODSB
333 DEC CX
334 CMP AL,' '
335 JZ SETCDEV
336 CMP AL,9
337 JZ SETCDEV
338 JCXZ SETCDEVA
339 JMP SHORT CONTRLOOP
340
341SETCDEVA:
342 INC SI
343SETCDEV:
344 MOV BYTE PTR [SI-1],0
345 MOV AX,(OPEN SHL 8) OR 2 ; Read and write
346 INT int_command
347 JC CHKSRCHSPEC ; Wasn't a file
348 MOV BX,AX
349 MOV AX,IOCTL SHL 8
350 INT int_command
351 TEST DL,80H
352 JNZ ISADEVICE
353 MOV AH,CLOSE ; Close initial handle, wasn't a device
354 INT int_command
355 JMP CHKSRCHSPEC
356
357ISADEVICE:
358 XOR DH,DH
359 OR DL,3 ; Make sure has CON attributes
360 MOV AX,(IOCTL SHL 8) OR 1
361 INT int_command
362 MOV DX,BX ; Save new handle
363 POP BX ; Throw away saved SI
364 POP BX ; Throw away saved CX
365 PUSH CX
366 MOV CX,3
367 XOR BX,BX
368RCCLLOOP: ; Close 0,1 and 2
369 MOV AH,CLOSE
370 INT int_command
371 INC BX
372 LOOP RCCLLOOP
373 MOV BX,DX ; New device handle
374 MOV AH,XDUP
375 INT int_command ; Dup to 0
376 MOV AH,XDUP
377 INT int_command ; Dup to 1
378 MOV AH,XDUP
379 INT int_command ; Dup to 2
380 MOV AH,CLOSE
381 INT int_command ; Close initial handle
382 POP CX
383 JCXZ ARGSDONEJ2
384 JMP CHKARG
385
386CHKSRCHSPEC: ; Not a device, so must be directory spec
387
388 IF HIGHMEM
389 MOV BYTE PTR CS:[CHUCKENV],0 ; If search specified -- no inheritance
390 MOV AX,CS:[ENVIRSEGSAV]
391 MOV [ENVIRSEG],AX
392 ELSE
393 MOV BYTE PTR [CHUCKENV],0 ; If search specified -- no inheritance
394 MOV AX,OFFSET RESGROUP:PATHSTRING ; Figure environment pointer
395 MOV CL,4
396 SHR AX,CL
397 MOV DX,DS
398 ADD AX,DX
399 MOV [ENVIRSEG],AX
400 ENDIF
401
402 MOV ES,AX
403 MOV BYTE PTR [SI-1],' '
404 POP SI ; Remember location
405 POP CX ; and count
406
407 IF HIGHMEM
408 MOV DI,CS:[ECOMLOC]
409 ELSE
410 MOV DI,[ECOMLOC]
411 ENDIF
412
413COMTRLOOP:
414 LODSB
415 DEC CX
416 CMP AL,' '
417 JZ SETCOMSR
418 CMP AL,9
419 JZ SETCOMSR
420 STOSB
421
422 IF KANJI
423 XOR AH,AH
424 ENDIF
425
426 JCXZ SETCOMSR
427
428 IF KANJI
429 CALL ITESTKANJ
430 JZ COMTRLOOP
431 DEC CX
432 MOVSB
433 INC AH
434 JCXZ SETCOMSR
435 ENDIF
436
437 JMP SHORT COMTRLOOP
438
439SETCOMSR:
440 PUSH SI
441 PUSH CX
442
443 PUSH DS
444
445 IF HIGHMEM
446 PUSH CS
447 POP DS
448 ENDIF
449
450 MOV SI,OFFSET RESGROUP:COMSPECT
451 MOV CX,14
452
453 MOV AL,ES:[DI-1]
454
455 IF KANJI
456 OR AH,AH
457 JNZ INOTROOT ; Last char was KANJI second byte, might be '\'
458 ENDIF
459
460 CALL PATHCHRCMPR
461 JNZ INOTROOT
462 INC SI ; Don't make a double /
463 DEC CX
464INOTROOT:
465 REP MOVSB
466
467 MOV DX,[ECOMLOC] ; Now lets make sure its good!
468 PUSH ES
469 POP DS
470
471 MOV AX,OPEN SHL 8
472 INT int_command ; Open COMMAND.COM
473 POP DS
474 JC SETCOMSRBAD ; No COMMAND.COM here
475 MOV BX,AX ; Handle
476 MOV AH,CLOSE
477 INT int_command ; Close COMMAND.COM
478SETCOMSRRET:
479 POP CX
480 POP SI
481ARGSDONEJ2:
482 JCXZ ARGSDONE
483 JMP CHKARG
484
485SETCOMSRBAD:
486
487 IF HIGHMEM
488 PUSH DS
489 PUSH CS
490 POP DS
491 ENDIF
492
493 MOV DX,OFFSET RESGROUP:BADCOMLKMES
494 MOV AH,STD_CON_STRING_OUTPUT
495 INT int_command
496 MOV SI,OFFSET RESGROUP:COMSPECT
497 MOV DI,[ECOMLOC]
498 MOV CX,14
499 REP MOVSB ; Get my default back
500
501 IF HIGHMEM
502 POP DS
503 ENDIF
504
505 JMP SHORT SETCOMSRRET
506
507CHKARGJ:
508 JMP CHKARG
509
510SETPERM:
511 INC [PERMCOM]
512
513 IF HIGHMEM
514 CMP BYTE PTR CS:[PRDATTM],-1
515 ELSE
516 CMP BYTE PTR [PRDATTM],-1
517 ENDIF
518
519 JNZ LOOPIT
520
521 IF HIGHMEM
522 MOV BYTE PTR CS:[PRDATTM],0 ; If not set explicit, set to prompt
523 ELSE
524 MOV BYTE PTR [PRDATTM],0 ; If not set explicit, set to prompt
525 ENDIF
526
527LOOPIT:
528 LOOP CHKARGJ
529ARGSDONE:
530 CMP [PERMCOM],0
531 JZ COMRETURNS
532 PUSH ES ; Save environment pointer
533 MOV AH,SET_CURRENT_PDB
534 MOV BX,DS
535 MOV ES,BX
536 INT int_command ; Current process is me
537 MOV DI,PDB_Exit ; Diddle the addresses in my header
538 MOV AX,OFFSET RESGROUP:LODCOM
539 STOSW
540 MOV AX,DS
541 STOSW
542 MOV AX,OFFSET RESGROUP:CONTC
543 STOSW
544 MOV AX,DS
545 STOSW
546 MOV WORD PTR DS:[PDB_Parent_PID],DS ; Parent is me forever
547 MOV DX,OFFSET RESGROUP:INT_2E
548 MOV AX,(SET_INTERRUPT_VECTOR SHL 8) OR 02EH
549 INT int_command ;Set magic interrupt
550 POP ES ;Remember environment
551COMRETURNS:
552 MOV AX,WORD PTR DS:[PDB_Parent_PID]
553 MOV [PARENT],AX ; Save parent
554 MOV WORD PTR DS:[PDB_Parent_PID],DS ; Parent is me
555 MOV AX,WORD PTR DS:[PDB_JFN_Table]
556 MOV [IO_SAVE],AX ; Get the default stdin and out
557 MOV WORD PTR [COM_PTR+2],DS ; Set all these to resident
558 MOV WORD PTR [COM_FCB1+2],DS
559 MOV WORD PTR [COM_FCB2+2],DS
560 MOV DI,OFFSET RESGROUP:COMSPEC
561
562 IF HIGHMEM
563 MOV SI,CS:[ECOMLOC]
564 CMP BYTE PTR CS:[CHUCKENV],0
565 ELSE
566 MOV SI,[ECOMLOC]
567 CMP BYTE PTR [CHUCKENV],0
568 ENDIF
569
570 MOV AX,DS ; XCHG ES,DS
571 PUSH ES
572 POP DS
573 MOV ES,AX
574
575 JZ COPYCOMSP ; All set up for copy
576
577 PUSH CS
578 POP DS
579
580 MOV SI,OFFSET RESGROUP:COMSPSTRING
581 PUSH ES
582 PUSH DI
583 CALL IFINDE
584 MOV SI,DI
585 PUSH ES
586 POP DS
587 POP DI
588 POP ES
589 JNC COPYCOMSP
590COMSPECNOFND:
591
592 IF HIGHMEM
593 MOV DS,CS:[ENVIRSEG]
594 MOV SI,CS:[ECOMLOC]
595 ELSE
596 MOV SI,[ECOMLOC]
597 ADD SI,OFFSET RESGROUP:PATHSTRING
598 PUSH CS
599 POP DS
600 ENDIF
601
602COPYCOMSP:
603 LODSB
604 STOSB
605 OR AL,AL
606 JNZ COPYCOMSP
607
608 IF HIGHMEM
609 MOV DS,CS:[REALRES]
610 PUSH CS
611 POP ES
612 MOV AH,DEALLOC
613 INT 21H
614 CMP BYTE PTR CS:[CHUCKENV],0
615 JZ GOTENVIR ; Environment is ok
616 MOV ES,CS:[ENVIRSEGSAV]
617 MOV AH,DEALLOC
618 INT 21H
619 ELSE
620 PUSH CS
621 POP DS
622 MOV BX,OFFSET RESGROUP:DATARESEND + 15
623 MOV CL,4
624 SHR BX,CL
625 MOV AH,SETBLOCK
626 INT int_command ; Shrink me to the resident only
627 CMP BYTE PTR [CHUCKENV],0
628 JNZ GOTENVIR ; Environment was passed
629 MOV BX,(ENVIRONSIZ + 15) /16
630 MOV AH,ALLOC
631 INT int_command ; "ALLOCATE" the environment
632 MOV DS,[ENVIRSEG]
633 MOV [ENVIRSEG],AX
634 MOV ES,AX
635 XOR SI,SI
636 MOV DI,SI
637 MOV CX,ENVIRONSIZ
638 REP MOVSB
639 PUSH CS
640 POP DS
641 ENDIF
642
643GOTENVIR:
644 CALL LOADCOM ; Load the transient in the right place
645 CALL CHKSUM ; Compute the checksum
646 MOV [SUM],DX ; Save it
647IF IBM
648 MOV AX,[MEMSIZ]
649 MOV DX,OFFSET EGROUP:ZEXECDATAEND + 15
650 MOV CL,4
651 SHR DX,CL
652 SUB AX,DX
653 MOV [EXESEG],AX
654 CALL EXECHK
655 MOV [EXESUM],DX
656ENDIF
657 IF MSVER
658 CMP [SINGLECOM],0
659 JNZ NOPHEAD ; Don't print header if SINGLECOM
660 IF HIGHMEM
661 PUSH DS
662 PUSH CS
663 POP DS
664 ENDIF
665 MOV DX,OFFSET RESGROUP:HEADER
666 MOV AH,STD_CON_STRING_OUTPUT
667 INT int_command
668 IF HIGHMEM
669 POP DS
670 ENDIF
671NOPHEAD:
672 ENDIF
673
674 IF HIGHMEM
675 CMP BYTE PTR CS:[PRDATTM],0
676 ELSE
677 CMP BYTE PTR [PRDATTM],0
678 ENDIF
679
680 JNZ NODTTM ; Don't do AUTOEXEC or date time
681 MOV BX,3 ; 48 BYTES ENOUGH
682 MOV AH,ALLOC
683 INT int_command
684 JC DODTTM ; PRETEND NO BATCH
685 MOV [BATCH],AX
686 MOV ES,AX
687 XOR DI,DI
688
689 IF HIGHMEM
690 CMP BYTE PTR CS:[AUTOBAT],0
691 ELSE
692 CMP BYTE PTR [AUTOBAT],0
693 ENDIF
694
695 JNZ NOAUTSET
696 MOV AH,GET_DEFAULT_DRIVE
697 INT int_command
698 ADD AL,'A'
699
700 IF HIGHMEM
701 MOV CS:[AUTOBAT],AL
702 ELSE
703 MOV [AUTOBAT],AL
704 ENDIF
705
706NOAUTSET:
707
708 IF HIGHMEM
709 PUSH DS
710 PUSH CS
711 POP DS
712 ENDIF
713
714 MOV SI,OFFSET RESGROUP:AUTOBAT
715 MOV CX,8
716 REP MOVSW ; NAME
717 MOV AX,-1
718 MOV CL,10
719 REP STOSW ; PARMS
720 MOV DX,OFFSET RESGROUP:AUTOBAT
721 MOV AX,OPEN SHL 8
722 INT int_command ; See if AUTOEXEC.BAT exists
723 JC NOABAT
724 MOV BX,AX
725 MOV AH,CLOSE
726 INT int_command
727
728 IF HIGHMEM
729 POP DS
730 ENDIF
731
732 JMP SHORT DRV0
733
734NOABAT:
735
736 IF HIGHMEM
737 POP DS
738 ENDIF
739
740 MOV ES,[BATCH] ; Not found--turn off batch job
741 MOV AH,DEALLOC
742 INT int_command
743 MOV [BATCH],0 ; AFTER DEALLOC in case of ^C
744DODTTM:
745
746 IF HIGHMEM
747 MOV AX,OFFSET TRANGROUP:DATINIT
748 MOV WORD PTR CS:[INITADD],AX
749 MOV AX,[TRNSEG]
750 MOV WORD PTR CS:[INITADD+2],AX
751 CALL DWORD PTR CS:[INITADD]
752 ELSE
753 MOV AX,OFFSET TRANGROUP:DATINIT
754 MOV WORD PTR[INITADD],AX
755 MOV AX,[TRNSEG]
756 MOV WORD PTR[INITADD+2],AX
757 CALL DWORD PTR [INITADD]
758 ENDIF
759
760NODTTM:
761
762 IF IBMVER
763 CMP [SINGLECOM],0
764 JNZ DRV0 ; Don't print header if SINGLECOM
765 MOV DX,OFFSET RESGROUP:HEADER
766 MOV AH,STD_CON_STRING_OUTPUT
767 INT int_command
768 ENDIF
769
770DRV0:
771 IF HIGHMEM
772 PUSH DS
773 MOV AX,OFFSET RESGROUP:LODCOM
774 PUSH AX
775MQQ PROC FAR
776 RET
777MQQ ENDP
778 ELSE
779 JMP LODCOM ; Allocate the transient
780 ENDIF
781
782PATHCHRCMPR:
783 CMP [RSWITCHAR],'/'
784 JZ RNOSLASHT
785 CMP AL,'/'
786 JZ RET41
787RNOSLASHT:
788 CMP AL,'\'
789RET41:
790 RET
791
792
793IFINDE:
794 CALL IFIND ; FIND THE NAME
795 JC IFIND2 ; CARRY MEANS NOT FOUND
796 JMP ISCASB1 ; SCAN FOR = SIGN
797;
798; On return of FIND1, ES:DI points to beginning of name
799;
800IFIND:
801 CLD
802
803 CALL ICOUNT0 ; CX = LENGTH OF NAME
804
805 IF HIGHMEM
806 MOV ES,CS:[REALRES]
807ASSUME ES:RESGROUP
808 MOV ES,ES:[ENVIRSEG]
809ASSUME ES:NOTHING
810 ELSE
811 MOV ES,[ENVIRSEG]
812 ENDIF
813
814 XOR DI,DI
815IFIND1:
816 PUSH CX
817 PUSH SI
818 PUSH DI
819IFIND11:
820 LODSB
821
822 IF KANJI
823 CALL ITESTKANJ
824 JZ NOTKANJ4
825 DEC SI
826 LODSW
827 INC DI
828 INC DI
829 CMP AX,ES:[DI-2]
830 JNZ IFIND12
831 DEC CX
832 LOOP IFIND11
833 JMP SHORT IFIND12
834
835NOTKANJ4:
836 ENDIF
837
838 CALL IUPCONV
839 INC DI
840 CMP AL,ES:[DI-1]
841 JNZ IFIND12
842 LOOP IFIND11
843IFIND12:
844 POP DI
845 POP SI
846 POP CX
847 JZ IFIND2
848 PUSH CX
849 CALL ISCASB2 ; SCAN FOR A NUL
850 POP CX
851 CMP BYTE PTR ES:[DI],0
852 JNZ IFIND1
853 STC ; INDICATE NOT FOUND
854IFIND2:
855 RET
856
857ICOUNT0:
858 PUSH DS
859 POP ES
860 MOV DI,SI
861
862 PUSH DI ; COUNT NUMBER OF CHARS UNTIL "="
863 CALL ISCASB1
864 JMP SHORT ICOUNTX
865 PUSH DI ; COUNT NUMBER OF CHARS UNTIL NUL
866 CALL ISCASB2
867ICOUNTX:
868 POP CX
869 SUB DI,CX
870 XCHG DI,CX
871 RET
872
873ISCASB1:
874 MOV AL,"=" ; SCAN FOR AN =
875 JMP SHORT ISCASBX
876ISCASB2:
877 XOR AL,AL ; SCAN FOR A NUL
878ISCASBX:
879 MOV CX,100H
880 REPNZ SCASB
881 RET
882
883 IF KANJI
884ITESTKANJ:
885 CMP AL,81H
886 JB NOTLEAD
887 CMP AL,9FH
888 JBE ISLEAD
889 CMP AL,0E0H
890 JB NOTLEAD
891 CMP AL,0FCH
892 JBE ISLEAD
893NOTLEAD:
894 PUSH AX
895 XOR AX,AX ;Set zero
896 POP AX
897 RET
898
899ISLEAD:
900 PUSH AX
901 XOR AX,AX ;Set zero
902 INC AX ;Reset zero
903 POP AX
904 RET
905 ENDIF
906
907IUPCONV:
908 CMP AL,"a"
909 JB IRET22
910 CMP AL,"z"
911 JA IRET22
912 SUB AL,20H ; Lower-case changed to upper-case
913IRET22:
914 RET
915
916ICONDEV LABEL BYTE
917 DB "/DEV/"
918 DB "CON",0,0,0,0,0,0 ; Room for 8 char device
919BADCSPFL DB 0
920COMSPECT DB "/COMMAND.COM",0,0
921AUTOBAT DB 0,":\AUTOEXEC.BAT",0
922
923PRDATTM DB -1 ;Init not to prompt for date time
924INITADD DD ?
925CHUCKENV DB 0
926ECOMLOC DW OFFSET ENVIRONMENT:ECOMSPEC-10H
927
928 IF HIGHMEM
929REALRES DW ?
930ENVIRSEGSAV DW ?
931 ENDIF
932
933COMSPSTRING DB "COMSPEC="
934
935
936INIT ENDS
937
938 END
939