diff options
| author | 2024-04-25 21:24:10 +0100 | |
|---|---|---|
| committer | 2024-04-25 22:32:27 +0000 | |
| commit | 2d04cacc5322951f187bb17e017c12920ac8ebe2 (patch) | |
| tree | 80ee017efa878dfd5344b44249e6a241f2a7f6e2 /v4.0/src/DEV/PRINTER/CPSPM10.ASM | |
| parent | Merge pull request #430 from jpbaltazar/typoptbr (diff) | |
| download | ms-dos-main.tar.gz ms-dos-main.tar.xz ms-dos-main.zip | |
Diffstat (limited to 'v4.0/src/DEV/PRINTER/CPSPM10.ASM')
| -rw-r--r-- | v4.0/src/DEV/PRINTER/CPSPM10.ASM | 3851 |
1 files changed, 3851 insertions, 0 deletions
diff --git a/v4.0/src/DEV/PRINTER/CPSPM10.ASM b/v4.0/src/DEV/PRINTER/CPSPM10.ASM new file mode 100644 index 0000000..ea62b25 --- /dev/null +++ b/v4.0/src/DEV/PRINTER/CPSPM10.ASM | |||
| @@ -0,0 +1,3851 @@ | |||
| 1 | PAGE ,132 | ||
| 2 | TITLE DOS - Code Page Switching - Printer Device Driver | ||
| 3 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 4 | ;; | ||
| 5 | ;; FILENAME: CPS Printer Device Driver Main Code | ||
| 6 | ;; MODULE NAME: | ||
| 7 | ;; TYPE: Assemble file (resident code) | ||
| 8 | ;; LINK PROCEDURE: Link CPSPMnn+CPSFONT+CPSPInn into .EXE format. CPSPM01 | ||
| 9 | ;; must be first. CPSPInn must be last. Everything | ||
| 10 | ;; before CPSPInn will be resident. | ||
| 11 | ;; INCLUDE FILES: | ||
| 12 | ;; CPSPEQU.INC | ||
| 13 | ;; | ||
| 14 | ;; | ||
| 15 | ;; This routine is structured as a DOS Device Driver. | ||
| 16 | ;; IE it is installed via the CONFIG.SYS command: | ||
| 17 | ;; | ||
| 18 | ;; The following device commands are supported: | ||
| 19 | ;; | ||
| 20 | ;; 0 - INIT | ||
| 21 | ;; -------- | ||
| 22 | ;; | ||
| 23 | ;; 8 - OUTPUT | ||
| 24 | ;; 9 - OUTPUT | ||
| 25 | ;; -------- | ||
| 26 | ;; Supported in between Designate-start and the Designate_end commands. | ||
| 27 | ;; | ||
| 28 | ;; | ||
| 29 | ;; 12 - IOCTL OUTPUT | ||
| 30 | ;; ----------------- | ||
| 31 | ;; CPS Function request : Major function = 05 -- printer device | ||
| 32 | ;; Minor functions = 4CH -- designate start | ||
| 33 | ;; 4DH -- designate end | ||
| 34 | ;; 4AH -- invoke | ||
| 35 | ;; 6AH -- query-invoked | ||
| 36 | ;; 6BH -- query-list | ||
| 37 | ;; | ||
| 38 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 39 | ;*Modification history ******************************************************** | ||
| 40 | ;AN001; p2685 Long delay on CHCP before failure message 12/10/87 J.K. | ||
| 41 | ;****************************************************************************** | ||
| 42 | ;; | ||
| 43 | INCLUDE CPSPEQU.INC ;; | ||
| 44 | ;; | ||
| 45 | PUBLIC PRINTER_DESC_NUM ;; | ||
| 46 | PUBLIC PRINTER_DESC_TBL ;; | ||
| 47 | PUBLIC INIT_CHK,TABLE,DEVICE_NUM ;; WGR ;AN000; | ||
| 48 | PUBLIC INVOKE ;; WGR ;AN000; | ||
| 49 | PUBLIC BUF0,BUF1,BUF2,BUF3 ;; WGR ;AN000; | ||
| 50 | PUBLIC HARD_SL1,RAM_SL1 ;; | ||
| 51 | PUBLIC HARD_SL2,RAM_SL2 ;; | ||
| 52 | PUBLIC HARD_SL3,RAM_SL3 ;; | ||
| 53 | PUBLIC HARD_SL4,RAM_SL4 ;; | ||
| 54 | PUBLIC RESERVED1,RESERVED2 ;; | ||
| 55 | ;; | ||
| 56 | EXTRN RESIDENT_END:WORD ;; | ||
| 57 | EXTRN STACK_ALLOCATED:WORD ;; | ||
| 58 | EXTRN FONT_PARSER:NEAR,FTABLE:WORD ;; | ||
| 59 | EXTRN INIT:NEAR ;; | ||
| 60 | ;; | ||
| 61 | ;; | ||
| 62 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 63 | ;; | ||
| 64 | ;; | ||
| 65 | CSEG SEGMENT PARA PUBLIC 'CODE' ;; | ||
| 66 | ASSUME CS:CSEG ;; | ||
| 67 | ;; | ||
| 68 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 69 | ;; | ||
| 70 | ;; ************************************ | ||
| 71 | ;; ** ** | ||
| 72 | ;; ** Resident Code ** | ||
| 73 | ;; ** ** | ||
| 74 | ;; ************************************ | ||
| 75 | ;; | ||
| 76 | ;; | ||
| 77 | ;; DEVICE HEADER - must be at offset zero within device driver | ||
| 78 | ;; (DHS is defined according to this structure) | ||
| 79 | ;; | ||
| 80 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 81 | ;; | ||
| 82 | DEV_HDR0: DW OFFSET DEV_HDR1 ;; becomes pointer to next device header | ||
| 83 | DW 0 ;; must be zero for no link | ||
| 84 | DW 0e040H ;; attribute (Char device) | ||
| 85 | ;; supports IOCTL calls | ||
| 86 | DW OFFSET STRATEGY0 ;; pointer to device "strategy" routine | ||
| 87 | DW OFFSET INTERRUPT0 ;; pointer to device "interrupt handler" | ||
| 88 | DEV_NAME0: DB 'PRN ' ;; device name( length : NAME_LEN) | ||
| 89 | ;; | ||
| 90 | DEV_HDR1: DW OFFSET DEV_HDR2 ;; becomes pointer to next device header | ||
| 91 | DW 0 ;; must be zero for no link | ||
| 92 | DW 0e040H ;; attribute (Char device) | ||
| 93 | ;; supports IOCTL calls | ||
| 94 | DW OFFSET STRATEGY1 ;; pointer to device "strategy" routine | ||
| 95 | DW OFFSET INTERRUPT1 ;; pointer to device "interrupt handler" | ||
| 96 | DEV_NAME1: DB 'LPT1 ' ;; device name( length : NAME_LEN) | ||
| 97 | ;; | ||
| 98 | DEV_HDR2: DW OFFSET DEV_HDR3 ;; becomes pointer to next device header | ||
| 99 | DW 0 ;; must be zero for no link | ||
| 100 | DW 0e040H ;; attribute (Char device) | ||
| 101 | ;; supports IOCTL calls | ||
| 102 | DW OFFSET STRATEGY2 ;; pointer to device "strategy" routine | ||
| 103 | DW OFFSET INTERRUPT2 ;; pointer to device "interrupt handler" | ||
| 104 | DEV_NAME2: DB 'LPT2 ' ;; device name( length : NAME_LEN) | ||
| 105 | ;; | ||
| 106 | ;; | ||
| 107 | DEV_HDR3: DD -1 ;; becomes pointer to next device header | ||
| 108 | DW 0e040H ;; attribute (Char device) | ||
| 109 | ;; supports IOCTL calls | ||
| 110 | DW OFFSET STRATEGY3 ;; pointer to device "strategy" routine | ||
| 111 | DW OFFSET INTERRUPT3 ;; pointer to device "interrupt handler" | ||
| 112 | DEV_NAME3: DB 'LPT3 ' ;; device name( length : NAME_LEN) | ||
| 113 | ;; | ||
| 114 | ;; | ||
| 115 | ;; | ||
| 116 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 117 | ;; ***************************** | ||
| 118 | ;; ** Resident Data Areas ** | ||
| 119 | ;; ***************************** | ||
| 120 | ;; | ||
| 121 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 122 | ; | ||
| 123 | ; PRN/LPTn printer data based on BUF | ||
| 124 | ; | ||
| 125 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 126 | ;; | ||
| 127 | INIT_CHK DW 0 ;; internal flag : error loc. in INIT | ||
| 128 | ;; | ||
| 129 | BUF0: BUF_DATA <,,,,,,,,,,> ;; PRN | ||
| 130 | ;; | ||
| 131 | BUF1: BUF_DATA <,,,,,,,,,,> ;; LPT1 | ||
| 132 | ;; | ||
| 133 | BUF2: BUF_DATA <,,,,,,,,,,> ;; LPT2 | ||
| 134 | ;; | ||
| 135 | BUF3: BUF_DATA <,,,,,,,,,,> ;; LPT3 | ||
| 136 | ;; | ||
| 137 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 138 | ; | ||
| 139 | ; Hard/RAM slots table in the order of DEVICE parameters | ||
| 140 | ; | ||
| 141 | ; number of entries in all HARD_SLn is determined by the max. {HSLOTS} | ||
| 142 | ; | ||
| 143 | ; | ||
| 144 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 145 | ;; | ||
| 146 | HARD_SL1 : SLTS <,> ;; 1st hardware slots | ||
| 147 | HARD_SL1B: SLTS <,> ;; | ||
| 148 | HARD_SL1C: SLTS <,> ;; | ||
| 149 | HARD_SL1D: SLTS <,> ;; | ||
| 150 | HARD_SL1E: SLTS <,> ;; | ||
| 151 | HARD_SL1F: SLTS <,> ;; | ||
| 152 | HARD_SL1G: SLTS <,> ;; | ||
| 153 | HARD_SL1H: SLTS <,> ;; | ||
| 154 | HARD_SL1I: SLTS <,> ;; | ||
| 155 | HARD_SL1J: SLTS <,> ;; | ||
| 156 | HARD_SL1K: SLTS <,> ;; | ||
| 157 | HARD_SL1L: SLTS <,> ;; | ||
| 158 | HARD_SL1M: SLTS <,> ;; -- max. no. of code pages allowed | ||
| 159 | ;;upto hardsl_max + 1 ;; | ||
| 160 | ;; | ||
| 161 | HARD_SL2 : SLTS <,> ;; 2nd hardware slots | ||
| 162 | HARD_SL2B: SLTS <,> ;; | ||
| 163 | HARD_SL2C: SLTS <,> ;; | ||
| 164 | HARD_SL2D: SLTS <,> ;; | ||
| 165 | HARD_SL2E: SLTS <,> ;; | ||
| 166 | HARD_SL2F: SLTS <,> ;; | ||
| 167 | HARD_SL2G: SLTS <,> ;; | ||
| 168 | HARD_SL2H: SLTS <,> ;; | ||
| 169 | HARD_SL2I: SLTS <,> ;; | ||
| 170 | HARD_SL2J: SLTS <,> ;; | ||
| 171 | HARD_SL2K: SLTS <,> ;; | ||
| 172 | HARD_SL2L: SLTS <,> ;; | ||
| 173 | HARD_SL2M: SLTS <,> ;; -- max. no. of code pages allowed | ||
| 174 | ;;upto hardsl_max + 1 ;; | ||
| 175 | ;; | ||
| 176 | HARD_SL3 : SLTS <,> ;; 3rd hardware slots | ||
| 177 | HARD_SL3B: SLTS <,> ;; | ||
| 178 | HARD_SL3C: SLTS <,> ;; | ||
| 179 | HARD_SL3D: SLTS <,> ;; | ||
| 180 | HARD_SL3E: SLTS <,> ;; | ||
| 181 | HARD_SL3F: SLTS <,> ;; | ||
| 182 | HARD_SL3G: SLTS <,> ;; | ||
| 183 | HARD_SL3H: SLTS <,> ;; | ||
| 184 | HARD_SL3I: SLTS <,> ;; | ||
| 185 | HARD_SL3J: SLTS <,> ;; | ||
| 186 | HARD_SL3K: SLTS <,> ;; | ||
| 187 | HARD_SL3L: SLTS <,> ;; | ||
| 188 | HARD_SL3M: SLTS <,> ;; -- max. no. of code pages allowed | ||
| 189 | ;;upto hardsl_max + 1 ;; | ||
| 190 | ;; | ||
| 191 | HARD_SL4 : SLTS <,> ;; 4TH hardware slots | ||
| 192 | HARD_SL4B: SLTS <,> ;; | ||
| 193 | HARD_SL4C: SLTS <,> ;; | ||
| 194 | HARD_SL4D: SLTS <,> ;; | ||
| 195 | HARD_SL4E: SLTS <,> ;; | ||
| 196 | HARD_SL4F: SLTS <,> ;; | ||
| 197 | HARD_SL4G: SLTS <,> ;; | ||
| 198 | HARD_SL4H: SLTS <,> ;; | ||
| 199 | HARD_SL4I: SLTS <,> ;; | ||
| 200 | HARD_SL4J: SLTS <,> ;; | ||
| 201 | HARD_SL4K: SLTS <,> ;; | ||
| 202 | HARD_SL4L: SLTS <,> ;; | ||
| 203 | HARD_SL4M: SLTS <,> ;; -- max. no. of code pages allowed | ||
| 204 | ;;upto hardsl_max + 1 ;; | ||
| 205 | ;; | ||
| 206 | ;; | ||
| 207 | RAM_SL1 : SLTS <,> ;; 1st ram slots | ||
| 208 | RAM_SL1B: SLTS <,> ;; NOTE : must be only FOUR bytes for | ||
| 209 | RAM_SL1C: SLTS <,> ;; codepage positioning | ||
| 210 | RAM_SL1D: SLTS <,> ;; calculation as compared | ||
| 211 | RAM_SL1E: SLTS <,> ;; with each entry in FTDL_OFF | ||
| 212 | RAM_SL1F: SLTS <,> ;; | ||
| 213 | RAM_SL1G: SLTS <,> ;; | ||
| 214 | RAM_SL1H: SLTS <,> ;; | ||
| 215 | RAM_SL1I: SLTS <,> ;; | ||
| 216 | RAM_SL1J: SLTS <,> ;; | ||
| 217 | RAM_SL1K: SLTS <,> ;; | ||
| 218 | RAM_SL1L: SLTS <,> ;; -- max. no. of code pages allowed | ||
| 219 | ;;upto ramsl_max, ;; | ||
| 220 | ;; | ||
| 221 | RAM_SL2 : SLTS <,> ;; 2nd ram slots | ||
| 222 | RAM_SL2B: SLTS <,> ;; | ||
| 223 | RAM_SL2C: SLTS <,> ;; | ||
| 224 | RAM_SL2D: SLTS <,> ;; | ||
| 225 | RAM_SL2E: SLTS <,> ;; | ||
| 226 | RAM_SL2F: SLTS <,> ;; | ||
| 227 | RAM_SL2G: SLTS <,> ;; | ||
| 228 | RAM_SL2H: SLTS <,> ;; | ||
| 229 | RAM_SL2I: SLTS <,> ;; | ||
| 230 | RAM_SL2J: SLTS <,> ;; | ||
| 231 | RAM_SL2K: SLTS <,> ;; | ||
| 232 | RAM_SL2L: SLTS <,> ;; -- max. no. of code pages allowed | ||
| 233 | ;;upto ramsl_max, ;; | ||
| 234 | ;; | ||
| 235 | RAM_SL3 : SLTS <,> ;; 3rd ram slots | ||
| 236 | RAM_SL3B: SLTS <,> ;; | ||
| 237 | RAM_SL3C: SLTS <,> ;; | ||
| 238 | RAM_SL3D: SLTS <,> ;; | ||
| 239 | RAM_SL3E: SLTS <,> ;; | ||
| 240 | RAM_SL3F: SLTS <,> ;; | ||
| 241 | RAM_SL3G: SLTS <,> ;; | ||
| 242 | RAM_SL3H: SLTS <,> ;; | ||
| 243 | RAM_SL3I: SLTS <,> ;; | ||
| 244 | RAM_SL3J: SLTS <,> ;; | ||
| 245 | RAM_SL3K: SLTS <,> ;; | ||
| 246 | RAM_SL3L: SLTS <,> ;; -- max. no. of code pages allowed | ||
| 247 | ;;upto ramsl_max, ;; | ||
| 248 | ;; | ||
| 249 | RAM_SL4 : SLTS <,> ;; 4th ram slots | ||
| 250 | RAM_SL4B: SLTS <,> ;; | ||
| 251 | RAM_SL4C: SLTS <,> ;; | ||
| 252 | RAM_SL4D: SLTS <,> ;; | ||
| 253 | RAM_SL4E: SLTS <,> ;; | ||
| 254 | RAM_SL4F: SLTS <,> ;; | ||
| 255 | RAM_SL4G: SLTS <,> ;; | ||
| 256 | RAM_SL4H: SLTS <,> ;; | ||
| 257 | RAM_SL4I: SLTS <,> ;; | ||
| 258 | RAM_SL4J: SLTS <,> ;; | ||
| 259 | RAM_SL4K: SLTS <,> ;; | ||
| 260 | RAM_SL4L: SLTS <,> ;; -- max. no. of code pages allowed | ||
| 261 | ;;upto ramsl_max, ;; | ||
| 262 | ;; | ||
| 263 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 264 | ;; hard/RAM buffered slots on codepages | ||
| 265 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 266 | HBUF_SL1 LABEL WORD ;; hardware slots' buffer for LPT1/PRN | ||
| 267 | DW 0FFFFH ;; ---- only for CART-SLOTS | ||
| 268 | DW 0FFFFH ;; | ||
| 269 | DW 0FFFFH ;; | ||
| 270 | DW 0FFFFH ;; | ||
| 271 | DW 0FFFFH ;; | ||
| 272 | DW 0FFFFH ;; | ||
| 273 | DW 0FFFFH ;; | ||
| 274 | DW 0FFFFH ;; | ||
| 275 | DW 0FFFFH ;; | ||
| 276 | DW 0FFFFH ;; | ||
| 277 | DW 0FFFFH ;; | ||
| 278 | DW 0FFFFH ;; | ||
| 279 | DW 0FFFFH ;; | ||
| 280 | ;;upto hardsl_max+1, there are as many HARD_SLn | ||
| 281 | ;; | ||
| 282 | HBUF_SL2 LABEL WORD ;; hardware slots' buffer for LPT2 | ||
| 283 | DW 0FFFFH ;; ---- only for CART-SLOTS | ||
| 284 | DW 0FFFFH ;; | ||
| 285 | DW 0FFFFH ;; | ||
| 286 | DW 0FFFFH ;; | ||
| 287 | DW 0FFFFH ;; | ||
| 288 | DW 0FFFFH ;; | ||
| 289 | DW 0FFFFH ;; | ||
| 290 | DW 0FFFFH ;; | ||
| 291 | DW 0FFFFH ;; | ||
| 292 | DW 0FFFFH ;; | ||
| 293 | DW 0FFFFH ;; | ||
| 294 | DW 0FFFFH ;; | ||
| 295 | DW 0FFFFH ;; | ||
| 296 | ;;upto hardsl_max+1, there are as many HARD_SLn | ||
| 297 | ;; | ||
| 298 | HBUF_SL3 LABEL WORD ;; hardware slots' buffer for LPT3 | ||
| 299 | DW 0FFFFH ;; ---- only for CART-SLOTS | ||
| 300 | DW 0FFFFH ;; | ||
| 301 | DW 0FFFFH ;; | ||
| 302 | DW 0FFFFH ;; | ||
| 303 | DW 0FFFFH ;; | ||
| 304 | DW 0FFFFH ;; | ||
| 305 | DW 0FFFFH ;; | ||
| 306 | DW 0FFFFH ;; | ||
| 307 | DW 0FFFFH ;; | ||
| 308 | DW 0FFFFH ;; | ||
| 309 | DW 0FFFFH ;; | ||
| 310 | DW 0FFFFH ;; | ||
| 311 | DW 0FFFFH ;; | ||
| 312 | ;;upto hardsl_max+1, there are as many HARD_SLn | ||
| 313 | ;; | ||
| 314 | ;; | ||
| 315 | RBUF_SL1 LABEL WORD ;; ram slots' buffer for LPT1/PRN | ||
| 316 | DW 0FFFFH ;; | ||
| 317 | DW 0FFFFH ;; | ||
| 318 | DW 0FFFFH ;; | ||
| 319 | DW 0FFFFH ;; | ||
| 320 | DW 0FFFFH ;; | ||
| 321 | DW 0FFFFH ;; | ||
| 322 | DW 0FFFFH ;; | ||
| 323 | DW 0FFFFH ;; | ||
| 324 | DW 0FFFFH ;; | ||
| 325 | DW 0FFFFH ;; | ||
| 326 | DW 0FFFFH ;; | ||
| 327 | DW 0FFFFH ;; | ||
| 328 | ;;upto ramsl_max, there are as many RAM_SLn | ||
| 329 | ;; | ||
| 330 | RBUF_SL2 LABEL WORD ;; ram slots' buffer for LPT2 | ||
| 331 | DW 0FFFFH ;; | ||
| 332 | DW 0FFFFH ;; | ||
| 333 | DW 0FFFFH ;; | ||
| 334 | DW 0FFFFH ;; | ||
| 335 | DW 0FFFFH ;; | ||
| 336 | DW 0FFFFH ;; | ||
| 337 | DW 0FFFFH ;; | ||
| 338 | DW 0FFFFH ;; | ||
| 339 | DW 0FFFFH ;; | ||
| 340 | DW 0FFFFH ;; | ||
| 341 | DW 0FFFFH ;; | ||
| 342 | DW 0FFFFH ;; | ||
| 343 | ;;upto ramsl_max, there are as many RAM_SLn | ||
| 344 | ;; | ||
| 345 | RBUF_SL3 LABEL WORD ;; ram slots' buffer for LPT3 | ||
| 346 | DW 0FFFFH ;; | ||
| 347 | DW 0FFFFH ;; | ||
| 348 | DW 0FFFFH ;; | ||
| 349 | DW 0FFFFH ;; | ||
| 350 | DW 0FFFFH ;; | ||
| 351 | DW 0FFFFH ;; | ||
| 352 | DW 0FFFFH ;; | ||
| 353 | DW 0FFFFH ;; | ||
| 354 | DW 0FFFFH ;; | ||
| 355 | DW 0FFFFH ;; | ||
| 356 | DW 0FFFFH ;; | ||
| 357 | DW 0FFFFH ;; | ||
| 358 | ;;upto ramsl_max, there are as many RAM_SLn | ||
| 359 | ;; | ||
| 360 | FTDL_OFF1 LABEL WORD ;; offset of FTSTART for PRN/LPT1 | ||
| 361 | DW 0 ;; NOTE : must be only two bytes for | ||
| 362 | DW 0 ;; codepage positioning | ||
| 363 | DW 0 ;; calculation as compared | ||
| 364 | DW 0 ;; with each entry in RAM_SLOT | ||
| 365 | DW 0 ;; or CART_SLOT | ||
| 366 | DW 0 ;; | ||
| 367 | DW 0 ;; | ||
| 368 | DW 0 ;; | ||
| 369 | DW 0 ;; | ||
| 370 | DW 0 ;; | ||
| 371 | DW 0 ;; | ||
| 372 | DW 0 ;; | ||
| 373 | DW 0 ;; | ||
| 374 | ;;upto the max. of {ramsl_max,hardsl_max} | ||
| 375 | ;; | ||
| 376 | FTDL_OFF2 LABEL WORD ;; offset of FTSTART for LPT2 | ||
| 377 | DW 0 ;; | ||
| 378 | DW 0 ;; | ||
| 379 | DW 0 ;; | ||
| 380 | DW 0 ;; | ||
| 381 | DW 0 ;; | ||
| 382 | DW 0 ;; | ||
| 383 | DW 0 ;; | ||
| 384 | DW 0 ;; | ||
| 385 | DW 0 ;; | ||
| 386 | DW 0 ;; | ||
| 387 | DW 0 ;; | ||
| 388 | DW 0 ;; | ||
| 389 | DW 0 ;; | ||
| 390 | ;;upto the max. of {ramsl_max,hardsl_max} | ||
| 391 | ;; | ||
| 392 | FTDL_OFF3 LABEL WORD ;; offset of FTSTART for LPT3 | ||
| 393 | DW 0 ;; | ||
| 394 | DW 0 ;; | ||
| 395 | DW 0 ;; | ||
| 396 | DW 0 ;; | ||
| 397 | DW 0 ;; | ||
| 398 | DW 0 ;; | ||
| 399 | DW 0 ;; | ||
| 400 | DW 0 ;; | ||
| 401 | DW 0 ;; | ||
| 402 | DW 0 ;; | ||
| 403 | DW 0 ;; | ||
| 404 | DW 0 ;; | ||
| 405 | DW 0 ;; | ||
| 406 | ;;upto the max. of {ramsl_max,hardsl_max} | ||
| 407 | ;; | ||
| 408 | ;; | ||
| 409 | ;; | ||
| 410 | ;; | ||
| 411 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 412 | ; | ||
| 413 | ; Printer Description Tables | ||
| 414 | ; | ||
| 415 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 416 | ;; | ||
| 417 | ESC_CHAR EQU 27 ;; | ||
| 418 | ;; | ||
| 419 | db 'PRINTER_DESC' ;; | ||
| 420 | ;; | ||
| 421 | PRINTER_DESC_NUM DW 3 ;; number of PRINTER_DESCn | ||
| 422 | ;; | ||
| 423 | PRINTER_DESC_TBL LABEL WORD ;; | ||
| 424 | DW OFFSET(PRINTER_DESC1) ;; | ||
| 425 | DW OFFSET(PRINTER_DESC2) ;; | ||
| 426 | DW OFFSET(PRINTER_DESC3) ;; | ||
| 427 | DW OFFSET(PRINTER_DESC4) ;; | ||
| 428 | ;; | ||
| 429 | ;; | ||
| 430 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 431 | ; | ||
| 432 | ; Printer Description Table for Proprinter (4201) | ||
| 433 | ; | ||
| 434 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 435 | PRINTER_DESC1 : ;; | ||
| 436 | ;; | ||
| 437 | PDSH <,'4201 ',,,0,212,1,1,1> ;; followed by the rest in PDS | ||
| 438 | ;; CLASS = 0 | ||
| 439 | ;; FTSZPA = 212 ==> 212 x 16=3008 bytes | ||
| 440 | ;; of font buffer | ||
| 441 | ;; HSLOTS = 1 (check CTL4201_B) | ||
| 442 | ;; HWCPMIN = 1 | ||
| 443 | ;; RSLOTS = 1 (check CTL4201_B) | ||
| 444 | ;; | ||
| 445 | DW OFFSET(CTL4201_H) | ||
| 446 | DW OFFSET(CTL4201_R) | ||
| 447 | DW OFFSET(CTL4201_B) | ||
| 448 | ;; (CTL_MAX = 32) | ||
| 449 | ;; (32 bytes for each control) | ||
| 450 | ;; (MUST BE ADJACENT...no blanks bet.:) | ||
| 451 | CTL4201_H : DB 5,ESC_CHAR,'I',0,ESC_CHAR,"6" ;; selection control 1 | ||
| 452 | CTL4201_R : DB 5,ESC_CHAR,'I',4,ESC_CHAR,"6" ;; selection control 2 | ||
| 453 | db 26 dup (0) ;; for CTL4201_H | ||
| 454 | db 26 dup (0) ;; for CTL4201_R | ||
| 455 | ;; | ||
| 456 | CTL4201_B DB CTL_MAX DUP (0) ;; max. two selection | ||
| 457 | DB CTL_MAX DUP (0) ;; | ||
| 458 | ;; | ||
| 459 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 460 | ; | ||
| 461 | ; Printer Description Table for 5202 | ||
| 462 | ; | ||
| 463 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 464 | ;; | ||
| 465 | PRINTER_DESC2 : ;; | ||
| 466 | PDSH <,'5202 ',,,1,2,2,1,0> ;; followed by the rest in PDS | ||
| 467 | ;; CLASS = 1 (font buffers allowed | ||
| 468 | ;; if there is cart-slot) | ||
| 469 | ;; FTSZPA = 2 ==> 2 x 16 = 32 bytes | ||
| 470 | ;; of font buffer | ||
| 471 | ;; HSLOTS = 2 (check CTL5202_B) | ||
| 472 | ;; HWCPMIN = 1 | ||
| 473 | ;; RSLOTS = 0 (check CTL5202_B) | ||
| 474 | ;; | ||
| 475 | DW OFFSET(CTL5202_H) | ||
| 476 | DW OFFSET(CTL5202_R) | ||
| 477 | DW OFFSET(CTL5202_B) | ||
| 478 | ;; | ||
| 479 | ;; (CTL_MAX = 32) | ||
| 480 | ;; (SEE CTL5202_OFFS) | ||
| 481 | ;; (32 bytes for each control) | ||
| 482 | CTL5202_H : DB 12,ESC_CHAR,91,84,5,0,00,00,0FFH,0FFH,00 ;; selection control 1 | ||
| 483 | dB ESC_CHAR,"6" ;; | ||
| 484 | DB 12,ESC_CHAR,91,84,5,0,00,00,0FFH,0FFH,00 ;; selection control 2 | ||
| 485 | dB ESC_CHAR,"6" ;; | ||
| 486 | db 19 dup (0) ;; for CTL5202_H selection 1 | ||
| 487 | db 19 dup (0) ;; for CTL5202_H selection 2 | ||
| 488 | CTL5202_R : DB 0 ;; | ||
| 489 | ;; | ||
| 490 | CTL5202_B DB CTL_MAX DUP (0) ;; max. two selection | ||
| 491 | DB CTL_MAX DUP (0) ;; | ||
| 492 | ;; | ||
| 493 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 494 | ; | ||
| 495 | ; Printer Description Table for RESERVED PRINTER (res1) | ||
| 496 | ; | ||
| 497 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 498 | PRINTER_DESC3 : ;; | ||
| 499 | ;; | ||
| 500 | PDSH <,'4208 ',,,1,2,2,1,0> ;; followed by the rest in PDS | ||
| 501 | ;; CLASS = 1 | ||
| 502 | ;; FTSZPA = 2 | ||
| 503 | ;; HSLOTS = 2 | ||
| 504 | ;; HWCPMIN = 1 | ||
| 505 | ;; RSLOTS = 0 | ||
| 506 | ;; | ||
| 507 | DW OFFSET(CTL4208_H) | ||
| 508 | DW OFFSET(CTL4208_R) | ||
| 509 | DW OFFSET(CTL4208_B) | ||
| 510 | ;; (CTL_MAX = 32) | ||
| 511 | ;; (32 bytes for each control) | ||
| 512 | ;; (MUST BE ADJACENT...no blanks bet.:) | ||
| 513 | CTL4208_H : DB 0Bh,ESC_CHAR,49h,0Ah ;; selection control 1 | ||
| 514 | DB ESC_CHAR,49h,03 | ||
| 515 | DB ESC_CHAR,49h,02 | ||
| 516 | DB ESC_CHAR,36h | ||
| 517 | db 20 dup (0) | ||
| 518 | CTL4208_R : DB 0Bh,ESC_CHAR,49h,0Eh ;; selection control 2 | ||
| 519 | DB ESC_CHAR,49h,7 | ||
| 520 | DB ESC_CHAR,49h,6 | ||
| 521 | DB ESC_CHAR,36h | ||
| 522 | db 20 dup (0) ;; for CTLres1_H and CTRLres1_R | ||
| 523 | ;; | ||
| 524 | CTL4208_B DB CTL_MAX DUP (0) ;; max. two selection | ||
| 525 | DB CTL_MAX DUP (0) ;; | ||
| 526 | ;; | ||
| 527 | ;; | ||
| 528 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 529 | ; | ||
| 530 | ; Printer Description Table for RESERVED PRINTER (res2) | ||
| 531 | ; | ||
| 532 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 533 | PRINTER_DESC4 : ;; | ||
| 534 | ;; | ||
| 535 | PDSH <,'nnnnnnnn',,,0,0,1,1,1> ;; followed by the rest in PDS | ||
| 536 | ;; CLASS = 0 | ||
| 537 | ;; FTSZPA = 0 | ||
| 538 | ;; HSLOTS = 1 | ||
| 539 | ;; HWCPMIN = 1 | ||
| 540 | ;; RSLOTS = 1 | ||
| 541 | ;; | ||
| 542 | DW OFFSET(CTLres2_H) | ||
| 543 | DW OFFSET(CTLres2_R) | ||
| 544 | DW OFFSET(CTLres2_B) | ||
| 545 | ;; (CTL_MAX = 32) | ||
| 546 | ;; (32 bytes for each control) | ||
| 547 | ;; (MUST BE ADJACENT...no blanks bet.:) | ||
| 548 | CTLres2_H : DB 0 ;; selection control 1 | ||
| 549 | CTLres2_R : DB 32 dup (0) ;; selection control 2 | ||
| 550 | db 32 dup (0) ;; for CTLres2_H and CTRLres2_R | ||
| 551 | ;; | ||
| 552 | CTLres2_B DB CTL_MAX DUP (0) ;; max. two selection | ||
| 553 | DB CTL_MAX DUP (0) ;; | ||
| 554 | ;; | ||
| 555 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 556 | ;; | ||
| 557 | ;; | ||
| 558 | TEMP_SI DW ? ;; | ||
| 559 | ;; | ||
| 560 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 561 | ;; | ||
| 562 | ;; The request header for IOCTL call | ||
| 563 | ;; to the Normal device driver | ||
| 564 | ;; | ||
| 565 | ;; | ||
| 566 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 567 | ;; | ||
| 568 | REQ_NORM1 GIH <,,,,,> ;; for LPT1/PRN | ||
| 569 | GB2S <,> ;; | ||
| 570 | REQ_NORM2 GIH <,,,,,> ;; for LPT2 | ||
| 571 | GB2S <,> ;; | ||
| 572 | REQ_NORM3 GIH <,,,,,> ;; for LPT3 | ||
| 573 | GB2S <,> ;; | ||
| 574 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 575 | ;; | ||
| 576 | ;; | ||
| 577 | ;; | ||
| 578 | ;; PARSER'S TABLES | ||
| 579 | ;; | ||
| 580 | ;; -- TABLE is the first table of the results of the parsing. | ||
| 581 | ;; The first word (number of devices) will be set to 0 if | ||
| 582 | ;; syntax error is detected in the DEVICE command line. | ||
| 583 | ;; | ||
| 584 | ;; | ||
| 585 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 586 | ; | ||
| 587 | ; TABLE STRUCTURE FOR RETURNING VALUES TO THE INIT MODULE WGR | ||
| 588 | ; (ADAPTED FROM VERSION 1.0 DISPLAY.SYS) WGR | ||
| 589 | ; | ||
| 590 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 591 | |||
| 592 | TABLE LABEL BYTE ; table header ;AN000; | ||
| 593 | DEVICE_NUM DW ZERO ; initialized to zero devices ;AN000; | ||
| 594 | DW TABLE1_1 ; pointer to table 2 for device 1 ;AN000; | ||
| 595 | DW TABLE2_1 ; pointer to table 2 for device 2 ;AN000; | ||
| 596 | DW TABLE3_1 ; pointer to table 2 for device 3 ;AN000; | ||
| 597 | DW TABLE4_1 ; pointer to table 2 for device 4 ;AN000; | ||
| 598 | ;AN000; | ||
| 599 | TABLE1_1 LABEL WORD ;AN000; | ||
| 600 | DW FOUR ; 4 pointer follow ;AN000; | ||
| 601 | DW TABLE1_2 ; pointer to table 3 (device name) ;AN000; | ||
| 602 | DW TABLE1_3 ; pointer to table 4 (device id) ;AN000; | ||
| 603 | DW TABLE1_4 ; pointer to table 5 (hwcp's) ;AN000; | ||
| 604 | DW TABLE1_5 ; pointer to table 6 (num desg's and fonts) ;AN000; | ||
| 605 | DW -1 ; reserved ;AN000; | ||
| 606 | ;AN000; | ||
| 607 | TABLE1_2 LABEL WORD ; device name (ie. PRN) ;AN000; | ||
| 608 | DW ZERO ; length ;AN000; | ||
| 609 | DB " " ; value ;AN000; | ||
| 610 | ;AN000; | ||
| 611 | TABLE1_3 LABEL WORD ; device id. (eg. 4201,5202..) ;AN000; | ||
| 612 | DW ZERO ; length ;AN000; | ||
| 613 | DB " " ; value ;AN000; | ||
| 614 | ;AN000; | ||
| 615 | TABLE1_4 LABEL WORD ; hardware code pages (10 max.) ;AN000; | ||
| 616 | DW ZERO ; number ;AN000; | ||
| 617 | DW -1 ; value ;AN000; | ||
| 618 | DW -1 ; value ;AN000; | ||
| 619 | DW -1 ; value ;AN000; | ||
| 620 | DW -1 ; value ;AN000; | ||
| 621 | DW -1 ; value ;AN000; | ||
| 622 | DW -1 ; value ;AN000; | ||
| 623 | DW -1 ; value ;AN000; | ||
| 624 | DW -1 ; value ;AN000; | ||
| 625 | DW -1 ; value ;AN000; | ||
| 626 | DW -1 ; value ;AN000; | ||
| 627 | ;AN000; | ||
| 628 | TABLE1_5 LABEL WORD ; Designates and fonts ;AN000; | ||
| 629 | DW ZERO ; values given (0 - 2 valid) ;AN000; | ||
| 630 | DW -1 ; n value ;AN000; | ||
| 631 | DW -1 ; m value ;AN000; | ||
| 632 | ;AN000; | ||
| 633 | TABLE2_1 LABEL WORD ;AN000; | ||
| 634 | DW FOUR ; 4 pointer follow ;AN000; | ||
| 635 | DW TABLE2_2 ; pointer to table 3 (device name) ;AN000; | ||
| 636 | DW TABLE2_3 ; pointer to table 4 (device id) ;AN000; | ||
| 637 | DW TABLE2_4 ; pointer to table 5 (hwcp's) ;AN000; | ||
| 638 | DW TABLE2_5 ; pointer to table 6 (num desg's and fonts) ;AN000; | ||
| 639 | DW -1 ; reserved ;AN000; | ||
| 640 | ;AN000; | ||
| 641 | TABLE2_2 LABEL WORD ; device name (ie. PRN) ;AN000; | ||
| 642 | DW ZERO ; length ;AN000; | ||
| 643 | DB " " ; value ;AN000; | ||
| 644 | ;AN000; | ||
| 645 | TABLE2_3 LABEL WORD ; device id. (eg. 4201,5202..) ;AN000; | ||
| 646 | DW ZERO ; length ;AN000; | ||
| 647 | DB " " ; value ;AN000; | ||
| 648 | ;AN000; | ||
| 649 | TABLE2_4 LABEL WORD ; hardware code pages (10 max.) ;AN000; | ||
| 650 | DW ZERO ; number ;AN000; | ||
| 651 | DW -1 ; value ;AN000; | ||
| 652 | DW -1 ; value ;AN000; | ||
| 653 | DW -1 ; value ;AN000; | ||
| 654 | DW -1 ; value ;AN000; | ||
| 655 | DW -1 ; value ;AN000; | ||
| 656 | DW -1 ; value ;AN000; | ||
| 657 | DW -1 ; value ;AN000; | ||
| 658 | DW -1 ; value ;AN000; | ||
| 659 | DW -1 ; value ;AN000; | ||
| 660 | DW -1 ; value ;AN000; | ||
| 661 | ;AN000; | ||
| 662 | TABLE2_5 LABEL WORD ; Designates and fonts ;AN000; | ||
| 663 | DW ZERO ; values given (0 - 2 valid) ;AN000; | ||
| 664 | DW -1 ; n value ;AN000; | ||
| 665 | DW -1 ; m value ;AN000; | ||
| 666 | ;AN000; | ||
| 667 | TABLE3_1 LABEL WORD ;AN000; | ||
| 668 | DW FOUR ; 4 pointer follow ;AN000; | ||
| 669 | DW TABLE3_2 ; pointer to table 3 (device name) ;AN000; | ||
| 670 | DW TABLE3_3 ; pointer to table 4 (device id) ;AN000; | ||
| 671 | DW TABLE3_4 ; pointer to table 5 (hwcp's) ;AN000; | ||
| 672 | DW TABLE3_5 ; pointer to table 6 (num desg's and fonts) ;AN000; | ||
| 673 | DW -1 ; reserved ;AN000; | ||
| 674 | ;AN000; | ||
| 675 | TABLE3_2 LABEL WORD ; device name (ie. PRN) ;AN000; | ||
| 676 | DW ZERO ; length ;AN000; | ||
| 677 | DB " " ; value ;AN000; | ||
| 678 | ;AN000; | ||
| 679 | TABLE3_3 LABEL WORD ; device id. (eg. 4201,5202..) ;AN000; | ||
| 680 | DW ZERO ; length ;AN000; | ||
| 681 | DB " " ; value ;AN000; | ||
| 682 | ;AN000; | ||
| 683 | TABLE3_4 LABEL WORD ; hardware code pages (10 max.) ;AN000; | ||
| 684 | DW ZERO ; number ;AN000; | ||
| 685 | DW -1 ; value ;AN000; | ||
| 686 | DW -1 ; value ;AN000; | ||
| 687 | DW -1 ; value ;AN000; | ||
| 688 | DW -1 ; value ;AN000; | ||
| 689 | DW -1 ; value ;AN000; | ||
| 690 | DW -1 ; value ;AN000; | ||
| 691 | DW -1 ; value ;AN000; | ||
| 692 | DW -1 ; value ;AN000; | ||
| 693 | DW -1 ; value ;AN000; | ||
| 694 | DW -1 ; value ;AN000; | ||
| 695 | ;AN000; | ||
| 696 | TABLE3_5 LABEL WORD ; Designates and fonts ;AN000; | ||
| 697 | DW ZERO ; values given (0 - 2 valid) ;AN000; | ||
| 698 | DW 0 ; n value ;AN000; | ||
| 699 | DW 0 ; m value ;AN000; | ||
| 700 | ;AN000; | ||
| 701 | TABLE4_1 LABEL WORD ;AN000; | ||
| 702 | DW FOUR ; 4 pointer follow ;AN000; | ||
| 703 | DW TABLE4_2 ; pointer to table 3 (device name) ;AN000; | ||
| 704 | DW TABLE4_3 ; pointer to table 4 (device id) ;AN000; | ||
| 705 | DW TABLE4_4 ; pointer to table 5 (hwcp's) ;AN000; | ||
| 706 | DW TABLE4_5 ; pointer to table 6 (num desg's and fonts) ;AN000; | ||
| 707 | DW -1 ; reserved ;AN000; | ||
| 708 | ;AN000; | ||
| 709 | TABLE4_2 LABEL WORD ; device name (ie. PRN) ;AN000; | ||
| 710 | DW ZERO ; length ;AN000; | ||
| 711 | DB " " ; value ;AN000; | ||
| 712 | ;AN000; | ||
| 713 | TABLE4_3 LABEL WORD ; device id. (eg. 4201,5202..) ;AN000; | ||
| 714 | DW ZERO ; length ;AN000; | ||
| 715 | DB " " ; value ;AN000; | ||
| 716 | ;AN000; | ||
| 717 | TABLE4_4 LABEL WORD ; hardware code pages (10 max.) ;AN000; | ||
| 718 | DW ZERO ; number ;AN000; | ||
| 719 | DW -1 ; value ;AN000; | ||
| 720 | DW -1 ; value ;AN000; | ||
| 721 | DW -1 ; value ;AN000; | ||
| 722 | DW -1 ; value ;AN000; | ||
| 723 | DW -1 ; value ;AN000; | ||
| 724 | DW -1 ; value ;AN000; | ||
| 725 | DW -1 ; value ;AN000; | ||
| 726 | DW -1 ; value ;AN000; | ||
| 727 | DW -1 ; value ;AN000; | ||
| 728 | DW -1 ; value ;AN000; | ||
| 729 | ;AN000; | ||
| 730 | TABLE4_5 LABEL WORD ; Designates and fonts ;AN000; | ||
| 731 | DW ZERO ; values given (0 - 2 valid) ;AN000; | ||
| 732 | DW 0 ; n value ;AN000; | ||
| 733 | DW 0 ; m value ;AN000; | ||
| 734 | |||
| 735 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 736 | reserved1 DW ? ;; reserved for debugging used | ||
| 737 | reserved2 dw ? ;; | ||
| 738 | ;; | ||
| 739 | ;;;;;;;;ASSUME DS:NOTHING ;; | ||
| 740 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 741 | ;; | ||
| 742 | ;; PRN Device "strategy" entry point | ||
| 743 | ;; | ||
| 744 | ;; Retain the Request Header address for use by Interrupt routine | ||
| 745 | ;; | ||
| 746 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 747 | STRATEGY0 PROC FAR ;; | ||
| 748 | PUSH BX ;; | ||
| 749 | PUSH BX ;; | ||
| 750 | LEA BX, BUF0 ;; BUF = BUF0 CS:[BX] | ||
| 751 | POP buf.RH_PTRO ;; offset of request header | ||
| 752 | MOV buf.RH_PTRS,ES ;; segment | ||
| 753 | POP BX ;; | ||
| 754 | RET ;; | ||
| 755 | STRATEGY0 ENDP ;; | ||
| 756 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 757 | ;; | ||
| 758 | ;; LPT1 Device "strategy" entry point | ||
| 759 | ;; | ||
| 760 | ;; Retain the Request Header address for use by Interrupt routine | ||
| 761 | ;; | ||
| 762 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 763 | STRATEGY1 PROC FAR ;; | ||
| 764 | PUSH BX ;; | ||
| 765 | PUSH BX ;; | ||
| 766 | LEA BX, BUF1 ;; BUF = BUF1 CS:[BX] | ||
| 767 | POP buf.RH_PTRO ;; offset of request header | ||
| 768 | MOV buf.RH_PTRS,ES ;; segment | ||
| 769 | POP BX ;; | ||
| 770 | RET ;; | ||
| 771 | STRATEGY1 ENDP ;; | ||
| 772 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 773 | ;; | ||
| 774 | ;; LPT2 Device "strategy" entry point | ||
| 775 | ;; | ||
| 776 | ;; Retain the Request Header address for use by Interrupt routine | ||
| 777 | ;; | ||
| 778 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 779 | STRATEGY2 PROC FAR ;; | ||
| 780 | PUSH BX ;; | ||
| 781 | PUSH BX ;; | ||
| 782 | LEA BX, BUF2 ;; BUF = BUF2 CS:[BX] | ||
| 783 | POP buf.RH_PTRO ;; offset of request header | ||
| 784 | MOV buf.RH_PTRS,ES ;; segment | ||
| 785 | POP BX ;; | ||
| 786 | RET ;; | ||
| 787 | STRATEGY2 ENDP ;; | ||
| 788 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 789 | ;; | ||
| 790 | ;; LPT3 Device "strategy" entry point | ||
| 791 | ;; | ||
| 792 | ;; Retain the Request Header address for use by Interrupt routine | ||
| 793 | ;; | ||
| 794 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 795 | STRATEGY3 PROC FAR ;; | ||
| 796 | PUSH BX ;; | ||
| 797 | PUSH BX ;; | ||
| 798 | LEA BX, BUF3 ;; BUF = BUF3 CS:[BX] | ||
| 799 | POP buf.RH_PTRO ;; offset of request header | ||
| 800 | MOV buf.RH_PTRS,ES ;; segment | ||
| 801 | POP BX ;; | ||
| 802 | RET ;; | ||
| 803 | STRATEGY3 ENDP ;; | ||
| 804 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 805 | ;; | ||
| 806 | ;; Table of command / functions supported by LPTn | ||
| 807 | ;; | ||
| 808 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 809 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 810 | ;; CMD_CODES code supported by LPTn | ||
| 811 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 812 | CMD_CODES LABEL BYTE ;; | ||
| 813 | DB CMD_INI ;; Initialization | ||
| 814 | DB CMD_WRT ;; output | ||
| 815 | DB 09 ;; output | ||
| 816 | DB 12 ;; output | ||
| 817 | CMD_INDX EQU ($-CMD_CODES) ;; number of entries in CMD_CODES | ||
| 818 | ;; | ||
| 819 | ;; Write (CMD_WRT) has exceptional | ||
| 820 | ;; support by LPTn | ||
| 821 | ;; | ||
| 822 | ;; Generic IOCTL (CMD_GIO) leads to | ||
| 823 | ;; GIO_CODES | ||
| 824 | ;; | ||
| 825 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 826 | ;; GIO_CODES code supported by LPTn | ||
| 827 | ;; -- command = CMD_GIO and | ||
| 828 | ;; major function = MAF_PTR | ||
| 829 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 830 | GIO_CODES LABEL BYTE ;; minor GIO functions supported : | ||
| 831 | DB MIF_DST ;; - designate start | ||
| 832 | DB MIF_DEN ;; - designate end | ||
| 833 | DB MIF_IVK ;; - invoke | ||
| 834 | DB MIF_QIV ;; - query-invoked | ||
| 835 | DB MIF_QLS ;; - query-list | ||
| 836 | GIO_INDX EQU ($-GIO_CODES) ;; number of entries in GIO_CODES | ||
| 837 | ;; | ||
| 838 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 839 | ;; Cases supported by LPTn | ||
| 840 | ;; -- first section matched with | ||
| 841 | ;; CMD_CODES upto CMD_INDX | ||
| 842 | ;; | ||
| 843 | ;; -- 2nd section matched with | ||
| 844 | ;; GIO_CODES for GIO_INDEX more | ||
| 845 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 846 | CASES LABEL WORD ;; in CMD_CODES order | ||
| 847 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 848 | ;; | ||
| 849 | DW OFFSET INIT ;; 0 - Initialization | ||
| 850 | DW OFFSET WRITE ;; | ||
| 851 | DW OFFSET WRITE ;; | ||
| 852 | DW OFFSET WRITE ;; | ||
| 853 | ;; | ||
| 854 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 855 | ;; in GIO_CODES order | ||
| 856 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 857 | ;; | ||
| 858 | DW OFFSET DESIGNATE_START ;; | ||
| 859 | DW OFFSET DESIGNATE_END ;; | ||
| 860 | DW OFFSET INVOKE ;; | ||
| 861 | DW OFFSET Q_INVOKED ;; | ||
| 862 | DW OFFSET Q_LIST ;; | ||
| 863 | ;; | ||
| 864 | ;; | ||
| 865 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 866 | ;; | ||
| 867 | ;; Memory Allocation | ||
| 868 | ;; | ||
| 869 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 870 | ;; | ||
| 871 | ;; | ||
| 872 | ;; | ||
| 873 | MEM_REQUEST DW -1 ;; flag used for first time memory | ||
| 874 | ;; allocation for each device | ||
| 875 | ;; | ||
| 876 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 877 | ;; | ||
| 878 | ;; PRN Device "interrupt" entry point | ||
| 879 | ;; | ||
| 880 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 881 | ;; | ||
| 882 | INTERRUPT0 PROC FAR ;; device interrupt entry point | ||
| 883 | ;; | ||
| 884 | PUSH DS ;; save all registers Revised | ||
| 885 | PUSH ES ;; | ||
| 886 | PUSH AX ;; | ||
| 887 | PUSH BX ;; | ||
| 888 | PUSH CX ;; | ||
| 889 | PUSH DX ;; | ||
| 890 | PUSH DI ;; | ||
| 891 | PUSH SI ;; | ||
| 892 | ;; BP isn't used, so it isn't saved | ||
| 893 | push cs ;; | ||
| 894 | pop ds ;; | ||
| 895 | ;; | ||
| 896 | CMP STACK_ALLOCATED,0AAH ;; | ||
| 897 | JNE PRN_NO_STACK ;; | ||
| 898 | ;; | ||
| 899 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 900 | ; | ||
| 901 | ; STACK RECODING SEPT 28/86 | ||
| 902 | ; | ||
| 903 | ; GORDON GIDDINGS | ||
| 904 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 905 | MOV AX,STACK_SIZE ;G; | ||
| 906 | SHL AX,1 ;G; | ||
| 907 | SHL AX,1 ;G; | ||
| 908 | SHL AX,1 ;G; | ||
| 909 | SHL AX,1 ;G; | ||
| 910 | MOV CS:TEMP_SI,SI ;G; | ||
| 911 | MOV SI,RESIDENT_END ;G; | ||
| 912 | SUB SI,STACK_SIZE ;G; | ||
| 913 | ;G; | ||
| 914 | mov reserved1,AX ;G; | ||
| 915 | mov reserved2,SI ;G; | ||
| 916 | ;G; | ||
| 917 | CLI ;G; | ||
| 918 | MOV DX,SS ;G; | ||
| 919 | MOV CX,SP ;G; | ||
| 920 | MOV SS,SI ;G; | ||
| 921 | MOV SP,AX ;G; | ||
| 922 | STI ;G; | ||
| 923 | MOV SI,CS:TEMP_SI ;G; | ||
| 924 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 925 | PUSH DX ;; SAVE OLD SS ONTO STACK | ||
| 926 | PUSH CX ;; " " SP " " | ||
| 927 | ;; | ||
| 928 | PRN_NO_STACK : ;; | ||
| 929 | ;; | ||
| 930 | ;; | ||
| 931 | MOV DI,OFFSET IRPT_CMD_EXIT ;; return addr from command processor | ||
| 932 | ;; | ||
| 933 | PUSH DI ;; push return address onto stack | ||
| 934 | ;; command routine issues "RET" | ||
| 935 | ;; | ||
| 936 | LEA BX, BUF0 ;; PRN BUF = BUF0 , CS:BX | ||
| 937 | ;; | ||
| 938 | MOV MEM_REQUEST,-1 ;; to be set to zero only once | ||
| 939 | ;; | ||
| 940 | CMP BUF.BFLAG,-1 ;; | ||
| 941 | JNE PRN_INITED ;; | ||
| 942 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 943 | MOV BUF.BFLAG,BF_PRN ;; INITIALIZE PRN BUFFER | ||
| 944 | ;; | ||
| 945 | MOV DI,OFFSET DEV_HDR0 ;; PRN Device header | ||
| 946 | MOV BUF.DEV_HDRO,DI ;; | ||
| 947 | MOV BUF.DEV_HDRS,CS ;; must be CS | ||
| 948 | ;; | ||
| 949 | MOV DI,OFFSET HBUF_SL1 ;; PRN/LPT1 buffer for Hardware-slots | ||
| 950 | MOV BUF.HRBUFO,DI ;; | ||
| 951 | ;; | ||
| 952 | MOV DI,OFFSET RBUF_SL1 ;; PRN/LPT1 buffer for RAM-slots | ||
| 953 | MOV BUF.RMBUFO,DI ;; | ||
| 954 | ;; | ||
| 955 | MOV DI,OFFSET FTDL_OFF1 ;; | ||
| 956 | MOV BUF.FTDLO,DI ;; | ||
| 957 | ;; | ||
| 958 | MOV DI,OFFSET REQ_NORM1 ;; PRN/LPT1 request header | ||
| 959 | MOV BUF.RNORMO,DI ;; | ||
| 960 | ;; | ||
| 961 | MOV BUF.FSELEN,0 ;; selection control length | ||
| 962 | ;; | ||
| 963 | mov buf.prn_bufo,offset buf0;; | ||
| 964 | ;; | ||
| 965 | JMP COMMON_INTR ;; common interrupt handler | ||
| 966 | ;; | ||
| 967 | PRN_INITED : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 968 | ;; FONT BUFFER TO BE CREATED ? | ||
| 969 | CMP BUF.BFLAG,BF_PRN ;; | ||
| 970 | JNE PRN_MEM_DONE ;; | ||
| 971 | ;; | ||
| 972 | OR BUF.BFLAG,BF_MEM_DONE ;; do it only once. | ||
| 973 | ;; | ||
| 974 | CMP BUF.STATE,CPSW ;; | ||
| 975 | JNE PRN_MEM_DONE ;; create only if state is CPSW | ||
| 976 | ;; | ||
| 977 | PRN_MEM_CREATE : ;; | ||
| 978 | XOR AX,AX ;; THEN CREATE | ||
| 979 | MOV MEM_REQUEST,AX ;; to set to zero only once for each | ||
| 980 | ;; LPTn or PRN | ||
| 981 | PRN_MEM_DONE : ;; | ||
| 982 | JMP COMMON_INTR ;; common interrupt handler | ||
| 983 | ;; | ||
| 984 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 985 | ;; | ||
| 986 | ;; LPT1 Device "interrupt" entry point | ||
| 987 | ;; | ||
| 988 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 989 | INTERRUPT1 PROC FAR ;; device interrupt entry point | ||
| 990 | ;; | ||
| 991 | PUSH DS ;; save all registers Revised | ||
| 992 | PUSH ES ;; | ||
| 993 | PUSH AX ;; | ||
| 994 | PUSH BX ;; | ||
| 995 | PUSH CX ;; | ||
| 996 | PUSH DX ;; | ||
| 997 | PUSH DI ;; | ||
| 998 | PUSH SI ;; | ||
| 999 | ;; BP isn't used, so it isn't saved | ||
| 1000 | push cs ;; | ||
| 1001 | pop ds ;; | ||
| 1002 | ;; | ||
| 1003 | CMP STACK_ALLOCATED,0AAH ;; | ||
| 1004 | JNE LPT1_NO_STACK ;; | ||
| 1005 | ;; | ||
| 1006 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1007 | ; | ||
| 1008 | ; STACK RECODING SEPT 28/86 | ||
| 1009 | ; | ||
| 1010 | ; GORDON GIDDINGS | ||
| 1011 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1012 | MOV AX,STACK_SIZE ;G; | ||
| 1013 | SHL AX,1 ;G; | ||
| 1014 | SHL AX,1 ;G; | ||
| 1015 | SHL AX,1 ;G; | ||
| 1016 | SHL AX,1 ;G; | ||
| 1017 | MOV CS:TEMP_SI,SI ;G; | ||
| 1018 | MOV SI,RESIDENT_END ;G; | ||
| 1019 | SUB SI,STACK_SIZE ;G; | ||
| 1020 | ;G; | ||
| 1021 | mov reserved1,AX ;G; | ||
| 1022 | mov reserved2,SI ;G; | ||
| 1023 | ;G; | ||
| 1024 | CLI ;G; | ||
| 1025 | MOV DX,SS ;G; | ||
| 1026 | MOV CX,SP ;G; | ||
| 1027 | MOV SS,SI ;G; | ||
| 1028 | MOV SP,AX ;G; | ||
| 1029 | STI ;G; | ||
| 1030 | MOV SI,CS:TEMP_SI ;G; | ||
| 1031 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1032 | PUSH DX ;; SAVE OLD SS ONTO STACK | ||
| 1033 | PUSH CX ;; " " SP " " | ||
| 1034 | ;; | ||
| 1035 | LPT1_NO_STACK : ;; | ||
| 1036 | ;; | ||
| 1037 | MOV DI,OFFSET IRPT_CMD_EXIT ;; return addr from command processor | ||
| 1038 | ;; | ||
| 1039 | PUSH DI ;; push return address onto stack | ||
| 1040 | ;; command routine issues "RET" | ||
| 1041 | LEA BX, BUF1 ;; LPT1 BUF = BUF1 , CS:BX | ||
| 1042 | ;; | ||
| 1043 | MOV MEM_REQUEST,-1 ;; to be set to zero only once | ||
| 1044 | ;; | ||
| 1045 | CMP BUF.BFLAG,-1 ;; | ||
| 1046 | JNE LPT1_INITED ;; | ||
| 1047 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1048 | MOV BUF.BFLAG,BF_LPT1 ;; INITIALIZE LPT1 BUFFER | ||
| 1049 | ;; | ||
| 1050 | MOV DI,OFFSET DEV_HDR1 ;; LPT1 Device header | ||
| 1051 | MOV BUF.DEV_HDRO,DI ;; | ||
| 1052 | MOV BUF.DEV_HDRS,CS ;; must be CS | ||
| 1053 | ;;.................................... | ||
| 1054 | LEA DI,BUF.RNORMO ;; duplicate common infor. between | ||
| 1055 | PUSH CS ;; PRN and LPT1 | ||
| 1056 | POP ES ;; | ||
| 1057 | LEA CX,BUF.BUFEND ;; | ||
| 1058 | SUB CX,DI ;; | ||
| 1059 | LEA SI, BUF0 ;; | ||
| 1060 | LEA SI,[SI].RNORMO ;; | ||
| 1061 | REP MOVS ES:BYTE PTR[DI],CS:[SI] | ||
| 1062 | ;; | ||
| 1063 | JMP COMMON_INTR ;; common interrupt handler | ||
| 1064 | ;; | ||
| 1065 | LPT1_INITED : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1066 | ;; FONT MEMORY TO BE CREATED ? | ||
| 1067 | CMP BUF.BFLAG,BF_LPT1 ;; | ||
| 1068 | JNE LPT1_MEM_DONE ;; | ||
| 1069 | ;; | ||
| 1070 | OR BUF.BFLAG,BF_MEM_DONE ;; no more next time | ||
| 1071 | ;; | ||
| 1072 | CMP BUF.STATE,CPSW ;; | ||
| 1073 | JNE LPT1_MEM_DONE ;; do it only if state is CPSW | ||
| 1074 | ;; | ||
| 1075 | LPT1_MEM_CREATE : ;; | ||
| 1076 | XOR AX,AX ;; THEN CREATE MEMORY | ||
| 1077 | MOV MEM_REQUEST,AX ;; to set to zero only once for each | ||
| 1078 | ;; | ||
| 1079 | LPT1_MEM_DONE : ;; | ||
| 1080 | ;; | ||
| 1081 | JMP COMMON_INTR ;; common interrupt handler | ||
| 1082 | ;; | ||
| 1083 | INTERRUPT1 ENDP ;; | ||
| 1084 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1085 | ;; | ||
| 1086 | ;; LPT2 Device "interrupt" entry point | ||
| 1087 | ;; | ||
| 1088 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1089 | INTERRUPT2 PROC FAR ;; device interrupt entry point | ||
| 1090 | ;; | ||
| 1091 | PUSH DS ;; save all registers Revised | ||
| 1092 | PUSH ES ;; | ||
| 1093 | PUSH AX ;; | ||
| 1094 | PUSH BX ;; | ||
| 1095 | PUSH CX ;; | ||
| 1096 | PUSH DX ;; | ||
| 1097 | PUSH DI ;; | ||
| 1098 | PUSH SI ;; | ||
| 1099 | ;; BP isn't used, so it isn't saved | ||
| 1100 | push cs ;; | ||
| 1101 | pop ds ;; | ||
| 1102 | ;; | ||
| 1103 | CMP STACK_ALLOCATED,0AAH ;; | ||
| 1104 | JNE LPT2_NO_STACK ;; | ||
| 1105 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1106 | ; | ||
| 1107 | ; STACK RECODING SEPT 28/86 | ||
| 1108 | ; | ||
| 1109 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1110 | MOV AX,STACK_SIZE ;G; | ||
| 1111 | SHL AX,1 ;G; | ||
| 1112 | SHL AX,1 ;G; | ||
| 1113 | SHL AX,1 ;G; | ||
| 1114 | SHL AX,1 ;G; | ||
| 1115 | MOV CS:TEMP_SI,SI ;G; | ||
| 1116 | MOV SI,RESIDENT_END ;G; | ||
| 1117 | SUB SI,STACK_SIZE ;G; | ||
| 1118 | ;G; | ||
| 1119 | mov reserved1,AX ;G; | ||
| 1120 | mov reserved2,SI ;G; | ||
| 1121 | ;G; | ||
| 1122 | CLI ;G; | ||
| 1123 | MOV DX,SS ;G; | ||
| 1124 | MOV CX,SP ;G; | ||
| 1125 | MOV SS,SI ;G; | ||
| 1126 | MOV SP,AX ;G; | ||
| 1127 | STI ;G; | ||
| 1128 | MOV SI,CS:TEMP_SI ;G; | ||
| 1129 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1130 | PUSH DX ;; SAVE OLD SS ONTO STACK | ||
| 1131 | PUSH CX ;; " " SP " " | ||
| 1132 | ;; | ||
| 1133 | LPT2_NO_STACK : ;; | ||
| 1134 | ;; | ||
| 1135 | MOV DI,OFFSET IRPT_CMD_EXIT ;; return addr from command processor | ||
| 1136 | ;; | ||
| 1137 | PUSH DI ;; push return address onto stack | ||
| 1138 | ;; command routine issues "RET" | ||
| 1139 | ;; | ||
| 1140 | LEA BX, BUF2 ;; LPT2 BUF = BUF2 , CS:BX | ||
| 1141 | ;; | ||
| 1142 | MOV MEM_REQUEST,-1 ;; to be set to zero only once | ||
| 1143 | ;; | ||
| 1144 | CMP BUF.BFLAG,-1 ;; | ||
| 1145 | JNE LPT2_INITED ;; | ||
| 1146 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1147 | MOV BUF.BFLAG,BF_LPT2 ;; initialise LPT2 buffer | ||
| 1148 | ;; | ||
| 1149 | MOV DI,OFFSET DEV_HDR2 ;; LPT2 Device header | ||
| 1150 | MOV BUF.DEV_HDRO,DI ;; | ||
| 1151 | MOV BUF.DEV_HDRS,CS ;; must be CS | ||
| 1152 | ;; | ||
| 1153 | MOV DI,OFFSET HBUF_SL2 ;; LPT2 buffer for Hardware-slots | ||
| 1154 | MOV BUF.HRBUFO,DI ;; | ||
| 1155 | ;; | ||
| 1156 | MOV DI,OFFSET RBUF_SL2 ;; LPT2 buffer for RAM-slots | ||
| 1157 | MOV BUF.RMBUFO,DI ;; | ||
| 1158 | ;; | ||
| 1159 | MOV DI,OFFSET FTDL_OFF2 ;; | ||
| 1160 | MOV BUF.FTDLO,DI ;; | ||
| 1161 | ;; | ||
| 1162 | ;; | ||
| 1163 | MOV DI,OFFSET REQ_NORM2 ;; LPT2 request header | ||
| 1164 | MOV BUF.RNORMO,DI ;; | ||
| 1165 | ;; | ||
| 1166 | MOV BUF.FSELEN,0 ;; selection control length | ||
| 1167 | ;; | ||
| 1168 | mov buf.prn_bufo,offset buf2;; | ||
| 1169 | ;; | ||
| 1170 | JMP COMMON_INTR ;; common interrupt handler | ||
| 1171 | ;; | ||
| 1172 | LPT2_INITED : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1173 | ;; FONT BUFFER TO BE CREATED ? | ||
| 1174 | CMP BUF.BFLAG,BF_LPT2 ;; | ||
| 1175 | JNE LPT2_MEM_DONE ;; | ||
| 1176 | ;; | ||
| 1177 | OR BUF.BFLAG,BF_MEM_DONE ;; | ||
| 1178 | ;; | ||
| 1179 | CMP BUF.STATE,CPSW ;; | ||
| 1180 | JNE LPT2_MEM_DONE ;; | ||
| 1181 | ;; | ||
| 1182 | XOR AX,AX ;; | ||
| 1183 | MOV MEM_REQUEST,AX ;; to set to zero only once for each | ||
| 1184 | ;; LPTn or PRN | ||
| 1185 | LPT2_MEM_DONE : ;; | ||
| 1186 | ;; | ||
| 1187 | JMP COMMON_INTR ;; common interrupt handler | ||
| 1188 | ;; | ||
| 1189 | INTERRUPT2 ENDP ;; | ||
| 1190 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1191 | ;; | ||
| 1192 | ;; LPT3 Device "interrupt" entry point | ||
| 1193 | ;; | ||
| 1194 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1195 | INTERRUPT3 PROC FAR ;; device interrupt entry point | ||
| 1196 | ;; | ||
| 1197 | PUSH DS ;; save all registers Revised | ||
| 1198 | PUSH ES ;; | ||
| 1199 | PUSH AX ;; | ||
| 1200 | PUSH BX ;; | ||
| 1201 | PUSH CX ;; | ||
| 1202 | PUSH DX ;; | ||
| 1203 | PUSH DI ;; | ||
| 1204 | PUSH SI ;; | ||
| 1205 | ;; BP isn't used, so it isn't saved | ||
| 1206 | push cs ;; | ||
| 1207 | pop ds ;; | ||
| 1208 | ;; | ||
| 1209 | CMP STACK_ALLOCATED,0AAH ;; | ||
| 1210 | JNE LPT3_NO_STACK ;; | ||
| 1211 | ;; | ||
| 1212 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1213 | ; | ||
| 1214 | ; STACK RECODING SEPT 28/86 | ||
| 1215 | ; | ||
| 1216 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1217 | MOV AX,STACK_SIZE ;G; | ||
| 1218 | SHL AX,1 ;G; | ||
| 1219 | SHL AX,1 ;G; | ||
| 1220 | SHL AX,1 ;G; | ||
| 1221 | SHL AX,1 ;G; | ||
| 1222 | MOV CS:TEMP_SI,SI ;G; | ||
| 1223 | MOV SI,RESIDENT_END ;G; | ||
| 1224 | SUB SI,STACK_SIZE ;G; | ||
| 1225 | ;G; | ||
| 1226 | mov reserved1,AX ;G; | ||
| 1227 | mov reserved2,SI ;G; | ||
| 1228 | ;G; | ||
| 1229 | CLI ;G; | ||
| 1230 | MOV DX,SS ;G; | ||
| 1231 | MOV CX,SP ;G; | ||
| 1232 | MOV SS,SI ;G; | ||
| 1233 | MOV SP,AX ;G; | ||
| 1234 | STI ;G; | ||
| 1235 | MOV SI,CS:TEMP_SI ;G; | ||
| 1236 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1237 | PUSH DX ;; SAVE OLD SS ONTO STACK | ||
| 1238 | PUSH CX ;; " " SP " " | ||
| 1239 | ;; | ||
| 1240 | LPT3_NO_STACK : ;; | ||
| 1241 | ;; | ||
| 1242 | MOV DI,OFFSET IRPT_CMD_EXIT ;; return addr from command processor | ||
| 1243 | ;; | ||
| 1244 | PUSH DI ;; push return address onto stack | ||
| 1245 | ;; command routine issues "RET" | ||
| 1246 | ;; | ||
| 1247 | LEA BX, BUF3 ;; LPT3 BUF = BUF3 , CS:BX | ||
| 1248 | ;; | ||
| 1249 | MOV MEM_REQUEST,-1 ;; to be set to zero only once | ||
| 1250 | ;; | ||
| 1251 | CMP BUF.BFLAG,-1 ;; | ||
| 1252 | JNE LPT3_INITED ;; | ||
| 1253 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1254 | MOV BUF.BFLAG,BF_LPT3 ;; INITIALIZE LPT3 BUFFER | ||
| 1255 | ;; | ||
| 1256 | MOV DI,OFFSET DEV_HDR3 ;; LPT3 Device header | ||
| 1257 | MOV BUF.DEV_HDRO,DI ;; | ||
| 1258 | MOV BUF.DEV_HDRS,CS ;; must be CS | ||
| 1259 | ;; | ||
| 1260 | MOV DI,OFFSET HBUF_SL3 ;; LPT3 buffer for Hardware-slots | ||
| 1261 | MOV BUF.HRBUFO,DI ;; | ||
| 1262 | ;; | ||
| 1263 | MOV DI,OFFSET RBUF_SL3 ;; LPT3 buffer for RAM-slots | ||
| 1264 | MOV BUF.RMBUFO,DI ;; | ||
| 1265 | ;; | ||
| 1266 | MOV DI,OFFSET FTDL_OFF3 ;; | ||
| 1267 | MOV BUF.FTDLO,DI ;; | ||
| 1268 | ;; | ||
| 1269 | ;; | ||
| 1270 | MOV DI,OFFSET REQ_NORM3 ;; LPT3 request header | ||
| 1271 | MOV BUF.RNORMO,DI ;; | ||
| 1272 | ;; | ||
| 1273 | MOV BUF.FSELEN,0 ;; selection control length | ||
| 1274 | ;; | ||
| 1275 | mov buf.prn_bufo,offset buf3;; | ||
| 1276 | ;; | ||
| 1277 | JMP COMMON_INTR ;; common interrupt handler | ||
| 1278 | ;; | ||
| 1279 | LPT3_INITED : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1280 | ;; FONT BUFFER TO BE CREATED ? | ||
| 1281 | CMP BUF.BFLAG,BF_LPT3 ;; | ||
| 1282 | JNE LPT3_MEM_DONE ;; | ||
| 1283 | ;; | ||
| 1284 | OR BUF.BFLAG,BF_MEM_DONE ;; no more next time | ||
| 1285 | ;; | ||
| 1286 | CMP BUF.STATE,CPSW ;; | ||
| 1287 | JNE LPT3_MEM_DONE ;; | ||
| 1288 | ;; | ||
| 1289 | XOR AX,AX ;; | ||
| 1290 | MOV MEM_REQUEST,AX ;; to set to zero only once for each | ||
| 1291 | ;; LPTn or PRN | ||
| 1292 | LPT3_MEM_DONE : ;; | ||
| 1293 | ;; | ||
| 1294 | JMP COMMON_INTR ;; common interrupt handler | ||
| 1295 | ;; | ||
| 1296 | INTERRUPT3 ENDP ;; | ||
| 1297 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1298 | ; | ||
| 1299 | ; Common interrupt entry : | ||
| 1300 | ; at entry, BUFn (CS:BX) of LPTn is defined | ||
| 1301 | ; | ||
| 1302 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1303 | COMMON_INTR : ;; | ||
| 1304 | CLD ;; all moves forward | ||
| 1305 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1306 | ; Check if header link has to be set | ||
| 1307 | ; | ||
| 1308 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1309 | LDS SI,DWORD PTR BUF.DEV_HDRO ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1310 | ;; device header : DS:[SI] | ||
| 1311 | CMP BUF.LPT_STRAO, -1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1312 | JNE DOSLPT_FOUND ;; has been linked to DOS LPTn | ||
| 1313 | CMP BUF.LPT_STRAS, -1 ;; | ||
| 1314 | JNE DOSLPT_FOUND ;; has been linked to DOS LPTn | ||
| 1315 | LDS SI,DWORD PTR BUF.DEV_HDRO ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1316 | ;; next device header : ES:[DI] | ||
| 1317 | LES DI,DWORD PTR HP.DH_NEXTO ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1318 | ;; | ||
| 1319 | PUSH ES ;; | ||
| 1320 | POP AX ;; | ||
| 1321 | AND AX,AX ;; | ||
| 1322 | JNZ L1 ;; | ||
| 1323 | JMP DOSLPT_FOUND ;; link not yet set up | ||
| 1324 | ;; | ||
| 1325 | ;$SEARCH WHILE ;; pointer to next device header is NOT | ||
| 1326 | L1: | ||
| 1327 | PUSH ES ;; -1 | ||
| 1328 | POP AX ;; | ||
| 1329 | CMP AX,-1 ;; | ||
| 1330 | ;$LEAVE E, AND ;; leave if both offset and segment are | ||
| 1331 | JNE NOT0FFFF | ||
| 1332 | |||
| 1333 | CMP DI,-1 ;; 0FFFFH | ||
| 1334 | ;$LEAVE E ;; | ||
| 1335 | JE L2 | ||
| 1336 | |||
| 1337 | NOT0FFFF: ;; | ||
| 1338 | PUSH DI ;; | ||
| 1339 | PUSH SI ;; | ||
| 1340 | MOV CX,NAME_LEN ;; | ||
| 1341 | LEA DI,NHD.DH_NAME ;; | ||
| 1342 | LEA SI,HP.DH_NAME ;; | ||
| 1343 | REPE CMPSB ;; | ||
| 1344 | POP SI ;; | ||
| 1345 | POP DI ;; | ||
| 1346 | AND CX,CX ;; | ||
| 1347 | |||
| 1348 | ;$EXITIF Z ;; exit if name is found in linked hd. | ||
| 1349 | JNZ L3 ;; name is not found | ||
| 1350 | ;; | ||
| 1351 | ;; name is found in the linked header | ||
| 1352 | MOV AX,NHD.DH_STRAO ;; get the STRATEGY address | ||
| 1353 | ; ADD AX,DI ;; | ||
| 1354 | MOV BUF.LPT_STRAO,AX ;; | ||
| 1355 | MOV AX,ES ;; | ||
| 1356 | ; JNC X1 ;; | ||
| 1357 | ; ADD AX,1000H ;; carrier overflow | ||
| 1358 | X1: MOV BUF.LPT_STRAS,AX ;; | ||
| 1359 | ;; | ||
| 1360 | MOV AX,NHD.DH_INTRO ;; get the INTERRUPT address | ||
| 1361 | ; ADD AX,DI ;; | ||
| 1362 | MOV BUF.LPT_INTRO,AX ;; | ||
| 1363 | MOV AX,ES ;; | ||
| 1364 | ; JNC X2 ;; | ||
| 1365 | ; ADD AX,1000H ;; carrier overflow | ||
| 1366 | X2: MOV BUF.LPT_INTRS,AX ;; | ||
| 1367 | ;; | ||
| 1368 | ;; | ||
| 1369 | ;$ORELSE ;; find next header to have the same | ||
| 1370 | ;; device name | ||
| 1371 | JMP L4 ;; | ||
| 1372 | L3: ;; | ||
| 1373 | LES DI,DWORD PTR NHD.DH_NEXTO ; | ||
| 1374 | ;; | ||
| 1375 | ;$ENDLOOP ;; | ||
| 1376 | JMP L1 ;; | ||
| 1377 | L2: ;; | ||
| 1378 | ;$ENDSRCH ;; | ||
| 1379 | L4: ;; | ||
| 1380 | ;; | ||
| 1381 | DOSLPT_FOUND : ;; device header link has been | ||
| 1382 | ;; established | ||
| 1383 | ;; | ||
| 1384 | ;; | ||
| 1385 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1386 | ; | ||
| 1387 | ; COMMAND REQUEST | ||
| 1388 | ; ES:DI Request Header , and | ||
| 1389 | ; | ||
| 1390 | ; CMD_CODES, GIO_CODES | ||
| 1391 | ; | ||
| 1392 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1393 | ;; | ||
| 1394 | ;; | ||
| 1395 | LES DI,dword ptr buf.rh_ptro ;; get RH address passed to | ||
| 1396 | ;; | ||
| 1397 | MOV AL,RH.RHC_CMD ;; | ||
| 1398 | CMP AL,CMD_GIO ;; | ||
| 1399 | JE GIO_COMMAND ;; | ||
| 1400 | ;; | ||
| 1401 | PUSH CS ;; non-GIO command | ||
| 1402 | POP ES ;; | ||
| 1403 | MOV DI,OFFSET CMD_CODES ;; | ||
| 1404 | MOV CX,CMD_INDX ;; | ||
| 1405 | ;; find if command is in CMD_CODES ? | ||
| 1406 | REPNE SCASB ;; | ||
| 1407 | JNE UN_SUP ;; | ||
| 1408 | MOV SI,CMD_INDX ;; the command is supported : | ||
| 1409 | SUB SI,CX ;; | ||
| 1410 | DEC SI ;; index to CASES | ||
| 1411 | JMP SUPPORTED ;; | ||
| 1412 | ;; | ||
| 1413 | UN_SUP: JMP NORM_DRIVER ;; to be handled by DOS normal driver | ||
| 1414 | ;; | ||
| 1415 | GIO_COMMAND : ;; Check if it is valid GIO | ||
| 1416 | ;; | ||
| 1417 | GIO_CASES : ;; supported GIO command | ||
| 1418 | MOV AL,RH.GIH_MIF ;; | ||
| 1419 | ;; use minor function to locate | ||
| 1420 | PUSH CS ;; | ||
| 1421 | POP ES ;; | ||
| 1422 | MOV DI,OFFSET GIO_CODES ;; | ||
| 1423 | MOV CX,GIO_INDX ;; | ||
| 1424 | ;; find if command is in GIO_CODES ? | ||
| 1425 | REPNE SCASB ;; | ||
| 1426 | JNE NORM_DRIVER ;; | ||
| 1427 | MOV SI,GIO_INDX ;; the command is supported : | ||
| 1428 | SUB SI,CX ;; | ||
| 1429 | DEC SI ;; index to CASES | ||
| 1430 | ADD SI,CMD_INDX ;; | ||
| 1431 | ;; | ||
| 1432 | SUPPORTED : ;; command/functions supported by LPTn | ||
| 1433 | ;; | ||
| 1434 | ADD SI,SI ;; double to index to WORD-offset | ||
| 1435 | ;; | ||
| 1436 | XOR AX,AX ;; initialize return to "no error" | ||
| 1437 | ;; | ||
| 1438 | LES DI,dword ptr buf.rh_ptro ;; get RH address again | ||
| 1439 | ;; | ||
| 1440 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1441 | ; At entry to command processing routine: | ||
| 1442 | ; | ||
| 1443 | ; ES:DI = Request Header address | ||
| 1444 | ; CS:BX = Buffer for lptn | ||
| 1445 | ; CS = code segment address | ||
| 1446 | ; AX = 0 | ||
| 1447 | ; | ||
| 1448 | ; top of stack is return address, IRPT_CMD_EXIT | ||
| 1449 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1450 | ;; | ||
| 1451 | JMP CS:CASES[SI] ;; call routine to handle the command | ||
| 1452 | ;; | ||
| 1453 | ;; | ||
| 1454 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1455 | ;; | ||
| 1456 | IRPT_CMD_EXIT: ;; return from command routine | ||
| 1457 | ;; AX = value to OR into status word | ||
| 1458 | LES DI,dword ptr buf.rh_ptro ;; restore ES:DI as Request Header ptr | ||
| 1459 | MOV AX,RH.RHC_STA ;; | ||
| 1460 | OR AH,STAT_DONE ;; add "done" bit to status word | ||
| 1461 | MOV RH.RHC_STA,AX ;; store status into request header | ||
| 1462 | ;; | ||
| 1463 | ;; | ||
| 1464 | ;; *** USING INTERNATL STACK ? *** | ||
| 1465 | ;; | ||
| 1466 | CMP STACK_ALLOCATED,-1 ;; | ||
| 1467 | JE RET0_NO_STACK ;; | ||
| 1468 | ;; | ||
| 1469 | CMP STACK_ALLOCATED,0 ;; | ||
| 1470 | JNE RET0_IN_STACK ;; | ||
| 1471 | ;; | ||
| 1472 | MOV STACK_ALLOCATED,0AAH ;; NEXT interrupt will start using | ||
| 1473 | JMP RET0_NO_STACK ;; internal STACK | ||
| 1474 | ;; | ||
| 1475 | RET0_IN_STACK : ;; use internal STACK !!!! | ||
| 1476 | POP CX ;get old SP from stack | ||
| 1477 | POP DX ;get old SS from stack | ||
| 1478 | CLI ;disable interrupts while changing SS:SP | ||
| 1479 | MOV SS,DX ;restore stack segment register | ||
| 1480 | MOV SP,CX ;restore stack pointer register | ||
| 1481 | STI ;enable interrupts | ||
| 1482 | ;; | ||
| 1483 | ;; | ||
| 1484 | RET0_NO_STACK : ;; | ||
| 1485 | ;; | ||
| 1486 | POP SI ;; restore registers | ||
| 1487 | POP DI ;; | ||
| 1488 | POP DX ;; | ||
| 1489 | POP CX ;; | ||
| 1490 | POP BX ;; | ||
| 1491 | POP AX ;; | ||
| 1492 | POP ES ;; | ||
| 1493 | POP DS ;; | ||
| 1494 | RET ;; | ||
| 1495 | ;; | ||
| 1496 | INTERRUPT0 ENDP ;; | ||
| 1497 | ;; | ||
| 1498 | ;; | ||
| 1499 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1500 | ;; | ||
| 1501 | ;;==== Command not supported by CPSW device driver | ||
| 1502 | ;; | ||
| 1503 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1504 | ;; | ||
| 1505 | NORM_DRIVER PROC ;; LPT OUTPUT to the DOS LPTn | ||
| 1506 | ;; | ||
| 1507 | PUSH BX ;; **** BUF. is changed **** | ||
| 1508 | PUSH BX ;; | ||
| 1509 | POP SI ;; | ||
| 1510 | LES BX,DWORD PTR BUF.RH_PTRO ;; pass the request header to the | ||
| 1511 | CALL DWORD PTR CS:[SI].LPT_STRAO ;; LPTn strategy routine. | ||
| 1512 | ;; | ||
| 1513 | POP BX ;; | ||
| 1514 | CALL DWORD PTR BUF.LPT_INTRO ;; interrupt the DOS LPTn | ||
| 1515 | RET ;; | ||
| 1516 | ;; | ||
| 1517 | NORM_DRIVER ENDP ;; | ||
| 1518 | ;; | ||
| 1519 | ;; | ||
| 1520 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1521 | ;; | ||
| 1522 | ;;==== Command Code - lpt_output ======= | ||
| 1523 | ;; | ||
| 1524 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1525 | ;; | ||
| 1526 | WRITE PROC ;; LPT OUTPUT to the DOS LPTn | ||
| 1527 | ;; | ||
| 1528 | ;; | ||
| 1529 | ;; | ||
| 1530 | LES DI,dword ptr buf.rh_ptro ;; restore ES:DI as Request Header ptr | ||
| 1531 | ;; | ||
| 1532 | MOV AX,BUF.STATE ;; | ||
| 1533 | CMP AX,NORMAL ;; | ||
| 1534 | JNE WRT_NOT_NORMAL ;; | ||
| 1535 | JMP WRT_NORMAL ;; | ||
| 1536 | ;; | ||
| 1537 | WRT_NOT_NORMAL : ;; | ||
| 1538 | CMP AX,DESG_END ;; | ||
| 1539 | JNE WRT_FONT ;; | ||
| 1540 | JMP NO_MORE_FTBLK ;; ignore the write | ||
| 1541 | ;; | ||
| 1542 | WRT_FONT : ;; | ||
| 1543 | CMP AX,DESG_WR ;; | ||
| 1544 | JE WRT_DESIGNATE ;; | ||
| 1545 | JMP WRT_NORMAL ;; | ||
| 1546 | ;;------------------------- | ||
| 1547 | WRT_DESIGNATE : ;; DESIGNATE WRITE | ||
| 1548 | MOV AX,BUF.STATUS ;; | ||
| 1549 | AND AX,FAIL ;; | ||
| 1550 | JZ WRT_DESG_GOOD ;; | ||
| 1551 | JMP WRT_IGNORE ;; already failed | ||
| 1552 | ;; | ||
| 1553 | WRT_DESG_GOOD : ;; | ||
| 1554 | MOV SI,OFFSET FTABLE ;; | ||
| 1555 | PUSH CS ;; | ||
| 1556 | POP DS ;; | ||
| 1557 | ;; | ||
| 1558 | MOV DS:[SI].FLAG,0 ;; no restart | ||
| 1559 | MOV AX,RH.RH3_CNT ;; | ||
| 1560 | MOV DS:[SI].BUFFER_LEN,AX ;; length of request packet | ||
| 1561 | ;; | ||
| 1562 | PUSH SI ;; | ||
| 1563 | LEA SI,[SI].BUFFER_ADDR ;; packet address | ||
| 1564 | MOV AX,RH.RH3_DTAO ;; | ||
| 1565 | MOV DS:[SI],AX ;; | ||
| 1566 | INC SI ;; | ||
| 1567 | INC SI ;; | ||
| 1568 | MOV AX,RH.RH3_DTAS ;; | ||
| 1569 | MOV DS:[SI],AX ;; | ||
| 1570 | POP SI ;; | ||
| 1571 | ;; | ||
| 1572 | FP_CALL : ;; ************************** | ||
| 1573 | CALL FONT_PARSER ;; ** Parse the Font File ** | ||
| 1574 | FP_RETURN : ;; ************************** | ||
| 1575 | ;; | ||
| 1576 | ;; -- only for the RAM slot -- | ||
| 1577 | ;; | ||
| 1578 | ;; PROCESS THE RETURNED FONT : | ||
| 1579 | ;; SI = FTABLE | ||
| 1580 | MOV ES,BUF.FTSTART ;; ES = the start of the font buffer, | ||
| 1581 | ;; its entry corresponds to the | ||
| 1582 | ;; positioning of codepage in slot | ||
| 1583 | MOV DI,BUF.FTSLOTO ;; DI = start of the slot of codepages | ||
| 1584 | ;; CX = slot size of the font downloaded | ||
| 1585 | MOV CX,BUF.RBUFMX ;; --- if there is no designate | ||
| 1586 | MOV AX,BUF.STATUS ;; | ||
| 1587 | AND AX,DSF_CARTCP ;; | ||
| 1588 | JZ CHECK_RETURN ;; | ||
| 1589 | MOV CX,BUF.HSLMX ;; -- with/without designate, <>0 | ||
| 1590 | ;; | ||
| 1591 | CHECK_RETURN : ;; | ||
| 1592 | ;; | ||
| 1593 | MOV DX,CS:[SI].NUM_FTBLK ;; DX = number fo code pages loaded | ||
| 1594 | ;; | ||
| 1595 | ADD SI,TYPE FBUFS ;; SI = points to FTBLK | ||
| 1596 | ;;................................... | ||
| 1597 | PARSE_FTBLK : ;; **** LOOP **** | ||
| 1598 | ;; | ||
| 1599 | ;; | ||
| 1600 | AND DX,DX ;; | ||
| 1601 | JNZ SKIP_SLOT ;; | ||
| 1602 | JMP NO_MORE_FTBLK ;; **** LOOP EXIT (FTBLK end) **** | ||
| 1603 | ;;................................... | ||
| 1604 | ;; **** LOOP (on each FTBLK) **** | ||
| 1605 | ;; | ||
| 1606 | ;; skip on the slot until the codepage | ||
| 1607 | SKIP_SLOT : ;; is one of the downloaded. | ||
| 1608 | AND CX,CX ;; | ||
| 1609 | JNZ LOCATE_SLOT ;; | ||
| 1610 | XOR AX,AX ;; | ||
| 1611 | PUSH AX ;; | ||
| 1612 | POP ES ;; ES = 0, no font storage(less buffer) | ||
| 1613 | JMP SLOT_FOUND ;; | ||
| 1614 | ;; | ||
| 1615 | LOCATE_SLOT: ;; | ||
| 1616 | MOV AX,CS:[DI].SLT_AT ;; | ||
| 1617 | AND AX,AT_load ;; | ||
| 1618 | Jnz SLOT_FOUND ;; | ||
| 1619 | INC DI ;;######## NEXT SLOT ############ | ||
| 1620 | INC DI ;; | ||
| 1621 | INC DI ;; | ||
| 1622 | INC DI ;; next slot | ||
| 1623 | PUSH ES ;; | ||
| 1624 | POP AX ;; | ||
| 1625 | ADD AX,BUF.FTSZPA ;; | ||
| 1626 | PUSH AX ;; | ||
| 1627 | POP ES ;; next buffer | ||
| 1628 | DEC CX ;;#################################### | ||
| 1629 | JMP SKIP_SLOT ;; | ||
| 1630 | ;; | ||
| 1631 | SLOT_FOUND : ;; | ||
| 1632 | MOV AX,CS:[SI].FTB_STATUS ;; | ||
| 1633 | CMP AX,0FFF0H ;; | ||
| 1634 | JNB CHECK_FSTAT ;; | ||
| 1635 | ;; | ||
| 1636 | OR BUF.STATUS,FAIL ;; | ||
| 1637 | ;; | ||
| 1638 | LES DI,dword ptr buf.rh_ptro ;; | ||
| 1639 | MOV RH.RHC_STA,AX ;; | ||
| 1640 | JMP WRITE_RET ;; **** LOOP EXIT (fail) **** | ||
| 1641 | ;; | ||
| 1642 | CHECK_FSTAT : ;; | ||
| 1643 | CMP AX,FSTAT_FONT ;; | ||
| 1644 | JNE NEXT_FTBLK ;; | ||
| 1645 | ;; | ||
| 1646 | MOV AX,CS:[SI].FTB_DLEN ;; | ||
| 1647 | AND AX,AX ;; | ||
| 1648 | JNZ FONT_RETURNED ;; | ||
| 1649 | ;; | ||
| 1650 | NEXT_FTBLK : ;; **** NEXT IN LOOP **** | ||
| 1651 | ;; | ||
| 1652 | ADD SI,TYPE FTBLK ;; SI = points to FTBLK | ||
| 1653 | DEC DX ;; | ||
| 1654 | INC DI ;;######## NEXT SLOT ############ | ||
| 1655 | INC DI ;; | ||
| 1656 | INC DI ;; | ||
| 1657 | INC DI ;; next slot | ||
| 1658 | PUSH ES ;; | ||
| 1659 | POP AX ;; | ||
| 1660 | ADD AX,BUF.FTSZPA ;; | ||
| 1661 | PUSH AX ;; | ||
| 1662 | POP ES ;; next buffer | ||
| 1663 | DEC CX ;;#################################### | ||
| 1664 | JMP PARSE_FTBLK ;; | ||
| 1665 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 1666 | FONT_RETURNED : ;; | ||
| 1667 | ;; ********************************* | ||
| 1668 | ;; * ANY SELECTION CONTROL TO BE * | ||
| 1669 | ;; * STORED ? * | ||
| 1670 | ;; ********************************* | ||
| 1671 | ;; | ||
| 1672 | ;; | ||
| 1673 | ;; SI = points to FTBLK | ||
| 1674 | ;; ES = font buffer segment / 0 | ||
| 1675 | ;; BX = LPT buffer | ||
| 1676 | ;; DI = SLOT pointer | ||
| 1677 | PUSH CX ;; | ||
| 1678 | ;; | ||
| 1679 | ;; | ||
| 1680 | MOV AX,CS:[SI].FTB_SELECT ;; | ||
| 1681 | AND AX,AX ;; | ||
| 1682 | JNZ SELECT_NOT0 ;; | ||
| 1683 | CMP BUF.PCLASS,1 ;; | ||
| 1684 | JNE SELECT_0 ;; | ||
| 1685 | JMP SELECT_BAD ;; CLASS 1 printer CANNOT have SELECT=0 | ||
| 1686 | ;; | ||
| 1687 | SELECT_0: ;; | ||
| 1688 | ;; | ||
| 1689 | POP CX ;; | ||
| 1690 | JMP STORE_FONT ;; | ||
| 1691 | ;; | ||
| 1692 | SELECT_NOT0 : ;; | ||
| 1693 | ;; | ||
| 1694 | CMP BUF.PCLASS,1 ;; | ||
| 1695 | JNE NOT_CLASS1 ;; | ||
| 1696 | JMP SELECT_CLASS1 ;; | ||
| 1697 | ;; | ||
| 1698 | not_class1 : ;; | ||
| 1699 | MOV AX,CS:[SI].FTB_SELLEN ;; has this FTBLK already passed the | ||
| 1700 | AND AX,AX ;; select ? | ||
| 1701 | JNZ SELECT_NOT_PASSED ;; | ||
| 1702 | ;; | ||
| 1703 | POP CX ;; | ||
| 1704 | JMP STORE_FONT ;; | ||
| 1705 | ;; | ||
| 1706 | SELECT_NOT_PASSED : ;; | ||
| 1707 | CMP AX,BUF.FSELMAX ;; | ||
| 1708 | JNA SELECT_NOT_LONG ;; | ||
| 1709 | JMP SELECT_BAD ;; cannot be more than buffer size | ||
| 1710 | ;; | ||
| 1711 | ;; | ||
| 1712 | SELECT_NOT_LONG : ;; | ||
| 1713 | MOV AX,CS:[SI].FTB_SELECT ;; | ||
| 1714 | CMP AX,1 ;; | ||
| 1715 | JE SELECT_1 ;; | ||
| 1716 | JMP SELECT_BAD ;; | ||
| 1717 | ;; | ||
| 1718 | SELECT_1 : ;; | ||
| 1719 | MOV CX,BUF.FSELEN ;; +++ SELECT = 1 +++ | ||
| 1720 | AND CX,CX ;; | ||
| 1721 | JZ CTL_NOT_COPIED ;; | ||
| 1722 | MOV AX,CS:[DI].SLT_AT ;; == copy control only from one FTBLK | ||
| 1723 | AND AX,AT_SELECT ;; | ||
| 1724 | JNZ CTL_NOT_COPIED ;; | ||
| 1725 | JMP SKIP_SELECT ;; | ||
| 1726 | ;; | ||
| 1727 | CTL_NOT_COPIED : ;; | ||
| 1728 | ;; | ||
| 1729 | OR CS:[DI].SLT_AT,AT_SELECT;; the FTBLK where control is copied | ||
| 1730 | ;; from | ||
| 1731 | ;; | ||
| 1732 | MOV CX,CS:[SI].FTB_SELLEN ;; | ||
| 1733 | CMP CX,CS:[SI].FTB_DLEN ;; | ||
| 1734 | JNA STORE_SELECT ;; | ||
| 1735 | ;; | ||
| 1736 | MOV CX,CS:[SI].FTB_DLEN ;; | ||
| 1737 | ;; | ||
| 1738 | STORE_SELECT: ;; | ||
| 1739 | PUSH CX ;; CX is the length to be copied. | ||
| 1740 | ;; | ||
| 1741 | PUSH ES ;; | ||
| 1742 | PUSH DS ;; | ||
| 1743 | PUSH SI ;; | ||
| 1744 | PUSH DI ;; | ||
| 1745 | ;; | ||
| 1746 | MOV AX,CS:[SI].FTB_DAHI ;; | ||
| 1747 | PUSH AX ;; | ||
| 1748 | POP DS ;; | ||
| 1749 | MOV SI,CS:[SI].FTB_DALO ;; | ||
| 1750 | ;; | ||
| 1751 | PUSH CS ;; | ||
| 1752 | POP ES ;; | ||
| 1753 | ;; | ||
| 1754 | MOV DI,BUF.PDESCO ;; | ||
| 1755 | MOV DI,CS:[DI].SELB_O ;; | ||
| 1756 | ADD DI,BUF.FSELEN ;; | ||
| 1757 | ;; | ||
| 1758 | REP MOVSB ;; | ||
| 1759 | ;; | ||
| 1760 | ;; | ||
| 1761 | POP DI ;; | ||
| 1762 | POP SI ;; | ||
| 1763 | POP DS ;; | ||
| 1764 | POP ES ;; | ||
| 1765 | ;; | ||
| 1766 | POP CX ;; | ||
| 1767 | SUB CS:[SI].FTB_DLEN,CX ;; | ||
| 1768 | SUB CS:[SI].FTB_SELLEN,CX ;; == less control bytes to be copied | ||
| 1769 | ADD CS:[SI].FTB_DALO,CX ;; | ||
| 1770 | ADD BUF.FSELEN,CX ;; | ||
| 1771 | ;; | ||
| 1772 | POP CX ;; | ||
| 1773 | ;; | ||
| 1774 | ;; any data left for font ? | ||
| 1775 | CMP BUF.PCLASS,1 ;; | ||
| 1776 | JNE MORE_FONT ;; | ||
| 1777 | ;; | ||
| 1778 | JMP NEXT_FTBLK ;; == CLASS 1 printer ingnores fonts | ||
| 1779 | ;; | ||
| 1780 | MORE_FONT : ;; more font data ? | ||
| 1781 | ;; | ||
| 1782 | JMP STORE_FONT ;; | ||
| 1783 | ;; | ||
| 1784 | SELECT_CLASS1: ;; +++ PRINTER CLASS = 1 | ||
| 1785 | ;; | ||
| 1786 | MOV AX,CS:[SI].FTB_SELECT ;; | ||
| 1787 | CMP AX,2 ;; | ||
| 1788 | JE GOOD_CLASS1 ;; | ||
| 1789 | JMP SELECT_BAD ;; | ||
| 1790 | ;; select type = 2 only | ||
| 1791 | GOOD_CLASS1 : ;; | ||
| 1792 | POP CX ;; | ||
| 1793 | ;; | ||
| 1794 | PUSH ES ;; STACKS... | ||
| 1795 | PUSH DX ;; | ||
| 1796 | PUSH DI ;; | ||
| 1797 | MOV AX,DI ;; | ||
| 1798 | SUB AX,BUF.FTSLOTO ;; | ||
| 1799 | SHR AX,1 ;; | ||
| 1800 | PUSH AX ;; stack 1 -- offest | ||
| 1801 | MOV DI,BUF.FTDLO ;; | ||
| 1802 | ADD DI,AX ;; | ||
| 1803 | ;; | ||
| 1804 | MOV AX,CS:WORD PTR [DI] ;; length copied to font buffer | ||
| 1805 | ;; | ||
| 1806 | POP DX ;; stack -1 | ||
| 1807 | SHR DX,1 ;; | ||
| 1808 | PUSH DI ;; STACK +1 -- to font buffer length | ||
| 1809 | MOV DI,BUF.FTSTART ;; | ||
| 1810 | CTL_ADDR : ;; | ||
| 1811 | AND DX,DX ;; | ||
| 1812 | JZ CTL_LOCATED ;; | ||
| 1813 | ADD DI,BUF.FTSZPA ;; | ||
| 1814 | DEC DX ;; | ||
| 1815 | JNZ CTL_ADDR ;; | ||
| 1816 | ;; | ||
| 1817 | CTL_LOCATED : ;; | ||
| 1818 | PUSH DI ;; | ||
| 1819 | POP ES ;; | ||
| 1820 | XOR DI,DI ;; start of the font buffer | ||
| 1821 | MOV CX,CS:[SI].FTB_SELLEN ;; | ||
| 1822 | AND AX,AX ;; | ||
| 1823 | JNZ HASBEEN_COPIED ;; | ||
| 1824 | MOV ES:BYTE PTR [DI],CL ;; 1st byte is the length | ||
| 1825 | INC AX ;; | ||
| 1826 | ;; | ||
| 1827 | HASBEEN_COPIED : ;; | ||
| 1828 | ;; | ||
| 1829 | ADD DI,AX ;; | ||
| 1830 | DEC AX ;; | ||
| 1831 | CMP AX,CX ;; all copied ? | ||
| 1832 | JB COPY_SELECT ;; | ||
| 1833 | ;; | ||
| 1834 | POP DI ;; STACK -1 | ||
| 1835 | ;; | ||
| 1836 | POP DI ;; STACKS... | ||
| 1837 | POP DX ;; | ||
| 1838 | POP ES ;; | ||
| 1839 | MOV CX,CS:[SI].FTB_DLEN ;; all font data for this code page is | ||
| 1840 | SUB CS:[SI].FTB_DLEN,CX ;; discarded | ||
| 1841 | ADD CS:[SI].FTB_DALO,CX ;; | ||
| 1842 | ;; | ||
| 1843 | JMP NEXT_FTBLK ;; | ||
| 1844 | ;; | ||
| 1845 | COPY_SELECT : ;; | ||
| 1846 | ;; | ||
| 1847 | SUB CX,AX ;; | ||
| 1848 | CMP CX,CS:[SI].FTB_DLEN ;; | ||
| 1849 | JNA FONT_SELECT ;; | ||
| 1850 | ;; | ||
| 1851 | MOV CX,CS:[SI].FTB_DLEN ;; | ||
| 1852 | ;; | ||
| 1853 | FONT_SELECT : ;; | ||
| 1854 | ;; | ||
| 1855 | PUSH CX ;; STACK +2 | ||
| 1856 | ;; | ||
| 1857 | PUSH DS ;; STACK +3 | ||
| 1858 | PUSH SI ;; STACK +4 | ||
| 1859 | ;; | ||
| 1860 | MOV AX,CS:[SI].FTB_DAHI ;; | ||
| 1861 | PUSH AX ;; | ||
| 1862 | POP DS ;; | ||
| 1863 | MOV SI,CS:[SI].FTB_DALO ;; | ||
| 1864 | ;; | ||
| 1865 | PUSH DI ;; STACK +5 | ||
| 1866 | ;; | ||
| 1867 | REP MOVSB ;; | ||
| 1868 | ;; | ||
| 1869 | POP DI ;; STACK -5 | ||
| 1870 | POP SI ;; STACK -4 | ||
| 1871 | POP DS ;; STACK -3 | ||
| 1872 | ;; | ||
| 1873 | POP CX ;; STACK -2 | ||
| 1874 | ADD CX,DI ;; | ||
| 1875 | POP DI ;; STACK -1 | ||
| 1876 | MOV CS:WORD PTR [DI],CX ;; | ||
| 1877 | ;; | ||
| 1878 | MOV CX,CS:[SI].FTB_DLEN ;; all font data for this code page is | ||
| 1879 | SUB CS:[SI].FTB_DLEN,CX ;; discarded | ||
| 1880 | ADD CS:[SI].FTB_DALO,CX ;; | ||
| 1881 | ;; | ||
| 1882 | POP DI ;; | ||
| 1883 | POP DX ;; | ||
| 1884 | POP ES ;; | ||
| 1885 | ;; | ||
| 1886 | JMP NEXT_FTBLK ;; | ||
| 1887 | ;; | ||
| 1888 | ;; | ||
| 1889 | SKIP_SELECT : ;; ++ SKIP SELECT ++ | ||
| 1890 | ;; | ||
| 1891 | MOV CX,CS:[SI].FTB_SELLEN ;; | ||
| 1892 | CMP CX,CS:[SI].FTB_DLEN ;; | ||
| 1893 | JNA SKIP_ALL_SELLEN ;; | ||
| 1894 | MOV CX,CS:[SI].FTB_DLEN ;; | ||
| 1895 | ;; | ||
| 1896 | SKIP_ALL_SELLEN : ;; | ||
| 1897 | SUB CS:[SI].FTB_DLEN,CX ;; | ||
| 1898 | SUB CS:[SI].FTB_SELLEN,CX ;; == less control bytes to be skipped | ||
| 1899 | ADD CS:[SI].FTB_DALO,CX ;; | ||
| 1900 | ;; | ||
| 1901 | POP CX ;; | ||
| 1902 | JMP STORE_FONT ;; | ||
| 1903 | ;; | ||
| 1904 | SELECT_BAD : ;; ++ BAD SELECT ++ | ||
| 1905 | ;; | ||
| 1906 | POP CX ;; | ||
| 1907 | ;; | ||
| 1908 | LES DI,dword ptr buf.rh_ptro ;; | ||
| 1909 | MOV RH.RHC_STA,STAT_BADATA ;; | ||
| 1910 | ;; | ||
| 1911 | OR BUF.STATUS,FAIL ;; | ||
| 1912 | ;; | ||
| 1913 | JMP WRITE_RET ;; | ||
| 1914 | ;; | ||
| 1915 | ;; | ||
| 1916 | ;; ************************************* | ||
| 1917 | ;; * FONT TO BE STORED OR DOWNLOADED ? * | ||
| 1918 | ;; ************************************* | ||
| 1919 | ;; | ||
| 1920 | ;; SI = points to FTBLK | ||
| 1921 | ;; ES = font buffer segment / 0 | ||
| 1922 | ;; BX = LPT buffer | ||
| 1923 | ;; DI = SLOT pointer | ||
| 1924 | STORE_FONT : ;; | ||
| 1925 | ;; | ||
| 1926 | CMP CS:[SI].FTB_DLEN,0 ;; any font data left ? | ||
| 1927 | JNZ HAS_FONT_DATA ;; | ||
| 1928 | JMP NEXT_FTBLK ;; | ||
| 1929 | ;; | ||
| 1930 | HAS_FONT_DATA : ;; | ||
| 1931 | PUSH ES ;; | ||
| 1932 | POP AX ;; | ||
| 1933 | AND AX,AX ;; | ||
| 1934 | JNZ STORE_FONT_BUFFER ;; | ||
| 1935 | JMP FONT_DOWNLOAD ;; | ||
| 1936 | ;; | ||
| 1937 | ;; | ||
| 1938 | ;; | ||
| 1939 | STORE_FONT_BUFFER : ;; ***************************** | ||
| 1940 | PUSH DI ;; ** STORE TO FONT BUFFER ** | ||
| 1941 | ;; ***************************** | ||
| 1942 | PUSH CX ;; | ||
| 1943 | PUSH DS ;; ES = font buffer segment | ||
| 1944 | ;; | ||
| 1945 | ;; -- determine where is the infor : | ||
| 1946 | MOV AX,DI ;; | ||
| 1947 | SUB AX,BUF.FTSLOTO ;; relative to the start of the slot | ||
| 1948 | SHR AX,1 ;; '' '' '' " of FTDL_OFF | ||
| 1949 | ;; | ||
| 1950 | ;; | ||
| 1951 | ADD AX,BUF.FTDLO ;; | ||
| 1952 | MOV DI,AX ;; | ||
| 1953 | ;; | ||
| 1954 | ;;................................... | ||
| 1955 | MOV CX,CS:[SI].FTB_DLEN ;; length of font data | ||
| 1956 | ;; | ||
| 1957 | MOV AX,CS:WORD PTR [DI] ;; current destination | ||
| 1958 | ;; | ||
| 1959 | ADD AX,CX ;; | ||
| 1960 | PUSH AX ;; STACK A (next destination) | ||
| 1961 | ;; | ||
| 1962 | ADD AX,CS:[SI].FTB_DLEFT ;; enough room in font buffer ? | ||
| 1963 | CMP AX,BUF.FTSIZE ;; | ||
| 1964 | JNA ROOM_FOR_FONT ;; | ||
| 1965 | ;; | ||
| 1966 | POP AX ;; STACK A | ||
| 1967 | POP DS ;; | ||
| 1968 | POP CX ;; **** LOOP EXIT (no room) **** | ||
| 1969 | POP DI ;; | ||
| 1970 | ;; | ||
| 1971 | LES DI,dword ptr buf.rh_ptro ;; | ||
| 1972 | MOV RH.RHC_STA,STAT_BADATA ;; | ||
| 1973 | ;; | ||
| 1974 | OR BUF.STATUS,FAIL ;; | ||
| 1975 | ;; | ||
| 1976 | JMP WRITE_RET ;; | ||
| 1977 | ;; | ||
| 1978 | ROOM_FOR_FONT : ;; | ||
| 1979 | ;; | ||
| 1980 | PUSH DI ;; STACK B | ||
| 1981 | ;; | ||
| 1982 | MOV DI,CS:WORD PTR [DI] ;; current destination | ||
| 1983 | ;; | ||
| 1984 | PUSH SI ;; STACK C | ||
| 1985 | PUSH DS ;; STACK D | ||
| 1986 | ;; | ||
| 1987 | MOV AX,CS:[SI].FTB_DAHI ;; | ||
| 1988 | PUSH AX ;; | ||
| 1989 | POP DS ;; source : FTB_DA | ||
| 1990 | MOV SI,CS:[SI].FTB_DALO ;; | ||
| 1991 | ;; | ||
| 1992 | REP MOVSB ;; | ||
| 1993 | ;; | ||
| 1994 | POP DS ;; STACK D | ||
| 1995 | POP SI ;; STACK C | ||
| 1996 | POP DI ;; STACK B | ||
| 1997 | POP AX ;; STACK A | ||
| 1998 | MOV CS:WORD PTR [DI],AX ;; next detination/current length | ||
| 1999 | ;; | ||
| 2000 | POP DS ;; | ||
| 2001 | POP CX ;; | ||
| 2002 | POP DI ;; | ||
| 2003 | ;; | ||
| 2004 | OR CS:[DI].SLT_AT,AT_FONT ;; font buffer has been overwritten | ||
| 2005 | ;; | ||
| 2006 | JMP NEXT_FTBLK ;; | ||
| 2007 | ;; | ||
| 2008 | FONT_DOWNLOAD : ;; *********************************** | ||
| 2009 | ;; * DOWNLOAD FONT TO THE DEVICE : * | ||
| 2010 | PUSH ES ;; *********************************** | ||
| 2011 | PUSH DI ;; | ||
| 2012 | LES DI,dword ptr buf.rh_ptro ;; -- the logic can only support one | ||
| 2013 | ;; physical device slot that can be | ||
| 2014 | ;; downloaded.) | ||
| 2015 | MOV AX,CS:[SI].FTB_DLEN ;; | ||
| 2016 | MOV RH.RH3_CNT,AX ;; | ||
| 2017 | MOV AX,CS:[SI].FTB_DALO ;; | ||
| 2018 | MOV RH.RH3_DTAO,AX ;; | ||
| 2019 | MOV AX,CS:[SI].FTB_DAHI ;; | ||
| 2020 | MOV RH.RH3_DTAS,AX ;; | ||
| 2021 | ;; | ||
| 2022 | MOV RH.RHC_CMD,CMD_WRT ;; 06/25 MODE.COM | ||
| 2023 | ;; | ||
| 2024 | PUSH SI ;; | ||
| 2025 | PUSH ES ;; | ||
| 2026 | PUSH BX ;; **** BUF. is changed **** | ||
| 2027 | PUSH BX ;; | ||
| 2028 | POP SI ;; | ||
| 2029 | LES BX,DWORD PTR BUF.RH_PTRO ;; pass the request header to the | ||
| 2030 | ;; | ||
| 2031 | FDL_CALL_STR : ;; | ||
| 2032 | CALL DWORD PTR CS:[SI].LPT_STRAO ;; LPTn strategy routine. | ||
| 2033 | POP BX ;; | ||
| 2034 | POP ES ;; | ||
| 2035 | POP SI ;; | ||
| 2036 | ;; | ||
| 2037 | FDL_CALL_ITR : ;; | ||
| 2038 | CALL DWORD PTR BUF.LPT_INTRO ;; interrupt the DOS LPTn | ||
| 2039 | ;; | ||
| 2040 | FDL_ITR_RETURN : ;; | ||
| 2041 | MOV AX,rh.RHC_STA ;; | ||
| 2042 | ;; | ||
| 2043 | and ax,stat_error ;; | ||
| 2044 | jz fdl_good1 ;; | ||
| 2045 | mov ax,stat_deverr ;; | ||
| 2046 | mov rh.rhc_sta,ax ;; | ||
| 2047 | ;; | ||
| 2048 | fdl_good1 : ;; | ||
| 2049 | POP DI ;; | ||
| 2050 | POP ES ;; | ||
| 2051 | ;; | ||
| 2052 | AND AX,STAT_ERROR ;; any error returned by normal device? | ||
| 2053 | JNZ FDL_BAD ;; | ||
| 2054 | OR CS:[DI].SLT_AT,AT_RAM1 ;; | ||
| 2055 | JMP NEXT_FTBLK ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 2056 | ;; | ||
| 2057 | FDL_BAD : ;; **** LOOP EXIT (bad) **** | ||
| 2058 | OR BUF.STATUS,FAIL ;; | ||
| 2059 | ;; | ||
| 2060 | JMP WRITE_RET ;; | ||
| 2061 | ;; | ||
| 2062 | WRT_NORMAL : ;; | ||
| 2063 | ;; | ||
| 2064 | JMP NORM_DRIVER ;; | ||
| 2065 | ;; | ||
| 2066 | WRT_ignore : ;; | ||
| 2067 | ;; | ||
| 2068 | LES DI,dword ptr buf.rh_ptro ;; | ||
| 2069 | MOV RH.RHC_STA,STAT_DEVERR ;; | ||
| 2070 | JMP WRITE_RET ;; | ||
| 2071 | ;; | ||
| 2072 | NO_MORE_FTBLK : ;; | ||
| 2073 | ;; | ||
| 2074 | LES DI,dword ptr buf.rh_ptro ;; | ||
| 2075 | MOV RH.RHC_STA,0 ;; | ||
| 2076 | ;; | ||
| 2077 | WRITE_RET : ;; | ||
| 2078 | RET ;; | ||
| 2079 | ;; | ||
| 2080 | WRITE ENDP ;; | ||
| 2081 | ;; | ||
| 2082 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 2083 | ;; | ||
| 2084 | ;;==== Generic IOCTL Designate Start ====== | ||
| 2085 | ;; | ||
| 2086 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 2087 | DESIGNATE_START PROC ;; | ||
| 2088 | MOV AX,BUF.STATE ;; | ||
| 2089 | CMP AX,NORMAL ;; | ||
| 2090 | JNE DS_00 ;G; ALL OF THESE EXTRA JUMPS ARE | ||
| 2091 | JMP DST_NORMAL ;; DUE TO SIZE OF FOLLOWING CODE!!!!! | ||
| 2092 | DS_00: CMP AX,CPSW ;; WGR ;AN000; | ||
| 2093 | JE DS_01 ;G; | ||
| 2094 | CMP AX,LOCKED ;; WGR ;AN000; | ||
| 2095 | JE DS_03 ;; WGR ;AN000; | ||
| 2096 | JMP DST_CMDERR ;G; | ||
| 2097 | |||
| 2098 | DS_01: CALL CHECK_PRINT_ACTIVE ;G; THIS WILL FIND OUT IF THE | ||
| 2099 | JNC DS_02 ;G; | ||
| 2100 | DS_03: ;; WGR ;AN000; | ||
| 2101 | JMP DST_DEVERR ;G; PRINT.COM IS ACTIVE, CY=1 MEANS YES | ||
| 2102 | ;G; | ||
| 2103 | DS_02: LDS SI,RH.GIH_GBA ;; GIOB = DS:[SI] | ||
| 2104 | MOV AX,GIOB.GB1_FLAG ;; | ||
| 2105 | AND AX,DSF_CARTCP ;; | ||
| 2106 | JNZ dst_deverr ;; DO NOT SUPPORT CARTRIDGE FLAG !!!! | ||
| 2107 | ;; | ||
| 2108 | ;; ****************************** | ||
| 2109 | ;; ** DESIGNATE / REFRESH ? ** | ||
| 2110 | ;; ****************************** | ||
| 2111 | ;; check the LENGTH in BUFFER1 | ||
| 2112 | ;; | ||
| 2113 | MOV CX,GIOB.GB1_LEN ;; | ||
| 2114 | AND CX,CX ;; | ||
| 2115 | JNZ DST_NOT_NULL ;; | ||
| 2116 | ;; | ||
| 2117 | mov cs:init_chk,0fefeh ;; | ||
| 2118 | ;; | ||
| 2119 | JMP DST_REFRESH ;; null lenght ==> refresh | ||
| 2120 | ;; | ||
| 2121 | DST_NOT_NULL : ;; | ||
| 2122 | MOV AX,CX ;; | ||
| 2123 | SHR AX,1 ;; divide by 2 | ||
| 2124 | MOV CX,AX ;; | ||
| 2125 | MOV AX,STAT_CMDERR ;; error if LEN < 2 | ||
| 2126 | AND CX,CX ;; | ||
| 2127 | JZ DST_RET ;; | ||
| 2128 | DEC CX ;; | ||
| 2129 | JNZ NO_REFRESH ;; | ||
| 2130 | ;; | ||
| 2131 | MOV AX,GIOB.GB1_NUM ;; | ||
| 2132 | AND AX,AX ;; | ||
| 2133 | MOV AX,STAT_BADATA ;; | ||
| 2134 | JNZ DST_RET ;; error, as no code pages followed | ||
| 2135 | ;; | ||
| 2136 | mov cs:init_chk,0ffeeh ;; | ||
| 2137 | ;; | ||
| 2138 | ;; | ||
| 2139 | JMP DST_REFRESH ;; null length => REFRESH font from | ||
| 2140 | ;; font buffer to device | ||
| 2141 | ;; ********************************* | ||
| 2142 | ;; ** DESIGNATE FOR CARTRIDGE ? ** | ||
| 2143 | NO_REFRESH : ;; ********************************* | ||
| 2144 | ;; CX = number of codepages designated | ||
| 2145 | CMP BUF.PCLASS,1 ;; CLASS 1 Printer ? | ||
| 2146 | JNE DST_RAM ;; | ||
| 2147 | JMP DST_CART ;; | ||
| 2148 | ;; | ||
| 2149 | DST_RAM : ;; | ||
| 2150 | ;; | ||
| 2151 | MOV AX,DSF_CARTCP ;; RAM-code pages | ||
| 2152 | NOT AX ;; | ||
| 2153 | AND BUF.STATUS,AX ;; not CARTCP | ||
| 2154 | MOV DI,BUF.RMBUFO ;; DI | ||
| 2155 | MOV DX,BUF.RSLMX ;; DX = number of designate allowed | ||
| 2156 | ;; (limited by available slots) | ||
| 2157 | MOV AX,STAT_TOMANY ;; | ||
| 2158 | CMP CX,DX ;; more codepages than supported ? | ||
| 2159 | JA DST_RET ;; | ||
| 2160 | ;; | ||
| 2161 | JMP DST_DESIGNATE ;; | ||
| 2162 | ;; | ||
| 2163 | DST_NORMAL : ;; | ||
| 2164 | push cs ;; | ||
| 2165 | pop ds ;; | ||
| 2166 | JMP NORM_DRIVER ;; | ||
| 2167 | ;; | ||
| 2168 | DST_DEVERR : ;; | ||
| 2169 | MOV AX,STAT_DEVERR ;; | ||
| 2170 | JMP DST_RET ;G; | ||
| 2171 | ;; | ||
| 2172 | DST_CMDERR : ;G; | ||
| 2173 | MOV AX,STAT_CMDERR ;G; | ||
| 2174 | DST_RET : ;; | ||
| 2175 | JMP DST_RETURN ;; | ||
| 2176 | ;; | ||
| 2177 | DST_CART: ;; | ||
| 2178 | MOV AX,DSF_CARTCP ;; Hardware code pages | ||
| 2179 | OR BUF.STATUS,AX ;; | ||
| 2180 | MOV DI,BUF.HRBUFO ;; DI | ||
| 2181 | MOV DX,BUF.HSLMX ;; DX = number of slots available | ||
| 2182 | MOV AX,DX ;; | ||
| 2183 | SUB AX,BUF.HARDMX ;; no. of designate allowed | ||
| 2184 | ;; | ||
| 2185 | CMP CX,AX ;; more codepages than supported ? | ||
| 2186 | MOV AX,STAT_TOMANY ;; | ||
| 2187 | JA DST_RET ;; | ||
| 2188 | ;;--------------------------------------------------------------------------- | ||
| 2189 | ;; ************************************* | ||
| 2190 | DST_DESIGNATE : ;; * any duplicated codepages in MODE ?* | ||
| 2191 | ;; * define the slot-buffer * | ||
| 2192 | ;; ************************************* | ||
| 2193 | ;; | ||
| 2194 | ;; -- Use the buffer to hold the code | ||
| 2195 | ;; page value in the MODE with the | ||
| 2196 | ;; position correspondence : | ||
| 2197 | ;; 1. reset the buffer to all 0FFFFH | ||
| 2198 | ;; 2. if the code page in MODE does not | ||
| 2199 | ;; replicate with any in the buffer, | ||
| 2200 | ;; then store the code page value in | ||
| 2201 | ;; the buffer. | ||
| 2202 | ;; 3. proceed to the next code page in | ||
| 2203 | ;; the MODE to check with what is | ||
| 2204 | ;; already copied to the buffer. | ||
| 2205 | ;; 4. designate will fail if there is a | ||
| 2206 | ;; replication : i.e. a repetition | ||
| 2207 | ;; in the MODE command. | ||
| 2208 | ;; 5. skip the buffer corresponding to | ||
| 2209 | ;; HWCP codepages | ||
| 2210 | ;;------------------------------------- | ||
| 2211 | ;; | ||
| 2212 | PUSH DI ;; (the start of RAM/Hardware buffer) | ||
| 2213 | PUSH DX ;; count of buffer size | ||
| 2214 | MOV AX,0FFFFH ;; | ||
| 2215 | RESET_BUF: ;; | ||
| 2216 | MOV CS:[DI],AX ;; reset all buffer to 0FFFFH | ||
| 2217 | INC DI ;; | ||
| 2218 | INC DI ;; | ||
| 2219 | DEC DX ;; | ||
| 2220 | JNZ RESET_BUF ;; | ||
| 2221 | POP DX ;; | ||
| 2222 | POP DI ;; | ||
| 2223 | ;; | ||
| 2224 | PUSH BX ;; | ||
| 2225 | PUSH DI ;; (the start of RAM/Hardware buffer) | ||
| 2226 | PUSH DX ;; count of buffer size | ||
| 2227 | PUSH SI ;; first code page in GB1 | ||
| 2228 | PUSH CX ;; number of codepages in GB1 | ||
| 2229 | ;; | ||
| 2230 | PUSH SI ;; | ||
| 2231 | ;; | ||
| 2232 | MOV AX,BUF.STATUS ;; | ||
| 2233 | AND AX,DSF_CARTCP ;; | ||
| 2234 | JZ FILL_BUFFER ;; | ||
| 2235 | ;; for cartridge designation | ||
| 2236 | MOV SI,BUF.HARDSO ;; | ||
| 2237 | SKIP_HWCP: ;; | ||
| 2238 | MOV AX,CS:[SI].SLT_AT ;; | ||
| 2239 | AND AX,AT_HWCP ;; | ||
| 2240 | JZ FILL_BUFFER ;; | ||
| 2241 | INC SI ;; skip the hwcp slots, they cannot be | ||
| 2242 | INC SI ;; designated | ||
| 2243 | INC SI ;; | ||
| 2244 | INC SI ;; | ||
| 2245 | INC DI ;; | ||
| 2246 | INC DI ;; | ||
| 2247 | JMP SKIP_HWCP ;; | ||
| 2248 | ;; | ||
| 2249 | FILL_BUFFER : ;; | ||
| 2250 | ;; | ||
| 2251 | POP SI ;; | ||
| 2252 | ;; | ||
| 2253 | PUSH DI ;; | ||
| 2254 | POP BX ;; BX = the positioned buffer | ||
| 2255 | ;; | ||
| 2256 | DST_BUFLP : ;; **** LOOP **** | ||
| 2257 | MOV AX,GIOB.GB1_CP ;; (use GIOB only for codepages) | ||
| 2258 | CMP AX,0FFFFH ;; | ||
| 2259 | JZ DST_BUFNXT ;; | ||
| 2260 | ;; | ||
| 2261 | PUSH CX ;; | ||
| 2262 | ;; compare code page with SLOT-BUFFER | ||
| 2263 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 2264 | ;; SCAN THE BUFFER FOR DUPLICATION | ||
| 2265 | PUSH DX ;; | ||
| 2266 | POP CX ;; no. of buffer entries | ||
| 2267 | ;; | ||
| 2268 | PUSH ES ;; | ||
| 2269 | PUSH DI ;; | ||
| 2270 | PUSH CS ;; | ||
| 2271 | POP ES ;; | ||
| 2272 | REPNE SCASW ;; scan codepage vs. buffer | ||
| 2273 | POP DI ;; | ||
| 2274 | POP ES ;; | ||
| 2275 | ;; | ||
| 2276 | POP CX ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 2277 | ;; | ||
| 2278 | JNE BUF_DEFINE ;; | ||
| 2279 | ;; | ||
| 2280 | ;; **** EXIT FROM LOOP **** | ||
| 2281 | ;; | ||
| 2282 | POP CX ;; number of codepages in GB1 | ||
| 2283 | POP SI ;; first code page in GB1 | ||
| 2284 | POP DX ;; count of buffer size | ||
| 2285 | POP DI ;; (the start of RAM/Hardware buffer) | ||
| 2286 | POP BX ;; | ||
| 2287 | ;; | ||
| 2288 | MOV AX,STAT_DUPLCP ;; Duplicated code page | ||
| 2289 | JMP DST_RETURN ;; | ||
| 2290 | ;; | ||
| 2291 | ;; | ||
| 2292 | BUF_DEFINE : ;; | ||
| 2293 | MOV CS:[BX],AX ;; no duplicated cp in MODE list | ||
| 2294 | ;; | ||
| 2295 | ;; | ||
| 2296 | ;; **** NEXT IN LOOP **** | ||
| 2297 | DST_BUFNXT: ;; | ||
| 2298 | INC SI ;; (use GIOB only for codepages) | ||
| 2299 | INC SI ;; | ||
| 2300 | INC BX ;; | ||
| 2301 | INC BX ;; | ||
| 2302 | XOR AX,AX ;; | ||
| 2303 | DEC CX ;; | ||
| 2304 | JNZ DST_BUFLP ;; | ||
| 2305 | ;; | ||
| 2306 | ;; | ||
| 2307 | POP CX ;; number of codepages in GB1 | ||
| 2308 | POP SI ;; first code page in GB1 | ||
| 2309 | POP DX ;; count of buffer size | ||
| 2310 | POP DI ;; (the start of RAM/Hardware buffer) | ||
| 2311 | POP BX ;; | ||
| 2312 | ;; | ||
| 2313 | ;; | ||
| 2314 | ;;----------------------------------------------------------------------------- | ||
| 2315 | ;;************************************* | ||
| 2316 | ;;* any duplicated codepages bet MODE * | ||
| 2317 | ;;* and code pages in the slot ? * | ||
| 2318 | ;;************************************* | ||
| 2319 | ;; -- for each code page in the slot, | ||
| 2320 | ;; check for any duplication to | ||
| 2321 | ;; code pages in buffer, if the code | ||
| 2322 | ;; page in the slot is not to be | ||
| 2323 | ;; replaced. | ||
| 2324 | ;; -- the designate fails if there is | ||
| 2325 | ;; duplication. | ||
| 2326 | ;; -- copy the codepage in the slot to | ||
| 2327 | ;; the buffer if is not to be | ||
| 2328 | ;; replaced. Mark the slot to be | ||
| 2329 | ;; AT_OLD. | ||
| 2330 | ;; -- if the code page is tobe replaced | ||
| 2331 | ;; mark the STATUS with REPLX. | ||
| 2332 | ;;------------------------------------- | ||
| 2333 | ;; | ||
| 2334 | MOV CX,DX ;; both slots & buffer of same size | ||
| 2335 | ;; --exclude the hwcp which is not | ||
| 2336 | ;; designatable | ||
| 2337 | MOV SI,BUF.HARDSO ;; SI = hardware slot | ||
| 2338 | ;; | ||
| 2339 | MOV AX,BUF.STATUS ;; | ||
| 2340 | AND AX,DSF_CARTCP ;; | ||
| 2341 | JNZ CMP_CP ;; | ||
| 2342 | MOV SI,BUF.RAMSO ;; SI = RAM slot | ||
| 2343 | CMP_CP: ;; | ||
| 2344 | MOV BUF.FTSLOTO,SI ;; | ||
| 2345 | ;; | ||
| 2346 | PUSH DI ;; (the start of RAM/Hardware buffer) | ||
| 2347 | PUSH DX ;; count of buffer size | ||
| 2348 | PUSH SI ;; first entry in RAM/hardware slot | ||
| 2349 | PUSH CX ;; slot size | ||
| 2350 | PUSH BX ;; | ||
| 2351 | ;; | ||
| 2352 | PUSH DI ;; | ||
| 2353 | POP BX ;; BX = the positioned buffer | ||
| 2354 | DST_SLTLP : ;; | ||
| 2355 | ;; **** LOOP **** | ||
| 2356 | ;; | ||
| 2357 | MOV AX,AT_OLD ;; =**= | ||
| 2358 | NOT AX ;; assumed the codepage in slot is new, | ||
| 2359 | AND CS:[SI].SLT_AT,AX ;; to be downloaded if buffer <> 0FFFFH | ||
| 2360 | ;; | ||
| 2361 | AND CS:[SI].SLT_AT,AT_NO_LOAD; -- codepage not to be loaded | ||
| 2362 | AND CS:[SI].SLT_AT,AT_NO_font; -- no font has been loaded | ||
| 2363 | ;; | ||
| 2364 | MOV AX,CS:[SI].SLT_CP ;; | ||
| 2365 | CMP AX,0FFFFH ;; | ||
| 2366 | JZ DST_SLTNXT ;; | ||
| 2367 | ;; | ||
| 2368 | PUSH CX ;; | ||
| 2369 | MOV CX,CS:[BX] ;; | ||
| 2370 | CMP CX,0FFFFH ;; if this slot to be replaced ? | ||
| 2371 | POP CX ;; | ||
| 2372 | JNZ DST_SLTREPLACED ;; YES, the buffer is not empty | ||
| 2373 | ;; | ||
| 2374 | ;; compare code page with SLOT-BUFFER | ||
| 2375 | PUSH CX ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 2376 | ;; SCAN THE BUFFER FOR DUPLICATION | ||
| 2377 | PUSH DX ;; | ||
| 2378 | POP CX ;; no. of buffer entries | ||
| 2379 | ;; | ||
| 2380 | PUSH ES ;; | ||
| 2381 | PUSH DI ;; | ||
| 2382 | PUSH CS ;; | ||
| 2383 | POP ES ;; | ||
| 2384 | REPNE SCASW ;; scan codepage vs. buffer | ||
| 2385 | POP DI ;; | ||
| 2386 | POP ES ;; | ||
| 2387 | ;; | ||
| 2388 | POP CX ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 2389 | ;; | ||
| 2390 | JNE SLT_BUF_DEF ;; | ||
| 2391 | ;; | ||
| 2392 | ;; **** LOOP EXIT **** | ||
| 2393 | ;; | ||
| 2394 | POP BX ;; | ||
| 2395 | POP CX ;; number of codepages in slots | ||
| 2396 | POP SI ;; first entry in RAM/hardware slots | ||
| 2397 | POP DX ;; count of buffer size | ||
| 2398 | POP DI ;; (the start of RAM/Hardware buffer) | ||
| 2399 | ;; | ||
| 2400 | MOV AX,STAT_DUPLCP ;; Duplicated code page | ||
| 2401 | JMP DST_RETURN ;; | ||
| 2402 | ;; | ||
| 2403 | ;; | ||
| 2404 | SLT_BUF_DEF: ;; | ||
| 2405 | MOV CS:[BX],AX ;; no duplicated cp, there was no cp in | ||
| 2406 | ;; =**= | ||
| 2407 | OR CS:[SI].SLT_AT,AT_OLD ;; mark old so as no new font download | ||
| 2408 | ;; | ||
| 2409 | JMP DST_SLTNXT ;; the MODE command for this position | ||
| 2410 | ;; | ||
| 2411 | DST_SLTREPLACED : ;; | ||
| 2412 | PUSH BX ;; | ||
| 2413 | POP AX ;; save the buffer slot-position | ||
| 2414 | POP BX ;; | ||
| 2415 | OR BUF.STATUS,REPLX ;; there are codepage in slots replaced | ||
| 2416 | PUSH BX ;; | ||
| 2417 | PUSH AX ;; | ||
| 2418 | POP BX ;; gets back the buffer position | ||
| 2419 | ;; | ||
| 2420 | ;; **** NEXT IN LOOP **** | ||
| 2421 | ;; | ||
| 2422 | DST_SLTNXT: ;; | ||
| 2423 | INC SI ;; will take whatever is in buffer | ||
| 2424 | INC SI ;; | ||
| 2425 | INC SI ;; | ||
| 2426 | INC SI ;; | ||
| 2427 | INC BX ;; position slot in buffer | ||
| 2428 | INC BX ;; | ||
| 2429 | XOR AX,AX ;; | ||
| 2430 | DEC CX ;; | ||
| 2431 | JNZ DST_SLTLP ;; | ||
| 2432 | ;; | ||
| 2433 | ;; | ||
| 2434 | POP BX ;; | ||
| 2435 | POP CX ;; slot size | ||
| 2436 | POP SI ;; first entry in RAM/hardware slots | ||
| 2437 | POP DX ;; count of buffer size | ||
| 2438 | POP DI ;; (the start of RAM/Hardware buffer) | ||
| 2439 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 2440 | ;;************************************ | ||
| 2441 | ;;* prepare the FTABLE * | ||
| 2442 | ;;************************************ | ||
| 2443 | ;; | ||
| 2444 | ;; -- CX slot / buffer size | ||
| 2445 | ;; SI slot | ||
| 2446 | ;; DI buffer | ||
| 2447 | ;;------------------------------------ | ||
| 2448 | PUSH BX ;; STACK +1 | ||
| 2449 | PUSH SI ;; STACK +2 | ||
| 2450 | ;; =**= | ||
| 2451 | MOV AX,FAIL ;; | ||
| 2452 | NOT AX ;; | ||
| 2453 | AND BUF.STATUS,AX ;; assume it is successful | ||
| 2454 | ;; | ||
| 2455 | ;; | ||
| 2456 | PREPARE_FTB : ;; Prepare for Font Parser | ||
| 2457 | LEA BX,FTABLE ;; | ||
| 2458 | MOV CS:[BX].FLAG,FLAG_RESTART; | ||
| 2459 | MOV CS:[BX].BUFFER_LEN,0 ;; no data packet | ||
| 2460 | MOV CS:[BX].NUM_FTBLK,0 ;; | ||
| 2461 | ;; | ||
| 2462 | ADD BX,TYPE FBUFS ;; points to the first FTBLK. | ||
| 2463 | XOR DX,DX ;; DX = FTBLK entries (no code page yet) | ||
| 2464 | ;; | ||
| 2465 | ;; | ||
| 2466 | GET_CODEPAGE : ;; **** LOOP **** | ||
| 2467 | AND CX,CX ;; | ||
| 2468 | JZ NO_MORE_SLOT ;; | ||
| 2469 | MOV AX,CS:[SI].SLT_AT ;; | ||
| 2470 | AND AX,AT_OLD ;; | ||
| 2471 | JZ NEW_CODEPAGE ;; | ||
| 2472 | ;; | ||
| 2473 | MOV AX,CS:[SI].SLT_AT ;; | ||
| 2474 | AND AX,AT_HWCP ;; | ||
| 2475 | JZ GET_NEXT ;; not NEW and not HWCP | ||
| 2476 | AND CS:[SI].SLT_AT, NOT AT_OLD ;; also load for HWCP | ||
| 2477 | ;; | ||
| 2478 | NEW_CODEPAGE : ;; | ||
| 2479 | MOV AX,CS:[DI] ;; -- SLOT_AT is not old | ||
| 2480 | ;; -- code page in buffer is not 0FFFFH | ||
| 2481 | CMP AX,0FFFFH ;; | ||
| 2482 | JE GET_NEXT ;; | ||
| 2483 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 2484 | INC DX ;; LOAD FONT as : | ||
| 2485 | MOV AX,CS:[DI] ;; codepage in buffer is new code page | ||
| 2486 | ;; | ||
| 2487 | OR CS:[SI].SLT_AT,AT_LOAD ;; set the attribute indicating load | ||
| 2488 | ;; | ||
| 2489 | MOV CS:[BX].FTB_CP,AX ;; | ||
| 2490 | ;; | ||
| 2491 | ADD BX,type ftblk ;; next FTBLK | ||
| 2492 | ;; | ||
| 2493 | ;; | ||
| 2494 | GET_NEXT : ;; **** NEXT IN LOOP **** | ||
| 2495 | INC DI ;; | ||
| 2496 | INC DI ;; next in buffer | ||
| 2497 | INC SI ;; | ||
| 2498 | INC SI ;; | ||
| 2499 | INC SI ;; | ||
| 2500 | INC SI ;; next in slot | ||
| 2501 | DEC CX ;; | ||
| 2502 | JMP GET_CODEPAGE ;; | ||
| 2503 | ;; | ||
| 2504 | NO_MORE_SLOT : ;; **** EXIT LOOP **** | ||
| 2505 | AND DX,DX ;; | ||
| 2506 | JNZ DEFINE_DID ;; | ||
| 2507 | JMP NO_FONT_DOWNL ;; | ||
| 2508 | ;; | ||
| 2509 | ;; ********************************** | ||
| 2510 | ;; ** NEXT STATE = DESIGNATE_WRITE ** | ||
| 2511 | ;; ********************************** | ||
| 2512 | ;; | ||
| 2513 | DEFINE_DID : ;; | ||
| 2514 | POP SI ;; STACK -2 | ||
| 2515 | POP BX ;; STACK -1 | ||
| 2516 | ;; | ||
| 2517 | PUSH BX ;; STACK +1 | ||
| 2518 | PUSH SI ;; STACK +2 | ||
| 2519 | ;; | ||
| 2520 | PUSH DI ;; STACK +3 | ||
| 2521 | PUSH CX ;; STACK +4 | ||
| 2522 | PUSH ES ;; STACK +5 | ||
| 2523 | PUSH DS ;; STACK +6 | ||
| 2524 | ;; | ||
| 2525 | PUSH CS ;; | ||
| 2526 | POP ES ;; | ||
| 2527 | PUSH CS ;; | ||
| 2528 | POP DS ;; | ||
| 2529 | ;; | ||
| 2530 | MOV SI,BX ;; GET THE DEVICE_ID FROM LPTn BUFFER | ||
| 2531 | LEA SI,[SI].PAR_EXTRACTO ;; | ||
| 2532 | MOV SI,CS:[SI].PAR_DIDO ;; | ||
| 2533 | LEA SI,[SI].PAR_DID ;; | ||
| 2534 | ;; | ||
| 2535 | LEA DI,FTABLE ;; | ||
| 2536 | MOV CS:[DI].NUM_FTBLK,DX ;; | ||
| 2537 | ;; | ||
| 2538 | ADD DI,TYPE FBUFS ;; | ||
| 2539 | LEA DI,[DI].FTB_TID ;; | ||
| 2540 | ;; | ||
| 2541 | SET_DID : ;; | ||
| 2542 | MOV CX,8 ;; | ||
| 2543 | PUSH SI ;; | ||
| 2544 | PUSH DI ;; | ||
| 2545 | ;; | ||
| 2546 | REP MOVSB ;; | ||
| 2547 | ;; | ||
| 2548 | POP DI ;; | ||
| 2549 | POP SI ;; | ||
| 2550 | ;; | ||
| 2551 | ADD DI,TYPE FTBLK ;; next DID | ||
| 2552 | DEC DX ;; | ||
| 2553 | JNZ SET_DID ;; | ||
| 2554 | ;; | ||
| 2555 | POP DS ;; STACK -6 | ||
| 2556 | POP ES ;; STACK -5 | ||
| 2557 | POP CX ;; STACK -4 | ||
| 2558 | POP DI ;; STACK -3 | ||
| 2559 | ;; | ||
| 2560 | CALL FONT_PARSER ;; restart font parser | ||
| 2561 | ;; | ||
| 2562 | LEA BX,FTABLE ;; | ||
| 2563 | ADD BX,TYPE FBUFS ;; | ||
| 2564 | CMP CS:[BX].FTB_STATUS,FSTAT_SEARCH | ||
| 2565 | ;; | ||
| 2566 | JE FONT_DOWNL ;; | ||
| 2567 | MOV AX,STAT_DEVERR ;; | ||
| 2568 | POP SI ;; STACK -2 | ||
| 2569 | POP BX ;; STACK -1 | ||
| 2570 | JMP DST_RETURN ;; there is no designate_end if fails | ||
| 2571 | ;; | ||
| 2572 | FONT_DOWNL : ;; | ||
| 2573 | POP SI ;; STACK -2 | ||
| 2574 | POP BX ;; STACK -1 | ||
| 2575 | MOV BUF.STATE,DESG_WR ;; enter DESIGNATE_WRITE state | ||
| 2576 | MOV BUF.FSELEN,0 ;; for font selection control loading | ||
| 2577 | ;; | ||
| 2578 | PUSH CX ;; init the font buffer address of | ||
| 2579 | PUSH DI ;; each codepage | ||
| 2580 | PUSH SI ;; | ||
| 2581 | MOV DI,BUF.FTDLO ;; | ||
| 2582 | ;; | ||
| 2583 | MOV CX,BUF.RSLMX ;; | ||
| 2584 | MOV AX,BUF.STATUS ;; | ||
| 2585 | AND AX,DSF_CARTCP ;; | ||
| 2586 | JZ FTDL_LOOP ;; | ||
| 2587 | MOV CX,BUF.HSLMX ;; | ||
| 2588 | ;; | ||
| 2589 | FTDL_LOOP : ;; | ||
| 2590 | AND CX,CX ;; | ||
| 2591 | JZ FTDL_DONE ;; | ||
| 2592 | mov ax,cs:[si].slt_at ;; | ||
| 2593 | and ax,at_load ;; | ||
| 2594 | jz ftdl_next ;; | ||
| 2595 | ;; | ||
| 2596 | MOV CS:WORD PTR[DI],0 ;; the font length in font buffer is 0 | ||
| 2597 | ;; | ||
| 2598 | ftdl_next : ;; | ||
| 2599 | INC SI ;; | ||
| 2600 | INC SI ;; | ||
| 2601 | INC SI ;; | ||
| 2602 | INC SI ;; | ||
| 2603 | INC DI ;; | ||
| 2604 | INC DI ;; | ||
| 2605 | DEC CX ;; | ||
| 2606 | JMP FTDL_LOOP ;; | ||
| 2607 | FTDL_DONE : ;; | ||
| 2608 | POP SI ;; | ||
| 2609 | POP DI ;; | ||
| 2610 | POP CX ;; | ||
| 2611 | ;; | ||
| 2612 | JMP CHECK_OTHER ;; | ||
| 2613 | ;; | ||
| 2614 | ;; ******************************* | ||
| 2615 | ;; ** NEXT STATE = DSIGNATE_END ** | ||
| 2616 | ;; ******************************* | ||
| 2617 | NO_FONT_DOWNL : ;; | ||
| 2618 | POP SI ;; STACK -2 | ||
| 2619 | POP BX ;; STACK -1 | ||
| 2620 | MOV BUF.STATE,DESG_END ;; proper designate end, ignore write | ||
| 2621 | ;; | ||
| 2622 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 2623 | CHECK_OTHER : ;; | ||
| 2624 | ;; | ||
| 2625 | MOV DX,BUF.STATUS ;; | ||
| 2626 | MOV AX,REPLX ;; | ||
| 2627 | NOT AX ;; | ||
| 2628 | AND AX,DX ;; reset the bit for "replaced" | ||
| 2629 | MOV BUF.STATUS,AX ;; | ||
| 2630 | ;; | ||
| 2631 | XOR AX,AX ;; | ||
| 2632 | AND DX,REPLX ;; | ||
| 2633 | JMP DST_RETURN ;; | ||
| 2634 | ;; only for the FIFO | ||
| 2635 | JMP DST_RETURN ;; | ||
| 2636 | ;; | ||
| 2637 | ;; | ||
| 2638 | DST_REFRESH: ;; ****************************** | ||
| 2639 | ;; ** REFRESH FONT TO DEVICE ** | ||
| 2640 | ;; ****************************** | ||
| 2641 | ;; -- if there is RAM buffer on device | ||
| 2642 | ;; -- if there is font assumed to be | ||
| 2643 | ;; on the device, then | ||
| 2644 | ;; -- load the font to the device, | ||
| 2645 | ;; but no change in slot attributes | ||
| 2646 | ;; | ||
| 2647 | OR BUF.STATUS,REFRESH ;; -- STATE = CPSW (for Designate_end) | ||
| 2648 | ;; | ||
| 2649 | MOV CX,BUF.RSLMX ;; | ||
| 2650 | AND CX,CX ;; | ||
| 2651 | JNZ DST_CHECK_FBUFFER ;; | ||
| 2652 | JMP DST_REF_INVK ;; invoke any active code page | ||
| 2653 | ;; | ||
| 2654 | DST_CHECK_FBUFFER: ;; | ||
| 2655 | MOV DI,BUF.RAMSO ;; | ||
| 2656 | ;; | ||
| 2657 | DST_RAMLP: ;; | ||
| 2658 | MOV AX,CS:[DI].SLT_AT ;; | ||
| 2659 | AND AX,AT_RAM1 ;; | ||
| 2660 | JNZ DST_RAM_LOCATED ;; | ||
| 2661 | INC DI ;; | ||
| 2662 | INC DI ;; | ||
| 2663 | INC DI ;; | ||
| 2664 | INC DI ;; | ||
| 2665 | DEC CX ;; | ||
| 2666 | JNZ DST_RAMLP ;; | ||
| 2667 | JMP DST_REF_INVK ;; there was no font loaded | ||
| 2668 | ;; | ||
| 2669 | DST_RAM_LOCATED: ;; | ||
| 2670 | CMP BUF.RBUFMX,0 ;; ANY FONT BUFFER TO BE COPIED FROM ? | ||
| 2671 | JA DST_HAS_BUFFER ;; | ||
| 2672 | MOV AX,STAT_NOBUFF ;; | ||
| 2673 | mov cs:init_chk,ax ;; | ||
| 2674 | JMP DST_RETURN ;; ERROR !!! | ||
| 2675 | ;; | ||
| 2676 | DST_HAS_BUFFER : ;; | ||
| 2677 | SUB DI,BUF.RAMSO ;; relative to .RAMSO | ||
| 2678 | SHR DI,1 ;; relative to .FTLDO | ||
| 2679 | PUSH DI ;; | ||
| 2680 | ;; | ||
| 2681 | SHR DI,1 ;; the nth | ||
| 2682 | MOV CX,DI ;; | ||
| 2683 | MOV AX,BUF.FTSTART ;; | ||
| 2684 | ;; | ||
| 2685 | DST_LOCATE_FT: ;; | ||
| 2686 | AND CX,CX ;; | ||
| 2687 | JZ DST_FT_LOCATED ;; | ||
| 2688 | ADD AX,BUF.FTSZPA ;; | ||
| 2689 | DEC CX ;; | ||
| 2690 | JNZ DST_LOCATE_FT ;; | ||
| 2691 | ;; | ||
| 2692 | DST_FT_LOCATED: ;; | ||
| 2693 | ;; | ||
| 2694 | POP DI ;; | ||
| 2695 | ADD DI,BUF.FTDLO ;; | ||
| 2696 | MOV CX,CS:WORD PTR [DI] ;; | ||
| 2697 | ;;.................................... | ||
| 2698 | ;; DOWNLOAD THE FONT TO DEVICE | ||
| 2699 | MOV SI,BUF.RNORMO ;; | ||
| 2700 | MOV CS:[SI].RHC_LEN,20 ;; | ||
| 2701 | MOV CS:[SI].RHC_CMD,CMD_WRT ;; | ||
| 2702 | MOV CS:[SI].RH3_CNT,CX ;; | ||
| 2703 | MOV CS:[SI].RH3_DTAO,0 ;; | ||
| 2704 | MOV CS:[SI].RH3_DTAS,AX ;; | ||
| 2705 | ;; | ||
| 2706 | PUSH BX ;; | ||
| 2707 | ;; | ||
| 2708 | PUSH BX ;; | ||
| 2709 | POP DI ;; save BX in DI | ||
| 2710 | PUSH CS ;; | ||
| 2711 | POP ES ;; | ||
| 2712 | MOV BX,SI ;; ES:BX = REQ_NORMn (CS:[SI]) | ||
| 2713 | ;; | ||
| 2714 | CALL DWORD PTR CS:[DI].LPT_STRAO | ||
| 2715 | ;; | ||
| 2716 | CALL DWORD PTR CS:[DI].LPT_INTRO | ||
| 2717 | ;; | ||
| 2718 | POP BX ;; | ||
| 2719 | ;; | ||
| 2720 | MOV AX,CS:[SI].RHC_STA ;; | ||
| 2721 | ;; | ||
| 2722 | and ax,stat_error ;; | ||
| 2723 | jz fdl_good2 ;; | ||
| 2724 | mov ax,stat_deverr ;; | ||
| 2725 | ;; | ||
| 2726 | fdl_good2 : ;; | ||
| 2727 | PUSH AX ;; | ||
| 2728 | AND AX,STAT_ERROR ;; | ||
| 2729 | POP AX ;; | ||
| 2730 | JZ DST_REF_INVK ;; | ||
| 2731 | ;; | ||
| 2732 | ;; | ||
| 2733 | DST_RETURN : ;; | ||
| 2734 | LES DI,dword ptr buf.rh_ptro ;; | ||
| 2735 | MOV RH.RHC_STA,AX ;; | ||
| 2736 | ;; | ||
| 2737 | push cs ;; | ||
| 2738 | pop ds ;; | ||
| 2739 | ;; | ||
| 2740 | RET ;; | ||
| 2741 | ;; | ||
| 2742 | ;; | ||
| 2743 | DST_REF_INVK : ;; INVOKE FOR REFRESH | ||
| 2744 | ;; | ||
| 2745 | ;; ************************************ | ||
| 2746 | ;; * INVOKE HIERIECHY : RAM, HARDWARE * | ||
| 2747 | ;; ************************************ | ||
| 2748 | ;; | ||
| 2749 | MOV DI,BUF.RAMSO ;; check with the ram-slots (DI) | ||
| 2750 | MOV CX,BUF.RSLMX ;; CX = size | ||
| 2751 | AND CX,CX ;; | ||
| 2752 | JZ DST_HWCP_CHK ;; | ||
| 2753 | ;; | ||
| 2754 | DST_RAM_CMP: ;; there are RAM-slots | ||
| 2755 | DST_RAM_LP: ;; | ||
| 2756 | MOV AX,CS:[DI].SLT_AT ;; | ||
| 2757 | AND AX,AT_ACT ;; | ||
| 2758 | JNZ DST_IVK_CP ;; | ||
| 2759 | INC DI ;; | ||
| 2760 | INC DI ;; | ||
| 2761 | INC DI ;; | ||
| 2762 | INC DI ;; | ||
| 2763 | DEC CX ;; | ||
| 2764 | JNZ DST_RAM_LP ;; | ||
| 2765 | ;; | ||
| 2766 | DST_HWCP_CHK : ;; | ||
| 2767 | MOV DI,BUF.HARDSO ;; check with the HWCP-slots (DI) | ||
| 2768 | MOV CX,BUF.Hslmx ;; CX = size | ||
| 2769 | AND CX,CX ;; | ||
| 2770 | JNZ dst_HWCP_cmp ;; | ||
| 2771 | JMP DST_NO_IVK ;; | ||
| 2772 | ;; | ||
| 2773 | DST_HWCP_CMP : ;; | ||
| 2774 | DST_HWCP_LP: ;; | ||
| 2775 | MOV AX,CS:[DI].SLT_AT ;; | ||
| 2776 | AND AX,AT_ACT ;; | ||
| 2777 | JZ DST_HWCP_NEXT ;; | ||
| 2778 | JMP DST_IVK_CP ;; | ||
| 2779 | ;; | ||
| 2780 | DST_HWCP_NEXT : ;; | ||
| 2781 | INC DI ;; | ||
| 2782 | INC DI ;; | ||
| 2783 | INC DI ;; | ||
| 2784 | INC DI ;; | ||
| 2785 | DEC CX ;; | ||
| 2786 | JNZ DST_HWCP_LP ;; | ||
| 2787 | ;; | ||
| 2788 | DST_NO_IVK: ;; | ||
| 2789 | XOR AX,AX ;; | ||
| 2790 | JMP DST_RETURN ;; | ||
| 2791 | ;; | ||
| 2792 | DST_IVK_CP : ;; | ||
| 2793 | PUSH SI ;; | ||
| 2794 | ;; | ||
| 2795 | MOV SI,BUF.RNORMO ;; | ||
| 2796 | MOV AX,SI ;; | ||
| 2797 | ADD AX,TYPE GIH ;; points to buffer | ||
| 2798 | ;; | ||
| 2799 | PUSH AX ;; | ||
| 2800 | LEA SI,[SI].GIH_GBA ;; | ||
| 2801 | MOV CS:WORD PTR [SI],AX | ||
| 2802 | INC SI ;; | ||
| 2803 | INC SI ;; | ||
| 2804 | MOV CS:WORD PTR [SI],CS ;; | ||
| 2805 | POP SI ;; | ||
| 2806 | MOV CS:[SI].GB2_LEN,2 ;; | ||
| 2807 | MOV AX,CS:[DI].SLT_CP ;; | ||
| 2808 | MOV CS:[SI].GB2_CP,AX ;; | ||
| 2809 | ;; | ||
| 2810 | POP SI ;; | ||
| 2811 | PUSH CS ;; define RH = ES:[DI] | ||
| 2812 | POP ES ;; | ||
| 2813 | MOV DI,BUF.RNORMO ;; | ||
| 2814 | ;; | ||
| 2815 | push cs ;; | ||
| 2816 | pop ds ;; | ||
| 2817 | ;; | ||
| 2818 | JMP INVOKE ;; | ||
| 2819 | ;; | ||
| 2820 | DESIGNATE_START ENDP ;; | ||
| 2821 | ;; | ||
| 2822 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 2823 | ;; | ||
| 2824 | ;;==== Generic IOCTL Designate End ====== | ||
| 2825 | ;; | ||
| 2826 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 2827 | DESIGNATE_END PROC ;; | ||
| 2828 | ;; | ||
| 2829 | MOV AX,BUF.STATE ;; | ||
| 2830 | CMP AX,LOCKED ;; WGR ;AN000; | ||
| 2831 | JNE DE_01 ;; WGR ;AN000; | ||
| 2832 | MOV AX,STAT_BADDEN ;; WGR ;AN000; | ||
| 2833 | JMP DE_11 ;; WGR ;AN000; | ||
| 2834 | DE_01: ;; WGR ;AN000; | ||
| 2835 | CMP AX,CPSW ;; | ||
| 2836 | JNE DEN_NOT_CPSW ;; | ||
| 2837 | MOV AX,BUF.STATUS ;; any refresh ? | ||
| 2838 | AND AX,REFRESH ;; | ||
| 2839 | JNZ DEN_REFRESH ;; | ||
| 2840 | MOV AX,STAT_BADDEN ;; | ||
| 2841 | JMP DEN_FAIL ;; | ||
| 2842 | ;; | ||
| 2843 | DEN_REFRESH : ;; | ||
| 2844 | AND BUF.STATUS,NOT REFRESH ;; | ||
| 2845 | XOR AX,AX ;; | ||
| 2846 | JMP DEN_RET ;; | ||
| 2847 | ;; | ||
| 2848 | DEN_NOT_CPSW : ;; | ||
| 2849 | CMP AX,NORMAL ;; | ||
| 2850 | JNE den_NOT_NORMAL ;; | ||
| 2851 | JMP NORM_DRIVER ;; not in the code page switching stage | ||
| 2852 | ;; | ||
| 2853 | den_NOT_NORMAL : ;; | ||
| 2854 | CMP AX,DESG_END ;; | ||
| 2855 | JNE den_other ;; | ||
| 2856 | JMP den_ENDED ;; end with no error check | ||
| 2857 | ;; | ||
| 2858 | den_other : ;; | ||
| 2859 | CMP AX,DESG_WR ;; | ||
| 2860 | JE den_write ;; | ||
| 2861 | MOV AX,STAT_BADDEN ;; | ||
| 2862 | JMP DEN_FAIL ;; no designate start | ||
| 2863 | ;;------------------------- | ||
| 2864 | den_write : ;; DESIGNATE WRITE ended | ||
| 2865 | ;; | ||
| 2866 | MOV AX,BUF.STATUS ;; | ||
| 2867 | AND AX,FAIL ;; | ||
| 2868 | JZ DEN_FTABLE ;; failed in the middle of desig-write | ||
| 2869 | XOR AX,AX ;; | ||
| 2870 | JMP DEN_FAIL ;; ignore the DEN | ||
| 2871 | ;; | ||
| 2872 | DEN_FTABLE : ;; | ||
| 2873 | ;; | ||
| 2874 | LEA DI,FTABLE ;; | ||
| 2875 | ADD DI,TYPE FBUFS ;; | ||
| 2876 | MOV AX,CS:[DI].FTB_STATUS ;; | ||
| 2877 | CMP AX,FSTAT_COMPLETE ;; | ||
| 2878 | JE DEN_ENDED ;; | ||
| 2879 | ;; | ||
| 2880 | CMP AX,FSTAT_FONT ;; | ||
| 2881 | JE DEN_FONT ;; | ||
| 2882 | MOV AX,STAT_bffDEN ;; bad font file | ||
| 2883 | JMP DEN_FAIL ;; the font data was not complete | ||
| 2884 | ;; | ||
| 2885 | DEN_FONT : ;; | ||
| 2886 | MOV AX,CS:[DI].FTB_DLEFT ;; | ||
| 2887 | AND AX,AX ;; | ||
| 2888 | JZ DEN_ENDED ;; | ||
| 2889 | MOV AX,STAT_BffDEN ;; | ||
| 2890 | JMP DEN_FAIL ;; | ||
| 2891 | ;; | ||
| 2892 | DEN_ENDED : ;; good designate-end | ||
| 2893 | ;; | ||
| 2894 | MOV DI,BUF.HARDSO ;; to hardware slot | ||
| 2895 | MOV SI,BUF.HRBUFO ;; to hardware-buffer | ||
| 2896 | HARD_HWCPE: ;; | ||
| 2897 | MOV AX,CS:[DI].SLT_AT ;; skip the HWCP | ||
| 2898 | AND AX,AT_HWCP ;; | ||
| 2899 | JZ HARD_CARTE ;; | ||
| 2900 | INC DI ;; | ||
| 2901 | INC DI ;; | ||
| 2902 | INC DI ;; | ||
| 2903 | INC DI ;; | ||
| 2904 | INC SI ;; | ||
| 2905 | INC SI ;; | ||
| 2906 | JMP HARD_HWCPE ;; | ||
| 2907 | HARD_CARTE: ;; | ||
| 2908 | MOV CX,BUF.HSLMX ;; size of both hardware slot/buffer | ||
| 2909 | SUB CX,BUF.HARDMX ;; slots that can be designated???????? | ||
| 2910 | MOV AX,BUF.STATUS ;; | ||
| 2911 | AND AX,DSF_CARTCP ;; | ||
| 2912 | JZ ASSIGN_RAM ;; | ||
| 2913 | ;; | ||
| 2914 | ;; | ||
| 2915 | MOV AX,STAT_TOMANY ;; | ||
| 2916 | AND CX,CX ;; any cart-slot to be designated ? | ||
| 2917 | JNZ ASSIGN_CP_CART ;; | ||
| 2918 | JMP DEN_FAIL ;; | ||
| 2919 | ;; | ||
| 2920 | ;; | ||
| 2921 | ASSIGN_CP_CART : ;; | ||
| 2922 | JMP ASSIGN_CP ;; | ||
| 2923 | ;; | ||
| 2924 | ASSIGN_RAM: ;; | ||
| 2925 | MOV DI,BUF.RAMSO ;; to RAM slot | ||
| 2926 | MOV SI,BUF.RMBUFO ;; to RAM-buffer | ||
| 2927 | MOV CX,BUF.RSLMX ;; size of both RAM slot/buffer | ||
| 2928 | ;; | ||
| 2929 | MOV AX,STAT_TOMANY ;; | ||
| 2930 | AND CX,CX ;; any cart-slot to be designated ? | ||
| 2931 | JNZ ASSIGN_CP ;; | ||
| 2932 | JMP DEN_FAIL ;; | ||
| 2933 | ;; | ||
| 2934 | ASSIGN_CP: ;; | ||
| 2935 | MOV AX,AT_LOAD ;; | ||
| 2936 | OR AX,AT_FONT ;; | ||
| 2937 | OR AX,AT_SELECT ;; | ||
| 2938 | NOT AX ;; | ||
| 2939 | AND CS:[DI].SLT_AT,AX ;; reset load, font, select attributes | ||
| 2940 | ;; | ||
| 2941 | MOV AX,CS:[SI] ;; code page assigned | ||
| 2942 | MOV CS:[DI].SLT_CP,AX ;; | ||
| 2943 | ;; | ||
| 2944 | CMP AX,0FFFFH ;; | ||
| 2945 | JNE SLOT_OCC ;; | ||
| 2946 | MOV AX,AT_OCC ;; | ||
| 2947 | NOT AX ;; empty | ||
| 2948 | AND CS:[DI].SLT_AT,AX ;; | ||
| 2949 | JMP ASSIGN_NEXT ;; | ||
| 2950 | SLOT_OCC: ;; | ||
| 2951 | OR CS:[DI].SLT_AT,AT_OCC ;; occupied | ||
| 2952 | ;; | ||
| 2953 | MOV AX,CS:[DI].SLT_AT ;; | ||
| 2954 | AND AX,AT_OLD ;; | ||
| 2955 | JNZ ASSIGN_NEXT ;; | ||
| 2956 | ;; | ||
| 2957 | NOT_ACTIVE: ;; this newly designated is not active | ||
| 2958 | MOV AX,AT_ACT ;; | ||
| 2959 | NOT AX ;; | ||
| 2960 | AND CS:[DI].SLT_AT,AX ;; not active | ||
| 2961 | CMP BUF.RBUFMX,0 ;; | ||
| 2962 | JE ASSIGN_NEXT ;; | ||
| 2963 | AND CS:[DI].SLT_AT,NOT AT_RAM1;; not loaded to physical RAM until | ||
| 2964 | ;; the code page is selected | ||
| 2965 | ASSIGN_NEXT : ;; | ||
| 2966 | INC DI ;; | ||
| 2967 | INC DI ;; | ||
| 2968 | INC DI ;; | ||
| 2969 | INC DI ;; | ||
| 2970 | INC SI ;; | ||
| 2971 | INC SI ;; | ||
| 2972 | DEC CX ;; | ||
| 2973 | AND CX,CX ;; | ||
| 2974 | JNE ASSIGN_CP ;; | ||
| 2975 | ;; | ||
| 2976 | MOV CX,BUF.FSELEN ;; COPY SELECT-CONTROL for CLASS 0 | ||
| 2977 | AND CX,CX ;; | ||
| 2978 | JZ DEN_NO_SELECT ;; | ||
| 2979 | ;; | ||
| 2980 | PUSH ES ;; | ||
| 2981 | PUSH DS ;; | ||
| 2982 | PUSH SI ;; | ||
| 2983 | PUSH DI ;; | ||
| 2984 | ;; | ||
| 2985 | PUSH CS ;; | ||
| 2986 | POP ES ;; | ||
| 2987 | PUSH CS ;; | ||
| 2988 | POP DS ;; | ||
| 2989 | ;; | ||
| 2990 | PUSH DX ;; | ||
| 2991 | MOV DI,BUF.PDESCO ;; | ||
| 2992 | MOV SI,CS:[DI].SELB_O ;; | ||
| 2993 | PUSH DI ;; | ||
| 2994 | MOV DI,CS:[DI].SELH_O ;; | ||
| 2995 | XOR DX,DX ;; | ||
| 2996 | MOV DL,CS:BYTE PTR [SI] ;; | ||
| 2997 | ADD DX,DI ;; | ||
| 2998 | INC DX ;; of the length byte | ||
| 2999 | ;; | ||
| 3000 | REP MOVSB ;; | ||
| 3001 | ;; | ||
| 3002 | POP DI ;; | ||
| 3003 | MOV CS:[DI].SELR_O,DX ;; | ||
| 3004 | POP DX ;; | ||
| 3005 | ;; | ||
| 3006 | POP DI ;; | ||
| 3007 | POP SI ;; | ||
| 3008 | POP DS ;; | ||
| 3009 | POP ES ;; | ||
| 3010 | ;; | ||
| 3011 | MOV BUF.FSELEN,0 ;; | ||
| 3012 | ;; | ||
| 3013 | DEN_NO_SELECT : ;; | ||
| 3014 | XOR AX,AX ;; clear status | ||
| 3015 | JMP DEN_RET ;; | ||
| 3016 | ;; | ||
| 3017 | DEN_FAIL : ;;------------------------------------ | ||
| 3018 | PUSH AX ;; ANY FONT BUFFER DESTROYED ? | ||
| 3019 | ;; | ||
| 3020 | MOV AX,BUF.STATUS ;; | ||
| 3021 | AND AX,DSF_CARTCP ;; | ||
| 3022 | JZ DEN_RAM_FAIL ;; | ||
| 3023 | ;; | ||
| 3024 | MOV DI,BUF.FTSLOTO ;; | ||
| 3025 | MOV CX,BUF.HSLMX ;; | ||
| 3026 | JMP DEN_FAIL_LOOP ;; | ||
| 3027 | ;; | ||
| 3028 | DEN_RAM_FAIL : ;; | ||
| 3029 | MOV DI,BUF.RAMSO ;; to RAM slot | ||
| 3030 | MOV CX,BUF.RSLMX ;; size of both RAM slot/buffer | ||
| 3031 | MOV DX,BUF.RBUFMX ;; | ||
| 3032 | ;; | ||
| 3033 | AND DX,DX ;; | ||
| 3034 | JZ DEN_FAIL_RET ;; | ||
| 3035 | ;; | ||
| 3036 | DEN_FAIL_LOOP : ;; | ||
| 3037 | AND CX,CX ;; | ||
| 3038 | JZ DEN_FAIL_RET ;; | ||
| 3039 | ;; | ||
| 3040 | MOV AX,CS:[DI].SLT_AT ;; | ||
| 3041 | AND AX,AT_LOAD ;; | ||
| 3042 | JZ DEN_FAIL_NEXT ;; | ||
| 3043 | ;; | ||
| 3044 | MOV AX,CS:[DI].SLT_AT ;; | ||
| 3045 | AND AX,AT_HWCP ;; | ||
| 3046 | JNZ DEN_FAIL_NEXT ;; | ||
| 3047 | ;; | ||
| 3048 | MOV CS:[DI].SLT_CP,0FFFFH ;; those slot whose font has been or | ||
| 3049 | MOV CS:[DI].SLT_AT,0 ;; to be loaded will be wiped out by | ||
| 3050 | ;; a failing designate | ||
| 3051 | DEN_FAIL_NEXT : ;; | ||
| 3052 | ;; | ||
| 3053 | INC DI ;; | ||
| 3054 | INC DI ;; | ||
| 3055 | INC DI ;; | ||
| 3056 | INC DI ;; | ||
| 3057 | DEC CX ;; | ||
| 3058 | JNE DEN_FAIL_LOOP ;; | ||
| 3059 | ;; | ||
| 3060 | DEN_FAIL_RET : ;; | ||
| 3061 | ;; | ||
| 3062 | POP AX ;; | ||
| 3063 | ;; | ||
| 3064 | MOV BUF.FSELEN,0 ;; | ||
| 3065 | ;; | ||
| 3066 | ;;------------------------------------- | ||
| 3067 | DEN_RET : ;; | ||
| 3068 | MOV BUF.STATE,CPSW ;; end of designate cycle | ||
| 3069 | ;; | ||
| 3070 | DE_11: ;; WGR ;AN000; | ||
| 3071 | LES DI,dword ptr buf.rh_ptro ;; | ||
| 3072 | MOV RH.RHC_STA,AX ;; | ||
| 3073 | ;; | ||
| 3074 | RET ;; | ||
| 3075 | ;; | ||
| 3076 | DESIGNATE_END ENDP ;; | ||
| 3077 | ;; | ||
| 3078 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 3079 | ;; | ||
| 3080 | ;;==== Generic IOCTL Invoke ========== | ||
| 3081 | ;; | ||
| 3082 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 3083 | ;; | ||
| 3084 | INVOKE PROC ;; ALSO JUMP FROM REFRESH | ||
| 3085 | ;; | ||
| 3086 | MOV AX,BUF.STATE ;; | ||
| 3087 | CMP AX,CPSW ;; | ||
| 3088 | JE IVK_PROCESS ;; | ||
| 3089 | CMP AX,LOCKED ;; WGR ;AN000; | ||
| 3090 | JE IVK_PROCESS ;; WGR ;AN000; | ||
| 3091 | JMP IVK_CMDERR ;G; | ||
| 3092 | IVK_PROCESS: ;;------------------------- | ||
| 3093 | ;G; | ||
| 3094 | CALL CHECK_PRINT_ACTIVE ;G; THIS WILL FIND OUT IF THE | ||
| 3095 | JNC IVK_PROCESS_CONT ;G; PRINT.COM IS PRESENTLY ACTIVE! | ||
| 3096 | JMP IVK_DEVERR ;G; If so, THEN DEVICE_ERROR | ||
| 3097 | ;G; | ||
| 3098 | IVK_PROCESS_CONT: ;G; | ||
| 3099 | push ds ;; | ||
| 3100 | LDS SI,RH.GIH_GBA ;; | ||
| 3101 | MOV CX,GIOB.GB2_LEN ;; | ||
| 3102 | MOV AX,STAT_CMDERR ;; | ||
| 3103 | CMP CX,2 ;; | ||
| 3104 | JE IVK_GOODN ;; | ||
| 3105 | pop ds ;; | ||
| 3106 | JMP IVK_RET ;; | ||
| 3107 | IVK_GOODN: ;; | ||
| 3108 | MOV DX,GIOB.GB2_CP ;; DX = the codepage to be invoked | ||
| 3109 | CMP DX,0FFFFH ;; | ||
| 3110 | JNE IVK_GOODCP ;; | ||
| 3111 | pop ds ;; | ||
| 3112 | JMP IVK_RET ;; | ||
| 3113 | IVK_GOODCP: ;; | ||
| 3114 | ;; ************************************ | ||
| 3115 | ;; * INVOKE HIERIECHY : RAM, HARDWARE * | ||
| 3116 | ;; ************************************ | ||
| 3117 | pop ds ;; | ||
| 3118 | ;; | ||
| 3119 | MOV DI,BUF.RAMSO ;; check with the ram-slots (DI) | ||
| 3120 | MOV CX,BUF.RSLMX ;; CX = size | ||
| 3121 | AND CX,CX ;; | ||
| 3122 | JZ HWCP_CHK ;; | ||
| 3123 | ;; | ||
| 3124 | RAM_CMP: ;; there are RAM-slots | ||
| 3125 | PUSH CX ;; stack 1 = size | ||
| 3126 | PUSH DI ;; | ||
| 3127 | POP SI ;; start of the slot compared with (SI) | ||
| 3128 | RAM_LP: ;; | ||
| 3129 | MOV AX,CS:[DI].SLT_CP ;; | ||
| 3130 | CMP AX,DX ;; | ||
| 3131 | JE IVK_RAMCP ;; | ||
| 3132 | INC DI ;; | ||
| 3133 | INC DI ;; | ||
| 3134 | INC DI ;; | ||
| 3135 | INC DI ;; | ||
| 3136 | DEC CX ;; | ||
| 3137 | JNZ RAM_LP ;; | ||
| 3138 | ;; | ||
| 3139 | POP CX ;; stack -1 | ||
| 3140 | ;; code page not found in ram-slots | ||
| 3141 | HWCP_CHK : ;; | ||
| 3142 | MOV DI,BUF.HARDSO ;; check with the HWCP-slots (DI) | ||
| 3143 | MOV CX,BUF.Hslmx ;; CX = size | ||
| 3144 | AND CX,CX ;; | ||
| 3145 | JNZ HWCP_cmp ;; | ||
| 3146 | JMP NO_INVOKE ;; | ||
| 3147 | ;; | ||
| 3148 | HWCP_CMP : ;; | ||
| 3149 | PUSH CX ;; stack 1 = size of HWCP | ||
| 3150 | PUSH DI ;; | ||
| 3151 | POP SI ;; start of the slot compared with (SI) | ||
| 3152 | HWCP_LP: ;; | ||
| 3153 | MOV AX,CS:[DI].SLT_CP ;; | ||
| 3154 | CMP AX,DX ;; | ||
| 3155 | JNE HWCP_NEXT ;; | ||
| 3156 | JMP IVK_HWCPCP ;; | ||
| 3157 | ;; | ||
| 3158 | HWCP_NEXT : ;; | ||
| 3159 | INC DI ;; | ||
| 3160 | INC DI ;; | ||
| 3161 | INC DI ;; | ||
| 3162 | INC DI ;; | ||
| 3163 | DEC CX ;; | ||
| 3164 | JNZ HWCP_LP ;; | ||
| 3165 | POP CX ;; stack -1 | ||
| 3166 | ;; | ||
| 3167 | JMP NO_INVOKE ;; | ||
| 3168 | ;; ********************************** | ||
| 3169 | ;; ** RAM CODEPAGE TO BE INVOKED ** | ||
| 3170 | ;; ********************************** | ||
| 3171 | ;; -- determine if any font to be | ||
| 3172 | ;; downloaded for the first time | ||
| 3173 | ;; select of the font. | ||
| 3174 | ;; -- send selection control to invoke | ||
| 3175 | ;; | ||
| 3176 | ;; CX = inverse order of slot cp found | ||
| 3177 | IVK_RAMCP : ;; code page found in RAM slots | ||
| 3178 | ;; set up the pointer to first controls | ||
| 3179 | ;; DI = where slot found | ||
| 3180 | ;; | ||
| 3181 | ;;------------------------------------- | ||
| 3182 | ;; **** LOAD THE FONT FIRST if **** | ||
| 3183 | ;; -- there are font buffers created | ||
| 3184 | ;; -- the slot's font has not been | ||
| 3185 | ;; loaded | ||
| 3186 | CMP CS:[BX].STATE,LOCKED ;; WGR are we locked? ;AN000; | ||
| 3187 | JNE IR_0 ;; WGR no..continue ;AN000; | ||
| 3188 | MOV CS:[BX].SAVED_CP,DX ;; WGR yes...save the code page ;AN000; | ||
| 3189 | CMP BX,OFFSET BUF1 ;; WGR if this is lpt1..then ;AN000; | ||
| 3190 | JNE NEXT_1 ;; WGR ;AN000; | ||
| 3191 | LEA SI,BUF0 ;; WGR copy to PRN buffer. ;AN000; | ||
| 3192 | MOV CS:[SI].SAVED_CP,DX ;; WGR ;AN000; | ||
| 3193 | JMP ALL_RESET ;; WGR ;AN000; | ||
| 3194 | NEXT_1: ;; WGR ;AN000; | ||
| 3195 | CMP BX,OFFSET BUF0 ;; WGR if this is PRN..then.. ;AN000; | ||
| 3196 | JNE NEXT_2 ;; WGR ;AN000; | ||
| 3197 | LEA SI,BUF1 ;; WGR copy to lpt1 buffer. ;AN000; | ||
| 3198 | MOV CS:[SI].SAVED_CP,DX ;; WGR ;AN000; | ||
| 3199 | NEXT_2: ;; WGR ;AN000; | ||
| 3200 | JMP ALL_RESET ;; WGR exit invoke with good status ;AN000; | ||
| 3201 | IR_0: ;; WGR ;AN000; | ||
| 3202 | ; test cs:[di].SLT_AT, AT_ACT ;AN001;If it is currently active, then do nothing | ||
| 3203 | ; jnz Next_2 ;AN001; | ||
| 3204 | CMP BUF.RBUFMX,0 ;; | ||
| 3205 | JE INVK_RAM_PHYSICAL ;; | ||
| 3206 | ;; | ||
| 3207 | MOV AX,CS:[DI].SLT_AT ;; | ||
| 3208 | AND AX,AT_RAM1 ;; supports only ONE physical ram | ||
| 3209 | JNZ INVK_RAM_PHYSICAL ;; | ||
| 3210 | ;; | ||
| 3211 | OR BUF.STATUS,LOADED ;; font has not been loaded | ||
| 3212 | ;; | ||
| 3213 | ;; | ||
| 3214 | POP DX ;; stack -1 | ||
| 3215 | PUSH DX ;; stack 1 (size) | ||
| 3216 | ;; | ||
| 3217 | ;; | ||
| 3218 | PUSH CX ;; | ||
| 3219 | PUSH SI ;; | ||
| 3220 | PUSH DI ;; | ||
| 3221 | ;; | ||
| 3222 | SUB DX,CX ;; | ||
| 3223 | MOV AX,BUF.FTSTART ;; | ||
| 3224 | LOCATE_FONT : ;; | ||
| 3225 | AND DX,DX ;; | ||
| 3226 | JZ FONT_LOCATED ;; | ||
| 3227 | ADD AX,BUF.FTSZPA ;; | ||
| 3228 | DEC DX ;; | ||
| 3229 | JMP LOCATE_FONT ;; | ||
| 3230 | ;; | ||
| 3231 | FONT_LOCATED : ;; | ||
| 3232 | ;; AX = FONT LOCATION (AX:0) | ||
| 3233 | SUB DI,BUF.RAMSO ;; | ||
| 3234 | SHR DI,1 ;; offset to the start of .FTDLEN | ||
| 3235 | ;; | ||
| 3236 | add DI,buf.ftdlo ;; length of font data | ||
| 3237 | mov cx,cs:word ptr [di] ;; | ||
| 3238 | |||
| 3239 | |||
| 3240 | ;Before sending data, let's check the status of the printer | ||
| 3241 | call Prt_status_check ;AN001;Check the printer status | ||
| 3242 | jz Send_Ram_Data ;AN001;O.K.? | ||
| 3243 | pop di ;AN001;Balance the stack | ||
| 3244 | pop si ;AN001; | ||
| 3245 | pop cx ;AN001; | ||
| 3246 | jmp Ram_Prt_Status_Err ;AN001;return with error. | ||
| 3247 | Send_Ram_Data: | ||
| 3248 | MOV SI,BUF.RNORMO ;; | ||
| 3249 | MOV CS:[SI].RHC_LEN,20 ;; | ||
| 3250 | MOV CS:[SI].RHC_CMD,CMD_WRT ;; | ||
| 3251 | MOV CS:[SI].RH3_CNT,CX ;; | ||
| 3252 | MOV CS:[SI].RH3_DTAO,0 ;; | ||
| 3253 | MOV CS:[SI].RH3_DTAS,AX ;; | ||
| 3254 | ;; | ||
| 3255 | PUSH BX ;; | ||
| 3256 | ;; | ||
| 3257 | PUSH BX ;; | ||
| 3258 | POP DI ;; save BX in DI | ||
| 3259 | PUSH CS ;; | ||
| 3260 | POP ES ;; | ||
| 3261 | MOV BX,SI ;; ES:BX = REQ_NORMn (CS:[SI]) | ||
| 3262 | ;; | ||
| 3263 | CALL DWORD PTR CS:[DI].LPT_STRAO | ||
| 3264 | ;; | ||
| 3265 | CALL DWORD PTR CS:[DI].LPT_INTRO | ||
| 3266 | ;; | ||
| 3267 | POP BX ;; | ||
| 3268 | ;; | ||
| 3269 | MOV AX,CS:[SI].RHC_STA ;; | ||
| 3270 | ;; | ||
| 3271 | POP DI ;; | ||
| 3272 | POP SI ;; | ||
| 3273 | POP CX ;; | ||
| 3274 | ;; | ||
| 3275 | AND AX,STAT_ERROR ;; any error returned by normal device? | ||
| 3276 | JZ INVK_RAM_PHYSICAL ;; | ||
| 3277 | ;; | ||
| 3278 | Ram_Prt_Status_err: | ||
| 3279 | POP CX ;; stack -1 | ||
| 3280 | JMP IVK_DEVERR ;; | ||
| 3281 | ;;------------------------------------- | ||
| 3282 | ;; **** SEND THE SELECTION CONTROL **** | ||
| 3283 | ;; | ||
| 3284 | INVK_RAM_PHYSICAL : ;; | ||
| 3285 | ;; | ||
| 3286 | POP DX ;; stack -1 | ||
| 3287 | PUSH DX ;; stack 1 (size) | ||
| 3288 | ;; | ||
| 3289 | PUSH DI ;; stack 2 | ||
| 3290 | PUSH SI ;; stack 3 | ||
| 3291 | PUSH ES ;; stack 4 | ||
| 3292 | ;; | ||
| 3293 | ;; | ||
| 3294 | ;; **** SUPPORT ONLY ONE PHYSICAL RAM | ||
| 3295 | ;; | ||
| 3296 | MOV DI,BUF.PDESCO ;; | ||
| 3297 | MOV DI,CS:[DI].SELR_O ;; the RAM-select controls | ||
| 3298 | XOR AX,AX ;; | ||
| 3299 | JMP CTL_DEF ;; | ||
| 3300 | ;; | ||
| 3301 | ;; ******************************* | ||
| 3302 | ;; ** INVOKE HARDWARE CODEPAGE ** | ||
| 3303 | ;; ******************************* | ||
| 3304 | ;; -- check if it is CLASS 1 device, | ||
| 3305 | ;; If so then send slection control | ||
| 3306 | ;; from the font buffer at FTSTART | ||
| 3307 | ;; | ||
| 3308 | ;; CX=inverse order of slot cp found | ||
| 3309 | IVK_HWCPCP: ;; code page found in HWCP slots | ||
| 3310 | ;; set up the pointer to first controls | ||
| 3311 | CMP CS:[BX].STATE,LOCKED ;; WGR are we locked? ;AN000; | ||
| 3312 | JNE IR_1 ;; WGR no..continue ;AN000; | ||
| 3313 | MOV CS:[BX].SAVED_CP,DX ;; WGR yes...save the code page ;AN000; | ||
| 3314 | CMP BX,OFFSET BUF1 ;; WGR if this is lpt1..then ;AN000; | ||
| 3315 | JNE NEXT_3 ;; WGR ;AN000; | ||
| 3316 | LEA SI,BUF0 ;; WGR copy to PRN buffer. ;AN000; | ||
| 3317 | MOV CS:[SI].SAVED_CP,DX ;; WGR ;AN000; | ||
| 3318 | JMP ALL_RESET ;; WGR ;AN000; | ||
| 3319 | NEXT_3: ;; WGR ;AN000; | ||
| 3320 | CMP BX,OFFSET BUF0 ;; WGR if this is PRN..then.. ;AN000; | ||
| 3321 | JNE NEXT_4 ;; WGR ;AN000; | ||
| 3322 | LEA SI,BUF1 ;; WGR copy to lpt1 buffer. ;AN000; | ||
| 3323 | MOV CS:[SI].SAVED_CP,DX ;; WGR ;AN000; | ||
| 3324 | NEXT_4: ;; WGR ;AN000; | ||
| 3325 | JMP ALL_RESET ;; WGR exit invoke with good status ;AN000; | ||
| 3326 | IR_1: ;; WGR ;AN000; | ||
| 3327 | ; test cs:[di].SLT_AT, AT_ACT ;AN001;If it is currently active, then do nothing | ||
| 3328 | ; jnz Next_4 ;AN001; | ||
| 3329 | POP DX ;; stack -1 | ||
| 3330 | PUSH DX ;; stack 1 (size) | ||
| 3331 | ;; | ||
| 3332 | PUSH DI ;; stack 2 | ||
| 3333 | PUSH SI ;; stack 3 | ||
| 3334 | PUSH ES ;; stack 4 | ||
| 3335 | ;; | ||
| 3336 | SUB DX,CX ;; the slot's order in HWCP-slots(0-n) | ||
| 3337 | ;; | ||
| 3338 | CMP BUF.PCLASS,1 ;; | ||
| 3339 | JNE SELECT_SLOT ;; | ||
| 3340 | ;; | ||
| 3341 | MOV AX,BUF.FTSTART ;; ***** CLASS 1 CODEPAGE SELECT **** | ||
| 3342 | AND DX,DX ;; | ||
| 3343 | JZ ADJUST_DI ;; | ||
| 3344 | ;; | ||
| 3345 | SELECTCP_LP : ;; | ||
| 3346 | ADD AX,BUF.FTSZPA ;; | ||
| 3347 | ;; | ||
| 3348 | DEC DX ;; | ||
| 3349 | JNZ SELECTCP_LP ;; | ||
| 3350 | ;; | ||
| 3351 | ADJUST_DI : ;; | ||
| 3352 | mov DI,AX ;; | ||
| 3353 | PUSH CS ;; | ||
| 3354 | POP AX ;; | ||
| 3355 | SUB DI,AX ;; | ||
| 3356 | SHL DI,1 ;; | ||
| 3357 | SHL DI,1 ;; | ||
| 3358 | SHL DI,1 ;; | ||
| 3359 | SHL DI,1 ;; | ||
| 3360 | JMP CTL_DEF ;; | ||
| 3361 | ;; | ||
| 3362 | ;; ** SELECT HARDWARE PHYSICAL SLOT ** | ||
| 3363 | SELECT_SLOT : ;; | ||
| 3364 | MOV DI,BUF.PDESCO ;; | ||
| 3365 | MOV DI,CS:[DI].SELH_O ;; the HARDWARE-select controls | ||
| 3366 | XOR AX,AX ;; | ||
| 3367 | JMP RCTL_NXT ;; | ||
| 3368 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 3369 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 3370 | RCTL_NXT: ;; locate the right control sequence | ||
| 3371 | AND DX,DX ;; | ||
| 3372 | JZ CTL_DEF ;; | ||
| 3373 | MOV AL,CS:[DI] ;; | ||
| 3374 | ADD DI,AX ;; | ||
| 3375 | DEC DX ;; | ||
| 3376 | JMP RCTL_NXT ;; | ||
| 3377 | ;; | ||
| 3378 | ;; ******************************** | ||
| 3379 | ;; ** SEND OUT SELECTION CONTROL ** | ||
| 3380 | ;; ******************************** | ||
| 3381 | ;; | ||
| 3382 | ;; code page is to be invoked | ||
| 3383 | CTL_DEF : ;; DI points to the control sequence | ||
| 3384 | ;Check the status of the printer before writing. | ||
| 3385 | call Prt_status_check ;AN001;Check the printer status | ||
| 3386 | jz Ctl_Def_Send ;AN001;O.K.? | ||
| 3387 | jmp Ctl_Dev_Err ;AN001;Error. | ||
| 3388 | |||
| 3389 | Ctl_Def_Send: | ||
| 3390 | MOV SI,BUF.RNORMO ;; | ||
| 3391 | MOV CS:[SI].RHC_LEN,20 ;; | ||
| 3392 | MOV CS:[SI].RHC_CMD,CMD_WRT ;; | ||
| 3393 | ;; | ||
| 3394 | XOR CX,CX ;; | ||
| 3395 | MOV CL,CS:[DI] ;; | ||
| 3396 | ;; | ||
| 3397 | CTL_NEXT_BYTE : ;; | ||
| 3398 | ;; | ||
| 3399 | CMP BUF.PCLASS,1 ;; | ||
| 3400 | JE CTL_CLASS1 ;; | ||
| 3401 | ;; | ||
| 3402 | MOV CS:[SI].RH3_CNT,CX ;; send all at once | ||
| 3403 | MOV CX,1 ;; sent only once. | ||
| 3404 | JMP CTL_COMMON ;; | ||
| 3405 | ;; | ||
| 3406 | CTL_CLASS1 : ;; sent byte by byte to overcome | ||
| 3407 | MOV CS:[SI].RH3_CNT,1 ;; DOS timeout on kingman printer | ||
| 3408 | CTL_COMMON : ;; | ||
| 3409 | INC DI ;; | ||
| 3410 | MOV CS:[SI].RH3_DTAO,DI ;; | ||
| 3411 | PUSH CS ;; | ||
| 3412 | POP AX ;; | ||
| 3413 | MOV CS:[SI].RH3_DTAS,AX ;; | ||
| 3414 | ;; | ||
| 3415 | PUSH DI ;; | ||
| 3416 | PUSH BX ;; | ||
| 3417 | ;; | ||
| 3418 | PUSH BX ;; | ||
| 3419 | POP DI ;; save BX in DI | ||
| 3420 | PUSH CS ;; | ||
| 3421 | POP ES ;; | ||
| 3422 | MOV BX,SI ;; ES:BX = REQ_NORMn (CS:[SI]) | ||
| 3423 | ;; | ||
| 3424 | CALL DWORD PTR CS:[DI].LPT_STRAO | ||
| 3425 | ;; | ||
| 3426 | CALL DWORD PTR CS:[DI].LPT_INTRO | ||
| 3427 | ;; | ||
| 3428 | POP BX ;; | ||
| 3429 | POP DI ;; | ||
| 3430 | ;; | ||
| 3431 | MOV AX,CS:[SI].RHC_STA ;; | ||
| 3432 | ;; | ||
| 3433 | AND AX,STAT_ERROR ;; any error returned by normal device? | ||
| 3434 | JNZ CTL_DEV_ERR ;; | ||
| 3435 | DEC CX ;; | ||
| 3436 | JNZ CTL_NEXT_BYTE ;; | ||
| 3437 | ;; | ||
| 3438 | POP ES ;; stack -4 | ||
| 3439 | POP SI ;; stack -3 | ||
| 3440 | POP DI ;; stack -2 | ||
| 3441 | JMP IVK_CP ;; | ||
| 3442 | ;; | ||
| 3443 | CTL_DEV_ERR : ;; | ||
| 3444 | POP ES ;; stack -4 | ||
| 3445 | POP SI ;; stack -3 | ||
| 3446 | POP DI ;; stack -2 | ||
| 3447 | POP CX ;; stack -1 | ||
| 3448 | JMP IVK_DEVERR ;; | ||
| 3449 | ;; | ||
| 3450 | ;; ********************************** | ||
| 3451 | ;; ** ADJUST WHICH CODEPAGE TO BE ** | ||
| 3452 | ;; ** ACTIVE ** | ||
| 3453 | ;; ********************************** | ||
| 3454 | ;; | ||
| 3455 | ;; -- set the attribute bit of the | ||
| 3456 | ;; slot (SLT_AT) to active for | ||
| 3457 | ;; the code page just invoked. | ||
| 3458 | ;; -- reset others to non-active. | ||
| 3459 | ;; | ||
| 3460 | ;; | ||
| 3461 | IVK_CP: ;; SI = start of the slots compared | ||
| 3462 | ;; DI = where code page was found | ||
| 3463 | POP CX ;; stack -1 | ||
| 3464 | PUSH SI ;; stack 1 = start of slots compared | ||
| 3465 | mov AX,BUF.STATUS ;; | ||
| 3466 | AND AX,LOADED ;; | ||
| 3467 | MOV AX,AT_ACT ;; | ||
| 3468 | JZ NO_LOAD ;; | ||
| 3469 | OR AX,AT_RAM1 ;; reset loaded to physical RAM #1, | ||
| 3470 | ;; this is reset only when there is | ||
| 3471 | ;; font loading in this round of invoke | ||
| 3472 | NO_LOAD: ;; (for RAM codepages only) | ||
| 3473 | NOT AX ;; | ||
| 3474 | NXT_CP: ;; | ||
| 3475 | AND CS:[SI].SLT_AT,AX ;; not active (and not loaded) | ||
| 3476 | INC SI ;; | ||
| 3477 | INC SI ;; | ||
| 3478 | INC SI ;; | ||
| 3479 | INC SI ;; | ||
| 3480 | DEC CX ;; | ||
| 3481 | JNZ NXT_CP ;; | ||
| 3482 | OR CS:[DI].SLT_AT,AT_ACT ;; the codepage found becomes active | ||
| 3483 | MOV AX,BUF.STATUS ;; | ||
| 3484 | AND AX,LOADED ;; | ||
| 3485 | JZ HWCP_RESET ;; | ||
| 3486 | OR CS:[DI].SLT_AT,AT_RAM1 ;; the font has just been loaded | ||
| 3487 | AND BUF.STATUS,NOT LOADED ;; | ||
| 3488 | ;; | ||
| 3489 | HWCP_RESET : ;; | ||
| 3490 | ;; | ||
| 3491 | POP SI ;; stack -1 (slot : ATs adjusted ) | ||
| 3492 | PUSH SI ;; stack 1 = start of slots compared | ||
| 3493 | ;; | ||
| 3494 | MOV DI,BUF.HARDSO ;; | ||
| 3495 | CMP SI,DI ;; | ||
| 3496 | JE RAM_RESET ;; | ||
| 3497 | ;; HWCP's AT to be reset | ||
| 3498 | MOV CX,BUF.HSLMX ;; | ||
| 3499 | AND CX,CX ;; | ||
| 3500 | JZ RAM_RESET ;; | ||
| 3501 | MOV AX,AT_ACT ;; | ||
| 3502 | NOT AX ;; | ||
| 3503 | RESET_HWCP : ;; | ||
| 3504 | AND CS:[DI].SLT_AT,AX ;; HWCP is not active | ||
| 3505 | INC DI ;; | ||
| 3506 | INC DI ;; | ||
| 3507 | INC DI ;; | ||
| 3508 | INC DI ;; | ||
| 3509 | DEC CX ;; | ||
| 3510 | JNZ RESET_HWCP ;; | ||
| 3511 | ;; | ||
| 3512 | ;; | ||
| 3513 | RAM_RESET: ;; | ||
| 3514 | ;; | ||
| 3515 | POP SI ;; stack -1 (slot : ATs adjusted ) | ||
| 3516 | PUSH SI ;; stack 1 = start of slots compared | ||
| 3517 | ;; | ||
| 3518 | MOV DI,BUF.RAMSO ;; | ||
| 3519 | CMP SI,DI ;; | ||
| 3520 | JE ALL_RESET ;; | ||
| 3521 | ;; HWCP's AT to be reset | ||
| 3522 | MOV CX,BUF.RSLMX ;; | ||
| 3523 | AND CX,CX ;; HWCP's no. | ||
| 3524 | JZ ALL_RESET ;; | ||
| 3525 | MOV AX,AT_ACT ;; | ||
| 3526 | NOT AX ;; | ||
| 3527 | RESET_RAM : ;; | ||
| 3528 | AND CS:[DI].SLT_AT,AX ;; HWCP is not active | ||
| 3529 | INC DI ;; | ||
| 3530 | INC DI ;; | ||
| 3531 | INC DI ;; | ||
| 3532 | INC DI ;; | ||
| 3533 | DEC CX ;; | ||
| 3534 | JNZ RESET_RAM ;; | ||
| 3535 | ;; | ||
| 3536 | ALL_RESET : ;; | ||
| 3537 | POP SI ;; stack -1 | ||
| 3538 | ;; | ||
| 3539 | XOR AX,AX ;; | ||
| 3540 | JMP IVK_RET ;; | ||
| 3541 | ;; | ||
| 3542 | NO_INVOKE : ;; | ||
| 3543 | ;; | ||
| 3544 | MOV AX,STAT_NOCPIV ;; | ||
| 3545 | JMP IVK_RET ;; | ||
| 3546 | ;; | ||
| 3547 | IVK_DEVERR : ;; | ||
| 3548 | MOV AX,STAT_DEVERR ;; | ||
| 3549 | JMP IVK_RET ;G; | ||
| 3550 | ;; | ||
| 3551 | IVK_CMDERR : ;G; | ||
| 3552 | MOV AX,STAT_CMDERR ;G; | ||
| 3553 | ;; | ||
| 3554 | IVK_RET : ;; | ||
| 3555 | LES DI,dword ptr buf.rh_ptro;; | ||
| 3556 | MOV RH.RHC_STA,AX ;; | ||
| 3557 | ;; | ||
| 3558 | RET ;; | ||
| 3559 | ;; | ||
| 3560 | INVOKE ENDP ;; | ||
| 3561 | ;; | ||
| 3562 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 3563 | Prt_Status_Check proc near ;AN001; | ||
| 3564 | ;Check the printer device status | ||
| 3565 | ;Out) if Zero flag set - Ok. | ||
| 3566 | ; All registers saved. | ||
| 3567 | |||
| 3568 | push es ;AN001; | ||
| 3569 | push si ;AN001; | ||
| 3570 | |||
| 3571 | mov si, BUF.RNORMO ;AN001; | ||
| 3572 | mov cs:[si].RHC_LEN, 13 ;AN001; | ||
| 3573 | mov cs:[si].RHC_CMD, 10 ;AN001;device driver status check | ||
| 3574 | |||
| 3575 | push di ;AN001; | ||
| 3576 | push bx ;AN001; | ||
| 3577 | |||
| 3578 | push bx ;AN001; | ||
| 3579 | pop di ;AN001; | ||
| 3580 | push cs ;AN001; | ||
| 3581 | pop es ;AN001;ES:BX -> REQ_NORMn (was cs:si) | ||
| 3582 | mov bx, si ;AN001; | ||
| 3583 | |||
| 3584 | call dword ptr cs:[di].LPT_STRAO ;AN001;Strategy | ||
| 3585 | call dword ptr cs:[di].LPT_INTRO ;AN001;Intrrupt | ||
| 3586 | test cs:[si].RHC_STA, STAT_ERROR ;AN001; | ||
| 3587 | pop bx ;AN001; | ||
| 3588 | pop di ;AN001; | ||
| 3589 | |||
| 3590 | pop si ;AN001; | ||
| 3591 | pop es ;AN001; | ||
| 3592 | ret ;AN001; | ||
| 3593 | Prt_Status_Check endp ;AN001; | ||
| 3594 | |||
| 3595 | |||
| 3596 | |||
| 3597 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 3598 | ;; | ||
| 3599 | ;;==== Generic IOCTL Query Invoked ======= | ||
| 3600 | ;; | ||
| 3601 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 3602 | ;; | ||
| 3603 | Q_INVOKED PROC ;; | ||
| 3604 | push ds ;; | ||
| 3605 | ;; | ||
| 3606 | MOV AX,BUF.STATE ;; ??????????????? | ||
| 3607 | CMP AX,LOCKED ;; WGR ;AN000; | ||
| 3608 | JNE QI_0 ;; WGR ;AN000; | ||
| 3609 | MOV AX,BUF.SAVED_CP ;; WGR ;AN000; | ||
| 3610 | LDS SI,RH.GIH_GBA ;; WGR ;AN000; | ||
| 3611 | CMP AX,-1 ;; WGR ;AN000; | ||
| 3612 | JE QIV_NOACT ;; WGR ;AN000; | ||
| 3613 | JMP QI_1 ;; WGR ;AN000; | ||
| 3614 | QI_0: ;; WGR ;AN000; | ||
| 3615 | CMP AX,CPSW ;; reject only in NORMAL !!!! | ||
| 3616 | JNE QIV_CMDERR ;G; | ||
| 3617 | ;;------------------------- | ||
| 3618 | LDS SI,RH.GIH_GBA ;; | ||
| 3619 | ;; | ||
| 3620 | MOV DI,BUF.RAMSO ;; | ||
| 3621 | MOV CX,BUF.RSLMX ;; | ||
| 3622 | AND CX,CX ;; | ||
| 3623 | JZ QIV_HARD ;; | ||
| 3624 | ;; | ||
| 3625 | QIV_RAMLP : ;; | ||
| 3626 | MOV AX,CS:[DI].SLT_AT ;; check the RAM slots | ||
| 3627 | AND AX,AT_ACT ;; | ||
| 3628 | JNZ QIV_FOUND ;; | ||
| 3629 | INC DI ;; | ||
| 3630 | INC DI ;; | ||
| 3631 | INC DI ;; | ||
| 3632 | INC DI ;; | ||
| 3633 | DEC CX ;; | ||
| 3634 | JNZ QIV_RAMLP ;; | ||
| 3635 | ;; | ||
| 3636 | QIV_HARD : ;; | ||
| 3637 | MOV DI,BUF.HARDSO ;; | ||
| 3638 | MOV CX,BUF.HSLMX ;; | ||
| 3639 | AND CX,CX ;; | ||
| 3640 | JZ QIV_NOACT ;; | ||
| 3641 | ;; | ||
| 3642 | QIV_HARDLP : ;; | ||
| 3643 | MOV AX,CS:[DI].SLT_AT ;; check the RAM slots | ||
| 3644 | AND AX,AT_ACT ;; | ||
| 3645 | JNZ QIV_FOUND ;; | ||
| 3646 | INC DI ;; | ||
| 3647 | INC DI ;; | ||
| 3648 | INC DI ;; | ||
| 3649 | INC DI ;; | ||
| 3650 | DEC CX ;; | ||
| 3651 | JNZ QIV_HARDLP ;; | ||
| 3652 | ;; | ||
| 3653 | QIV_NOACT : ;; | ||
| 3654 | ;; | ||
| 3655 | MOV AX,STAT_NOCPIV ;; | ||
| 3656 | JMP QIV_RET ;; | ||
| 3657 | ;; | ||
| 3658 | ;; | ||
| 3659 | QIV_FOUND : ;; | ||
| 3660 | MOV AX,CS:[DI].SLT_CP ;; | ||
| 3661 | QI_1: ;; WGR ;AN000; | ||
| 3662 | MOV GIOB.GB2_LEN,2 ;; | ||
| 3663 | MOV GIOB.GB2_CP,AX ;; | ||
| 3664 | ;; | ||
| 3665 | XOR AX,AX ;; | ||
| 3666 | JMP QIV_RET ;; | ||
| 3667 | ;; | ||
| 3668 | QIV_DEVERR : ;; | ||
| 3669 | MOV AX,STAT_DEVERR ;; | ||
| 3670 | JMP QIV_RET ;G; | ||
| 3671 | ;; | ||
| 3672 | QIV_CMDERR : ;G; | ||
| 3673 | MOV AX,STAT_CMDERR ;G; | ||
| 3674 | ;; | ||
| 3675 | QIV_RET : ;; | ||
| 3676 | LES DI,dword ptr buf.rh_ptro ;; | ||
| 3677 | MOV RH.RHC_STA,AX ;; | ||
| 3678 | ;; | ||
| 3679 | pop ds ;; | ||
| 3680 | ;; | ||
| 3681 | RET ;; | ||
| 3682 | ;; | ||
| 3683 | Q_INVOKED ENDP ;; | ||
| 3684 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 3685 | ;; | ||
| 3686 | ;;==== Generic IOCTL Query List ======= | ||
| 3687 | ;; | ||
| 3688 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 3689 | Q_LIST PROC ;; | ||
| 3690 | ;; | ||
| 3691 | push ds ;; | ||
| 3692 | ;; | ||
| 3693 | MOV AX,BUF.STATE ;; ???????????????? | ||
| 3694 | CMP AX,CPSW ;; reject only in NORMAL | ||
| 3695 | JE QLS_CPSW ;; | ||
| 3696 | CMP AX,LOCKED ;; WGR ;AN000; | ||
| 3697 | JE QLS_CPSW ;; WGR ;AN000; | ||
| 3698 | JMP QLS_CMDERR ;G; | ||
| 3699 | QLS_CPSW : ;;------------------------- | ||
| 3700 | LDS SI,RH.GIH_GBA ;; | ||
| 3701 | PUSH SI ;; stack 1 -- GB3 (SI) | ||
| 3702 | ;; | ||
| 3703 | MOV DI,BUF.HARDSO ;; | ||
| 3704 | MOV CX,BUF.HARDMX ;; | ||
| 3705 | MOV DX,BUF.HSLMX ;; DX = number of entries | ||
| 3706 | LEA SI,[SI].GB3_GBL ;; | ||
| 3707 | MOV GIOB.GBL_LEN,CX ;; | ||
| 3708 | ;; | ||
| 3709 | QL_HARDLP: ;; | ||
| 3710 | AND CX,CX ;; | ||
| 3711 | JZ QL_PREPARE ;; | ||
| 3712 | MOV AX,CS:[DI].SLT_CP ;; | ||
| 3713 | MOV GIOB.GBL_CP,AX ;; | ||
| 3714 | INC DI ;; | ||
| 3715 | INC DI ;; | ||
| 3716 | INC DI ;; | ||
| 3717 | INC DI ;; | ||
| 3718 | INC SI ;; | ||
| 3719 | INC SI ;; | ||
| 3720 | DEC CX ;; | ||
| 3721 | JMP QL_HARDLP ;; | ||
| 3722 | ;; | ||
| 3723 | QL_PREPARE: ;; | ||
| 3724 | MOV CX,BUF.HSLMX ;; | ||
| 3725 | SUB CX,BUF.HARDMX ;; less the no. of HWCP | ||
| 3726 | MOV DX,BUF.RSLMX ;; | ||
| 3727 | ADD DX,CX ;; DX = total number of entries | ||
| 3728 | INC SI ;; | ||
| 3729 | INC SI ;; | ||
| 3730 | MOV GIOB.GBL_LEN,DX ;; | ||
| 3731 | QL_CARTLP: ;; | ||
| 3732 | AND CX,CX ;; | ||
| 3733 | JZ QL_RAM_PREP ;; | ||
| 3734 | MOV AX,CS:[DI].SLT_CP ;; | ||
| 3735 | MOV GIOB.GBL_CP,AX ;; | ||
| 3736 | INC DI ;; | ||
| 3737 | INC DI ;; | ||
| 3738 | INC DI ;; | ||
| 3739 | INC DI ;; | ||
| 3740 | INC SI ;; | ||
| 3741 | INC SI ;; | ||
| 3742 | DEC CX ;; | ||
| 3743 | JMP QL_CARTLP ;; | ||
| 3744 | ;; | ||
| 3745 | ;; | ||
| 3746 | QL_RAM_PREP: ;; | ||
| 3747 | MOV DI,BUF.RAMSO ;; | ||
| 3748 | MOV CX,BUF.RSLMX ;; | ||
| 3749 | ;; | ||
| 3750 | QL_RAMLP : ;; | ||
| 3751 | AND CX,CX ;; | ||
| 3752 | JZ QL_DONE ;; | ||
| 3753 | MOV AX,CS:[DI].SLT_CP ;; | ||
| 3754 | MOV GIOB.GBL_CP,AX ;; | ||
| 3755 | INC DI ;; | ||
| 3756 | INC DI ;; | ||
| 3757 | INC DI ;; | ||
| 3758 | INC DI ;; | ||
| 3759 | INC SI ;; | ||
| 3760 | INC SI ;; | ||
| 3761 | DEC CX ;; | ||
| 3762 | JMP QL_RAMLP ;; | ||
| 3763 | ;; | ||
| 3764 | QL_DONE: ;; | ||
| 3765 | POP SI ;; stack -1 | ||
| 3766 | mov dx,buf.hslmx ;; | ||
| 3767 | add DX,BUF.RSLMX ;; | ||
| 3768 | INC DX ;; | ||
| 3769 | INC DX ;; | ||
| 3770 | MOV CX,1 ;; | ||
| 3771 | SHL DX,CL ;; | ||
| 3772 | MOV GIOB.GB3_LEN,DX ;; | ||
| 3773 | ;; | ||
| 3774 | XOR AX,AX ;; | ||
| 3775 | CMP DX,GB3_MINILEN ;; min. GBL length | ||
| 3776 | JA QLS_RET ;; | ||
| 3777 | MOV AX,STAT_NOCP ;; | ||
| 3778 | JMP QLS_RET ;; | ||
| 3779 | ;; | ||
| 3780 | QLS_DEVERR : ;; | ||
| 3781 | MOV AX,STAT_DEVERR ;; | ||
| 3782 | JMP QLS_RET ;G; | ||
| 3783 | ;; | ||
| 3784 | QLS_CMDERR : ;G; | ||
| 3785 | MOV AX,STAT_CMDERR ;G; | ||
| 3786 | ;; | ||
| 3787 | QLS_RET : ;; | ||
| 3788 | LES DI,dword ptr buf.rh_ptro ;; | ||
| 3789 | MOV RH.RHC_STA,AX ;; | ||
| 3790 | ;; | ||
| 3791 | pop ds ;; | ||
| 3792 | RET ;; | ||
| 3793 | ;; | ||
| 3794 | Q_LIST ENDP ;; | ||
| 3795 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 3796 | ; | ||
| 3797 | ; CHECK_PRINT_ACTIVE | ||
| 3798 | ; | ||
| 3799 | ; THIS ROUTINE IS CALLED BEFORE THE INVOKE, DESIGNATE | ||
| 3800 | ; COMMANDS ARE OPERATED ON. THIS IS TO PREVENT CONFLICT | ||
| 3801 | ; BETWEEN THE BACKGROUND PRINTING AND THE DOWNLOAD SEQUENCE. | ||
| 3802 | ; | ||
| 3803 | ; INPUT: | ||
| 3804 | ; CS:[BX].DEV_HDRO OFFSET AND SEGMENT OF ACTIVE DEVICE | ||
| 3805 | ; CS:[BX].DEV_HDRS | ||
| 3806 | ; | ||
| 3807 | ; WARNING: IF ANOTHER DEVICE DRIVER IS TO TAKE THE LPTx, THEN | ||
| 3808 | ; THIS WILL not FIND OUT THAT THE PRINTER.SYS IS ACTIVE. | ||
| 3809 | ; | ||
| 3810 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 3811 | CHECK_PRINT_ACTIVE PROC ;G; | ||
| 3812 | PUSH AX ;G; SAVE THE REGISTERS............ | ||
| 3813 | PUSH SI ;G; | ||
| 3814 | PUSH DI ;G; | ||
| 3815 | PUSH DS ;G; | ||
| 3816 | PUSH ES ;G; | ||
| 3817 | ;G; | ||
| 3818 | MOV DI,BUF.DEV_HDRS ;G; SETUP ES: = ACTIVE DEVICE SEGMENT | ||
| 3819 | MOV ES,DI ;G; & | ||
| 3820 | MOV DI,BUF.DEV_HDRO ;G; SETUP DI: = ACTIVE DEVICE OFFSET | ||
| 3821 | ;G; | ||
| 3822 | MOV AX,0106H ;G; PRINT (GET LIST DEVICE) | ||
| 3823 | CLC ;G; | ||
| 3824 | JNC CPA_5 ;G; CY=0 IF NOT LOADED/NOT ACTIVE | ||
| 3825 | ;G; | ||
| 3826 | CMP SI,DI ;G; ES:DI POINTS TO THE ACTIVE DEVICE | ||
| 3827 | JNE CPA_5 ;G; | ||
| 3828 | MOV SI,DS ;G; | ||
| 3829 | MOV DI,ES ;G; | ||
| 3830 | CMP SI,DI ;G; | ||
| 3831 | JNE CPA_5 ;G; | ||
| 3832 | STC ;G; OTHERWISE, THIS DEVICE IS PRESENTLY | ||
| 3833 | JMP CPA_6 ;G; UNDER PRINT!!! PREVENT DATASTREAM | ||
| 3834 | ;G; CONFLICT IN THIS CASE. | ||
| 3835 | ;G; | ||
| 3836 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;G; PRINT.COM IS ASLEEP OR IS NOT | ||
| 3837 | ;G; PRESENTLY LOADED. THE PRINTER.SYS | ||
| 3838 | CPA_5: CLC ;G; CAN CONTINUE IT PROCESS! | ||
| 3839 | CPA_6: POP ES ;G; RESTORE REGISTERS..... | ||
| 3840 | POP DS ;G; | ||
| 3841 | POP DI ;G; | ||
| 3842 | POP SI ;G; | ||
| 3843 | POP AX ;G; | ||
| 3844 | RET ;G; | ||
| 3845 | CHECK_PRINT_ACTIVE ENDP ;G; | ||
| 3846 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 3847 | |||
| 3848 | |||
| 3849 | |||
| 3850 | CSEG ENDS | ||
| 3851 | END | ||