2025-04-27 07:49:33 -04:00

424 lines
15 KiB
NASM
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

page ,132
; SCCSID = @(#)uinit.asm 4.5 85/12/04
; SCCSID = @(#)uinit.asm 4.5 85/12/04
TITLE COMMAND Initialization messages
;/*
; * Microsoft Confidential
; * Copyright (C) Microsoft Corporation 1991
; * All Rights Reserved.
; */
;
; Revision History
; ================
; M003 SR 07/16/90 Added Lh_OffUnlink to the offset
; patch table (Reloc_Table) for UMB
; support
;
.XCREF
.XLIST
include comsw.asm
include comseg.asm
include ifequ.asm
.LIST
.CREF
addr macro sym,name
public name
ifidn <name>,<>
dw offset resgroup:sym
else
name dw offset resgroup:sym
endif
endm
CODERES segment
extrn ContC :near
extrn DskErr :near
extrn Int_2e :near
extrn MsgInt2fHandler :near
extrn Exec_Ret :near
extrn TRemCheck :far
extrn TrnLodCom1 :near
extrn MsgRetriever :near
extrn LodCom :near
extrn THeadFix :far
extrn Lh_OffUnlink :far ; M003
CODERES ends
;;ENVIRONMENT SEGMENT PUBLIC PARA ;AC000;
;; EXTRN ECOMSPEC:BYTE
;;ENVIRONMENT ENDS
TRANCODE SEGMENT PUBLIC BYTE ;AC000;
extrn Printf_init:FAR
extrn Triage_Init:FAR
extrn append_parse:FAR ;AN054;
TranCode ENDS
INIT SEGMENT PUBLIC PARA ;AC000;
public icondev
public BADCSPFL
public COMSPECT
; NTVDM not used public AUTOBAT
public space
public PRDATTM
public INITADD
public print_add
public CHUCKENV
public scswitch
public skswitch
public ucasea
;; public ECOMLOC
public equalsign
public lcasea
public lcasez
public comspstring
public EnvSiz
public EnvMax
public initend
public trnsize
public resetenv ;AC000;
public ext_msg ;AC000;
public num_positionals
public internat_info
public parsemes_ptr
PUBLIC triage_add
PUBLIC oldenv
PUBLIC usedenv
; NTVDM not used PUBLIC KAUTOBAT ;AN000; 3/3/KK
public eswitch ;AN018;
public dswitch ;AN018;
public init_parse ;AN054;
public old_parse_ptr ;AN057;
PUBLIC pars_msg_off ;AN060;
PUBLIC pars_msg_seg ;AN060;
public PathString
public Reloc_Table
public ResJmpTable
public FirstCom
public DevFlag
public PathFlag
include resmsg.equ ;AC000;
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
;NTVDM not used AUTOBAT DB 0,":\AUTOEXEC.BAT",0,0DH ;AC027;
;NTVDM not used KAUTOBAT DB 0,":\KAUTOEXE.BAT",0,0DH ;AC027; 3/3/KK
PRDATTM DB -1 ;Init not to prompt for date time
INITADD DD ?
print_add LABEL DWORD
DW OFFSET TranGroup:Printf_INIT
DW 0
triage_add LABEL DWORD
DW OFFSET TranGroup:Triage_Init
DW 0
CHUCKENV DB 0
;eg ECOMLOC DW OFFSET ENVIRONMENT:ECOMSPEC-10H
;;ECOMLOC DW OFFSET ENVIRONMENT:ECOMSPEC ;eg
PathString db "PATH=",0
ComspString db "COMSPEC=\COMMAND.COM",0
;;COMSPSTRING DB "COMSPEC="
equalsign db "="
lcasea db "a"
lcasez db "z"
space db " "
scswitch db "C" ; Single command
skswitch db "K" ; Single command
ucasea db "A"
EnvSiz DW 0 ; size user wants to allocate
EnvMax DW 0 ; maximum size allowed.
oldenv DW 0 ; envirseg at initialization
usedenv DW 0 ; amount of envirseg used
PARS_MSG_OFF DW 0 ;AN060; SAVED PARSE ERROR MESSAGE OFFSET
PARS_MSG_SEG DW 0 ;AN060; SAVED PARSE ERROR MESSAGE SEGMENT
;Do not separate the following two words. Used to call transient PARSE routine
init_parse label dword ;AN054;
init_p DW TRANGROUP:APPEND_PARSE ;AN054;
initend DW 0 ;eg segment address of end of init
;End of data that shouldn't be separated.
trnsize DW 0 ;eg size of transient in paragraphs
resetenv DB 0 ;eg set if we need to setblck env at endinit
ext_msg DB 0 ;AN000; set if /MSG switch entered
eswitch db 0 ;AN018; set if /e was entered
dswitch db 0 ;AN018; set if /d was entered
parsemes_ptr dw 0 ;AN000; word to store parse error number
;
; PARSE BLOCK FOR COMMAND
;
PUBLIC PARSE_COMMAND ;AN000;
PUBLIC COMND1_OUTPUT ;AN000;
PUBLIC COMND1_TYPE ;AN000;
PUBLIC COMND1_CODE ;AN000;
PUBLIC COMND1_SYN ;AN000;
PUBLIC COMND1_ADDR ;AN000;
PUBLIC COMMAND_F_SYN ;AN000;
PUBLIC COMMAND_P_SYN ;AN000;
PUBLIC COMMAND_C_SYN ;AN000;
PUBLIC COMMAND_D_SYN ;AN000;
PUBLIC COMMAND_E_SYN ;AN000;
PUBLIC COMMAND_K_SYN ;AN000;
PUBLIC COMMAND_L2_SYN
PUBLIC COMMAND_L_SYN
PUBLIC COMMAND_M_SYN ;AN000;
PUBLIC COMMAND_U_SYN
PUBLIC COMMAND_?_SYN
PUBLIC COMMAND_Y_SYN
PUBLIC COMMAND_Z_SYN
;
; The following parse control block is used for COMMAND. This block is
; used for parsing during initialization. The sytax for COMMAND is:
; COMMAND [/?] [d:][path][/P][/F][/D][/E:xxxxx][/MSG][/C executable][/K executable]
;
; Anything on the command line after the /C or /K switch will be passed to the
; executable command, so if /C or /K is used, it must be specified last. The
; /MSG switch can only be specified if the /P switch is specified.
;
; The /? switch causes help text to be displayed. Any other options
; on the command line are ignored. Command.com will not load if /?
; is specified.
;
ENVBIG EQU 32768 ;AN000; maximum environment size
ENVSML EQU 160 ;AN000; minimum environment size
INTERNAT_INFO LABEL BYTE ;AN000; used for country info after parsing is completed
PARSE_COMMAND LABEL BYTE ;AN000;
DW RESGROUP:COMMAND_PARMS ;AN000;
DB 0 ;AN000; no extra delimiter
COMMAND_PARMS LABEL BYTE ;AN000;
DB 0,2 ;AN000; 1 positional parm
DW RESGROUP:COMMAND_FILE ;AN000;
dw RESGROUP:Command_File
DB 13 ;AN000; 13 switches
DW RESGROUP:COMMAND_SWITCH1 ;AN000;
DW RESGROUP:COMMAND_SWITCH2 ;AN000;
DW RESGROUP:COMMAND_SWITCH3 ;AN000;
DW RESGROUP:COMMAND_SWITCH4 ;AN000;
DW RESGROUP:COMMAND_SWITCH5 ;AN000;
DW RESGROUP:COMMAND_SWITCH6 ;AN000;
DW RESGROUP:COMMAND_SWITCH7
DW RESGROUP:COMMAND_SWITCH8
DW RESGROUP:COMMAND_SWITCH9
DW RESGROUP:COMMAND_SWITCH10
DW RESGROUP:COMMAND_SWITCH11
DW RESGROUP:COMMAND_SWITCH12
DW RESGROUP:COMMAND_SWITCH13
DB 0 ;AN000; no keywords
COMMAND_FILE LABEL BYTE ;AN000;
DW 0201H ;AN000; filespec - optional
DW 1 ;AN000; capitalize - file table
DW RESGROUP:COMND1_OUTPUT ;AN000; result buffer
DW RESGROUP:NO_VAL ;AN000;
DB 0 ;AN000; no keywords
COMMAND_SWITCH1 LABEL BYTE ;AN000;
DW 0 ;AN000; no match flags
DW 2 ;AN000; capitalize by char table
DW RESGROUP:COMND1_OUTPUT ;AN000; result buffer
DW RESGROUP:NO_VAL ;AN000;
DB 1 ;AN000; 1 keyword
COMMAND_P_SYN DB "/P",0 ;AN000; /P switch
COMMAND_SWITCH2 LABEL BYTE ;AN000;
DW 0 ;AN000; no match flags
DW 2 ;AN000; capitalize by char table
DW RESGROUP:COMND1_OUTPUT ;AN000; result buffer
DW RESGROUP:NO_VAL ;AN000;
DB 1 ;AN000; 1 keyword
COMMAND_F_SYN DB "/F",0 ;AN000; /F switch
COMMAND_SWITCH3 LABEL BYTE ;AN000;
DW 0 ;AN000; no match flags
DW 2 ;AN000; capitalize by char table
DW RESGROUP:COMND1_OUTPUT ;AN000; result buffer
DW RESGROUP:NO_VAL ;AN000;
DB 1 ;AN000; 1 keyword
COMMAND_D_SYN DB "/D",0 ;AN000; /D switch
COMMAND_SWITCH4 LABEL BYTE ;AN000;
DW 8000H ;AN000; numeric value - required
DW 0 ;AN000; no function flags
DW RESGROUP:COMND1_OUTPUT ;AN000; result buffer
DW RESGROUP:COMMAND_E_VAL ;AN000; pointer to value list
DB 1 ;AN000; 1 keyword
COMMAND_E_SYN DB "/E",0 ;AN000; /E switch
COMMAND_E_VAL LABEL BYTE ;AN000;
DB 1 ;AN000;
DB 1 ;AN000; 1 range
DB 1 ;AN000; returned if result
DD ENVSML,ENVBIG ;AN000; minimum & maximum value
DB 0 ;AN000; no numeric values
DB 0 ;AN000; no string values
COMMAND_SWITCH5 LABEL BYTE ;AN000;
DW 0 ;AN000; no match flags
DW 2 ;AN000; capitalize by char table
DW RESGROUP:COMND1_OUTPUT ;AN000; result buffer
DW RESGROUP:NO_VAL ;AN000;
DB 1 ;AN000; 1 keyword
COMMAND_C_SYN DB "/C",0 ;AN000; /C switch
COMMAND_SWITCH6 LABEL BYTE ;AN000;
DW 0 ;AN000; no match flags
DW 2 ;AN000; capitalize by char table
DW RESGROUP:COMND1_OUTPUT ;AN000; result buffer
DW RESGROUP:NO_VAL ;AN000;
DB 1 ;AN000; 1 keyword
COMMAND_M_SYN DB "/MSG",0 ;AN000; /MSG switch
COMMAND_SWITCH7 LABEL BYTE ;AN000;
DW 0 ;AN000; no match flags
DW 2 ;AN000; capitalize by char table
DW RESGROUP:COMND1_OUTPUT ;AN000; result buffer
DW RESGROUP:NO_VAL ;AN000;
DB 1 ;AN000; 1 keyword
COMMAND_?_SYN DB "/?",0 ;AN000; /? switch
COMMAND_SWITCH8 LABEL BYTE ;AN000;
DW 0 ;AN000; no match flags
DW 2 ;AN000; capitalize by char table
DW RESGROUP:COMND1_OUTPUT ;AN000; result buffer
DW RESGROUP:NO_VAL ;AN000;
DB 1 ;AN000; 1 keyword
COMMAND_Z_SYN DB "/Z",0 ;AN000; /Z switch
COMMAND_SWITCH9 LABEL BYTE ;AN000;
DW 0 ;AN000; no match flags
DW 2 ;AN000; capitalize by char table
DW RESGROUP:COMND1_OUTPUT ;AN000; result buffer
DW RESGROUP:NO_VAL ;AN000;
DB 1 ;AN000; 1 keyword
COMMAND_K_SYN DB "/K",0 ;AN000; /K switch
COMMAND_SWITCH10 LABEL BYTE ;AN000;
DW 0 ;AN000; no match flags
DW 2 ;AN000; capitalize by char table
DW RESGROUP:COMND1_OUTPUT ;AN000; result buffer
DW RESGROUP:NO_VAL ;AN000;
DB 1 ;AN000; 1 keyword
COMMAND_Y_SYN DB "/Y",0 ;AN000; /Y switch
COMMAND_SWITCH11 LABEL BYTE ;AN000;
DW 0 ;AN000; no match flags
DW 2 ;AN000; capitalize by char table
DW RESGROUP:COMND1_OUTPUT ;AN000; result buffer
DW RESGROUP:NO_VAL ;AN000;
DB 1 ;AN000; 1 keyword
COMMAND_L_SYN DB "/LOW",0 ;AN000; /LOW switch
COMMAND_SWITCH12 LABEL BYTE ;AN000;
DW 8000H ;AN000; numeric value - required
DW 0 ;AN000; no function flags
DW RESGROUP:COMND1_OUTPUT ;AN000; result buffer
DW RESGROUP:COMMAND_L2_VAL ;AN000; pointer to value list
DB 1 ;AN000; 1 keyword
COMMAND_L2_SYN DB "/L",0 ;AN000; /L switch
COMMAND_L2_VAL LABEL BYTE ;AN000;
DB 1 ;AN000;
DB 1 ;AN000; 1 range
DB 1 ;AN000; returned if result
DD 0,ENVBIG ;AN000; minimum & maximum value
DB 0 ;AN000; no numeric values
DB 0 ;AN000; no string values
COMMAND_SWITCH13 LABEL BYTE ;AN000;
DW 8000H ;AN000; numeric value - required
DW 0 ;AN000; no function flags
DW RESGROUP:COMND1_OUTPUT ;AN000; result buffer
DW RESGROUP:COMMAND_U_VAL ;AN000; pointer to value list
DB 1 ;AN000; 1 keyword
COMMAND_U_SYN DB "/U",0 ;AN000; /U switch
COMMAND_U_VAL LABEL BYTE ;AN000;
DB 1 ;AN000;
DB 1 ;AN000; 1 range
DB 1 ;AN000; returned if result
DD 0,ENVBIG ;AN000; minimum & maximum value
DB 0 ;AN000; no numeric values
DB 0 ;AN000; no string values
COMND1_OUTPUT LABEL BYTE ;AN000;
COMND1_TYPE DB 0 ;AN000; type
COMND1_CODE DB 0 ;AN000; return value
COMND1_SYN DW 0 ;AN000; synonym pointer
COMND1_ADDR DD 0 ;AN000; numeric value / address
; of string value
NO_VAL DB 0 ;AN000; no values
num_positionals DW 0 ;AN000; counter for positionals
old_parse_ptr DW 0 ;AN057; SI position before calling parser
;*** INITIALIZATION MESSAGES
include comimsg.inc ;M00
;SR;
; This table of offsets is used by the init code to calculate the new offsets
;for these labels after the resident code has been relocated
;
Reloc_Table dw offset CODERES:MsgInt2fHandler
dw offset CODERES:Int_2e
dw offset CODERES:ContC
dw offset CODERES:DskErr
dw offset CODERES:Exec_Ret
dw offset CODERES:TRemCheck
dw offset CODERES:TrnLodCom1
dw offset CODERES:LodCom
dw offset CODERES:MsgRetriever
dw offset CODERES:THeadFix
dw offset CODERES:Lh_OffUnlink ; M003
NUM_RELOC_ENTRIES equ ($ - Reloc_Table) / 2
public NUM_RELOC_ENTRIES
ResJmpTable dd ? ;stores prev stub jump table addr
FirstCom db 0 ;flag set if first command.com
DevFlag db 0
PathFlag db 0
INIT ends
end