summaryrefslogtreecommitdiff
path: root/v4.0/src/CMD/MODE/INVOKE.ASM
diff options
context:
space:
mode:
Diffstat (limited to 'v4.0/src/CMD/MODE/INVOKE.ASM')
-rw-r--r--v4.0/src/CMD/MODE/INVOKE.ASM1549
1 files changed, 1549 insertions, 0 deletions
diff --git a/v4.0/src/CMD/MODE/INVOKE.ASM b/v4.0/src/CMD/MODE/INVOKE.ASM
new file mode 100644
index 0000000..2d836c3
--- /dev/null
+++ b/v4.0/src/CMD/MODE/INVOKE.ASM
@@ -0,0 +1,1549 @@
1 ;AN000;
2;m ;AN000;
3 PAGE ,132 ; ;AN000;
4 TITLE ANALYZE_AND_INVOKE - call appropriate routine based on request ;AN000;
5.XLIST ;AN000;
6 INCLUDE STRUC.INC ;AN000;
7.LIST ;AN000;
8;.SALL ;AN000;
9
10
11;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000;
12;º º ;AN000;
13 ;AN000;
14; AC000 - P2944: Was displaying the lines and column settings for CON even
15; though couldn't get them when ANSI.SYS isn't loaded. Now
16; check if ANSI loaded before trying to display the settings.
17
18; AC002 - P3331: ES was getting zeroed, which caused problems later in MODECP.
19
20; AC003 - P3541: The retry status routine was assuming different format than
21; the retry type byte was in. I fixed the status checking
22; routine.
23
24; AX004 - P3982: The screen was being cleared after the "Unable to shift
25; screen ..." message.
26
27; AC005 - P4934: The multiplex number for ANSI.SYS was changed due to a
28; 5/20/88 conflict with a Microsoft product that has already been
29; shipped.
30
31;º º ;AN000;
32;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000;
33 ;AN000;
34 ;AN000;
35;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000;
36;º º ;AN000;
37 ;AN000;
38GET_EXTENDED_ERROR MACRO ;AN000;
39 ;AN000;
40MOV BX,0 ;level for 3.00 to 4.00 ;AN000;
41MOV AH,59H ;function number for get extended error ;AN000;
42INT 21H ;AN000;
43 ;AN000;
44ENDM ;AN000;
45 ;AN000;
46 ;AN000;
47BREAK MACRO X ;AN000;
48 JMP endcase_&X ;AN000;
49ENDM ;AN000;
50 ;AN000;
51 ;AN000;
52 ;AN000;
53 ;AN000;
54DISPLAY MACRO MESSAGE ;AN000;
55 MOV DX,OFFSET MESSAGE ;AN000;
56 CALL PRINTF ;AN000;
57ENDM ;AN000;
58 ;AN000;
59 ;AN000;
60;º º ;AN000;
61;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ M A C R O S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000;
62 ;AN000;
63 ;AN000;
64 ;AN000;
65;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000;
66;º º ;AN000;
67 ;AN000;
68INCLUDE modequat.inc ;AN000;
69 ;AN000;
70ANSIINT2F EQU 1AH ;INT 2F multiplex number for ANSI.SYS ;AC005;
71ASCII_0 EQU "0" ;change one based binary printer number into ASCII printer number ;AN000;
72ASCII_1 EQU "1" ;AN000;
73B EQU 2 ;retry setting ;AN000;
74blink EQU 0000H ;value for flags field of IOCTL data block ;AN000;
75busy_retry_active EQU 2 ;indicates bust retry is active ;AN000;
76check_installed EQU 0 ;request installed state for INT2F (ANSI) ;AN000;
77;COLUMNS EQU 00000010B ; ;AN000;
78com1_retry_type_status EQU 0 ;request for retry status on com1 ;AN000;
79com2_retry_type_status EQU 2 ;request for retry status on com2 ;AN000;
80com3_retry_type_status EQU 4 ;request for retry status on com3 ;AN000;
81com4_retry_type_status EQU 6 ;request for retry status on com4 ;AN000;
82display_device EQU 3 ;type of device, used for calls to IOCTL 0C function ;AN000;
83E EQU 1 ;retry setting ;AN000;
84error_retry_active EQU 1 ;indicates error retry is active ;AN000;
85false EQU 00H ;AN000;
86font_not_loaded EQU 31 ;return from IOCTL 0C (via ext err) indicating DISPLAY.SYS don't have necessary font loaded
87get_current_settings EQU 07FH ;request for IOCTL 0C call ;AN000;
88installed EQU 0FFH ;return from get_installed_state function ;AN000;
89intense EQU 0001H ;value for flags field of IOCTL data block ;AN000;
90IOCTL0C EQU [SI] ;AN000;
91;LINES EQU 00000001B ;flag for IOCTL0C_functions_requested ;AN000;
92lowercase EQU 020H ;when ORed with char value it changes it to lowercase ;AN000;
93LPT1 EQU 1 ;mask for input to display_device_reroute_status, see modeecho ;AN000;
94LPT2 EQU 2 ;mask for input to display_device_reroute_status, see modeecho ;AN000;
95LPT3 EQU 4 ;mask for input to display_device_reroute_status, see modeecho ;AN000;
96lpt1_retry_type_status EQU 0 ;request for retry status on lpt1 ;AN000;
97lpt2_retry_type_status EQU 1 ;request for retry status on lpt2 ;AN000;
98lpt3_retry_type_status EQU 2 ;request for retry status on lpt3 ;AN000;
99MODE_INT2F_MULTIPLEX_NUMBER EQU 0 ;AN000;
100no_retry EQU 3 ;retry setting ;AN000;
101no_retry_active EQU 0 ;indicates no retry active on device ;AN000;
102not_supported_on_machine EQU 29 ;return from IOCTL 0C (via ext err) indicating hardware don't support the function ;AN000;
103parm_list_BX EQU [BX] ;AN000;
104prn_ports_attached EQU CL ;used in printer_reroute_case and check_prn_ports_attached
105R EQU 3 ;retry setting for com ports ;AN000;
106ready_retry_active EQU 3 ;indicates ready retry is active ;AN000;
107redirected EQU 2 ;network puts a 2 in printer address word for printers redirected
108rerouted_printer_mask EQU BL ;holds the mask to check ptsflag1 with, see modeecho.asm
109returned_retry_type EQU AL ;holds the returned status value ;AN000;
110set_display_characteristics EQU 05FH ;request for IOCTL 0C call ;AN000;
111status EQU 0 ;request for modecp ;AN000;
112StdOut equ 1 ;AN000;
113text EQU 01 ;mode field of IOCTL 0C call indicating screen mode type (vs APA mode) ;AN000;
114true EQU 0FFH ;AN000;
115unspecified EQU 0FFH ;state of item_tags in parm_list if the positonal parm was not specified ;AN664;
116 ;AN000;
117;º º ;AN000;
118;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000;
119 ;AN000;
120 ;AN000;
121;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000;
122;º º ;AN000;
123 ;AN000;
124 ;AN000;
125des_strt_packet STRUC ;AN000;
126 des_strt_pkfl DW 0000 ;assume a filename specified ;AN000;
127 des_strt_pklen DW 02 ;start with size of 'des_strt_pknum' ;AN000;
128 des_strt_pknum DW 0 ;number of cp numbers in the packet ;AN000;
129 des_strt_pkcp1 DW -1 ;code page number for 1st slot ;AN000;
130 des_strt_pkcp2 DW -1 ;AN000;
131 des_strt_pkcp3 DW -1 ;AN000;
132 des_strt_pkcp4 DW -1 ;AN000;
133 des_strt_pkcp5 DW -1 ;AN000;
134 des_strt_pkcp6 DW -1 ;AN000;
135 des_strt_pkcp7 DW -1 ;AN000;
136 des_strt_pkcp8 DW -1 ;AN000;
137 des_strt_pkcp9 DW -1 ;AN000;
138 des_strt_pkcpA DW -1 ;AN000;
139 des_strt_pkcpB DW -1 ;AN000;
140 des_strt_pkcpC DW -1 ;code page number for 12th slot ;AN000;
141des_strt_packet ENDS ;AN000;
142 ;AN000;
143;The info_level is 0 on input, and contains a return code on exit. If carry set ;AN000;
144;and 2 then the requested function is not supported on this machine. If carry ;AN000;
145;set and 3 then DISPLAY.SYS does not have the appropriate RAM font loaded to ;AN000;
146;support the requested function. ;AN000;
147 ;AN000;
148IOCTL0C_def STRUC ;AN000;
149 ;AN000;
150info_level DB 0 ;return code: 0 on input, 1 ?, 2 or 3 as returns ;AN000;
151 DB 0 ;reserved ;AN000;
152data_length DW 14 ;length of the data block not including this field ;AN000;
153flags DW 0 ;filled with intense or blink ;AN000;
154mode DB text ;filled with text, may be returned as 2 which means APA ;AN000;
155 DB 0 ;reserved ;AN000;
156colors DW 16 ;0 means monochrome ;AN000;
157 DW bogus ;width in pixels for APA modes ;AN000;
158 DW bogus ;length in pixels for APA modes ;AN000;
159cols DW bogus ;nubmer of text columns ;AN000;
160rows DW bogus ;number of text rows ;AN000;
161 ;AN000;
162IOCTL0C_def ENDS ;AN000;
163 ;AN000;
164INCLUDE COMMON.STC ;includes the following strucs ;AN000;
165 ;AN000;
166;codepage_parms STRUC ;AN000;
167; cp_device DW ? ;AN000;
168; des_pack_ptr DW ? ;AN000;
169; font_filespec DW ? ;AN000;
170; request_typ DW ? ;AN000;
171;codepage_parms ENDS ;AN000;
172 ;AN000;
173 ;AN000;
174;parm_list_entry STRUC ;used by parse_parameters and invoke ;AN000;
175 ;AN000;
176;parm_type DB bogus ;AN000;
177;item_tag DB 0FFH ;AN000;
178;value1 DW bogus ;used only for filespecs and code page numbers ;AN000;
179;value2 DW bogus ;used only for filespecs and code page numbers ;AN000;
180;keyword_switch_ptr DW 0 ;AN000;
181 ;AN000;
182;parm_list_entry ENDS ;AN000;
183 ;AN000;
184 ;AN000;
185;º º ;AN000;
186;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000;
187 ;AN000;
188ROM SEGMENT AT 0 ;AN000;
189 ORG 530H ;AN000;
190resseg LABEL DWORD ;location of resident mode code vector ;AN000;
191ROM ENDS ;AN000;
192 ;AN000;
193 ;AN000;
194 PAGE ;AN000;
195PRINTF_CODE SEGMENT PUBLIC ;AN000;
196 ASSUME CS:PRINTF_CODE,DS:PRINTF_CODE,SS:PRINTF_CODE ;AN000;
197 ;AN000;
198 ;AN000;
199;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000;
200;º º ;AN000;
201 ;AN000;
202PUBLIC analyze_and_invoke ;make available to "MAIN" ;AN000;
203PUBLIC busy_retry_active ;used by modecom ;AN000;
204PUBLIC cp_cb ;modepars needs to set the font file name ;AN000;
205PUBLIC error_retry_active ;used by modecom ;AN000;
206PUBLIC initialize_printer_port_case ;AN000;
207PUBLIC no_retry_active ;used by modecom ;AN000;
208PUBLIC parm_list_holder ;used by modeprin ;AN664;
209PUBLIC ready_retry_active ;used by modecom ;AN000;
210 ;AN000;
211;º º ;AN000;
212;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000;
213 ;AN000;
214 ;AN000;
215;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000;
216;º º ;AN000;
217 ;AN000;
218EXTRN ANSI_not_loaded:BYTE ;see modedefs.inc ;AN000;
219EXTRN BAUD_equal:BYTE ;the string "BAUD=", see modepars ;AN000;
220EXTRN BAUD_index:WORD ;see modecom.asm ;AN000;
221EXTRN B_str:BYTE ;see MODEPARS.ASM ;AN000;
222EXTRN BW40:NEAR ;see modedefs.inc ;AN000;
223EXTRN BW40_item_tag:ABS ;see MODEPARS.ASM ;AN000;
224EXTRN BW80:NEAR ;see modedefs.inc ;AN000;
225EXTRN BW80_item_tag:ABS ;see MODEPARS.ASM ;AN000;
226EXTRN busy_status:ABS
227EXTRN close:ABS ;EQU 3EH ;CLOSE A FILE HANDLE,see modecpeq.inc ;AN000;
228EXTRN columns_ptr:WORD ;see modesubs.inc ;AN000;
229EXTRN CO40:NEAR ;see modedefs.inc ;AN000;
230EXTRN CO40_item_tag:ABS ;see MODEPARS.ASM ;AN000;
231EXTRN CO80:NEAR ;see modedefs.inc ;AN000;
232EXTRN CO80_item_tag:ABS ;see MODEPARS.ASM ;AN000;
233EXTRN codepage_index_holder:WORD ;see MODEPARS.ASM ;AN000;
234EXTRN codepage_item_tag:ABS ;see MODEPARS.ASM ;AN000;
235EXTRN columns_equal:BYTE ;see MODEPARS.ASM ;AN000;
236EXTRN columns_equal_msg:BYTE ;see MODEdefS.inc ;AN000;
237EXTRN columns_holder:BYTE ;holder for printer chars per line (binary) value, see modeprin ;AN000;
238EXTRN COLS_equal:BYTE ;see MODEPARS.ASM ;AN000;
239EXTRN columns_item_tag:ABS ;see MODEPARS.ASM ;AN000;
240EXTRN COM1_str:BYTE ;see MODEPARS.ASM ;AN000;
241EXTRN COM2_str:BYTE ;see MODEPARS.ASM ;AN000;
242EXTRN COM3_str:BYTE ;see MODEPARS.ASM ;AN000;
243EXTRN COM4_str:BYTE ;see MODEPARS.ASM ;AN000;
244EXTRN COMX:ABS ;one of two possible values for "device_type"
245EXTRN CON_str:BYTE ;"CON"see MODEPARS.ASM ;AN000;
246EXTRN CRLF:BYTE ;see MODEDEFS.ASM, used before "Invalid parameter - " for consistent spacing ;AN000;
247EXTRN data_bits_index:WORD ;see modecom.asm ;AN000;
248EXTRN DATA_equal:BYTE ;see MODEPARS.ASM ;AN000;
249EXTRN DELAY_equal:BYTE ;see MODEPars.asm ;AN000;
250EXTRN DEL_equal:BYTE ;see MODEPARS.ASM ;AN000;
251EXTRN des_start_packet:WORD ;AX000; des_strt_packet <>, see modepars ;AN000;
252EXTRN device:BYTE ;holder of com number for invoke and modeecho ;AN000;
253EXTRN device_name:WORD ;AN000;
254EXTRN device_type:BYTE ;see MODEPARS.ASM ;AN000;
255EXTRN dev_name_size:WORD ;see MODEPARS.ASM ;AN000;
256EXTRN dev_open_mode:ABS ;read write access ;AN000;
257EXTRN display_printer_reroute_status:NEAR ;see modeecho.asm
258EXTRN eighty_item_tag:ABS ;see MODEPARS.ASM ;AN000;
259EXTRN eighty_str:BYTE ;see MODEPARS.ASM ;AN000;
260EXTRN error_status:ABS ;see MODEPRIN
261EXTRN five_char_underline:BYTE ;see modedefs.inc ;AN000;
262EXTRN four_char_underline:BYTE ;see modedefs.inc ;AN000;
263EXTRN function_not_supported:BYTE ;see modedefs.inc ;AN000;
264EXTRN err1:BYTE ;see modedefs.inc
265EXTRN E_str:BYTE ;see MODEPARS.ASM ;AN000;
266EXTRN fourty_item_tag:ABS ;see MODEPARS.ASM ;AN000;
267EXTRN fourty_str:BYTE ;see MODEPARS.ASM ;AN000;
268EXTRN handle_40_or_80:NEAR ;see modescrn ;AN000;
269EXTRN illegal_device_ptr:WORD ;see modesubs.inc
270EXTRN keyword:ABS ;see MODEPARS ;AN000;
271EXTRN invalid_number_of_parameters:WORD ;AN000;
272;EXTRN invalid_parameter:WORD ;<CR><LF>"Invalid parameter '????'",beep ;AN000;
273EXTRN len_COMX_str:ABS ;see MODEPARS.ASM ;AN000;
274EXTRN len_CON_str:ABS ;see MODEPARS.ASM ;AN000;
275EXTRN len_LPTX_str:ABS ;see MODEPARS.ASM ;AN000;
276EXTRN L_item_tag:ABS ;see MODEPARS.ASM ;AN000;
277EXTRN LINES_equal:BYTE ;see MODEPARS.ASM ;AN000;
278EXTRN LINES_equal_msg:BYTE ;see MODEDEFS.INC ;AN000;
279EXTRN lines_item_tag:ABS ;see MODEPARS.ASM ;AN000;
280EXTRN long_underline:BYTE ;see modedefs.inc ;AN000;
281EXTRN lptno:BYTE ;holder of printer number for invoke and modeecho ;AN000;
282EXTRN lpt1_retry_type:BYTE ;see RESCODE
283EXTRN LPT1_str:BYTE ;see MODEPARS.ASM ;AN000;
284EXTRN LPT2_str:BYTE ;see MODEPARS.ASM ;AN000;
285EXTRN LPT3_str:BYTE ;see MODEPARS.ASM ;AN000;
286EXTRN notredpt:BYTE ;printer number in "LPTn not rerouted"
287EXTRN max_request_type:ABS ;see MODEPARS.ASM ;AN000;
288EXTRN modecom:NEAR ;AN000;
289EXTRN modecp:NEAR ;AN000;
290EXTRN modeecho:NEAR ;AN000;
291EXTRN modeecno:NEAR ;AN000;
292EXTRN modeprin:NEAR ;AN000;
293EXTRN modify_resident_code:NEAR ;see modeprin ;AN000;
294EXTRN MONO:NEAR ;see modedefs.inc ;AN000;
295EXTRN MONO_item_tag:ABS ;see MODEPARS.ASM ;AN000;
296EXTRN no_retry_flag:ABS ;see MODEPRIN
297EXTRN noerror:BYTE ;AN000;
298EXTRN none_item_tag:ABS ;see modepars.asm ;AN000;
299EXTRN none_str:BYTE ;see MODEPARS.ASM ;AN000;
300EXTRN offending_parameter:BYTE ;see MODEMES ;AN000;
301EXTRN OFF_item_tag:ABS ;see pares.asm ;AN000;
302EXTRN off_str:BYTE ;see MODEPARS.ASM ;AN000;
303EXTRN onethirtytwo_item_tag:ABS ;see modepars.asm ;AN000;
304EXTRN ON_item_tag:ABS ;see pares.asm ;AN000;
305EXTRN on_str:BYTE ;see MODEPARS.ASM ;AN000;
306EXTRN open:ABS ;open a device handle, see modecpeq.inc ;AN000;
307EXTRN parity_equal:BYTE ;see modepars.asm ;AN000;
308EXTRN parity_index:WORD ;see modecom ;AN000;
309EXTRN parm2:BYTE ;see MODEPRIN.ASM ;AN000;
310EXTRN parm3:BYTE ;see MODEPARS.ASM ;AN000;
311;EXTRN parm_lst:BYTE ;parm_list_entry max_pos_parms DUP (<>), see MODEPARS.ASM ;AN000;
312EXTRN parms_form:byte ;indicator of whether the parameters were entered as positionals or as keywords ;AN000;
313EXTRN pbaud_ptr:WORD ;AN000;;pointer to the baud rate string in the initialization message for COM, see modesubs.inc
314EXTRN pdata:BYTE ;see modesubs.inc ;AN000;
315EXTRN pparity_ptr:WORD ;see modesubs.inc ;AN000;
316EXTRN pparm:BYTE ;used by modecom and for message, see modesubs.inc ;AN000;
317EXTRN prepare:ABS ;AN000;
318EXTRN prepare_item_tag:ABS ;see MODEPARS.ASM ;AN000;
319EXTRN PRINTR:WORD ;PRINTER BASE (40:8), HOLDS PORT ADDRESSES OF PRINTER CARDS
320EXTRN pstop_ptr:WORD ;see modesubs.inc ;AN000;
321EXTRN PRINTF:NEAR ;AN000;
322EXTRN rate_equal:BYTE ;see MODEPARS.ASM ;AN000;
323EXTRN ready_status:ABS ;see modeprin
324EXTRN redpt:BYTE ;printer number (n) in message "LPTn rerouted to COMm"
325EXTRN refresh:ABS ;AN000;
326EXTRN retry_item_tag:ABS ;see MODEPARS.ASM ;AN000;
327EXTRN request_type:BYTE ;see "MODEPARS.ASM" ;AN000;
328EXTRN retry_equal:BYTE ;see MODEDEFS.INC ;AN000;
329EXTRN retry_equal_str:BYTE ;AN000;
330EXTRN retry_index:WORD ;see MODECOM.ASM ;AN000;
331EXTRN retry_type_ptr:WORD ;see MODESUBS.INC ;AN000;
332EXTRN row_ptr:WORD ;see modesubs.inc ;AN000;
333EXTRN row_type:WORD ;see modesubs.inc ;AN000;
334EXTRN R_item_tag:ABS ;see MODEPARS.ASM ;AN000;
335EXTRN R_str:BYTE ;see MODEPARS.ASM ;AN000;
336EXTRN Required_font_not_loaded:BYTE ;see modedefs.asm ;AN000;
337EXTRN res_com_retry_type:ABS ;see RESCODE.SAL ;AN000;
338;EXTRN res_lpt_retry_type:ABS ;see RESCODE.SAL ;AN000;
339EXTRN select:ABS ;request type for 'modecp' ;AN000;
340EXTRN select_item_tag:ABS ;see MODEPARS.ASM ;AN000;
341EXTRN serial_base:WORD ;see modecom ;AN000;
342EXTRN set_con_features:ABS ;AN000;
343EXTRN set_retry_type:NEAR ;see modeprin ;AN000;
344EXTRN shift_screen:NEAR ;see modescrn ;AN000;
345EXTRN stat_dev_ptr:WORD ;see modedefs.inc ;AN000;
346EXTRN status_for_device:BYTE ;"Status for device %1:" see modedefs.inc ;AN000;
347EXTRN status_for_everything:ABS ;AN000;
348EXTRN stop_bits_index:WORD ;see modecom.asm ;AN000;
349EXTRN stop_equal:BYTE ;"STOP=", see modepars ;AN000;
350EXTRN typamat:NEAR ;see "typamat.asm" ;AN000;
351 ;AN000;
352;possible values of "request_type" ;AN000;
353 ;AN000;
354EXTRN all_con_status:ABS ;AN000;
355EXTRN codepage_prepare:ABS ;AN000;
356EXTRN codepage_refresh:ABS ;AN000;
357EXTRN codepage_select:ABS ;AN000;
358EXTRN codepage_status:ABS ;AN000;
359EXTRN codepage_prepared_status:ABS ;AN000;
360EXTRN codepage_selected_status:ABS ;AN000;
361EXTRN com_status:ABS ;AN000;
362;EXTRN con_status:ABS ;AN000;
363EXTRN initialize_com_port:ABS ;AN000;
364EXTRN initialize_printer_port:ABS ;AN000;
365EXTRN old_initialize_printer_port:ABS ;AN000;
366EXTRN old_video_mode_set:ABS ;AN000;
367EXTRN printer_reroute:ABS ;AN000;
368EXTRN printer_status:ABS ;AN000;
369EXTRN turn_off_reroute:ABS ;AN000;
370 ;AN000;
371 ;AN000;
372;º º ;AN000;
373;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000;
374 ;AN000;
375 ;AN000;
376;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000;
377;º º ;AN000;
378 ;AN000;
379ANSI_installed DB false ;boolean indicator of whether ANSI.SYS is installed ;AN000;
380columns_specified DB false ;indicates if columns= was on the command line, see set_con_features_case;AN000;
381code_page_numbers_encountered DB 0 ;AN000;
382cp_cb codepage_parms <> ;codepage subroutine parameter block ;AN000;
383com_ports_attached DB 0 ;number of com ports in the machine
384current_packet_cp_number DW -2 ;adjustment for accessing current 'des_strt_pkcp?' in 'des_start_packet' ;AN000;
385delay_holder DB 1 ;holder for binary form of delay requested ;AN000;
386device_request DB ? ;holds device request value ;AN000;
387max_pknum EQU ($ - OFFSET des_start_packet.des_strt_pkcp1)/2 ;most cp numbers can send at once ;AN000;
388;IOCTL0C_functions_requested DB 0 ;for displaying messages, flag byte indicating IOCTL functions requested ;AN000;
389need_typamat_call DB false ;boolean for saving up delay and rate settings ;AN000;
390need_IOCTL0C DB false ;boolean for saving up parts of an IOCTL 0CH call ;AN000;
391parm_list_holder DW bogus ;holder for address of parsed parameter list for when BX is needed elsewhere ;AN000;
392parm_list_index_holder DW bogus ;holder for index of parsed parameter list for when DI is needed elsewhere ;AN000;
393i DB 0 ;index for status loop ;AN000;
394rate_holder DB 32 ;holder for binary form of rate value ;AN000;
395row_value DB ? ;holder for binary form of row value during status display ;AN000;
396 ;AN000;
397IOCTL0C_data_block IOCTL0C_def<> ;AN000;
398
399PUBLIC IOCTL0C_data_block
400 ;AN000;
401;º º ;AN000;
402;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000;
403 ;AN000;
404check_ANSI_installed PROC NEAR ;See if ANSI.SYS is installed ;AC001;
405
406 MOV AH,ANSIINT2F ;AC001;
407 MOV AL,check_installed ;AC001;
408 INT 2FH ;AC001;
409 .IF <AL EQ installed> THEN ;AC001;
410 MOV ANSI_installed,true ;initialized to false, so no ELSE needed ;AC001;
411 .ENDIF
412
413check_ANSI_installed ENDP ;AC001;
414
415;------------------------------------------------------------------------------
416
417
418
419setup_device_name PROC NEAR ;AN000;
420 ;AN000;
421MOV DX,device_name ;DX=pointer to ASCIIZ device name ;AN000;
422MOV cp_cb.cp_device,DX ;Set the pointer to the device name ASCIIZ in the parameter block for 'modecp'. ;AN000;
423 ;AN000;
424RET ;AN000;
425 ;AN000;
426setup_device_name ENDP ;AN000;
427 ;AN000;
428;------------------------------------------------------------------------------- ;AN000;
429 ;AN000;
430 ;AN000;
431do_IOCTL0C PROC NEAR ;AN000;
432PUBLIC DO_IOCTL0C ;AN000;
433 MOV AH,open ;open device ;AN000;
434 MOV AL,dev_open_mode ;AL=open mode for devices, see modecpeq.inc ;AN000;
435 MOV DX,OFFSET CON_str ;know that CON is being opened, avoid using user input and having to remove colon ;AN000;
436 INT 21H ;AN000;
437 ;AN000;
438 MOV BX,AX ;BX=handle of CON ;AN000;
439 MOV AX,440CH ;AN000;
440 MOV CH,display_device ;type of device ;AN000;
441 MOV DX,OFFSET IOCTL0C_data_block ;AN000;
442 INT 21H ;the IOCTL data block is filled with the current settings ;AN000;
443 PUSHF ;save result of the IOCTL ;AN000;
444 ;AN000;
445 MOV AH,3EH ;assume that BX still has the handle ;AN000;
446 INT 21H ;close CON, open and close each time because if error may not be back to close ;AN000;
447 ;AN000;
448 POPF ;restore result of the IOCTL ;AN000;
449 ;AN000;
450 RET ;AN000;
451 ;AN000;
452do_IOCTL0C ENDP ;AN000;
453 ;AN000;
454;------------------------------------------------------------------------------- ;AN000;
455 ;AN000;
456display_columns_status PROC NEAR ;AN000;
457 ;AN000;
458MOV CL,get_current_settings ;AN000;
459CALL do_IOCTL0C ;get current settings of CON ;AN000;
460.IF <IOCTL0C_data_block.mode EQ text> THEN ;AN000;
461 .IF <IOCTL0C_data_block.cols EQ 80> THEN ;AN000;
462 MOV columns_ptr,OFFSET eighty_str ;set up message block with pointer to "80" ;AN000;
463 .ELSE ;AN000;
464 MOV columns_ptr,OFFSET fourty_str ;AN000;
465 .ENDIF ;AN000;
466.ELSE ;AN000;
467 MOV columns_ptr,OFFSET NONE_str ;AN000;
468.ENDIF ;AN000;
469display COLUMNS_equal_msg ;AN000;
470 ;AN000;
471RET ;AN000;
472 ;AN000;
473display_columns_status ENDP ;AN000;
474 ;AN000;
475;------------------------------------------------------------------------------- ;AN000;
476 ;AN000;
477display_lines_status PROC NEAR ;AN000;
478 ;AN000;
479MOV CL,get_current_settings ;AN000;
480CALL do_IOCTL0C ;get current settings of CON ;AN000;
481.IF <IOCTL0C_data_block.mode EQ text> THEN ;AN000;
482 MOV AX,IOCTL0C_data_block.rows ;AN000;
483 MOV row_value,AL ;row_value=binary row value ;AN000;
484 MOV row_type,right_align+unsgn_bin_byte ;set up sublist so msg ret knows it is a binary byte ;AN000;
485 MOV row_ptr,OFFSET row_value ;set up LINES_equal sublist ;AN000;
486.ELSE ;AN000;
487 MOV row_ptr,OFFSET NONE_str ;AN000;
488.ENDIF ;AN000;
489display LINES_equal_msg ;AN000;
490 ;AN000;
491RET ;AN000;
492 ;AN000;
493display_lines_status ENDP ;AN000;
494
495;-------------------------------------------------------------------------------
496
497old_video_mode_set_IOCTL PROC NEAR ;AN004;
498
499MOV CL,set_display_characteristics ;AN000;
500CALL do_IOCTL0C ;AN000;
501.IF C THEN ;AN000;
502 get_extended_error ;AN000;
503 .IF <AX EQ not_supported_on_machine> THEN ;AN000;
504 DISPLAY Function_not_supported ;AN000;
505 .ELSEIF <AX EQ font_not_loaded> THEN ;AN000;
506 DISPLAY Required_font_not_loaded ;AN000;
507 .ENDIF ;AN000;
508 MOV noerror,false ;AN000;
509.ENDIF ;AN000;carry ;AN000;
510
511RET
512 ;AN004;
513old_video_mode_set_IOCTL ENDP ;AN004;
514
515 ;AN000;
516;------------------------------------------------------------------------------- ;AN000;
517;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000;
518
519;³ CHECK_COM_PORTS_ATTACHED
520;³ ------------------------
521
522;³ Return the number of com ports in the machine.
523
524;³ INPUT: none
525
526
527;³ RETURN: com_ports_attached - number of com ports
528
529
530;³ MESSAGES: none
531
532;³ REGISTER
533;³ USAGE: SI - index of the FOR loop and displacement from serial_base
534;³ ES - holds segment of ROM data area
535
536
537;³ ASSUMPTIONS: The user has initialized com_ports_attached to zero.
538
539
540;³ SIDE EFFECT: ES is lost
541;³ SI is lost
542;³ ;AN000;
543;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000;
544
545check_com_ports_attached PROC NEAR
546
547MOV SI,0
548MOV ES,SI ;now ES:SERIAL_BASE addresses 40:0=0:400
549
550.FOR SI = 0 TO 6 STEP 2
551
552 .IF <<WORD PTR ES:SERIAL_BASE[SI]> NE 0> THEN ;SEE IF THE COM PORT EXISTS
553 INC com_ports_attached
554 .ENDIF
555
556.NEXT SI
557
558RET
559
560check_com_ports_attached ENDP
561
562
563;------------------------------------------------------------------------------- ;AN000;
564;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000;
565
566;³ CHECK_PRN_PORTS_ATTACHED
567;³ ------------------------
568
569;³ Return the number of printer ports in the machine. The network will put a 2
570;³ in th address word if the printer is redirected, so for the printer to
571;³ actually exist the address must be greater than 2 ("redirected"). Since
572;³ can't have infinite retry on redirected printers only want to count ports
573;³ with >2 for addresses.
574
575;³ INPUT: none
576
577
578;³ RETURN: prn_ports_attached - number of printer ports
579
580
581;³ MESSAGES: none
582
583;³ REGISTER
584;³ USAGE: SI - index of the FOR loop and displacement from printr
585;³ ES - holds segment of ROM data area (0 in this case)
586
587
588;³ ASSUMPTIONS: All valid printer port addresses are >2.
589
590
591;³ SIDE EFFECT: ES is lost
592;³ SI is lost
593;³ ;AN000;
594;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000;
595
596check_prn_ports_attached PROC NEAR
597
598
599MOV SI,0
600MOV ES,SI ;now ES:printr addresses 40:8=0:408
601
602.FOR SI = 0 TO 4 STEP 2 ;for each of 3 printer port address holder words
603
604 .IF <<WORD PTR ES:printr[SI]> GT redirected> THEN ;SEE IF THE PORT EXISTS
605 INC prn_ports_attached
606 .ENDIF
607
608.NEXT SI
609
610RET
611
612check_prn_ports_attached ENDP
613
614
615;------------------------------------------------------------------------------- ;AN000;
616;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000;
617;³ ;AN000;
618;³ GET_DEVICE_RETRY_TYPE ;AN000;
619;³ --------------------- ;AN000;
620;³ ;AN000;
621;³ Return the type of retry active for comX or lptX. ;AN000;
622;³ ;AN000;
623;³ INPUT: device_request - scalar indicating what status the user requested. ;AN000;
624;³ use the following equates: ;AN000;
625;³ ;AN000;
626;³ com1_retry_type_status EQU 0 ;AN000;
627;³ com2_retry_type_status EQU 2 ;AN000;
628;³ com3_retry_type_status EQU 4 ;AN000;
629;³ com4_retry_type_status EQU 6 ;AN000;
630;³ lpt1_retry_type_status ;AN000;
631;³ lpt2_retry_type_status ;AN000;
632;³ lpt3_retry_type_status ;AN000;
633;³ ;AN000;
634;³ ;AN000;
635;³ RETURN: returned_retry_type - scalar indicating type of retry active for ;AN000;
636;³ the requested device. compare with the following equates: ;AN000;
637;³ ;AN000;
638;³ no_retry_flag ;AN000;
639;³ error_status ;AN000;
640;³ busy_status ;AN000;
641;³ ready_status ;AN000;
642;³ ;AN000;
643;³ retry_type_ptr - set to proper string ;AN000;
644;³ ;AN000;
645;³ ;AN000;
646;³ MESSAGES: none ;AN000;
647;³ ;AN000;
648;³ REGISTER ;AN000;
649;³ USAGE: CL - For com ports it serves as bit shift count for the retry type byte.
650;³ ;AN000;
651;³ AL - On exit holds retry type scalar on exit (returned_retry_type) ;AN000;
652;³ ;AN000;
653;³ ES - holds segment of resident mode code ;AN000;
654;³ ;AN000;
655;³ ;AN000;
656;³ CONVENTIONS: The value in device_request is used as an index into the LPTX ;AN000;
657;³ array of retry type flags, or as a bit shift count for the ;AN000;
658;³ COM retry type byte. ;AN000;
659;³ ;AN000;
660;³ ;AN000;
661;³ ASSUMPTIONS: The user has initialized device_request on entry with ;AN000;
662;³ the equates provided. ;AN000;
663;³ ;AN000;
664;³ ;AN000;
665;³ SIDE EFFECT: none. ;AN000;
666;³ ;AN000;
667;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000;
668 ;AN000;
669get_device_retry_type PROC NEAR ;AN665;
670
671PUBLIC get_device_retry_type
672
673PUSH BX ;AN665;
674PUSH ES ;AN665;
675
676XOR BX,BX ;AN665;
677MOV ES,BX ;set segment to zero ;AN665;
678
679.IF <<ES:WORD PTR resseg> NE 0000H> THEN ;IF code resident THEN ;AN665;
680 MOV ES,ES:WORD PTR resseg[2] ;ES=seg of resident code ;AN665;
681 .IF <device_type EQ COMx> THEN
682 MOV CL,device_request ;CL has 0, 2, 4 or 6 for COM 1, 2, 3 or 4 respectively ;AC003;
683 MOV returned_retry_type,BYTE PTR ES:res_com_retry_type ;AL=the status byte for all 4 com ports ;AN665;
684 SHR returned_retry_type,CL ;AL=XXXXXX??, where ?? is the retry bits for port in question ;AC003;
685 AND returned_retry_type,00000011B ;AL=000000??, where ?? is the retry bits for port in question ;AC003;
686 .ELSE ;AN665;
687 MOV BL,device_request ;BX=index into retry bytes in resident code ;AN665;
688 MOV returned_retry_type,BYTE PTR ES:lpt1_retry_type[BX] ;AN665;
689 .ENDIF ;AN665;
690.ELSE ;AN665;
691 MOV returned_retry_type,no_retry_flag ;AN665;
692.ENDIF ;AN665;
693
694.IF <returned_retry_type EQ B> OR ;COM form of busy flag ;AN665;
695.IF <returned_retry_type EQ busy_status> THEN ;AN665;
696 MOV retry_type_ptr,OFFSET B_str ;AN665;
697.ELSEIF <returned_retry_type EQ E> OR ;COM form of error flag ;AN665;
698.IF <returned_retry_type EQ error_status> THEN ;AN665;
699 MOV retry_type_ptr,OFFSET E_str ;AN665;
700.ELSEIF <returned_retry_type EQ R> OR ;COM form of ready flag ;AN665;
701.IF <returned_retry_type EQ ready_status> THEN ;AN665;
702 MOV retry_type_ptr,OFFSET R_str ;AN665;
703.ELSE ;AN665;
704 MOV retry_type_ptr,OFFSET NONE_str ;not E, B or R. ;AN665;
705.ENDIF ;AN665;
706
707POP ES ;AN665;
708POP BX ;AN665;
709RET ;AN665;
710
711get_device_retry_type ENDP ;AN665;
712 ;AN000;
713;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000;
714;³ ;AN000;
715;³ ANALYZE_AND_INVOKE ;AN000;
716;³ ------------------ ;AN000;
717;³ ;AN000;
718;³ The command line is boken down into pieces by "parse_parameters". Each piece ;AN000;
719;³ is analyzed here, and the appropriate routine called to setup and/or execute ;AN000;
720;³ the requested function. ;AN000;
721;³ ;AN000;
722;³ ;AN000;
723;³ ;AN000;
724;³ ;AN000;
725;³ ;AN000;
726;³ ;AN000;
727;³ INPUT: request_type - scalar indicating what operation the user requested. ;AN000;
728;³ ;AN000;
729;³ ;AN000;
730;³ ;AN000;
731;³ ;AN000;
732;³ RETURN: none ;AN000;
733;³ ;AN000;
734;³ ;AN000;
735;³ MESSAGES: none ;AN000;
736;³ ;AN000;
737;³ ;AN000;
738;³ ;AN000;
739;³ ;AN000;
740;³ REGISTER ;AN000;
741;³ USAGE: DI - index into the list of parsed parms, the array parm_list. ;AN000;
742;³ ;AN000;
743;³ CX - temporary holder for memory to memory MOVs ;AN000;
744;³ ;AN000;
745;³ ;AN000;
746;³ CONVENTIONS: ;AN000;
747;³ ;AN000;
748;³ ;AN000;
749;³ ;AN000;
750;³ ASSUMPTIONS: All the input are valid. The parm_list entry past the last one ;AN000;
751;³ has a parm_type of bogus. ;AN000;
752;³ ;AN000;
753;³ The lines and columns values are in binary for request_type= ;AN000;
754;³ set_con_features ;AN000;
755;³ ;AN000;
756;³ The codepage numbers were put into des_start_packet. ;AN000;
757;³ ;AN000;
758;³ ;AN000;
759;³ ;AN000;
760;³ ;AN000;
761;³ SIDE EFFECT: ;AN000;
762;³ ;AN000;
763;³ ;AN000;
764;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000;
765 ;AN000;
766analyze_and_invoke PROC NEAR ;AX000; ;AN000;
767 ;AN000;
768 ;AN000;
769;CASE request_type= ;AN000;
770 ;AN000;
771 MOV cp_cb.des_pack_ptr,OFFSET des_start_packet ;AX000;In case a codepage request ;AN000;
772 ;AN000;
773 MOV DI,0 ;initialize index into the list of parsed parameters ;AN000;
774 ;AN000;
775 ;calculate the displacement for the jump to the jump ;AN000;
776 MOV parm_list_holder,BX ;save parm_list_BX ;AN000;
777 XOR BX,BX ;AX000; ;AN000;
778 MOV BL,max_request_type ;AX000; ;AN000;
779 SUB BL,request_type ;AX000;see the list of equates for request_type ;AN000;
780 SHL BX,1 ;AX000;BX=word displacement into jump table ;AN000;
781 JMP jump_table1[BX] ;AX000;jump to appropriate jump ;AN000;
782 ;AN000;
783 jump_table1 LABEL WORD ;the order of the following entries is critical ;AN000;
784 ;AN000;
785 DW OFFSET all_con_status_case ;AN000;
786 DW OFFSET codepage_prepare_case ;AN000;
787 DW OFFSET codepage_refresh_case ;AN000;
788 DW OFFSET codepage_select_case ;AN000;
789 DW OFFSET codepage_status_case ;AN000;
790 DW OFFSET codepage_prepared_status_case ;AN000;
791 DW OFFSET codepage_selected_status_case ;AN000;
792 DW OFFSET com_status_case ;AN000;
793 DW OFFSET initialize_com_port_case ;AN000;
794 DW OFFSET initialize_printer_port_case ;AN000;
795 DW OFFSET old_initialize_printer_port_case ;AN000;
796 DW OFFSET old_video_mode_set_case ;AN000;
797 DW OFFSET printer_reroute_case ;AN000;
798 DW OFFSET printer_status_case ;AN000;
799 DW OFFSET set_con_features_case ;AN000;
800 DW OFFSET status_for_everything_case ;AN000;
801 DW OFFSET turn_off_reroute_case ;AN000;
802 ;AN000;
803 ;AN000;
804 all_con_status_case: ;know that all con status is requested ;AN000;
805 ;AN000;
806 ;AN000;
807 MOV stat_dev_ptr,OFFSET CON_str ;set up msg ser input ;AN000;
808 MOV dev_name_size,len_CON_str ;set up for msg service, see MODEPARS.ASM ;AN000;
809 display status_for_device ;AN000;
810 display long_underline ;Status for device CON: ;AN000;
811 display four_char_underline ;---------------------- ;AN000;
812 ;AN000;
813 CAll check_ANSI_installed ;see if ANSI.SYS is installed ;AC001;
814 .IF <ANSI_installed EQ true> THEN ;IF can get info on settings THEN display them ELSE don't display them
815 CALL display_columns_status ;AN000;
816 CALL display_lines_status ;AN000;
817 .ENDIF ;AC001;
818 MOV cp_cb.request_typ,status ;set up variables for modecp ;AN000;
819 MOV cp_cb.cp_device,OFFSET CON_str ;AN000;
820 ;AN000;
821 CALL modecp ;display codepage status ;AN000;
822 ;AN000;
823 BREAK 0 ;AN000;
824 ;AN000;
825 ;AN000;
826 codepage_prepare_case: ;AN000;
827 ;AN000;
828 MOV cp_cb.request_typ,prepare ;AN000;
829 CALL setup_device_name ;Set the pointer to the device name ASCIIZ in the parameter block for 'modecp'. ;AN000;
830 ;AN000;
831 call modecp ;AN000;
832 ;AN000;
833 BREAK 0 ;AN000;
834 ;AN000;
835 ;AN000;
836 codepage_refresh_case: ;AN000;
837 ;AN000;
838 MOV cp_cb.request_typ,refresh ;AN000;
839 CALL setup_device_name ;Set the pointer to the device name ASCIIZ in the parameter block for 'modecp'. ;AN000;
840 ;AN000;
841 call modecp ;AN000;
842 ;AN000;
843 BREAK 0 ;AN000;
844 ;AN000;
845 ;AN000;
846 ;AN000;
847 codepage_select_case: ;AN000;
848 ;AN000;
849 MOV cp_cb.request_typ,select ;AN000;
850 CALL setup_device_name ;Set the pointer to the device name ASCIIZ in the parameter block for 'modecp'. ;AN000;
851 MOV des_start_packet.des_strt_pknum,1 ;one cp number ;AN000;
852 MOV des_start_packet.des_strt_pklen,4 ;bytes for count (word) and one number (word) ;AN000;
853 MOV BX,parm_list_holder ;restore parm_list_BX ;AN000;
854 MOV DI,codepage_index_holder ;DI=index in parm list of the entry for the codepage to be selected;AN000;
855 MOV AX,parm_list_BX[DI].value1 ;AX=codepage number in binary form ;AN000;
856 MOV des_start_packet.des_strt_pkcp1,AX ;setup parm block with the (single) cp number ;AN000;
857 ;AN000;
858 CALL modecp ;AN000;
859 ;AN000;
860 BREAK 0 ;AN000;
861 ;AN000;
862 ;AN000;
863 codepage_status_case: ;AN000;
864 codepage_prepared_status_case: ;AN000;
865 codepage_selected_status_case: ;AN000;
866 ;AN000;
867 MOV cp_cb.request_typ,status ;AN000;
868 CALL setup_device_name ;Set the pointer to the device name ASCIIZ in the parameter block for 'modecp'. ;AN000;
869 ;AN000;
870 CALL modecp ;AN000;
871 ;AN000;
872 BREAK 0 ;AN000;
873 ;AN000;
874 ;AN000;
875 com_status_case: ;AN000;
876 ;AN000;
877 ; INPUT: device_type = COMx
878 ; device = ASCII COM number
879
880
881 CALL check_com_ports_attached ;return number of com ports in com_ports_attached ;AN000;
882 ;AN000;
883 .IF <device_name EQ <OFFSET COM1_str>> AND ;AN000;
884 .IF <com_ports_attached GE 1> THEN ;COM1 exists
885 MOV BL,COM1 ;AN000;
886 MOV stat_dev_ptr,OFFSET COM1_str ;set up msg ser input ;AN000;
887 MOV device_request,com1_retry_type_status ;AN000;
888 .ELSEIF <device_name EQ <OFFSET COM2_str>> AND ;AN000;
889 .IF <com_ports_attached GE 2> THEN ;COM2 exists
890 MOV BL,COM2 ;AN000;
891 MOV stat_dev_ptr,OFFSET COM2_str ;set up msg ser input ;AN000;
892 MOV device_request,com2_retry_type_status ;AN000;
893 .ELSEIF <device_name EQ <OFFSET COM3_str>> AND ;AN000;
894 .IF <com_ports_attached GE 3> THEN ;COM3 exists
895 MOV BL,COM3 ;AN000;
896 MOV stat_dev_ptr,OFFSET COM3_str ;set up msg ser input ;AN000;
897 MOV device_request,com3_retry_type_status ;AN000;
898 .ELSEIF <device_name EQ <OFFSET COM4_str>> AND ;AN000;
899 .IF <com_ports_attached EQ 4> THEN ;COM4 exists
900 MOV BL,COM4 ;AN000;
901 MOV stat_dev_ptr,OFFSET COM4_str ;set up msg ser input ;AN000;
902 MOV device_request,com4_retry_type_status ;AN000;
903 .ELSE ;device does not exist ;AN000;
904 MOV CX,device_name ;AN000; ;AN000;
905 MOV illegal_device_ptr,CX ;put pointer to com port string in message ;AN000;
906 DISPLAY err1 ;AN000;"Illegal device name - COMX" ;AN000;
907 MOV noerror,false ;set flag for displaying status to be skipped
908 .ENDIF ;AN000;
909 .IF <noerror EQ true> THEN
910 MOV dev_name_size,len_COMX_str ;set up for msg service, see MODEPARS.ASM ;AN000;
911 display status_for_device ;"Status for device COM?:" ;AN000;
912 display long_underline ;"------------------" ;AN000;
913 display five_char_underline ;has CRLF on it "-----" ;AN000;
914 call get_device_retry_type ;AN000;
915 display retry_equal ;AN000;
916 .ENDIF
917 ;AN000;
918 BREAK 0 ;AN000;
919 ;AN000;
920 ;AN000;
921; con_status_case: ;don't know which con status is requested ;AN000;
922 ;AN000;
923; MOV request_type,all_con_status ;AC000;DCR76 ;AN000;
924; CALL analyze_and_invoke ;AC000;DCR76 ;AN000;
925 ;AN000;
926; MOV dev_name_size,len_CON_str ;set up for msg service, see MODEPARS.ASM ;AN000;
927; MOV stat_dev_ptr,OFFSET CON_str ;set up msg ser input ;AN000;
928; display status_for_device ;AN000;
929; display long_underline ;Status for device CON: ;AN000;
930; display four_char_underline ;---------------------- ;AN000;
931; ;AN000;
932; MOV DI,0 ;AN000;
933; ;AN000;
934; .WHILE <parm_list_BX[DI].parm_type NE bogus> DO ;the entry after the last has parm_type of bogus ;AN000;
935; ;AN000;
936; ;CASE parm_list_BX[DI].item_tag= ;AN000;
937; ;AN000;
938; ;CODEPAGE, ;AN000;
939; ;PREPARE, ;AN000;
940; ;SELECT: ;AN000;
941; ;AN000;
942; .IF <parm_list_BX[DI].item_tag EQ CODEPAGE_item_tag> OR ;AN000;
943; .IF <parm_list_BX[DI].item_tag EQ SELECT_item_tag> OR ;AN000;
944; .IF <parm_list_BX[DI].item_tag EQ PREPARE_item_tag> THEN ;AN000;
945; ;AN000;
946; MOV cp_cb.request_typ,status ;AN000;
947; MOV cp_cb.cp_device,OFFSET CON_str ;AN000;
948; CALL modecp ;display codepage status ;AN000;
949; ;AN000;
950; BREAK 2 ;AN000;
951; ;AN000;
952; .ENDIF ;AN000;
953; ;AN000;
954; ;BLINK: ;AN000;
955; ;AN000;
956; .IF <parm_list_BX[DI].item_tag EQ BLINK_item_tag> THEN ;AN000;
957; ;AN000;
958; CALL display_blink_status ;AN000;
959; ;AN000;
960; BREAK 2 ;AN000;
961; ;AN000;
962; .ENDIF ;AN000;
963; ;AN000;
964; ;AN000;
965; ;COLUMNS: ;AN000;
966; ;AN000;
967; .IF <parm_list_BX[DI].item_tag EQ COLUMNS_item_tag> THEN ;AN000;
968; ;AN000;
969; CALL display_COLUMNS_status ;AN000;
970; ;AN000;
971; BREAK 2 ;AN000;
972; ;AN000;
973; .ENDIF ;AN000;
974; ;AN000;
975; ;AN000;
976; ;LINES: ;AN000;
977; ;AN000;
978; .IF <parm_list_BX[DI].item_tag EQ LINES_item_tag> THEN ;AN000;
979; ;AN000;
980; CALL display_lines_status ;AN000;
981; ;AN000;
982; BREAK 2 ;AN000;
983; ;AN000;
984; .ENDIF ;AN000;
985; ;AN000;
986; ENDCASE_2: ;AN000;
987; ;AN000;
988; ADD DI,TYPE parm_list_entry ;AN000;
989; ;AN000;
990; .ENDWHILE ;AN000;
991 ;AN000;
992; BREAK 0 ;AN000;
993 ;AN000;
994 ;AN000;
995 ;AN000;
996 initialize_com_port_case: ;AN000;
997 ;AN000;
998
999 MOV BX,parm_list_holder ;restore parm_list_BX ;AN000;
1000
1001 .IF <parms_form EQ keyword> THEN ;IF the parms were input as keywords THEN ;AN000;
1002 ;AN000;
1003 MOV DI,TYPE parm_list_entry ;skip COMN parm ;AN000;
1004 ;AN000;
1005 .WHILE <parm_list_BX[DI].parm_type NE bogus> DO NEAR ;the entry after the last has parm_type of bogus ;AN000;
1006 ;AN000;
1007 ;CASE parm_list_BX[DI].keyword_switch_ptr= ;AN000;
1008 ;AN000;
1009 ;BAUD_equal: ;AN000;
1010 ;AN000;
1011 .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET BAUD_equal>> THEN ;AN000;
1012 ;AN000;
1013 MOV AX,parm_list_BX[DI].value1 ;AX= pointer to the baud rate string ;AN000;
1014 MOV pbaud_ptr,AX ;set pointer to the baud rate string in the messge ;AN000;
1015 MOV baud_index,DI ;set index into parm list for setcom ;AN000;
1016 BREAK 3 ;AN000;
1017 ;AN000;
1018 .ENDIF ;AN000;
1019 ;AN000;
1020 ;AN000;
1021 ;PARITY_equal: ;AN000;
1022 ;AN000;
1023 .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET PARITY_equal>> THEN ;AN000;
1024 ;AN000;
1025 MOV SI,parm_list_BX[DI].value1 ;AX= pointer to the parity string ;AN000;
1026 MOV pparity_ptr,SI ;set pointer to the parity string in the messge ;AN000;
1027 OR BYTE PTR [SI],lowercase ;convert to lowercase for compatibility with previous versions
1028 MOV parity_index,DI ;set index into parm list for setcom ;AN000;
1029 BREAK 3 ;AN000;
1030 ;AN000;
1031 .ENDIF ;AN000;
1032 ;AN000;
1033 ;AN000;
1034 ;DATA_equal: ;AN000;
1035 ;AN000;
1036 .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET DATA_equal>> THEN ;AN000;
1037 ;AN000;
1038 MOV BP,parm_list_BX[DI].value1 ;BP= pointer to the data bits string ;AN000;
1039 MOV AL,[BP] ;AL= data bits character ;AN000;
1040 MOV pdata,AL ;set the data bits string in the messge ;AN000;
1041 MOV data_bits_index,DI ;set index into parm list for setcom ;AN000;
1042 BREAK 3 ;AN000;
1043 ;AN000;
1044 .ENDIF ;AN000;
1045 ;AN000;
1046 ;AN000;
1047 ;STOP_equal: ;AN000;
1048 ;AN000;
1049 .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET STOP_equal>> THEN ;AN000;
1050 ;AN000;
1051 MOV AX,parm_list_BX[DI].value1 ;AX= pointer to the stop bit string ;AN000;
1052 MOV pstop_ptr,AX ;set pointer to the parity string in the messge ;AN000;
1053 MOV stop_bits_index,DI ;set index into parm list for setcom ;AN000;
1054 BREAK 3 ;AN000;
1055 ;AN000;
1056 .ENDIF ;AN000;
1057 ;AN000;
1058 ;AN000;
1059 ;RETRY_equal: ;AN000;
1060 ;AN000;
1061 .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET RETRY_equal_str>> THEN ;AN000;
1062 ;AN000;
1063 MOV retry_index,DI ;indicate to modecom which parm is retry ;AN000;
1064; BREAK 3 ;AN000;
1065 ;AN000;
1066 .ENDIF ;AN000;
1067 ;AN000;
1068 ;AN000;
1069 ENDCASE_3: ;AN000;
1070 ;AN000;
1071 ADD DI,TYPE parm_list_entry ;AN000;
1072 ;AN000;
1073 ;AN000;
1074 .ENDWHILE ;AN000;
1075 ;AN000;
1076 .ELSE ;the parms were entered as positionals (the old form) ;AN000;
1077 ;AN000;
1078 MOV baud_index,TYPE parm_list_entry ;AN000;
1079 MOV DI,2 * (TYPE parm_list_entry) ;AN000;
1080 .IF <parm_list_BX[DI].item_tag NE unspecified> THEN ;AN000;IF stopbits requested THEN
1081 MOV parity_index,DI ;AN000;
1082 .ENDIF
1083 MOV DI,3 * (TYPE parm_list_entry) ;AN000;
1084 .IF <parm_list_BX[DI].item_tag NE unspecified> THEN ;AN000;IF stopbits requested THEN
1085 MOV data_bits_index,DI ;AN000;
1086 .ENDIF
1087 MOV DI,4 * (TYPE parm_list_entry) ;DI=stopbits index ;AN000;
1088 .IF <parm_list_BX[DI].item_tag NE unspecified> THEN ;AN000;IF stopbits requested THEN
1089 MOV stop_bits_index,DI ;AN000;
1090 .ENDIF
1091 MOV DI,5 * (TYPE parm_list_entry) ;AN000;DI=index of retry parm
1092 .IF <parm_list_BX[DI].item_tag NE unspecified> THEN ;AN000;IF retry requested THEN
1093 MOV retry_index,DI ;AN000;set up index for modecom
1094 .ENDIF ;AN000;
1095 ;AN000;
1096 .ENDIF ;AN000;
1097 ;AN000;
1098 CALL modecom ;AN000;
1099 ;AN000;
1100 BREAK 0 ;AN000;
1101
1102 ;AN000;
1103 ;AN000;
1104 old_initialize_printer_port_case: ;Assume that parms not specified have an entry in parm_list that is in initial state;AN000;
1105
1106 ;printer_no has ASCII form of printer number ;AN000;
1107 ;need to put binary form of columns in columns_holder (80 or 132) ;AN000;
1108 ;need to put "6" or "8" in parm2 ;AN000;
1109 ;need to set retry_index ;AN000;
1110
1111
1112PUBLIC old_initialize_printer_port_case
1113
1114 MOV BX,parm_list_holder ;restore parm_list_BX ;AN000;
1115 MOV DI,TYPE parm_list_entry ;skip LPTN parm, point at chars per line ;AN000;
1116
1117 .IF <parm_list_BX[DI].item_tag EQ onethirtytwo_item_tag> THEN ;AN000;
1118 MOV columns_holder,132 ;AN000;
1119 .ELSEIF <parm_list_BX[DI].item_tag EQ eighty_item_tag> THEN ;AN000;
1120 MOV columns_holder,80 ;AN000;
1121 .ENDIF ;if not 80 or 132 modeprin assumes not specified, and makes no change;AN000;
1122 ADD DI,TYPE parm_list_entry ;look at lines per inch ;AN000;
1123
1124 .IF <parm_list_BX[DI].item_tag NE unspecified> THEN ;IF chars per line specified THEN ;AN000;
1125 MOV SI,parm_list_BX[DI].value1 ;SI=>"6" or "8" ;AN000;
1126 MOV AL,BYTE PTR DS:[SI] ;AN000;
1127 MOV parm2,AL ;parm2="6" or "8" ;AN000;
1128 .ENDIF ;otherwise leave parm2=0FFH (unspecified) ;AN000;
1129
1130 ADD DI,TYPE parm_list_entry ;look at retry request ;AN000;
1131 .IF <parm_list_BX[DI].item_tag NE unspecified> THEN ;AN000;
1132 MOV retry_index,DI ;AN000;let modeprin know retry was requested and the index of it.
1133 .ENDIF ;AN000;
1134
1135 CALL modeecno ;AN000;
1136 CALL modeprin ;AN000;
1137 ;AN000;
1138 BREAK 0 ;AN000;
1139
1140
1141
1142 initialize_printer_port_case: ;printer_no has ASCII form of printer number ;AN000;
1143 ;need to put binary form of columns in columns_holder (80 or 132) ;AN000;
1144 ;need to put "6" or "8" in parm2 ;AN000;
1145 ;need to set retry_index ;AN000;
1146 ;AN000;
1147 MOV BX,parm_list_holder ;restore parm_list_BX ;AN000;
1148 MOV DI,TYPE parm_list_entry ;skip LPTN parm ;AN000;
1149
1150 .WHILE <parm_list_BX[DI].parm_type NE bogus> DO ;the entry after the last has parm_type of bogus ;AN000;
1151 ;AN000;
1152 ;CASE parm_list_BX[DI].keyword_switch_ptr= ;AN000;
1153 ;AN000;
1154 ;AN000;
1155 ;LINES_equal: ;AN000;
1156 ;AN000;
1157 .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET LINES_equal>> THEN ;AN000;
1158 ;AN000;
1159 MOV SI,parm_list_BX[DI].value1 ;SI=>"6" or "8" ;AN000;
1160 MOV AL,BYTE PTR DS:[SI] ;AN000;
1161 MOV parm2,AL ;parm2="6" or "8" ;AN000;
1162 BREAK 4 ;AN000;
1163 ;AN000;
1164 .ENDIF ;AN000;
1165 ;AN000;
1166 ;AN000;
1167 ;COLUMNS_equal: ;AN000;
1168 ;AN000;
1169 .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET COLUMNS_equal>> OR ;AN000;
1170 .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET COLS_equal>> THEN ;AN000;
1171 ;AN000;
1172 .IF <parm_list_BX[DI].item_tag EQ onethirtytwo_item_tag> THEN ;AN000;
1173 MOV columns_holder,132 ;AN000;
1174 .ELSE ;AN000;
1175 MOV columns_holder,80 ;AN000;
1176 .ENDIF ;AN000;
1177 BREAK 4 ;AN000;
1178 ;AN000;
1179 .ENDIF ;AN000;
1180 ;AN000;
1181 ;AN000;
1182 ;RETRY_equal: ;AN000;
1183 ;AN000;
1184 .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET RETRY_equal_str>> THEN ;AN000;
1185
1186 MOV retry_index,DI ;AN664;
1187 BREAK 4 ;AN000;
1188 ;AN000;
1189 .ENDIF ;AN000;
1190 ;AN000;
1191 ;AN000;
1192 ENDCASE_4: ;AN000;
1193 ;AN000;
1194 ADD DI,TYPE parm_list_entry ;AN000;
1195 ;AN000;
1196 ;AN000;
1197 .ENDWHILE ;AN000;
1198
1199 CALL modeecno ;turn of rerouting ;AN000;
1200 CALL modeprin ;AN000;
1201 ;AN000;
1202 BREAK 0 ;AN000;
1203 ;AN000;
1204 ;AN000;
1205 ;AN000;
1206 ;AN000;
1207 old_video_mode_set_case: ;AN000;
1208 ;AN000;
1209 PUBLIC old_video_mode_set_case ;AN000;
1210 ;AN000;
1211 ;AN000;
1212 ;first see if ANSI.SYS is loaded ;AN000;
1213 CALL check_ANSI_installed ;AC001;
1214 .IF <ANSI_installed EQ true> THEN ;AC001;
1215 MOV CL,get_current_settings ;AN000;
1216 PUSH BX ;save parm_list ;AN000;
1217 CALL do_IOCTL0C ;get current settings of CON ;AN000;
1218 POP BX ;restore parm_list ;AN000;
1219 MOV IOCTL0C_data_block.mode,text ;AN000;
1220 .ENDIF ;AN000;ANSI installed ;AN000;
1221 MOV BX,parm_list_holder ;restore parm_list_BX ;AN000;
1222 PUSH DI ;save parm list index ;AN000;
1223 .IF <parm_list_BX[DI].item_tag NE unspecified> THEN
1224 .IF <parm_list_BX[DI].item_tag EQ BW40_item_tag> THEN ;IF BW40 REQUESTED ;AN000;
1225 CALL BW40 ;AN000;
1226 .ELSEIF <parm_list_BX[DI].item_tag EQ BW80_item_tag> THEN ;IF BW80 REQUESTED ;AN000;
1227 CALL BW80 ;AN000;
1228 .ELSEIF <parm_list_BX[DI].item_tag EQ CO40_item_tag> THEN ;IF CO40 REQUESTED ;AN000;
1229 CALL CO40 ;AN000;
1230 .ELSEIF <parm_list_BX[DI].item_tag EQ CO80_item_tag> THEN ;IF CO80 REQUESTED ;AN000;
1231 CALL CO80 ;AN000;
1232 .ELSEIF <parm_list_BX[DI].item_tag EQ MONO_item_tag> THEN ;IF MONO REQUESTED ;AN000;
1233 CALL MONO ;AN000;
1234 .ELSE ;AN000;
1235 .IF <ANSI_installed EQ true> THEN ;AN000;
1236;AC004; MOV need_IOCTL0C,true ;use IOCTL if possible to retain lines setting ;AN000;
1237 .IF <parm_list_BX[DI].value1 EQ <OFFSET fourty_str>> THEN ;AN000;
1238 MOV IOCTL0C_data_block.cols,40 ;setup IOCTL input block with the columns requested ;AN000;
1239 .ELSE
1240 MOV IOCTL0C_data_block.cols,80 ;setup IOCTL input block with the columns requested ;AN000;
1241 .ENDIF ;AN000;
1242 CALL old_video_mode_set_IOCTL ;AN004;use IOCTL if possible to retain lines setting ;AN000;
1243 .ELSE
1244 .IF <parm_list_BX[DI].item_tag EQ fourty_item_tag> THEN ;IF 40 REQUESTED ;AN000;
1245 MOV BL,40 ;set up for handle_40_or_80 ;AN000;
1246 .ELSE ;AN000;
1247 MOV BL,80 ;set up for handle_40_or_80 ;AN000;
1248 .ENDIF ;AN000;
1249 CALL HANDLE_40_OR_80 ;AN000;
1250 .ENDIF
1251 .ENDIF ;AN000;
1252 .ENDIF
1253
1254dummy9:
1255PUBLIC dummy9
1256 ;AN000;
1257 POP DI ;restore parm list index ;AN000;
1258
1259 .IF <NOERROR EQ TRUE> AND ;process ,r ³ l,[T] ;AN000;
1260 MOV BX,parm_list_holder ;restore parm_list_BX ;AN000;
1261 ADD DI,TYPE parm_list_entry ;process second parm, shift direction ;AN000;
1262 .IF <parm_list_BX[DI].item_tag NE unspecified> THEN ;AN000;
1263 .IF <parm_list_BX[DI].item_tag EQ R_item_tag> OR ;AN000;
1264 .IF <parm_list_BX[DI].item_tag EQ L_item_tag> THEN ;AN000;
1265 MOV CL,parm_list_BX[DI].item_tag ;AN000;
1266 MOV PARM2,CL ;set up for SHIFT_SCREEN ;AN000;
1267 ADD DI,TYPE parm_list_entry ;look at third parm ;AN000;
1268 MOV CL,parm_list_BX[DI].item_tag ;CL=T_item_tag or bogus ;AN000;
1269 MOV PARM3,CL ;may be bogus, but shift_screen will handle it correctly ;AN000;
1270 CALL SHIFT_SCREEN ;AN000;
1271 .ELSE ;AN000;must be a rows value
1272 .IF <ANSI_installed EQ true> THEN ;AN000;
1273;AC004; MOV need_IOCTL0C,true ;use IOCTL if possible to retain lines setting ;AN000;
1274 MOV DX,parm_list_BX[DI].value1 ;AN000;
1275 MOV IOCTL0C_data_block.rows,DX ;the IOCTL input block has the columns requested ;AN000;
1276 CALL old_video_mode_set_IOCTL ;AN004;use IOCTL if possible to retain lines setting ;AN000;
1277 .ELSE ;AN000;ANSI not installed ;AN000;
1278 DISPLAY ANSI_not_loaded ;AN000;
1279 MOV noerror,false ;AN000;
1280 .ENDIF ;AN000;ANSI installed ;AN000;
1281 .ENDIF ;AN000;
1282 .ENDIF ;AN000;
1283 ;AN000;
1284 BREAK 0 ;AN000;
1285
1286
1287 ;AN000;
1288PUBLIC printer_reroute_case
1289 ;AN000;
1290 printer_reroute_case:
1291 ;INPUT:lptno=zero based printer number OUTPUT:;AH=printer number mask: lpt1=1, lpt2=2, lpt3=4 ;AN000;
1292 ;device=COM number in ASCII form ;SI=printer number value (one based) ;AN000;
1293 ;AL=com number character ;AN000;
1294 XOR CX,CX
1295 MOV CL,lptno ;lptno always <= 255
1296 MOV SI,CX ;SI=zero based printer number (0, 1, or 2) ;AN000;
1297 INC SI ;SI=one based printer number (1, 2, or 3) ;AN000;
1298 MOV AH,1 ;AN000;
1299 SAL AH,CL ;AH=2**SI,AH=printer number mask for MODEECHO ;AN000;
1300 MOV DH,CL
1301 ADD DH,ASCII_1 ;DH=ASCII printer number ;AN000;
1302 MOV AL,device ;AL=ASCII form of com device number ;AN000;
1303 MOV REDPT,DH ;PUT n OF LPTn IN REDIRECT MESSAGE
1304 MOV NOTREDPT,DH ;AND INTO NOT REDIRECTED MSG
1305 CALL modeecho ;AN000;
1306 ;AN000;
1307 BREAK 0 ;AN000;
1308 ;AN000;
1309 ;AN000;
1310 ;AN000;
1311 printer_status_case: ;AN000;
1312
1313PUBLIC printer_status_case
1314
1315 ; INPUT: device_type = LPTx
1316 ; device = ASCII printer number
1317 ; lptno = ASCII printer number
1318 ; device_name = offset of printer string
1319 ;AN000;
1320
1321 MOV cp_cb.request_typ,status ;AN000;
1322 MOV AX,device_name ;AN000;
1323 MOV stat_dev_ptr,AX ;AC665;set up msg ser input ;AN000;
1324 MOV dev_name_size,len_LPTX_str ;AN000;set up for msg service, see MODEPARS.ASM ;AN000;
1325 MOV cp_cb.cp_device,AX ;AN665;set up for call to modecp ;AN000;
1326 ;AN000;
1327 .IF <device_name EQ <OFFSET LPT1_str>> THEN ;AN000;
1328 MOV device_request,lpt1_retry_type_status ;AN000;
1329 MOV rerouted_printer_mask,LPT1
1330 MOV redpt,"1" ;set up for reroute message
1331 MOV notredpt,"1" ;set up for not rerouted message
1332 .ELSEIF <device_name EQ <OFFSET LPT2_str>> THEN ;AN000;
1333 MOV device_request,lpt2_retry_type_status ;AN000;
1334 MOV rerouted_printer_mask,LPT2
1335 MOV redpt,"2" ;set up for reroute message
1336 MOV notredpt,"2" ;set up for not rerouted message
1337 .ELSEIF <device_name EQ <OFFSET LPT3_str>> THEN ;AN000;
1338 MOV device_request,lpt3_retry_type_status ;AN000;
1339 MOV rerouted_printer_mask,LPT3
1340 MOV redpt,"3" ;set up for reroute message
1341 MOV notredpt,"3" ;set up for not rerouted message
1342 .ENDIF ;AN000;
1343 ;AN000;
1344 PUSH ES ;save ES, used in MODECP ;AC002;
1345;AC002;PUSH AX ;AN000;save
1346 ;AN000;
1347 display status_for_device ;AN000;
1348 display long_underline "Status for device LPTX?" ;AN000;
1349 display five_char_underline ;has CRLF on it ----------------------- ;AN000;
1350 call display_printer_reroute_status ;see modeecho.asm ;AN000;
1351;AC002;POP AX ;restore "device_request" ;AN000;
1352 XOR CX,CX ;initialize prn_ports_attached ;AN000;
1353 CALL check_prn_ports_attached ;return number of printer cards in prn_ports_attached ;AN000;
1354 POP ES ;restore ES ;AC002;
1355 ADD prn_ports_attached,ASCII_0 ;CX=ASCII form of last printer number ;AN000;
1356 .IF <prn_ports_attached GE redpt> THEN ;IF the printer exists THEN ;AN000;
1357 call get_device_retry_type ;AN000;
1358 display retry_equal ;AN000;
1359 CALL modecp ;display codepage status ;AN000;
1360 .ENDIF ;AN000;
1361 ;AN000;
1362 BREAK 0 ;AN000;
1363 ;AN000;
1364;m ;AN000;
1365 set_con_features_case: ;the command line was nothing but con keywords ;AN000;
1366 ;AN000;
1367 ;first see if ANSI.SYS is loaded ;AN000;
1368 CALL check_ANSI_installed ;AC001;
1369 .IF <ANSI_installed EQ true> THEN ;AC001;
1370 MOV CL,get_current_settings ;AN000;
1371 CALL do_IOCTL0C ;get current settings of CON ;AN000;
1372 ;MOV SI,OFFSET IOCTL0C_data_block ;set up IOCTL0C, addressablitiy to the IOCTL data block ;AN000;
1373 ;AN000;
1374 MOV IOCTL0C_data_block.mode,text ;AN000;
1375 ;AN000;
1376 .ENDIF ;ANSI.SYS installed ;AN000;
1377 ;AN000;
1378 MOV BX,parm_list_holder ;restore parm_list_BX ;AN000;
1379 ADD DI,TYPE parm_list_entry ;skip CON parm ;AN000;
1380 .WHILE <parm_list_BX[DI].parm_type NE bogus> DO NEAR ;the entry after the last has parm_type of bogus ;AN000;
1381 ;AN000;
1382 ;CASE parm_list_BX[DI].keyword_switch_ptr= ;AN000;
1383 ;AN000;
1384 ;AN000;
1385 ;LINES_equal: ;AN000;
1386 ;AN000;
1387 .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET LINES_equal>> THEN ;AN000;
1388 ;AN000;
1389 MOV DX,parm_list_BX[DI].value1 ;AN000;
1390 MOV IOCTL0C_data_block.rows,DX ;the IOCTL input block has the columns requested ;AN000;
1391 MOV need_IOCTL0C,true ;AN000;
1392 BREAK 1 ;AN000;
1393 ;AN000;
1394 .ENDIF ;AN000;
1395 ;AN000;
1396 ;AN000;
1397 ;COLUMNS_equal: ;the value is binary ;AN000;
1398 ;AN000;
1399 .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET COLUMNS_equal>> OR ;AN000;
1400 .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET COLS_equal>> THEN ;AN000;
1401 ;AN000;
1402 .IF <ANSI_installed EQ true> THEN ;AN000;
1403 MOV need_IOCTL0C,true ;use IOCTL if possible to retain lines setting ;AN000;
1404 MOV DX,parm_list_BX[DI].value1 ;AN000;
1405 MOV IOCTL0C_data_block.cols,DX ;the IOCTL input block has the columns requested ;AN000;
1406 .ELSE
1407 .IF <parm_list_BX[DI].item_tag EQ fourty_item_tag> THEN ;IF 40 REQUESTED ;AN000;
1408 MOV columns_specified,40 ;set up for handle_40_or_80 ;AN000;
1409 .ELSE ;AN000;
1410 MOV columns_specified,80 ;set up for handle_40_or_80 ;AN000;
1411 .ENDIF ;AN000;
1412 .ENDIF
1413 BREAK 1 ;AN000;
1414 ;AN000;
1415 .ENDIF ;AN000;
1416 ;AN000;
1417 ;AN000;
1418 ;RATE_equal: ;AN000;
1419 ;AN000;
1420 .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET RATE_equal>> THEN ;AN000;
1421 ;AN000;
1422 MOV AL,BYTE PTR parm_list_BX[DI].value1 ;save the rate requested in binary form, always <255 ;AN000;
1423 MOV rate_holder,AL ;AN000;
1424 MOV need_typamat_call,true ;AN000;
1425 BREAK 1 ;AN000;
1426 ;AN000;
1427 .ENDIF ;AN000;
1428 ;AN000;
1429 ;AN000;
1430 ;DELAY_equal: ;AN000;
1431 ;AN000;
1432 .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET DELAY_equal>> OR ;AN000;
1433 .IF <parm_list_BX[DI].keyword_switch_ptr EQ <OFFSET DEL_equal>> THEN ;AN000;
1434 ;AN000;
1435 MOV AL,BYTE PTR parm_list_BX[DI].value1 ;save delay requested (binary), always <255 ;AN000;
1436 MOV delay_holder,AL ;AN000;
1437 MOV need_typamat_call,true ;AN000;
1438 BREAK 1 ;AN000;
1439 ;AN000;
1440 .ENDIF ;AN000;
1441 ;AN000;
1442 ENDCASE_1: ;AN000;
1443 ;AN000;
1444 ADD DI,TYPE parm_list_entry ;address next parm ;AN000;
1445 ;AN000;
1446 .ENDWHILE ;AN000;
1447 ;AN000;
1448DUMMY3: ;AN000;
1449PUBLIC DUMMY3 ;AN000;
1450 ;AN000;
1451 .IF <need_IOCTL0C EQ true> THEN ;AN000;
1452 .IF <ANSI_installed EQ true> THEN ;AN000;
1453 MOV CL,set_display_characteristics ;AN000;
1454 CALL do_IOCTL0C ;AN000;
1455 .IF C THEN ;AN000;
1456 get_extended_error ;AN000;
1457 .IF <AX EQ not_supported_on_machine> THEN ;AN000;
1458 DISPLAY Function_not_supported ;AN000;
1459 .ELSEIF <AX EQ font_not_loaded> THEN ;AN000;
1460 DISPLAY Required_font_not_loaded ;AN000;
1461 .ENDIF ;AN000;
1462 MOV noerror,false ;AN000;
1463 .ENDIF ;AN000;
1464 .ELSE ;AN000;
1465 DISPLAY ANSI_not_loaded ;AN000;
1466 MOV noerror,false ;AN000;
1467 .ENDIF ;AN000;
1468 .ELSEIF <columns_specified NE false> THEN ;AN000;
1469 MOV BL,columns_specified ;set up for call to handle_40_or_80 ;AN000;
1470 CALL HANDLE_40_OR_80 ;AN000;
1471 .ENDIF ;AN000;
1472
1473 .IF <need_typamat_call EQ true> THEN ;AN000;
1474 MOV BL,rate_holder ;AN000;
1475 MOV BH,delay_holder ;AN000;
1476 CALL typamat ;AN000;
1477 .ENDIF ;AN000;
1478 ;AN000;
1479 BREAK 0 ;AN000;
1480 ;AN000;
1481 ;AN000;
1482 status_for_everything_case: ;AN000;
1483 ;AN000;
1484 MOV request_type,printer_status ;status routine for printers ;AN000;
1485 MOV device_name,OFFSET LPT1_str ;will display the reroute ;AN000;
1486 CALL analyze_and_invoke ;status for the printer whether ;AN000;
1487 MOV device_name,OFFSET LPT2_str ;it exists or not, so call for ;AN000;
1488 CALL analyze_and_invoke ;all of them ;AN000;
1489 MOV device_name,OFFSET LPT3_str ;AN000;
1490 CALL analyze_and_invoke ;AN000;
1491 ;AN000;
1492 MOV request_type,all_con_status ;AN000;
1493 CALL analyze_and_invoke ;AN000;
1494
1495 CALL check_com_ports_attached ;return number of com ports in com_ports_attached ;AN000;
1496
1497 MOV request_type,com_status ;AN000;
1498 MOV CL,com_ports_attached ;AN000;
1499 .FOR i = 1 TO CL ;AN000;
1500
1501 .SELECT ;AN000;
1502
1503 .WHEN <i EQ 1> ;AN000;
1504 MOV device_name,OFFSET COM1_str ;AN000; ;AN000;
1505
1506 .WHEN <i EQ 2> ;AN000;
1507 MOV device_name,OFFSET COM2_str ;AN000;
1508
1509 .WHEN <i EQ 3> ;AN000;
1510 MOV device_name,OFFSET COM3_str ;AN000;
1511
1512 .WHEN <i EQ 4> ;AN000;
1513 MOV device_name,OFFSET COM4_str ;AN0;AN000;
1514
1515 .ENDSELECT ;AN000;
1516
1517 CALL analyze_and_invoke ;AN000; ;AN000;
1518 .NEXT i ;AN000;
1519
1520 BREAK 0 ;AN000;
1521
1522
1523
1524 turn_off_reroute_case: ;user specified only LPTx[:] ;AN000;
1525 ;INPUT:lptno=ASCII printer number
1526
1527
1528
1529 CALL modeecno ;turn off rerouting ;AN000;
1530 XOR CX,CX ;initialize prn_ports_attached
1531 CALL check_prn_ports_attached ;return number of printer cards in prn_ports_attached
1532 ADD prn_ports_attached,ASCII_0 ;CX=ASCII form of last printer number
1533 .IF <prn_ports_attached GE LPTNO> THEN ;IF the printer exists THEN
1534 CALL set_retry_type ;turn off infinit retry ;AN000;
1535 CALL modify_resident_code ;modify resident code to reflect retry turned off ;AN000;
1536 .ENDIF
1537
1538 BREAK 0 ;AN000;
1539
1540 ;AN000;
1541ENDCASE_0: ;AN000;
1542 ;AN000;
1543RET ;AN000;
1544 ;AN000;
1545analyze_and_invoke ENDP ;AN000;
1546 ;AN000;
1547 ;AN000;
1548PRINTF_CODE ENDS ;AN000;
1549 END ;AN000;