]> wirehaze git hosting - MS-DOS.git/blob - v4.0/src/BIOS/MSLPT.ASM

wirehaze git hosting

MZ is back!
[MS-DOS.git] / v4.0 / src / BIOS / MSLPT.ASM
1 PAGE ,132 ;\ f
2 TITLE MSLPT - BIOS
3 %OUT ...MSLPT.ASM
4
5 ;==============================================================================
6 ;REVISION HISTORY:
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 ;==============================================================================
13 itest=0
14 INCLUDE MSGROUP.INC ;DEFINE CODE SEGMENT
15 INCLUDE MSEQU.INC
16 INCLUDE MSMACRO.INC
17 INCLUDE DEVSYM.INC
18 INCLUDE IOCTL.INC
19
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
26 ;DATA
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)
33
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.
41
42
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.
45
46 ;----------------------------------------------------------
47 ;J.K. AN001; PRN$WRIT will retry only if error code is TIMEOUT.
48
49 ; WRITE TO PRINTER DEVICE
50
51 ; CX HAS COUNT OF BYTES
52 ; ES:DI POINT TO DESTINATION
53 ; AUXNUM HAS PRINTER NUMBER
54
55 PUBLIC PRN$WRIT
56 PRN$WRIT PROC NEAR
57 ASSUME DS:CODE ; SET BY PRINTER DEVICE DRIVER ENTRY
58
59 jcxz Prn$Done ;No char to output
60 Prn$Loop:
61 mov bx, 2 ;Initialize retry count
62 Prn$Out:
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
74 ;SB LOCS: 6
75
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
80 test ah,TIMEOUTSTATUS
81 jz Prn$Con ; NOT time out - continue
82
83 ;SB34LPT000****************************************************************
84 dec bx ;Retry until count is exhausted.
85 jnz Prn$Out ;Retry it.
86 jmp short Pmessg ;Return with error.
87 ;
88 ; next character
89 ;
90 Prn$Con:
91 inc di ;point to next char and continue
92 loop Prn$Loop
93 Prn$Done:
94 jmp Exit
95 Pmessg:
96 jmp Err$Cnt
97 PRN$WRIT endp
98
99 ; JCXZ EXVEC3 ; NO CHARS TO OUTPUT..
100 ;PRN$LOOP:
101 ; MOV BX,2 ; INITIALIZE RETRY FLAG
102 ;PRN$OUT:
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
107 ; JNZ PRRETRY
108 ; LOOP PRN$LOOP
109 ;EXVEC3:
110 ; JMP EXIT
111 ;PRRETRY:
112 ; DEC DI ; UNDO THE INC ABOVE...
113 ; DEC BX
114 ; JNZ PRN$OUT
115 ;PMESSG:
116 ; JMP ERR$CNT ;RETURN WITH THE ERROR
117 ;PRN$WRIT ENDP
118
119 ;--------------------------------------------------------
120
121 ; PRINTER STATUS ROUTINE
122
123 PUBLIC PRN$STAT
124 PRN$STAT PROC NEAR
125 ASSUME DS:CODE ; SET BY PRINTER DEVICE DRIVER ENTRY
126
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
132 ; JNZ PMESSG
133 TEST AH,NOTBUSYSTATUS
134 jnz Prn$Done ;No error. Exit
135 JMP BUS$EXIT
136 PRN$STAT ENDP
137
138 ; TAKE THE APPROPRIATE PRINTER AND DO THE OPERATION. TRIAGE THE STATUS
139 ; RETURNED IN AH INTO SOME MEANINGFUL ERROR.
140
141 PRNSTAT PROC NEAR
142 ;SB33037**********************************************************************
143 mov AH, 2 ; set command for get status ;SB ;3.30*
144 PRNOP: ;SB ;3.30*
145 call GETDX ; determine which printer ;SB ;3.30*
146 int 17h ; call ROM-BIOS printer routine ;SB;3.30*
147
148 ;SB33037**********************************************************************
149
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.
153
154 TEST AH,IOERRSTATUS ; I/O ERROR?
155 JZ CHECKNOTREADY ; NO, TRY NOT READY
156
157 ; AT THIS POINT, WE KNOW WE HAVE AN ERROR. THE CONVERSE IS NOT TRUE.
158
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
163 RET1:
164
165 ; WE HAVE TRIAGED NOW FOR OUT OF PAPER AND IO ERR (IGNORING TIME-OUT)
166
167 RET ; RETURN WITH ERROR
168
169 ; THE BITS SAID NO ERROR. UNFORTUNATELY, THERE MAY BE OTHER THINGS AT WORK
170 ; HERE.
171
172 CHECKNOTREADY:
173 MOV AL,2 ; ASSUME NOT-READY
174 TEST AH,TIMEOUTSTATUS ; IS TIME-OUT SET?
175 ; IF NZ THEN ERROR, ELSE OK???
176 PRNOP2:
177 RET
178 PRNSTAT ENDP
179
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.
183
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
187 PUBLIC PRN$TILBUSY
188 PRN$TILBUSY PROC NEAR
189 ASSUME DS:CODE ; SET BY PRINTER DEVICE DRIVER ENTRY
190
191 PUSH DS
192 PUSH ES
193 POP DS ; NOW ES AND DS BOTH POINT TO SOURCE BUFFER
194 ASSUME DS:NOTHING
195
196 MOV SI,DI ; EVERYTHING IS SET FOR LODSB
197 PRN$TILBLOOP:
198 PUSH CX
199 PUSH BX
200 XOR BX,BX
201 MOV BL,CS:[PRINTDEV]
202 SHL BX,1
203 MOV CX,CS:WAIT_COUNT[BX] ; WAIT COUNT TIMES TO COME READY
204 POP BX
205 PRN$GETSTAT:
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
212 LODSB
213 XOR AH,AH
214 CALL PRNOP
215 JNZ PRN$BERR ; ERROR
216 LOOP PRN$TILBLOOP ; GO FOR MORE
217 PRN$B:
218 POP DS
219 LDS BX,CS:[PTRSAV]
220 ASSUME DS:NOTHING
221 SUB WORD PTR [BX].COUNT,CX ;# OF SUCCESSFUL I/O'S
222 JMP EXIT
223 PRN$TILBUSY ENDP
224
225 PRN$BPERR PROC NEAR
226 ASSUME DS:CODE
227 POP CX
228 PRN$BERR:
229 POP DS
230 LDS BX,CS:[PTRSAV]
231 ASSUME DS:NOTHING
232
233 SUB WORD PTR [BX].COUNT,CX ;# OF SUCCESSFUL I/O'S
234 JMP ERR$EXIT
235 PRN$BPERR ENDP
236 ;
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
240 ; DEVICE.
241 ;
242 PUBLIC PRN$GENIOCTL
243 PRN$GENIOCTL PROC NEAR
244 ASSUME DS:CODE ; SET BY PRINTER DEVICE DRIVER ENTRY
245
246 LES DI,[PTRSAV]
247 CMP ES:[DI].MAJORFUNCTION,IOC_PC
248 JE PRNFUNC_OK
249 PRNFUNCERR:
250 JMP CMDERR
251
252 PRNFUNC_OK:
253 MOV AL,ES:[DI].MINORFUNCTION
254 LES DI,ES:[DI].GENERICIOCTL_PACKET
255 XOR BX,BX
256 MOV BL,[PRINTDEV] ; GET INDEX INTO RETRY COUNTS
257 SHL BX,1
258 MOV CX,WAIT_COUNT[BX] ; PULL OUT RETRY COUNT FOR DEVICE
259 CMP AL,GET_RETRY_COUNT
260 JZ PRNGETCOUNT
261 CMP AL,SET_RETRY_COUNT
262 JNZ PRNFUNCERR
263 MOV CX,ES:[DI].RC_COUNT
264 PRNGETCOUNT:
265 MOV WAIT_COUNT[BX],CX ; PLACE "NEW" RETRY COUNT
266 MOV ES:[DI].RC_COUNT,CX ; RETURN CURRENT RETRY COUNT
267 JMP EXIT
268 PRN$GENIOCTL ENDP
269 CODE ENDS
270 END