summaryrefslogtreecommitdiff
path: root/v4.0/src/BIOS/MSLPT.ASM
diff options
context:
space:
mode:
authorGravatar Mark Zbikowski2024-04-25 21:24:10 +0100
committerGravatar Microsoft Open Source2024-04-25 22:32:27 +0000
commit2d04cacc5322951f187bb17e017c12920ac8ebe2 (patch)
tree80ee017efa878dfd5344b44249e6a241f2a7f6e2 /v4.0/src/BIOS/MSLPT.ASM
parentMerge pull request #430 from jpbaltazar/typoptbr (diff)
downloadms-dos-main.tar.gz
ms-dos-main.tar.xz
ms-dos-main.zip
MZ is back!HEADmain
Diffstat (limited to 'v4.0/src/BIOS/MSLPT.ASM')
-rw-r--r--v4.0/src/BIOS/MSLPT.ASM270
1 files changed, 270 insertions, 0 deletions
diff --git a/v4.0/src/BIOS/MSLPT.ASM b/v4.0/src/BIOS/MSLPT.ASM
new file mode 100644
index 0000000..ad858a0
--- /dev/null
+++ b/v4.0/src/BIOS/MSLPT.ASM
@@ -0,0 +1,270 @@
1 PAGE ,132 ;
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
34NOTBUSYSTATUS = 10000000B ; NOT BUSY
35ACKSTATUS = 01000000B ; ACKNOWLEDGE (FOR WHAT?)
36NOPAPERSTATUS = 00100000B ; NO MORE PAPER
37SELECTEDSTATUS = 00010000B ; THE PRINTER SAID IT WAS SELECTED
38IOERRSTATUS = 00001000B ; SOME KINDA ERROR
39RESERVED = 00000110B ; NOPS
40TIMEOUTSTATUS = 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
56PRN$WRIT PROC NEAR
57 ASSUME DS:CODE ; SET BY PRINTER DEVICE DRIVER ENTRY
58
59 jcxz Prn$Done ;No char to output
60Prn$Loop:
61 mov bx, 2 ;Initialize retry count
62Prn$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 ;
90Prn$Con:
91 inc di ;point to next char and continue
92 loop Prn$Loop
93Prn$Done:
94 jmp Exit
95Pmessg:
96 jmp Err$Cnt
97PRN$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
124PRN$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
136PRN$STAT ENDP
137
138; TAKE THE APPROPRIATE PRINTER AND DO THE OPERATION. TRIAGE THE STATUS
139; RETURNED IN AH INTO SOME MEANINGFUL ERROR.
140
141PRNSTAT PROC NEAR
142;SB33037**********************************************************************
143 mov AH, 2 ; set command for get status ;SB ;3.30*
144PRNOP: ;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
163RET1:
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
172CHECKNOTREADY:
173 MOV AL,2 ; ASSUME NOT-READY
174 TEST AH,TIMEOUTSTATUS ; IS TIME-OUT SET?
175 ; IF NZ THEN ERROR, ELSE OK???
176PRNOP2:
177 RET
178PRNSTAT 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
188PRN$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
197PRN$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
205PRN$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
217PRN$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
223PRN$TILBUSY ENDP
224
225PRN$BPERR PROC NEAR
226 ASSUME DS:CODE
227 POP CX
228PRN$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
235PRN$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
243PRN$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
249PRNFUNCERR:
250 JMP CMDERR
251
252PRNFUNC_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
264PRNGETCOUNT:
265 MOV WAIT_COUNT[BX],CX ; PLACE "NEW" RETRY COUNT
266 MOV ES:[DI].RC_COUNT,CX ; RETURN CURRENT RETRY COUNT
267 JMP EXIT
268PRN$GENIOCTL ENDP
269CODE ENDS
270 END