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

wirehaze git hosting

MZ is back!
[MS-DOS.git] / v4.0 / src / CMD / MODE / MODEPRIN.ASM
1 PAGE ,132 ;\ f
2 TITLE MODEPRIN.SAL - PRINTER SUPPORT FOR THE MODE COMMAND
3 .XLIST
4 INCLUDE STRUC.INC
5 .LIST
6 .SALL
7
8
9 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000;
10 ;º º ;AN000;
11 ;AN000;
12 ; AX001 - P3976: Need to have all pieces of messages in MODE.SKL so have to
13 ; implement the SYSGETMSG method of getting addressability to
14 ; the pieces. This means that the code does a SYSGETMSG call
15 ; which returns a pointer (DS:SI) to the message piece. The
16 ; address is then put in the sublist block for the message
17 ; being issued.
18 ;º º ;AN000;
19 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000;
20
21
22
23 DISPLAY MACRO MSG
24 MOV DX,OFFSET MSG
25 CALL PRINTF
26 ENDM
27
28 PRINT MACRO
29 MOV DX,WORD PTR PT17 ;PASS PRINTER NUMBER
30 INT 17H ;OUTPUT TO PRINTER
31 ENDM
32
33 COMPARE MACRO STRING, CHAR1, CHAR2, CHAR3
34 LOCAL END_COMPARE
35
36 ;------------------------------------------------------------------------------------------------
37 ;
38 ; Compare first 3 characters of STRING with CHAR1, CHAR2, and CHAR3
39 ;
40 ;------------------------------------------------------------------------------------------------
41
42 PUSH SI
43 MOV SI,0 ;INITIALIZE INDEX
44 CMP STRING[SI],CHAR1 ;IF first char is a match THEN
45 JNE END_COMPARE
46 INC SI ; GET TO NEXT CHAR OF STRING
47 CMP STRING[SI],CHAR2 ; IF 2nd char is a match THEN
48 JNE END_COMPARE
49 INC SI
50 CMP STRING[SI],CHAR3 ; IF all three match then ZR is not set
51 END_COMPARE:
52 POP SI
53 ENDM
54 ;
55 IF_NO_PRINTER_ERROR_THEN MACRO
56 CMP PRINTER_ERROR,TRUE
57 JE CHK_FOR_P
58 ENDM
59 ;
60 JUMP_EQUAL_TO_CHK_FOR_P MACRO
61 LOCAL SKIP_JUMP
62 ;
63 JNE SKIP_JUMP
64 JMP CHK_FOR_P
65 SKIP_JUMP:
66 ENDM
67
68
69 SET MACRO REG,VALUE ;SET REG TO VALUE. DON'T SPECIFY AX FOR REG
70
71 PUSH AX
72 MOV AX,VALUE
73 MOV REG,AX
74 POP AX
75
76 ENDM
77
78
79 set_submessage_ptr MACRO submessage,message ;PUT pointer to "subMESSAGE" into submessage pointer field of "message".
80
81 MOV AX,submessage ;AX=message number ;AN001;
82 MOV DH,utility_msg_class ;DH=message class=utility class ;AN001;
83 CALL SYSGETMSG ;DS:SI=>message piece ;AN001;
84 MOV BP,OFFSET sublist_&message ;address the sublist control block ;AN001;
85 MOV [BP].sublist_off,SI ;the sublist now points to the desired message piece ;AN001;
86 ENDM ;AN001;
87
88
89 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
90 ;º º
91
92 INCLUDE common.stc ;contains the following structure
93
94
95 ;parm_list_entry STRUC ;used by parse_parameters and invoke
96 ;
97 ;parm_type DB bogus
98 ;item_tag DB 0FFH
99 ;value1 DW bogus ;used only for filespecs and code page numbers
100 ;value2 DW bogus ;used only for filespecs and code page numbers
101 ;keyword_switch_ptr DW 0
102 ;
103 ;parm_list_entry ENDS
104
105
106 ;printer_settings STRUC ;map of the setting holders in resident code
107
108 ; chars_per_line DB ?
109 ; lines_per_inch DB ?
110
111 ;printer_settings ENDS
112
113 ;º º
114 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
115
116
117 ;
118 ROM SEGMENT AT 0
119 ORG 530H
120 RESSEG LABEL DWORD ;VECTOR POINTING TO MODETO IF RESIDENT
121 ROM ENDS
122
123 ;**********************************************************************
124 PRINTF_CODE SEGMENT PUBLIC
125 ASSUME CS:PRINTF_CODE,DS:PRINTF_CODE
126 ;
127
128 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
129 ;º º
130
131 EXTRN B_item_tag:ABS ;see modepars
132 EXTRN COM1_or_COM2:WORD ;=>"Must specify COM1 or COM2" message
133 EXTRN CTRL_ST:BYTE ;CONTROL STRING SET UP FROM CONFIGURATION PARAMETERS INPUT
134 EXTRN E_item_tag:ABS ;see modepars
135 EXTRN invalid_number_of_parameters:WORD ;=>"Invalid number of parameters"
136 EXTRN noerror:BYTE ;AN000;
137 EXTRN OFFRETRY:ABS ;OFFSET TO TEST INSTR IN RETRY CODE
138 EXTRN not_supported:WORD ;message telling user he specified "P" on a net printer
139 EXTRN PRINTR:WORD ;PRINTER BASE (40:8), HOLDS PORT ADDRESSES OF PRINTER CARDS
140 EXTRN ERR1:BYTE ;POINTER TO "Invalid parameters"
141 EXTRN Illegal_device_ptr:WORD ;pointer to device name that does not exist
142 ;AC001; EXTRN INF_OR_NO_PTR:WORD ;PART OF "... retry on parallel printer time-out" message
143 EXTRN INDEX:WORD ;INDEX OF REDIRECTED PRINTER IN NETWORK REDIRECTION LIST
144 EXTRN IS_LOCAL:BYTE ;BOOLEAN. INDICATES IF A PRINTER IS LOCAL. INITIALLY TRUE
145 EXTRN keyword:ABS
146 EXTRN LOCAL_NAME:BYTE ;FILLED IN BY GET ASSIGN LIST ENTRY FUNCTION CALL
147 EXTRN lpt1_retry_type:BYTE ;byte in resident code for retry mask, see rescode
148 EXTRN LPTNO:BYTE ;see modeecho
149 EXTRN machine_type:BYTE ;see "rescode"
150 EXTRN MODEECHO:NEAR ;SET UP REDIRECTION OF PARALLEL TO SERIAL
151 EXTRN MODELENG:NEAR
152 EXTRN MODELOAD:NEAR ;MOVES THE CODE AT MODETO TO 60 AND MAKES IT RESIDENT ;AN000;
153 EXTRN NET_ERROR:WORD ;"NET 042: Unable to do requested comand" ;AN000;
154 EXTRN NONE_item_tag:ABS ;AN000;see modepars ;AN000;
155 ;EXTRN no_retry_active:ABS ;see invoke.asm ;AN000;
156 EXTRN parm_lst:BYTE ;see modepars.asm ;AN000;
157 EXTRN P_item_tag:ABS ;see modepars.asm ;AN000;
158 ;EXTRN parallel_printer_settings:WORD ;see "rescode" ;AN000;
159 EXTRN P14_model_byte:ABS ;see "rescode" ;AN000;
160 EXTRN PRINTF:NEAR ;FORMATTED "C" LIKE SCREEN OUTPUT ROUTINE ;AN000;
161 EXTRN PARM1:BYTE,PARM2:BYTE,PARM3:BYTE,MODE:BYTE,FLAG:BYTE
162 EXTRN parm_list_holder:WORD ;address of parsed parameter list ;AN663;
163 EXTRN parms_form:BYTE ;AN000;
164 EXTRN DEVICE:BYTE,PPARM:BYTE ;AN000;
165 EXTRN R_item_tag:ABS ;AN000;
166 ;EXTRN res_lpt_retry_type:ABS ;retry type flag, displacement from address pointed to by 50:30 when code is res, see rescode
167 EXTRN retry_index:WORD ;see modecom.asm ;AN000;
168
169 EXTRN ERR2:WORD ;CR,LF,"Printer error",BEEP,CR,LF,"$"
170 EXTRN PT80:WORD ;CR,LF,"LPT"
171 EXTRN PT80N:BYTE ;DB " "
172 ; ": set for 80",CR,LF,"$"
173 EXTRN PT132:WORD ;CR,LF,"LPT"
174 EXTRN PT132N:BYTE ;" "
175 ; ": set for 132",CR,LF,"$"
176 EXTRN PTLINES:WORD ;CR,LF,"Printer lines per inch set",CR,LF,"$"
177 EXTRN NORETRY:WORD ;message number for CR,LF,'No','$' ;AC001;
178 EXTRN INFINITE:WORD ;message number for CR,LF,'Infinite' ;AC001;
179 EXTRN REMOTE_DEV:BYTE ;FILLED IN BY GET ASSIGN LIST ENTRY FUNCTION CALL
180 EXTRN RETPARTO:WORD ;message number for '%1 retry on parallel printer timeout',CR,LF,'$'
181 ;EXTRN ROOM_FOR_COLON:WORD ;INITIALLY 0, CHANGED TO 1 IF COLON IS INCLUDED
182 EXTRN sublist_retparto:BYTE ; control block for "%1 retry on parallel printer timeout" ;AC001;
183 EXTRN SYSGETMSG:NEAR ;AC001;
184 EXTRN utility_msg_class:ABS ;used for input to sysgetmsg
185 EXTRN VERIFY:NEAR ;FINDS IF n OF LPTn IS LEGAL
186
187 ;º º
188 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
189
190
191 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
192 ;º º
193
194 ;CR EQU 13 ;CARRIAGE RETURN
195 ;LF EQU 10 ;LINE FEED
196 ;BEEP EQU 7 ;SOUND THE AUDIBLE ALARM
197 ;EQUALSIGN EQU "=" ;CHAR IN LPTn:=COMm
198 busy_status EQU 080H ;flag telling resident code to not change anything
199 COLON EQU ":" ;CHAR IN "LPT1:"
200 error_status EQU 029H ;status byte indicating the printer is on fire(busy, no paper, I/O error, timeout)
201 FALSE EQU 00H
202 SPACE EQU " " ;THE BLANK CHARACTER
203 TO_SCREEN EQU 9 ;REQUEST OUTPUT TO SCREEN
204 INTCONV EQU 48 ;CONVERTS ASCII TO NUMERIC
205 EIGHTY EQU 80 ;80 COL PRINTER WIDTH
206 no_retry_flag EQU 0 ;no retry active, stored in lptx_retry_type, see rescode.sal
207 ONE_THIRTY_TWO EQU 132 ;132 COL PRINTER WIDTH
208 PRTDC2 EQU 18 ;PRINTER CONTROL CHAR FOR 80 COL
209 PRTSI EQU 15 ;PRINTER CONTROL CHAR FOR 132 CHAR
210 PRTCANCEL EQU 24 ;PRINTER CONTROL CHAR FOR CANCEL
211 CHAR6 EQU "6" ;REQUEST FOR 6 LINES PER INCH
212 CHAR8 EQU "8" ;REQUEST FOR 8 LINES PER INCH
213 L EQU "L"
214 P EQU "P"
215 T EQU "T"
216 R EQU "R"
217 N EQU "N"
218 NULL EQU 0 ;NULL CHAR
219 ASC0 EQU "0" ;ASCII 0, REQUEST 8 LINES PER INCH
220 ASC2 EQU "2" ;ASCII 2, REQUEST 6 LINES PER INCH
221 escape EQU 27 ;ESCAPE PRINTER CONTROL CHAR
222 PRINTERSETUP EQU 5E02H ;FUNCTION CODE FOR PRINTER SET UP DOS CALL
223 GET_LIST_ENTRY EQU 5F02H ;FUNCTION CODE FOR GET ASSIGN LIST ENTRY FROM NETWORK REDIR. LIST
224 CHAR_DEVICE EQU 3 ;CHARACTER DEVICE "MACRO" TYPE (IN NETWORK LINGO).
225 PRN_NO EQU 3 ;CHARACTER POSITION OF THE PRINTER NUMBER IN LPTn, (ZERO BASED)
226 ready_status EQU 90H ;flag telling resident code to set status indicating printer is ready for another character
227 UNCHANGED EQU -1 ;-1 INDICATES TO SERVER THAT PARAMTER IS UNCHANGED (NOT SPECIFIED)
228 unspecified EQU 0FFH ;AN000;value of parm2 if no lines per inch was specified
229 TRUE EQU 0FFH
230 ENDPARM EQU MODE
231 ;PARMNO EQU PARM1+3 ;LOCATION OF DEVICE NUMBER
232 ;PARMCOL EQU PARM1+4 ;LOCATION OF COLON IN LPTn:
233 ;PARMEQ EQU PARM1+4 ;LOCATION OF = IN LPTn= ,(NO COLON SPECIFIED)
234 parm_list EQU [BP]
235
236 ;º º
237 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
238
239
240 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
241 ;º º
242
243 ;PARM1 DB 10 DUP(0)
244 ;PARM2 DB -1 ;HOLDS LINES PER INCH IN CHARACTER FORM
245 ;PARM3 DB 0
246 ;MODE DB 0
247 ;FLAG DB 0
248 ;CTRL_ST DB 5 DUP(PRTCANCEL)
249 ;INDEX DW 0
250 columns_holder DB bogus
251 i DB 0 ;loop index for retry index calculation
252 PT17 DW 0 ;SAVES PRINTER NUMBER FOR DX AND INT 17H
253 LPTN DB 0 ;SAVES ID OF WHICH LPTn IS REFERENCED
254 PRINTER_NO DB 0 ;SAVES LPT NUMBER IN ZERO BASED NUMERICAL FORM
255 CTRL_ST_LEN DW 0000 ;HOLDER FOR LENGTH OF THE CONTROL STRING
256 REDIRECTED DB 00 ;FLAG TO INDICATE A PRINTER IS ON THE NETWORK
257 CHARS_LINE DB -1 ;HOLDS CHARACTERS PER LINE IN NUMERIC FORM
258 NO_COLON DW 00 ;CHAR POSITIONS TO MOVE IF NO COLON INCLUDED IN DEVICE NAME
259 ;nothing_past_LPTn_colon_equal DB ":","=",0,0,0,0 ;just "LPTn:=" as parameters
260 ;len_nothing_past_LPTn_colon_equal EQU $-nothing_past_LPTn_colon_equal
261 ;nothing_past_LPTn_equal DB "=",0,0,0,0,0 ;just "LPTn=" as parameters
262 ;len_nothing_past_LPTn_equal EQU $-nothing_past_LPTn_equal
263 ;nothing_past_LPTn_colon DB ":",0,0,0,0,0 ;just "LPTn:" as parameters
264 ;len_nothing_past_LPTn_colon EQU $-nothing_past_LPTn_colon
265 ;nothing_past_LPTn DB 0,0,0,0,0,0 ;just "LPTn" as parameters
266 ;len_nothing_past_LPTn EQU $-nothing_past_LPTn
267 PTLINES_REQ DB 00 ;BOOLEAN INDICATOR OF LINES PER INCH REQUESTED
268 PRINTER_ERROR DB 00 ;BOOLEAN INDICATOR OF PRINTER NOT THERE OR OFF OR OFFLINE
269 EIGHTY_CHARS_LINE_REQ DB 00 ;BOOLEAN, INDICATES IF 80 CHARS/LINE REQUESTED
270 REQ_132_CHARS_LINE DB 00 ;BOOLEAN, INDICATES IF 132 CHARS/LINE REQUESTED
271
272 ;º º
273 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
274
275
276 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
277 ;º º
278
279 PUBLIC busy_status ;used by rescode in parallel retry code
280 PUBLIC columns_holder ;AN000;
281 PUBLIC error_status ;used by analyze_and_invoke and rescode
282 PUBLIC modify_resident_code ;used by invoke ;AN000;
283 PUBLIC MODEPRIN
284 PUBLIC no_retry_flag ;used by analyze_and_invoke
285 PUBLIC printer_no ;needed by modepars
286 PUBLIC ready_status ;used by analyze_and_invoke
287 ;PUBLIC set_retry_flag ;used by invoke in turn_off_retry_case
288 PUBLIC set_retry_type ;used by invoke in turn_off_retry_case
289
290 ;º º
291 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
292
293
294 ;*******************************************************************
295 MODEPRIN PROC NEAR
296
297
298 ;On entry: "columns_holder" contains 132,80 or 88H.
299 ; "parm2" contains "[6³8]" (FFH if not specified).
300 ; "parm_list[retry_index]" contains "X_item_tag" where X is e, b, r, or p
301
302 MOV AL,LPTNO ;AN000;LPTNO set up by modepars in first_parm_case
303 MOV PT80N,AL ;PUT ASCII PRINTER NUMBER INTO BOTH
304 MOV PT132N,AL ; MESSAGES
305 SUB AL,INTCONV+1 ;CONVERT TO INTEGER, MINUS ONE
306 MOV PRINTER_NO,AL ;SAVE ZERO BASED PRINTER NUMBER
307 MOV AH,0 ;CLEAR AH
308 MOV WORD PTR PT17,AX ;SET UP PRINTER NUMBER FOR INTERRUPT 17H
309
310
311 MOV DI,0 ;INITIALIZE LENGTH OF CONTROL STRING
312 MOV BL,columns_holder ;BL=binary form of requested chars per line
313 ; : : : IF REQUEST IS FOR 80 COL
314 CMP BL,EIGHTY
315 JNE ELSEIF03
316 ;
317 MOV CHARS_LINE,BL ;SAVE CHARACTERS PER LINE
318 MOV EIGHTY_CHARS_LINE_REQ,TRUE
319 MOV BL,PRTDC2 ;SEND A DC2 CHAR TO SELECT 80 COL
320 ; : : : ELSEIF SINCE NOT 80, IS REQUEST FOR 132?
321 JMP SHORT ENDIF03
322 ELSEIF03:
323 CMP BL,ONE_THIRTY_TWO ;132?
324 JNE ENDIF03 ;AC000;
325 ;
326 MOV CHARS_LINE,BL ;SAVE CHARACTERS PER LINE
327 MOV REQ_132_CHARS_LINE,TRUE
328 MOV BL,PRTSI ;SEND 'SI', CONDENSED PRINT
329 ; : : : ENDIF ,END IS REQUEST FOR 80 COL
330 ENDIF03:
331
332 ; : : : IF ANYTHING TO PRINT,
333 CMP BL,bogus ;AC000;
334 JE ENDIF04
335
336 MOV BYTE PTR CTRL_ST[DI],BL ;PUT CONTROL CHAR FOR COLS/LINE IN CONTROL STRING
337 INC DI ;GET TO NEXT CHAR POSITION IN CONTROL STRING
338
339
340 ; : : : ENDIF END IF ANYTHING TO PRINT? TEST
341 ENDIF04:
342
343 PUBLIC ENDIF04
344
345 ;*****************************************************************
346 ; LOOK AT THE SECOND PARM, CHECKING FOR 6 OR 8 LINES PER INCH
347 ;*****************************************************************
348 MOV BL,NULL ;NULL CHAR, TO BE REPLACED MAYBE
349 ; : : : IF THERE IS A SECOND PARM,
350 CMP DS:PARM2,unspecified ;AC000;
351 JE ENDIF05
352 ;
353 ; : : : : IF THE REQUEST FOR 6 LINES PER INCH?
354 CMP DS:PARM2,CHAR6
355 JNE ELSEIF06
356 ;
357 MOV BL,ASC2 ;REQUEST 6 LPI
358 ; : : : : ELSEIF REQUEST IS FOR 8 LINES PER INCH
359 JMP SHORT ENDIF06
360 ELSEIF06:
361 CMP DS:PARM2,CHAR8
362 JNE ENDIF06
363 MOV BL,ASC0 ;REQUEST 8 LINES PER INCH
364 ; : : : : ENDIF ,END IS REQUEST FOR 6 LPI? TEST
365 ENDIF06:
366 ; : : : ENDIF END IS THERE A SECOND PARM? TEST
367 ENDIF05:
368 ; : : : IF 6 OR 8 LINES PER INCH REQUESTED
369 CMP BL,0
370 JE ENDIF07
371 MOV CTRL_ST[DI],escape ;PUT AN ESCAPE CHAR IN THE CONTROL STRING
372 INC DI ;GET TO NEXT CHAR POSITION IN THE CONTROL STRING
373 ;
374 MOV BYTE PTR CTRL_ST[DI],BL ;PUT CONTROL CHAR FOR LINES/INCH IN CONTROL STRING
375 INC DI ;GET TO NEXT CHAR POSITION IN THE CONTROL STRING
376 ;
377 MOV PTLINES_REQ,TRUE ;INDICATE LINES PER INCH SET IF NO PRINTER ERROR
378 ; : : : ENDIF END IS 6 OR 8 LPI REQUESTED? TEST
379 ENDIF07:
380 CALL VERIFY ;SEE IF n OF LPTn WAS LEGAL
381 MOV BYTE PTR LPTN,AH ;SAVE THE n OF LPTn
382 ;
383 MOV BX,0
384 PUSH BX
385 POP ES ;GET ADDRESSABILITY TO PRINTER BASE
386 MOV BL,PRINTER_NO ;PUT ZERO BASED PRINTER NUMBER INTO BL
387 SAL BL,1 ;CHANGE TO WORD OFFSET FROM PRINTER BASE (40:8)
388 CMP ES:PRINTR[BX],0 ;SEE IF THERE IS NO PORT ADDRESS FOR THE SPECIFIED PRINTER THEN
389 JNE PRINTER_EXISTS
390 MOV IS_LOCAL,FALSE ;NOT A LOCAL PRINTER
391 PRINTER_EXISTS:
392 ;
393 ;**************************************************************************************************
394 ; SEARCH THE NETWORK REDIRECTION LIST
395 ;
396 ; IF THE PRINTER IS FOUND IN THE LIST THEN THE CONTROL STRING HAS TO BE SENT TO THE REDIRECTOR,
397 ; OTHERWISE THE CONTROL STRING WILL BE SENT DIRECTLY TO THE LOCAL PRINTER.
398 ; AN INDEX WILL BE INITIALIZED TO ZERO. A GET ASSIGN LIST ENTRY CALL WILL BE MADE, THE DEVICE
399 ; TYPE IS CHECKED FOR CHARACTER DEVICE TYPE. IF THE ENTRY IS A CHARACTER DEVICE THEN THE NAME IS
400 ; COMPARED WITH THE NAME OF THE PRINTER TO BE CONFIGURED. IF THE NAMES MATCH THEN WE KNOW THAT
401 ; THE PRINTER HAS BEEN PUT ON THE NETWORK, ELSE WE CONTINUE DOWN THE LIST BY INCREMENTING THE
402 ; INDEX AND MAKING ANOTHER GET ASSIGN LIST ENTRY CALL. THIS CONTINUES UNTIL THE END OF THE NRL
403 ; IS REACHED OR THE PRINTER IS FOUND.
404 ; GET ASSIGN LIST ENTRY CALL WORKS AS FOLLOWS: 5F02H IS PUT IN AX, THE INDEX IS PUT IN BX. ON
405 ; RETURN DS:SI POINTS TO THE LOCAL NAME, ES:DI POINTS TO REMOTE NAME, CX HAS THE DEVICE TYPE. IF
406 ; CARRY IS SET AX HAS ERROR CODE: INVALID FUNCTION (NETWORK SUPPORT IS NOT PRESENT) OR, NO MORE
407 ; FILES (THE INDEX IS GREATER THAN THE NUMBER OF NETWORK ASSIGNMENTS).
408 ;
409 ;**************************************************************************************************
410 ;
411 SEE_IF_REDIRECTED:
412
413 PUBLIC SEE_IF_REDIRECTED
414
415 MOV CTRL_ST_LEN,DI ;SAVE LENGTH OF CONTROL STRING
416 DEC INDEX ;SET INDEX TO -1 SO IT WILL BEGIN AT ZERO
417 SRCH_NRL:
418 MOV AX,GET_LIST_ENTRY ;SET UP FOR GET ASSIGN LIST ENTRY FUNCTION CALL
419 INC INDEX
420 MOV BX,INDEX ;BX GETS THE INDEX OF THE ENTRY TO BE FECTHED
421 MOV SI,OFFSET LOCAL_NAME ;DS:SI POINTS TO HOLDING AREA FOR LOCAL DEVICE NAME
422 PUSH DS
423 POP ES ;ES GETS THE SEGMENT OF REMOTE DEVICE NAME HOLDING AREA
424 MOV DI,OFFSET REMOTE_DEV ;ES:DI POINTS TO (USELESS) REMOTE DEVICE NAME HOLDING AREA
425 INT 21H
426 JNC CHK_DEV_TYPE
427 JMP NOT_RED ;IF CARRY IS SET THEN THE PRINTER IS NOT REDIRECTED
428 CHK_DEV_TYPE:
429 CMP BL,CHAR_DEVICE ;ELSE CHECK THE DEVICE TYPE
430 JE CHECK_NAME ;IF THE DEVICE TYPE IS CHAR DEVICE THEN COMPARE NAMES
431 JMP SRCH_NRL ;ELSE CONTINUE SEARCH
432 CHECK_NAME: ;SEE IF THE LOCAL NAME IS THE PRINTER TO BE CONFIGURED
433 ; Count the number of characters in the local name
434 MOV SI,00 ;INITIALIZE THE CHARACTER COUNTER
435 COUNT:
436 CMP LOCAL_NAME[SI],NULL ;WHILE (char<>null) AND (char<>space) DO
437 JE CHECK_1st_3 ;END OF NAME
438 CMP LOCAL_NAME[SI],SPACE
439 JE CHECK_1st_3 ; END OF NAME
440 INC SI ; INCREMENT NUMBER OF CHARS IN THE NAME
441 JMP COUNT ;END WHILE non-termination char
442 CHECK_1st_3: ;SEE IF 1st 3 CHARS ARE LPT OR PRN
443 CMP SI,4 ;IF the name is 4 or less chars THEN
444 JG CONTINUE_SEARCH ;NAME IS TOO LONG
445 COMPARE LOCAL_NAME, L, P, T
446 JNE CHECK_FOR_PRN
447 MOV AL,PT80N ;PUT PRINTER NUMBER IN AL
448 CMP LOCAL_NAME[PRN_NO],AL ;CHECK PRINTER NUMBER
449 JE END_CHECK_NAME ;FOUND THE PRINTER IN THE LIST
450 CHECK_FOR_PRN:
451 COMPARE LOCAL_NAME, P, R, N
452 JNE CONTINUE_SEARCH ;NOT REDIRECTED AS PRN EITHER
453 CMP PT80N,1 ;IF printer to be configured is lpt1 THEN
454 JNE CONTINUE_SEARCH
455 JMP SHORT END_CHECK_NAME ;FOUND THE PRINTER IN THE LIST
456 CONTINUE_SEARCH:
457 JMP SRCH_NRL
458 END_CHECK_NAME:
459
460 PUBLIC END_CHECK_NAME
461
462 MOV REDIRECTED,TRUE ;REDIRECTED:=TRUE. THE PRINTER WAS FOUND IN NRL
463 ;
464 ;**************************************************************************************************
465 ; INDICATE TO SERVER THAT THE CONFIGURATION OF A NETWORK PRINTER HAS CHANGED.
466 ;
467 ; SET DS:SI TO POINT TO THE PRINTER NAME, CHARS_LINE HAS THE CHARACTERS PER LINE, PARM2 HAS THE
468 ; LINES PER INCH IN CHARACTER FORM.
469 ;**************************************************************************************************
470 ;\ f
471 CMP CTRL_ST_LEN,0 ;IF printer configuration has changed THEN
472 JUMP_EQUAL_TO_CHK_FOR_P
473 MOV SI,OFFSET LOCAL_NAME ;DS:SI POINTS TO PRINTER NAME
474 MOV AH,02
475 XOR AL,AL ;AL=0
476 MOV CL,8 ;CL HOLDS SHIFT COUNT. 8 IS NUMBER OF BITS NEEDED FOR 132.
477 MOV DL,CHARS_LINE ;MOV 80 or 132 or FF INTO ACCUMULATOR REGISTER
478 ROR DL,1 ;IF (DL=50H) OR (DL=84H) THEN DL[7]=0 ELSE DL=FFH
479 SAR DL,CL ;IF (CHARS_LINE = 80) OR (CHARS_LINE = 132) THEN
480 MOV BH,DL ;BH=0 ELSE BH=BL=FFH
481 MOV BL,CHARS_LINE ;BX= -1 or 80 or 132
482 MOV CL,PARM2
483 CMP PARM2,bogus ;IF THE LINES PER INCH WASN'T SPECIFIED THEN DON'T CONVERT
484 JNE CONVERT
485 MOV CH,UNCHANGED ;CX=-1 (FFFF)
486 JMP CALL_SERVER
487 CONVERT: ;ELSE
488 XOR CH,CH ;CLEAR CH
489 SUB CX,INTCONV ;CHANGE LINES PER INCH TO NUMERIC FORM
490 CALL_SERVER: ;ENDIF
491 INT 2AH ;CALL SERVER
492 ;
493 ;**************************************************************************************************
494 ; SET UP REDIRECTOR WITH CONTROL STRING BUFFER VIA A PRINTER SET UP CALL.
495 ;
496 ; DI HAS LENGTH OF THE CONTROL STRING. NEED TO SET DS:SI TO THE POINT TO THE CONTROL STRING
497 ; BUFFER, PUT THE LENGTH IN CX, AND THE NETWORK REDIRECTION LIST INDEX FOR THE PRINTER IN BX.
498 ;**************************************************************************************************
499 ;
500 CMP CTRL_ST_LEN,0 ;IF there is something to send to a printer THEN
501 JUMP_EQUAL_TO_CHK_FOR_P
502 MOV AX,PRINTERSETUP ;SET UP FOR PRINTER SET UP FUNCTION CALL.
503 MOV SI,OFFSET CTRL_ST ;DS HAS SEG OF CONTROL ST. BUFFER, DS:SI POINTS TO BUFFER
504 MOV CX,CTRL_ST_LEN ;CX GETS LENGTH OF CONTROL STRING BUFFER.
505 MOV BX,INDEX ;BX GETS NRL INDEX OF REDIRECTED PRINTER.
506 INT 21H ;PERFORM PRINTER SET UP.
507 ; $IF C ;IF CARRY THERE IS A DESCREPENCY BETWEEN
508 JNC $$IF1
509 DISPLAY NET_ERROR ;GET ASS LIST ENTRY AND PRINTER SET UP
510 ; $ELSE ;REDIRECTOR IS RESIDENT AND PRINTER SETUP
511 JMP SHORT $$EN1
512 $$IF1:
513 ;CALL WAS SUCCESSFUL SO TELL USER WHAT
514 CMP EIGHTY_CHARS_LINE_REQ,TRUE ;HAPPENED
515 ; $IF E ;IF 80 chars/line requested THEN
516 JNE $$IF3
517 DISPLAY PT80 ; WRITELN("LPT? set for 80")
518 ; $ELSE ;ELSE
519 JMP SHORT $$EN3
520 $$IF3:
521 CMP REQ_132_CHARS_LINE,TRUE
522 ; $IF E ; IF 132 chars/line requested THEN
523 JNE $$IF5
524 DISPLAY PT132 ; WRITELN("LPT? set for 132")
525 ; $ENDIF ; ENDIF
526 $$IF5:
527 ; $ENDIF ;ENDIF
528 $$EN3:
529 CMP PTLINES_REQ,TRUE ;IF lines/inch requested THEN
530 ; $IF E
531 JNE $$IF8
532 DISPLAY PTLINES ; WRITELN("Printer lines per inch set")
533 ; $ENDIF ;ENDIF
534 $$IF8:
535 ; $ENDIF ;ENDIF
536 $$EN1:
537 JMP CHK_FOR_P
538 ;******************************************************************************************
539 ; SEND THE CONTROL STRING TO THE LOCAL PRINTER
540
541 ; EACH CHARACTER OF THE CONTROL STRING IS TAKEN OUT OF THE BUFFER "CTRL_ST" AND SENT TO THE
542 ; PRINTER STARTING WITH THE FIRST CHARACTER. ON ENTRY DI HAS THE NUMBER OF CHARACTERS IN
543 ; THE CONTROL STRING. SI IS USED TO INDEX INTO THE CONTROL STRING.
544 ;******************************************************************************************
545 ;
546 NOT_RED:
547 CMP IS_LOCAL,TRUE ;IF the device is local THEN
548 JE ELSE02
549 JMP SHORT ELSE01 ;or on the network
550 ELSE02:
551 CMP CTRL_ST_LEN,0 ;IF there is something to send to a printer THEN
552 JE CHK_FOR_P
553 MOV SI,0 ;INITIALIZE CHARACTER POSITION INDEX FOR CONTROL STRING
554 FOR: ;FOR each_char_in_control_string DO. FOR DI=no_chars DOWN TO 0 DO
555 DEC CTRL_ST_LEN ;DECREMENT LOOP COUNTER
556 MOV AH,NULL ;CLEAR ERROR CODE FROM AH
557 MOV AL,BYTE PTR CTRL_ST[SI] ;MOVE NEXT CONTROL CHAR TO AL
558 CALL OUTCHR ;SEND THE CHARACTER TO THE PRINTER, HANDLING ERRORS
559 INC SI ;GET TO NEXT CHAR POSITION IN CONTROL STRING
560 CMP CTRL_ST_LEN,0 ;CHECK IF ALL CHARACTERS HAVE BEEN SENT
561 JNE FOR ;LOOP UNTIL ALL CONTROL CHARACTERS HAVE BEEN SENT
562 ;
563 IF_NO_PRINTER_ERROR_THEN
564 CMP EIGHTY_CHARS_LINE_REQ,TRUE ;IF 80 chars/line requested THEN
565 JNE WAS_132_CHARS_LINE_REQ
566 DISPLAY PT80 ; WRITELN("LPT? set for 80")
567 JMP SHORT WAS_LINES_INCH_SPEC
568 WAS_132_CHARS_LINE_REQ: ;ELSE
569 CMP REQ_132_CHARS_LINE,TRUE ; IF 132 chars/line requested THEN
570 JNE WAS_LINES_INCH_SPEC
571 DISPLAY PT132 ; WRITELN("LPT? set for 132") ENDIF
572 WAS_LINES_INCH_SPEC: ;ENDIF
573 CMP PTLINES_REQ,TRUE ;IF lines/inch requested THEN
574 JNE LINES_NOT_REQ
575 DISPLAY PTLINES ; WRITELN("Printer lines per inch set")
576 LINES_NOT_REQ: ;ENDIF
577 ;
578 ;****************************************************************
579 ; CALL PROCEDURE TO SET THE RETRY FLAG
580 ;****************************************************************
581 ;
582 CHK_FOR_P:
583
584 public CHK_FOR_P
585
586 CALL set_retry_type
587 CALL modify_resident_code
588
589
590 JMP SHORT ENDIF01
591 ELSE01:
592
593 PUBLIC ELSE01
594
595 MOV DI,0 ;the device name is always the first parm ;AN000;
596 MOV BP,OFFSET parm_lst ;address the parm list via parm_list which is [BP] ;AN000;
597 MOV BX,parm_list[DI].value1 ;AN000;
598 MOV illegal_device_ptr,BX
599 MOV BYTE PTR [BX][4],0 ;AN000;chop off the string at 4, so "LPT1132" will be displayed as "LPT1"
600 DISPLAY err1 ;AN000;"Illegal device name - LPTX"
601 MOV noerror,false ;AN000;
602 ; ENDIF COLON IS MISSING
603 ENDIF01:
604 ; $ENDIF ;there was a chance that the parameters were valid
605 ; $ENDIF ;there were enough paramters specified
606
607 RET ;RETURN TO MODE MAIN ROUTINE
608
609 MODEPRIN ENDP
610
611 ;******************************************************************************
612
613 modify_resident_code PROC NEAR ;AN000;
614
615
616 CALL LOADED_YET ;on return ES:DI points to res copy of "modeto" if loaded
617 ; : :IF RESIDENT CODE IS ALREADY LOADED
618 .IF Z THEN NEAR
619 ; MODIFY LOADED CODE TO REFLECT WHO GETS RETRIED NOW
620 MOV BX,OFFSET lpt1_retry_type ;BX=> first of 3 retry mask bytes ;AC000;
621 XOR SI,SI ;clear code modification index ;AN000;
622 .FOR DI = 0 TO 2 ;FOR LPT1 TO LPT3 check the retry mask byte ;AN000;
623 .IF <<BYTE PTR ES:[BX][DI]> NE no_retry_flag> THEN ;IF at least one type of retry on THEN ;AN000;
624 OR SI,8 ;OR in 00001000 which shifts into proper position ;AN000;
625 .ENDIF ;AN000;
626 SHR SI,1 ;AN000;
627 .NEXT DI ;DI=1 or 2, SI=0,1 ,2 ,3 ,4 ,5 ,6 or 7 ;AN000;
628 SHL SI,1 ;SI=0, 2, 4, ... , 14, INDEX TO SHOW WHICH LPTns to be retried ;AC000;
629 MOV BX,OFFRETRY ;OFFSET TO TEST INSTR IN RETRY CODE
630 CLI ;DISABLE INTERRUPTS
631 MOV BYTE PTR ES:[BX]+4,5 ;SET JMP TARGET TO +5
632 JMP CASE[SI] ;CALL BRANCH TABLE
633 ;
634 CASE DW P0
635 DW P1
636 DW P2
637 DW P3
638 DW P4
639 DW P5
640 DW P6
641 DW P7
642 ;
643 P0:
644 ; SINCE NO PRINTER IS TO BE RETRIED
645 MOV WORD PTR ES:[BX]+3,00EBH ;MAKE JUMP INTO NOP
646 ; TO CAUSE FALL THRU TO JMP PRINTER_IO INSTR
647 JMP SHORT ENDC
648 ;
649 P1:
650 ; RETRY LPT1 ONLY
651 MOV WORD PTR ES:[BX]+2,7403H ;TEST 3 : JZ RT
652 JMP SHORT ENDC
653 ;
654 P2:
655 ; RETRY LPT2 ONLY
656 MOV WORD PTR ES:[BX]+2,7501H ;TEST 1 : JNZ RT
657 JMP SHORT ENDC
658 ;
659 P3:
660 ; RETRY LPT1 AND LPT2 ONLY
661 MOV WORD PTR ES:[BX]+2,7402H ;TEST 2 : JZ RT
662 JMP SHORT ENDC
663 ;
664 P4:
665 ; REDIRECT LPT3 ONLY
666 MOV WORD PTR ES:[BX]+2,7502H ;TEST 2 : JNZ RT
667 JMP SHORT ENDC
668 ;
669 P5:
670 ; REDIRECT LPT1 AND LPT3 ONLY
671 MOV WORD PTR ES:[BX]+2,7401H ;TEST 1 : JZ RT
672 JMP SHORT ENDC
673 ;
674 P6:
675 ; REDIRECT LPT2 AND LPT3 ONLY
676 MOV WORD PTR ES:[BX]+2,7503H ;TEST 3 : JNZ RT
677 JMP SHORT ENDC
678 ;
679 P7:
680 ; REDIRECT ALL THREE: LPT1, LPT2, AND LPT3
681 MOV WORD PTR ES:[BX]+2,0EB00H ;TEST 0 : JMP SHORT RT
682 ;
683 ENDC:
684 STI ;REENABLE INTERRUPTS
685 ; : : : ENDIF RESIDENT CODE IS ALREADY LOADED
686 .ENDIF
687
688 RET ;AN000;
689
690 modify_resident_code ENDP ;AN000;
691
692
693 ;**********************************************************
694 ;FIRST_INSTR EQU 0C2F6H ;THE FIRST INSTRUCTION OF THE LOADED CODE
695 ; SEE THE RESIDENT CODE MODULE FOR ENTRY SYMBOL MODETO
696 ; THE FIRST INSTRUCTION THERE IS:
697 ; TEST DL,1
698 ; WHICH ASSEMBLES AS:
699 ; F6 C2 01
700
701
702 LOADED_YET PROC NEAR
703
704
705 ; ON EXIT, THE ZERO FLAG REFLECTS THE LOADED STATE
706 ; ES:DI=ADDR OF MODETO, OR ZERO
707 ; Z=ON, LOADED
708 ; Z=OFF,NOT LOADED YET
709 ;
710 PUSH AX ;SAVE REG
711 ;
712 SUB AX,AX ;ZERO A REG
713 MOV ES,AX ;SET SEGREG TO VECTORS AT 0
714 LES DI,ES:RESSEG ;GET ADDR OF RESIDENT CODE, IF THERE, ES:DI points to 'modeto' or is 0
715 CMP DI,0 ;see if something at 50:30
716 ; $IF NE ;IF code loaded THEN
717 JE $$IF11
718 CMP AX,AX ;SET THE ZERO FLAG TO RELFECT IT IS LOADED
719 ; $ELSE
720 JMP SHORT $$EN11
721 $$IF11:
722 CMP AX,0FFH ;RESET THE ZERO FLAG TO REFLECT IT IS NOT LOADED
723 ; $ENDIF
724 $$EN11:
725 ;
726 POP AX ;RESTORE CALLER'S REGS
727 RET
728 LOADED_YET ENDP
729
730
731 ;*******************************************************************
732 OUTCHR PROC NEAR
733 PRINT ;OUTPUT CHARACTER TO PRINTER
734 AND AH,0A9H ;MASK OFF ERROR BITS
735 ; IF WE GOT AN ERROR RETURN CODE
736 CMP AH,NULL
737 JE ENDIF02
738 ;
739 CMP PRINTER_ERROR,TRUE
740 JE ALREADY_YELLED
741 DISPLAY ERR2 ;DISPLAY ERROR MESSAGE
742 MOV PRINTER_ERROR,TRUE
743 ALREADY_YELLED:
744 ; ENDIF ,END GOT AN ERROR RETURN CODE? TEST
745 ENDIF02:
746 RET ;RETURN TO MAIN PROC
747 OUTCHR ENDP
748 ;
749 ;
750 ;
751 ;-------------------------------------------------------------------------------
752 ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
753 ;³ ³
754 ;³ SET_RETRY_FLAG ³
755 ;³ -------------- ³
756 ;³ ³
757 ;³ Set the resident retry flag to type of retry active for lptX. ³
758 ;³ ³
759 ;³ INPUT: device - holds '1', '2', or '3' (ascii) for x of lptx. ³
760 ;³ retry_index - holds index value for the parsed retry parameter. ³
761 ;³ redirected - holds true/false value for redirected status of lptx. ³
762 ;³ parm_list_holder - holds offset of parameter list. ³
763 ;³ resseg - holds offset of resident code in memory ³
764 ;³ res_lpt_retry_type - holds offset of lpt retry flag in resident ³
765 ;³ code. ³
766 ;³ ³
767 ;³ ³
768 ;³ RETURN: pparm - set to 'P', 'B', 'R', 'E', or '-' for type of retry active.³
769 ;³ flag in resident code set ³
770 ;³ ³
771 ;³ ³
772 ;³ MESSAGES: Infinite retry not supported on network printer. ³
773 ;³ ³
774 ;³ ³
775 ;³ REGISTER ³
776 ;³ USAGE: AL - new setting for resident flag. (see RESCODE.SAL for ³
777 ;³ format) ³
778 ;³ CL - shift bit count ³
779 ;³ ES - holds segment of resident code ³
780 ;³ BP - offset of parameter list ³
781 ;³ DI - offset of retry index within parameter list ³
782 ;³ DL - current resident flag setting ³
783 ;³ ³
784 ;³ ³
785 ;³ PSUEDO CODE: ³
786 ;³ ³
787 ;³ SAVE REGISTERS ³
788 ;³ SET UP SEGMENT REGISTER AND BIT MASKS ³
789 ;³ IF <RETRY REQUESTED> ³
790 ;³ IF <PRINTER IS REDIRECTED> ³
791 ;³ PRINT ERROR MESSAGE - not supported on network printer. ³
792 ;³ ELSE ³
793 ;³ SET UP PARAMETER LIST STRUCTURE ³
794 ;³ SET BIT MASK FOR TYPE OF RETRY AND SET pparm TO PROPER LETTER ³
795 ;³ IF <RESIDENT CODE IS NOT LOADED> ³
796 ;³ LOAD RESIDENT CODE ³
797 ;³ ENDIF ³
798 ;³ GET CURRENT res_lpt_retry_type ³
799 ;³ SET AND STORE NEW res_lpt_retry_type ³
800 ;³ ENDIF ³
801 ;³ ELSEIF <RESIDENT CODE ALREADY LOADED> ³
802 ;³ GET CURRENT res_lpt_retry_type ³
803 ;³ IF <POSITIONAL PARAMETER SPECIFIED> ³
804 ;³ SET FLAG TO ZERO, SET pparm TO PROPER LETTER ³
805 ;³ ELSE ³
806 ;³ SET pparm TO PROPER LETTER FOR CURRENT SETTING ³
807 ;³ ENDIF ³
808 ;³ ELSE ³
809 ;³ SET pparm TO '-' ³
810 ;³ ENDIF ³
811 ;³ RESTORE REGISTERS ³
812 ;³ RETURN ³
813 ;³ ³
814 ;³ ³
815 ;³ ³
816 ;³ SIDE EFFECT: Loads resident code if it is needed and has not been loaded. ³
817 ;³ ³
818 ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
819 ;
820 ;set_retry_flag PROC NEAR ;AN663;
821 ; ;AN663;
822 ; PUSH ES ;save registers ;AN663;
823 ; PUSH DI ;AN663;
824 ; PUSH AX ;AN663;
825 ; PUSH DX ;AN663;
826 ; ;AN663;
827 ; XOR AX,AX ;clear a reg ;AN663;
828 ; MOV ES,AX ;set to segment at 0 ;AN663;
829 ; MOV CL,device ;AN663;
830 ; AND CL,07H ;AN663;
831 ; DEC CL ;AN663;
832 ; SHL CL,1 ;AN663;
833 ; MOV DH,11111100B ;set bit mask to get rid of old setting ;AN663;
834 ; ROL DH,CL ;rotate bits into position ;AN663;
835 ; ;AN663;
836 ; .IF <retry_index NE 0> THEN ;AN663;
837 ; ;AN663;
838 ; .IF <redirected EQ true> THEN ;AN663;
839 ; ;AN663;
840 ; display not_supported ;infinite retry not supported on network printer ;AN663;
841 ; ;AN663;
842 ; .ELSE NEAR ;not a network printer ;AN663;
843 ; ;AN663;
844 ; MOV DI,retry_index ;AN663;
845 ; MOV BP,parm_list_holder ;set up addressability to the list of parsed parms,set "parm_list" ;AN663;
846 ;
847 ; .SELECT ;AN663;
848 ;
849 ; .WHEN <parm_list[DI].item_tag EQ P_item_tag> OR ;AN663;
850 ; .WHEN <parm_list[DI].item_tag EQ E_item_tag> ;AN663;
851 ; MOV AL,error_retry_active ;AN663;
852 ;
853 ; .WHEN <parm_list[DI].item_tag EQ B_item_tag> ;AN663;
854 ; MOV AL,busy_retry_active ;AN663;
855 ;
856 ; .WHEN <parm_list[DI].item_tag EQ R_item_tag> ;AN663;
857 ; MOV AL,ready_retry_active ;AN663;
858 ;
859 ; .WHEN <parm_list[DI].item_tag EQ NONE_item_tag> ;AN663;
860 ; MOV AL,no_retry_active ;AN663;
861 ;
862 ; .ENDSELECT
863 ;
864 ; .IF <AL EQ no_retry_active> THEN
865 ; MOV INF_OR_NO_PTR,OFFSET NORETRY ;modify message to indicate no retry
866 ; .ELSE ;AN663;
867 ; MOV INF_OR_NO_PTR,OFFSET INFINITE ;modify message to indicate retry ;AN663;
868 ; .ENDIF ;AN663;
869 ; ;AN663;
870 ; .IF <<WORD PTR ES:resseg> EQ 0000H> THEN ;AN663;
871 ; CALL modeload ;load resident code ;AN663;
872 ; .ENDIF ;AN663;
873 ; ;AN663;
874 ; MOV ES,ES:WORD PTR resseg[2] ;AN663;
875 ; MOV DL,BYTE PTR ES:res_lpt_retry_type ;get old setting ;AN663;
876 ; ;AN663;
877 ; ROL AL,CL ;AN663;
878 ; AND DL,DH ;AN663;
879 ; OR DL,AL ;AN663;
880 ; MOV BYTE PTR ES:res_lpt_retry_type,DL ;store new setting ;AN663;
881 ; ;AN663;
882 ; .ENDIF ;AN663;
883 ; ;AN663;
884 ; .ELSEIF <<WORD PTR ES:resseg> NE 0000H> THEN ;if code is loaded but no ;AN663;
885 ; ; retry is specified then ;AN663;
886 ; MOV ES,ES:WORD PTR resseg[2] ;AN663;
887 ; MOV DL,BYTE PTR ES:res_lpt_retry_type ;AN663;
888 ; ;AN663;
889 ; .IF <parms_form NE keyword> ;no retry specified with ;AN663;
890 ; ;positional parameters ;AN663;
891 ; AND DL,DH ; set bits to zero ;AN663;
892 ; MOV BYTE PTR ES:res_lpt_retry_type,DL ;AN663;
893 ; MOV INF_OR_NO_PTR,OFFSET NORETRY ;modify message to indicate no retry ;AN663;
894 ; ;AN663;
895 ; .ELSE ;else, no retry specified with keywords
896 ; ; update pparm with current retry type ;AN663;
897 ; NOT DH ;AN663;
898 ; AND DL,DH ;AN663;
899 ; SHR DL,CL ;AN663;
900 ; ;AN663;
901 ; .IF <DL EQ no_retry_active> THEN ;AN663;
902 ; MOV INF_OR_NO_PTR,OFFSET NORETRY ;modify message to indicate no retry ;AN663;
903 ; .ELSE ;AN663;
904 ; MOV INF_OR_NO_PTR,OFFSET INFINITE ;modify message to indicate retry ;AN663;
905 ; .ENDIF ;AN663;
906 ; ;AN663;
907 ; .ENDIF ;AN663;
908 ; ;AN663;
909 ; .ELSE ;no retry, no code resident ;AN663;
910 ; ;AN663;
911 ; MOV INF_OR_NO_PTR,OFFSET NORETRY ;modify message to indicate no retry ;AN663;
912 ; ;AN663;
913 ; .ENDIF ;AN663;
914 ; ;'Infinite retry on parallel printer timeout' OR ;AN663;
915 ; DISPLAY RETPARTO ;'No retry on parallel printer timeout' ;AN663;
916 ; ;AN663;
917 ; POP DX ;restore registers ;AN663;
918 ; POP AX ;AN663;
919 ; POP DI ;AN663;
920 ; POP ES ;AN663;
921 ; RET ;AN663;
922 ; ;AN663;
923 ;set_retry_flag ENDP ;AN663;
924 ;-------------------------------------------------------------------------------
925 ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
926 ;³ ³
927 ;³ SET_retry_type ³
928 ;³ -------------- ³
929 ;³ ³
930 ;³ Set the resident retry mask to for all LPTs
931 ;³ ³
932 ;³ INPUT: device - holds '1', '2', or '3' (ascii) for x of lptx. ³
933 ;³ retry_index - holds index value for the parsed retry parameter. ³
934 ;³ redirected - holds true/false value for redirected status of lptx. ³
935 ;³ parm_list_holder - holds offset of parameter list. ³
936 ;³ resseg - holds offset of resident code in memory ³
937 ;³ ³
938 ;³ ³
939 ;³ RETURN:
940
941 ;³ ³
942 ;³ ³
943 ;³ MESSAGES: none
944 ;³ ³
945 ;³ ³
946 ;³ REGISTER ³
947 ;³ USAGE: AL -
948
949 ;³ CL -
950 ;³ ES -
951 ;³ BP -
952 ;³ DI -
953 ;³ DL -
954 ;³ ³
955 ;³ ³
956 ;³ PSUEDO CODE: ³
957
958 ;³ ³
959 ;³ SAVE REGISTERS ³
960 ;³ SET UP SEGMENT REGISTER
961 ;³ IF <RETRY REQUESTED> ³
962 ;³ IF <PRINTER IS REDIRECTED> ³
963 ;³ PRINT ERROR MESSAGE - not supported on network printer. ³
964 ;³ ELSE ³
965 ;³ SET UP PARAMETER LIST STRUCTURE ³
966 ;³ SET BIT MASK FOR TYPE OF RETRY AND SET pparm TO PROPER LETTER ³
967 ;³ LOAD RESIDENT CODE IF NEEDED ³
968 ;³ SET AND STORE NEW lpt retry mask
969 ;³ ENDIF ³
970 ;³ ELSEIF <RESIDENT CODE ALREADY LOADED> ³
971 ;³ IF <POSITIONAL PARAMETER SPECIFIED> ³
972 ;³ SET FLAG TO ZERO, SET pparm TO PROPER LETTER ³
973 ;³ ELSE ³
974 ;³ SET pparm TO PROPER LETTER FOR CURRENT SETTING ³
975 ;³ ENDIF ³
976 ;³ ELSE ³
977 ;³ SET pparm TO '-' ³
978 ;³ ENDIF ³
979 ;³ RESTORE REGISTERS ³
980 ;³ RETURN ³
981 ;³ ³
982 ;³ ³
983 ;³ SIDE EFFECT:
984 ;³ ³
985 ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
986 ;
987 set_retry_type PROC NEAR ;AN663;
988 ;AN663;
989
990 PUSH ES ;save registers ;AN663;
991 PUSH DI ;AN663;
992 PUSH AX ;AN663;
993 PUSH BX
994 PUSH DX ;AN663;
995 ;AN663;
996 XOR BX,BX ;clear a reg ;AN663;
997 MOV ES,BX ;set to segment at 0 ;AN663;
998 MOV BL,device ;AN663;
999 AND BL,07H ;AN663;
1000 DEC BL ;BX=zero based binary printer number ;AN663;
1001 ;AN663;
1002 .IF <retry_index NE 0> THEN NEAR ;IF retry requested on this invokation THEN ;AN663;
1003 ;AN663;
1004 .IF <redirected EQ true> THEN ;AN663;
1005 ;AN663;
1006 display not_supported ;infinite retry not supported on network printer ;AN663;
1007 ;AN663;
1008 .ELSE NEAR ;not a network printer ;AN663;
1009 ;AN663;
1010 MOV DI,retry_index ;AN663;
1011 MOV BP,parm_list_holder ;set up addressability to the list of parsed parms,set "parm_list" ;AN663;
1012
1013 .SELECT ;AN663;
1014
1015 .WHEN <parm_list[DI].item_tag EQ E_item_tag> ;AN663;
1016 MOV AL,error_status ;set mask byte to horrible status ;AN663;
1017
1018 .WHEN <parm_list[DI].item_tag EQ P_item_tag> OR ;AN663;
1019 .WHEN <parm_list[DI].item_tag EQ B_item_tag> ;AN663;
1020 MOV AL,busy_status ;set mask byte to actual status ;AN663;
1021
1022 .WHEN <parm_list[DI].item_tag EQ R_item_tag> ;AN663;
1023 MOV AL,ready_status ;set mask byte to rosy status ;AN663;
1024
1025 .WHEN <parm_list[DI].item_tag EQ NONE_item_tag> ;AN663;;AN000;
1026 MOV AL,no_retry_flag ;when there is no retry the mask will not be used, so this is just a flag
1027
1028 .ENDSELECT
1029
1030 PUSH AX ;save the retry setting ;AN001;
1031 .IF <AL EQ no_retry_flag> THEN
1032 ;AC001; MOV INF_OR_NO_PTR,OFFSET NORETRY ;modify message to indicate no retry
1033 set_submessage_ptr noretry,retparto ;modify message to indicate no retry ;AC001;
1034 .ELSE ;AN663;
1035 ;AC001; MOV INF_OR_NO_PTR,OFFSET INFINITE ;modify message to indicate retry ;AN663;
1036 set_submessage_ptr infinite,retparto ;modify message to indicate retry ;AC001;
1037 .ENDIF ;AN663;
1038 POP AX ;restore the retry setting ;AN001;
1039
1040 .IF <<WORD PTR ES:resseg> EQ 0000H> THEN ;IF code not resident THEN ;AN663;
1041 .IF <AL NE no_retry_flag> THEN ;need to turn on retry
1042 CALL modeload ;load resident code ;AN663;
1043 MOV ES,ES:WORD PTR resseg[2] ;AN663;
1044 MOV BYTE PTR ES:lpt1_retry_type[BX],AL ;store new setting ;AN663;
1045 .ENDIF
1046 .ELSE ;ELSE code is already resident
1047 MOV ES,ES:WORD PTR resseg[2] ;AN663;
1048 MOV BYTE PTR ES:lpt1_retry_type[BX],AL ;store new setting ;AN663;
1049 .ENDIF ;AN663;
1050 ;AN663;
1051 .ENDIF ;AN663;
1052 ;AN663;
1053 .ELSEIF <<WORD PTR ES:resseg> NE 0000H> THEN ;if code is loaded but no ;AN663;
1054 ; retry is specified then ;AN663;
1055 MOV ES,ES:WORD PTR resseg[2] ;ES=segment of the resident code ;AN663;
1056 ;AN663;
1057 .IF <parms_form NE keyword> ;no retry specified with ;AN663;
1058 ;positional parameters, so turn off retry ;AN663;
1059 MOV BYTE PTR ES:lpt1_retry_type[BX],no_retry_flag ;set flag for get retry routine;AN663;
1060 ;AC001; MOV INF_OR_NO_PTR,OFFSET NORETRY ;modify message to indicate no retry ;AN663;
1061 set_submessage_ptr noretry,retparto ;modify message to indicate no retry ;AC001;
1062 ;AN663;
1063 .ELSE ;else, no retry specified with keywords
1064 ; update pparm with current retry type ;AN663;
1065 .IF <<BYTE PTR ES:lpt1_retry_type[BX]> EQ no_retry_flag> THEN ;AN663;
1066 ;AC001; MOV INF_OR_NO_PTR,OFFSET NORETRY ;modify message to indicate no retry ;AN663;
1067 set_submessage_ptr noretry,retparto ;modify message to indicate no retry ;AC001;
1068 .ELSE ;AN663;
1069 ;AC001; MOV INF_OR_NO_PTR,OFFSET INFINITE ;modify message to indicate retry ;AN663;
1070 set_submessage_ptr infinite,retparto ;modify message to indicate retry ;AC001;
1071 .ENDIF ;AN663;
1072 ;AN663;
1073 .ENDIF ;AN663;
1074 ;AN663;
1075 .ELSE ;no retry, no code resident ;AN663;
1076 ;AN663;
1077 ;AC001; MOV INF_OR_NO_PTR,OFFSET NORETRY ;modify message to indicate no retry ;AN663;
1078 set_submessage_ptr noretry,retparto ;modify message to indicate no retry ;AC001;
1079 ;AN663;
1080 .ENDIF ;AN663;
1081 ;'Infinite retry on parallel printer timeout' OR ;AN663;
1082 DISPLAY RETPARTO ;'No retry on parallel printer timeout' ;AN663;
1083 ;AN663;
1084 POP DX ;restore registers ;AN663;
1085 POP BX
1086 POP AX ;AN663;
1087 POP DI ;AN663;
1088 POP ES ;AN663;
1089 ;AN663;
1090 RET ;AN663;
1091 ;AN663;
1092 set_retry_type ENDP ;AN663;
1093
1094 PRINTF_CODE ENDS
1095 END
1096 \1a