]>
wirehaze git hosting - MS-DOS.git/blob - v4.0/src/DEV/PRINTER/CPSPM10.ASM
2 TITLE DOS
- Code Page Switching
- Printer Device Driver
3 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5 ;; FILENAME: CPS Printer Device Driver Main Code
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.
15 ;; This routine is structured as a DOS Device Driver.
16 ;; IE it is installed via the CONFIG.SYS command:
18 ;; The following device commands are supported:
26 ;; Supported in between Designate-start and the Designate_end commands.
31 ;; CPS Function request : Major function = 05 -- printer device
32 ;; Minor functions = 4CH -- designate start
33 ;; 4DH -- designate end
35 ;; 6AH -- query-invoked
38 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
39 ;*Modification history ********************************************************
40 ;AN001; p2685 Long delay on CHCP before failure message 12/10/87 J.K.
41 ;******************************************************************************
43 INCLUDE CPSPEQU
.INC ;;
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
;;
56 EXTRN RESIDENT_END
:WORD ;;
57 EXTRN STACK_ALLOCATED
:WORD ;;
58 EXTRN FONT_PARSER
:NEAR,FTABLE
:WORD ;;
62 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
65 CSEG
SEGMENT PARA
PUBLIC 'CODE' ;;
68 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
70 ;; ************************************
72 ;; ** Resident Code **
74 ;; ************************************
77 ;; DEVICE HEADER - must be at offset zero within device driver
78 ;; (DHS is defined according to this structure)
80 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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)
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)
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)
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)
116 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
117 ;; *****************************
118 ;; ** Resident Data Areas **
119 ;; *****************************
121 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
123 ; PRN/LPTn printer data based on BUF
125 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
127 INIT_CHK
DW 0 ;; internal flag : error loc. in INIT
129 BUF0: BUF_DATA
<,,,,,,,,,,> ;; PRN
131 BUF1: BUF_DATA
<,,,,,,,,,,> ;; LPT1
133 BUF2: BUF_DATA
<,,,,,,,,,,> ;; LPT2
135 BUF3: BUF_DATA
<,,,,,,,,,,> ;; LPT3
137 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
139 ; Hard/RAM slots table in the order of DEVICE parameters
141 ; number of entries in all HARD_SLn is determined by the max. {HSLOTS}
144 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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 ;;
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 ;;
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 ;;
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 ;;
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
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
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
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
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
280 ;;upto hardsl_max+1, there are as many HARD_SLn
282 HBUF_SL2
LABEL WORD ;; hardware slots' buffer for LPT2
283 DW 0FFFFH ;; ---- only for CART-SLOTS
296 ;;upto hardsl_max+1, there are as many HARD_SLn
298 HBUF_SL3
LABEL WORD ;; hardware slots' buffer for LPT3
299 DW 0FFFFH ;; ---- only for CART-SLOTS
312 ;;upto hardsl_max+1, there are as many HARD_SLn
315 RBUF_SL1
LABEL WORD ;; ram slots' buffer for LPT1/PRN
328 ;;upto ramsl_max, there are as many RAM_SLn
330 RBUF_SL2
LABEL WORD ;; ram slots' buffer for LPT2
343 ;;upto ramsl_max, there are as many RAM_SLn
345 RBUF_SL3
LABEL WORD ;; ram slots' buffer for LPT3
358 ;;upto ramsl_max, there are as many RAM_SLn
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
374 ;;upto the max. of {ramsl_max,hardsl_max}
376 FTDL_OFF2
LABEL WORD ;; offset of FTSTART for LPT2
390 ;;upto the max. of {ramsl_max,hardsl_max}
392 FTDL_OFF3
LABEL WORD ;; offset of FTSTART for LPT3
406 ;;upto the max. of {ramsl_max,hardsl_max}
411 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
413 ; Printer Description Tables
415 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
421 PRINTER_DESC_NUM
DW 3 ;; number of PRINTER_DESCn
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
) ;;
430 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
432 ; Printer Description Table for Proprinter (4201)
434 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
437 PDSH
<,'4201 ',,,0,212,1,1,1> ;; followed by the rest in PDS
439 ;; FTSZPA = 212 ==> 212 x 16=3008 bytes
441 ;; HSLOTS = 1 (check CTL4201_B)
443 ;; RSLOTS = 1 (check CTL4201_B)
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
456 CTL4201_B
DB CTL_MAX
DUP (0) ;; max. two selection
457 DB CTL_MAX
DUP (0) ;;
459 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
461 ; Printer Description Table for 5202
463 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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
471 ;; HSLOTS = 2 (check CTL5202_B)
473 ;; RSLOTS = 0 (check CTL5202_B)
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
484 DB 12,ESC_CHAR
,91,84,5,0,00,00,0FFH,0FFH,00 ;; selection control 2
486 db 19 dup (0) ;; for CTL5202_H selection 1
487 db 19 dup (0) ;; for CTL5202_H selection 2
490 CTL5202_B
DB CTL_MAX
DUP (0) ;; max. two selection
491 DB CTL_MAX
DUP (0) ;;
493 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
495 ; Printer Description Table for RESERVED PRINTER (res1)
497 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
500 PDSH
<,'4208 ',,,1,2,2,1,0> ;; followed by the rest in PDS
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
518 CTL4208_R
: DB 0Bh,ESC_CHAR
,49h
,0Eh ;; selection control 2
522 db 20 dup (0) ;; for CTLres1_H and CTRLres1_R
524 CTL4208_B
DB CTL_MAX
DUP (0) ;; max. two selection
525 DB CTL_MAX
DUP (0) ;;
528 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
530 ; Printer Description Table for RESERVED PRINTER (res2)
532 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
535 PDSH
<,'nnnnnnnn',,,0,0,1,1,1> ;; followed by the rest in PDS
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
552 CTLres2_B
DB CTL_MAX
DUP (0) ;; max. two selection
553 DB CTL_MAX
DUP (0) ;;
555 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
560 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
562 ;; The request header for IOCTL call
563 ;; to the Normal device driver
566 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
568 REQ_NORM1 GIH
<,,,,,> ;; for LPT1/PRN
570 REQ_NORM2 GIH
<,,,,,> ;; for LPT2
572 REQ_NORM3 GIH
<,,,,,> ;; for LPT3
574 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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.
585 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
587 ; TABLE STRUCTURE FOR RETURNING VALUES TO THE INIT MODULE WGR
588 ; (ADAPTED FROM VERSION 1.0 DISPLAY.SYS) WGR
590 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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;
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;
607 TABLE1_2
LABEL WORD ; device name (ie. PRN) ;AN000;
608 DW ZERO
; length ;AN000;
609 DB " " ; value ;AN000;
611 TABLE1_3
LABEL WORD ; device id. (eg. 4201,5202..) ;AN000;
612 DW ZERO
; length ;AN000;
613 DB " " ; value ;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;
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;
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;
641 TABLE2_2
LABEL WORD ; device name (ie. PRN) ;AN000;
642 DW ZERO
; length ;AN000;
643 DB " " ; value ;AN000;
645 TABLE2_3
LABEL WORD ; device id. (eg. 4201,5202..) ;AN000;
646 DW ZERO
; length ;AN000;
647 DB " " ; value ;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;
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;
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;
675 TABLE3_2
LABEL WORD ; device name (ie. PRN) ;AN000;
676 DW ZERO
; length ;AN000;
677 DB " " ; value ;AN000;
679 TABLE3_3
LABEL WORD ; device id. (eg. 4201,5202..) ;AN000;
680 DW ZERO
; length ;AN000;
681 DB " " ; value ;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;
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;
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;
709 TABLE4_2
LABEL WORD ; device name (ie. PRN) ;AN000;
710 DW ZERO
; length ;AN000;
711 DB " " ; value ;AN000;
713 TABLE4_3
LABEL WORD ; device id. (eg. 4201,5202..) ;AN000;
714 DW ZERO
; length ;AN000;
715 DB " " ; value ;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;
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;
735 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
736 reserved1
DW ?
;; reserved for debugging used
739 ;;;;;;;;ASSUME DS:NOTHING ;;
740 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
742 ;; PRN Device "strategy" entry point
744 ;; Retain the Request Header address for use by Interrupt routine
746 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
747 STRATEGY0 PROC
FAR ;;
750 LEA BX, BUF0
;; BUF = BUF0 CS:[BX]
751 POP buf
.RH_PTRO
;; offset of request header
752 MOV buf
.RH_PTRS
,ES ;; segment
756 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
758 ;; LPT1 Device "strategy" entry point
760 ;; Retain the Request Header address for use by Interrupt routine
762 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
763 STRATEGY1 PROC
FAR ;;
766 LEA BX, BUF1
;; BUF = BUF1 CS:[BX]
767 POP buf
.RH_PTRO
;; offset of request header
768 MOV buf
.RH_PTRS
,ES ;; segment
772 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
774 ;; LPT2 Device "strategy" entry point
776 ;; Retain the Request Header address for use by Interrupt routine
778 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
779 STRATEGY2 PROC
FAR ;;
782 LEA BX, BUF2
;; BUF = BUF2 CS:[BX]
783 POP buf
.RH_PTRO
;; offset of request header
784 MOV buf
.RH_PTRS
,ES ;; segment
788 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
790 ;; LPT3 Device "strategy" entry point
792 ;; Retain the Request Header address for use by Interrupt routine
794 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
795 STRATEGY3 PROC
FAR ;;
798 LEA BX, BUF3
;; BUF = BUF3 CS:[BX]
799 POP buf
.RH_PTRO
;; offset of request header
800 MOV buf
.RH_PTRS
,ES ;; segment
804 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
806 ;; Table of command / functions supported by LPTn
808 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
809 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
810 ;; CMD_CODES code supported by LPTn
811 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
812 CMD_CODES
LABEL BYTE ;;
813 DB CMD_INI
;; Initialization
817 CMD_INDX EQU
($-CMD_CODES
) ;; number of entries in CMD_CODES
819 ;; Write (CMD_WRT) has exceptional
822 ;; Generic IOCTL (CMD_GIO) leads to
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
838 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
839 ;; Cases supported by LPTn
840 ;; -- first section matched with
841 ;; CMD_CODES upto CMD_INDX
843 ;; -- 2nd section matched with
844 ;; GIO_CODES for GIO_INDEX more
845 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
846 CASES
LABEL WORD ;; in CMD_CODES order
847 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
849 DW OFFSET INIT
;; 0 - Initialization
854 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
855 ;; in GIO_CODES order
856 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
858 DW OFFSET DESIGNATE_START
;;
859 DW OFFSET DESIGNATE_END
;;
861 DW OFFSET Q_INVOKED
;;
865 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
869 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
873 MEM_REQUEST
DW -1 ;; flag used for first time memory
874 ;; allocation for each device
876 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
878 ;; PRN Device "interrupt" entry point
880 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
882 INTERRUPT0 PROC
FAR ;; device interrupt entry point
884 PUSH DS ;; save all registers Revised
892 ;; BP isn't used, so it isn't saved
896 CMP STACK_ALLOCATED
,0AAH ;;
899 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
901 ; STACK RECODING SEPT 28/86
904 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
905 MOV AX,STACK_SIZE
;G;
910 MOV CS:TEMP_SI
,SI ;G;
911 MOV SI,RESIDENT_END
;G;
912 SUB SI,STACK_SIZE
;G;
923 MOV SI,CS:TEMP_SI
;G;
924 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
925 PUSH DX ;; SAVE OLD SS ONTO STACK
926 PUSH CX ;; " " SP " "
931 MOV DI,OFFSET IRPT_CMD_EXIT
;; return addr from command processor
933 PUSH DI ;; push return address onto stack
934 ;; command routine issues "RET"
936 LEA BX, BUF0
;; PRN BUF = BUF0 , CS:BX
938 MOV MEM_REQUEST
,-1 ;; to be set to zero only once
942 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
943 MOV BUF
.BFLAG
,BF_PRN
;; INITIALIZE PRN BUFFER
945 MOV DI,OFFSET DEV_HDR0
;; PRN Device header
946 MOV BUF
.DEV_HDRO
,DI ;;
947 MOV BUF
.DEV_HDRS
,CS ;; must be CS
949 MOV DI,OFFSET HBUF_SL1
;; PRN/LPT1 buffer for Hardware-slots
952 MOV DI,OFFSET RBUF_SL1
;; PRN/LPT1 buffer for RAM-slots
955 MOV DI,OFFSET FTDL_OFF1
;;
958 MOV DI,OFFSET REQ_NORM1
;; PRN/LPT1 request header
961 MOV BUF
.FSELEN
,0 ;; selection control length
963 mov buf
.prn_bufo
,offset buf0
;;
965 JMP COMMON_INTR
;; common interrupt handler
967 PRN_INITED
: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
968 ;; FONT BUFFER TO BE CREATED ?
969 CMP BUF
.BFLAG
,BF_PRN
;;
972 OR BUF
.BFLAG
,BF_MEM_DONE
;; do it only once.
974 CMP BUF
.STATE
,CPSW
;;
975 JNE PRN_MEM_DONE
;; create only if state is CPSW
978 XOR AX,AX ;; THEN CREATE
979 MOV MEM_REQUEST
,AX ;; to set to zero only once for each
982 JMP COMMON_INTR
;; common interrupt handler
984 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
986 ;; LPT1 Device "interrupt" entry point
988 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
989 INTERRUPT1 PROC
FAR ;; device interrupt entry point
991 PUSH DS ;; save all registers Revised
999 ;; BP isn't used, so it isn't saved
1003 CMP STACK_ALLOCATED
,0AAH ;;
1004 JNE LPT1_NO_STACK
;;
1006 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1008 ; STACK RECODING SEPT 28/86
1011 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1012 MOV AX,STACK_SIZE
;G;
1017 MOV CS:TEMP_SI
,SI ;G;
1018 MOV SI,RESIDENT_END
;G;
1019 SUB SI,STACK_SIZE
;G;
1021 mov reserved1
,AX ;G;
1022 mov reserved2
,SI ;G;
1030 MOV SI,CS:TEMP_SI
;G;
1031 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1032 PUSH DX ;; SAVE OLD SS ONTO STACK
1033 PUSH CX ;; " " SP " "
1037 MOV DI,OFFSET IRPT_CMD_EXIT
;; return addr from command processor
1039 PUSH DI ;; push return address onto stack
1040 ;; command routine issues "RET"
1041 LEA BX, BUF1
;; LPT1 BUF = BUF1 , CS:BX
1043 MOV MEM_REQUEST
,-1 ;; to be set to zero only once
1047 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1048 MOV BUF
.BFLAG
,BF_LPT1
;; INITIALIZE LPT1 BUFFER
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
1057 LEA CX,BUF
.BUFEND
;;
1060 LEA SI,[SI].RNORMO
;;
1061 REP MOVS ES:BYTE PTR[DI],CS:[SI]
1063 JMP COMMON_INTR
;; common interrupt handler
1065 LPT1_INITED
: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1066 ;; FONT MEMORY TO BE CREATED ?
1067 CMP BUF
.BFLAG
,BF_LPT1
;;
1068 JNE LPT1_MEM_DONE
;;
1070 OR BUF
.BFLAG
,BF_MEM_DONE
;; no more next time
1072 CMP BUF
.STATE
,CPSW
;;
1073 JNE LPT1_MEM_DONE
;; do it only if state is CPSW
1075 LPT1_MEM_CREATE
: ;;
1076 XOR AX,AX ;; THEN CREATE MEMORY
1077 MOV MEM_REQUEST
,AX ;; to set to zero only once for each
1081 JMP COMMON_INTR
;; common interrupt handler
1084 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1086 ;; LPT2 Device "interrupt" entry point
1088 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1089 INTERRUPT2 PROC
FAR ;; device interrupt entry point
1091 PUSH DS ;; save all registers Revised
1099 ;; BP isn't used, so it isn't saved
1103 CMP STACK_ALLOCATED
,0AAH ;;
1104 JNE LPT2_NO_STACK
;;
1105 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1107 ; STACK RECODING SEPT 28/86
1109 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1110 MOV AX,STACK_SIZE
;G;
1115 MOV CS:TEMP_SI
,SI ;G;
1116 MOV SI,RESIDENT_END
;G;
1117 SUB SI,STACK_SIZE
;G;
1119 mov reserved1
,AX ;G;
1120 mov reserved2
,SI ;G;
1128 MOV SI,CS:TEMP_SI
;G;
1129 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1130 PUSH DX ;; SAVE OLD SS ONTO STACK
1131 PUSH CX ;; " " SP " "
1135 MOV DI,OFFSET IRPT_CMD_EXIT
;; return addr from command processor
1137 PUSH DI ;; push return address onto stack
1138 ;; command routine issues "RET"
1140 LEA BX, BUF2
;; LPT2 BUF = BUF2 , CS:BX
1142 MOV MEM_REQUEST
,-1 ;; to be set to zero only once
1146 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1147 MOV BUF
.BFLAG
,BF_LPT2
;; initialise LPT2 buffer
1149 MOV DI,OFFSET DEV_HDR2
;; LPT2 Device header
1150 MOV BUF
.DEV_HDRO
,DI ;;
1151 MOV BUF
.DEV_HDRS
,CS ;; must be CS
1153 MOV DI,OFFSET HBUF_SL2
;; LPT2 buffer for Hardware-slots
1154 MOV BUF
.HRBUFO
,DI ;;
1156 MOV DI,OFFSET RBUF_SL2
;; LPT2 buffer for RAM-slots
1157 MOV BUF
.RMBUFO
,DI ;;
1159 MOV DI,OFFSET FTDL_OFF2
;;
1163 MOV DI,OFFSET REQ_NORM2
;; LPT2 request header
1164 MOV BUF
.RNORMO
,DI ;;
1166 MOV BUF
.FSELEN
,0 ;; selection control length
1168 mov buf
.prn_bufo
,offset buf2
;;
1170 JMP COMMON_INTR
;; common interrupt handler
1172 LPT2_INITED
: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1173 ;; FONT BUFFER TO BE CREATED ?
1174 CMP BUF
.BFLAG
,BF_LPT2
;;
1175 JNE LPT2_MEM_DONE
;;
1177 OR BUF
.BFLAG
,BF_MEM_DONE
;;
1179 CMP BUF
.STATE
,CPSW
;;
1180 JNE LPT2_MEM_DONE
;;
1183 MOV MEM_REQUEST
,AX ;; to set to zero only once for each
1187 JMP COMMON_INTR
;; common interrupt handler
1190 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1192 ;; LPT3 Device "interrupt" entry point
1194 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1195 INTERRUPT3 PROC
FAR ;; device interrupt entry point
1197 PUSH DS ;; save all registers Revised
1205 ;; BP isn't used, so it isn't saved
1209 CMP STACK_ALLOCATED
,0AAH ;;
1210 JNE LPT3_NO_STACK
;;
1212 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1214 ; STACK RECODING SEPT 28/86
1216 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1217 MOV AX,STACK_SIZE
;G;
1222 MOV CS:TEMP_SI
,SI ;G;
1223 MOV SI,RESIDENT_END
;G;
1224 SUB SI,STACK_SIZE
;G;
1226 mov reserved1
,AX ;G;
1227 mov reserved2
,SI ;G;
1235 MOV SI,CS:TEMP_SI
;G;
1236 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1237 PUSH DX ;; SAVE OLD SS ONTO STACK
1238 PUSH CX ;; " " SP " "
1242 MOV DI,OFFSET IRPT_CMD_EXIT
;; return addr from command processor
1244 PUSH DI ;; push return address onto stack
1245 ;; command routine issues "RET"
1247 LEA BX, BUF3
;; LPT3 BUF = BUF3 , CS:BX
1249 MOV MEM_REQUEST
,-1 ;; to be set to zero only once
1253 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1254 MOV BUF
.BFLAG
,BF_LPT3
;; INITIALIZE LPT3 BUFFER
1256 MOV DI,OFFSET DEV_HDR3
;; LPT3 Device header
1257 MOV BUF
.DEV_HDRO
,DI ;;
1258 MOV BUF
.DEV_HDRS
,CS ;; must be CS
1260 MOV DI,OFFSET HBUF_SL3
;; LPT3 buffer for Hardware-slots
1261 MOV BUF
.HRBUFO
,DI ;;
1263 MOV DI,OFFSET RBUF_SL3
;; LPT3 buffer for RAM-slots
1264 MOV BUF
.RMBUFO
,DI ;;
1266 MOV DI,OFFSET FTDL_OFF3
;;
1270 MOV DI,OFFSET REQ_NORM3
;; LPT3 request header
1271 MOV BUF
.RNORMO
,DI ;;
1273 MOV BUF
.FSELEN
,0 ;; selection control length
1275 mov buf
.prn_bufo
,offset buf3
;;
1277 JMP COMMON_INTR
;; common interrupt handler
1279 LPT3_INITED
: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1280 ;; FONT BUFFER TO BE CREATED ?
1281 CMP BUF
.BFLAG
,BF_LPT3
;;
1282 JNE LPT3_MEM_DONE
;;
1284 OR BUF
.BFLAG
,BF_MEM_DONE
;; no more next time
1286 CMP BUF
.STATE
,CPSW
;;
1287 JNE LPT3_MEM_DONE
;;
1290 MOV MEM_REQUEST
,AX ;; to set to zero only once for each
1294 JMP COMMON_INTR
;; common interrupt handler
1297 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1299 ; Common interrupt entry :
1300 ; at entry, BUFn (CS:BX) of LPTn is defined
1302 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1304 CLD ;; all moves forward
1305 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1306 ; Check if header link has to be set
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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1323 JMP DOSLPT_FOUND
;; link not yet set up
1325 ;$SEARCH WHILE ;; pointer to next device header is NOT
1330 ;$LEAVE E, AND ;; leave if both offset and segment are
1341 LEA DI,NHD
.DH_NAME
;;
1342 LEA SI,HP
.DH_NAME
;;
1348 ;$EXITIF Z ;; exit if name is found in linked hd.
1349 JNZ L3
;; name is not found
1351 ;; name is found in the linked header
1352 MOV AX,NHD
.DH_STRAO
;; get the STRATEGY address
1354 MOV BUF
.LPT_STRAO
,AX ;;
1357 ; ADD AX,1000H ;; carrier overflow
1358 X1: MOV BUF
.LPT_STRAS
,AX ;;
1360 MOV AX,NHD
.DH_INTRO
;; get the INTERRUPT address
1362 MOV BUF
.LPT_INTRO
,AX ;;
1365 ; ADD AX,1000H ;; carrier overflow
1366 X2: MOV BUF
.LPT_INTRS
,AX ;;
1369 ;$ORELSE ;; find next header to have the same
1373 LES DI,DWORD PTR NHD
.DH_NEXTO
;
1381 DOSLPT_FOUND
: ;; device header link has been
1385 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1388 ; ES:DI Request Header , and
1390 ; CMD_CODES, GIO_CODES
1392 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1395 LES DI,dword ptr buf
.rh_ptro
;; get RH address passed to
1397 MOV AL,RH
.RHC_CMD
;;
1401 PUSH CS ;; non-GIO command
1403 MOV DI,OFFSET CMD_CODES
;;
1405 ;; find if command is in CMD_CODES ?
1408 MOV SI,CMD_INDX
;; the command is supported :
1410 DEC SI ;; index to CASES
1413 UN_SUP: JMP NORM_DRIVER
;; to be handled by DOS normal driver
1415 GIO_COMMAND
: ;; Check if it is valid GIO
1417 GIO_CASES
: ;; supported GIO command
1418 MOV AL,RH
.GIH_MIF
;;
1419 ;; use minor function to locate
1422 MOV DI,OFFSET GIO_CODES
;;
1424 ;; find if command is in GIO_CODES ?
1427 MOV SI,GIO_INDX
;; the command is supported :
1429 DEC SI ;; index to CASES
1432 SUPPORTED
: ;; command/functions supported by LPTn
1434 ADD SI,SI ;; double to index to WORD-offset
1436 XOR AX,AX ;; initialize return to "no error"
1438 LES DI,dword ptr buf
.rh_ptro
;; get RH address again
1440 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1441 ; At entry to command processing routine:
1443 ; ES:DI = Request Header address
1444 ; CS:BX = Buffer for lptn
1445 ; CS = code segment address
1448 ; top of stack is return address, IRPT_CMD_EXIT
1449 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1451 JMP CS:CASES
[SI] ;; call routine to handle the command
1454 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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
1464 ;; *** USING INTERNATL STACK ? ***
1466 CMP STACK_ALLOCATED
,-1 ;;
1469 CMP STACK_ALLOCATED
,0 ;;
1470 JNE RET0_IN_STACK
;;
1472 MOV STACK_ALLOCATED
,0AAH ;; NEXT interrupt will start using
1473 JMP RET0_NO_STACK
;; internal STACK
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
1486 POP SI ;; restore registers
1499 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1501 ;;==== Command not supported by CPSW device driver
1503 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1505 NORM_DRIVER PROC
;; LPT OUTPUT to the DOS LPTn
1507 PUSH BX ;; **** BUF. is changed ****
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.
1514 CALL DWORD PTR BUF
.LPT_INTRO
;; interrupt the DOS LPTn
1520 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1522 ;;==== Command Code - lpt_output =======
1524 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1526 WRITE PROC
;; LPT OUTPUT to the DOS LPTn
1530 LES DI,dword ptr buf
.rh_ptro
;; restore ES:DI as Request Header ptr
1534 JNE WRT_NOT_NORMAL
;;
1540 JMP NO_MORE_FTBLK
;; ignore the write
1546 ;;-------------------------
1547 WRT_DESIGNATE
: ;; DESIGNATE WRITE
1548 MOV AX,BUF
.STATUS
;;
1551 JMP WRT_IGNORE
;; already failed
1554 MOV SI,OFFSET FTABLE
;;
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
1563 LEA SI,[SI].BUFFER_ADDR
;; packet address
1564 MOV AX,RH
.RH3_DTAO
;;
1568 MOV AX,RH
.RH3_DTAS
;;
1572 FP_CALL
: ;; **************************
1573 CALL FONT_PARSER
;; ** Parse the Font File **
1574 FP_RETURN
: ;; **************************
1576 ;; -- only for the RAM slot --
1578 ;; PROCESS THE RETURNED FONT :
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
;;
1589 MOV CX,BUF
.HSLMX
;; -- with/without designate, <>0
1593 MOV DX,CS:[SI].NUM_FTBLK
;; DX = number fo code pages loaded
1595 ADD SI,TYPE FBUFS
;; SI = points to FTBLK
1596 ;;...................................
1597 PARSE_FTBLK
: ;; **** LOOP ****
1602 JMP NO_MORE_FTBLK
;; **** LOOP EXIT (FTBLK end) ****
1603 ;;...................................
1604 ;; **** LOOP (on each FTBLK) ****
1606 ;; skip on the slot until the codepage
1607 SKIP_SLOT
: ;; is one of the downloaded.
1612 POP ES ;; ES = 0, no font storage(less buffer)
1616 MOV AX,CS:[DI].SLT_AT
;;
1619 INC DI ;;######## NEXT SLOT ############
1625 ADD AX,BUF
.FTSZPA
;;
1627 POP ES ;; next buffer
1628 DEC CX ;;####################################
1632 MOV AX,CS:[SI].FTB_STATUS
;;
1636 OR BUF
.STATUS
,FAIL
;;
1638 LES DI,dword ptr buf
.rh_ptro
;;
1639 MOV RH
.RHC_STA
,AX ;;
1640 JMP WRITE_RET
;; **** LOOP EXIT (fail) ****
1643 CMP AX,FSTAT_FONT
;;
1646 MOV AX,CS:[SI].FTB_DLEN
;;
1648 JNZ FONT_RETURNED
;;
1650 NEXT_FTBLK
: ;; **** NEXT IN LOOP ****
1652 ADD SI,TYPE FTBLK
;; SI = points to FTBLK
1654 INC DI ;;######## NEXT SLOT ############
1660 ADD AX,BUF
.FTSZPA
;;
1662 POP ES ;; next buffer
1663 DEC CX ;;####################################
1665 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1667 ;; *********************************
1668 ;; * ANY SELECTION CONTROL TO BE *
1670 ;; *********************************
1673 ;; SI = points to FTBLK
1674 ;; ES = font buffer segment / 0
1676 ;; DI = SLOT pointer
1680 MOV AX,CS:[SI].FTB_SELECT
;;
1685 JMP SELECT_BAD
;; CLASS 1 printer CANNOT have SELECT=0
1696 JMP SELECT_CLASS1
;;
1699 MOV AX,CS:[SI].FTB_SELLEN
;; has this FTBLK already passed the
1700 AND AX,AX ;; select ?
1701 JNZ SELECT_NOT_PASSED
;;
1706 SELECT_NOT_PASSED
: ;;
1707 CMP AX,BUF
.FSELMAX
;;
1708 JNA SELECT_NOT_LONG
;;
1709 JMP SELECT_BAD
;; cannot be more than buffer size
1712 SELECT_NOT_LONG
: ;;
1713 MOV AX,CS:[SI].FTB_SELECT
;;
1719 MOV CX,BUF
.FSELEN
;; +++ SELECT = 1 +++
1721 JZ CTL_NOT_COPIED
;;
1722 MOV AX,CS:[DI].SLT_AT
;; == copy control only from one FTBLK
1724 JNZ CTL_NOT_COPIED
;;
1729 OR CS:[DI].SLT_AT
,AT_SELECT
;; the FTBLK where control is copied
1732 MOV CX,CS:[SI].FTB_SELLEN
;;
1733 CMP CX,CS:[SI].FTB_DLEN
;;
1736 MOV CX,CS:[SI].FTB_DLEN
;;
1739 PUSH CX ;; CX is the length to be copied.
1746 MOV AX,CS:[SI].FTB_DAHI
;;
1749 MOV SI,CS:[SI].FTB_DALO
;;
1754 MOV DI,BUF
.PDESCO
;;
1755 MOV DI,CS:[DI].SELB_O
;;
1756 ADD DI,BUF
.FSELEN
;;
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 ;;
1774 ;; any data left for font ?
1778 JMP NEXT_FTBLK
;; == CLASS 1 printer ingnores fonts
1780 MORE_FONT
: ;; more font data ?
1784 SELECT_CLASS1: ;; +++ PRINTER CLASS = 1
1786 MOV AX,CS:[SI].FTB_SELECT
;;
1790 ;; select type = 2 only
1794 PUSH ES ;; STACKS...
1798 SUB AX,BUF
.FTSLOTO
;;
1800 PUSH AX ;; stack 1 -- offest
1804 MOV AX,CS:WORD PTR [DI] ;; length copied to font buffer
1808 PUSH DI ;; STACK +1 -- to font buffer length
1809 MOV DI,BUF
.FTSTART
;;
1813 ADD DI,BUF
.FTSZPA
;;
1820 XOR DI,DI ;; start of the font buffer
1821 MOV CX,CS:[SI].FTB_SELLEN
;;
1823 JNZ HASBEEN_COPIED
;;
1824 MOV ES:BYTE PTR [DI],CL ;; 1st byte is the length
1831 CMP AX,CX ;; all copied ?
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 ;;
1848 CMP CX,CS:[SI].FTB_DLEN
;;
1851 MOV CX,CS:[SI].FTB_DLEN
;;
1860 MOV AX,CS:[SI].FTB_DAHI
;;
1863 MOV SI,CS:[SI].FTB_DALO
;;
1876 MOV CS:WORD PTR [DI],CX ;;
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 ;;
1889 SKIP_SELECT
: ;; ++ SKIP SELECT ++
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
;;
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 ;;
1904 SELECT_BAD
: ;; ++ BAD SELECT ++
1908 LES DI,dword ptr buf
.rh_ptro
;;
1909 MOV RH
.RHC_STA
,STAT_BADATA
;;
1911 OR BUF
.STATUS
,FAIL
;;
1916 ;; *************************************
1917 ;; * FONT TO BE STORED OR DOWNLOADED ? *
1918 ;; *************************************
1920 ;; SI = points to FTBLK
1921 ;; ES = font buffer segment / 0
1923 ;; DI = SLOT pointer
1926 CMP CS:[SI].FTB_DLEN
,0 ;; any font data left ?
1927 JNZ HAS_FONT_DATA
;;
1934 JNZ STORE_FONT_BUFFER
;;
1935 JMP FONT_DOWNLOAD
;;
1939 STORE_FONT_BUFFER
: ;; *****************************
1940 PUSH DI ;; ** STORE TO FONT BUFFER **
1941 ;; *****************************
1943 PUSH DS ;; ES = font buffer segment
1945 ;; -- determine where is the infor :
1947 SUB AX,BUF
.FTSLOTO
;; relative to the start of the slot
1948 SHR AX,1 ;; '' '' '' " of FTDL_OFF
1954 ;;...................................
1955 MOV CX,CS:[SI].FTB_DLEN
;; length of font data
1957 MOV AX,CS:WORD PTR [DI] ;; current destination
1960 PUSH AX ;; STACK A (next destination)
1962 ADD AX,CS:[SI].FTB_DLEFT
;; enough room in font buffer ?
1963 CMP AX,BUF
.FTSIZE
;;
1964 JNA ROOM_FOR_FONT
;;
1968 POP CX ;; **** LOOP EXIT (no room) ****
1971 LES DI,dword ptr buf
.rh_ptro
;;
1972 MOV RH
.RHC_STA
,STAT_BADATA
;;
1974 OR BUF
.STATUS
,FAIL
;;
1982 MOV DI,CS:WORD PTR [DI] ;; current destination
1987 MOV AX,CS:[SI].FTB_DAHI
;;
1989 POP DS ;; source : FTB_DA
1990 MOV SI,CS:[SI].FTB_DALO
;;
1998 MOV CS:WORD PTR [DI],AX ;; next detination/current length
2004 OR CS:[DI].SLT_AT
,AT_FONT
;; font buffer has been overwritten
2008 FONT_DOWNLOAD
: ;; ***********************************
2009 ;; * DOWNLOAD FONT TO THE DEVICE : *
2010 PUSH ES ;; ***********************************
2012 LES DI,dword ptr buf
.rh_ptro
;; -- the logic can only support one
2013 ;; physical device slot that can be
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 ;;
2022 MOV RH
.RHC_CMD
,CMD_WRT
;; 06/25 MODE.COM
2026 PUSH BX ;; **** BUF. is changed ****
2029 LES BX,DWORD PTR BUF
.RH_PTRO
;; pass the request header to the
2032 CALL DWORD PTR CS:[SI].LPT_STRAO
;; LPTn strategy routine.
2038 CALL DWORD PTR BUF
.LPT_INTRO
;; interrupt the DOS LPTn
2041 MOV AX,rh
.RHC_STA
;;
2043 and ax,stat_error
;;
2045 mov ax,stat_deverr
;;
2046 mov rh
.rhc_sta
,ax ;;
2052 AND AX,STAT_ERROR
;; any error returned by normal device?
2054 OR CS:[DI].SLT_AT
,AT_RAM1
;;
2055 JMP NEXT_FTBLK
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2057 FDL_BAD
: ;; **** LOOP EXIT (bad) ****
2058 OR BUF
.STATUS
,FAIL
;;
2068 LES DI,dword ptr buf
.rh_ptro
;;
2069 MOV RH
.RHC_STA
,STAT_DEVERR
;;
2074 LES DI,dword ptr buf
.rh_ptro
;;
2082 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2084 ;;==== Generic IOCTL Designate Start ======
2086 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2087 DESIGNATE_START PROC
;;
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;
2094 CMP AX,LOCKED
;; WGR ;AN000;
2095 JE DS_03
;; WGR ;AN000;
2098 DS_01: CALL CHECK_PRINT_ACTIVE
;G; THIS WILL FIND OUT IF THE
2100 DS_03: ;; WGR ;AN000;
2101 JMP DST_DEVERR
;G; PRINT.COM IS ACTIVE, CY=1 MEANS YES
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 !!!!
2108 ;; ******************************
2109 ;; ** DESIGNATE / REFRESH ? **
2110 ;; ******************************
2111 ;; check the LENGTH in BUFFER1
2113 MOV CX,GIOB
.GB1_LEN
;;
2117 mov cs:init_chk
,0fefeh ;;
2119 JMP DST_REFRESH
;; null lenght ==> refresh
2123 SHR AX,1 ;; divide by 2
2125 MOV AX,STAT_CMDERR
;; error if LEN < 2
2131 MOV AX,GIOB
.GB1_NUM
;;
2133 MOV AX,STAT_BADATA
;;
2134 JNZ DST_RET
;; error, as no code pages followed
2136 mov cs:init_chk
,0ffeeh ;;
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 ?
2151 MOV AX,DSF_CARTCP
;; RAM-code pages
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 ?
2161 JMP DST_DESIGNATE
;;
2169 MOV AX,STAT_DEVERR
;;
2173 MOV AX,STAT_CMDERR
;G;
2178 MOV AX,DSF_CARTCP
;; Hardware code pages
2180 MOV DI,BUF
.HRBUFO
;; DI
2181 MOV DX,BUF
.HSLMX
;; DX = number of slots available
2183 SUB AX,BUF
.HARDMX
;; no. of designate allowed
2185 CMP CX,AX ;; more codepages than supported ?
2186 MOV AX,STAT_TOMANY
;;
2188 ;;---------------------------------------------------------------------------
2189 ;; *************************************
2190 DST_DESIGNATE
: ;; * any duplicated codepages in MODE ?*
2191 ;; * define the slot-buffer *
2192 ;; *************************************
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
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
2210 ;;-------------------------------------
2212 PUSH DI ;; (the start of RAM/Hardware buffer)
2213 PUSH DX ;; count of buffer size
2216 MOV CS:[DI],AX ;; reset all buffer to 0FFFFH
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
2232 MOV AX,BUF
.STATUS
;;
2233 AND AX,DSF_CARTCP
;;
2235 ;; for cartridge designation
2236 MOV SI,BUF
.HARDSO
;;
2238 MOV AX,CS:[SI].SLT_AT
;;
2241 INC SI ;; skip the hwcp slots, they cannot be
2242 INC SI ;; designated
2254 POP BX ;; BX = the positioned buffer
2256 DST_BUFLP
: ;; **** LOOP ****
2257 MOV AX,GIOB
.GB1_CP
;; (use GIOB only for codepages)
2262 ;; compare code page with SLOT-BUFFER
2263 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2264 ;; SCAN THE BUFFER FOR DUPLICATION
2266 POP CX ;; no. of buffer entries
2272 REPNE SCASW ;; scan codepage vs. buffer
2276 POP CX ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2280 ;; **** EXIT FROM LOOP ****
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)
2288 MOV AX,STAT_DUPLCP
;; Duplicated code page
2293 MOV CS:[BX],AX ;; no duplicated cp in MODE list
2296 ;; **** NEXT IN LOOP ****
2298 INC SI ;; (use GIOB only for codepages)
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)
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
2324 ;; -- the designate fails if there is
2326 ;; -- copy the codepage in the slot to
2327 ;; the buffer if is not to be
2328 ;; replaced. Mark the slot to be
2330 ;; -- if the code page is tobe replaced
2331 ;; mark the STATUS with REPLX.
2332 ;;-------------------------------------
2334 MOV CX,DX ;; both slots & buffer of same size
2335 ;; --exclude the hwcp which is not
2337 MOV SI,BUF
.HARDSO
;; SI = hardware slot
2339 MOV AX,BUF
.STATUS
;;
2340 AND AX,DSF_CARTCP
;;
2342 MOV SI,BUF
.RAMSO
;; SI = RAM slot
2344 MOV BUF
.FTSLOTO
,SI ;;
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
2353 POP BX ;; BX = the positioned buffer
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
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
2364 MOV AX,CS:[SI].SLT_CP
;;
2370 CMP CX,0FFFFH ;; if this slot to be replaced ?
2372 JNZ DST_SLTREPLACED
;; YES, the buffer is not empty
2374 ;; compare code page with SLOT-BUFFER
2375 PUSH CX ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2376 ;; SCAN THE BUFFER FOR DUPLICATION
2378 POP CX ;; no. of buffer entries
2384 REPNE SCASW ;; scan codepage vs. buffer
2388 POP CX ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2392 ;; **** LOOP EXIT ****
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)
2400 MOV AX,STAT_DUPLCP
;; Duplicated code page
2405 MOV CS:[BX],AX ;; no duplicated cp, there was no cp in
2407 OR CS:[SI].SLT_AT
,AT_OLD
;; mark old so as no new font download
2409 JMP DST_SLTNXT
;; the MODE command for this position
2411 DST_SLTREPLACED
: ;;
2413 POP AX ;; save the buffer slot-position
2415 OR BUF
.STATUS
,REPLX
;; there are codepage in slots replaced
2418 POP BX ;; gets back the buffer position
2420 ;; **** NEXT IN LOOP ****
2423 INC SI ;; will take whatever is in buffer
2427 INC BX ;; position slot in buffer
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 ;;************************************
2444 ;; -- CX slot / buffer size
2447 ;;------------------------------------
2453 AND BUF
.STATUS
,AX ;; assume it is successful
2456 PREPARE_FTB
: ;; Prepare for Font Parser
2458 MOV CS:[BX].FLAG
,FLAG_RESTART
;
2459 MOV CS:[BX].BUFFER_LEN
,0 ;; no data packet
2460 MOV CS:[BX].NUM_FTBLK
,0 ;;
2462 ADD BX,TYPE FBUFS
;; points to the first FTBLK.
2463 XOR DX,DX ;; DX = FTBLK entries (no code page yet)
2466 GET_CODEPAGE
: ;; **** LOOP ****
2469 MOV AX,CS:[SI].SLT_AT
;;
2473 MOV AX,CS:[SI].SLT_AT
;;
2475 JZ GET_NEXT
;; not NEW and not HWCP
2476 AND CS:[SI].SLT_AT
, NOT AT_OLD
;; also load for HWCP
2479 MOV AX,CS:[DI] ;; -- SLOT_AT is not old
2480 ;; -- code page in buffer is not 0FFFFH
2483 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2484 INC DX ;; LOAD FONT as :
2485 MOV AX,CS:[DI] ;; codepage in buffer is new code page
2487 OR CS:[SI].SLT_AT
,AT_LOAD
;; set the attribute indicating load
2489 MOV CS:[BX].FTB_CP
,AX ;;
2491 ADD BX,type ftblk
;; next FTBLK
2494 GET_NEXT
: ;; **** NEXT IN LOOP ****
2496 INC DI ;; next in buffer
2500 INC SI ;; next in slot
2504 NO_MORE_SLOT
: ;; **** EXIT LOOP ****
2507 JMP NO_FONT_DOWNL
;;
2509 ;; **********************************
2510 ;; ** NEXT STATE = DESIGNATE_WRITE **
2511 ;; **********************************
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
;;
2536 MOV CS:[DI].NUM_FTBLK
,DX ;;
2538 ADD DI,TYPE FBUFS
;;
2539 LEA DI,[DI].FTB_TID
;;
2551 ADD DI,TYPE FTBLK
;; next DID
2560 CALL FONT_PARSER
;; restart font parser
2563 ADD BX,TYPE FBUFS
;;
2564 CMP CS:[BX].FTB_STATUS
,FSTAT_SEARCH
2567 MOV AX,STAT_DEVERR
;;
2570 JMP DST_RETURN
;; there is no designate_end if fails
2575 MOV BUF
.STATE
,DESG_WR
;; enter DESIGNATE_WRITE state
2576 MOV BUF
.FSELEN
,0 ;; for font selection control loading
2578 PUSH CX ;; init the font buffer address of
2579 PUSH DI ;; each codepage
2584 MOV AX,BUF
.STATUS
;;
2585 AND AX,DSF_CARTCP
;;
2592 mov ax,cs:[si].slt_at
;;
2596 MOV CS:WORD PTR[DI],0 ;; the font length in font buffer is 0
2614 ;; *******************************
2615 ;; ** NEXT STATE = DSIGNATE_END **
2616 ;; *******************************
2620 MOV BUF
.STATE
,DESG_END
;; proper designate end, ignore write
2622 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2625 MOV DX,BUF
.STATUS
;;
2628 AND AX,DX ;; reset the bit for "replaced"
2629 MOV BUF
.STATUS
,AX ;;
2634 ;; only for the FIFO
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
2647 OR BUF
.STATUS
,REFRESH
;; -- STATE = CPSW (for Designate_end)
2651 JNZ DST_CHECK_FBUFFER
;;
2652 JMP DST_REF_INVK
;; invoke any active code page
2654 DST_CHECK_FBUFFER: ;;
2658 MOV AX,CS:[DI].SLT_AT
;;
2660 JNZ DST_RAM_LOCATED
;;
2667 JMP DST_REF_INVK
;; there was no font loaded
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 !!!
2677 SUB DI,BUF
.RAMSO
;; relative to .RAMSO
2678 SHR DI,1 ;; relative to .FTLDO
2683 MOV AX,BUF
.FTSTART
;;
2687 JZ DST_FT_LOCATED
;;
2688 ADD AX,BUF
.FTSZPA
;;
2690 JNZ DST_LOCATE_FT
;;
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 ;;
2709 POP DI ;; save BX in DI
2712 MOV BX,SI ;; ES:BX = REQ_NORMn (CS:[SI])
2714 CALL DWORD PTR CS:[DI].LPT_STRAO
2716 CALL DWORD PTR CS:[DI].LPT_INTRO
2720 MOV AX,CS:[SI].RHC_STA
;;
2722 and ax,stat_error
;;
2724 mov ax,stat_deverr
;;
2728 AND AX,STAT_ERROR
;;
2734 LES DI,dword ptr buf
.rh_ptro
;;
2735 MOV RH
.RHC_STA
,AX ;;
2743 DST_REF_INVK
: ;; INVOKE FOR REFRESH
2745 ;; ************************************
2746 ;; * INVOKE HIERIECHY : RAM, HARDWARE *
2747 ;; ************************************
2749 MOV DI,BUF
.RAMSO
;; check with the ram-slots (DI)
2750 MOV CX,BUF
.RSLMX
;; CX = size
2754 DST_RAM_CMP: ;; there are RAM-slots
2756 MOV AX,CS:[DI].SLT_AT
;;
2767 MOV DI,BUF
.HARDSO
;; check with the HWCP-slots (DI)
2768 MOV CX,BUF
.Hslmx
;; CX = size
2775 MOV AX,CS:[DI].SLT_AT
;;
2795 MOV SI,BUF
.RNORMO
;;
2797 ADD AX,TYPE GIH
;; points to buffer
2800 LEA SI,[SI].GIH_GBA
;;
2801 MOV CS:WORD PTR [SI],AX
2804 MOV CS:WORD PTR [SI],CS ;;
2806 MOV CS:[SI].GB2_LEN
,2 ;;
2807 MOV AX,CS:[DI].SLT_CP
;;
2808 MOV CS:[SI].GB2_CP
,AX ;;
2811 PUSH CS ;; define RH = ES:[DI]
2813 MOV DI,BUF
.RNORMO
;;
2820 DESIGNATE_START ENDP
;;
2822 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2824 ;;==== Generic IOCTL Designate End ======
2826 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2827 DESIGNATE_END PROC
;;
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;
2837 MOV AX,BUF
.STATUS
;; any refresh ?
2840 MOV AX,STAT_BADDEN
;;
2844 AND BUF
.STATUS
,NOT REFRESH
;;
2850 JNE den_NOT_NORMAL
;;
2851 JMP NORM_DRIVER
;; not in the code page switching stage
2856 JMP den_ENDED
;; end with no error check
2861 MOV AX,STAT_BADDEN
;;
2862 JMP DEN_FAIL
;; no designate start
2863 ;;-------------------------
2864 den_write
: ;; DESIGNATE WRITE ended
2866 MOV AX,BUF
.STATUS
;;
2868 JZ DEN_FTABLE
;; failed in the middle of desig-write
2870 JMP DEN_FAIL
;; ignore the DEN
2875 ADD DI,TYPE FBUFS
;;
2876 MOV AX,CS:[DI].FTB_STATUS
;;
2877 CMP AX,FSTAT_COMPLETE
;;
2880 CMP AX,FSTAT_FONT
;;
2882 MOV AX,STAT_bffDEN
;; bad font file
2883 JMP DEN_FAIL
;; the font data was not complete
2886 MOV AX,CS:[DI].FTB_DLEFT
;;
2889 MOV AX,STAT_BffDEN
;;
2892 DEN_ENDED
: ;; good designate-end
2894 MOV DI,BUF
.HARDSO
;; to hardware slot
2895 MOV SI,BUF
.HRBUFO
;; to hardware-buffer
2897 MOV AX,CS:[DI].SLT_AT
;; skip the HWCP
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
;;
2915 MOV AX,STAT_TOMANY
;;
2916 AND CX,CX ;; any cart-slot to be designated ?
2917 JNZ ASSIGN_CP_CART
;;
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
2929 MOV AX,STAT_TOMANY
;;
2930 AND CX,CX ;; any cart-slot to be designated ?
2939 AND CS:[DI].SLT_AT
,AX ;; reset load, font, select attributes
2941 MOV AX,CS:[SI] ;; code page assigned
2942 MOV CS:[DI].SLT_CP
,AX ;;
2948 AND CS:[DI].SLT_AT
,AX ;;
2951 OR CS:[DI].SLT_AT
,AT_OCC
;; occupied
2953 MOV AX,CS:[DI].SLT_AT
;;
2957 NOT_ACTIVE: ;; this newly designated is not active
2960 AND CS:[DI].SLT_AT
,AX ;; not active
2963 AND CS:[DI].SLT_AT
,NOT AT_RAM1
;; not loaded to physical RAM until
2964 ;; the code page is selected
2976 MOV CX,BUF
.FSELEN
;; COPY SELECT-CONTROL for CLASS 0
2991 MOV DI,BUF
.PDESCO
;;
2992 MOV SI,CS:[DI].SELB_O
;;
2994 MOV DI,CS:[DI].SELH_O
;;
2996 MOV DL,CS:BYTE PTR [SI] ;;
2998 INC DX ;; of the length byte
3003 MOV CS:[DI].SELR_O
,DX ;;
3014 XOR AX,AX ;; clear status
3017 DEN_FAIL
: ;;------------------------------------
3018 PUSH AX ;; ANY FONT BUFFER DESTROYED ?
3020 MOV AX,BUF
.STATUS
;;
3021 AND AX,DSF_CARTCP
;;
3024 MOV DI,BUF
.FTSLOTO
;;
3026 JMP DEN_FAIL_LOOP
;;
3029 MOV DI,BUF
.RAMSO
;; to RAM slot
3030 MOV CX,BUF
.RSLMX
;; size of both RAM slot/buffer
3031 MOV DX,BUF
.RBUFMX
;;
3040 MOV AX,CS:[DI].SLT_AT
;;
3044 MOV AX,CS:[DI].SLT_AT
;;
3046 JNZ DEN_FAIL_NEXT
;;
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
3058 JNE DEN_FAIL_LOOP
;;
3066 ;;-------------------------------------
3068 MOV BUF
.STATE
,CPSW
;; end of designate cycle
3070 DE_11: ;; WGR ;AN000;
3071 LES DI,dword ptr buf
.rh_ptro
;;
3072 MOV RH
.RHC_STA
,AX ;;
3076 DESIGNATE_END ENDP
;;
3078 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3080 ;;==== Generic IOCTL Invoke ==========
3082 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3084 INVOKE PROC
;; ALSO JUMP FROM REFRESH
3089 CMP AX,LOCKED
;; WGR ;AN000;
3090 JE IVK_PROCESS
;; WGR ;AN000;
3092 IVK_PROCESS: ;;-------------------------
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
3098 IVK_PROCESS_CONT: ;G;
3100 LDS SI,RH
.GIH_GBA
;;
3101 MOV CX,GIOB
.GB2_LEN
;;
3102 MOV AX,STAT_CMDERR
;;
3108 MOV DX,GIOB
.GB2_CP
;; DX = the codepage to be invoked
3114 ;; ************************************
3115 ;; * INVOKE HIERIECHY : RAM, HARDWARE *
3116 ;; ************************************
3119 MOV DI,BUF
.RAMSO
;; check with the ram-slots (DI)
3120 MOV CX,BUF
.RSLMX
;; CX = size
3124 RAM_CMP: ;; there are RAM-slots
3125 PUSH CX ;; stack 1 = size
3127 POP SI ;; start of the slot compared with (SI)
3129 MOV AX,CS:[DI].SLT_CP
;;
3140 ;; code page not found in ram-slots
3142 MOV DI,BUF
.HARDSO
;; check with the HWCP-slots (DI)
3143 MOV CX,BUF
.Hslmx
;; CX = size
3149 PUSH CX ;; stack 1 = size of HWCP
3151 POP SI ;; start of the slot compared with (SI)
3153 MOV AX,CS:[DI].SLT_CP
;;
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
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
3181 ;;-------------------------------------
3182 ;; **** LOAD THE FONT FIRST if ****
3183 ;; -- there are font buffers created
3184 ;; -- the slot's font has not been
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;
3205 JE INVK_RAM_PHYSICAL
;;
3207 MOV AX,CS:[DI].SLT_AT
;;
3208 AND AX,AT_RAM1
;; supports only ONE physical ram
3209 JNZ INVK_RAM_PHYSICAL
;;
3211 OR BUF
.STATUS
,LOADED
;; font has not been loaded
3215 PUSH DX ;; stack 1 (size)
3223 MOV AX,BUF
.FTSTART
;;
3227 ADD AX,BUF
.FTSZPA
;;
3232 ;; AX = FONT LOCATION (AX:0)
3234 SHR DI,1 ;; offset to the start of .FTDLEN
3236 add DI,buf
.ftdlo
;; length of font data
3237 mov cx,cs:word ptr [di] ;;
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
3246 jmp Ram_Prt_Status_Err
;AN001;return with error.
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 ;;
3258 POP DI ;; save BX in DI
3261 MOV BX,SI ;; ES:BX = REQ_NORMn (CS:[SI])
3263 CALL DWORD PTR CS:[DI].LPT_STRAO
3265 CALL DWORD PTR CS:[DI].LPT_INTRO
3269 MOV AX,CS:[SI].RHC_STA
;;
3275 AND AX,STAT_ERROR
;; any error returned by normal device?
3276 JZ INVK_RAM_PHYSICAL
;;
3281 ;;-------------------------------------
3282 ;; **** SEND THE SELECTION CONTROL ****
3284 INVK_RAM_PHYSICAL
: ;;
3287 PUSH DX ;; stack 1 (size)
3294 ;; **** SUPPORT ONLY ONE PHYSICAL RAM
3296 MOV DI,BUF
.PDESCO
;;
3297 MOV DI,CS:[DI].SELR_O
;; the RAM-select controls
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
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;
3330 PUSH DX ;; stack 1 (size)
3336 SUB DX,CX ;; the slot's order in HWCP-slots(0-n)
3341 MOV AX,BUF
.FTSTART
;; ***** CLASS 1 CODEPAGE SELECT ****
3346 ADD AX,BUF
.FTSZPA
;;
3362 ;; ** SELECT HARDWARE PHYSICAL SLOT **
3364 MOV DI,BUF
.PDESCO
;;
3365 MOV DI,CS:[DI].SELH_O
;; the HARDWARE-select controls
3368 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3369 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3370 RCTL_NXT: ;; locate the right control sequence
3378 ;; ********************************
3379 ;; ** SEND OUT SELECTION CONTROL **
3380 ;; ********************************
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.
3390 MOV SI,BUF
.RNORMO
;;
3391 MOV CS:[SI].RHC_LEN
,20 ;;
3392 MOV CS:[SI].RHC_CMD
,CMD_WRT
;;
3402 MOV CS:[SI].RH3_CNT
,CX ;; send all at once
3403 MOV CX,1 ;; sent only once.
3406 CTL_CLASS1
: ;; sent byte by byte to overcome
3407 MOV CS:[SI].RH3_CNT
,1 ;; DOS timeout on kingman printer
3410 MOV CS:[SI].RH3_DTAO
,DI ;;
3413 MOV CS:[SI].RH3_DTAS
,AX ;;
3419 POP DI ;; save BX in DI
3422 MOV BX,SI ;; ES:BX = REQ_NORMn (CS:[SI])
3424 CALL DWORD PTR CS:[DI].LPT_STRAO
3426 CALL DWORD PTR CS:[DI].LPT_INTRO
3431 MOV AX,CS:[SI].RHC_STA
;;
3433 AND AX,STAT_ERROR
;; any error returned by normal device?
3436 JNZ CTL_NEXT_BYTE
;;
3450 ;; **********************************
3451 ;; ** ADJUST WHICH CODEPAGE TO BE **
3453 ;; **********************************
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.
3461 IVK_CP: ;; SI = start of the slots compared
3462 ;; DI = where code page was found
3464 PUSH SI ;; stack 1 = start of slots compared
3465 mov AX,BUF
.STATUS
;;
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)
3475 AND CS:[SI].SLT_AT
,AX ;; not active (and not loaded)
3482 OR CS:[DI].SLT_AT
,AT_ACT
;; the codepage found becomes active
3483 MOV AX,BUF
.STATUS
;;
3486 OR CS:[DI].SLT_AT
,AT_RAM1
;; the font has just been loaded
3487 AND BUF
.STATUS
,NOT LOADED
;;
3491 POP SI ;; stack -1 (slot : ATs adjusted )
3492 PUSH SI ;; stack 1 = start of slots compared
3494 MOV DI,BUF
.HARDSO
;;
3497 ;; HWCP's AT to be reset
3504 AND CS:[DI].SLT_AT
,AX ;; HWCP is not active
3515 POP SI ;; stack -1 (slot : ATs adjusted )
3516 PUSH SI ;; stack 1 = start of slots compared
3521 ;; HWCP's AT to be reset
3523 AND CX,CX ;; HWCP's no.
3528 AND CS:[DI].SLT_AT
,AX ;; HWCP is not active
3544 MOV AX,STAT_NOCPIV
;;
3548 MOV AX,STAT_DEVERR
;;
3552 MOV AX,STAT_CMDERR
;G;
3555 LES DI,dword ptr buf
.rh_ptro
;;
3556 MOV RH
.RHC_STA
,AX ;;
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.
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
3581 pop es ;AN001;ES:BX -> REQ_NORMn (was cs:si)
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;
3593 Prt_Status_Check endp
;AN001;
3597 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3599 ;;==== Generic IOCTL Query Invoked =======
3601 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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 !!!!
3617 ;;-------------------------
3618 LDS SI,RH
.GIH_GBA
;;
3626 MOV AX,CS:[DI].SLT_AT
;; check the RAM slots
3637 MOV DI,BUF
.HARDSO
;;
3643 MOV AX,CS:[DI].SLT_AT
;; check the RAM slots
3655 MOV AX,STAT_NOCPIV
;;
3660 MOV AX,CS:[DI].SLT_CP
;;
3661 QI_1: ;; WGR ;AN000;
3662 MOV GIOB
.GB2_LEN
,2 ;;
3663 MOV GIOB
.GB2_CP
,AX ;;
3669 MOV AX,STAT_DEVERR
;;
3673 MOV AX,STAT_CMDERR
;G;
3676 LES DI,dword ptr buf
.rh_ptro
;;
3677 MOV RH
.RHC_STA
,AX ;;
3684 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3686 ;;==== Generic IOCTL Query List =======
3688 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3693 MOV AX,BUF
.STATE
;; ????????????????
3694 CMP AX,CPSW
;; reject only in NORMAL
3696 CMP AX,LOCKED
;; WGR ;AN000;
3697 JE QLS_CPSW
;; WGR ;AN000;
3699 QLS_CPSW
: ;;-------------------------
3700 LDS SI,RH
.GIH_GBA
;;
3701 PUSH SI ;; stack 1 -- GB3 (SI)
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 ;;
3712 MOV AX,CS:[DI].SLT_CP
;;
3713 MOV GIOB
.GBL_CP
,AX ;;
3725 SUB CX,BUF
.HARDMX
;; less the no. of HWCP
3727 ADD DX,CX ;; DX = total number of entries
3730 MOV GIOB
.GBL_LEN
,DX ;;
3734 MOV AX,CS:[DI].SLT_CP
;;
3735 MOV GIOB
.GBL_CP
,AX ;;
3753 MOV AX,CS:[DI].SLT_CP
;;
3754 MOV GIOB
.GBL_CP
,AX ;;
3772 MOV GIOB
.GB3_LEN
,DX ;;
3775 CMP DX,GB3_MINILEN
;; min. GBL length
3781 MOV AX,STAT_DEVERR
;;
3785 MOV AX,STAT_CMDERR
;G;
3788 LES DI,dword ptr buf
.rh_ptro
;;
3789 MOV RH
.RHC_STA
,AX ;;
3795 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3797 ; CHECK_PRINT_ACTIVE
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.
3804 ; CS:[BX].DEV_HDRO OFFSET AND SEGMENT OF ACTIVE DEVICE
3807 ; WARNING: IF ANOTHER DEVICE DRIVER IS TO TAKE THE LPTx, THEN
3808 ; THIS WILL not FIND OUT THAT THE PRINTER.SYS IS ACTIVE.
3810 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3811 CHECK_PRINT_ACTIVE PROC
;G;
3812 PUSH AX ;G; SAVE THE REGISTERS............
3818 MOV DI,BUF
.DEV_HDRS
;G; SETUP ES: = ACTIVE DEVICE SEGMENT
3820 MOV DI,BUF
.DEV_HDRO
;G; SETUP DI: = ACTIVE DEVICE OFFSET
3822 MOV AX,0106H ;G; PRINT (GET LIST DEVICE)
3824 JNC CPA_5
;G; CY=0 IF NOT LOADED/NOT ACTIVE
3826 CMP SI,DI ;G; ES:DI POINTS TO THE ACTIVE DEVICE
3832 STC ;G; OTHERWISE, THIS DEVICE IS PRESENTLY
3833 JMP CPA_6
;G; UNDER PRINT!!! PREVENT DATASTREAM
3834 ;G; CONFLICT IN THIS CASE.
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.....
3845 CHECK_PRINT_ACTIVE ENDP
;G;
3846 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;