diff options
Diffstat (limited to 'v4.0/src/DEV/ANSI/PARSER.ASM')
| -rw-r--r-- | v4.0/src/DEV/ANSI/PARSER.ASM | 325 |
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 @@ | |||
| 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 | ||