diff options
Diffstat (limited to 'v4.0/src/BIOS/MSLPT.ASM')
| -rw-r--r-- | v4.0/src/BIOS/MSLPT.ASM | 270 |
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 | |||
| 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 | ||