diff options
Diffstat (limited to 'v4.0/src/CMD/MODE/MODEPRIN.ASM')
| -rw-r--r-- | v4.0/src/CMD/MODE/MODEPRIN.ASM | 1096 |
1 files changed, 1096 insertions, 0 deletions
diff --git a/v4.0/src/CMD/MODE/MODEPRIN.ASM b/v4.0/src/CMD/MODE/MODEPRIN.ASM new file mode 100644 index 0000000..60ffebd --- /dev/null +++ b/v4.0/src/CMD/MODE/MODEPRIN.ASM | |||
| @@ -0,0 +1,1096 @@ | |||
| 1 | PAGE ,132 ; | ||
| 2 | TITLE MODEPRIN.SAL - PRINTER SUPPORT FOR THE MODE COMMAND | ||
| 3 | .XLIST | ||
| 4 | INCLUDE STRUC.INC | ||
| 5 | .LIST | ||
| 6 | .SALL | ||
| 7 | |||
| 8 | |||
| 9 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ;AN000; | ||
| 10 | ;º º ;AN000; | ||
| 11 | ;AN000; | ||
| 12 | ; AX001 - P3976: Need to have all pieces of messages in MODE.SKL so have to | ||
| 13 | ; implement the SYSGETMSG method of getting addressability to | ||
| 14 | ; the pieces. This means that the code does a SYSGETMSG call | ||
| 15 | ; which returns a pointer (DS:SI) to the message piece. The | ||
| 16 | ; address is then put in the sublist block for the message | ||
| 17 | ; being issued. | ||
| 18 | ;º º ;AN000; | ||
| 19 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P R O L O G ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ;AN000; | ||
| 20 | |||
| 21 | |||
| 22 | |||
| 23 | DISPLAY MACRO MSG | ||
| 24 | MOV DX,OFFSET MSG | ||
| 25 | CALL PRINTF | ||
| 26 | ENDM | ||
| 27 | |||
| 28 | PRINT MACRO | ||
| 29 | MOV DX,WORD PTR PT17 ;PASS PRINTER NUMBER | ||
| 30 | INT 17H ;OUTPUT TO PRINTER | ||
| 31 | ENDM | ||
| 32 | |||
| 33 | COMPARE MACRO STRING, CHAR1, CHAR2, CHAR3 | ||
| 34 | LOCAL END_COMPARE | ||
| 35 | |||
| 36 | ;------------------------------------------------------------------------------------------------ | ||
| 37 | ; | ||
| 38 | ; Compare first 3 characters of STRING with CHAR1, CHAR2, and CHAR3 | ||
| 39 | ; | ||
| 40 | ;------------------------------------------------------------------------------------------------ | ||
| 41 | |||
| 42 | PUSH SI | ||
| 43 | MOV SI,0 ;INITIALIZE INDEX | ||
| 44 | CMP STRING[SI],CHAR1 ;IF first char is a match THEN | ||
| 45 | JNE END_COMPARE | ||
| 46 | INC SI ; GET TO NEXT CHAR OF STRING | ||
| 47 | CMP STRING[SI],CHAR2 ; IF 2nd char is a match THEN | ||
| 48 | JNE END_COMPARE | ||
| 49 | INC SI | ||
| 50 | CMP STRING[SI],CHAR3 ; IF all three match then ZR is not set | ||
| 51 | END_COMPARE: | ||
| 52 | POP SI | ||
| 53 | ENDM | ||
| 54 | ; | ||
| 55 | IF_NO_PRINTER_ERROR_THEN MACRO | ||
| 56 | CMP PRINTER_ERROR,TRUE | ||
| 57 | JE CHK_FOR_P | ||
| 58 | ENDM | ||
| 59 | ; | ||
| 60 | JUMP_EQUAL_TO_CHK_FOR_P MACRO | ||
| 61 | LOCAL SKIP_JUMP | ||
| 62 | ; | ||
| 63 | JNE SKIP_JUMP | ||
| 64 | JMP CHK_FOR_P | ||
| 65 | SKIP_JUMP: | ||
| 66 | ENDM | ||
| 67 | |||
| 68 | |||
| 69 | SET MACRO REG,VALUE ;SET REG TO VALUE. DON'T SPECIFY AX FOR REG | ||
| 70 | |||
| 71 | PUSH AX | ||
| 72 | MOV AX,VALUE | ||
| 73 | MOV REG,AX | ||
| 74 | POP AX | ||
| 75 | |||
| 76 | ENDM | ||
| 77 | |||
| 78 | |||
| 79 | set_submessage_ptr MACRO submessage,message ;PUT pointer to "subMESSAGE" into submessage pointer field of "message". | ||
| 80 | |||
| 81 | MOV AX,submessage ;AX=message number ;AN001; | ||
| 82 | MOV DH,utility_msg_class ;DH=message class=utility class ;AN001; | ||
| 83 | CALL SYSGETMSG ;DS:SI=>message piece ;AN001; | ||
| 84 | MOV BP,OFFSET sublist_&message ;address the sublist control block ;AN001; | ||
| 85 | MOV [BP].sublist_off,SI ;the sublist now points to the desired message piece ;AN001; | ||
| 86 | ENDM ;AN001; | ||
| 87 | |||
| 88 | |||
| 89 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 90 | ;º º | ||
| 91 | |||
| 92 | INCLUDE common.stc ;contains the following structure | ||
| 93 | |||
| 94 | |||
| 95 | ;parm_list_entry STRUC ;used by parse_parameters and invoke | ||
| 96 | ; | ||
| 97 | ;parm_type DB bogus | ||
| 98 | ;item_tag DB 0FFH | ||
| 99 | ;value1 DW bogus ;used only for filespecs and code page numbers | ||
| 100 | ;value2 DW bogus ;used only for filespecs and code page numbers | ||
| 101 | ;keyword_switch_ptr DW 0 | ||
| 102 | ; | ||
| 103 | ;parm_list_entry ENDS | ||
| 104 | |||
| 105 | |||
| 106 | ;printer_settings STRUC ;map of the setting holders in resident code | ||
| 107 | |||
| 108 | ; chars_per_line DB ? | ||
| 109 | ; lines_per_inch DB ? | ||
| 110 | |||
| 111 | ;printer_settings ENDS | ||
| 112 | |||
| 113 | ;º º | ||
| 114 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ S T R U C T U R E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 115 | |||
| 116 | |||
| 117 | ; | ||
| 118 | ROM SEGMENT AT 0 | ||
| 119 | ORG 530H | ||
| 120 | RESSEG LABEL DWORD ;VECTOR POINTING TO MODETO IF RESIDENT | ||
| 121 | ROM ENDS | ||
| 122 | |||
| 123 | ;********************************************************************** | ||
| 124 | PRINTF_CODE SEGMENT PUBLIC | ||
| 125 | ASSUME CS:PRINTF_CODE,DS:PRINTF_CODE | ||
| 126 | ; | ||
| 127 | |||
| 128 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 129 | ;º º | ||
| 130 | |||
| 131 | EXTRN B_item_tag:ABS ;see modepars | ||
| 132 | EXTRN COM1_or_COM2:WORD ;=>"Must specify COM1 or COM2" message | ||
| 133 | EXTRN CTRL_ST:BYTE ;CONTROL STRING SET UP FROM CONFIGURATION PARAMETERS INPUT | ||
| 134 | EXTRN E_item_tag:ABS ;see modepars | ||
| 135 | EXTRN invalid_number_of_parameters:WORD ;=>"Invalid number of parameters" | ||
| 136 | EXTRN noerror:BYTE ;AN000; | ||
| 137 | EXTRN OFFRETRY:ABS ;OFFSET TO TEST INSTR IN RETRY CODE | ||
| 138 | EXTRN not_supported:WORD ;message telling user he specified "P" on a net printer | ||
| 139 | EXTRN PRINTR:WORD ;PRINTER BASE (40:8), HOLDS PORT ADDRESSES OF PRINTER CARDS | ||
| 140 | EXTRN ERR1:BYTE ;POINTER TO "Invalid parameters" | ||
| 141 | EXTRN Illegal_device_ptr:WORD ;pointer to device name that does not exist | ||
| 142 | ;AC001; EXTRN INF_OR_NO_PTR:WORD ;PART OF "... retry on parallel printer time-out" message | ||
| 143 | EXTRN INDEX:WORD ;INDEX OF REDIRECTED PRINTER IN NETWORK REDIRECTION LIST | ||
| 144 | EXTRN IS_LOCAL:BYTE ;BOOLEAN. INDICATES IF A PRINTER IS LOCAL. INITIALLY TRUE | ||
| 145 | EXTRN keyword:ABS | ||
| 146 | EXTRN LOCAL_NAME:BYTE ;FILLED IN BY GET ASSIGN LIST ENTRY FUNCTION CALL | ||
| 147 | EXTRN lpt1_retry_type:BYTE ;byte in resident code for retry mask, see rescode | ||
| 148 | EXTRN LPTNO:BYTE ;see modeecho | ||
| 149 | EXTRN machine_type:BYTE ;see "rescode" | ||
| 150 | EXTRN MODEECHO:NEAR ;SET UP REDIRECTION OF PARALLEL TO SERIAL | ||
| 151 | EXTRN MODELENG:NEAR | ||
| 152 | EXTRN MODELOAD:NEAR ;MOVES THE CODE AT MODETO TO 60 AND MAKES IT RESIDENT ;AN000; | ||
| 153 | EXTRN NET_ERROR:WORD ;"NET 042: Unable to do requested comand" ;AN000; | ||
| 154 | EXTRN NONE_item_tag:ABS ;AN000;see modepars ;AN000; | ||
| 155 | ;EXTRN no_retry_active:ABS ;see invoke.asm ;AN000; | ||
| 156 | EXTRN parm_lst:BYTE ;see modepars.asm ;AN000; | ||
| 157 | EXTRN P_item_tag:ABS ;see modepars.asm ;AN000; | ||
| 158 | ;EXTRN parallel_printer_settings:WORD ;see "rescode" ;AN000; | ||
| 159 | EXTRN P14_model_byte:ABS ;see "rescode" ;AN000; | ||
| 160 | EXTRN PRINTF:NEAR ;FORMATTED "C" LIKE SCREEN OUTPUT ROUTINE ;AN000; | ||
| 161 | EXTRN PARM1:BYTE,PARM2:BYTE,PARM3:BYTE,MODE:BYTE,FLAG:BYTE | ||
| 162 | EXTRN parm_list_holder:WORD ;address of parsed parameter list ;AN663; | ||
| 163 | EXTRN parms_form:BYTE ;AN000; | ||
| 164 | EXTRN DEVICE:BYTE,PPARM:BYTE ;AN000; | ||
| 165 | EXTRN R_item_tag:ABS ;AN000; | ||
| 166 | ;EXTRN res_lpt_retry_type:ABS ;retry type flag, displacement from address pointed to by 50:30 when code is res, see rescode | ||
| 167 | EXTRN retry_index:WORD ;see modecom.asm ;AN000; | ||
| 168 | |||
| 169 | EXTRN ERR2:WORD ;CR,LF,"Printer error",BEEP,CR,LF,"$" | ||
| 170 | EXTRN PT80:WORD ;CR,LF,"LPT" | ||
| 171 | EXTRN PT80N:BYTE ;DB " " | ||
| 172 | ; ": set for 80",CR,LF,"$" | ||
| 173 | EXTRN PT132:WORD ;CR,LF,"LPT" | ||
| 174 | EXTRN PT132N:BYTE ;" " | ||
| 175 | ; ": set for 132",CR,LF,"$" | ||
| 176 | EXTRN PTLINES:WORD ;CR,LF,"Printer lines per inch set",CR,LF,"$" | ||
| 177 | EXTRN NORETRY:WORD ;message number for CR,LF,'No','$' ;AC001; | ||
| 178 | EXTRN INFINITE:WORD ;message number for CR,LF,'Infinite' ;AC001; | ||
| 179 | EXTRN REMOTE_DEV:BYTE ;FILLED IN BY GET ASSIGN LIST ENTRY FUNCTION CALL | ||
| 180 | EXTRN RETPARTO:WORD ;message number for '%1 retry on parallel printer timeout',CR,LF,'$' | ||
| 181 | ;EXTRN ROOM_FOR_COLON:WORD ;INITIALLY 0, CHANGED TO 1 IF COLON IS INCLUDED | ||
| 182 | EXTRN sublist_retparto:BYTE ; control block for "%1 retry on parallel printer timeout" ;AC001; | ||
| 183 | EXTRN SYSGETMSG:NEAR ;AC001; | ||
| 184 | EXTRN utility_msg_class:ABS ;used for input to sysgetmsg | ||
| 185 | EXTRN VERIFY:NEAR ;FINDS IF n OF LPTn IS LEGAL | ||
| 186 | |||
| 187 | ;º º | ||
| 188 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E X T R N S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 189 | |||
| 190 | |||
| 191 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 192 | ;º º | ||
| 193 | |||
| 194 | ;CR EQU 13 ;CARRIAGE RETURN | ||
| 195 | ;LF EQU 10 ;LINE FEED | ||
| 196 | ;BEEP EQU 7 ;SOUND THE AUDIBLE ALARM | ||
| 197 | ;EQUALSIGN EQU "=" ;CHAR IN LPTn:=COMm | ||
| 198 | busy_status EQU 080H ;flag telling resident code to not change anything | ||
| 199 | COLON EQU ":" ;CHAR IN "LPT1:" | ||
| 200 | error_status EQU 029H ;status byte indicating the printer is on fire(busy, no paper, I/O error, timeout) | ||
| 201 | FALSE EQU 00H | ||
| 202 | SPACE EQU " " ;THE BLANK CHARACTER | ||
| 203 | TO_SCREEN EQU 9 ;REQUEST OUTPUT TO SCREEN | ||
| 204 | INTCONV EQU 48 ;CONVERTS ASCII TO NUMERIC | ||
| 205 | EIGHTY EQU 80 ;80 COL PRINTER WIDTH | ||
| 206 | no_retry_flag EQU 0 ;no retry active, stored in lptx_retry_type, see rescode.sal | ||
| 207 | ONE_THIRTY_TWO EQU 132 ;132 COL PRINTER WIDTH | ||
| 208 | PRTDC2 EQU 18 ;PRINTER CONTROL CHAR FOR 80 COL | ||
| 209 | PRTSI EQU 15 ;PRINTER CONTROL CHAR FOR 132 CHAR | ||
| 210 | PRTCANCEL EQU 24 ;PRINTER CONTROL CHAR FOR CANCEL | ||
| 211 | CHAR6 EQU "6" ;REQUEST FOR 6 LINES PER INCH | ||
| 212 | CHAR8 EQU "8" ;REQUEST FOR 8 LINES PER INCH | ||
| 213 | L EQU "L" | ||
| 214 | P EQU "P" | ||
| 215 | T EQU "T" | ||
| 216 | R EQU "R" | ||
| 217 | N EQU "N" | ||
| 218 | NULL EQU 0 ;NULL CHAR | ||
| 219 | ASC0 EQU "0" ;ASCII 0, REQUEST 8 LINES PER INCH | ||
| 220 | ASC2 EQU "2" ;ASCII 2, REQUEST 6 LINES PER INCH | ||
| 221 | escape EQU 27 ;ESCAPE PRINTER CONTROL CHAR | ||
| 222 | PRINTERSETUP EQU 5E02H ;FUNCTION CODE FOR PRINTER SET UP DOS CALL | ||
| 223 | GET_LIST_ENTRY EQU 5F02H ;FUNCTION CODE FOR GET ASSIGN LIST ENTRY FROM NETWORK REDIR. LIST | ||
| 224 | CHAR_DEVICE EQU 3 ;CHARACTER DEVICE "MACRO" TYPE (IN NETWORK LINGO). | ||
| 225 | PRN_NO EQU 3 ;CHARACTER POSITION OF THE PRINTER NUMBER IN LPTn, (ZERO BASED) | ||
| 226 | ready_status EQU 90H ;flag telling resident code to set status indicating printer is ready for another character | ||
| 227 | UNCHANGED EQU -1 ;-1 INDICATES TO SERVER THAT PARAMTER IS UNCHANGED (NOT SPECIFIED) | ||
| 228 | unspecified EQU 0FFH ;AN000;value of parm2 if no lines per inch was specified | ||
| 229 | TRUE EQU 0FFH | ||
| 230 | ENDPARM EQU MODE | ||
| 231 | ;PARMNO EQU PARM1+3 ;LOCATION OF DEVICE NUMBER | ||
| 232 | ;PARMCOL EQU PARM1+4 ;LOCATION OF COLON IN LPTn: | ||
| 233 | ;PARMEQ EQU PARM1+4 ;LOCATION OF = IN LPTn= ,(NO COLON SPECIFIED) | ||
| 234 | parm_list EQU [BP] | ||
| 235 | |||
| 236 | ;º º | ||
| 237 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ E Q U A T E S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 238 | |||
| 239 | |||
| 240 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 241 | ;º º | ||
| 242 | |||
| 243 | ;PARM1 DB 10 DUP(0) | ||
| 244 | ;PARM2 DB -1 ;HOLDS LINES PER INCH IN CHARACTER FORM | ||
| 245 | ;PARM3 DB 0 | ||
| 246 | ;MODE DB 0 | ||
| 247 | ;FLAG DB 0 | ||
| 248 | ;CTRL_ST DB 5 DUP(PRTCANCEL) | ||
| 249 | ;INDEX DW 0 | ||
| 250 | columns_holder DB bogus | ||
| 251 | i DB 0 ;loop index for retry index calculation | ||
| 252 | PT17 DW 0 ;SAVES PRINTER NUMBER FOR DX AND INT 17H | ||
| 253 | LPTN DB 0 ;SAVES ID OF WHICH LPTn IS REFERENCED | ||
| 254 | PRINTER_NO DB 0 ;SAVES LPT NUMBER IN ZERO BASED NUMERICAL FORM | ||
| 255 | CTRL_ST_LEN DW 0000 ;HOLDER FOR LENGTH OF THE CONTROL STRING | ||
| 256 | REDIRECTED DB 00 ;FLAG TO INDICATE A PRINTER IS ON THE NETWORK | ||
| 257 | CHARS_LINE DB -1 ;HOLDS CHARACTERS PER LINE IN NUMERIC FORM | ||
| 258 | NO_COLON DW 00 ;CHAR POSITIONS TO MOVE IF NO COLON INCLUDED IN DEVICE NAME | ||
| 259 | ;nothing_past_LPTn_colon_equal DB ":","=",0,0,0,0 ;just "LPTn:=" as parameters | ||
| 260 | ;len_nothing_past_LPTn_colon_equal EQU $-nothing_past_LPTn_colon_equal | ||
| 261 | ;nothing_past_LPTn_equal DB "=",0,0,0,0,0 ;just "LPTn=" as parameters | ||
| 262 | ;len_nothing_past_LPTn_equal EQU $-nothing_past_LPTn_equal | ||
| 263 | ;nothing_past_LPTn_colon DB ":",0,0,0,0,0 ;just "LPTn:" as parameters | ||
| 264 | ;len_nothing_past_LPTn_colon EQU $-nothing_past_LPTn_colon | ||
| 265 | ;nothing_past_LPTn DB 0,0,0,0,0,0 ;just "LPTn" as parameters | ||
| 266 | ;len_nothing_past_LPTn EQU $-nothing_past_LPTn | ||
| 267 | PTLINES_REQ DB 00 ;BOOLEAN INDICATOR OF LINES PER INCH REQUESTED | ||
| 268 | PRINTER_ERROR DB 00 ;BOOLEAN INDICATOR OF PRINTER NOT THERE OR OFF OR OFFLINE | ||
| 269 | EIGHTY_CHARS_LINE_REQ DB 00 ;BOOLEAN, INDICATES IF 80 CHARS/LINE REQUESTED | ||
| 270 | REQ_132_CHARS_LINE DB 00 ;BOOLEAN, INDICATES IF 132 CHARS/LINE REQUESTED | ||
| 271 | |||
| 272 | ;º º | ||
| 273 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ D A T A ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 274 | |||
| 275 | |||
| 276 | ;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» | ||
| 277 | ;º º | ||
| 278 | |||
| 279 | PUBLIC busy_status ;used by rescode in parallel retry code | ||
| 280 | PUBLIC columns_holder ;AN000; | ||
| 281 | PUBLIC error_status ;used by analyze_and_invoke and rescode | ||
| 282 | PUBLIC modify_resident_code ;used by invoke ;AN000; | ||
| 283 | PUBLIC MODEPRIN | ||
| 284 | PUBLIC no_retry_flag ;used by analyze_and_invoke | ||
| 285 | PUBLIC printer_no ;needed by modepars | ||
| 286 | PUBLIC ready_status ;used by analyze_and_invoke | ||
| 287 | ;PUBLIC set_retry_flag ;used by invoke in turn_off_retry_case | ||
| 288 | PUBLIC set_retry_type ;used by invoke in turn_off_retry_case | ||
| 289 | |||
| 290 | ;º º | ||
| 291 | ;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ P U B L I C S ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ | ||
| 292 | |||
| 293 | |||
| 294 | ;******************************************************************* | ||
| 295 | MODEPRIN PROC NEAR | ||
| 296 | |||
| 297 | |||
| 298 | ;On entry: "columns_holder" contains 132,80 or 88H. | ||
| 299 | ; "parm2" contains "[6³8]" (FFH if not specified). | ||
| 300 | ; "parm_list[retry_index]" contains "X_item_tag" where X is e, b, r, or p | ||
| 301 | |||
| 302 | MOV AL,LPTNO ;AN000;LPTNO set up by modepars in first_parm_case | ||
| 303 | MOV PT80N,AL ;PUT ASCII PRINTER NUMBER INTO BOTH | ||
| 304 | MOV PT132N,AL ; MESSAGES | ||
| 305 | SUB AL,INTCONV+1 ;CONVERT TO INTEGER, MINUS ONE | ||
| 306 | MOV PRINTER_NO,AL ;SAVE ZERO BASED PRINTER NUMBER | ||
| 307 | MOV AH,0 ;CLEAR AH | ||
| 308 | MOV WORD PTR PT17,AX ;SET UP PRINTER NUMBER FOR INTERRUPT 17H | ||
| 309 | |||
| 310 | |||
| 311 | MOV DI,0 ;INITIALIZE LENGTH OF CONTROL STRING | ||
| 312 | MOV BL,columns_holder ;BL=binary form of requested chars per line | ||
| 313 | ; : : : IF REQUEST IS FOR 80 COL | ||
| 314 | CMP BL,EIGHTY | ||
| 315 | JNE ELSEIF03 | ||
| 316 | ; | ||
| 317 | MOV CHARS_LINE,BL ;SAVE CHARACTERS PER LINE | ||
| 318 | MOV EIGHTY_CHARS_LINE_REQ,TRUE | ||
| 319 | MOV BL,PRTDC2 ;SEND A DC2 CHAR TO SELECT 80 COL | ||
| 320 | ; : : : ELSEIF SINCE NOT 80, IS REQUEST FOR 132? | ||
| 321 | JMP SHORT ENDIF03 | ||
| 322 | ELSEIF03: | ||
| 323 | CMP BL,ONE_THIRTY_TWO ;132? | ||
| 324 | JNE ENDIF03 ;AC000; | ||
| 325 | ; | ||
| 326 | MOV CHARS_LINE,BL ;SAVE CHARACTERS PER LINE | ||
| 327 | MOV REQ_132_CHARS_LINE,TRUE | ||
| 328 | MOV BL,PRTSI ;SEND 'SI', CONDENSED PRINT | ||
| 329 | ; : : : ENDIF ,END IS REQUEST FOR 80 COL | ||
| 330 | ENDIF03: | ||
| 331 | |||
| 332 | ; : : : IF ANYTHING TO PRINT, | ||
| 333 | CMP BL,bogus ;AC000; | ||
| 334 | JE ENDIF04 | ||
| 335 | |||
| 336 | MOV BYTE PTR CTRL_ST[DI],BL ;PUT CONTROL CHAR FOR COLS/LINE IN CONTROL STRING | ||
| 337 | INC DI ;GET TO NEXT CHAR POSITION IN CONTROL STRING | ||
| 338 | |||
| 339 | |||
| 340 | ; : : : ENDIF END IF ANYTHING TO PRINT? TEST | ||
| 341 | ENDIF04: | ||
| 342 | |||
| 343 | PUBLIC ENDIF04 | ||
| 344 | |||
| 345 | ;***************************************************************** | ||
| 346 | ; LOOK AT THE SECOND PARM, CHECKING FOR 6 OR 8 LINES PER INCH | ||
| 347 | ;***************************************************************** | ||
| 348 | MOV BL,NULL ;NULL CHAR, TO BE REPLACED MAYBE | ||
| 349 | ; : : : IF THERE IS A SECOND PARM, | ||
| 350 | CMP DS:PARM2,unspecified ;AC000; | ||
| 351 | JE ENDIF05 | ||
| 352 | ; | ||
| 353 | ; : : : : IF THE REQUEST FOR 6 LINES PER INCH? | ||
| 354 | CMP DS:PARM2,CHAR6 | ||
| 355 | JNE ELSEIF06 | ||
| 356 | ; | ||
| 357 | MOV BL,ASC2 ;REQUEST 6 LPI | ||
| 358 | ; : : : : ELSEIF REQUEST IS FOR 8 LINES PER INCH | ||
| 359 | JMP SHORT ENDIF06 | ||
| 360 | ELSEIF06: | ||
| 361 | CMP DS:PARM2,CHAR8 | ||
| 362 | JNE ENDIF06 | ||
| 363 | MOV BL,ASC0 ;REQUEST 8 LINES PER INCH | ||
| 364 | ; : : : : ENDIF ,END IS REQUEST FOR 6 LPI? TEST | ||
| 365 | ENDIF06: | ||
| 366 | ; : : : ENDIF END IS THERE A SECOND PARM? TEST | ||
| 367 | ENDIF05: | ||
| 368 | ; : : : IF 6 OR 8 LINES PER INCH REQUESTED | ||
| 369 | CMP BL,0 | ||
| 370 | JE ENDIF07 | ||
| 371 | MOV CTRL_ST[DI],escape ;PUT AN ESCAPE CHAR IN THE CONTROL STRING | ||
| 372 | INC DI ;GET TO NEXT CHAR POSITION IN THE CONTROL STRING | ||
| 373 | ; | ||
| 374 | MOV BYTE PTR CTRL_ST[DI],BL ;PUT CONTROL CHAR FOR LINES/INCH IN CONTROL STRING | ||
| 375 | INC DI ;GET TO NEXT CHAR POSITION IN THE CONTROL STRING | ||
| 376 | ; | ||
| 377 | MOV PTLINES_REQ,TRUE ;INDICATE LINES PER INCH SET IF NO PRINTER ERROR | ||
| 378 | ; : : : ENDIF END IS 6 OR 8 LPI REQUESTED? TEST | ||
| 379 | ENDIF07: | ||
| 380 | CALL VERIFY ;SEE IF n OF LPTn WAS LEGAL | ||
| 381 | MOV BYTE PTR LPTN,AH ;SAVE THE n OF LPTn | ||
| 382 | ; | ||
| 383 | MOV BX,0 | ||
| 384 | PUSH BX | ||
| 385 | POP ES ;GET ADDRESSABILITY TO PRINTER BASE | ||
| 386 | MOV BL,PRINTER_NO ;PUT ZERO BASED PRINTER NUMBER INTO BL | ||
| 387 | SAL BL,1 ;CHANGE TO WORD OFFSET FROM PRINTER BASE (40:8) | ||
| 388 | CMP ES:PRINTR[BX],0 ;SEE IF THERE IS NO PORT ADDRESS FOR THE SPECIFIED PRINTER THEN | ||
| 389 | JNE PRINTER_EXISTS | ||
| 390 | MOV IS_LOCAL,FALSE ;NOT A LOCAL PRINTER | ||
| 391 | PRINTER_EXISTS: | ||
| 392 | ; | ||
| 393 | ;************************************************************************************************** | ||
| 394 | ; SEARCH THE NETWORK REDIRECTION LIST | ||
| 395 | ; | ||
| 396 | ; IF THE PRINTER IS FOUND IN THE LIST THEN THE CONTROL STRING HAS TO BE SENT TO THE REDIRECTOR, | ||
| 397 | ; OTHERWISE THE CONTROL STRING WILL BE SENT DIRECTLY TO THE LOCAL PRINTER. | ||
| 398 | ; AN INDEX WILL BE INITIALIZED TO ZERO. A GET ASSIGN LIST ENTRY CALL WILL BE MADE, THE DEVICE | ||
| 399 | ; TYPE IS CHECKED FOR CHARACTER DEVICE TYPE. IF THE ENTRY IS A CHARACTER DEVICE THEN THE NAME IS | ||
| 400 | ; COMPARED WITH THE NAME OF THE PRINTER TO BE CONFIGURED. IF THE NAMES MATCH THEN WE KNOW THAT | ||
| 401 | ; THE PRINTER HAS BEEN PUT ON THE NETWORK, ELSE WE CONTINUE DOWN THE LIST BY INCREMENTING THE | ||
| 402 | ; INDEX AND MAKING ANOTHER GET ASSIGN LIST ENTRY CALL. THIS CONTINUES UNTIL THE END OF THE NRL | ||
| 403 | ; IS REACHED OR THE PRINTER IS FOUND. | ||
| 404 | ; GET ASSIGN LIST ENTRY CALL WORKS AS FOLLOWS: 5F02H IS PUT IN AX, THE INDEX IS PUT IN BX. ON | ||
| 405 | ; RETURN DS:SI POINTS TO THE LOCAL NAME, ES:DI POINTS TO REMOTE NAME, CX HAS THE DEVICE TYPE. IF | ||
| 406 | ; CARRY IS SET AX HAS ERROR CODE: INVALID FUNCTION (NETWORK SUPPORT IS NOT PRESENT) OR, NO MORE | ||
| 407 | ; FILES (THE INDEX IS GREATER THAN THE NUMBER OF NETWORK ASSIGNMENTS). | ||
| 408 | ; | ||
| 409 | ;************************************************************************************************** | ||
| 410 | ; | ||
| 411 | SEE_IF_REDIRECTED: | ||
| 412 | |||
| 413 | PUBLIC SEE_IF_REDIRECTED | ||
| 414 | |||
| 415 | MOV CTRL_ST_LEN,DI ;SAVE LENGTH OF CONTROL STRING | ||
| 416 | DEC INDEX ;SET INDEX TO -1 SO IT WILL BEGIN AT ZERO | ||
| 417 | SRCH_NRL: | ||
| 418 | MOV AX,GET_LIST_ENTRY ;SET UP FOR GET ASSIGN LIST ENTRY FUNCTION CALL | ||
| 419 | INC INDEX | ||
| 420 | MOV BX,INDEX ;BX GETS THE INDEX OF THE ENTRY TO BE FECTHED | ||
| 421 | MOV SI,OFFSET LOCAL_NAME ;DS:SI POINTS TO HOLDING AREA FOR LOCAL DEVICE NAME | ||
| 422 | PUSH DS | ||
| 423 | POP ES ;ES GETS THE SEGMENT OF REMOTE DEVICE NAME HOLDING AREA | ||
| 424 | MOV DI,OFFSET REMOTE_DEV ;ES:DI POINTS TO (USELESS) REMOTE DEVICE NAME HOLDING AREA | ||
| 425 | INT 21H | ||
| 426 | JNC CHK_DEV_TYPE | ||
| 427 | JMP NOT_RED ;IF CARRY IS SET THEN THE PRINTER IS NOT REDIRECTED | ||
| 428 | CHK_DEV_TYPE: | ||
| 429 | CMP BL,CHAR_DEVICE ;ELSE CHECK THE DEVICE TYPE | ||
| 430 | JE CHECK_NAME ;IF THE DEVICE TYPE IS CHAR DEVICE THEN COMPARE NAMES | ||
| 431 | JMP SRCH_NRL ;ELSE CONTINUE SEARCH | ||
| 432 | CHECK_NAME: ;SEE IF THE LOCAL NAME IS THE PRINTER TO BE CONFIGURED | ||
| 433 | ; Count the number of characters in the local name | ||
| 434 | MOV SI,00 ;INITIALIZE THE CHARACTER COUNTER | ||
| 435 | COUNT: | ||
| 436 | CMP LOCAL_NAME[SI],NULL ;WHILE (char<>null) AND (char<>space) DO | ||
| 437 | JE CHECK_1st_3 ;END OF NAME | ||
| 438 | CMP LOCAL_NAME[SI],SPACE | ||
| 439 | JE CHECK_1st_3 ; END OF NAME | ||
| 440 | INC SI ; INCREMENT NUMBER OF CHARS IN THE NAME | ||
| 441 | JMP COUNT ;END WHILE non-termination char | ||
| 442 | CHECK_1st_3: ;SEE IF 1st 3 CHARS ARE LPT OR PRN | ||
| 443 | CMP SI,4 ;IF the name is 4 or less chars THEN | ||
| 444 | JG CONTINUE_SEARCH ;NAME IS TOO LONG | ||
| 445 | COMPARE LOCAL_NAME, L, P, T | ||
| 446 | JNE CHECK_FOR_PRN | ||
| 447 | MOV AL,PT80N ;PUT PRINTER NUMBER IN AL | ||
| 448 | CMP LOCAL_NAME[PRN_NO],AL ;CHECK PRINTER NUMBER | ||
| 449 | JE END_CHECK_NAME ;FOUND THE PRINTER IN THE LIST | ||
| 450 | CHECK_FOR_PRN: | ||
| 451 | COMPARE LOCAL_NAME, P, R, N | ||
| 452 | JNE CONTINUE_SEARCH ;NOT REDIRECTED AS PRN EITHER | ||
| 453 | CMP PT80N,1 ;IF printer to be configured is lpt1 THEN | ||
| 454 | JNE CONTINUE_SEARCH | ||
| 455 | JMP SHORT END_CHECK_NAME ;FOUND THE PRINTER IN THE LIST | ||
| 456 | CONTINUE_SEARCH: | ||
| 457 | JMP SRCH_NRL | ||
| 458 | END_CHECK_NAME: | ||
| 459 | |||
| 460 | PUBLIC END_CHECK_NAME | ||
| 461 | |||
| 462 | MOV REDIRECTED,TRUE ;REDIRECTED:=TRUE. THE PRINTER WAS FOUND IN NRL | ||
| 463 | ; | ||
| 464 | ;************************************************************************************************** | ||
| 465 | ; INDICATE TO SERVER THAT THE CONFIGURATION OF A NETWORK PRINTER HAS CHANGED. | ||
| 466 | ; | ||
| 467 | ; SET DS:SI TO POINT TO THE PRINTER NAME, CHARS_LINE HAS THE CHARACTERS PER LINE, PARM2 HAS THE | ||
| 468 | ; LINES PER INCH IN CHARACTER FORM. | ||
| 469 | ;************************************************************************************************** | ||
| 470 | ; | ||
| 471 | CMP CTRL_ST_LEN,0 ;IF printer configuration has changed THEN | ||
| 472 | JUMP_EQUAL_TO_CHK_FOR_P | ||
| 473 | MOV SI,OFFSET LOCAL_NAME ;DS:SI POINTS TO PRINTER NAME | ||
| 474 | MOV AH,02 | ||
| 475 | XOR AL,AL ;AL=0 | ||
| 476 | MOV CL,8 ;CL HOLDS SHIFT COUNT. 8 IS NUMBER OF BITS NEEDED FOR 132. | ||
| 477 | MOV DL,CHARS_LINE ;MOV 80 or 132 or FF INTO ACCUMULATOR REGISTER | ||
| 478 | ROR DL,1 ;IF (DL=50H) OR (DL=84H) THEN DL[7]=0 ELSE DL=FFH | ||
| 479 | SAR DL,CL ;IF (CHARS_LINE = 80) OR (CHARS_LINE = 132) THEN | ||
| 480 | MOV BH,DL ;BH=0 ELSE BH=BL=FFH | ||
| 481 | MOV BL,CHARS_LINE ;BX= -1 or 80 or 132 | ||
| 482 | MOV CL,PARM2 | ||
| 483 | CMP PARM2,bogus ;IF THE LINES PER INCH WASN'T SPECIFIED THEN DON'T CONVERT | ||
| 484 | JNE CONVERT | ||
| 485 | MOV CH,UNCHANGED ;CX=-1 (FFFF) | ||
| 486 | JMP CALL_SERVER | ||
| 487 | CONVERT: ;ELSE | ||
| 488 | XOR CH,CH ;CLEAR CH | ||
| 489 | SUB CX,INTCONV ;CHANGE LINES PER INCH TO NUMERIC FORM | ||
| 490 | CALL_SERVER: ;ENDIF | ||
| 491 | INT 2AH ;CALL SERVER | ||
| 492 | ; | ||
| 493 | ;************************************************************************************************** | ||
| 494 | ; SET UP REDIRECTOR WITH CONTROL STRING BUFFER VIA A PRINTER SET UP CALL. | ||
| 495 | ; | ||
| 496 | ; DI HAS LENGTH OF THE CONTROL STRING. NEED TO SET DS:SI TO THE POINT TO THE CONTROL STRING | ||
| 497 | ; BUFFER, PUT THE LENGTH IN CX, AND THE NETWORK REDIRECTION LIST INDEX FOR THE PRINTER IN BX. | ||
| 498 | ;************************************************************************************************** | ||
| 499 | ; | ||
| 500 | CMP CTRL_ST_LEN,0 ;IF there is something to send to a printer THEN | ||
| 501 | JUMP_EQUAL_TO_CHK_FOR_P | ||
| 502 | MOV AX,PRINTERSETUP ;SET UP FOR PRINTER SET UP FUNCTION CALL. | ||
| 503 | MOV SI,OFFSET CTRL_ST ;DS HAS SEG OF CONTROL ST. BUFFER, DS:SI POINTS TO BUFFER | ||
| 504 | MOV CX,CTRL_ST_LEN ;CX GETS LENGTH OF CONTROL STRING BUFFER. | ||
| 505 | MOV BX,INDEX ;BX GETS NRL INDEX OF REDIRECTED PRINTER. | ||
| 506 | INT 21H ;PERFORM PRINTER SET UP. | ||
| 507 | ; $IF C ;IF CARRY THERE IS A DESCREPENCY BETWEEN | ||
| 508 | JNC $$IF1 | ||
| 509 | DISPLAY NET_ERROR ;GET ASS LIST ENTRY AND PRINTER SET UP | ||
| 510 | ; $ELSE ;REDIRECTOR IS RESIDENT AND PRINTER SETUP | ||
| 511 | JMP SHORT $$EN1 | ||
| 512 | $$IF1: | ||
| 513 | ;CALL WAS SUCCESSFUL SO TELL USER WHAT | ||
| 514 | CMP EIGHTY_CHARS_LINE_REQ,TRUE ;HAPPENED | ||
| 515 | ; $IF E ;IF 80 chars/line requested THEN | ||
| 516 | JNE $$IF3 | ||
| 517 | DISPLAY PT80 ; WRITELN("LPT? set for 80") | ||
| 518 | ; $ELSE ;ELSE | ||
| 519 | JMP SHORT $$EN3 | ||
| 520 | $$IF3: | ||
| 521 | CMP REQ_132_CHARS_LINE,TRUE | ||
| 522 | ; $IF E ; IF 132 chars/line requested THEN | ||
| 523 | JNE $$IF5 | ||
| 524 | DISPLAY PT132 ; WRITELN("LPT? set for 132") | ||
| 525 | ; $ENDIF ; ENDIF | ||
| 526 | $$IF5: | ||
| 527 | ; $ENDIF ;ENDIF | ||
| 528 | $$EN3: | ||
| 529 | CMP PTLINES_REQ,TRUE ;IF lines/inch requested THEN | ||
| 530 | ; $IF E | ||
| 531 | JNE $$IF8 | ||
| 532 | DISPLAY PTLINES ; WRITELN("Printer lines per inch set") | ||
| 533 | ; $ENDIF ;ENDIF | ||
| 534 | $$IF8: | ||
| 535 | ; $ENDIF ;ENDIF | ||
| 536 | $$EN1: | ||
| 537 | JMP CHK_FOR_P | ||
| 538 | ;****************************************************************************************** | ||
| 539 | ; SEND THE CONTROL STRING TO THE LOCAL PRINTER | ||
| 540 | |||
| 541 | ; EACH CHARACTER OF THE CONTROL STRING IS TAKEN OUT OF THE BUFFER "CTRL_ST" AND SENT TO THE | ||
| 542 | ; PRINTER STARTING WITH THE FIRST CHARACTER. ON ENTRY DI HAS THE NUMBER OF CHARACTERS IN | ||
| 543 | ; THE CONTROL STRING. SI IS USED TO INDEX INTO THE CONTROL STRING. | ||
| 544 | ;****************************************************************************************** | ||
| 545 | ; | ||
| 546 | NOT_RED: | ||
| 547 | CMP IS_LOCAL,TRUE ;IF the device is local THEN | ||
| 548 | JE ELSE02 | ||
| 549 | JMP SHORT ELSE01 ;or on the network | ||
| 550 | ELSE02: | ||
| 551 | CMP CTRL_ST_LEN,0 ;IF there is something to send to a printer THEN | ||
| 552 | JE CHK_FOR_P | ||
| 553 | MOV SI,0 ;INITIALIZE CHARACTER POSITION INDEX FOR CONTROL STRING | ||
| 554 | FOR: ;FOR each_char_in_control_string DO. FOR DI=no_chars DOWN TO 0 DO | ||
| 555 | DEC CTRL_ST_LEN ;DECREMENT LOOP COUNTER | ||
| 556 | MOV AH,NULL ;CLEAR ERROR CODE FROM AH | ||
| 557 | MOV AL,BYTE PTR CTRL_ST[SI] ;MOVE NEXT CONTROL CHAR TO AL | ||
| 558 | CALL OUTCHR ;SEND THE CHARACTER TO THE PRINTER, HANDLING ERRORS | ||
| 559 | INC SI ;GET TO NEXT CHAR POSITION IN CONTROL STRING | ||
| 560 | CMP CTRL_ST_LEN,0 ;CHECK IF ALL CHARACTERS HAVE BEEN SENT | ||
| 561 | JNE FOR ;LOOP UNTIL ALL CONTROL CHARACTERS HAVE BEEN SENT | ||
| 562 | ; | ||
| 563 | IF_NO_PRINTER_ERROR_THEN | ||
| 564 | CMP EIGHTY_CHARS_LINE_REQ,TRUE ;IF 80 chars/line requested THEN | ||
| 565 | JNE WAS_132_CHARS_LINE_REQ | ||
| 566 | DISPLAY PT80 ; WRITELN("LPT? set for 80") | ||
| 567 | JMP SHORT WAS_LINES_INCH_SPEC | ||
| 568 | WAS_132_CHARS_LINE_REQ: ;ELSE | ||
| 569 | CMP REQ_132_CHARS_LINE,TRUE ; IF 132 chars/line requested THEN | ||
| 570 | JNE WAS_LINES_INCH_SPEC | ||
| 571 | DISPLAY PT132 ; WRITELN("LPT? set for 132") ENDIF | ||
| 572 | WAS_LINES_INCH_SPEC: ;ENDIF | ||
| 573 | CMP PTLINES_REQ,TRUE ;IF lines/inch requested THEN | ||
| 574 | JNE LINES_NOT_REQ | ||
| 575 | DISPLAY PTLINES ; WRITELN("Printer lines per inch set") | ||
| 576 | LINES_NOT_REQ: ;ENDIF | ||
| 577 | ; | ||
| 578 | ;**************************************************************** | ||
| 579 | ; CALL PROCEDURE TO SET THE RETRY FLAG | ||
| 580 | ;**************************************************************** | ||
| 581 | ; | ||
| 582 | CHK_FOR_P: | ||
| 583 | |||
| 584 | public CHK_FOR_P | ||
| 585 | |||
| 586 | CALL set_retry_type | ||
| 587 | CALL modify_resident_code | ||
| 588 | |||
| 589 | |||
| 590 | JMP SHORT ENDIF01 | ||
| 591 | ELSE01: | ||
| 592 | |||
| 593 | PUBLIC ELSE01 | ||
| 594 | |||
| 595 | MOV DI,0 ;the device name is always the first parm ;AN000; | ||
| 596 | MOV BP,OFFSET parm_lst ;address the parm list via parm_list which is [BP] ;AN000; | ||
| 597 | MOV BX,parm_list[DI].value1 ;AN000; | ||
| 598 | MOV illegal_device_ptr,BX | ||
| 599 | MOV BYTE PTR [BX][4],0 ;AN000;chop off the string at 4, so "LPT1132" will be displayed as "LPT1" | ||
| 600 | DISPLAY err1 ;AN000;"Illegal device name - LPTX" | ||
| 601 | MOV noerror,false ;AN000; | ||
| 602 | ; ENDIF COLON IS MISSING | ||
| 603 | ENDIF01: | ||
| 604 | ; $ENDIF ;there was a chance that the parameters were valid | ||
| 605 | ; $ENDIF ;there were enough paramters specified | ||
| 606 | |||
| 607 | RET ;RETURN TO MODE MAIN ROUTINE | ||
| 608 | |||
| 609 | MODEPRIN ENDP | ||
| 610 | |||
| 611 | ;****************************************************************************** | ||
| 612 | |||
| 613 | modify_resident_code PROC NEAR ;AN000; | ||
| 614 | |||
| 615 | |||
| 616 | CALL LOADED_YET ;on return ES:DI points to res copy of "modeto" if loaded | ||
| 617 | ; : :IF RESIDENT CODE IS ALREADY LOADED | ||
| 618 | .IF Z THEN NEAR | ||
| 619 | ; MODIFY LOADED CODE TO REFLECT WHO GETS RETRIED NOW | ||
| 620 | MOV BX,OFFSET lpt1_retry_type ;BX=> first of 3 retry mask bytes ;AC000; | ||
| 621 | XOR SI,SI ;clear code modification index ;AN000; | ||
| 622 | .FOR DI = 0 TO 2 ;FOR LPT1 TO LPT3 check the retry mask byte ;AN000; | ||
| 623 | .IF <<BYTE PTR ES:[BX][DI]> NE no_retry_flag> THEN ;IF at least one type of retry on THEN ;AN000; | ||
| 624 | OR SI,8 ;OR in 00001000 which shifts into proper position ;AN000; | ||
| 625 | .ENDIF ;AN000; | ||
| 626 | SHR SI,1 ;AN000; | ||
| 627 | .NEXT DI ;DI=1 or 2, SI=0,1 ,2 ,3 ,4 ,5 ,6 or 7 ;AN000; | ||
| 628 | SHL SI,1 ;SI=0, 2, 4, ... , 14, INDEX TO SHOW WHICH LPTns to be retried ;AC000; | ||
| 629 | MOV BX,OFFRETRY ;OFFSET TO TEST INSTR IN RETRY CODE | ||
| 630 | CLI ;DISABLE INTERRUPTS | ||
| 631 | MOV BYTE PTR ES:[BX]+4,5 ;SET JMP TARGET TO +5 | ||
| 632 | JMP CASE[SI] ;CALL BRANCH TABLE | ||
| 633 | ; | ||
| 634 | CASE DW P0 | ||
| 635 | DW P1 | ||
| 636 | DW P2 | ||
| 637 | DW P3 | ||
| 638 | DW P4 | ||
| 639 | DW P5 | ||
| 640 | DW P6 | ||
| 641 | DW P7 | ||
| 642 | ; | ||
| 643 | P0: | ||
| 644 | ; SINCE NO PRINTER IS TO BE RETRIED | ||
| 645 | MOV WORD PTR ES:[BX]+3,00EBH ;MAKE JUMP INTO NOP | ||
| 646 | ; TO CAUSE FALL THRU TO JMP PRINTER_IO INSTR | ||
| 647 | JMP SHORT ENDC | ||
| 648 | ; | ||
| 649 | P1: | ||
| 650 | ; RETRY LPT1 ONLY | ||
| 651 | MOV WORD PTR ES:[BX]+2,7403H ;TEST 3 : JZ RT | ||
| 652 | JMP SHORT ENDC | ||
| 653 | ; | ||
| 654 | P2: | ||
| 655 | ; RETRY LPT2 ONLY | ||
| 656 | MOV WORD PTR ES:[BX]+2,7501H ;TEST 1 : JNZ RT | ||
| 657 | JMP SHORT ENDC | ||
| 658 | ; | ||
| 659 | P3: | ||
| 660 | ; RETRY LPT1 AND LPT2 ONLY | ||
| 661 | MOV WORD PTR ES:[BX]+2,7402H ;TEST 2 : JZ RT | ||
| 662 | JMP SHORT ENDC | ||
| 663 | ; | ||
| 664 | P4: | ||
| 665 | ; REDIRECT LPT3 ONLY | ||
| 666 | MOV WORD PTR ES:[BX]+2,7502H ;TEST 2 : JNZ RT | ||
| 667 | JMP SHORT ENDC | ||
| 668 | ; | ||
| 669 | P5: | ||
| 670 | ; REDIRECT LPT1 AND LPT3 ONLY | ||
| 671 | MOV WORD PTR ES:[BX]+2,7401H ;TEST 1 : JZ RT | ||
| 672 | JMP SHORT ENDC | ||
| 673 | ; | ||
| 674 | P6: | ||
| 675 | ; REDIRECT LPT2 AND LPT3 ONLY | ||
| 676 | MOV WORD PTR ES:[BX]+2,7503H ;TEST 3 : JNZ RT | ||
| 677 | JMP SHORT ENDC | ||
| 678 | ; | ||
| 679 | P7: | ||
| 680 | ; REDIRECT ALL THREE: LPT1, LPT2, AND LPT3 | ||
| 681 | MOV WORD PTR ES:[BX]+2,0EB00H ;TEST 0 : JMP SHORT RT | ||
| 682 | ; | ||
| 683 | ENDC: | ||
| 684 | STI ;REENABLE INTERRUPTS | ||
| 685 | ; : : : ENDIF RESIDENT CODE IS ALREADY LOADED | ||
| 686 | .ENDIF | ||
| 687 | |||
| 688 | RET ;AN000; | ||
| 689 | |||
| 690 | modify_resident_code ENDP ;AN000; | ||
| 691 | |||
| 692 | |||
| 693 | ;********************************************************** | ||
| 694 | ;FIRST_INSTR EQU 0C2F6H ;THE FIRST INSTRUCTION OF THE LOADED CODE | ||
| 695 | ; SEE THE RESIDENT CODE MODULE FOR ENTRY SYMBOL MODETO | ||
| 696 | ; THE FIRST INSTRUCTION THERE IS: | ||
| 697 | ; TEST DL,1 | ||
| 698 | ; WHICH ASSEMBLES AS: | ||
| 699 | ; F6 C2 01 | ||
| 700 | |||
| 701 | |||
| 702 | LOADED_YET PROC NEAR | ||
| 703 | |||
| 704 | |||
| 705 | ; ON EXIT, THE ZERO FLAG REFLECTS THE LOADED STATE | ||
| 706 | ; ES:DI=ADDR OF MODETO, OR ZERO | ||
| 707 | ; Z=ON, LOADED | ||
| 708 | ; Z=OFF,NOT LOADED YET | ||
| 709 | ; | ||
| 710 | PUSH AX ;SAVE REG | ||
| 711 | ; | ||
| 712 | SUB AX,AX ;ZERO A REG | ||
| 713 | MOV ES,AX ;SET SEGREG TO VECTORS AT 0 | ||
| 714 | LES DI,ES:RESSEG ;GET ADDR OF RESIDENT CODE, IF THERE, ES:DI points to 'modeto' or is 0 | ||
| 715 | CMP DI,0 ;see if something at 50:30 | ||
| 716 | ; $IF NE ;IF code loaded THEN | ||
| 717 | JE $$IF11 | ||
| 718 | CMP AX,AX ;SET THE ZERO FLAG TO RELFECT IT IS LOADED | ||
| 719 | ; $ELSE | ||
| 720 | JMP SHORT $$EN11 | ||
| 721 | $$IF11: | ||
| 722 | CMP AX,0FFH ;RESET THE ZERO FLAG TO REFLECT IT IS NOT LOADED | ||
| 723 | ; $ENDIF | ||
| 724 | $$EN11: | ||
| 725 | ; | ||
| 726 | POP AX ;RESTORE CALLER'S REGS | ||
| 727 | RET | ||
| 728 | LOADED_YET ENDP | ||
| 729 | |||
| 730 | |||
| 731 | ;******************************************************************* | ||
| 732 | OUTCHR PROC NEAR | ||
| 733 | PRINT ;OUTPUT CHARACTER TO PRINTER | ||
| 734 | AND AH,0A9H ;MASK OFF ERROR BITS | ||
| 735 | ; IF WE GOT AN ERROR RETURN CODE | ||
| 736 | CMP AH,NULL | ||
| 737 | JE ENDIF02 | ||
| 738 | ; | ||
| 739 | CMP PRINTER_ERROR,TRUE | ||
| 740 | JE ALREADY_YELLED | ||
| 741 | DISPLAY ERR2 ;DISPLAY ERROR MESSAGE | ||
| 742 | MOV PRINTER_ERROR,TRUE | ||
| 743 | ALREADY_YELLED: | ||
| 744 | ; ENDIF ,END GOT AN ERROR RETURN CODE? TEST | ||
| 745 | ENDIF02: | ||
| 746 | RET ;RETURN TO MAIN PROC | ||
| 747 | OUTCHR ENDP | ||
| 748 | ; | ||
| 749 | ; | ||
| 750 | ; | ||
| 751 | ;------------------------------------------------------------------------------- | ||
| 752 | ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ | ||
| 753 | ;³ ³ | ||
| 754 | ;³ SET_RETRY_FLAG ³ | ||
| 755 | ;³ -------------- ³ | ||
| 756 | ;³ ³ | ||
| 757 | ;³ Set the resident retry flag to type of retry active for lptX. ³ | ||
| 758 | ;³ ³ | ||
| 759 | ;³ INPUT: device - holds '1', '2', or '3' (ascii) for x of lptx. ³ | ||
| 760 | ;³ retry_index - holds index value for the parsed retry parameter. ³ | ||
| 761 | ;³ redirected - holds true/false value for redirected status of lptx. ³ | ||
| 762 | ;³ parm_list_holder - holds offset of parameter list. ³ | ||
| 763 | ;³ resseg - holds offset of resident code in memory ³ | ||
| 764 | ;³ res_lpt_retry_type - holds offset of lpt retry flag in resident ³ | ||
| 765 | ;³ code. ³ | ||
| 766 | ;³ ³ | ||
| 767 | ;³ ³ | ||
| 768 | ;³ RETURN: pparm - set to 'P', 'B', 'R', 'E', or '-' for type of retry active.³ | ||
| 769 | ;³ flag in resident code set ³ | ||
| 770 | ;³ ³ | ||
| 771 | ;³ ³ | ||
| 772 | ;³ MESSAGES: Infinite retry not supported on network printer. ³ | ||
| 773 | ;³ ³ | ||
| 774 | ;³ ³ | ||
| 775 | ;³ REGISTER ³ | ||
| 776 | ;³ USAGE: AL - new setting for resident flag. (see RESCODE.SAL for ³ | ||
| 777 | ;³ format) ³ | ||
| 778 | ;³ CL - shift bit count ³ | ||
| 779 | ;³ ES - holds segment of resident code ³ | ||
| 780 | ;³ BP - offset of parameter list ³ | ||
| 781 | ;³ DI - offset of retry index within parameter list ³ | ||
| 782 | ;³ DL - current resident flag setting ³ | ||
| 783 | ;³ ³ | ||
| 784 | ;³ ³ | ||
| 785 | ;³ PSUEDO CODE: ³ | ||
| 786 | ;³ ³ | ||
| 787 | ;³ SAVE REGISTERS ³ | ||
| 788 | ;³ SET UP SEGMENT REGISTER AND BIT MASKS ³ | ||
| 789 | ;³ IF <RETRY REQUESTED> ³ | ||
| 790 | ;³ IF <PRINTER IS REDIRECTED> ³ | ||
| 791 | ;³ PRINT ERROR MESSAGE - not supported on network printer. ³ | ||
| 792 | ;³ ELSE ³ | ||
| 793 | ;³ SET UP PARAMETER LIST STRUCTURE ³ | ||
| 794 | ;³ SET BIT MASK FOR TYPE OF RETRY AND SET pparm TO PROPER LETTER ³ | ||
| 795 | ;³ IF <RESIDENT CODE IS NOT LOADED> ³ | ||
| 796 | ;³ LOAD RESIDENT CODE ³ | ||
| 797 | ;³ ENDIF ³ | ||
| 798 | ;³ GET CURRENT res_lpt_retry_type ³ | ||
| 799 | ;³ SET AND STORE NEW res_lpt_retry_type ³ | ||
| 800 | ;³ ENDIF ³ | ||
| 801 | ;³ ELSEIF <RESIDENT CODE ALREADY LOADED> ³ | ||
| 802 | ;³ GET CURRENT res_lpt_retry_type ³ | ||
| 803 | ;³ IF <POSITIONAL PARAMETER SPECIFIED> ³ | ||
| 804 | ;³ SET FLAG TO ZERO, SET pparm TO PROPER LETTER ³ | ||
| 805 | ;³ ELSE ³ | ||
| 806 | ;³ SET pparm TO PROPER LETTER FOR CURRENT SETTING ³ | ||
| 807 | ;³ ENDIF ³ | ||
| 808 | ;³ ELSE ³ | ||
| 809 | ;³ SET pparm TO '-' ³ | ||
| 810 | ;³ ENDIF ³ | ||
| 811 | ;³ RESTORE REGISTERS ³ | ||
| 812 | ;³ RETURN ³ | ||
| 813 | ;³ ³ | ||
| 814 | ;³ ³ | ||
| 815 | ;³ ³ | ||
| 816 | ;³ SIDE EFFECT: Loads resident code if it is needed and has not been loaded. ³ | ||
| 817 | ;³ ³ | ||
| 818 | ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ | ||
| 819 | ; | ||
| 820 | ;set_retry_flag PROC NEAR ;AN663; | ||
| 821 | ; ;AN663; | ||
| 822 | ; PUSH ES ;save registers ;AN663; | ||
| 823 | ; PUSH DI ;AN663; | ||
| 824 | ; PUSH AX ;AN663; | ||
| 825 | ; PUSH DX ;AN663; | ||
| 826 | ; ;AN663; | ||
| 827 | ; XOR AX,AX ;clear a reg ;AN663; | ||
| 828 | ; MOV ES,AX ;set to segment at 0 ;AN663; | ||
| 829 | ; MOV CL,device ;AN663; | ||
| 830 | ; AND CL,07H ;AN663; | ||
| 831 | ; DEC CL ;AN663; | ||
| 832 | ; SHL CL,1 ;AN663; | ||
| 833 | ; MOV DH,11111100B ;set bit mask to get rid of old setting ;AN663; | ||
| 834 | ; ROL DH,CL ;rotate bits into position ;AN663; | ||
| 835 | ; ;AN663; | ||
| 836 | ; .IF <retry_index NE 0> THEN ;AN663; | ||
| 837 | ; ;AN663; | ||
| 838 | ; .IF <redirected EQ true> THEN ;AN663; | ||
| 839 | ; ;AN663; | ||
| 840 | ; display not_supported ;infinite retry not supported on network printer ;AN663; | ||
| 841 | ; ;AN663; | ||
| 842 | ; .ELSE NEAR ;not a network printer ;AN663; | ||
| 843 | ; ;AN663; | ||
| 844 | ; MOV DI,retry_index ;AN663; | ||
| 845 | ; MOV BP,parm_list_holder ;set up addressability to the list of parsed parms,set "parm_list" ;AN663; | ||
| 846 | ; | ||
| 847 | ; .SELECT ;AN663; | ||
| 848 | ; | ||
| 849 | ; .WHEN <parm_list[DI].item_tag EQ P_item_tag> OR ;AN663; | ||
| 850 | ; .WHEN <parm_list[DI].item_tag EQ E_item_tag> ;AN663; | ||
| 851 | ; MOV AL,error_retry_active ;AN663; | ||
| 852 | ; | ||
| 853 | ; .WHEN <parm_list[DI].item_tag EQ B_item_tag> ;AN663; | ||
| 854 | ; MOV AL,busy_retry_active ;AN663; | ||
| 855 | ; | ||
| 856 | ; .WHEN <parm_list[DI].item_tag EQ R_item_tag> ;AN663; | ||
| 857 | ; MOV AL,ready_retry_active ;AN663; | ||
| 858 | ; | ||
| 859 | ; .WHEN <parm_list[DI].item_tag EQ NONE_item_tag> ;AN663; | ||
| 860 | ; MOV AL,no_retry_active ;AN663; | ||
| 861 | ; | ||
| 862 | ; .ENDSELECT | ||
| 863 | ; | ||
| 864 | ; .IF <AL EQ no_retry_active> THEN | ||
| 865 | ; MOV INF_OR_NO_PTR,OFFSET NORETRY ;modify message to indicate no retry | ||
| 866 | ; .ELSE ;AN663; | ||
| 867 | ; MOV INF_OR_NO_PTR,OFFSET INFINITE ;modify message to indicate retry ;AN663; | ||
| 868 | ; .ENDIF ;AN663; | ||
| 869 | ; ;AN663; | ||
| 870 | ; .IF <<WORD PTR ES:resseg> EQ 0000H> THEN ;AN663; | ||
| 871 | ; CALL modeload ;load resident code ;AN663; | ||
| 872 | ; .ENDIF ;AN663; | ||
| 873 | ; ;AN663; | ||
| 874 | ; MOV ES,ES:WORD PTR resseg[2] ;AN663; | ||
| 875 | ; MOV DL,BYTE PTR ES:res_lpt_retry_type ;get old setting ;AN663; | ||
| 876 | ; ;AN663; | ||
| 877 | ; ROL AL,CL ;AN663; | ||
| 878 | ; AND DL,DH ;AN663; | ||
| 879 | ; OR DL,AL ;AN663; | ||
| 880 | ; MOV BYTE PTR ES:res_lpt_retry_type,DL ;store new setting ;AN663; | ||
| 881 | ; ;AN663; | ||
| 882 | ; .ENDIF ;AN663; | ||
| 883 | ; ;AN663; | ||
| 884 | ; .ELSEIF <<WORD PTR ES:resseg> NE 0000H> THEN ;if code is loaded but no ;AN663; | ||
| 885 | ; ; retry is specified then ;AN663; | ||
| 886 | ; MOV ES,ES:WORD PTR resseg[2] ;AN663; | ||
| 887 | ; MOV DL,BYTE PTR ES:res_lpt_retry_type ;AN663; | ||
| 888 | ; ;AN663; | ||
| 889 | ; .IF <parms_form NE keyword> ;no retry specified with ;AN663; | ||
| 890 | ; ;positional parameters ;AN663; | ||
| 891 | ; AND DL,DH ; set bits to zero ;AN663; | ||
| 892 | ; MOV BYTE PTR ES:res_lpt_retry_type,DL ;AN663; | ||
| 893 | ; MOV INF_OR_NO_PTR,OFFSET NORETRY ;modify message to indicate no retry ;AN663; | ||
| 894 | ; ;AN663; | ||
| 895 | ; .ELSE ;else, no retry specified with keywords | ||
| 896 | ; ; update pparm with current retry type ;AN663; | ||
| 897 | ; NOT DH ;AN663; | ||
| 898 | ; AND DL,DH ;AN663; | ||
| 899 | ; SHR DL,CL ;AN663; | ||
| 900 | ; ;AN663; | ||
| 901 | ; .IF <DL EQ no_retry_active> THEN ;AN663; | ||
| 902 | ; MOV INF_OR_NO_PTR,OFFSET NORETRY ;modify message to indicate no retry ;AN663; | ||
| 903 | ; .ELSE ;AN663; | ||
| 904 | ; MOV INF_OR_NO_PTR,OFFSET INFINITE ;modify message to indicate retry ;AN663; | ||
| 905 | ; .ENDIF ;AN663; | ||
| 906 | ; ;AN663; | ||
| 907 | ; .ENDIF ;AN663; | ||
| 908 | ; ;AN663; | ||
| 909 | ; .ELSE ;no retry, no code resident ;AN663; | ||
| 910 | ; ;AN663; | ||
| 911 | ; MOV INF_OR_NO_PTR,OFFSET NORETRY ;modify message to indicate no retry ;AN663; | ||
| 912 | ; ;AN663; | ||
| 913 | ; .ENDIF ;AN663; | ||
| 914 | ; ;'Infinite retry on parallel printer timeout' OR ;AN663; | ||
| 915 | ; DISPLAY RETPARTO ;'No retry on parallel printer timeout' ;AN663; | ||
| 916 | ; ;AN663; | ||
| 917 | ; POP DX ;restore registers ;AN663; | ||
| 918 | ; POP AX ;AN663; | ||
| 919 | ; POP DI ;AN663; | ||
| 920 | ; POP ES ;AN663; | ||
| 921 | ; RET ;AN663; | ||
| 922 | ; ;AN663; | ||
| 923 | ;set_retry_flag ENDP ;AN663; | ||
| 924 | ;------------------------------------------------------------------------------- | ||
| 925 | ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ | ||
| 926 | ;³ ³ | ||
| 927 | ;³ SET_retry_type ³ | ||
| 928 | ;³ -------------- ³ | ||
| 929 | ;³ ³ | ||
| 930 | ;³ Set the resident retry mask to for all LPTs | ||
| 931 | ;³ ³ | ||
| 932 | ;³ INPUT: device - holds '1', '2', or '3' (ascii) for x of lptx. ³ | ||
| 933 | ;³ retry_index - holds index value for the parsed retry parameter. ³ | ||
| 934 | ;³ redirected - holds true/false value for redirected status of lptx. ³ | ||
| 935 | ;³ parm_list_holder - holds offset of parameter list. ³ | ||
| 936 | ;³ resseg - holds offset of resident code in memory ³ | ||
| 937 | ;³ ³ | ||
| 938 | ;³ ³ | ||
| 939 | ;³ RETURN: | ||
| 940 | ;³ | ||
| 941 | ;³ ³ | ||
| 942 | ;³ ³ | ||
| 943 | ;³ MESSAGES: none | ||
| 944 | ;³ ³ | ||
| 945 | ;³ ³ | ||
| 946 | ;³ REGISTER ³ | ||
| 947 | ;³ USAGE: AL - | ||
| 948 | ;³ | ||
| 949 | ;³ CL - | ||
| 950 | ;³ ES - | ||
| 951 | ;³ BP - | ||
| 952 | ;³ DI - | ||
| 953 | ;³ DL - | ||
| 954 | ;³ ³ | ||
| 955 | ;³ ³ | ||
| 956 | ;³ PSUEDO CODE: ³ | ||
| 957 | ;³ | ||
| 958 | ;³ ³ | ||
| 959 | ;³ SAVE REGISTERS ³ | ||
| 960 | ;³ SET UP SEGMENT REGISTER | ||
| 961 | ;³ IF <RETRY REQUESTED> ³ | ||
| 962 | ;³ IF <PRINTER IS REDIRECTED> ³ | ||
| 963 | ;³ PRINT ERROR MESSAGE - not supported on network printer. ³ | ||
| 964 | ;³ ELSE ³ | ||
| 965 | ;³ SET UP PARAMETER LIST STRUCTURE ³ | ||
| 966 | ;³ SET BIT MASK FOR TYPE OF RETRY AND SET pparm TO PROPER LETTER ³ | ||
| 967 | ;³ LOAD RESIDENT CODE IF NEEDED ³ | ||
| 968 | ;³ SET AND STORE NEW lpt retry mask | ||
| 969 | ;³ ENDIF ³ | ||
| 970 | ;³ ELSEIF <RESIDENT CODE ALREADY LOADED> ³ | ||
| 971 | ;³ IF <POSITIONAL PARAMETER SPECIFIED> ³ | ||
| 972 | ;³ SET FLAG TO ZERO, SET pparm TO PROPER LETTER ³ | ||
| 973 | ;³ ELSE ³ | ||
| 974 | ;³ SET pparm TO PROPER LETTER FOR CURRENT SETTING ³ | ||
| 975 | ;³ ENDIF ³ | ||
| 976 | ;³ ELSE ³ | ||
| 977 | ;³ SET pparm TO '-' ³ | ||
| 978 | ;³ ENDIF ³ | ||
| 979 | ;³ RESTORE REGISTERS ³ | ||
| 980 | ;³ RETURN ³ | ||
| 981 | ;³ ³ | ||
| 982 | ;³ ³ | ||
| 983 | ;³ SIDE EFFECT: | ||
| 984 | ;³ ³ | ||
| 985 | ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ | ||
| 986 | ; | ||
| 987 | set_retry_type PROC NEAR ;AN663; | ||
| 988 | ;AN663; | ||
| 989 | |||
| 990 | PUSH ES ;save registers ;AN663; | ||
| 991 | PUSH DI ;AN663; | ||
| 992 | PUSH AX ;AN663; | ||
| 993 | PUSH BX | ||
| 994 | PUSH DX ;AN663; | ||
| 995 | ;AN663; | ||
| 996 | XOR BX,BX ;clear a reg ;AN663; | ||
| 997 | MOV ES,BX ;set to segment at 0 ;AN663; | ||
| 998 | MOV BL,device ;AN663; | ||
| 999 | AND BL,07H ;AN663; | ||
| 1000 | DEC BL ;BX=zero based binary printer number ;AN663; | ||
| 1001 | ;AN663; | ||
| 1002 | .IF <retry_index NE 0> THEN NEAR ;IF retry requested on this invokation THEN ;AN663; | ||
| 1003 | ;AN663; | ||
| 1004 | .IF <redirected EQ true> THEN ;AN663; | ||
| 1005 | ;AN663; | ||
| 1006 | display not_supported ;infinite retry not supported on network printer ;AN663; | ||
| 1007 | ;AN663; | ||
| 1008 | .ELSE NEAR ;not a network printer ;AN663; | ||
| 1009 | ;AN663; | ||
| 1010 | MOV DI,retry_index ;AN663; | ||
| 1011 | MOV BP,parm_list_holder ;set up addressability to the list of parsed parms,set "parm_list" ;AN663; | ||
| 1012 | |||
| 1013 | .SELECT ;AN663; | ||
| 1014 | |||
| 1015 | .WHEN <parm_list[DI].item_tag EQ E_item_tag> ;AN663; | ||
| 1016 | MOV AL,error_status ;set mask byte to horrible status ;AN663; | ||
| 1017 | |||
| 1018 | .WHEN <parm_list[DI].item_tag EQ P_item_tag> OR ;AN663; | ||
| 1019 | .WHEN <parm_list[DI].item_tag EQ B_item_tag> ;AN663; | ||
| 1020 | MOV AL,busy_status ;set mask byte to actual status ;AN663; | ||
| 1021 | |||
| 1022 | .WHEN <parm_list[DI].item_tag EQ R_item_tag> ;AN663; | ||
| 1023 | MOV AL,ready_status ;set mask byte to rosy status ;AN663; | ||
| 1024 | |||
| 1025 | .WHEN <parm_list[DI].item_tag EQ NONE_item_tag> ;AN663;;AN000; | ||
| 1026 | MOV AL,no_retry_flag ;when there is no retry the mask will not be used, so this is just a flag | ||
| 1027 | |||
| 1028 | .ENDSELECT | ||
| 1029 | |||
| 1030 | PUSH AX ;save the retry setting ;AN001; | ||
| 1031 | .IF <AL EQ no_retry_flag> THEN | ||
| 1032 | ;AC001; MOV INF_OR_NO_PTR,OFFSET NORETRY ;modify message to indicate no retry | ||
| 1033 | set_submessage_ptr noretry,retparto ;modify message to indicate no retry ;AC001; | ||
| 1034 | .ELSE ;AN663; | ||
| 1035 | ;AC001; MOV INF_OR_NO_PTR,OFFSET INFINITE ;modify message to indicate retry ;AN663; | ||
| 1036 | set_submessage_ptr infinite,retparto ;modify message to indicate retry ;AC001; | ||
| 1037 | .ENDIF ;AN663; | ||
| 1038 | POP AX ;restore the retry setting ;AN001; | ||
| 1039 | |||
| 1040 | .IF <<WORD PTR ES:resseg> EQ 0000H> THEN ;IF code not resident THEN ;AN663; | ||
| 1041 | .IF <AL NE no_retry_flag> THEN ;need to turn on retry | ||
| 1042 | CALL modeload ;load resident code ;AN663; | ||
| 1043 | MOV ES,ES:WORD PTR resseg[2] ;AN663; | ||
| 1044 | MOV BYTE PTR ES:lpt1_retry_type[BX],AL ;store new setting ;AN663; | ||
| 1045 | .ENDIF | ||
| 1046 | .ELSE ;ELSE code is already resident | ||
| 1047 | MOV ES,ES:WORD PTR resseg[2] ;AN663; | ||
| 1048 | MOV BYTE PTR ES:lpt1_retry_type[BX],AL ;store new setting ;AN663; | ||
| 1049 | .ENDIF ;AN663; | ||
| 1050 | ;AN663; | ||
| 1051 | .ENDIF ;AN663; | ||
| 1052 | ;AN663; | ||
| 1053 | .ELSEIF <<WORD PTR ES:resseg> NE 0000H> THEN ;if code is loaded but no ;AN663; | ||
| 1054 | ; retry is specified then ;AN663; | ||
| 1055 | MOV ES,ES:WORD PTR resseg[2] ;ES=segment of the resident code ;AN663; | ||
| 1056 | ;AN663; | ||
| 1057 | .IF <parms_form NE keyword> ;no retry specified with ;AN663; | ||
| 1058 | ;positional parameters, so turn off retry ;AN663; | ||
| 1059 | MOV BYTE PTR ES:lpt1_retry_type[BX],no_retry_flag ;set flag for get retry routine;AN663; | ||
| 1060 | ;AC001; MOV INF_OR_NO_PTR,OFFSET NORETRY ;modify message to indicate no retry ;AN663; | ||
| 1061 | set_submessage_ptr noretry,retparto ;modify message to indicate no retry ;AC001; | ||
| 1062 | ;AN663; | ||
| 1063 | .ELSE ;else, no retry specified with keywords | ||
| 1064 | ; update pparm with current retry type ;AN663; | ||
| 1065 | .IF <<BYTE PTR ES:lpt1_retry_type[BX]> EQ no_retry_flag> THEN ;AN663; | ||
| 1066 | ;AC001; MOV INF_OR_NO_PTR,OFFSET NORETRY ;modify message to indicate no retry ;AN663; | ||
| 1067 | set_submessage_ptr noretry,retparto ;modify message to indicate no retry ;AC001; | ||
| 1068 | .ELSE ;AN663; | ||
| 1069 | ;AC001; MOV INF_OR_NO_PTR,OFFSET INFINITE ;modify message to indicate retry ;AN663; | ||
| 1070 | set_submessage_ptr infinite,retparto ;modify message to indicate retry ;AC001; | ||
| 1071 | .ENDIF ;AN663; | ||
| 1072 | ;AN663; | ||
| 1073 | .ENDIF ;AN663; | ||
| 1074 | ;AN663; | ||
| 1075 | .ELSE ;no retry, no code resident ;AN663; | ||
| 1076 | ;AN663; | ||
| 1077 | ;AC001; MOV INF_OR_NO_PTR,OFFSET NORETRY ;modify message to indicate no retry ;AN663; | ||
| 1078 | set_submessage_ptr noretry,retparto ;modify message to indicate no retry ;AC001; | ||
| 1079 | ;AN663; | ||
| 1080 | .ENDIF ;AN663; | ||
| 1081 | ;'Infinite retry on parallel printer timeout' OR ;AN663; | ||
| 1082 | DISPLAY RETPARTO ;'No retry on parallel printer timeout' ;AN663; | ||
| 1083 | ;AN663; | ||
| 1084 | POP DX ;restore registers ;AN663; | ||
| 1085 | POP BX | ||
| 1086 | POP AX ;AN663; | ||
| 1087 | POP DI ;AN663; | ||
| 1088 | POP ES ;AN663; | ||
| 1089 | ;AN663; | ||
| 1090 | RET ;AN663; | ||
| 1091 | ;AN663; | ||
| 1092 | set_retry_type ENDP ;AN663; | ||
| 1093 | |||
| 1094 | PRINTF_CODE ENDS | ||
| 1095 | END | ||
| 1096 | \ No newline at end of file | ||