]> wirehaze git hosting - MS-DOS.git/blob - v4.0/src/CMD/MODE/MODEPARS.ASM

wirehaze git hosting

MZ is back!
[MS-DOS.git] / v4.0 / src / CMD / MODE / MODEPARS.ASM
1
2 PAGE ,132 ;\ f
3 TITLE MODE COMMAND - COMMAND PARSING
4 .XLIST ;AN000;
5 INCLUDE STRUC.INC ;AN000;
6 .LIST ;AN000;
7 ;.SALL ;AN000;
8
9
10 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
11 ;º º
12
13 ; AC001 - P3259: When "/STATUS" was only parameter was returning "Invalid
14 ; number of parameters". When "/STATUS" was first parameter
15 ; the device name was not being recognized.
16
17 ; AC002 - P3258, PS/2 only COM parameters were being allowed on non-PS/2
18 ; P3540: machines. Added checks for baud=19200, parity=mark or space,
19 ; data=5 or 6, stop=1.5 for both keyword and positional forms.
20
21 ; AC003 - P3451: Wasn't treating semicolons as a valid blank-like delimeter.
22
23
24 ; AC004 - P3456: /STAT wasn't included in all checks for valid forms of /STATUS.
25 ; "BW" and "CO" were being accepted as valid parms.
26
27 ; AC005 - P3796: PRN /STA returned "Invalid parameter -" when worked OK for
28 ; LPT1.
29
30 ; AC006 - P3932: Was issuing "Invalid parameter - ???" for switches that are
31 ; not valid, now issue "Invalid switch - ???".
32
33 ; AC007 - P3931: "CON SEL=850" acts like a status request, should return
34 ; "Invalid number of parameters" because user forgot "CP".
35
36 ; AX008 - P5183: Was denying 19200 baud on PS/2 model 30s and 25s and VAILs.
37
38 ;º º
39 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
40
41
42
43 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
44 ;º º
45
46
47 BREAK MACRO X ;AN000;
48 JMP endcase_&X ;AN000;
49 ENDM ;AN000;
50
51 ;-------------------------------------------------------------------------------
52
53 DISPLAY MACRO MESSAGE ;AN000;
54 MOV DX,MESSAGE ;AN000;
55 CALL PRINTF ;AN000;
56 ENDM
57
58 ;-------------------------------------------------------------------------------
59
60 check_for_lpt_keyword MACRO ;AN000;
61
62 MOV DL,number_of_lpt_keywords ;;AN000;Initialize
63 MOV number_of_keywords,DL ;;AN000; for call to check_for_keyword
64 MOV BP,OFFSET start_lpt_keyword_ptrs ;;AN000;start_of_keyword_ptrs=[BP]
65 CALL check_for_keyword ;AN000;
66
67 ENDM ;AN000;
68
69 ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
70
71 ;³ DELETE_PARSER_VALUE_LIST_ENTRY
72 ;³ -------------------------------
73
74 ;³ As the logic in PARSE_PARAMETERS proceeds the posibilities for the next parm
75 ;³ become apparent and the parser control blocks need to be changed to correctly
76 ;³ parse the next parm. This MACRO is the interface to the approptiate routine which
77 ;³ modifies the list of strings or keywords in the VALUES block.
78
79
80
81
82
83 ;³ INPUT: item_type - scalar indicating that a string or keyword is to be deleted
84
85 ;³ item - A scalar immediate that indicates the string or keyword to
86 ;³ be "deleted"
87
88
89 ;³ RETURN: none
90
91
92 ;³ MESSAGES: none
93
94
95
96
97 ;³ REGISTER
98 ;³ USAGE: "item" is put into BX.
99
100
101
102 ;³ CONVENTIONS:
103
104
105
106 ;³ ASSUMPTIONS: All the input are valid.
107
108
109
110
111
112
113
114
115
116
117 ;³ SIDE EFFECT:
118
119
120 ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
121
122 delete_parser_value_list_entry MACRO item_type,item ;AN000;
123
124 ;MOV BX,item ;AN000;
125 CALL item_type ;AN000;
126
127 ENDM ;AN000;
128
129
130 ;-------------------------------------------------------------------------------
131
132 ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
133
134 ;³ MODIFY_PARSER_CONTROL_BLOCK
135 ;³ ---------------------------
136
137 ;³ As the logic in PARSE_PARAMETERS proceeds the posibilities for the next parm
138 ;³ become apparent and the parser control blocks need to be changed to correctly
139 ;³ parse the next parm. This MACRO is the interface to the routines that modify
140 ;³ those control blocks.
141
142
143
144
145
146 ;³ INPUT: control_structure - A scalar immediate indicating the control block
147 ;³ to be modified, and the routine to call.
148
149 ;³ action - A scalar immediate that indicates the nature
150 ;³ of the modification to be made.
151
152 ;³ item - A scalar immediate that indicates the string, number,
153 ;³ keywords, switch, or match flags mask involved.
154
155 ;³ RETURN: none
156
157
158 ;³ MESSAGES: none
159
160
161
162
163 ;³ REGISTER
164 ;³ USAGE: The scalar value for the modifier will be put in a register
165 ;³ for passing to the routine that actually does the work.
166
167
168 ;³ CONVENTIONS:
169
170
171
172 ;³ ASSUMPTIONS: All the input are valid.
173
174
175 ;³ SIDE EFFECT:
176
177
178 ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
179
180 modify_parser_control_block MACRO control_structure,action,item ;AN000;
181
182 PUSH BX ;AN000;
183
184 MOV BX,action ;AN000;
185 MOV AL,item ;AN000;
186 CALL control_structure ;AN000;
187
188 POP BX ;AN000;
189
190 ENDM ;AN000;
191
192 ;-------------------------------------------------------------------------------
193
194
195 ;º º
196 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
197
198
199
200 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
201 ;º º
202
203
204 INCLUDE modequat.inc
205
206
207 addd EQU 0 ;;AN000;used for "seperator_list"
208 binary_to_ASCII EQU 30H ;AN000;used to convert bytes from binary to ASCII
209 blank EQU " ";;AN000;used for "seperator_list"
210 both EQU 2 ;AN000;value of rate_and_delay_found when both have been found
211 comma EQU "," ;AN000;used to tell the difference between a blank delimeter and missing parm, see LPTX,:
212 current_parm EQU 0 ;;AN000;scalar for parser control block modifing routine "keywords"
213 current_parm_DI EQU DI ;;AN000;index for parm_list array
214 delete EQU 1 ;AN000;;used for "seperator_list"
215 deleted EQU 0 ;AN000;;used to make keywords unmatchable and strings of length zero
216 end_of_line_char_0D EQU 0DH ;AN000;put at end of the command line by the loader
217 end_of_line_char_00 EQU 00H ;AN000;put at end of the complex parm by the parser
218 i_CL EQU CL ;;AN000;loop index
219 include_string_list EQU 3 ;;AN000;number of value definitions so strings are included
220 include_number_list EQU 2 ;;AN000;See "nrng" in description of "values" block input for generalized parser
221 keyword EQU 58H ;;AN000;indicator parms are in keyword form vs positional, value for parms_form
222 first_com_keyword EQU SI ;;AN000;holder for "first_com_keyword_ptr"
223 last_com_keyword EQU SI ;;AN000;holder for "last_com_keyword_ptr"
224 first_LPT_keyword EQU SI ;;AN000;holder for "first_LPT_keyword_ptr"
225 last_LPT_keyword EQU SI ;;AN000;holder for "last_LPT_keyword_ptr"
226 first_CON_keyword EQU SI ;;AN000;holder for "first_con_keyword_ptr"
227 last_CON_keyword EQU SI ;;AN000;holder for "last_con_keyword_ptr"
228 max_parms EQU 16 ;;AN000;con cp prep=((1,2,3,4,5,6,7,8,9,10,11,12) filespec.cpi)
229 min_codepage_value EQU 0 ;AN000;
230 max_codepage_value EQU 999 ;;AN000;three digits
231 max_number_of_codepages EQU 12 ;AN000;assure that user does not specify too many code page numbers
232 min_number_of_codepages EQU 1 ;AN000;
233 min_old_com_pos_parms EQU 0 ;AN000;could have nothing else meaning status request
234 max_old_com_pos_parms EQU 5 ;AN000; ;baud, parity, data bits, stop bits, P
235 max_switches EQU 1 ;AN000;;only switch is /status
236 no_message EQU 0 ;AN000;indicate to message handler interface that no message to issue
237 none_found EQU 0 ;AN000;;if keyword_switch_ptr is returned as zero then parser did not encounter a keyword or switch
238 not_in_switch_list EQU 3 ;AC006;
239 number_of_printer_status_qualifiers EQU 4 ;;AN000;codepage, prepare, select, RETRY
240 parm_list EQU [BX] ;AN000;
241 parms_BX EQU [BX] ;AN000;
242 parser_return_code_AX EQU AX ;AN000;
243 PS2 EQU 44H ;AC002;flag for "type_of_machine"
244 result_BP EQU [BP] ;AN000;
245 range_item_tag EQU 55H ;AN000;;marker for checks in memory, otherwise just a holder
246 ranges_only EQU 1 ;;AN000;See "nrng" in description of "values" block input for generalized parser
247 start_of_keyword_ptrs EQU [BP] ;AN000;;used for indexing the list of offsets in check_for_keyword
248 tab EQU 09 ;AC006;
249 unspecified EQU 0FFH ;AN000;item tag of parm not specified: skipped optional positional parm
250
251
252 ;possible values for "parm_type", the type of parm returned by parser
253
254 complx EQU 4 ;AN000;
255 number EQU 1 ;AN000;
256 string EQU 3 ;AN000;
257
258 ;possible values for "return_code_AX"
259
260 no_error EQU 0 ;AN000;;not the same as "noerror"
261 operand_missing EQU 2 ;AN000;
262 syntax_error_rc EQU 9 ;AN000;
263 end_of_command_line EQU -1 ;AN000;
264 end_of_complex EQU -1 ;AN000;found 0 that parser wrote over closing ")" of complex
265
266
267
268 ;possible values of "device_type"
269
270 COMX EQU 09CH ;AN000;
271 ;CON EQU 0 ;AN000;
272 LPTX EQU 09BH ;AN000;
273 ;LPT1 EQU 0 ;AN000;
274
275
276 ;possible values of "request_type"
277
278 max_request_type EQU 09AH ;AN000;;must be same as following value
279 all_con_status EQU 09AH ;AN000;
280 codepage_prepare EQU 099H ;AN000;
281 codepage_refresh EQU 098H ;AN000;
282 codepage_select EQU 097H ;AN000;
283 codepage_status EQU 096H ;AN000;
284 codepage_prepared_status EQU 095H ;AN000;
285 codepage_selected_status EQU 094H ;AN000;
286 com_status EQU 093H ;AN000;
287 initialize_com_port EQU 092H ;AN000;
288 initialize_printer_port EQU 091H ;AN000;
289 old_initialize_printer_port EQU 090H ;AN000;;found traditional syntax
290 old_video_mode_set EQU 08FH ;AN000;;found traditional syntax
291 printer_reroute EQU 08EH ;AN000;
292 printer_status EQU 08DH ;AN000;
293 set_con_features EQU 08CH ;AN000;
294 status_for_everything EQU 08BH ;AN000;
295 turn_off_reroute EQU 08AH ;AN000;
296 last_request_type EQU 08AH ;AN000;;must be same as previous value
297
298
299 ;possible codepage requests, used by modecp
300
301 select EQU 086H ;AN000;
302 prepare EQU 085H ;AN000;
303 refresh EQU 084H ;AN000;
304 ;status ;AN000;;see request_type possibilities
305
306
307
308 ;possible values of "looking_for"
309
310
311 codepage EQU 6FH ;AN000;
312 codepage_prms EQU 6EH ;AN000;
313 com_keyword EQU 6DH ;AN000;
314 com_keyword_or_baud EQU 6CH ;AN000;
315 CON_keyword EQU 6BH ;AN000;
316 con_kwrd_status_or_cp EQU 6AH ;AN000;
317 databits_or_null EQU 69H ;AN000;
318 device_name_or_eol EQU 68H ;AN000;
319 eol EQU 67H ;;AN000;end of line
320 first_parm EQU 66H ;AN000;
321 li_or_null EQU 65H ;AN000;
322 P EQU 64H ;AN000;
323 parity_or_null EQU 63H ;AN000;
324 prn_kw_status_cp_cl_null EQU 62H ;AN000;
325 sd_or_dl EQU 61H ;AN000;
326 sd_or_dl_or_eol EQU 60H ;AN000;
327 status_or_eol EQU 5FH ;AN000;
328 stopbits_or_null EQU 5EH ;AN000;
329 T_or_EOL EQU 5DH ;AN000;
330
331 max_looking_for EQU 6FH ;AN000;;used for calculating the displacement into jump table for "CASE looking_for="
332
333
334
335
336 ;item tags for COM port names strings
337
338 COM1_item_tag EQU 1 ;;AN000;these values must be 1 through 4 because
339 COM2_item_tag EQU 2 ;;AN000;parsing for COM special cases depends
340 COM3_item_tag EQU 3 ;;AN000;on it.
341 COM4_item_tag EQU 4
342
343 ;item tags for paritys
344
345 first_parity_item_tag EQU 86H ;AN000;
346 mark_item_tag EQU 86H ;AN000;
347 space_item_tag EQU 85H ;AN000;
348 none_item_tag EQU 84H ;AN000;
349 odd_item_tag EQU 83H ;AN000;
350 even_item_tag EQU 82H ;AN000;
351 last_parity_item_tag EQU 82H ;AN000;
352
353
354 ;item tags for printer port names
355
356 PRN_item_tag EQU 5 ;AN000;
357 LPT1_item_tag EQU 6 ;AN000;
358 LPT2_item_tag EQU 7 ;AN000;
359 LPT3_item_tag EQU 8 ;AN000;
360
361 ;item tags for screen modes
362
363 first_screen_mode_item_tag EQU 9 ;AN000;
364 BW40_item_tag EQU 0BH ;AN000;
365 BW80_item_tag EQU 0CH ;AN000;
366 CO40_item_tag EQU 0DH ;AN000;
367 CO80_item_tag EQU 0EH ;AN000;
368 eighty_item_tag EQU 0FH ;AN000;
369 fourty_item_tag EQU 10H ;AN000;
370 MONO_item_tag EQU 11H ;AN000;
371 last_screen_mode_item_tag EQU 11H ;AN000;
372
373 con_item_tag EQU 12H ;AN000;
374
375
376 ;item tags for LPT special cases
377
378 first_lpt_special_case_item_tag EQU 13H ;;AN000;following value must be the same as this one
379 LPT1132_item_tag EQU 13H ;AN000;
380 LPT2132_item_tag EQU 14H ;AN000;
381 LPT3132_item_tag EQU 15H ;AN000;
382 LPT180_item_tag EQU 16H ;AN000;
383 LPT280_item_tag EQU 17H ;AN000;
384 LPT380_item_tag EQU 18H ;AN000;
385 last_lpt_special_case_item_tag EQU 18H ;;AN000;this value must be the same as the previous
386
387 P_item_tag EQU 19H ;AN000;
388 RETRY_item_tag EQU 1AH ;AN000;
389 B_item_tag EQU 1BH ;AN000;
390 E_item_tag EQU 1CH ;AN000;
391 R_item_tag EQU 1DH ;AN000;
392
393 codepage_item_tag EQU 1EH ;;AN000;for the range defining codepage possibilities
394 PREPARE_item_tag EQU 1FH ;AN000;
395 SELECT_item_tag EQU 20H ;AN000;
396 REFRESH_item_tag EQU 21H ;AN000;
397
398 COLUMNS_item_tag EQU 23H ;AN000;
399 DELAY_item_tag EQU 24H ;AN000;
400 LINES_item_tag EQU 25H ;AN000;
401 RATE_item_tag EQU 26H ;AN000;
402
403 COM_item_tag EQU 27H ;AN000;
404
405 ON_item_tag EQU 28H ;AN000;
406 OFF_item_tag EQU 29H ;AN000;
407
408 L_item_tag EQU 2AH ;AN000;
409 T_item_tag EQU 2BH ;AN000;
410
411 ;item tags for numbers not in other lists
412
413 zero_item_tag EQU 2CH ;AN000;
414 first_stopbit_item_tag EQU 2DH ;AN000;
415 one_item_tag EQU 2EH ;AN000;
416 one_point_five_item_tag EQU 2FH ;AN000;
417 two_item_tag EQU 30H ;AN000;
418 last_stopbit_item_tag EQU 31H ;AN000;
419 three_item_tag EQU 32H ;AN000;
420 four_item_tag EQU 33H ;AN000;
421 first_databit_item_tag EQU 34H ;AN000;
422 five_item_tag EQU 35H ;AN000; ;data bit, typamatic rate
423 six_item_tag EQU 36H ;AN000;
424 seven_item_tag EQU 37H ;AN000;
425 eight_item_tag EQU 38H ;AN000;
426 last_databit_item_tag EQU 39H ;AN000;
427 nine_item_tag EQU 3AH ;AN000;
428 ten_item_tag EQU 3BH ;AN000;
429 eleven_item_tag EQU 3CH ;AN000;;first two chars of 110
430 twelve_item_tag EQU 3DH ;AN000;
431 thirteen_item_tag EQU 3EH ;AN000;
432 fourteen_item_tag EQU 3FH ;AN000;
433 fifteen_item_tag EQU 40H ;AN000;;abbreviated form of 150, 15 is also a RATE= candidate
434 sixteen_item_tag EQU 41H ;AN000;
435 seventeen_item_tag EQU 42H ;AN000;
436 eighteen_item_tag EQU 43H ;AN000;
437 nineteen_item_tag EQU 44H ;AN000;;used for baud rates and RATE=
438 twenty_item_tag EQU 45H ;AN000;
439 twentyone_item_tag EQU 46H ;AN000;
440 twentytwo_item_tag EQU 47H ;AN000;
441 twentythree_item_tag EQU 48H ;AN000;
442 twentyfour_item_tag EQU 49H ;AN000; ;24 is also a typamatic rate
443 twentyfive_item_tag EQU 4AH ;AN000;
444 twentysix_item_tag EQU 4BH ;AN000;
445 twentyseven_item_tag EQU 4CH ;AN000;
446 twentyeight_item_tag EQU 4DH ;AN000;
447 twentynine_item_tag EQU 4EH ;AN000;
448 thirty_item_tag EQU 4FH ;AN000;
449 thirtyone_item_tag EQU 50H ;AN000;
450 thirtytwo_item_tag EQU 51H ;AN000;
451 fourtythree_item_tag EQU 52H ;AN000;
452 fifty_item_tag EQU 53H ;AN000;
453 sixty_item_tag EQU 54H ;AN000;
454 oneten_item_tag EQU 55H ;AN000;
455 onethirtytwo_item_tag EQU 56H ;AN000;
456 onefifty_item_tag EQU 57H ;AN000;
457 threehundred_item_tag EQU 58H ;AN000;
458 sixhundred_item_tag EQU 59H ;AN000;
459 twelvehundred_item_tag EQU 5AH ;AN000;
460 twentyfourhundred_item_tag EQU 5BH ;AN000;
461 fourtyeighthundred_item_tag EQU 5CH ;AN000;
462 ninetysixhundred_item_tag EQU 5DH ;AN000;
463 nineteentwohundred_item_tag EQU 5EH ;AN000;
464
465
466 ;mask values for function_flags
467
468 capitalize EQU 0001H ;AN000;capitalize by file table
469
470
471 ;mask values for match flags
472
473 numeric EQU 8000H ;AN000;
474 simple_string EQU 2000H ;AN000;
475 complex EQU 0400H ;AN000;
476 filespec EQU 0200H ;AN000;
477 ignore_colon EQU 0010H ;AN000;
478 optional EQU 0001H ;AN000;
479 clear_all EQU 0000H ;AN000;
480
481 ;delete_simple_string EQU 0CFFFH ;AN000;;NOT (simple_string), to turn off simple_string bit in the match_flags
482
483
484
485
486 ;º º
487 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
488
489
490
491 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
492 ;º º
493
494
495 des_strt_packet STRUC
496 des_strt_pkfl DW 0000 ;assume a filename specified
497 des_strt_pklen DW 02 ;start with size of 'des_strt_pknum'
498 des_strt_pknum DW 0 ;number of cp numbers in the packet
499 des_strt_pkcp1 DW -1 ;code page number for 1st slot
500 des_strt_pkcp2 DW -1
501 des_strt_pkcp3 DW -1
502 des_strt_pkcp4 DW -1
503 des_strt_pkcp5 DW -1
504 des_strt_pkcp6 DW -1
505 des_strt_pkcp7 DW -1
506 des_strt_pkcp8 DW -1
507 des_strt_pkcp9 DW -1
508 des_strt_pkcpA DW -1
509 des_strt_pkcpB DW -1
510 des_strt_pkcpC DW -1 ;code page number for 12th slot
511 des_strt_packet ENDS
512
513
514 INCLUDE COMMON.STC ;contains the following strucs, needed in invoke also
515
516
517 ;parm_list_entry STRUC
518 ;
519 ;parm_type DB bogus
520 ;item_tag DB 0FFH
521 ;value1 DW bogus
522 ;value2 DW bogus
523 ;keyword_switch_ptr DW 0
524 ;
525 ;parm_list_entry ENDS
526
527
528 ;codepage_parms STRUC
529 ; cp_device DW ?
530 ; des_pack_ptr DW ?
531 ; font_filespec DW ?
532 ; request_typ DW ?
533 ;codepage_parms ENDS
534
535
536 parms_def STRUC ;AN000;
537
538 parmsx_ptr DW bogus ;AN000;changed as the possibilities for parms following are determined
539 DB 1 ;AN000;have extra delimiter list
540 seperators_len DB 1 ;AN000;length of extra delimiter list
541 seperators DB ";" ;AC003;EXTRA DELIMITER LIST
542 DB 8 DUP (" ") ;AC003; extra blanks for adding more delimeters (. " \ [ ] : + =)
543
544 parms_def ENDS ;AN000;
545
546
547
548 result_def STRUC ;AN000;
549
550 ret_type DB 0 ;AN000;
551 ret_tag DB 0FFH ;AN000;
552 synonym DW 0 ;AN000;
553 ret_value1 DW bogus ;AN000;
554 ret_value2 DW bogus ;AN000;
555
556 result_def ENDS ;AN000;
557
558
559
560
561
562
563
564 ;º º
565 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
566
567
568
569 PAGE ;AN000;
570 PRINTF_CODE SEGMENT PUBLIC ;AN000;
571 ASSUME CS:PRINTF_CODE,DS:PRINTF_CODE,SS:PRINTF_CODE ;AN000;
572
573
574 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
575 ;º º
576
577 PUBLIC all_con_status ;AN000;
578 PUBLIC baud_equal ;AN000;
579 PUBLIC B_item_tag ;needed by modecom ;AN000;
580 PUBLIC B_str ;AN000;
581 PUBLIC BW40_item_tag ;AN000;
582 PUBLIC BW80_item_tag ;AN000;
583 PUBLIC codepage_index_holder ;make available to invoke ;AN000;
584 PUBLIC codepage_item_tag ;AN000;
585 PUBLIC codepage_prepare ;AN000;
586 PUBLIC codepage_prepared_status ;AN000;
587 PUBLIC codepage_refresh ;AN000;
588 PUBLIC codepage_selected_status ;AN000;
589 PUBLIC COM_status ;AN000;
590 PUBLIC COMX ;make available to rescode ;AN000;
591 PUBLIC CON_str ;AN000;make available to invoke for messages
592 PUBLIC CO40_item_tag ;AN000;
593 PUBLIC CO80_item_tag ;AN000;
594 PUBLIC codepage_item_tag ;AN000;
595 PUBLIC codepage_select ;AN000;
596 PUBLIC codepage_status ;AN000;
597 PUBLIC columns_equal ;AN000;
598 PUBLIC COLS_equal ;AN000;
599 PUBLIC columns_item_tag ;AN000;
600 PUBLIC COM1_str ;AN000;
601 PUBLIC COM2_str ;AN000;
602 PUBLIC COM3_str ;AN000;
603 PUBLIC COM4_str ;AN000;
604 PUBLIC data_equal ;AN000;used by invoke
605 PUBLIC delay_equal ;AN000;
606 PUBLIC del_equal ;AN000;
607 PUBLIC des_start_packet ;AN000;
608 PUBLIC device_name ;AN000;
609 PUBLIC device_type ;AN000;make available to rescode
610 PUBLIC E_item_tag ;needed by modecom ;AN000;
611 PUBLIC E_str ;AN000;
612 PUBLIC eight_item_tag ;AN000;used by setcom
613 PUBLIC eighty_item_tag ;AN000;
614 PUBLIC eighty_str ;AN000;
615 PUBLIC even_item_tag ;AN000;used by setcom
616 PUBLIC five_item_tag ;AN000;used in setcom
617 PUBLIC fourtyeighthundred_item_tag ;used by setcom;AN000;
618 PUBLIC fourtyeighthundred_str ;used by setcom;AN000;
619 PUBLIC fourty_item_tag ;AN000;
620 PUBLIC fourty_str ;AN000;
621 PUBLIC initialize_com_port ;AN000;
622 PUBLIC initialize_printer_port ;AN000;
623 PUBLIC keyword ;AN000;make available to invoke.asm
624 PUBLIC len_COMX_str ;AN000;make available to invoke.asm
625 PUBLIC len_CON_str ;AN000;make available to invoke.asm for message service
626 PUBLIC len_LPTX_str ;AN000;make available to invoke.asm
627 PUBLIC lines_equal ;AN000;
628 PUBLIC lines_item_tag ;AN000;
629 PUBLIC L_item_tag ;AN000;
630 PUBLIC LPTX ;AN000;make available to rescode
631 PUBLIC LPT1_str ;AN000;
632 PUBLIC LPT2_str ;AN000;
633 PUBLIC LPT3_str ;AN000;
634 PUBLIC mark_item_tag ;AN000;used in setcom
635 PUBLIC max_request_type ;AN000;
636 PUBLIC mono_item_tag ;AN000;
637 PUBLIC new_com_initialize ;AC002;make available for modecom
638 PUBLIC nineteentwohundred_item_tag ;AN000;used by modecom
639 PUBLIC nineteentwohundred_str ;AN000;used by modecom
640 PUBLIC ninetysixhundred_item_tag ;AN000;
641 PUBLIC ninetysixhundred_str ;AN000;
642 PUBLIC none_item_tag ;AN000;used in invoke
643 PUBLIC NONE_str ;AN000;
644 PUBLIC OFF_item_tag ;AN000;
645 PUBLIC OFF_str ;AN000;
646 PUBLIC odd_item_tag ;AN000; ;used by setcom
647 PUBLIC old_initialize_printer_port ;AN000;
648 PUBLIC old_video_mode_set ;AN000;
649 PUBLIC one_item_tag ;used in setcom ;AN000;
650 PUBLIC one_point_five_item_tag ;used in setcom ;AN000;
651 PUBLIC one_point_five_str ;used in setcom ;AN000;
652 PUBLIC onefifty_item_tag ;used in setcom ;AN000;
653 PUBLIC onefifty_str ;used in setcom ;AN000;
654 PUBLIC oneten_item_tag ;used in modecom ;AN000;
655 PUBLIC oneten_str ;used in modecom ;AN000;
656 PUBLIC onethirtytwo_item_tag ;AN000;
657 PUBLIC ON_item_tag ;AN000;
658 PUBLIC ON_str ;AN000;
659 PUBLIC P_item_tag ;make available to modecom ;AN000;
660 PUBLIC parity_equal ;used in analyze_and_invoke ;AN000;
661 PUBLIC parm_lst ;used in modecom.asm ;AN000;
662 PUBLIC parms_form ;make available to invoke ;AN000;
663 PUBLIC parse_parameters ;AN000;
664 PUBLIC prepare ;AN000;
665 PUBLIC prepare_item_tag ;AN000;
666 PUBLIC printer_reroute ;AN000;
667 PUBLIC printer_status ;AN000;
668 PUBLIC R_item_tag ;AN000;
669 PUBLIC R_str ;AN000;
670 PUBLIC rate_equal ;AN000;
671 PUBLIC refresh ;AN000;
672 PUBLIC request_type ;AN000;
673 PUBLIC reroute_requested ;make available to rescode;AN000;
674 PUBLIC retry_equal_str ;make available to invoke;AN000;
675 PUBLIC retry_item_tag ;AN000;
676 PUBLIC retry_requested ;make available to rescode ;AN000;
677 PUBLIC select ;AN000;
678 PUBLIC select_item_tag ;AN000;
679 PUBLIC set_con_features ;AN000;
680 PUBLIC seven_item_tag ;used by setcom ;AN000;
681 PUBLIC sixhundred_item_tag ;used by setcom ;AN000;
682 PUBLIC sixhundred_str ;used by setcom ;AN000;
683 PUBLIC six_item_tag ;used by setcom ;AN000;
684 PUBLIC space_item_tag ;used by setcom ;AN000;
685 PUBLIC status_for_everything ;AN000;
686 PUBLIC stop_equal ;AN000;
687 PUBLIC T_item_tag ;AN000;
688 PUBLIC threehundred_item_tag ;used by setcom ;AN000;
689 PUBLIC threehundred_str ;used by setcom ;AN000;
690 PUBLIC turn_off_reroute ;AN000;
691 PUBLIC twelvehundred_item_tag ;used by setcom ;AN000;
692 PUBLIC twelvehundred_str ;used by setcom ;AN000;
693 PUBLIC twentyfourhundred_item_tag ;used by setcom ;AN000;
694 PUBLIC twentyfourhundred_str ;used by setcom ;AN000;
695 PUBLIC two_item_tag ;used by setcom ;AN000;
696
697 ;º º
698 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
699
700
701 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
702 ;º º
703
704 ;EXTRN command_line:BYTE ;AN000;PARM AREA
705 ;EXTRN command_line_length:BYTE ;AN000;NUMBER OF BYTES OF PARM AREA
706 EXTRN com1_or_com2:BYTE ;AN000;see modedefs.inc
707 EXTRN cp_cb:WORD ;AN000;codepage_parms <> ;codepage subroutine parameter block
708 EXTRN CRLF:WORD ;displayed before "Invalid parameter - " for consistent spacing ;AN000;
709 EXTRN DES_STRT_FL_CART:ABS ;AN000;;CARTRIDGE prepare
710 EXTRN device:BYTE ;AN000;holder for com number, used in setcom
711 EXTRN first_char_in_command_line:BYTE ;AN000;location of the command line parameters
712 EXTRN function_not_supported:BYTE ;AN000;see modedefs.inc
713 EXTRN get_machine_type:NEAR ;AN000;get model and sub-model bytes
714 EXTRN invalid_parameter:BYTE ;AN000;CR,LF,"Invalid parameter - '????'"CR,LF,BEEP
715 EXTRN LPTNO:BYTE ;AN000;holder of ASCII version of printer number, see first_parm_case and modeprin
716 EXTRN machine_type:BYTE ;AN000;see get_machine_type
717 EXTRN modecp:NEAR ;AN000;
718 EXTRN move_destination:ABS ;AN000;location of res code after it has been moved
719 EXTRN noerror:BYTE ;AN000;
720 EXTRN not_supported_ptr:WORD ;AN000;holder of address of string that describes what is not supported, see modedefs.inc
721 EXTRN offending_parameter:BYTE ;AC006;the holder of the text string that was wrong.
722 EXTRN offending_parameter_ptr:WORD ;AN000;;see MODEMES
723 EXTRN printer_no:BYTE ;AN000;;see modeprin
724 EXTRN PRINTF:NEAR ;AN000;
725 EXTRN rate_and_delay_together:BYTE ;AN000;RATE and DELAY must be specified together
726 EXTRN syntax_error_ptr:WORD ;AN000;pointer to parameter with bad format
727
728 ;possible values of "message"
729
730 EXTRN baud_rate_required:BYTE ;AN000;
731 EXTRN invalid_number_of_parameters:WORD ;AN000;
732 EXTRN Invalid_switch:BYTE
733 EXTRN syntax_error:BYTE
734
735
736 ;º º
737 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
738
739
740 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
741 ;º º
742
743 code_page_numbers_encountered DB 0
744 current_packet_cp_number DW -2 ;adjustment for accessing current 'des_strt_pkcp?' in 'des_start_packet'
745 EOL_found DB false
746 looking_for DB bogus ;semantic analysis state, can be one of:
747 match_not_found DB true ;indication that a token was found in the list of keywords
748
749
750
751 des_start_packet des_strt_packet <>
752
753 ;---------------------------- NEW DATA ---------------------------------
754
755
756
757 baud_specified DB false ;AN000;
758 codepage_index_holder DW bogus ;AN000;;holder for index in parm_list of the selected code page
759 colon DB ":" ;AN000;
760 command_line DW 0081H ;AN000; ;holder for pointer to unparsed part of the command line, see "parse_parm"
761 device_name DW 0 ;AN000;;OFFSET device name string, see "analyze_and_invoke" in invoke.asm
762 device_type DB bogus ;AN000;
763 end_of_seperator_list DW bogus ;AN000;;loop terminator,word because compared with DI
764 match_found DB false ;AN000; ;boolean loop terminator
765 message DW no_message ;AN000;
766 new_com_initialize DB false ;AC002;flag for modecom to indicate PS/2 only parm specified
767 number_of_keywords DB 0 ;AN000;;input for check_for_keyword
768 parms_form DB 0 ;AN000;;holder for indicator of whether the parms were in keyword or positonal form
769 ordinal DW 0 ;AN000;
770 rate_and_delay_found DB false ;AN000;need to have both, this byte keeps track of what has been found
771 request_type DB bogus ;AN000;
772 reroute_requested DB false ;AN000;
773 retry_requested DB false ;AN000;
774 search_stop DB 0 ;AN000;;loop stopper for search_item_tags
775 status_found DB false ;AN000;;boolean indicator that /status has been found
776 status_request DB bogus ;AN000;;furthur clarification. possible values are: bogus, true, and false
777 terminating_delimeter DB bogus ;AN000;;save return from sysparse
778 type_of_machine DB bogus ;AC000;"get_machine_type" determines "machine_type", this byte is general flag for PS/2s
779
780
781 ; PARSER interface data
782 ;---------------------------------------
783
784 start_com_keyword_ptrs LABEL WORD ;AN000;
785 first_com_keyword_ptr DW OFFSET baud_equal ;AN000;
786 DW OFFSET parity_equal ;AN000;
787 DW OFFSET data_equal ;AN000;
788 DW OFFSET stop_equal ;AN000;
789 last_com_keyword_ptr DW OFFSET retry_equal_str ;AN000;
790 number_of_com_keywords EQU ($ - start_com_keyword_ptrs)/2 ;AN000;
791
792
793 start_LPT_keyword_ptrs LABEL WORD ;AN000;
794 first_LPT_keyword_ptr DW OFFSET retry_equal_str ;AN000;
795 DW OFFSET COLUMNS_equal ;AN000;
796 DW OFFSET COLS_equal ;AN000;
797 last_LPT_keyword_ptr DW OFFSET LINES_equal ;AN000;
798 number_of_LPT_keywords EQU ($ - start_LPT_keyword_ptrs)/2 ;AN000;
799
800
801 start_CON_keyword_ptrs LABEL WORD ;AN000;
802 first_CON_keyword_ptr DW OFFSET COLUMNS_equal ;AN000;
803 DW OFFSET COLS_equal ;AN000;
804 DW OFFSET LINES_equal ;AN000;
805 DW OFFSET RATE_equal ;AN000;
806 DW OFFSET DELAY_equal ;AN000;
807 last_CON_keyword_ptr DW OFFSET DEL_equal ;AN000;
808 number_of_CON_keywords EQU ($ - start_CON_keyword_ptrs)/2 ;AN000;
809
810
811
812 parms parms_def<> ;AN000;set up for first_parm_case, except parmsx_ptr needs to be set
813
814
815 parmsx LABEL BYTE ;AN000;
816
817 DB 0 ;AN000;how many non-switch/non-keyword parms are required
818 DB 3 ;AN000;max pos parms for this parmsx, use others for further parms
819 DW first_pos_control ;AN000;control block for every possible (non-mutatant) first positional parm
820 DW second_pos_control ;AN000;
821 DW third_pos_control ;AN000;
822
823 DB max_switches ;AN000;
824 DW max_switches DUP (Sw_control) ;AN000;
825
826 DB max_keywords ;AN000;number of unique keywords for all options
827
828 start_keyword_list LABEL BYTE ;AN000;
829
830 DW LPT1_colon_equal_control ;AN000;
831 DW LPT1_equal_control ;AN000;
832 DW LPT2_colon_equal_control ;AN000;
833 DW LPT2_equal_control ;AN000;
834 DW LPT3_colon_equal_control ;AN000;
835 DW LPT3_equal_control ;AN000;
836
837 DW RETRY_equal_control ;AN000;for parallel and serial printers
838
839 DW COLUMNS_equal_control ;AN000;
840 DW LINES_equal_control ;AN000;;this and previous MUST OCCUR IN THIS ORDER
841 DW PREPARE_equal_control ;AN000;
842 DW SELECT_equal_control ;AN000;
843
844 max_keywords EQU ($ - start_keyword_list) / 2 ;AN000;two bytes per entry
845
846
847
848 con_parmsx LABEL BYTE ;AN000;for keyword form of con support
849
850 DB 0 ;AN000;no positional parms required after CON
851 DB 2 ;AN000;CP and REFRESH allowed
852 DW first_CON_pos_control ;AN000;control block for CP
853 DW second_CON_pos_control ;AN000;control block for REFRESH
854
855 DB max_switches ;AN000;
856 DW max_switches DUP (Sw_control) ;AN000;
857
858 DB number_of_CON_keywords ;AN000;number of unique keywords for CON
859
860 start_con_keyword_list LABEL BYTE ;AN000;
861
862 DW COLUMNS_equal_control ;AN000;
863 DW LINES_equal_control ;AN000;
864 DW PREPARE_equal_control ;AN000;
865 DW SELECT_equal_control ;AN000;
866
867 DW DELAY_equal_control ;AN000;
868 DW RATE_equal_control ;AN000;
869
870 number_of_con_keywords EQU ($ - start_con_keyword_list) / 2 ;AN000;two bytes per entry
871
872
873 old_con_parmsx LABEL BYTE ;AN000;
874
875 DB 0 ;AN000;no positional parms required after 80, co40 etc.
876 DB 2 ;AN000;shift direction and "T" allowed
877 DW first_old_CON_pos_control ;AN000;shift direction and display lines
878 DW second_old_CON_pos_control ;AN000;control block for T
879
880 DB 0 ;AN000;no switches
881
882 DB 0 ;AN000;no keywords for old CON
883
884
885 lpt_parmsx LABEL BYTE ;AN664;for the second thru 4th parms, [[chars/line][[,lines/inch][[,P]]]]
886
887 DB 0 ;AN000;how many non-switch/non-keyword parms are required
888 DB 3 ;AN000;max pos parms for this parmsx, use others for further parms
889 DW first_lpt_pos_control ;AN000;control block for every possible chars per line value
890 DW second_lpt_pos_control ;AN000;
891 DW third_lpt_pos_control ;AN000;
892
893 DB max_switches ;AN000;
894 DW max_switches DUP (Sw_control) ;AN000;
895
896 DB max_lpt_keywords ;AN000;number of unique keywords for all options
897
898 start_lpt_keyword_list LABEL BYTE ;AN000;
899
900 DW RETRY_equal_control ;AN000;for parallel printers
901
902 DW COLUMNS_equal_control ;AN000;
903 DW LINES_equal_control ;AN000;;this and previous MUST OCCUR IN THIS ORDER
904 DW PREPARE_equal_control ;AN000;
905 DW SELECT_equal_control ;AN000;
906
907 max_lpt_keywords EQU ($ - start_keyword_list) / 2 ;AN000;two bytes per entry
908
909
910 prepare_equal_parmsx LABEL BYTE ;AN000;
911
912 prepare_min_parms LABEL BYTE ;AN000;changed by hardware cp code to allow no filename
913 DB min_number_of_codepages ;AN000;
914 DB max_number_of_codepages ;AN000;
915 DW max_number_of_codepages DUP (prepare_equal_control) ;AN000;
916 DB max_switches ;AN000;
917 DW max_switches DUP (Sw_control) ;AN000;
918 DB 0 ;AN000;no more keywords allowed
919
920 com_parmsx LABEL BYTE ;AN000;
921
922 DB min_old_com_pos_parms ;AN000;nothing or /STATUS
923 DB max_old_com_pos_parms ;AN000;baud, parity, data, stop, p
924 DW baud_control ;AN000;
925 DW old_com_parity_control ;AN000;
926 DW old_com_databits_control ;AN000;control block for old com data bits
927 DW old_com_stopbits_control ;AN000;
928 retry_control_ptr DW old_com_retry_control ;AN000;
929
930 DB max_switches ;AN000;
931 DW max_switches DUP (Sw_control) ;AN000;
932
933 DB number_of_com_keywords ;AN000;
934
935 start_com_keyword_list LABEL BYTE ;AN000;
936
937 DW BAUD_control ;AN000;
938 DW PARITY_equal_control ;AN000;
939 DW DATA_equal_control ;AN000;
940 DW STOP_equal_control ;AN000;
941 DW RETRY_equal_control ;AN000;same as for printers
942
943 number_of_com_keywords EQU ($ - start_com_keyword_list) / 2 ;AN000;two bytes per entry
944
945
946 com_keywords_parmsx LABEL BYTE ;AC663;
947
948 DB 0 ;AC663;no positional parms valid
949 DB 0 ;AC663;
950
951 DB 0 ;AC663;
952
953 DB number_of_com_keywords ;AC663;
954
955 DW BAUD_control ;AC663;
956 DW PARITY_equal_control ;AC663;
957 DW DATA_equal_control ;AC663;
958 DW STOP_equal_control ;AC663;
959 DW RETRY_equal_control ;AC663;same as for printers
960
961
962
963 mutant_com_parmsx LABEL BYTE ;AN000;for trash like COM19600
964
965 DB 2 ;AN000;;must find "COM" and a baud rate
966 DB 2 ;AN000;;"COM", baud
967 DW COM_control ;AN000;
968 DW baud_control ;AN000;use same as other com parmsx
969
970 DB 0 ;AN000;no switches
971
972 DB 0 ;AN000;no keywords
973
974 com_control LABEL BYTE ;AN000;for mutant_com_parmsx
975
976 DW simple_string ;AN000;"COM", not optional
977 DW 0 ;AN000;don't capitalize, leave colon
978 DW result ;AN000;
979 DW com_value ;AN000;
980 DB 0 ;AN000;no synonyms
981
982
983
984 old_com_parity_control LABEL BYTE ;AC000;
985
986 DW simple_string+optional ;AC000;n, o, e are strings
987 DW 0 ;AC000;don't capitalize, leave colon
988 DW result ;AC000;
989 DW PARITY_values ;AC000;
990 DB 0 ;AC000;;no synonyms
991
992
993 old_com_DATAbits_control LABEL BYTE ;AC000;
994
995 DW simple_string+optional ;AC000;
996 DW 0 ;AC000;;don't capitalize, leave colon
997 DW result ;AC000;
998 DW DATA_values ;AC000;
999 DB 0 ;AC000;
1000
1001
1002
1003 old_com_STOPbits_control LABEL BYTE ;AC000;
1004
1005 DW simple_string+optional ;AC000;
1006 DW 0 ;AC000;;don't capitalize, leave colon
1007 DW result ;AC000;
1008 DW STOP_values ;AC000;
1009 DB 0 ;AC000;
1010
1011
1012
1013 old_com_RETRY_control LABEL BYTE ;AC000;
1014
1015 DW simple_string+optional ;AC000;;all that is legal for RETRY is P for old com format
1016 DW 0 ;AC000;;don't capitalize, never need to display to user
1017 DW result ;AC000;
1018 DW RETRY_values ;AC000;
1019 DB 0 ;AC000;
1020
1021
1022 com_value LABEL BYTE ;AC000;"COM" for mutant_com_parmsx
1023
1024 DB include_string_list ;AC000;have list of strings
1025
1026 DB 0 ;AC000;
1027
1028 DB 0 ;AC000;no number choices
1029
1030 DB 1 ;AC000;just "COM"
1031
1032 DB COM_item_tag ;AC000;
1033 DW OFFSET COM_str ;AC000;
1034
1035
1036 first_pos_control LABEL BYTE ;AN000;initialized for first_parm_case
1037
1038 match_flags DW simple_string+optional ;*** +ignore_colon *** ;AN000;2011, all that is legal for non-/status first parm
1039 function_flags DW 0010H ;AN000;don't capitalize, remove colon at end
1040 DW result ;AN000;
1041 values_ptr DW first_pos_values ;AN000;
1042 DB 0 ;AN000;no keywords as positionals
1043
1044
1045 second_pos_control LABEL BYTE ;AN000;initialized for first_parm_case
1046
1047 match_flags2 DW simple_string+optional+ignore_colon ;AN000;2011, all that is legal for non-/status first parm
1048 function_flags2 DW 0010H ;AN000;don't capitalize, remove colon at end
1049 DW result ;AN000;
1050 values_ptr2 DW second_pos_values ;AN000;
1051 DB 0 ;AN000;;no keywords as positionals
1052
1053 third_pos_control LABEL BYTE ;AN000;initialized for first_parm_case
1054
1055 match_flags3 DW simple_string+optional+ignore_colon ;AN000;2011, all that is legal for non-/status first parm
1056 function_flags3 DW 0010H ;AN000;don't capitalize, remove colon at end
1057 DW result ;AN000;
1058 values_ptr3 DW third_pos_values ;AN000;
1059 DB 0 ;AN000;;no keywords as positionals
1060
1061 first_lpt_pos_control LABEL BYTE ;AN000;chars per line
1062
1063 DW simple_string+optional ;AN000;2001, all that is legal for chars per line
1064 DW 0000H ;AN000;don't capitalize
1065 DW result ;AN000;
1066 DW first_lpt_pos_values ;AN000;
1067 DB 0 ;AN000;no keywords as positionals
1068
1069
1070 second_lpt_pos_control LABEL BYTE ;AN000;lines per inch
1071
1072 DW simple_string+optional ;AN000;2001, all that is legal for chars per line
1073 DW 0000H ;AN000;don't capitalize
1074 DW result ;AN000;
1075 DW second_lpt_pos_values ;AN000;
1076 DB 0 ;AN000;;no keywords as positionals
1077
1078 third_lpt_pos_control LABEL BYTE ;AN000;P
1079
1080 DW simple_string+optional ;AN000;2001, all that is legal for retry settings
1081 DW 0000H ;AN000;don't capitalize
1082 DW result ;AN000;
1083 DW third_lpt_pos_values ;AN000;
1084 DB 0 ;AN000;;no keywords as positionals
1085
1086
1087
1088 BAUD_control LABEL BYTE ;AN000;used for positional and keyword form
1089
1090 DW simple_string ;AN000;required
1091 DW 0 ;AN000;don't capitalize
1092 DW result ;AN000;
1093 DW BAUD_values ;AN000;
1094 DB 1 ;AN000;;only one form of the keyword
1095
1096 BAUD_equal DB "BAUD=",0 ;AN000;
1097
1098
1099 parity_equal_control LABEL BYTE ;AN000;initialized for first_parm_case
1100
1101 DW simple_string ;AN000;n, o, even, m, space etc are strings
1102 DW 0 ;AN000;don't capitalize, leave colon
1103 DW result ;AN000;
1104 DW PARITY_values ;AN000;
1105 DB 2 ;two ways to specify it
1106
1107 parity_equal DB "PARITY=",0 ;AN000;
1108 par_equal DB "PAR=",0 ;AN000;
1109
1110
1111
1112 DATA_equal_control LABEL BYTE ;AN000;
1113
1114 DW simple_string
1115 DW 0 ;AN000;;don't capitalize, leave colon
1116 DW result ;AN000;
1117 DW DATA_values ;AN000;
1118 DB 1 ;AN000;
1119
1120 data_equal DB "DATA=",0 ;AN000;
1121
1122
1123
1124 STOP_equal_control LABEL BYTE ;AN000;
1125
1126 DW simple_string ;AN000;
1127 DW 0 ;AN000;;don't capitalize, leave colon
1128 DW result ;AN000;
1129 DW STOP_values ;AN000;
1130 DB 1 ;AN000;
1131
1132 stop_equal DB "STOP=",0 ;AN000;
1133
1134
1135
1136 RETRY_equal_control LABEL BYTE ;AN000;
1137
1138 DW simple_string ;AN000;;all that is legal for RETRY is on and off
1139 DW 0 ;AN000;;don't capitalize, never need to display to user
1140 DW result ;AN000;
1141 DW RETRY_values ;AN000;
1142 DB 1 ;AN000;
1143
1144 retry_equal_str DB "RETRY=",0 ;AN000;
1145
1146
1147
1148 PREPARE_equal_control LABEL BYTE ;AN000;
1149
1150 prepare_equal_match_flags LABEL WORD ;AN000;
1151 DW numeric+complex+filespec ;AN000;has to be complex at first, then numbers and filespec inside the parens
1152 DW capitalize ;AN000;capitalize the filespec
1153 DW result ;AN000;
1154 DW prepare_values ;AN000;
1155 DB 2 ;AN000;
1156
1157 prepare_equal DB "PREPARE=",0 ;AN000;
1158 prep_equal DB "PREP=",0 ;AN000;
1159
1160
1161 SELECT_equal_control LABEL BYTE ;AN000;
1162
1163 DW numeric ;AN000;range of codepage numbers
1164 DW 0 ;AN000;don't capitalize, leave colon
1165 DW result ;AN000;
1166 DW SELECT_values ;AN000;
1167 DB 2 ;AN000;no keywords as positionals
1168
1169 select_equal DB "SELECT=",0 ;AN000;
1170 sel_equal DB "SEL=",0 ;AN000;
1171
1172
1173 DELAY_equal_control LABEL BYTE ;AN000;
1174
1175 DW numeric ;AN000; ;takes less space than number definitions
1176 DW 0 ;AN000; ;don't capitalize, leave colon
1177 DW result ;AN000;
1178 DW DELAY_values ;AN000;
1179 DB 2 ;AN000;
1180
1181 del_equal DB "DEL=",0 ;AN000;
1182 delay_equal DB "DELAY=",0 ;AN000;
1183
1184
1185 RATE_equal_control LABEL BYTE ;AN000;
1186
1187 DW numeric ;AN000;
1188 DW 0 ;AN000; ;don't capitalize, leave colon
1189 DW result ;AN000;
1190 DW RATE_values ;AN000;
1191 DB 1 ;AN000;
1192
1193 rate_equal DB "RATE=",0 ;AN000;
1194
1195
1196
1197 LINES_equal_control LABEL BYTE ;AN000;
1198
1199 LINES_match_flag DW numeric ;AN000; ;setup for CON, changed if find LPTX
1200 DW 0 ;AN000; ;don't capitalize, leave colon
1201 DW result ;AN000;
1202 LINES_value_ptr DW CON_LINES_values ;AN000;
1203 DB 1 ;AN000;
1204
1205 lines_equal DB "LINES=",0 ;AN000;
1206
1207
1208
1209 COLUMNS_equal_control LABEL BYTE ;AN000;
1210
1211 COLUMNS_match_flag DW numeric ;AN000; ;setup for CON changed when find LPTX
1212 DW 0 ;AN000; ;don't capitalize, leave colon
1213 DW result ;AN000;
1214 COLUMNS_value_ptr DW CON_COLUMNS_values ;AN000;setup for CON, changed if find LPTX
1215 DB 2 ;AN000;
1216
1217 COLUMNS_equal DB "COLUMNS=",0 ;AN000;printer keyword
1218 COLS_equal DB "COLS=",0 ;AN000;
1219
1220
1221 LPT1_colon_equal_control LABEL BYTE ;AN000;
1222
1223 DW simple_string+ignore_colon ;AN000;COM?[:] is all that is valid
1224 DW 0 ;AN000;;don't capitalize, leave colon
1225 DW result ;AN000;
1226 DW reroute_values ;AN000;
1227 DB 1 ;AN000;
1228
1229 LPT1_colon_equal DB "LPT1:=",0 ;AN000;
1230
1231
1232
1233 LPT1_equal_control LABEL BYTE ;AN000;
1234
1235 DW simple_string+ignore_colon ;AN000;COM?[:] is all that is valid
1236 DW 0 ;AN000;don't capitalize, leave colon
1237 DW result ;AN000;
1238 DW reroute_values ;AN000;
1239 DB 1 ;AN000;
1240
1241 LPT1_equal DB "LPT1=",0 ;AN000;
1242
1243
1244
1245 LPT2_colon_equal_control LABEL BYTE ;AN000;
1246
1247 DW simple_string+ignore_colon ;AN000;COM?[:] is all that is valid
1248 DW 0 ;AN000;don't capitalize, leave colon
1249 DW result ;AN000;
1250 DW reroute_values ;AN000;
1251 DB 1 ;AN000;
1252
1253 LPT2_colon_equal DB "LPT2:=",0 ;AN000;
1254
1255
1256
1257 LPT2_equal_control LABEL BYTE ;AN000;
1258
1259 DW simple_string+ignore_colon ;AN000;;COM?[:] is all that is valid
1260 DW 0 ;AN000;don't capitalize, leave colon
1261 DW result ;AN000;
1262 DW reroute_values ;AN000;
1263 DB 1 ;AN000;
1264
1265 LPT2_equal DB "LPT2=",0 ;AN000;
1266
1267
1268
1269 LPT3_colon_equal_control LABEL BYTE ;AN000;
1270
1271 DW simple_string+ignore_colon ;AN000;COM?[:] is all that is valid
1272 DW 0 ;AN000;don't capitalize, leave colon
1273 DW result ;AN000;
1274 DW reroute_values ;AN000;
1275 DB 1 ;AN000;
1276
1277 LPT3_colon_equal DB "LPT3:=",0 ;AN000;
1278
1279
1280
1281 LPT3_equal_control LABEL BYTE ;AN000;
1282
1283 DW simple_string+ignore_colon ;AN000;COM?[:] is all that is valid
1284 DW 0 ;AN000;don't capitalize, leave colon
1285 DW result ;AN000;
1286 DW reroute_values ;AN000;
1287 DB 1 ;AN000;
1288
1289 LPT3_equal DB "LPT3=",0 ;AN000;
1290
1291 first_con_pos_control LABEL BYTE ;AN000;
1292
1293 DW simple_string ;AN000;CP, code, codepage
1294 DW 0 ;AN000;don't capitalize, leave colon
1295 DW result ;AN000;
1296 DW OFFSET first_CON_pos_values ;AN000;
1297 DB 0 ;AN000;no synonyms
1298
1299
1300 second_con_pos_control LABEL BYTE ;AN000;
1301
1302 DW simple_string ;AN000;REFRESH
1303 DW 0 ;AN000;don't capitalize, leave colon
1304 DW result ;AN000;
1305 DW OFFSET second_CON_pos_values ;AN000;
1306 DB 0 ;AN000;no synonyms
1307
1308 first_old_con_pos_control LABEL BYTE ;AN000;
1309
1310 DW simple_string+numeric ;AN000;r, l or screen lines request
1311 DW 0 ;AN000;don't capitalize
1312 DW result ;AN000;
1313 DW OFFSET first_old_CON_pos_values ;AN000;
1314 DB 0 ;AN000;no synonyms
1315
1316
1317 second_old_con_pos_control LABEL BYTE ;AN000;
1318
1319 DW simple_string+optional ;AN000;T
1320 DW 0 ;AN000;don't capitalize
1321 DW result ;AN000;
1322 DW OFFSET second_old_CON_pos_values ;AN000;
1323 DB 0 ;AN000;no synonyms
1324
1325 first_old_CON_pos_values LABEL BYTE ;all valid forms of shift direction, and screen line values ;AN000;
1326
1327 DB include_string_list ;AN000;have list of strings
1328
1329 DB 0 ;no number ranges ;AN000;
1330
1331 DB number_of_CON_lines_numbers ;number of rows choices;AN000;
1332
1333 DB twentyfive_item_tag ;AN000;
1334 DD 25 ;AN000;
1335 DB fourtythree_item_tag ;AN000;
1336 DD 43 ;AN000;
1337 DB fifty_item_tag ;AN000;
1338 DD 50 ;AN000;
1339
1340 DB number_of_shift_forms ;number of shift strings AN000;
1341
1342 start_shift_forms LABEL BYTE ;AN000;
1343
1344
1345 DB R_item_tag ;AN000;
1346 DW OFFSET R_str ;AN000;
1347 DB L_item_tag ;AN000;
1348 DW OFFSET L_str ;AN000;
1349
1350
1351 number_of_shift_forms EQU ($ - start_shift_forms)/3 ;3 bytes per entry;AN000;
1352
1353
1354 second_old_CON_pos_values LABEL BYTE ;all valid forms of T ;AN000;
1355
1356 DB include_string_list ;AN000;have list of strings
1357
1358 DB 0 ;no number ranges ;AN000;
1359
1360 DB 0 ;no number list ;AN000;
1361
1362 DB number_of_T_forms ;number of T strings AN000;
1363
1364 start_T_forms LABEL BYTE ;AN000;
1365
1366
1367 DB T_item_tag ;AN000;
1368 DW OFFSET T_str ;AN000;
1369
1370
1371 number_of_T_forms EQU ($ - start_T_forms)/3 ;3 bytes per entry;AN000;
1372
1373
1374 first_CON_pos_values LABEL BYTE ;all valid forms of codepage;AN000;
1375
1376 DB include_string_list ;AN000;have list of strings
1377
1378 DB 0 ;no number ranges ;AN000;
1379
1380 DB 0 ;no number list ;AN000;
1381
1382 DB number_of_CP_forms ;number of cp strings AN000;
1383
1384 start_CP_forms LABEL BYTE ;AN000;
1385
1386
1387 ;codepage strings
1388
1389 DB CODEPAGE_item_tag ;AN000;
1390 DW OFFSET CODE_str ;AN000;
1391 DB CODEPAGE_item_tag ;AN000;
1392 DW OFFSET CODEPAGE_str ;AN000;
1393 DB CODEPAGE_item_tag ;AN000;
1394 DW OFFSET CP_str ;AN000;
1395
1396 ;invalid choice, included for usable error reporting: if come across refresh right after CON then issue invalid number of parms
1397
1398 DB REFRESH_item_tag ;AC007;
1399 DW OFFSET REF_str ;AC007;
1400 DB REFRESH_item_tag ;AC007;
1401 DW OFFSET REFRESH_str ;AC007;
1402
1403 number_of_CP_forms EQU ($ - start_CP_forms)/3 ;3 bytes per entry;AN000;
1404
1405
1406 second_CON_pos_values LABEL BYTE ;all valid forms of REFRESH;AN000;
1407
1408 DB include_string_list ;AN000;have list of strings
1409
1410 DB 0 ;no number ranges ;AN000;
1411
1412 DB 0 ;no number list ;AN000;
1413
1414 DB number_of_REFRESH_forms ;number of REFRESH strings AN000;
1415
1416 start_REFRESH_forms LABEL BYTE ;AN000;
1417
1418 DB REFRESH_item_tag ;AN000;
1419 DW OFFSET REF_str ;AN000;
1420 DB REFRESH_item_tag ;AN000;
1421 DW OFFSET REFRESH_str ;AN000;
1422
1423 number_of_REFRESH_forms EQU ($ - start_REFRESH_forms)/3 ;3 bytes per entry;AN000;
1424
1425
1426 BAUD_values LABEL BYTE ;AN000;;all valid baud rates
1427
1428 DB include_string_list ;AN000;have list of numbers and two strings
1429
1430 DB 0 ;AN000;
1431
1432 DB 0 ;AN000;no numeric representations
1433
1434 DB number_of_baud_strings ;AN000;number of baud rates that are being used for other parameters also
1435
1436 start_baud_strings LABEL BYTE ;AN000;
1437
1438 DB oneten_item_tag ;AN000;
1439 DW OFFSET oneten_str ;AN000;
1440 DB oneten_item_tag ;AN000;
1441 DW OFFSET eleven_str ;AN000;;"11" first two chars of 110
1442 DB onefifty_item_tag ;AN000;
1443 DW OFFSET fifteen_str ;AN000;
1444 DB onefifty_item_tag ;AN000;
1445 DW OFFSET onefifty_str ;AN000;
1446 DB threehundred_item_tag ;AN000;
1447 DW OFFSET thirty_str ;AN000;
1448 DB threehundred_item_tag ;AN000;
1449 DW OFFSET threehundred_str ;AN000;
1450 DB sixhundred_item_tag ;AN000;
1451 DW OFFSET sixty_str ;AN000;
1452 DB sixhundred_item_tag ;AN000;
1453 DW OFFSET sixhundred_str ;AN000;
1454 DB twelvehundred_item_tag ;AN000;
1455 DW OFFSET twelve_str ;AN000;
1456 DB twelvehundred_item_tag ;AN000;
1457 DW OFFSET twelvehundred_str ;AN000;
1458 DB twentyfourhundred_item_tag ;AN000;
1459 DW OFFSET twentyfour_str ;AN000;24 is also a typamatic rate
1460 DB twentyfourhundred_item_tag ;AN000;
1461 DW OFFSET twentyfourhundred_str ;AN000;
1462 DB fourtyeighthundred_item_tag ;AN000;
1463 DW OFFSET fourtyeight_str ;AN000;
1464 DB fourtyeighthundred_item_tag ;AN000;
1465 DW OFFSET fourtyeighthundred_str ;AN000;
1466 DB ninetysixhundred_item_tag ;AN000;
1467 DW OFFSET ninetysix_str ;AN000;
1468 DB ninetysixhundred_item_tag ;AN000;
1469 DW OFFSET ninetysixhundred_str ;AN000;
1470 DB nineteentwohundred_item_tag ;AN000;;item tag
1471 DW OFFSET nineteentwohundred_str ;AN000;;pointer to string
1472 DB nineteentwohundred_item_tag ;AN000;;item tag
1473 DW OFFSET nineteen_point_two_str ;AN000;
1474 DB nineteentwohundred_item_tag ;AN000; ;item tag
1475 DW OFFSET nineteen_str ;AN000; ;used for RATE= also
1476 DB nineteentwohundred_item_tag ;AN000; ;item tag
1477 DW OFFSET nineteen_point_two_K_str ;AN000;pointer to string "19.2K"
1478
1479 number_of_baud_strings EQU ($ - start_baud_strings)/3 ;AN000;3 bytes per entry
1480
1481
1482
1483 PARITY_values LABEL BYTE ;AN000;all valid paritys
1484
1485 DB include_string_list ;AN000;have list of strings
1486
1487 DB 0 ;AN000;
1488
1489 DB 0 ;AN000;;no number choices
1490
1491 DB number_of_paritys ;AN000;;number of valid paritys
1492
1493 start_paritys LABEL BYTE ;AN000;
1494
1495 DB none_item_tag ;AN000;
1496 DW OFFSET N_str ;AN000;
1497 DB none_item_tag ;AN000;
1498 DW OFFSET NONE_str ;AN000;
1499 DB even_item_tag ;AN000;
1500 DW OFFSET EVEN_str ;AN000;
1501 DB even_item_tag ;AN000;
1502 DW OFFSET E_str ;AN000;
1503 DB odd_item_tag ;AN663;
1504 DW OFFSET O_str ;AN663;
1505 DB odd_item_tag ;AN000;
1506 DW OFFSET ODD_str ;AN000;
1507 DB MARK_item_tag ;AN663;
1508 DW OFFSET m_str ;AN663;
1509 DB MARK_item_tag ;AN000;
1510 DW OFFSET mark_str ;AN000;
1511 DB SPACE_item_tag ;AN663;
1512 DW OFFSET s_str ;AN663;
1513 DB SPACE_item_tag ;AN000;
1514 DW OFFSET space_str ;AN000;
1515
1516 number_of_paritys EQU ($ - start_paritys)/3 ;AN000;3 bytes per entry
1517
1518
1519 DATA_values LABEL BYTE ;AN000;all valid DATA values
1520
1521 DB include_string_list ;AC663;have list of numbers
1522
1523 DB 0 ;AN000;no number ranges
1524
1525 DB 0 ;AN000;no number choices
1526
1527 DB number_of_databits ;AN000;string choices
1528
1529 start_databits LABEL BYTE ;AN000;
1530
1531 DB five_item_tag ;AN000;
1532 DW OFFSET five_str ;AN000;
1533 DB six_item_tag ;AN000;
1534 DW OFFSET six_str ;AN000;
1535 DB seven_item_tag ;AN000;
1536 DW OFFSET seven_str ;AN000;
1537 DB eight_item_tag ;AN000;
1538 DW OFFSET eight_str ;AN000;
1539
1540 number_of_databits EQU ($ - start_databits)/3 ;AN000;3 bytes per entry
1541
1542
1543 STOP_values LABEL BYTE ;AN000;;all valid stop bits
1544
1545 DB include_string_list ;AN000;have list of numbers and list of strings
1546
1547 DB 0 ;AN000;
1548
1549 DB 0 ;AN000; ;no number choices
1550
1551 DB number_of_stopbit_strings ;AN000;;choices in string form
1552
1553 start_stopbit_strings LABEL BYTE ;AN000;
1554
1555 DB one_item_tag ;AN000;
1556 DW OFFSET one_str ;AN000;
1557 DB one_point_five_item_tag ;AN000;
1558 DW OFFSET one_point_five_str ;AN000;
1559 DB two_item_tag ;AN000;
1560 DW OFFSET two_str ;AN000;
1561
1562 number_of_stopbit_strings EQU ($ - start_stopbit_strings)/3 ;AN000;3 bytes per entry
1563
1564
1565
1566 RETRY_values LABEL BYTE ;AN000;;all valid RETRY settings
1567
1568 DB include_string_list ;AN000;have list of strings
1569
1570 DB 0 ;AN000;
1571
1572 DB 0 ;AN000;;no number choices
1573
1574 DB number_of_retry_settings ;AN000;
1575
1576 start_retry_settings LABEL BYTE ;AN000;
1577
1578 DB B_item_tag ;AN000;
1579 DW OFFSET B_str ;AN000;
1580 DB E_item_tag ;AN000;
1581 DW OFFSET E_str ;AN000;
1582 DB R_item_tag ;AN000;
1583 DW OFFSET R_str ;AN000;
1584 DB NONE_item_tag ;AN663;
1585 DW OFFSET N_str ;AN663;
1586 DB NONE_item_tag ;AN000;
1587 DW OFFSET NONE_str ;AN000;
1588 DB P_item_tag ;AN000;
1589 DW OFFSET P_str ;AN000;
1590
1591 number_of_retry_settings EQU ($ - start_retry_settings)/3 ;AN000;3 bytes per entry
1592
1593
1594
1595 PREPARE_values LABEL BYTE ;AN000;almost any numeric value is valid
1596
1597 DB ranges_only ;AN000;;have range of numbers
1598
1599 DB 1 ;AN000;;one range
1600
1601 DB codepage_item_tag ;AN000;
1602 DD min_codepage_value ;AN000;
1603 DD max_codepage_value ;AN000;
1604
1605
1606
1607
1608 SELECT_values LABEL BYTE ;AN000;all valid baud rates
1609
1610 DB ranges_only ;AN000;;have range of numbers
1611
1612 DB 1 ;AN000;
1613
1614 DB codepage_item_tag ;AN000;;item tag for the range
1615 DD min_codepage_value ;AN000;
1616 DD max_codepage_value ;AN000;
1617
1618
1619 DELAY_values LABEL BYTE ;AN000;;all valid delay rates
1620
1621 DB ranges_only ;AN000;;have range of numbers
1622
1623 DB 1 ;AN000;;1 range
1624 DB range_item_tag ;AN000;;don't ever need this item tag
1625 DD 1 ;AN000;;smallest valid delay value
1626 DD 4 ;AN000;;largest valid delay value
1627
1628
1629
1630 RATE_values LABEL BYTE ;AN000;;all valid typamatic rates
1631
1632 DB ranges_only ;AN000;;have range of numbers
1633
1634 DB 1 ;AN000;;1 range
1635 DB range_item_tag ;AN000;;never used
1636 DD 1 ;AN000;;smallest valid rate
1637 DD 32 ;AN000;;largest valid rate
1638
1639
1640
1641
1642 CON_COLUMNS_values LABEL BYTE ;AN000;all valid columns values for the screen
1643
1644 DB include_number_list ;AN000; ;have list of numbers
1645
1646 DB 0 ;AN000;only numeric representations
1647
1648 DB number_of_CON_columns_numbers ;AN000;choices represented as numbers
1649
1650 start_CON_columns_numbers LABEL BYTE ;AN000;
1651
1652 DB fourty_item_tag ;AN000;
1653 DD 40 ;AN000;
1654 DB eighty_item_tag ; ;AN000;
1655 DD 80 ;AN000;numbers because used in call to IOCTL
1656
1657 number_of_CON_columns_numbers EQU ($ - start_CON_columns_numbers)/5 ;5 bytes per entry;AN000;
1658
1659
1660
1661 CON_LINES_values LABEL BYTE ;all valid LINES= values for the screen;AN000;
1662
1663 DB include_number_list ;have list of numbers;AN000;
1664
1665 DB 0 ;AN000;
1666
1667 DB number_of_CON_lines_numbers ; number ch;AN000;
1668
1669 start_CON_lines_numbers LABEL BYTE ;AN000;
1670
1671 DB twentyfive_item_tag ;AN000;
1672 DD 25 ;AN000;
1673 DB fourtythree_item_tag ;AN000;
1674 DD 43 ;AN000;
1675 DB fifty_item_tag ;AN000;
1676 DD 50 ;AN000;
1677
1678 number_of_CON_lines_numbers EQU ($ - start_CON_lines_numbers)/5 ;5 bytes per entry;AN000;
1679
1680
1681
1682
1683 LPT_COLUMNS_values LABEL BYTE ;AN000;all valid columns values for parallel printers
1684
1685 DB include_string_list ;AN000;;have list of strings
1686
1687 DB 0 ;AN000;
1688
1689 DB 0 ;AN000;no numeric representations
1690
1691 DB number_of_lpt_columns_strings ;AN000;;choices represented as strings
1692
1693 start_LPT_columns_strings LABEL BYTE ;AN000;
1694
1695 DB eighty_item_tag ; ;AN000;
1696 DW OFFSET eighty_str ;AN000;;strings because values also used as positional parms
1697 DB onethirtytwo_item_tag ;AN000;
1698 DW OFFSET onethirtytwo_str ;AN000;
1699
1700 number_of_LPT_columns_strings EQU ($ - start_LPT_columns_strings)/3 ;3 bytes per entry;AN000;
1701
1702
1703
1704 LPT_LINES_values LABEL BYTE ;AN000;all valid LINES= values for the screen
1705
1706 DB include_string_list ;AN000;have list of strings
1707
1708 DB 0 ;AN000;
1709
1710 DB 0 ;AN000; ;no number choices
1711
1712 DB number_of_LPT_lines_strings ;AN000;
1713
1714 start_LPT_lines_strings LABEL BYTE ;AN000;
1715
1716 DB six_item_tag ;AN000;;for printer
1717 DW OFFSET six_str ;AN000;
1718 DB eight_item_tag ;AN000;;for printer
1719 DW OFFSET eight_str ;AN000;
1720
1721 number_of_LPT_lines_strings EQU ($ - start_LPT_lines_strings)/3 ;AN000;3 bytes per entry
1722
1723
1724 reroute_values LABEL BYTE ;AN000;;all valid destination devices for parallel printer reroute
1725
1726 DB include_string_list ;AN000; ;have list of numbers and one string
1727
1728 DB 0 ;AN000;
1729
1730 DB 0 ;AN000;;no number choices
1731
1732 DB number_of_reroute_strings ;AN000;
1733
1734 start_reroute_strings LABEL BYTE ;AN000;
1735
1736 DB COM1_item_tag ;AN000;
1737 DW OFFSET COM1_str ;AN000;
1738 DB COM2_item_tag ;AN000;
1739 DW OFFSET COM2_str ;AN000;
1740 DB COM3_item_tag ;AN000;
1741 DW OFFSET COM3_str ;AN000;
1742 DB COM4_item_tag ;AN000;
1743 DW OFFSET COM4_str ;AN000;
1744
1745 number_of_reroute_strings EQU ($ - start_reroute_strings)/3 ;AN000;3 bytes per entry
1746
1747
1748
1749
1750 Sw_control LABEL BYTE ;AN000;
1751
1752 DW 0 ;AN000;no values allowed on /STATUS
1753 function_flag DW 0 ;AN000;no values allowed on /STATUS
1754 DW result ;AN000;same buffer as for other parms
1755 DW Sw_values ;AN000;
1756 num_synonyms DB 3 ;AN000;3 ways to specify /STATUS
1757 slash_sta DB "/STA",0 ;AN000;
1758 slash_stat DB "/STAT",0 ;AN000;
1759 slash_status DB "/STATUS",0 ;AN000;
1760
1761
1762
1763
1764
1765
1766 Sw_values LABEL BYTE ;AN000;
1767
1768 DB 0 ;AN000;no values allowed on /STATUS
1769
1770
1771 first_pos_values LABEL BYTE ;AN000;value list for all positional parameters that appear first
1772
1773 DB include_string_list ;AN000; ;have string values
1774
1775 DB 0 ;AN000;numerics treated as strings
1776
1777 DB 0 ;AN000;no number choices
1778
1779 DB number_of_first_positional_strings ;AN000;
1780
1781 start_first_positional_strings LABEL BYTE ;used to calculate previous field;AN000;
1782
1783 ;screen modes
1784
1785 DB BW40_item_tag ;AC000;
1786 DW OFFSET BW40_str ;AC000;
1787 DB BW80_item_tag ;AC000;
1788 DW OFFSET BW80_str ;AC000;
1789 DB CO40_item_tag ;AC000;
1790 DW OFFSET CO40_str ;AC000;
1791 DB CO80_item_tag ;AC000;
1792 DW OFFSET CO80_str ;AC000;
1793 DB MONO_item_tag ;AC000;
1794 DW OFFSET MONO_str ;AC000;
1795 DB fourty_item_tag ;AC000;
1796 DW OFFSET fourty_str ;AC000;
1797 DB eighty_item_tag ;AC000;
1798 DW OFFSET eighty_str ;AC000;
1799
1800
1801 DB con_item_tag ;AN000;
1802 DW OFFSET con_str ;AN000;
1803
1804 ;com port names
1805
1806 DB COM1_item_tag ;AN000;
1807 DW OFFSET COM1_str ;AN000;
1808 DB COM2_item_tag ;AN000;
1809 DW OFFSET COM2_str ;AN000;
1810 DB COM3_item_tag ;AN000;
1811 DW OFFSET COM3_str ;AN000;
1812 DB COM4_item_tag ;AN000;
1813 DW OFFSET COM4_str ;AN000;
1814
1815 ;printer port names
1816
1817 DB PRN_item_tag ;AN000;
1818 DW OFFSET PRN_str ;AN000;
1819 DB LPT1_item_tag ;AN000;
1820 DW OFFSET LPT1_str ;AN000;
1821 DB LPT2_item_tag ;AN000;
1822 DW OFFSET LPT2_str ;AN000;
1823 DB LPT3_item_tag ;AN000;
1824 DW OFFSET LPT3_str ;AN000;
1825
1826 ;LPT special cases
1827
1828 DB LPT1132_item_tag ;AN000;
1829 DW OFFSET LPT1132_str;AN000;
1830 DB LPT2132_item_tag ;AN000;
1831 DW OFFSET LPT2132_str;AN000;
1832 DB LPT3132_item_tag ;AN000;
1833 DW OFFSET LPT3132_str;AN000;
1834 DB LPT180_item_tag ;AN000;
1835 DW OFFSET LPT180_str ;AN000;
1836 DB LPT280_item_tag ;AN000;
1837 DW OFFSET LPT280_str ;AN000;
1838 DB LPT380_item_tag ;AN000;
1839 DW OFFSET LPT380_str ;AN000;
1840
1841
1842 number_of_first_positional_strings EQU ($ - start_first_positional_strings)/3 ;each entry is 3 bytes (byte, word);AN000;
1843
1844
1845
1846 second_pos_values LABEL BYTE ;AN000;;value list for all positional parameters that appear second
1847
1848 DB include_string_list ;AN000; ;have string values
1849
1850 DB 0 ;AN000;numerics treated as strings
1851
1852 DB 0 ;AN000;no number choices
1853
1854 DB number_of_second_positional_strings ;AN000;
1855
1856 start_second_positional_strings LABEL BYTE ;used to calculate previous field;AN000;
1857
1858
1859 ;codepage strings
1860
1861 DB CODEPAGE_item_tag ;AN000;
1862 DW OFFSET CODE_str ;AN000;
1863 DB CODEPAGE_item_tag ;AN000;
1864 DW OFFSET CODEPAGE_str ;AN000;
1865 DB CODEPAGE_item_tag ;AN000;
1866 DW OFFSET CP_str ;AN000;
1867
1868 ;invalid choice, included for usable error reporting: if come across refresh right after CON then issue invalid number of parms
1869
1870 DB REFRESH_item_tag ;AC007;
1871 DW OFFSET REF_str ;AC007;
1872 DB REFRESH_item_tag ;AC007;
1873 DW OFFSET REFRESH_str ;AC007;
1874
1875 ;shift directions
1876
1877 DB L_item_tag ;AN000;
1878 DW OFFSET L_str ;AN000;
1879 DB R_item_tag ;AN000;
1880 DW OFFSET R_str ;AN000;
1881
1882
1883 ;columns values
1884
1885 ; DB eighty_item_tag ;AN000;
1886 ; DW OFFSET eighty_str ;AN000; ;strings because values also used as positional parms
1887 DB onethirtytwo_item_tag;AN000;
1888 DW OFFSET onethirtytwo_str ;AN000;
1889
1890 number_of_second_positional_strings EQU ($ - start_second_positional_strings)/3 ;each entry is 3 bytes (byte, word);AN000;
1891
1892
1893 third_pos_values LABEL BYTE ;AN000;value list for all positional parameters that appear third
1894
1895 DB include_string_list ;AN000; ;have string values
1896
1897 DB 0 ;AN000;numerics treated as strings
1898
1899 DB 0 ;AN000;no number choices
1900
1901 DB number_of_third_positional_strings ;AN000;
1902
1903 start_third_positional_strings LABEL BYTE ;used to calculate previous field;AN000;
1904
1905 number_of_third_positional_strings EQU ($ - start_third_positional_strings)/3 ;each entry is 3 bytes (byte, word);AN000;
1906
1907
1908 first_lpt_pos_values LABEL BYTE ;AN000;value list for all possible chars per line
1909
1910 DB include_string_list ;AN000; ;have string values
1911
1912 DB 0 ;AN000;numerics treated as strings
1913
1914 DB 0 ;AN000;no number choices
1915
1916 DB number_of_first_lpt_positional_strings ;AN000;
1917
1918 start_first_lpt_positional_strings LABEL BYTE ;used to calculate previous field;AN000;
1919
1920 DB eighty_item_tag
1921 DW OFFSET eighty_str
1922 DB onethirtytwo_item_tag
1923 DW OFFSET onethirtytwo_str ;AN000;
1924 DB CODEPAGE_item_tag
1925 DW OFFSET CODE_str ;AN000;
1926 DB CODEPAGE_item_tag ;AN000;
1927 DW OFFSET CODEPAGE_str ;AN000;
1928 DB CODEPAGE_item_tag ;AN000;
1929 DW OFFSET CP_str ;AN000;
1930
1931 ;invalid choice, included for usable error reporting: if come across refresh right after CON then issue invalid number of parms
1932
1933 DB REFRESH_item_tag ;AC007;
1934 DW OFFSET REF_str ;AC007;
1935 DB REFRESH_item_tag ;AC007;
1936 DW OFFSET REFRESH_str ;AC007;
1937
1938 number_of_first_lpt_positional_strings EQU ($ - start_first_lpt_positional_strings)/3 ;each entry is 3 bytes (byte, word);AN000;
1939
1940
1941 second_lpt_pos_values LABEL BYTE ;AN000;value list for all possible lines per inch
1942
1943 DB include_string_list ;AN000; ;have string values
1944
1945 DB 0 ;AN000;numerics treated as strings
1946
1947 DB 0 ;AN000;no number choices
1948
1949 DB number_of_second_lpt_positional_strings ;AN000;
1950
1951 start_second_lpt_positional_strings LABEL BYTE ;used to calculate previous field;AN000;
1952
1953 DB eight_item_tag ;AN000;
1954 DW OFFSET eight_str ;AN000;
1955 DB six_item_tag ;AN000;
1956 DW OFFSET six_str ;AN000;
1957 DB REFRESH_item_tag ;AN000;
1958 DW OFFSET REF_str ;AN000;
1959 DB REFRESH_item_tag ;AN000;
1960 DW OFFSET REFRESH_str ;AN000;
1961
1962 number_of_second_lpt_positional_strings EQU ($ - start_second_lpt_positional_strings)/3 ;3 bytes per entry (byte,word);AN000;
1963
1964
1965 third_lpt_pos_values LABEL BYTE ;AN000;value list for all possible retry settings
1966
1967 DB include_string_list ;AN000; ;have string values
1968
1969 DB 0 ;AN000;no numeric ranges
1970
1971 DB 0 ;AN000;no number choices
1972
1973 DB number_of_third_lpt_positional_strings ;AN000;
1974
1975 start_third_lpt_positional_strings LABEL BYTE ;used to calculate previous field;AN000;
1976
1977 DB B_item_tag ;AN000;
1978 DW OFFSET B_str ;AN000;
1979 DB E_item_tag ;AN000;
1980 DW OFFSET E_str ;AN000;
1981 DB R_item_tag ;AN000;
1982 DW OFFSET R_str ;AN000;
1983 DB NONE_item_tag ;AN663;
1984 DW OFFSET N_str ;AN663;
1985 DB NONE_item_tag ;AN000;
1986 DW OFFSET NONE_str ;AN000;
1987 DB OFF_item_tag ;AN000;
1988 DW OFFSET OFF_str ;AN000;
1989 DB P_item_tag
1990 DW OFFSET P_str
1991
1992 number_of_third_lpt_positional_strings EQU ($ - start_third_lpt_positional_strings)/3 ;each entry is 3 bytes (byte, word);AN000;
1993
1994
1995
1996 ;strings
1997
1998 ;AN000;
1999 zero_str DB "0",0 ;AN000;
2000 one_str DB "1",0 ;AN000;
2001 one_point_five_str DB "1.5",0 ;AN000;
2002 two_str DB "2",0 ;AN000;
2003 three_str DB "3",0 ;AN000;
2004 four_str DB "4",0 ;AN000;
2005 five_str DB "5",0 ;AN000; ;data bit, typamatic rate
2006 six_str DB "6",0 ;AN000;
2007 seven_str DB "7",0 ;AN000;
2008 eight_str DB "8",0 ;AN000;
2009 nine_str DB "9",0 ;AN000;
2010 eleven_str DB "11",0 ;AN000; ;first two chars of 110
2011 twelve_str DB "12",0 ;AN000;
2012 fifteen_str DB "15",0 ;AN000; ;abbreviated form of 150, 15 is also a RATE= candidate
2013 nineteen_str DB "19",0 ;AN000; ;used for baud rates and RATE=
2014 nineteen_point_two_str DB "19.2",0 ;AN000;
2015 nineteen_point_two_K_str DB "19.2K",0 ;AN000; ;mutant baud rate
2016 twentyfour_str DB "24",0 ;AN000; ;24 is also a typamatic rate
2017 thirty_str DB "30",0 ;AN000;
2018 fourty_str DB "40",0 ;AN000;
2019 fourtyeight_str DB "48",0 ;AN000;
2020 sixty_str DB "60",0 ;AN000;
2021 eighty_str DB "80",0 ;AN000;
2022 ninetysix_str DB "96",0 ;AN000;
2023 oneten_str DB "110",0 ;AN000;
2024 onethirtytwo_str DB "132",0 ;AN000;
2025 onefifty_str DB "150",0 ;AN000;
2026 threehundred_str DB "300",0 ;AN000;
2027 sixhundred_str DB "600",0 ;AN000;
2028 twelvehundred_str DB "1200",0 ;AN000;
2029 twentyfourhundred_str DB "2400",0 ;AN000;
2030 fourtyeighthundred_str DB "4800",0 ;AN000;
2031 ninetysixhundred_str DB "9600",0 ;AN000;
2032 nineteentwohundred_str DB "19200",0 ;AN000;
2033 B_str DB "B",0 ;AN000;
2034 BW40_str DB "BW40",0 ;AN000;
2035 BW80_str DB "BW80",0 ;AN000;
2036 CO40_str DB "CO40",0 ;AN000;
2037 CO80_str DB "CO80",0 ;AN000;
2038 CODE_str DB "CODE",0 ;AN000;
2039 CODEPAGE_str DB "CODEPAGE",0;AN000;
2040 COM_str DB "COM",0 ;AN000;
2041 start_COM1_str LABEL BYTE ;AN000; ;used to calculate len_COMX_str, see invoke
2042 COM1_str DB "COM1",0 ;AN000;
2043 len_COMX_str EQU $ - start_COM1_str;AN000; ;all COMX strings are the same length
2044 COM2_str DB "COM2",0 ;AN000;
2045 COM3_str DB "COM3",0 ;AN000;
2046 COM4_str DB "COM4",0 ;AN000;
2047 CON_str DB "CON",0
2048 len_CON_str EQU ($ - (OFFSET CON_str)) ;AN000;
2049 CP_str DB "CP",0 ;AN000;
2050 E_str DB "E",0 ;RETRY=setting ;AN000;
2051 EVEN_str DB "EVEN",0 ;AN000;
2052 L_str DB "L",0 ;AN000;
2053 start_LPT1_str LABEL BYTE ;used to calculate len_LPTX_str, see invoke ;AN000;
2054 LPT1_str DB "LPT1",0 ;AN000;
2055 len_LPTX_str EQU $ - start_LPT1_str ;all LPTX strings are the same length ;AN000;
2056 LPT2_str DB "LPT2",0 ;AN000;
2057 LPT3_str DB "LPT3",0 ;AN000;
2058 LPT1132_str DB "LPT1132",0 ;AN000;
2059 LPT2132_str DB "LPT2132",0 ;AN000;
2060 LPT3132_str DB "LPT3132",0 ;AN000;
2061 LPT180_str DB "LPT180",0 ;AN000;
2062 LPT280_str DB "LPT280",0 ;AN000;
2063 LPT380_str DB "LPT380",0 ;AN000;
2064 M_str DB "M",0
2065 MARK_str DB "MARK",0 ;AN000;
2066 MONO_str DB "MONO",0 ;AN000;
2067 N_str DB "N",0 ;AN000;
2068 NONE_str DB "NONE",0 ;AN000;
2069 O_str DB "O",0 ;AN000;
2070 ODD_str DB "ODD",0 ;AN000;
2071 OFF_str DB "OFF",0 ;AN000;
2072 ON_str DB "ON",0 ;AN000;
2073 P_str DB "P",0 ;AN000;
2074 PRN_str DB "PRN",0 ;AN000;
2075 R_str DB "R",0 ;AN000;
2076 REF_str DB "REF",0 ;AN000;
2077 REFRESH_str DB "REFRESH",0 ;AN000;
2078 S_str DB "S",0
2079 SPACE_str DB "SPACE",0 ;AN000;
2080 T_str DB "T",0 ;AN000;
2081
2082
2083 result result_def<> ;AN000;
2084
2085 parm_lst parm_list_entry max_parms DUP (<>) ;AN000;
2086
2087
2088
2089 ;º º
2090 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
2091
2092
2093 ;
2094 ;******************************************************************************************
2095
2096 ;-------------------------------------------------------------------------------
2097 ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
2098
2099 ;³ SEARCH_ITEM_TAGS
2100 ;³ ----------------
2101 ;³ Search the item tags in input value list for the input item tag.
2102
2103
2104
2105
2106
2107
2108 ;³ INPUT: i_CL - first item tag in the group
2109 ;³ search_stop - last item_tag in the group, the sentinal for the REPEAT
2110 ;³ loop.
2111
2112
2113 ;³ RETURN: match_found indicates that the item tag returned by the parser was
2114 ;³ found in the group passed in.
2115
2116
2117 ;³ MESSAGES: none
2118
2119
2120
2121
2122 ;³ REGISTER
2123 ;³ USAGE: To be determined at I2 time.
2124
2125
2126 ;³ CONVENTIONS:
2127
2128
2129
2130
2131 ;³ ASSUMPTIONS:
2132
2133
2134 ;³ SIDE EFFECT:
2135
2136
2137 ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
2138
2139 search_item_tags PROC NEAR ;AN000;
2140
2141
2142 MOV match_found,false ;AN000;
2143 .REPEAT
2144 .IF <parm_list[current_parm_DI].item_tag EQ i_CL> THEN ;AN000;
2145 MOV match_found,true ;AN000;
2146 MOV i_CL,last_databit_item_tag ;AN000;set end of loop trigger
2147 .ENDIF ;AN000;
2148 INC i_CL ;AN000;
2149 .UNTIL <i_CL GT search_stop> ;AN000;
2150
2151 RET
2152
2153 search_item_tags ENDP ;AN000;
2154
2155 ;-------------------------------------------------------------------------------
2156 ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
2157
2158 ;³ CHECK_FOR_KEYWORD
2159 ;³ ---------------------
2160
2161 ;³ Scan the list of keywords (OFFSETS) looking for a match with
2162 ;³ parm_list[current_parm_DI].keyword_switch_ptr.
2163
2164
2165
2166 ;³ INPUT: uses global variables.
2167
2168
2169 ;³ RETURN: match_found is set to true if a match is found.
2170
2171
2172 ;³ MESSAGES: none
2173
2174
2175
2176 ;³ REGISTER
2177 ;³ USAGE: DX - loop index
2178 ;³ SI - displacement into the list of pointers
2179 ;³ CX - holder of pointer to keywords for compare
2180
2181
2182
2183 ;³ CONVENTIONS:
2184
2185
2186
2187
2188
2189
2190 ;³ ASSUMPTIONS: The list of con_keyword pointers is consecutive words.
2191 ;³ number_of_keywords has the number of OFFSETS in the list
2192 ;³ start_of_keyword_ptrs has the first OFFSET in the list and can
2193 ;³ be addressed off of.
2194
2195
2196
2197 ;³ SIDE EFFECT: DL - lost
2198 ;³ SI - lost
2199 ;³ CX - lost
2200 ;³ match_found - lost
2201
2202
2203 ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
2204
2205 check_for_keyword PROC NEAR ;AN000;
2206
2207 MOV match_found,false ;AN000;
2208 MOV SI,0 ;AN000;
2209 MOV DL,0 ;AN000;;index for the loop
2210 .WHILE <DL LT number_of_keywords> AND ;AN000;;check each pointer in the list
2211 .WHILE <match_found EQ false> DO ;AN000;
2212 MOV CX,start_of_keyword_ptrs[SI] ;AN000;
2213 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ CX> THEN ;AN000;IF synonym ptr=CON keyword ptr THEN
2214 MOV match_found,true ;AN000;
2215 .ENDIF ;AN000;
2216 INC SI ;AN000; ;AN000;
2217 INC SI ;AN000; ;AN000;
2218 INC DL ;AN000;;increment loop counter
2219 .ENDWHILE ;AN000;
2220
2221 RET ;AN000;
2222
2223 check_for_keyword ENDP ;AN000;
2224
2225 ;-------------------------------------------------------------------------------
2226
2227 setup_invalid_parameter PROC NEAR ;AN000;
2228
2229 PUBLIC setup_invalid_parameter
2230
2231 MOV message,OFFSET CRLF ;AN000;the common message doesn't have a CR,LF in it and all my other messages do
2232 PUSH parser_return_code_AX ;AC006;AX destroyed by sysdispmsg
2233 display message ;AN000;
2234 POP parser_return_code_AX
2235
2236
2237 MOV BP,command_line ;AN000;BP points to end of current (invalid) parm
2238 .IF <<BYTE PTR [BP]> NE end_of_line_char_0D> AND ;AN000;IF a whitespace char or comma in the string
2239 .IF <<BYTE PTR [BP]> NE end_of_line_char_00> THEN ;AN000;THEN
2240 DEC BP ;AN000;don't include the delimeter in the display of the invalid parm
2241 .ENDIF
2242 MOV BYTE PTR [BP],0 ;AN000;make the string an ASCIIZ
2243
2244 ;offending_parameter is where the text of the bad parm is,
2245 ;offending_parameter_ptr is the address of offending_parameter By incrementing
2246 ;offending_parameter_ptr the first characters of the text string are skipped.
2247 ;This is done to skip leading whitespace.
2248
2249
2250 MOV BP,offending_parameter_ptr ;AC006;BP=>first char in the text string
2251 .WHILE <<BYTE PTR [BP]> EQ tab> OR ;AC006;WHILE the char in the text string
2252 .WHILE <<BYTE PTR [BP]> EQ " "> DO ;AC006; is white space DO
2253 INC offending_parameter_ptr ;AC006;point past the whitespace char
2254 INC BP ;AC006;index next char in the string
2255 .ENDWHILE ;AC006;
2256
2257 .IF <parser_return_code_AX EQ syntax_error_rc> THEN ;AN000;syntax error, like "RETRY= E"
2258 MOV message,OFFSET syntax_error ;AN000;
2259 PUSH offending_parameter_ptr ;AN000;
2260 POP syntax_error_ptr ;AN000;point to the offending parameter
2261 .ELSEIF <parser_return_code_AX EQ not_in_switch_list> THEN ;AN000;
2262 MOV message,OFFSET Invalid_switch
2263 .ELSE
2264 MOV message,OFFSET Invalid_parameter ;AN000;user mispelled, misordered etc.
2265 .ENDIF ;AN000;
2266 MOV noerror,false ;AN000;
2267
2268 RET
2269
2270 setup_invalid_parameter ENDP ;AN000;
2271
2272 ;-------------------------------------------------------------------------------
2273
2274 setup_for_not_supported PROC NEAR ;AC002;prepare replacable parm for "Function not supported on this machine - ????".
2275
2276 MOV CX,offending_parameter_ptr;AN000;
2277 MOV not_supported_ptr,CX ;AN000;point to string describing what is not supported for message
2278 MOV BP,command_line ;AN000;BP points to end of current (invalid) parm
2279 .IF <<BYTE PTR [BP]> NE end_of_line_char_0D> AND ;AN000;IF a whitespace char or comma in the string
2280 .IF <<BYTE PTR [BP]> NE end_of_line_char_00> THEN ;AN000;THEN
2281 DEC BP ;AN000;don't include the delimeter in the display of the invalid parm
2282 .ENDIF
2283 MOV BYTE PTR [BP],0 ;AN000;make the string an ASCIIZ
2284 MOV message,OFFSET function_not_supported ;AN000;"Function not supported on the computer - mark"
2285 MOV noerror,false ;AN000;
2286 MOV looking_for,eol
2287
2288 RET
2289
2290 setup_for_not_supported ENDP ;AC002;
2291
2292
2293 ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
2294
2295 ;³ PARSE_PARAMETERS
2296 ;³ ----------------
2297
2298 ;³ All parameters entered on the command line are reduced to a list of values
2299 ;³ which completely describes the parms. The syntactic and semantic correctness
2300 ;³ will be checked. The routines that use the lists created by this routine
2301 ;³ can have complete trust in the validity of the parms.
2302
2303 ;³ Most of the states of looking_for allow null, even if it is not mentioned in
2304 ;³ the name of the value looking_for is assigned.
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315 ;³ INPUT: none, uses global variables.
2316
2317
2318 ;³ RETURN: noerror is set to false if an error is encountered.
2319
2320
2321 ;³ MESSAGES: "Invalid parameter 'bdprm'", where "bdprm" is the first 5 or less
2322 ;³ characters of the parameter that is incorrect or unexpected.
2323
2324 ;³ "Must specify COM1, COM2, COM3 or COM4"
2325
2326 ;³ "Illegal device name"
2327
2328 ;³ "Invalid baud rate specified"
2329
2330
2331
2332
2333 ;³ REGISTER
2334 ;³ USAGE: To be determined at I2 time.
2335
2336
2337 ;³ CONVENTIONS: "looking_for" indicates the valid possibilities for the next parm.
2338
2339 ;³ "current_parm" refers to the parm just returned. It can be an
2340 ;³ item tag, a type.
2341
2342 ;³ When "/STATUS" is a valid possibility it is checked for even
2343 ;³ though the value of "looking_for" may not indicate it as a
2344 ;³ choice.
2345
2346 ;³ When possible the parser control blocks will be modified at
2347 ;³ the case where looking_for is being checked for rather than
2348 ;³ where looking_for was set. This will save code when more than
2349 ;³ one place sets looking_for to the same state.
2350
2351
2352
2353
2354 ;³ ASSUMPTIONS: The parser control blocks are setup to be the following:
2355 ;³ seperators are defaults and colon (:)
2356 ;³ match_flags=2011 (simple string, ignore colon, optional)
2357 ;³ function_flags=0
2358 ;³ keyword/switch list has only /STATUS
2359 ;³ nval (number of value definitions) is 3
2360 ;³ Initially no number choices. Most numeric values will treated as strings.
2361 ;³ This is because for most of them the numeric value doesn't
2362 ;³ mean anything. Since we do not want to restrict the choices
2363 ;³ code pages they cannot be enumerated, so a range will be used.
2364 ;³ The list of strings in the values block contains all the
2365 ;³ device names, all the screen modes, all the status qualifiers,
2366 ;³ and all numeric values that have no meaning in binary form,
2367 ;³ can be enumerated, or are non-integer.
2368
2369
2370 ;³ SIDE EFFECT:
2371
2372
2373 ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
2374
2375 parse_parameters PROC ;AN000;
2376
2377 ;determine if on a PS/2 for checking COMx parameters
2378
2379 .IF <machine_type EQ PS2Model30> OR ;AC002;
2380 .IF <machine_type EQ PS2Model50> OR ;AC002;
2381 .IF <machine_type EQ PS2Model60> OR ;AC002;
2382 .IF <machine_type EQ PS2Model80> THEN ;AC002;IF the machine is a PS/2 THEN
2383 MOV type_of_machine,PS2 ;AC002;set flag
2384 .ENDIF
2385
2386
2387 MOV looking_for,first_parm ;AN000;looking_for:=first_parm
2388
2389 .WHILE <eol_found NE true> AND NEAR ;AN000;
2390 .WHILE <noerror EQ true> NEAR DO ;AN000;WHILE (NOT EOL) AND noerror=true DO
2391
2392 ; CASE looking_for=
2393
2394 ;calculate the displacement for the jump to appropriate case
2395 XOR AX,AX ;AN000;
2396 MOV AL,max_looking_for ;AN000;see the list of equates for looking_for
2397 SUB AL,looking_for ;AN000;AX=byte displacement into table of OFFSETS
2398 SHL AX,1 ;AN000;each displacement is 2 bytes
2399 MOV SI,AX ;AN000;SI=appropriate displacement into table of offsets
2400 JMP jump_table1[SI] ;AN000;jump to case
2401
2402 jump_table1 LABEL WORD ;AN000; ;these entries must be in same order as the values in list of equates for looking_for
2403
2404 DW OFFSET codepage_case ;AN000;
2405 DW OFFSET codepage_prms_case ;AN000;
2406 DW OFFSET COM_keyword_case ;AN000;
2407 DW OFFSET com_keyword_or_baud_case ;AN000;
2408 DW OFFSET CON_keyword_case ;AN000;
2409 DW OFFSET con_kwrd_status_or_cp_case ;AN000;
2410 DW OFFSET databits_or_null_case ;AN000;
2411 DW OFFSET device_name_or_eol_case ;AN000;
2412 DW OFFSET eol_case ;AN000;
2413 DW OFFSET first_parm_case ;AN000;
2414 DW OFFSET li_or_null_case ;AN000;
2415 DW OFFSET P_case ;AN000;
2416 DW OFFSET parity_or_null_case ;AN000;
2417 DW OFFSET prn_kw_status_cp_cl_null_case ;AN000;
2418 DW OFFSET sd_or_dl_case ;AN000;
2419 DW OFFSET sd_or_dl_or_eol_case ;AN000;
2420 DW OFFSET status_or_eol_case ;AN000;
2421 DW OFFSET stopbits_or_null_case ;AN000;
2422 DW OFFSET T_or_eol_case ;AN000;
2423
2424
2425 com_keyword_or_baud_case: ;AN000;
2426
2427 PUBLIC com_keyword_or_baud_case
2428
2429 ;The com keywords are in "com_parmsx", as well as the values for the
2430 ;positional and keyword forms of the com parameters. If
2431 ;keyword_switch_ptr comes back from parse_parm nonzero then a valid
2432 ;com keyword or /STATUS was found.
2433
2434 CALL parse_parm ;AN000;/status allowed
2435
2436 ;CASE current_parm=
2437
2438
2439 ; /status:
2440
2441 .IF <parser_return_code_AX EQ no_error> AND ;AN000;
2442 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_sta>> OR ;AN000;
2443 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_stat>> OR ;AC004;
2444 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_status>> THEN ;AN000;
2445
2446 ; MOV slash_status,deleted ;AN000;make it so /status again is an error,also deletes /STA
2447 ; MOV slash_stat,deleted ;AN000;
2448 ; MOV slash_sta,deleted ;AN000;
2449 MOV looking_for,eol ;AN000;eol only valid
2450 MOV request_type,com_status ;AN000;
2451
2452 BREAK 1 ;AN000;
2453
2454 .ENDIF ;AN000;
2455
2456
2457 ; eol:
2458
2459 .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;
2460
2461 MOV request_type,com_status ;AN000;
2462 MOV eol_found,true ;AN000;
2463 BREAK 1 ;AN000;
2464
2465 .ENDIF ;AN000;
2466
2467
2468 ; com_keyword:
2469
2470 .IF <parser_return_code_AX EQ no_error> AND ;AN000;
2471 .IF <parm_list[current_parm_DI].keyword_switch_ptr NE 0> THEN ;AN000;wasn't /STATUS so must be a keyword
2472
2473 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET baud_equal>> THEN ;AN000;IF synonym ptr=> BAUD= THEN
2474 MOV baud_specified,true ;AN000;
2475 .ENDIF ;AN000;
2476 delete_parser_value_list_entry keywords,current_parm ;AN000;
2477 MOV looking_for,com_keyword ;AN000;
2478 MOV parms_form,keyword ;AN000;tell analyze_and_invoke how to look at the parms
2479 BREAK 1 ;AN000;
2480
2481 .ENDIF ;AN000;
2482
2483
2484 ; baud: ;found a number that is a valid baud, know that have old com style com request
2485
2486
2487
2488 .IF <parser_return_code_AX EQ no_error> THEN ;AN000;IF have a baud rate THEN (none of above, must be baud rate)
2489
2490 .IF <parm_list[current_parm_DI].item_tag EQ nineteentwohundred_item_tag> THEN ;AC002;IF PS2 only baud rate AND
2491 MOV new_com_initialize,true
2492 .IF <type_of_machine NE PS2> THEN ;AC002;not on PS/2
2493 CALL setup_for_not_supported ;AC002;set up for "Function not supported on this computer" message
2494 .ENDIF ;AN000;
2495 .ENDIF ;AN008;
2496 ;AD008; .ELSE
2497 MOV looking_for,parity_or_null ;AN000;
2498 MOV request_type,initialize_com_port ;AN000;
2499 ;AD008; .ENDIF
2500 BREAK 1 ;AN000;
2501
2502 .ELSE ;AN000;
2503
2504
2505 ; otherwise:
2506
2507 CALL setup_invalid_parameter ;AN000;
2508 ; BREAK 1
2509
2510 .ENDIF
2511
2512 ENDCASE_1:
2513
2514 BREAK 0 ;AN000;
2515
2516
2517
2518 com_keyword_case:
2519
2520 ;At this point the com keywords are in the keyword list, the only valid
2521 ;parms that can follow are com keywords. Assume that one and only one
2522 ;com keyword has been found and removed from the list of keywords.
2523
2524 PUBLIC com_keyword_case
2525
2526 MOV parms.parmsx_ptr,OFFSET com_keywords_parmsx ;AN000;only com keywords are in the control blocks
2527 MOV i_CL,1 ;AN000;
2528 .WHILE <i_CL LE number_of_com_keywords> AND NEAR ;AN000;one iteration more than number of parms left so will find eol
2529 .WHILE <eol_found EQ false> AND NEAR ;AN000;
2530 .WHILE <noerror EQ true> DO NEAR ;AN000;
2531
2532 .SELECT ;AC002;check for PS/2 specific parms
2533 .WHEN <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET baud_equal>> THEN ;AC002;IF synonym ptr=> BAUD= THEN
2534 .IF <parm_list[current_parm_DI].item_tag EQ nineteentwohundred_item_tag> THEN ;AC002;IF PS2 only baud rate AND
2535 MOV new_com_initialize,true
2536 .IF <type_of_machine NE PS2> THEN ;AC002;not on PS/2
2537 CALL setup_for_not_supported ;AC002;set up for "Function not supported on this computer" message
2538 .ENDIF
2539 .ENDIF
2540 .WHEN <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET parity_equal>> THEN ;AC002;IF parity= THEN
2541 .IF <parm_list[current_parm_DI].item_tag EQ mark_item_tag> OR ;AC002;IF PS2 only parity
2542 .IF <parm_list[current_parm_DI].item_tag EQ space_item_tag> THEN ;AC002;IF PS2 only parity AND
2543 MOV new_com_initialize,true
2544 .IF <type_of_machine NE PS2> THEN ;AC002;not on PS/2
2545 CALL setup_for_not_supported ;AC002;set up for "Function not supported on this computer" message
2546 .ENDIF
2547 .ENDIF
2548 .WHEN <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET data_equal>> THEN ;AC002;IF data= THEN
2549 .IF <parm_list[current_parm_DI].item_tag EQ five_item_tag> OR ;AC002;IF PS2 only data bits
2550 .IF <parm_list[current_parm_DI].item_tag EQ six_item_tag> THEN ;AC002;IF PS2 only data bits AND
2551 MOV new_com_initialize,true
2552 .IF <type_of_machine NE PS2> THEN ;AC002;not on PS/2
2553 CALL setup_for_not_supported ;AC002;set up for "Function not supported on this computer" message
2554 .ENDIF
2555 .ENDIF
2556 .WHEN <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET stop_equal>> THEN ;AC002;IF stop= THEN
2557 .IF <parm_list[current_parm_DI].item_tag EQ one_point_five_item_tag> THEN ;AC002;IF PS2 only stop bits AND
2558 MOV new_com_initialize,true
2559 .IF <type_of_machine NE PS2> THEN ;AC002;not on PS/2
2560 CALL setup_for_not_supported ;AC002;set up for "Function not supported on this computer" message
2561 .ENDIF
2562 .ENDIF
2563 .ENDSELECT
2564
2565 PUSH CX ;save the loop index
2566 CALL parse_parm ;AN000;
2567 POP CX
2568
2569 .IF <noerror EQ true> AND
2570 .IF <parser_return_code_AX EQ no_error> THEN ;AN000;
2571
2572 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET baud_equal>> THEN ;AN000;IF synonym ptr=> BAUD= THEN
2573 MOV baud_specified,true ;AN000;
2574 .ENDIF ;AN000;
2575 delete_parser_value_list_entry keywords,current_parm ;AN000;
2576 INC i_CL ;AN000;
2577
2578 .ELSEIF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;
2579
2580 .IF <baud_specified EQ true> THEN ;AN000;
2581 MOV request_type,initialize_com_port ;AN000;
2582 .ELSE ;AN000;
2583 MOV message,OFFSET baud_rate_required ;AN000;
2584 MOV noerror,false
2585 .ENDIF ;AN000;
2586 MOV eol_found,true ;AN000;
2587
2588 .ELSE NEAR ;AN000;
2589
2590 CALL setup_invalid_parameter ;AN000;
2591
2592 .ENDIF ;AN000;
2593
2594 .ENDWHILE ;AN000;
2595
2596 MOV looking_for,eol ;AN000;if haven't already encountered an error then check for extraneous parms
2597
2598 BREAK 0 ;AN000;com_keyword
2599
2600
2601 status_or_eol_case:
2602
2603 ; status_or_eol: ;Have found the only or the last status qualifier, must find /STATUS or eol_found NExt
2604 ;Assume that /STATUS is the only switch in the appropriate parser control block
2605 ;Assume that request_type has already been set
2606
2607 CALL parse_parm ;AN000;
2608
2609 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_sta>> OR ;AN000;
2610 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_stat>> OR ;AC004;
2611 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_status>> THEN ;AN000;found /status
2612
2613 MOV looking_for,eol ;AN000;
2614
2615 .ELSEIF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;encountered EOL
2616
2617 MOV eol_found,true ;AN000;
2618
2619 .ELSE ;AN000;
2620
2621 CALL setup_invalid_parameter ;AN000;
2622
2623 .ENDIF
2624
2625 BREAK 0 ;status_or_eol ;AN000;
2626
2627
2628
2629 parity_or_null_case:
2630
2631 PUBLIC parity_or_null_case
2632
2633 ;the parser control blocks have paritys as strings
2634 ;modify parser control blocks list of valid paritys based on the
2635 ;machine type.
2636
2637
2638 CALL parse_parm ;AN000;
2639 .IF <parser_return_code_AX EQ operand_missing> THEN ;AN000;valid null
2640 MOV looking_for,databits_or_null ;AN000;can't have baud,,eol
2641 .ELSE ;AN000;
2642 ; CASE current_parm=
2643
2644
2645 ; eol:
2646
2647 .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;valid
2648
2649 MOV request_type,initialize_com_port
2650 MOV eol_found,true ;AN000;
2651 BREAK 5 ;AN000;
2652
2653 .ENDIF
2654
2655 ; parity:
2656
2657 .IF <parser_return_code_AX EQ no_error> THEN ;AN000;IF have a parity THEN (none of above, must be parity)
2658
2659 MOV looking_for,databits_or_null ;AN000;
2660 .IF <parm_list[current_parm_DI].item_tag EQ mark_item_tag> OR ;AN000;
2661 .IF <parm_list[current_parm_DI].item_tag EQ space_item_tag> THEN ;AN000;
2662 MOV new_com_initialize,true
2663 .IF <type_of_machine NE PS2> THEN ;AN000;IF not Roundup or later
2664 CALL setup_for_not_supported ;AC002;set up for "Function not supported on this computer" message
2665 .ENDIF ;AN000; ;AN000;
2666 .ENDIF ;AN000;
2667
2668 .ELSE
2669
2670 ; otherwise:
2671
2672 CALL setup_invalid_parameter ;AN000;
2673 ; BREAK
2674
2675 .ENDIF ;AN000;
2676
2677 ENDCASE_5: ;current_parm
2678
2679 .ENDIF ;AN000;
2680 BREAK 0 ;AN000;parity_or_null
2681
2682
2683
2684
2685 databits_or_null_case:
2686
2687
2688 PUBLIC databits_or_null_case
2689
2690 ;parser control blocks have all databits (as strings).
2691 ;modify parser control blocks to handle list of valid databits
2692 ;based on the machine type.
2693
2694 ;AC002; .IF <type_of_machine NE PS2> THEN ;AN000;IF not Roundup or later
2695 ;AC002; MOV five_str,deleted ;delete parser value list entry ;AN000;
2696 ;AC002; MOV six_str,deleted ;delete_parser_value_list_entry ;AN000;
2697 ;AC002; .ENDIF ;AN000;
2698
2699 ;the parser control blocks have data bits valid for this machine
2700 CALL parse_parm ;AN000;
2701 .IF <parser_return_code_AX EQ operand_missing> THEN ;AN000;valid null
2702 MOV looking_for,stopbits_or_null ;can't have databits,,eol
2703 .ELSE ;AN000;
2704 ; CASE current_parm=
2705
2706
2707 ; eol:
2708
2709 .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;valid
2710
2711 MOV request_type,initialize_com_port ;AN000;
2712 MOV eol_found,true ;AN000;
2713 BREAK 6 ;AN000;
2714
2715 .ENDIF ;AN000;
2716
2717
2718 ; databits:
2719
2720 .IF <parser_return_code_AX EQ no_error> THEN ;AN000;IF have a parity THEN (none of above, must be parity)
2721
2722 MOV looking_for,stopbits_or_null ;AN000;
2723 .IF <parm_list[current_parm_DI].item_tag EQ five_item_tag> OR ;AC002;
2724 .IF <parm_list[current_parm_DI].item_tag EQ six_item_tag> THEN ;AC002;
2725 MOV new_com_initialize,true
2726 .IF <type_of_machine NE PS2> THEN ;AC002;IF not Roundup or later
2727 CALL setup_for_not_supported ;AC002;set up for "Function not supported on this computer" message
2728 .ENDIF ;AC002; ;AN000;
2729 .ENDIF ;AC002;
2730 ; BREAK 6 ;AN000;
2731
2732 .ELSE ;AN000;
2733
2734
2735 ; otherwise:
2736
2737 CALL setup_invalid_parameter ;AN000;
2738 ; BREAK
2739
2740 .ENDIF
2741
2742 ENDCASE_6: ;current_parm
2743
2744 .ENDIF ;AN000;
2745 BREAK 0 ;AN000;databits_or_null
2746
2747
2748
2749 stopbits_or_null_case:
2750
2751
2752 PUBLIC stopbits_or_null_case
2753
2754 ;parser control blocks have all stopbits (as strings).
2755 ;modify parser control blocks to handle list of valid stopbits
2756 ;based on the machine type.
2757
2758 ;AC002; .IF <type_of_machine NE PS2> THEN ;AN000;IF not Roundup or later
2759 ;AC002; MOV one_point_five_str,deleted ;delete_parser_value_list_entry ;AN000;
2760 ;AC002; .ENDIF ;AN000;
2761
2762
2763 CALL parse_parm ;AN000;
2764 .IF <parser_return_code_AX EQ operand_missing> THEN ;AN000;valid null
2765 MOV looking_for,P ;AN000;no null just before eol
2766 .ELSE ;AN000;
2767 ; CASE current_parm=
2768
2769
2770 ; eol:
2771
2772 .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;valid
2773
2774 MOV BYTE PTR request_type,initialize_com_port ;AN000;
2775 MOV eol_found,true ;AN000;
2776 BREAK 7 ;AN000;
2777
2778 .ENDIF
2779
2780
2781 ; stopbits:
2782
2783
2784 .IF <parser_return_code_AX EQ no_error> THEN ;AN000;IF have a parity THEN (none of above, must be parity)
2785
2786 MOV looking_for,P ;AN000;P or eol valid next
2787 .IF <parm_list[current_parm_DI].item_tag EQ one_point_five_item_tag> THEN ;AC002;
2788 MOV new_com_initialize,true
2789 .IF <type_of_machine NE PS2> THEN ;AC002;IF not Roundup or later
2790 CALL setup_for_not_supported ;AC002;set up for "Function not supported on this computer" message
2791 .ENDIF ;AC002; ;AN000;
2792 .ENDIF ;AC002;
2793
2794 .ELSE
2795
2796
2797 ; otherwise:
2798
2799 CALL setup_invalid_parameter ;AN000;
2800 ; BREAK
2801
2802 .ENDIF
2803
2804 ENDCASE_7: ;current_parm
2805
2806 .ENDIF ;AN000;
2807 BREAK 0 ;AN000;stopbits_or_null
2808
2809
2810
2811
2812 P_case: ;P or eol valid
2813
2814
2815 PUBLIC P_case
2816
2817 ;P is in the parser control blocks' list of strings.
2818
2819 CALL parse_parm ;AN000;
2820 ; CASE current_parm=
2821
2822
2823
2824
2825
2826 ; eol:
2827
2828 .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;valid
2829
2830 MOV eol_found,true ;AN000;
2831 BREAK 8 ;AN000;
2832
2833 .ENDIF
2834
2835
2836
2837 ; P:
2838
2839 .IF <parser_return_code_AX EQ no_error> THEN ;AN000;found one of: p,e,b,r,n,none,off
2840
2841 MOV looking_for,eol ;AN000;found last positional
2842 MOV retry_requested,true
2843
2844 .ELSE
2845
2846
2847 ; otherwise:
2848
2849 CALL setup_invalid_parameter ;AN000;
2850
2851 .ENDIF
2852
2853
2854 ENDCASE_8: ;current_parm
2855
2856 BREAK 0 ;AN000;P
2857
2858
2859
2860 ;\ f\em
2861 prn_kw_status_cp_cl_null_case:
2862
2863 PUBLIC prn_kw_status_cp_cl_null_case
2864
2865 ;Have encountered only LPTX so far, so any printer stuff including codepage
2866 ;requests can follow. All necessary keywords and switches are in the control blocks.
2867
2868
2869 CALL parse_parm ;AN000;
2870
2871 ; CASE current_parm=
2872
2873 ; LPT_mode_keyword: ;nothing but printer keywords allowed
2874
2875
2876 .IF <parser_return_code_AX EQ no_error> AND NEAR ;AN000;
2877 ; .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET COLUMNS_equal>> OR ;AN000;
2878 ; .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET COLS_equal>> OR ;AN000;
2879 ; .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET lines_equal>> OR ;AN000;
2880 ; .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET retry_equal_str>> THEN ;AN000;found a printer keyword
2881
2882
2883 check_for_lpt_keyword ;check for COLS= or LINES= or RETRY=, return results in match_found
2884 .IF <match_found EQ true> THEN NEAR
2885
2886 delete_parser_value_list_entry keywords,current_parm ;AN000;
2887 MOV parms_form,keyword ;AN000;indicate to modeprin how to deal with retry
2888 CALL parse_parm ;AN000;
2889 MOV DL,1 ;AN000;one keyword found so far
2890
2891 .REPEAT
2892
2893 ; CASE return_code=
2894
2895 ; LPT_keyword:
2896
2897
2898 .IF <parser_return_code_AX EQ no_error> AND ;AN000;
2899 PUSH DX ;save loop index
2900 check_for_lpt_keyword ;return results in match_found
2901 POP DX
2902 .IF <match_found EQ true> THEN
2903
2904 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET retry_equal_str>> AND
2905 .IF <parm_list[current_parm_DI].item_tag NE NONE_item_tag> THEN
2906 MOV retry_requested,true ;set up for rescode
2907 .ENDIF
2908 delete_parser_value_list_entry keywords,current_parm ;AN000;
2909 INC DL ;AN000;found another keyword
2910 BREAK 9 ;AN000;
2911
2912 .ENDIF
2913
2914
2915 ; eol:
2916
2917 .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;valid
2918
2919 ;had at least one keyword
2920 MOV request_type,initialize_printer_port ;AN000;
2921 MOV eol_found,true ;AN000;
2922 BREAK 9 ;AN000;
2923
2924 .ENDIF
2925
2926
2927 ; otherwise: ;wrong type of keywords, /STATUS etc.
2928
2929 CALL setup_invalid_parameter ;AN000;
2930 ; BREAK
2931
2932 ENDCASE_9:
2933
2934 PUSH DX
2935 CALL parse_parm ;AN000;
2936 POP DX
2937
2938 .UNTIL <DL EQ number_of_LPT_keywords> OR ;AN000;
2939 .UNTIL <eol_found EQ true> OR ;AN000;
2940 .UNTIL <noerror EQ false> ;AN000;
2941
2942 ; .IF <eol_found NE true> AND
2943 .IF <noerror EQ true> AND ;AN000;
2944 .IF <DL EQ number_of_LPT_keywords> THEN ;AN000;
2945 MOV looking_for,eol ;AN000;check for extraneous parms
2946 .ENDIF ;AN000;
2947
2948 BREAK 10
2949
2950 .ENDIF ;AN000;LPT_keyword
2951
2952
2953 ; /STATUS:
2954
2955 .IF <parser_return_code_AX EQ no_error> AND ;make sure don't have /STA:value ;AN000;
2956 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_sta>> OR ;AN000;
2957 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_stat>> OR ;AC004;
2958 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_status>> THEN ;AN000;found /STATUS
2959
2960 MOV looking_for,eol ;AN000;look for RETRY or codepage
2961 MOV slash_status,deleted ;AN000;
2962 MOV slash_stat,deleted ;AN000;
2963 MOV slash_sta,deleted ;AN000;
2964 MOV request_type,printer_status ;AN000;
2965 BREAK 10 ;AN000;keyword
2966
2967 .ENDIF ;/STATUS found ;AN000;
2968
2969
2970 ; codepage:
2971
2972
2973 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ 0> AND ;AC007;wasn't SEL=cpnum or PREP=cpnum
2974 .IF <parm_list[current_parm_DI].item_tag EQ codepage_item_tag> THEN ;AN000;IF found "codepage" or "cp" THEN
2975
2976 MOV looking_for,codepage_prms ;AN000;
2977 MOV codepage_str,deleted ;AN000;
2978 MOV code_str,deleted ;AN000;
2979 MOV cp_str,deleted ;AC007;
2980 BREAK 10 ;AN000;
2981
2982 .ENDIF ;AN000;
2983
2984
2985
2986 ; cl:
2987
2988 .IF <parm_list[current_parm_DI].item_tag EQ onethirtytwo_item_tag> OR ;AN000;
2989 .IF <parm_list[current_parm_DI].item_tag EQ eighty_item_tag> THEN ;AN000;
2990
2991 MOV REFRESH_str,deleted ;AC007;no codepage stuff legal
2992 MOV REF_str,deleted ;AC007;
2993 MOV SEL_equal,deleted ;AN007;
2994 MOV SELECT_equal,deleted ;AN007;
2995 MOV PREP_equal,deleted ;AN007;
2996 MOV PREPARE_equal,deleted ;AN007;
2997 MOV slash_status,deleted ;AN007;
2998 MOV slash_stat,deleted ;AN007;
2999 MOV slash_sta,deleted ;AN007;
3000 MOV looking_for,li_or_null ;AN000;
3001 MOV request_type,old_initialize_printer_port ;AN000;found enough to know that it isn't status or keyword
3002 BREAK 10 ;AN000;
3003
3004 .ENDIF ;AN000;
3005
3006
3007
3008 ; eol:
3009
3010
3011 .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;valid
3012
3013 MOV request_type,turn_off_reroute ;compatible with previous MODE ;AN000;
3014 MOV eol_found,true ;AN000;
3015 BREAK 10 ;AN000;
3016
3017 .ENDIF ;AN000;
3018
3019
3020
3021 ; codepage_keyword_out_of_order:
3022
3023
3024 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET PREPARE_equal>> OR ;AC007;if got here and have
3025 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET PREP_equal>> OR ;AC007;one of the codepage
3026 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET SEL_equal>> OR ;AC007;keywords then user
3027 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET SELECT_equal>> THEN ;AC007;forgot "CP"
3028
3029 MOV message,OFFSET Invalid_number_of_parameters ;AC007;
3030 MOV noerror,false ;AC007;
3031 BREAK 10 ;AN000;CON_keyword
3032
3033 .ENDIF
3034
3035
3036
3037 ; REFRESH_out_of_order: ;AC007;forgot to include "CP"
3038
3039
3040 .IF <parm_list[current_parm_DI].item_tag EQ REFRESH_item_tag> THEN ;AC007;
3041
3042 MOV message,OFFSET Invalid_number_of_parameters ;AC007;
3043 MOV noerror,false ;AC007;
3044 BREAK 10
3045
3046 .ENDIF ;AC007;
3047
3048
3049
3050 ; null:
3051
3052 .IF <parser_return_code_AX EQ no_error> AND ;AN000;
3053 .IF <parm_list[current_parm_DI].item_tag EQ unspecified> THEN ;AN007;valid null
3054
3055 MOV REFRESH_str,deleted ;AC007;no codepage stuff legal
3056 MOV REF_str,deleted ;AC007;
3057 MOV SEL_equal,deleted ;AN007;
3058 MOV SELECT_equal,deleted ;AN007;
3059 MOV PREP_equal,deleted ;AN007;
3060 MOV PREPARE_equal,deleted ;AN007;
3061 MOV slash_status,deleted ;AN007;
3062 MOV slash_stat,deleted ;AN007;
3063 MOV slash_sta,deleted ;AN007;
3064 MOV looking_for,li_or_null ;AN000;
3065 MOV request_type,old_initialize_printer_port ;AN000;found enough to know that it isn't status or keyword
3066
3067
3068
3069 ; otherwise:
3070
3071 .ELSE ;AN000;
3072
3073 CALL setup_invalid_parameter ;AN000;
3074 ; BREAK ;AN000;
3075
3076 .ENDIF ;AN000;
3077
3078
3079 ENDCASE_10: ;current_parm= ;AN000;
3080 BREAK 0 ;AN000;prn_kw_status_cp_cl_null_case:
3081
3082
3083
3084
3085 li_or_null_case: ;look for lines per inch or null, eol valid
3086
3087 PUBLIC li_or_null_case
3088
3089
3090 CALL parse_parm ;AN000;
3091 ; CASE current_parm=
3092
3093 ; li:
3094
3095 .IF <parm_list[current_parm_DI].item_tag EQ six_item_tag> OR ;AN000;
3096 .IF <parm_list[current_parm_DI].item_tag EQ eight_item_tag> THEN ;AN000;IF found 6 or 8 THEN
3097
3098 MOV looking_for,P ;AN000;
3099 BREAK 11
3100
3101 .ENDIF
3102
3103
3104 ; eol:
3105
3106 .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;valid
3107
3108 MOV request_type,old_initialize_printer_port ;AN000;
3109 MOV eol_found,true ;AN000;
3110 BREAK 11 ;AN000;
3111
3112 .ENDIF
3113
3114
3115 ; null:
3116
3117 .IF <parser_return_code_AX EQ no_error> AND ;AN000;
3118 .IF <parm_list[current_parm_DI].item_tag EQ unspecified> THEN ;AN007;valid null
3119
3120 MOV looking_for,P ;AN000;
3121 BREAK 11 ;AN000;
3122
3123 .ENDIF
3124
3125
3126 ; otherwise:
3127
3128 CALL setup_invalid_parameter ;AN000;
3129 ; BREAK
3130
3131
3132 ENDCASE_11: ;current_parm ;AN000;
3133 BREAK 0 ;AN000;li_or_null
3134
3135
3136 ;\ f\em
3137 codepage_prms_case:
3138
3139
3140 ;The desired codepage parameters are in the parser control blocks, such
3141 ;as: the keywords, PREPARE, REFRESH, and /STATUS.
3142 CALL parse_parm ;AN000;
3143 ; CASE current_parm=
3144
3145
3146 ; REFRESH:
3147
3148 .IF <parm_list[current_parm_DI].item_tag EQ REFRESH_item_tag> THEN ;AN000;
3149
3150 MOV request_type,codepage_refresh ;AN000;
3151 MOV looking_for,eol
3152 BREAK 12
3153
3154 .ENDIF
3155
3156
3157 ; PREPARE=:
3158
3159
3160 ;Have to parse ((cplist) [filename])
3161
3162 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET PREPARE_equal>> OR ;AN000;
3163 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET PREP_equal>> THEN NEAR ;AN000;IF PREPARE= THEN
3164
3165 .IF <parm_list[current_parm_DI].parm_type EQ complx> THEN NEAR ;AN000;should have found ((cplist) filename)
3166 PUSH SI ;AN000;save pointer to first char past the closing right paren
3167 MOV AX,parm_list[current_parm_DI].value1 ;AN000;
3168 MOV command_line,AX ;AN000;point at first char past the left paren
3169 SUB DI,TYPE parm_list_entry ;AN000;not parm, just indication of complex, delete from parm list
3170 MOV parms.parmsx_ptr,OFFSET prepare_equal_parmsx
3171 MOV prepare_equal_match_flags,complex ;AN000;only thing valid next
3172 CALL parse_parm ;AN000;
3173 .IF <parser_return_code_AX EQ no_error> AND ;AN000;
3174 .IF <parm_list[current_parm_DI].parm_type EQ complx> THEN ;AN000;assume have ((cplist) filename)
3175 PUSH SI ;AN000;save pointer to first char past the closing right paren
3176 MOV AX,parm_list[current_parm_DI].value1 ;AN000;
3177 MOV command_line,AX ;AN000;point at first char past the left paren
3178 SUB DI,TYPE parm_list_entry ;AN000;not parm, just indication of complex, delete from parm list
3179 MOV prepare_equal_match_flags,numeric+optional ;AN000;number or delimeter only things valid next
3180 MOV ordinal,0 ;AN000;zap parms count,make parser count codepage numbers
3181 .REPEAT ;AN000;
3182 CALL parse_parm ;AN000;
3183 .IF <parser_return_code_AX EQ no_error> THEN ;AN000; ;AN000;
3184 ADD des_start_packet.des_strt_pklen,2 ;increment size of parm block for another cp number
3185 INC des_start_packet.des_strt_pknum ;increment number of cp numbers
3186 ADD current_packet_cp_number,2 ;address next code page number slot
3187 MOV SI,current_packet_cp_number
3188 MOV BP,OFFSET des_start_packet
3189 .IF <parm_list[current_parm_DI].item_tag EQ codepage_item_tag> THEN ;AN000;IF not skipped slot THEN
3190 MOV DX,parm_list[current_parm_DI].value1 ;AN000;store the number if one specified for this slot
3191 MOV [SI][BP].des_strt_pkcp1,DX ;put the number in the slot for the cp number
3192 .ENDIF ;AN000;not valid skipped codepage number, i.e. not (,850,,865) for example
3193 .ELSEIF <parser_return_code_AX EQ end_of_complex> THEN ;AN000;
3194 SUB DI,TYPE parm_list_entry ;don't want an entry in the parm list for the zeroed out ")"
3195 .ELSE
3196 CALL setup_invalid_parameter ;AN000;
3197 .ENDIF ;AN000;
3198 .UNTIL <parser_return_code_AX EQ end_of_complex> OR ;AN000;came to end of the cplist
3199 .UNTIL <noerror EQ false>
3200 POP command_line ;AN000;resume just after the closing paren of (cplist), should be at ) or filename
3201 .ELSE ;AN000;must be an error
3202 MOV message,OFFSET invalid_number_of_parameters ;AN000;
3203 MOV noerror,false ;AN000;
3204 .ENDIF
3205 .IF <noerror EQ true> THEN ;AN000;IF successfully broke down cplist and file name THEN
3206 MOV prepare_equal_match_flags,filespec+optional ;AN000;only thing valid is filespec
3207 MOV ordinal,0 ;AN000;don't need parser to count the parms anymore
3208 MOV prepare_min_parms,0 ;AN000;filename is optional
3209 ; A filespec may be next so colon cannot be a delimeter.
3210 modify_parser_control_block seperator_list,delete,colon ;AN000;want to find a keyword so don't stop on colons
3211 CALL parse_parm ;AN000;
3212 .IF <parser_return_code_AX EQ no_error> THEN ;AN000;
3213 MOV AX,parm_list[current_parm_DI].value1 ;AN000;AX=OFFSET of filespec just encountered
3214 MOV cp_cb.font_filespec,AX ;AN000;set up pointer to filespec for modecp
3215 .ELSEIF <parser_return_code_AX EQ end_of_complex> THEN ;AN000;cartridge prepare, no filename
3216 MOV des_start_packet.des_strt_pkfl,DES_STRT_FL_CART ; 0001H=CARTRIDGE PREPARE,
3217 .ELSE ;AN000;
3218 CALL setup_invalid_parameter ;AN000;
3219 .ENDIF ;AN000;
3220 MOV request_type,codepage_prepare ;AN000;if encountered an error won't continue anyways
3221 .ENDIF ;AN000;
3222 POP command_line ;AN000;continue parsing after the origional complex, should be eol
3223 .ELSE ;AN000;
3224 MOV message,OFFSET invalid_number_of_parameters ;AN000;should have found a complex
3225 MOV noerror,false ;AN000;
3226 .ENDIF
3227
3228 MOV looking_for,eol ;AN000;
3229
3230 BREAK 12 ;AN000;
3231
3232 .ENDIF
3233
3234
3235 ; SELECT=:
3236
3237
3238 dummy1:
3239 PUBLIC DUMMY1
3240 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET SEL_equal>> OR ;AN000;
3241 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET SELECT_equal>> THEN ;AN000;
3242
3243 .IF <parser_return_code_AX EQ no_error> THEN ;AN000;
3244 MOV codepage_index_holder,current_parm_DI ;AN000;save index of the codepage parm list entry for invoke
3245 MOV request_type,codepage_select ;AN000;
3246 MOV looking_for,eol ;AN000;
3247 .ELSE ;AN000;
3248 CALL setup_invalid_parameter ;AN000;
3249 .ENDIF
3250
3251 BREAK 12 ;AN000;
3252
3253 .ENDIF
3254
3255
3256
3257 ; /STATUS:
3258
3259
3260 .IF <parser_return_code_AX EQ no_error> AND ;make sure don't have /STA:value ;AN000;
3261 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_STA>> OR ;AN000;
3262 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_stat>> OR ;AC002;
3263 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_STATUS>> THEN ;AN000;
3264
3265 MOV request_type,codepage_status ;AN000;
3266 ;AX322; .IF <device_name EQ <OFFSET CON_str>> THEN
3267 MOV looking_for,eol ;AC322;
3268 ;AX322; .ELSE
3269 ;AX322; MOV looking_for,eol ;AN000;
3270 ;AX322; .ENDIF
3271 BREAK 12 ;AN000;
3272
3273 .ENDIF
3274
3275
3276 ; eol:
3277
3278 .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;
3279
3280 MOV request_type,codepage_status ;AN000;
3281 MOV eol_found,true ;AN000;
3282 BREAK 12 ;AN000;
3283
3284 .ENDIF
3285
3286
3287 ; otherwise:
3288
3289 CALL setup_invalid_parameter ;AN000;
3290 ; BREAK
3291
3292
3293 ENDCASE_12: ;current_parm=
3294
3295
3296 BREAK 0 ;AN000;
3297
3298
3299
3300
3301 codepage_case: ;found PRN, only valid parms are CODEPAGE, and /STATUS
3302 ;/STATUS is in the the parser control blocks
3303
3304 CALL parse_parm ;AN000;
3305 ; CASE current_parm=
3306
3307 ; CODEPAGE:
3308
3309 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ 0> AND ;AC007;wasn't SEL=cpnum or PREP=cpnum
3310 .IF <parm_list[current_parm_DI].item_tag EQ codepage_item_tag> THEN ;AN000;IF found "codepage" or "cp" THEN
3311
3312 ;set up for codepage_prms_case
3313 ; modify_parser_control_block keywords,addd,codepage_keywords ;AN000;codepage parms handler assumes keywords setup
3314 MOV looking_for,codepage_prms ;AN000;
3315 BREAK 13 ;AN000;
3316
3317 .ENDIF
3318
3319
3320 ; /STATUS: ;only CODEPAGE or end of line valid next
3321
3322 .IF <parser_return_code_AX EQ no_error> AND ;make sure don't have /STA:value ;AN000;
3323 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_STA>> OR ;AN000;
3324 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_stat>> OR ;AC004;
3325 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_STATUS>> THEN ;AN000;
3326
3327 CALL parse_parm ;AN000;
3328 .IF <parm_list[current_parm_DI].item_tag EQ codepage_item_tag> THEN ;AN000;
3329 MOV looking_for,eol ;AN000;
3330 MOV status_request,true
3331 MOV request_type,codepage_status ;AN000;
3332 .ELSEIF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;
3333 MOV eol_found,true ;AC005;
3334 MOV status_request,true ;AC005;
3335 MOV request_type,codepage_status ;AC005;
3336 .ELSE ;AN000;
3337 CALL setup_invalid_parameter ;AN000;
3338 .ENDIF
3339 BREAK 13 ;AN000;
3340
3341 .ENDIF
3342
3343
3344 ; eol:
3345
3346 .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;
3347
3348 MOV request_type,codepage_status ;AN000;
3349 MOV eol_found,true ;AN000;
3350 BREAK 13 ;AN000;
3351
3352 .ENDIF
3353
3354
3355
3356 ; codepage_keyword_out_of_order:
3357
3358
3359 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET PREPARE_equal>> OR ;AC007;if got here and have
3360 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET PREP_equal>> OR ;AC007;one of the codepage
3361 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET SEL_equal>> OR ;AC007;keywords then user
3362 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET SELECT_equal>> THEN ;AC007;forgot "CP"
3363
3364 MOV message,OFFSET Invalid_number_of_parameters ;AC007;
3365 MOV noerror,false ;AC007;
3366 BREAK 13 ;AN000;CON_keyword
3367
3368 .ENDIF
3369
3370
3371
3372 ; REFRESH_out_of_order: ;AC007;forgot to include "CP"
3373
3374
3375 .IF <parm_list[current_parm_DI].item_tag EQ REFRESH_item_tag> THEN ;AC007;
3376
3377 MOV message,OFFSET Invalid_number_of_parameters ;AC007;
3378 MOV noerror,false ;AC007;
3379 ; BREAK 13
3380
3381 .ELSE ;AC007;
3382
3383
3384
3385 ; otherwise:
3386
3387 CALL setup_invalid_parameter ;AN000;
3388 ; BREAK
3389
3390 .ENDIF ;AC007;
3391
3392 ENDCASE_13:
3393
3394 BREAK 0 ;AN000;
3395
3396
3397
3398 con_kwrd_status_or_cp_case:
3399
3400 PUBLIC con_kwrd_status_or_cp_case
3401
3402 MOV parms.parmsx_ptr,OFFSET con_parmsx
3403 CALL parse_parm ;AN000;
3404
3405 ; CASE current_parm=
3406
3407
3408
3409 ; codepage:
3410
3411 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ 0> AND ;AC007;wasn't SEL=cpnum or PREP=cpnum
3412 .IF <parm_list[current_parm_DI].item_tag EQ codepage_item_tag> THEN ;AN000;IF found "codepage" or "cp" THEN
3413
3414 MOV looking_for,codepage_prms ;AN000;
3415 BREAK 14 ;AN000;
3416
3417 .ENDIF
3418
3419
3420 ; eol:
3421
3422 .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;
3423
3424 MOV request_type,all_con_status ;AN000;found only CON on the command line
3425 MOV eol_found,true ;AN000;
3426 BREAK 14 ;AN000;
3427
3428 .ENDIF
3429
3430
3431
3432 ; /STATUS:
3433
3434 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_STA>> OR ;AN000;
3435 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_stat>> OR ;AC004;
3436 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_STATUS>> THEN ;AN000;
3437
3438 MOV slash_status,deleted ;AN000;
3439 MOV slash_stat,deleted ;AN000;
3440 MOV slash_sta,deleted ;AN000;
3441 MOV request_type,all_con_status ;AN000;found only CON on the command line
3442 MOV looking_for,eol ;AC665;have MODE CON /STATUS, must find eol now
3443 BREAK 14 ;AN000;
3444
3445 .ENDIF
3446
3447
3448
3449 ; con_keyword:
3450
3451
3452 .IF <parser_return_code_AX EQ no_error> AND ;make sure invalid value not specified ;AN000;
3453 .IF <parm_list[current_parm_DI].keyword_switch_ptr NE 0> THEN ;not pointing to /sta, not 0, must be a keyword
3454
3455 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET rate_equal>> OR ;AN000;
3456 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET del_equal>> OR ;AN000;
3457 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET delay_equal>> THEN ;AN000;
3458 INC rate_and_delay_found ;found one, needs to be 2 before valid;AN000;
3459 .ELSEIF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET PREPARE_equal>> OR ;AC007;if got here and have
3460 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET PREP_equal>> OR ;AC007;one of the codepage
3461 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET SEL_equal>> OR ;AC007;keywords then user
3462 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET SELECT_equal>> THEN ;AC007;forgot "CP"
3463 MOV message,OFFSET Invalid_number_of_parameters ;AC007;
3464 MOV noerror,false ;AC007;
3465 .ELSE
3466 .IF <parm_list[current_parm_DI].keyword_switch_ptr NE <OFFSET COLUMNS_equal>> AND ;AC007;
3467 .IF <parm_list[current_parm_DI].keyword_switch_ptr NE <OFFSET COLS_equal>> AND ;AC007;
3468 .IF <parm_list[current_parm_DI].keyword_switch_ptr NE <OFFSET lines_equal>> THEN ;AC007;
3469 CALL setup_invalid_parameter ;AC007;keyword other than LINES=, COLS=, RATE= or DELAY= would require CP
3470 .ENDIF ;AC007;and be handled above
3471 .ENDIF ;AN000;
3472 delete_parser_value_list_entry keywords,current_parm ;AN000;doesn't affect anything if invalid parm
3473 MOV looking_for,CON_keyword ;AN000;doesn't affect anything if invalid parm
3474 BREAK 14 ;AN000;CON_keyword
3475
3476 .ENDIF
3477
3478
3479
3480 ; REFRESH: ;AC007;forgot to include "CP"
3481
3482
3483 .IF <parm_list[current_parm_DI].item_tag EQ REFRESH_item_tag> THEN ;AC007;
3484
3485 MOV message,OFFSET Invalid_number_of_parameters ;AC007;
3486 MOV noerror,false ;AC007;
3487 ; BREAK
3488
3489 .ELSE ;AC007;
3490
3491
3492
3493 ; otherwise:
3494
3495 CALL setup_invalid_parameter ;AN000;
3496 ; BREAK
3497
3498 .ENDIF ;AC007;
3499
3500
3501
3502 ENDCASE_14:
3503 BREAK 0 ;AN000;con_kwrd_status_or_cp_case:
3504
3505
3506
3507
3508 con_keyword_case: ;found one, it has been deleted from the parser control blocks
3509 PUBLIC con_keyword_case
3510
3511 MOV slash_status,deleted ;AN000;remove /STA /STAT and STATUS
3512 MOV slash_stat,deleted ;AN000;
3513 MOV slash_sta,deleted ;AN000;
3514
3515 MOV i_CL,1 ;AN000;
3516 .WHILE <i_CL LT number_of_con_keywords> AND ;AN000;
3517 .WHILE <eol_found EQ false> AND ;AN000;
3518 .WHILE <noerror EQ true> DO ;AN000;
3519 PUSH CX
3520
3521 CALL parse_parm ;AN000;
3522
3523 ; CASE return_code=
3524
3525 ; con_keyword:
3526
3527 .IF <parser_return_code_AX EQ no_error> AND ;make sure don't have /STA:value ;AN000;
3528 .IF <parm_list[current_parm_DI].keyword_switch_ptr NE 0> THEN ;not 0, must be a keyword ;AN000;
3529
3530 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET rate_equal>> OR ;AN000;
3531 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET del_equal>> OR ;AN000;
3532 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET delay_equal>> THEN ;AN000;
3533 INC rate_and_delay_found ;found one, needs to be 2 before valid;AN000;
3534 .ENDIF
3535 delete_parser_value_list_entry keywords,current_parm ;AN000;
3536 INC i_CL ;AN000;
3537 BREAK 15 ;AN000;
3538
3539 .ENDIF ;AN000;
3540
3541
3542 ; eol:
3543
3544 .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;
3545
3546 .IF <rate_and_delay_found EQ both> OR ;IF both OR neither found THEN
3547 .IF <rate_and_delay_found EQ false> THEN
3548 MOV request_type,set_con_features ;AN000;
3549 MOV eol_found,true ;AN000;
3550 .ELSE
3551 MOV message,OFFSET rate_and_delay_together ;RATE and DELAY must be specified together
3552 MOV noerror,false
3553 .ENDIF
3554 BREAK 15 ;AN000;
3555
3556 .ENDIF
3557
3558
3559 ; otherwise:
3560
3561 CALL setup_invalid_parameter ;AN000;
3562 ; BREAK
3563
3564 ENDCASE_15:
3565
3566 POP CX
3567
3568 .ENDWHILE ;AN000;
3569
3570 MOV looking_for,eol ;AN000;check for extraneous parms
3571
3572 BREAK 0 ;AN000;CON_keyword
3573
3574
3575
3576
3577 sd_or_dl_or_eol_case:
3578
3579 PUBLIC sd_or_dl_or_eol_case
3580
3581 ;have found a screen mode, now may find sd, dl, or eol
3582
3583 CALL parse_parm ;AN000;
3584 ; CASE current_parm=
3585
3586 ; sd: ;found R or L
3587
3588 .IF <parm_list[current_parm_DI].item_tag EQ L_item_tag> OR ;AN000;
3589 .IF <parm_list[current_parm_DI].item_tag EQ R_item_tag> THEN ;AN000;
3590
3591 MOV looking_for,T_or_EOL ;AN000;request_type already set
3592 BREAK 17 ;AN000;
3593
3594 .ENDIF
3595
3596 ; dl:
3597
3598 .IF <parm_list[current_parm_DI].item_tag EQ fourtythree_item_tag> OR ;AN000;
3599 .IF <parm_list[current_parm_DI].item_tag EQ fifty_item_tag> OR ;AN000;
3600 .IF <parm_list[current_parm_DI].item_tag EQ twentyfive_item_tag> THEN ;AN000;
3601
3602 MOV looking_for,eol ;AN000;request_type already set
3603 BREAK 17 ;AN000;
3604
3605 .ENDIF
3606
3607
3608
3609 ; eol:
3610
3611 .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;
3612
3613 MOV eol_found,true ;AN000;request_type already set
3614 BREAK 17 ;AN000;
3615
3616 .ENDIF
3617
3618
3619 ; otherwise: regardless of what follows must have a parm here, didn't so yell
3620
3621 .IF <parser_return_code_AX EQ operand_missing> THEN ;AN000;two commas with nothing in between
3622 MOV message,OFFSET Invalid_number_of_parameters ;AN000;
3623 MOV noerror,false ;AN000;
3624 .ELSE ;AN000;
3625 CALL setup_invalid_parameter ;AN000;some bogus value or string
3626 .ENDIF ;AN000;
3627
3628 ; BREAK
3629
3630
3631 ENDCASE_17:
3632 BREAK 0 ;AN000;sd_or_dl_or_null
3633
3634
3635
3636 sd_or_dl_case:
3637
3638 PUBLIC sd_or_dl_case
3639
3640 ;have no first parm, now must find shift direction or screen lines
3641
3642
3643 CALL parse_parm ;AN000;
3644 ; CASE current_parm=
3645
3646 ; sd:
3647
3648 .IF <parm_list[current_parm_DI].item_tag EQ L_item_tag> OR ;AN000;
3649 .IF <parm_list[current_parm_DI].item_tag EQ R_item_tag> THEN ;AN000;
3650
3651 MOV looking_for,T_or_EOL ;AN000;
3652 MOV request_type,old_video_mode_set ;AN000;
3653 BREAK 18 ;AN000;
3654
3655 .ENDIF
3656
3657
3658 ; dl:
3659
3660 .IF <parm_list[current_parm_DI].item_tag EQ fourtythree_item_tag> OR ;AN000;
3661 .IF <parm_list[current_parm_DI].item_tag EQ fifty_item_tag> OR ;AN000;
3662 .IF <parm_list[current_parm_DI].item_tag EQ twentyfive_item_tag> THEN ;AN000;
3663
3664 MOV request_type,old_video_mode_set ;AN000;
3665 MOV looking_for,eol ;AN000;
3666 BREAK 18 ;AN000;
3667
3668 .ENDIF
3669
3670
3671
3672 ; eol:
3673
3674 .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;
3675
3676 MOV message,OFFSET invalid_number_of_parameters ;AN000;
3677 MOV noerror,false ;AN000;
3678 MOV eol_found,true ;AN000;
3679 BREAK 18 ;AN000;
3680
3681 .ENDIF
3682
3683
3684 ; otherwise:
3685
3686 .IF <parser_return_code_AX EQ operand_missing> THEN ;AN000;two commas with nothing in between
3687 MOV message,OFFSET Invalid_number_of_parameters ;AN000;
3688 MOV noerror,false ;AN000;
3689 .ELSE ;AN000;
3690 CALL setup_invalid_parameter ;AN000;some bogus value or string
3691 .ENDIF ;AN000;
3692 ; BREAK
3693
3694 ENDCASE_18:
3695 BREAK 0 ;AN000;sd_or_dl
3696
3697
3698
3699 T_or_EOL_case:
3700
3701
3702 CALL parse_parm ;AN000;
3703
3704 ; CASE current_parm=
3705
3706 ; T:
3707
3708 .IF <parm_list[current_parm_DI].item_tag EQ T_item_tag> THEN ;AN000;
3709
3710 MOV looking_for,eol ;AN000;request_type already set
3711 BREAK 19 ;AN000;
3712
3713 .ENDIF
3714
3715 ; eol:
3716
3717 .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;
3718
3719 MOV eol_found,true ;AN000;request_type already set
3720 BREAK 19 ;AN000;
3721
3722 .ENDIF
3723
3724
3725 ; otherwise:
3726
3727 CALL setup_invalid_parameter ;AN000;
3728 ; BREAK
3729
3730 ENDCASE_19:
3731 BREAK 0 ;AN000;
3732
3733
3734
3735 device_name_or_eol_case: ;have only /status so far
3736
3737 ;The device names are in the parser control blocks
3738
3739 CALL parse_parm
3740 ; CASE current_parm=
3741
3742 ; COM?:
3743
3744 MOV device_name,OFFSET COM1_str ;AC001;
3745 .IF <parm_list[current_parm_DI].item_tag EQ COM1_item_tag> OR ;AN000;
3746 MOV device_name,OFFSET COM2_str ;AC001;
3747 .IF <parm_list[current_parm_DI].item_tag EQ COM2_item_tag> OR ;AN000;
3748 MOV device_name,OFFSET COM3_str ;AC001;
3749 .IF <parm_list[current_parm_DI].item_tag EQ COM3_item_tag> OR ;AN000;
3750 MOV device_name,OFFSET COM4_str ;AC001;
3751 .IF <parm_list[current_parm_DI].item_tag EQ COM4_item_tag> THEN ;AN000;
3752
3753 MOV looking_for,eol ;AN000;
3754 MOV request_type,com_status ;AN000;
3755
3756 BREAK 20 ;AN000;
3757
3758 .ENDIF
3759
3760
3761 ; LPT?,
3762 PRN:
3763
3764 MOV device_name,OFFSET LPT1_str ;AC001;
3765 .IF <parm_list[current_parm_DI].item_tag EQ PRN_item_tag> OR ;AN000;
3766 .IF <parm_list[current_parm_DI].item_tag EQ LPT1_item_tag> OR ;AN000;
3767 MOV device_name,OFFSET LPT2_str ;AC001;
3768 .IF <parm_list[current_parm_DI].item_tag EQ LPT2_item_tag> OR ;AN000;
3769 MOV device_name,OFFSET LPT3_str ;AC001;
3770 .IF <parm_list[current_parm_DI].item_tag EQ LPT3_item_tag> THEN ;AN000;
3771
3772 MOV looking_for,eol ;AN000;
3773 MOV request_type,printer_status ;AN000;
3774 BREAK 20 ;AN000;
3775
3776 .ENDIF
3777
3778
3779
3780 ; CON:
3781
3782 .IF <parm_list[current_parm_DI].item_tag EQ CON_item_tag> THEN ;AN000;
3783
3784 MOV looking_for,eol ;AN000;
3785 MOV request_type,all_con_status ;AN000;
3786 BREAK 20 ;AN000;
3787
3788 .ENDIF
3789
3790
3791 ; eol:
3792
3793 .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;
3794
3795 MOV request_type,status_for_everything ;AN000;
3796 MOV eol_found,true ;AN000;
3797 BREAK 20 ;AN000;
3798
3799 .ENDIF
3800
3801
3802 ; otherwise:
3803
3804 CALL setup_invalid_parameter ;AN000;
3805 ; BREAK
3806
3807 ENDCASE_20:
3808 BREAK 0 ;AN000;device_name_or_eol
3809
3810
3811 first_parm_case: ;AN000;
3812
3813
3814 PUBLIC first_parm_case
3815
3816 ;set up for calls to system parser
3817
3818 MOV command_line,OFFSET first_char_in_command_line ;AN000;start parser at beginning of the command line
3819 MOV BX,OFFSET parm_lst ;set up parm_list ;AN000;
3820 XOR DI,DI ;AN000;
3821 SUB DI,TYPE parm_list_entry ;AN000;DI is negative, set up for first call to parse_parm
3822
3823 MOV parms.parmsx_ptr,OFFSET parmsx ;AN000;set up parms block for parser input
3824
3825 CALL parse_parm ;AN000;parse first parm, fill in "parm_list[current_parm_DI]" with the results
3826
3827 ; CASE current_parm=
3828
3829 dummy5:
3830 PUBLIC dummy5
3831
3832 ; /status:
3833
3834 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_STA>> OR ;AN000;
3835 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_stat>> OR ;AC004;
3836 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET slash_STATUS>> THEN ;AN000;
3837
3838 MOV slash_status,deleted ;AN000;make it so /status again is an error
3839 MOV slash_stat,deleted ;AN000;
3840 MOV slash_sta,deleted
3841 MOV looking_for,device_name_or_eol ;AN000;
3842 BREAK 21 ;AN000;
3843
3844 .ENDIF
3845
3846
3847 ; null: ;no first parm
3848
3849 .IF <parser_return_code_AX EQ no_error> AND ;AN000;
3850 .IF <parm_list[current_parm_DI].item_tag EQ unspecified> THEN ;AN000;valid null
3851
3852 MOV looking_for,sd_or_dl ;AN000;
3853 MOV parms.parmsx_ptr,OFFSET old_con_parmsx
3854 MOV ordinal,0 ;AN000;start over with new parmsx block
3855 MOV device_name,OFFSET CON_str
3856 MOV request_type,old_video_mode_set ;AN000;
3857 BREAK 21 ;AN000;
3858
3859 .ENDIF
3860
3861
3862 screen_modes: ;first parm is 80, BW80, MONO etc.
3863
3864 PUBLIC screen_modes
3865
3866 .IF <parm_list[current_parm_DI].item_tag GE first_screen_mode_item_tag> AND ;AN000;
3867 .IF <parm_list[current_parm_DI].item_tag LE last_screen_mode_item_tag> THEN ;AN000;
3868
3869 MOV parms.parmsx_ptr,OFFSET old_con_parmsx
3870 MOV ordinal,0 ;AN000;start over with new parmsx block
3871 MOV device_name,OFFSET CON_str
3872 MOV looking_for,sd_or_dl_or_eol ;AN000;
3873 MOV request_type,old_video_mode_set ;AN000;
3874 BREAK 21 ;AN000;
3875
3876 .ENDIF
3877
3878
3879
3880 ; LPT?132,
3881 ; LPT?80:
3882
3883 MOV device_name,OFFSET LPT1_str ;AN000;assume LPT1
3884 MOV device,"1" ;AC664;set up message
3885 MOV LPTNO,"1" ;see modeprin
3886 MOV parm_list[current_parm_DI+TYPE parm_list_entry].item_tag,onethirtytwo_item_tag ;AN000;save chars/line
3887 .IF <parm_list[current_parm_DI].item_tag EQ LPT1132_item_tag> OR ;AN000;
3888 MOV device_name,OFFSET LPT2_str ;AN000;assume LPT2
3889 MOV LPTNO,"2" ;see modeprin
3890 MOV device,"2" ;AC664;set up message
3891 .IF <parm_list[current_parm_DI].item_tag EQ LPT2132_item_tag> OR ;AN000;
3892 MOV device_name,OFFSET LPT3_str ;AN000;assume LPT3
3893 MOV LPTNO,"3" ;see modeprin
3894 MOV device,"3" ;AC664;set up message
3895 .IF <parm_list[current_parm_DI].item_tag EQ LPT3132_item_tag> OR ;AN000;
3896 MOV device_name,OFFSET LPT1_str ;AN000;assume LPT1
3897 MOV device,"1" ;AC664;set up message
3898 MOV LPTNO,"1" ;see modeprin
3899 MOV parm_list[current_parm_DI+TYPE parm_list_entry].item_tag,eighty_item_tag ;AN000;save chars/line
3900 .IF <parm_list[current_parm_DI].item_tag EQ LPT180_item_tag > OR ;AN000;
3901 MOV device_name,OFFSET LPT2_str ;AN000;assume LPT2
3902 MOV LPTNO,"2" ;see modeprin
3903 MOV device,"2" ;AC664;set up message
3904 .IF <parm_list[current_parm_DI].item_tag EQ LPT280_item_tag > OR ;AN000;
3905 MOV device_name,OFFSET LPT3_str ;AN000;assume LPT3
3906 MOV LPTNO,"3" ;see modeprin
3907 MOV device,"3" ;AC664;set up message
3908 .IF <parm_list[current_parm_DI].item_tag EQ LPT380_item_tag > THEN ;AN000;
3909
3910
3911 ADD DI,TYPE parm_list_entry ;AN000;already have chars per line so skip to next element in list
3912 MOV parms.parmsx_ptr,OFFSET lpt_parmsx ;AN000;
3913 MOV REFRESH_str,deleted ;AN007;no codepage stuff legal
3914 MOV REF_str,deleted ;AN007;
3915 MOV SEL_equal,deleted ;AN007;
3916 MOV SELECT_equal,deleted ;AN007;
3917 MOV PREP_equal,deleted ;AN007;
3918 MOV PREPARE_equal,deleted ;AN007;
3919 MOV ordinal,1 ;AN000;already found chars per line (cl)
3920 MOV looking_for,li_or_null ;AN000;
3921 MOV device_type,LPTX ;AN000;
3922 MOV request_type,old_initialize_printer_port ;AN000;
3923 BREAK 21 ;AN000;
3924
3925 .ELSE ;AN000;clean up after dorking the next parameter
3926 ADD DI,TYPE parm_list_entry ;AN000;point to next entry, the one that needs to be reinitialized
3927 CALL reset_parm_pointer ;AN000;reinitialize the second parm entry, DEC DI
3928 .ENDIF
3929
3930
3931
3932 ; LPT1:=,
3933 ; LPT1=,
3934 ; LPT2:=,
3935 ; LPT2=,
3936 ; LPT3:=,
3937 ; LPT3=:
3938
3939
3940 ;have control blocks set up to find COM strings as value of keyword
3941
3942 MOV lptno,0 ;lptno=BIOS digestable printer number for LPT1 set up for modeecho
3943 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET LPT1_colon_equal>> OR ;AN000;
3944 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET LPT1_equal>> OR ;AN000;
3945 MOV lptno,1 ;set up for modeecho
3946 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET LPT2_colon_equal>> OR ;AN000;
3947 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET LPT2_equal>> OR ;AN000;
3948 MOV lptno,2 ;set up for modeecho
3949 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET LPT3_colon_equal>> OR ;AN000;
3950 .IF <parm_list[current_parm_DI].keyword_switch_ptr EQ <OFFSET LPT3_equal>> THEN ;AN000;
3951 MOV device,"1" ;set up for call to modeecho
3952 .IF <parm_list[current_parm_DI].item_tag EQ COM1_item_tag> OR ;AN000;
3953 MOV device,"2" ;set up for call to modeecho
3954 .IF <parm_list[current_parm_DI].item_tag EQ COM2_item_tag> OR ;AN000;
3955 MOV device,"3" ;set up for call to modeecho
3956 .IF <parm_list[current_parm_DI].item_tag EQ COM3_item_tag> OR ;AN000;
3957 MOV device,"4" ;set up for call to modeecho
3958 .IF <parm_list[current_parm_DI].item_tag EQ COM4_item_tag> THEN ;AN000;
3959
3960 MOV looking_for,eol ;AN000;
3961 MOV request_type,printer_reroute ;AN000;
3962 MOV reroute_requested,true ;AN000;
3963 MOV device_type,LPTX
3964 BREAK 21 ;AN000;
3965
3966 .ELSE ;AN000;
3967 MOV message,OFFSET com1_or_com2 ;AN000;"Must specify COM1, COM2, COM3 or COM4"
3968 .ENDIF
3969 .ENDIF
3970
3971
3972
3973 ; LPTX,: found "LPTX," so chars per line has been skipped
3974
3975 .IF <terminating_delimeter EQ comma> AND NEAR ;AC007;handle other cases later, looking only for "LPTX," now
3976 MOV device_name,OFFSET LPT1_str ;AN000;assume LPT1
3977 MOV device,"1" ;AC664;set up message
3978 MOV LPTNO,"1" ;see modeprin
3979 .IF <parm_list[current_parm_DI].item_tag EQ LPT1_item_tag> OR ;AN000;
3980 MOV device_name,OFFSET LPT2_str ;AN000;assume LPT2
3981 MOV LPTNO,"2" ;see modeprin
3982 MOV device,"2" ;AC664;set up message
3983 .IF <parm_list[current_parm_DI].item_tag EQ LPT2_item_tag> OR ;AN000;
3984 MOV device_name,OFFSET LPT3_str ;AN000;assume LPT3
3985 MOV LPTNO,"3" ;see modeprin
3986 MOV device,"3" ;AC664;set up message
3987 .IF <parm_list[current_parm_DI].item_tag EQ LPT3_item_tag> THEN ;AN000;
3988
3989 MOV parms.parmsx_ptr,OFFSET lpt_parmsx ;AN000;
3990 MOV lines_value_ptr,OFFSET LPT_lines_values ;AN000;
3991 MOV lines_match_flag,simple_string ;AN000;printer lines values are strings
3992 MOV REFRESH_str,deleted ;AN007;no codepage stuff legal
3993 MOV REF_str,deleted ;AN007;
3994 MOV SEL_equal,deleted ;AN007;
3995 MOV SELECT_equal,deleted ;AN007;
3996 MOV PREP_equal,deleted ;AN007;
3997 MOV PREPARE_equal,deleted ;AN007;
3998 MOV ordinal,1 ;AN000;new parmsx, skip chars per line positional
3999 ADD DI,TYPE parm_list_entry ;create entry for skipped chars per line ;AN000;
4000 MOV looking_for,li_or_null ;AN000;
4001 MOV device_type,LPTX ;for rescode
4002 MOV request_type,old_initialize_printer_port ;AN000;
4003 BREAK 21 ;AN000;
4004
4005 .ENDIF
4006
4007
4008
4009
4010 ; need to use colon as a delimeter in following cases
4011
4012 modify_parser_control_block seperator_list,addd,colon ;AN000;want to stop on colons
4013
4014 CALL reset_parm_pointer ;reset to first entry in the parm list
4015 MOV ordinal,0 ;start with the first parm again
4016 MOV command_line,OFFSET first_char_in_command_line ;look at first part of command line again
4017 CALL parse_parm ;AN000;parse the first parm again
4018
4019
4020 ; COM?:
4021
4022
4023 MOV device_name,OFFSET COM1_str ;AN000;assume COM1
4024 MOV device,"1" ;AN000;set up message
4025 .IF <parm_list[current_parm_DI].item_tag EQ COM1_item_tag> OR ;AN000;
4026 MOV device_name,OFFSET COM2_str ;AN000;assume COM2
4027 MOV device,"2" ;AN000;set up message
4028 .IF <parm_list[current_parm_DI].item_tag EQ COM2_item_tag> OR ;AN000;
4029 MOV device_name,OFFSET COM3_str ;AN000;assume COM3
4030 MOV device,"3" ;AN000;;set up message
4031 .IF <parm_list[current_parm_DI].item_tag EQ COM3_item_tag> OR ;AN000;
4032 MOV device_name,OFFSET COM4_str ;AN000;assume COM4
4033 MOV device,"4" ;AN000;;set up message
4034 .IF <parm_list[current_parm_DI].item_tag EQ COM4_item_tag> THEN ;AN000;
4035
4036 MOV parms.parmsx_ptr,OFFSET com_parmsx ;AN000;
4037 MOV ordinal,0 ;AN000;new parmsx, start with new number of positionals, start at first one
4038 MOV looking_for,com_keyword_or_baud ;AN000;
4039 MOV device_type,COMX ;AN000;;set up for rescode
4040 BREAK 21 ;AN000;
4041
4042 .ENDIF
4043
4044
4045
4046 ; LPT?:
4047
4048 MOV device_name,OFFSET LPT1_str ;AN000;assume LPT1
4049 MOV device,"1" ;AC664;set up message
4050 MOV LPTNO,"1" ;see modeprin
4051 .IF <parm_list[current_parm_DI].item_tag EQ LPT1_item_tag> OR ;AN000;
4052 MOV device_name,OFFSET LPT2_str ;AN000;assume LPT2
4053 MOV LPTNO,"2" ;see modeprin
4054 MOV device,"2" ;AC664;set up message
4055 .IF <parm_list[current_parm_DI].item_tag EQ LPT2_item_tag> OR ;AN000;
4056 MOV device_name,OFFSET LPT3_str ;AN000;assume LPT3
4057 MOV LPTNO,"3" ;see modeprin
4058 MOV device,"3" ;AC664;set up message
4059 .IF <parm_list[current_parm_DI].item_tag EQ LPT3_item_tag> THEN ;AN000;
4060
4061 MOV parms.parmsx_ptr,OFFSET lpt_parmsx ;AN000;
4062 MOV columns_value_ptr,OFFSET LPT_columns_values ;AN000;
4063 MOV lines_value_ptr,OFFSET LPT_lines_values ;AN000;
4064 MOV columns_match_flag,simple_string ;AN000;printer columns values are strings
4065 MOV lines_match_flag,simple_string ;AN000;printer lines values are strings
4066 MOV ordinal,0 ;AN000;new parmsx so start over counting positionals
4067 MOV looking_for,prn_kw_status_cp_cl_null ;AN000;
4068 MOV device_type,LPTX ;for rescode
4069 BREAK 21 ;AN000;
4070
4071 .ENDIF
4072
4073
4074 ; PRN:
4075
4076 .IF <parm_list[current_parm_DI].item_tag EQ PRN_item_tag> THEN ;AN000;
4077
4078 MOV looking_for,codepage ;AN000;
4079 MOV device_name,OFFSET LPT1_str ;AN000;
4080 BREAK 21 ;AN000;
4081
4082 .ENDIF
4083
4084
4085 ; CON:
4086
4087 .IF <parm_list[current_parm_DI].item_tag EQ CON_item_tag> THEN ;AN000;
4088
4089 MOV parms.parmsx_ptr,OFFSET con_parmsx ;AN000;set up for con parms
4090 MOV ordinal,0 ;AN000;start over with new parmsx block
4091 MOV looking_for,BYTE PTR con_kwrd_status_or_cp ;AN000;
4092 MOV device_name,OFFSET CON_str
4093 BREAK 21
4094
4095 .ENDIF
4096
4097
4098
4099 ; eol: ;no parms specified
4100
4101 .IF <parser_return_code_AX EQ end_of_command_line> THEN ;AN000;
4102
4103 MOV request_type,status_for_everything ;AN000;
4104 MOV eol_found,true ;AN000;
4105 BREAK 21 ;AN000;
4106
4107 .ENDIF
4108
4109
4110
4111 ; COM?baud:
4112
4113
4114 MOV parms.parmsx_ptr, OFFSET mutant_COM_parmsx
4115 ;for i in 1 through 4 see if the parm is COMi
4116 MOV match_found,false ;AN000;
4117 MOV i_CL,0 ;AN000;CL:="1"
4118 .WHILE <i_CL LT 4> AND ;AN000;
4119 .WHILE <match_found EQ false> DO ;AN000;
4120 CALL reset_parm_pointer ;AN000;prepare to reparse the parm
4121 INC i_CL ;AN000;use next number as a delimeter
4122 MOV parm_list[current_parm_DI].item_tag,i_CL ;AN000;depends on COM1 thru 4 item tags being 1 thru 4
4123 PUSH CX ;AN000;save the loop counter (the binary form)
4124 ADD i_CL,binary_to_ASCII ;CL=ASCII representation of the index
4125 modify_parser_control_block seperator_list,addd,i_CL ;AN000;make the number (1 to 4)a seperator
4126 MOV ordinal,0 ;AN000;look at first parm each time
4127 MOV command_line,OFFSET first_char_in_command_line ;set parser up at start of the command line each time
4128 PUSH CX ;AN000;save the delimeter (ASCII form)
4129 CALL parse_parm ;AN000;
4130 ; .IF <parm_list[current_parm_DI].item_tag EQ COM_item_tag> THEN ;AN000;isloated "COM" so found "COM?"
4131 .IF <parser_return_code_AX EQ no_error> THEN ;AN000;isloated "COM" so found "COMx"
4132 MOV match_found,true ;AN000;
4133 .ENDIF
4134 POP CX ;AN000;restore the ASCII delimeter
4135 modify_parser_control_block seperator_list,delete,i_CL ;AN000;fix parser control blocks
4136 POP CX ;restore the loop counter
4137 .ENDWHILE ;AN000;
4138 .IF <match_found EQ true> THEN ;AN000;IF have COMX THEN look for valid baud
4139 .IF <i_CL EQ 1> THEN ;AN000;
4140 MOV device_name,OFFSET COM1_str ;AN000;
4141 MOV parm_list[current_parm_DI].value1,OFFSET COM1_str ;AN000;setup for modecom existence check
4142 MOV device,"1" ;AN000;set up message
4143 .ELSEIF <i_CL EQ 2> THEN ;AN000;
4144 MOV device_name,OFFSET COM2_str ;AN000;
4145 MOV parm_list[current_parm_DI].value1,OFFSET COM2_str ;AN000;setup for modecom existence check
4146 MOV device,"2" ;AN000;set up message
4147 .ELSEIF <i_CL EQ 3> THEN ;AN000;
4148 MOV device_name,OFFSET COM3_str ;AN000;
4149 MOV parm_list[current_parm_DI].value1,OFFSET COM3_str ;AN000;setup for modecom existence check
4150 MOV device,"3" ;AN000;set up message
4151 .ELSE;IF <i_CL EQ 4> THEN ;AN000;
4152 MOV device_name,OFFSET COM4_str ;AN000;
4153 MOV parm_list[current_parm_DI].value1,OFFSET COM4_str ;AN000;setup for modecom existence check
4154 MOV device,"4" ;AN000;set up message
4155 .ENDIF ;AN000;
4156
4157 MOV parms.parmsx_ptr,OFFSET com_parmsx ;AN000;
4158 MOV ordinal,0 ;AN000;start with baud in new parmsx
4159 MOV looking_for,com_keyword_or_baud ;AN000;
4160 MOV device_type,COMX ;set up for rescode
4161 BREAK 21 ;AN000;
4162
4163
4164 ; otherwise: ;first parm was nothing recognizable
4165
4166 .ELSE
4167
4168 dummy4:
4169 PUBLIC dummy4
4170
4171 MOV ordinal,0 ;AN000;parse first parm again
4172 MOV command_line,OFFSET first_char_in_command_line ;set parser up at start of the command line one more time
4173 modify_parser_control_block seperator_list,addd,"." ;AN000;want to stop on periods
4174 modify_parser_control_block seperator_list,addd,'"' ;AN000;want to stop on quotes
4175 modify_parser_control_block seperator_list,addd,'\' ;AN000;want to stop on back slashes
4176 modify_parser_control_block seperator_list,addd,'[' ;AN000;want to stop on left brackets
4177 modify_parser_control_block seperator_list,addd,']' ;AN000;want to stop on right brackets
4178 modify_parser_control_block seperator_list,addd,'+' ;AN000;want to stop on plus signs
4179 ;AC003; modify_parser_control_block seperator_list,addd,';' ;AN000;want to stop on semicolons
4180
4181 CALL parse_parm
4182 CALL setup_invalid_parameter ;AN000;
4183 ; BREAK
4184
4185 .ENDIF
4186
4187 ENDCASE_21:
4188
4189 BREAK 0 ;AN000;first_parm
4190
4191
4192
4193 eol_case:
4194
4195 CALL parse_parm ;AN000;
4196 .IF <parser_return_code_AX NE end_of_command_line> THEN ;AN000;
4197 MOV message,OFFSET invalid_number_of_parameters ;AN000;
4198 MOV noerror,false ;AN000;
4199 .ELSE NEAR ;AN000;
4200 MOV eol_found,true ;AN000;
4201 .ENDIF
4202 ; BREAK
4203
4204
4205
4206 ENDCASE_0: ;AN000;looking_for=
4207
4208 .ENDWHILE ;AN000;
4209
4210 .IF <message NE no_message> THEN
4211 display message
4212 .ENDIF
4213
4214 RET
4215
4216 parse_parameters ENDP
4217
4218
4219
4220
4221
4222
4223
4224 ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
4225
4226 ;³ SEPERATOR_LIST
4227 ;³ --------------
4228
4229 ;³ As the logic in PARSE_PARAMETERS proceeds the posibilities for the next parm
4230 ;³ become apparent and the parser control blocks need to be changed to correctly
4231 ;³ parse the next parm. This procedure is responsible for manipulating the
4232 ;³ list of seperators as requested.
4233
4234
4235
4236
4237 ;³ INPUT: action (in BX) - A scalar immediate indicating whether the seperator
4238 ;³ is to be added or deleted.
4239
4240 ;³ seperator_charactor (in AL) - The seperator character to be added or
4241 ;³ deleted from the seperator list
4242
4243
4244 ;³ RETURN: none
4245
4246
4247 ;³ MESSAGES: none
4248
4249
4250
4251 ;³ REGISTER
4252 ;³ USAGE:
4253
4254
4255
4256 ;³ CONVENTIONS:
4257
4258
4259 ;³ ASSUMPTIONS: The character exists in the list before it is deleted.
4260 ;³ A character being added is not already in the list.
4261 ;³ There is no "extra end of line list".
4262 ;³ Direction flag is cleared so REPs will increment index reg
4263 ;³ ES and DS are the same and address data
4264
4265
4266
4267
4268
4269
4270 ;³ SIDE EFFECT:
4271
4272
4273
4274
4275
4276 ;³ LOGIC:
4277
4278
4279 ;³ CASE action=
4280
4281 ;³ add:
4282
4283 ;³ skip to end of seperators list ;use parms.seperators_len to find end
4284 ;³ overwrite zero with AL
4285 ;³ overwrite blank space holder in the delimeter list with AL
4286 ;³ INC parms.seperators_len
4287 ;³ BREAK
4288
4289
4290 ;³ delete:
4291
4292 ;³ DEC parms.seperators_len
4293 ;³ scan to seperator char to be deleted
4294 ;³ shift remaining chars to left
4295 ;³ put zero at end for length of the extra EOL list
4296 ;³ BREAK
4297
4298 ;³ ENDCASE
4299
4300
4301 ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
4302
4303
4304 seperator_list PROC NEAR
4305
4306 ;CASE modifier=
4307
4308 SHL BX,1 ;AN000;BX=word displacement into jump table
4309 JMP jump_table2[BX] ;AN000;jump to appropriate jump
4310
4311 jump_table2 LABEL WORD
4312
4313 DW OFFSET add_case ;AN000;
4314 DW OFFSET delete_case ;AN000;
4315
4316
4317 add_case:
4318
4319
4320 XOR BX,BX
4321 MOV BL,parms.seperators_len ;AN000;BX=length of seperators list
4322 ADD BX,OFFSET parms
4323 MOV [BX].seperators,AL ;AN000;overwrite blank with AL
4324 INC parms.seperators_len ;AN000;adjust for added seperator
4325 BREAK 22 ;AN000;
4326
4327
4328 delete_case:
4329
4330 ;scan to seperator char to be deleted
4331
4332 PUSH DI
4333
4334 MOV DI,OFFSET parms
4335 ADD DI,OFFSET seperators ;ES:DI=>seperator list
4336 REPNE SCASB
4337 DEC DI ;AN000;DI=>char to be deleted
4338 MOV ES:[DI],BYTE PTR blank ;duplicate but harmless blank
4339
4340 POP DI
4341
4342 BREAK 22 ;AN000;
4343
4344 ENDCASE_22:
4345
4346 RET
4347
4348 seperator_list ENDP
4349
4350
4351 ;-------------------------------------------------------------------------------
4352 ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
4353
4354 ;³ KEYWORDS
4355 ;³ --------
4356
4357 ;³ As the logic in PARSE_PARAMETERS proceeds the posibilities for the next parm
4358 ;³ become apparent and the parser control blocks need to be changed to correctly
4359 ;³ parse the next parm. This procedure is responsible for manipulating the
4360 ;³ list of keywords as requested.
4361
4362
4363
4364
4365 ;³# INPUT: action (in BX) - A scalar immediate indicating whether the keyword
4366 ;³# is to be added or deleted.
4367 ;³#
4368 ;³#
4369 ;³# string (in RL) - A scalar immediate or OFFSET, indicating/pointing
4370 ;³# to the keyword or set of keywords to be added
4371 ;³# or deleted.
4372
4373
4374
4375 ;³ RETURN: none
4376
4377
4378 ;³ MESSAGES: none
4379
4380
4381
4382
4383 ;³ REGISTER
4384 ;³ USAGE:
4385
4386
4387
4388 ;³ CONVENTIONS:
4389
4390
4391
4392
4393 ;³ ASSUMPTIONS:
4394
4395
4396
4397
4398 ;³ SIDE EFFECT:
4399
4400
4401 ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
4402
4403
4404 keywords PROC NEAR
4405
4406 ; use result.synonym to find the the keyword to delete
4407
4408 MOV SI,parm_list[current_parm_DI].keyword_switch_ptr ;SI=>the keyword string to be deleted
4409 MOV BYTE PTR ES:[SI],deleted ;AN000;zilch out first byte of the keyword string
4410
4411
4412 RET
4413
4414 keywords ENDP
4415
4416 ;-------------------------------------------------------------------------------
4417
4418
4419 ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
4420
4421 ;³ PARSE_PARM
4422 ;³ ----------
4423
4424 ;³ Add the parm found to the parm_list. Save the pointer to the current parm
4425 ;³ for use by CALL reset_parm_pointer. When a reset call from reset_parm
4426 ;³ happens the pointer to the last entry in the parm list is decremented, which
4427 ;³ will put the results of the next parse over that entry.
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439 ;³ INPUT:
4440
4441
4442 ;³ RETURN: The next parm list entry is filled with the results of the call to
4443 ;³ the parser. If the parser returns an error other than "end of
4444 ;³ command line" the entry is not filled in. If the parser returns
4445 ;³ "end of command line" the .type field is set to end_of_command_line.
4446
4447
4448 ;³ MESSAGES: none
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460 ;³ REGISTER
4461 ;³ USAGE:
4462
4463
4464
4465 ;³ CONVENTIONS:
4466
4467
4468
4469
4470
4471
4472
4473 ;³ ASSUMPTIONS:
4474
4475
4476
4477
4478
4479
4480
4481
4482 ;³ SIDE EFFECT:
4483
4484
4485 ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
4486
4487 parse_parm PROC
4488
4489 PUBLIC PARSE_PARM
4490
4491 ADD current_parm_DI, TYPE parm_list_entry
4492
4493 PUSH current_parm_DI ;save index into parsed parms list
4494 PUSH BX ;save the address of the parsed parms list
4495
4496 MOV DI,OFFSET PARMS ; ES:DI=>PARSE CONTROL DEFINITON
4497 MOV SI,COMMAND_line ; DS:SI=>unparsed portion of the command line
4498 MOV DX,0 ; RESERVED
4499 MOV CX,ordinal ; OPERAND ORDINAL
4500 EXTRN SYSPARSE:NEAR
4501 CALL SYSPARSE ;AX=return code, DX=>result buffer
4502 MOV ordinal,CX ;save for next call
4503 MOV terminating_delimeter,BL ;save the character that delimited the parm
4504
4505 POP BX ;restore parm_list
4506 POP current_parm_DI ;nothing returned in DI anyway
4507
4508 MOV CX,command_line ;AN000;CX=>first char of the bad parm
4509 MOV offending_parameter_ptr,CX ;AN000;set pointer in message
4510
4511 ; .IF <parser_return_code_AX EQ no_error> THEN
4512 MOV command_line,SI ;save pointer to remainder of the command line
4513 .IF <parser_return_code_AX NE end_of_command_line> THEN
4514 MOV DL,result.ret_type
4515 MOV parm_list[current_parm_DI].parm_type,DL
4516 MOV DL,result.item_tag
4517 MOV parm_list[current_parm_DI].item_tag,DL
4518 MOV DX,result.ret_value1
4519 MOV parm_list[current_parm_DI].value1,DX
4520 MOV DX,result.ret_value2
4521 MOV parm_list[current_parm_DI].value2,DX
4522 MOV DX,result.synonym
4523 MOV parm_list[current_parm_DI].keyword_switch_ptr,DX
4524 .ENDIF
4525 ; .ELSE ;AN000;encountered an error
4526 ; MOV CX,command_line ;AN000;CX=>first char of the bad parm
4527 ; MOV offending_parameter_ptr,CX ;AN000;set pointer in message
4528 ; MOV BYTE PTR [SI],0 ;AN000;make the offending parm an ASCIIZ string
4529 ; .ENDIF ;AN000;leave the call to msg services to the calling routine
4530
4531 RET
4532
4533 parse_parm ENDP
4534
4535
4536
4537 ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
4538
4539 ;³ RESET_PARM_POINTER
4540 ;³ ------------------
4541
4542
4543
4544 ;³ The last entry in the parm list is decremented, which
4545 ;³ will put the results of the next parse over that entry.
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557 ;³ INPUT:
4558
4559
4560 ;³ RETURN: The current parm list entry is filled with recognizable trash
4561
4562
4563
4564
4565 ;³ MESSAGES: none
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577 ;³ REGISTER
4578 ;³ USAGE:
4579
4580
4581
4582 ;³ CONVENTIONS:
4583
4584
4585
4586
4587
4588
4589
4590 ;³ ASSUMPTIONS:
4591
4592
4593
4594
4595
4596
4597
4598
4599 ;³ SIDE EFFECT:
4600
4601
4602 ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
4603 ;AN000;
4604 reset_parm_pointer PROC
4605
4606
4607
4608 MOV parm_list[current_parm_DI].parm_type,bogus ;AN000;
4609 MOV parm_list[current_parm_DI].item_tag,0FFH ;AN000;
4610 MOV parm_list[current_parm_DI].synonym,bogus ;AN000;
4611 MOV parm_list[current_parm_DI].value1,bogus ;AN000;
4612 MOV parm_list[current_parm_DI].value2,bogus ;AN000;
4613 MOV parm_list[current_parm_DI].keyword_switch_ptr,0 ;AN000;
4614 SUB current_parm_DI,TYPE parm_list_entry ;AN000;
4615 DEC ordinal ;AN000;
4616
4617
4618 RET
4619
4620 reset_parm_pointer ENDP ;AN000;
4621
4622
4623 PRINTF_CODE ENDS ;AN000;
4624 END ;AN000;
4625 \1a