summaryrefslogtreecommitdiff
path: root/v4.0/src/DEV/ANSI/PARSER.ASM
diff options
context:
space:
mode:
Diffstat (limited to 'v4.0/src/DEV/ANSI/PARSER.ASM')
-rw-r--r--v4.0/src/DEV/ANSI/PARSER.ASM325
1 files changed, 325 insertions, 0 deletions
diff --git a/v4.0/src/DEV/ANSI/PARSER.ASM b/v4.0/src/DEV/ANSI/PARSER.ASM
new file mode 100644
index 0000000..8136db6
--- /dev/null
+++ b/v4.0/src/DEV/ANSI/PARSER.ASM
@@ -0,0 +1,325 @@
1PAGE ,132
2TITLE 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
56INCLUDE ANSI.INC ; ANSI equates and structures ;AN000;
57.XLIST
58INCLUDE STRUC.INC ; Structured macros ;AN000;
59
60INCLUDE SYSMSG.INC ; Message retriever code ;AN000;
61MSG_UTILNAME <ANSI> ; Let message retriever know its ANSI.SYS ;AN000;
62.LIST
63
64PUBLIC 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
72DateSW EQU 0 ;AN000;
73TimeSW EQU 0 ;AN000;
74CmpxSW EQU 0 ;AN000;
75DrvSW EQU 0 ;AN000;
76QusSW EQU 0 ;AN000;
77NumSW EQU 0 ;AN000;
78KeySW EQU 0 ;AN000;
79Val1SW EQU 0 ;AN000;
80Val2SW EQU 0 ;AN000;
81Val3SW EQU 0 ;AN000;
82
83
84CODE SEGMENT PUBLIC BYTE
85 ASSUME CS:CODE
86
87.XLIST
88MSG_SERVICES <MSGDATA> ;AN000;
89MSG_SERVICES <DISPLAYmsg,LOADmsg,CHARmsg> ;AN000;
90MSG_SERVICES <ANSI.CL1> ;AN000;
91MSG_SERVICES <ANSI.CL2> ;AN000;
92MSG_SERVICES <ANSI.CLA> ;AN000;
93
94INCLUDE PARSE.ASM ; Parsing code ;AN000;
95.LIST
96
97
98EXTRN SWITCH_X:BYTE ; /X switch flag ;AN000;
99extrn Switch_L:Byte ;AN002; /L switch flag
100extrn 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;
111PARMS LABEL WORD ;AN000;
112 DW PARMSX ;AN000;
113 DB 0 ; no extra delimeters or EOLs. ;AN000;
114 ;AN000;
115PARMSX 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;
122FILENAME 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;
129Switches 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
135X_SWITCH DB "/X",0 ;AN002; /X name
136L_SWITCH DB "/L",0 ;AN002; /L
137K_SWITCH DB "/K",0 ;AN003; /K
138
139NOVALS LABEL BYTE ;AN000;
140 DB 0 ; no value checking done ;AN000;
141
142RESULT_BUF LABEL BYTE ;AN000;
143 DB ? ; type returned (number, string, etc.) ;AN000;
144 DB ? ; matched item tag (if applicable) ;AN000;
145SYNONYM_PTR DW 0 ; synonym ptr (if applicable) ;AN000;
146 DD ? ; value ;AN000;
147 ;AN000;
148SUBLIST 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
158Old_SI dw ? ;AN001;
159Saved_Chr db 0 ;AN001;
160Continue_Flag db ON ;AN002;
161Parse_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
180PARSE_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;
251PARSE_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
271PARM_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
285Get_CR:
286 cmp byte ptr es:[si], 13 ;AN001;CR?
287 je Got_CR ;AN001;
288 inc si ;AN001;
289 jmp Get_CR ;AN001;
290Got_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;
320PARM_ERROR ENDP
321
322include msgdcl.inc
323
324CODE ENDS
325 END