diff options
Diffstat (limited to 'v4.0/src/CMD/KEYB/PARSER.ASM')
| -rw-r--r-- | v4.0/src/CMD/KEYB/PARSER.ASM | 517 |
1 files changed, 517 insertions, 0 deletions
diff --git a/v4.0/src/CMD/KEYB/PARSER.ASM b/v4.0/src/CMD/KEYB/PARSER.ASM new file mode 100644 index 0000000..808f37a --- /dev/null +++ b/v4.0/src/CMD/KEYB/PARSER.ASM | |||
| @@ -0,0 +1,517 @@ | |||
| 1 | PAGE ,132 | ||
| 2 | TITLE PARSE CODE AND CONTROL BLOCKS FOR KEYB.COM | ||
| 3 | |||
| 4 | ;****************** START OF SPECIFICATIONS ************************** | ||
| 5 | ; | ||
| 6 | ; MODULE NAME: PARSER.ASM | ||
| 7 | ; | ||
| 8 | ; DESCRIPTIVE NAME: PARSES THE COMMAND LINE PARAMETERS FOR KEYB.COM | ||
| 9 | ; | ||
| 10 | ; FUNCTION: THE COMMAND LINE IN THE PSP IS PARSED FOR PARAMETERS. | ||
| 11 | ; | ||
| 12 | ; ENTRY POINT: PARSE_PARAMETERS | ||
| 13 | ; | ||
| 14 | ; INPUT: BP POINTS TO PARAMETER LIST | ||
| 15 | ; DS & ES POINT TO PSP | ||
| 16 | ; | ||
| 17 | ; AT EXIT: | ||
| 18 | ; PARAMETER LIST FILLED IN AS REQUIRED. | ||
| 19 | ; | ||
| 20 | ; INTERNAL REFERENCES: | ||
| 21 | ; | ||
| 22 | ; ROUTINES: SYSPARSE - PARSING CODE | ||
| 23 | ; | ||
| 24 | ; DATA AREAS: PARMS - PARSE CONTROL BLOCK FOR SYSPARSE | ||
| 25 | ; | ||
| 26 | ; EXTERNAL REFERENCES: | ||
| 27 | ; | ||
| 28 | ; ROUTINES: N/A | ||
| 29 | ; | ||
| 30 | ; DATA AREAS: PARAMETER LIST BLOCK TO BE FILLED. | ||
| 31 | ; | ||
| 32 | ; NOTES: | ||
| 33 | ; | ||
| 34 | ; REVISION HISTORY: | ||
| 35 | ; A000 - DOS Version 4.00 | ||
| 36 | ; 3/24/88 AN003 - P3906 PARSER changes to return "bogus" parameter on the | ||
| 37 | ; "Parameter value not allowed " message - CNS | ||
| 38 | ; 5/12/88 AN004 - P4867 /ID:NON-Numeric hangs the sytem as a 1st positional | ||
| 39 | ; | ||
| 40 | ; COPYRIGHT: "The KEYB.COM Keyboard Driver" | ||
| 41 | ; "Version 4.00 (C) Copyright 1988 Microsoft" | ||
| 42 | ; "Licensed Material - Program Property of Microsoft" | ||
| 43 | ; | ||
| 44 | ; PROGRAM AUTHOR: WGR | ||
| 45 | ; | ||
| 46 | ;****************** END OF SPECIFICATIONS **************************** | ||
| 47 | |||
| 48 | INCLUDE KEYBDCL.INC ;AN000 | ||
| 49 | |||
| 50 | ID_VALID EQU 0 ;AN000; ;AN000 | ||
| 51 | ID_INVALID EQU 1 ;AN000; ;AN000 | ||
| 52 | NO_ID EQU 2 ;AN000; ;AN000 | ||
| 53 | |||
| 54 | LANGUAGE_VALID EQU 0 ;AN000; ;AN000 | ||
| 55 | LANGUAGE_INVALID EQU 1 ;AN000; ;AN000 | ||
| 56 | NO_LANGUAGE EQU 2 ;AN000; ;AN000 | ||
| 57 | |||
| 58 | NO_IDLANG EQU 3 ;AN000; ;AN000 | ||
| 59 | |||
| 60 | CODE_PAGE_VALID EQU 0 ;AN000; ;AN000 | ||
| 61 | CODE_PAGE_INVALID EQU 1 ;AN000; ;AN000 | ||
| 62 | NO_CODE_PAGE EQU 2 ;AN000; ;AN000 | ||
| 63 | VALID_SYNTAX EQU 0 ;AN000; ;AN000 | ||
| 64 | INVALID_SYNTAX EQU 1 ;AN000; ;AN000 | ||
| 65 | |||
| 66 | COMMAND_LINE_START EQU 81H ;AN000; ;AN000 | ||
| 67 | RC_EOL EQU -1 ;AN000; ;AN000 | ||
| 68 | RC_NO_ERROR EQU 0 ;AN000; ;AN000 | ||
| 69 | RC_OP_MISSING EQU 2 ;AN000; ;AN000 | ||
| 70 | RC_NOT_IN_SW EQU 3 ;AN000; ;AN000 | ||
| 71 | ;***CNS P4867 1st CHECK for /ID:ALPHA | ||
| 72 | RC_SW_FIRST EQU 9 ;AN004; ;AN000 | ||
| 73 | ;***CNS P4867 1st CHECK for /ID:ALPHA | ||
| 74 | ERROR_COND EQU -1 ;AN000; ;AN000 | ||
| 75 | NUMBER EQU 1 ;AN000; ;AN000 | ||
| 76 | STRING EQU 3 ;AN000; ;AN000 | ||
| 77 | FILE_SPEC EQU 5 ;AN000; ;AN000 | ||
| 78 | MAX_ID EQU 999 ;AN000; ;AN000 | ||
| 79 | LANG_LENGTH EQU 2 ;AN000; ;AN000 | ||
| 80 | |||
| 81 | INVALID_SWITCH EQU 3 | ||
| 82 | TOO_MANY EQU 1 | ||
| 83 | INVALID_PARAM EQU 10 | ||
| 84 | VALUE_DISALLOW EQU 8 | ||
| 85 | |||
| 86 | .XLIST | ||
| 87 | INCLUDE STRUC.INC ; Structured macros ;AN000 | ||
| 88 | .LIST | ||
| 89 | |||
| 90 | PUBLIC PARSE_PARAMETERS ;AN003;; near procedure for parsing command line ;AN000 | ||
| 91 | PUBLIC CUR_PTR ;AN003;; near procedure for parsing command line ;AN000 | ||
| 92 | PUBLIC OLD_PTR ;AN003;; near procedure for parsing command line ;AN000 | ||
| 93 | PUBLIC ERR_PART;AN003;; near procedure for parsing command line ;AN000 | ||
| 94 | EXTRN BAD_ID:BYTE ;; WGR to match old code ;AN000; ;AN000 | ||
| 95 | EXTRN FOURTH_PARM:BYTE ;; WGR to match old code ;AN000; ;AN000 | ||
| 96 | EXTRN ONE_PARMID:BYTE ;; WGR to match old code ;AN000; ;AN000 | ||
| 97 | EXTRN FTH_PARMID:BYTE ;; WGR to match old code ;AN000; ;AN000 | ||
| 98 | EXTRN ALPHA:BYTE ;; WGR to match old code ;AN000; ;AN000 | ||
| 99 | |||
| 100 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 101 | ; | ||
| 102 | ; Set assemble switches for parse code that is not required!! | ||
| 103 | ; | ||
| 104 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 105 | |||
| 106 | DateSW EQU 0 ;AN000; ;AN000 | ||
| 107 | TimeSW EQU 0 ;AN000; ;AN000 | ||
| 108 | CmpxSW EQU 0 ;AN000; ;AN000 | ||
| 109 | DrvSW EQU 0 ;AN000; ;AN000 | ||
| 110 | QusSW EQU 0 ;AN000; ;AN000 | ||
| 111 | KeySW EQU 0 ;AN000; ;AN000 | ||
| 112 | Val1SW EQU 0 ;AN000; ;AN000 | ||
| 113 | Val2SW EQU 0 ;AN000; ;AN000 | ||
| 114 | Val3SW EQU 0 ;AN000; ;AN000 | ||
| 115 | |||
| 116 | |||
| 117 | CODE SEGMENT PUBLIC 'CODE' BYTE ;AN000; ;AN000 | ||
| 118 | ASSUME CS:CODE,DS:CODE ;AN000; ;AN000 | ||
| 119 | |||
| 120 | .XLIST | ||
| 121 | INCLUDE PARSE.ASM ; Parsing code ;AN000 | ||
| 122 | .LIST | ||
| 123 | |||
| 124 | |||
| 125 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 126 | ; PARM control blocks for KEYB | ||
| 127 | ; Parsing command line as follows: | ||
| 128 | ; | ||
| 129 | ; KEYB [lang],[cp],[[d:][path]KEYBOARD.SYS][/ID:id] | ||
| 130 | ; | ||
| 131 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 132 | |||
| 133 | PARMS LABEL WORD ;AN000; ;AN000 | ||
| 134 | DW PARMSX ;AN000; ;AN000 | ||
| 135 | DB 0 ;AN000;; no extra delimeters or EOLs. ;AN000 | ||
| 136 | |||
| 137 | PARMSX LABEL BYTE ;AN000; ;AN000 | ||
| 138 | DB 0,3 ;AN000;; min,max positional operands ;AN000 | ||
| 139 | DW LANG ;AN000;; pointer to control block ;AN000 | ||
| 140 | DW CP ;AN000;; pointer to control block ;AN000 | ||
| 141 | DW FILE_NAME ;AN000;; pointer to control block ;AN000 | ||
| 142 | DB 1 ;AN000;; 1 switch ;AN000 | ||
| 143 | DW ID_VALUE ;AN000;; pointer to control block ;AN000 | ||
| 144 | DB 0 ;AN000;; no keywords ;AN000 | ||
| 145 | |||
| 146 | LANG LABEL WORD ;AN000; ;AN000 | ||
| 147 | DW 0A001H ;AN000;; sstring or numeric value (optional) ;AN000 | ||
| 148 | DW 0002H ;AN000;; cap result by char table (sstring) ;AN000 | ||
| 149 | DW RESULT_BUF ;AN000;; result ;AN000 | ||
| 150 | DW NOVALS ;AN000;; no value checking done ;AN000 | ||
| 151 | DB 0 ;AN000;; no keyword/switch synonyms ;AN000 | ||
| 152 | |||
| 153 | CP LABEL WORD ;AN000; ;AN000 | ||
| 154 | DW 8001H ;AN000;; numeric ;AN000 | ||
| 155 | DW 0 ;AN000;; no functions ;AN000 | ||
| 156 | DW RESULT_BUF ;AN000;; result ;AN000 | ||
| 157 | DW NOVALS ;AN000;; no value checking done ;AN000 | ||
| 158 | DB 0 ;AN000;; no keyword/switch synonyms ;AN000 | ||
| 159 | |||
| 160 | FILE_NAME LABEL WORD ;AN000; ;AN000 | ||
| 161 | DW 0201H ;AN000;; file spec ;AN000 | ||
| 162 | DW 0001H ;AN000;; cap by file table ;AN000 | ||
| 163 | DW RESULT_BUF ;AN000;; result ;AN000 | ||
| 164 | DW NOVALS ;AN000;; no value checking done ;AN000 | ||
| 165 | DB 0 ;AN000;; no keyword/switch synonyms ;AN000 | ||
| 166 | |||
| 167 | ID_VALUE LABEL WORD ;AN000; ;AN000 | ||
| 168 | DW 8010H ;AN000;; numeric ;AN000 | ||
| 169 | DW 0 ;AN000;; no functions ;AN000 | ||
| 170 | DW RESULT_BUF ;AN000;; result ;AN000 | ||
| 171 | DW NOVALS ;AN000;; no value checking done ;AN000 | ||
| 172 | DB 1 ;AN000;; 1 switch synonym ;AN000 | ||
| 173 | DB "/ID",0 ;AN000;; ID switch ;AN000 | ||
| 174 | |||
| 175 | NOVALS LABEL BYTE ;AN000; ;AN000 | ||
| 176 | DB 0 ;AN000;; no value checking done ;AN000 | ||
| 177 | |||
| 178 | RESULT_BUF LABEL BYTE ;AN000; ;AN000 | ||
| 179 | RESULT_TYPE DB 0 ;AN000;; type returned (number, string, etc.) ;AN000 | ||
| 180 | DB ? ;AN000;; matched item tag (if applicable) ;AN000 | ||
| 181 | RESULT_SYN_PTR DW ? ;AN000;; synonym ptr (if applicable) ;AN000 | ||
| 182 | RESULT_VAL DD ? ;AN000;; value ;AN000 | ||
| 183 | |||
| 184 | LOOP_COUNT DB 0 ;AN000;; keeps track of parameter position ;AN000 | ||
| 185 | ;***CNS | ||
| 186 | CUR_PTR DW 0 ;AN003;; keeps track of parameter position ;AN000 | ||
| 187 | OLD_PTR DW 0 ;AN003;; keeps track of parameter position ;AN000 | ||
| 188 | ERR_PART DW 0 ;AN003;; keeps track of parameter position ;AN000 | ||
| 189 | ;***CNS | ||
| 190 | ;AN000;; ..and reports an error condition ;AN000 | ||
| 191 | TEMP_FILE_NAME DB 128 DUP(0) ;AN000;; place for file name ;AN000 | ||
| 192 | |||
| 193 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 194 | ; | ||
| 195 | ; PROCEDURE_NAME: PARSE_PARAMETERS | ||
| 196 | ; | ||
| 197 | ; FUNCTION: | ||
| 198 | ; THIS PROCEDURE PARSES THE COMMAND LINE PARAMETERS IN THE PSP FOR | ||
| 199 | ; KEYB.COM. THE PARAMETER LIST BLOCK IS FILLED IN ACCORDINGLY. | ||
| 200 | ; | ||
| 201 | ; AT ENTRY: AS ABOVE. | ||
| 202 | ; | ||
| 203 | ; AT EXIT: | ||
| 204 | ; AS ABOVE. | ||
| 205 | ; | ||
| 206 | ; AUTHOR: WGR | ||
| 207 | ; | ||
| 208 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 209 | |||
| 210 | PARSE_PARAMETERS PROC NEAR ;AN000 | ||
| 211 | XOR AX,AX ;AN000;; setup default parameters. ;AN000 | ||
| 212 | MOV [BP].RET_CODE_1,NO_IDLANG ;AN000;; ;AN000 | ||
| 213 | MOV [BP].RET_CODE_2,NO_CODE_PAGE ;AN000;; ;AN000 | ||
| 214 | MOV [BP].RET_CODE_3,VALID_SYNTAX ;AN000;; ;AN000 | ||
| 215 | MOV [BP].RET_CODE_4,NO_ID ;AN000;; ;AN000 | ||
| 216 | MOV [BP].PATH_LENGTH,AX ;AN000;; ;AN000 | ||
| 217 | LEA DI,PARMS ;AN000;; setup parse blocks ;AN000 | ||
| 218 | MOV SI,COMMAND_LINE_START ;AN000;; ;AN000 | ||
| 219 | ;***CNS | ||
| 220 | |||
| 221 | PUSH AX ;AN003;Save environment | ||
| 222 | MOV AX,CUR_PTR ;AN003;Set advancing ptr to end of argument | ||
| 223 | MOV OLD_PTR,AX ;AN003;after saving the beginning the string | ||
| 224 | MOV CUR_PTR,SI ;AN003; | ||
| 225 | POP AX ;AN003;Restore the environment | ||
| 226 | |||
| 227 | ;***CNS | ||
| 228 | XOR CX,CX ;AN000;; ;AN000 | ||
| 229 | XOR DX,DX ;AN000;; ;AN000 | ||
| 230 | CALL SYSPARSE ;AN000;; ;AN000 | ||
| 231 | .WHILE <AX NE RC_EOL> near AND ;AN000;; while not end of line and.. ;AN000 | ||
| 232 | .WHILE <LOOP_COUNT NE ERROR_COND> near ;AN000;; parameters valid do. ;AN000 | ||
| 233 | .IF <AX EQ RC_NOT_IN_SW> near OR ;AN000;; invalid switch? ;AN000 | ||
| 234 | .IF <AX EQ RC_SW_FIRST> near ;AN000;; invalid switch? ;AN000 | ||
| 235 | MOV [BP].RET_CODE_3,INVALID_SYNTAX ;AN000;; set invalid syntax flag. ;AN000 | ||
| 236 | MOV LOOP_COUNT,ERROR_COND ;AN000;; set error flag to exit parse. ;AN000 | ||
| 237 | ;***CNS | ||
| 238 | MOV ERR_PART,INVALID_SWITCH | ||
| 239 | PUSH AX ;AN003;Save environment | ||
| 240 | MOV AX,CUR_PTR ;AN003;Set advancing ptr to end of argument | ||
| 241 | MOV OLD_PTR,AX ;AN003;after saving the beginning the string | ||
| 242 | MOV CUR_PTR,SI ;AN003; | ||
| 243 | POP AX ;AN003;Restore the environment | ||
| 244 | |||
| 245 | ;***CNS | ||
| 246 | .ELSE ;AN000;; ;AN000 | ||
| 247 | .IF <RESULT_SYN_PTR NE 0> ;AN000;; was the switch found? ;AN000 | ||
| 248 | MOV AX,WORD PTR RESULT_VAL+2 ;AN000;; is it valid? ;AN000 | ||
| 249 | OR AX,AX ;AN000;; ;AN000 | ||
| 250 | .IF NZ OR ;AN000;; ;AN000 | ||
| 251 | MOV AX,WORD PTR RESULT_VAL ;AN000;; ;AN000 | ||
| 252 | .IF <AX A MAX_ID> ;AN000;; ;AN000 | ||
| 253 | MOV [BP].RET_CODE_1,ID_INVALID ;AN000;; no...invalid id. ;AN000 | ||
| 254 | MOV [BP].RET_CODE_3,INVALID_SYNTAX ;AN000;; syntax error. ;AN000 | ||
| 255 | MOV LOOP_COUNT,ERROR_COND ;AN000;; set flag to exit parse ;AN000 | ||
| 256 | mov bad_id,1 ;AN000;; ;AN000 | ||
| 257 | ;***CNS | ||
| 258 | |||
| 259 | PUSH AX ;AN003;Save environment | ||
| 260 | MOV AX,CUR_PTR ;AN003;Set advancing ptr to end of argument | ||
| 261 | MOV OLD_PTR,AX ;AN003;after saving the beginning the string | ||
| 262 | MOV CUR_PTR,SI ;AN003; | ||
| 263 | POP AX ;AN003;Restore the environment | ||
| 264 | |||
| 265 | ;***CNS | ||
| 266 | .ELSE ;AN000;; ;AN000 | ||
| 267 | MOV [BP].RET_CODE_4,ID_VALID ;AN000;; yes...set return code 4. ;AN000 | ||
| 268 | MOV [BP].ID_PARM,AX ;AN000;; ;AN000 | ||
| 269 | mov fourth_parm,1 ;AN000;; ;AN000 | ||
| 270 | mov fth_parmid,1 ;AN000;; ;AN000 | ||
| 271 | .ENDIF ;AN000;; ;AN000 | ||
| 272 | .ELSE ;AN000;; ;AN000 | ||
| 273 | INC LOOP_COUNT ;AN000;; positional encountered... ;AN000 | ||
| 274 | .SELECT ;AN000;; ;AN000 | ||
| 275 | .WHEN <LOOP_COUNT EQ 1> ;AN000;; check for language ;AN000 | ||
| 276 | CALL PROCESS_1ST_PARM ;AN000;; ;AN000 | ||
| 277 | |||
| 278 | ;***CNS | ||
| 279 | |||
| 280 | PUSH AX ;AN003;Save environment | ||
| 281 | MOV AX,CUR_PTR ;AN003;Set advancing ptr to end of argument | ||
| 282 | MOV OLD_PTR,AX ;AN003;after saving the beginning the string | ||
| 283 | MOV CUR_PTR,SI ;AN003; | ||
| 284 | POP AX ;AN003;Restore the environment | ||
| 285 | ;***CNS | ||
| 286 | |||
| 287 | |||
| 288 | .WHEN <LOOP_COUNT EQ 2> ;AN000;; check for code page ;AN000 | ||
| 289 | CALL PROCESS_2ND_PARM ;AN000;; ;AN000 | ||
| 290 | ;***CNS | ||
| 291 | |||
| 292 | PUSH AX ;AN003;Save environment | ||
| 293 | MOV AX,CUR_PTR ;AN003;Set advancing ptr to end of argument | ||
| 294 | MOV OLD_PTR,AX ;AN003;after saving the beginning the string | ||
| 295 | MOV CUR_PTR,SI ;AN003; | ||
| 296 | POP AX ;AN003;Restore the environment | ||
| 297 | ;***CNS | ||
| 298 | .WHEN <LOOP_COUNT EQ 3> ;AN000;; check for file name ;AN000 | ||
| 299 | CALL PROCESS_3RD_PARM ;AN000;; ;AN000 | ||
| 300 | ;***CNS | ||
| 301 | |||
| 302 | PUSH AX ;AN003;Save environment | ||
| 303 | MOV AX,CUR_PTR ;AN003;Set advancing ptr to end of argument | ||
| 304 | MOV OLD_PTR,AX ;AN003;after saving the beginning the string | ||
| 305 | MOV CUR_PTR,SI ;AN003; | ||
| 306 | POP AX ;AN003;Restore the environment | ||
| 307 | ;***CNS | ||
| 308 | .OTHERWISE ;AN000;; ;AN000 | ||
| 309 | MOV [BP].RET_CODE_3,INVALID_SYNTAX ;AN000;; too many parms ;AN000 | ||
| 310 | ;***CNS | ||
| 311 | |||
| 312 | PUSH AX ;AN003;Save environment | ||
| 313 | MOV AX,CUR_PTR ;AN003;Set advancing ptr to end of argument | ||
| 314 | MOV OLD_PTR,AX ;AN003;after saving the beginning the string | ||
| 315 | MOV CUR_PTR,SI ;AN003; | ||
| 316 | POP AX ;AN003;Restore the environment | ||
| 317 | ;***CNS | ||
| 318 | MOV ERR_PART,TOO_MANY | ||
| 319 | MOV LOOP_COUNT,ERROR_COND ;AN000;; set error flag to exit parse. ;AN000 | ||
| 320 | .ENDSELECT ;AN000;; ;AN000 | ||
| 321 | .ENDIF ;AN000;; ;AN000 | ||
| 322 | MOV RESULT_TYPE,0 ;AN000;; reset result block. ;AN000 | ||
| 323 | CALL SYSPARSE ;AN000;; parse next parameter. ;AN000 | ||
| 324 | .ENDIF ;AN000;; ;AN000 | ||
| 325 | .ENDWHILE ;AN000;; ;AN000 | ||
| 326 | .IF <[BP].RET_CODE_4 EQ ID_VALID> AND ;AN000;; ensure that if the switch ;AN000 | ||
| 327 | .IF <[BP].RET_CODE_1 NE LANGUAGE_VALID> ;AN000;; was used..that a valid keyboard ;AN000 | ||
| 328 | MOV [BP].RET_CODE_3,INVALID_SYNTAX ;AN000;; code was used.. ;AN000 | ||
| 329 | ;***CNS | ||
| 330 | |||
| 331 | PUSH AX ;AN003;Save environment | ||
| 332 | MOV AX,CUR_PTR ;AN003;Set advancing ptr to end of argument | ||
| 333 | MOV OLD_PTR,AX ;AN003;after saving the beginning the string | ||
| 334 | MOV CUR_PTR,SI ;AN003; | ||
| 335 | POP AX ;AN003;Restore the environment | ||
| 336 | MOV ERR_PART,VALUE_DISALLOW | ||
| 337 | ;***CNS | ||
| 338 | .ENDIF ;AN000;; ;AN000 | ||
| 339 | RET ;AN000;; ;AN000 | ||
| 340 | PARSE_PARAMETERS ENDP ;AN000; ;AN000 | ||
| 341 | |||
| 342 | |||
| 343 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 344 | ; | ||
| 345 | ; PROCEDURE_NAME: PROCESS_1ST_PARM | ||
| 346 | ; | ||
| 347 | ; FUNCTION: | ||
| 348 | ; THIS PROCEDURE PROCESSES THE FIRST POSITIONAL PARAMETER. THIS SHOULD | ||
| 349 | ; BE THE LANGUAGE ID OR THE KEYBOARD ID. | ||
| 350 | ; | ||
| 351 | ; AT ENTRY: PARSE RESULT BLOCK CONTAINS VALUES IF AX HAS NO ERROR. | ||
| 352 | ; | ||
| 353 | ; AT EXIT: | ||
| 354 | ; PARAMETER CONTROL BLOCK UPDATED FOR LANGUAGE ID. | ||
| 355 | ; | ||
| 356 | ; AUTHOR: WGR | ||
| 357 | ; | ||
| 358 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 359 | |||
| 360 | PROCESS_1ST_PARM PROC NEAR ;AN000 | ||
| 361 | .IF <AX GT RC_NO_ERROR> ;AN000;; error on parse? ;AN000 | ||
| 362 | MOV [BP].RET_CODE_1,LANGUAGE_INVALID ;AN000;; yes...set invalid language ;AN000 | ||
| 363 | MOV [BP].RET_CODE_3,INVALID_SYNTAX ;AN000;; and syntax error.. ;AN000 | ||
| 364 | MOV LOOP_COUNT,ERROR_COND ;AN000;; set flag to exit parse. ;AN000 | ||
| 365 | MOV ERR_PART,AX ;AN003;; | ||
| 366 | .ELSE near ;AN000;; ;AN000 | ||
| 367 | |||
| 368 | .IF <RESULT_TYPE EQ NUMBER> ;AN000;; was this a number (id)? ;AN000 | ||
| 369 | MOV AX,WORD PTR RESULT_VAL+2 ;AN000;; yes...check to see if ;AN000 | ||
| 370 | OR AX,AX ;AN000;; within range. ;AN000 | ||
| 371 | .IF NZ OR ;AN000;; ;AN000 | ||
| 372 | MOV AX,WORD PTR RESULT_VAL ;AN000;; ;AN000 | ||
| 373 | .IF <AX A MAX_ID> ;AN000;; ;AN000 | ||
| 374 | MOV [BP].RET_CODE_1,ID_INVALID ;AN000;; no...invalid id. ;AN000 | ||
| 375 | MOV [BP].RET_CODE_3,INVALID_SYNTAX ;AN000;; syntax error. ;AN000 | ||
| 376 | MOV LOOP_COUNT,ERROR_COND ;AN000;; set flag to exit parse ;AN000 | ||
| 377 | mov bad_id,1 ;AN000;; ;AN000 | ||
| 378 | .ELSE ;AN000;; ;AN000 | ||
| 379 | MOV [BP].RET_CODE_1,ID_VALID ;AN000;; valid id...set ;AN000 | ||
| 380 | MOV [BP].RET_CODE_4,ID_VALID ;AN000;; valid id...set ;AN000 | ||
| 381 | MOV [BP].ID_PARM,AX ;AN000;; and value moved into block ;AN000 | ||
| 382 | MOV LOOP_COUNT,4 ;AN000;; there should be no more parms ;AN000 | ||
| 383 | mov one_parmid,1 ;AN000;; ;AN000 | ||
| 384 | .ENDIF ;AN000;; ;AN000 | ||
| 385 | .ELSEIF <RESULT_TYPE EQ STRING> ;AN000;; must be a string then.. ;AN000 | ||
| 386 | PUSH SI ;AN000;; ;AN000 | ||
| 387 | PUSH DI ;AN000;; ;AN000 | ||
| 388 | PUSH CX ;AN000;; ;AN000 | ||
| 389 | PUSH DS ;AN000;; ;AN000 | ||
| 390 | LDS SI,RESULT_VAL ;AN000;; get ptr to string ;AN000 | ||
| 391 | MOV DI,BP ;AN000;; ;AN000 | ||
| 392 | ADD DI,LANGUAGE_PARM ;AN000;; point to block for copy. ;AN000 | ||
| 393 | MOV CX,LANG_LENGTH ;AN000;; maximum length = 2 ;AN000 | ||
| 394 | LODSB ;AN000;; load AL with 1st char.. ;AN000 | ||
| 395 | .WHILE <CX NE 0> AND ;AN000;; do twice....unless ;AN000 | ||
| 396 | .WHILE <AL NE 0> ;AN000;; there is only 1 character. ;AN000 | ||
| 397 | STOSB ;AN000;; store ;AN000 | ||
| 398 | DEC CX ;AN000;; dec count ;AN000 | ||
| 399 | LODSB ;AN000;; load ;AN000 | ||
| 400 | .ENDWHILE ;AN000;; ;AN000 | ||
| 401 | .IF <CX NE 0> OR ;AN000;; if there was less than 2 or.. ;AN000 | ||
| 402 | .IF <AL NE 0> ;AN000;; greater than 2 characters then.. ;AN000 | ||
| 403 | MOV [BP].RET_CODE_1,LANGUAGE_INVALID ;AN000;; invalid. ;AN000 | ||
| 404 | MOV [BP].RET_CODE_3,INVALID_SYNTAX ;AN000;; syntax error ;AN000 | ||
| 405 | MOV ERR_PART,INVALID_PARAM | ||
| 406 | MOV LOOP_COUNT,ERROR_COND ;AN000;; set flag to exit parse. ;AN000 | ||
| 407 | .ELSE ;AN000;; ;AN000 | ||
| 408 | MOV [BP].RET_CODE_1,LANGUAGE_VALID ;AN000;; valid language has been copied ;AN000 | ||
| 409 | MOV ALPHA,1 ;AN000;; language found ;AN000 | ||
| 410 | .ENDIF ;AN000;; ;AN000 | ||
| 411 | POP DS ;AN000;; ;AN000 | ||
| 412 | POP CX ;AN000;; ;AN000 | ||
| 413 | POP DI ;AN000;; ;AN000 | ||
| 414 | POP SI ;AN000;; ;AN000 | ||
| 415 | .ELSE ;AN000;; ommited parameter... ;AN000 | ||
| 416 | MOV [BP].RET_CODE_3,INVALID_SYNTAX ;AN000;; invalid since further parameters.;AN000 | ||
| 417 | .ENDIF ;AN000;; ;AN000 | ||
| 418 | .ENDIF ;AN000;; ;AN000 | ||
| 419 | RET ;AN000;; ;AN000 | ||
| 420 | PROCESS_1ST_PARM ENDP ;AN000; ;AN000 | ||
| 421 | |||
| 422 | |||
| 423 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 424 | ; | ||
| 425 | ; PROCEDURE_NAME: PROCESS_2ND_PARM | ||
| 426 | ; | ||
| 427 | ; FUNCTION: | ||
| 428 | ; THIS PROCEDURE PROCESSES THE 2ND POSITIONAL PARAMETER. THIS SHOULD | ||
| 429 | ; BE THE CODE PAGE, IF REQUESTED. | ||
| 430 | ; | ||
| 431 | ; AT ENTRY: PARSE RESULT BLOCK CONTAINS VALUES IF AX HAS NO ERROR. | ||
| 432 | ; | ||
| 433 | ; AT EXIT: | ||
| 434 | ; PARAMETER CONTROL BLOCK UPDATED FOR CODE PAGE. | ||
| 435 | ; | ||
| 436 | ; AUTHOR: WGR | ||
| 437 | ; | ||
| 438 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 439 | |||
| 440 | PROCESS_2ND_PARM PROC NEAR ;AN000 | ||
| 441 | .IF <AX GT RC_NO_ERROR> ;AN000;; if parse error.. ;AN000 | ||
| 442 | MOV [BP].RET_CODE_2,CODE_PAGE_INVALID ;AN000;; mark invalid.. ;AN000 | ||
| 443 | MOV [BP].RET_CODE_3,INVALID_SYNTAX ;AN000;; syntax error ;AN000 | ||
| 444 | MOV LOOP_COUNT,ERROR_COND ;AN000;; set flag to exit parse ;AN000 | ||
| 445 | MOV ERR_PART,AX ;AN003;; | ||
| 446 | .ELSE ;AN000;; ;AN000 | ||
| 447 | .IF <RESULT_TYPE EQ NUMBER> ;AN000;; was parameter specified? ;AN000 | ||
| 448 | MOV AX,WORD PTR RESULT_VAL+2 ;AN000;; yes..if code page not.. ;AN000 | ||
| 449 | OR AX,AX ;AN000;; ;AN000 | ||
| 450 | .IF NZ OR ;AN000;; ;AN000 | ||
| 451 | MOV AX,WORD PTR RESULT_VAL ;AN000;; valid..then ;AN000 | ||
| 452 | .IF <AX A MAX_ID> ;AN000;; ;AN000 | ||
| 453 | MOV [BP].RET_CODE_2,CODE_PAGE_INVALID ;AN000;; mark invalid.. ;AN000 | ||
| 454 | MOV [BP].RET_CODE_3,INVALID_SYNTAX ;AN000;; syntax error ;AN000 | ||
| 455 | MOV LOOP_COUNT,ERROR_COND ;AN000;; set flag to exit parse ;AN000 | ||
| 456 | .ELSE ;AN000;; ;AN000 | ||
| 457 | MOV [BP].RET_CODE_2,CODE_PAGE_VALID;AN000;; else...valid code page ;AN000 | ||
| 458 | MOV [BP].CODE_PAGE_PARM,AX ;AN000;; move into parm ;AN000 | ||
| 459 | .ENDIF ;AN000;; ;AN000 | ||
| 460 | .ELSE ;AN000;; ;AN000 | ||
| 461 | MOV [BP].RET_CODE_2,NO_CODE_PAGE ;AN000;; mark as not specified. ;AN000 | ||
| 462 | .ENDIF ;AN000;; ;AN000 | ||
| 463 | .ENDIF ;AN000;; ;AN000 | ||
| 464 | RET ;AN000;; ;AN000 | ||
| 465 | PROCESS_2ND_PARM ENDP ;AN000; ;AN000 | ||
| 466 | |||
| 467 | |||
| 468 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 469 | ; | ||
| 470 | ; PROCEDURE_NAME: PROCESS_3RD_PARM | ||
| 471 | ; | ||
| 472 | ; FUNCTION: | ||
| 473 | ; THIS PROCEDURE PROCESSES THE 3RD POSITIONAL PARAMETER. THIS SHOULD | ||
| 474 | ; BE THE KEYBOARD DEFINITION FILE PATH, IF SPECIFIED. | ||
| 475 | ; | ||
| 476 | ; AT ENTRY: PARSE RESULT BLOCK CONTAINS VALUES IF AX HAS NO ERROR. | ||
| 477 | ; | ||
| 478 | ; AT EXIT: | ||
| 479 | ; PARAMETER CONTROL BLOCK UPDATED FOR FILE NAME. | ||
| 480 | ; | ||
| 481 | ; AUTHOR: WGR | ||
| 482 | ; | ||
| 483 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 484 | |||
| 485 | PROCESS_3RD_PARM PROC NEAR ;AN000; ;AN000 | ||
| 486 | .IF <AX GT RC_NO_ERROR> ;AN000;; if parse error then.. ;AN000 | ||
| 487 | MOV [BP].RET_CODE_3,INVALID_SYNTAX ;AN000;; syntax error. ;AN000 | ||
| 488 | MOV LOOP_COUNT,ERROR_COND ;AN000;; set flag to exit parse ;AN000 | ||
| 489 | MOV ERR_PART,AX ;AN003;; | ||
| 490 | .ELSE ;AN000;; ;AN000 | ||
| 491 | .IF <RESULT_TYPE EQ FILE_SPEC> ;AN000;; ;AN000 | ||
| 492 | PUSH DS ;AN000;; ;AN000 | ||
| 493 | PUSH SI ;AN000;; ;AN000 | ||
| 494 | PUSH DI ;AN000;; ;AN000 | ||
| 495 | PUSH CX ;AN000;; ;AN000 | ||
| 496 | LDS SI,RESULT_VAL ;AN000;; load offset of file name ;AN000 | ||
| 497 | LEA DI,TEMP_FILE_NAME ;AN000;; ;AN000 | ||
| 498 | MOV [BP].PATH_OFFSET,DI ;AN000;; copy to parameter block ;AN000 | ||
| 499 | XOR CX,CX ;AN000;; ;AN000 | ||
| 500 | LODSB ;AN000;; count the length of the path. ;AN000 | ||
| 501 | .WHILE <AL NE 0> ;AN000;; ;AN000 | ||
| 502 | STOSB ;AN000;; ;AN000 | ||
| 503 | LODSB ;AN000;; ;AN000 | ||
| 504 | INC CX ;AN000;; ;AN000 | ||
| 505 | .ENDWHILE ;AN000;; ;AN000 | ||
| 506 | MOV [BP].PATH_LENGTH,CX ;AN000;; copy to parameter block ;AN000 | ||
| 507 | POP CX ;AN000;; ;AN000 | ||
| 508 | POP DI ;AN000;; ;AN000 | ||
| 509 | POP SI ;AN000;; ;AN000 | ||
| 510 | POP DS ;AN000;; ;AN000 | ||
| 511 | .ENDIF ;AN000;; ;AN000 | ||
| 512 | .ENDIF ;AN000;; ;AN000 | ||
| 513 | RET ;AN000;; ;AN000 | ||
| 514 | PROCESS_3RD_PARM ENDP ;AN000; ;AN000 | ||
| 515 | ;AN000; | ||
| 516 | CODE ENDS ;AN000; | ||
| 517 | END ;AN000; | ||