summaryrefslogtreecommitdiff
path: root/v4.0/src/DEV/PRINTER/CPSPM10.ASM
diff options
context:
space:
mode:
Diffstat (limited to 'v4.0/src/DEV/PRINTER/CPSPM10.ASM')
-rw-r--r--v4.0/src/DEV/PRINTER/CPSPM10.ASM3851
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 @@
1PAGE ,132
2TITLE 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 ;;
43INCLUDE CPSPEQU.INC ;;
44 ;;
45PUBLIC PRINTER_DESC_NUM ;;
46PUBLIC PRINTER_DESC_TBL ;;
47PUBLIC INIT_CHK,TABLE,DEVICE_NUM ;; WGR ;AN000;
48PUBLIC INVOKE ;; WGR ;AN000;
49PUBLIC BUF0,BUF1,BUF2,BUF3 ;; WGR ;AN000;
50PUBLIC HARD_SL1,RAM_SL1 ;;
51PUBLIC HARD_SL2,RAM_SL2 ;;
52PUBLIC HARD_SL3,RAM_SL3 ;;
53PUBLIC HARD_SL4,RAM_SL4 ;;
54PUBLIC RESERVED1,RESERVED2 ;;
55 ;;
56EXTRN RESIDENT_END:WORD ;;
57EXTRN STACK_ALLOCATED:WORD ;;
58EXTRN FONT_PARSER:NEAR,FTABLE:WORD ;;
59EXTRN INIT:NEAR ;;
60 ;;
61 ;;
62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
63 ;;
64 ;;
65CSEG 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 ;;
82DEV_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"
88DEV_NAME0: DB 'PRN ' ;; device name( length : NAME_LEN)
89 ;;
90DEV_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"
96DEV_NAME1: DB 'LPT1 ' ;; device name( length : NAME_LEN)
97 ;;
98DEV_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"
104DEV_NAME2: DB 'LPT2 ' ;; device name( length : NAME_LEN)
105 ;;
106 ;;
107DEV_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"
112DEV_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 ;;
127INIT_CHK DW 0 ;; internal flag : error loc. in INIT
128 ;;
129BUF0: BUF_DATA <,,,,,,,,,,> ;; PRN
130 ;;
131BUF1: BUF_DATA <,,,,,,,,,,> ;; LPT1
132 ;;
133BUF2: BUF_DATA <,,,,,,,,,,> ;; LPT2
134 ;;
135BUF3: 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 ;;
146HARD_SL1 : SLTS <,> ;; 1st hardware slots
147HARD_SL1B: SLTS <,> ;;
148HARD_SL1C: SLTS <,> ;;
149HARD_SL1D: SLTS <,> ;;
150HARD_SL1E: SLTS <,> ;;
151HARD_SL1F: SLTS <,> ;;
152HARD_SL1G: SLTS <,> ;;
153HARD_SL1H: SLTS <,> ;;
154HARD_SL1I: SLTS <,> ;;
155HARD_SL1J: SLTS <,> ;;
156HARD_SL1K: SLTS <,> ;;
157HARD_SL1L: SLTS <,> ;;
158HARD_SL1M: SLTS <,> ;; -- max. no. of code pages allowed
159;;upto hardsl_max + 1 ;;
160 ;;
161HARD_SL2 : SLTS <,> ;; 2nd hardware slots
162HARD_SL2B: SLTS <,> ;;
163HARD_SL2C: SLTS <,> ;;
164HARD_SL2D: SLTS <,> ;;
165HARD_SL2E: SLTS <,> ;;
166HARD_SL2F: SLTS <,> ;;
167HARD_SL2G: SLTS <,> ;;
168HARD_SL2H: SLTS <,> ;;
169HARD_SL2I: SLTS <,> ;;
170HARD_SL2J: SLTS <,> ;;
171HARD_SL2K: SLTS <,> ;;
172HARD_SL2L: SLTS <,> ;;
173HARD_SL2M: SLTS <,> ;; -- max. no. of code pages allowed
174;;upto hardsl_max + 1 ;;
175 ;;
176HARD_SL3 : SLTS <,> ;; 3rd hardware slots
177HARD_SL3B: SLTS <,> ;;
178HARD_SL3C: SLTS <,> ;;
179HARD_SL3D: SLTS <,> ;;
180HARD_SL3E: SLTS <,> ;;
181HARD_SL3F: SLTS <,> ;;
182HARD_SL3G: SLTS <,> ;;
183HARD_SL3H: SLTS <,> ;;
184HARD_SL3I: SLTS <,> ;;
185HARD_SL3J: SLTS <,> ;;
186HARD_SL3K: SLTS <,> ;;
187HARD_SL3L: SLTS <,> ;;
188HARD_SL3M: SLTS <,> ;; -- max. no. of code pages allowed
189;;upto hardsl_max + 1 ;;
190 ;;
191HARD_SL4 : SLTS <,> ;; 4TH hardware slots
192HARD_SL4B: SLTS <,> ;;
193HARD_SL4C: SLTS <,> ;;
194HARD_SL4D: SLTS <,> ;;
195HARD_SL4E: SLTS <,> ;;
196HARD_SL4F: SLTS <,> ;;
197HARD_SL4G: SLTS <,> ;;
198HARD_SL4H: SLTS <,> ;;
199HARD_SL4I: SLTS <,> ;;
200HARD_SL4J: SLTS <,> ;;
201HARD_SL4K: SLTS <,> ;;
202HARD_SL4L: SLTS <,> ;;
203HARD_SL4M: SLTS <,> ;; -- max. no. of code pages allowed
204;;upto hardsl_max + 1 ;;
205 ;;
206 ;;
207RAM_SL1 : SLTS <,> ;; 1st ram slots
208RAM_SL1B: SLTS <,> ;; NOTE : must be only FOUR bytes for
209RAM_SL1C: SLTS <,> ;; codepage positioning
210RAM_SL1D: SLTS <,> ;; calculation as compared
211RAM_SL1E: SLTS <,> ;; with each entry in FTDL_OFF
212RAM_SL1F: SLTS <,> ;;
213RAM_SL1G: SLTS <,> ;;
214RAM_SL1H: SLTS <,> ;;
215RAM_SL1I: SLTS <,> ;;
216RAM_SL1J: SLTS <,> ;;
217RAM_SL1K: SLTS <,> ;;
218RAM_SL1L: SLTS <,> ;; -- max. no. of code pages allowed
219;;upto ramsl_max, ;;
220 ;;
221RAM_SL2 : SLTS <,> ;; 2nd ram slots
222RAM_SL2B: SLTS <,> ;;
223RAM_SL2C: SLTS <,> ;;
224RAM_SL2D: SLTS <,> ;;
225RAM_SL2E: SLTS <,> ;;
226RAM_SL2F: SLTS <,> ;;
227RAM_SL2G: SLTS <,> ;;
228RAM_SL2H: SLTS <,> ;;
229RAM_SL2I: SLTS <,> ;;
230RAM_SL2J: SLTS <,> ;;
231RAM_SL2K: SLTS <,> ;;
232RAM_SL2L: SLTS <,> ;; -- max. no. of code pages allowed
233;;upto ramsl_max, ;;
234 ;;
235RAM_SL3 : SLTS <,> ;; 3rd ram slots
236RAM_SL3B: SLTS <,> ;;
237RAM_SL3C: SLTS <,> ;;
238RAM_SL3D: SLTS <,> ;;
239RAM_SL3E: SLTS <,> ;;
240RAM_SL3F: SLTS <,> ;;
241RAM_SL3G: SLTS <,> ;;
242RAM_SL3H: SLTS <,> ;;
243RAM_SL3I: SLTS <,> ;;
244RAM_SL3J: SLTS <,> ;;
245RAM_SL3K: SLTS <,> ;;
246RAM_SL3L: SLTS <,> ;; -- max. no. of code pages allowed
247;;upto ramsl_max, ;;
248 ;;
249RAM_SL4 : SLTS <,> ;; 4th ram slots
250RAM_SL4B: SLTS <,> ;;
251RAM_SL4C: SLTS <,> ;;
252RAM_SL4D: SLTS <,> ;;
253RAM_SL4E: SLTS <,> ;;
254RAM_SL4F: SLTS <,> ;;
255RAM_SL4G: SLTS <,> ;;
256RAM_SL4H: SLTS <,> ;;
257RAM_SL4I: SLTS <,> ;;
258RAM_SL4J: SLTS <,> ;;
259RAM_SL4K: SLTS <,> ;;
260RAM_SL4L: SLTS <,> ;; -- max. no. of code pages allowed
261;;upto ramsl_max, ;;
262 ;;
263 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
264 ;; hard/RAM buffered slots on codepages
265 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
266HBUF_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 ;;
282HBUF_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 ;;
298HBUF_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 ;;
315RBUF_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 ;;
330RBUF_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 ;;
345RBUF_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 ;;
360FTDL_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 ;;
376FTDL_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 ;;
392FTDL_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 ;;
417ESC_CHAR EQU 27 ;;
418 ;;
419db 'PRINTER_DESC' ;;
420 ;;
421PRINTER_DESC_NUM DW 3 ;; number of PRINTER_DESCn
422 ;;
423PRINTER_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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
435PRINTER_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.:)
451CTL4201_H : DB 5,ESC_CHAR,'I',0,ESC_CHAR,"6" ;; selection control 1
452CTL4201_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 ;;
456CTL4201_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 ;;
465PRINTER_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)
482CTL5202_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
488CTL5202_R : DB 0 ;;
489 ;;
490CTL5202_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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
498PRINTER_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.:)
513CTL4208_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)
518CTL4208_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 ;;
524CTL4208_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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
533PRINTER_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.:)
548CTLres2_H : DB 0 ;; selection control 1
549CTLres2_R : DB 32 dup (0) ;; selection control 2
550 db 32 dup (0) ;; for CTLres2_H and CTRLres2_R
551 ;;
552CTLres2_B DB CTL_MAX DUP (0) ;; max. two selection
553 DB CTL_MAX DUP (0) ;;
554 ;;
555;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
556 ;;
557 ;;
558TEMP_SI DW ? ;;
559 ;;
560;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
561;;
562;; The request header for IOCTL call
563;; to the Normal device driver
564;;
565;;
566;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
567 ;;
568REQ_NORM1 GIH <,,,,,> ;; for LPT1/PRN
569 GB2S <,> ;;
570REQ_NORM2 GIH <,,,,,> ;; for LPT2
571 GB2S <,> ;;
572REQ_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
592TABLE LABEL BYTE ; table header ;AN000;
593DEVICE_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;
599TABLE1_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;
607TABLE1_2 LABEL WORD ; device name (ie. PRN) ;AN000;
608 DW ZERO ; length ;AN000;
609 DB " " ; value ;AN000;
610 ;AN000;
611TABLE1_3 LABEL WORD ; device id. (eg. 4201,5202..) ;AN000;
612 DW ZERO ; length ;AN000;
613 DB " " ; value ;AN000;
614 ;AN000;
615TABLE1_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;
628TABLE1_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;
633TABLE2_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;
641TABLE2_2 LABEL WORD ; device name (ie. PRN) ;AN000;
642 DW ZERO ; length ;AN000;
643 DB " " ; value ;AN000;
644 ;AN000;
645TABLE2_3 LABEL WORD ; device id. (eg. 4201,5202..) ;AN000;
646 DW ZERO ; length ;AN000;
647 DB " " ; value ;AN000;
648 ;AN000;
649TABLE2_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;
662TABLE2_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;
667TABLE3_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;
675TABLE3_2 LABEL WORD ; device name (ie. PRN) ;AN000;
676 DW ZERO ; length ;AN000;
677 DB " " ; value ;AN000;
678 ;AN000;
679TABLE3_3 LABEL WORD ; device id. (eg. 4201,5202..) ;AN000;
680 DW ZERO ; length ;AN000;
681 DB " " ; value ;AN000;
682 ;AN000;
683TABLE3_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;
696TABLE3_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;
701TABLE4_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;
709TABLE4_2 LABEL WORD ; device name (ie. PRN) ;AN000;
710 DW ZERO ; length ;AN000;
711 DB " " ; value ;AN000;
712 ;AN000;
713TABLE4_3 LABEL WORD ; device id. (eg. 4201,5202..) ;AN000;
714 DW ZERO ; length ;AN000;
715 DB " " ; value ;AN000;
716 ;AN000;
717TABLE4_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;
730TABLE4_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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
736reserved1 DW ? ;; reserved for debugging used
737reserved2 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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
747STRATEGY0 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 ;;
755STRATEGY0 ENDP ;;
756;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
757;;
758;; LPT1 Device "strategy" entry point
759;;
760;; Retain the Request Header address for use by Interrupt routine
761;;
762;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
763STRATEGY1 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 ;;
771STRATEGY1 ENDP ;;
772;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
773;;
774;; LPT2 Device "strategy" entry point
775;;
776;; Retain the Request Header address for use by Interrupt routine
777;;
778;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
779STRATEGY2 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 ;;
787STRATEGY2 ENDP ;;
788;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
789;;
790;; LPT3 Device "strategy" entry point
791;;
792;; Retain the Request Header address for use by Interrupt routine
793;;
794;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
795STRATEGY3 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 ;;
803STRATEGY3 ENDP ;;
804;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
805;;
806;; Table of command / functions supported by LPTn
807;;
808;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
809 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
810 ;; CMD_CODES code supported by LPTn
811 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
812CMD_CODES LABEL BYTE ;;
813 DB CMD_INI ;; Initialization
814 DB CMD_WRT ;; output
815 DB 09 ;; output
816 DB 12 ;; output
817CMD_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 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
830GIO_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
836GIO_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 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
846CASES 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 ;;
873MEM_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 ;;
882INTERRUPT0 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 ;;
928PRN_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 ;;
967PRN_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 ;;
977PRN_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
981PRN_MEM_DONE : ;;
982 JMP COMMON_INTR ;; common interrupt handler
983 ;;
984;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
985;;
986;; LPT1 Device "interrupt" entry point
987;;
988;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
989INTERRUPT1 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 ;;
1035LPT1_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 ;;
1065LPT1_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 ;;
1075LPT1_MEM_CREATE : ;;
1076 XOR AX,AX ;; THEN CREATE MEMORY
1077 MOV MEM_REQUEST,AX ;; to set to zero only once for each
1078 ;;
1079LPT1_MEM_DONE : ;;
1080 ;;
1081 JMP COMMON_INTR ;; common interrupt handler
1082 ;;
1083INTERRUPT1 ENDP ;;
1084;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1085;;
1086;; LPT2 Device "interrupt" entry point
1087;;
1088;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1089INTERRUPT2 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 ;;
1133LPT2_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 ;;
1172LPT2_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
1185LPT2_MEM_DONE : ;;
1186 ;;
1187 JMP COMMON_INTR ;; common interrupt handler
1188 ;;
1189INTERRUPT2 ENDP ;;
1190;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1191;;
1192;; LPT3 Device "interrupt" entry point
1193;;
1194;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1195INTERRUPT3 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 ;;
1240LPT3_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 ;;
1279LPT3_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
1292LPT3_MEM_DONE : ;;
1293 ;;
1294 JMP COMMON_INTR ;; common interrupt handler
1295 ;;
1296INTERRUPT3 ENDP ;;
1297;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1298;
1299; Common interrupt entry :
1300; at entry, BUFn (CS:BX) of LPTn is defined
1301;
1302;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1303COMMON_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
1326L1:
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
1337NOT0FFFF: ;;
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
1358X1: 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
1366X2: MOV BUF.LPT_INTRS,AX ;;
1367 ;;
1368 ;;
1369;$ORELSE ;; find next header to have the same
1370 ;; device name
1371 JMP L4 ;;
1372L3: ;;
1373 LES DI,DWORD PTR NHD.DH_NEXTO ;
1374 ;;
1375;$ENDLOOP ;;
1376 JMP L1 ;;
1377L2: ;;
1378;$ENDSRCH ;;
1379L4: ;;
1380 ;;
1381DOSLPT_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 ;;
1413UN_SUP: JMP NORM_DRIVER ;; to be handled by DOS normal driver
1414 ;;
1415GIO_COMMAND : ;; Check if it is valid GIO
1416 ;;
1417GIO_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 ;;
1432SUPPORTED : ;; 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 ;;
1456IRPT_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 ;;
1475RET0_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 ;;
1484RET0_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 ;;
1496INTERRUPT0 ENDP ;;
1497 ;;
1498 ;;
1499;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1500;;
1501;;==== Command not supported by CPSW device driver
1502;;
1503;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1504 ;;
1505NORM_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 ;;
1517NORM_DRIVER ENDP ;;
1518 ;;
1519 ;;
1520;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1521;;
1522;;==== Command Code - lpt_output =======
1523;;
1524;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1525 ;;
1526WRITE 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 ;;
1537WRT_NOT_NORMAL : ;;
1538 CMP AX,DESG_END ;;
1539 JNE WRT_FONT ;;
1540 JMP NO_MORE_FTBLK ;; ignore the write
1541 ;;
1542WRT_FONT : ;;
1543 CMP AX,DESG_WR ;;
1544 JE WRT_DESIGNATE ;;
1545 JMP WRT_NORMAL ;;
1546 ;;-------------------------
1547WRT_DESIGNATE : ;; DESIGNATE WRITE
1548 MOV AX,BUF.STATUS ;;
1549 AND AX,FAIL ;;
1550 JZ WRT_DESG_GOOD ;;
1551 JMP WRT_IGNORE ;; already failed
1552 ;;
1553WRT_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 ;;
1572FP_CALL : ;; **************************
1573 CALL FONT_PARSER ;; ** Parse the Font File **
1574FP_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 ;;
1591CHECK_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 ;;...................................
1597PARSE_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
1607SKIP_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 ;;
1615LOCATE_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 ;;
1631SLOT_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 ;;
1642CHECK_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 ;;
1650NEXT_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 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1666FONT_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 ;;
1687SELECT_0: ;;
1688 ;;
1689 POP CX ;;
1690 JMP STORE_FONT ;;
1691 ;;
1692SELECT_NOT0 : ;;
1693 ;;
1694 CMP BUF.PCLASS,1 ;;
1695 JNE NOT_CLASS1 ;;
1696 JMP SELECT_CLASS1 ;;
1697 ;;
1698not_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 ;;
1706SELECT_NOT_PASSED : ;;
1707 CMP AX,BUF.FSELMAX ;;
1708 JNA SELECT_NOT_LONG ;;
1709 JMP SELECT_BAD ;; cannot be more than buffer size
1710 ;;
1711 ;;
1712SELECT_NOT_LONG : ;;
1713 MOV AX,CS:[SI].FTB_SELECT ;;
1714 CMP AX,1 ;;
1715 JE SELECT_1 ;;
1716 JMP SELECT_BAD ;;
1717 ;;
1718SELECT_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 ;;
1727CTL_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 ;;
1738STORE_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 ;;
1780MORE_FONT : ;; more font data ?
1781 ;;
1782 JMP STORE_FONT ;;
1783 ;;
1784SELECT_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
1791GOOD_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 ;;
1810CTL_ADDR : ;;
1811 AND DX,DX ;;
1812 JZ CTL_LOCATED ;;
1813 ADD DI,BUF.FTSZPA ;;
1814 DEC DX ;;
1815 JNZ CTL_ADDR ;;
1816 ;;
1817CTL_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 ;;
1827HASBEEN_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 ;;
1845COPY_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 ;;
1853FONT_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 ;;
1889SKIP_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 ;;
1896SKIP_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 ;;
1904SELECT_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
1924STORE_FONT : ;;
1925 ;;
1926 CMP CS:[SI].FTB_DLEN,0 ;; any font data left ?
1927 JNZ HAS_FONT_DATA ;;
1928 JMP NEXT_FTBLK ;;
1929 ;;
1930HAS_FONT_DATA : ;;
1931 PUSH ES ;;
1932 POP AX ;;
1933 AND AX,AX ;;
1934 JNZ STORE_FONT_BUFFER ;;
1935 JMP FONT_DOWNLOAD ;;
1936 ;;
1937 ;;
1938 ;;
1939STORE_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 ;;
1978ROOM_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 ;;
2008FONT_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 ;;
2031FDL_CALL_STR : ;;
2032 CALL DWORD PTR CS:[SI].LPT_STRAO ;; LPTn strategy routine.
2033 POP BX ;;
2034 POP ES ;;
2035 POP SI ;;
2036 ;;
2037FDL_CALL_ITR : ;;
2038 CALL DWORD PTR BUF.LPT_INTRO ;; interrupt the DOS LPTn
2039 ;;
2040FDL_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 ;;
2048fdl_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 ;;
2057FDL_BAD : ;; **** LOOP EXIT (bad) ****
2058 OR BUF.STATUS,FAIL ;;
2059 ;;
2060 JMP WRITE_RET ;;
2061 ;;
2062WRT_NORMAL : ;;
2063 ;;
2064 JMP NORM_DRIVER ;;
2065 ;;
2066WRT_ignore : ;;
2067 ;;
2068 LES DI,dword ptr buf.rh_ptro ;;
2069 MOV RH.RHC_STA,STAT_DEVERR ;;
2070 JMP WRITE_RET ;;
2071 ;;
2072NO_MORE_FTBLK : ;;
2073 ;;
2074 LES DI,dword ptr buf.rh_ptro ;;
2075 MOV RH.RHC_STA,0 ;;
2076 ;;
2077WRITE_RET : ;;
2078 RET ;;
2079 ;;
2080WRITE ENDP ;;
2081 ;;
2082;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2083;;
2084;;==== Generic IOCTL Designate Start ======
2085;;
2086;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2087DESIGNATE_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!!!!!
2092DS_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
2098DS_01: CALL CHECK_PRINT_ACTIVE ;G; THIS WILL FIND OUT IF THE
2099 JNC DS_02 ;G;
2100DS_03: ;; WGR ;AN000;
2101 JMP DST_DEVERR ;G; PRINT.COM IS ACTIVE, CY=1 MEANS YES
2102 ;G;
2103DS_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 ;;
2121DST_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 ? **
2143NO_REFRESH : ;; *********************************
2144 ;; CX = number of codepages designated
2145 CMP BUF.PCLASS,1 ;; CLASS 1 Printer ?
2146 JNE DST_RAM ;;
2147 JMP DST_CART ;;
2148 ;;
2149DST_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 ;;
2163DST_NORMAL : ;;
2164 push cs ;;
2165 pop ds ;;
2166 JMP NORM_DRIVER ;;
2167 ;;
2168DST_DEVERR : ;;
2169 MOV AX,STAT_DEVERR ;;
2170 JMP DST_RET ;G;
2171 ;;
2172DST_CMDERR : ;G;
2173 MOV AX,STAT_CMDERR ;G;
2174DST_RET : ;;
2175 JMP DST_RETURN ;;
2176 ;;
2177DST_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 ;; *************************************
2190DST_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 ;;
2215RESET_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 ;;
2237SKIP_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 ;;
2249FILL_BUFFER : ;;
2250 ;;
2251 POP SI ;;
2252 ;;
2253 PUSH DI ;;
2254 POP BX ;; BX = the positioned buffer
2255 ;;
2256DST_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 ;;
2292BUF_DEFINE : ;;
2293 MOV CS:[BX],AX ;; no duplicated cp in MODE list
2294 ;;
2295 ;;
2296 ;; **** NEXT IN LOOP ****
2297DST_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
2343CMP_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
2354DST_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 ;;
2404SLT_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 ;;
2411DST_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 ;;
2422DST_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 ;;
2456PREPARE_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 ;;
2466GET_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 ;;
2478NEW_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 ;;
2494GET_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 ;;
2504NO_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 ;;
2513DEFINE_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 ;;
2541SET_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 ;;
2572FONT_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 ;;
2589FTDL_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 ;;
2598ftdl_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 ;;
2607FTDL_DONE : ;;
2608 POP SI ;;
2609 POP DI ;;
2610 POP CX ;;
2611 ;;
2612 JMP CHECK_OTHER ;;
2613 ;;
2614 ;; *******************************
2615 ;; ** NEXT STATE = DSIGNATE_END **
2616 ;; *******************************
2617NO_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 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2623CHECK_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 ;;
2638DST_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 ;;
2654DST_CHECK_FBUFFER: ;;
2655 MOV DI,BUF.RAMSO ;;
2656 ;;
2657DST_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 ;;
2669DST_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 ;;
2676DST_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 ;;
2685DST_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 ;;
2692DST_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 ;;
2726fdl_good2 : ;;
2727 PUSH AX ;;
2728 AND AX,STAT_ERROR ;;
2729 POP AX ;;
2730 JZ DST_REF_INVK ;;
2731 ;;
2732 ;;
2733DST_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 ;;
2743DST_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 ;;
2754DST_RAM_CMP: ;; there are RAM-slots
2755DST_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 ;;
2766DST_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 ;;
2773DST_HWCP_CMP : ;;
2774DST_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 ;;
2780DST_HWCP_NEXT : ;;
2781 INC DI ;;
2782 INC DI ;;
2783 INC DI ;;
2784 INC DI ;;
2785 DEC CX ;;
2786 JNZ DST_HWCP_LP ;;
2787 ;;
2788DST_NO_IVK: ;;
2789 XOR AX,AX ;;
2790 JMP DST_RETURN ;;
2791 ;;
2792DST_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 ;;
2820DESIGNATE_START ENDP ;;
2821 ;;
2822;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2823;;
2824;;==== Generic IOCTL Designate End ======
2825;;
2826;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2827DESIGNATE_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;
2834DE_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 ;;
2843DEN_REFRESH : ;;
2844 AND BUF.STATUS,NOT REFRESH ;;
2845 XOR AX,AX ;;
2846 JMP DEN_RET ;;
2847 ;;
2848DEN_NOT_CPSW : ;;
2849 CMP AX,NORMAL ;;
2850 JNE den_NOT_NORMAL ;;
2851 JMP NORM_DRIVER ;; not in the code page switching stage
2852 ;;
2853den_NOT_NORMAL : ;;
2854 CMP AX,DESG_END ;;
2855 JNE den_other ;;
2856 JMP den_ENDED ;; end with no error check
2857 ;;
2858den_other : ;;
2859 CMP AX,DESG_WR ;;
2860 JE den_write ;;
2861 MOV AX,STAT_BADDEN ;;
2862 JMP DEN_FAIL ;; no designate start
2863 ;;-------------------------
2864den_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 ;;
2872DEN_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 ;;
2885DEN_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 ;;
2892DEN_ENDED : ;; good designate-end
2893 ;;
2894 MOV DI,BUF.HARDSO ;; to hardware slot
2895 MOV SI,BUF.HRBUFO ;; to hardware-buffer
2896HARD_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 ;;
2907HARD_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 ;;
2921ASSIGN_CP_CART : ;;
2922 JMP ASSIGN_CP ;;
2923 ;;
2924ASSIGN_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 ;;
2934ASSIGN_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 ;;
2950SLOT_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 ;;
2957NOT_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
2965ASSIGN_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 ;;
3013DEN_NO_SELECT : ;;
3014 XOR AX,AX ;; clear status
3015 JMP DEN_RET ;;
3016 ;;
3017DEN_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 ;;
3028DEN_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 ;;
3036DEN_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
3051DEN_FAIL_NEXT : ;;
3052 ;;
3053 INC DI ;;
3054 INC DI ;;
3055 INC DI ;;
3056 INC DI ;;
3057 DEC CX ;;
3058 JNE DEN_FAIL_LOOP ;;
3059 ;;
3060DEN_FAIL_RET : ;;
3061 ;;
3062 POP AX ;;
3063 ;;
3064 MOV BUF.FSELEN,0 ;;
3065 ;;
3066 ;;-------------------------------------
3067DEN_RET : ;;
3068 MOV BUF.STATE,CPSW ;; end of designate cycle
3069 ;;
3070DE_11: ;; WGR ;AN000;
3071 LES DI,dword ptr buf.rh_ptro ;;
3072 MOV RH.RHC_STA,AX ;;
3073 ;;
3074 RET ;;
3075 ;;
3076DESIGNATE_END ENDP ;;
3077 ;;
3078;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3079;;
3080;;==== Generic IOCTL Invoke ==========
3081;;
3082;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3083 ;;
3084INVOKE 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;
3092IVK_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;
3098IVK_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 ;;
3107IVK_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 ;;
3113IVK_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 ;;
3124RAM_CMP: ;; there are RAM-slots
3125 PUSH CX ;; stack 1 = size
3126 PUSH DI ;;
3127 POP SI ;; start of the slot compared with (SI)
3128RAM_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
3141HWCP_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 ;;
3148HWCP_CMP : ;;
3149 PUSH CX ;; stack 1 = size of HWCP
3150 PUSH DI ;;
3151 POP SI ;; start of the slot compared with (SI)
3152HWCP_LP: ;;
3153 MOV AX,CS:[DI].SLT_CP ;;
3154 CMP AX,DX ;;
3155 JNE HWCP_NEXT ;;
3156 JMP IVK_HWCPCP ;;
3157 ;;
3158HWCP_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
3177IVK_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;
3194NEXT_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;
3199NEXT_2: ;; WGR ;AN000;
3200 JMP ALL_RESET ;; WGR exit invoke with good status ;AN000;
3201IR_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 ;;
3224LOCATE_FONT : ;;
3225 AND DX,DX ;;
3226 JZ FONT_LOCATED ;;
3227 ADD AX,BUF.FTSZPA ;;
3228 DEC DX ;;
3229 JMP LOCATE_FONT ;;
3230 ;;
3231FONT_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.
3247Send_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 ;;
3278Ram_Prt_Status_err:
3279 POP CX ;; stack -1
3280 JMP IVK_DEVERR ;;
3281 ;;-------------------------------------
3282 ;; **** SEND THE SELECTION CONTROL ****
3283 ;;
3284INVK_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
3309IVK_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;
3319NEXT_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;
3324NEXT_4: ;; WGR ;AN000;
3325 JMP ALL_RESET ;; WGR exit invoke with good status ;AN000;
3326IR_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 ;;
3345SELECTCP_LP : ;;
3346 ADD AX,BUF.FTSZPA ;;
3347 ;;
3348 DEC DX ;;
3349 JNZ SELECTCP_LP ;;
3350 ;;
3351ADJUST_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 **
3363SELECT_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 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3370RCTL_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
3383CTL_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
3389Ctl_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 ;;
3397CTL_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 ;;
3406CTL_CLASS1 : ;; sent byte by byte to overcome
3407 MOV CS:[SI].RH3_CNT,1 ;; DOS timeout on kingman printer
3408CTL_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 ;;
3443CTL_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 ;;
3461IVK_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
3472NO_LOAD: ;; (for RAM codepages only)
3473 NOT AX ;;
3474NXT_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 ;;
3489HWCP_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 ;;
3503RESET_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 ;;
3513RAM_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 ;;
3527RESET_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 ;;
3536ALL_RESET : ;;
3537 POP SI ;; stack -1
3538 ;;
3539 XOR AX,AX ;;
3540 JMP IVK_RET ;;
3541 ;;
3542NO_INVOKE : ;;
3543 ;;
3544 MOV AX,STAT_NOCPIV ;;
3545 JMP IVK_RET ;;
3546 ;;
3547IVK_DEVERR : ;;
3548 MOV AX,STAT_DEVERR ;;
3549 JMP IVK_RET ;G;
3550 ;;
3551IVK_CMDERR : ;G;
3552 MOV AX,STAT_CMDERR ;G;
3553 ;;
3554IVK_RET : ;;
3555 LES DI,dword ptr buf.rh_ptro;;
3556 MOV RH.RHC_STA,AX ;;
3557 ;;
3558 RET ;;
3559 ;;
3560INVOKE ENDP ;;
3561 ;;
3562;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3563Prt_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;
3593Prt_Status_Check endp ;AN001;
3594
3595
3596
3597;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3598;;
3599;;==== Generic IOCTL Query Invoked =======
3600;;
3601;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3602 ;;
3603Q_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;
3614QI_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 ;;
3625QIV_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 ;;
3636QIV_HARD : ;;
3637 MOV DI,BUF.HARDSO ;;
3638 MOV CX,BUF.HSLMX ;;
3639 AND CX,CX ;;
3640 JZ QIV_NOACT ;;
3641 ;;
3642QIV_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 ;;
3653QIV_NOACT : ;;
3654 ;;
3655 MOV AX,STAT_NOCPIV ;;
3656 JMP QIV_RET ;;
3657 ;;
3658 ;;
3659QIV_FOUND : ;;
3660 MOV AX,CS:[DI].SLT_CP ;;
3661QI_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 ;;
3668QIV_DEVERR : ;;
3669 MOV AX,STAT_DEVERR ;;
3670 JMP QIV_RET ;G;
3671 ;;
3672QIV_CMDERR : ;G;
3673 MOV AX,STAT_CMDERR ;G;
3674 ;;
3675QIV_RET : ;;
3676 LES DI,dword ptr buf.rh_ptro ;;
3677 MOV RH.RHC_STA,AX ;;
3678 ;;
3679 pop ds ;;
3680 ;;
3681 RET ;;
3682 ;;
3683Q_INVOKED ENDP ;;
3684;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3685;;
3686;;==== Generic IOCTL Query List =======
3687;;
3688;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3689Q_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;
3699QLS_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 ;;
3709QL_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 ;;
3723QL_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 ;;
3731QL_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 ;;
3746QL_RAM_PREP: ;;
3747 MOV DI,BUF.RAMSO ;;
3748 MOV CX,BUF.RSLMX ;;
3749 ;;
3750QL_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 ;;
3764QL_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 ;;
3780QLS_DEVERR : ;;
3781 MOV AX,STAT_DEVERR ;;
3782 JMP QLS_RET ;G;
3783 ;;
3784QLS_CMDERR : ;G;
3785 MOV AX,STAT_CMDERR ;G;
3786 ;;
3787QLS_RET : ;;
3788 LES DI,dword ptr buf.rh_ptro ;;
3789 MOV RH.RHC_STA,AX ;;
3790 ;;
3791 pop ds ;;
3792 RET ;;
3793 ;;
3794Q_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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3811CHECK_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
3838CPA_5: CLC ;G; CAN CONTINUE IT PROCESS!
3839CPA_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;
3845CHECK_PRINT_ACTIVE ENDP ;G;
3846;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3847
3848
3849
3850CSEG ENDS
3851 END