]>
wirehaze git hosting - MS-DOS.git/blob - v4.0/src/DEV/ANSI/PARSER.ASM
2 TITLE PARSE
CODE AND CONTROL BLOCKS FOR ANSI
.SYS
4 ;****************** START OF SPECIFICATIONS **************************
6 ; MODULE NAME: PARSER.ASM
8 ; DESCRIPTIVE NAME: PARSES THE DEVICE= STATEMENT IN CONFIG.SYS FOR
11 ; FUNCTION: THE COMMAND LINE PASSED TO ANSI.SYS IN THE CONFIG.SYS
12 ; STATEMENT IS PARSED TO CHECK FOR THE /X SWITCH. A FLAG
13 ; IS CLEARED IF NOT FOUND.
15 ; ENTRY POINT: PARSE_PARM
17 ; INPUT: DS:SI POINTS TO EVERYTHING AFTER DEVICE=
20 ; NORMAL: SWITCH FLAGS WILL BE SET IF /X or /L IS FOUND
24 ; INTERNAL REFERENCES:
26 ; ROUTINES: SYSLOADMSG - MESSAGE RETRIEVER LOADING CODE
27 ; SYSDISPMSG - MESSAGE RETRIEVER DISPLAYING CODE
28 ; PARM_ERROR - DISPLAYS ERROR MESSAGE
29 ; SYSPARSE - PARSING CODE
31 ; DATA AREAS: PARMS - PARSE CONTROL BLOCK FOR SYSPARSE
33 ; EXTERNAL REFERENCES:
37 ; DATA AREAS: SWITCH - BYTE FLAG FOR EXISTENCE OF SWITCH PARAMETER
42 ; A000 - DOS Version 4.00
44 ; Label: "DOS ANSI.SYS Device Driver"
45 ; "Version 4.00 (C) Copyright 1988 Microsoft"
46 ; "Licensed Material - Program Property of Microsoft"
48 ;****************** END OF SPECIFICATIONS ****************************
49 ;Modification history**********************************************************
50 ;AN001; P1529 ANSI /x /y gives wrong error message 10/8/87 J.K.
51 ;AN002; D397 /L option for "Enforcing" the line number 12/17/87 J.K.
52 ;AN003; D479 An option to disable the extended keyboard functions 02/12/88 J.K.
53 ;******************************************************************************
56 INCLUDE ANSI
.INC ; ANSI equates and structures ;AN000;
58 INCLUDE STRUC.INC ; Structured macros ;AN000;
60 INCLUDE SYSMSG
.INC ; Message retriever code ;AN000;
61 MSG_UTILNAME
<ANSI
> ; Let message retriever know its ANSI.SYS ;AN000;
64 PUBLIC PARSE_PARM
; near procedure for parsing DEVICE= statement ;AN000;
66 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
68 ; Set assemble switches for parse code that is not required!!
70 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
84 CODE SEGMENT PUBLIC BYTE
88 MSG_SERVICES
<MSGDATA
> ;AN000;
89 MSG_SERVICES
<DISPLAYmsg
,LOADmsg
,CHARmsg
> ;AN000;
90 MSG_SERVICES
<ANSI
.CL1
> ;AN000;
91 MSG_SERVICES
<ANSI
.CL2
> ;AN000;
92 MSG_SERVICES
<ANSI
.CLA
> ;AN000;
94 INCLUDE PARSE
.ASM
; Parsing code ;AN000;
98 EXTRN SWITCH_X
:BYTE ; /X switch flag ;AN000;
99 extrn Switch_L
:Byte ;AN002; /L switch flag
100 extrn Switch_K
:Byte ;AN003; /K switch
102 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
104 ; PARM control blocks for ANSI
105 ; Parsing DEVICE= statment from CONFIG.SYS
107 ; DEVICE=[d:][path]ANSI.SYS [/X]
109 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
111 PARMS
LABEL WORD ;AN000;
113 DB 0 ; no extra delimeters or EOLs. ;AN000;
115 PARMSX
LABEL BYTE ;AN000;
116 DB 1,1 ;AN001; 1 valid positional operand
117 DW FILENAME
;AN001; filename
118 DB 1 ;AN002; 1 switche definition in the following
120 DB 0 ;AN001; no keywords
122 FILENAME
LABEL WORD ;AN000;
123 DW 0200H ; file spec ;AN000;
124 DW 0001H ; cap by file table ;AN000;
125 DW RESULT_BUF
; result ;AN000;
126 DW NOVALS
; no value checking done ;AN000;
127 DB 0 ; no switch/keyword synonyms ;AN000;
129 Switches
LABEL WORD ;AN000;
130 DW 0 ; switch with no value ;AN000;
131 DW 0 ; no functions ;AN000;
132 DW RESULT_BUF
; result ;AN000;
133 DW NOVALS
; no value checking done ;AN000;
134 DB 3 ;AN002;AN003; 3 switch synonym
135 X_SWITCH
DB "/X",0 ;AN002; /X name
136 L_SWITCH
DB "/L",0 ;AN002; /L
137 K_SWITCH
DB "/K",0 ;AN003; /K
139 NOVALS
LABEL BYTE ;AN000;
140 DB 0 ; no value checking done ;AN000;
142 RESULT_BUF
LABEL BYTE ;AN000;
143 DB ?
; type returned (number, string, etc.) ;AN000;
144 DB ?
; matched item tag (if applicable) ;AN000;
145 SYNONYM_PTR
DW 0 ; synonym ptr (if applicable) ;AN000;
148 SUBLIST
LABEL DWORD ; list for substitution ;AN000;
153 DB LEFT_ASCIIZ
;AN000;
159 Saved_Chr db 0 ;AN001;
160 Continue_Flag db ON ;AN002;
161 Parse_Err_Flag db OFF
;AN002;
163 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
165 ; PROCEDURE_NAME: PARSE_PARM
168 ; THIS PROCEDURE PARSES THE DEVICE= PARAMETERS FROM THE INIT REQUEST
169 ; BLOCK. ERROR MESSAGES ARE DISPLAYED ACCORDINGLY.
171 ; AT ENTRY: DS:SI POINTS TO EVERYTHING AFTER THE DEVICE= STATEMENT
174 ; NORMAL: CARRY CLEAR - SWITCH FLAG BYTE SET TO 1 IF /X FOUND
178 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
180 PARSE_PARM PROC
NEAR ;AN000;
181 CALL SYSLOADMSG
; load message ;AN000;
183 CALL SYSDISPMSG
; display error message ;AN000;
184 STC ; ensure carry still set ;AN000;
186 PUSH CS ; establish ES .. ;AN000;
187 POP ES ; addressability to data ;AN000;
188 LEA DI,PARMS
; point to PARMS control block ;AN000;
189 XOR CX,CX ; clear both CX and DX for ;AN000;
190 XOR DX,DX ; SYSPARSE ;AN000;
191 CALL SYSPARSE
; move pointer past file spec ;AN000;
192 mov Switch_L
, OFF
;AN002;
193 mov Switch_X
, OFF
;AN002;
194 .WHILE <Continue_Flag
EQ ON> ;AN002;
195 mov Old_SI
, SI ;AN001;to be use by PARM_ERROR
196 call SysParse
;AN002;
197 .IF <AX EQ RC_EOL
> ;AN002;
198 mov Continue_Flag
, OFF
;AN002;
200 .IF <AX NE RC_NO_ERROR
> ;AN002;
201 mov Continue_Flag
, OFF
;AN002;
202 mov Switch_X
, OFF
;AN002;
203 mov Switch_L
, OFF
;AN002;
204 mov Switch_K
, OFF
;AN003;
205 call Parm_Error
;AN002;
206 mov Parse_Err_Flag
,ON;AN002;
208 .IF <Synonym_ptr
EQ <offset X_SWITCH
>> ;AN002;
209 mov Switch_X
, ON ;AN002;
211 .IF <Synonym_ptr
EQ <offset L_SWITCH
>> ;AN003;
212 mov Switch_L
, ON ;AN002;
213 .ELSE ;AN003;Must be /K option.
214 mov Switch_K
, ON ;AN003;/K entered.
221 .IF <Parse_Err_Flag
EQ ON> ;AN002;
228 ; mov cs:Old_SI, SI ;AN001; Save pointer to parm
229 ; CALL SYSPARSE ; look for /X switch ;AN000;
230 ; .IF <AX EQ RC_EOL> ; if EOL then.. ;AN000;
231 ; MOV ES:SWITCH_X,0 ; no switch...clear flag ;AN000;
232 ; CLC ; clear carry ;AN000;
233 ; .ELSE ; else.. ;AN000;
234 ; .IF <AX GT RC_NO_ERROR> ;AN001;If any error
235 ; call parm_error ;AN001; the show the error msg
237 ; .ELSE ; else..leave flag set.. ;AN000;
238 ; mov cs:Old_SI, SI ;AN001;
239 ; CALL SYSPARSE ; check for further parms ;AN000;
240 ; .IF <AX NE RC_EOL> ; if other parms then... ;AN000;
241 ; CALL PARM_ERROR ; display 'Invalid parameter' message ;AN000;
242 ; STC ; error! ;AN000;
243 ; .ELSE ; no other parms so.. ;AN000;
244 ; CLC ; clear carry ;AN000;
251 PARSE_PARM ENDP
;AN000;
254 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
256 ; PROCEDURE_NAME: PARM_ERROR
259 ; LOADS AND DISPLAYS "Invalid parameter" MESSAGE
262 ; DS:Old_SI -> parms that is invalid
265 ; NORMAL: ERROR MESSAGE DISPLAYED
269 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
271 PARM_ERROR PROC
NEAR ;AN000;
278 ; POP DS ; establish addressability ;AN000;
279 ; MOV BX,DX ; ;AN000;
280 ; LES DX,[BX].RES_PTR ; find offending parameter ;AN000;
283 mov si, cs:Old_SI
;AN001;Now es:dx -> offending parms
284 push si ;AN001;Save it
286 cmp byte ptr es:[si], 13 ;AN001;CR?
291 inc si ;AN001; The next char.
292 mov al, byte ptr es:[si] ;AN001;
293 mov cs:Saved_Chr
, al ;AN001; Save the next char
295 mov byte ptr es:[si], 0 ;AN001; and make it an ASCIIZ
296 mov cs:Old_SI
, si ;AN001; Set it again
297 pop dx ;AN001; saved SI -> DX
300 pop ds ;AN001;for addressability
302 LEA SI,SUBLIST
; ..and place the offset.. ;AN000;
303 MOV [SI].SUB_PTR_O
,DX ; ..in the SUBLIST.. ;AN000;
304 MOV [SI].SUB_PTR_S
,ES ; ;AN000;
305 MOV AX,INVALID_PARM
; load 'Invalid parameter' message number ;AN000;
306 MOV BX,STDERR
; to standard error ;AN000;
307 MOV CX,ONE
; 1 substitution ;AN000;
308 XOR DL,DL ; no input ;AN000;
309 MOV DH,UTILITY_MSG_CLASS
; parse error ;AN000;
310 CALL SYSDISPMSG
; display error message ;AN000;
311 mov si, cs:Old_SI
;AN001;restore the original char.
312 mov cl, cs:Saved_Chr
;AN001;
313 mov byte ptr es:[si], cl ;AN001;