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