]>
wirehaze git hosting - MS-DOS.git/blob - v4.0/src/BIOS/MSLPT.ASM
5 ;==============================================================================
7 ;AN000 - New for DOS Version 4.00 - J.K.
8 ;AC000 - Changed for DOS Version 4.00 - J.K.
9 ;AN00x - PTM number for DOS Version 4.00 - J.K.
10 ;==============================================================================
11 ;AN001 - P156 KBMLPT device driver's retry logic. 8/18/87 J.K.
12 ;==============================================================================
14 INCLUDE MSGROUP
.INC ;DEFINE CODE SEGMENT
20 EXTRN BUS$EXIT
:NEAR ;MSBIO1
21 EXTRN ERR$CNT
:NEAR ;MSBIO1
22 EXTRN CMDERR
:NEAR ;MSBIO1
23 EXTRN GETDX
:NEAR ;MSBIO1
24 EXTRN EXIT
:NEAR ;MSBIO1
25 EXTRN ERR$EXIT
:NEAR ;MSBIO1
27 EXTRN PTRSAV
:DWORD ;MSBIO1
28 EXTRN TIMDEV
:WORD ;MSCLOCK
29 EXTRN LPT2DEV
:WORD ;MSBIO2
30 EXTRN WAIT_COUNT
:WORD ;MSDATA
31 EXTRN PRINTDEV
:BYTE ;MSDATA
32 ; IBM ROM STATUS BITS (I DON'T TRUST THEM, NEITHER SHOULD YOU)
34 NOTBUSYSTATUS
= 10000000B ; NOT BUSY
35 ACKSTATUS
= 01000000B ; ACKNOWLEDGE (FOR WHAT?)
36 NOPAPERSTATUS
= 00100000B ; NO MORE PAPER
37 SELECTEDSTATUS
= 00010000B ; THE PRINTER SAID IT WAS SELECTED
38 IOERRSTATUS
= 00001000B ; SOME KINDA ERROR
39 RESERVED
= 00000110B ; NOPS
40 TIMEOUTSTATUS
= 00000001B ; TIME OUT.
43 ; WARNING!!! THE IBM ROM DOES NOT RETURN JUST ONE BIT. IT RETURNS A
44 ; WHOLE SLEW OF BITS, ONLY ONE OF WHICH IS CORRECT.
46 ;----------------------------------------------------------
47 ;J.K. AN001; PRN$WRIT will retry only if error code is TIMEOUT.
49 ; WRITE TO PRINTER DEVICE
51 ; CX HAS COUNT OF BYTES
52 ; ES:DI POINT TO DESTINATION
53 ; AUXNUM HAS PRINTER NUMBER
57 ASSUME
DS:CODE ; SET BY PRINTER DEVICE DRIVER ENTRY
59 jcxz Prn$Done
;No char to output
61 mov bx, 2 ;Initialize retry count
63 ;SB34LPT000****************************************************************
64 ;SB Print the character at ES:[DI]
65 ;SB Call the function PrnOP to do this
66 ;SB The character to be printed goes in AL and the function code
67 ;SB for 'Output character' goes in AH
68 ;SB Check for error in printing.
69 ;SB If there is no error go to print the next character.
70 ;SB If there is an error indicated see if it is due to TIMEOUT. If the
71 ;SB error is not TIMEOUT then we can do nothing about it. Just go to
72 ;SB print the next character. If it is due to timeout we can execute
73 ;SB the code to retry the print which follows this piece of code
76 mov al,es:[di] ; assume AX disposible since enter
77 xor ah,ah ; via int 21h
78 call PrnOp
; print to printer
79 jz Prn$Con
; no error - continue
81 jz Prn$Con
; NOT time out - continue
83 ;SB34LPT000****************************************************************
84 dec bx ;Retry until count is exhausted.
85 jnz Prn$
Out ;Retry it.
86 jmp short Pmessg
;Return with error.
91 inc di ;point to next char and continue
99 ; JCXZ EXVEC3 ; NO CHARS TO OUTPUT..
101 ; MOV BX,2 ; INITIALIZE RETRY FLAG
103 ; MOV AL,ES:[DI] ; GET CHAR INTO AL
104 ; INC DI ; POINT TO NEXT CHAR
105 ; XOR AH,AH ; AH=0 => OUTPUT CHAR IN DL
106 ; CALL PRNOP ; TO INDICATE PRINT CHAR IN AL
112 ; DEC DI ; UNDO THE INC ABOVE...
116 ; JMP ERR$CNT ;RETURN WITH THE ERROR
119 ;--------------------------------------------------------
121 ; PRINTER STATUS ROUTINE
125 ASSUME
DS:CODE ; SET BY PRINTER DEVICE DRIVER ENTRY
127 CALL PRNSTAT
;DEVICE IN DX
128 JNZ PMESSG
; OTHER ERRORS WERE FOUND
129 ;J.K. The next three lines are commented out, since it is a dead code.
130 ; MOV AL,9 ; AGAIN, ASSUME OUT OF PAPER...
131 ; TEST AH,NOPAPERSTATUS
133 TEST AH,NOTBUSYSTATUS
134 jnz Prn$Done
;No error. Exit
138 ; TAKE THE APPROPRIATE PRINTER AND DO THE OPERATION. TRIAGE THE STATUS
139 ; RETURNED IN AH INTO SOME MEANINGFUL ERROR.
142 ;SB33037**********************************************************************
143 mov AH, 2 ; set command for get status ;SB ;3.30*
145 call GETDX
; determine which printer ;SB ;3.30*
146 int 17h
; call ROM-BIOS printer routine ;SB;3.30*
148 ;SB33037**********************************************************************
150 ; EXAMINE THE STATUS BITS TO SEE IF AN ERROR OCCURRED. UNFORTUNATELY, SEVERAL
151 ; OF THE BITS ARE SET SO WE HAVE TO PICK AND CHOOSE. WE MUST BE EXTREMELY
152 ; CAREFUL ABOUT BREAKING BASIC.
154 TEST AH,IOERRSTATUS
; I/O ERROR?
155 JZ CHECKNOTREADY
; NO, TRY NOT READY
157 ; AT THIS POINT, WE KNOW WE HAVE AN ERROR. THE CONVERSE IS NOT TRUE.
159 MOV AL,9 ; FIRST, ASSUME OUT OF PAPER
160 TEST AH,NOPAPERSTATUS
; OUT OF PAPER SET?
161 JNZ RET1
; YES, ERROR IS SET
162 INC AL ; INDICATE I/O ERROR
165 ; WE HAVE TRIAGED NOW FOR OUT OF PAPER AND IO ERR (IGNORING TIME-OUT)
167 RET ; RETURN WITH ERROR
169 ; THE BITS SAID NO ERROR. UNFORTUNATELY, THERE MAY BE OTHER THINGS AT WORK
173 MOV AL,2 ; ASSUME NOT-READY
174 TEST AH,TIMEOUTSTATUS
; IS TIME-OUT SET?
175 ; IF NZ THEN ERROR, ELSE OK???
180 ; OUTPUT UNTIL BUSY. THIS ENTRY POINT IS USED EXCLUSIVELY BY THE PRINT
181 ; SPOOLERS. UNDER NO CURCUMSTANCES SHOULD THE DEVICE DRIVER BLOCK WAITING FOR
182 ; THE DEVICE TO BECOME READY.
184 ; INPUTS: CX HAS COUNT OF BYTES TO OUTPUT.
185 ; ES:DI POINTS TO SOURCE BUFFER
186 ; OUTPUTS: SET THE NUMBER OF BYTES TRANSFERRED APPROPRIATELY
188 PRN$TILBUSY PROC
NEAR
189 ASSUME
DS:CODE ; SET BY PRINTER DEVICE DRIVER ENTRY
193 POP DS ; NOW ES AND DS BOTH POINT TO SOURCE BUFFER
196 MOV SI,DI ; EVERYTHING IS SET FOR LODSB
203 MOV CX,CS:WAIT_COUNT
[BX] ; WAIT COUNT TIMES TO COME READY
206 CALL PRNSTAT
; GET STATUS
207 JNZ PRN$BPERR
; ERROR
208 TEST AH,10000000B ; READY YET?
209 LOOPZ PRN$GETSTAT
; NO, GO FOR MORE
210 POP CX ; GET ORIGINAL COUNT
211 JZ PRN$BERR
; STILL NOT READY => DONE
216 LOOP PRN$TILBLOOP
; GO FOR MORE
221 SUB WORD PTR [BX].COUNT
,CX ;# OF SUCCESSFUL I/O'S
233 SUB WORD PTR [BX].COUNT
,CX ;# OF SUCCESSFUL I/O'S
237 ; MANIPULATES THE VALUE IN WAIT_COUNT DEPENDING ON THE VALUE PASSED IN THE
238 ; GENERIC IOCTL PACKET.
239 ; IT EITHER SETS OR RETURNS THE CURRENT VALUE FOR THE RETRY COUNT FOR THE
243 PRN$GENIOCTL PROC
NEAR
244 ASSUME
DS:CODE ; SET BY PRINTER DEVICE DRIVER ENTRY
247 CMP ES:[DI].MAJORFUNCTION
,IOC_PC
253 MOV AL,ES:[DI].MINORFUNCTION
254 LES DI,ES:[DI].GENERICIOCTL_PACKET
256 MOV BL,[PRINTDEV
] ; GET INDEX INTO RETRY COUNTS
258 MOV CX,WAIT_COUNT
[BX] ; PULL OUT RETRY COUNT FOR DEVICE
259 CMP AL,GET_RETRY_COUNT
261 CMP AL,SET_RETRY_COUNT
263 MOV CX,ES:[DI].RC_COUNT
265 MOV WAIT_COUNT
[BX],CX ; PLACE "NEW" RETRY COUNT
266 MOV ES:[DI].RC_COUNT
,CX ; RETURN CURRENT RETRY COUNT