summaryrefslogtreecommitdiff
path: root/v4.0/src/DEV/ANSI/PARSER.ASM
blob: 8136db678a4ac56f92b5bbbf7a0df6085fc60a4f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
PAGE	    ,132
TITLE	    PARSE CODE AND CONTROL BLOCKS FOR ANSI.SYS

;****************** START OF SPECIFICATIONS **************************
;
;  MODULE NAME: PARSER.ASM
;
;  DESCRIPTIVE NAME: PARSES THE DEVICE= STATEMENT IN CONFIG.SYS FOR
;		     ANSI.SYS
;
;  FUNCTION: THE COMMAND LINE PASSED TO ANSI.SYS IN THE CONFIG.SYS
;	     STATEMENT IS PARSED TO CHECK FOR THE /X SWITCH. A FLAG
;	     IS CLEARED IF NOT FOUND.
;
;  ENTRY POINT: PARSE_PARM
;
;  INPUT: DS:SI POINTS TO EVERYTHING AFTER DEVICE=
;
;  AT EXIT:
;     NORMAL: SWITCH FLAGS WILL BE SET IF /X or /L IS FOUND
;
;     ERROR: CARRY SET
;
;  INTERNAL REFERENCES:
;
;     ROUTINES: SYSLOADMSG - MESSAGE RETRIEVER LOADING CODE
;		SYSDISPMSG - MESSAGE RETRIEVER DISPLAYING CODE
;		PARM_ERROR - DISPLAYS ERROR MESSAGE
;		SYSPARSE - PARSING CODE
;
;     DATA AREAS: PARMS - PARSE CONTROL BLOCK FOR SYSPARSE
;
;  EXTERNAL REFERENCES:
;
;     ROUTINES: N/A
;
;     DATA AREAS: SWITCH - BYTE FLAG FOR EXISTENCE OF SWITCH PARAMETER
;
;  NOTES:
;
;  REVISION HISTORY:
;	    A000 - DOS Version 4.00
;
;      Label: "DOS ANSI.SYS Device Driver"
;	      "Version 4.00 (C) Copyright 1988 Microsoft"
;	      "Licensed Material - Program Property of Microsoft"
;
;****************** END OF SPECIFICATIONS ****************************
;Modification history**********************************************************
;AN001; P1529 ANSI /x /y gives wrong error message		   10/8/87 J.K.
;AN002; D397  /L option for "Enforcing" the line number            12/17/87 J.K.
;AN003; D479  An option to disable the extended keyboard functions 02/12/88 J.K.
;******************************************************************************


INCLUDE     ANSI.INC	    ; ANSI equates and structures				 ;AN000;
.XLIST
INCLUDE     STRUC.INC	    ; Structured macros 					 ;AN000;

INCLUDE     SYSMSG.INC	    ; Message retriever code					 ;AN000;
MSG_UTILNAME <ANSI>	    ; Let message retriever know its ANSI.SYS			 ;AN000;
.LIST

PUBLIC	    PARSE_PARM	     ; near procedure for parsing DEVICE= statement		 ;AN000;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Set assemble switches for parse code that is not required!!
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

DateSW	      EQU     0 								 ;AN000;
TimeSW	      EQU     0 								 ;AN000;
CmpxSW	      EQU     0 								 ;AN000;
DrvSW	      EQU     0 								 ;AN000;
QusSW	      EQU     0 								 ;AN000;
NumSW	      EQU     0 								 ;AN000;
KeySW	      EQU     0 								 ;AN000;
Val1SW	      EQU     0 								 ;AN000;
Val2SW	      EQU     0 								 ;AN000;
Val3SW	      EQU     0 								 ;AN000;


CODE	      SEGMENT  PUBLIC BYTE
	      ASSUME CS:CODE

.XLIST
MSG_SERVICES <MSGDATA>									 ;AN000;
MSG_SERVICES <DISPLAYmsg,LOADmsg,CHARmsg>						 ;AN000;
MSG_SERVICES <ANSI.CL1> 								 ;AN000;
MSG_SERVICES <ANSI.CL2> 								 ;AN000;
MSG_SERVICES <ANSI.CLA> 								 ;AN000;

INCLUDE     PARSE.ASM	    ; Parsing code						 ;AN000;
.LIST


EXTRN	    SWITCH_X:BYTE	 ; /X switch flag						 ;AN000;
extrn	    Switch_L:Byte	 ;AN002; /L switch flag
extrn	    Switch_K:Byte	 ;AN003; /K switch

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; PARM control blocks for ANSI
; Parsing DEVICE= statment from CONFIG.SYS
;
; DEVICE=[d:][path]ANSI.SYS [/X]
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
											 ;AN000;
PARMS	       LABEL WORD								 ;AN000;
	       DW	PARMSX								 ;AN000;
	       DB	0		   ; no extra delimeters or EOLs.		 ;AN000;
											 ;AN000;
PARMSX	       LABEL BYTE								 ;AN000;
	       DB	1,1		   ;AN001; 1 valid positional operand
	       DW	FILENAME	   ;AN001; filename
	       DB	1		   ;AN002; 1 switche definition in the following
	       DW	Switches	   ;AN002;
	       DB	0		   ;AN001; no keywords
											 ;AN000;
FILENAME       LABEL WORD								 ;AN000;
	       DW	0200H		   ; file spec					 ;AN000;
	       DW	0001H		   ; cap by file table				 ;AN000;
	       DW	RESULT_BUF	   ; result					 ;AN000;
	       DW	NOVALS		   ; no value checking done			 ;AN000;
	       DB	0		   ; no switch/keyword synonyms 		 ;AN000;
											 ;AN000;
Switches       LABEL WORD								 ;AN000;
	       DW	0		   ; switch with no value			 ;AN000;
	       DW	0		   ; no functions				 ;AN000;
	       DW	RESULT_BUF	   ; result					 ;AN000;
	       DW	NOVALS		   ; no value checking done			 ;AN000;
	       DB	3		   ;AN002;AN003; 3 switch synonym
X_SWITCH       DB	"/X",0             ;AN002; /X name
L_SWITCH       DB	"/L",0             ;AN002; /L
K_SWITCH       DB	"/K",0             ;AN003; /K

NOVALS	       LABEL BYTE								 ;AN000;
	       DB	0		   ; no value checking done			 ;AN000;

RESULT_BUF     LABEL BYTE								 ;AN000;
	       DB	?		   ; type returned (number, string, etc.)	 ;AN000;
	       DB	?		   ; matched item tag (if applicable)		 ;AN000;
SYNONYM_PTR    DW	0		   ; synonym ptr (if applicable)		 ;AN000;
	       DD	?		   ; value					 ;AN000;
											 ;AN000;
SUBLIST        LABEL DWORD		   ; list for substitution			 ;AN000;
	       DB	SUB_SIZE							 ;AN000;
	       DB	0								 ;AN000;
	       DD	?								 ;AN000;
	       DB	1								 ;AN000;
	       DB	LEFT_ASCIIZ							 ;AN000;
	       DB	UNLIMITED							 ;AN000;
	       DB	1								 ;AN000;
	       DB	" "                                                              ;AN000;

Old_SI		dw	?			;AN001;
Saved_Chr	db	0			;AN001;
Continue_Flag	db	ON			;AN002;
Parse_Err_Flag	db	OFF			;AN002;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; PROCEDURE_NAME: PARSE_PARM
;
; FUNCTION:
; THIS PROCEDURE PARSES THE DEVICE= PARAMETERS FROM THE INIT REQUEST
; BLOCK. ERROR MESSAGES ARE DISPLAYED ACCORDINGLY.
;
; AT ENTRY: DS:SI POINTS TO EVERYTHING AFTER THE DEVICE= STATEMENT
;
; AT EXIT:
;    NORMAL: CARRY CLEAR - SWITCH FLAG BYTE SET TO 1 IF /X FOUND
;
;    ERROR: CARRY SET
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

PARSE_PARM    PROC     NEAR								 ;AN000;
	      CALL     SYSLOADMSG		; load message				 ;AN000;
	      .IF C NEAR								 ;AN000;
		CALL	 SYSDISPMSG		; display error message 		 ;AN000;
		STC				; ensure carry still set		 ;AN000;
	      .ELSE NEAR								 ;AN000;
		PUSH	 CS			; establish ES ..			 ;AN000;
		POP	 ES			; addressability to data		 ;AN000;
		LEA	 DI,PARMS		; point to PARMS control block		 ;AN000;
		XOR	 CX,CX			; clear both CX and DX for		 ;AN000;
		XOR	 DX,DX			;  SYSPARSE				 ;AN000;
		CALL	 SYSPARSE		; move pointer past file spec		 ;AN000;
		mov	 Switch_L, OFF		;AN002;
		mov	 Switch_X, OFF		;AN002;
		.WHILE <Continue_Flag EQ ON>	;AN002;
		     mov Old_SI, SI		;AN001;to be use by PARM_ERROR
		     call SysParse		;AN002;
		     .IF <AX EQ RC_EOL> 	;AN002;
			mov Continue_Flag, OFF	;AN002;
		     .ELSE			;AN002;
			.IF <AX NE RC_NO_ERROR> ;AN002;
			   mov Continue_Flag, OFF    ;AN002;
			   mov Switch_X, OFF	;AN002;
			   mov Switch_L, OFF	;AN002;
			   mov Switch_K, OFF	;AN003;
			   call Parm_Error	;AN002;
			   mov Parse_Err_Flag,ON;AN002;
			.ELSE			;AN002;
			   .IF <Synonym_ptr EQ <offset X_SWITCH>>      ;AN002;
				mov	Switch_X, ON		       ;AN002;
			   .ELSE				       ;AN002;
			       .IF <Synonym_ptr EQ <offset L_SWITCH>>  ;AN003;
				    mov     Switch_L, ON ;AN002;
			       .ELSE			 ;AN003;Must be /K option.
				    mov     Switch_K, ON ;AN003;/K entered.
			       .ENDIF			 ;AN003;
			   .ENDIF			 ;AN002;
			    clc 		;AN002;
			.ENDIF			;AN002;
		     .ENDIF			;AN002;
		.ENDWHILE			;AN002;
		.IF <Parse_Err_Flag EQ ON>	;AN002;
		     stc			;AN002;
		.ELSE				;AN002;
		     clc			;AN002;
		.ENDIF				;AN002;
	      .ENDIF				;AN002;

;		 mov	  cs:Old_SI, SI 	 ;AN001; Save pointer to parm
;		 CALL	  SYSPARSE		 ; look for /X switch			  ;AN000;
;		 .IF <AX EQ RC_EOL>		 ; if EOL then..			  ;AN000;
;		    MOV     ES:SWITCH_X,0	 ;  no switch...clear flag		  ;AN000;
;		    CLC 			 ;  clear carry 			  ;AN000;
;		 .ELSE				 ; else..				  ;AN000;
;		    .IF <AX GT RC_NO_ERROR>	 ;AN001;If any error
;			call parm_error 	 ;AN001; the show the error msg
;			stc			 ;AN001;
;		    .ELSE			 ;  else..leave flag set..		  ;AN000;
;			mov   cs:Old_SI, SI	 ;AN001;
;		       CALL    SYSPARSE 	 ; check for further parms		  ;AN000;
;		       .IF <AX NE RC_EOL>	 ; if other parms then...		  ;AN000;
;			  CALL	 PARM_ERROR	 ; display 'Invalid parameter' message    ;AN000;
;			  STC			 ;  error!				  ;AN000;
;		       .ELSE			 ; no other parms so..			  ;AN000;
;			  CLC			 ;  clear carry 			  ;AN000;
;		       .ENDIF			 ;					  ;AN000;
;		    .ENDIF			 ;					  ;AN000;
;		 .ENDIF 			 ;					  ;AN000;
;	       .ENDIF				 ;					  ;AN000;

	      RET									 ;AN000;
PARSE_PARM    ENDP									 ;AN000;
											 ;AN000;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; PROCEDURE_NAME: PARM_ERROR
;
; FUNCTION:
; LOADS AND DISPLAYS "Invalid parameter" MESSAGE
;
; AT ENTRY:
;   DS:Old_SI -> parms that is invalid
;
; AT EXIT:
;    NORMAL: ERROR MESSAGE DISPLAYED
;
;    ERROR: N/A
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

PARM_ERROR    PROC   NEAR								 ;AN000;
	      PUSH   CX 								 ;AN000;
	      PUSH   SI 								 ;AN000;
	      PUSH   ES 		;						 ;AN000;
	      PUSH   DS 		;						 ;AN000;

;	       PUSH   CS		 ;						  ;AN000;
;	       POP    DS		 ; establish addressability			  ;AN000;
;	       MOV    BX,DX		 ;						  ;AN000;
;	       LES    DX,[BX].RES_PTR	 ; find offending parameter			  ;AN000;
	       push   ds		;AN001;
	       pop    es		;AN001;
	       mov    si, cs:Old_SI	;AN001;Now es:dx -> offending parms
	       push   si		;AN001;Save it
Get_CR:
	       cmp    byte ptr es:[si], 13 ;AN001;CR?
	       je     Got_CR		   ;AN001;
	       inc    si		   ;AN001;
	       jmp    Get_CR		   ;AN001;
Got_CR: 				   ;AN001;
	       inc    si		   ;AN001; The next char.
	       mov    al, byte ptr es:[si] ;AN001;
	       mov    cs:Saved_Chr, al	   ;AN001; Save the next char

	       mov    byte ptr es:[si], 0     ;AN001; and make it an ASCIIZ
	       mov    cs:Old_SI, si	;AN001; Set it again
	       pop    dx		;AN001; saved SI -> DX

	       push   cs		;AN001;
	       pop    ds		;AN001;for addressability

	      LEA    SI,SUBLIST 	; ..and place the offset..			 ;AN000;
	      MOV    [SI].SUB_PTR_O,DX	; ..in the SUBLIST..				 ;AN000;
	      MOV    [SI].SUB_PTR_S,ES	;						 ;AN000;
	      MOV    AX,INVALID_PARM	; load 'Invalid parameter' message number        ;AN000;
	      MOV    BX,STDERR		; to standard error				 ;AN000;
	      MOV    CX,ONE		; 1 substitution				 ;AN000;
	      XOR    DL,DL		; no input					 ;AN000;
	      MOV    DH,UTILITY_MSG_CLASS ; parse error 				 ;AN000;
	      CALL   SYSDISPMSG 	; display error message 			 ;AN000;
	      mov    si, cs:Old_SI	;AN001;restore the original char.
	      mov    cl, cs:Saved_Chr	;AN001;
	      mov    byte ptr es:[si], cl ;AN001;

	      POP    DS 								 ;AN000;
	      POP    ES 								 ;AN000;
	      POP    SI 								 ;AN000;
	      POP    CX 								 ;AN000;
	      RET									 ;AN000;
PARM_ERROR    ENDP

include msgdcl.inc

CODE	      ENDS
	      END