summaryrefslogtreecommitdiff
path: root/v4.0/src/CMD/MODE/MODEPRIN.ASM
diff options
context:
space:
mode:
Diffstat (limited to 'v4.0/src/CMD/MODE/MODEPRIN.ASM')
-rw-r--r--v4.0/src/CMD/MODE/MODEPRIN.ASM1096
1 files changed, 1096 insertions, 0 deletions
diff --git a/v4.0/src/CMD/MODE/MODEPRIN.ASM b/v4.0/src/CMD/MODE/MODEPRIN.ASM
new file mode 100644
index 0000000..60ffebd
--- /dev/null
+++ b/v4.0/src/CMD/MODE/MODEPRIN.ASM
@@ -0,0 +1,1096 @@
1PAGE ,132 ;
2TITLE MODEPRIN.SAL - PRINTER SUPPORT FOR THE MODE COMMAND
3.XLIST
4INCLUDE 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
23DISPLAY MACRO MSG
24 MOV DX,OFFSET MSG
25 CALL PRINTF
26ENDM
27
28PRINT MACRO
29 MOV DX,WORD PTR PT17 ;PASS PRINTER NUMBER
30 INT 17H ;OUTPUT TO PRINTER
31 ENDM
32
33COMPARE 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
51END_COMPARE:
52 POP SI
53ENDM
54;
55IF_NO_PRINTER_ERROR_THEN MACRO
56 CMP PRINTER_ERROR,TRUE
57 JE CHK_FOR_P
58ENDM
59;
60JUMP_EQUAL_TO_CHK_FOR_P MACRO
61LOCAL SKIP_JUMP
62;
63 JNE SKIP_JUMP
64 JMP CHK_FOR_P
65 SKIP_JUMP:
66ENDM
67
68
69SET 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
76ENDM
77
78
79set_submessage_ptr MACRO submessage,message ;PUT pointer to "subMESSAGE" into submessage pointer field of "message".
80
81MOV AX,submessage ;AX=message number ;AN001;
82MOV DH,utility_msg_class ;DH=message class=utility class ;AN001;
83CALL SYSGETMSG ;DS:SI=>message piece ;AN001;
84MOV BP,OFFSET sublist_&message ;address the sublist control block ;AN001;
85MOV [BP].sublist_off,SI ;the sublist now points to the desired message piece ;AN001;
86ENDM ;AN001;
87
88
89;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
90;º º
91
92INCLUDE 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;
118ROM SEGMENT AT 0
119 ORG 530H
120RESSEG LABEL DWORD ;VECTOR POINTING TO MODETO IF RESIDENT
121ROM ENDS
122
123;**********************************************************************
124PRINTF_CODE SEGMENT PUBLIC
125 ASSUME CS:PRINTF_CODE,DS:PRINTF_CODE
126;
127
128;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
129;º º
130
131EXTRN B_item_tag:ABS ;see modepars
132EXTRN COM1_or_COM2:WORD ;=>"Must specify COM1 or COM2" message
133EXTRN CTRL_ST:BYTE ;CONTROL STRING SET UP FROM CONFIGURATION PARAMETERS INPUT
134EXTRN E_item_tag:ABS ;see modepars
135EXTRN invalid_number_of_parameters:WORD ;=>"Invalid number of parameters"
136EXTRN noerror:BYTE ;AN000;
137EXTRN OFFRETRY:ABS ;OFFSET TO TEST INSTR IN RETRY CODE
138EXTRN not_supported:WORD ;message telling user he specified "P" on a net printer
139EXTRN PRINTR:WORD ;PRINTER BASE (40:8), HOLDS PORT ADDRESSES OF PRINTER CARDS
140EXTRN ERR1:BYTE ;POINTER TO "Invalid parameters"
141EXTRN 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
143EXTRN INDEX:WORD ;INDEX OF REDIRECTED PRINTER IN NETWORK REDIRECTION LIST
144EXTRN IS_LOCAL:BYTE ;BOOLEAN. INDICATES IF A PRINTER IS LOCAL. INITIALLY TRUE
145EXTRN keyword:ABS
146EXTRN LOCAL_NAME:BYTE ;FILLED IN BY GET ASSIGN LIST ENTRY FUNCTION CALL
147EXTRN lpt1_retry_type:BYTE ;byte in resident code for retry mask, see rescode
148EXTRN LPTNO:BYTE ;see modeecho
149EXTRN machine_type:BYTE ;see "rescode"
150EXTRN MODEECHO:NEAR ;SET UP REDIRECTION OF PARALLEL TO SERIAL
151EXTRN MODELENG:NEAR
152EXTRN MODELOAD:NEAR ;MOVES THE CODE AT MODETO TO 60 AND MAKES IT RESIDENT ;AN000;
153EXTRN NET_ERROR:WORD ;"NET 042: Unable to do requested comand" ;AN000;
154EXTRN NONE_item_tag:ABS ;AN000;see modepars ;AN000;
155;EXTRN no_retry_active:ABS ;see invoke.asm ;AN000;
156EXTRN parm_lst:BYTE ;see modepars.asm ;AN000;
157EXTRN P_item_tag:ABS ;see modepars.asm ;AN000;
158;EXTRN parallel_printer_settings:WORD ;see "rescode" ;AN000;
159EXTRN P14_model_byte:ABS ;see "rescode" ;AN000;
160EXTRN PRINTF:NEAR ;FORMATTED "C" LIKE SCREEN OUTPUT ROUTINE ;AN000;
161EXTRN PARM1:BYTE,PARM2:BYTE,PARM3:BYTE,MODE:BYTE,FLAG:BYTE
162EXTRN parm_list_holder:WORD ;address of parsed parameter list ;AN663;
163EXTRN parms_form:BYTE ;AN000;
164EXTRN DEVICE:BYTE,PPARM:BYTE ;AN000;
165EXTRN 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
167EXTRN retry_index:WORD ;see modecom.asm ;AN000;
168
169EXTRN ERR2:WORD ;CR,LF,"Printer error",BEEP,CR,LF,"$"
170EXTRN PT80:WORD ;CR,LF,"LPT"
171EXTRN PT80N:BYTE ;DB " "
172; ": set for 80",CR,LF,"$"
173EXTRN PT132:WORD ;CR,LF,"LPT"
174EXTRN PT132N:BYTE ;" "
175; ": set for 132",CR,LF,"$"
176EXTRN PTLINES:WORD ;CR,LF,"Printer lines per inch set",CR,LF,"$"
177EXTRN NORETRY:WORD ;message number for CR,LF,'No','$' ;AC001;
178EXTRN INFINITE:WORD ;message number for CR,LF,'Infinite' ;AC001;
179EXTRN REMOTE_DEV:BYTE ;FILLED IN BY GET ASSIGN LIST ENTRY FUNCTION CALL
180EXTRN 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
182EXTRN sublist_retparto:BYTE ; control block for "%1 retry on parallel printer timeout" ;AC001;
183EXTRN SYSGETMSG:NEAR ;AC001;
184EXTRN utility_msg_class:ABS ;used for input to sysgetmsg
185EXTRN 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
198busy_status EQU 080H ;flag telling resident code to not change anything
199COLON EQU ":" ;CHAR IN "LPT1:"
200error_status EQU 029H ;status byte indicating the printer is on fire(busy, no paper, I/O error, timeout)
201FALSE EQU 00H
202SPACE EQU " " ;THE BLANK CHARACTER
203TO_SCREEN EQU 9 ;REQUEST OUTPUT TO SCREEN
204INTCONV EQU 48 ;CONVERTS ASCII TO NUMERIC
205EIGHTY EQU 80 ;80 COL PRINTER WIDTH
206no_retry_flag EQU 0 ;no retry active, stored in lptx_retry_type, see rescode.sal
207ONE_THIRTY_TWO EQU 132 ;132 COL PRINTER WIDTH
208PRTDC2 EQU 18 ;PRINTER CONTROL CHAR FOR 80 COL
209PRTSI EQU 15 ;PRINTER CONTROL CHAR FOR 132 CHAR
210PRTCANCEL EQU 24 ;PRINTER CONTROL CHAR FOR CANCEL
211CHAR6 EQU "6" ;REQUEST FOR 6 LINES PER INCH
212CHAR8 EQU "8" ;REQUEST FOR 8 LINES PER INCH
213L EQU "L"
214P EQU "P"
215T EQU "T"
216R EQU "R"
217N EQU "N"
218NULL EQU 0 ;NULL CHAR
219ASC0 EQU "0" ;ASCII 0, REQUEST 8 LINES PER INCH
220ASC2 EQU "2" ;ASCII 2, REQUEST 6 LINES PER INCH
221escape EQU 27 ;ESCAPE PRINTER CONTROL CHAR
222PRINTERSETUP EQU 5E02H ;FUNCTION CODE FOR PRINTER SET UP DOS CALL
223GET_LIST_ENTRY EQU 5F02H ;FUNCTION CODE FOR GET ASSIGN LIST ENTRY FROM NETWORK REDIR. LIST
224CHAR_DEVICE EQU 3 ;CHARACTER DEVICE "MACRO" TYPE (IN NETWORK LINGO).
225PRN_NO EQU 3 ;CHARACTER POSITION OF THE PRINTER NUMBER IN LPTn, (ZERO BASED)
226ready_status EQU 90H ;flag telling resident code to set status indicating printer is ready for another character
227UNCHANGED EQU -1 ;-1 INDICATES TO SERVER THAT PARAMTER IS UNCHANGED (NOT SPECIFIED)
228unspecified EQU 0FFH ;AN000;value of parm2 if no lines per inch was specified
229TRUE EQU 0FFH
230ENDPARM 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)
234parm_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
250columns_holder DB bogus
251i DB 0 ;loop index for retry index calculation
252PT17 DW 0 ;SAVES PRINTER NUMBER FOR DX AND INT 17H
253LPTN DB 0 ;SAVES ID OF WHICH LPTn IS REFERENCED
254PRINTER_NO DB 0 ;SAVES LPT NUMBER IN ZERO BASED NUMERICAL FORM
255CTRL_ST_LEN DW 0000 ;HOLDER FOR LENGTH OF THE CONTROL STRING
256REDIRECTED DB 00 ;FLAG TO INDICATE A PRINTER IS ON THE NETWORK
257CHARS_LINE DB -1 ;HOLDS CHARACTERS PER LINE IN NUMERIC FORM
258NO_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
267PTLINES_REQ DB 00 ;BOOLEAN INDICATOR OF LINES PER INCH REQUESTED
268PRINTER_ERROR DB 00 ;BOOLEAN INDICATOR OF PRINTER NOT THERE OR OFF OR OFFLINE
269EIGHTY_CHARS_LINE_REQ DB 00 ;BOOLEAN, INDICATES IF 80 CHARS/LINE REQUESTED
270REQ_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
279PUBLIC busy_status ;used by rescode in parallel retry code
280PUBLIC columns_holder ;AN000;
281PUBLIC error_status ;used by analyze_and_invoke and rescode
282PUBLIC modify_resident_code ;used by invoke ;AN000;
283PUBLIC MODEPRIN
284PUBLIC no_retry_flag ;used by analyze_and_invoke
285PUBLIC printer_no ;needed by modepars
286PUBLIC ready_status ;used by analyze_and_invoke
287;PUBLIC set_retry_flag ;used by invoke in turn_off_retry_case
288PUBLIC set_retry_type ;used by invoke in turn_off_retry_case
289
290;º º
291;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
292
293
294;*******************************************************************
295MODEPRIN 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
322ELSEIF03:
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
330ENDIF03:
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
341ENDIF04:
342
343PUBLIC 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
360ELSEIF06:
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
365ENDIF06:
366; : : : ENDIF END IS THERE A SECOND PARM? TEST
367ENDIF05:
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
379ENDIF07:
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;
411SEE_IF_REDIRECTED:
412
413PUBLIC 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
417SRCH_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
428CHK_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
432CHECK_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
435COUNT:
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
442CHECK_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
458END_CHECK_NAME:
459
460PUBLIC END_CHECK_NAME
461
462MOV 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;
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;
546NOT_RED:
547 CMP IS_LOCAL,TRUE ;IF the device is local THEN
548 JE ELSE02
549 JMP SHORT ELSE01 ;or on the network
550ELSE02:
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
554FOR: ;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;
582CHK_FOR_P:
583
584public CHK_FOR_P
585
586 CALL set_retry_type
587 CALL modify_resident_code
588
589
590 JMP SHORT ENDIF01
591ELSE01:
592
593PUBLIC 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
603ENDIF01:
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
609MODEPRIN ENDP
610
611;******************************************************************************
612
613modify_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;
634CASE DW P0
635 DW P1
636 DW P2
637 DW P3
638 DW P4
639 DW P5
640 DW P6
641 DW P7
642;
643P0:
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;
649P1:
650; RETRY LPT1 ONLY
651 MOV WORD PTR ES:[BX]+2,7403H ;TEST 3 : JZ RT
652 JMP SHORT ENDC
653;
654P2:
655; RETRY LPT2 ONLY
656 MOV WORD PTR ES:[BX]+2,7501H ;TEST 1 : JNZ RT
657 JMP SHORT ENDC
658;
659P3:
660; RETRY LPT1 AND LPT2 ONLY
661 MOV WORD PTR ES:[BX]+2,7402H ;TEST 2 : JZ RT
662 JMP SHORT ENDC
663;
664P4:
665; REDIRECT LPT3 ONLY
666 MOV WORD PTR ES:[BX]+2,7502H ;TEST 2 : JNZ RT
667 JMP SHORT ENDC
668;
669P5:
670; REDIRECT LPT1 AND LPT3 ONLY
671 MOV WORD PTR ES:[BX]+2,7401H ;TEST 1 : JZ RT
672 JMP SHORT ENDC
673;
674P6:
675; REDIRECT LPT2 AND LPT3 ONLY
676 MOV WORD PTR ES:[BX]+2,7503H ;TEST 3 : JNZ RT
677 JMP SHORT ENDC
678;
679P7:
680; REDIRECT ALL THREE: LPT1, LPT2, AND LPT3
681 MOV WORD PTR ES:[BX]+2,0EB00H ;TEST 0 : JMP SHORT RT
682;
683ENDC:
684 STI ;REENABLE INTERRUPTS
685; : : : ENDIF RESIDENT CODE IS ALREADY LOADED
686 .ENDIF
687
688RET ;AN000;
689
690modify_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
702LOADED_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
728LOADED_YET ENDP
729
730
731;*******************************************************************
732OUTCHR 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
745ENDIF02:
746 RET ;RETURN TO MAIN PROC
747OUTCHR 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;
987set_retry_type PROC NEAR ;AN663;
988 ;AN663;
989
990PUSH ES ;save registers ;AN663;
991PUSH DI ;AN663;
992PUSH AX ;AN663;
993PUSH BX
994PUSH DX ;AN663;
995 ;AN663;
996XOR BX,BX ;clear a reg ;AN663;
997MOV ES,BX ;set to segment at 0 ;AN663;
998MOV BL,device ;AN663;
999AND BL,07H ;AN663;
1000DEC 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;
1082DISPLAY RETPARTO ;'No retry on parallel printer timeout' ;AN663;
1083 ;AN663;
1084POP DX ;restore registers ;AN663;
1085POP BX
1086POP AX ;AN663;
1087POP DI ;AN663;
1088POP ES ;AN663;
1089 ;AN663;
1090RET ;AN663;
1091 ;AN663;
1092set_retry_type ENDP ;AN663;
1093
1094PRINTF_CODE ENDS
1095 END
1096 \ No newline at end of file