3 TITLE MODE COMMAND
- COMMAND PARSING
5 INCLUDE STRUC.INC ;AN000;
10 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
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.
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.
21 ; AC003 - P3451: Wasn't treating semicolons as a valid blank-like delimeter.
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.
27 ; AC005 - P3796: PRN /STA returned "Invalid parameter -" when worked OK for
30 ; AC006 - P3932: Was issuing "Invalid parameter - ???" for switches that are
31 ; not valid, now issue "Invalid switch - ???".
33 ; AC007 - P3931: "CON SEL=850" acts like a status request, should return
34 ; "Invalid number of parameters" because user forgot "CP".
36 ; AX008 - P5183: Was denying 19200 baud on PS/2 model 30s and 25s and VAILs.
39 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
43 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
48 JMP endcase_
&X
;AN000;
51 ;-------------------------------------------------------------------------------
53 DISPLAY MACRO MESSAGE
;AN000;
54 MOV DX,MESSAGE
;AN000;
58 ;-------------------------------------------------------------------------------
60 check_for_lpt_keyword
MACRO ;AN000;
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;
69 ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
71 ;³ DELETE_PARSER_VALUE_LIST_ENTRY
72 ;³ -------------------------------
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.
83 ;³ INPUT: item_type - scalar indicating that a string or keyword is to be deleted
85 ;³ item - A scalar immediate that indicates the string or keyword to
98 ;³ USAGE: "item" is put into BX.
106 ;³ ASSUMPTIONS: All the input are valid.
120 ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
122 delete_parser_value_list_entry
MACRO item_type
,item
;AN000;
125 CALL item_type
;AN000;
130 ;-------------------------------------------------------------------------------
132 ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
134 ;³ MODIFY_PARSER_CONTROL_BLOCK
135 ;³ ---------------------------
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.
146 ;³ INPUT: control_structure - A scalar immediate indicating the control block
147 ;³ to be modified, and the routine to call.
149 ;³ action - A scalar immediate that indicates the nature
150 ;³ of the modification to be made.
152 ;³ item - A scalar immediate that indicates the string, number,
153 ;³ keywords, switch, or match flags mask involved.
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.
172 ;³ ASSUMPTIONS: All the input are valid.
178 ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
180 modify_parser_control_block
MACRO control_structure
,action
,item
;AN000;
184 MOV BX,action
;AN000;
186 CALL control_structure
;AN000;
192 ;-------------------------------------------------------------------------------
196 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
200 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
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
249 unspecified EQU
0FFH ;AN000;item tag of parm not specified: skipped optional positional parm
252 ;possible values for "parm_type", the type of parm returned by parser
258 ;possible values for "return_code_AX"
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
268 ;possible values of "device_type"
270 COMX EQU
09CH ;AN000;
272 LPTX EQU
09BH ;AN000;
276 ;possible values of "request_type"
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
299 ;possible codepage requests, used by modecp
301 select EQU
086H ;AN000;
302 prepare EQU
085H ;AN000;
303 refresh EQU
084H ;AN000;
304 ;status ;AN000;;see request_type possibilities
308 ;possible values of "looking_for"
311 codepage EQU 6FH
;AN000;
312 codepage_prms EQU 6EH
;AN000;
313 com_keyword EQU 6
DH ;AN000;
314 com_keyword_or_baud EQU 6
CH ;AN000;
315 CON_keyword EQU 6
BH ;AN000;
316 con_kwrd_status_or_cp EQU 6
AH ;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;
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 5
DH ;AN000;
331 max_looking_for EQU 6FH
;AN000;;used for calculating the displacement into jump table for "CASE looking_for="
336 ;item tags for COM port names strings
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.
343 ;item tags for paritys
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;
354 ;item tags for printer port names
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;
361 ;item tags for screen modes
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;
373 con_item_tag EQU 12H
;AN000;
376 ;item tags for LPT special cases
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
387 P_item_tag EQU 19H
;AN000;
388 RETRY_item_tag EQU 1
AH ;AN000;
389 B_item_tag EQU 1
BH ;AN000;
390 E_item_tag EQU 1
CH ;AN000;
391 R_item_tag EQU 1
DH ;AN000;
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;
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;
403 COM_item_tag EQU 27H
;AN000;
405 ON_item_tag EQU 28H
;AN000;
406 OFF_item_tag EQU 29H
;AN000;
408 L_item_tag EQU 2
AH ;AN000;
409 T_item_tag EQU 2
BH ;AN000;
411 ;item tags for numbers not in other lists
413 zero_item_tag EQU 2
CH ;AN000;
414 first_stopbit_item_tag EQU 2
DH ;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 3
AH ;AN000;
428 ten_item_tag EQU 3
BH ;AN000;
429 eleven_item_tag EQU 3
CH ;AN000;;first two chars of 110
430 twelve_item_tag EQU 3
DH ;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 4
AH ;AN000;
444 twentysix_item_tag EQU 4
BH ;AN000;
445 twentyseven_item_tag EQU 4
CH ;AN000;
446 twentyeight_item_tag EQU 4
DH ;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 5
AH ;AN000;
460 twentyfourhundred_item_tag EQU 5
BH ;AN000;
461 fourtyeighthundred_item_tag EQU 5
CH ;AN000;
462 ninetysixhundred_item_tag EQU 5
DH ;AN000;
463 nineteentwohundred_item_tag EQU 5EH
;AN000;
466 ;mask values for function_flags
468 capitalize EQU
0001H ;AN000;capitalize by file table
471 ;mask values for match flags
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;
481 ;delete_simple_string EQU 0CFFFH ;AN000;;NOT (simple_string), to turn off simple_string bit in the match_flags
487 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
491 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
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
510 des_strt_pkcpC
DW -1 ;code page number for 12th slot
514 INCLUDE COMMON.STC ;contains the following strucs, needed in invoke also
517 ;parm_list_entry STRUC
523 ;keyword_switch_ptr DW 0
525 ;parm_list_entry ENDS
528 ;codepage_parms STRUC
536 parms_def
STRUC ;AN000;
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 (. " \ [ ] : + =)
544 parms_def ENDS
;AN000;
548 result_def
STRUC ;AN000;
550 ret_type
DB 0 ;AN000;
551 ret_tag
DB 0FFH ;AN000;
553 ret_value1
DW bogus
;AN000;
554 ret_value2
DW bogus
;AN000;
556 result_def ENDS
;AN000;
565 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
570 PRINTF_CODE
SEGMENT PUBLIC ;AN000;
571 ASSUME
CS:PRINTF_CODE
,DS:PRINTF_CODE
,SS:PRINTF_CODE
;AN000;
574 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
577 PUBLIC all_con_status
;AN000;
578 PUBLIC baud_equal
;AN000;
579 PUBLIC B_item_tag
;needed by modecom ;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;
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;
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;
698 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
701 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
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
728 ;possible values of "message"
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
737 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
740 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
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'
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
751 des_start_packet des_strt_packet
<>
753 ;---------------------------- NEW DATA ---------------------------------
757 baud_specified
DB false
;AN000;
758 codepage_index_holder
DW bogus
;AN000;;holder for index in parm_list of the selected code page
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
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
781 ; PARSER interface data
782 ;---------------------------------------
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;
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;
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;
812 parms parms_def
<> ;AN000;set up for first_parm_case, except parmsx_ptr needs to be set
815 parmsx
LABEL BYTE ;AN000;
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;
823 DB max_switches
;AN000;
824 DW max_switches
DUP (Sw_control
) ;AN000;
826 DB max_keywords
;AN000;number of unique keywords for all options
828 start_keyword_list
LABEL BYTE ;AN000;
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;
837 DW RETRY_equal_control
;AN000;for parallel and serial printers
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;
844 max_keywords EQU
($ - start_keyword_list
) / 2 ;AN000;two bytes per entry
848 con_parmsx
LABEL BYTE ;AN000;for keyword form of con support
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
855 DB max_switches
;AN000;
856 DW max_switches
DUP (Sw_control
) ;AN000;
858 DB number_of_CON_keywords
;AN000;number of unique keywords for CON
860 start_con_keyword_list
LABEL BYTE ;AN000;
862 DW COLUMNS_equal_control
;AN000;
863 DW LINES_equal_control
;AN000;
864 DW PREPARE_equal_control
;AN000;
865 DW SELECT_equal_control
;AN000;
867 DW DELAY_equal_control
;AN000;
868 DW RATE_equal_control
;AN000;
870 number_of_con_keywords EQU
($ - start_con_keyword_list
) / 2 ;AN000;two bytes per entry
873 old_con_parmsx
LABEL BYTE ;AN000;
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
880 DB 0 ;AN000;no switches
882 DB 0 ;AN000;no keywords for old CON
885 lpt_parmsx
LABEL BYTE ;AN664;for the second thru 4th parms, [[chars/line][[,lines/inch][[,P]]]]
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;
893 DB max_switches
;AN000;
894 DW max_switches
DUP (Sw_control
) ;AN000;
896 DB max_lpt_keywords
;AN000;number of unique keywords for all options
898 start_lpt_keyword_list
LABEL BYTE ;AN000;
900 DW RETRY_equal_control
;AN000;for parallel printers
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;
907 max_lpt_keywords EQU
($ - start_keyword_list
) / 2 ;AN000;two bytes per entry
910 prepare_equal_parmsx
LABEL BYTE ;AN000;
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
920 com_parmsx
LABEL BYTE ;AN000;
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;
930 DB max_switches
;AN000;
931 DW max_switches
DUP (Sw_control
) ;AN000;
933 DB number_of_com_keywords
;AN000;
935 start_com_keyword_list
LABEL BYTE ;AN000;
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
943 number_of_com_keywords EQU
($ - start_com_keyword_list
) / 2 ;AN000;two bytes per entry
946 com_keywords_parmsx
LABEL BYTE ;AC663;
948 DB 0 ;AC663;no positional parms valid
953 DB number_of_com_keywords
;AC663;
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
963 mutant_com_parmsx
LABEL BYTE ;AN000;for trash like COM19600
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
970 DB 0 ;AN000;no switches
972 DB 0 ;AN000;no keywords
974 com_control
LABEL BYTE ;AN000;for mutant_com_parmsx
976 DW simple_string
;AN000;"COM", not optional
977 DW 0 ;AN000;don't capitalize, leave colon
980 DB 0 ;AN000;no synonyms
984 old_com_parity_control
LABEL BYTE ;AC000;
986 DW simple_string
+optional
;AC000;n, o, e are strings
987 DW 0 ;AC000;don't capitalize, leave colon
989 DW PARITY_values
;AC000;
990 DB 0 ;AC000;;no synonyms
993 old_com_DATAbits_control
LABEL BYTE ;AC000;
995 DW simple_string
+optional
;AC000;
996 DW 0 ;AC000;;don't capitalize, leave colon
998 DW DATA_values
;AC000;
1003 old_com_STOPbits_control
LABEL BYTE ;AC000;
1005 DW simple_string
+optional
;AC000;
1006 DW 0 ;AC000;;don't capitalize, leave colon
1008 DW STOP_values
;AC000;
1013 old_com_RETRY_control
LABEL BYTE ;AC000;
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
1018 DW RETRY_values
;AC000;
1022 com_value
LABEL BYTE ;AC000;"COM" for mutant_com_parmsx
1024 DB include_string_list
;AC000;have list of strings
1028 DB 0 ;AC000;no number choices
1030 DB 1 ;AC000;just "COM"
1032 DB COM_item_tag
;AC000;
1033 DW OFFSET COM_str
;AC000;
1036 first_pos_control
LABEL BYTE ;AN000;initialized for first_parm_case
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
1041 values_ptr
DW first_pos_values
;AN000;
1042 DB 0 ;AN000;no keywords as positionals
1045 second_pos_control
LABEL BYTE ;AN000;initialized for first_parm_case
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
1050 values_ptr2
DW second_pos_values
;AN000;
1051 DB 0 ;AN000;;no keywords as positionals
1053 third_pos_control
LABEL BYTE ;AN000;initialized for first_parm_case
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
1058 values_ptr3
DW third_pos_values
;AN000;
1059 DB 0 ;AN000;;no keywords as positionals
1061 first_lpt_pos_control
LABEL BYTE ;AN000;chars per line
1063 DW simple_string
+optional
;AN000;2001, all that is legal for chars per line
1064 DW 0000H ;AN000;don't capitalize
1066 DW first_lpt_pos_values
;AN000;
1067 DB 0 ;AN000;no keywords as positionals
1070 second_lpt_pos_control
LABEL BYTE ;AN000;lines per inch
1072 DW simple_string
+optional
;AN000;2001, all that is legal for chars per line
1073 DW 0000H ;AN000;don't capitalize
1075 DW second_lpt_pos_values
;AN000;
1076 DB 0 ;AN000;;no keywords as positionals
1078 third_lpt_pos_control
LABEL BYTE ;AN000;P
1080 DW simple_string
+optional
;AN000;2001, all that is legal for retry settings
1081 DW 0000H ;AN000;don't capitalize
1083 DW third_lpt_pos_values
;AN000;
1084 DB 0 ;AN000;;no keywords as positionals
1088 BAUD_control
LABEL BYTE ;AN000;used for positional and keyword form
1090 DW simple_string
;AN000;required
1091 DW 0 ;AN000;don't capitalize
1093 DW BAUD_values
;AN000;
1094 DB 1 ;AN000;;only one form of the keyword
1096 BAUD_equal
DB "BAUD=",0 ;AN000;
1099 parity_equal_control
LABEL BYTE ;AN000;initialized for first_parm_case
1101 DW simple_string
;AN000;n, o, even, m, space etc are strings
1102 DW 0 ;AN000;don't capitalize, leave colon
1104 DW PARITY_values
;AN000;
1105 DB 2 ;two ways to specify it
1107 parity_equal
DB "PARITY=",0 ;AN000;
1108 par_equal
DB "PAR=",0 ;AN000;
1112 DATA_equal_control
LABEL BYTE ;AN000;
1115 DW 0 ;AN000;;don't capitalize, leave colon
1117 DW DATA_values
;AN000;
1120 data_equal
DB "DATA=",0 ;AN000;
1124 STOP_equal_control
LABEL BYTE ;AN000;
1126 DW simple_string
;AN000;
1127 DW 0 ;AN000;;don't capitalize, leave colon
1129 DW STOP_values
;AN000;
1132 stop_equal
DB "STOP=",0 ;AN000;
1136 RETRY_equal_control
LABEL BYTE ;AN000;
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
1141 DW RETRY_values
;AN000;
1144 retry_equal_str
DB "RETRY=",0 ;AN000;
1148 PREPARE_equal_control
LABEL BYTE ;AN000;
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
1154 DW prepare_values
;AN000;
1157 prepare_equal
DB "PREPARE=",0 ;AN000;
1158 prep_equal
DB "PREP=",0 ;AN000;
1161 SELECT_equal_control
LABEL BYTE ;AN000;
1163 DW numeric
;AN000;range of codepage numbers
1164 DW 0 ;AN000;don't capitalize, leave colon
1166 DW SELECT_values
;AN000;
1167 DB 2 ;AN000;no keywords as positionals
1169 select_equal
DB "SELECT=",0 ;AN000;
1170 sel_equal
DB "SEL=",0 ;AN000;
1173 DELAY_equal_control
LABEL BYTE ;AN000;
1175 DW numeric
;AN000; ;takes less space than number definitions
1176 DW 0 ;AN000; ;don't capitalize, leave colon
1178 DW DELAY_values
;AN000;
1181 del_equal
DB "DEL=",0 ;AN000;
1182 delay_equal
DB "DELAY=",0 ;AN000;
1185 RATE_equal_control
LABEL BYTE ;AN000;
1188 DW 0 ;AN000; ;don't capitalize, leave colon
1190 DW RATE_values
;AN000;
1193 rate_equal
DB "RATE=",0 ;AN000;
1197 LINES_equal_control
LABEL BYTE ;AN000;
1199 LINES_match_flag
DW numeric
;AN000; ;setup for CON, changed if find LPTX
1200 DW 0 ;AN000; ;don't capitalize, leave colon
1202 LINES_value_ptr
DW CON_LINES_values
;AN000;
1205 lines_equal
DB "LINES=",0 ;AN000;
1209 COLUMNS_equal_control
LABEL BYTE ;AN000;
1211 COLUMNS_match_flag
DW numeric
;AN000; ;setup for CON changed when find LPTX
1212 DW 0 ;AN000; ;don't capitalize, leave colon
1214 COLUMNS_value_ptr
DW CON_COLUMNS_values
;AN000;setup for CON, changed if find LPTX
1217 COLUMNS_equal
DB "COLUMNS=",0 ;AN000;printer keyword
1218 COLS_equal
DB "COLS=",0 ;AN000;
1221 LPT1_colon_equal_control
LABEL BYTE ;AN000;
1223 DW simple_string
+ignore_colon
;AN000;COM?[:] is all that is valid
1224 DW 0 ;AN000;;don't capitalize, leave colon
1226 DW reroute_values
;AN000;
1229 LPT1_colon_equal
DB "LPT1:=",0 ;AN000;
1233 LPT1_equal_control
LABEL BYTE ;AN000;
1235 DW simple_string
+ignore_colon
;AN000;COM?[:] is all that is valid
1236 DW 0 ;AN000;don't capitalize, leave colon
1238 DW reroute_values
;AN000;
1241 LPT1_equal
DB "LPT1=",0 ;AN000;
1245 LPT2_colon_equal_control
LABEL BYTE ;AN000;
1247 DW simple_string
+ignore_colon
;AN000;COM?[:] is all that is valid
1248 DW 0 ;AN000;don't capitalize, leave colon
1250 DW reroute_values
;AN000;
1253 LPT2_colon_equal
DB "LPT2:=",0 ;AN000;
1257 LPT2_equal_control
LABEL BYTE ;AN000;
1259 DW simple_string
+ignore_colon
;AN000;;COM?[:] is all that is valid
1260 DW 0 ;AN000;don't capitalize, leave colon
1262 DW reroute_values
;AN000;
1265 LPT2_equal
DB "LPT2=",0 ;AN000;
1269 LPT3_colon_equal_control
LABEL BYTE ;AN000;
1271 DW simple_string
+ignore_colon
;AN000;COM?[:] is all that is valid
1272 DW 0 ;AN000;don't capitalize, leave colon
1274 DW reroute_values
;AN000;
1277 LPT3_colon_equal
DB "LPT3:=",0 ;AN000;
1281 LPT3_equal_control
LABEL BYTE ;AN000;
1283 DW simple_string
+ignore_colon
;AN000;COM?[:] is all that is valid
1284 DW 0 ;AN000;don't capitalize, leave colon
1286 DW reroute_values
;AN000;
1289 LPT3_equal
DB "LPT3=",0 ;AN000;
1291 first_con_pos_control
LABEL BYTE ;AN000;
1293 DW simple_string
;AN000;CP, code, codepage
1294 DW 0 ;AN000;don't capitalize, leave colon
1296 DW OFFSET first_CON_pos_values
;AN000;
1297 DB 0 ;AN000;no synonyms
1300 second_con_pos_control
LABEL BYTE ;AN000;
1302 DW simple_string
;AN000;REFRESH
1303 DW 0 ;AN000;don't capitalize, leave colon
1305 DW OFFSET second_CON_pos_values
;AN000;
1306 DB 0 ;AN000;no synonyms
1308 first_old_con_pos_control
LABEL BYTE ;AN000;
1310 DW simple_string
+numeric
;AN000;r, l or screen lines request
1311 DW 0 ;AN000;don't capitalize
1313 DW OFFSET first_old_CON_pos_values
;AN000;
1314 DB 0 ;AN000;no synonyms
1317 second_old_con_pos_control
LABEL BYTE ;AN000;
1319 DW simple_string
+optional
;AN000;T
1320 DW 0 ;AN000;don't capitalize
1322 DW OFFSET second_old_CON_pos_values
;AN000;
1323 DB 0 ;AN000;no synonyms
1325 first_old_CON_pos_values
LABEL BYTE ;all valid forms of shift direction, and screen line values ;AN000;
1327 DB include_string_list
;AN000;have list of strings
1329 DB 0 ;no number ranges ;AN000;
1331 DB number_of_CON_lines_numbers
;number of rows choices;AN000;
1333 DB twentyfive_item_tag
;AN000;
1335 DB fourtythree_item_tag
;AN000;
1337 DB fifty_item_tag
;AN000;
1340 DB number_of_shift_forms
;number of shift strings AN000;
1342 start_shift_forms
LABEL BYTE ;AN000;
1345 DB R_item_tag
;AN000;
1346 DW OFFSET R_str
;AN000;
1347 DB L_item_tag
;AN000;
1348 DW OFFSET L_str
;AN000;
1351 number_of_shift_forms EQU
($ - start_shift_forms
)/3 ;3 bytes per entry;AN000;
1354 second_old_CON_pos_values
LABEL BYTE ;all valid forms of T ;AN000;
1356 DB include_string_list
;AN000;have list of strings
1358 DB 0 ;no number ranges ;AN000;
1360 DB 0 ;no number list ;AN000;
1362 DB number_of_T_forms
;number of T strings AN000;
1364 start_T_forms
LABEL BYTE ;AN000;
1367 DB T_item_tag
;AN000;
1368 DW OFFSET T_str
;AN000;
1371 number_of_T_forms EQU
($ - start_T_forms
)/3 ;3 bytes per entry;AN000;
1374 first_CON_pos_values
LABEL BYTE ;all valid forms of codepage;AN000;
1376 DB include_string_list
;AN000;have list of strings
1378 DB 0 ;no number ranges ;AN000;
1380 DB 0 ;no number list ;AN000;
1382 DB number_of_CP_forms
;number of cp strings AN000;
1384 start_CP_forms
LABEL BYTE ;AN000;
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;
1396 ;invalid choice, included for usable error reporting: if come across refresh right after CON then issue invalid number of parms
1398 DB REFRESH_item_tag
;AC007;
1399 DW OFFSET REF_str
;AC007;
1400 DB REFRESH_item_tag
;AC007;
1401 DW OFFSET REFRESH_str
;AC007;
1403 number_of_CP_forms EQU
($ - start_CP_forms
)/3 ;3 bytes per entry;AN000;
1406 second_CON_pos_values
LABEL BYTE ;all valid forms of REFRESH;AN000;
1408 DB include_string_list
;AN000;have list of strings
1410 DB 0 ;no number ranges ;AN000;
1412 DB 0 ;no number list ;AN000;
1414 DB number_of_REFRESH_forms
;number of REFRESH strings AN000;
1416 start_REFRESH_forms
LABEL BYTE ;AN000;
1418 DB REFRESH_item_tag
;AN000;
1419 DW OFFSET REF_str
;AN000;
1420 DB REFRESH_item_tag
;AN000;
1421 DW OFFSET REFRESH_str
;AN000;
1423 number_of_REFRESH_forms EQU
($ - start_REFRESH_forms
)/3 ;3 bytes per entry;AN000;
1426 BAUD_values
LABEL BYTE ;AN000;;all valid baud rates
1428 DB include_string_list
;AN000;have list of numbers and two strings
1432 DB 0 ;AN000;no numeric representations
1434 DB number_of_baud_strings
;AN000;number of baud rates that are being used for other parameters also
1436 start_baud_strings
LABEL BYTE ;AN000;
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"
1479 number_of_baud_strings EQU
($ - start_baud_strings
)/3 ;AN000;3 bytes per entry
1483 PARITY_values
LABEL BYTE ;AN000;all valid paritys
1485 DB include_string_list
;AN000;have list of strings
1489 DB 0 ;AN000;;no number choices
1491 DB number_of_paritys
;AN000;;number of valid paritys
1493 start_paritys
LABEL BYTE ;AN000;
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;
1516 number_of_paritys EQU
($ - start_paritys
)/3 ;AN000;3 bytes per entry
1519 DATA_values
LABEL BYTE ;AN000;all valid DATA values
1521 DB include_string_list
;AC663;have list of numbers
1523 DB 0 ;AN000;no number ranges
1525 DB 0 ;AN000;no number choices
1527 DB number_of_databits
;AN000;string choices
1529 start_databits
LABEL BYTE ;AN000;
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;
1540 number_of_databits EQU
($ - start_databits
)/3 ;AN000;3 bytes per entry
1543 STOP_values
LABEL BYTE ;AN000;;all valid stop bits
1545 DB include_string_list
;AN000;have list of numbers and list of strings
1549 DB 0 ;AN000; ;no number choices
1551 DB number_of_stopbit_strings
;AN000;;choices in string form
1553 start_stopbit_strings
LABEL BYTE ;AN000;
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;
1562 number_of_stopbit_strings EQU
($ - start_stopbit_strings
)/3 ;AN000;3 bytes per entry
1566 RETRY_values
LABEL BYTE ;AN000;;all valid RETRY settings
1568 DB include_string_list
;AN000;have list of strings
1572 DB 0 ;AN000;;no number choices
1574 DB number_of_retry_settings
;AN000;
1576 start_retry_settings
LABEL BYTE ;AN000;
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;
1591 number_of_retry_settings EQU
($ - start_retry_settings
)/3 ;AN000;3 bytes per entry
1595 PREPARE_values
LABEL BYTE ;AN000;almost any numeric value is valid
1597 DB ranges_only
;AN000;;have range of numbers
1599 DB 1 ;AN000;;one range
1601 DB codepage_item_tag
;AN000;
1602 DD min_codepage_value
;AN000;
1603 DD max_codepage_value
;AN000;
1608 SELECT_values
LABEL BYTE ;AN000;all valid baud rates
1610 DB ranges_only
;AN000;;have range of numbers
1614 DB codepage_item_tag
;AN000;;item tag for the range
1615 DD min_codepage_value
;AN000;
1616 DD max_codepage_value
;AN000;
1619 DELAY_values
LABEL BYTE ;AN000;;all valid delay rates
1621 DB ranges_only
;AN000;;have range of numbers
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
1630 RATE_values
LABEL BYTE ;AN000;;all valid typamatic rates
1632 DB ranges_only
;AN000;;have range of numbers
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
1642 CON_COLUMNS_values
LABEL BYTE ;AN000;all valid columns values for the screen
1644 DB include_number_list
;AN000; ;have list of numbers
1646 DB 0 ;AN000;only numeric representations
1648 DB number_of_CON_columns_numbers
;AN000;choices represented as numbers
1650 start_CON_columns_numbers
LABEL BYTE ;AN000;
1652 DB fourty_item_tag
;AN000;
1654 DB eighty_item_tag
; ;AN000;
1655 DD 80 ;AN000;numbers because used in call to IOCTL
1657 number_of_CON_columns_numbers EQU
($ - start_CON_columns_numbers
)/5 ;5 bytes per entry;AN000;
1661 CON_LINES_values
LABEL BYTE ;all valid LINES= values for the screen;AN000;
1663 DB include_number_list
;have list of numbers;AN000;
1667 DB number_of_CON_lines_numbers
; number ch;AN000;
1669 start_CON_lines_numbers
LABEL BYTE ;AN000;
1671 DB twentyfive_item_tag
;AN000;
1673 DB fourtythree_item_tag
;AN000;
1675 DB fifty_item_tag
;AN000;
1678 number_of_CON_lines_numbers EQU
($ - start_CON_lines_numbers
)/5 ;5 bytes per entry;AN000;
1683 LPT_COLUMNS_values
LABEL BYTE ;AN000;all valid columns values for parallel printers
1685 DB include_string_list
;AN000;;have list of strings
1689 DB 0 ;AN000;no numeric representations
1691 DB number_of_lpt_columns_strings
;AN000;;choices represented as strings
1693 start_LPT_columns_strings
LABEL BYTE ;AN000;
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;
1700 number_of_LPT_columns_strings EQU
($ - start_LPT_columns_strings
)/3 ;3 bytes per entry;AN000;
1704 LPT_LINES_values
LABEL BYTE ;AN000;all valid LINES= values for the screen
1706 DB include_string_list
;AN000;have list of strings
1710 DB 0 ;AN000; ;no number choices
1712 DB number_of_LPT_lines_strings
;AN000;
1714 start_LPT_lines_strings
LABEL BYTE ;AN000;
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;
1721 number_of_LPT_lines_strings EQU
($ - start_LPT_lines_strings
)/3 ;AN000;3 bytes per entry
1724 reroute_values
LABEL BYTE ;AN000;;all valid destination devices for parallel printer reroute
1726 DB include_string_list
;AN000; ;have list of numbers and one string
1730 DB 0 ;AN000;;no number choices
1732 DB number_of_reroute_strings
;AN000;
1734 start_reroute_strings
LABEL BYTE ;AN000;
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;
1745 number_of_reroute_strings EQU
($ - start_reroute_strings
)/3 ;AN000;3 bytes per entry
1750 Sw_control
LABEL BYTE ;AN000;
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;
1766 Sw_values
LABEL BYTE ;AN000;
1768 DB 0 ;AN000;no values allowed on /STATUS
1771 first_pos_values
LABEL BYTE ;AN000;value list for all positional parameters that appear first
1773 DB include_string_list
;AN000; ;have string values
1775 DB 0 ;AN000;numerics treated as strings
1777 DB 0 ;AN000;no number choices
1779 DB number_of_first_positional_strings
;AN000;
1781 start_first_positional_strings
LABEL BYTE ;used to calculate previous field;AN000;
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;
1801 DB con_item_tag
;AN000;
1802 DW OFFSET con_str
;AN000;
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;
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;
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;
1842 number_of_first_positional_strings EQU
($ - start_first_positional_strings
)/3 ;each entry is 3 bytes (byte, word);AN000;
1846 second_pos_values
LABEL BYTE ;AN000;;value list for all positional parameters that appear second
1848 DB include_string_list
;AN000; ;have string values
1850 DB 0 ;AN000;numerics treated as strings
1852 DB 0 ;AN000;no number choices
1854 DB number_of_second_positional_strings
;AN000;
1856 start_second_positional_strings
LABEL BYTE ;used to calculate previous field;AN000;
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;
1868 ;invalid choice, included for usable error reporting: if come across refresh right after CON then issue invalid number of parms
1870 DB REFRESH_item_tag
;AC007;
1871 DW OFFSET REF_str
;AC007;
1872 DB REFRESH_item_tag
;AC007;
1873 DW OFFSET REFRESH_str
;AC007;
1877 DB L_item_tag
;AN000;
1878 DW OFFSET L_str
;AN000;
1879 DB R_item_tag
;AN000;
1880 DW OFFSET R_str
;AN000;
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;
1890 number_of_second_positional_strings EQU
($ - start_second_positional_strings
)/3 ;each entry is 3 bytes (byte, word);AN000;
1893 third_pos_values
LABEL BYTE ;AN000;value list for all positional parameters that appear third
1895 DB include_string_list
;AN000; ;have string values
1897 DB 0 ;AN000;numerics treated as strings
1899 DB 0 ;AN000;no number choices
1901 DB number_of_third_positional_strings
;AN000;
1903 start_third_positional_strings
LABEL BYTE ;used to calculate previous field;AN000;
1905 number_of_third_positional_strings EQU
($ - start_third_positional_strings
)/3 ;each entry is 3 bytes (byte, word);AN000;
1908 first_lpt_pos_values
LABEL BYTE ;AN000;value list for all possible chars per line
1910 DB include_string_list
;AN000; ;have string values
1912 DB 0 ;AN000;numerics treated as strings
1914 DB 0 ;AN000;no number choices
1916 DB number_of_first_lpt_positional_strings
;AN000;
1918 start_first_lpt_positional_strings
LABEL BYTE ;used to calculate previous field;AN000;
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;
1931 ;invalid choice, included for usable error reporting: if come across refresh right after CON then issue invalid number of parms
1933 DB REFRESH_item_tag
;AC007;
1934 DW OFFSET REF_str
;AC007;
1935 DB REFRESH_item_tag
;AC007;
1936 DW OFFSET REFRESH_str
;AC007;
1938 number_of_first_lpt_positional_strings EQU
($ - start_first_lpt_positional_strings
)/3 ;each entry is 3 bytes (byte, word);AN000;
1941 second_lpt_pos_values
LABEL BYTE ;AN000;value list for all possible lines per inch
1943 DB include_string_list
;AN000; ;have string values
1945 DB 0 ;AN000;numerics treated as strings
1947 DB 0 ;AN000;no number choices
1949 DB number_of_second_lpt_positional_strings
;AN000;
1951 start_second_lpt_positional_strings
LABEL BYTE ;used to calculate previous field;AN000;
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;
1962 number_of_second_lpt_positional_strings EQU
($ - start_second_lpt_positional_strings
)/3 ;3 bytes per entry (byte,word);AN000;
1965 third_lpt_pos_values
LABEL BYTE ;AN000;value list for all possible retry settings
1967 DB include_string_list
;AN000; ;have string values
1969 DB 0 ;AN000;no numeric ranges
1971 DB 0 ;AN000;no number choices
1973 DB number_of_third_lpt_positional_strings
;AN000;
1975 start_third_lpt_positional_strings
LABEL BYTE ;used to calculate previous field;AN000;
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;
1992 number_of_third_lpt_positional_strings EQU
($ - start_third_lpt_positional_strings
)/3 ;each entry is 3 bytes (byte, word);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;
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;
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;
2079 SPACE_str
DB "SPACE",0 ;AN000;
2080 T_str
DB "T",0 ;AN000;
2083 result result_def
<> ;AN000;
2085 parm_lst parm_list_entry max_parms
DUP (<>) ;AN000;
2090 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
2094 ;******************************************************************************************
2096 ;-------------------------------------------------------------------------------
2097 ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
2101 ;³ Search the item tags in input value list for the input item tag.
2108 ;³ INPUT: i_CL - first item tag in the group
2109 ;³ search_stop - last item_tag in the group, the sentinal for the REPEAT
2113 ;³ RETURN: match_found indicates that the item tag returned by the parser was
2114 ;³ found in the group passed in.
2123 ;³ USAGE: To be determined at I2 time.
2137 ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
2139 search_item_tags PROC
NEAR ;AN000;
2142 MOV match_found
,false
;AN000;
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
2149 .UNTIL
<i_CL GT search_stop
> ;AN000;
2153 search_item_tags ENDP
;AN000;
2155 ;-------------------------------------------------------------------------------
2156 ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
2158 ;³ CHECK_FOR_KEYWORD
2159 ;³ ---------------------
2161 ;³ Scan the list of keywords (OFFSETS) looking for a match with
2162 ;³ parm_list[current_parm_DI].keyword_switch_ptr.
2166 ;³ INPUT: uses global variables.
2169 ;³ RETURN: match_found is set to true if a match is found.
2177 ;³ USAGE: DX - loop index
2178 ;³ SI - displacement into the list of pointers
2179 ;³ CX - holder of pointer to keywords for compare
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.
2197 ;³ SIDE EFFECT: DL - lost
2200 ;³ match_found - lost
2203 ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
2205 check_for_keyword PROC
NEAR ;AN000;
2207 MOV match_found
,false
;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;
2216 INC SI ;AN000; ;AN000;
2217 INC SI ;AN000; ;AN000;
2218 INC DL ;AN000;;increment loop counter
2223 check_for_keyword ENDP
;AN000;
2225 ;-------------------------------------------------------------------------------
2227 setup_invalid_parameter PROC
NEAR ;AN000;
2229 PUBLIC setup_invalid_parameter
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
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
2242 MOV BYTE PTR [BP],0 ;AN000;make the string an ASCIIZ
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.
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
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
2264 MOV message
,OFFSET Invalid_parameter
;AN000;user mispelled, misordered etc.
2266 MOV noerror
,false
;AN000;
2270 setup_invalid_parameter ENDP
;AN000;
2272 ;-------------------------------------------------------------------------------
2274 setup_for_not_supported PROC
NEAR ;AC002;prepare replacable parm for "Function not supported on this machine - ????".
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
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;
2290 setup_for_not_supported ENDP
;AC002;
2293 ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
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.
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.
2315 ;³ INPUT: none, uses global variables.
2318 ;³ RETURN: noerror is set to false if an error is encountered.
2321 ;³ MESSAGES: "Invalid parameter 'bdprm'", where "bdprm" is the first 5 or less
2322 ;³ characters of the parameter that is incorrect or unexpected.
2324 ;³ "Must specify COM1, COM2, COM3 or COM4"
2326 ;³ "Illegal device name"
2328 ;³ "Invalid baud rate specified"
2334 ;³ USAGE: To be determined at I2 time.
2337 ;³ CONVENTIONS: "looking_for" indicates the valid possibilities for the next parm.
2339 ;³ "current_parm" refers to the parm just returned. It can be an
2340 ;³ item tag, a type.
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
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.
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)
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.
2373 ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
2375 parse_parameters PROC
;AN000;
2377 ;determine if on a PS/2 for checking COMx parameters
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
2387 MOV looking_for
,first_parm
;AN000;looking_for:=first_parm
2389 .WHILE <eol_found NE true
> AND NEAR ;AN000;
2390 .WHILE <noerror
EQ true
> NEAR DO
;AN000;WHILE (NOT EOL) AND noerror=true DO
2394 ;calculate the displacement for the jump to appropriate case
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
2402 jump_table1
LABEL WORD ;AN000; ;these entries must be in same order as the values in list of equates for looking_for
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;
2425 com_keyword_or_baud_case: ;AN000;
2427 PUBLIC com_keyword_or_baud_case
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.
2434 CALL parse_parm
;AN000;/status allowed
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;
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;
2459 .IF <parser_return_code_AX
EQ end_of_command_line
> THEN
;AN000;
2461 MOV request_type
,com_status
;AN000;
2462 MOV eol_found
,true
;AN000;
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
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;
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
2484 ; baud: ;found a number that is a valid baud, know that have old com style com request
2488 .IF <parser_return_code_AX
EQ no_error
> THEN
;AN000;IF have a baud rate THEN (none of above, must be baud rate)
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
2497 MOV looking_for
,parity_or_null
;AN000;
2498 MOV request_type
,initialize_com_port
;AN000;
2507 CALL setup_invalid_parameter
;AN000;
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.
2524 PUBLIC com_keyword_case
2526 MOV parms
.parmsx_ptr
,OFFSET com_keywords_parmsx
;AN000;only com keywords are in the control blocks
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;
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
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
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
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
2565 PUSH CX ;save the loop index
2566 CALL parse_parm
;AN000;
2569 .IF <noerror
EQ true
> AND
2570 .IF <parser_return_code_AX
EQ no_error
> THEN
;AN000;
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;
2575 delete_parser_value_list_entry keywords
,current_parm
;AN000;
2578 .ELSEIF
<parser_return_code_AX
EQ end_of_command_line
> THEN
;AN000;
2580 .IF <baud_specified
EQ true
> THEN
;AN000;
2581 MOV request_type
,initialize_com_port
;AN000;
2583 MOV message
,OFFSET baud_rate_required
;AN000;
2586 MOV eol_found
,true
;AN000;
2590 CALL setup_invalid_parameter
;AN000;
2596 MOV looking_for
,eol
;AN000;if haven't already encountered an error then check for extraneous parms
2598 BREAK 0 ;AN000;com_keyword
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
2607 CALL parse_parm
;AN000;
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
2613 MOV looking_for
,eol
;AN000;
2615 .ELSEIF
<parser_return_code_AX
EQ end_of_command_line
> THEN
;AN000;encountered EOL
2617 MOV eol_found
,true
;AN000;
2621 CALL setup_invalid_parameter
;AN000;
2625 BREAK 0 ;status_or_eol ;AN000;
2629 parity_or_null_case:
2631 PUBLIC parity_or_null_case
2633 ;the parser control blocks have paritys as strings
2634 ;modify parser control blocks list of valid paritys based on the
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
2642 ; CASE current_parm=
2647 .IF <parser_return_code_AX
EQ end_of_command_line
> THEN
;AN000;valid
2649 MOV request_type
,initialize_com_port
2650 MOV eol_found
,true
;AN000;
2657 .IF <parser_return_code_AX
EQ no_error
> THEN
;AN000;IF have a parity THEN (none of above, must be parity)
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;
2672 CALL setup_invalid_parameter
;AN000;
2677 ENDCASE_5: ;current_parm
2680 BREAK 0 ;AN000;parity_or_null
2685 databits_or_null_case:
2688 PUBLIC databits_or_null_case
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.
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;
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
2704 ; CASE current_parm=
2709 .IF <parser_return_code_AX
EQ end_of_command_line
> THEN
;AN000;valid
2711 MOV request_type
,initialize_com_port
;AN000;
2712 MOV eol_found
,true
;AN000;
2720 .IF <parser_return_code_AX
EQ no_error
> THEN
;AN000;IF have a parity THEN (none of above, must be parity)
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;
2737 CALL setup_invalid_parameter
;AN000;
2742 ENDCASE_6: ;current_parm
2745 BREAK 0 ;AN000;databits_or_null
2749 stopbits_or_null_case:
2752 PUBLIC stopbits_or_null_case
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.
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;
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
2767 ; CASE current_parm=
2772 .IF <parser_return_code_AX
EQ end_of_command_line
> THEN
;AN000;valid
2774 MOV BYTE PTR request_type
,initialize_com_port
;AN000;
2775 MOV eol_found
,true
;AN000;
2784 .IF <parser_return_code_AX
EQ no_error
> THEN
;AN000;IF have a parity THEN (none of above, must be parity)
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;
2799 CALL setup_invalid_parameter
;AN000;
2804 ENDCASE_7: ;current_parm
2807 BREAK 0 ;AN000;stopbits_or_null
2812 P_case: ;P or eol valid
2817 ;P is in the parser control blocks' list of strings.
2819 CALL parse_parm
;AN000;
2820 ; CASE current_parm=
2828 .IF <parser_return_code_AX
EQ end_of_command_line
> THEN
;AN000;valid
2830 MOV eol_found
,true
;AN000;
2839 .IF <parser_return_code_AX
EQ no_error
> THEN
;AN000;found one of: p,e,b,r,n,none,off
2841 MOV looking_for
,eol
;AN000;found last positional
2842 MOV retry_requested
,true
2849 CALL setup_invalid_parameter
;AN000;
2854 ENDCASE_8: ;current_parm
2861 prn_kw_status_cp_cl_null_case:
2863 PUBLIC prn_kw_status_cp_cl_null_case
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.
2869 CALL parse_parm
;AN000;
2871 ; CASE current_parm=
2873 ; LPT_mode_keyword: ;nothing but printer keywords allowed
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
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
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
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
2902 .IF <match_found
EQ true
> THEN
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
2908 delete_parser_value_list_entry keywords
,current_parm
;AN000;
2909 INC DL ;AN000;found another keyword
2917 .IF <parser_return_code_AX
EQ end_of_command_line
> THEN
;AN000;valid
2919 ;had at least one keyword
2920 MOV request_type
,initialize_printer_port
;AN000;
2921 MOV eol_found
,true
;AN000;
2927 ; otherwise: ;wrong type of keywords, /STATUS etc.
2929 CALL setup_invalid_parameter
;AN000;
2935 CALL parse_parm
;AN000;
2938 .UNTIL
<DL EQ number_of_LPT_keywords
> OR ;AN000;
2939 .UNTIL
<eol_found
EQ true
> OR ;AN000;
2940 .UNTIL
<noerror
EQ false
> ;AN000;
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
2950 .ENDIF
;AN000;LPT_keyword
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
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
2967 .ENDIF
;/STATUS found ;AN000;
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
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;
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;
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
3011 .IF <parser_return_code_AX
EQ end_of_command_line
> THEN
;AN000;valid
3013 MOV request_type
,turn_off_reroute
;compatible with previous MODE ;AN000;
3014 MOV eol_found
,true
;AN000;
3021 ; codepage_keyword_out_of_order:
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"
3029 MOV message
,OFFSET Invalid_number_of_parameters
;AC007;
3030 MOV noerror
,false
;AC007;
3031 BREAK 10 ;AN000;CON_keyword
3037 ; REFRESH_out_of_order: ;AC007;forgot to include "CP"
3040 .IF <parm_list
[current_parm_DI
].item_tag
EQ REFRESH_item_tag
> THEN
;AC007;
3042 MOV message
,OFFSET Invalid_number_of_parameters
;AC007;
3043 MOV noerror
,false
;AC007;
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
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
3073 CALL setup_invalid_parameter
;AN000;
3079 ENDCASE_10: ;current_parm= ;AN000;
3080 BREAK 0 ;AN000;prn_kw_status_cp_cl_null_case:
3085 li_or_null_case: ;look for lines per inch or null, eol valid
3087 PUBLIC li_or_null_case
3090 CALL parse_parm
;AN000;
3091 ; CASE current_parm=
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
3098 MOV looking_for
,P
;AN000;
3106 .IF <parser_return_code_AX
EQ end_of_command_line
> THEN
;AN000;valid
3108 MOV request_type
,old_initialize_printer_port
;AN000;
3109 MOV eol_found
,true
;AN000;
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
3120 MOV looking_for
,P
;AN000;
3128 CALL setup_invalid_parameter
;AN000;
3132 ENDCASE_11: ;current_parm ;AN000;
3133 BREAK 0 ;AN000;li_or_null
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=
3148 .IF <parm_list
[current_parm_DI
].item_tag
EQ REFRESH_item_tag
> THEN
;AN000;
3150 MOV request_type
,codepage_refresh
;AN000;
3160 ;Have to parse ((cplist) [filename])
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
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
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 ")"
3196 CALL setup_invalid_parameter
;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;
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,
3218 CALL setup_invalid_parameter
;AN000;
3220 MOV request_type
,codepage_prepare
;AN000;if encountered an error won't continue anyways
3222 POP command_line
;AN000;continue parsing after the origional complex, should be eol
3224 MOV message
,OFFSET invalid_number_of_parameters
;AN000;should have found a complex
3225 MOV noerror
,false
;AN000;
3228 MOV looking_for
,eol
;AN000;
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;
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;
3248 CALL setup_invalid_parameter
;AN000;
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;
3265 MOV request_type
,codepage_status
;AN000;
3266 ;AX322; .IF <device_name EQ <OFFSET CON_str>> THEN
3267 MOV looking_for
,eol
;AC322;
3269 ;AX322; MOV looking_for,eol ;AN000;
3278 .IF <parser_return_code_AX
EQ end_of_command_line
> THEN
;AN000;
3280 MOV request_type
,codepage_status
;AN000;
3281 MOV eol_found
,true
;AN000;
3289 CALL setup_invalid_parameter
;AN000;
3293 ENDCASE_12: ;current_parm=
3301 codepage_case: ;found PRN, only valid parms are CODEPAGE, and /STATUS
3302 ;/STATUS is in the the parser control blocks
3304 CALL parse_parm
;AN000;
3305 ; CASE current_parm=
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
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;
3320 ; /STATUS: ;only CODEPAGE or end of line valid next
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;
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;
3337 CALL setup_invalid_parameter
;AN000;
3346 .IF <parser_return_code_AX
EQ end_of_command_line
> THEN
;AN000;
3348 MOV request_type
,codepage_status
;AN000;
3349 MOV eol_found
,true
;AN000;
3356 ; codepage_keyword_out_of_order:
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"
3364 MOV message
,OFFSET Invalid_number_of_parameters
;AC007;
3365 MOV noerror
,false
;AC007;
3366 BREAK 13 ;AN000;CON_keyword
3372 ; REFRESH_out_of_order: ;AC007;forgot to include "CP"
3375 .IF <parm_list
[current_parm_DI
].item_tag
EQ REFRESH_item_tag
> THEN
;AC007;
3377 MOV message
,OFFSET Invalid_number_of_parameters
;AC007;
3378 MOV noerror
,false
;AC007;
3387 CALL setup_invalid_parameter
;AN000;
3398 con_kwrd_status_or_cp_case:
3400 PUBLIC con_kwrd_status_or_cp_case
3402 MOV parms
.parmsx_ptr
,OFFSET con_parmsx
3403 CALL parse_parm
;AN000;
3405 ; CASE current_parm=
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
3414 MOV looking_for
,codepage_prms
;AN000;
3422 .IF <parser_return_code_AX
EQ end_of_command_line
> THEN
;AN000;
3424 MOV request_type
,all_con_status
;AN000;found only CON on the command line
3425 MOV eol_found
,true
;AN000;
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;
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
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
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;
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
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
3480 ; REFRESH: ;AC007;forgot to include "CP"
3483 .IF <parm_list
[current_parm_DI
].item_tag
EQ REFRESH_item_tag
> THEN
;AC007;
3485 MOV message
,OFFSET Invalid_number_of_parameters
;AC007;
3486 MOV noerror
,false
;AC007;
3495 CALL setup_invalid_parameter
;AN000;
3503 BREAK 0 ;AN000;con_kwrd_status_or_cp_case:
3508 con_keyword_case: ;found one, it has been deleted from the parser control blocks
3509 PUBLIC con_keyword_case
3511 MOV slash_status
,deleted
;AN000;remove /STA /STAT and STATUS
3512 MOV slash_stat
,deleted
;AN000;
3513 MOV slash_sta
,deleted
;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;
3521 CALL parse_parm
;AN000;
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;
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;
3535 delete_parser_value_list_entry keywords
,current_parm
;AN000;
3544 .IF <parser_return_code_AX
EQ end_of_command_line
> THEN
;AN000;
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;
3551 MOV message
,OFFSET rate_and_delay_together
;RATE and DELAY must be specified together
3561 CALL setup_invalid_parameter
;AN000;
3570 MOV looking_for
,eol
;AN000;check for extraneous parms
3572 BREAK 0 ;AN000;CON_keyword
3577 sd_or_dl_or_eol_case:
3579 PUBLIC sd_or_dl_or_eol_case
3581 ;have found a screen mode, now may find sd, dl, or eol
3583 CALL parse_parm
;AN000;
3584 ; CASE current_parm=
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;
3591 MOV looking_for
,T_or_EOL
;AN000;request_type already set
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;
3602 MOV looking_for
,eol
;AN000;request_type already set
3611 .IF <parser_return_code_AX
EQ end_of_command_line
> THEN
;AN000;
3613 MOV eol_found
,true
;AN000;request_type already set
3619 ; otherwise: regardless of what follows must have a parm here, didn't so yell
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;
3625 CALL setup_invalid_parameter
;AN000;some bogus value or string
3632 BREAK 0 ;AN000;sd_or_dl_or_null
3638 PUBLIC sd_or_dl_case
3640 ;have no first parm, now must find shift direction or screen lines
3643 CALL parse_parm
;AN000;
3644 ; CASE current_parm=
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;
3651 MOV looking_for
,T_or_EOL
;AN000;
3652 MOV request_type
,old_video_mode_set
;AN000;
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;
3664 MOV request_type
,old_video_mode_set
;AN000;
3665 MOV looking_for
,eol
;AN000;
3674 .IF <parser_return_code_AX
EQ end_of_command_line
> THEN
;AN000;
3676 MOV message
,OFFSET invalid_number_of_parameters
;AN000;
3677 MOV noerror
,false
;AN000;
3678 MOV eol_found
,true
;AN000;
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;
3690 CALL setup_invalid_parameter
;AN000;some bogus value or string
3695 BREAK 0 ;AN000;sd_or_dl
3702 CALL parse_parm
;AN000;
3704 ; CASE current_parm=
3708 .IF <parm_list
[current_parm_DI
].item_tag
EQ T_item_tag
> THEN
;AN000;
3710 MOV looking_for
,eol
;AN000;request_type already set
3717 .IF <parser_return_code_AX
EQ end_of_command_line
> THEN
;AN000;
3719 MOV eol_found
,true
;AN000;request_type already set
3727 CALL setup_invalid_parameter
;AN000;
3735 device_name_or_eol_case: ;have only /status so far
3737 ;The device names are in the parser control blocks
3740 ; CASE current_parm=
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;
3753 MOV looking_for
,eol
;AN000;
3754 MOV request_type
,com_status
;AN000;
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;
3772 MOV looking_for
,eol
;AN000;
3773 MOV request_type
,printer_status
;AN000;
3782 .IF <parm_list
[current_parm_DI
].item_tag
EQ CON_item_tag
> THEN
;AN000;
3784 MOV looking_for
,eol
;AN000;
3785 MOV request_type
,all_con_status
;AN000;
3793 .IF <parser_return_code_AX
EQ end_of_command_line
> THEN
;AN000;
3795 MOV request_type
,status_for_everything
;AN000;
3796 MOV eol_found
,true
;AN000;
3804 CALL setup_invalid_parameter
;AN000;
3808 BREAK 0 ;AN000;device_name_or_eol
3811 first_parm_case: ;AN000;
3814 PUBLIC first_parm_case
3816 ;set up for calls to system parser
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;
3821 SUB DI,TYPE parm_list_entry
;AN000;DI is negative, set up for first call to parse_parm
3823 MOV parms
.parmsx_ptr
,OFFSET parmsx
;AN000;set up parms block for parser input
3825 CALL parse_parm
;AN000;parse first parm, fill in "parm_list[current_parm_DI]" with the results
3827 ; CASE current_parm=
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;
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;
3847 ; null: ;no first parm
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
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;
3862 screen_modes: ;first parm is 80, BW80, MONO etc.
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;
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;
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;
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;
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
3940 ;have control blocks set up to find COM strings as value of keyword
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;
3960 MOV looking_for
,eol
;AN000;
3961 MOV request_type
,printer_reroute
;AN000;
3962 MOV reroute_requested
,true
;AN000;
3963 MOV device_type
,LPTX
3967 MOV message
,OFFSET com1_or_com2
;AN000;"Must specify COM1, COM2, COM3 or COM4"
3973 ; LPTX,: found "LPTX," so chars per line has been skipped
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;
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;
4010 ; need to use colon as a delimeter in following cases
4012 modify_parser_control_block seperator_list
,addd
,colon
;AN000;want to stop on colons
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
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;
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
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;
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
4076 .IF <parm_list
[current_parm_DI
].item_tag
EQ PRN_item_tag
> THEN
;AN000;
4078 MOV looking_for
,codepage
;AN000;
4079 MOV device_name
,OFFSET LPT1_str
;AN000;
4087 .IF <parm_list
[current_parm_DI
].item_tag
EQ CON_item_tag
> THEN
;AN000;
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
4099 ; eol: ;no parms specified
4101 .IF <parser_return_code_AX
EQ end_of_command_line
> THEN
;AN000;
4103 MOV request_type
,status_for_everything
;AN000;
4104 MOV eol_found
,true
;AN000;
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;
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
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
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
4164 ; otherwise: ;first parm was nothing recognizable
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
4182 CALL setup_invalid_parameter
;AN000;
4189 BREAK 0 ;AN000;first_parm
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;
4200 MOV eol_found
,true
;AN000;
4206 ENDCASE_0: ;AN000;looking_for=
4210 .IF <message NE no_message
> THEN
4216 parse_parameters ENDP
4224 ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
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.
4237 ;³ INPUT: action (in BX) - A scalar immediate indicating whether the seperator
4238 ;³ is to be added or deleted.
4240 ;³ seperator_charactor (in AL) - The seperator character to be added or
4241 ;³ deleted from the seperator list
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
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
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
4301 ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
4304 seperator_list PROC
NEAR
4308 SHL BX,1 ;AN000;BX=word displacement into jump table
4309 JMP jump_table2
[BX] ;AN000;jump to appropriate jump
4311 jump_table2
LABEL WORD
4313 DW OFFSET add_case
;AN000;
4314 DW OFFSET delete_case
;AN000;
4321 MOV BL,parms
.seperators_len
;AN000;BX=length of seperators list
4323 MOV [BX].seperators
,AL ;AN000;overwrite blank with AL
4324 INC parms
.seperators_len
;AN000;adjust for added seperator
4330 ;scan to seperator char to be deleted
4335 ADD DI,OFFSET seperators
;ES:DI=>seperator list
4337 DEC DI ;AN000;DI=>char to be deleted
4338 MOV ES:[DI],BYTE PTR blank
;duplicate but harmless blank
4351 ;-------------------------------------------------------------------------------
4352 ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
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.
4365 ;³# INPUT: action (in BX) - A scalar immediate indicating whether the keyword
4366 ;³# is to be added or deleted.
4369 ;³# string (in RL) - A scalar immediate or OFFSET, indicating/pointing
4370 ;³# to the keyword or set of keywords to be added
4401 ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
4406 ; use result.synonym to find the the keyword to delete
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
4416 ;-------------------------------------------------------------------------------
4419 ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
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.
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.
4485 ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
4491 ADD current_parm_DI
, TYPE parm_list_entry
4493 PUSH current_parm_DI
;save index into parsed parms list
4494 PUSH BX ;save the address of the parsed parms list
4496 MOV DI,OFFSET PARMS
; ES:DI=>PARSE CONTROL DEFINITON
4497 MOV SI,COMMAND_line
; DS:SI=>unparsed portion of the command line
4499 MOV CX,ordinal
; OPERAND ORDINAL
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
4505 POP BX ;restore parm_list
4506 POP current_parm_DI
;nothing returned in DI anyway
4508 MOV CX,command_line
;AN000;CX=>first char of the bad parm
4509 MOV offending_parameter_ptr
,CX ;AN000;set pointer in message
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
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
4537 ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
4539 ;³ RESET_PARM_POINTER
4540 ;³ ------------------
4544 ;³ The last entry in the parm list is decremented, which
4545 ;³ will put the results of the next parse over that entry.
4560 ;³ RETURN: The current parm list entry is filled with recognizable trash
4602 ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
4604 reset_parm_pointer PROC
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;
4620 reset_parm_pointer ENDP
;AN000;
4623 PRINTF_CODE ENDS
;AN000;