mirror of
https://github.com/microsoft/MS-DOS.git
synced 2024-11-29 17:15:47 +00:00
939 lines
24 KiB
NASM
939 lines
24 KiB
NASM
TITLE COMMAND Initialization
|
||
|
||
INCLUDE COMSW.ASM
|
||
|
||
.xlist
|
||
.xcref
|
||
INCLUDE DOSSYM.ASM
|
||
INCLUDE DEVSYM.ASM
|
||
INCLUDE COMSEG.ASM
|
||
.list
|
||
.cref
|
||
|
||
INCLUDE COMEQU.ASM
|
||
|
||
ENVIRONSIZ EQU 0A0H ;Must agree with values in EVIRONMENT segment
|
||
ENVIRONSIZ2 EQU 092H
|
||
|
||
CODERES SEGMENT PUBLIC
|
||
EXTRN RSTACK:WORD,SETVECT:NEAR,LODCOM:NEAR,CONTC:NEAR,INT_2E:NEAR
|
||
EXTRN LOADCOM:NEAR,CHKSUM:NEAR
|
||
|
||
IF IBMVER
|
||
EXTRN EXECHK:NEAR,SYSCALL:NEAR
|
||
ENDIF
|
||
|
||
CODERES ENDS
|
||
|
||
DATARES SEGMENT PUBLIC
|
||
EXTRN DATARESEND:BYTE,LTPA:WORD,MYSEG:WORD,MYSEG1:WORD,MYSEG2:WORD
|
||
EXTRN MEMSIZ:WORD,TRNSEG:WORD,ENVIRSEG:WORD,RSWITCHAR:BYTE
|
||
EXTRN COMDRV:BYTE,COMLET:BYTE,PERMCOM:BYTE,SINGLECOM:WORD
|
||
EXTRN PARENT:WORD,IO_SAVE:WORD,COM_PTR:DWORD,COM_FCB1:DWORD
|
||
EXTRN COM_FCB2:DWORD,SUM:WORD,BATCH:WORD,COMSPEC:BYTE
|
||
|
||
IF IBMVER
|
||
EXTRN SYS_CALL:DWORD,EXESEG:WORD,EXESUM:WORD
|
||
ENDIF
|
||
|
||
DATARES ENDS
|
||
|
||
ENVIRONMENT SEGMENT PUBLIC
|
||
EXTRN ENVIREND:BYTE,PATHSTRING:BYTE,ECOMSPEC:BYTE
|
||
ENVIRONMENT ENDS
|
||
|
||
TRANCODE SEGMENT PUBLIC
|
||
EXTRN DATINIT:FAR
|
||
TRANCODE ENDS
|
||
|
||
TRANSPACE SEGMENT PUBLIC
|
||
EXTRN TRANSPACEEND:BYTE
|
||
TRANSPACE ENDS
|
||
|
||
ZEXEC_DATA SEGMENT PUBLIC
|
||
IF IBM
|
||
EXTRN ZEXECDATAEND:BYTE
|
||
ENDIF
|
||
ZEXEC_DATA ENDS
|
||
|
||
; *******************************************************************
|
||
; START OF INIT PORTION
|
||
; This code is overlayed the first time the TPA is used.
|
||
|
||
INIT SEGMENT PUBLIC PARA
|
||
|
||
EXTRN HEADER:BYTE
|
||
EXTRN BADCOMLKMES:BYTE
|
||
|
||
PUBLIC CONPROC
|
||
|
||
ASSUME CS:RESGROUP,DS:RESGROUP,ES:RESGROUP,SS:RESGROUP
|
||
|
||
ORG 0
|
||
ZERO = $
|
||
|
||
CONPROC:
|
||
MOV SP,OFFSET RESGROUP:RSTACK
|
||
|
||
IF HIGHMEM
|
||
MOV BX,WORD PTR DS:[PDB_block_len]
|
||
MOV AX,OFFSET RESGROUP:ENVIREND + 15
|
||
MOV CL,4
|
||
SHR AX,CL
|
||
PUSH AX ; Save size to alloc
|
||
INC AX ; Plus one for arena
|
||
SUB BX,AX ; Subtract size of resident
|
||
MOV WORD PTR DS:[PDB_block_len],BX
|
||
MOV AX,CS
|
||
SUB BX,AX
|
||
MOV AH,SETBLOCK
|
||
INT 21H
|
||
POP BX ; Get back size to alloc
|
||
MOV AH,ALLOC
|
||
INT 21H
|
||
MOV [REALRES],AX
|
||
MOV ES,AX
|
||
XOR SI,SI
|
||
MOV DI,SI
|
||
MOV CX,OFFSET RESGROUP:ENVIREND
|
||
SHR CX,1 ; Length of resident and environment in words
|
||
; Last byte doesn't matter
|
||
REP MOVSW ; Move to end of memory
|
||
MOV DS,AX
|
||
MOV BX,AX
|
||
MOV AH,SET_CURRENT_PDB
|
||
INT 21H
|
||
MOV AX,BX
|
||
MOV BX,OFFSET RESGROUP:DATARESEND + 15
|
||
MOV CL,4
|
||
SHR BX,CL ; BX is size for SETBLOCK
|
||
MOV WORD PTR DS:[PDB_block_len],BX
|
||
ADD WORD PTR DS:[PDB_block_len],AX
|
||
MOV [LTPA],CS
|
||
MOV AH,SETBLOCK
|
||
INT 21H ;Shrink to not include environment
|
||
MOV BX,(ENVIRONSIZ + 15) / 16
|
||
MOV AH,ALLOC
|
||
INT 21H ;Allocate the environment
|
||
MOV [ENVIRSEG],AX
|
||
MOV CS:[ENVIRSEGSAV],AX
|
||
MOV ES,AX
|
||
ASSUME ES:ENVIRONMENT
|
||
XOR DI,DI
|
||
MOV SI,OFFSET RESGROUP:PATHSTRING
|
||
MOV CX,ENVIRONSIZ
|
||
REP MOVSB
|
||
MOV AX,WORD PTR CS:[PDB_block_len]
|
||
ENDIF
|
||
|
||
IF NOT HIGHMEM
|
||
MOV AX,OFFSET RESGROUP:ENVIREND + 15
|
||
MOV CL,4
|
||
SHR AX,CL
|
||
MOV CX,CS
|
||
ADD AX,CX ; Compute segment of TPA
|
||
MOV [LTPA],AX ; Good enough for the moment
|
||
MOV AX,WORD PTR DS:[PDB_block_len]
|
||
ENDIF
|
||
|
||
MOV [MYSEG1],DS
|
||
MOV [MYSEG2],DS
|
||
MOV [MYSEG],DS
|
||
MOV [MEMSIZ],AX
|
||
|
||
MOV DX,OFFSET TRANGROUP:TRANSPACEEND + 15
|
||
MOV CL,4
|
||
SHR DX,CL
|
||
|
||
IF IBM
|
||
PUSH DX
|
||
MOV DX,OFFSET EGROUP:ZEXECDATAEND + 15
|
||
MOV CL,4
|
||
SHR DX,CL
|
||
POP CX
|
||
ADD DX,CX
|
||
ENDIF
|
||
|
||
SUB AX,DX
|
||
MOV [TRNSEG],AX ; Read it in here
|
||
MOV AX,DS:[PDB_environ]
|
||
OR AX,AX
|
||
JZ BUILDENV ; Need to make an environment
|
||
|
||
IF HIGHMEM
|
||
INC BYTE PTR CS:[CHUCKENV] ; Flag no ENVIRONSEG
|
||
ELSE
|
||
INC BYTE PTR [CHUCKENV] ; Flag no ENVIRONSEG
|
||
ENDIF
|
||
|
||
JMP SHORT ENVIRONPASSED
|
||
|
||
BUILDENV:
|
||
|
||
IF NOT HIGHMEM
|
||
MOV AX,OFFSET RESGROUP:PATHSTRING ; Figure environment pointer
|
||
MOV CL,4
|
||
SHR AX,CL
|
||
MOV DX,DS
|
||
ADD AX,DX
|
||
ELSE
|
||
JMP SHORT GOTTHEENVIR
|
||
ENDIF
|
||
|
||
ENVIRONPASSED:
|
||
MOV [ENVIRSEG],AX
|
||
|
||
IF HIGHMEM
|
||
DEC AX
|
||
MOV ES,AX
|
||
INC AX
|
||
MOV ES:[arena_owner],DS ; Adjust owner of passed envir
|
||
ENDIF
|
||
|
||
MOV ES,AX
|
||
ASSUME ES:ENVIRONMENT
|
||
|
||
GOTTHEENVIR:
|
||
MOV AX,CHAR_OPER SHL 8
|
||
INT int_command
|
||
MOV [RSWITCHAR],DL
|
||
|
||
CMP DL,'/'
|
||
JNZ IUSESLASH
|
||
|
||
IF HIGHMEM
|
||
MOV CS:[COMSPECT],'\'
|
||
ELSE
|
||
MOV [COMSPECT],'\'
|
||
ENDIF
|
||
|
||
IF HIGHMEM
|
||
CMP BYTE PTR CS:[CHUCKENV],0
|
||
ELSE
|
||
CMP BYTE PTR [CHUCKENV],0
|
||
ENDIF
|
||
|
||
JNZ IUSESLASH
|
||
|
||
MOV ES:[ECOMSPEC-10H],'\'
|
||
IUSESLASH:
|
||
|
||
IF IBMVER
|
||
PUSH ES
|
||
MOV AX,(Get_interrupt_vector SHL 8) + int_command
|
||
INT int_command
|
||
MOV WORD PTR [SYS_CALL],BX
|
||
MOV WORD PTR [SYS_CALL+2],ES
|
||
MOV DX,OFFSET RESGROUP:SYSCALL
|
||
MOV AX,(Set_interrupt_vector SHL 8) + int_command
|
||
INT int_command
|
||
POP ES
|
||
ENDIF
|
||
|
||
MOV AL,BYTE PTR DS:[FCB] ; get drive spec for default
|
||
MOV AH,DRVCHAR
|
||
MOV [COMDRV],AL
|
||
ADD AL,40H ; Convert to letter
|
||
CMP AL,40H
|
||
JZ NOCOMDRV
|
||
STD
|
||
IF HIGHMEM
|
||
CMP BYTE PTR CS:[CHUCKENV],0
|
||
ELSE
|
||
CMP BYTE PTR [CHUCKENV],0
|
||
ENDIF
|
||
|
||
JNZ NOTWIDENV
|
||
|
||
PUSH DS
|
||
PUSH ES
|
||
POP DS
|
||
MOV DI,OFFSET ENVIRONMENT:ECOMSPEC + ENVIRONSIZ2 - 1 - 10H
|
||
MOV SI,OFFSET ENVIRONMENT:ECOMSPEC + ENVIRONSIZ2 - 3 - 10H
|
||
MOV CX,ENVIRONSIZ2 - 2
|
||
REP MOVSB
|
||
|
||
POP DS
|
||
MOV WORD PTR ES:[ECOMSPEC-10H],AX
|
||
|
||
NOTWIDENV:
|
||
CLD
|
||
IF HIGHMEM
|
||
MOV WORD PTR CS:[AUTOBAT],AX
|
||
ELSE
|
||
MOV WORD PTR [AUTOBAT],AX
|
||
ENDIF
|
||
|
||
MOV [COMLET],AL
|
||
NOCOMDRV:
|
||
CALL SETVECT ; Set the vectors
|
||
|
||
MOV SI,80H
|
||
LODSB
|
||
MOV CL,AL
|
||
XOR CH,CH
|
||
JCXZ COMRETURNSJ ; No parameters
|
||
MOV SI,81H ; Start of parms
|
||
CHKARG:
|
||
LODSB
|
||
CMP AL,' '
|
||
JZ NEXTCH
|
||
CMP AL,9 ; Tab only other delimiter
|
||
JZ NEXTCH
|
||
CMP AL,[RSWITCHAR] ; Switch?
|
||
JNZ CHKOTHERARGS ; No
|
||
DEC CX
|
||
JCXZ ARGSDONEJ ; oops
|
||
LODSB
|
||
OR AL,20H ; Lower case
|
||
CMP AL,'p' ; PERMCOM switch
|
||
JNZ NEXTCH
|
||
JMP SETPERM
|
||
|
||
NEXTCH:
|
||
CMP AL,'d'
|
||
JNZ NEXTCH3
|
||
|
||
IF HIGHMEM
|
||
MOV BYTE PTR CS:[PRDATTM],1 ; User explicitly says no date time
|
||
ELSE
|
||
MOV BYTE PTR [PRDATTM],1 ; User explicitly says no date time
|
||
ENDIF
|
||
|
||
LOOP CHKARG
|
||
JMP SHORT ARGSDONEJ
|
||
NEXTCH3:
|
||
CMP AL,'c'
|
||
JNZ NEXTCH2 ; SINGLECOM switch 2
|
||
MOV [SINGLECOM],SI ; Point to the rest of the command line
|
||
MOV [PERMCOM],0 ; A SINGLECOM must not be a PERMCOM
|
||
|
||
IF HIGHMEM
|
||
MOV BYTE PTR CS:[PRDATTM],1 ; No date or time either, explicit
|
||
ELSE
|
||
MOV BYTE PTR [PRDATTM],1 ; No date or time either, explicit
|
||
ENDIF
|
||
|
||
ARGSDONEJ:
|
||
JMP ARGSDONE
|
||
|
||
NEXTCH2:
|
||
LOOP CHKARG
|
||
|
||
COMRETURNSJ:
|
||
JMP COMRETURNS
|
||
|
||
CHKOTHERARGS:
|
||
DEC SI
|
||
MOV DX,SI
|
||
PUSH CX
|
||
PUSH SI
|
||
CONTRLOOP:
|
||
LODSB
|
||
DEC CX
|
||
CMP AL,' '
|
||
JZ SETCDEV
|
||
CMP AL,9
|
||
JZ SETCDEV
|
||
JCXZ SETCDEVA
|
||
JMP SHORT CONTRLOOP
|
||
|
||
SETCDEVA:
|
||
INC SI
|
||
SETCDEV:
|
||
MOV BYTE PTR [SI-1],0
|
||
MOV AX,(OPEN SHL 8) OR 2 ; Read and write
|
||
INT int_command
|
||
JC CHKSRCHSPEC ; Wasn't a file
|
||
MOV BX,AX
|
||
MOV AX,IOCTL SHL 8
|
||
INT int_command
|
||
TEST DL,80H
|
||
JNZ ISADEVICE
|
||
MOV AH,CLOSE ; Close initial handle, wasn't a device
|
||
INT int_command
|
||
JMP CHKSRCHSPEC
|
||
|
||
ISADEVICE:
|
||
XOR DH,DH
|
||
OR DL,3 ; Make sure has CON attributes
|
||
MOV AX,(IOCTL SHL 8) OR 1
|
||
INT int_command
|
||
MOV DX,BX ; Save new handle
|
||
POP BX ; Throw away saved SI
|
||
POP BX ; Throw away saved CX
|
||
PUSH CX
|
||
MOV CX,3
|
||
XOR BX,BX
|
||
RCCLLOOP: ; Close 0,1 and 2
|
||
MOV AH,CLOSE
|
||
INT int_command
|
||
INC BX
|
||
LOOP RCCLLOOP
|
||
MOV BX,DX ; New device handle
|
||
MOV AH,XDUP
|
||
INT int_command ; Dup to 0
|
||
MOV AH,XDUP
|
||
INT int_command ; Dup to 1
|
||
MOV AH,XDUP
|
||
INT int_command ; Dup to 2
|
||
MOV AH,CLOSE
|
||
INT int_command ; Close initial handle
|
||
POP CX
|
||
JCXZ ARGSDONEJ2
|
||
JMP CHKARG
|
||
|
||
CHKSRCHSPEC: ; Not a device, so must be directory spec
|
||
|
||
IF HIGHMEM
|
||
MOV BYTE PTR CS:[CHUCKENV],0 ; If search specified -- no inheritance
|
||
MOV AX,CS:[ENVIRSEGSAV]
|
||
MOV [ENVIRSEG],AX
|
||
ELSE
|
||
MOV BYTE PTR [CHUCKENV],0 ; If search specified -- no inheritance
|
||
MOV AX,OFFSET RESGROUP:PATHSTRING ; Figure environment pointer
|
||
MOV CL,4
|
||
SHR AX,CL
|
||
MOV DX,DS
|
||
ADD AX,DX
|
||
MOV [ENVIRSEG],AX
|
||
ENDIF
|
||
|
||
MOV ES,AX
|
||
MOV BYTE PTR [SI-1],' '
|
||
POP SI ; Remember location
|
||
POP CX ; and count
|
||
|
||
IF HIGHMEM
|
||
MOV DI,CS:[ECOMLOC]
|
||
ELSE
|
||
MOV DI,[ECOMLOC]
|
||
ENDIF
|
||
|
||
COMTRLOOP:
|
||
LODSB
|
||
DEC CX
|
||
CMP AL,' '
|
||
JZ SETCOMSR
|
||
CMP AL,9
|
||
JZ SETCOMSR
|
||
STOSB
|
||
|
||
IF KANJI
|
||
XOR AH,AH
|
||
ENDIF
|
||
|
||
JCXZ SETCOMSR
|
||
|
||
IF KANJI
|
||
CALL ITESTKANJ
|
||
JZ COMTRLOOP
|
||
DEC CX
|
||
MOVSB
|
||
INC AH
|
||
JCXZ SETCOMSR
|
||
ENDIF
|
||
|
||
JMP SHORT COMTRLOOP
|
||
|
||
SETCOMSR:
|
||
PUSH SI
|
||
PUSH CX
|
||
|
||
PUSH DS
|
||
|
||
IF HIGHMEM
|
||
PUSH CS
|
||
POP DS
|
||
ENDIF
|
||
|
||
MOV SI,OFFSET RESGROUP:COMSPECT
|
||
MOV CX,14
|
||
|
||
MOV AL,ES:[DI-1]
|
||
|
||
IF KANJI
|
||
OR AH,AH
|
||
JNZ INOTROOT ; Last char was KANJI second byte, might be '\'
|
||
ENDIF
|
||
|
||
CALL PATHCHRCMPR
|
||
JNZ INOTROOT
|
||
INC SI ; Don't make a double /
|
||
DEC CX
|
||
INOTROOT:
|
||
REP MOVSB
|
||
|
||
MOV DX,[ECOMLOC] ; Now lets make sure its good!
|
||
PUSH ES
|
||
POP DS
|
||
|
||
MOV AX,OPEN SHL 8
|
||
INT int_command ; Open COMMAND.COM
|
||
POP DS
|
||
JC SETCOMSRBAD ; No COMMAND.COM here
|
||
MOV BX,AX ; Handle
|
||
MOV AH,CLOSE
|
||
INT int_command ; Close COMMAND.COM
|
||
SETCOMSRRET:
|
||
POP CX
|
||
POP SI
|
||
ARGSDONEJ2:
|
||
JCXZ ARGSDONE
|
||
JMP CHKARG
|
||
|
||
SETCOMSRBAD:
|
||
|
||
IF HIGHMEM
|
||
PUSH DS
|
||
PUSH CS
|
||
POP DS
|
||
ENDIF
|
||
|
||
MOV DX,OFFSET RESGROUP:BADCOMLKMES
|
||
MOV AH,STD_CON_STRING_OUTPUT
|
||
INT int_command
|
||
MOV SI,OFFSET RESGROUP:COMSPECT
|
||
MOV DI,[ECOMLOC]
|
||
MOV CX,14
|
||
REP MOVSB ; Get my default back
|
||
|
||
IF HIGHMEM
|
||
POP DS
|
||
ENDIF
|
||
|
||
JMP SHORT SETCOMSRRET
|
||
|
||
CHKARGJ:
|
||
JMP CHKARG
|
||
|
||
SETPERM:
|
||
INC [PERMCOM]
|
||
|
||
IF HIGHMEM
|
||
CMP BYTE PTR CS:[PRDATTM],-1
|
||
ELSE
|
||
CMP BYTE PTR [PRDATTM],-1
|
||
ENDIF
|
||
|
||
JNZ LOOPIT
|
||
|
||
IF HIGHMEM
|
||
MOV BYTE PTR CS:[PRDATTM],0 ; If not set explicit, set to prompt
|
||
ELSE
|
||
MOV BYTE PTR [PRDATTM],0 ; If not set explicit, set to prompt
|
||
ENDIF
|
||
|
||
LOOPIT:
|
||
LOOP CHKARGJ
|
||
ARGSDONE:
|
||
CMP [PERMCOM],0
|
||
JZ COMRETURNS
|
||
PUSH ES ; Save environment pointer
|
||
MOV AH,SET_CURRENT_PDB
|
||
MOV BX,DS
|
||
MOV ES,BX
|
||
INT int_command ; Current process is me
|
||
MOV DI,PDB_Exit ; Diddle the addresses in my header
|
||
MOV AX,OFFSET RESGROUP:LODCOM
|
||
STOSW
|
||
MOV AX,DS
|
||
STOSW
|
||
MOV AX,OFFSET RESGROUP:CONTC
|
||
STOSW
|
||
MOV AX,DS
|
||
STOSW
|
||
MOV WORD PTR DS:[PDB_Parent_PID],DS ; Parent is me forever
|
||
MOV DX,OFFSET RESGROUP:INT_2E
|
||
MOV AX,(SET_INTERRUPT_VECTOR SHL 8) OR 02EH
|
||
INT int_command ;Set magic interrupt
|
||
POP ES ;Remember environment
|
||
COMRETURNS:
|
||
MOV AX,WORD PTR DS:[PDB_Parent_PID]
|
||
MOV [PARENT],AX ; Save parent
|
||
MOV WORD PTR DS:[PDB_Parent_PID],DS ; Parent is me
|
||
MOV AX,WORD PTR DS:[PDB_JFN_Table]
|
||
MOV [IO_SAVE],AX ; Get the default stdin and out
|
||
MOV WORD PTR [COM_PTR+2],DS ; Set all these to resident
|
||
MOV WORD PTR [COM_FCB1+2],DS
|
||
MOV WORD PTR [COM_FCB2+2],DS
|
||
MOV DI,OFFSET RESGROUP:COMSPEC
|
||
|
||
IF HIGHMEM
|
||
MOV SI,CS:[ECOMLOC]
|
||
CMP BYTE PTR CS:[CHUCKENV],0
|
||
ELSE
|
||
MOV SI,[ECOMLOC]
|
||
CMP BYTE PTR [CHUCKENV],0
|
||
ENDIF
|
||
|
||
MOV AX,DS ; XCHG ES,DS
|
||
PUSH ES
|
||
POP DS
|
||
MOV ES,AX
|
||
|
||
JZ COPYCOMSP ; All set up for copy
|
||
|
||
PUSH CS
|
||
POP DS
|
||
|
||
MOV SI,OFFSET RESGROUP:COMSPSTRING
|
||
PUSH ES
|
||
PUSH DI
|
||
CALL IFINDE
|
||
MOV SI,DI
|
||
PUSH ES
|
||
POP DS
|
||
POP DI
|
||
POP ES
|
||
JNC COPYCOMSP
|
||
COMSPECNOFND:
|
||
|
||
IF HIGHMEM
|
||
MOV DS,CS:[ENVIRSEG]
|
||
MOV SI,CS:[ECOMLOC]
|
||
ELSE
|
||
MOV SI,[ECOMLOC]
|
||
ADD SI,OFFSET RESGROUP:PATHSTRING
|
||
PUSH CS
|
||
POP DS
|
||
ENDIF
|
||
|
||
COPYCOMSP:
|
||
LODSB
|
||
STOSB
|
||
OR AL,AL
|
||
JNZ COPYCOMSP
|
||
|
||
IF HIGHMEM
|
||
MOV DS,CS:[REALRES]
|
||
PUSH CS
|
||
POP ES
|
||
MOV AH,DEALLOC
|
||
INT 21H
|
||
CMP BYTE PTR CS:[CHUCKENV],0
|
||
JZ GOTENVIR ; Environment is ok
|
||
MOV ES,CS:[ENVIRSEGSAV]
|
||
MOV AH,DEALLOC
|
||
INT 21H
|
||
ELSE
|
||
PUSH CS
|
||
POP DS
|
||
MOV BX,OFFSET RESGROUP:DATARESEND + 15
|
||
MOV CL,4
|
||
SHR BX,CL
|
||
MOV AH,SETBLOCK
|
||
INT int_command ; Shrink me to the resident only
|
||
CMP BYTE PTR [CHUCKENV],0
|
||
JNZ GOTENVIR ; Environment was passed
|
||
MOV BX,(ENVIRONSIZ + 15) /16
|
||
MOV AH,ALLOC
|
||
INT int_command ; "ALLOCATE" the environment
|
||
MOV DS,[ENVIRSEG]
|
||
MOV [ENVIRSEG],AX
|
||
MOV ES,AX
|
||
XOR SI,SI
|
||
MOV DI,SI
|
||
MOV CX,ENVIRONSIZ
|
||
REP MOVSB
|
||
PUSH CS
|
||
POP DS
|
||
ENDIF
|
||
|
||
GOTENVIR:
|
||
CALL LOADCOM ; Load the transient in the right place
|
||
CALL CHKSUM ; Compute the checksum
|
||
MOV [SUM],DX ; Save it
|
||
IF IBM
|
||
MOV AX,[MEMSIZ]
|
||
MOV DX,OFFSET EGROUP:ZEXECDATAEND + 15
|
||
MOV CL,4
|
||
SHR DX,CL
|
||
SUB AX,DX
|
||
MOV [EXESEG],AX
|
||
CALL EXECHK
|
||
MOV [EXESUM],DX
|
||
ENDIF
|
||
IF MSVER
|
||
CMP [SINGLECOM],0
|
||
JNZ NOPHEAD ; Don't print header if SINGLECOM
|
||
IF HIGHMEM
|
||
PUSH DS
|
||
PUSH CS
|
||
POP DS
|
||
ENDIF
|
||
MOV DX,OFFSET RESGROUP:HEADER
|
||
MOV AH,STD_CON_STRING_OUTPUT
|
||
INT int_command
|
||
IF HIGHMEM
|
||
POP DS
|
||
ENDIF
|
||
NOPHEAD:
|
||
ENDIF
|
||
|
||
IF HIGHMEM
|
||
CMP BYTE PTR CS:[PRDATTM],0
|
||
ELSE
|
||
CMP BYTE PTR [PRDATTM],0
|
||
ENDIF
|
||
|
||
JNZ NODTTM ; Don't do AUTOEXEC or date time
|
||
MOV BX,3 ; 48 BYTES ENOUGH
|
||
MOV AH,ALLOC
|
||
INT int_command
|
||
JC DODTTM ; PRETEND NO BATCH
|
||
MOV [BATCH],AX
|
||
MOV ES,AX
|
||
XOR DI,DI
|
||
|
||
IF HIGHMEM
|
||
CMP BYTE PTR CS:[AUTOBAT],0
|
||
ELSE
|
||
CMP BYTE PTR [AUTOBAT],0
|
||
ENDIF
|
||
|
||
JNZ NOAUTSET
|
||
MOV AH,GET_DEFAULT_DRIVE
|
||
INT int_command
|
||
ADD AL,'A'
|
||
|
||
IF HIGHMEM
|
||
MOV CS:[AUTOBAT],AL
|
||
ELSE
|
||
MOV [AUTOBAT],AL
|
||
ENDIF
|
||
|
||
NOAUTSET:
|
||
|
||
IF HIGHMEM
|
||
PUSH DS
|
||
PUSH CS
|
||
POP DS
|
||
ENDIF
|
||
|
||
MOV SI,OFFSET RESGROUP:AUTOBAT
|
||
MOV CX,8
|
||
REP MOVSW ; NAME
|
||
MOV AX,-1
|
||
MOV CL,10
|
||
REP STOSW ; PARMS
|
||
MOV DX,OFFSET RESGROUP:AUTOBAT
|
||
MOV AX,OPEN SHL 8
|
||
INT int_command ; See if AUTOEXEC.BAT exists
|
||
JC NOABAT
|
||
MOV BX,AX
|
||
MOV AH,CLOSE
|
||
INT int_command
|
||
|
||
IF HIGHMEM
|
||
POP DS
|
||
ENDIF
|
||
|
||
JMP SHORT DRV0
|
||
|
||
NOABAT:
|
||
|
||
IF HIGHMEM
|
||
POP DS
|
||
ENDIF
|
||
|
||
MOV ES,[BATCH] ; Not found--turn off batch job
|
||
MOV AH,DEALLOC
|
||
INT int_command
|
||
MOV [BATCH],0 ; AFTER DEALLOC in case of ^C
|
||
DODTTM:
|
||
|
||
IF HIGHMEM
|
||
MOV AX,OFFSET TRANGROUP:DATINIT
|
||
MOV WORD PTR CS:[INITADD],AX
|
||
MOV AX,[TRNSEG]
|
||
MOV WORD PTR CS:[INITADD+2],AX
|
||
CALL DWORD PTR CS:[INITADD]
|
||
ELSE
|
||
MOV AX,OFFSET TRANGROUP:DATINIT
|
||
MOV WORD PTR[INITADD],AX
|
||
MOV AX,[TRNSEG]
|
||
MOV WORD PTR[INITADD+2],AX
|
||
CALL DWORD PTR [INITADD]
|
||
ENDIF
|
||
|
||
NODTTM:
|
||
|
||
IF IBMVER
|
||
CMP [SINGLECOM],0
|
||
JNZ DRV0 ; Don't print header if SINGLECOM
|
||
MOV DX,OFFSET RESGROUP:HEADER
|
||
MOV AH,STD_CON_STRING_OUTPUT
|
||
INT int_command
|
||
ENDIF
|
||
|
||
DRV0:
|
||
IF HIGHMEM
|
||
PUSH DS
|
||
MOV AX,OFFSET RESGROUP:LODCOM
|
||
PUSH AX
|
||
MQQ PROC FAR
|
||
RET
|
||
MQQ ENDP
|
||
ELSE
|
||
JMP LODCOM ; Allocate the transient
|
||
ENDIF
|
||
|
||
PATHCHRCMPR:
|
||
CMP [RSWITCHAR],'/'
|
||
JZ RNOSLASHT
|
||
CMP AL,'/'
|
||
JZ RET41
|
||
RNOSLASHT:
|
||
CMP AL,'\'
|
||
RET41:
|
||
RET
|
||
|
||
|
||
IFINDE:
|
||
CALL IFIND ; FIND THE NAME
|
||
JC IFIND2 ; CARRY MEANS NOT FOUND
|
||
JMP ISCASB1 ; SCAN FOR = SIGN
|
||
;
|
||
; On return of FIND1, ES:DI points to beginning of name
|
||
;
|
||
IFIND:
|
||
CLD
|
||
|
||
CALL ICOUNT0 ; CX = LENGTH OF NAME
|
||
|
||
IF HIGHMEM
|
||
MOV ES,CS:[REALRES]
|
||
ASSUME ES:RESGROUP
|
||
MOV ES,ES:[ENVIRSEG]
|
||
ASSUME ES:NOTHING
|
||
ELSE
|
||
MOV ES,[ENVIRSEG]
|
||
ENDIF
|
||
|
||
XOR DI,DI
|
||
IFIND1:
|
||
PUSH CX
|
||
PUSH SI
|
||
PUSH DI
|
||
IFIND11:
|
||
LODSB
|
||
|
||
IF KANJI
|
||
CALL ITESTKANJ
|
||
JZ NOTKANJ4
|
||
DEC SI
|
||
LODSW
|
||
INC DI
|
||
INC DI
|
||
CMP AX,ES:[DI-2]
|
||
JNZ IFIND12
|
||
DEC CX
|
||
LOOP IFIND11
|
||
JMP SHORT IFIND12
|
||
|
||
NOTKANJ4:
|
||
ENDIF
|
||
|
||
CALL IUPCONV
|
||
INC DI
|
||
CMP AL,ES:[DI-1]
|
||
JNZ IFIND12
|
||
LOOP IFIND11
|
||
IFIND12:
|
||
POP DI
|
||
POP SI
|
||
POP CX
|
||
JZ IFIND2
|
||
PUSH CX
|
||
CALL ISCASB2 ; SCAN FOR A NUL
|
||
POP CX
|
||
CMP BYTE PTR ES:[DI],0
|
||
JNZ IFIND1
|
||
STC ; INDICATE NOT FOUND
|
||
IFIND2:
|
||
RET
|
||
|
||
ICOUNT0:
|
||
PUSH DS
|
||
POP ES
|
||
MOV DI,SI
|
||
|
||
PUSH DI ; COUNT NUMBER OF CHARS UNTIL "="
|
||
CALL ISCASB1
|
||
JMP SHORT ICOUNTX
|
||
PUSH DI ; COUNT NUMBER OF CHARS UNTIL NUL
|
||
CALL ISCASB2
|
||
ICOUNTX:
|
||
POP CX
|
||
SUB DI,CX
|
||
XCHG DI,CX
|
||
RET
|
||
|
||
ISCASB1:
|
||
MOV AL,"=" ; SCAN FOR AN =
|
||
JMP SHORT ISCASBX
|
||
ISCASB2:
|
||
XOR AL,AL ; SCAN FOR A NUL
|
||
ISCASBX:
|
||
MOV CX,100H
|
||
REPNZ SCASB
|
||
RET
|
||
|
||
IF KANJI
|
||
ITESTKANJ:
|
||
CMP AL,81H
|
||
JB NOTLEAD
|
||
CMP AL,9FH
|
||
JBE ISLEAD
|
||
CMP AL,0E0H
|
||
JB NOTLEAD
|
||
CMP AL,0FCH
|
||
JBE ISLEAD
|
||
NOTLEAD:
|
||
PUSH AX
|
||
XOR AX,AX ;Set zero
|
||
POP AX
|
||
RET
|
||
|
||
ISLEAD:
|
||
PUSH AX
|
||
XOR AX,AX ;Set zero
|
||
INC AX ;Reset zero
|
||
POP AX
|
||
RET
|
||
ENDIF
|
||
|
||
IUPCONV:
|
||
CMP AL,"a"
|
||
JB IRET22
|
||
CMP AL,"z"
|
||
JA IRET22
|
||
SUB AL,20H ; Lower-case changed to upper-case
|
||
IRET22:
|
||
RET
|
||
|
||
ICONDEV LABEL BYTE
|
||
DB "/DEV/"
|
||
DB "CON",0,0,0,0,0,0 ; Room for 8 char device
|
||
BADCSPFL DB 0
|
||
COMSPECT DB "/COMMAND.COM",0,0
|
||
AUTOBAT DB 0,":\AUTOEXEC.BAT",0
|
||
|
||
PRDATTM DB -1 ;Init not to prompt for date time
|
||
INITADD DD ?
|
||
CHUCKENV DB 0
|
||
ECOMLOC DW OFFSET ENVIRONMENT:ECOMSPEC-10H
|
||
|
||
IF HIGHMEM
|
||
REALRES DW ?
|
||
ENVIRSEGSAV DW ?
|
||
ENDIF
|
||
|
||
COMSPSTRING DB "COMSPEC="
|
||
|
||
|
||
INIT ENDS
|
||
|
||
END
|
||
|