1 TITLE COMMAND Initialization
15 ENVIRONSIZ EQU
0A0H ;Must agree with values in EVIRONMENT segment
18 CODERES
SEGMENT PUBLIC
19 EXTRN RSTACK
:WORD,SETVECT
:NEAR,LODCOM
:NEAR,CONTC
:NEAR,INT_2E
:NEAR
20 EXTRN LOADCOM
:NEAR,CHKSUM
:NEAR
23 EXTRN EXECHK
:NEAR,SYSCALL:NEAR
28 DATARES
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
36 EXTRN SYS_CALL
:DWORD,EXESEG
:WORD,EXESUM
:WORD
41 ENVIRONMENT
SEGMENT PUBLIC
42 EXTRN ENVIREND
:BYTE,PATHSTRING
:BYTE,ECOMSPEC
:BYTE
45 TRANCODE
SEGMENT PUBLIC
49 TRANSPACE
SEGMENT PUBLIC
50 EXTRN TRANSPACEEND
:BYTE
53 ZEXEC_DATA
SEGMENT PUBLIC
55 EXTRN ZEXECDATAEND
:BYTE
59 ; *******************************************************************
60 ; START OF INIT PORTION
61 ; This code is overlayed the first time the TPA is used.
63 INIT
SEGMENT PUBLIC PARA
66 EXTRN BADCOMLKMES
:BYTE
70 ASSUME
CS:RESGROUP
,DS:RESGROUP
,ES:RESGROUP
,SS:RESGROUP
76 MOV SP,OFFSET RESGROUP
:RSTACK
79 MOV BX,WORD PTR DS:[PDB_block_len
]
80 MOV AX,OFFSET RESGROUP
:ENVIREND
+ 15
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
91 POP BX ; Get back size to alloc
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
104 MOV AH,SET_CURRENT_PDB
107 MOV BX,OFFSET RESGROUP
:DATARESEND
+ 15
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
114 INT 21H
;Shrink to not include environment
115 MOV BX,(ENVIRONSIZ
+ 15) / 16
117 INT 21H
;Allocate the environment
119 MOV CS:[ENVIRSEGSAV
],AX
121 ASSUME
ES:ENVIRONMENT
123 MOV SI,OFFSET RESGROUP
:PATHSTRING
126 MOV AX,WORD PTR CS:[PDB_block_len
]
130 MOV AX,OFFSET RESGROUP
:ENVIREND
+ 15
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
]
144 MOV DX,OFFSET TRANGROUP
:TRANSPACEEND
+ 15
150 MOV DX,OFFSET EGROUP
:ZEXECDATAEND
+ 15
158 MOV [TRNSEG
],AX ; Read it in here
159 MOV AX,DS:[PDB_environ
]
161 JZ BUILDENV
; Need to make an environment
164 INC BYTE PTR CS:[CHUCKENV
] ; Flag no ENVIRONSEG
166 INC BYTE PTR [CHUCKENV
] ; Flag no ENVIRONSEG
169 JMP SHORT ENVIRONPASSED
174 MOV AX,OFFSET RESGROUP
:PATHSTRING
; Figure environment pointer
180 JMP SHORT GOTTHEENVIR
190 MOV ES:[arena_owner
],DS ; Adjust owner of passed envir
194 ASSUME
ES:ENVIRONMENT
197 MOV AX,CHAR_OPER
SHL 8
205 MOV CS:[COMSPECT
],'\'
211 CMP BYTE PTR CS:[CHUCKENV
],0
213 CMP BYTE PTR [CHUCKENV
],0
218 MOV ES:[ECOMSPEC
-10H
],'\'
223 MOV AX,(Get_interrupt_vector SHL 8) + 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
233 MOV AL,BYTE PTR DS:[FCB] ; get drive spec for default
236 ADD AL,40H ; Convert to letter
241 CMP BYTE PTR CS:[CHUCKENV],0
243 CMP BYTE PTR [CHUCKENV],0
251 MOV DI,OFFSET ENVIRONMENT:ECOMSPEC + ENVIRONSIZ2 - 1 - 10H
252 MOV SI,OFFSET ENVIRONMENT:ECOMSPEC + ENVIRONSIZ2 - 3 - 10H
253 MOV CX,ENVIRONSIZ2 - 2
257 MOV WORD PTR ES:[ECOMSPEC-10H],AX
262 MOV WORD PTR CS:[AUTOBAT],AX
264 MOV WORD PTR [AUTOBAT],AX
269 CALL SETVECT ; Set the vectors
275 JCXZ COMRETURNSJ ; No parameters
276 MOV SI,81H ; Start of parms
281 CMP AL,9 ; Tab only other delimiter
283 CMP AL,[RSWITCHAR] ; Switch?
284 JNZ CHKOTHERARGS ; No
286 JCXZ ARGSDONEJ ; oops
288 OR AL,20H ; Lower case
289 CMP AL,'p
' ; PERMCOM switch
298 MOV BYTE PTR CS:[PRDATTM],1 ; User explicitly says no date time
300 MOV BYTE PTR [PRDATTM],1 ; User explicitly says no date time
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
312 MOV BYTE PTR CS:[PRDATTM],1 ; No date or time either, explicit
314 MOV BYTE PTR [PRDATTM],1 ; No date or time either, explicit
344 MOV BYTE PTR [SI-1],0
345 MOV AX,(OPEN SHL 8) OR 2 ; Read and write
347 JC CHKSRCHSPEC ; Wasn't a file
353 MOV AH,CLOSE ; Close initial handle, wasn't a device
359 OR DL,3 ; Make sure has CON attributes
360 MOV AX,(IOCTL SHL 8) OR 1
362 MOV DX,BX ; Save new handle
363 POP BX ; Throw away saved SI
364 POP BX ; Throw away saved CX
368 RCCLLOOP: ; Close 0,1 and 2
373 MOV BX,DX ; New device handle
375 INT int_command ; Dup to 0
377 INT int_command ; Dup to 1
379 INT int_command ; Dup to 2
381 INT int_command ; Close initial handle
386 CHKSRCHSPEC: ; Not a device, so must be directory spec
389 MOV BYTE PTR CS:[CHUCKENV],0 ; If search specified -- no inheritance
390 MOV AX,CS:[ENVIRSEGSAV]
393 MOV BYTE PTR [CHUCKENV],0 ; If search specified -- no inheritance
394 MOV AX,OFFSET RESGROUP:PATHSTRING ; Figure environment pointer
403 MOV BYTE PTR [SI-1],' '
404 POP SI ; Remember location
450 MOV SI,OFFSET RESGROUP:COMSPECT
457 JNZ INOTROOT ; Last char was KANJI second byte, might be '\'
462 INC SI ; Don't make a double /
467 MOV DX,[ECOMLOC
] ; Now lets make sure its good!
472 INT int_command
; Open COMMAND.COM
474 JC SETCOMSRBAD
; No COMMAND.COM here
477 INT int_command
; Close COMMAND.COM
493 MOV DX,OFFSET RESGROUP
:BADCOMLKMES
494 MOV AH,STD_CON_STRING_OUTPUT
496 MOV SI,OFFSET RESGROUP
:COMSPECT
499 REP MOVSB ; Get my default back
505 JMP SHORT SETCOMSRRET
514 CMP BYTE PTR CS:[PRDATTM
],-1
516 CMP BYTE PTR [PRDATTM
],-1
522 MOV BYTE PTR CS:[PRDATTM
],0 ; If not set explicit, set to prompt
524 MOV BYTE PTR [PRDATTM
],0 ; If not set explicit, set to prompt
532 PUSH ES ; Save environment pointer
533 MOV AH,SET_CURRENT_PDB
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
542 MOV AX,OFFSET RESGROUP
:CONTC
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
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
564 CMP BYTE PTR CS:[CHUCKENV
],0
567 CMP BYTE PTR [CHUCKENV
],0
570 MOV AX,DS ; XCHG ES,DS
575 JZ COPYCOMSP
; All set up for copy
580 MOV SI,OFFSET RESGROUP
:COMSPSTRING
597 ADD SI,OFFSET RESGROUP
:PATHSTRING
614 CMP BYTE PTR CS:[CHUCKENV
],0
615 JZ GOTENVIR
; Environment is ok
616 MOV ES,CS:[ENVIRSEGSAV
]
622 MOV BX,OFFSET RESGROUP
:DATARESEND
+ 15
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
631 INT int_command
; "ALLOCATE" the environment
644 CALL LOADCOM
; Load the transient in the right place
645 CALL CHKSUM
; Compute the checksum
646 MOV [SUM
],DX ; Save it
649 MOV DX,OFFSET EGROUP
:ZEXECDATAEND
+ 15
659 JNZ NOPHEAD
; Don't print header if SINGLECOM
665 MOV DX,OFFSET RESGROUP
:HEADER
666 MOV AH,STD_CON_STRING_OUTPUT
675 CMP BYTE PTR CS:[PRDATTM
],0
677 CMP BYTE PTR [PRDATTM
],0
680 JNZ NODTTM
; Don't do AUTOEXEC or date time
681 MOV BX,3 ; 48 BYTES ENOUGH
684 JC DODTTM
; PRETEND NO BATCH
690 CMP BYTE PTR CS:[AUTOBAT
],0
692 CMP BYTE PTR [AUTOBAT
],0
696 MOV AH,GET_DEFAULT_DRIVE
714 MOV SI,OFFSET RESGROUP
:AUTOBAT
720 MOV DX,OFFSET RESGROUP
:AUTOBAT
722 INT int_command
; See if AUTOEXEC.BAT exists
740 MOV ES,[BATCH
] ; Not found--turn off batch job
743 MOV [BATCH
],0 ; AFTER DEALLOC in case of ^C
747 MOV AX,OFFSET TRANGROUP
:DATINIT
748 MOV WORD PTR CS:[INITADD
],AX
750 MOV WORD PTR CS:[INITADD
+2],AX
751 CALL DWORD PTR CS:[INITADD
]
753 MOV AX,OFFSET TRANGROUP
:DATINIT
754 MOV WORD PTR[INITADD
],AX
756 MOV WORD PTR[INITADD
+2],AX
757 CALL DWORD PTR [INITADD
]
764 JNZ DRV0
; Don't print header if SINGLECOM
765 MOV DX,OFFSET RESGROUP
:HEADER
766 MOV AH,STD_CON_STRING_OUTPUT
773 MOV AX,OFFSET RESGROUP
:LODCOM
779 JMP LODCOM
; Allocate the transient
794 CALL IFIND ; FIND THE NAME
795 JC IFIND2 ; CARRY MEANS NOT FOUND
796 JMP ISCASB1 ; SCAN FOR = SIGN
798 ; On return of FIND1, ES:DI points to beginning of name
803 CALL ICOUNT0 ; CX = LENGTH OF NAME
849 CALL ISCASB2 ; SCAN FOR A NUL
851 CMP BYTE PTR ES:[DI],0
853 STC ; INDICATE NOT FOUND
862 PUSH DI ; COUNT NUMBER OF CHARS UNTIL "="
865 PUSH DI ; COUNT NUMBER OF CHARS UNTIL NUL
874 MOV AL,"=" ; SCAN FOR AN =
877 XOR AL,AL ; SCAN FOR A NUL
912 SUB AL,20H ; Lower-case changed to upper-case
918 DB "CON",0,0,0,0,0,0 ; Room for 8 char device
920 COMSPECT DB "/COMMAND.COM",0,0
921 AUTOBAT DB 0,":\AUTOEXEC.BAT",0
923 PRDATTM DB -1 ;Init not to prompt for date time
926 ECOMLOC DW OFFSET ENVIRONMENT:ECOMSPEC-10H
933 COMSPSTRING DB "COMSPEC="