mirror of
https://github.com/Microsoft/MS-DOS.git
synced 2025-08-21 05:53:37 -07:00
MS-DOS v2.0 Release
This commit is contained in:
parent
fce0f75959
commit
80ab2fddfd
156 changed files with 56403 additions and 0 deletions
939
v2.0/source/INIT.ASM
Normal file
939
v2.0/source/INIT.ASM
Normal file
|
@ -0,0 +1,939 @@
|
|||
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
|
||||
|