2 TITLE MODEECHO
- REDIRECT PRINTER OUTPUT
FROM PARALLEL TO SERIAL
8 INCLUDE common.stc ;definition of parm_list_entry struc
15 SET
MACRO REG
,VALUE
;SET REG TO VALUE. DON'T SPECIFY AX FOR REG
23 ;*****************************************************************
26 VECT14H
LABEL DWORD ;RS232 CALL, WILL POINT TO MODETO AFTER
27 ; RESIDENT CODE IS LOADED.
29 RS232_BASE
DW ?
;ADDR OF RS232 ADAPTER FOR COM1
30 DW ?
;ADDR OF RS232 ADAPTER FOR COM2
31 DW ?
;ADDR OF RS232 ADAPTER FOR COM3
32 DW ?
;ADDR OF RS232 ADAPTER FOR COM4
40 RESSEG
DD ?
;VECTOR OF MODETO, IF RESIDENT,OR 0
42 ;*****************************************************************
43 ascii_to_int EQU
0FH ;ANDed with an ascii 0-9 value yeilds binary 0-9
44 CR EQU
13 ;CARRIAGE RETURN
46 parm_list EQU
[BP] ;AN000; ;AN000;
47 TO_SCREEN EQU
9 ;REQUEST OUTPUT TO SCREEN
49 PUBLIC LPTNO
;used by modeprin and modepars
51 PUBLIC display_printer_reroute_status
54 ;***************************************************************
55 PRINTF_CODE
SEGMENT PUBLIC
56 ASSUME
CS:PRINTF_CODE
,DS:PRINTF_CODE
,ES:NOTHING
58 ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
61 two
DB 2 ;used to change byte displacement to word disp. See 'modeecho'
62 LPTNO
DB 0 ;holder of ASCII form of the LPT number (1 thru 3)
65 ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
67 EXTRN PARM1
:BYTE,PARM2
:BYTE,PARM3
:BYTE,MODE
:BYTE,FLAG
:BYTE
74 EXTRN CRLF
:BYTE ;AN000;carriage return linefeed
75 EXTRN parm_lst
:BYTE ;AN000;
76 EXTRN illegal_device_ptr
:WORD ;AN000;pointer to bad com device name string
78 EXTRN PRINTF
:NEAR ;FORMATTED "C" LIKE SCREEN OUTPUT ROUTINE
79 EXTRN REDIRMSG
:WORD ;CR,LF,"LPT"
82 EXTRN REDCOM
:BYTE ;" "
85 EXTRN NOTREMSG
:WORD ;CR,LF,"LPT"
86 EXTRN NOTREDPT
:BYTE ;" "
87 ; ": not redirected.",CR,LF,"$"
88 ;EXTRN printer_reroute_mask:BYTE ;mask for testing ptsflag1 to see if a printer is rerouted
89 EXTRN ptsflag1
:BYTE ;see rescode.sal
90 EXTRN ERR1
:WORD ;"ILLEGAL DEVICE NAME"
91 EXTRN resflag2
:ABS
;see rescode
92 EXTRN FIXUP
:ABS
;IN MODEPTS, OFFSET USED BY COND. JMP
93 EXTRN OFFPTS
:ABS
;WHERE MODEPTS IS RELATIVE TO BEGINNING
95 EXTRN NEW_PTSFLAG
:ABS
;WHERE PTSFLAG1 IS IN THE RESIDENT CODE
96 ; RELATIVE TO BEGINING OF MODETO
98 ;***************************************************************
102 SUB AX,AX ;CLEAR A REG
103 MOV ES,AX ;SET ES TO LOW MEMORY
104 ;DETERMINE WHAT PRINTER IS INVOLVED (LOOK AT n OF LPTn:)
105 MOV AL,BYTE PTR DS:LPTNO
106 MOV REDPT
,AL ;PUT n OF LPTn IN REDIRECT MESSAGE
107 MOV NOTREDPT
,AL ;AND INTO NOT REDIRECTED MSG
108 ; IF PRINTER DEVICE IS LPT1
112 MOV AH,01H ;SET FLAG FOR LPT1
113 MOV SI,1 ;SAVE LPT NUMBER AS OFFSET TO FLAG BYTE ARRAY
114 ; ELSEIF PRINTER DEVICE IS LPT2
120 MOV AH,02H ;SET FLAG FOR LPT2
121 MOV SI,2 ;SAVE LPT NUMBER AS OFFSET TO FLAG BYTE ARRAY
122 ; ELSEIF PRINTER DEVICE IS LPT3
128 MOV AH,04H ;SET FLAG FOR LPT3
129 MOV SI,03 ;SAVE LPT NUMBER AS OFFSET TO FLAG BYTE ARRAY
130 ; ELSE ,SINCE NONE OF THE ABOVE, MUST BE INVALID
133 ; DISPLAY ERR1 ;FUSS ABOUT INVALID n OF LPTn
134 ; MOV AH,0 ;SET FLAG TO INVALID
135 ; ENDIF ,END OF CHECK FOR DEVICE NO. IN LPTn
137 ;AT EXIT: AH=MASK FOR NEW_PTSFLAG REPRESENTING WHICH LPTn, (OR 0 IF n INVALID)
138 ; AH HAS 0000 0XXX , WHERE BIT ON REPRESENTS:
142 ; SI=SET TO HEX 1,2, OR 3 TO BE USED AS OFFSET BEYOND NEW_PTSFLAG
143 ; TO ADDRESS THE BYTES PTSFLAG2, PTSFLAG3, AND PTSFLAG4
144 ; (SEE MODECODE FOR BYTE DEFINITIONS)
147 ;***************************************************************
156 ; SI=printer number value (one based)
157 ; AH=printer number mask: lpt1=1, lpt2=2, lpt3=4
158 ; AL=com number character
159 ; all values are known to be valid, but the existence of the com port has
164 ; USAGE : DL - hold the binary COM number
170 MOV REDCOM
,AL ;PUT m OF COMm TO REDIRECT MESSAGE
171 PUSH ES ;SAVE SEG REG
174 MOV BH,AH ;save the lpt number
175 AND AL,ascii_to_int
;convert to 1 based integer
176 MOV DL,AL ;FLAG FOR COM1, see 'ptsflag2' in 'rescode'
177 ;see if the COM# ACTUALLY EXISTS
178 DEC AL ;AL= 0 based com number
179 MUL TWO
;AL=disp from 40:0 of com port address word
180 MOV AH,BH ;restore the lpt number
181 XOR BX,BX ;prepare for byte move
182 MOV BL,AL ;BX=disp from 40:0 of com port address word
183 .IF <ES:RS232_BASE
[BX] NE
0> THEN
;IF the com adapter does exist THEN
185 ;AT THIS POINT WE KNOW THAT LPTn AND COMm ARE BOTH LEGAL
187 ;THE FOLLOWING IS WHERE THE APPROPRIATE ADDRESS WORD FOR THE PRINTER
188 ;INVOLVED IS SET TO 0001H TO INDICATE TO BASIC THAT IT CAN OPEN THE
189 ;DEVICE BECAUSE IT HAS BEEN REDIRECTED. SEE TECH REF PAGE A-2
190 ;RS232 AND PRINTER BASE.
192 SAL SI,1 ;2*SI TO GET TO THE APPROPRIATE WORD
193 ; : : IF THE PRINTER ACTUALLY EXISTS
194 CMP ES:PRINTR
-2+[SI],0000H ;IF THE WORD IS NONZERO THE
195 JNE ENDIF10
;DEVICE EXISTS SO DON'T PUT A 1 THERE.
196 MOV ES:PRINTR
-2+[SI],0001H ;PUT 0001H IN PRINTER WORD n
197 ; : : ENDIF PRINTER EXISTS
199 SAR SI,1 ;RESTORE SI TO n OF LPTn
201 CALL MODELOAD
;WITHIN 'MODECODE' MODULE
203 ;AH HAS A MASK SET BY THE 'VERIFY' PROC TO CORRESPOND TO THE LPTn
204 PUSH ES ;I'M ABOUT TO USE ES, SO I'LL SAVE IT
206 LES DI,ES:RESSEG
;FETCH POINTER TO MODETO IN RESIDENT CODE
207 MOV BX,NEW_PTSFLAG
; FROM MODETO INTO BX
208 ADD BX,DI ;ES:BX IS ADDRESS OF PTSFLAG1 IN RESIDENT
209 ; CODE (PROC MODEPTS)
210 OR AH,BYTE PTR ES:[BX] ;TURN ON THIS PRINTER'S BIT
211 MOV BYTE PTR ES:[BX],AH ;RECORD WHICH LPT IS TO BE
214 DEC DL ;NOW DL=0 FOR COM1, DL=1 FOR COM2
215 ; SINCE SI=1, 2, OR 3, THIS PUTS A 0 OR 1 INTO
216 ; PTSFLAG2, PTSFLAG3, OR PTSFLAG4
217 MOV BYTE PTR ES:[BX][SI],DL ;RECORD FOR THIS LPTn
218 ; WHICH COMm THE LPTn IS REDIRECTED TO
220 POP ES ;RESTORE SEG REG USED FOR CHECKING/SETTING ADDRESS
221 ; WORDS AND NEW_PTSFLAG
222 CALL ECHO
;CHANGE JMP IN MODEPTS COPY IN LOW MEMORY
223 ; SO PROPER LPTn GETS REDIRECTED
227 .ELSE ;valid com name, adapter not there
228 MOV DI,0 ;COM device name is always the first parm, the value of "LPTX[:]=value" ;AN000;
229 MOV BP,OFFSET parm_lst
;address the parm list via parm_list which is [BP]
230 MOV CX,parm_list
[DI].value1
;AN000; ;AN000;
231 MOV illegal_device_ptr
,CX ;AN000;set up message with bad com device name string
232 DISPLAY ERR1
;"Illegal device name - COMX"
236 POP ES ;RESTORE SEG REG
239 ;***************************************************************
242 ;INPUT: PARM1 AREA HAS:
244 ; OF WHICH VERIFICATION HAS BEEN MADE OF ONLY:
246 PUSH ES ;SAVE SEG REG
247 CALL VERIFY
;VERIFY THE n OF LPTn
249 ; ON EXIT FROM VERIFY, ES=0
254 ; : IF IT IS POSSIBLE THAT REDIRECTION IS IN EFFECT
255 CMP WORD PTR ES:530H
,0000H ;HAS THE POINTER BEEN SET?
256 JE ENDIF05
;SINCE THE POINTER HASN'T BEEN SET, THE
257 ; CODE HASN'T BEEN LOADED, THEREFORE
258 ; THE LPT CAN'T BE REDIRECTED, SO THERE
259 ; IS NO NEED TO UNREDIRECT IT
260 ; SINCE n OF LPTn IS OK,
261 ; AND SI HAS 1,2,OR 3 TO CORRESPOND TO n
266 XOR AH,0FFH ;NOW AL HAS
270 PUSH ES ;SAVE ES=0, SET BY VERIFY
271 PUSH DI ;WILL BE USED AS OFFSET IN SEGMENT 0
273 LES DI,ES:RESSEG
;FETCH POINTER TO MODETO IN RESIDENT CODE
274 PUSH BX ;TO AVOID 'TYPE MISMATCH' I PUT OFFSET
275 MOV BX,NEW_PTSFLAG
;FROM MODETO INTO BX
276 AND AH,BYTE PTR ES:[DI]+[BX] ;CLEAR THIS PRINTER'S BIT
277 MOV BYTE PTR ES:[DI]+[BX],AH ;RESTORE Revised FLAG BYTE
282 ;LPTn IS BEING UNREDIRECTED. IF THE PRINTER EXISTS, THE ADDRESS WORD FOR
283 ;THAT DEVICE WILL NOT CONTAIN 0001H. IF IT DOES CONTAIN 0001H, IT MUST BE SET
284 ;TO 0000H SO BASIC WILL NOT ALLOW IT TO BE OPENED. SEE PROCEDURE MODEECHO
285 ;IN THIS MODULE, AND TECH REF PAGE A-2 (RS232 AND PRINTER BASE).
287 SAL SI,1 ;SI=WORD n FOR LPTn
288 ; : : IF THE DUMMY PRINTER EXISTS
289 CMP ES:PRINTR
-2+[SI],0001H ;DOES THE PRINTER EXIST?
290 JNE ENDIF07
; IF SO, DON'T MESS WITH THE ADDRESS WORD
291 MOV ES:PRINTR
-2+[SI],0000H ;IF NOT, ZERO THE ADDRESS WORD
292 ; : : ENDIF PRINTER EXISTS
294 SAR SI,1 ;RESTORE SI TO n OF LPTn
295 ; SO PROPER LPTn GETS REDIRECTED
297 ;IF THE PRINTER EXISTS THE ADDRESS WORD IS NOW WHAT IT STARTED OUT AS
298 ;AT POWER UP INITIALIZATION TIME. IF THE PRINTER DOESN'T EXIST, THE ADDRESS
299 ;WORD IS NOW EQUAL TO 0000H.
301 CALL ECHO
;GO INFORM THE RESIDENT CODE
304 DISPLAY CRLF
;AN000;carriage return linefeed
306 ; : ENDIF IS REDIRECTION IN EFFECT
307 ; ENDIF IS n OF LPTn OK?
309 POP ES ;RESTORE SEG REG
311 ;A RETURN CODE IS PASSED BACK TO THE CALLER, MODEPRIN.
312 ;AH=0 MEANS INVALID LPTn
313 ;AH not= 0 MEANS LPTn IS OK
315 RET ;RETURN TO CALLER
317 ;***************************************************************
319 ;'MODEPTS' STARTS WITH THREE INSTRUCTIONS:
322 ; EA ---- ---- JMP PRINTER_IO
323 ; CK: (REDIRECT TO COMm)
324 ;'PTSFLAG' HAS A FLAG BYTE SHOWING WHICH LPTn GETS REDIRECTED.
325 ;THIS CODE HERE IS TO MODIFY THE FIRST TWO INSTRUCTIONS AT 'MODEPTS'
326 ;SO REDIRECTED LPTn GOES TO 'CK:' AND OTHER LPTn GOES TO PRINTER_IO.
330 LES DI,ES:RESSEG
;FETCH POINTER TO MODETO IN RESIDENT CODE
331 PUSH BX ;TO AVOID 'TYPE MISMATCH' I PUT THE OFFSET
332 PUSH CX ;NEED A HOLDER FOR FIXUP
333 MOV BX,NEW_PTSFLAG
; FROM MODETO INTO BX
334 MOV AL,BYTE PTR ES:[DI]+[BX] ;FIND WHICH LPTn GET REDIRECTED
335 MOV BX,DI ;PUT OFFSET OF MODETO INTO BX
337 ADD BX,OFFPTS
;ADD OFFSET OF MODEPTS FROM MODETO, NOW
338 ; ES:BX POINTS TO MODEPTS
339 MOV CX,FIXUP
;HOLD FIXUP IN WORD FORM SO LINKER CAN FILL IN
340 CLI ;IF AN INTERRUPT OCCURS HERE THE JUMP WOULD
342 MOV BYTE PTR ES:[BX]+4,CL ;SET JUMP TARGET (CK) TO +3BH
343 POP CX ;RETURN FIXUP'S WORD FORM HOLDER
344 MOV AH,0 ;CLEAR HIGH BYTE
345 SHL AL,1 ;COUNT WAS 0,1,2,3,...7
346 ; COUNT IS NOW 0,2,4,6...14
347 MOV SI,AX ;GET INDEX OF BR TABLE ENTRY
361 ; SINCE NO PRINTER IS TO BE REDIRECTED
362 MOV WORD PTR ES:[BX]+3,00EBH ;MAKE JUMP INTO NO-OP
363 ; TO CAUSE 'FALL THRU' TO JMP PRINTER_IO INSTR
367 MOV WORD PTR ES:[BX]+2,7403H
;TEST 3 : JZ CK
372 MOV WORD PTR ES:[BX]+2,7501H
;TEST 1 : JNZ CK
376 ; REDIRECT LPT1 AND LPT2 ONLY
377 MOV WORD PTR ES:[BX]+2,7402H
; TEST 2 : JZ CK
382 MOV WORD PTR ES:[BX]+2,7502H
;TEST 2 :JNZ CK
386 ; REDIRECT LPT1 AND LPT3 ONLY
387 MOV WORD PTR ES:[BX]+2,7401H
;TEST 1 : JZ CK
391 ; REDIRECT LPT2 AND LPT3 ONLY
392 MOV WORD PTR ES:[BX]+2,7503H
;TEST 3 : JNZ CK
396 ; REDIRECT ALL THREE: LPT1, LPT2, AND LPT3
397 MOV WORD PTR ES:[BX]+2,0EB00H ;TEST 0 : JMP CK
399 STI ;REENABLE INTERRUPTS
405 ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000;
407 ;³ DISPLAY_PRINTER_REROUTE_STATUS
408 ;³ ------------------------------
410 ;³ Setup message for the reroute status of the specified printer.
412 ;³ INPUT: BL - mask for ptsflag1 (1, 2 or 4)
413 ;³ REDPT - contains ASCII form of n OF LPTn in redirmsg "LPTn rerouted to COMm"
414 ;³ NOTREDPT - contains ASCII form of n of LPTn in message "LPTn not rerouted"
418 ;³ RETURN: REDCOM - filled with ASCII form of m OF COMm in MESSAGE "LPTn rerouted to COMn"none
422 ;³ MESSAGES: REDIRMSG if the printer is rerouted
423 ;³ NOTREMSG if the printer is not rerouted
431 ;³ ASSUMPTIONS: input is valid
434 ;³ SIDE EFFECT: ES - lost
437 ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ;AN000;
439 display_printer_reroute_status PROC
NEAR
442 MOV ES,CX ;set segment to zero ;AN665;
444 .IF <<ES:WORD PTR resseg
> NE
0000H> AND ;IF the resident code is loaded AND
445 MOV ES,ES:WORD PTR resseg
[2] ;AN665;
447 ;;MOV BL,printer_reroute_mask
448 TEST BL,ES:PTSFLAG1
;see if the printer is rerouted
449 .IF NZ THEN
;the printer is rerouted
450 SHR BL,1 ;was 1, 2, or 4, now is 0, 1, or 2
451 ;;;INC BL ;now is 1, 2, or 3
452 ;;;ADD BL,resflag2 ;ES:BX=>the com byte for the desired printer
453 ADD BX,resflag2
;ES:BX=>the com byte for the desired printer
456 .WHEN
<<BYTE PTR ES:[BX]> EQ 0>
457 MOV redcom
,"1" ;printer rerouted to COM1
459 .WHEN
<<BYTE PTR ES:[BX]> EQ 1>
460 MOV redcom
,"2" ;printer rerouted to COM2
462 .WHEN
<<BYTE PTR ES:[BX]> EQ 2>
463 MOV redcom
,"3" ;printer rerouted to COM3
465 .WHEN
<<BYTE PTR ES:[BX]> EQ 3>
466 MOV redcom
,"4" ;printer rerouted to COM4
469 display redirmsg
;"LPTn rerouted to COMm"
471 display notremsg
;"LPTn not rerouted"
479 display_printer_reroute_status ENDP