2 TITLE MODEPRIN
.SAL - PRINTER SUPPORT FOR THE MODE COMMAND
9 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;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
19 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000;
29 MOV DX,WORD PTR PT17
;PASS PRINTER NUMBER
30 INT 17H
;OUTPUT TO PRINTER
33 COMPARE
MACRO STRING
, CHAR1
, CHAR2
, CHAR3
36 ;------------------------------------------------------------------------------------------------
38 ; Compare first 3 characters of STRING with CHAR1, CHAR2, and CHAR3
40 ;------------------------------------------------------------------------------------------------
43 MOV SI,0 ;INITIALIZE INDEX
44 CMP STRING
[SI],CHAR1
;IF first char is a match THEN
46 INC SI ; GET TO NEXT CHAR OF STRING
47 CMP STRING
[SI],CHAR2
; IF 2nd char is a match THEN
50 CMP STRING
[SI],CHAR3
; IF all three match then ZR is not set
55 IF_NO_PRINTER_ERROR_THEN
MACRO
56 CMP PRINTER_ERROR
,TRUE
60 JUMP_EQUAL_TO_CHK_FOR_P
MACRO
69 SET
MACRO REG
,VALUE
;SET REG TO VALUE. DON'T SPECIFY AX FOR REG
79 set_submessage_ptr
MACRO submessage
,message
;PUT pointer to "subMESSAGE" into submessage pointer field of "message".
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;
89 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
92 INCLUDE common.stc ;contains the following structure
95 ;parm_list_entry STRUC ;used by parse_parameters and invoke
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
103 ;parm_list_entry ENDS
106 ;printer_settings STRUC ;map of the setting holders in resident code
108 ; chars_per_line DB ?
109 ; lines_per_inch DB ?
111 ;printer_settings ENDS
114 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
120 RESSEG
LABEL DWORD ;VECTOR POINTING TO MODETO IF RESIDENT
123 ;**********************************************************************
124 PRINTF_CODE
SEGMENT PUBLIC
125 ASSUME
CS:PRINTF_CODE
,DS:PRINTF_CODE
128 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
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
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
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;
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
188 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
191 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
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)
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
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
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)
237 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
240 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
244 ;PARM2 DB -1 ;HOLDS LINES PER INCH IN CHARACTER FORM
248 ;CTRL_ST DB 5 DUP(PRTCANCEL)
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
273 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
276 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
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;
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
291 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
294 ;*******************************************************************
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
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
308 MOV WORD PTR PT17
,AX ;SET UP PRINTER NUMBER FOR INTERRUPT 17H
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
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?
323 CMP BL,ONE_THIRTY_TWO
;132?
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
332 ; : : : IF ANYTHING TO PRINT,
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
340 ; : : : ENDIF END IF ANYTHING TO PRINT? TEST
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;
353 ; : : : : IF THE REQUEST FOR 6 LINES PER INCH?
357 MOV BL,ASC2
;REQUEST 6 LPI
358 ; : : : : ELSEIF REQUEST IS FOR 8 LINES PER INCH
363 MOV BL,ASC0
;REQUEST 8 LINES PER INCH
364 ; : : : : ENDIF ,END IS REQUEST FOR 6 LPI? TEST
366 ; : : : ENDIF END IS THERE A SECOND PARM? TEST
368 ; : : : IF 6 OR 8 LINES PER INCH REQUESTED
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
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
377 MOV PTLINES_REQ
,TRUE
;INDICATE LINES PER INCH SET IF NO PRINTER ERROR
378 ; : : : ENDIF END IS 6 OR 8 LPI REQUESTED? TEST
380 CALL VERIFY
;SEE IF n OF LPTn WAS LEGAL
381 MOV BYTE PTR LPTN
,AH ;SAVE THE n OF LPTn
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
390 MOV IS_LOCAL
,FALSE
;NOT A LOCAL PRINTER
393 ;**************************************************************************************************
394 ; SEARCH THE NETWORK REDIRECTION LIST
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).
409 ;**************************************************************************************************
413 PUBLIC SEE_IF_REDIRECTED
415 MOV CTRL_ST_LEN
,DI ;SAVE LENGTH OF CONTROL STRING
416 DEC INDEX
;SET INDEX TO -1 SO IT WILL BEGIN AT ZERO
418 MOV AX,GET_LIST_ENTRY
;SET UP FOR GET ASSIGN LIST ENTRY FUNCTION CALL
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
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
427 JMP NOT_RED
;IF CARRY IS SET THEN THE PRINTER IS NOT REDIRECTED
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
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
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
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
455 JMP SHORT END_CHECK_NAME
;FOUND THE PRINTER IN THE LIST
460 PUBLIC END_CHECK_NAME
462 MOV REDIRECTED
,TRUE
;REDIRECTED:=TRUE. THE PRINTER WAS FOUND IN NRL
464 ;**************************************************************************************************
465 ; INDICATE TO SERVER THAT THE CONFIGURATION OF A NETWORK PRINTER HAS CHANGED.
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 ;**************************************************************************************************
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
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
483 CMP PARM2
,bogus
;IF THE LINES PER INCH WASN'T SPECIFIED THEN DON'T CONVERT
485 MOV CH,UNCHANGED
;CX=-1 (FFFF)
489 SUB CX,INTCONV
;CHANGE LINES PER INCH TO NUMERIC FORM
493 ;**************************************************************************************************
494 ; SET UP REDIRECTOR WITH CONTROL STRING BUFFER VIA A PRINTER SET UP CALL.
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 ;**************************************************************************************************
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
509 DISPLAY NET_ERROR
;GET ASS LIST ENTRY AND PRINTER SET UP
510 ; $ELSE ;REDIRECTOR IS RESIDENT AND PRINTER SETUP
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
517 DISPLAY PT80
; WRITELN("LPT? set for 80")
521 CMP REQ_132_CHARS_LINE
,TRUE
522 ; $IF E ; IF 132 chars/line requested THEN
524 DISPLAY PT132
; WRITELN("LPT? set for 132")
529 CMP PTLINES_REQ
,TRUE
;IF lines/inch requested THEN
532 DISPLAY PTLINES
; WRITELN("Printer lines per inch set")
538 ;******************************************************************************************
539 ; SEND THE CONTROL STRING TO THE LOCAL PRINTER
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 ;******************************************************************************************
547 CMP IS_LOCAL
,TRUE
;IF the device is local THEN
549 JMP SHORT ELSE01
;or on the network
551 CMP CTRL_ST_LEN
,0 ;IF there is something to send to a printer THEN
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
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
575 DISPLAY PTLINES
; WRITELN("Printer lines per inch set")
576 LINES_NOT_REQ: ;ENDIF
578 ;****************************************************************
579 ; CALL PROCEDURE TO SET THE RETRY FLAG
580 ;****************************************************************
587 CALL modify_resident_code
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
604 ; $ENDIF ;there was a chance that the parameters were valid
605 ; $ENDIF ;there were enough paramters specified
607 RET ;RETURN TO MODE MAIN ROUTINE
611 ;******************************************************************************
613 modify_resident_code PROC
NEAR ;AN000;
616 CALL LOADED_YET
;on return ES:DI points to res copy of "modeto" if loaded
617 ; : :IF RESIDENT CODE IS ALREADY LOADED
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;
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
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
651 MOV WORD PTR ES:[BX]+2,7403H
;TEST 3 : JZ RT
656 MOV WORD PTR ES:[BX]+2,7501H
;TEST 1 : JNZ RT
660 ; RETRY LPT1 AND LPT2 ONLY
661 MOV WORD PTR ES:[BX]+2,7402H
;TEST 2 : JZ RT
666 MOV WORD PTR ES:[BX]+2,7502H
;TEST 2 : JNZ RT
670 ; REDIRECT LPT1 AND LPT3 ONLY
671 MOV WORD PTR ES:[BX]+2,7401H
;TEST 1 : JZ RT
675 ; REDIRECT LPT2 AND LPT3 ONLY
676 MOV WORD PTR ES:[BX]+2,7503H
;TEST 3 : JNZ RT
680 ; REDIRECT ALL THREE: LPT1, LPT2, AND LPT3
681 MOV WORD PTR ES:[BX]+2,0EB00H ;TEST 0 : JMP SHORT RT
684 STI ;REENABLE INTERRUPTS
685 ; : : : ENDIF RESIDENT CODE IS ALREADY LOADED
690 modify_resident_code ENDP
;AN000;
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:
698 ; WHICH ASSEMBLES AS:
705 ; ON EXIT, THE ZERO FLAG REFLECTS THE LOADED STATE
706 ; ES:DI=ADDR OF MODETO, OR ZERO
708 ; Z=OFF,NOT LOADED YET
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
718 CMP AX,AX ;SET THE ZERO FLAG TO RELFECT IT IS LOADED
722 CMP AX,0FFH ;RESET THE ZERO FLAG TO REFLECT IT IS NOT LOADED
726 POP AX ;RESTORE CALLER'S REGS
731 ;*******************************************************************
733 PRINT
;OUTPUT CHARACTER TO PRINTER
734 AND AH,0A9H ;MASK OFF ERROR BITS
735 ; IF WE GOT AN ERROR RETURN CODE
739 CMP PRINTER_ERROR
,TRUE
741 DISPLAY ERR2
;DISPLAY ERROR MESSAGE
742 MOV PRINTER_ERROR
,TRUE
744 ; ENDIF ,END GOT AN ERROR RETURN CODE? TEST
746 RET ;RETURN TO MAIN PROC
751 ;-------------------------------------------------------------------------------
752 ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
757 ;³ Set the resident retry flag to type of retry active for lptX. ³
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 ³
768 ;³ RETURN: pparm - set to 'P', 'B', 'R', 'E', or '-' for type of retry active.³
769 ;³ flag in resident code set ³
772 ;³ MESSAGES: Infinite retry not supported on network printer. ³
776 ;³ USAGE: AL - new setting for resident flag. (see RESCODE.SAL for ³
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 ³
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. ³
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 ³
798 ;³ GET CURRENT res_lpt_retry_type ³
799 ;³ SET AND STORE NEW res_lpt_retry_type ³
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 ³
806 ;³ SET pparm TO PROPER LETTER FOR CURRENT SETTING ³
809 ;³ SET pparm TO '-' ³
811 ;³ RESTORE REGISTERS ³
816 ;³ SIDE EFFECT: Loads resident code if it is needed and has not been loaded. ³
818 ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
820 ;set_retry_flag PROC NEAR ;AN663;
822 ; PUSH ES ;save registers ;AN663;
827 ; XOR AX,AX ;clear a reg ;AN663;
828 ; MOV ES,AX ;set to segment at 0 ;AN663;
829 ; MOV CL,device ;AN663;
833 ; MOV DH,11111100B ;set bit mask to get rid of old setting ;AN663;
834 ; ROL DH,CL ;rotate bits into position ;AN663;
836 ; .IF <retry_index NE 0> THEN ;AN663;
838 ; .IF <redirected EQ true> THEN ;AN663;
840 ; display not_supported ;infinite retry not supported on network printer ;AN663;
842 ; .ELSE NEAR ;not a network printer ;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;
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;
853 ; .WHEN <parm_list[DI].item_tag EQ B_item_tag> ;AN663;
854 ; MOV AL,busy_retry_active ;AN663;
856 ; .WHEN <parm_list[DI].item_tag EQ R_item_tag> ;AN663;
857 ; MOV AL,ready_retry_active ;AN663;
859 ; .WHEN <parm_list[DI].item_tag EQ NONE_item_tag> ;AN663;
860 ; MOV AL,no_retry_active ;AN663;
864 ; .IF <AL EQ no_retry_active> THEN
865 ; MOV INF_OR_NO_PTR,OFFSET NORETRY ;modify message to indicate no retry
867 ; MOV INF_OR_NO_PTR,OFFSET INFINITE ;modify message to indicate retry ;AN663;
870 ; .IF <<WORD PTR ES:resseg> EQ 0000H> THEN ;AN663;
871 ; CALL modeload ;load resident code ;AN663;
874 ; MOV ES,ES:WORD PTR resseg[2] ;AN663;
875 ; MOV DL,BYTE PTR ES:res_lpt_retry_type ;get old setting ;AN663;
880 ; MOV BYTE PTR ES:res_lpt_retry_type,DL ;store new setting ;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;
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;
895 ; .ELSE ;else, no retry specified with keywords
896 ; ; update pparm with current retry type ;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;
904 ; MOV INF_OR_NO_PTR,OFFSET INFINITE ;modify message to indicate retry ;AN663;
909 ; .ELSE ;no retry, no code resident ;AN663;
911 ; MOV INF_OR_NO_PTR,OFFSET NORETRY ;modify message to indicate no retry ;AN663;
914 ; ;'Infinite retry on parallel printer timeout' OR ;AN663;
915 ; DISPLAY RETPARTO ;'No retry on parallel printer timeout' ;AN663;
917 ; POP DX ;restore registers ;AN663;
923 ;set_retry_flag ENDP ;AN663;
924 ;-------------------------------------------------------------------------------
925 ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
930 ;³ Set the resident retry mask to for all LPTs
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 ³
960 ;³ SET UP SEGMENT REGISTER
961 ;³ IF <RETRY REQUESTED> ³
962 ;³ IF <PRINTER IS REDIRECTED> ³
963 ;³ PRINT ERROR MESSAGE - not supported on network printer. ³
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
970 ;³ ELSEIF <RESIDENT CODE ALREADY LOADED> ³
971 ;³ IF <POSITIONAL PARAMETER SPECIFIED> ³
972 ;³ SET FLAG TO ZERO, SET pparm TO PROPER LETTER ³
974 ;³ SET pparm TO PROPER LETTER FOR CURRENT SETTING ³
977 ;³ SET pparm TO '-' ³
979 ;³ RESTORE REGISTERS ³
985 ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
987 set_retry_type PROC
NEAR ;AN663;
990 PUSH ES ;save registers ;AN663;
996 XOR BX,BX ;clear a reg ;AN663;
997 MOV ES,BX ;set to segment at 0 ;AN663;
998 MOV BL,device
;AN663;
1000 DEC BL ;BX=zero based binary printer number ;AN663;
1002 .IF <retry_index NE
0> THEN
NEAR ;IF retry requested on this invokation THEN ;AN663;
1004 .IF <redirected
EQ true
> THEN
;AN663;
1006 display not_supported
;infinite retry not supported on network printer ;AN663;
1008 .ELSE NEAR ;not a network printer ;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;
1015 .WHEN
<parm_list
[DI].item_tag
EQ E_item_tag
> ;AN663;
1016 MOV AL,error_status
;set mask byte to horrible status ;AN663;
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;
1022 .WHEN
<parm_list
[DI].item_tag
EQ R_item_tag
> ;AN663;
1023 MOV AL,ready_status
;set mask byte to rosy status ;AN663;
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
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;
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;
1038 POP AX ;restore the retry setting ;AN001;
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;
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;
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;
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;
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;
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;
1075 .ELSE ;no retry, no code resident ;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;
1081 ;'Infinite retry on parallel printer timeout' OR ;AN663;
1082 DISPLAY RETPARTO
;'No retry on parallel printer timeout' ;AN663;
1084 POP DX ;restore registers ;AN663;
1092 set_retry_type ENDP
;AN663;