]> wirehaze git hosting - MS-DOS.git/blob - v4.0/src/DEV/ANSI/PARSER.ASM

wirehaze git hosting

MZ is back!
[MS-DOS.git] / v4.0 / src / DEV / ANSI / PARSER.ASM
1 PAGE ,132
2 TITLE PARSE CODE AND CONTROL BLOCKS FOR ANSI.SYS
3
4 ;****************** START OF SPECIFICATIONS **************************
5 ;
6 ; MODULE NAME: PARSER.ASM
7 ;
8 ; DESCRIPTIVE NAME: PARSES THE DEVICE= STATEMENT IN CONFIG.SYS FOR
9 ; ANSI.SYS
10 ;
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.
14 ;
15 ; ENTRY POINT: PARSE_PARM
16 ;
17 ; INPUT: DS:SI POINTS TO EVERYTHING AFTER DEVICE=
18 ;
19 ; AT EXIT:
20 ; NORMAL: SWITCH FLAGS WILL BE SET IF /X or /L IS FOUND
21 ;
22 ; ERROR: CARRY SET
23 ;
24 ; INTERNAL REFERENCES:
25 ;
26 ; ROUTINES: SYSLOADMSG - MESSAGE RETRIEVER LOADING CODE
27 ; SYSDISPMSG - MESSAGE RETRIEVER DISPLAYING CODE
28 ; PARM_ERROR - DISPLAYS ERROR MESSAGE
29 ; SYSPARSE - PARSING CODE
30 ;
31 ; DATA AREAS: PARMS - PARSE CONTROL BLOCK FOR SYSPARSE
32 ;
33 ; EXTERNAL REFERENCES:
34 ;
35 ; ROUTINES: N/A
36 ;
37 ; DATA AREAS: SWITCH - BYTE FLAG FOR EXISTENCE OF SWITCH PARAMETER
38 ;
39 ; NOTES:
40 ;
41 ; REVISION HISTORY:
42 ; A000 - DOS Version 4.00
43 ;
44 ; Label: "DOS ANSI.SYS Device Driver"
45 ; "Version 4.00 (C) Copyright 1988 Microsoft"
46 ; "Licensed Material - Program Property of Microsoft"
47 ;
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 ;******************************************************************************
54
55
56 INCLUDE ANSI.INC ; ANSI equates and structures ;AN000;
57 .XLIST
58 INCLUDE STRUC.INC ; Structured macros ;AN000;
59
60 INCLUDE SYSMSG.INC ; Message retriever code ;AN000;
61 MSG_UTILNAME <ANSI> ; Let message retriever know its ANSI.SYS ;AN000;
62 .LIST
63
64 PUBLIC PARSE_PARM ; near procedure for parsing DEVICE= statement ;AN000;
65
66 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
67 ;
68 ; Set assemble switches for parse code that is not required!!
69 ;
70 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
71
72 DateSW EQU 0 ;AN000;
73 TimeSW EQU 0 ;AN000;
74 CmpxSW EQU 0 ;AN000;
75 DrvSW EQU 0 ;AN000;
76 QusSW EQU 0 ;AN000;
77 NumSW EQU 0 ;AN000;
78 KeySW EQU 0 ;AN000;
79 Val1SW EQU 0 ;AN000;
80 Val2SW EQU 0 ;AN000;
81 Val3SW EQU 0 ;AN000;
82
83
84 CODE SEGMENT PUBLIC BYTE
85 ASSUME CS:CODE
86
87 .XLIST
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;
93
94 INCLUDE PARSE.ASM ; Parsing code ;AN000;
95 .LIST
96
97
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
101
102 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
103 ;
104 ; PARM control blocks for ANSI
105 ; Parsing DEVICE= statment from CONFIG.SYS
106 ;
107 ; DEVICE=[d:][path]ANSI.SYS [/X]
108 ;
109 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
110 ;AN000;
111 PARMS LABEL WORD ;AN000;
112 DW PARMSX ;AN000;
113 DB 0 ; no extra delimeters or EOLs. ;AN000;
114 ;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
119 DW Switches ;AN002;
120 DB 0 ;AN001; no keywords
121 ;AN000;
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;
128 ;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
138
139 NOVALS LABEL BYTE ;AN000;
140 DB 0 ; no value checking done ;AN000;
141
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;
146 DD ? ; value ;AN000;
147 ;AN000;
148 SUBLIST LABEL DWORD ; list for substitution ;AN000;
149 DB SUB_SIZE ;AN000;
150 DB 0 ;AN000;
151 DD ? ;AN000;
152 DB 1 ;AN000;
153 DB LEFT_ASCIIZ ;AN000;
154 DB UNLIMITED ;AN000;
155 DB 1 ;AN000;
156 DB " " ;AN000;
157
158 Old_SI dw ? ;AN001;
159 Saved_Chr db 0 ;AN001;
160 Continue_Flag db ON ;AN002;
161 Parse_Err_Flag db OFF ;AN002;
162
163 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
164 ;
165 ; PROCEDURE_NAME: PARSE_PARM
166 ;
167 ; FUNCTION:
168 ; THIS PROCEDURE PARSES THE DEVICE= PARAMETERS FROM THE INIT REQUEST
169 ; BLOCK. ERROR MESSAGES ARE DISPLAYED ACCORDINGLY.
170 ;
171 ; AT ENTRY: DS:SI POINTS TO EVERYTHING AFTER THE DEVICE= STATEMENT
172 ;
173 ; AT EXIT:
174 ; NORMAL: CARRY CLEAR - SWITCH FLAG BYTE SET TO 1 IF /X FOUND
175 ;
176 ; ERROR: CARRY SET
177 ;
178 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
179
180 PARSE_PARM PROC NEAR ;AN000;
181 CALL SYSLOADMSG ; load message ;AN000;
182 .IF C NEAR ;AN000;
183 CALL SYSDISPMSG ; display error message ;AN000;
184 STC ; ensure carry still set ;AN000;
185 .ELSE NEAR ;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;
199 .ELSE ;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;
207 .ELSE ;AN002;
208 .IF <Synonym_ptr EQ <offset X_SWITCH>> ;AN002;
209 mov Switch_X, ON ;AN002;
210 .ELSE ;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.
215 .ENDIF ;AN003;
216 .ENDIF ;AN002;
217 clc ;AN002;
218 .ENDIF ;AN002;
219 .ENDIF ;AN002;
220 .ENDWHILE ;AN002;
221 .IF <Parse_Err_Flag EQ ON> ;AN002;
222 stc ;AN002;
223 .ELSE ;AN002;
224 clc ;AN002;
225 .ENDIF ;AN002;
226 .ENDIF ;AN002;
227
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
236 ; stc ;AN001;
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;
245 ; .ENDIF ; ;AN000;
246 ; .ENDIF ; ;AN000;
247 ; .ENDIF ; ;AN000;
248 ; .ENDIF ; ;AN000;
249
250 RET ;AN000;
251 PARSE_PARM ENDP ;AN000;
252 ;AN000;
253
254 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
255 ;
256 ; PROCEDURE_NAME: PARM_ERROR
257 ;
258 ; FUNCTION:
259 ; LOADS AND DISPLAYS "Invalid parameter" MESSAGE
260 ;
261 ; AT ENTRY:
262 ; DS:Old_SI -> parms that is invalid
263 ;
264 ; AT EXIT:
265 ; NORMAL: ERROR MESSAGE DISPLAYED
266 ;
267 ; ERROR: N/A
268 ;
269 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
270
271 PARM_ERROR PROC NEAR ;AN000;
272 PUSH CX ;AN000;
273 PUSH SI ;AN000;
274 PUSH ES ; ;AN000;
275 PUSH DS ; ;AN000;
276
277 ; PUSH CS ; ;AN000;
278 ; POP DS ; establish addressability ;AN000;
279 ; MOV BX,DX ; ;AN000;
280 ; LES DX,[BX].RES_PTR ; find offending parameter ;AN000;
281 push ds ;AN001;
282 pop es ;AN001;
283 mov si, cs:Old_SI ;AN001;Now es:dx -> offending parms
284 push si ;AN001;Save it
285 Get_CR:
286 cmp byte ptr es:[si], 13 ;AN001;CR?
287 je Got_CR ;AN001;
288 inc si ;AN001;
289 jmp Get_CR ;AN001;
290 Got_CR: ;AN001;
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
294
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
298
299 push cs ;AN001;
300 pop ds ;AN001;for addressability
301
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;
314
315 POP DS ;AN000;
316 POP ES ;AN000;
317 POP SI ;AN000;
318 POP CX ;AN000;
319 RET ;AN000;
320 PARM_ERROR ENDP
321
322 include msgdcl.inc
323
324 CODE ENDS
325 END