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