summaryrefslogtreecommitdiff
path: root/v4.0/src/DEV/PRINTER
diff options
context:
space:
mode:
Diffstat (limited to 'v4.0/src/DEV/PRINTER')
-rw-r--r--v4.0/src/DEV/PRINTER/4201/4201.CPIbin0 -> 6404 bytes
-rw-r--r--v4.0/src/DEV/PRINTER/4201/4201.INC801
-rw-r--r--v4.0/src/DEV/PRINTER/4201/4201.MAK7
-rw-r--r--v4.0/src/DEV/PRINTER/4201/MAKEFILE0
-rw-r--r--v4.0/src/DEV/PRINTER/4208/4208-CPY.ASM10
-rw-r--r--v4.0/src/DEV/PRINTER/4208/4208.CPIbin0 -> 720 bytes
-rw-r--r--v4.0/src/DEV/PRINTER/4208/4208.INC90
-rw-r--r--v4.0/src/DEV/PRINTER/4208/4208.MAK7
-rw-r--r--v4.0/src/DEV/PRINTER/4208/MAKEFILE0
-rw-r--r--v4.0/src/DEV/PRINTER/5202/5202.ASM108
-rw-r--r--v4.0/src/DEV/PRINTER/5202/MAKEFILE21
-rw-r--r--v4.0/src/DEV/PRINTER/CPSFONT.ASM1961
-rw-r--r--v4.0/src/DEV/PRINTER/CPSFONT3.ASM1961
-rw-r--r--v4.0/src/DEV/PRINTER/CPSPEQU.INC577
-rw-r--r--v4.0/src/DEV/PRINTER/CPSPI.ASM2422
-rw-r--r--v4.0/src/DEV/PRINTER/CPSPI07.ASM1416
-rw-r--r--v4.0/src/DEV/PRINTER/CPSPM10.ASM3851
-rw-r--r--v4.0/src/DEV/PRINTER/MAKEFILE40
-rw-r--r--v4.0/src/DEV/PRINTER/PARSE4E.ASM1106
-rw-r--r--v4.0/src/DEV/PRINTER/PARSER.ASM668
-rw-r--r--v4.0/src/DEV/PRINTER/PRINTER.LNK9
-rw-r--r--v4.0/src/DEV/PRINTER/PRINTER.SKL17
-rw-r--r--v4.0/src/DEV/PRINTER/PRTINT2F.ASM450
-rw-r--r--v4.0/src/DEV/PRINTER/PTRMSG.ASM41
-rw-r--r--v4.0/src/DEV/PRINTER/ZERO.DAT1
25 files changed, 15564 insertions, 0 deletions
diff --git a/v4.0/src/DEV/PRINTER/4201/4201.CPI b/v4.0/src/DEV/PRINTER/4201/4201.CPI
new file mode 100644
index 0000000..7b16921
--- /dev/null
+++ b/v4.0/src/DEV/PRINTER/4201/4201.CPI
Binary files differ
diff --git a/v4.0/src/DEV/PRINTER/4201/4201.INC b/v4.0/src/DEV/PRINTER/4201/4201.INC
new file mode 100644
index 0000000..7c82aa8
--- /dev/null
+++ b/v4.0/src/DEV/PRINTER/4201/4201.INC
@@ -0,0 +1,801 @@
1 db 0FFH,046H,04FH,04EH,054H,020H,020H,020H
2 db 000H,000H,000H,000H,000H,000H,000H,000H
3 db 001H,000H,001H,017H,000H,000H,000H,005H
4 db 000H,01CH,000H,035H,000H,000H,000H,002H
5 db 000H,034H,032H,030H,031H,020H,020H,020H
6 db 020H,05FH,003H,000H,000H,000H,000H,000H
7 db 000H,0A5H,000H,000H,000H,01CH,000H,051H
8 db 000H,000H,000H,002H,000H,034H,032H,030H
9 db 031H,020H,020H,020H,020H,0B5H,001H,000H
10 db 000H,000H,000H,000H,000H,064H,006H,000H
11 db 000H,01CH,000H,06DH,000H,000H,000H,002H
12 db 000H,034H,032H,030H,031H,020H,020H,020H
13 db 020H,05CH,003H,000H,000H,000H,000H,000H
14 db 000H,087H,006H,000H,000H,01CH,000H,089H
15 db 000H,000H,000H,002H,000H,034H,032H,030H
16 db 031H,020H,020H,020H,020H,061H,003H,000H
17 db 000H,000H,000H,000H,000H,045H,00BH,000H
18 db 000H,01CH,000H,000H,000H,000H,000H,002H
19 db 000H,034H,032H,030H,031H,020H,020H,020H
20 db 020H,052H,003H,000H,000H,000H,000H,000H
21 db 000H,04FH,00CH,000H,000H,001H,000H,001H
22 db 000H,0B9H,005H,001H,000H,00CH,000H,005H
23 db 01BH,049H,000H,01BH,036H,005H,01BH,049H
24 db 004H,01BH,036H,01BH,03DH,001H,000H,015H
25 db 01BH,03DH,000H,000H,01BH,049H,004H,000H
26 db 01BH,03DH,029H,000H,014H,084H,000H,009H
27 db 04EH,014H,084H,0A4H,0A4H,0A4H,084H,014H
28 db 04EH,000H,000H,000H,009H,004H,00AH,02AH
29 db 0AAH,06AH,02AH,02AH,01CH,002H,000H,000H
30 db 000H,009H,0C0H,0A0H,0A0H,0FEH,080H,080H
31 db 080H,080H,0FEH,000H,000H,000H,000H,01BH
32 db 03DH,077H,000H,014H,08DH,000H,009H,00AH
33 db 00AH,00AH,00AH,00AH,00AH,00AH,00AH,00AH
34 db 000H,000H,000H,009H,00EH,014H,024H,0A4H
35 db 064H,024H,024H,014H,00EH,000H,000H,000H
36 db 017H,000H,050H,0AAH,0AAH,0AAH,0AAH,0AAH
37 db 014H,000H,000H,000H,000H,009H,03EH,02AH
38 db 02AH,02AH,06AH,0AAH,02AH,022H,022H,000H
39 db 000H,000H,009H,03EH,02AH,02AH,0AAH,06AH
40 db 02AH,02AH,022H,022H,000H,000H,000H,009H
41 db 03EH,02AH,06AH,0AAH,0AAH,0AAH,06AH,022H
42 db 022H,000H,000H,000H,008H,04CH,012H,092H
43 db 092H,092H,012H,052H,00CH,000H,000H,000H
44 db 000H,009H,03EH,0AAH,0AAH,02AH,02AH,02AH
45 db 0AAH,0A2H,022H,000H,000H,000H,017H,000H
46 db 000H,0A2H,0A2H,03EH,022H,0A2H,080H,000H
47 db 000H,000H,000H,000H,01BH,03DH,01CH,000H
48 db 014H,098H,000H,008H,05DH,022H,022H,022H
49 db 022H,022H,022H,05DH,000H,000H,000H,000H
50 db 009H,01CH,022H,062H,0A2H,0A2H,0A2H,062H
51 db 022H,01CH,000H,000H,000H,000H,01BH,03DH
52 db 01CH,000H,014H,09DH,000H,009H,03CH,002H
53 db 002H,082H,042H,002H,002H,002H,03CH,000H
54 db 000H,000H,009H,05CH,002H,082H,082H,082H
55 db 082H,082H,002H,05CH,000H,000H,000H,000H
56 db 01BH,03DH,01CH,000H,014H,0A0H,000H,025H
57 db 000H,000H,000H,000H,0EEH,000H,000H,000H
58 db 000H,000H,000H,000H,025H,000H,000H,000H
59 db 000H,040H,080H,000H,000H,000H,000H,000H
60 db 000H,000H,01BH,03DH,043H,000H,014H,0A4H
61 db 000H,016H,000H,080H,080H,000H,000H,080H
62 db 080H,000H,000H,000H,000H,080H,015H,000H
63 db 000H,001H,001H,005H,002H,000H,000H,000H
64 db 000H,000H,000H,025H,000H,000H,000H,0A8H
65 db 0A8H,0A8H,050H,000H,000H,000H,000H,000H
66 db 009H,080H,080H,080H,080H,080H,080H,080H
67 db 080H,080H,000H,000H,000H,016H,000H,000H
68 db 062H,0A2H,0BEH,0A2H,062H,000H,000H,000H
69 db 000H,000H,000H,01BH,03DH,00FH,000H,014H
70 db 0ADH,000H,00BH,0A8H,0A8H,0AAH,054H,008H
71 db 010H,022H,046H,08AH,002H,01FH,000H,000H
72 db 01BH,03DH,032H,000H,015H,084H,000H,000H
73 db 000H,000H,001H,000H,001H,000H,021H,000H
74 db 023H,002H,025H,004H,06DH,008H,025H,010H
75 db 034H,0A0H,024H,000H,0A4H,000H,0A4H,000H
76 db 0A4H,000H,024H,000H,014H,0A0H,005H,010H
77 db 04DH,008H,005H,004H,003H,002H,001H,000H
78 db 001H,000H,001H,000H,000H,000H,01BH,03DH
79 db 032H,000H,015H,086H,000H,000H,000H,000H
80 db 000H,000H,000H,000H,030H,020H,030H,020H
81 db 078H,071H,078H,071H,078H,0F9H,078H,0F9H
82 db 07FH,0FFH,000H,080H,000H,080H,000H,080H
83 db 000H,080H,000H,080H,07FH,0FFH,000H,081H
84 db 000H,081H,000H,081H,000H,081H,000H,000H
85 db 000H,000H,000H,000H,01BH,03DH,092H,000H
86 db 015H,08DH,001H,000H,000H,00AH,000H,00AH
87 db 000H,00AH,000H,00AH,000H,00AH,000H,00AH
88 db 000H,00AH,000H,00AH,000H,00AH,000H,00AH
89 db 000H,00AH,000H,00AH,000H,00AH,000H,00AH
90 db 000H,00AH,000H,00AH,000H,00AH,000H,00AH
91 db 000H,00AH,000H,00AH,000H,00AH,000H,00AH
92 db 000H,00AH,000H,000H,000H,000H,001H,000H
93 db 001H,000H,021H,000H,023H,002H,025H,004H
94 db 02DH,008H,025H,010H,0B4H,020H,024H,000H
95 db 024H,080H,024H,000H,064H,000H,024H,000H
96 db 014H,020H,005H,010H,00DH,008H,005H,004H
97 db 003H,002H,001H,000H,001H,000H,001H,000H
98 db 000H,000H,000H,000H,000H,000H,000H,000H
99 db 000H,000H,000H,000H,000H,000H,010H,030H
100 db 029H,003H,000H,009H,040H,041H,024H,001H
101 db 000H,081H,000H,0A5H,000H,081H,012H,080H
102 db 001H,082H,000H,090H,04AH,0C0H,004H,00CH
103 db 000H,000H,000H,000H,000H,000H,000H,000H
104 db 000H,000H,01BH,03DH,062H,000H,015H,091H
105 db 000H,000H,000H,000H,000H,000H,021H,000H
106 db 021H,000H,021H,000H,021H,000H,03FH,03EH
107 db 021H,008H,021H,008H,0A1H,008H,021H,008H
108 db 021H,088H,021H,008H,061H,008H,02DH,01CH
109 db 021H,000H,021H,000H,021H,000H,021H,000H
110 db 021H,000H,033H,026H,000H,000H,000H,000H
111 db 000H,000H,000H,000H,000H,000H,021H,000H
112 db 021H,000H,021H,000H,021H,000H,03FH,03EH
113 db 061H,008H,021H,008H,021H,088H,021H,008H
114 db 0A1H,008H,0A1H,008H,0A1H,008H,02DH,01CH
115 db 021H,080H,021H,000H,061H,000H,021H,000H
116 db 021H,000H,033H,026H,000H,000H,000H,000H
117 db 01BH,03DH,062H,000H,015H,094H,000H,000H
118 db 000H,000H,000H,000H,021H,000H,021H,000H
119 db 021H,000H,021H,000H,0BFH,0BEH,0A1H,088H
120 db 0A1H,088H,021H,008H,021H,008H,021H,008H
121 db 021H,008H,021H,008H,02DH,01CH,0A1H,080H
122 db 0A1H,080H,0A1H,080H,021H,000H,021H,000H
123 db 033H,026H,000H,000H,000H,000H,000H,000H
124 db 000H,000H,000H,000H,000H,000H,000H,000H
125 db 000H,000H,021H,000H,0A1H,080H,0A1H,080H
126 db 0A1H,080H,021H,000H,021H,000H,03FH,03EH
127 db 021H,000H,021H,000H,0A1H,080H,0A1H,080H
128 db 0A1H,080H,021H,000H,000H,000H,000H,000H
129 db 000H,000H,000H,000H,000H,000H,01BH,03DH
130 db 062H,000H,015H,098H,000H,000H,000H,000H
131 db 000H,000H,042H,000H,000H,000H,018H,054H
132 db 000H,028H,024H,000H,000H,000H,000H,044H
133 db 000H,044H,000H,044H,000H,044H,000H,044H
134 db 000H,044H,000H,044H,000H,000H,024H,000H
135 db 000H,028H,018H,054H,000H,000H,042H,000H
136 db 000H,000H,000H,000H,000H,000H,000H,000H
137 db 000H,000H,000H,000H,000H,000H,01CH,01CH
138 db 002H,020H,060H,002H,000H,000H,001H,0C0H
139 db 001H,040H,081H,040H,081H,040H,081H,040H
140 db 001H,040H,001H,0C0H,000H,000H,060H,002H
141 db 002H,020H,01CH,01CH,000H,000H,000H,000H
142 db 000H,000H,000H,000H,01BH,03DH,062H,000H
143 db 015H,09DH,000H,000H,000H,000H,020H,000H
144 db 020H,000H,020H,000H,03CH,03CH,022H,000H
145 db 020H,002H,020H,000H,081H,000H,001H,000H
146 db 001H,080H,001H,000H,041H,000H,001H,000H
147 db 001H,000H,020H,000H,020H,002H,022H,000H
148 db 03CH,03CH,020H,000H,020H,000H,020H,000H
149 db 000H,000H,000H,000H,000H,000H,020H,000H
150 db 020H,000H,020H,000H,03CH,03CH,022H,000H
151 db 060H,002H,020H,000H,001H,080H,001H,000H
152 db 081H,000H,081H,000H,081H,000H,001H,000H
153 db 001H,080H,020H,000H,060H,002H,022H,000H
154 db 03CH,03CH,020H,000H,020H,000H,020H,000H
155 db 000H,000H,01BH,03DH,062H,000H,015H,0A0H
156 db 000H,000H,000H,000H,000H,000H,000H,000H
157 db 000H,000H,000H,000H,000H,000H,000H,000H
158 db 000H,000H,000H,000H,000H,000H,000H,000H
159 db 0E7H,0E7H,000H,000H,000H,000H,000H,000H
160 db 000H,000H,000H,000H,000H,000H,000H,000H
161 db 000H,000H,000H,000H,000H,000H,000H,000H
162 db 000H,000H,000H,000H,000H,000H,000H,000H
163 db 000H,000H,000H,000H,000H,000H,000H,000H
164 db 000H,000H,000H,000H,000H,000H,040H,000H
165 db 000H,000H,000H,080H,000H,000H,080H,000H
166 db 000H,000H,000H,000H,000H,000H,000H,000H
167 db 000H,000H,000H,000H,000H,000H,000H,000H
168 db 01BH,03DH,0F2H,000H,015H,0A4H,000H,000H
169 db 000H,000H,000H,000H,000H,000H,000H,000H
170 db 000H,000H,000H,000H,080H,080H,080H,080H
171 db 080H,080H,000H,000H,000H,000H,000H,000H
172 db 000H,000H,000H,000H,080H,080H,080H,080H
173 db 080H,080H,000H,000H,000H,000H,000H,000H
174 db 000H,000H,000H,000H,000H,000H,080H,000H
175 db 000H,000H,000H,000H,000H,000H,000H,000H
176 db 000H,000H,000H,000H,000H,000H,000H,000H
177 db 000H,000H,000H,000H,000H,000H,000H,001H
178 db 001H,000H,000H,002H,002H,000H,000H,000H
179 db 000H,000H,000H,000H,000H,000H,000H,000H
180 db 000H,000H,000H,000H,000H,000H,000H,000H
181 db 000H,000H,000H,000H,000H,000H,000H,000H
182 db 000H,000H,000H,000H,000H,000H,008H,080H
183 db 000H,000H,080H,008H,0A0H,008H,0A0H,008H
184 db 0A0H,008H,0A0H,008H,020H,000H,008H,0A0H
185 db 050H,050H,000H,000H,000H,000H,000H,000H
186 db 000H,000H,000H,000H,000H,000H,000H,000H
187 db 000H,000H,000H,000H,000H,000H,080H,000H
188 db 080H,000H,080H,000H,080H,000H,080H,000H
189 db 080H,000H,080H,000H,080H,000H,080H,000H
190 db 080H,000H,080H,000H,080H,000H,080H,000H
191 db 080H,000H,080H,000H,080H,000H,080H,000H
192 db 000H,000H,000H,000H,000H,000H,000H,000H
193 db 000H,000H,000H,000H,000H,000H,000H,000H
194 db 000H,000H,021H,000H,061H,000H,021H,000H
195 db 021H,080H,021H,000H,0A1H,000H,0BFH,03EH
196 db 0A1H,000H,021H,000H,021H,080H,021H,000H
197 db 061H,000H,021H,000H,000H,000H,000H,000H
198 db 000H,000H,000H,000H,000H,000H,01BH,03DH
199 db 032H,000H,015H,0ADH,000H,000H,010H,080H
200 db 080H,010H,080H,010H,080H,050H,081H,050H
201 db 080H,052H,002H,000H,070H,0A4H,004H,000H
202 db 000H,008H,008H,000H,000H,010H,010H,000H
203 db 002H,022H,024H,006H,008H,04AH,040H,002H
204 db 000H,082H,000H,002H,007H,007H,000H,002H
205 db 000H,002H,000H,000H,001H,000H,001H,000H
206 db 01DH,000H,001H,000H,00CH,000H,005H,01BH
207 db 049H,000H,01BH,036H,005H,01BH,049H,004H
208 db 01BH,036H,01BH,03DH,001H,000H,015H,01BH
209 db 03DH,000H,000H,01BH,049H,004H,000H,001H
210 db 000H,001H,000H,0B8H,004H,001H,000H,00CH
211 db 000H,005H,01BH,049H,000H,01BH,036H,005H
212 db 01BH,049H,004H,01BH,036H,01BH,03DH,001H
213 db 000H,015H,01BH,03DH,000H,000H,01BH,049H
214 db 004H,000H,01BH,03DH,029H,000H,014H,084H
215 db 000H,009H,044H,00AH,08AH,0AAH,0AAH,06AH
216 db 04AH,05CH,082H,000H,000H,000H,009H,004H
217 db 00AH,02AH,0AAH,06AH,02AH,02AH,01CH,002H
218 db 000H,000H,000H,009H,00EH,014H,024H,024H
219 db 064H,0A4H,024H,014H,00EH,000H,000H,000H
220 db 000H,01BH,03DH,0DFH,000H,014H,089H,000H
221 db 009H,07EH,02AH,0AAH,0AAH,0AAH,0AAH,0AAH
222 db 022H,062H,000H,000H,000H,009H,01CH,02AH
223 db 02AH,0AAH,06AH,02AH,02AH,02AH,018H,000H
224 db 000H,000H,016H,000H,000H,022H,022H,07EH
225 db 0A2H,022H,000H,000H,000H,000H,000H,00BH
226 db 040H,000H,09CH,0A2H,0A2H,0A2H,0A2H,0A2H
227 db 09CH,000H,040H,000H,016H,000H,000H,012H
228 db 092H,05EH,002H,002H,000H,000H,000H,000H
229 db 000H,009H,04EH,014H,084H,0A4H,0A4H,064H
230 db 044H,054H,08EH,000H,000H,000H,009H,04EH
231 db 014H,084H,0A4H,0A4H,0A4H,084H,014H,04EH
232 db 000H,000H,000H,009H,03EH,02AH,02AH,02AH
233 db 06AH,0AAH,02AH,022H,022H,000H,000H,000H
234 db 009H,00EH,014H,024H,0A4H,064H,024H,024H
235 db 014H,00EH,000H,000H,000H,009H,03EH,02AH
236 db 02AH,0AAH,06AH,02AH,02AH,022H,022H,000H
237 db 000H,000H,008H,04CH,012H,092H,092H,092H
238 db 012H,052H,00CH,000H,000H,000H,000H,008H
239 db 04CH,092H,092H,092H,052H,052H,052H,08CH
240 db 000H,000H,000H,000H,008H,00CH,012H,012H
241 db 092H,052H,012H,012H,00CH,000H,000H,000H
242 db 000H,009H,03CH,002H,002H,002H,042H,082H
243 db 002H,002H,03CH,000H,000H,000H,009H,01CH
244 db 002H,002H,082H,042H,002H,002H,01CH,002H
245 db 000H,000H,000H,016H,000H,000H,022H,0A2H
246 db 07EH,022H,022H,000H,000H,000H,000H,000H
247 db 008H,04CH,092H,092H,092H,052H,052H,052H
248 db 08CH,000H,000H,000H,000H,000H,01BH,03DH
249 db 00FH,000H,014H,09DH,000H,009H,03CH,002H
250 db 002H,082H,042H,002H,002H,002H,03CH,000H
251 db 000H,000H,000H,01BH,03DH,00FH,000H,014H
252 db 09FH,000H,008H,01CH,022H,022H,022H,062H
253 db 0A2H,022H,01CH,000H,000H,000H,000H,000H
254 db 01BH,03DH,00FH,000H,014H,0A9H,000H,008H
255 db 01CH,022H,022H,0A2H,062H,022H,022H,01CH
256 db 000H,000H,000H,000H,000H,01BH,03DH,032H
257 db 000H,015H,084H,000H,000H,000H,000H,000H
258 db 000H,000H,000H,002H,004H,044H,002H,000H
259 db 0A0H,001H,028H,081H,028H,081H,028H,081H
260 db 028H,001H,028H,001H,0A8H,001H,028H,041H
261 db 028H,041H,028H,040H,028H,000H,00AH,010H
262 db 08AH,08EH,01EH,001H,000H,001H,000H,001H
263 db 000H,000H,000H,01BH,03DH,032H,000H,015H
264 db 086H,000H,000H,000H,000H,001H,000H,001H
265 db 000H,021H,000H,023H,002H,025H,004H,02DH
266 db 008H,025H,010H,034H,020H,024H,000H,064H
267 db 000H,024H,000H,024H,080H,024H,000H,094H
268 db 020H,005H,010H,00DH,008H,005H,004H,003H
269 db 002H,001H,000H,001H,000H,001H,000H,000H
270 db 000H,01BH,03DH,032H,000H,015H,089H,000H
271 db 000H,000H,000H,000H,000H,021H,000H,021H
272 db 000H,021H,000H,021H,000H,03FH,03EH,061H
273 db 008H,021H,008H,021H,088H,021H,008H,0A1H
274 db 008H,0A1H,008H,0A1H,008H,02DH,01CH,021H
275 db 080H,021H,000H,061H,000H,021H,000H,021H
276 db 000H,033H,026H,000H,000H,000H,000H,01BH
277 db 03DH,062H,000H,015H,08BH,000H,000H,000H
278 db 000H,000H,000H,000H,000H,000H,000H,000H
279 db 000H,021H,000H,021H,000H,021H,000H,021H
280 db 000H,021H,000H,061H,000H,03FH,03EH,021H
281 db 080H,021H,000H,0A1H,000H,021H,000H,021H
282 db 000H,021H,000H,000H,000H,000H,000H,000H
283 db 000H,000H,000H,000H,000H,000H,000H,000H
284 db 000H,000H,000H,00CH,008H,000H,014H,012H
285 db 000H,000H,000H,040H,022H,000H,000H,021H
286 db 080H,021H,000H,0A1H,000H,0A1H,000H,0A1H
287 db 000H,021H,000H,021H,080H,000H,000H,040H
288 db 022H,000H,000H,012H,000H,000H,014H,00CH
289 db 008H,000H,000H,000H,000H,01BH,03DH,062H
290 db 000H,015H,08EH,000H,000H,000H,000H,001H
291 db 000H,001H,000H,021H,000H,023H,082H,025H
292 db 004H,0ADH,008H,0A5H,010H,0B4H,020H,0A4H
293 db 000H,0A4H,000H,024H,000H,024H,080H,024H
294 db 080H,014H,0A0H,005H,090H,00DH,088H,005H
295 db 004H,083H,002H,001H,000H,001H,000H,001H
296 db 000H,000H,000H,000H,000H,000H,000H,001H
297 db 000H,001H,000H,021H,000H,023H,002H,025H
298 db 004H,06DH,008H,025H,010H,034H,0A0H,024H
299 db 000H,0A4H,000H,0A4H,000H,0A4H,000H,024H
300 db 000H,014H,0A0H,005H,010H,04DH,008H,005H
301 db 004H,003H,002H,001H,000H,001H,000H,001H
302 db 000H,000H,000H,01BH,03DH,062H,000H,015H
303 db 091H,000H,000H,000H,000H,001H,000H,001H
304 db 000H,021H,000H,023H,002H,025H,004H,02DH
305 db 008H,025H,010H,0B4H,020H,024H,000H,024H
306 db 080H,024H,000H,064H,000H,024H,000H,014H
307 db 020H,005H,010H,00DH,008H,005H,004H,003H
308 db 002H,001H,000H,001H,000H,001H,000H,000H
309 db 000H,000H,000H,000H,000H,000H,000H,021H
310 db 000H,021H,000H,021H,000H,021H,000H,03FH
311 db 03EH,021H,008H,021H,008H,0A1H,008H,021H
312 db 008H,021H,088H,021H,008H,061H,008H,02DH
313 db 01CH,021H,000H,021H,000H,021H,000H,021H
314 db 000H,021H,000H,033H,026H,000H,000H,000H
315 db 000H,01BH,03DH,032H,000H,015H,094H,000H
316 db 000H,000H,000H,000H,000H,000H,000H,00CH
317 db 00CH,042H,010H,000H,080H,010H,002H,080H
318 db 000H,081H,020H,081H,020H,001H,020H,001H
319 db 0A0H,001H,020H,041H,020H,041H,020H,040H
320 db 000H,010H,002H,000H,080H,082H,010H,00CH
321 db 00CH,000H,000H,000H,000H,000H,000H,01BH
322 db 03DH,032H,000H,015H,096H,000H,000H,000H
323 db 000H,020H,000H,020H,000H,020H,000H,03CH
324 db 03CH,022H,000H,020H,002H,020H,000H,001H
325 db 000H,001H,000H,041H,000H,001H,000H,001H
326 db 080H,001H,000H,081H,000H,020H,000H,020H
327 db 002H,022H,000H,03CH,03CH,020H,000H,020H
328 db 000H,020H,000H,000H,000H,01BH,03DH,062H
329 db 000H,015H,098H,000H,000H,000H,000H,000H
330 db 000H,000H,000H,000H,000H,000H,000H,021H
331 db 000H,021H,000H,021H,000H,0A1H,000H,021H
332 db 000H,021H,080H,03FH,03EH,061H,000H,021H
333 db 000H,021H,000H,021H,000H,021H,000H,021H
334 db 000H,000H,000H,000H,000H,000H,000H,000H
335 db 000H,000H,000H,000H,000H,000H,000H,000H
336 db 000H,00CH,008H,000H,014H,012H,080H,000H
337 db 000H,080H,022H,080H,000H,0A1H,000H,0A1H
338 db 000H,0A1H,000H,021H,000H,021H,080H,021H
339 db 080H,021H,080H,000H,080H,000H,0A2H,000H
340 db 000H,092H,000H,000H,014H,00CH,008H,000H
341 db 000H,000H,000H,01BH,03DH,032H,000H,015H
342 db 09DH,000H,000H,000H,000H,020H,000H,020H
343 db 000H,020H,000H,03CH,03CH,022H,000H,020H
344 db 002H,020H,000H,081H,000H,001H,000H,001H
345 db 080H,001H,000H,041H,000H,001H,000H,001H
346 db 000H,020H,000H,020H,002H,022H,000H,03CH
347 db 03CH,020H,000H,020H,000H,020H,000H,000H
348 db 000H,01BH,03DH,032H,000H,015H,09FH,000H
349 db 000H,000H,000H,000H,000H,00CH,008H,000H
350 db 014H,012H,000H,000H,000H,000H,022H,000H
351 db 000H,021H,000H,021H,000H,061H,000H,021H
352 db 000H,021H,080H,021H,000H,0A1H,000H,000H
353 db 000H,000H,022H,000H,000H,012H,000H,000H
354 db 014H,00CH,008H,000H,000H,000H,000H,01BH
355 db 03DH,032H,000H,015H,0A9H,000H,000H,000H
356 db 000H,000H,000H,00CH,008H,000H,014H,012H
357 db 000H,000H,000H,000H,022H,000H,000H,0A1H
358 db 000H,021H,000H,021H,080H,021H,000H,061H
359 db 000H,021H,000H,021H,000H,000H,000H,000H
360 db 022H,000H,000H,012H,000H,000H,014H,00CH
361 db 008H,000H,000H,000H,000H,001H,000H,001H
362 db 000H,004H,001H,001H,000H,00CH,000H,005H
363 db 01BH,049H,000H,01BH,036H,005H,01BH,049H
364 db 004H,01BH,036H,01BH,03DH,001H,000H,015H
365 db 01BH,03DH,000H,000H,01BH,049H,004H,000H
366 db 01BH,03DH,029H,000H,014H,09BH,000H,009H
367 db 01CH,023H,022H,026H,02AH,032H,022H,05CH
368 db 000H,000H,000H,000H,009H,012H,012H,07EH
369 db 092H,092H,082H,082H,082H,042H,000H,000H
370 db 000H,00AH,03AH,044H,000H,08AH,092H,0A2H
371 db 000H,044H,0B8H,000H,000H,000H,000H,01BH
372 db 03DH,032H,000H,015H,09BH,080H,000H,000H
373 db 000H,000H,000H,018H,018H,004H,020H,000H
374 db 000H,021H,004H,000H,002H,002H,040H,002H
375 db 044H,006H,040H,002H,048H,00AH,040H,002H
376 db 050H,012H,040H,002H,060H,022H,040H,060H
377 db 000H,020H,084H,000H,000H,004H,020H,018H
378 db 018H,000H,000H,000H,000H,01BH,03DH,032H
379 db 000H,015H,09DH,000H,000H,000H,000H,000H
380 db 000H,018H,018H,024H,024H,002H,040H,000H
381 db 001H,041H,002H,001H,000H,003H,080H,005H
382 db 084H,001H,088H,009H,090H,011H,080H,021H
383 db 0A0H,001H,0C0H,000H,080H,040H,082H,080H
384 db 000H,002H,040H,024H,024H,018H,018H,000H
385 db 000H,000H,000H,01BH,03DH,00FH,000H,014H
386 db 0AFH,000H,009H,05DH,022H,022H,022H,022H
387 db 022H,022H,05DH,000H,000H,000H,01BH,03DH
388 db 032H,000H,015H,0AFH,000H,000H,000H,000H
389 db 000H,000H,042H,000H,000H,000H,018H,054H
390 db 000H,028H,024H,000H,000H,000H,000H,044H
391 db 000H,044H,000H,044H,000H,044H,000H,044H
392 db 000H,044H,000H,044H,000H,000H,024H,000H
393 db 000H,028H,018H,054H,000H,000H,042H,000H
394 db 000H,000H,000H,000H,000H,000H,000H,001H
395 db 000H,001H,000H,0AFH,00CH,001H,000H,00CH
396 db 000H,005H,01BH,049H,000H,01BH,036H,005H
397 db 01BH,049H,004H,01BH,036H,01BH,03DH,001H
398 db 000H,015H,01BH,03DH,000H,000H,01BH,049H
399 db 004H,000H,01BH,03DH,00FH,000H,014H,086H
400 db 000H,00AH,004H,00AH,06AH,0AAH,0AAH,0AAH
401 db 06AH,01CH,002H,000H,000H,000H,000H,01BH
402 db 03DH,036H,000H,014H,09BH,000H,009H,01DH
403 db 022H,026H,02AH,02AH,032H,022H,05CH,000H
404 db 000H,000H,000H,009H,012H,012H,07EH,092H
405 db 092H,082H,082H,082H,042H,000H,000H,000H
406 db 00AH,03AH,044H,000H,08AH,092H,0A2H,000H
407 db 044H,0B8H,000H,000H,000H,019H,000H,044H
408 db 000H,028H,000H,010H,000H,028H,000H,044H
409 db 000H,000H,000H,01BH,03DH,00FH,000H,014H
410 db 0A9H,000H,00BH,03CH,042H,081H,081H,0BDH
411 db 0A9H,0A9H,095H,081H,042H,03CH,000H,000H
412 db 01BH,03DH,036H,000H,014H,0B5H,000H,009H
413 db 00EH,014H,024H,024H,064H,0A4H,024H,014H
414 db 00EH,000H,000H,000H,009H,04EH,014H,084H
415 db 0A4H,0A4H,0A4H,084H,014H,04EH,000H,000H
416 db 000H,009H,00EH,014H,024H,0A4H,064H,024H
417 db 024H,014H,00EH,000H,000H,000H,00BH,038H
418 db 044H,000H,092H,0AAH,0AAH,0AAH,082H,000H
419 db 044H,038H,000H,000H,01BH,03DH,00FH,000H
420 db 014H,0BDH,000H,008H,018H,024H,024H,024H
421 db 07EH,024H,024H,024H,000H,000H,000H,000H
422 db 000H,01BH,03DH,01CH,000H,014H,0C6H,000H
423 db 009H,044H,00AH,08AH,0AAH,0AAH,06AH,04AH
424 db 05CH,082H,000H,000H,000H,009H,04EH,014H
425 db 084H,0A4H,0A4H,064H,044H,054H,08EH,000H
426 db 000H,000H,000H,000H,000H,000H,000H,000H
427 db 000H,01BH,03DH,0A2H,001H,014H,0DDH,000H
428 db 025H,000H,000H,000H,000H,0EEH,000H,000H
429 db 000H,000H,000H,000H,000H,016H,000H,000H
430 db 022H,0A2H,07EH,022H,022H,000H,000H,000H
431 db 000H,001H,00BH,0FCH,0FCH,0FCH,0FCH,0FCH
432 db 0FCH,0FCH,0FCH,0FCH,0FCH,0FCH,000H,008H
433 db 01CH,022H,022H,022H,062H,0A2H,022H,01CH
434 db 000H,000H,000H,000H,008H,01FH,020H,040H
435 db 084H,092H,082H,06AH,004H,000H,000H,000H
436 db 000H,00BH,040H,000H,09CH,0A2H,0A2H,0A2H
437 db 0A2H,0A2H,09CH,000H,040H,000H,008H,01CH
438 db 022H,022H,0A2H,062H,022H,022H,01CH,000H
439 db 000H,000H,000H,008H,04CH,092H,092H,092H
440 db 052H,052H,052H,08CH,000H,000H,000H,000H
441 db 009H,040H,01CH,080H,0A2H,0A2H,062H,040H
442 db 05CH,080H,000H,000H,080H,008H,001H,07EH
443 db 008H,008H,008H,008H,078H,004H,000H,000H
444 db 000H,000H,009H,081H,081H,0FFH,025H,025H
445 db 025H,024H,024H,018H,000H,000H,000H,018H
446 db 000H,081H,0FFH,0A5H,024H,024H,024H,024H
447 db 018H,000H,000H,000H,009H,03CH,002H,002H
448 db 002H,042H,082H,002H,002H,03CH,000H,000H
449 db 000H,009H,05CH,002H,082H,082H,082H,082H
450 db 082H,002H,05CH,000H,000H,000H,009H,03CH
451 db 002H,002H,082H,042H,002H,002H,002H,03CH
452 db 000H,000H,080H,008H,020H,010H,009H,002H
453 db 044H,088H,010H,020H,000H,000H,000H,000H
454 db 009H,040H,020H,010H,008H,046H,088H,010H
455 db 020H,040H,000H,000H,000H,009H,080H,080H
456 db 080H,080H,080H,080H,080H,080H,080H,000H
457 db 000H,000H,025H,000H,000H,000H,000H,040H
458 db 080H,000H,000H,000H,000H,000H,020H,00BH
459 db 010H,010H,010H,010H,010H,010H,010H,010H
460 db 010H,000H,000H,000H,009H,022H,022H,022H
461 db 022H,0FAH,022H,022H,022H,022H,000H,000H
462 db 000H,009H,00AH,00AH,00AH,00AH,00AH,00AH
463 db 00AH,00AH,00AH,000H,000H,000H,00BH,0A8H
464 db 0A8H,0AAH,054H,008H,010H,022H,046H,08AH
465 db 002H,01FH,000H,009H,0C0H,0A0H,0A0H,0FEH
466 db 080H,080H,080H,080H,0FEH,000H,000H,000H
467 db 017H,000H,050H,0AAH,0AAH,0AAH,0AAH,0AAH
468 db 014H,000H,000H,000H,000H,019H,000H,010H
469 db 010H,010H,0D6H,0D6H,0D6H,010H,010H,010H
470 db 000H,080H,015H,000H,000H,001H,001H,005H
471 db 002H,000H,000H,000H,000H,000H,000H,016H
472 db 000H,000H,060H,090H,090H,090H,060H,000H
473 db 000H,000H,000H,000H,018H,000H,030H,030H
474 db 030H,000H,000H,030H,030H,030H,000H,000H
475 db 000H,025H,000H,000H,000H,000H,010H,010H
476 db 000H,000H,000H,000H,000H,000H,016H,000H
477 db 000H,048H,008H,0F8H,008H,008H,000H,000H
478 db 000H,000H,000H,025H,000H,000H,000H,0A8H
479 db 0A8H,0A8H,050H,000H,000H,000H,000H,000H
480 db 000H,01BH,03DH,084H,000H,014H,0CFH,000H
481 db 008H,05DH,022H,022H,022H,022H,022H,022H
482 db 05DH,000H,000H,000H,000H,017H,000H,004H
483 db 02AH,08AH,04AH,02AH,09AH,004H,000H,000H
484 db 000H,000H,009H,092H,0FEH,092H,092H,082H
485 db 082H,082H,044H,038H,000H,000H,000H,009H
486 db 07EH,02AH,0AAH,0AAH,0AAH,0AAH,0AAH,022H
487 db 062H,000H,000H,000H,009H,03EH,0AAH,0AAH
488 db 02AH,02AH,02AH,0AAH,0A2H,022H,000H,000H
489 db 000H,009H,03EH,02AH,02AH,0AAH,06AH,02AH
490 db 02AH,022H,022H,000H,000H,000H,016H,000H
491 db 000H,012H,012H,01EH,002H,002H,000H,000H
492 db 000H,000H,000H,016H,000H,000H,022H,022H
493 db 07EH,0A2H,022H,000H,000H,000H,000H,000H
494 db 00BH,040H,000H,080H,0A2H,0A2H,0BEH,0A2H
495 db 0A2H,080H,000H,040H,000H,017H,000H,000H
496 db 0A2H,0A2H,03EH,022H,0A2H,080H,000H,000H
497 db 000H,000H,01BH,03DH,032H,000H,015H,09BH
498 db 080H,000H,000H,000H,000H,000H,018H,018H
499 db 004H,020H,000H,000H,021H,004H,000H,002H
500 db 002H,040H,002H,044H,006H,040H,002H,048H
501 db 00AH,040H,002H,050H,012H,040H,002H,060H
502 db 022H,040H,060H,000H,020H,084H,000H,000H
503 db 004H,020H,018H,018H,000H,000H,000H,000H
504 db 01BH,03DH,032H,000H,015H,09DH,000H,000H
505 db 000H,000H,000H,000H,018H,018H,024H,024H
506 db 002H,040H,000H,001H,041H,002H,001H,000H
507 db 003H,080H,005H,084H,001H,088H,009H,090H
508 db 011H,080H,021H,0A0H,001H,0C0H,000H,080H
509 db 040H,082H,080H,000H,002H,040H,024H,024H
510 db 018H,018H,000H,000H,000H,000H,01BH,03DH
511 db 032H,000H,015H,086H,000H,000H,000H,000H
512 db 000H,000H,000H,000H,002H,004H,004H,002H
513 db 000H,020H,041H,0A8H,001H,028H,081H,068H
514 db 081H,068H,081H,068H,081H,068H,081H,068H
515 db 081H,068H,081H,068H,000H,028H,040H,08AH
516 db 010H,00AH,00EH,01EH,001H,000H,001H,000H
517 db 001H,000H,000H,000H,01BH,03DH,032H,000H
518 db 015H,09EH,000H,000H,000H,000H,000H,000H
519 db 000H,000H,000H,000H,000H,000H,000H,000H
520 db 024H,000H,000H,000H,000H,028H,018H,000H
521 db 000H,000H,000H,010H,000H,000H,018H,000H
522 db 000H,028H,000H,000H,024H,000H,000H,000H
523 db 000H,000H,000H,000H,000H,000H,000H,000H
524 db 000H,000H,01BH,03DH,032H,000H,015H,0A9H
525 db 000H,000H,000H,000H,01CH,018H,000H,024H
526 db 022H,000H,000H,000H,000H,042H,000H,000H
527 db 05DH,03CH,049H,020H,049H,020H,049H,020H
528 db 049H,020H,049H,020H,049H,020H,049H,028H
529 db 04DH,020H,010H,014H,000H,042H,000H,000H
530 db 022H,000H,000H,024H,01CH,018H,000H,000H
531 db 01BH,03DH,0C2H,000H,015H,0B5H,000H,000H
532 db 000H,000H,001H,000H,001H,000H,021H,000H
533 db 023H,002H,025H,004H,02DH,008H,025H,010H
534 db 034H,020H,024H,000H,064H,000H,024H,000H
535 db 024H,080H,024H,000H,094H,020H,005H,010H
536 db 00DH,008H,005H,004H,003H,002H,001H,000H
537 db 001H,000H,001H,000H,000H,000H,000H,000H
538 db 000H,000H,001H,000H,001H,000H,021H,000H
539 db 023H,002H,025H,004H,06DH,008H,025H,010H
540 db 034H,0A0H,024H,000H,0A4H,000H,0A4H,000H
541 db 0A4H,000H,024H,000H,014H,0A0H,005H,010H
542 db 04DH,008H,005H,004H,003H,002H,001H,000H
543 db 001H,000H,001H,000H,000H,000H,000H,000H
544 db 000H,000H,001H,000H,001H,000H,021H,000H
545 db 023H,002H,025H,004H,02DH,008H,025H,010H
546 db 0B4H,020H,024H,000H,024H,080H,024H,000H
547 db 064H,000H,024H,000H,014H,020H,005H,010H
548 db 00DH,008H,005H,004H,003H,002H,001H,000H
549 db 001H,000H,001H,000H,000H,000H,000H,000H
550 db 000H,000H,01CH,018H,000H,024H,022H,000H
551 db 000H,000H,000H,042H,008H,018H,055H,000H
552 db 041H,024H,041H,024H,041H,024H,041H,024H
553 db 041H,024H,041H,024H,041H,024H,041H,000H
554 db 014H,000H,000H,042H,000H,000H,022H,000H
555 db 000H,024H,01CH,018H,000H,000H,01BH,03DH
556 db 032H,000H,015H,0BDH,000H,000H,000H,000H
557 db 000H,000H,000H,000H,000H,000H,018H,018H
558 db 004H,020H,020H,004H,000H,000H,002H,040H
559 db 002H,040H,002H,040H,0FFH,0FFH,002H,040H
560 db 002H,040H,002H,040H,022H,000H,022H,000H
561 db 030H,060H,000H,004H,000H,000H,000H,000H
562 db 000H,000H,000H,000H,01BH,03DH,062H,000H
563 db 015H,0C6H,000H,000H,000H,000H,000H,000H
564 db 000H,000H,002H,004H,044H,002H,000H,0A0H
565 db 001H,028H,081H,028H,081H,028H,081H,028H
566 db 001H,028H,001H,0A8H,001H,028H,041H,028H
567 db 041H,028H,040H,028H,000H,00AH,010H,08AH
568 db 08EH,01EH,001H,000H,001H,000H,001H,000H
569 db 000H,000H,000H,000H,000H,000H,001H,000H
570 db 001H,000H,021H,000H,023H,082H,025H,004H
571 db 0ADH,008H,0A5H,010H,0B4H,020H,0A4H,000H
572 db 0A4H,000H,024H,000H,024H,080H,024H,080H
573 db 014H,0A0H,005H,090H,00DH,088H,005H,004H
574 db 083H,002H,001H,000H,001H,000H,001H,000H
575 db 000H,000H,01BH,03DH,0E2H,001H,015H,0CFH
576 db 000H,000H,000H,000H,000H,000H,042H,000H
577 db 000H,000H,018H,054H,000H,028H,024H,000H
578 db 000H,000H,000H,044H,000H,044H,000H,044H
579 db 000H,044H,000H,044H,000H,044H,000H,044H
580 db 000H,000H,024H,000H,000H,028H,018H,054H
581 db 000H,000H,042H,000H,000H,000H,000H,000H
582 db 000H,000H,000H,000H,000H,000H,000H,000H
583 db 004H,00CH,0AAH,000H,000H,000H,000H,0D2H
584 db 000H,000H,051H,000H,011H,000H,011H,0C0H
585 db 011H,000H,0B1H,000H,001H,000H,001H,020H
586 db 010H,000H,000H,002H,000H,010H,00AH,000H
587 db 004H,00CH,000H,000H,000H,000H,000H,000H
588 db 000H,000H,000H,000H,000H,010H,001H,090H
589 db 001H,090H,001H,090H,07FH,0FEH,001H,090H
590 db 001H,090H,001H,090H,001H,090H,001H,090H
591 db 001H,090H,001H,080H,001H,080H,001H,080H
592 db 000H,000H,040H,002H,000H,000H,002H,040H
593 db 024H,024H,018H,018H,000H,000H,000H,000H
594 db 000H,000H,000H,000H,000H,000H,021H,000H
595 db 021H,000H,021H,000H,021H,000H,03FH,03EH
596 db 061H,008H,021H,008H,021H,088H,021H,008H
597 db 0A1H,008H,0A1H,008H,0A1H,008H,02DH,01CH
598 db 021H,080H,021H,000H,061H,000H,021H,000H
599 db 021H,000H,033H,026H,000H,000H,000H,000H
600 db 000H,000H,000H,000H,000H,000H,021H,000H
601 db 021H,000H,021H,000H,021H,000H,0BFH,0BEH
602 db 0A1H,088H,0A1H,088H,021H,008H,021H,008H
603 db 021H,008H,021H,008H,021H,008H,02DH,01CH
604 db 0A1H,080H,0A1H,080H,0A1H,080H,021H,000H
605 db 021H,000H,033H,026H,000H,000H,000H,000H
606 db 000H,000H,000H,000H,000H,000H,021H,000H
607 db 021H,000H,021H,000H,021H,000H,03FH,03EH
608 db 021H,008H,021H,008H,0A1H,008H,021H,008H
609 db 021H,088H,021H,008H,061H,008H,02DH,01CH
610 db 021H,000H,021H,000H,021H,000H,021H,000H
611 db 021H,000H,033H,026H,000H,000H,000H,000H
612 db 000H,000H,000H,000H,000H,000H,000H,000H
613 db 000H,000H,001H,000H,001H,000H,001H,020H
614 db 001H,020H,001H,020H,001H,020H,001H,020H
615 db 001H,020H,01FH,03EH,001H,000H,001H,000H
616 db 001H,000H,001H,000H,001H,000H,001H,000H
617 db 001H,000H,001H,000H,000H,000H,000H,000H
618 db 000H,000H,000H,000H,000H,000H,000H,000H
619 db 000H,000H,000H,000H,021H,000H,021H,000H
620 db 021H,000H,021H,000H,021H,000H,061H,000H
621 db 03FH,03EH,021H,080H,021H,000H,0A1H,000H
622 db 021H,000H,021H,000H,021H,000H,000H,000H
623 db 000H,000H,000H,000H,000H,000H,000H,000H
624 db 000H,000H,000H,000H,000H,000H,000H,000H
625 db 000H,000H,000H,000H,021H,000H,061H,000H
626 db 021H,000H,021H,080H,021H,000H,0A1H,000H
627 db 0BFH,03EH,0A1H,000H,021H,000H,021H,080H
628 db 021H,000H,061H,000H,021H,000H,000H,000H
629 db 000H,000H,000H,000H,000H,000H,000H,000H
630 db 000H,000H,000H,000H,000H,000H,000H,000H
631 db 000H,000H,000H,000H,021H,000H,0A1H,080H
632 db 0A1H,080H,0A1H,080H,021H,000H,021H,000H
633 db 03FH,03EH,021H,000H,021H,000H,0A1H,080H
634 db 0A1H,080H,0A1H,080H,021H,000H,000H,000H
635 db 000H,000H,000H,000H,000H,000H,000H,000H
636 db 01BH,03DH,062H,000H,015H,0DDH,000H,000H
637 db 000H,000H,000H,000H,000H,000H,000H,000H
638 db 000H,000H,000H,000H,000H,000H,000H,000H
639 db 000H,000H,000H,000H,000H,000H,0E7H,0E7H
640 db 000H,000H,000H,000H,000H,000H,000H,000H
641 db 000H,000H,000H,000H,000H,000H,000H,000H
642 db 000H,000H,000H,000H,000H,000H,000H,000H
643 db 000H,000H,000H,000H,000H,000H,000H,000H
644 db 000H,000H,021H,000H,021H,000H,021H,000H
645 db 0A1H,000H,021H,000H,021H,080H,03FH,03EH
646 db 061H,000H,021H,000H,021H,000H,021H,000H
647 db 021H,000H,021H,000H,000H,000H,000H,000H
648 db 000H,000H,000H,000H,000H,000H,01BH,03DH
649 db 032H,000H,015H,0E0H,000H,000H,000H,000H
650 db 000H,000H,00CH,008H,000H,014H,012H,000H
651 db 000H,000H,000H,022H,000H,000H,021H,000H
652 db 021H,000H,061H,000H,021H,000H,021H,080H
653 db 021H,000H,0A1H,000H,000H,000H,000H,022H
654 db 000H,000H,012H,000H,000H,014H,00CH,008H
655 db 000H,000H,000H,000H,01BH,03DH,0C2H,000H
656 db 015H,0E2H,000H,000H,000H,000H,000H,000H
657 db 00CH,008H,000H,014H,012H,000H,000H,000H
658 db 040H,022H,000H,000H,021H,080H,021H,000H
659 db 0A1H,000H,0A1H,000H,0A1H,000H,021H,000H
660 db 021H,080H,000H,000H,040H,022H,000H,000H
661 db 012H,000H,000H,014H,00CH,008H,000H,000H
662 db 000H,000H,000H,000H,000H,000H,000H,000H
663 db 00CH,008H,000H,014H,012H,000H,000H,000H
664 db 000H,022H,000H,000H,0A1H,000H,021H,000H
665 db 021H,080H,021H,000H,061H,000H,021H,000H
666 db 021H,000H,000H,000H,000H,022H,000H,000H
667 db 012H,000H,000H,014H,00CH,008H,000H,000H
668 db 000H,000H,000H,000H,000H,000H,000H,000H
669 db 000H,000H,00CH,00CH,042H,010H,000H,080H
670 db 010H,002H,080H,000H,081H,020H,081H,020H
671 db 001H,020H,001H,0A0H,001H,020H,041H,020H
672 db 041H,020H,040H,000H,010H,002H,000H,080H
673 db 082H,010H,00CH,00CH,000H,000H,000H,000H
674 db 000H,000H,000H,000H,000H,000H,000H,000H
675 db 00CH,008H,000H,014H,012H,080H,000H,000H
676 db 080H,022H,080H,000H,0A1H,000H,0A1H,000H
677 db 0A1H,000H,021H,000H,021H,080H,021H,080H
678 db 021H,080H,000H,080H,000H,0A2H,000H,000H
679 db 092H,000H,000H,014H,00CH,008H,000H,000H
680 db 000H,000H,01BH,03DH,0E2H,001H,015H,0E7H
681 db 080H,000H,080H,000H,080H,001H,080H,001H
682 db 080H,001H,0FFH,0FFH,024H,001H,024H,001H
683 db 000H,001H,000H,045H,000H,045H,000H,044H
684 db 000H,044H,000H,044H,000H,044H,000H,044H
685 db 000H,044H,000H,044H,000H,000H,024H,000H
686 db 000H,028H,018H,010H,000H,000H,000H,000H
687 db 000H,000H,000H,000H,000H,000H,001H,080H
688 db 001H,080H,001H,080H,001H,080H,07FH,0FEH
689 db 021H,084H,021H,084H,021H,084H,021H,084H
690 db 021H,084H,021H,084H,020H,004H,020H,004H
691 db 020H,004H,020H,004H,020H,004H,020H,004H
692 db 000H,000H,004H,020H,018H,018H,000H,000H
693 db 000H,000H,000H,000H,020H,000H,020H,000H
694 db 020H,000H,03CH,03CH,022H,000H,020H,002H
695 db 020H,000H,001H,000H,001H,000H,041H,000H
696 db 001H,000H,001H,080H,001H,000H,081H,000H
697 db 020H,000H,020H,002H,022H,000H,03CH,03CH
698 db 020H,000H,020H,000H,020H,000H,000H,000H
699 db 000H,000H,000H,000H,020H,000H,020H,000H
700 db 020H,000H,03CH,03CH,022H,000H,060H,002H
701 db 020H,000H,001H,080H,001H,000H,081H,000H
702 db 081H,000H,081H,000H,001H,000H,001H,080H
703 db 020H,000H,060H,002H,022H,000H,03CH,03CH
704 db 020H,000H,020H,000H,020H,000H,000H,000H
705 db 000H,000H,000H,000H,020H,000H,020H,000H
706 db 020H,000H,03CH,03CH,022H,000H,020H,002H
707 db 020H,000H,081H,000H,001H,000H,001H,080H
708 db 001H,000H,041H,000H,001H,000H,001H,000H
709 db 020H,000H,020H,002H,022H,000H,03CH,03CH
710 db 020H,000H,020H,000H,020H,000H,000H,000H
711 db 000H,000H,000H,000H,000H,020H,000H,020H
712 db 000H,020H,010H,020H,000H,031H,008H,021H
713 db 000H,029H,004H,001H,000H,005H,043H,001H
714 db 002H,003H,002H,081H,000H,005H,084H,000H
715 db 000H,028H,008H,020H,000H,030H,010H,020H
716 db 000H,020H,000H,020H,000H,020H,000H,000H
717 db 000H,000H,000H,000H,020H,000H,020H,000H
718 db 020H,000H,020H,000H,020H,020H,030H,000H
719 db 021H,010H,009H,000H,001H,008H,005H,000H
720 db 047H,006H,005H,000H,001H,088H,009H,000H
721 db 0A1H,010H,030H,000H,020H,020H,020H,000H
722 db 020H,000H,020H,000H,020H,000H,000H,000H
723 db 000H,000H,000H,000H,000H,000H,000H,000H
724 db 080H,000H,080H,000H,080H,000H,080H,000H
725 db 080H,000H,080H,000H,080H,000H,080H,000H
726 db 080H,000H,080H,000H,080H,000H,080H,000H
727 db 080H,000H,080H,000H,080H,000H,080H,000H
728 db 080H,000H,000H,000H,000H,000H,000H,000H
729 db 000H,000H,000H,000H,000H,000H,000H,000H
730 db 000H,000H,000H,000H,000H,000H,000H,000H
731 db 000H,000H,000H,000H,000H,000H,040H,000H
732 db 000H,000H,000H,080H,000H,000H,080H,000H
733 db 000H,000H,000H,000H,000H,000H,000H,000H
734 db 000H,000H,000H,000H,000H,000H,000H,000H
735 db 000H,000H,000H,000H,000H,000H,000H,000H
736 db 000H,000H,000H,000H,000H,000H,000H,008H
737 db 000H,008H,000H,008H,000H,008H,000H,008H
738 db 000H,008H,000H,008H,000H,008H,000H,008H
739 db 000H,008H,000H,008H,000H,000H,000H,000H
740 db 000H,000H,000H,000H,000H,000H,000H,000H
741 db 01BH,03DH,0C2H,000H,015H,0F2H,080H,000H
742 db 002H,001H,002H,001H,002H,001H,002H,001H
743 db 002H,001H,002H,001H,002H,001H,002H,001H
744 db 002H,001H,002H,001H,002H,001H,002H,001H
745 db 002H,001H,002H,001H,002H,001H,002H,001H
746 db 002H,001H,002H,001H,002H,001H,002H,001H
747 db 002H,001H,002H,001H,002H,001H,000H,000H
748 db 010H,080H,080H,010H,080H,010H,080H,050H
749 db 081H,050H,080H,052H,002H,000H,070H,0A4H
750 db 004H,000H,000H,008H,008H,000H,000H,010H
751 db 010H,000H,002H,022H,024H,006H,008H,04AH
752 db 040H,002H,000H,082H,000H,002H,007H,007H
753 db 000H,002H,000H,002H,000H,000H,000H,000H
754 db 000H,000H,000H,000H,000H,000H,030H,020H
755 db 030H,020H,078H,071H,078H,071H,078H,0F9H
756 db 078H,0F9H,07FH,0FFH,000H,080H,000H,080H
757 db 000H,080H,000H,080H,000H,080H,07FH,0FFH
758 db 000H,081H,000H,081H,000H,081H,000H,081H
759 db 000H,000H,000H,000H,000H,000H,000H,000H
760 db 000H,000H,000H,000H,000H,000H,000H,000H
761 db 000H,000H,010H,030H,029H,003H,000H,009H
762 db 040H,041H,024H,001H,000H,081H,000H,0A5H
763 db 000H,081H,012H,080H,001H,082H,000H,090H
764 db 04AH,0C0H,004H,00CH,000H,000H,000H,000H
765 db 000H,000H,000H,000H,000H,000H,01BH,03DH
766 db 032H,000H,015H,0F7H,080H,000H,000H,000H
767 db 000H,000H,000H,000H,000H,000H,000H,000H
768 db 000H,000H,000H,000H,000H,000H,000H,000H
769 db 000H,000H,000H,000H,000H,001H,001H,000H
770 db 000H,002H,002H,000H,000H,000H,000H,000H
771 db 000H,000H,000H,000H,000H,000H,000H,000H
772 db 000H,000H,000H,000H,01BH,03DH,032H,000H
773 db 015H,0F9H,000H,000H,000H,000H,000H,000H
774 db 000H,000H,000H,000H,000H,000H,000H,000H
775 db 080H,080H,080H,080H,080H,080H,000H,000H
776 db 000H,000H,000H,000H,000H,000H,000H,000H
777 db 000H,000H,080H,080H,080H,080H,080H,080H
778 db 000H,000H,000H,000H,000H,000H,000H,000H
779 db 000H,000H,01BH,03DH,062H,000H,015H,0FBH
780 db 000H,000H,000H,000H,000H,000H,000H,000H
781 db 000H,000H,000H,000H,000H,000H,000H,008H
782 db 040H,008H,000H,008H,000H,088H,000H,088H
783 db 0F8H,0F8H,000H,008H,000H,008H,000H,008H
784 db 000H,008H,000H,008H,000H,000H,000H,000H
785 db 000H,000H,000H,000H,000H,000H,000H,000H
786 db 000H,000H,000H,000H,000H,000H,000H,000H
787 db 000H,000H,000H,000H,000H,000H,000H,000H
788 db 008H,080H,000H,000H,080H,008H,0A0H,008H
789 db 0A0H,008H,0A0H,008H,0A0H,008H,020H,000H
790 db 008H,0A0H,050H,050H,000H,000H,000H,000H
791 db 000H,000H,000H,000H,000H,000H,000H,000H
792 db 01BH,03DH,00FH,000H,014H,0BEH,000H,009H
793 db 080H,054H,034H,014H,01EH,014H,034H,054H
794 db 080H,000H,000H,01BH,03DH,032H,000H,015H
795 db 0BEH,000H,000H,000H,000H,000H,080H,000H
796 db 080H,000H,094H,040H,094H,000H,0D4H,020H
797 db 094H,001H,0B4H,011H,014H,001H,014H,009H
798 db 004H,00FH,00EH,009H,004H,001H,014H,011H
799 db 014H,001H,0B4H,020H,094H,000H,0D4H,040H
800 db 094H,000H,094H,000H,080H,000H,080H,000H
801 db 000H,000H,000H,000H
diff --git a/v4.0/src/DEV/PRINTER/4201/4201.MAK b/v4.0/src/DEV/PRINTER/4201/4201.MAK
new file mode 100644
index 0000000..a457074
--- /dev/null
+++ b/v4.0/src/DEV/PRINTER/4201/4201.MAK
@@ -0,0 +1,7 @@
1#---- MAKEFILE FOR 4201.CPI ------------
2# This make file prevents build output errors for (subdirs.bat config line
3# Mark Nosewicz
4
54201.CPI: 4201.CPI
6 ECHO 4201.CPI HAS BEEN CHANGED
7 \ No newline at end of file
diff --git a/v4.0/src/DEV/PRINTER/4201/MAKEFILE b/v4.0/src/DEV/PRINTER/4201/MAKEFILE
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/v4.0/src/DEV/PRINTER/4201/MAKEFILE
diff --git a/v4.0/src/DEV/PRINTER/4208/4208-CPY.ASM b/v4.0/src/DEV/PRINTER/4208/4208-CPY.ASM
new file mode 100644
index 0000000..6bb3695
--- /dev/null
+++ b/v4.0/src/DEV/PRINTER/4208/4208-CPY.ASM
@@ -0,0 +1,10 @@
1
2CODE segment public 'code'
3ASSUME CS:CODE,DS:NOTHING,ES:NOTHING,SS:NOTHING
4 org 0
5
6 include copyrigh.inc
7
8code ends
9 end
10 \ No newline at end of file
diff --git a/v4.0/src/DEV/PRINTER/4208/4208.CPI b/v4.0/src/DEV/PRINTER/4208/4208.CPI
new file mode 100644
index 0000000..4fe1a18
--- /dev/null
+++ b/v4.0/src/DEV/PRINTER/4208/4208.CPI
Binary files differ
diff --git a/v4.0/src/DEV/PRINTER/4208/4208.INC b/v4.0/src/DEV/PRINTER/4208/4208.INC
new file mode 100644
index 0000000..6aa3dfe
--- /dev/null
+++ b/v4.0/src/DEV/PRINTER/4208/4208.INC
@@ -0,0 +1,90 @@
1 db 0FFH,046H,04FH,04EH,054H,020H,020H,020H
2 db 000H,000H,000H,000H,000H,000H,000H,000H
3 db 001H,000H,001H,017H,000H,000H,000H,009H
4 db 000H,01AH,000H,035H,000H,000H,000H,002H
5 db 000H,034H,032H,030H,038H,020H,020H,020H
6 db 020H,0B5H,001H,000H,000H,000H,000H,000H
7 db 000H,015H,001H,000H,000H,01AH,000H,051H
8 db 000H,000H,000H,002H,000H,034H,032H,030H
9 db 038H,020H,020H,020H,020H,05EH,003H,000H
10 db 000H,000H,000H,000H,000H,02BH,001H,000H
11 db 000H,01AH,000H,06DH,000H,000H,000H,002H
12 db 000H,034H,032H,030H,038H,020H,020H,020H
13 db 020H,060H,003H,000H,000H,000H,000H,000H
14 db 000H,041H,001H,000H,000H,01AH,000H,089H
15 db 000H,000H,000H,002H,000H,034H,032H,030H
16 db 038H,020H,020H,020H,020H,052H,003H,000H
17 db 000H,000H,000H,000H,000H,057H,001H,000H
18 db 000H,01AH,000H,0A5H,000H,000H,000H,002H
19 db 000H,034H,032H,030H,038H,020H,020H,020H
20 db 020H,053H,003H,000H,000H,000H,000H,000H
21 db 000H,06DH,001H,000H,000H,01AH,000H,0C1H
22 db 000H,000H,000H,002H,000H,034H,032H,030H
23 db 038H,020H,020H,020H,020H,055H,003H,000H
24 db 000H,000H,000H,000H,000H,083H,001H,000H
25 db 000H,01AH,000H,0DDH,000H,000H,000H,002H
26 db 000H,034H,032H,030H,038H,020H,020H,020H
27 db 020H,057H,003H,000H,000H,000H,000H,000H
28 db 000H,099H,001H,000H,000H,01AH,000H,000H
29 db 000H,000H,000H,002H,000H,034H,032H,030H
30 db 038H,020H,020H,020H,020H,05FH,003H,000H
31 db 000H,000H,000H,000H,000H,0AFH,001H,000H
32 db 000H,01AH,000H,000H,000H,000H,000H,002H
33 db 000H,034H,032H,030H,038H,020H,020H,020H
34 db 020H,000H,000H,000H,000H,000H,000H,000H
35 db 000H,000H,000H,000H,000H,001H,000H,001H
36 db 000H,010H,000H,002H,000H,00CH,000H,01BH
37 db 049H,002H,000H,000H,000H,000H,000H,000H
38 db 000H,01BH,036H,001H,000H,001H,000H,010H
39 db 000H,002H,000H,00CH,000H,01BH,049H,00EH
40 db 01BH,049H,007H,01BH,049H,006H,000H,01BH
41 db 036H,001H,000H,001H,000H,010H,000H,002H
42 db 000H,00CH,000H,01BH,049H,00EH,01BH,049H
43 db 007H,01BH,049H,006H,000H,01BH,036H,001H
44 db 000H,001H,000H,010H,000H,002H,000H,00CH
45 db 000H,01BH,049H,00EH,01BH,049H,007H,01BH
46 db 049H,006H,000H,01BH,036H,001H,000H,001H
47 db 000H,010H,000H,002H,000H,00CH,000H,01BH
48 db 049H,00EH,01BH,049H,007H,01BH,049H,006H
49 db 000H,01BH,036H,001H,000H,001H,000H,010H
50 db 000H,002H,000H,00CH,000H,01BH,049H,00EH
51 db 01BH,049H,007H,01BH,049H,006H,000H,01BH
52 db 036H,001H,000H,001H,000H,010H,000H,002H
53 db 000H,00CH,000H,01BH,049H,00EH,01BH,049H
54 db 007H,01BH,049H,006H,000H,01BH,036H,001H
55 db 000H,001H,000H,010H,000H,002H,000H,00CH
56 db 000H,01BH,049H,00EH,01BH,049H,007H,01BH
57 db 049H,006H,000H,01BH,036H,001H,000H,001H
58 db 000H,010H,000H,002H,000H,00CH,000H,01BH
59 db 049H,00EH,01BH,049H,007H,01BH,049H,006H
60 db 000H,01BH,036H,00AH,00DH,054H,068H,065H
61 db 020H,049H,042H,04DH,020H,050H,065H,072H
62 db 073H,06FH,06EH,061H,06CH,020H,043H,06FH
63 db 06DH,070H,075H,074H,065H,072H,020H,050H
64 db 072H,069H,06EH,074H,065H,072H,020H,043H
65 db 06FH,064H,065H,020H,050H,061H,067H,065H
66 db 020H,044H,072H,069H,076H,065H,072H,00AH
67 db 00DH,056H,065H,072H,073H,069H,06FH,06EH
68 db 020H,033H,02EH,033H,030H,020H,028H,043H
69 db 029H,020H,043H,06FH,070H,079H,072H,069H
70 db 067H,068H,074H,020H,049H,042H,04DH,020H
71 db 043H,06FH,072H,070H,020H,031H,039H,038H
72 db 037H,00AH,00DH,04CH,069H,063H,065H,06EH
73 db 073H,065H,064H,020H,04DH,061H,074H,065H
74 db 072H,069H,061H,06CH,020H,02DH,020H,050H
75 db 072H,06FH,067H,072H,061H,06DH,020H,050H
76 db 072H,06FH,070H,065H,072H,074H,079H,020H
77 db 06FH,066H,020H,049H,042H,04DH,01AH,01AH
78 db 040H,040H,040H,023H,023H,023H,020H,044H
79 db 04FH,053H,020H,033H,02EH,033H,030H,020H
80 db 044H,072H,069H,076H,065H,072H,020H,044H
81 db 052H,056H,030H,035H,048H,02CH,020H,031H
82 db 030H,02FH,032H,031H,02FH,038H,036H,00DH
83 db 00AH,01AH,000H,020H,020H,020H,020H,020H
84 db 020H,020H,020H,020H,020H,020H,020H,020H
85 db 020H,020H,020H,020H,020H,020H,020H,020H
86 db 020H,020H,020H,020H,020H,020H,020H,020H
87 db 020H,020H,020H,020H,020H,020H,020H,020H
88 db 020H,020H,020H,020H,020H,020H,020H,020H
89 db 020H,020H,020H,020H,020H,020H,020H,020H
90 db 020H,020H,020H,020H,020H,020H,020H,020H
diff --git a/v4.0/src/DEV/PRINTER/4208/4208.MAK b/v4.0/src/DEV/PRINTER/4208/4208.MAK
new file mode 100644
index 0000000..b3d0c4d
--- /dev/null
+++ b/v4.0/src/DEV/PRINTER/4208/4208.MAK
@@ -0,0 +1,7 @@
1#---- MAKEFILE FOR 4208.CPI ------------
2# This make file prevents build output errors for (subdirs.bat config line
3# Mark Nosewicz
4
54208.CPI: 4208.CPI
6 ECHO 4208.CPI HAS BEEN CHANGED
7 \ No newline at end of file
diff --git a/v4.0/src/DEV/PRINTER/4208/MAKEFILE b/v4.0/src/DEV/PRINTER/4208/MAKEFILE
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/v4.0/src/DEV/PRINTER/4208/MAKEFILE
diff --git a/v4.0/src/DEV/PRINTER/5202/5202.ASM b/v4.0/src/DEV/PRINTER/5202/5202.ASM
new file mode 100644
index 0000000..ed6c3cf
--- /dev/null
+++ b/v4.0/src/DEV/PRINTER/5202/5202.ASM
@@ -0,0 +1,108 @@
1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2;
3; DESCRIPTION : Code Page Switching 5202 Printer Font File
4;
5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6ESC1 EQU 01BH ;
7 ;
8CSEG SEGMENT ;
9 ASSUME CS:CSEG,DS:CSEG ;
10BEGIN: ORG 0 ;
11 ;
12FNTHEAD:DB 0FFH,"FONT " ; FILE TAG
13 DB 8 DUP(0) ; RESERVED
14 DW 1 ; CNT OF POINTERS IN HEADER
15 DB 1 ; TYPE FOR INFO POINTER
16 DW OFFSET INFO,0 ; POINTER TO INFO IN FILE
17 ;
18info : DW 5 ; COUNT OF ENTRIES
19 ;
20QUI437: DW LEN_437 ; SIZE OF ENTRY HEADER
21 DW QUI850,0 ; POINTER TO NEXT HEADER
22 DW 2 ; DEVICE TYPE
23 DB "5202 " ; DEVICE SUBTYPE ID
24 DW 437 ; CODE PAGE ID
25 DW 3 DUP(0) ; RESERVED
26 DW OFFSET DATA437,0 ; POINTER TO FONTS
27LEN_437 EQU ($-QUI437)-2 ;
28 ;
29QUI850: DW LEN_850 ; SIZE OF ENTRY HEADER
30 DW QUI860,0 ; POINTER TO NEXT HEADER
31 DW 2 ; DEVICE TYPE
32 DB "5202 " ; DEVICE SUBTYPE ID
33 DW 850 ; CODE PAGE ID
34 DW 3 DUP(0) ; RESERVED
35 DW OFFSET DATA850,0 ; POINTER TO FONTS
36LEN_850 EQU ($-QUI850)-2 ;
37 ;
38QUI860: DW LEN_860 ; SIZE OF ENTRY HEADER
39 DW QUI863,0 ; POINTER TO NEXT HEADER
40 DW 2 ; DEVICE TYPE
41 DB "5202 " ; DEVICE SUBTYPE ID
42 DW 860 ; CODE PAGE ID
43 DW 3 DUP(0) ; RESERVED
44 DW OFFSET DATA860,0 ; POINTER TO FONTS
45LEN_860 EQU ($-QUI860)-2 ;
46 ;
47QUI863: DW LEN_863 ; SIZE OF ENTRY HEADER
48 DW QUI865,0 ; POINTER TO NEXT HEADER
49 DW 2 ; DEVICE TYPE
50 DB "5202 " ; DEVICE SUBTYPE ID
51 DW 863 ; CODE PAGE ID
52 DW 3 DUP(0) ; RESERVED
53 DW OFFSET DATA863,0 ; POINTER TO FONTS
54LEN_863 EQU ($-QUI863)-2 ;
55 ;
56QUI865: DW LEN_865 ; SIZE OF ENTRY HEADER
57 DW 0,0 ; POINTER TO NEXT HEADER
58 DW 2 ; DEVICE TYPE
59 DB "5202 " ; DEVICE SUBTYPE ID
60 DW 865 ; CODE PAGE ID
61 DW 3 DUP(0) ; RESERVED
62 DW OFFSET DATA865,0 ; POINTER TO FONTS
63LEN_865 EQU ($-QUI865)-2 ;
64 ;
65DATA437:DW 1 ; CART/NON-CART
66 DW 1 ; # OF FONTS
67 DW 16 ; LENGTH OF DATA
68 DW 2 ; SELECTION TYPE
69 DW 12 ; SELECTION length
70 DB ESC1,91,84,5,0,00,00,001H,0B5H,00 ; select code page ******
71 dB ESC1,"6" ;
72 ;
73DATA850:DW 1 ; CART/NON-CART
74 DW 1 ; # OF FONTS
75 DW 16 ; LENGTH OF DATA
76 DW 2 ; SELECTION TYPE
77 DW 12 ; SELECTION length
78 DB ESC1,91,84,5,0,00,00,003H,052H,00 ; select code page ******
79 dB ESC1,"6" ;
80 ;
81DATA860:DW 1 ; CART/NON-CART
82 DW 1 ; # OF FONTS
83 DW 16 ; LENGTH OF DATA
84 DW 2 ; SELECTION TYPE
85 DW 12 ; SELECTION length
86 DB ESC1,91,84,5,0,00,00,003H,05CH,00 ; select code page ******
87 dB ESC1,"6" ;
88 ;
89DATA863:DW 1 ; CART/NON-CART
90 DW 1 ; # OF FONTS
91 DW 16 ; LENGTH OF DATA
92 DW 2 ; SELECTION TYPE
93 DW 12 ; SELECTION length
94 DB ESC1,91,84,5,0,00,00,003H,05FH,00 ; select code page ******
95 dB ESC1,"6" ;
96 ;
97DATA865:DW 1 ; CART/NON-CART
98 DW 1 ; # OF FONTS
99 DW 16 ; LENGTH OF DATA
100 DW 2 ; SELECTION TYPE
101 DW 12 ; SELECTION length
102 DB ESC1,91,84,5,0,00,00,003H,061H,00 ; select code page ******
103 dB ESC1,"6" ;
104
105include copyrigh.inc
106
107CSEG ENDS ;
108 END BEGIN ;
diff --git a/v4.0/src/DEV/PRINTER/5202/MAKEFILE b/v4.0/src/DEV/PRINTER/5202/MAKEFILE
new file mode 100644
index 0000000..7bb70db
--- /dev/null
+++ b/v4.0/src/DEV/PRINTER/5202/MAKEFILE
@@ -0,0 +1,21 @@
1#********************** Makefile for Printer\5202.CPI **********************
2
3inc =..\..\..\inc
4dos =..\..\..\dos
5hinc =..\..\..\h
6msg =..\..\..\message
7
8#
9######################### Dependencies Begin Here ##########################
10#
11
12all: 5202.cpi
13
145202.obj: 5202.asm $(inc)\copyrigh.inc makefile
15
16
175202.cpi: 5202.obj
18 link 5202;
19 exe2bin 5202 5202.cpi
20 del 5202.exe
21
diff --git a/v4.0/src/DEV/PRINTER/CPSFONT.ASM b/v4.0/src/DEV/PRINTER/CPSFONT.ASM
new file mode 100644
index 0000000..74fa12b
--- /dev/null
+++ b/v4.0/src/DEV/PRINTER/CPSFONT.ASM
@@ -0,0 +1,1961 @@
1
2 PAGE ,132
3
4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5;;
6;; FILENAME: CPS Device Driver -- Font Parser
7;; MODULE NAME: CPSFONT
8;; TYPE: Font Parser Module
9;; LINK PROCEDURE: Link CPS+CPSSUB+CPSINT9+...+CPSINIT into .EXE format
10;; CPS must be first. CPSINIT must be last. Everything
11;; before CPSINIT will be resident.
12;; INCLUDE FILES:
13;; CPSPEQU.INC
14;;
15;;
16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
17 ;;
18INCLUDE CPSPEQU.INC ;;
19 ;;
20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
21 ;;
22CSEG SEGMENT PUBLIC 'CODE' ;;
23 ASSUME CS:CSEG ;;
24 ASSUME DS:NOTHING ;;
25 ;;
26PUBLIC FTABLE,FONT_PARSER ;;
27 ;;
28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
29;;
30;; ************************************
31;; ** **
32;; ** Resident Code **
33;; ** **
34;; ************************************
35;;
36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
37 ;;
38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
39;;
40;; FONT_PARSER data
41;;
42;; -- Interface table : FTABLE
43;;
44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
45FTABLE: FBUFS <0FFFFH,,,> ;; for temporary testing
46FTB1 FTBLK <,,,,,,,,,,,,> ;; -- at most 12 entries
47FTB2 FTBLK <,,,,,,,,,,,,> ;;
48FTB3 FTBLK <,,,,,,,,,,,,> ;;
49FTB4 FTBLK <,,,,,,,,,,,,> ;;
50FTB5 FTBLK <,,,,,,,,,,,,> ;;
51FTB6 FTBLK <,,,,,,,,,,,,> ;;
52FTB7 FTBLK <,,,,,,,,,,,,> ;;
53FTB8 FTBLK <,,,,,,,,,,,,> ;;
54FTB9 FTBLK <,,,,,,,,,,,,> ;;
55FTBa FTBLK <,,,,,,,,,,,,> ;;
56FTBb FTBLK <,,,,,,,,,,,,> ;;
57FTBc FTBLK <,,,,,,,,,,,,> ;;
58 ;;
59FP_ERROR DW 0000H ;; internal error register
60 ;;
61 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
62 ;; the followings are bytes accumulated
63 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
64FTAG_LEN EQU 8 ;; FILE TAGE in the font file header
65FTAG_COUNT DW 0000H ;;
66 ;;
67FTAG_PATTERN LABEL BYTE ;;
68 DB 0FFH ;;
69 DB 'FONT ' ;;
70 ;;
71 ;;
72 ;; POINTER in the font file header
73fptr_LOW LABEL WORD ;;
74fptr_LOL DB 00H ;; NEXT
75fptr_LOH DB 00H ;;
76fptr_HIGH LABEL WORD ;;
77fptr_HIL DB 00H ;;
78fptr_HIH DB 00H ;;
79 ;;
80 ;;
81 ;;
82ENTRY_WORD LABEL WORD ;;
83ENTRY_LOB DB 00H ;; ENTRY COUNT
84ENTRY_HIB DB 00H ;;
85NEXT_LOW LABEL WORD ;;
86NEXT_LOL DB 00H ;; NEXT
87NEXT_LOH DB 00H ;;
88NEXT_HIGH LABEL WORD ;;
89NEXT_HIL DB 00H ;;
90NEXT_HIH DB 00H ;;
91TYPE_WORD LABEL WORD ;;
92TYPE_LOB DB 00H ;; TYPE
93TYPE_HIB DB 00H ;;
94TID_CNT DW 00000H ;; TYPEID COUNT(0 to 8)
95TYPE_ID : DB ' ' ;; TYPEID
96CPG_WORD LABEL WORD ;;
97CPG_LOB DB 00H ;; CODE PAGE
98CPG_HIB DB 00H ;;
99FONT_LOW LABEL WORD ;;
100FONT_LOL DB 00H ;; FONT ADDRESS
101FONT_LOH DB 00H ;;
102FONT_HIGH LABEL WORD ;;
103FONT_HIL DB 00H ;;
104FONT_HIH DB 00H ;;
105;; the followings are contained in the font-block in the exact order & length
106MOD_WORD LABEL WORD ;;
107MOD_LOB DB 00H ;; MODIFIER
108MOD_HIB DB 00H ;;
109FONTS_WORD LABEL WORD ;;
110FONTS_LOB DB 00H ;; FONTS
111FONTS_HIB DB 00H ;;
112FDLEN_WORD LABEL WORD ;;
113FDLEN_LOB DB 00H ;; FONT DATA LENGTH
114FDLEN_HIB DB 00H ;;
115PRE_FONT_ND EQU ($-MOD_WORD) ;; used to update target for font data
116 ;; to follow. -- for NON-DISPLAY
117DISP_ROWS DB 00H ;; DISPLAY's parameters :
118DISP_COLS DB 00H ;; BOX SIZE
119DISP_X DB 00H ;; ASPECT RATIO
120DISP_Y DB 00H ;;
121COUNT_WORD LABEL WORD ;; NO. OF DISPLAY CHARACTERS
122COUNT_LOB DB 00H ;;
123COUNT_HIB DB 00H ;;
124PRE_FONT_D EQU ($-MOD_WORD) ;; used to update target for font data
125 ;; to follow. -- for DISPLAY
126 ;;
127PTR_SEL_WORD LABEL WORD ;;
128PTR_SELOB DB 00H ;;
129PTR_SEHIB DB 00H ;;
130PRE_FONT_P0 EQU ($-PTR_SELOB+PRE_FONT_ND) ;; to update target for font data
131 ;; to follow -- for PRINTER with
132 ;; selection type = 0.
133 ;;
134PTR_LEN_WORD LABEL WORD ;;
135PTR_LNLOB DB 00H ;;
136PTR_LNHIB DB 00H ;;
137PRE_FONT_P EQU ($-PTR_SELOB+PRE_FONT_ND) ;; to update target for font data
138 ;; to follow -- for PRINTER with
139 ;; selection type <> 0.
140 ;;
141 ;;
142;; also update STAGE_CASES and indexing constants
143 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
144 ;; the stage the parsing is in : ;;;;;
145 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
146 ;;
147STAGE_CASES LABEL WORD ;; the stage the parsing is in :
148 ;;
149 ;; *** INDEXED BY STAGE-INDEX
150 ;;
151 DW OFFSET ENTRYLO ;; 0
152 DW OFFSET ENTRYHI ;; 1
153 DW OFFSET NEXTLOL ;; 2
154 DW OFFSET NEXTLOH ;; 3
155 DW OFFSET NEXTHIL ;; 4
156 DW OFFSET NEXTHIH ;; 5
157 DW OFFSET TYPELO ;; 6
158 DW OFFSET TYPEHI ;; 7
159 DW OFFSET TYPEIDS ;; 8
160 DW OFFSET CPGLO ;; 9
161 DW OFFSET CPGHI ;; A
162 DW OFFSET FONTLOL ;; B
163 DW OFFSET FONTLOH ;; C
164 DW OFFSET FONTHIL ;; D
165 DW OFFSET FONTHIH ;; E
166 DW 00H ;; MATCH case -- end of SEARCH stages
167 DW 00H ;; SCAN case -- before PRE-FOUND stage
168 DW OFFSET MODLO ;; 11
169 DW OFFSET MODHI ;; 12
170 DW OFFSET FONTSLO ;; 13
171 DW OFFSET FONTSHI ;; 14
172 DW OFFSET FDLENLO ;; 15
173 DW OFFSET FDLENHI ;; 16 -- lead to FONT case,NON- DISPLAY
174 DW OFFSET DSPROWS ;; 17 -- DISPLAY only
175 DW OFFSET DSPCOLS ;; 18
176 DW OFFSET DSPX ;; 19
177 DW OFFSET DSPY ;; 1A
178 DW OFFSET DSPCOUNTLO ;; 1B
179 DW OFFSET DSPCOUNTHI ;; 1C -- lead to FONT case, DISPLAY
180 DW OFFSET PTRSELLO ;; 1D -- PRINTER only
181 DW OFFSET PTRSELHI ;; 1E
182 DW OFFSET PTRLENLO ;; 1F
183 DW OFFSET PTRLENHI ;; 20 -- lead to FONT case, PRINTER
184 DW 00H ;; FOUND case
185 DW 00H ;; GET_FONT case
186 DW 00H ;; PASS special stage
187 DW OFFSET FILETAG ;; 24
188 DW OFFSET fptrLOL ;; 25
189 DW OFFSET fptrLOH ;; 26
190 DW OFFSET fptrHIL ;; 27
191 DW OFFSET fptrHIH ;; 28
192 DW 00H ;; FPTR_SKIP_CASE
193 ;;
194 ;; The followings are individual stage
195STAGE_MAX EQU ($-STAGE_CASES)/2 ;; number of stages
196 ;;
197 ;; STAGE-INDEX
198 ;;
199 ;; **** INDEX TO STAGE_CASES ****
200ENTRY_LOX EQU 00H ;;
201ENTRY_HIX EQU 01H ;;
202NEXT_LOLX EQU 02H ;; NEXT
203NEXT_LOHX EQU 03H ;;
204NEXT_HILX EQU 04H ;;
205NEXT_HIHX EQU 05H ;;
206TYPE_LOBX EQU 06H ;; TYPE
207TYPE_HIBX EQU 07H ;;
208TYPE_IDX EQU 08H ;; TYPEID
209CPG_LOBX EQU 09H ;; CODE PAGE
210CPG_HIBX EQU 0AH ;;
211FONT_LOLX EQU 0BH ;; FONT ADDRESS
212FONT_LOHX EQU 0CH ;;
213FONT_HILX EQU 0DH ;;
214FONT_HIHX EQU 0EH ;;
215 ;; ------------------------------
216MATCHX EQU 0FH ;; MATCH is the end of SEARCH's stages
217SCANX EQU 10H ;; SCANX is before the PRE-FOUND stages
218 ;; ------------------------------
219MOD_LOBX EQU 11H ;; MODIFIER
220MOD_HIBX EQU 12H ;;
221FONTS_LOBX EQU 13H ;; FONTS
222FONTS_HIBX EQU 14H ;;
223FDLEN_LOBX EQU 15H ;; FONT DATA LENGTH
224FDLEN_HIBX EQU 16H ;;
225DISP_ROWSX EQU 17H ;; DISPLAY -- CHAR. SIZE
226DISP_COLSX EQU 18H ;;
227DISP_XX EQU 19H ;; DISPLAY -- ASPECT RATIO
228DISP_YX EQU 1AH ;;
229COUNT_LOBX EQU 1BH ;; DISPLAY -- COUNT
230COUNT_HIBX EQU 1CH ;;
231PTRSELLOX EQU 1DH ;;
232PTRSELHIX EQU 1EH ;;
233PTRLENLOX EQU 1FH ;;
234PTRLENHIX EQU 20H ;;
235 ;;
236 ;; ------------------------------
237FOUNDX EQU 21H ;; GET_FX is the end of PRE-FOUND stage
238GET_FX EQU 22H ;;
239 ;; ------------------------------
240PASSX EQU 23H ;; see pass_brk table
241 ;; ------------------------------
242FTAGX EQU 24H ;; RESTART ==> FILE TAG
243 ;;
244fptr_LOLX EQU 25H ;; POINTER in font file header
245fptr_LOHX EQU 26H ;;
246fptr_HILX EQU 27H ;;
247fptr_HIHX EQU 28H ;; ---------------------------------
248 ;;
249fptr_SKIPX EQU 29H ;; ==> ENTRY_LOX
250 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
251 ;; PASS -- to skip some bytes ;;;;;;
252 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
253 ;; the PASS mechanism is used to skip
254 ;; a number of bytes between two fields
255 ;; The numbers are tabulated in
256 ;; PASS_BRK table in the accumulative
257 ;; sum. The PASS_POSTX(and PASS_POSTXX)
258 ;; are used to tell what is the stage
259 ;; after all the bytes have skipped.
260 ;;
261PASS_POSTX DW STAGE_MAX ;; the stage after pass-stage
262 ;;
263FILE_OFFSET EQU 0BH ;; spaces to be skipped in font file :
264 ;; ( after TAG, before POINTER)
265 ;;
266PASS_CNT DW 0 ;;
267PASS_BRK LABEL WORD ;;
268 DW FILE_OFFSET ;; skip in the font file header
269 DW FILE_OFFSET+2 ;; pass header-length, needs to reset
270 ;; PASS_CNT for each of the font_header
271 DW FILE_OFFSET+8 ;; pass header-reserved bytes
272PASS_INDX EQU ($-PASS_BRK)/2 ;;
273 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
274 ;; the control variables : ;;;;;;;;
275 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
276STAGE DW STAGE_MAX ;; of the STAGE-INDEX
277 ;;
278Pre_font_len DW 00000H ;; no. of bytes before the FONT DATA
279 ;;
280 ;;
281COUNT_LO DW 00000H ;; no. of bytes parsed so far
282COUNT_hI DW 00000H ;;
283 ;;
284HIT_LO DW 00000H ;; the next byte that is addressed by :
285HIT_HI DW 00000H ;; either NEXT or TARGET in FTBLK.
286 ;;
287HIT_FLAG DW 00000H ;; IF ZERO, the NEXT is approaching
288HIT_BX DW 00000H ;; where FTB is found for nearest hit
289 ;;
290NUM_FTB DW 00000H ;; as defined in the FP_BUFFER
291 ;;
292;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
293;;
294;; FONT_PARSER routine
295;;
296;; -- to be called at every packet received to extract informations
297;; from Font File on byte basis.
298;;
299;; -- Interface though FTABLE
300;;
301;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
302 ;;
303FONT_PARSER PROC ;;
304 PUSH DS ;; save all registers Revised
305 PUSH ES ;;
306 PUSH AX ;;
307 PUSH BX ;;
308 PUSH CX ;;
309 PUSH DX ;;
310 PUSH DI ;;
311 PUSH SI ;;
312 ;; BP isn't used, so it isn't saved
313 LEA BX,FTABLE ;;
314 PUSH CS ;;
315 POP ES ;; ES:[BX]
316 LDS SI,FTP.BUFFER_ADDR ;; DS:[SI]
317 MOV CX,FTP.BUFFER_LEN ;; CX = length of packet
318 MOV DX,FTP.NUM_FTBLK ;; DX = number of FTB
319 MOV cs:num_ftb,DX ;;
320 AND DX,DX ;;
321 JNZ VALID_BUFFER ;;
322 MOV cs:fp_error,0020H ;; ERROR 0020H
323 JMP FP_RET ;;
324VALID_BUFFER : ;;
325 MOV AX,FTP.FLAG ;;
326 AND AX,FLAG_RESTART ;;
327 Jnz has_RESTART ;;
328 JMP NO_RESTART ;;
329 ;;
330 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
331has_restart : ;;
332 PUSH BX ;; reset all the output fields
333 ADD BX,TYPE FBUFS ;; FTP = FONT BLOCK
334 XOR AX,AX ;;
335 ;;
336 MOV cs:ftag_count,AX ;;
337 MOV cs:fptr_low,AX ;;
338 MOV cs:fptr_high,AX ;;
339 MOV cs:pre_font_len,AX ;;
340 MOV cs:count_lo,AX ;;
341 MOV cs:count_hi,AX ;;
342 MOV cs:next_low,AX ;;
343 MOV cs:next_high,AX ;;
344 MOV cs:hit_lo,AX ;;
345 MOV cs:hit_hi,AX ;;
346 MOV cs:hit_flag,AX ;;
347 MOV cs:pass_cnt,AX ;;
348 MOV cs:pass_postx,STAGE_MAX ;;
349 ;;
350 MOV cs:stage,STAGE_MAX ;;
351 ;;
352RESET_FTB : ;;
353 MOV FTP.FTB_STATUS,FSTAT_SEARCH
354 MOV FTP.FTB_TYPE,AX ;;
355 MOV FTP.FTB_MOD,AX ;;
356 MOV FTP.FTB_FONTS,AX ;;
357 MOV FTP.FTB_ROWS,AL ;;
358 MOV FTP.FTB_COLS,AL ;;
359 MOV FTP.FTB_X,AL ;;
360 MOV FTP.FTB_Y,AL ;;
361 MOV FTP.FTB_COUNT,AX ;;
362 MOV FTP.FTB_DLEFT,AX ;;
363 MOV FTP.FTB_DLEN,AX ;;
364 MOV FTP.FTB_DALO,AX ;;
365 MOV FTP.FTB_DAHI,AX ;;
366 MOV FTP.TARGET_LO,AX ;;
367 MOV FTP.TARGET_HI,AX ;;
368 ;;
369 ADD BX, TYPE FTBLK ;;
370 ;;
371 DEC DX ;;
372 AND DX,DX ;;
373 JNZ RESET_FTB ;;
374 ;;
375 POP BX ;;
376NO_RESTART : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
377 ;; any FTBLKs have their data all
378 ;; returned ? if so set their status
379 ;; from FOUND to COMPLETE
380 PUSH BX ;;
381 ADD BX,TYPE FBUFS ;; FTP = FONT BLOCK
382 ;;
383 MOV DX,cs:num_ftb ;;
384 ;;
385SET_COMPLETE : ;;
386 MOV AX,FTP.FTB_STATUS ;;
387 CMP AX,FSTAT_FONT ;;
388 JNE SET_NEXT ;;
389 ;;
390 MOV AX,FTP.FTB_DLEFT ;;
391 AND AX,AX ;;
392 JNZ SET_NEXT ;;
393 ;;
394 MOV FTP.FTB_STATUS,FSTAT_COMPLETE
395 ;;
396SET_NEXT : ;;
397 ;;
398 ADD BX,TYPE FTBLK ;;
399 ;;
400 DEC DX ;;
401 AND DX,DX ;;
402 JNZ SET_COMPLETE ;;
403 ;;
404 POP BX ;;
405 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
406 ADD BX,TYPE FBUFS ;; FTP = FONT BLOCK
407 ;;
408 PUSH CX ;; STACK 1 = CX
409;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
410;;
411;; DO WHILE CX is not zero :
412;;
413;; -- on each loop, the CX, COUNTs are updated
414;;
415;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
416 ;;
417 ;;
418FTB_LOOP : ;;
419 POP AX ;; STACK -1
420 SUB AX,CX ;;
421 ADD cs:count_lo,AX ;;
422 JNC NO_CARRY ;;
423 ADD cs:count_hi,1000H ;;
424NO_CARRY : ;;
425 PUSH CX ;; STACK 1 = CX
426 AND CX,CX ;;
427 JNZ FTB_CONT ;;
428 JMP FTB_LPEND ;;
429 ;; DO CASES :
430FTB_CONT : ;; ==========
431 ;;
432 MOV AX,cs:stage ;;
433 ;;
434 CMP AX,STAGE_MAX ;;
435 JNE FTB_010 ;;
436 JMP START_CASE ;; ** RESTART **
437 ;;
438FTB_010 : ;;
439 CMP AX,MATCHX ;;
440 JAE FTB_020 ;;
441 JMP SEARCH_CASE ;; ** SEARCH **
442 ;;
443FTB_020 : ;;
444 CMP AX,MATCHX ;;
445 JNE FTB_030 ;;
446 JMP MATCH_CASE ;; ** MATCH **
447 ;;
448FTB_030 : ;;
449 CMP AX,SCANX ;;
450 JNE FTB_040 ;;
451 JMP SCAN_CASE ;; ** SCAN **
452 ;;
453FTB_040 : ;;
454 CMP AX,FOUNDX ;;
455 JAE FTB_050 ;;
456 JMP PRE_FOUND_CASE ;; ** PRE-FOUND **
457 ;;
458FTB_050 : ;;
459 CMP AX,FOUNDX ;;
460 JNE FTB_060 ;;
461 JMP FOUND_CASE ;; ** FOUND **
462 ;;
463FTB_060 : ;;
464 CMP AX,GET_FX ;;
465 JNE FTB_070 ;;
466 JMP GETFONT_CASE ;; ** GET_FONT **
467 ;;
468FTB_070 : ;;
469 CMP AX,PASSX ;;
470 JNE FTB_080 ;;
471 JMP PASS ;; ** PASS **
472 ;;
473FTB_080 : ;;
474 CMP AX,FPTR_SKIPX ;;
475 JAE FTB_090 ;;
476 JMP SEARCH_CASE ;; ** SEARCH **
477 ;;
478FTB_090 : ;;
479 CMP AX,FPTR_SKIPX ;;
480 JNE FTB_FFF ;;
481 JMP FPTR_SKIP_CASE ;; ** SEARCH **
482 ;;
483FTB_FFF : ;;
484 MOV FTP.FTB_STATUS,STAT_DEVERR
485 JMP FTB_LPEND ;; ** DEVICE ERROR **
486 ;;
487;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
488;;
489;; at the entry of each STAGES /CASES
490;;
491;; -- DS:[SI] (FPKT) points to PACKET, of DOS's buffer
492;; -- CX remaining packet length
493;; -- ES:[BX] points to the first FTBLK
494;; -- COUNT_LO, COUNT_HI, upto but and including the address pointed by FPKT
495;;
496;;
497;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
498 ;;
499;============================================================================
500START_CASE : ;; pass the FILE leading bytes
501 ;;
502 MOV cs:ftag_count,0 ;;
503 MOV cs:stage,ftagx ;;
504 JMP FTB_LOOP ;;
505 ;;
506;=============================================================================
507FPTR_SKIP_CASE : ;; skip until the ENTRY pointed by
508 ;; POINTER (in FPTR) is reached.
509 ;;
510 ;; **************
511 MOV AX,cs:fptr_low ;; * HIT = FPTR *
512 MOV cs:hit_lo,AX ;; **************
513 MOV DX,cs:fptr_high ;;
514 MOV cs:hit_hi,DX ;;
515 ;;
516 CMP AX,0FFFFH ;;
517 JNE FPTR_SKIP_VALID ;;
518 CMP DX,0FFFFH ;;
519 JNE FPTR_SKIP_VALID ;;
520 ;;
521 MOV FTP.FTB_STATUS,STAT_BADATA ;; returned at the first FTBLK
522 JMP FPTR_SKIP_MORE ;;
523 ;;
524FPTR_SKIP_VALID : ;;
525 ;; normalised HIT_HI, HIT_LO
526 MOV AX,DX ;;
527 AND AX,00FFFH ;;
528 PUSH CX ;;
529 MOV CX,4 ;;
530 SHL AX,CL ;;
531 POP CX ;;
532 AND DX,0F000H ;;
533 ADD AX,cs:hit_lo ;;
534 JNC NO_CARRY10 ;;
535 ADD DX,01000H ;;
536NO_CARRY10: ;;
537 MOV cs:hit_lo,AX ;;
538 MOV cs:hit_hi,DX ;;
539 ;; **************************
540 ;; * compare FPTR and COUNT *
541 ;; **************************
542 ;; DX:AX = HIT_HI:HIT_LO (normalised)
543 ;;
544 SUB AX,cs:count_lo ;;
545 Jnc more_fptrlo ;;
546 sub dx,01000h ;;
547 jc fptr_bad ;;
548 ;;
549more_fptrlo : ;;
550 SUB DX,cs:count_hi ;;
551 JC fptr_BAD ;;
552 ;;
553 INC AX ;; COUNT can be at the HIT, then AX=0
554 JNC NO_CARRY11 ;; INC AX to make AX comparable to CX
555 ADD DX,01000H ;; i.e. AX = offset + 1
556 ;;
557NO_CARRY11: ;;
558 CMP AX,CX ;;
559 JA fptr_skip_more ;; AX > CX, whole CX to be skipped
560 ;;
561 PUSH DX ;; normalise dx:ax
562 AND DX,00FFFH ;;
563 PUSH CX ;;
564 MOV CX,4 ;;
565 SHL DX,CL ;;
566 POP CX ;;
567 ADD AX,DX ;;
568 POP DX ;;
569 JNC NO_CARRY13 ;;
570 ADD DX,01000H ;;
571NO_CARRY13: ;;
572 AND DX,0F000H ;;
573 ;;
574 PUSH AX ;;
575 PUSH DX ;; STACK +1 : normalosed DX:AX
576 SUB AX,CX ;;
577 JNC NO_BORROW11 ;;
578 SUB DX,1000H ;;
579 JC fptr_MORE_CXp ;; dx:ax < cx
580NO_BORROW11: ;;
581 ;; dx:ax >= cx
582 AND AX,AX ;;
583 JNE fptr_skip_MOREP ;;
584 AND DX,DX ;;
585 JNE fptr_skip_MOREP ;;
586 ;; dx:ax = cx, or
587 ;; offset + 1 = CX
588 ;;
589 ;; ************************************
590 ;; * POINTER is within the current CX *
591 ;; ************************************
592fptr_MORE_CXP : ;;
593 POP DX ;;
594 POP AX ;; STACK -1
595 ;;
596fptr_MORE_CX : ;; DX = 0,to have more CX than offset+1
597 DEC AX ;; = offset : 0 and above
598 SUB CX,AX ;;
599 ADD SI,AX ;; where the first byte is
600 ;;
601 MOV cs:stage,entry_lox ;; ENTRIES in the font file
602 ;;
603 JMP FTB_LOOP ;; ****** RETURN *******
604 ;;
605 ;; ***********************************
606 ;; * more to skip ==> FPTR_SKIP_CASE *
607 ;; ***********************************
608fptr_skip_morep: ;;
609 POP DX ;;
610 POP AX ;; STACK -1
611 ;;
612fptr_skip_more : ;;
613 ADD SI,CX ;;
614 SUB CX,CX ;;
615 JMP FTB_LOOP ;; ****** RETURN *****
616 ;;
617 ;; ***********************************
618 ;; * bad POINTER in font file header *
619 ;; ***********************************
620 ;;
621fptr_bad : ;;
622 MOV cs:fptr_low,0FFFFH ;;
623 MOV cs:fptr_high,0FFFFH ;;
624 ;;
625 MOV FTP.FTB_STATUS,STAT_BADATA ;; returned at the first FTBLK
626 ;;
627 JMP FPTR_SKIP_MORE ;;
628 ;;
629;=============================================================================
630SEARCH_CASE : ;;
631 ;; still looking for header to match
632 ;; the input : codepage and typeid
633 ;;
634 MOV DI,cs:stage ;;
635 ;;
636 ADD DI,DI ;; double to index to WORD-offset
637 ;;
638 JMP CS:STAGE_CASES[DI] ;; call routine to process the stage
639 ;;
640 ;;
641;===========================================================================
642MATCH_CASE : ;;
643 ;;
644 PUSH BX ;;
645 MOV DX,cs:num_ftb ;;
646 ;;
647 ;;
648MATCH_LOOP : ;;
649 MOV AX,FTP.FTB_STATUS ;;
650 CMP AX,FSTAT_SEARCH ;;
651 JE MATCH_SEARCH ;;
652 JMP MATCH_NEXT ;;
653 ;;
654MATCH_SEARCH : ;;
655 MOV AX,FTP.FTB_CP ;; check the FTB with SEARCH status
656 CMP AX,cs:cpg_word ;;
657 JNE MATCH_MORE ;;
658 PUSH DS ;; code page matched
659 PUSH SI ;;
660 PUSH CX ;;
661 ;;
662 PUSH CS ;;
663 POP DS ;;
664 MOV SI,OFFSET TYPE_ID ;;
665 LEA DI,[BX].FTB_TID ;;
666 MOV CX,8 ;;
667 REPE CMPSB ;;
668 ;;
669 POP CX ;;
670 POP SI ;;
671 POP DS ;;
672 ;;
673 JNE MATCH_MORE ;;
674 ;; MATCH !!!!! (type_id matched)
675 MOV FTP.FTB_STATUS,FSTAT_MATCH
676 MOV AX,cs:type_word ;;
677 MOV FTP.FTB_TYPE,AX ;;
678 MOV AX,cs:font_low ;;
679 MOV FTP.TARGET_LO,AX ;;
680 MOV AX,cs:font_high ;;
681 MOV FTP.TARGET_HI,AX ;;
682 ;;
683 JMP MATCH_NEXT ;;
684 ;;
685MATCH_MORE : ;; if this is the last rounf ?
686 ;;
687 MOV AX,cs:next_low ;; NEXT = FFFF:FFFF means no more
688 CMP AX,-1 ;; header to come.
689 JNE MATCH_NEXT ;;
690 ;;
691 MOV AX,cs:next_high ;;
692 CMP AX,-1 ;;
693 JNE MATCH_NEXT ;;
694 ;;
695 MOV FTP.FTB_STATUS,STAT_NOFIND ;; ERROR : no match
696 ;;
697MATCH_NEXT : ;;
698 ADD BX,FTP.FTB_LENGTH ;;
699 DEC DX ;;
700 AND DX,DX ;;
701 JZ MATCH_ALL ;;
702 JMP MATCH_LOOP ;;
703 ;;
704MATCH_ALL : ;;
705 MOV cs:stage,SCANX ;;
706 ;;
707MATCH_DONE : ;;
708 POP BX ;;
709 JMP FTB_LOOP ;;
710 ;;
711;===========================================================================
712SCAN_CASE : ;;
713 ;; **********************************
714 ;; * determine whether it the font *
715 ;; * data(TARGET),or the next font *
716 ;; * header(NEXT) that is approaching
717 ;; **********************************
718 ;;
719 MOV AX,cs:next_low ;;
720 MOV cs:hit_lo,AX ;;
721 MOV AX,cs:next_high ;;
722 MOV cs:hit_hi,AX ;;
723 XOR AX,AX ;;
724 MOV cs:hit_flag,AX ;;
725 ;;
726 MOV DI,cs:hit_hi ;; normalised HIT_HI, HIT_LO
727 MOV AX,DI ;;
728 AND AX,00FFFH ;;
729 PUSH CX ;;
730 MOV CX,4 ;;
731 SHL AX,CL ;;
732 POP CX ;;
733 AND DI,0F000H ;;
734 ADD AX,cs:hit_lo ;;
735 JNC NO_CARRY2 ;;
736 ADD DI,01000H ;;
737NO_CARRY2 : ;;
738 MOV cs:hit_lo,AX ;;
739 MOV cs:hit_hi,DI ;;
740 ;;
741 MOV DX,cs:num_ftb ;;
742 ;;
743 PUSH BX ;;
744SCAN_LOOP : ;;
745 MOV AX,FTP.FTB_STATUS ;;
746 CMP AX,FSTAT_MATCH ;;
747 JNE SCAN_NEXT ;;
748 ;;
749 ;;
750 MOV DI,FTP.TARGET_HI ;; NORMALISED TARGET
751 MOV AX,DI ;;
752 AND AX,00FFFH ;;
753 PUSH CX ;;
754 MOV CX,4 ;;
755 SHL AX,CL ;;
756 POP CX ;;
757 AND DI,0F000H ;;
758 ADD AX,FTP.TARGET_LO ;;
759 JNC NO_CARRY1 ;;
760 ADD DI,01000H ;;
761NO_CARRY1 : ;; DI:AX = NORMALISED TARGET
762 ;;
763 ;; ** compare the TARGET and the NEXT
764 ;;
765 CMP DI,cs:hit_hi ;;
766 JA SCAN_NEXT ;;
767 ;;
768 JE SCAN_EQU ;;
769 JMP NEAR_FONT ;;
770 ;;
771SCAN_EQU : ;;
772 CMP AX,cs:hit_lo ;;
773 JA SCAN_NEXT ;;
774 JE SCAN_ERROR_CHK ;;
775 ;; **********************************
776 ;; * the font data is approaching *
777 ;; **********************************
778NEAR_FONT : ;;
779 MOV cs:hit_flag,-1 ;;
780 MOV cs:hit_lo,AX ;;
781 MOV cs:hit_hi,DI ;;
782 MOV cs:hit_bx,BX ;; used for BAD_BX and in FOUND_CASE
783 JMP SCAN_NEXT ;;
784 ;;
785 ;; **********************************
786 ;; * the NEXT header is approaching *
787 ;; **********************************
788SCAN_ERROR_CHK : ;;
789 MOV AX,cs:hit_flag ;;
790 AND AX,AX ;;
791 JNZ SCAN_NEXT ;;
792 MOV FTP.FTB_STATUS,STAT_BADATA ;; next header and font cannot be the
793 ;; same
794 ;;
795SCAN_NEXT : ;;
796 DEC DX ;;
797 AND DX,DX ;;
798 JZ SCAN_DONE ;;
799 ;;
800 ADD BX,FTP.FTB_LENGTH ;;
801 JMP SCAN_LOOP ;; ** is there any closer font data ?
802 ;;
803 ;; ************************************
804 ;; * the HIT is either font data(TARGET
805 ;; * or the font block (NEXT). *
806 ;; ************************************
807SCAN_DONE : ;;
808 POP BX ;;
809 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
810 MOV DX,cs:hit_hi ;; HIT_FLAG, HIT_LO, HIT_HI defined
811 MOV AX,cs:hit_lo ;;
812 ;;
813 CMP AX,0FFFFH ;;
814 JNE NOT_FFFF_HIT ;;
815 CMP DX,0FFFFH ;;
816 JNE NOT_FFFF_HIT ;;
817 JMP SCAN_MORE ;; stage remained as SCAN, discard data
818 ;;
819NOT_FFFF_HIT : ;;
820 ;; DX:AX = HIT_HI:HIT_LO (normalised)
821 SUB AX,cs:count_lo ;;
822 JNC NO_BORROW ;;
823 SUB DX,01000H ;;
824 JC SCAN_BAD ;;
825NO_BORROW: ;;
826 SUB DX,cs:count_hi ;;
827 JC SCAN_BAD ;;
828 ;;
829 INC AX ;; COUNT can be at the HIT, then AX=0
830 JNC NO_CARRYX ;; INC AX to make AX comparable to CX
831 ADD DX,01000H ;; i.e. AX = offset + 1
832 ;;
833NO_CARRYX : ;;
834 CMP AX,CX ;;
835 JA SCAN_MORE ;;
836 ;;
837 PUSH DX ;;
838 AND DX,00FFFH ;;
839 PUSH CX ;;
840 MOV CX,4 ;;
841 SHL DX,CL ;;
842 POP CX ;;
843 ADD AX,DX ;;
844 POP DX ;;
845 JNC NO_CARRY3 ;;
846 ADD DX,01000H ;;
847NO_CARRY3 : ;;
848 AND DX,0F000H ;;
849 ;;
850 ;;
851 PUSH AX ;;
852 PUSH DX ;;
853 SUB AX,CX ;;
854 JNC NO_BORROW1 ;;
855 SUB DX,1000H ;;
856 JC MORE_CXp ;;
857NO_BORROW1 : ;;
858 ;; dx:ax >= cx
859 AND AX,AX ;;
860 JNE SCAN_MOREP ;;
861 AND DX,DX ;;
862 JNE SCAN_MOREP ;;
863 ;;
864 ;; offset + 1 = CX
865 ;;
866MORE_CXP : ;;
867 POP DX ;;
868 POP AX ;;
869 ;;
870MORE_CX : ;; DX = 0,to have more CX than offset+1
871 DEC AX ;; = offset : 0 and above
872 SUB CX,AX ;;
873 ADD SI,AX ;; where the first byte is
874 MOV AX,cs:hit_flag ;;
875 AND AX,AX ;;
876 JE NEXT_REACHED ;;
877 ;;
878 MOV cs:stage,MOD_LOBX ;; font-data reached,
879 ;;
880 JMP FTB_LOOP ;; ****** RETURN *******
881 ;;
882NEXT_REACHED : ;;
883 MOV cs:stage,PASSX ;;
884 MOV cs:pass_postx,next_lolX ;;
885 MOV cs:pass_cnt,FILE_OFFSET ;;
886 ;;
887 ;;
888 JMP FTB_LOOP ;; ****** RETURN *******
889 ;;
890 ;; ***********************************
891SCAN_MOREP : ;; * scan more FTBLK for the nearest *
892 ;; * font data *
893 ;; ***********************************
894 POP DX ;;
895 POP AX ;;
896 ;;
897SCAN_MORE : ;;
898 ADD SI,CX ;;
899 SUB CX,CX ;;
900 JMP FTB_LOOP ;; more SCAN stage
901 ;;
902SCAN_BAD: ;; *************************
903 MOV AX,cs:hit_flag ;; * scan is bad *
904 AND AX,AX ;; *************************
905 JNZ BAD_BX ;;
906 MOV AX,-1 ;; NEXT is pointing backwards
907 MOV cs:next_low,AX ;;
908 MOV cs:next_high,AX ;; no more NEXT
909 MOV FTP.FTB_STATUS,STAT_BADATA ;; returned at the first FTBLK
910 JMP FTB_LOOP ;;
911 ;;
912BAD_BX : ;;
913 PUSH BX ;; FONT is pointing backwards
914 MOV BX,cs:hit_bx ;;
915 MOV FTP.FTB_STATUS,STAT_BADATA
916 POP BX ;;
917 JMP FTB_LOOP ;;
918 ;;
919;===========================================================================
920PRE_FOUND_CASE : ;;
921 ;; extract informations from the font
922 ;; block until font_length is defined
923 ;;
924 MOV DI,cs:stage ;;
925 ;;
926 ADD DI,DI ;; double to index to WORD-offset
927 ;;
928 JMP CS:STAGE_CASES[DI] ;; call routine to process the stage
929 ;;
930;===========================================================================
931FOUND_CASE : ;;
932 MOV DI,OFFSET FTB_LOOP ;; as FOUND has two places to return to
933 PUSH DI ;;
934;===========================================================================
935FOUND_DO : ;;
936 ;; define informations into FTBLK of
937 ;; HIT_BX defined in the SCAN case
938 PUSH BX ;;
939 MOV BX,cs:hit_bx ;;
940 ;; FTBLK :
941 MOV AX,cs:mod_word ;;
942 MOV FTP.FTB_MOD,AX ;;
943 MOV AX,cs:fonts_word ;;
944 MOV FTP.FTB_FONTS,AX ;;
945 ;;
946 MOV AX,cs:fdlen_word ;;
947 MOV FTP.FTB_DLEFT,AX ;;
948 MOV FTP.FTB_DLEN,0 ;;
949 MOV FTP.FTB_DALO,0 ;;
950 MOV FTP.FTB_DAHI,0 ;;
951 ;;
952 MOV FTP.FTB_STATUS,FSTAT_FOUND
953 ;;
954 CMP FTP.FTB_TYPE,TYPE_DISPLAY;
955 JNE CHECK_PTR_TYPE ;;
956 CMP cs:pre_font_len,PRE_FONT_D ;;
957 JNE DISPLAY_BAD ;;
958 JMP DISPLAY_DONE ;;
959 ;;
960CHECK_PTR_TYPE : ;;
961 CMP FTP.FTB_TYPE,TYPE_PRINTER;
962 JNE SET_STAGE ;;
963 CMP cs:ptr_sel_word,0 ;;
964 JNE PRINTER_HAS_SEL ;;
965 CMP cs:pre_font_len,PRE_FONT_P0;;
966 JNE PRINTER_BAD ;;
967 JMP PRINTER_DONE ;;
968 ;;
969PRINTER_HAS_SEL : ;;
970 CMP cs:pre_font_len,PRE_FONT_P ;;
971 JNE PRINTER_BAD ;;
972 JMP PRINTER_DONE ;;
973 ;;
974DISPLAY_BAD : ;;
975 ;;
976 MOV FTP.FTB_STATUS,STAT_BADATA ;the FDLEN_WORD should be 0.
977 ;;
978DISPLAY_DONE : ;;
979 MOV AL,cs:disp_rows ;;
980 MOV FTP.FTB_ROWS,AL ;;
981 MOV AL,cs:disp_cols ;;
982 MOV FTP.FTB_COLS,AL ;;
983 MOV AL,cs:disp_x ;;
984 MOV FTP.FTB_X,AL ;;
985 MOV AL,cs:disp_y ;;
986 MOV FTP.FTB_Y,AL ;;
987 MOV AX,cs:count_word ;;
988 MOV FTP.FTB_COUNT,AX ;;
989 JMP SET_STAGE ;;
990 ;;
991PRINTER_BAD : ;;
992 ;;
993 MOV FTP.FTB_STATUS,STAT_BADATA ;the FDLEN_WORD should be 0.
994 ;;
995PRINTER_DONE : ;;
996 MOV AX,cs:ptr_sel_word ;;
997 MOV FTP.FTB_SELECT,AX ;;
998 MOV AX,cs:ptr_len_word ;;
999 MOV FTP.FTB_SELLEN,AX ;;
1000 ;;
1001SET_STAGE : ;; STAGE :
1002 MOV AX,cs:fdlen_word ;; if no font data to follow
1003 AND AX,AX ;;
1004 JNZ GET_FDATA ;;
1005 MOV cs:stage,SCANX ;; then scan for next header or font
1006 JMP FONT_RET ;;
1007 ;;
1008GET_FDATA : ;; update the moving target
1009 MOV cs:stage,GET_FX ;;
1010 MOV AX,cs:pre_font_len ;;
1011 ADD FTP.TARGET_LO,AX ;;
1012 JNC FONT_RET ;;
1013 ADD FTP.TARGET_HI,01000H ;;
1014 ;;
1015FONT_RET : ;;
1016 POP BX ;;
1017 RET ;;
1018 ;;
1019;===========================================================================
1020GETFONT_CASE : ;; as ES:[SI], at COUNT, there is font
1021 ;; data
1022 MOV DX,cs:num_ftb ;;
1023 PUSH BX ;;
1024 ;;
1025 MOV cs:hit_hi,0 ;; temp. register
1026 MOV cs:hit_flag,0 ;; assumed can be changed to SCAN stage
1027 ;;
1028 MOV DI,cs:count_hi ;; normalised COUNT_HI,COUNT_LO
1029 MOV AX,DI ;;
1030 AND AX,00FFFH ;;
1031 PUSH CX ;;
1032 MOV CX,4 ;;
1033 SHL AX,CL ;;
1034 POP CX ;;
1035 AND DI,0F000H ;;
1036 ADD AX,cs:count_lo ;;
1037 JNC NO_CARRY4 ;;
1038 ADD DI,01000H ;;
1039NO_CARRY4 : ;;
1040 MOV cs:count_lo,AX ;;
1041 MOV cs:count_hi,DI ;;
1042 ;;
1043 ;;
1044GETFONT_LOOP : ;;
1045 MOV AX,FTP.FTB_STATUS ;;
1046 CMP AX,FSTAT_FONT ;;
1047 JE GETFONT_CONT ;;
1048 ;;
1049 CMP AX,FSTAT_FOUND ;;
1050 JE GETFONT_FOUND ;;
1051 ;;
1052 JMP NEXT_GETFONT ;;
1053 ;;
1054GETFONT_FOUND : ;;
1055 MOV AX,FTP.FTB_DLEFT ;;
1056 AND AX,AX ;;
1057 JZ NEXT_GF ;;
1058 MOV FTP.FTB_STATUS,FSTAT_FONT;
1059 JMP GETFONT_CONT1 ;;
1060 ;;
1061 ;;
1062GETFONT_CONT : ;;
1063 MOV AX,FTP.FTB_DLEFT ;;
1064 AND AX,AX ;;
1065 JNZ GETFONT_CONT1 ;;
1066NEXT_GF : ;;
1067 JMP NEXT_GETFONT ;;
1068 ;; only on FOUND and DLEFT <> 0
1069GETFONT_CONT1: ;;
1070 MOV DI,FTP.TARGET_HI ;; normalised TARGET
1071 MOV AX,DI ;;
1072 AND AX,00FFFH ;;
1073 PUSH CX ;;
1074 MOV CX,4 ;;
1075 SHL AX,CL ;;
1076 POP CX ;;
1077 AND DI,0F000H ;;
1078 ADD AX,FTP.TARGET_LO ;;
1079 JNC NO_CARRY5 ;;
1080 ADD DI,01000H ;;
1081NO_CARRY5 : ;; DI:AX = TARGET (normalised)
1082 ;;
1083 CMP DI,cs:count_hi ;;
1084 JB GETFONT_BAD ;;
1085 JNE NEXT_GETFONT ;;
1086 CMP AX,cs:count_lo ;;
1087 JB GETFONT_BAD ;;
1088 JNE NEXT_GETFONT ;;
1089 ;;
1090 MOV FTP.FTB_DALO,SI ;; where the font data is in the packet
1091 MOV FTP.FTB_DAHI,DS ;;
1092 ;;
1093 MOV AX,FTP.FTB_DLEFT ;;
1094 CMP AX,CX ;;
1095 JAE UPTO_CX ;;
1096 ;; upto FDLEFT
1097 MOV FTP.FTB_DLEFT,0 ;;
1098 MOV FTP.FTB_DLEN,AX ;;
1099 CMP cs:hit_hi,AX ;;
1100 JNB NOT_HIGHER0 ;;
1101 MOV cs:hit_hi,AX ;;
1102NOT_HIGHER0 : ;;
1103 ADD FTP.TARGET_LO,AX ;;
1104 JNC NEXT_GETFONT ;;
1105 ADD FTP.TARGET_HI,01000H ;;
1106 JMP NEXT_GETFONT ;;
1107 ;;
1108GETFONT_BAD : ;;
1109 MOV FTP.FTB_STATUS,STAT_BADATA ;; pointing backwards
1110 JMP NEXT_GETFONT ;;
1111 ;;
1112UPTO_CX : ;;
1113 SUB AX,CX ;;
1114 MOV FTP.FTB_DLEFT,AX ;;
1115 MOV FTP.FTB_DLEN,CX ;;
1116 MOV cs:hit_hi,CX ;;
1117 ADD FTP.TARGET_LO,CX ;;
1118 JNC NO_CARRYOVER ;;
1119 ADD FTP.TARGET_HI,01000H ;;
1120NO_CARRYOVER : ;;
1121 AND AX,AX ;; all data have been returned ?
1122 JZ NEXT_GETFONT ;;
1123 ;;
1124 MOV cs:hit_flag,-1 ;; no ! stay in the GET_FONT stage
1125 ;;
1126NEXT_GETFONT : ;;
1127 ADD BX,FTP.FTB_LENGTH ;;
1128 DEC DX ;;
1129 AND DX,DX ;;
1130 JZ GETFONT_END ;;
1131 JMP GETFONT_LOOP ;;
1132 ;;
1133GETFONT_END : ;;
1134 MOV AX,cs:hit_hi ;;
1135 ADD SI,AX ;;
1136 SUB CX,AX ;;
1137 ;;
1138 CMP cs:hit_flag,0 ;;
1139 Jne GETFONT_DONE ;;
1140 MOV cs:stage,SCANX ;; no more in the GET_FONT stage
1141 ;;
1142 ;;
1143GETFONT_DONE : ;;
1144 POP BX ;;
1145 JMP FTB_LOOP ;;
1146 ;;
1147;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1148;;
1149;; STAGES -- "called by" SERACH_CASE
1150;;
1151;; -- DS:[SI] (FPKT) points to PACKET, of DOS's buffer
1152;; -- CX remaining packet length
1153;; -- ES:[BX] points to the first FTBLK
1154;; -- COUNT_LO, COUNT_HI, upto but not including the address pointed by FPKT
1155;;
1156;;
1157;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1158 ;;+++++++++++++++++++++++++++++++++
1159filetag : ;;
1160 ;;
1161; mov ax,ftag_len ;;
1162 cmp cs:ftag_count,ftag_len ;;
1163 jB valid_ftag ;;
1164 JE FTAG_FAILED ;;
1165 ;;
1166 mov ftp.ftb_status,stat_deverr
1167 mov cs:fp_error,00022H ;; ERROR 0022H
1168 ;;
1169FTAG_FAILED : ;; discard all the bytes, while
1170 ADD SI,CX ;; stage stays as FTAGX
1171 SUB CX,CX ;;
1172 JMP FTB_LOOP ;; **** RETURN (bytes discarded) ****
1173 ;;
1174VALID_FTAG : ;;
1175 MOV AX,FPKT ;;
1176 INC SI ;;
1177 DEC CX ;;
1178 ;;
1179 MOV DI,cs:ftag_count ;;
1180 CMP AL,cs:ftag_pattern[DI] ;;
1181 JE FTAG_NEXTB ;;
1182 ;;
1183 mov ftp.ftb_status,stat_badata
1184 MOV ax,ftag_len ;; stays in FTAGX to consume all bytes
1185 MOV cs:ftag_count,ax ;; stays in FTAGX to consume all bytes
1186 JMP FTB_LOOP ;; **** RETURN (FAILED !) ****
1187 ;;
1188FTAG_NEXTB : ;;
1189 INC DI ;;
1190 MOV cs:ftag_count,DI ;;
1191 ;;
1192 CMP DI,ftag_len ;;
1193 JE FTAG_DONE ;;
1194 ;;
1195 JMP FTB_LOOP ;; **** RETURN ( MORE TO COME) ****
1196 ;;
1197FTAG_DONE : ;;
1198 MOV cs:pass_cnt,0 ;;
1199 MOV cs:stage,PASSX ;;
1200 MOV cs:pass_postx,fptr_lolx ;;
1201 ;;
1202 JMP FTB_LOOP ;; **** NEXT STAGE ****
1203 ;;
1204 ;;+++++++++++++++++++++++++++++++++
1205fptrLOL : ;; STAGE the low byte of the low fptr
1206 MOV AX,FPKT ;;
1207 INC SI ;; byte by byte
1208 DEC CX ;;
1209 AND CX,CX ;;
1210 JNZ WORD_fptrLO ;;
1211 MOV cs:fptr_lol,AL ;;
1212 MOV cs:stage,fptr_lohX ;;
1213 JMP FTB_LOOP ;;
1214WORD_fptrLO : ;;
1215 INC SI ;;
1216 DEC CX ;;
1217 MOV cs:fptr_low,AX ;;
1218 MOV cs:stage,fptr_HILX ;;
1219 JMP FTB_LOOP ;;
1220 ;;+++++++++++++++++++++++++++++++++
1221fptrLOH : ;; STAGE the high byte of the low fptr
1222 MOV AX,FPKT ;;
1223 INC SI ;; byte by byte
1224 DEC CX ;;
1225 MOV cs:fptr_loh,AL ;;
1226 MOV cs:stage,fptr_HILX ;;
1227 JMP FTB_LOOP ;;
1228 ;;+++++++++++++++++++++++++++++++++
1229fptrHIL : ;; STAGE the low byte of the high fptr
1230 MOV AX,FPKT ;;
1231 INC SI ;; byte by byte
1232 DEC CX ;;
1233 AND CX,CX ;;
1234 JNZ WORD_fptrHI ;;
1235 MOV cs:fptr_hil,AL ;;
1236 MOV cs:stage,fptr_hihX ;;
1237 JMP FTB_LOOP ;;
1238WORD_fptrHI : ;;
1239 INC SI ;;
1240 DEC CX ;;
1241 MOV cs:fptr_high,AX ;;
1242 MOV cs:stage,FPTR_SKIPX ;;
1243 JMP FTB_LOOP ;;
1244 ;;+++++++++++++++++++++++++++++++++
1245fptrHIH : ;; STAGE the high byte of the high fptr
1246 MOV AX,FPKT ;;
1247 INC SI ;; byte by byte
1248 DEC CX ;;
1249 MOV cs:fptr_hih,AL ;;
1250 MOV cs:stage,FPTR_SKIPX ;;
1251 JMP FTB_LOOP ;;
1252 ;;+++++++++++++++++++++++++++++++++
1253ENTRYLO : ;; STAGE - ENTRY LOW BYTE
1254 MOV AX,FPKT ;;
1255 INC SI ;; byte by byte
1256 DEC CX ;;
1257 AND CX,CX ;;
1258 JNZ WORD_ENTRY ;;
1259 MOV cs:entry_lob,AL ;;
1260 MOV cs:stage,ENTRY_HIX ;;
1261 JMP FTB_LOOP ;;
1262WORD_ENTRY : ;;
1263 INC SI ;;
1264 DEC CX ;;
1265 MOV cs:entry_word,AX ;;
1266 MOV cs:stage,PASSX ;; 2 bytes to be passed
1267 MOV cs:pass_postx,NEXT_LOLX ;;
1268 JMP FTB_LOOP ;;
1269 ;;+++++++++++++++++++++++++++++++++
1270ENTRYHI : ;; stage - ENTRY HIGN BYTE
1271 MOV AX,FPKT ;;
1272 INC SI ;; byte by byte
1273 DEC CX ;;
1274 MOV cs:entry_hib,AL ;;
1275 MOV cs:stage,PASSX ;; 2 bytes to be passed
1276 MOV cs:pass_postx,NEXT_LOLX ;;
1277 AND CX,CX ;;
1278 JNZ ENTHI_PASS1 ;;
1279 JMP FTB_LOOP ;;
1280ENTHI_PASS1 : ;;
1281 INC SI ;;
1282 INC cs:pass_cnt ;;
1283 DEC CX ;;
1284 AND CX,CX ;;
1285 JNZ ENTHI_PASS2 ;;
1286 JMP FTB_LOOP ;;
1287ENTHI_PASS2 : ;;
1288 INC SI ;;
1289 INC cs:pass_cnt ;;
1290 DEC CX ;;
1291 MOV cs:stage,NEXT_LOLX ;;
1292 JMP FTB_LOOP ;;
1293 ;;+++++++++++++++++++++++++++++++++
1294NEXTLOL : ;; STAGE the low byte of the low NEXT
1295 MOV AX,FPKT ;;
1296 INC SI ;; byte by byte
1297 DEC CX ;;
1298 AND CX,CX ;;
1299 JNZ WORD_NEXTLO ;;
1300 MOV cs:next_lol,AL ;;
1301 MOV cs:stage,NEXT_LOHX ;;
1302 JMP FTB_LOOP ;;
1303WORD_NEXTLO : ;;
1304 INC SI ;;
1305 DEC CX ;;
1306 MOV cs:next_low,AX ;;
1307 MOV cs:stage,next_hilX ;;
1308 JMP FTB_LOOP ;;
1309 ;;+++++++++++++++++++++++++++++++++
1310NEXTLOH : ;; STAGE the high byte of the low NEXT
1311 MOV AX,FPKT ;;
1312 INC SI ;; byte by byte
1313 DEC CX ;;
1314 MOV cs:next_loh,AL ;;
1315 MOV cs:stage,next_hilX ;;
1316 JMP FTB_LOOP ;;
1317 ;;+++++++++++++++++++++++++++++++++
1318NEXTHIL : ;; STAGE the low byte of the high NEXT
1319 MOV AX,FPKT ;;
1320 INC SI ;; byte by byte
1321 DEC CX ;;
1322 AND CX,CX ;;
1323 JNZ WORD_NEXTHI ;;
1324 MOV cs:next_hil,AL ;;
1325 MOV cs:stage,NEXT_HIHX ;;
1326 JMP FTB_LOOP ;;
1327WORD_NEXTHI : ;;
1328 INC SI ;;
1329 DEC CX ;;
1330 MOV cs:next_high,AX ;;
1331 MOV cs:stage,type_lobX ;;
1332 JMP FTB_LOOP ;;
1333 ;;+++++++++++++++++++++++++++++++++
1334NEXTHIH : ;; STAGE the high byte of the high NEXT
1335 MOV AX,FPKT ;;
1336 INC SI ;; byte by byte
1337 DEC CX ;;
1338 MOV cs:next_hih,AL ;;
1339 MOV cs:stage,type_lobX ;;
1340 JMP FTB_LOOP ;;
1341 ;;+++++++++++++++++++++++++++++++++
1342TYPELO : ;; STAGE the low byte of the TYPE
1343 MOV AX,FPKT ;;
1344 INC SI ;; byte by byte
1345 DEC CX ;;
1346 AND CX,CX ;;
1347 JNZ WORD_TYPE ;;
1348 MOV cs:type_lob,AL ;;
1349 MOV cs:stage,type_hibX ;;
1350 JMP FTB_LOOP ;;
1351WORD_TYPE : ;;
1352 INC SI ;;
1353 DEC CX ;;
1354 MOV cs:type_word,AX ;;
1355 MOV cs:stage,type_idX ;;
1356 MOV cs:tid_cnt,0 ;;
1357 JMP FTB_LOOP ;;
1358 ;;+++++++++++++++++++++++++++++++++
1359TYPEHI : ;; STAGE the high byte of the TYPE
1360 MOV AX,FPKT ;;
1361 INC SI ;; byte by byte
1362 DEC CX ;;
1363 MOV cs:type_hib,AL ;;
1364 MOV cs:stage,TYPE_IDX ;;
1365 MOV cs:tid_cnt,0 ;;
1366 JMP FTB_LOOP ;;
1367 ;;+++++++++++++++++++++++++++++++++
1368TYPEIDS : ;; STAGE the type id
1369 CMP cs:tid_cnt,8 ;;
1370 JNA VALID_TID ;;
1371 MOV FTP.FTB_STATUS,STAT_DEVERR
1372 MOV cs:fp_error,00021H ;; ERROR 0021H
1373 ADD SI,CX ;;
1374 SUB CX,CX ;;
1375 JMP FTB_LOOP ;;
1376 ;;
1377VALID_TID : ;;
1378 MOV AX,8 ;;
1379 SUB AX,cs:tid_cnt ;;
1380 CMP CX,AX ;;
1381 JNB TID_ALL ;;
1382 ;; all data in FPKT are stored
1383 PUSH ES ;;
1384 PUSH CS ;;
1385 POP ES ;;
1386 ;;
1387 MOV DI,OFFSET TYPE_ID ;;
1388 ADD DI,cs:tid_cnt ;;
1389 ADD cs:tid_cnt,CX ;;
1390 REP MOVSB ;; SI is incremented accordingly
1391 POP ES ;;
1392 ;;
1393 MOV CX,0 ;; STAGE remained
1394 JMP FTB_LOOP ;;
1395TID_ALL : ;;
1396 PUSH CX ;;
1397 ;;
1398 PUSH ES ;;
1399 PUSH CS ;;
1400 POP ES ;;
1401 ;;
1402 MOV DI,OFFSET TYPE_ID ;;
1403 ADD DI,cs:tid_cnt ;;
1404 MOV CX,AX ;;
1405 REP MOVSB ;; SI is incremented accordingly
1406 POP ES ;;
1407 ;;
1408 ADD cs:tid_cnt,AX ;;
1409 POP CX ;;
1410 SUB CX,AX ;;
1411 ;;
1412 MOV cs:stage,CPG_LOBX ;;
1413 JMP FTB_LOOP ;;
1414 ;;+++++++++++++++++++++++++++++++++
1415CPGLO : ;; STAGE the low byte of the CODE PAGE
1416 MOV AX,FPKT ;;
1417 INC SI ;; byte by byte
1418 DEC CX ;;
1419 AND CX,CX ;;
1420 JNZ WORD_CPG ;;
1421 MOV cs:cpg_lob,AL ;;
1422 MOV cs:stage,CPG_HIBX ;;
1423 JMP FTB_LOOP ;;
1424WORD_CPG : ;;
1425 INC SI ;;
1426 DEC CX ;;
1427 MOV cs:cpg_word,AX ;;
1428 MOV cs:stage,PASSX ;;
1429 MOV cs:pass_postx,font_lolX ;;
1430 JMP FTB_LOOP ;;
1431 ;;+++++++++++++++++++++++++++++++++
1432CPGHI : ;; STAGE the high byte of the CODE PAGE
1433 MOV AX,FPKT ;;
1434 INC SI ;; byte by byte
1435 DEC CX ;;
1436 MOV cs:cpg_hib,AL ;;
1437 MOV cs:stage,PASSX ;;
1438 MOV cs:pass_postx,font_lolX ;;
1439 JMP FTB_LOOP ;;
1440 ;;+++++++++++++++++++++++++++++++++
1441FONTLOL : ;; STAGE the low byte of the low FONT
1442 MOV AX,FPKT ;;
1443 INC SI ;; byte by byte
1444 DEC CX ;;
1445 AND CX,CX ;;
1446 JNZ WORD_FONTLO ;;
1447 MOV cs:font_lol,AL ;;
1448 MOV cs:stage,FONT_LOHX ;;
1449 JMP FTB_LOOP ;;
1450WORD_FONTLO : ;;
1451 INC SI ;;
1452 DEC CX ;;
1453 MOV cs:font_low,AX ;;
1454 MOV cs:stage,FONT_HILX ;;
1455 JMP FTB_LOOP ;;
1456 ;;+++++++++++++++++++++++++++++++++
1457FONTLOH : ;; STAGE the high byte of the low FONT
1458 MOV AX,FPKT ;;
1459 INC SI ;; byte by byte
1460 DEC CX ;;
1461 MOV cs:font_loh,AL ;;
1462 MOV cs:stage,FONT_HILX ;;
1463 JMP FTB_LOOP ;;
1464 ;;+++++++++++++++++++++++++++++++++
1465FONTHIL : ;; STAGE the low byte of the high FONT
1466 MOV AX,FPKT ;;
1467 INC SI ;; byte by byte
1468 DEC CX ;;
1469 AND CX,CX ;;
1470 JNZ WORD_FONTHI ;;
1471 MOV cs:font_hil,AL ;;
1472 MOV cs:stage,FONT_HIHX ;;
1473 JMP FTB_LOOP ;;
1474WORD_FONTHI : ;;
1475 INC SI ;;
1476 DEC CX ;;
1477 MOV cs:font_high,AX ;;
1478;;;;;; MOV cs:stage,MOD_LOBX ;; end of SCAN
1479 ;; anymore headers to be processed ?
1480 MOV cs:stage,MATCHX ;;
1481 MOV AX,cs:entry_word ;;
1482 DEC AX ;;
1483 MOV cs:entry_word,AX ;;
1484 AND AX,AX ;;
1485 JNZ CHECK_NEXT ;;
1486 ;; no more header to be processed !
1487 MOV AX,-1 ;;
1488 MOV cs:next_low,AX ;;
1489 MOV cs:next_high,AX ;; as ENTRY has been consumed
1490 JMP FTB_LOOP ;;
1491 ;;
1492CHECK_NEXT : ;;
1493 MOV AX,cs:next_low ;;
1494 AND AX,AX ;;
1495 JNZ MORE_HEADER ;;
1496 MOV AX,cs:next_high ;;
1497 AND AX,AX ;;
1498 JNZ MORE_HEADER ;;
1499 ;; no more header to be processed !
1500 MOV AX,-1 ;;
1501 MOV cs:next_low,AX ;; as NEXT is nil
1502 MOV cs:next_high,AX ;;
1503 ;;
1504MORE_HEADER : ;;
1505 JMP FTB_LOOP ;;
1506 ;;+++++++++++++++++++++++++++++++++
1507FONTHIH : ;; STAGE the high byte of the high FONT
1508 MOV AX,FPKT ;;
1509 INC SI ;; byte by byte
1510 DEC CX ;;
1511 MOV cs:font_hih,AL ;;
1512;;;;; MOV cs:stage,MOD_LOBX ;; end of SCAN
1513 ;;
1514 MOV cs:stage,MATCHX ;;
1515 ;; anymore headers to be processed ?
1516 MOV AX,cs:entry_word ;;
1517 DEC AX ;;
1518 MOV cs:entry_word,AX ;;
1519 AND AX,AX ;;
1520 JNZ CHECK_NEXT0 ;;
1521 ;; no more header to be processed !
1522 MOV AX,-1 ;;
1523 MOV cs:next_low,AX ;;
1524 MOV cs:next_high,AX ;; as ENTRY has been consumed
1525 JMP FTB_LOOP ;;
1526 ;;
1527CHECK_NEXT0 : ;;
1528 MOV AX,cs:next_low ;;
1529 AND AX,AX ;;
1530 JNZ MORE_HEADER0 ;;
1531 MOV AX,cs:next_high ;;
1532 AND AX,AX ;;
1533 JNZ MORE_HEADER0 ;;
1534 ;; no more header to be processed !
1535 MOV AX,-1 ;;
1536 MOV cs:next_low,AX ;; as NEXT is nil
1537 MOV cs:next_high,AX ;;
1538 ;;
1539MORE_HEADER0 : ;;
1540 JMP FTB_LOOP ;;
1541 ;;
1542 ;;+++++++++++++++++++++++++++++++++
1543MODLO : ;; STAGE the low byte of the MODIFIER
1544 MOV AX,FPKT ;;
1545 INC SI ;; byte by byte
1546 DEC CX ;;
1547 AND CX,CX ;;
1548 JNZ WORD_MOD ;;
1549 MOV MOD_LOB,AL ;;
1550 MOV cs:stage,MOD_HIBX ;;
1551 JMP FTB_LOOP ;;
1552WORD_MOD : ;;
1553 INC SI ;;
1554 DEC CX ;;
1555 MOV cs:mod_word,AX ;;
1556 MOV cs:stage,fonts_lobX ;;
1557 JMP FTB_LOOP ;;
1558 ;;+++++++++++++++++++++++++++++++++
1559MODHI : ;; STAGE the high byte of the MODIFIER
1560 MOV AX,FPKT ;;
1561 INC SI ;; byte by byte
1562 DEC CX ;;
1563 MOV cs:mod_hib,AL ;;
1564 MOV cs:stage,FONTS_LOBX ;;
1565 JMP FTB_LOOP ;;
1566 ;;+++++++++++++++++++++++++++++++++
1567FONTSLO : ;; STAGE the low byte of the FONTS
1568 MOV AX,FPKT ;;
1569 INC SI ;; byte by byte
1570 DEC CX ;;
1571 AND CX,CX ;;
1572 JNZ WORD_FONTS ;;
1573 MOV cs:fonts_lob,AL ;;
1574 MOV cs:stage,FONTS_HIBX ;;
1575 JMP FTB_LOOP ;;
1576WORD_FONTS : ;;
1577 INC SI ;;
1578 DEC CX ;;
1579 MOV cs:fonts_word,AX ;;
1580 MOV cs:stage,FDLEN_LOBX ;;
1581 JMP FTB_LOOP ;;
1582 ;;+++++++++++++++++++++++++++++++++
1583FONTSHI : ;; STAGE the high byte of the FONTS
1584 MOV AX,FPKT ;;
1585 INC SI ;; byte by byte
1586 DEC CX ;;
1587 MOV cs:fonts_hib,AL ;;
1588 MOV cs:stage,FDLEN_LOBX ;;
1589 JMP FTB_LOOP ;;
1590 ;;+++++++++++++++++++++++++++++++++
1591FDLENLO : ;; the low byte of the FONT-LENGTH
1592 MOV AX,FPKT ;;
1593 INC SI ;; byte by byte
1594 DEC CX ;;
1595 AND CX,CX ;;
1596 JNZ WORD_FDLEN ;;
1597 MOV cs:fdlen_lob,AL ;;
1598 MOV cs:stage,FDLEN_HIBX ;;
1599 JMP FTB_LOOP ;;
1600WORD_FDLEN : ;;
1601 INC SI ;;
1602 DEC CX ;;
1603 MOV cs:pre_font_len,PRE_FONT_ND;;
1604 MOV cs:fdlen_word,AX ;;
1605 AND AX,AX ;;
1606 JZ NO_DISP_PTR ;;
1607 CMP cs:type_word,TYPE_DISPLAY ;;
1608 JE DISPLAY_TYPE1 ;;
1609 CMP cs:type_word,TYPE_PRINTER ;;
1610 JE PRINTER_TYPE1 ;;
1611 ;;
1612NO_DISP_PTR : ;;
1613 MOV cs:stage,FOUNDX ;; FSTAT is to be changed
1614 JMP FTB_LOOP ;;
1615DISPLAY_TYPE1 : ;;
1616 MOV cs:stage,DISP_ROWSX ;;
1617 JMP FTB_LOOP ;;
1618PRINTER_TYPE1 : ;;
1619 MOV cs:stage,PTRSELLOX ;;
1620 JMP FTB_LOOP ;;
1621 ;;
1622 ;;+++++++++++++++++++++++++++++++++
1623FDLENHI : ;; STAGE the high byte of the F-LENGTH
1624 MOV cs:pre_font_len,PRE_FONT_ND
1625 MOV AX,FPKT ;;
1626 INC SI ;; byte by byte
1627 DEC CX ;;
1628 MOV cs:fdlen_hib,AL ;;
1629 MOV AX,cs:fdlen_word ;;
1630 AND AX,AX ;;
1631 JZ NO_DISP_PTR2 ;;
1632 CMP cs:type_word,TYPE_DISPLAY ;;
1633 JE DISPLAY_TYPE2 ;;
1634 CMP cs:type_word,TYPE_PRINTER ;;
1635 JE PRINTER_TYPE2 ;;
1636NO_DISP_PTR2: ;;
1637 MOV cs:stage,FOUNDX ;; FSTAT is to be changed
1638 JMP FTB_LOOP ;;
1639DISPLAY_TYPE2 : ;;
1640 MOV cs:stage,DISP_ROWSX ;;
1641 JMP FTB_LOOP ;;
1642PRINTER_TYPE2 : ;;
1643 MOV cs:stage,PTRSELLOX ;;
1644 JMP FTB_LOOP ;;
1645 ;;
1646 ;;+++++++++++++++++++++++++++++++++
1647DSPROWS : ;; STAGE : get the rows
1648 XOR AX,AX ;;
1649 MOV cs:disp_rows,AL ;;
1650 MOV cs:disp_cols,AL ;;
1651 MOV cs:DISP_X,AL ;;
1652 MOV cs:disp_y,AL ;;
1653 MOV cs:count_word,AX ;;
1654 ;;
1655 INC cs:pre_font_len ;;
1656 MOV AX,FPKT ;;
1657 INC SI ;;
1658 DEC CX ;;
1659 MOV cs:disp_rows,AL ;;
1660 MOV AX,cs:fdlen_word ;;
1661 DEC AX ;;
1662 MOV cs:fdlen_word,AX ;;
1663 JZ NO_DISP_FONT3 ;;
1664 MOV cs:stage,disp_colsX ;;
1665 JMP FTB_LOOP ;;
1666NO_DISP_FONT3 : ;;
1667 MOV cs:stage,FOUNDX ;; FSTAT is to be changed
1668 JMP FTB_LOOP ;;
1669 ;;+++++++++++++++++++++++++++++++++
1670DSPCOLS : ;; STAGE : get the COLS
1671 INC cs:pre_font_len ;;
1672 MOV AX,FPKT ;;
1673 INC SI ;;
1674 DEC CX ;;
1675 MOV cs:disp_cols,AL ;;
1676 MOV AX,cs:fdlen_word ;;
1677 DEC AX ;;
1678 MOV cs:fdlen_word,AX ;;
1679 JZ NO_DISP_FONT3 ;;
1680 MOV cs:stage,DISP_XX ;;
1681 JMP FTB_LOOP ;;
1682 ;;+++++++++++++++++++++++++++++++++
1683DSPX : ;; STAGE : get the aspect X
1684 INC cs:pre_font_len ;;
1685 MOV AX,FPKT ;;
1686 INC SI ;;
1687 DEC CX ;;
1688 MOV DISP_X,AL ;;
1689 MOV AX,cs:fdlen_word ;;
1690 DEC AX ;;
1691 MOV cs:fdlen_word,AX ;;
1692 JZ NO_DISP_FONT3 ;;
1693 MOV cs:stage,DISP_YX ;;
1694 JMP FTB_LOOP ;;
1695 ;;+++++++++++++++++++++++++++++++++
1696DSPY : ;; STAGE : get the aspect Y
1697 INC cs:pre_font_len ;;
1698 MOV AX,FPKT ;;
1699 INC SI ;;
1700 DEC CX ;;
1701 MOV cs:disp_y,AL ;;
1702 MOV AX,cs:fdlen_word ;;
1703 DEC AX ;;
1704 MOV cs:fdlen_word,AX ;;
1705 JZ NO_DISP_FONT3 ;;
1706 MOV cs:stage,COUNT_LOBX ;;
1707 JMP FTB_LOOP ;;
1708 ;;
1709 ;;+++++++++++++++++++++++++++++++++
1710DSPCOUNTLO : ;; the low byte of the FONT-LENGTH
1711 INC cs:pre_font_len ;;
1712 MOV AX,FPKT ;;
1713 INC SI ;; byte by byte
1714 DEC CX ;;
1715 PUSH AX ;; check if length is enough
1716 MOV AX,cs:fdlen_word ;;
1717 DEC AX ;;
1718 MOV cs:fdlen_word,AX ;;
1719 POP AX ;;
1720 JNZ A_WORD_COUNT ;;
1721 JMP NO_DISP_FONT3 ;;
1722A_WORD_COUNT : ;;
1723 AND CX,CX ;;
1724 JNZ WORD_COUNT ;;
1725 MOV cs:count_lob,AL ;;
1726 MOV cs:stage,COUNT_HIBX ;;
1727 JMP FTB_LOOP ;;
1728WORD_COUNT : ;;
1729 INC cs:pre_font_len ;;
1730 INC SI ;;
1731 DEC CX ;;
1732 MOV cs:count_word,AX ;;
1733; MOV cs:pre_font_len,PRE_FONT_D;
1734 ;;
1735 MOV AX,cs:fdlen_word ;;
1736 DEC AX ;;
1737 MOV cs:fdlen_word,AX ;;
1738 MOV cs:stage,FOUNDX ;; FSTAT is to be changed
1739 JMP FTB_LOOP ;;
1740 ;;
1741 ;;+++++++++++++++++++++++++++++++++
1742DSPCOUNTHI : ;; STAGE the high byte of the F-LENGTH
1743 INC cs:pre_font_len ;;
1744 MOV AX,FPKT ;;
1745 INC SI ;; byte by byte
1746 DEC CX ;;
1747 MOV cs:count_hib,AL ;;
1748; MOV cs:pre_font_len,PRE_FONT_D;
1749 ;;
1750 MOV AX,cs:fdlen_word ;;
1751 DEC AX ;;
1752 MOV cs:fdlen_word,AX ;;
1753 MOV cs:stage,FOUNDX ;; FSTAT is to be changed
1754 JMP FTB_LOOP ;;
1755 ;;
1756 ;;
1757 ;;+++++++++++++++++++++++++++++++++
1758PTRSELLO : ;; the low byte of the SELECTION_TYPE
1759 INC cs:pre_font_len ;;
1760 MOV AX,FPKT ;;
1761 INC SI ;; byte by byte
1762 DEC CX ;;
1763 PUSH AX ;; check if length is enough
1764 MOV AX,cs:fdlen_word ;;
1765 DEC AX ;;
1766 MOV cs:fdlen_word,AX ;;
1767 POP AX ;;
1768 JNZ A_WORD_SEL ;;
1769 JMP NO_PTR_FONT3 ;;
1770A_WORD_SEL : ;;
1771 AND CX,CX ;;
1772 JNZ WORD_SEL ;;
1773 MOV cs:ptr_selob,AL ;;
1774 MOV cs:stage,PTRSELHIX ;;
1775 JMP FTB_LOOP ;;
1776WORD_SEL : ;;
1777 INC cs:pre_font_len ;;
1778 INC SI ;;
1779 DEC CX ;;
1780 MOV cs:ptr_sel_word,AX ;;
1781 ;;
1782 MOV AX,cs:fdlen_word ;;
1783 DEC AX ;;
1784 MOV cs:fdlen_word,AX ;;
1785 ;;
1786 CMP cs:ptr_sel_word,0 ;;
1787 JNE PTR_SEL_NOT0 ;;
1788 ;;
1789 ;;
1790 MOV cs:stage,FOUNDX ;; FSTAT is to be changed
1791 JMP FTB_LOOP ;;
1792 ;;
1793PTR_SEL_NOT0 : ;;
1794 MOV cs:stage,PTRLENLOX ;;
1795 JMP FTB_LOOP ;;
1796 ;;
1797 ;;+++++++++++++++++++++++++++++++++
1798PTRSELHI: ;; STAGE the high byte of SELECT_TYPE
1799 INC cs:pre_font_len ;;
1800 MOV AX,FPKT ;;
1801 INC SI ;; byte by byte
1802 DEC CX ;;
1803 MOV cs:ptr_sehib,AL ;;
1804 ;;
1805 MOV AX,cs:fdlen_word ;;
1806 DEC AX ;;
1807 MOV cs:fdlen_word,AX ;;
1808 ;;
1809 CMP cs:ptr_sel_word,0 ;;
1810 JNE PTR_SEL_NOT0 ;;
1811 ;;
1812 ;;
1813 MOV cs:stage,FOUNDX ;; FSTAT is to be changed
1814 JMP FTB_LOOP ;;
1815 ;;
1816 ;;
1817 ;;+++++++++++++++++++++++++++++++++
1818PTRLENLO : ;; the low byte of SELECTION_LENGTH
1819 INC cs:pre_font_len ;;
1820 MOV AX,FPKT ;;
1821 INC SI ;; byte by byte
1822 DEC CX ;;
1823 PUSH AX ;; check if length is enough
1824 MOV AX,cs:fdlen_word ;;
1825 DEC AX ;;
1826 MOV cs:fdlen_word,AX ;;
1827 POP AX ;;
1828 JNZ A_WORD_SELEN ;;
1829 JMP NO_PTR_FONT3 ;;
1830A_WORD_SELEN : ;;
1831 AND CX,CX ;;
1832 JNZ WORD_SELEN ;;
1833 MOV cs:ptr_lnlob,AL ;;
1834 MOV cs:stage,PTRLENHIX ;;
1835 JMP FTB_LOOP ;;
1836WORD_SELEN : ;;
1837 INC cs:pre_font_len ;;
1838 INC SI ;;
1839 DEC CX ;;
1840 MOV cs:ptr_len_word,AX ;;
1841 ;;
1842 MOV AX,cs:fdlen_word ;;
1843 DEC AX ;;
1844 MOV cs:fdlen_word,AX ;;
1845 MOV cs:stage,FOUNDX ;; FSTAT is to be changed
1846 JMP FTB_LOOP ;;
1847 ;;
1848 ;;+++++++++++++++++++++++++++++++++
1849PTRLENHI : ;; STAGE the high byte of SELECT_LENGTH
1850 INC cs:pre_font_len ;;
1851 MOV AX,FPKT ;;
1852 INC SI ;; byte by byte
1853 DEC CX ;;
1854 MOV cs:ptr_lnhib,AL ;;
1855 ;;
1856 MOV AX,cs:fdlen_word ;;
1857 DEC AX ;;
1858 MOV cs:fdlen_word,AX ;;
1859 MOV cs:stage,FOUNDX ;; FSTAT is to be changed
1860 JMP FTB_LOOP ;;
1861 ;;
1862NO_PTR_FONT3 : ;;
1863 MOV cs:stage,FOUNDX ;; FSTAT is to be changed
1864 JMP FTB_LOOP ;;
1865 ;;+++++++++++++++++++++++++++++++++
1866PASS : ;; STAGE - PASS DUMMY BYTES
1867 ;;
1868 PUSH DX ;;
1869 PUSH ES ;;
1870 PUSH DI ;;
1871 ;;
1872 PUSH CS ;;
1873 POP ES ;;
1874 MOV DI,OFFSET PASS_BRK ;;
1875 MOV DX,PASS_INDX ;;
1876 MOV AX,cs:pass_cnt ;;
1877 ;;
1878NEXT_BRK: ;; find the next pass-break
1879 CMP AX,ES:[DI] ;;
1880 ;;
1881 JB UPTO_BRK ;;
1882 ;;
1883 DEC DX ;;
1884 JZ PASS_ERR ;;
1885 INC DI ;;
1886 INC DI ;;
1887 JMP NEXT_BRK ;;
1888 ;;
1889UPTO_BRK : ;; next break point found
1890 MOV DX,ES:[DI] ;;
1891 SUB DX,AX ;; bytes to be skipped
1892 CMP CX,DX ;; all to be skipped ?
1893 JAE PASS_ALL ;;
1894 ;;
1895 ADD cs:pass_cnt,CX ;;
1896 ADD SI,CX ;;
1897 SUB CX,CX ;;
1898 JMP PASS_END ;;
1899 ;;
1900PASS_ALL : ;;
1901 ADD cs:pass_cnt,DX ;;
1902 ADD SI,DX ;;
1903 SUB CX,DX ;;
1904 ;;
1905 MOV AX,cs:pass_postx ;;
1906 MOV cs:stage,AX ;;
1907 ;;
1908; cmp ax,passx ;; is the next stage a pass-stage ?
1909; jne not_passx ;;
1910; mov ax,pass_postxx ;;
1911; mov pass_postx,ax ;;
1912; mov pass_postxx,stage_max ;; can support only 2 consecutive pass
1913 ;;
1914;not_passx : ;;
1915 ;;
1916 JMP PASS_END ;;
1917 ;;
1918PASS_ERR : ;; DEVICE ERROR, wrong stage
1919 POP DI ;;
1920 POP ES ;;
1921 POP DX ;;
1922 MOV FTP.FTB_STATUS,STAT_DEVERR
1923 SUB CX,CX ;; ignore all the input string
1924 JMP PASS_DONE ;;
1925 ;;
1926PASS_END : ;;
1927 POP DI ;;
1928 POP ES ;;
1929 POP DX ;;
1930PASS_DONE : ;;
1931 JMP FTB_LOOP ;;
1932 ;;
1933;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1934 ;;
1935FTB_LPEND : ;;
1936 ;;
1937 CMP cs:stage,FOUNDX ;;
1938 JNE NOT_FOUNDX ;;
1939 ;;
1940 CALL FOUND_DO ;;
1941 ;;
1942NOT_FOUNDX : ;;
1943 ;;
1944 POP CX ;; STACK -1
1945 ;;
1946FP_RET : ;;
1947 POP SI ;; restore registers
1948 POP DI ;;
1949 POP DX ;;
1950 POP CX ;;
1951 POP BX ;;
1952 POP AX ;;
1953 POP ES ;;
1954 POP DS ;;
1955 ;;
1956 RET ;;
1957FONT_PARSER ENDP ;;
1958 ;;
1959;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1960CSEG ENDS
1961 END
diff --git a/v4.0/src/DEV/PRINTER/CPSFONT3.ASM b/v4.0/src/DEV/PRINTER/CPSFONT3.ASM
new file mode 100644
index 0000000..74fa12b
--- /dev/null
+++ b/v4.0/src/DEV/PRINTER/CPSFONT3.ASM
@@ -0,0 +1,1961 @@
1
2 PAGE ,132
3
4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5;;
6;; FILENAME: CPS Device Driver -- Font Parser
7;; MODULE NAME: CPSFONT
8;; TYPE: Font Parser Module
9;; LINK PROCEDURE: Link CPS+CPSSUB+CPSINT9+...+CPSINIT into .EXE format
10;; CPS must be first. CPSINIT must be last. Everything
11;; before CPSINIT will be resident.
12;; INCLUDE FILES:
13;; CPSPEQU.INC
14;;
15;;
16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
17 ;;
18INCLUDE CPSPEQU.INC ;;
19 ;;
20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
21 ;;
22CSEG SEGMENT PUBLIC 'CODE' ;;
23 ASSUME CS:CSEG ;;
24 ASSUME DS:NOTHING ;;
25 ;;
26PUBLIC FTABLE,FONT_PARSER ;;
27 ;;
28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
29;;
30;; ************************************
31;; ** **
32;; ** Resident Code **
33;; ** **
34;; ************************************
35;;
36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
37 ;;
38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
39;;
40;; FONT_PARSER data
41;;
42;; -- Interface table : FTABLE
43;;
44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
45FTABLE: FBUFS <0FFFFH,,,> ;; for temporary testing
46FTB1 FTBLK <,,,,,,,,,,,,> ;; -- at most 12 entries
47FTB2 FTBLK <,,,,,,,,,,,,> ;;
48FTB3 FTBLK <,,,,,,,,,,,,> ;;
49FTB4 FTBLK <,,,,,,,,,,,,> ;;
50FTB5 FTBLK <,,,,,,,,,,,,> ;;
51FTB6 FTBLK <,,,,,,,,,,,,> ;;
52FTB7 FTBLK <,,,,,,,,,,,,> ;;
53FTB8 FTBLK <,,,,,,,,,,,,> ;;
54FTB9 FTBLK <,,,,,,,,,,,,> ;;
55FTBa FTBLK <,,,,,,,,,,,,> ;;
56FTBb FTBLK <,,,,,,,,,,,,> ;;
57FTBc FTBLK <,,,,,,,,,,,,> ;;
58 ;;
59FP_ERROR DW 0000H ;; internal error register
60 ;;
61 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
62 ;; the followings are bytes accumulated
63 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
64FTAG_LEN EQU 8 ;; FILE TAGE in the font file header
65FTAG_COUNT DW 0000H ;;
66 ;;
67FTAG_PATTERN LABEL BYTE ;;
68 DB 0FFH ;;
69 DB 'FONT ' ;;
70 ;;
71 ;;
72 ;; POINTER in the font file header
73fptr_LOW LABEL WORD ;;
74fptr_LOL DB 00H ;; NEXT
75fptr_LOH DB 00H ;;
76fptr_HIGH LABEL WORD ;;
77fptr_HIL DB 00H ;;
78fptr_HIH DB 00H ;;
79 ;;
80 ;;
81 ;;
82ENTRY_WORD LABEL WORD ;;
83ENTRY_LOB DB 00H ;; ENTRY COUNT
84ENTRY_HIB DB 00H ;;
85NEXT_LOW LABEL WORD ;;
86NEXT_LOL DB 00H ;; NEXT
87NEXT_LOH DB 00H ;;
88NEXT_HIGH LABEL WORD ;;
89NEXT_HIL DB 00H ;;
90NEXT_HIH DB 00H ;;
91TYPE_WORD LABEL WORD ;;
92TYPE_LOB DB 00H ;; TYPE
93TYPE_HIB DB 00H ;;
94TID_CNT DW 00000H ;; TYPEID COUNT(0 to 8)
95TYPE_ID : DB ' ' ;; TYPEID
96CPG_WORD LABEL WORD ;;
97CPG_LOB DB 00H ;; CODE PAGE
98CPG_HIB DB 00H ;;
99FONT_LOW LABEL WORD ;;
100FONT_LOL DB 00H ;; FONT ADDRESS
101FONT_LOH DB 00H ;;
102FONT_HIGH LABEL WORD ;;
103FONT_HIL DB 00H ;;
104FONT_HIH DB 00H ;;
105;; the followings are contained in the font-block in the exact order & length
106MOD_WORD LABEL WORD ;;
107MOD_LOB DB 00H ;; MODIFIER
108MOD_HIB DB 00H ;;
109FONTS_WORD LABEL WORD ;;
110FONTS_LOB DB 00H ;; FONTS
111FONTS_HIB DB 00H ;;
112FDLEN_WORD LABEL WORD ;;
113FDLEN_LOB DB 00H ;; FONT DATA LENGTH
114FDLEN_HIB DB 00H ;;
115PRE_FONT_ND EQU ($-MOD_WORD) ;; used to update target for font data
116 ;; to follow. -- for NON-DISPLAY
117DISP_ROWS DB 00H ;; DISPLAY's parameters :
118DISP_COLS DB 00H ;; BOX SIZE
119DISP_X DB 00H ;; ASPECT RATIO
120DISP_Y DB 00H ;;
121COUNT_WORD LABEL WORD ;; NO. OF DISPLAY CHARACTERS
122COUNT_LOB DB 00H ;;
123COUNT_HIB DB 00H ;;
124PRE_FONT_D EQU ($-MOD_WORD) ;; used to update target for font data
125 ;; to follow. -- for DISPLAY
126 ;;
127PTR_SEL_WORD LABEL WORD ;;
128PTR_SELOB DB 00H ;;
129PTR_SEHIB DB 00H ;;
130PRE_FONT_P0 EQU ($-PTR_SELOB+PRE_FONT_ND) ;; to update target for font data
131 ;; to follow -- for PRINTER with
132 ;; selection type = 0.
133 ;;
134PTR_LEN_WORD LABEL WORD ;;
135PTR_LNLOB DB 00H ;;
136PTR_LNHIB DB 00H ;;
137PRE_FONT_P EQU ($-PTR_SELOB+PRE_FONT_ND) ;; to update target for font data
138 ;; to follow -- for PRINTER with
139 ;; selection type <> 0.
140 ;;
141 ;;
142;; also update STAGE_CASES and indexing constants
143 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
144 ;; the stage the parsing is in : ;;;;;
145 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
146 ;;
147STAGE_CASES LABEL WORD ;; the stage the parsing is in :
148 ;;
149 ;; *** INDEXED BY STAGE-INDEX
150 ;;
151 DW OFFSET ENTRYLO ;; 0
152 DW OFFSET ENTRYHI ;; 1
153 DW OFFSET NEXTLOL ;; 2
154 DW OFFSET NEXTLOH ;; 3
155 DW OFFSET NEXTHIL ;; 4
156 DW OFFSET NEXTHIH ;; 5
157 DW OFFSET TYPELO ;; 6
158 DW OFFSET TYPEHI ;; 7
159 DW OFFSET TYPEIDS ;; 8
160 DW OFFSET CPGLO ;; 9
161 DW OFFSET CPGHI ;; A
162 DW OFFSET FONTLOL ;; B
163 DW OFFSET FONTLOH ;; C
164 DW OFFSET FONTHIL ;; D
165 DW OFFSET FONTHIH ;; E
166 DW 00H ;; MATCH case -- end of SEARCH stages
167 DW 00H ;; SCAN case -- before PRE-FOUND stage
168 DW OFFSET MODLO ;; 11
169 DW OFFSET MODHI ;; 12
170 DW OFFSET FONTSLO ;; 13
171 DW OFFSET FONTSHI ;; 14
172 DW OFFSET FDLENLO ;; 15
173 DW OFFSET FDLENHI ;; 16 -- lead to FONT case,NON- DISPLAY
174 DW OFFSET DSPROWS ;; 17 -- DISPLAY only
175 DW OFFSET DSPCOLS ;; 18
176 DW OFFSET DSPX ;; 19
177 DW OFFSET DSPY ;; 1A
178 DW OFFSET DSPCOUNTLO ;; 1B
179 DW OFFSET DSPCOUNTHI ;; 1C -- lead to FONT case, DISPLAY
180 DW OFFSET PTRSELLO ;; 1D -- PRINTER only
181 DW OFFSET PTRSELHI ;; 1E
182 DW OFFSET PTRLENLO ;; 1F
183 DW OFFSET PTRLENHI ;; 20 -- lead to FONT case, PRINTER
184 DW 00H ;; FOUND case
185 DW 00H ;; GET_FONT case
186 DW 00H ;; PASS special stage
187 DW OFFSET FILETAG ;; 24
188 DW OFFSET fptrLOL ;; 25
189 DW OFFSET fptrLOH ;; 26
190 DW OFFSET fptrHIL ;; 27
191 DW OFFSET fptrHIH ;; 28
192 DW 00H ;; FPTR_SKIP_CASE
193 ;;
194 ;; The followings are individual stage
195STAGE_MAX EQU ($-STAGE_CASES)/2 ;; number of stages
196 ;;
197 ;; STAGE-INDEX
198 ;;
199 ;; **** INDEX TO STAGE_CASES ****
200ENTRY_LOX EQU 00H ;;
201ENTRY_HIX EQU 01H ;;
202NEXT_LOLX EQU 02H ;; NEXT
203NEXT_LOHX EQU 03H ;;
204NEXT_HILX EQU 04H ;;
205NEXT_HIHX EQU 05H ;;
206TYPE_LOBX EQU 06H ;; TYPE
207TYPE_HIBX EQU 07H ;;
208TYPE_IDX EQU 08H ;; TYPEID
209CPG_LOBX EQU 09H ;; CODE PAGE
210CPG_HIBX EQU 0AH ;;
211FONT_LOLX EQU 0BH ;; FONT ADDRESS
212FONT_LOHX EQU 0CH ;;
213FONT_HILX EQU 0DH ;;
214FONT_HIHX EQU 0EH ;;
215 ;; ------------------------------
216MATCHX EQU 0FH ;; MATCH is the end of SEARCH's stages
217SCANX EQU 10H ;; SCANX is before the PRE-FOUND stages
218 ;; ------------------------------
219MOD_LOBX EQU 11H ;; MODIFIER
220MOD_HIBX EQU 12H ;;
221FONTS_LOBX EQU 13H ;; FONTS
222FONTS_HIBX EQU 14H ;;
223FDLEN_LOBX EQU 15H ;; FONT DATA LENGTH
224FDLEN_HIBX EQU 16H ;;
225DISP_ROWSX EQU 17H ;; DISPLAY -- CHAR. SIZE
226DISP_COLSX EQU 18H ;;
227DISP_XX EQU 19H ;; DISPLAY -- ASPECT RATIO
228DISP_YX EQU 1AH ;;
229COUNT_LOBX EQU 1BH ;; DISPLAY -- COUNT
230COUNT_HIBX EQU 1CH ;;
231PTRSELLOX EQU 1DH ;;
232PTRSELHIX EQU 1EH ;;
233PTRLENLOX EQU 1FH ;;
234PTRLENHIX EQU 20H ;;
235 ;;
236 ;; ------------------------------
237FOUNDX EQU 21H ;; GET_FX is the end of PRE-FOUND stage
238GET_FX EQU 22H ;;
239 ;; ------------------------------
240PASSX EQU 23H ;; see pass_brk table
241 ;; ------------------------------
242FTAGX EQU 24H ;; RESTART ==> FILE TAG
243 ;;
244fptr_LOLX EQU 25H ;; POINTER in font file header
245fptr_LOHX EQU 26H ;;
246fptr_HILX EQU 27H ;;
247fptr_HIHX EQU 28H ;; ---------------------------------
248 ;;
249fptr_SKIPX EQU 29H ;; ==> ENTRY_LOX
250 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
251 ;; PASS -- to skip some bytes ;;;;;;
252 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
253 ;; the PASS mechanism is used to skip
254 ;; a number of bytes between two fields
255 ;; The numbers are tabulated in
256 ;; PASS_BRK table in the accumulative
257 ;; sum. The PASS_POSTX(and PASS_POSTXX)
258 ;; are used to tell what is the stage
259 ;; after all the bytes have skipped.
260 ;;
261PASS_POSTX DW STAGE_MAX ;; the stage after pass-stage
262 ;;
263FILE_OFFSET EQU 0BH ;; spaces to be skipped in font file :
264 ;; ( after TAG, before POINTER)
265 ;;
266PASS_CNT DW 0 ;;
267PASS_BRK LABEL WORD ;;
268 DW FILE_OFFSET ;; skip in the font file header
269 DW FILE_OFFSET+2 ;; pass header-length, needs to reset
270 ;; PASS_CNT for each of the font_header
271 DW FILE_OFFSET+8 ;; pass header-reserved bytes
272PASS_INDX EQU ($-PASS_BRK)/2 ;;
273 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
274 ;; the control variables : ;;;;;;;;
275 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
276STAGE DW STAGE_MAX ;; of the STAGE-INDEX
277 ;;
278Pre_font_len DW 00000H ;; no. of bytes before the FONT DATA
279 ;;
280 ;;
281COUNT_LO DW 00000H ;; no. of bytes parsed so far
282COUNT_hI DW 00000H ;;
283 ;;
284HIT_LO DW 00000H ;; the next byte that is addressed by :
285HIT_HI DW 00000H ;; either NEXT or TARGET in FTBLK.
286 ;;
287HIT_FLAG DW 00000H ;; IF ZERO, the NEXT is approaching
288HIT_BX DW 00000H ;; where FTB is found for nearest hit
289 ;;
290NUM_FTB DW 00000H ;; as defined in the FP_BUFFER
291 ;;
292;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
293;;
294;; FONT_PARSER routine
295;;
296;; -- to be called at every packet received to extract informations
297;; from Font File on byte basis.
298;;
299;; -- Interface though FTABLE
300;;
301;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
302 ;;
303FONT_PARSER PROC ;;
304 PUSH DS ;; save all registers Revised
305 PUSH ES ;;
306 PUSH AX ;;
307 PUSH BX ;;
308 PUSH CX ;;
309 PUSH DX ;;
310 PUSH DI ;;
311 PUSH SI ;;
312 ;; BP isn't used, so it isn't saved
313 LEA BX,FTABLE ;;
314 PUSH CS ;;
315 POP ES ;; ES:[BX]
316 LDS SI,FTP.BUFFER_ADDR ;; DS:[SI]
317 MOV CX,FTP.BUFFER_LEN ;; CX = length of packet
318 MOV DX,FTP.NUM_FTBLK ;; DX = number of FTB
319 MOV cs:num_ftb,DX ;;
320 AND DX,DX ;;
321 JNZ VALID_BUFFER ;;
322 MOV cs:fp_error,0020H ;; ERROR 0020H
323 JMP FP_RET ;;
324VALID_BUFFER : ;;
325 MOV AX,FTP.FLAG ;;
326 AND AX,FLAG_RESTART ;;
327 Jnz has_RESTART ;;
328 JMP NO_RESTART ;;
329 ;;
330 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
331has_restart : ;;
332 PUSH BX ;; reset all the output fields
333 ADD BX,TYPE FBUFS ;; FTP = FONT BLOCK
334 XOR AX,AX ;;
335 ;;
336 MOV cs:ftag_count,AX ;;
337 MOV cs:fptr_low,AX ;;
338 MOV cs:fptr_high,AX ;;
339 MOV cs:pre_font_len,AX ;;
340 MOV cs:count_lo,AX ;;
341 MOV cs:count_hi,AX ;;
342 MOV cs:next_low,AX ;;
343 MOV cs:next_high,AX ;;
344 MOV cs:hit_lo,AX ;;
345 MOV cs:hit_hi,AX ;;
346 MOV cs:hit_flag,AX ;;
347 MOV cs:pass_cnt,AX ;;
348 MOV cs:pass_postx,STAGE_MAX ;;
349 ;;
350 MOV cs:stage,STAGE_MAX ;;
351 ;;
352RESET_FTB : ;;
353 MOV FTP.FTB_STATUS,FSTAT_SEARCH
354 MOV FTP.FTB_TYPE,AX ;;
355 MOV FTP.FTB_MOD,AX ;;
356 MOV FTP.FTB_FONTS,AX ;;
357 MOV FTP.FTB_ROWS,AL ;;
358 MOV FTP.FTB_COLS,AL ;;
359 MOV FTP.FTB_X,AL ;;
360 MOV FTP.FTB_Y,AL ;;
361 MOV FTP.FTB_COUNT,AX ;;
362 MOV FTP.FTB_DLEFT,AX ;;
363 MOV FTP.FTB_DLEN,AX ;;
364 MOV FTP.FTB_DALO,AX ;;
365 MOV FTP.FTB_DAHI,AX ;;
366 MOV FTP.TARGET_LO,AX ;;
367 MOV FTP.TARGET_HI,AX ;;
368 ;;
369 ADD BX, TYPE FTBLK ;;
370 ;;
371 DEC DX ;;
372 AND DX,DX ;;
373 JNZ RESET_FTB ;;
374 ;;
375 POP BX ;;
376NO_RESTART : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
377 ;; any FTBLKs have their data all
378 ;; returned ? if so set their status
379 ;; from FOUND to COMPLETE
380 PUSH BX ;;
381 ADD BX,TYPE FBUFS ;; FTP = FONT BLOCK
382 ;;
383 MOV DX,cs:num_ftb ;;
384 ;;
385SET_COMPLETE : ;;
386 MOV AX,FTP.FTB_STATUS ;;
387 CMP AX,FSTAT_FONT ;;
388 JNE SET_NEXT ;;
389 ;;
390 MOV AX,FTP.FTB_DLEFT ;;
391 AND AX,AX ;;
392 JNZ SET_NEXT ;;
393 ;;
394 MOV FTP.FTB_STATUS,FSTAT_COMPLETE
395 ;;
396SET_NEXT : ;;
397 ;;
398 ADD BX,TYPE FTBLK ;;
399 ;;
400 DEC DX ;;
401 AND DX,DX ;;
402 JNZ SET_COMPLETE ;;
403 ;;
404 POP BX ;;
405 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
406 ADD BX,TYPE FBUFS ;; FTP = FONT BLOCK
407 ;;
408 PUSH CX ;; STACK 1 = CX
409;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
410;;
411;; DO WHILE CX is not zero :
412;;
413;; -- on each loop, the CX, COUNTs are updated
414;;
415;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
416 ;;
417 ;;
418FTB_LOOP : ;;
419 POP AX ;; STACK -1
420 SUB AX,CX ;;
421 ADD cs:count_lo,AX ;;
422 JNC NO_CARRY ;;
423 ADD cs:count_hi,1000H ;;
424NO_CARRY : ;;
425 PUSH CX ;; STACK 1 = CX
426 AND CX,CX ;;
427 JNZ FTB_CONT ;;
428 JMP FTB_LPEND ;;
429 ;; DO CASES :
430FTB_CONT : ;; ==========
431 ;;
432 MOV AX,cs:stage ;;
433 ;;
434 CMP AX,STAGE_MAX ;;
435 JNE FTB_010 ;;
436 JMP START_CASE ;; ** RESTART **
437 ;;
438FTB_010 : ;;
439 CMP AX,MATCHX ;;
440 JAE FTB_020 ;;
441 JMP SEARCH_CASE ;; ** SEARCH **
442 ;;
443FTB_020 : ;;
444 CMP AX,MATCHX ;;
445 JNE FTB_030 ;;
446 JMP MATCH_CASE ;; ** MATCH **
447 ;;
448FTB_030 : ;;
449 CMP AX,SCANX ;;
450 JNE FTB_040 ;;
451 JMP SCAN_CASE ;; ** SCAN **
452 ;;
453FTB_040 : ;;
454 CMP AX,FOUNDX ;;
455 JAE FTB_050 ;;
456 JMP PRE_FOUND_CASE ;; ** PRE-FOUND **
457 ;;
458FTB_050 : ;;
459 CMP AX,FOUNDX ;;
460 JNE FTB_060 ;;
461 JMP FOUND_CASE ;; ** FOUND **
462 ;;
463FTB_060 : ;;
464 CMP AX,GET_FX ;;
465 JNE FTB_070 ;;
466 JMP GETFONT_CASE ;; ** GET_FONT **
467 ;;
468FTB_070 : ;;
469 CMP AX,PASSX ;;
470 JNE FTB_080 ;;
471 JMP PASS ;; ** PASS **
472 ;;
473FTB_080 : ;;
474 CMP AX,FPTR_SKIPX ;;
475 JAE FTB_090 ;;
476 JMP SEARCH_CASE ;; ** SEARCH **
477 ;;
478FTB_090 : ;;
479 CMP AX,FPTR_SKIPX ;;
480 JNE FTB_FFF ;;
481 JMP FPTR_SKIP_CASE ;; ** SEARCH **
482 ;;
483FTB_FFF : ;;
484 MOV FTP.FTB_STATUS,STAT_DEVERR
485 JMP FTB_LPEND ;; ** DEVICE ERROR **
486 ;;
487;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
488;;
489;; at the entry of each STAGES /CASES
490;;
491;; -- DS:[SI] (FPKT) points to PACKET, of DOS's buffer
492;; -- CX remaining packet length
493;; -- ES:[BX] points to the first FTBLK
494;; -- COUNT_LO, COUNT_HI, upto but and including the address pointed by FPKT
495;;
496;;
497;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
498 ;;
499;============================================================================
500START_CASE : ;; pass the FILE leading bytes
501 ;;
502 MOV cs:ftag_count,0 ;;
503 MOV cs:stage,ftagx ;;
504 JMP FTB_LOOP ;;
505 ;;
506;=============================================================================
507FPTR_SKIP_CASE : ;; skip until the ENTRY pointed by
508 ;; POINTER (in FPTR) is reached.
509 ;;
510 ;; **************
511 MOV AX,cs:fptr_low ;; * HIT = FPTR *
512 MOV cs:hit_lo,AX ;; **************
513 MOV DX,cs:fptr_high ;;
514 MOV cs:hit_hi,DX ;;
515 ;;
516 CMP AX,0FFFFH ;;
517 JNE FPTR_SKIP_VALID ;;
518 CMP DX,0FFFFH ;;
519 JNE FPTR_SKIP_VALID ;;
520 ;;
521 MOV FTP.FTB_STATUS,STAT_BADATA ;; returned at the first FTBLK
522 JMP FPTR_SKIP_MORE ;;
523 ;;
524FPTR_SKIP_VALID : ;;
525 ;; normalised HIT_HI, HIT_LO
526 MOV AX,DX ;;
527 AND AX,00FFFH ;;
528 PUSH CX ;;
529 MOV CX,4 ;;
530 SHL AX,CL ;;
531 POP CX ;;
532 AND DX,0F000H ;;
533 ADD AX,cs:hit_lo ;;
534 JNC NO_CARRY10 ;;
535 ADD DX,01000H ;;
536NO_CARRY10: ;;
537 MOV cs:hit_lo,AX ;;
538 MOV cs:hit_hi,DX ;;
539 ;; **************************
540 ;; * compare FPTR and COUNT *
541 ;; **************************
542 ;; DX:AX = HIT_HI:HIT_LO (normalised)
543 ;;
544 SUB AX,cs:count_lo ;;
545 Jnc more_fptrlo ;;
546 sub dx,01000h ;;
547 jc fptr_bad ;;
548 ;;
549more_fptrlo : ;;
550 SUB DX,cs:count_hi ;;
551 JC fptr_BAD ;;
552 ;;
553 INC AX ;; COUNT can be at the HIT, then AX=0
554 JNC NO_CARRY11 ;; INC AX to make AX comparable to CX
555 ADD DX,01000H ;; i.e. AX = offset + 1
556 ;;
557NO_CARRY11: ;;
558 CMP AX,CX ;;
559 JA fptr_skip_more ;; AX > CX, whole CX to be skipped
560 ;;
561 PUSH DX ;; normalise dx:ax
562 AND DX,00FFFH ;;
563 PUSH CX ;;
564 MOV CX,4 ;;
565 SHL DX,CL ;;
566 POP CX ;;
567 ADD AX,DX ;;
568 POP DX ;;
569 JNC NO_CARRY13 ;;
570 ADD DX,01000H ;;
571NO_CARRY13: ;;
572 AND DX,0F000H ;;
573 ;;
574 PUSH AX ;;
575 PUSH DX ;; STACK +1 : normalosed DX:AX
576 SUB AX,CX ;;
577 JNC NO_BORROW11 ;;
578 SUB DX,1000H ;;
579 JC fptr_MORE_CXp ;; dx:ax < cx
580NO_BORROW11: ;;
581 ;; dx:ax >= cx
582 AND AX,AX ;;
583 JNE fptr_skip_MOREP ;;
584 AND DX,DX ;;
585 JNE fptr_skip_MOREP ;;
586 ;; dx:ax = cx, or
587 ;; offset + 1 = CX
588 ;;
589 ;; ************************************
590 ;; * POINTER is within the current CX *
591 ;; ************************************
592fptr_MORE_CXP : ;;
593 POP DX ;;
594 POP AX ;; STACK -1
595 ;;
596fptr_MORE_CX : ;; DX = 0,to have more CX than offset+1
597 DEC AX ;; = offset : 0 and above
598 SUB CX,AX ;;
599 ADD SI,AX ;; where the first byte is
600 ;;
601 MOV cs:stage,entry_lox ;; ENTRIES in the font file
602 ;;
603 JMP FTB_LOOP ;; ****** RETURN *******
604 ;;
605 ;; ***********************************
606 ;; * more to skip ==> FPTR_SKIP_CASE *
607 ;; ***********************************
608fptr_skip_morep: ;;
609 POP DX ;;
610 POP AX ;; STACK -1
611 ;;
612fptr_skip_more : ;;
613 ADD SI,CX ;;
614 SUB CX,CX ;;
615 JMP FTB_LOOP ;; ****** RETURN *****
616 ;;
617 ;; ***********************************
618 ;; * bad POINTER in font file header *
619 ;; ***********************************
620 ;;
621fptr_bad : ;;
622 MOV cs:fptr_low,0FFFFH ;;
623 MOV cs:fptr_high,0FFFFH ;;
624 ;;
625 MOV FTP.FTB_STATUS,STAT_BADATA ;; returned at the first FTBLK
626 ;;
627 JMP FPTR_SKIP_MORE ;;
628 ;;
629;=============================================================================
630SEARCH_CASE : ;;
631 ;; still looking for header to match
632 ;; the input : codepage and typeid
633 ;;
634 MOV DI,cs:stage ;;
635 ;;
636 ADD DI,DI ;; double to index to WORD-offset
637 ;;
638 JMP CS:STAGE_CASES[DI] ;; call routine to process the stage
639 ;;
640 ;;
641;===========================================================================
642MATCH_CASE : ;;
643 ;;
644 PUSH BX ;;
645 MOV DX,cs:num_ftb ;;
646 ;;
647 ;;
648MATCH_LOOP : ;;
649 MOV AX,FTP.FTB_STATUS ;;
650 CMP AX,FSTAT_SEARCH ;;
651 JE MATCH_SEARCH ;;
652 JMP MATCH_NEXT ;;
653 ;;
654MATCH_SEARCH : ;;
655 MOV AX,FTP.FTB_CP ;; check the FTB with SEARCH status
656 CMP AX,cs:cpg_word ;;
657 JNE MATCH_MORE ;;
658 PUSH DS ;; code page matched
659 PUSH SI ;;
660 PUSH CX ;;
661 ;;
662 PUSH CS ;;
663 POP DS ;;
664 MOV SI,OFFSET TYPE_ID ;;
665 LEA DI,[BX].FTB_TID ;;
666 MOV CX,8 ;;
667 REPE CMPSB ;;
668 ;;
669 POP CX ;;
670 POP SI ;;
671 POP DS ;;
672 ;;
673 JNE MATCH_MORE ;;
674 ;; MATCH !!!!! (type_id matched)
675 MOV FTP.FTB_STATUS,FSTAT_MATCH
676 MOV AX,cs:type_word ;;
677 MOV FTP.FTB_TYPE,AX ;;
678 MOV AX,cs:font_low ;;
679 MOV FTP.TARGET_LO,AX ;;
680 MOV AX,cs:font_high ;;
681 MOV FTP.TARGET_HI,AX ;;
682 ;;
683 JMP MATCH_NEXT ;;
684 ;;
685MATCH_MORE : ;; if this is the last rounf ?
686 ;;
687 MOV AX,cs:next_low ;; NEXT = FFFF:FFFF means no more
688 CMP AX,-1 ;; header to come.
689 JNE MATCH_NEXT ;;
690 ;;
691 MOV AX,cs:next_high ;;
692 CMP AX,-1 ;;
693 JNE MATCH_NEXT ;;
694 ;;
695 MOV FTP.FTB_STATUS,STAT_NOFIND ;; ERROR : no match
696 ;;
697MATCH_NEXT : ;;
698 ADD BX,FTP.FTB_LENGTH ;;
699 DEC DX ;;
700 AND DX,DX ;;
701 JZ MATCH_ALL ;;
702 JMP MATCH_LOOP ;;
703 ;;
704MATCH_ALL : ;;
705 MOV cs:stage,SCANX ;;
706 ;;
707MATCH_DONE : ;;
708 POP BX ;;
709 JMP FTB_LOOP ;;
710 ;;
711;===========================================================================
712SCAN_CASE : ;;
713 ;; **********************************
714 ;; * determine whether it the font *
715 ;; * data(TARGET),or the next font *
716 ;; * header(NEXT) that is approaching
717 ;; **********************************
718 ;;
719 MOV AX,cs:next_low ;;
720 MOV cs:hit_lo,AX ;;
721 MOV AX,cs:next_high ;;
722 MOV cs:hit_hi,AX ;;
723 XOR AX,AX ;;
724 MOV cs:hit_flag,AX ;;
725 ;;
726 MOV DI,cs:hit_hi ;; normalised HIT_HI, HIT_LO
727 MOV AX,DI ;;
728 AND AX,00FFFH ;;
729 PUSH CX ;;
730 MOV CX,4 ;;
731 SHL AX,CL ;;
732 POP CX ;;
733 AND DI,0F000H ;;
734 ADD AX,cs:hit_lo ;;
735 JNC NO_CARRY2 ;;
736 ADD DI,01000H ;;
737NO_CARRY2 : ;;
738 MOV cs:hit_lo,AX ;;
739 MOV cs:hit_hi,DI ;;
740 ;;
741 MOV DX,cs:num_ftb ;;
742 ;;
743 PUSH BX ;;
744SCAN_LOOP : ;;
745 MOV AX,FTP.FTB_STATUS ;;
746 CMP AX,FSTAT_MATCH ;;
747 JNE SCAN_NEXT ;;
748 ;;
749 ;;
750 MOV DI,FTP.TARGET_HI ;; NORMALISED TARGET
751 MOV AX,DI ;;
752 AND AX,00FFFH ;;
753 PUSH CX ;;
754 MOV CX,4 ;;
755 SHL AX,CL ;;
756 POP CX ;;
757 AND DI,0F000H ;;
758 ADD AX,FTP.TARGET_LO ;;
759 JNC NO_CARRY1 ;;
760 ADD DI,01000H ;;
761NO_CARRY1 : ;; DI:AX = NORMALISED TARGET
762 ;;
763 ;; ** compare the TARGET and the NEXT
764 ;;
765 CMP DI,cs:hit_hi ;;
766 JA SCAN_NEXT ;;
767 ;;
768 JE SCAN_EQU ;;
769 JMP NEAR_FONT ;;
770 ;;
771SCAN_EQU : ;;
772 CMP AX,cs:hit_lo ;;
773 JA SCAN_NEXT ;;
774 JE SCAN_ERROR_CHK ;;
775 ;; **********************************
776 ;; * the font data is approaching *
777 ;; **********************************
778NEAR_FONT : ;;
779 MOV cs:hit_flag,-1 ;;
780 MOV cs:hit_lo,AX ;;
781 MOV cs:hit_hi,DI ;;
782 MOV cs:hit_bx,BX ;; used for BAD_BX and in FOUND_CASE
783 JMP SCAN_NEXT ;;
784 ;;
785 ;; **********************************
786 ;; * the NEXT header is approaching *
787 ;; **********************************
788SCAN_ERROR_CHK : ;;
789 MOV AX,cs:hit_flag ;;
790 AND AX,AX ;;
791 JNZ SCAN_NEXT ;;
792 MOV FTP.FTB_STATUS,STAT_BADATA ;; next header and font cannot be the
793 ;; same
794 ;;
795SCAN_NEXT : ;;
796 DEC DX ;;
797 AND DX,DX ;;
798 JZ SCAN_DONE ;;
799 ;;
800 ADD BX,FTP.FTB_LENGTH ;;
801 JMP SCAN_LOOP ;; ** is there any closer font data ?
802 ;;
803 ;; ************************************
804 ;; * the HIT is either font data(TARGET
805 ;; * or the font block (NEXT). *
806 ;; ************************************
807SCAN_DONE : ;;
808 POP BX ;;
809 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
810 MOV DX,cs:hit_hi ;; HIT_FLAG, HIT_LO, HIT_HI defined
811 MOV AX,cs:hit_lo ;;
812 ;;
813 CMP AX,0FFFFH ;;
814 JNE NOT_FFFF_HIT ;;
815 CMP DX,0FFFFH ;;
816 JNE NOT_FFFF_HIT ;;
817 JMP SCAN_MORE ;; stage remained as SCAN, discard data
818 ;;
819NOT_FFFF_HIT : ;;
820 ;; DX:AX = HIT_HI:HIT_LO (normalised)
821 SUB AX,cs:count_lo ;;
822 JNC NO_BORROW ;;
823 SUB DX,01000H ;;
824 JC SCAN_BAD ;;
825NO_BORROW: ;;
826 SUB DX,cs:count_hi ;;
827 JC SCAN_BAD ;;
828 ;;
829 INC AX ;; COUNT can be at the HIT, then AX=0
830 JNC NO_CARRYX ;; INC AX to make AX comparable to CX
831 ADD DX,01000H ;; i.e. AX = offset + 1
832 ;;
833NO_CARRYX : ;;
834 CMP AX,CX ;;
835 JA SCAN_MORE ;;
836 ;;
837 PUSH DX ;;
838 AND DX,00FFFH ;;
839 PUSH CX ;;
840 MOV CX,4 ;;
841 SHL DX,CL ;;
842 POP CX ;;
843 ADD AX,DX ;;
844 POP DX ;;
845 JNC NO_CARRY3 ;;
846 ADD DX,01000H ;;
847NO_CARRY3 : ;;
848 AND DX,0F000H ;;
849 ;;
850 ;;
851 PUSH AX ;;
852 PUSH DX ;;
853 SUB AX,CX ;;
854 JNC NO_BORROW1 ;;
855 SUB DX,1000H ;;
856 JC MORE_CXp ;;
857NO_BORROW1 : ;;
858 ;; dx:ax >= cx
859 AND AX,AX ;;
860 JNE SCAN_MOREP ;;
861 AND DX,DX ;;
862 JNE SCAN_MOREP ;;
863 ;;
864 ;; offset + 1 = CX
865 ;;
866MORE_CXP : ;;
867 POP DX ;;
868 POP AX ;;
869 ;;
870MORE_CX : ;; DX = 0,to have more CX than offset+1
871 DEC AX ;; = offset : 0 and above
872 SUB CX,AX ;;
873 ADD SI,AX ;; where the first byte is
874 MOV AX,cs:hit_flag ;;
875 AND AX,AX ;;
876 JE NEXT_REACHED ;;
877 ;;
878 MOV cs:stage,MOD_LOBX ;; font-data reached,
879 ;;
880 JMP FTB_LOOP ;; ****** RETURN *******
881 ;;
882NEXT_REACHED : ;;
883 MOV cs:stage,PASSX ;;
884 MOV cs:pass_postx,next_lolX ;;
885 MOV cs:pass_cnt,FILE_OFFSET ;;
886 ;;
887 ;;
888 JMP FTB_LOOP ;; ****** RETURN *******
889 ;;
890 ;; ***********************************
891SCAN_MOREP : ;; * scan more FTBLK for the nearest *
892 ;; * font data *
893 ;; ***********************************
894 POP DX ;;
895 POP AX ;;
896 ;;
897SCAN_MORE : ;;
898 ADD SI,CX ;;
899 SUB CX,CX ;;
900 JMP FTB_LOOP ;; more SCAN stage
901 ;;
902SCAN_BAD: ;; *************************
903 MOV AX,cs:hit_flag ;; * scan is bad *
904 AND AX,AX ;; *************************
905 JNZ BAD_BX ;;
906 MOV AX,-1 ;; NEXT is pointing backwards
907 MOV cs:next_low,AX ;;
908 MOV cs:next_high,AX ;; no more NEXT
909 MOV FTP.FTB_STATUS,STAT_BADATA ;; returned at the first FTBLK
910 JMP FTB_LOOP ;;
911 ;;
912BAD_BX : ;;
913 PUSH BX ;; FONT is pointing backwards
914 MOV BX,cs:hit_bx ;;
915 MOV FTP.FTB_STATUS,STAT_BADATA
916 POP BX ;;
917 JMP FTB_LOOP ;;
918 ;;
919;===========================================================================
920PRE_FOUND_CASE : ;;
921 ;; extract informations from the font
922 ;; block until font_length is defined
923 ;;
924 MOV DI,cs:stage ;;
925 ;;
926 ADD DI,DI ;; double to index to WORD-offset
927 ;;
928 JMP CS:STAGE_CASES[DI] ;; call routine to process the stage
929 ;;
930;===========================================================================
931FOUND_CASE : ;;
932 MOV DI,OFFSET FTB_LOOP ;; as FOUND has two places to return to
933 PUSH DI ;;
934;===========================================================================
935FOUND_DO : ;;
936 ;; define informations into FTBLK of
937 ;; HIT_BX defined in the SCAN case
938 PUSH BX ;;
939 MOV BX,cs:hit_bx ;;
940 ;; FTBLK :
941 MOV AX,cs:mod_word ;;
942 MOV FTP.FTB_MOD,AX ;;
943 MOV AX,cs:fonts_word ;;
944 MOV FTP.FTB_FONTS,AX ;;
945 ;;
946 MOV AX,cs:fdlen_word ;;
947 MOV FTP.FTB_DLEFT,AX ;;
948 MOV FTP.FTB_DLEN,0 ;;
949 MOV FTP.FTB_DALO,0 ;;
950 MOV FTP.FTB_DAHI,0 ;;
951 ;;
952 MOV FTP.FTB_STATUS,FSTAT_FOUND
953 ;;
954 CMP FTP.FTB_TYPE,TYPE_DISPLAY;
955 JNE CHECK_PTR_TYPE ;;
956 CMP cs:pre_font_len,PRE_FONT_D ;;
957 JNE DISPLAY_BAD ;;
958 JMP DISPLAY_DONE ;;
959 ;;
960CHECK_PTR_TYPE : ;;
961 CMP FTP.FTB_TYPE,TYPE_PRINTER;
962 JNE SET_STAGE ;;
963 CMP cs:ptr_sel_word,0 ;;
964 JNE PRINTER_HAS_SEL ;;
965 CMP cs:pre_font_len,PRE_FONT_P0;;
966 JNE PRINTER_BAD ;;
967 JMP PRINTER_DONE ;;
968 ;;
969PRINTER_HAS_SEL : ;;
970 CMP cs:pre_font_len,PRE_FONT_P ;;
971 JNE PRINTER_BAD ;;
972 JMP PRINTER_DONE ;;
973 ;;
974DISPLAY_BAD : ;;
975 ;;
976 MOV FTP.FTB_STATUS,STAT_BADATA ;the FDLEN_WORD should be 0.
977 ;;
978DISPLAY_DONE : ;;
979 MOV AL,cs:disp_rows ;;
980 MOV FTP.FTB_ROWS,AL ;;
981 MOV AL,cs:disp_cols ;;
982 MOV FTP.FTB_COLS,AL ;;
983 MOV AL,cs:disp_x ;;
984 MOV FTP.FTB_X,AL ;;
985 MOV AL,cs:disp_y ;;
986 MOV FTP.FTB_Y,AL ;;
987 MOV AX,cs:count_word ;;
988 MOV FTP.FTB_COUNT,AX ;;
989 JMP SET_STAGE ;;
990 ;;
991PRINTER_BAD : ;;
992 ;;
993 MOV FTP.FTB_STATUS,STAT_BADATA ;the FDLEN_WORD should be 0.
994 ;;
995PRINTER_DONE : ;;
996 MOV AX,cs:ptr_sel_word ;;
997 MOV FTP.FTB_SELECT,AX ;;
998 MOV AX,cs:ptr_len_word ;;
999 MOV FTP.FTB_SELLEN,AX ;;
1000 ;;
1001SET_STAGE : ;; STAGE :
1002 MOV AX,cs:fdlen_word ;; if no font data to follow
1003 AND AX,AX ;;
1004 JNZ GET_FDATA ;;
1005 MOV cs:stage,SCANX ;; then scan for next header or font
1006 JMP FONT_RET ;;
1007 ;;
1008GET_FDATA : ;; update the moving target
1009 MOV cs:stage,GET_FX ;;
1010 MOV AX,cs:pre_font_len ;;
1011 ADD FTP.TARGET_LO,AX ;;
1012 JNC FONT_RET ;;
1013 ADD FTP.TARGET_HI,01000H ;;
1014 ;;
1015FONT_RET : ;;
1016 POP BX ;;
1017 RET ;;
1018 ;;
1019;===========================================================================
1020GETFONT_CASE : ;; as ES:[SI], at COUNT, there is font
1021 ;; data
1022 MOV DX,cs:num_ftb ;;
1023 PUSH BX ;;
1024 ;;
1025 MOV cs:hit_hi,0 ;; temp. register
1026 MOV cs:hit_flag,0 ;; assumed can be changed to SCAN stage
1027 ;;
1028 MOV DI,cs:count_hi ;; normalised COUNT_HI,COUNT_LO
1029 MOV AX,DI ;;
1030 AND AX,00FFFH ;;
1031 PUSH CX ;;
1032 MOV CX,4 ;;
1033 SHL AX,CL ;;
1034 POP CX ;;
1035 AND DI,0F000H ;;
1036 ADD AX,cs:count_lo ;;
1037 JNC NO_CARRY4 ;;
1038 ADD DI,01000H ;;
1039NO_CARRY4 : ;;
1040 MOV cs:count_lo,AX ;;
1041 MOV cs:count_hi,DI ;;
1042 ;;
1043 ;;
1044GETFONT_LOOP : ;;
1045 MOV AX,FTP.FTB_STATUS ;;
1046 CMP AX,FSTAT_FONT ;;
1047 JE GETFONT_CONT ;;
1048 ;;
1049 CMP AX,FSTAT_FOUND ;;
1050 JE GETFONT_FOUND ;;
1051 ;;
1052 JMP NEXT_GETFONT ;;
1053 ;;
1054GETFONT_FOUND : ;;
1055 MOV AX,FTP.FTB_DLEFT ;;
1056 AND AX,AX ;;
1057 JZ NEXT_GF ;;
1058 MOV FTP.FTB_STATUS,FSTAT_FONT;
1059 JMP GETFONT_CONT1 ;;
1060 ;;
1061 ;;
1062GETFONT_CONT : ;;
1063 MOV AX,FTP.FTB_DLEFT ;;
1064 AND AX,AX ;;
1065 JNZ GETFONT_CONT1 ;;
1066NEXT_GF : ;;
1067 JMP NEXT_GETFONT ;;
1068 ;; only on FOUND and DLEFT <> 0
1069GETFONT_CONT1: ;;
1070 MOV DI,FTP.TARGET_HI ;; normalised TARGET
1071 MOV AX,DI ;;
1072 AND AX,00FFFH ;;
1073 PUSH CX ;;
1074 MOV CX,4 ;;
1075 SHL AX,CL ;;
1076 POP CX ;;
1077 AND DI,0F000H ;;
1078 ADD AX,FTP.TARGET_LO ;;
1079 JNC NO_CARRY5 ;;
1080 ADD DI,01000H ;;
1081NO_CARRY5 : ;; DI:AX = TARGET (normalised)
1082 ;;
1083 CMP DI,cs:count_hi ;;
1084 JB GETFONT_BAD ;;
1085 JNE NEXT_GETFONT ;;
1086 CMP AX,cs:count_lo ;;
1087 JB GETFONT_BAD ;;
1088 JNE NEXT_GETFONT ;;
1089 ;;
1090 MOV FTP.FTB_DALO,SI ;; where the font data is in the packet
1091 MOV FTP.FTB_DAHI,DS ;;
1092 ;;
1093 MOV AX,FTP.FTB_DLEFT ;;
1094 CMP AX,CX ;;
1095 JAE UPTO_CX ;;
1096 ;; upto FDLEFT
1097 MOV FTP.FTB_DLEFT,0 ;;
1098 MOV FTP.FTB_DLEN,AX ;;
1099 CMP cs:hit_hi,AX ;;
1100 JNB NOT_HIGHER0 ;;
1101 MOV cs:hit_hi,AX ;;
1102NOT_HIGHER0 : ;;
1103 ADD FTP.TARGET_LO,AX ;;
1104 JNC NEXT_GETFONT ;;
1105 ADD FTP.TARGET_HI,01000H ;;
1106 JMP NEXT_GETFONT ;;
1107 ;;
1108GETFONT_BAD : ;;
1109 MOV FTP.FTB_STATUS,STAT_BADATA ;; pointing backwards
1110 JMP NEXT_GETFONT ;;
1111 ;;
1112UPTO_CX : ;;
1113 SUB AX,CX ;;
1114 MOV FTP.FTB_DLEFT,AX ;;
1115 MOV FTP.FTB_DLEN,CX ;;
1116 MOV cs:hit_hi,CX ;;
1117 ADD FTP.TARGET_LO,CX ;;
1118 JNC NO_CARRYOVER ;;
1119 ADD FTP.TARGET_HI,01000H ;;
1120NO_CARRYOVER : ;;
1121 AND AX,AX ;; all data have been returned ?
1122 JZ NEXT_GETFONT ;;
1123 ;;
1124 MOV cs:hit_flag,-1 ;; no ! stay in the GET_FONT stage
1125 ;;
1126NEXT_GETFONT : ;;
1127 ADD BX,FTP.FTB_LENGTH ;;
1128 DEC DX ;;
1129 AND DX,DX ;;
1130 JZ GETFONT_END ;;
1131 JMP GETFONT_LOOP ;;
1132 ;;
1133GETFONT_END : ;;
1134 MOV AX,cs:hit_hi ;;
1135 ADD SI,AX ;;
1136 SUB CX,AX ;;
1137 ;;
1138 CMP cs:hit_flag,0 ;;
1139 Jne GETFONT_DONE ;;
1140 MOV cs:stage,SCANX ;; no more in the GET_FONT stage
1141 ;;
1142 ;;
1143GETFONT_DONE : ;;
1144 POP BX ;;
1145 JMP FTB_LOOP ;;
1146 ;;
1147;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1148;;
1149;; STAGES -- "called by" SERACH_CASE
1150;;
1151;; -- DS:[SI] (FPKT) points to PACKET, of DOS's buffer
1152;; -- CX remaining packet length
1153;; -- ES:[BX] points to the first FTBLK
1154;; -- COUNT_LO, COUNT_HI, upto but not including the address pointed by FPKT
1155;;
1156;;
1157;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1158 ;;+++++++++++++++++++++++++++++++++
1159filetag : ;;
1160 ;;
1161; mov ax,ftag_len ;;
1162 cmp cs:ftag_count,ftag_len ;;
1163 jB valid_ftag ;;
1164 JE FTAG_FAILED ;;
1165 ;;
1166 mov ftp.ftb_status,stat_deverr
1167 mov cs:fp_error,00022H ;; ERROR 0022H
1168 ;;
1169FTAG_FAILED : ;; discard all the bytes, while
1170 ADD SI,CX ;; stage stays as FTAGX
1171 SUB CX,CX ;;
1172 JMP FTB_LOOP ;; **** RETURN (bytes discarded) ****
1173 ;;
1174VALID_FTAG : ;;
1175 MOV AX,FPKT ;;
1176 INC SI ;;
1177 DEC CX ;;
1178 ;;
1179 MOV DI,cs:ftag_count ;;
1180 CMP AL,cs:ftag_pattern[DI] ;;
1181 JE FTAG_NEXTB ;;
1182 ;;
1183 mov ftp.ftb_status,stat_badata
1184 MOV ax,ftag_len ;; stays in FTAGX to consume all bytes
1185 MOV cs:ftag_count,ax ;; stays in FTAGX to consume all bytes
1186 JMP FTB_LOOP ;; **** RETURN (FAILED !) ****
1187 ;;
1188FTAG_NEXTB : ;;
1189 INC DI ;;
1190 MOV cs:ftag_count,DI ;;
1191 ;;
1192 CMP DI,ftag_len ;;
1193 JE FTAG_DONE ;;
1194 ;;
1195 JMP FTB_LOOP ;; **** RETURN ( MORE TO COME) ****
1196 ;;
1197FTAG_DONE : ;;
1198 MOV cs:pass_cnt,0 ;;
1199 MOV cs:stage,PASSX ;;
1200 MOV cs:pass_postx,fptr_lolx ;;
1201 ;;
1202 JMP FTB_LOOP ;; **** NEXT STAGE ****
1203 ;;
1204 ;;+++++++++++++++++++++++++++++++++
1205fptrLOL : ;; STAGE the low byte of the low fptr
1206 MOV AX,FPKT ;;
1207 INC SI ;; byte by byte
1208 DEC CX ;;
1209 AND CX,CX ;;
1210 JNZ WORD_fptrLO ;;
1211 MOV cs:fptr_lol,AL ;;
1212 MOV cs:stage,fptr_lohX ;;
1213 JMP FTB_LOOP ;;
1214WORD_fptrLO : ;;
1215 INC SI ;;
1216 DEC CX ;;
1217 MOV cs:fptr_low,AX ;;
1218 MOV cs:stage,fptr_HILX ;;
1219 JMP FTB_LOOP ;;
1220 ;;+++++++++++++++++++++++++++++++++
1221fptrLOH : ;; STAGE the high byte of the low fptr
1222 MOV AX,FPKT ;;
1223 INC SI ;; byte by byte
1224 DEC CX ;;
1225 MOV cs:fptr_loh,AL ;;
1226 MOV cs:stage,fptr_HILX ;;
1227 JMP FTB_LOOP ;;
1228 ;;+++++++++++++++++++++++++++++++++
1229fptrHIL : ;; STAGE the low byte of the high fptr
1230 MOV AX,FPKT ;;
1231 INC SI ;; byte by byte
1232 DEC CX ;;
1233 AND CX,CX ;;
1234 JNZ WORD_fptrHI ;;
1235 MOV cs:fptr_hil,AL ;;
1236 MOV cs:stage,fptr_hihX ;;
1237 JMP FTB_LOOP ;;
1238WORD_fptrHI : ;;
1239 INC SI ;;
1240 DEC CX ;;
1241 MOV cs:fptr_high,AX ;;
1242 MOV cs:stage,FPTR_SKIPX ;;
1243 JMP FTB_LOOP ;;
1244 ;;+++++++++++++++++++++++++++++++++
1245fptrHIH : ;; STAGE the high byte of the high fptr
1246 MOV AX,FPKT ;;
1247 INC SI ;; byte by byte
1248 DEC CX ;;
1249 MOV cs:fptr_hih,AL ;;
1250 MOV cs:stage,FPTR_SKIPX ;;
1251 JMP FTB_LOOP ;;
1252 ;;+++++++++++++++++++++++++++++++++
1253ENTRYLO : ;; STAGE - ENTRY LOW BYTE
1254 MOV AX,FPKT ;;
1255 INC SI ;; byte by byte
1256 DEC CX ;;
1257 AND CX,CX ;;
1258 JNZ WORD_ENTRY ;;
1259 MOV cs:entry_lob,AL ;;
1260 MOV cs:stage,ENTRY_HIX ;;
1261 JMP FTB_LOOP ;;
1262WORD_ENTRY : ;;
1263 INC SI ;;
1264 DEC CX ;;
1265 MOV cs:entry_word,AX ;;
1266 MOV cs:stage,PASSX ;; 2 bytes to be passed
1267 MOV cs:pass_postx,NEXT_LOLX ;;
1268 JMP FTB_LOOP ;;
1269 ;;+++++++++++++++++++++++++++++++++
1270ENTRYHI : ;; stage - ENTRY HIGN BYTE
1271 MOV AX,FPKT ;;
1272 INC SI ;; byte by byte
1273 DEC CX ;;
1274 MOV cs:entry_hib,AL ;;
1275 MOV cs:stage,PASSX ;; 2 bytes to be passed
1276 MOV cs:pass_postx,NEXT_LOLX ;;
1277 AND CX,CX ;;
1278 JNZ ENTHI_PASS1 ;;
1279 JMP FTB_LOOP ;;
1280ENTHI_PASS1 : ;;
1281 INC SI ;;
1282 INC cs:pass_cnt ;;
1283 DEC CX ;;
1284 AND CX,CX ;;
1285 JNZ ENTHI_PASS2 ;;
1286 JMP FTB_LOOP ;;
1287ENTHI_PASS2 : ;;
1288 INC SI ;;
1289 INC cs:pass_cnt ;;
1290 DEC CX ;;
1291 MOV cs:stage,NEXT_LOLX ;;
1292 JMP FTB_LOOP ;;
1293 ;;+++++++++++++++++++++++++++++++++
1294NEXTLOL : ;; STAGE the low byte of the low NEXT
1295 MOV AX,FPKT ;;
1296 INC SI ;; byte by byte
1297 DEC CX ;;
1298 AND CX,CX ;;
1299 JNZ WORD_NEXTLO ;;
1300 MOV cs:next_lol,AL ;;
1301 MOV cs:stage,NEXT_LOHX ;;
1302 JMP FTB_LOOP ;;
1303WORD_NEXTLO : ;;
1304 INC SI ;;
1305 DEC CX ;;
1306 MOV cs:next_low,AX ;;
1307 MOV cs:stage,next_hilX ;;
1308 JMP FTB_LOOP ;;
1309 ;;+++++++++++++++++++++++++++++++++
1310NEXTLOH : ;; STAGE the high byte of the low NEXT
1311 MOV AX,FPKT ;;
1312 INC SI ;; byte by byte
1313 DEC CX ;;
1314 MOV cs:next_loh,AL ;;
1315 MOV cs:stage,next_hilX ;;
1316 JMP FTB_LOOP ;;
1317 ;;+++++++++++++++++++++++++++++++++
1318NEXTHIL : ;; STAGE the low byte of the high NEXT
1319 MOV AX,FPKT ;;
1320 INC SI ;; byte by byte
1321 DEC CX ;;
1322 AND CX,CX ;;
1323 JNZ WORD_NEXTHI ;;
1324 MOV cs:next_hil,AL ;;
1325 MOV cs:stage,NEXT_HIHX ;;
1326 JMP FTB_LOOP ;;
1327WORD_NEXTHI : ;;
1328 INC SI ;;
1329 DEC CX ;;
1330 MOV cs:next_high,AX ;;
1331 MOV cs:stage,type_lobX ;;
1332 JMP FTB_LOOP ;;
1333 ;;+++++++++++++++++++++++++++++++++
1334NEXTHIH : ;; STAGE the high byte of the high NEXT
1335 MOV AX,FPKT ;;
1336 INC SI ;; byte by byte
1337 DEC CX ;;
1338 MOV cs:next_hih,AL ;;
1339 MOV cs:stage,type_lobX ;;
1340 JMP FTB_LOOP ;;
1341 ;;+++++++++++++++++++++++++++++++++
1342TYPELO : ;; STAGE the low byte of the TYPE
1343 MOV AX,FPKT ;;
1344 INC SI ;; byte by byte
1345 DEC CX ;;
1346 AND CX,CX ;;
1347 JNZ WORD_TYPE ;;
1348 MOV cs:type_lob,AL ;;
1349 MOV cs:stage,type_hibX ;;
1350 JMP FTB_LOOP ;;
1351WORD_TYPE : ;;
1352 INC SI ;;
1353 DEC CX ;;
1354 MOV cs:type_word,AX ;;
1355 MOV cs:stage,type_idX ;;
1356 MOV cs:tid_cnt,0 ;;
1357 JMP FTB_LOOP ;;
1358 ;;+++++++++++++++++++++++++++++++++
1359TYPEHI : ;; STAGE the high byte of the TYPE
1360 MOV AX,FPKT ;;
1361 INC SI ;; byte by byte
1362 DEC CX ;;
1363 MOV cs:type_hib,AL ;;
1364 MOV cs:stage,TYPE_IDX ;;
1365 MOV cs:tid_cnt,0 ;;
1366 JMP FTB_LOOP ;;
1367 ;;+++++++++++++++++++++++++++++++++
1368TYPEIDS : ;; STAGE the type id
1369 CMP cs:tid_cnt,8 ;;
1370 JNA VALID_TID ;;
1371 MOV FTP.FTB_STATUS,STAT_DEVERR
1372 MOV cs:fp_error,00021H ;; ERROR 0021H
1373 ADD SI,CX ;;
1374 SUB CX,CX ;;
1375 JMP FTB_LOOP ;;
1376 ;;
1377VALID_TID : ;;
1378 MOV AX,8 ;;
1379 SUB AX,cs:tid_cnt ;;
1380 CMP CX,AX ;;
1381 JNB TID_ALL ;;
1382 ;; all data in FPKT are stored
1383 PUSH ES ;;
1384 PUSH CS ;;
1385 POP ES ;;
1386 ;;
1387 MOV DI,OFFSET TYPE_ID ;;
1388 ADD DI,cs:tid_cnt ;;
1389 ADD cs:tid_cnt,CX ;;
1390 REP MOVSB ;; SI is incremented accordingly
1391 POP ES ;;
1392 ;;
1393 MOV CX,0 ;; STAGE remained
1394 JMP FTB_LOOP ;;
1395TID_ALL : ;;
1396 PUSH CX ;;
1397 ;;
1398 PUSH ES ;;
1399 PUSH CS ;;
1400 POP ES ;;
1401 ;;
1402 MOV DI,OFFSET TYPE_ID ;;
1403 ADD DI,cs:tid_cnt ;;
1404 MOV CX,AX ;;
1405 REP MOVSB ;; SI is incremented accordingly
1406 POP ES ;;
1407 ;;
1408 ADD cs:tid_cnt,AX ;;
1409 POP CX ;;
1410 SUB CX,AX ;;
1411 ;;
1412 MOV cs:stage,CPG_LOBX ;;
1413 JMP FTB_LOOP ;;
1414 ;;+++++++++++++++++++++++++++++++++
1415CPGLO : ;; STAGE the low byte of the CODE PAGE
1416 MOV AX,FPKT ;;
1417 INC SI ;; byte by byte
1418 DEC CX ;;
1419 AND CX,CX ;;
1420 JNZ WORD_CPG ;;
1421 MOV cs:cpg_lob,AL ;;
1422 MOV cs:stage,CPG_HIBX ;;
1423 JMP FTB_LOOP ;;
1424WORD_CPG : ;;
1425 INC SI ;;
1426 DEC CX ;;
1427 MOV cs:cpg_word,AX ;;
1428 MOV cs:stage,PASSX ;;
1429 MOV cs:pass_postx,font_lolX ;;
1430 JMP FTB_LOOP ;;
1431 ;;+++++++++++++++++++++++++++++++++
1432CPGHI : ;; STAGE the high byte of the CODE PAGE
1433 MOV AX,FPKT ;;
1434 INC SI ;; byte by byte
1435 DEC CX ;;
1436 MOV cs:cpg_hib,AL ;;
1437 MOV cs:stage,PASSX ;;
1438 MOV cs:pass_postx,font_lolX ;;
1439 JMP FTB_LOOP ;;
1440 ;;+++++++++++++++++++++++++++++++++
1441FONTLOL : ;; STAGE the low byte of the low FONT
1442 MOV AX,FPKT ;;
1443 INC SI ;; byte by byte
1444 DEC CX ;;
1445 AND CX,CX ;;
1446 JNZ WORD_FONTLO ;;
1447 MOV cs:font_lol,AL ;;
1448 MOV cs:stage,FONT_LOHX ;;
1449 JMP FTB_LOOP ;;
1450WORD_FONTLO : ;;
1451 INC SI ;;
1452 DEC CX ;;
1453 MOV cs:font_low,AX ;;
1454 MOV cs:stage,FONT_HILX ;;
1455 JMP FTB_LOOP ;;
1456 ;;+++++++++++++++++++++++++++++++++
1457FONTLOH : ;; STAGE the high byte of the low FONT
1458 MOV AX,FPKT ;;
1459 INC SI ;; byte by byte
1460 DEC CX ;;
1461 MOV cs:font_loh,AL ;;
1462 MOV cs:stage,FONT_HILX ;;
1463 JMP FTB_LOOP ;;
1464 ;;+++++++++++++++++++++++++++++++++
1465FONTHIL : ;; STAGE the low byte of the high FONT
1466 MOV AX,FPKT ;;
1467 INC SI ;; byte by byte
1468 DEC CX ;;
1469 AND CX,CX ;;
1470 JNZ WORD_FONTHI ;;
1471 MOV cs:font_hil,AL ;;
1472 MOV cs:stage,FONT_HIHX ;;
1473 JMP FTB_LOOP ;;
1474WORD_FONTHI : ;;
1475 INC SI ;;
1476 DEC CX ;;
1477 MOV cs:font_high,AX ;;
1478;;;;;; MOV cs:stage,MOD_LOBX ;; end of SCAN
1479 ;; anymore headers to be processed ?
1480 MOV cs:stage,MATCHX ;;
1481 MOV AX,cs:entry_word ;;
1482 DEC AX ;;
1483 MOV cs:entry_word,AX ;;
1484 AND AX,AX ;;
1485 JNZ CHECK_NEXT ;;
1486 ;; no more header to be processed !
1487 MOV AX,-1 ;;
1488 MOV cs:next_low,AX ;;
1489 MOV cs:next_high,AX ;; as ENTRY has been consumed
1490 JMP FTB_LOOP ;;
1491 ;;
1492CHECK_NEXT : ;;
1493 MOV AX,cs:next_low ;;
1494 AND AX,AX ;;
1495 JNZ MORE_HEADER ;;
1496 MOV AX,cs:next_high ;;
1497 AND AX,AX ;;
1498 JNZ MORE_HEADER ;;
1499 ;; no more header to be processed !
1500 MOV AX,-1 ;;
1501 MOV cs:next_low,AX ;; as NEXT is nil
1502 MOV cs:next_high,AX ;;
1503 ;;
1504MORE_HEADER : ;;
1505 JMP FTB_LOOP ;;
1506 ;;+++++++++++++++++++++++++++++++++
1507FONTHIH : ;; STAGE the high byte of the high FONT
1508 MOV AX,FPKT ;;
1509 INC SI ;; byte by byte
1510 DEC CX ;;
1511 MOV cs:font_hih,AL ;;
1512;;;;; MOV cs:stage,MOD_LOBX ;; end of SCAN
1513 ;;
1514 MOV cs:stage,MATCHX ;;
1515 ;; anymore headers to be processed ?
1516 MOV AX,cs:entry_word ;;
1517 DEC AX ;;
1518 MOV cs:entry_word,AX ;;
1519 AND AX,AX ;;
1520 JNZ CHECK_NEXT0 ;;
1521 ;; no more header to be processed !
1522 MOV AX,-1 ;;
1523 MOV cs:next_low,AX ;;
1524 MOV cs:next_high,AX ;; as ENTRY has been consumed
1525 JMP FTB_LOOP ;;
1526 ;;
1527CHECK_NEXT0 : ;;
1528 MOV AX,cs:next_low ;;
1529 AND AX,AX ;;
1530 JNZ MORE_HEADER0 ;;
1531 MOV AX,cs:next_high ;;
1532 AND AX,AX ;;
1533 JNZ MORE_HEADER0 ;;
1534 ;; no more header to be processed !
1535 MOV AX,-1 ;;
1536 MOV cs:next_low,AX ;; as NEXT is nil
1537 MOV cs:next_high,AX ;;
1538 ;;
1539MORE_HEADER0 : ;;
1540 JMP FTB_LOOP ;;
1541 ;;
1542 ;;+++++++++++++++++++++++++++++++++
1543MODLO : ;; STAGE the low byte of the MODIFIER
1544 MOV AX,FPKT ;;
1545 INC SI ;; byte by byte
1546 DEC CX ;;
1547 AND CX,CX ;;
1548 JNZ WORD_MOD ;;
1549 MOV MOD_LOB,AL ;;
1550 MOV cs:stage,MOD_HIBX ;;
1551 JMP FTB_LOOP ;;
1552WORD_MOD : ;;
1553 INC SI ;;
1554 DEC CX ;;
1555 MOV cs:mod_word,AX ;;
1556 MOV cs:stage,fonts_lobX ;;
1557 JMP FTB_LOOP ;;
1558 ;;+++++++++++++++++++++++++++++++++
1559MODHI : ;; STAGE the high byte of the MODIFIER
1560 MOV AX,FPKT ;;
1561 INC SI ;; byte by byte
1562 DEC CX ;;
1563 MOV cs:mod_hib,AL ;;
1564 MOV cs:stage,FONTS_LOBX ;;
1565 JMP FTB_LOOP ;;
1566 ;;+++++++++++++++++++++++++++++++++
1567FONTSLO : ;; STAGE the low byte of the FONTS
1568 MOV AX,FPKT ;;
1569 INC SI ;; byte by byte
1570 DEC CX ;;
1571 AND CX,CX ;;
1572 JNZ WORD_FONTS ;;
1573 MOV cs:fonts_lob,AL ;;
1574 MOV cs:stage,FONTS_HIBX ;;
1575 JMP FTB_LOOP ;;
1576WORD_FONTS : ;;
1577 INC SI ;;
1578 DEC CX ;;
1579 MOV cs:fonts_word,AX ;;
1580 MOV cs:stage,FDLEN_LOBX ;;
1581 JMP FTB_LOOP ;;
1582 ;;+++++++++++++++++++++++++++++++++
1583FONTSHI : ;; STAGE the high byte of the FONTS
1584 MOV AX,FPKT ;;
1585 INC SI ;; byte by byte
1586 DEC CX ;;
1587 MOV cs:fonts_hib,AL ;;
1588 MOV cs:stage,FDLEN_LOBX ;;
1589 JMP FTB_LOOP ;;
1590 ;;+++++++++++++++++++++++++++++++++
1591FDLENLO : ;; the low byte of the FONT-LENGTH
1592 MOV AX,FPKT ;;
1593 INC SI ;; byte by byte
1594 DEC CX ;;
1595 AND CX,CX ;;
1596 JNZ WORD_FDLEN ;;
1597 MOV cs:fdlen_lob,AL ;;
1598 MOV cs:stage,FDLEN_HIBX ;;
1599 JMP FTB_LOOP ;;
1600WORD_FDLEN : ;;
1601 INC SI ;;
1602 DEC CX ;;
1603 MOV cs:pre_font_len,PRE_FONT_ND;;
1604 MOV cs:fdlen_word,AX ;;
1605 AND AX,AX ;;
1606 JZ NO_DISP_PTR ;;
1607 CMP cs:type_word,TYPE_DISPLAY ;;
1608 JE DISPLAY_TYPE1 ;;
1609 CMP cs:type_word,TYPE_PRINTER ;;
1610 JE PRINTER_TYPE1 ;;
1611 ;;
1612NO_DISP_PTR : ;;
1613 MOV cs:stage,FOUNDX ;; FSTAT is to be changed
1614 JMP FTB_LOOP ;;
1615DISPLAY_TYPE1 : ;;
1616 MOV cs:stage,DISP_ROWSX ;;
1617 JMP FTB_LOOP ;;
1618PRINTER_TYPE1 : ;;
1619 MOV cs:stage,PTRSELLOX ;;
1620 JMP FTB_LOOP ;;
1621 ;;
1622 ;;+++++++++++++++++++++++++++++++++
1623FDLENHI : ;; STAGE the high byte of the F-LENGTH
1624 MOV cs:pre_font_len,PRE_FONT_ND
1625 MOV AX,FPKT ;;
1626 INC SI ;; byte by byte
1627 DEC CX ;;
1628 MOV cs:fdlen_hib,AL ;;
1629 MOV AX,cs:fdlen_word ;;
1630 AND AX,AX ;;
1631 JZ NO_DISP_PTR2 ;;
1632 CMP cs:type_word,TYPE_DISPLAY ;;
1633 JE DISPLAY_TYPE2 ;;
1634 CMP cs:type_word,TYPE_PRINTER ;;
1635 JE PRINTER_TYPE2 ;;
1636NO_DISP_PTR2: ;;
1637 MOV cs:stage,FOUNDX ;; FSTAT is to be changed
1638 JMP FTB_LOOP ;;
1639DISPLAY_TYPE2 : ;;
1640 MOV cs:stage,DISP_ROWSX ;;
1641 JMP FTB_LOOP ;;
1642PRINTER_TYPE2 : ;;
1643 MOV cs:stage,PTRSELLOX ;;
1644 JMP FTB_LOOP ;;
1645 ;;
1646 ;;+++++++++++++++++++++++++++++++++
1647DSPROWS : ;; STAGE : get the rows
1648 XOR AX,AX ;;
1649 MOV cs:disp_rows,AL ;;
1650 MOV cs:disp_cols,AL ;;
1651 MOV cs:DISP_X,AL ;;
1652 MOV cs:disp_y,AL ;;
1653 MOV cs:count_word,AX ;;
1654 ;;
1655 INC cs:pre_font_len ;;
1656 MOV AX,FPKT ;;
1657 INC SI ;;
1658 DEC CX ;;
1659 MOV cs:disp_rows,AL ;;
1660 MOV AX,cs:fdlen_word ;;
1661 DEC AX ;;
1662 MOV cs:fdlen_word,AX ;;
1663 JZ NO_DISP_FONT3 ;;
1664 MOV cs:stage,disp_colsX ;;
1665 JMP FTB_LOOP ;;
1666NO_DISP_FONT3 : ;;
1667 MOV cs:stage,FOUNDX ;; FSTAT is to be changed
1668 JMP FTB_LOOP ;;
1669 ;;+++++++++++++++++++++++++++++++++
1670DSPCOLS : ;; STAGE : get the COLS
1671 INC cs:pre_font_len ;;
1672 MOV AX,FPKT ;;
1673 INC SI ;;
1674 DEC CX ;;
1675 MOV cs:disp_cols,AL ;;
1676 MOV AX,cs:fdlen_word ;;
1677 DEC AX ;;
1678 MOV cs:fdlen_word,AX ;;
1679 JZ NO_DISP_FONT3 ;;
1680 MOV cs:stage,DISP_XX ;;
1681 JMP FTB_LOOP ;;
1682 ;;+++++++++++++++++++++++++++++++++
1683DSPX : ;; STAGE : get the aspect X
1684 INC cs:pre_font_len ;;
1685 MOV AX,FPKT ;;
1686 INC SI ;;
1687 DEC CX ;;
1688 MOV DISP_X,AL ;;
1689 MOV AX,cs:fdlen_word ;;
1690 DEC AX ;;
1691 MOV cs:fdlen_word,AX ;;
1692 JZ NO_DISP_FONT3 ;;
1693 MOV cs:stage,DISP_YX ;;
1694 JMP FTB_LOOP ;;
1695 ;;+++++++++++++++++++++++++++++++++
1696DSPY : ;; STAGE : get the aspect Y
1697 INC cs:pre_font_len ;;
1698 MOV AX,FPKT ;;
1699 INC SI ;;
1700 DEC CX ;;
1701 MOV cs:disp_y,AL ;;
1702 MOV AX,cs:fdlen_word ;;
1703 DEC AX ;;
1704 MOV cs:fdlen_word,AX ;;
1705 JZ NO_DISP_FONT3 ;;
1706 MOV cs:stage,COUNT_LOBX ;;
1707 JMP FTB_LOOP ;;
1708 ;;
1709 ;;+++++++++++++++++++++++++++++++++
1710DSPCOUNTLO : ;; the low byte of the FONT-LENGTH
1711 INC cs:pre_font_len ;;
1712 MOV AX,FPKT ;;
1713 INC SI ;; byte by byte
1714 DEC CX ;;
1715 PUSH AX ;; check if length is enough
1716 MOV AX,cs:fdlen_word ;;
1717 DEC AX ;;
1718 MOV cs:fdlen_word,AX ;;
1719 POP AX ;;
1720 JNZ A_WORD_COUNT ;;
1721 JMP NO_DISP_FONT3 ;;
1722A_WORD_COUNT : ;;
1723 AND CX,CX ;;
1724 JNZ WORD_COUNT ;;
1725 MOV cs:count_lob,AL ;;
1726 MOV cs:stage,COUNT_HIBX ;;
1727 JMP FTB_LOOP ;;
1728WORD_COUNT : ;;
1729 INC cs:pre_font_len ;;
1730 INC SI ;;
1731 DEC CX ;;
1732 MOV cs:count_word,AX ;;
1733; MOV cs:pre_font_len,PRE_FONT_D;
1734 ;;
1735 MOV AX,cs:fdlen_word ;;
1736 DEC AX ;;
1737 MOV cs:fdlen_word,AX ;;
1738 MOV cs:stage,FOUNDX ;; FSTAT is to be changed
1739 JMP FTB_LOOP ;;
1740 ;;
1741 ;;+++++++++++++++++++++++++++++++++
1742DSPCOUNTHI : ;; STAGE the high byte of the F-LENGTH
1743 INC cs:pre_font_len ;;
1744 MOV AX,FPKT ;;
1745 INC SI ;; byte by byte
1746 DEC CX ;;
1747 MOV cs:count_hib,AL ;;
1748; MOV cs:pre_font_len,PRE_FONT_D;
1749 ;;
1750 MOV AX,cs:fdlen_word ;;
1751 DEC AX ;;
1752 MOV cs:fdlen_word,AX ;;
1753 MOV cs:stage,FOUNDX ;; FSTAT is to be changed
1754 JMP FTB_LOOP ;;
1755 ;;
1756 ;;
1757 ;;+++++++++++++++++++++++++++++++++
1758PTRSELLO : ;; the low byte of the SELECTION_TYPE
1759 INC cs:pre_font_len ;;
1760 MOV AX,FPKT ;;
1761 INC SI ;; byte by byte
1762 DEC CX ;;
1763 PUSH AX ;; check if length is enough
1764 MOV AX,cs:fdlen_word ;;
1765 DEC AX ;;
1766 MOV cs:fdlen_word,AX ;;
1767 POP AX ;;
1768 JNZ A_WORD_SEL ;;
1769 JMP NO_PTR_FONT3 ;;
1770A_WORD_SEL : ;;
1771 AND CX,CX ;;
1772 JNZ WORD_SEL ;;
1773 MOV cs:ptr_selob,AL ;;
1774 MOV cs:stage,PTRSELHIX ;;
1775 JMP FTB_LOOP ;;
1776WORD_SEL : ;;
1777 INC cs:pre_font_len ;;
1778 INC SI ;;
1779 DEC CX ;;
1780 MOV cs:ptr_sel_word,AX ;;
1781 ;;
1782 MOV AX,cs:fdlen_word ;;
1783 DEC AX ;;
1784 MOV cs:fdlen_word,AX ;;
1785 ;;
1786 CMP cs:ptr_sel_word,0 ;;
1787 JNE PTR_SEL_NOT0 ;;
1788 ;;
1789 ;;
1790 MOV cs:stage,FOUNDX ;; FSTAT is to be changed
1791 JMP FTB_LOOP ;;
1792 ;;
1793PTR_SEL_NOT0 : ;;
1794 MOV cs:stage,PTRLENLOX ;;
1795 JMP FTB_LOOP ;;
1796 ;;
1797 ;;+++++++++++++++++++++++++++++++++
1798PTRSELHI: ;; STAGE the high byte of SELECT_TYPE
1799 INC cs:pre_font_len ;;
1800 MOV AX,FPKT ;;
1801 INC SI ;; byte by byte
1802 DEC CX ;;
1803 MOV cs:ptr_sehib,AL ;;
1804 ;;
1805 MOV AX,cs:fdlen_word ;;
1806 DEC AX ;;
1807 MOV cs:fdlen_word,AX ;;
1808 ;;
1809 CMP cs:ptr_sel_word,0 ;;
1810 JNE PTR_SEL_NOT0 ;;
1811 ;;
1812 ;;
1813 MOV cs:stage,FOUNDX ;; FSTAT is to be changed
1814 JMP FTB_LOOP ;;
1815 ;;
1816 ;;
1817 ;;+++++++++++++++++++++++++++++++++
1818PTRLENLO : ;; the low byte of SELECTION_LENGTH
1819 INC cs:pre_font_len ;;
1820 MOV AX,FPKT ;;
1821 INC SI ;; byte by byte
1822 DEC CX ;;
1823 PUSH AX ;; check if length is enough
1824 MOV AX,cs:fdlen_word ;;
1825 DEC AX ;;
1826 MOV cs:fdlen_word,AX ;;
1827 POP AX ;;
1828 JNZ A_WORD_SELEN ;;
1829 JMP NO_PTR_FONT3 ;;
1830A_WORD_SELEN : ;;
1831 AND CX,CX ;;
1832 JNZ WORD_SELEN ;;
1833 MOV cs:ptr_lnlob,AL ;;
1834 MOV cs:stage,PTRLENHIX ;;
1835 JMP FTB_LOOP ;;
1836WORD_SELEN : ;;
1837 INC cs:pre_font_len ;;
1838 INC SI ;;
1839 DEC CX ;;
1840 MOV cs:ptr_len_word,AX ;;
1841 ;;
1842 MOV AX,cs:fdlen_word ;;
1843 DEC AX ;;
1844 MOV cs:fdlen_word,AX ;;
1845 MOV cs:stage,FOUNDX ;; FSTAT is to be changed
1846 JMP FTB_LOOP ;;
1847 ;;
1848 ;;+++++++++++++++++++++++++++++++++
1849PTRLENHI : ;; STAGE the high byte of SELECT_LENGTH
1850 INC cs:pre_font_len ;;
1851 MOV AX,FPKT ;;
1852 INC SI ;; byte by byte
1853 DEC CX ;;
1854 MOV cs:ptr_lnhib,AL ;;
1855 ;;
1856 MOV AX,cs:fdlen_word ;;
1857 DEC AX ;;
1858 MOV cs:fdlen_word,AX ;;
1859 MOV cs:stage,FOUNDX ;; FSTAT is to be changed
1860 JMP FTB_LOOP ;;
1861 ;;
1862NO_PTR_FONT3 : ;;
1863 MOV cs:stage,FOUNDX ;; FSTAT is to be changed
1864 JMP FTB_LOOP ;;
1865 ;;+++++++++++++++++++++++++++++++++
1866PASS : ;; STAGE - PASS DUMMY BYTES
1867 ;;
1868 PUSH DX ;;
1869 PUSH ES ;;
1870 PUSH DI ;;
1871 ;;
1872 PUSH CS ;;
1873 POP ES ;;
1874 MOV DI,OFFSET PASS_BRK ;;
1875 MOV DX,PASS_INDX ;;
1876 MOV AX,cs:pass_cnt ;;
1877 ;;
1878NEXT_BRK: ;; find the next pass-break
1879 CMP AX,ES:[DI] ;;
1880 ;;
1881 JB UPTO_BRK ;;
1882 ;;
1883 DEC DX ;;
1884 JZ PASS_ERR ;;
1885 INC DI ;;
1886 INC DI ;;
1887 JMP NEXT_BRK ;;
1888 ;;
1889UPTO_BRK : ;; next break point found
1890 MOV DX,ES:[DI] ;;
1891 SUB DX,AX ;; bytes to be skipped
1892 CMP CX,DX ;; all to be skipped ?
1893 JAE PASS_ALL ;;
1894 ;;
1895 ADD cs:pass_cnt,CX ;;
1896 ADD SI,CX ;;
1897 SUB CX,CX ;;
1898 JMP PASS_END ;;
1899 ;;
1900PASS_ALL : ;;
1901 ADD cs:pass_cnt,DX ;;
1902 ADD SI,DX ;;
1903 SUB CX,DX ;;
1904 ;;
1905 MOV AX,cs:pass_postx ;;
1906 MOV cs:stage,AX ;;
1907 ;;
1908; cmp ax,passx ;; is the next stage a pass-stage ?
1909; jne not_passx ;;
1910; mov ax,pass_postxx ;;
1911; mov pass_postx,ax ;;
1912; mov pass_postxx,stage_max ;; can support only 2 consecutive pass
1913 ;;
1914;not_passx : ;;
1915 ;;
1916 JMP PASS_END ;;
1917 ;;
1918PASS_ERR : ;; DEVICE ERROR, wrong stage
1919 POP DI ;;
1920 POP ES ;;
1921 POP DX ;;
1922 MOV FTP.FTB_STATUS,STAT_DEVERR
1923 SUB CX,CX ;; ignore all the input string
1924 JMP PASS_DONE ;;
1925 ;;
1926PASS_END : ;;
1927 POP DI ;;
1928 POP ES ;;
1929 POP DX ;;
1930PASS_DONE : ;;
1931 JMP FTB_LOOP ;;
1932 ;;
1933;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1934 ;;
1935FTB_LPEND : ;;
1936 ;;
1937 CMP cs:stage,FOUNDX ;;
1938 JNE NOT_FOUNDX ;;
1939 ;;
1940 CALL FOUND_DO ;;
1941 ;;
1942NOT_FOUNDX : ;;
1943 ;;
1944 POP CX ;; STACK -1
1945 ;;
1946FP_RET : ;;
1947 POP SI ;; restore registers
1948 POP DI ;;
1949 POP DX ;;
1950 POP CX ;;
1951 POP BX ;;
1952 POP AX ;;
1953 POP ES ;;
1954 POP DS ;;
1955 ;;
1956 RET ;;
1957FONT_PARSER ENDP ;;
1958 ;;
1959;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1960CSEG ENDS
1961 END
diff --git a/v4.0/src/DEV/PRINTER/CPSPEQU.INC b/v4.0/src/DEV/PRINTER/CPSPEQU.INC
new file mode 100644
index 0000000..ca086cb
--- /dev/null
+++ b/v4.0/src/DEV/PRINTER/CPSPEQU.INC
@@ -0,0 +1,577 @@
1
2 PAGE ,132
3
4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5;;
6;; FILENAME: CPS Printer Device Driver EQUAL Include
7;; MODULE NAME: CPSEQU
8;; TYPE: Include File
9;;
10;; LINK PROCEDURE: See CPSPx.ASM
11;;
12;; INCLUDE FILES:
13;;
14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
15 ;;
16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
17;;
18;; Request Header (Common portion)
19;;
20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
21 ;;
22RH EQU ES:[DI] ;; addressability to Request Header
23 ;;
24RHC STRUC ;; fields common to all request types
25RHC_LEN DB ? ;; length of Request Header
26 DB ? ;; unit code (subunit)
27RHC_CMD DB ? ;; command code
28RHC_STA DW ? ;; status
29 DQ ? ;; reserved for DOS
30RHC ENDS ;; end of common portion
31 ;;
32 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
33 ;;
34 ;; Command in the Request Header
35 ;; (see CMD_CODES table)
36 ;;
37 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
38 ;;
39CMD_INI EQU 0 ;; init command
40CMD_WRT EQU 8 ;; write command
41CMD_GIO EQU 19 ;; generic IOCTL command
42 ;; (see major/minor GIO functions)
43 ;;
44 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
45 ;;
46 ;; status values for RHC_STA
47 ;;
48 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
49 ;;
50STAT_DONE EQU 01H ;; function complete - high order byte
51STAT_CMDERR EQU 8003H ;; invalid command code error
52STAT_ERROR EQU 8000H ;; error returned by normal driver
53 ;;
54;; see Generic IOCTL Request Header section
55;; for more errorneous status. ;;
56 ;;
57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
58;;
59;; Request Header for INIT
60;;
61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
62 ;;
63 ;;
64RH0 STRUC ;;
65 DB (TYPE RHC) DUP (?) ;; common portion
66 ;;
67 DB ? ;; not used for CHAR devices
68RH0_ENDO DW ? ;; offset of ending address
69RH0_ENDS DW ? ;; segment of ending address
70RH0_BPBA DD ? ;; pointer to BPBA
71 db ?
72RH0_CONFIG_ERRMSG dw 0 ;DCR D493 "Error in CONFIG.SYS..." msg flag.
73RH0 ENDS ;;
74 ;;
75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
76;;
77;; Request Header for IOCTL
78;;
79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
80 ;;
81RH3 STRUC ;;
82 DB (TYPE RHC) DUP (?) ;; common portion
83 ;;
84 ;;
85 DB ? ;; media descriptor
86RH3_DTAO DW ? ;; offset of transfer address
87RH3_DTAS DW ? ;; segment of transfer address
88RH3_CNT DW ? ;; byte count
89RH3 ENDS ;;
90 ;;
91 ;;
92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
93;;
94;; Request Header for GENERIC IOCTL
95;;
96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
97 ;;
98GIH STRUC ;;
99 DB (TYPE RHC) DUP (?) ;; common portion
100 ;;
101 ;;
102GIH_MAF DB ? ;; major function
103GIH_MIF DB ? ;; minor function
104GIH_SI DW ? ;; content of SI
105GIH_DI DW ? ;; content of DI
106GIH_GBA DD ? ;; Address of Generic Buffer
107GIH ENDS ;;
108 ;;
109 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
110 ;;
111 ;; GIO major/minor functions
112 ;; (see GIO_CODES table)
113 ;;
114 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
115MAF_CON EQU 03 ;; major function for CON device
116MAF_PTR EQU 05 ;; major function for LPTX device
117 ;;
118MIF_DST EQU 4CH ;; minor function : designate start
119MIF_DEN EQU 4DH ;; designate end
120MIF_IVK EQU 4AH ;; invoke
121MIF_QIV EQU 6AH ;; query-invoked
122MIF_QLS EQU 6BH ;; query-list
123 ;;
124 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
125 ;; Designate Start (MIF_DST)Flags
126 ;; see GBIS structure
127 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
128 ;;
129DSF_FIFOCP EQU 08000H ;; Single code page FIFO command
130DSF_CARTCP EQU 00001H ;; Code page for Cartridge/semi-
131 ;; hardware RAM
132 ;;
133 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
134 ;; Generic IOCTL errorneous status
135 ;; upon return
136 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
137 ;;
138STAT_DELETE EQU 08000H ;; previous degignate deleted (DST)
139 ;; STAT_DELETE : only for FIFO
140STAT_NOFIND EQU 08008H ;; codepage,device not found (DST)
141STAT_DEVERR EQU 0800AH ;; Device error (DST,IVK,QIV,QLS,WRT)
142STAT_BADATA EQU 0800CH ;; bad font file (DST)
143STAT_NOBUFF EQU 0800CH ;; no font buffer for (REFRESH)
144STAT_BADDEN EQU 0800CH ;; no DST (DEN)
145STAT_bffDEN EQU 08000H ;; bad font file (DEN)
146STAT_TOMANY EQU 0800aH ;; too manay codepages (DST)
147STAT_DUPLCP EQU 0800aH ;; too manay codepages (DST)
148STAT_NOCPIV EQU 08007H ;; no codepage designated/invoked
149STAT_NOCP EQU 08007H ;; no codepage designated/invoked
150 ;; (IVK, QIV, QLS)
151 ;;
152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
153;;
154;; Generic IOCTL Buffer DS:[SI]
155;;
156;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
157GIOB EQU DS:[SI] ;;
158 ;;
159GB1S STRUC ;;
160GB1_FLAG DW ? ;; flag
161GB1_LEN DW ? ;; length
162GB1_NUM DW ? ;; length
163GB1_CP DW ? ;;
164GB1S ENDS ;;
165 ;;
166 ;;
167GB2S STRUC ;;
168GB2_LEN DW ? ;; length
169GB2_CP DW ? ;;
170GB2S ENDS ;;
171 ;;
172 ;;
173GB3S STRUC ;;
174GB3_LEN DW ? ;; length
175GB3_GBL DW ? ;; hardware code page number
176GB3S ENDS ;;
177 ;;
178GB3_MINILEN EQU 4 ;; minimium length of GB3
179 ;;
180GBLS STRUC ;;
181GBL_LEN DW ? ;; length
182GBL_CP DW ? ;; hardware code page number
183GBLS ENDS ;;
184 ;;
185;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
186;;
187;; DEVICE Header DS:[SI] -- to locate the next LPTn header
188;; NEXT device header ES:[DI]
189;;
190;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
191HP EQU DS:[SI] ;;
192NHD EQU ES:[DI] ;;
193 ;;
194NAME_LEN EQU 8 ;;
195 ;;
196DHS STRUC ;;
197DH_NEXTO DW ? ;; offset of pointer to next header
198DH_NEXTS DW ? ;; segment of pointer to next header
199 DW ? ;; attribute
200DH_STRAO DW ? ;; offset to strategy routine
201DH_INTRO DW ? ;; offset to interrupt routine
202DH_NAME DB NAME_LEN DUP(0) ;; device name in this header
203DHS ENDS ;; end of common portion
204 ;;
205;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
206;;
207;; FONT_PARSER data
208;;
209;; -- Interface table : FTABLE
210;;
211;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
212 ;;
213FPKT EQU DS:[SI] ;;
214 ;;
215FTP EQU ES:[BX] ;;
216 ;; ( I=Input O=Output )
217FTBLK STRUC ;;
218FTB_LENGTH DW TYPE FTBLK ;; (NOT TO BE CHANGED)
219FTB_STATUS DW 0FFFFH ;; (O) parsing compelte
220FTB_TYPE DW 0 ;; (O)
221FTB_TID DB 8 DUP(?) ;; (I)
222FTB_CP DW 0FFFFH ;; (I)
223FTB_MOD DW 0 ;; (O)
224FTB_FONTS DW 0 ;; (O)
225FTB_ROWS DB 0 ;; (O) DISPLAY TYPE DEVICE
226FTB_COLS DB 0 ;; (O) DISPLAY TYPE DEVICE
227FTB_X DB 0 ;; (O) DISPLAY TYPE DEVICE
228FTB_Y DB 0 ;; (O) DISPLAY TYPE DEVICE
229FTB_COUNT DW 0 ;; (O) DISPLAY TYPE DEVICE
230FTB_SELECT DW 0 ;; (O) PRINTER TYPE DEVICE
231FTB_SELLEN DW 0 ;; (O) PRINTER TYPE DEVICE
232FTB_DLEFT DW 0 ;; (O) =0, none to come
233FTB_DLEN DW 0 ;; (O) =0, not in this packet
234FTB_DALO DW 0 ;; (O) in the DOS "packet" buffer
235FTB_DAHI DW 0 ;; (O) " " " " "
236TARGET_LO DW 0 ;; internal registers
237TARGET_HI DW 0 ;; internal registers
238FTBLK ENDS ;;
239 ;;
240TYPE_DISPLAY EQU 01H ;; display type device
241TYPE_PRINTER EQU 02H ;; printer type device
242 ;;
243FBUFS STRUC ;;
244FLAG DW 0 ;;
245BUFFER_LEN DW 0 ;;
246BUFFER_ADDR DD 0 ;;
247NUM_FTBLK DW 0 ;; no. of FTBKL entries
248FBUFS ENDS ;;
249 ;;
250 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
251 ;; FLAGS :
252FLAG_RESTART EQU 000001H ;; bit 1 = restart the parsing
253 ;;
254 ;;
255 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
256 ;; STATUS : (in FTB_STATUS)
257 ;;
258FSTAT_COMPLETE EQU 0FFFFH ;; parsing compeleted. (good status)
259FSTAT_FONT EQU 0FFFEH ;; font data is defined and returned
260FSTAT_FOUND EQU 0FFFDH ;; informations including font-length
261FSTAT_MATCH EQU 0FFFCH ;; font header matches FTBLK
262FSTAT_SEARCH EQU 0FFFBH ;; seraching for header & font
263FSTAT_BOTTOM EQU 0FFF0H ;; below this are the DOS_STATUS.
264 ;;
265;; the FSTAT with value lower than 0FFF0H is to be returned to the DOS
266 ;;
267;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
268;
269; DEVICE Command Parser Table ES:[DI]
270;
271;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
272 ;;
273table_len equ 290 ;;
274 ;;
275PSE EQU ES:[DI] ;;
276 ;;
277PAR_OT STRUC ;;
278PAR_DEV_NUM DW ? ;;
279PAR_OFF DW ? ;;
280PAR_OT ENDS ;;
281 ;;
282PAR_DEVOT STRUC ;; OFFSET to the parameters of a device
283PAR_onum DW ? ;; number of offsets in the table
284PAR_DNMO DW ? ;; device-name table offset
285PAR_DIDO DW ? ;; device-id table offset
286PAR_HWCPO DW ? ;; hwcp table offset
287PAR_DESGO DW ? ;; designate table offset
288PAR_PARMO DW ? ;; parameter table offset
289PAR_DEVOT ENDS ;;
290 ;;
291PAR_DNMT STRUC ;; DEVICE NAME table
292PAR_DNML DW ? ;; length of device name
293PAR_DNM DB ? ;; device name
294PAR_DNMT ENDS ;;
295 ;;
296PAR_DIDT STRUC ;; DEVICE ID table
297PAR_DIDL DW ? ;; device ID length
298PAR_DID DB ? ;; device ID
299PAR_DIDT ENDS ;;
300 ;;
301PAR_HWCPT STRUC ;; hwcp table
302PAR_HWCPL DW ? ;; hwcp entry number
303PAR_HWCP DW ? ;; hwcp
304PAR_HWCPT ENDS ;;
305 ;;
306 ;;
307PAR_DESGT STRUC ;; DESIGNATE table
308PAR_DESGL DW ? ;; entry number
309PAR_DESG DW ? ;; designate
310PAR_FONT DW ? ;; fonts
311PAR_DESGT ENDS ;;
312 ;;
313 ;;
314PAR_PARMT STRUC ;; parameter table
315PAR_PARML DW ? ;; length
316PAR_PARM DW ? ;;
317PAR_PARMT ENDS ;;
318 ;;
319 ;;
320;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
321;
322; LPTn printer data structure CS:[BX]
323;
324;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
325 ;;
326BUF EQU CS:[BX] ;;
327 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
328 ;; STATES
329 ;;
330NORMAL EQU 0 ;; normal state
331CPSW EQU 1 ;;
332DESG_WR EQU 2 ;; designate write
333DESG_END EQU 3 ;; designate end
334LOCKED EQU 4 ;; WGR locked
335 ;;
336 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
337GOOD EQU 0 ;; STATUS :
338REPLX EQU 8000H ;; codepage replaced in DST
339FAIL EQU 4000H ;; fail in designate
340LOADED EQU 2000H ;; the font has just been loaded to
341REFRESH EQU 0800H ;; there was a refresh via DST
342 ;;
343 ;; also
344 ;; -- DSF_CARTCP
345 ;;
346 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
347 ;;
348 ;; for BFLAG :
349BF_PRN EQU 0 ;; 0 = PRN initialized (interrupt)
350BF_LPT1 EQU 1 ;; 1 = LPT1 initialized (interrupt)
351BF_LPT2 EQU 2 ;; 2 = LPT2 initialized (interrupt)
352BF_LPT3 EQU 3 ;; 3 = LPT3 initialized (interrupt)
353BF_MEM_DONE EQU 08000H ;; memory done for this device
354 ;;
355 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
356 ;; BUFFER DATA structure
357BUF_DATA STRUC ;;.................................
358BFLAG DW -1 ;; buf flag for initialisation
359 ;; -1 = buf not yet initialised
360 ;; (see BF_PRN, BF_LPT's)
361 ;;
362DEV_HDRO DW -1 ;; device driver n header offset
363DEV_HDRS DW -1 ;;
364LPT_STRAO DW -1 ;; dos lptn strategy offset
365LPT_STRAS DW -1 ;;
366LPT_INTRO DW -1 ;; dos lptn strategy offset
367LPT_INTRS DW -1 ;;
368RH_PTRO DW -1 ;; request header offset
369RH_PTRS DW -1 ;; segment ....................(unique)
370 ;;
371 ;; (following is replicated for LPT1 )
372 ;;
373RNORMO DW -1 ;; request-normal driver header offset
374prn_bufo dw -1 ;; offset to prn buffer
375did_prn dw 0 ;; where PRN is in the DID order
376PCLASS DW 0 ;;
377STATE DW NORMAL ;;
378STATUS DW GOOD ;;
379 ;; (the followings should be used
380 ;; IFF BUT.STATE <> NORMAL : )
381 ;;
382PDESCO DW -1 ;; offset to printer description table.
383 ;;
384 ;;===== hwcp and designated slots ====
385HSLMX DW 0 ;; HSLMX is the size of HARDslot (at
386 ;; HARDSO) and the buffer(at HRBUFO)
387 ;;
388HARDMX DW 0 ;; no. of HWCP+cart slots supported
389 ;; (less than or equal to .HSLOTS)
390HARDSO DW -1 ;; offset to hardware slots n
391 ;;
392HCARMX DW 0 ;; no. of cart slots supported
393HRBUFO DW -1 ;; offset to cart slots' buffer
394 ;;
395 ;;===== physical and designated RAM ===
396 ;;
397RSLMX DW 0 ;; RSLMX is the size of RAMslot (at
398 ;; RAMSO) and the RAM buffer(at RMBUFO)
399 ;;
400 ;;
401RAMMX DW 0 ;; no. of physical RAM slots(max.=1)
402RAMSO DW -1 ;; offset to RAM slots(incl. designated
403 ;;
404RBUFMX DW 0 ;; no. of designated RAM slots supported
405RMBUFO DW -1 ;; offset to RAM slots's buffer
406 ;;
407FTSZPA DW -1 ;; font buffer in paragraph = FONTSZ
408FTSIZE DW 0 ;; font buffer size = FTSZPA x 16
409FTSTART DW -1 ;; start of font buffer
410FTSLOTO DW -1 ;; segment address of font buffer
411 ;; -- of the one to be designated to
412FTDLO DW -1 ;; offset to where the FTSTART:OFFSET
413 ;; (next destination = total length
414 ;; so far)
415FSELEN DW 0 ;; length of selection control copied
416 ;; to the selection buffer
417 ;; (USED BY SELECT TYPE = 1 ONLY)
418 ;; -- initialized to 0, if selection
419 ;; is not 0, copied the selection
420 ;; from the font file until the
421 ;; length is reached. After copying
422 ;; to selection buffer, reset to 0
423FSELMAX DW 0 ;; max. room reserved for selection
424 ;; controls.
425 ;;
426PAR_EXTRACTO DB (TYPE PAR_DEVOT) DUP (-1);; Offset to parameter extracts
427SAVED_CP DW -1 ;; WGR saved code page during lock ;AN000;
428BUFEND DW 0 ;; END OF BUFFER, for LPT1 copy.
429BUF_DATA ENDS ;;
430 ;;
431;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
432;
433; Printer Description Table
434;
435;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
436 ;;
437DEVN_LEN EQU 8 ;; device name (type-id) length
438 ;;
439PDSH STRUC ;;
440PD_LEN DW 30 ;; length of each entry
441TYPEID DB ' ' ;; device name (id), length DEVN_LEN
442VMINOR DB 0 ;; version : .00
443VMAJOR DB 1 ;; version : 1.
444CLASS DW ? ;; reserved
445FONTSZ DW ? ;; font buffer size in paragraph (max)
446HSLOTS DW ? ;; hard-slots number (max # of Hslots)
447HWCPMIN DW ? ;; what left by min_hwcp can be cart.
448RSLOTS DW ? ;; ram-slots number (max # of Rslots)
449PDSH ENDS ;; the SELH_O, and SELR_O are defined
450 ;; in the next two entries in PDS
451 ;;
452 ;;
453PDS STRUC ;;
454 DB (TYPE PDSH) DUP (?) ;; common portion
455SELH_O DW ? ;; offset to select controls on Hslots
456SELR_O DW ? ;; offset to select controls on Rslots
457SELB_O DW ? ;; offset to buffered select controls
458PDS ENDS ;;
459 ;;
460 ;;
461;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
462;
463; HARD / RAM slots table structure/constants
464;
465;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
466 ;; NOTE : must be only FOUR bytes for
467 ;; codepage positioning
468 ;; calculation as compared
469 ;; with each entry in FTDL_OFF
470 ;;
471SLTS STRUC ;; slots-table structure
472SLT_CP DW -1 ;; code page : no code page
473SLT_AT DW 0 ;; attribute : empty
474SLTS ENDS ;;
475 ;;
476 ;; ATTRIBUTES :
477AT_RAM1 EQU 00001H ;; in the 1st physical RAM slot
478AT_RAM2 EQU 00002H ;; in the 2nd physical RAM slot
479AT_RAM3 EQU 00004H ;; in the 3rd physical RAM slot
480AT_RAM4 EQU 00008H ;; in the 4th physical RAM slot
481AT_RAMS EQU 0000FH ;;(note the current logic supports
482 ;; only ONE physical RAM slot)
483 ;;
484AT_OCC EQU 01000H ;; slot occupied
485AT_ACT EQU 02000H ;; slot active
486AT_HWCP EQU 04000H ;; slot is hwcp
487AT_OLD EQU 08000H ;; codepage in buffer is not newly
488 ;; designated.
489AT_LOAD EQU 00100H ;; slot with font to be loaded
490AT_FONT EQU 00200H ;; font in this slot has been loaded
491AT_NO_LOAD EQU NOT AT_LOAD ;; to reset the bit
492AT_NO_FONT EQU NOT AT_FONT ;; to reset the bit
493AT_SELECT EQU 00400H ;; for SELECT TYPE = 1
494 ;; -- mark the FTBLK where control is
495 ;; copied from.
496;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
497 ;; constants on SLOTS
498HARDSL_MAX EQU 12 ;;
499 ;;
500RAMSL_MAX EQU 12 ;;
501 ;;
502CTL_MAX EQU 32 ;; max.length of each selection control
503CTL5202_OFFS EQU 8 ;; offset to CTL5202_H for codepage
504 ;;
505;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
506;
507; General Constants
508;
509;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
510 ;;
511STACK_SIZE EQU 28H ;; in paragraph, total 200H bytes
512 ;;
513;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
514;
515;
516; STRUCS AND EQUATES
517;
518;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
519 ;;
520PARSE_NAME STRUC ;; ;AN000;
521N_LENGTH DW ? ;; ;AN000;
522FNAME DB " " ;; ;AN000;
523PARSE_NAME ENDS ;; ;AN000;
524 ;;
525PARSE_OFFSETS STRUC ;; ;AN000;
526 DW ? ;; ;AN000;
527DN_OFFSET DW ? ;; ;AN000;
528DI_OFFSET DW ? ;; ;AN000;
529DCP_OFFSET DW ? ;; ;AN000;
530DD_OFFSET DW ? ;; ;AN000;
531 DW ? ;; ;AN000;
532PARSE_OFFSETS ENDS ;; ;AN000;
533 ;;
534PARSE_HWCP STRUC ;; ;AN000;
535NUM_HWCPS DW ? ;; ;AN000;
536HWCP_1 DW ? ;; ;AN000;
537HWCP_2 DW ? ;; ;AN000;
538HWCP_3 DW ? ;; ;AN000;
539HWCP_4 DW ? ;; ;AN000;
540HWCP_5 DW ? ;; ;AN000;
541HWCP_6 DW ? ;; ;AN000;
542HWCP_7 DW ? ;; ;AN000;
543HWCP_8 DW ? ;; ;AN000;
544HWCP_9 DW ? ;; ;AN000;
545HWCP_10 DW ? ;; ;AN000;
546PARSE_HWCP ENDS ;; ;AN000;
547 ;;
548PARSE_DESG STRUC ;; ;AN000;
549NUM_VALUES DW ? ;; ;AN000;
550NUM_DESGS DW ? ;; ;AN000;
551NUM_FONTS DW ? ;; ;AN000;
552PARSE_DESG ENDS ;; ;AN000;
553 ;;
554 ;;
555ZERO EQU 0H ;; ;AN000;
556ONE EQU 1H ;; ;AN000;
557TWO EQU 2H ;; ;AN000;
558THREE EQU 3H ;; ;AN000;
559FOUR EQU 4H ;; ;AN000;
560FIVE EQU 5H ;; ;AN000;
561SIX EQU 6H ;; ;AN000;
562SEVEN EQU 7H ;; ;AN000;
563EIGHT EQU 8H ;; ;AN000;
564NINE EQU 9H ;; ;AN000;
565TEN EQU 0AH ;; ;AN000;
566NUMBER EQU 1 ;; ;AN000;
567STRING EQU 3 ;; ;AN000;
568COMPLEX EQU 4 ;; ;AN000;
569RC_EOL EQU -1 ;; ;AN000;
570RC_NO_ERROR EQU 0 ;; ;AN000;
571RC_OP_MISSING EQU 2 ;; ;AN000;
572ON EQU 1 ;; ;AN000;
573OFF EQU 0 ;; ;AN000;
574BAD_SYNTAX_MSG EQU 12 ;; ;AN000;
575BAD_DEVICE_MSG EQU 2 ;; ;AN000;
576;
577
diff --git a/v4.0/src/DEV/PRINTER/CPSPI.ASM b/v4.0/src/DEV/PRINTER/CPSPI.ASM
new file mode 100644
index 0000000..30bb7c9
--- /dev/null
+++ b/v4.0/src/DEV/PRINTER/CPSPI.ASM
@@ -0,0 +1,2422 @@
1
2 PAGE ,132
3
4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5;;
6;; FILENAME: CPS Printer Device Driver INIT module (CPSPInn)
7;; MODULE NAME:
8;; TYPE: Assemble file (non-resident code)
9;; LINK PROCEDURE: Link CPSPMnn+CPSFONT+CPSPInn into .EXE format. CPSPM01
10;; must be first. CPSPInn must be last. Everything
11;; before CPSPInn will be resident.
12;; INCLUDE FILES:
13;; CPSPEQU.INC
14;;
15;; LAYOUT : This file is divided into two main section :
16;; ++++++++++++++++++++++++
17;; ++ DEVICE Parser ++
18;; ++++++++++++++++++++++++
19;;
20;; ++++++++++++++++++++++++
21;; ++ INIT Command ++
22;; ++++++++++++++++++++++++
23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
24 ;;
25INCLUDE CPSPEQU.INC ;;
26 ;;
27PUBLIC INIT ;;
28PUBLIC CODE_END ;; for MAP listing only
29PUBLIC RESIDENT_END ;;
30PUBLIC STACK_ALLOCATED ;;
31 ;;
32 ;;
33EXTRN PRINTER_DESC_NUM:WORD ;;
34EXTRN PRINTER_DESC_TBL:WORD ;;
35EXTRN INIT_CHK:WORD,TABLE:WORD ;;
36EXTRN HARD_SL1:BYTE,RAM_SL1:BYTE ;;
37EXTRN HARD_SL2:BYTE,RAM_SL2:BYTE ;;
38EXTRN HARD_SL3:BYTE,RAM_SL3:BYTE ;;
39EXTRN HARD_SL4:BYTE,RAM_SL4:BYTE ;;
40EXTRN RESERVED1:WORD,RESERVED2:WORD ;;
41 ;;
42EXTRN MSG_NO_INIT_P:BYTE ;;
43EXTRN MSG_NO_INIT:BYTE ;;
44EXTRN MSG_BAD_SYNTAX:BYTE ;;
45EXTRN MSG_INSUFF_MEM:BYTE ;;
46 ;;
47 ;;
48CSEG SEGMENT PARA PUBLIC 'CODE' ;;
49 ASSUME CS:CSEG ;;
50 ;;
51 ;;
52CODE_END EQU $ ;; end of resident code
53 ;;
54 DW 0 ;; -- there are 16 bytes kept,
55 ;; including this word
56 ;;
57RESIDENT_END DW 0FFFH ;; end of extended resident area
58STACK_ALLOCATED DW -1 ;; end of extended resident area
59 ;;
60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
61;;
62;; End of resident code
63;;
64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
65;;
66;; Incorporating Device Command Parser :
67;;
68;; -- extracted from PARSE4E.ASM, size 49582 bytes
69;;
70;; (some modifications have to be made in the section right after the parser's
71;; document and before the GET_PARMS_A, one of them is :)
72;;
73;; -- move the TABLE to the printer device driver's main module
74;;
75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
76;;
77;; ++++++++++++++++++++++++
78;; ++ DEVICE Parser ++
79;; ++++++++++++++++++++++++
80;;
81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
82;;
83;;
84;; PARSER's code -- non resident
85;;
86;; -- set ES:[DI] pointing to the Request Header before calling PARSER
87;;
88;; to be called as PARSER with ES:[DI] defined as Request Header
89;; If there is any syntax error in the DEVICE command line, the
90;; Parser return a 0 in the first word (NUMBER)of the first table.
91;;
92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
93;;
94;
95; Description: A command parser for DEVICE command in the CONFIG.SYS file.
96; ------------
97;
98; Procedures contained in the file:
99; ---------------------------------
100; PARSER: Main routine for command processing.
101; GET_CHAR: Gets a character from command line.
102; IS_ALPH: Checks if character is an alpha character.
103; IS_DIGIT: Checks if character is a digit.
104; IS_DELIM: Checks if character is a DOS delimiter.
105; DEVICE_PARSE: Pulls device name from command line and
106; inserts in table.
107; ID_PARSE: Pulls id name from command line and insers in table
108; HWCP_PARMS: Extract HWCP number, converts it to binary and
109; inserts it in table.
110; HWCP_PARSE: Extracts HWCP number if only one number is given.
111; MUL_HWCP: Extracts multiple HWCP's numbers, if they are given
112; in a list.
113; DESG_PARMS: Extracts designate number, converts it to binary
114; and inserts it in table.
115; DESG_FONT: Extracts the designate and the font if both were
116; given in command line.
117; DESG_PARSE: Pulls designate number if it is the only one given.
118; GET_NUMBER: Converts a number to binary.
119; OFFSET_TABLE: Updates the counter in table #1.
120; FIND_RIGHT_BR: Looks for a right bracket.
121;
122;
123; Change history:
124; ---------------
125;
126;
127;LOGIC:
128;------
129; Establish addressability to parameters.
130; Skip until end of path and file name -first delimiter
131;
132; Loop:
133; Isolate the first non-delimiter or non delimeter characters.
134; If End_of_Line_Delimiter then
135; return an error_code
136; Else
137; If first non-delimiter is ALPHA then
138; (assume a device name)
139; Extracts device name
140; Update offset counter
141;
142; Isolate the first non-delimiter characters after id name.
143; If End_of_Line_Delimiter then
144; return an error_code
145; Else
146; If first non-delimiter is ALPHA-NUMARIC or
147; If character is '(' then
148; (assume an id name)
149; Extracts id name
150; Update offset counter
151;
152; Pull out HWCP
153; If error flag is set then exit
154; Else if end of line flag is set then exit
155;
156; Pull out DESG parms
157; If error_flag is set then exit.
158; Else if end of line flag is set then exit
159; Else if Number of devices is four then Exit
160; Else Loop
161;
162;
163;Subroutines Logic:
164;------------------
165;
166; GET_CHAR:
167; ---------
168; Load character in AL
169; If character less than 20h then
170; turn Z-flag on
171;
172; IS_ALPHA:
173; ---------
174; Save character
175; 'Convert character to upper case'
176; If character >=A and <=Z then
177; turn Z-flag on
178; exit
179; Else
180; Restore character
181; exit.
182;
183; IS_DIGIT:
184; --------- If Character >=0 and <=9 then
185; turn Z-flag on
186;
187; IS_DELIMITER:
188; -------------
189; If character a dos delimiter (' ','=',',',';',TAB)
190; then turn Z-flag on
191;
192; DEVICE_PARSE:
193; -------------
194; Set device name length counter.
195; Loop
196; If a dos delimiter then
197; add spaces to name (if require)
198; Else if char is ALPHA-NUM then
199; save in table
200; If name >8 character thne
201; error; exit
202; Else
203; error; exit
204;
205; ID_PARSE:
206; --------- Set id name length counter.
207; Loop
208; If a dos delimiter then
209; add spaces to name (if require)
210; Else if char is ALPHA-NUM then
211; save in table
212; If name >8 character then
213; error; exit
214; Else if char is ')' or '(' then
215; set flags
216; Else
217; error; exit
218;
219; HWCP_PARMS:
220; -----------
221; Loop: Set flags off
222; If char is a DIGIT then
223; convert number to binary
224; update table
225; Else if char is ',' then
226; no HWCP was given
227; exit
228; Else if char is '(' then
229; assume multiple HWCP
230; Else if char is ')' then
231; end of parms, exit
232; Else if not a delimiter then
233; error, exit set carry flag set carry flag
234; Loop
235;
236; HWCP_PARSE:
237; ----------- Increment counter
238; Get number and convert to binary
239; Update the table
240; Set table_5 pointer
241;
242; MUL_HWCP:
243; ---------
244; Loop: If char is ')' then
245; end of list, exit
246; If char is a DIGIT
247; Get number and convert to binary
248; Update table.
249; If char is not a delimiter then
250; error, exit set carry flag
251; Loop
252;
253; DESG_PARMS:
254; -----------
255; Loop: If char is a DIGIT then
256; Get number and convert to binary
257; Update table.
258; If char is a ')' then
259; end of parms, exit
260; If char is a '(' then
261; assume given desg. and font
262; If char is a ',' then
263; no desg ginven
264; scane for ')'
265; If char is not a delimiter then
266; error, exit set carry flag
267; Loop
268;
269; DESG_FONT:
270; ----------
271; Loop: If char is a ',' then
272; no desg number was given
273; update table
274; If char is a ')' then
275; end of desg-font pair, exit
276; If char is a DIGIT then
277; Get number and convert to binary
278; Update table
279; If char not a delimiter then
280; error, exit set carry flag
281; Loop
282;
283; DESG_PARSE:
284; ----------- Get number and conver to binary
285; Update table
286;
287; GET_NUMBER:
288; ----------- Get ASCII number from parms
289; conver to binary
290; add to total
291;
292; OFFSET_TABLE:
293; -------------
294; Increment the number of parms
295;
296; FIND_RIGHT_BR:
297; --------------
298; Loop: If char is ')' then
299; found bracket exit
300; If char is not ' ' then
301; error, exit set carry flag
302; Loop
303; END
304;------------------------------------------------------
305;
306; The following is the table structure of the parser. All fields are
307; two bytes field (accept for the device and id name)
308;
309; TABLE HEADER :
310; ÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
311; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
312; ³ N = Number of devices. ³
313; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
314; ³ Device # 1 offset ÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄ>ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
315; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ³
316; ³ Device # 2 offset ³ ³ Table_1 (a) ³
317; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ³
318; ³ Device # 3 offset ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
319; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
320; ³ Device # 4 offset ³
321; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
322;
323;
324; N = 1,2,3 or 4. A two bytes number indicating the number of device specified.
325; DEVICE # N OFFSET : a two bytes offset address to table_1. (ie. Device #1 offset
326; is a pointer to table_1 (a). Device #2 offset is a pointer to table_1
327; (b)...etc.). If an error was detected in the command N is set to zero.
328;
329;
330;
331; TABLE_1 :
332; ÍÍÍÍÍÍÍÍÍ
333;
334; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
335; ³ N = Number of Offsets. ³ ³ ³
336; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ÚÄÄÄÄÄij Table_2 (a) ³
337; ³ Device Name offset ÄÅÄÄÄÄÙ ³ ³
338; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
339; ³ Device Id offset ÄÅÄÄÄÄÄÄ¿
340; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
341; ³ Device HWCP offset ÄÅÄÄÄÄ¿ ³ ³ ³
342; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ÀÄÄÄij Table_3 (a) ³
343; ³ Device Desg offset ÄÅÄÄ¿ ³ ³ ³
344; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
345; ³ "Reserved" ³ ³ ³
346; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ³ ³ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
347; ³ ³ ³ ³
348; ³ ÀÄÄÄÄÄij Table_4 (a) ³
349; ³ ³ ³
350; ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
351; ³ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
352; ³ ³ ³
353; ÀÄÄÄÄÄÄÄij Table_5 (a) ³
354; ³ ³
355; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
356;
357;
358; N=Length of table_1, or the number of offsets contained in table_1.
359; The offsets are pointers (two bytes) to the parameters value of the device.
360; "Reserved" : a two byte memory reserved for future use of the "PARMS" option.
361;
362;
363; TABLE_2 :
364; ÍÍÍÍÍÍÍÍÍ
365;
366; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
367; ³ N = Length of devices name ³
368; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
369; ³ Device name ³
370; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
371;
372; N = Length of device name. Device length is always 8 byte long.
373; Device Name : the name of the device (eg. LPT1, CON, PRN). The name
374; is paded with spaces to make up the rest of the 8 characters.
375;
376;
377;
378; TABLE_3 :
379; ÍÍÍÍÍÍÍÍÍ
380;
381; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
382; ³ N = Length of Id name. ³
383; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
384; ³ Id Name ³
385; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
386;
387; N = Length of id name. Id name length is always 8 byte long.
388; Id Name : the name of the id (eg. EGA, VGA, 3812). The name
389; is paded with spaces to make up the rest of the 8 character.
390;
391;
392;
393; TABLE_4 :
394; ÍÍÍÍÍÍÍÍÍ
395;
396; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
397; ³ N = Length of table. ³
398; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
399; ³ HWCP # 1 ³
400; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
401; ³ HWCP # 2 ³
402; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
403; ³ . ³
404; ³ . ³
405; ³ . ³
406; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
407; ³ HWCP # 10 ³
408; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
409;
410;
411; N = Length of table in words. Or the number of HWCP's.
412; HWCP # N : a hardware code page number converted to binary. The maximum
413; number of pages allowed is 10.
414;
415;
416;
417; TABLE_5 :
418; ÍÍÍÍÍÍÍÍÍ
419;
420; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
421; ³ N = Length of table. ³
422; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
423; ³ Designate ³
424; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
425; ³ Font ³
426; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
427;
428; N = Lenght of table. 0 - nothing was specified
429; 1 - Only a designate was specified.
430; 2 - Designate and font were given. If the Desg field
431; was left empty in the DEVICE command then the
432; Designate field is filled with 0FFFFH.
433; Designate, Font : Are the Desg. and Font binary numbers.
434;
435;------------------------------------------------------
436;
437
438;RESERVED MEMORY:
439TABLE_1 DW ? ; Pointer at offsets.
440TABLE_2 DW ? ; Pointer at device name.
441TABLE_3 DW ? ; Pointer at id name.
442TABLE_4 DW ? ; Pointer at hwcp.
443TABLE_5 DW ? ; Pointer at desg and font.
444;TABLE DB 290 DUP (?) ; Table of parsed parms. Max 4 devices.
445DEVNUM DW ? ; Counter to number of devices.
446RIGHT_FLAG DB ? ; Flag to indicate a left bracket.
447DEV_ERR_FLG DB ? ; Device name error flag.
448ID_ERR_FLG DB ? ; Id name error flag.
449ERROR_FLAG DB ? ; Error flag_terminate program if set to 1.
450COMMA_FLAG DB ? ; Indicate the number of commas incounterd.
451HWCP_FLAG DB ? ; Flag for multiple hwcps.
452DESG_FLAG DB ? ; Flag indicates desg. and font.
453
454;Main part of program-links different sumbroutines together
455
456PARSER PROC
457
458 PUSH AX ; ;;;;;;;;;;;;;;;;;;
459 PUSH BX ; ;
460 PUSH CX ; ; SAVE
461 PUSH DX ; ; ALL
462 PUSH DS ; ; REGISTERS.
463 PUSH ES ; ;
464 PUSH DI ; ;
465 PUSH SI ; ;;;;;;;;;;;;;;;;;;
466
467 LES SI,RH.RH0_BPBA ; Point at all after DEVICE=
468 ; in the CONFIG.SYS file.
469
470
471;Skip to end of file name, to the first DOS delimiter.
472
473 MOV DEVNUM,02H ; Number of devices counter.
474
475GET_PARMS_A: CALL GET_CHAR ; Get command character in AL .
476 JZ EXIT_B ; No parms found.
477 CALL IS_DELIM ; If not a delimiter then.
478 JNE GET_PARMS_A ; Check next character.
479
480 MOV DI,OFFSET TABLE ; Get the table address.
481 ADD DI,02H ; Point at devices offsets.
482 MOV BX,DI ;
483 ADD BX,08H ; Point BX at parms offsets.
484TAB2: CALL UPDATE_TABLE ; Update table pointers value.
485
486CLR_DELIM: CALL GET_CHAR ; Get character into AL.
487 JZ EXIT_B ; No parms found.
488 CALL IS_ALPHA ; If alpha then assume.
489 JZ DEVICE ; A device name.
490 CALL IS_DELIM ; Is it a delimiter
491 JNE EXIT_A ; If not then error.
492 JMP CLR_DELIM ; Get next character.
493
494DEVICE: MOV DEV_ERR_FLG,00H ; Set device error flag off;
495 CALL DEVICE_PARSE ; Call routine to parse device name.
496 CMP DEV_ERR_FLG,01H ; If error flag is
497 JZ EXIT_A ; set then exit.
498 CALL OFFSET_TABLE ; Update table.
499
500ID_PARMS: CALL GET_CHAR ; Load a character in AL.
501 JZ EXIT_A ; Exit if end of line (error).
502 CMP AL,'(' ; If AL is a '(' then
503 JE ID ; Parse ID name.
504 CALL IS_ALPHA ; If an Alpha
505 JE ID ; Then parse ID name.
506 CALL IS_DIGIT ; If a digit
507 JE ID ; Then parse ID name.
508 CALL IS_DELIM ; If not a delimiter
509 JNE EXIT_A ; Then error, exit
510 JMP ID_PARMS ; Get another number
511
512EXIT_B: CMP DEVNUM,02H ; If device number above 2 then
513 JA EXIT_C ; Exit parse.
514 JMP EXIT_A ; Else error, exit
515
516ID: MOV ID_ERR_FLG,00H ; Set id error flag off.
517 CALL ID_PARSE ; Parse ID name.
518 CMP ID_ERR_FLG,01H ; Was error flag set, then
519 JE EXIT_A ; Print error message.
520 CALL OFFSET_TABLE ; Update table of offsets.
521
522 CALL HWCP_PARMS ; Get code page number
523 CMP ERROR_FLAG,01H ; If error, then
524 JE EXIT_A ; Print error message and exit
525 CMP ERROR_FLAG,02H ; If end of string
526 JE EXIT_H ; Then exit.
527
528 CALL DESG_PARMS ; Get designate number
529 CMP ERROR_FLAG,01H ; If error, then
530 JE EXIT_A ; Print error message and exit
531 JMP EXIT_H ; Then exit.
532
533EXIT_A: MOV DI,OFFSET TABLE ; Load table offset
534 MOV DS:WORD PTR [DI],00H ; Set error to on.
535 STC ; Set carry flag
536 JMP EXIT_P ; Exit parse.
537
538EXIT_H: MOV DI,OFFSET TABLE ; Load table offset.
539 ADD DS:WORD PTR [DI],01H ; Increment number of devices.
540 CMP DEVNUM,08H ; If 4 devices loaded
541 JE EXIT_C ; Then exit parse.
542 ADD DEVNUM,02H ; Increment the number of devices
543 ADD DI,DEVNUM ; Point at next devices offset.
544 MOV BX,TABLE_5 ; BX point at
545 ADD BX,06H ; end of previous table.
546 JMP TAB2 ; Get next device.
547
548EXIT_C: CLC
549
550EXIT_P: POP SI ; ;;;;;;;;;;;;;;;;;;
551 POP DI ; ;
552 POP ES ; ; RESTORE
553 POP DS ; ; ALL
554 POP DX ; ; REGISTERS.
555 POP CX ; ;
556 POP BX ; ;
557 POP AX ; ;;;;;;;;;;;;;;;;;;
558 RET
559
560PARSER ENDP
561
562
563;********************************************************
564;** GET_CHAR : a routine to get next character pointed **
565;** to by ES:SI into AL. **
566;********************************************************
567
568GET_CHAR PROC
569
570 MOV AL,ES:BYTE PTR [SI] ; Load character pointed to
571 CMP AL,09H ; by ES:[SI] in AL.
572 JE ZOFF ; If tab then O.K
573 CMP AL,20H ; Turn Z-flag on
574 JL TURN_Z_ON ; if character
575ZOFF: INC SI ; is below
576 JMP GET_CHAR_X ; 20h.
577 ; ( End of line
578TURN_Z_ON: CMP AL,AL ; delimiters ).
579GET_CHAR_X: RET
580
581GET_CHAR ENDP
582
583
584;********************************************************
585;** IS_ALPHA : a routine to check the character in **
586;** AL if it is an alpha character (a...z,A...Z). **
587;** If character is lower case, convert to upper case. **
588;********************************************************
589
590IS_ALPHA PROC
591
592 PUSH AX ; Save value of AL
593 AND AL,0DFH ; Convert to upper case
594 CMP AL,'A' ; If <'A', then
595 JB IS_ALPHA_X ; NZ-flag is set, exit
596 CMP AL,'Z' ; If >'Z', then
597 JA IS_ALPHA_X ; NZ-flag is set, exit
598 CMP AL,AL ; Force Z-flag
599 POP DX ; Discard lower case.
600 JMP IA_X ; Exit.
601IS_ALPHA_X: POP AX ; Restore value of AL
602IA_X: RET
603
604IS_ALPHA ENDP
605
606
607;********************************************************
608;** IS_DIGIT : a routine to check if the character in **
609;** AL register is a digit (i.e. 1..9). **
610;********************************************************
611
612IS_DIGIT PROC
613
614 CMP AL,'0' ; If < '0' then
615 JB IS_NUM_X ; NZ-flag is set, exit
616 CMP AL,'9' ; If > '9' then
617 JA IS_NUM_X ; NZ-flag is set, exit
618 CMP AL,AL ; Set Z-flag to indecate digit
619IS_NUM_X: RET
620
621IS_DIGIT ENDP
622
623
624;********************************************************
625;** IS_DELIM : This routine check if the character in **
626;** AL is a delimiter. ('+',' ',';',',','=',tab) **
627;********************************************************
628
629IS_DELIM PROC
630
631 CMP AL,' ' ; Test for space.
632 JE IS_DELIM_X ; Z-flag is set, exit
633 CMP AL,',' ; Test for comma.
634 JE IS_DELIM_X ; Z-flag is set, exit
635 CMP AL,';' ; Test for semicolon.
636 JE IS_DELIM_X ; Z-flag is set, exit
637 CMP AL,'=' ; Test for equal sign.
638 JE IS_DELIM_X ; Z-flag is set, exit
639 CMP AL,09h ; Test for TAB.
640
641IS_DELIM_X: RET ; Exit
642
643IS_DELIM ENDP
644
645
646;********************************************************
647;** DEVICE_PARSE : Parse the device driver name and **
648;** store in table. Update offset. **
649;********************************************************
650
651DEVICE_PARSE PROC
652
653 MOV DI,TABLE_2
654 MOV DS:WORD PTR [DI],0008H ; Save dev name size.
655 ADD DI,02H ; Increment DI.
656 MOV CX,9 ; Set counter.
657NEXT_C: CALL IS_ALPHA ; if Check then.
658 JZ SAVE_C ; Save it.
659 CALL IS_DIGIT ; if Digit then.
660 JZ SAVE_C ; Save it.
661 CMP AL,'-' ; If '-' then.
662 JZ SAVE_C ; Save it.
663 CALL IS_DELIM ; If a delimiter then.
664 JZ ADD_SPACE1 ; Pad with spaces.
665 CMP AL,':' ; If a colon
666 JE ADD_SPACE1 ; then end device parse
667 JMP ERR_DEV_PAR ; Else an error.
668
669SAVE_C: DEC CX ; Decrement counter.
670 CMP CX,0 ; If counter zero then.
671 JE ERR_DEV_PAR ; Error.
672 MOV DS:BYTE PTR [DI],AL ; Save char in table.
673 INC DI ; Increment pointer.
674 CALL GET_CHAR ; Get another char.
675 JZ ERR_DEV_PAR
676 JMP NEXT_C ; Check char.
677
678ERR_DEV_PAR: MOV DEV_ERR_FLG,01H ; Set error flag.
679 JMP DEV_PAR_X ; Exit.
680
681ADD_SPACE1: DEC CX ; Check counter.
682 CMP CX,1
683 JL DEV_PAR_X ; Exit if already 8.
684LL1: MOV DS:BYTE PTR [DI],' ' ; Pad name with spaces.
685 INC DI ; Increment pointer.
686 LOOP LL1 ; Loop again.
687DEV_PAR_X: RET
688
689DEVICE_PARSE ENDP
690
691
692;********************************************************
693;** ID_PARSE : Parse the id driver name and **
694;** store in table. Update offset. **
695;********************************************************
696
697ID_PARSE PROC
698
699 MOV DI,TABLE_3
700 MOV DS:WORD PTR [DI],0008H ; Save dev name size.
701 ADD DI,02H ; Increment DI.
702 MOV RIGHT_FLAG,00H ; Clear flag.
703 MOV CX,9 ; Set counter.
704
705NEXT_I: CALL IS_ALPHA ; If Check then.
706 JZ SAVE_I ; Save it.
707 CALL IS_DIGIT ; if Digit then.
708 JZ SAVE_I ; Save it.
709 CMP AL,'-' ; If '-' then.
710 JZ SAVE_I ; Save it.
711 CMP AL,'(' ; If '(' then.
712 JE RIG_BR_FLG ; Set flag.
713 CMP AL,')' ; If ')' then
714 JE BR_FLG_LEF ; Pad with spaces.
715 CALL IS_DELIM ; If a delimiter then.
716 JZ ADD_SPACE2 ; Pad with spaces.
717 JMP ERR_ID_PAR ; Else an error.
718
719SAVE_I: DEC CX ; Decrement counter.
720 CMP CX,0 ; If counter zero then.
721 JLE ERR_ID_PAR ; Error.
722 MOV DS:BYTE PTR [DI],AL ; Save char in table.
723 INC DI ; Increment pointer.
724 CALL GET_CHAR ; Get another char.
725 JZ ADD_SPACE2 ; Exit routine.
726 JMP NEXT_I ; Check char.
727
728ERR_ID_PAR: MOV ID_ERR_FLG,01H ; Set error falg on.
729 JMP ID_PAR_X ; Exit.
730
731BR_FLG_LEF: CMP RIGHT_FLAG,01H ; If left bracket was
732 JNE ERR_ID_PAR ; found and no previous
733 JMP ADD_SPACE2 ; Bracket found, then error
734
735RIG_BR_FLG: CMP RIGHT_FLAG,01H ; If more than one bracket
736 JE ERR_ID_PAR ; then error.
737 CMP CX,09 ; If '(' and already id
738 JB ERR_ID_PAR ; then error.
739 MOV RIGHT_FLAG,01H ; Set flag for.
740 CALL GET_CHAR ; Left brackets.
741 JZ ERR_ID_PAR ; If end of line,exit.
742 JMP NEXT_I ; Check character.
743
744ADD_SPACE2: DEC CX ; Check counter.
745 CMP CX,1
746 JL ID_PAR_X ; Exit if already 8.
747
748LL2: MOV DS:BYTE PTR [DI],' ' ; Pad name with spaces.
749 INC DI ; Increment pointer.
750 LOOP LL2 ; Loop again.
751
752ID_PAR_X: RET
753
754ID_PARSE ENDP
755
756;********************************************************
757;** HWCP_PARMS : Scane for the hardware code page, and **
758;** parse it if found. Flag codes set to: **
759;** ERROR_FLAG = 0 - parsing completed. No error. **
760;** ERROR_FLAG = 1 - error found exit parse. **
761;** ERROR_FLAG = 2 - end of line found, exit parse. **
762;********************************************************
763
764
765HWCP_PARMS PROC
766
767 MOV COMMA_FLAG,00H ; Set the comma flag off.
768 MOV ERROR_FLAG,00H ; Set the error flag off.
769 DEC SI ; Point at current char in Al.
770 CMP RIGHT_FLAG,01H ; If no left brackets then
771 JNE LEFT_BR ; Exit parse.
772
773HWCP_1: CALL GET_CHAR ; Load character in AL.
774 JZ LEFT_BR ; Exit, if end of line.
775 CALL IS_DIGIT ; Check if digit, then
776 JE HP1 ; Parse hwcp parms.
777 CMP AL,',' ; If a comma
778 JE COMMA_1 ; Jump to comma_1
779 CMP AL,')' ; If a ')' then
780 JE RIGHT_BR ; end of current dev parms.
781 CMP AL,'(' ; If a '(' then
782 JE HWCP_2 ; There are multible hwcp.
783 CALL IS_DELIM ; Else, if not a delimiter
784 JNE EXIT_2 ; Then error, exit
785 JMP HWCP_1 ; Get another character.
786
787LEFT_BR: CMP RIGHT_FLAG,01H ; If no left bracket
788 JE EXIT_2 ; Then error, exit
789 JMP RB1 ; Jump to rb1
790
791COMMA_1: CMP COMMA_FLAG,01H ; If comma flag set
792 JE COM_2_HC ; Then exit hwcp parse.
793 MOV COMMA_FLAG,01H ; Else set comma flag.
794JMP HWCP_1 ; Get another character.
795
796HWCP_2: CMP RIGHT_FLAG,01H ; If left bracket not set
797 JNE EXIT_2 ; then error.
798 CALL MUL_HWCP ; else call multiple hwcp
799 ADD DI,02H ; routine. Increment DI
800 MOV TABLE_5,DI ; Desg. Table starts at end
801 CALL OFFSET_TABLE ; Update table of offsets.
802 JMP HP_X ; Exit.
803
804HP1: JMP HWCP ; Jump too long.
805
806COM_2_HC: MOV DI,TABLE_4 ; DI points at hwcp table
807 MOV DS:WORD PTR [DI],0000H ; Set number of pages to
808 MOV COMMA_FLAG,00H ; Zero and reset comma flag.
809 ADD DI,02H ; Increment DI.
810 MOV TABLE_5,DI ; Desg. Table starts at end
811 CALL OFFSET_TABLE ; Update table of offsets.
812 JMP HP_X ; of hwcp table. Exit.
813
814RIGHT_BR: CMP RIGHT_FLAG,01H ; If left brackets not
815 JNE EXIT_2 ; Found then error.
816RB1: MOV ERROR_FLAG,02H ; Set end of line flag.
817 MOV BX,TABLE_4 ; Point at hwcp table
818 ADD BX,02H ; Adjust pointer to desg
819 MOV TABLE_5,BX ; table, and save in table_5
820 MOV DI,TABLE_1 ; Point at table of offsets
821 ADD DI,08H ; Set at DESG offset
822 MOV DS:WORD PTR [DI],BX ; Update table.
823 JMP HP_X ; Exit
824
825
826
827EXIT_2: MOV ERROR_FLAG,01H ; Set error flag.
828 JMP HP_X ; and exit.
829
830HWCP: CMP RIGHT_FLAG,01H ; If left brackets not
831 JNE EXIT_2 ; Found then error.
832 CALL HWCP_PARSE ; Call parse one hwcp.
833 CMP ERROR_FLAG,01H ; If error flag set
834 JE HP_X ; Then exit, else
835 CALL OFFSET_TABLE ; Update table of offsets.
836
837HP_X: RET
838
839HWCP_PARMS ENDP
840
841
842;********************************************************
843;** HWCP_PARSE : Parse the hardware code page page **
844;** number and change it from hex to binary. **
845;********************************************************
846
847HWCP_PARSE PROC
848
849 MOV DI,TABLE_4 ; Load address of hwcpages.
850 ADD DS:WORD PTR [DI],0001H ; Set count to 1
851
852 CALL GET_NUMBER ; Convert number to binary.
853 CMP ERROR_FLAG,01H ; If error then
854 JE HWCP_X ; Exit.
855 MOV DS:WORD PTR [DI+2],BX ; Else, save binary page number
856 ADD DI,04H ; Increment counter
857 MOV TABLE_5,DI ; Set pointer of designate num
858
859HWCP_X: RET
860
861HWCP_PARSE ENDP
862
863
864;********************************************************
865;** MUL_HWCP : Parse multiple hardware code pages **
866;** and convert them from hex to binary numbers. **
867;********************************************************
868
869MUL_HWCP PROC
870
871 MOV DI,TABLE_4 ; Load offset of table_4
872 MOV BX,DI ; in DI and Bx.
873 MOV HWCP_FLAG,00H ; Set hwcp flag off.
874
875MH1: CALL GET_CHAR ; Load character in AL.
876 JZ MH3 ; Exit if end of line.
877 CMP AL,')' ; If ')' then exit
878 JE MH2 ; end of parms.
879 CALL IS_DIGIT ; If a digit, then
880 JE MH4 ; Convert number to binary.
881 CALL IS_DELIM ; If not a delimiter
882 JNE MH3 ; then error, exit
883 JMP MH1 ; get another character.
884
885MH2: CALL GET_CHAR ; Get next character
886 JMP MH_X ; and exit.
887
888MH3: MOV ERROR_FLAG,01H ; Set error flag on.
889 JMP MH_X ; Exit.
890
891MH4: ADD HWCP_FLAG,01H ; Set hwcp flag on (0 off)
892 ADD DI,02H ; Increment table pointer
893 PUSH BX ; Save Bx
894 CALL GET_NUMBER ; Convert number to binary.
895 MOV DS:WORD PTR [DI],BX ; Add number to table
896 POP BX ; Restore BX.
897 CMP ERROR_FLAG,01H ; If error then
898 JE MH_X ; Exit.
899 ADD DS:WORD PTR [BX],01H ; Increment hwcp count.
900 DEC SI ; Point at character in AL
901 JMP MH1 ; (delimeter or ')').
902MH_X: RET
903
904MUL_HWCP ENDP
905
906
907
908;********************************************************
909;** DESG_PARMS : Scane for the designate numbers, and **
910;** parse it if found. Flag codes set to: **
911;** ERROR_FLAG = 0 - parsing completed. No error. **
912;** ERROR_FLAG = 1 - error found exit parse. **
913;** ERROR_FLAG = 2 - end of line found, exit parse. **
914;********************************************************
915
916
917DESG_PARMS PROC
918
919 MOV DI,TABLE_1 ; Get offset of dev in DI
920 MOV BX,TABLE_5 ; & offset of desg. in BX.
921 ADD DI,08 ; Location of desg offset in table.
922 MOV DS:WORD PTR [DI],BX ; Update table.
923 MOV COMMA_FLAG,00H ; Set comma flag off.
924
925 cmp al,'('
926 je df
927 cmp al,')'
928 je right_br2
929
930 cmp al,','
931 jne desg_parm1
932 mov comma_flag,01h
933
934DESG_PARM1: CALL GET_CHAR ; Get character in AL.
935 JZ EXIT_3 ; Error, if end of line
936 CALL IS_DIGIT ; If character is a digit
937 JE DESG ; Then convert to binary.
938 CMP AL,')' ; If a ')', then
939 JE RIGHT_BR2 ; end of parameters.
940 CMP AL,'(' ; If a '(' then
941 JE DF ; parse desg and font.
942 CMP AL,',' ; If a comma then
943 JE DP3 ; set flag.
944 CALL IS_DELIM ; If not a delimiter
945 JNE EXIT_3 ; then error.
946 JMP DESG_PARM1 ; Get another character.
947
948RIGHT_BR2: CMP RIGHT_FLAG,01H ; IF no '(' encountered,
949 JNE EXIT_3 ; then error, exit
950 JMP DP_x ; Jump to DP1.
951
952EXIT_3: MOV ERROR_FLAG,01H ; Set error flag on
953 JMP DP_X ; Exit.
954
955DF: CMP RIGHT_FLAG,01H ; If no '(' encountered
956 JB EXIT_3 ; then error, exit
957 CALL DESG_FONT ; Parse desg and font.
958 JMP DP1 ; Jump to DP1.
959
960DP2: CALL FIND_RIGHT_BR ; Check for ')'
961 JMP DP_X ; Exit.
962
963DP3: CMP COMMA_FLAG,01H ; If comma flag set
964 JE DP2 ; then error
965 MOV COMMA_FLAG,01H ; Else set comma flag on.
966 JMP DESG_PARM1 ; Get another character.
967
968DESG: MOV ERROR_FLAG,00H ; Set error flag off.
969 CALL DESG_PARSE ; Parse desg.
970DP1: CMP ERROR_FLAG,01H ; If error flag on then
971 JE DP_X ; Exit,
972 CALL FIND_RIGHT_BR ; Else check for ')'
973 CALL OFFSET_TABLE ; Update table
974
975DP_X: RET
976
977DESG_PARMS ENDP
978
979
980
981;********************************************************
982;** DESG_FONT : Parse the designate and font numbers & **
983;** change them from decimal to binary. **
984;********************************************************
985
986
987DESG_FONT PROC
988
989
990 MOV DI,TABLE_5 ; Get desg font table.
991 MOV COMMA_FLAG,00H ; Set comma flag off.
992DF1: CALL GET_CHAR ; Load a character in AL.
993 JZ DF3 ; Error if end of line.
994 CMP AL,',' ; Check if a comma.
995 JE DF2 ; Set flag.
996 CALL IS_DIGIT ; If a digit, then
997 JE DF5 ; Convert number to binary.
998 CMP AL,')' ; If a ')' then
999 JE DF4 ; Exit.
1000 CALL IS_DELIM ; If not a delimiter
1001 JNE DF3 ; then error, exit
1002 JMP DF1 ; Get another character.
1003
1004DF2: CMP COMMA_FLAG,01H ; If comma flag on
1005 JE DF3 ; then error, exit
1006 MOV COMMA_FLAG,01H ; Set comma flag on
1007 ADD DS:WORD PTR [DI],01H ; Increment desg counter.
1008 MOV DS:WORD PTR [DI+2],0FFFFH ; Load ffffh for desg empty
1009 JMP DF1 ; field.
1010
1011DF3: MOV ERROR_FLAG,01H ; Set error flag on.
1012 JMP DF_X ; Exit.
1013
1014DF4: CMP DESG_FLAG,00H ; If desg flag off
1015 JE DF3 ; then error, exit
1016 JMP DF_X ; Else exit.
1017
1018DF5: ADD DS:WORD PTR [DI],01H ; Increment desg font count.
1019 CMP DESG_FLAG,01H ; If desg flag is on
1020 JE DF6 ; then get font.
1021 CMP COMMA_FLAG,01H ; if comma flag is on
1022 JE DF6 ; then get font.
1023 MOV DESG_FLAG,01H ; Set desg flag on
1024 JMP DF7 ; Get desg number.
1025
1026DF6: ADD DI,02H ; adjust pointer to font.
1027 MOV DESG_FLAG,02H ; Set desg and font flag.
1028DF7: CALL GET_NUMBER ; Get a number & convert to
1029 CMP ERROR_FLAG,01H ; binary.
1030 JE DF_X ; If error flag set, Exit.
1031 MOV DS:WORD PTR [DI+2],BX ; Store number in table.
1032 CMP DESG_FLAG,02H ; If desg and font flag
1033 JNE DF1 ; not set, then get char.
1034 CALL FIND_RIGHT_BR ; Check for right bracket.
1035
1036DF_X: RET
1037
1038DESG_FONT ENDP
1039
1040
1041;********************************************************
1042;** DESG_PARSE : Parse the designate number and **
1043;** change it from decimal to binary. **
1044;********************************************************
1045
1046DESG_PARSE PROC
1047
1048 MOV DI,TABLE_5 ; Load designate location
1049 ADD DS:WORD PTR [DI],0001H ; Update table count.
1050
1051 CALL GET_NUMBER ; Get the ascii number and
1052 CMP ERROR_FLAG,01H ; conver it to binary
1053 JE DESG_X ; If error then exit
1054
1055 MOV DS:WORD PTR [DI+2],BX ; Else, save desg number
1056
1057
1058DESG_X: RET
1059
1060DESG_PARSE ENDP
1061
1062
1063;********************************************************
1064;** GET_NUMBER : Convert the number pointed to by SI **
1065;** to a binary number and store it in BX **
1066;********************************************************
1067
1068GET_NUMBER PROC
1069
1070 MOV CX,0AH ; Set multiplying factor
1071 XOR BX,BX ; Clear DX
1072
1073NEXT_NUM: SUB AL,30H ; Conver number to binary
1074 CBW ; Clear AH
1075 XCHG AX,BX ; Switch ax and bx to mul
1076 MUL CX ; already converted number by 10.
1077 JO ERR_NUM ; On over flow jump to error.
1078 ADD BX,AX ; Add number to total.
1079 JC ERR_NUM ; On over flow jump to error.
1080 XOR AX,AX ; Clear AX (clear if al=0a).
1081 CALL GET_CHAR ; Get next character
1082 JZ GET_NUM_X ; Exit, if end of line.
1083 CALL IS_DIGIT ; Call is digit.
1084 JNZ GET_NUM_X ; Exit if not a number.
1085 JMP NEXT_NUM ; Loop.
1086
1087ERR_NUM: MOV ERROR_FLAG,01H ; Set error code to 1.
1088
1089GET_NUM_X: RET
1090
1091GET_NUMBER ENDP
1092
1093
1094;********************************************************
1095;** UPDATE_TABLE : This routine set up pointers to the **
1096;** different offsets of the different tables **
1097;********************************************************
1098
1099UPDATE_TABLE PROC
1100
1101 MOV DS:WORD PTR [DI],BX ; Offset of offsets
1102 MOV TABLE_1,BX ; Table_1 points at offsets
1103
1104 MOV DI,BX ;
1105 ADD BX,0CH ;
1106 MOV DS:WORD PTR [DI+2],BX ; Offset of DEVICE name.
1107 MOV TABLE_2,BX ; Table_2 point at device name.
1108
1109 ADD BX,0AH ;
1110 MOV DS:WORD PTR [DI+4],BX ; Offset of ID name.
1111 MOV TABLE_3,BX ; Table_3 point at ID name.
1112
1113 ADD BX,0AH ;
1114 MOV DS:WORD PTR [DI+6],BX ; Offset of HWCP pages.
1115 MOV TABLE_4,BX ; Table_4 point at HWCP pages.
1116
1117 RET
1118
1119UPDATE_TABLE ENDP
1120
1121
1122;********************************************************
1123;** OFFSET_TABLE : This routine set up pointers of **
1124;** tables number one and two. **
1125;********************************************************
1126
1127OFFSET_TABLE PROC
1128
1129 MOV DI,TABLE_1 ; Increment the number
1130 ADD DS:WORD PTR [DI],01H ; of parms foun. (ie. id,hwcp
1131 RET ; and desg)
1132
1133OFFSET_TABLE ENDP
1134
1135
1136;********************************************************
1137;** FIND_RIGHT_BR :This routine scane the line for a **
1138;** ')' if cannot find it turns error flag on **
1139;********************************************************
1140
1141FIND_RIGHT_BR PROC
1142
1143FBR1: CMP AL,')' ; If a right bracket
1144 JE FBR_X ; then exit.
1145 CMP AL,' ' ; If not a space
1146 JNE FBR2 ; Then error.
1147 CALL GET_CHAR ; Get a character
1148 JZ FBR2 ; If end of line then exit.
1149 JMP FBR1 ; Else get another character.
1150
1151FBR2: MOV ERROR_FLAG,01H ; Set error flag on
1152FBR_X: MOV AL,20H ; Erase character from AL.
1153 RET
1154
1155FIND_RIGHT_BR ENDP
1156
1157;;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1158;;
1159;; ++++++++++++++++++++++++
1160;; ++ INIT Command ++
1161;; ++++++++++++++++++++++++
1162;;
1163;;==== Command Code 0 - Initialization ======
1164;;
1165;; messages returned :
1166;;
1167;; msg_bad_syntax -- syntax error from parser, no driver installation
1168;; msg_no_init -- device cannot be initialised
1169;; msg_insuff_mem -- insufficient memory
1170;;
1171;; layout : the initialization is done in two stages :
1172;;
1173;; ++++++++++++++++++++++++
1174;; ++ INIT Stage 1 ++ to examine and extract the
1175;; ++++++++++++++++++++++++ parameters defined for the
1176;; device_id in DEVICE command,
1177;; according to the printer
1178;; description table for the
1179;; device_id.
1180;;
1181;; ++++++++++++++++++++++++
1182;; ++ INIT Stage 2 ++ to set the BUFfer for the LPTn
1183;; ++++++++++++++++++++++++ or PRN according to device_id's
1184;; parameters
1185;;
1186;;
1187;;
1188;;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1189 ;;
1190DEV_NUM dw ? ;;
1191 ;;
1192;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1193;
1194; Tables for the deivce_id parameters in the order of device_id in the
1195; PARSE table
1196; === the tables serves as the link between LPTn to be defined in the 2nd
1197; stage, and the device_id that is processed in the first stage.
1198;
1199;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1200 ;;
1201 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1202 ;; device ID indicators :
1203 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1204DID_MAX EQU 4 ;; device entris exepcted in PARSE
1205;; not more than 16. ;; table
1206 ;;
1207DID_STATUS DW 0 ;; status of parsing device id
1208 ;; = 0 : all Device-ID bad
1209 ;; -- see DID_BIT
1210 ;;
1211DID_MATCH DW 0 ;; this DID has device_name matched
1212 ;;
1213DID_FAIL DW 0 ;; to fail the good DID_STATUS and
1214 ;; the matched name. (due to
1215 ;; inconsistency among the same LPTn
1216 ;; or between PRN and LPT1.)
1217 ;;
1218;; (DID_STATUS) AND (DID_MATCH) XOR (DID_FAIL) determines the success of DID
1219 ;; initialization
1220 ;;
1221DID_ONE EQU 00001H ;; first device-ID
1222DID_TWO EQU 00002H ;; second "
1223DID_THREE EQU 00004H ;; third "
1224DID_FOUR EQU 00008H ;; fourth "
1225;;maximun number of device_id = 16 ;;
1226 ;;
1227DID_BIT LABEL WORD ;;
1228 DW DID_ONE ;;
1229 DW DID_TWO ;;
1230 DW DID_THREE ;;
1231 DW DID_FOUR ;;
1232;;maximun number of device_id = 16 ;;
1233 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1234 ;; device paramters according to the
1235 ;; device_id defined in DEVICE and the
1236 ;; parameters defined for the device_id
1237 ;; in the printer description table.
1238 ;;
1239HRMAX LABEL word ;; number of hwcp+cart slots supported
1240 DW 0 ;; did = 1
1241 DW 0 ;; did = 2
1242 DW 0 ;; did = 3
1243 DW 0 ;; did = 4
1244;upto max DID_MAX ;;
1245 ;;
1246CTMAX LABEL word ;; number of cart slots supported
1247 DW 0 ;; did = 1
1248 DW 0 ;; did = 2
1249 DW 0 ;; did = 3
1250 DW 0 ;; did = 4
1251;upto max DID_MAX ;;
1252 ;;
1253RMMAX LABEL word ;; number of ram-slots supported
1254 DW 0 ;; did = 1
1255 DW 0 ;; did = 2
1256 DW 0 ;; did = 3
1257 DW 0 ;; did = 4
1258;upto max DID_MAX ;;
1259 ;;
1260RBUMAX LABEL word ;; number of ram-designate slots
1261 DW 0 ;; did = 1
1262 DW 0 ;; did = 2
1263 DW 0 ;; did = 3
1264 DW 0 ;; did = 4
1265;upto max DID_MAX ;;
1266 ;;
1267DESCO LABEL word ;; offset to the description table
1268 ;; where the device_id is defined.
1269 DW -1 ;; did = 1
1270 DW -1 ;; did = 2
1271 DW -1 ;; did = 3
1272 DW -1 ;; did = 4
1273;upto max DID_MAX ;;
1274 ;;
1275FSIZE LABEL word ;; font size of the device
1276 DW 0 ;; did = 1
1277 DW 0 ;; did = 2
1278 DW 0 ;; did = 3
1279 DW 0 ;; did = 4
1280;upto max DID_MAX ;;
1281 ;;
1282;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1283;
1284; Hard/RAM slots table in the order of DEVICE parameters
1285;
1286; number of entries in all HARD_SLn is determined by the max. {HSLOTS}, and
1287; number of entries in all RAM_SLn is determined by the max. {RSLOTS}
1288;
1289; -- they are initialized according to the device_id defined in the DEVICE.
1290;
1291;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1292 ;;
1293HARD_SLA LABEL word ;; index in the order of device in
1294 DW OFFSET (HARD_SL1) ;; the PARSE-talbes
1295 DW OFFSET (HARD_SL2) ;;
1296 DW OFFSET (HARD_SL3) ;;
1297 DW OFFSET (HARD_SL4) ;;
1298; up to DID_MAX ;;
1299 ;;
1300RAM_SLA LABEL word ;;
1301 DW OFFSET (RAM_SL1) ;;
1302 DW OFFSET (RAM_SL2) ;;
1303 DW OFFSET (RAM_SL3) ;;
1304 DW OFFSET (RAM_SL4) ;;
1305; up to DID_MAX ;;
1306 ;;
1307;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1308;;
1309;; ++++++++++++++++++++++++
1310;; ++ INIT Command ++
1311;; ++++++++++++++++++++++++
1312;;
1313;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1314 ;;
1315INIT PROC NEAR ;;
1316 ;;
1317;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1318;; parse the initialization parameters in DEVICE command
1319;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1320;;
1321 ;;
1322 CMP BUF.BFLAG,BF_PRN ;; since PRN is the FIRST device header
1323 JNE NOT_PRN ;;
1324 ;;
1325 ;;
1326 MOV AX,OFFSET CODE_END ;; defined only once for each DEVICE
1327 XOR CX,CX ;;
1328 MOV CL,4 ;;
1329 SHR AX,CL ;;
1330 PUSH CS ;;
1331 POP CX ;;
1332 ADD AX,CX ;;
1333 INC AX ;; leave 16 bytes,room for resident_end
1334 MOV RESIDENT_END,AX ;;
1335 ;;
1336 CALL PARSER ;; call only once, for PRM
1337 ;;
1338 JMP PROCESS_TABLE ;;
1339 ;;
1340NOT_PRN : ;;
1341 CMP DEV_NUM,1 ;;
1342 ;;
1343 JNB PROCESS_TABLE ;;
1344 ;;
1345 JMP SYNTAX_ERROR ;;
1346 ;;
1347 ;;
1348 ;;
1349;;
1350;;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1351;;
1352;; ++++++++++++++++++++++++
1353;; ++ INIT Stage 1 ++
1354;; ++++++++++++++++++++++++
1355;;
1356;; INIT - FIRST STAGE :
1357;;
1358;; == test and extract if the parameters on device-id is valid
1359;; == determine the DID_STATUS according to the validity of the parameters
1360;; == procedure(s) called -- DID_EXTRACT
1361;;
1362;;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1363 ;;
1364PROCESS_TABLE : ;;
1365 ;;
1366 PUSH CS ;;
1367 POP ES ;; PSE points to Device offsets
1368 MOV DI,OFFSET(table) ;; ES:[DI]
1369 MOV DX,PSE.PAR_DEV_NUM ;;
1370 MOV DEV_NUM,DX ;;
1371 ;;
1372 CMP DEV_NUM,0 ;;
1373 JNZ NO_SYNTAX_ERR ;;
1374 ;;
1375 XOR AX,AX ;;
1376 MOV AH,09H ;;
1377 MOV DX,OFFSET MSG_BAD_SYNTAX;;
1378 INT 21H ;;
1379 ;;
1380 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1381SYNTAX_ERROR : ;; set the request header status
1382 ;; according to the STATE
1383 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1384 MOV AX, RESIDENT_END ;;
1385 PUSH CS ;;
1386 POP CX ;; CX=CS
1387 SUB AX,Cx ;; additional segment required.
1388CS_LOOP1: ;;
1389 CMP AX,1000H ;;
1390 JB CS_LPEND1 ;;
1391 ADD CX,1000H ;;
1392 SUB AX,1000H ;;
1393 JMP CS_LOOP1 ;;
1394 ;;
1395CS_LPEND1: ;;
1396 SHL AX,1 ;;
1397 SHL AX,1 ;;
1398 SHL AX,1 ;;
1399 SHL AX,1 ;;
1400 ;;
1401 LES DI,dword ptr buf.rh_ptro ;; get Request Header address
1402; MOV RH.RH0_ENDO,AX ;;
1403 MOV RH.RH0_ENDO,0 ;;
1404 MOV RH.RH0_ENDS,CX ;;
1405 MOV RH.RHC_STA,stat_cmderr ;; set status in request header
1406 ;;
1407 JMP INIT_RETurn ;;
1408 ;;
1409 ;;
1410NO_SYNTAX_ERR : ;;
1411 ;;
1412 CMP DX,DID_MAX ;;
1413 JNA NEXT_DID ;;
1414 ;;
1415 MOV INIT_CHK,0001H ;; ERROR 0001
1416 JMP BAD_DID ;; more than supported no. of device
1417 ;;
1418NEXT_DID: ;;
1419 PUSH DI ;; pointer to PAR_OT (table 1)
1420 AND DX,DX ;;
1421 JNZ SCAN_DESC ;;
1422 JMP END_DID ;; DI = offset to the 1st PARSE table
1423;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1424SCAN_DESC: ;;
1425 MOV DI,PSE.PAR_OFF ;; points to the nth device
1426 ;;
1427 ;; find the description for the
1428 ;;device-id
1429 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1430 MOV CX,PRINTER_DESC_NUM ;;
1431 MOV SI, OFFSET(PRINTER_DESC_TBL); offset to the description table
1432 PUSH CS ;;
1433 POP DS ;;
1434; $SEARCH ;;
1435$$DO1:
1436 PUSH CX ;; save device count
1437 PUSH SI ;; pointer to printer-descn's offset
1438 MOV SI,CS:WORD PTR[SI] ;;
1439 AND CX,CX ;;
1440 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1441; $LEAVE Z ;; LEAVE if no more device description
1442 JZ $$EN1
1443 PUSH DI ;; save offset to PAR_DEVOT
1444 MOV DI,PSE.PAR_DIDO ;;
1445 MOV CX,PSE.PAR_DIDL ;; length of parsed device name
1446 LEA DI,PSE.PAR_DID ;; pointer to parse device name
1447 ;;
1448 PUSH SI ;;
1449 LEA SI,[SI].TYPEID ;; offset to name of device-id
1450 REPE CMPSB ;;
1451 POP SI ;;
1452 POP DI ;; get back offset to PAR_DEVOT
1453 ;;;;;;;;;;;;;;;;;;;;;;;;
1454; $EXITIF Z ;; EXIT if name matched
1455 JNZ $$IF1
1456 ;;
1457 CALL DID_EXTRACT ;; get the parameters
1458 ;;
1459 POP SI ;; balance push-pop
1460 POP CX ;;
1461 ;;
1462 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1463; $ORELSE ;; try next description :
1464 JMP SHORT $$SR1
1465$$IF1:
1466 ;;
1467 POP SI ;; of printer_descn offset table
1468 INC SI ;;
1469 INC SI ;; next offset to PRINTER_DESCn
1470 ;;
1471 POP CX ;; one description less
1472 DEC CX ;;
1473 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1474; $ENDLOOP ;; DEVICE-ID not defined in
1475 JMP SHORT $$DO1
1476$$EN1:
1477 ;; printer_desc;
1478 ;;
1479 MOV AX,INIT_CHK ;;
1480 AND AX,AX ;;
1481 JNZ UNCHANGED ;;
1482 MOV INIT_CHK,0004H ;; ERROR 0004
1483UNCHANGED: ;;
1484 POP SI ;; balance push-pop
1485 POP CX ;;
1486 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1487; $ENDSRCH ;; End of scanning printer_desc
1488$$SR1:
1489;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1490 POP DI ;;
1491 INC DI ;;
1492 INC DI ;; points to next device in PART_OT
1493 DEC DX ;;
1494 ;;
1495 JMP NEXT_DID ;;
1496 ;;
1497END_DID : ;;
1498 POP DI ;;
1499BAD_DID : ;;
1500 ;;
1501 MOV AX,DID_STATUS ;;
1502 AND AX,AX ;;
1503 JNZ DEF_BUFFER ;;
1504 ;;
1505 JMP END_LPT ;;
1506 ;;
1507;;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1508;;
1509;; ++++++++++++++++++++++++
1510;; ++ INIT Stage 2 ++
1511;; ++++++++++++++++++++++++
1512;;
1513;; INIT -- SECOND STAGE :
1514;;
1515;; == match the device_name extracted in stage 1 with the name of PRN or
1516;; LPTn
1517;;
1518;; == if the PRN/LPTn has never been defined before, then set up the BUF
1519;; for the PRN/LPTn if the DID_STATUS is good; otherwise message will
1520;; be generated indicating it cannot be initilized.
1521;;
1522;; == if there is PRN, LPT1 is also setup, and vice vera. IF both PRN and
1523;; LPT1 are on the DEVICE command, or there are multiple entries for
1524;; the same LPTn, the consistency is checked. It they are inconsistent
1525;; the associated LPTn or PRN is forced to fail by : DID_FAIL.
1526;;
1527;; == if the device_name on the DEVICE command is not one of the supported
1528;; PRN or LPTn, then DID_MATCH bit will not be set. An error message
1529;; will be generated for the device_name indicating it cannot be
1530;; initialized.
1531;;
1532;; == procedure(s) called : CHK_DID .. check DID parameters for device
1533;; whose name matched.
1534;; DEV_CHECK .. if device-name duplicated, or
1535;; there are both PRN/LPT1 : check
1536;; for consistent parameters.
1537;;
1538;;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1539DEF_BUFFER : ;;
1540 PUSH CS ;;
1541 POP ES ;; PSE points to Device offsets
1542 MOV DI,OFFSET(table) ;; ES:[DI]
1543 xor cx,cx ;; device order in parse table
1544;SEARCH ;;
1545$$DO7:
1546 PUSH DI ;; pointer to PAR_OT
1547 PUSH CX ;; save device count
1548 MOV DI,PSE.PAR_OFF ;; " " PAR_DEVOT
1549 cmp cx,dev_num ;;
1550 ;;
1551;LEAVE NB ;; LEAVE if no more device entry
1552 jb MORE_DEVICE ;;
1553 JMP $$EN7
1554MORE_DEVICE : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1555 ;; more parsed_device to be checked
1556 PUSH DI ;; save offset to PAR_DEVOT
1557 MOV DI,PSE.PAR_DNMO ;;
1558 MOV CX,PSE.PAR_DNML ;; length of parsed device name
1559 LEA DI,PSE.PAR_DNM ;; pointer to parse device name
1560 ;;
1561 LDS SI,DWORD PTR BUF.DEV_HDRO ; get the offset to device-n header
1562 LEA SI,HP.DH_NAME ;; " offset to name of device-n
1563 REPE CMPSB ;;
1564 POP DI ;; get back offset to PAR_DEVOT
1565 ;;
1566 ;;;;;;;;;;;;;;;;;;;;;;;;;;
1567;EXITIF Z ;; EXIT if name matched
1568 JZ NAME_MATCHED ;;
1569 ;;
1570 JMP MORE_PARSED_DEVICE ;;
1571 ;;
1572NAME_MATCHED : ;;
1573 ;;
1574 POP CX ;; the DID order
1575 PUSH BX ;;
1576 MOV BX,CX ;;
1577 ADD BX,BX ;;
1578 MOV AX,DID_BIT[BX] ;;
1579 OR DID_MATCH,AX ;; this DID matched
1580 POP BX ;;
1581 PUSH CX ;;
1582 ;;
1583 LEA SI,BUF.PAR_EXTRACTO ;; was the LPT1/PRN defined before ?
1584 MOV AX,CS:[SI].PAR_DNMO ;;
1585 CMP AX,0FFFFH ;;
1586 ;;
1587 JNE DEV_COMPARE ;; DI = PAR_DEVOT
1588 ;;-----------------------------------
1589 ;;
1590 ;; no device previousely defined
1591 MOV AX,PSE.PAR_DNMO ;;
1592 MOV CS:[SI].PAR_DNMO,AX ;; define device parameters for LPTn
1593 ;;
1594 MOV AX,PSE.PAR_DIDO ;;
1595 MOV CS:[SI].PAR_DIDO,AX ;;
1596 ;;
1597 MOV AX,PSE.PAR_HWCPO ;;
1598 MOV CS:[SI].PAR_HWCPO,AX ;;
1599 ;;
1600 MOV AX,PSE.PAR_DESGO ;;
1601 MOV CS:[SI].PAR_DESGO,AX ;;
1602 ;;
1603 MOV AX,PSE.PAR_PARMO ;;
1604 MOV CS:[SI].PAR_PARMO,AX ;;
1605 ;;
1606 ;;---------------------------------
1607 CALL CHK_DID ;; define the STATE according to
1608 ;; DID_STATUS
1609 JMP MORE_PARSED_DEVICE ;;
1610 ;;
1611DEV_COMPARE : ;;-------------------------------
1612 ;; e.g. LPT1 and PRN shares one BUF.
1613 ;; or duplicated device name
1614 CALL DEV_CHECK ;;
1615 ;;
1616 CMP BUF.STATE,CPSW ;;
1617 JNE DEV_COMPARE_FAIL ;;
1618 ;;
1619 JMP MORE_PARSED_DEVICE ;;
1620 ;;
1621DEV_COMPARE_FAIL : ;;
1622 ;;
1623 POP CX ;;
1624 POP DI ;; balance push-pop
1625 ;;
1626 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1627;$ORELSE ;;
1628 JMP END_LPT
1629 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1630MORE_PARSED_DEVICE : ;; name does not match
1631 ;;
1632 POP CX ;;
1633 INC CX ;;
1634 POP DI ;;
1635 INC DI ;;
1636 INC DI ;; points to next device in PART_OT
1637 ;;
1638 jmp $$DO7 ;;
1639;$ENDLOOP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1640$$EN7: ;; no device found for LPTn
1641 ;;
1642 POP CX ;;
1643 POP DI ;; balance push-pop
1644 ;;
1645 CMP BUF.STATE,CPSW ;;
1646 JE END_LPT ;; for LPT1/PRN pair
1647 ;;
1648 MOV BUF.STATE,NORMAL ;; no device defined for the LPTn
1649 ;;
1650 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1651 ;; End of defining LPTn Buffer
1652 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1653;$ENDSRCH ;;
1654END_LPT : ;;
1655 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1656 ;; set the request header status
1657 ;; according to the STATE
1658 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1659 MOV AX, RESIDENT_END ;;
1660 PUSH CS ;;
1661 POP CX ;; CX=CS
1662 SUB AX,Cx ;; additional segment required.
1663CS_LOOP2: ;;
1664 CMP AX,1000H ;;
1665 JB CS_LPEND2 ;;
1666 ADD CX,1000H ;;
1667 SUB AX,1000H ;;
1668 JMP CS_LOOP2 ;;
1669 ;;
1670CS_LPEND2: ;;
1671 SHL AX,1 ;;
1672 SHL AX,1 ;;
1673 SHL AX,1 ;;
1674 SHL AX,1 ;;
1675 ;;
1676 LES DI,dword ptr buf.rh_ptro ;; get Request Header address
1677 MOV RH.RH0_ENDO,AX ;;
1678 MOV RH.RH0_ENDS,CX ;;
1679 XOR AX,AX ;; clear error code to be returned
1680 MOV CX,BUF.STATE ;;
1681 CMP CX,CPSW ;;
1682 JE MATCH_GOOD ;;
1683 MOV AX,STAT_CMDERR ;;
1684 ;;
1685MATCH_GOOD : ;;
1686 MOV RH.RHC_STA,AX ;; set status in request header
1687 ;;
1688BUF_END : ;;
1689 ;;
1690 CMP BUF.BFLAG,BF_LPT1 ;;
1691 JNE BUF_MESSAGES ;;
1692 ;;
1693 CMP BUF.STATE,CPSW ;;
1694 JNE BUF_MESSAGES ;;
1695 ;; set PRN to the same setting as LPT1
1696 PUSH BX ;;
1697 ;;
1698 LEA SI,BUF.RNORMO ;;
1699 LEA CX,BUF.BUFEND ;;
1700 SUB CX,SI ;;
1701 MOV BX,BUF.PRN_BUFO ;; where PRN buffer is
1702 LEA DI,BUF.RNORMO ;;
1703 PUSH CS ;;
1704 POP ES ;;
1705 PUSH CS ;;
1706 POP DS ;;
1707 REP MOVSB ;;
1708 ;;
1709 POP BX ;;
1710 ;;
1711BUF_MESSAGES : ;;
1712 CMP BUF.BFLAG,BF_LPT3 ;; generate error message is this is
1713 je last_round ;; the last LPTn
1714 Jmp INIT_RETURN ;;
1715 ;; ERROR messages will be generated
1716 ;; at the end of initialization of all
1717 ;; the LPT devices
1718last_round : ;;
1719 MOV AX,RESIDENT_END ;;
1720 ADD AX,STACK_SIZE ;;
1721 MOV RESIDENT_END,AX ;;
1722 PUSH CS ;;
1723 POP CX ;; CX=CS
1724 SUB AX,Cx ;; additional segment required.
1725CS_LOOP3: ;;
1726 CMP AX,1000H ;;
1727 JB CS_LPEND3 ;;
1728 ADD CX,1000H ;;
1729 SUB AX,1000H ;;
1730 JMP CS_LOOP3 ;;
1731 ;;
1732CS_LPENd3: ;;
1733 SHL AX,1 ;;
1734 SHL AX,1 ;;
1735 SHL AX,1 ;;
1736 SHL AX,1 ;;
1737 ;;
1738 MOV RH.RH0_ENDO,AX ;; STACK !!!!!
1739 MOV STACK_ALLOCATED,0 ;; from now on, internal stack is used
1740 ;;
1741 MOV AX,DID_STATUS ;; what is the DID combination ?
1742 AND AX,DID_MATCH ;;
1743 XOR AX,DID_FAIL ;;
1744 ;;
1745 AND AX,AX ;;
1746 JNZ CODE_STAYED ;;
1747; MOV RH.RH0_ENDO,0 ;; none of the devices are good
1748 ;;
1749 ;;
1750CODE_STAYED : ;;
1751 MOV DI,OFFSET TABLE ;;
1752 push CS ;;
1753 POP ES ;;
1754 ;;
1755 XOR CX,CX ;;
1756MSG_LOOP : ;;
1757 CMP CX,DEV_NUM ;;
1758 JNB INIT_RETURN ;;
1759 SHR AX,1 ;;
1760 JC MSG_NEXT ;;
1761 ;; this device in parse table is bad
1762 PUSH DI ;;
1763 PUSH CX ;;
1764 PUSH AX ;;
1765 ;;
1766 MOV DI,PSE.PAR_OFF ;;
1767 MOV SI,PSE.PAR_DNMO ;;
1768 ;;
1769 PUSH CS ;;
1770 POP ES ;;
1771 PUSH CS ;;
1772 POP DS ;;
1773 ;;
1774 MOV CX,8 ;;
1775 LEA SI,[SI].PAR_DNM ;;
1776 ;;
1777 MOV DI,SI ;;
1778 ADD DI,7 ;; skip backward the blanks
1779 MOV AL,20H ;;
1780 STD ;;
1781 REPE SCASB ;;
1782 CLD ;;
1783 ;;
1784 MOV DI, OFFSET MSG_NO_INIT_P;;
1785 MOV DX,DI ;; for INT 21H
1786 XOR AX,AX ;;
1787 MOV AH,09H ;;
1788 INT 21H ;;
1789 ;;
1790 ;;
1791 MOV DI, OFFSET MSG_NO_INIT ;;
1792 MOV DX,DI ;; for INT 21H
1793 ;;
1794 INC CX ;;
1795 ;;
1796 PUSH CX ;; remaining name that is non blank
1797 MOV AX,CX ;;
1798 MOV CX,8 ;;
1799 SUB CX,AX ;;
1800 ADD DI,CX ;;
1801 MOV DX,DI ;;
1802 POP CX ;;
1803 REP MOVSB ;;
1804 ;;
1805 ;;
1806 XOR AX,AX ;;
1807 MOV AH,09H ;;
1808 INT 21H ;;
1809 ;;
1810 POP AX ;;
1811 POP CX ;;
1812 POP DI ;;
1813 ;;
1814MSG_NEXT : ;;
1815 INC CX ;;
1816 INC DI ;;
1817 INC DI ;;
1818 JMP MSG_LOOP ;;
1819 ;;
1820 ;;
1821INIT_RETURN : ;;
1822 ;;
1823 ;;
1824 RET ;;
1825 ;;
1826INIT ENDP ;;
1827;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1828;;
1829;; Call by INIT to extract parameters for the deivce_id
1830;;
1831;; on rntry :
1832;; ES:[DI] PARSE Table 2, offsets of all parameters
1833;; DS:[SI] Printer Description table whose TYPEID matched
1834;; DX "inverse" order of devices in the PARSE tables
1835;;
1836;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1837 ;;
1838 ;;
1839DID_EXTRACT PROC ;;
1840 ;;
1841 PUSH DX ;;
1842 ;;-----------------------------
1843 ;; define the DID_parameters
1844 PUSH BX ;;
1845 ;;
1846 MOV BX,DEV_NUM ;;
1847 SUB BX,DX ;; order in the Parse table
1848 add bx,bx ;; double to index [bx]
1849 MOV DX,BX ;;
1850 ;;
1851 MOV AX,DS:[SI].FONTSZ ;;
1852 MOV FSIZE[BX],AX ;; size of font buffer to be created
1853 ;;
1854 MOV AX,DS:[SI].HSLOTS ;;
1855 CMP AX,HARDSL_MAX ;;
1856 JNA LESS_HARDSL ;;
1857 MOV INIT_CHK, 0010H ;; ERROR 0010H
1858 POP BX ;;
1859 JMP END_MATCH_BAD ;;
1860LESS_HARDSL : ;;
1861 CMP AX,DS:[SI].HWCPMIN ;;
1862 JNB VALID_HARDSL ;;
1863 MOV INIT_CHK, 0012H ;; ERROR 0012H
1864 POP BX ;;
1865 JMP END_MATCH_BAD ;;
1866VALID_HARDSL : ;;
1867 MOV HRMAX[BX],AX ;;
1868 MOV CTMAX[BX],AX ;; will be reduced by the no. of hwcp
1869 ;;
1870 MOV AX,DS:[SI].RSLOTS ;;
1871 CMP AX,RAMSL_MAX ;;
1872 JNA LESS_RAMSL ;;
1873 MOV INIT_CHK, 0011H ;; ERROR 0011H
1874 POP BX ;;
1875 JMP END_MATCH_BAD ;;
1876LESS_RAMSL : ;;
1877 MOV RMMAX[BX],AX ;; see also designate
1878 ;;
1879 MOV DESCO[BX],SI ;;
1880 ;;
1881 POP BX ;;
1882 ;;----------------------------------
1883 ;;
1884 PUSH CX ;;
1885 ;;
1886HWCPgt: PUSH DI ;; get the hwcp
1887 ;;
1888 MOV DI,PSE.PAR_HWCPO ;;
1889 MOV CX,PSE.PAR_HWCPL ;; no. of hwcp
1890 AND CX,CX ;;
1891 JNZ chk_hwcp ;;
1892 push bx ;;
1893 mov bx,dx ;;
1894 MOV HRMAX[BX],CX ;;
1895 MOV CX,DS:[SI].HWCPMIN ;;
1896 SUB CTMAX[BX],CX ;; what is left becomes cartridge slot
1897 pop bx ;;
1898 JMP DESIGN ;;
1899 ;; hwcp to be defined
1900chk_hwcp: MOV AX,DS:[SI].HSLOTS ;; defined in printer_desc
1901 CMP CX,AX ;;
1902 JA BAD_MATCH2 ;;
1903 CMP CX,HARDSL_MAX ;;
1904 JNA HWCP_GOOD ;; jump if system error
1905 MOV INIT_CHK,0003H ;; ERROR 0003
1906 JMP END_MATCH ;;
1907BAD_MATCH2: ;;
1908 MOV INIT_CHK,0002H ;; ERROR 0002
1909 JMP END_MATCH ;;
1910 ;;
1911HWCP_GOOD: ;; there are sufficient hard-slot for
1912 ;; HWCP
1913 PUSH SI ;; printer description table of TYPEID
1914 PUSH BX ;;
1915 ;;
1916 MOV BX,DX ;;
1917 MOV AX,CTMAX[BX] ;;
1918 ;;
1919 PUSH CX ;; calculate what is left for cart_slot
1920 CMP CX,DS:[SI].HWCPMIN ;;
1921 JNB MORE_THAN_HWCPMIN ;;
1922 MOV CX,DS:[SI].HWCPMIN ;;
1923MORE_THAN_HWCPMIN : ;;
1924 SUB AX,CX ;;
1925 POP CX ;;
1926 mov HRMAX[BX],CX ;;
1927 ;;
1928 MOV CTMAX[BX],AX ;; no of cart-slot for designate
1929 MOV SI,HARD_SLA[BX] ;; get the corresponding hard-slots
1930 ;;
1931 POP BX ;;
1932 ;;
1933 push bx ;;
1934 push dx ;;
1935 mov bx,si ;;
1936 mov dx,cx ;;
1937 mov reserved1,dx ;; IF THERE IS ANY REPETITIVE HWCP
1938 mov reserved2,bx ;; IF THERE IS ANY REPETITIVE HWCP
1939 ;;
1940FILL_HWCP: ;;
1941 AND CX,CX ;;
1942 JZ DESIGN_P ;;
1943 INC DI ;; next code page in PARSE table
1944 INC DI ;;
1945 MOV AX,ES:[DI] ;; get code page value
1946 ;;
1947 ;; IF THERE IS ANY REPETITIVE HWCP
1948 push dx ;;
1949 push bx ;;
1950hwcp_norep : ;;
1951 cmp ax,cs:[bx].slt_cp ;;
1952 jne hwcp_repnext ;;
1953 pop bx ;;
1954 pop dx ;;
1955 pop dx ;;
1956 pop bx ;;
1957 pop si ;;
1958 jmp end_match ;;
1959 ;;
1960hwcp_repnext: ;;
1961 inc bx ;;
1962 inc bx ;;
1963 inc bx ;;
1964 inc bx ;;
1965 dec dx ;;
1966 jnz hwcp_norep ;;
1967 pop bx ;;
1968 pop dx ;;
1969 ;;
1970 MOV CS:[SI].SLT_CP,AX ;;
1971 MOV AX,CS:[SI].SLT_AT ;; get the attributes
1972 OR AX,AT_OCC ;; occupied
1973 OR AX,AT_HWCP ;; hwcp slot
1974 MOV CS:[SI].SLT_AT,AX ;;
1975 INC SI ;;
1976 INC SI ;; next slot
1977 INC SI ;; next slot
1978 INC SI ;; next slot
1979 DEC CX ;;
1980 JMP FILL_HWCP ;;
1981DESIGN_P: ;;
1982 pop dx ;;
1983 pop bx ;;
1984 POP SI ;;
1985 ;;---------------------
1986DESIGN: POP DI ;; get the designate no.
1987 PUSH DI ;;
1988 ;;
1989 MOV DI,PSE.PAR_DESGO ;;
1990 MOV AX,PSE.PAR_DESGL ;;
1991 CMP AX,1 ;;
1992 JA END_MATCH ;; there should have no font entry
1993 AND AX,AX ;;
1994 JZ DEF_RBUFMAX ;;
1995 ;;
1996 MOV AX,PSE.PAR_DESG ;;
1997 AND AX,AX ;;
1998 JZ DEF_RBUFMAX ;;
1999 ;;
2000 CMP CS:[SI].CLASS,1 ;;
2001 JNE DESIG_NOt_CLASS1 ;;
2002 ;;
2003 PUSH BX ;; if there is any cartridge slot ?
2004 PUSH AX ;;
2005 MOV BX,DX ;;
2006 MOV AX,ctmax[BX] ;;
2007 AND AX,AX ;;
2008 POP AX ;;
2009 POP BX ;;
2010 JZ END_MATCH ;; fail, as there is no physical RAM.
2011 ;;
2012 CMP AX,HARDSL_MAX ;; is the designate more than max ?
2013 JA END_MATCH ;;
2014 ;;
2015 ;;
2016 JMP DEF_RBUFMAX ;;
2017 ;;
2018 ;;
2019 ;;
2020DESIG_NOT_CLASS1 : ;;
2021 PUSH BX ;; if there is any physical RAM slot ?
2022 PUSH AX ;;
2023 MOV BX,DX ;;
2024 MOV AX,RMMAX[BX] ;;
2025 AND AX,AX ;;
2026 POP AX ;;
2027 POP BX ;;
2028 JZ END_MATCH ;; fail, as there is no physical RAM.
2029 ;;
2030 ;;
2031 CMP AX,RAMSL_MAX ;; is the designate more than max ?
2032 JA END_MATCH ;;
2033 ;;
2034DEF_RBUFMAX : ;;
2035 PUSH BX ;;
2036 MOV BX,DX ;;
2037 MOV RBUMAX[BX],AX ;;
2038 POP BX ;;
2039 ;;
2040 ;;
2041PARAM : ;;
2042;PARM: POP DI ;;
2043; PUSH DI ;;
2044;; MOV DI,PSE.PAR_PARMO ;;
2045 ;;
2046 ;,--------------------------
2047 ;; GOOD device_id parameters
2048 shr dx,1 ;;
2049 MOV AX,DID_ONE ;;
2050 MOV CX,DX ;;
2051 AND CX,CX ;;
2052 JZ NO_SHL ;;
2053 SHL AX,CL ;;
2054NO_SHL: OR DID_STATUS,AX ;; is defined
2055 ;;-------------------------
2056END_MATCH: POP DI ;; end of extract
2057 POP CX ;;
2058END_MATCH_BAD : ;;
2059 POP DX ;;
2060 ;;
2061 RET ;;
2062 ;;
2063DID_EXTRACT ENDP ;;
2064 ;;
2065;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2066;;
2067;; Called by INIT to define the STATE and BUF for the LPTn according to
2068;; the DID_STATUS. Create font buffer if requested through the "desi*nate"
2069;;
2070;; at entry : CX = device order in parse table
2071;;
2072;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2073CHK_DID PROC ;;
2074 ;;
2075 push cx ;;
2076 push di ;;
2077 push dx ;;
2078 ;;
2079 MOV AX,DID_STATUS ;;
2080 ;;
2081 PUSH CX ;; order 0 to m
2082 POP DI ;;
2083 ADD DI,DI ;; indexing : [DI]
2084 ;;
2085 INC CX ;;
2086 SHR AX,CL ;; is the device parameter valid ?
2087 ;;
2088 JC DEFINE_BUFFER ;;
2089 JMP LPT_FAIL ;;--------------------------
2090 ;;
2091DEFINE_BUFFER : ;;
2092 ;; good device parameters as determined
2093 MOV AX,DESCO[DI] ;;
2094 MOV BUF.PDESCO,AX ;;
2095 ;;
2096 PUSH DI ;;
2097 MOV DI,AX ;;
2098 MOV AX,CS:[DI].CLASS ;;
2099 MOV BUF.PCLASS,AX ;;
2100 POP DI ;;
2101 ;;
2102 MOV AX,HARD_SLA[DI] ;; in the DID_EXTRACT
2103 MOV BUF.HARDSO,AX ;;
2104 ;;
2105 MOV AX,RAM_SLA[DI] ;;
2106 MOV BUF.RAMSO,AX ;;
2107 ;;
2108 MOV AX,HRMAX[DI] ;;
2109 MOV BUF.HARDMX,AX ;;
2110 ;;
2111 MOV AX,CTMAX[DI] ;;
2112 MOV BUF.HCARMX,AX ;;
2113 ;;
2114 ADD AX,HRMAX[DI] ;; defore "designate"
2115 MOV BUF.HSLMX,AX ;;
2116 ;;
2117 ;;
2118 MOV AX,RMMAX[DI] ;;
2119 MOV BUF.RAMMX,AX ;;
2120 ;;
2121 XOR AX,AX ;;
2122 PUSH CX ;; calculate the max. length of control
2123 MOV CX,2 ;; sequence that is allowed for the
2124 CMP BUF.PCLASS,1 ;; room reserved for physical slots.
2125 JNE CTL_LOOP ;;
2126 MOV CX,1 ;; class 1 printer has one control seq.
2127CTL_LOOP : ;;
2128 ADD AX,CTL_MAX ;;
2129 DEC AX ;; leave one byte for the length
2130 DEC CX ;;
2131 JNZ CTL_LOOP ;;
2132 MOV BUF.FSELMAX,AX ;;
2133 POP CX ;;
2134 ;;
2135 MOV AX,FSIZE[DI] ;;
2136 MOV BUF.FTSZPA,AX ;; FTSIZE in paragraph
2137 ;;
2138 PUSH AX ;;
2139 ;;
2140 MOV DX,4 ;;
2141FT_PARA: ;;
2142 ADD AX,AX ;;
2143 DEC DX ;;
2144 JNZ FT_PARA ;; font size
2145 MOV BUF.FTSIZE,AX ;; font size in bytes (used with.RBUFMX)
2146 ;;
2147 POP DX ;; FTSIZE in paragraph
2148 ;;
2149 MOV CX,RBUMAX[DI] ;; create font buffer per .RBUFMX and
2150 MOV BUF.RBUFMX,CX ;; assume sufficient memory for all the
2151 ;; "designate request"
2152 PUSH CX ;;
2153 ;;
2154 CMP BUF.PCLASS,1 ;; always create font buffer for class1
2155 JNE CLASS_NOT_1 ;;
2156 ;;
2157 AND CX,CX ;;
2158 JZ CLASS1_NOCX ;;
2159 ADD CX,BUF.HARDMX ;;
2160 MOV BUF.HSLMX,CX ;;
2161 JMP CLASS_NOT_1 ;;
2162 ;;
2163CLASS1_NOCX: ;;
2164 MOV CX,BUF.HSLMX ;;
2165 ;;
2166CLASS_NOT_1 : ;;
2167 AND CX,CX ;;
2168 JZ MULTIPLE_DONE ;;
2169 MOV AX,RESIDENT_END ;;
2170MULTIPLE_FT : ;;
2171 ADD AX,DX ;; allocate the font buffers at the end
2172 DEC CX ;; of the resident codes
2173 JNZ MULTIPLE_FT ;;
2174 ;;
2175 ;;
2176 MOV CX,RESIDENT_END ;;
2177 MOV BUF.FTSTART,CX ;;
2178 MOV RESIDENT_END,AX ;;
2179 ;;
2180 ;;
2181MULTIPLE_DONE : ;;
2182 POP CX ;; designate requested
2183 ;;
2184 CMP BUF.PCLASS,1 ;;
2185 JNE DEF_RBUF ;;
2186 ;; CLASS 1
2187 CMP BUF.HARDMX,0 ;;
2188 JE DEFBUF_DONE ;;
2189 ;;
2190 PUSH CX ;; STACKS...
2191 PUSH SI ;;
2192 PUSH DS ;;
2193 PUSH ES ;;
2194 PUSH DI ;;
2195 PUSH DX ;;
2196 ;;
2197 MOV DX,BUF.HARDMX ;;
2198 PUSH DX ;; STACK +1 -- # of HWCP
2199 ;;
2200 PUSH CS ;;
2201 POP DS ;;
2202 MOV BUF.RBUFMX,0 ;;
2203 MOV SI,BUF.PDESCO ;;
2204 MOV SI,CS:[SI].SELH_O ;;
2205 XOR CX,CX ;;
2206 MOV CL,CS:BYTE PTR [SI] ;;
2207 INC CX ;; including the length byte
2208 ;;
2209 MOV DI,BUF.FTSTART ;; control template
2210DEF_FTBUF: ;; fill the font buffer with the
2211 PUSH DI ;;
2212 POP ES ;;
2213 XOR DI,DI ;;
2214 ;;
2215 PUSH CX ;;
2216 PUSH SI ;;
2217 REP MOVSB ;;
2218 POP SI ;;
2219 POP CX ;;
2220 ;;
2221 PUSH ES ;;
2222 POP DI ;;
2223 ADD DI,BUF.FTszpa ;;
2224 DEC DX ;;
2225 JNZ DEF_FTBUF ;;
2226 ;;
2227 POP DX ;; STACK -1
2228 ;;
2229 MOV SI,BUF.HARDSO ;;
2230 MOV DI,BUF.FTSTART ;; define the HWCP values
2231DEF_FThwcp : ;;
2232 PUSH DI ;;
2233 POP ES ;;
2234 MOV DI,CTL5202_OFFS ;; offset to the HWCP words
2235 ;;
2236 MOV AX,CS:[SI].SLT_CP ;;
2237 MOV ES:WORD PTR [DI],AX ;;
2238 ;;
2239 INC SI ;;
2240 INC SI ;;
2241 INC SI ;;
2242 INC SI ;;
2243 ;;
2244 PUSH ES ;;
2245 POP DI ;;
2246 ADD DI,BUF.FTSZPA ;;
2247 DEC DX ;;
2248 JNZ DEF_FThwcp ;;
2249 ;;
2250 POP DX ;;
2251 POP DI ;;
2252 POP ES ;;
2253 POP DS ;;
2254 POP SI ;;
2255 POP CX ;;
2256 ;;
2257 JMP DEFBUF_DONE ;;
2258 ;;
2259 ;;
2260DEF_RBUF : ;;
2261 MOV BUF.RSLMX,CX ;; the no. of ram slots supported
2262 CMP CX,RMMAX[DI] ;;
2263 JNB DEFBUF_DONE ;;
2264 MOV AX,RMMAX[DI] ;;
2265 MOV BUF.RSLMX,AX ;; the max. of .RAMMX and .RBUFMX
2266 ;;
2267DEFBUF_DONE : ;;
2268 MOV BUF.STATE,CPSW ;; the LPTn is CPSW ----- STATE
2269 ;;
2270 CMP BUF.BFLAG,BF_PRN ;;
2271 JNE RET_CHK_DID ;;
2272 MOV AX,DID_BIT[DI] ;;
2273 MOV BUF.DID_PRN,AX ;;
2274 ;;
2275 ;;
2276 JMP RET_CHK_DID ;;
2277 ;;
2278LPT_FAIL: ;;
2279 ;;
2280 MOV BUF.STATE,NORMAL ;; the LPTn is NORMAL --- STATE
2281 ;;
2282 ;;
2283RET_CHK_DID: ;;
2284 ;;
2285 pop dx ;;
2286 pop di ;;
2287 pop cx ;;
2288 ;;
2289 RET ;;
2290 ;;
2291CHK_DID ENDP ;;
2292 ;;
2293;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2294;;
2295;; Called by INIT to check for consistency between duplicated device name and
2296;; between PRN and LPT1
2297;;
2298;; at entry : DI = pointer to PAR_DEVOT
2299;; BUF.STATE = any state
2300;; CX = DID order
2301;;
2302;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2303 ;;
2304DEV_CHECK PROC ;;
2305 ;;
2306 LEA SI,BUF.PAR_EXTRACTO ;;
2307 ;;
2308 PUSH CX ;;
2309 ;;
2310 PUSH SI ;; compare device id
2311 PUSH DI ;;
2312 mov SI,[SI].PAR_DIDO ;;
2313 MOV DI,PSE.PAR_DIDO ;;
2314 MOV CX,PSE.PAR_DNML ;;
2315 INC CX ;; including length
2316 INC CX ;;
2317 REPE CMPSB ;;
2318 POP DI ;;
2319 POP SI ;;
2320 Jz hwcp_check ;;
2321 mov init_chk,0021h ;; error 0021h
2322 Jmp FORCE_LPT_BAD ;;
2323 ;;
2324hwcp_check : ;;
2325 PUSH SI ;; compare HWCP
2326 PUSH DI ;;
2327 mov SI,[SI].PAR_HWCPO ;;
2328 MOV DI,PSE.PAR_HWCPO ;;
2329 MOV AX,PSE.PAR_HWCPL ;;
2330 MOV CX,2 ;;
2331 SHL AX,CL ;; multiply by two
2332 INC AX ;; including length
2333 INC AX ;;
2334 MOV CX,AX ;;
2335 REPE CMPSB ;;
2336 POP DI ;;
2337 POP SI ;;
2338 Jz desig_check ;;
2339 mov init_chk,0022h ;; error 0022h
2340 Jmp FORCE_LPT_BAD ;;
2341 ;;
2342desig_check : ;;
2343 PUSH SI ;; compare DESIGNATE
2344 PUSH DI ;;
2345 mov SI,[SI].PAR_DESGO ;;
2346 MOV DI,PSE.PAR_DESGO ;;
2347 MOV AX,PSE.PAR_DESGL ;;
2348 MOV CX,2 ;;
2349 SHL AX,CL ;; multiply by two
2350 INC AX ;; including length
2351 INC AX ;;
2352 MOV CX,AX ;;
2353 REPE CMPSB ;;
2354 POP DI ;;
2355 POP SI ;;
2356 Jz param_check ;;
2357 mov init_chk,0023h ;; error 0023h
2358 Jmp FORCE_LPT_BAD ;;
2359 ;;
2360param_check : ;;
2361 PUSH SI ;; compare parameters
2362 PUSH DI ;;
2363 mov SI,[SI].PAR_PARMO ;;
2364 MOV DI,PSE.PAR_PARMO ;;
2365 MOV CX,PSE.PAR_PARML ;;
2366 INC CX ;; including length
2367 INC CX ;;
2368 REPE CMPSB ;;
2369 POP DI ;;
2370 POP SI ;;
2371 JZ M_END ;;
2372 mov init_chk,0024h ;; error 0024h
2373 ;;
2374FORCE_LPT_BAD : ;; the second set of parameters is
2375 MOV BUF.STATE,NORMAL ;; bad
2376 ;;
2377 CMP BUF.BFLAG,BF_LPT1 ;;
2378 JNE M_END ;;
2379 ;;
2380 ;; since LPT1 is bad, force PRN to bad
2381 push bx ;; force prn to be bad too
2382 mov bx,buf.prn_bufo ;;
2383 MOV BUF.STATE,NORMAL ;;
2384 pop bx ;;
2385 ;;
2386 mov AX,BUF.DID_PRN ;; if PRN was not good, DID_PRN = 0
2387 OR DID_FAIL,AX ;;
2388 ;;
2389 ;;
2390M_END: ;; force the good did_status to fail if
2391 ;; STATE is bad
2392 POP CX ;;
2393 PUSH CX ;; order 0 to m
2394 MOV AX,DID_STATUS ;;
2395 ;;
2396 INC CX ;;
2397 SHR AX,CL ;;
2398 POP CX ;;
2399 JNC DEV_CHECK_RET ;; already failed
2400 ;;
2401 CMP BUF.STATE,CPSW ;;
2402 JE DEV_CHECK_RET ;;
2403 ;;
2404 PUSH BX ;;
2405 MOV BX,CX ;;
2406 ADD BX,BX ;;
2407 MOV AX,DID_BIT[BX] ;;
2408 OR DID_FAIL,AX ;; force DID to fail
2409 POP BX ;;
2410 ;;
2411 ;;
2412DEV_CHECK_RET : ;;
2413 ;;
2414 RET ;;
2415 ;;
2416 ;;
2417DEV_CHECK ENDP ;;
2418 ;;
2419;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2420 ;;
2421CSEG ENDS
2422 END
diff --git a/v4.0/src/DEV/PRINTER/CPSPI07.ASM b/v4.0/src/DEV/PRINTER/CPSPI07.ASM
new file mode 100644
index 0000000..740b136
--- /dev/null
+++ b/v4.0/src/DEV/PRINTER/CPSPI07.ASM
@@ -0,0 +1,1416 @@
1
2 PAGE ,132
3
4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5;;
6;; FILENAME: CPS Printer Device Driver INIT module (CPSPInn)
7;; MODULE NAME:
8;; TYPE: Assemble file (non-resident code)
9;; LINK PROCEDURE: Link CPSPMnn+CPSFONT+CPSPInn into .EXE format. CPSPM01
10;; must be first. CPSPInn must be last. Everything
11;; before CPSPInn will be resident.
12;; INCLUDE FILES:
13;; CPSPEQU.INC
14;;
15;; LAYOUT : This file is divided into two main section :
16;; ++++++++++++++++++++++++
17;; ++ DEVICE Parser ++
18;; ++++++++++++++++++++++++
19;;
20;; ++++++++++++++++++++++++
21;; ++ INIT Command ++
22;; ++++++++++++++++++++++++
23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
24 ;;
25INCLUDE CPSPEQU.INC ;;
26INT2F_LOW EQU (4*2FH) ;; WGR interrupt 2F vector location ;AN000;
27INT2F_HI EQU (4*2FH)+2 ;; WGR ;AN000;
28 ;;
29.XLIST ;;
30INCLUDE SYSMSG.INC ;; WGR ;AN000;
31.LIST ;;
32 ;;
33MSG_UTILNAME <PRINTER> ;; WGR ;AN000;
34 ;;
35PUBLIC INIT ;;
36PUBLIC CODE_END ;; for MAP listing only
37PUBLIC RESIDENT_END ;;
38PUBLIC STACK_ALLOCATED ;;
39 ;;
40 ;;
41EXTRN PRINTER_DESC_NUM:WORD ;;
42EXTRN PRINTER_DESC_TBL:WORD ;;
43EXTRN INIT_CHK:WORD,TABLE:WORD ;;
44EXTRN HARD_SL1:BYTE,RAM_SL1:BYTE ;;
45EXTRN HARD_SL2:BYTE,RAM_SL2:BYTE ;;
46EXTRN HARD_SL3:BYTE,RAM_SL3:BYTE ;;
47EXTRN HARD_SL4:BYTE,RAM_SL4:BYTE ;;
48EXTRN RESERVED1:WORD,RESERVED2:WORD ;;
49 ;;
50 ;;
51 ;;
52CSEG SEGMENT PARA PUBLIC 'CODE' ;;
53 ASSUME CS:CSEG ;;
54 ;;
55 ;;
56EXTRN PARSER:NEAR ;; WGR ;AN000;
57EXTRN ROM_INT2F:WORD ;; WGR ;AN000;
58EXTRN INT2F_COM:NEAR ;; WGR ;AN000;
59EXTRN ABORT:BYTE ;; WGR ;AN000;
60
61CODE_END EQU $ ;; end of resident code
62 ;;
63 DW 0 ;; -- there are 16 bytes kept,
64 ;; including this word
65 ;;
66RESIDENT_END DW 0FFFH ;; end of extended resident area
67STACK_ALLOCATED DW -1 ;; end of extended resident area
68 ;;
69 DW 150 DUP(0) ;; need some space here.
70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
71;;
72;; End of resident code
73;;
74;;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
75;;
76;; ++++++++++++++++++++++++
77;; ++ INIT Command ++
78;; ++++++++++++++++++++++++
79;;
80;;==== Command Code 0 - Initialization ======
81;;
82;; messages returned :
83;;
84;; msg_bad_syntax -- syntax error from parser, no driver installation
85;; msg_no_init -- device cannot be initialised
86;; msg_insuff_mem -- insufficient memory
87;;
88;; layout : the initialization is done in two stages :
89;;
90;; ++++++++++++++++++++++++
91;; ++ INIT Stage 1 ++ to examine and extract the
92;; ++++++++++++++++++++++++ parameters defined for the
93;; device_id in DEVICE command,
94;; according to the printer
95;; description table for the
96;; device_id.
97;;
98;; ++++++++++++++++++++++++
99;; ++ INIT Stage 2 ++ to set the BUFfer for the LPTn
100;; ++++++++++++++++++++++++ or PRN according to device_id's
101;; parameters
102;;
103;;
104;;
105;;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
106 ;;
107DEV_NUM dw ? ;;
108 ;;
109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
110;
111; Tables for the deivce_id parameters in the order of device_id in the
112; PARSE table
113; === the tables serves as the link between LPTn to be defined in the 2nd
114; stage, and the device_id that is processed in the first stage.
115;
116;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
117 ;;
118 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
119 ;; device ID indicators :
120 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
121DID_MAX EQU 4 ;; device entris exepcted in PARSE
122;; not more than 16. ;; table
123 ;;
124DID_STATUS DW 0 ;; status of parsing device id
125 ;; = 0 : all Device-ID bad
126 ;; -- see DID_BIT
127 ;;
128DID_MATCH DW 0 ;; this DID has device_name matched
129 ;;
130DID_FAIL DW 0 ;; to fail the good DID_STATUS and
131 ;; the matched name. (due to
132 ;; inconsistency among the same LPTn
133 ;; or between PRN and LPT1.)
134 ;;
135;; (DID_STATUS) AND (DID_MATCH) XOR (DID_FAIL) determines the success of DID
136 ;; initialization
137 ;;
138DID_ONE EQU 00001H ;; first device-ID
139DID_TWO EQU 00002H ;; second "
140DID_THREE EQU 00004H ;; third "
141DID_FOUR EQU 00008H ;; fourth "
142;;maximun number of device_id = 16 ;;
143 ;;
144DID_BIT LABEL WORD ;;
145 DW DID_ONE ;;
146 DW DID_TWO ;;
147 DW DID_THREE ;;
148 DW DID_FOUR ;;
149;;maximun number of device_id = 16 ;;
150 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
151 ;; device paramters according to the
152 ;; device_id defined in DEVICE and the
153 ;; parameters defined for the device_id
154 ;; in the printer description table.
155 ;;
156HRMAX LABEL word ;; number of hwcp+cart slots supported
157 DW 0 ;; did = 1
158 DW 0 ;; did = 2
159 DW 0 ;; did = 3
160 DW 0 ;; did = 4
161;upto max DID_MAX ;;
162 ;;
163CTMAX LABEL word ;; number of cart slots supported
164 DW 0 ;; did = 1
165 DW 0 ;; did = 2
166 DW 0 ;; did = 3
167 DW 0 ;; did = 4
168;upto max DID_MAX ;;
169 ;;
170RMMAX LABEL word ;; number of ram-slots supported
171 DW 0 ;; did = 1
172 DW 0 ;; did = 2
173 DW 0 ;; did = 3
174 DW 0 ;; did = 4
175;upto max DID_MAX ;;
176 ;;
177RBUMAX LABEL word ;; number of ram-designate slots
178 DW 0 ;; did = 1
179 DW 0 ;; did = 2
180 DW 0 ;; did = 3
181 DW 0 ;; did = 4
182;upto max DID_MAX ;;
183 ;;
184DESCO LABEL word ;; offset to the description table
185 ;; where the device_id is defined.
186 DW -1 ;; did = 1
187 DW -1 ;; did = 2
188 DW -1 ;; did = 3
189 DW -1 ;; did = 4
190;upto max DID_MAX ;;
191 ;;
192FSIZE LABEL word ;; font size of the device
193 DW 0 ;; did = 1
194 DW 0 ;; did = 2
195 DW 0 ;; did = 3
196 DW 0 ;; did = 4
197;upto max DID_MAX ;;
198 ;;
199;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
200;
201; Hard/RAM slots table in the order of DEVICE parameters
202;
203; number of entries in all HARD_SLn is determined by the max. {HSLOTS}, and
204; number of entries in all RAM_SLn is determined by the max. {RSLOTS}
205;
206; -- they are initialized according to the device_id defined in the DEVICE.
207;
208;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
209 ;;
210HARD_SLA LABEL word ;; index in the order of device in
211 DW OFFSET (HARD_SL1) ;; the PARSE-talbes
212 DW OFFSET (HARD_SL2) ;;
213 DW OFFSET (HARD_SL3) ;;
214 DW OFFSET (HARD_SL4) ;;
215; up to DID_MAX ;;
216 ;;
217RAM_SLA LABEL word ;;
218 DW OFFSET (RAM_SL1) ;;
219 DW OFFSET (RAM_SL2) ;;
220 DW OFFSET (RAM_SL3) ;;
221 DW OFFSET (RAM_SL4) ;;
222; up to DID_MAX ;;
223 ;;
224SUB_SIZE EQU 11 ;; WGR sublist size ;AN000;
225LEFT_ASCIIZ EQU 00010000B ;; WGR left-aligned asciiz string ;AN000;
226UNLIMITED EQU 0 ;; WGR unlimited message size. ;AN000;
227 ;; WGR ;AN000;
228SUBLIST LABEL DWORD ;; WGR ;AN000;
229 DB SUB_SIZE ;; WGR ;AN000;
230 DB 0 ;; WGR ;AN000;
231MSG_PTR DW ? ;; WGR ;AN000;
232MSG_SEG DW SEG CSEG ;; WGR ;AN000;
233 DB 1 ;; WGR ;AN000;
234 DB LEFT_ASCIIZ ;; WGR ;AN000;
235 DB UNLIMITED ;; WGR ;AN000;
236 DB 1 ;; WGR ;AN000;
237 DB " " ;; WGR ;AN000;
238 ;
239;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
240;;
241;; ++++++++++++++++++++++++
242;; ++ INIT Command ++
243;; ++++++++++++++++++++++++
244;;
245;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
246 ;;
247INIT PROC NEAR ;;
248 ;;
249;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
250;; parse the initialization parameters in DEVICE command
251;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
252;;
253 PUSH BX ;; WGR ;AN000;
254 CALL SYSLOADMSG ;; WGR load messages ;AN000;
255 JNC CONT_1 ;; WGR if no error then continue ;AN000;
256 CALL SYSDISPMSG ;; WGR error (DOS version)..display ;AN000;
257 POP BX ;; WGR message.... ;AN000;
258 JMP SYNTAX_ERROR ;; WGR ...and exit with error code. ;AN000;
259 ;; WGR ;AN000;
260CONT_1: ;; WGR ;AN000;
261 POP BX ;; WGR ;AN000;
262 CMP BUF.BFLAG,BF_PRN ;; since PRN is the FIRST device header
263 JNE NOT_PRN ;;
264 ;;
265 ;;
266 MOV AX,OFFSET CODE_END ;; defined only once for each DEVICE
267 XOR CX,CX ;;
268 MOV CL,4 ;;
269 SHR AX,CL ;;
270 PUSH CS ;;
271 POP CX ;;
272 ADD AX,CX ;;
273 INC AX ;; leave 16 bytes,room for resident_end
274 MOV RESIDENT_END,AX ;;
275 ;;
276 CALL PARSER ;; call only once, for PRM
277 ;;
278 JMP PROCESS_TABLE ;;
279 ;;
280NOT_PRN : ;;
281 CMP DEV_NUM,1 ;;
282 ;;
283 JNB PROCESS_TABLE ;;
284 ;;
285 JMP SYNTAX_ERROR ;;
286 ;;
287 ;;
288 ;;
289;;
290;;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
291;;
292;; ++++++++++++++++++++++++
293;; ++ INIT Stage 1 ++
294;; ++++++++++++++++++++++++
295;;
296;; INIT - FIRST STAGE :
297;;
298;; == test and extract if the parameters on device-id is valid
299;; == determine the DID_STATUS according to the validity of the parameters
300;; == procedure(s) called -- DID_EXTRACT
301;;
302;;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
303 ;;
304PROCESS_TABLE : ;;
305 ;;
306 PUSH CS ;;
307 POP ES ;; PSE points to Device offsets
308 MOV DI,OFFSET(table) ;; ES:[DI]
309 MOV DX,PSE.PAR_DEV_NUM ;;
310 MOV DEV_NUM,DX ;;
311 ;;
312 CMP DEV_NUM,0 ;;
313 JNZ NO_SYNTAX_ERR ;;
314 ;;
315 ;; WGR ;AN000;
316 PUSH BX ;; WGR ;AN000;
317 MOV AX,BAD_SYNTAX_MSG ;; WGR 'bad syntax' message ;AN000;
318 MOV BX,STDERR ;; WGR to standard error ;AN000;
319 XOR CX,CX ;; WGR ;AN000;
320 XOR DL,DL ;; WGR ;AN000;
321 MOV DH,UTILITY_MSG_CLASS ;; WGR class = parse error ;AN000;
322 CALL SYSDISPMSG ;; WGR display message. ;AN000;
323 POP BX ;; WGR ;AN000;
324 ;;
325 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
326SYNTAX_ERROR : ;; set the request header status
327 ;; according to the STATE
328 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
329 MOV AX, RESIDENT_END ;;
330 PUSH CS ;;
331 POP CX ;; CX=CS
332 SUB AX,Cx ;; additional segment required.
333CS_LOOP1: ;;
334 CMP AX,1000H ;;
335 JB CS_LPEND1 ;;
336 ADD CX,1000H ;;
337 SUB AX,1000H ;;
338 JMP CS_LOOP1 ;;
339 ;;
340CS_LPEND1: ;;
341 SHL AX,1 ;;
342 SHL AX,1 ;;
343 SHL AX,1 ;;
344 SHL AX,1 ;;
345 ;;
346 LES DI,dword ptr buf.rh_ptro ;; get Request Header address
347; MOV RH.RH0_ENDO,AX ;;
348 MOV RH.RH0_ENDO,0 ;;
349 MOV RH.RH0_ENDS,CX ;;
350 mov rh.RH0_CONFIG_ERRMSG, -1 ;DCR D493 2/25/88 "Error in CONFIG.SYS..." msg flag.
351 MOV RH.RHC_STA,stat_cmderr ;; set status in request header
352 ;;
353 JMP INIT_RETurn ;;
354 ;;
355 ;;
356NO_SYNTAX_ERR : ;;
357 ;;
358 CMP DX,DID_MAX ;;
359 JNA NEXT_DID ;;
360 ;;
361 MOV INIT_CHK,0001H ;; ERROR 0001
362 JMP BAD_DID ;; more than supported no. of device
363 ;;
364NEXT_DID: ;;
365 PUSH DI ;; pointer to PAR_OT (table 1)
366 AND DX,DX ;;
367 JNZ SCAN_DESC ;;
368 JMP END_DID ;; DI = offset to the 1st PARSE table
369;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
370SCAN_DESC: ;;
371 MOV DI,PSE.PAR_OFF ;; points to the nth device
372 ;;
373 ;; find the description for the
374 ;;device-id
375 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
376 MOV CX,PRINTER_DESC_NUM ;;
377 MOV SI, OFFSET(PRINTER_DESC_TBL); offset to the description table
378 PUSH CS ;;
379 POP DS ;;
380; $SEARCH ;;
381$$DO1:
382 PUSH CX ;; save device count
383 PUSH SI ;; pointer to printer-descn's offset
384 MOV SI,CS:WORD PTR[SI] ;;
385 AND CX,CX ;;
386 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
387; $LEAVE Z ;; LEAVE if no more device description
388 JZ $$EN1
389 PUSH DI ;; save offset to PAR_DEVOT
390 MOV DI,PSE.PAR_DIDO ;;
391 MOV CX,PSE.PAR_DIDL ;; length of parsed device name
392 LEA DI,PSE.PAR_DID ;; pointer to parse device name
393 ;;
394 PUSH SI ;;
395 LEA SI,[SI].TYPEID ;; offset to name of device-id
396 REPE CMPSB ;;
397 POP SI ;;
398 POP DI ;; get back offset to PAR_DEVOT
399 ;;;;;;;;;;;;;;;;;;;;;;;;
400; $EXITIF Z ;; EXIT if name matched
401 JNZ $$IF1
402 ;;
403 CALL DID_EXTRACT ;; get the parameters
404 ;;
405 POP SI ;; balance push-pop
406 POP CX ;;
407 ;;
408 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
409; $ORELSE ;; try next description :
410 JMP SHORT $$SR1
411$$IF1:
412 ;;
413 POP SI ;; of printer_descn offset table
414 INC SI ;;
415 INC SI ;; next offset to PRINTER_DESCn
416 ;;
417 POP CX ;; one description less
418 DEC CX ;;
419 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
420; $ENDLOOP ;; DEVICE-ID not defined in
421 JMP SHORT $$DO1
422$$EN1:
423 ;; printer_desc;
424 ;;
425 MOV AX,INIT_CHK ;;
426 AND AX,AX ;;
427 JNZ UNCHANGED ;;
428 MOV INIT_CHK,0004H ;; ERROR 0004
429UNCHANGED: ;;
430 POP SI ;; balance push-pop
431 POP CX ;;
432 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
433; $ENDSRCH ;; End of scanning printer_desc
434$$SR1:
435;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
436 POP DI ;;
437 INC DI ;;
438 INC DI ;; points to next device in PART_OT
439 DEC DX ;;
440 ;;
441 JMP NEXT_DID ;;
442 ;;
443END_DID : ;;
444 POP DI ;;
445BAD_DID : ;;
446 ;;
447 MOV AX,DID_STATUS ;;
448 AND AX,AX ;;
449 JNZ DEF_BUFFER ;;
450 ;;
451 JMP END_LPT ;;
452 ;;
453;;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
454;;
455;; ++++++++++++++++++++++++
456;; ++ INIT Stage 2 ++
457;; ++++++++++++++++++++++++
458;;
459;; INIT -- SECOND STAGE :
460;;
461;; == match the device_name extracted in stage 1 with the name of PRN or
462;; LPTn
463;;
464;; == if the PRN/LPTn has never been defined before, then set up the BUF
465;; for the PRN/LPTn if the DID_STATUS is good; otherwise message will
466;; be generated indicating it cannot be initilized.
467;;
468;; == if there is PRN, LPT1 is also setup, and vice vera. IF both PRN and
469;; LPT1 are on the DEVICE command, or there are multiple entries for
470;; the same LPTn, the consistency is checked. It they are inconsistent
471;; the associated LPTn or PRN is forced to fail by : DID_FAIL.
472;;
473;; == if the device_name on the DEVICE command is not one of the supported
474;; PRN or LPTn, then DID_MATCH bit will not be set. An error message
475;; will be generated for the device_name indicating it cannot be
476;; initialized.
477;;
478;; == procedure(s) called : CHK_DID .. check DID parameters for device
479;; whose name matched.
480;; DEV_CHECK .. if device-name duplicated, or
481;; there are both PRN/LPT1 : check
482;; for consistent parameters.
483;;
484;;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
485DEF_BUFFER : ;;
486 PUSH CS ;;
487 POP ES ;; PSE points to Device offsets
488 MOV DI,OFFSET(table) ;; ES:[DI]
489 xor cx,cx ;; device order in parse table
490;SEARCH ;;
491$$DO7:
492 PUSH DI ;; pointer to PAR_OT
493 PUSH CX ;; save device count
494 MOV DI,PSE.PAR_OFF ;; " " PAR_DEVOT
495 cmp cx,dev_num ;;
496 ;;
497;LEAVE NB ;; LEAVE if no more device entry
498 jb MORE_DEVICE ;;
499 JMP $$EN7
500MORE_DEVICE : ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
501 ;; more parsed_device to be checked
502 PUSH DI ;; save offset to PAR_DEVOT
503 MOV DI,PSE.PAR_DNMO ;;
504 MOV CX,PSE.PAR_DNML ;; length of parsed device name
505 LEA DI,PSE.PAR_DNM ;; pointer to parse device name
506 ;;
507 LDS SI,DWORD PTR BUF.DEV_HDRO ; get the offset to device-n header
508 LEA SI,HP.DH_NAME ;; " offset to name of device-n
509 REPE CMPSB ;;
510 POP DI ;; get back offset to PAR_DEVOT
511 ;;
512 ;;;;;;;;;;;;;;;;;;;;;;;;;;
513;EXITIF Z ;; EXIT if name matched
514 JZ NAME_MATCHED ;;
515 ;;
516 JMP MORE_PARSED_DEVICE ;;
517 ;;
518NAME_MATCHED : ;;
519 ;;
520 POP CX ;; the DID order
521 PUSH BX ;;
522 MOV BX,CX ;;
523 ADD BX,BX ;;
524 MOV AX,DID_BIT[BX] ;;
525 OR DID_MATCH,AX ;; this DID matched
526 POP BX ;;
527 PUSH CX ;;
528 ;;
529 LEA SI,BUF.PAR_EXTRACTO ;; was the LPT1/PRN defined before ?
530 MOV AX,CS:[SI].PAR_DNMO ;;
531 CMP AX,0FFFFH ;;
532 ;;
533 JNE DEV_COMPARE ;; DI = PAR_DEVOT
534 ;;-----------------------------------
535 ;;
536 ;; no device previousely defined
537 MOV AX,PSE.PAR_DNMO ;;
538 MOV CS:[SI].PAR_DNMO,AX ;; define device parameters for LPTn
539 ;;
540 MOV AX,PSE.PAR_DIDO ;;
541 MOV CS:[SI].PAR_DIDO,AX ;;
542 ;;
543 MOV AX,PSE.PAR_HWCPO ;;
544 MOV CS:[SI].PAR_HWCPO,AX ;;
545 ;;
546 MOV AX,PSE.PAR_DESGO ;;
547 MOV CS:[SI].PAR_DESGO,AX ;;
548 ;;
549 MOV AX,PSE.PAR_PARMO ;;
550 MOV CS:[SI].PAR_PARMO,AX ;;
551 ;;
552 ;;---------------------------------
553 CALL CHK_DID ;; define the STATE according to
554 ;; DID_STATUS
555 JMP MORE_PARSED_DEVICE ;;
556 ;;
557DEV_COMPARE : ;;-------------------------------
558 ;; e.g. LPT1 and PRN shares one BUF.
559 ;; or duplicated device name
560 CALL DEV_CHECK ;;
561 ;;
562 CMP BUF.STATE,CPSW ;;
563 JNE DEV_COMPARE_FAIL ;;
564 ;;
565 JMP MORE_PARSED_DEVICE ;;
566 ;;
567DEV_COMPARE_FAIL : ;;
568 ;;
569 POP CX ;;
570 POP DI ;; balance push-pop
571 ;;
572 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
573;$ORELSE ;;
574 JMP END_LPT
575 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
576MORE_PARSED_DEVICE : ;; name does not match
577 ;;
578 POP CX ;;
579 INC CX ;;
580 POP DI ;;
581 INC DI ;;
582 INC DI ;; points to next device in PART_OT
583 ;;
584 jmp $$DO7 ;;
585;$ENDLOOP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
586$$EN7: ;; no device found for LPTn
587 ;;
588 POP CX ;;
589 POP DI ;; balance push-pop
590 ;;
591 CMP BUF.STATE,CPSW ;;
592 JE END_LPT ;; for LPT1/PRN pair
593 ;;
594 MOV BUF.STATE,NORMAL ;; no device defined for the LPTn
595 ;;
596 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
597 ;; End of defining LPTn Buffer
598 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
599;$ENDSRCH ;;
600END_LPT : ;;
601 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
602 ;; set the request header status
603 ;; according to the STATE
604 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
605 MOV AX, RESIDENT_END ;;
606 PUSH CS ;;
607 POP CX ;; CX=CS
608 SUB AX,Cx ;; additional segment required.
609CS_LOOP2: ;;
610 CMP AX,1000H ;;
611 JB CS_LPEND2 ;;
612 ADD CX,1000H ;;
613 SUB AX,1000H ;;
614 JMP CS_LOOP2 ;;
615 ;;
616CS_LPEND2: ;;
617 SHL AX,1 ;;
618 SHL AX,1 ;;
619 SHL AX,1 ;;
620 SHL AX,1 ;;
621 ;;
622 LES DI,dword ptr buf.rh_ptro ;; get Request Header address
623 MOV RH.RH0_ENDO,AX ;;
624 MOV RH.RH0_ENDS,CX ;;
625 XOR AX,AX ;; clear error code to be returned
626 MOV CX,BUF.STATE ;;
627 CMP CX,CPSW ;;
628 JE MATCH_GOOD ;;
629 MOV AX,STAT_CMDERR ;;
630 ;;
631MATCH_GOOD : ;;
632 MOV RH.RHC_STA,AX ;; set status in request header
633 CALL LOAD_INT2F ;; WGR load INT2f handler ;AN000;
634 ;;
635BUF_END : ;;
636 ;;
637 CMP BUF.BFLAG,BF_LPT1 ;;
638 JNE BUF_MESSAGES ;;
639 ;;
640 CMP BUF.STATE,CPSW ;;
641 JNE BUF_MESSAGES ;;
642 ;; set PRN to the same setting as LPT1
643 PUSH BX ;;
644 ;;
645 LEA SI,BUF.RNORMO ;;
646 LEA CX,BUF.BUFEND ;;
647 SUB CX,SI ;;
648 MOV BX,BUF.PRN_BUFO ;; where PRN buffer is
649 LEA DI,BUF.RNORMO ;;
650 PUSH CS ;;
651 POP ES ;;
652 PUSH CS ;;
653 POP DS ;;
654 REP MOVSB ;;
655 ;;
656 POP BX ;;
657 ;;
658BUF_MESSAGES : ;;
659 CMP BUF.BFLAG,BF_LPT3 ;; generate error message is this is
660 je last_round ;; the last LPTn
661 Jmp INIT_RETURN ;;
662 ;; ERROR messages will be generated
663 ;; at the end of initialization of all
664 ;; the LPT devices
665last_round : ;;
666 MOV AX,RESIDENT_END ;;
667 ADD AX,STACK_SIZE ;;
668 MOV RESIDENT_END,AX ;;
669 PUSH CS ;;
670 POP CX ;; CX=CS
671 SUB AX,Cx ;; additional segment required.
672CS_LOOP3: ;;
673 CMP AX,1000H ;;
674 JB CS_LPEND3 ;;
675 ADD CX,1000H ;;
676 SUB AX,1000H ;;
677 JMP CS_LOOP3 ;;
678 ;;
679CS_LPENd3: ;;
680 SHL AX,1 ;;
681 SHL AX,1 ;;
682 SHL AX,1 ;;
683 SHL AX,1 ;;
684 ;;
685 MOV RH.RH0_ENDO,AX ;; STACK !!!!!
686 MOV STACK_ALLOCATED,0 ;; from now on, internal stack is used
687 ;;
688 MOV AX,DID_STATUS ;; what is the DID combination ?
689 AND AX,DID_MATCH ;;
690 XOR AX,DID_FAIL ;;
691 ;;
692 AND AX,AX ;;
693 JNZ CODE_STAYED ;;
694; MOV RH.RH0_ENDO,0 ;; none of the devices are good
695 ;;
696 ;;
697CODE_STAYED : ;;
698 MOV DI,OFFSET TABLE ;;
699 push CS ;;
700 POP ES ;;
701 ;;
702 XOR CX,CX ;;
703MSG_LOOP : ;;
704 CMP CX,DEV_NUM ;;
705 JNB INIT_RETURN ;;
706 SHR AX,1 ;;
707 JC MSG_NEXT ;;
708 ;; this device in parse table is bad
709 PUSH DI ;;
710 PUSH CX ;;
711 PUSH AX ;;
712 PUSH BX ;; WGR ;AN000;
713 PUSH DX ;; WGR ;AN000;
714 ;;
715 MOV DI,PSE.PAR_OFF ;;
716 MOV SI,PSE.PAR_DNMO ;;
717 ;;
718 PUSH CS ;;
719 POP ES ;;
720 PUSH CS ;;
721 POP DS ;;
722 ;;
723 MOV CX,8 ;;
724 LEA SI,[SI].PAR_DNM ;;
725 MOV DI,SI ;;
726 MOV AL,' ' ;; WGR ;AN000;
727 CLD ;; WGR ;AN000;
728 REPNE SCASB ;; WGR ;AN000;
729 DEC DI ;; WGR ;AN000;
730 MOV BYTE PTR ES:[DI],ZERO ;; WGR ;AN000;
731 ;; WGR ;AN000;
732 MOV MSG_SEG,CS ;; WGR ;AN000;
733 MOV MSG_PTR,SI ;; WGR ;AN000;
734 MOV AX,BAD_DEVICE_MSG ;; WGR ;AN000;
735 MOV BX,STDERR ;; WGR ;AN000;
736 LEA SI,SUBLIST ;; WGR ;AN000;
737 MOV CX,ONE ;; WGR ;AN000;
738 XOR DL,DL ;; WGR ;AN000;
739 MOV DH,UTILITY_MSG_CLASS ;; WGR ;AN000;
740 CALL SYSDISPMSG ;; WGR ;AN000;
741 ;; ;AN000;
742 POP DX ;; WGR ;AN000;
743 POP BX ;; WGR ;AN000;
744 POP AX ;;
745 POP CX ;;
746 POP DI ;;
747 ;;
748MSG_NEXT : ;;
749 INC CX ;;
750 INC DI ;;
751 INC DI ;;
752 JMP MSG_LOOP ;;
753 ;;
754 ;;
755INIT_RETURN : ;;
756 ;;
757 ;;
758 RET ;;
759 ;;
760INIT ENDP ;;
761;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
762;;
763;; Call by INIT to extract parameters for the deivce_id
764;;
765;; on rntry :
766;; ES:[DI] PARSE Table 2, offsets of all parameters
767;; DS:[SI] Printer Description table whose TYPEID matched
768;; DX "inverse" order of devices in the PARSE tables
769;;
770;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
771 ;;
772 ;;
773DID_EXTRACT PROC ;;
774 ;;
775 PUSH DX ;;
776 ;;-----------------------------
777 ;; define the DID_parameters
778 PUSH BX ;;
779 ;;
780 MOV BX,DEV_NUM ;;
781 SUB BX,DX ;; order in the Parse table
782 add bx,bx ;; double to index [bx]
783 MOV DX,BX ;;
784 ;;
785 MOV AX,DS:[SI].FONTSZ ;;
786 MOV FSIZE[BX],AX ;; size of font buffer to be created
787 ;;
788 MOV AX,DS:[SI].HSLOTS ;;
789 CMP AX,HARDSL_MAX ;;
790 JNA LESS_HARDSL ;;
791 MOV INIT_CHK, 0010H ;; ERROR 0010H
792 POP BX ;;
793 JMP END_MATCH_BAD ;;
794LESS_HARDSL : ;;
795 CMP AX,DS:[SI].HWCPMIN ;;
796 JNB VALID_HARDSL ;;
797 MOV INIT_CHK, 0012H ;; ERROR 0012H
798 POP BX ;;
799 JMP END_MATCH_BAD ;;
800VALID_HARDSL : ;;
801 MOV HRMAX[BX],AX ;;
802 MOV CTMAX[BX],AX ;; will be reduced by the no. of hwcp
803 ;;
804 MOV AX,DS:[SI].RSLOTS ;;
805 CMP AX,RAMSL_MAX ;;
806 JNA LESS_RAMSL ;;
807 MOV INIT_CHK, 0011H ;; ERROR 0011H
808 POP BX ;;
809 JMP END_MATCH_BAD ;;
810LESS_RAMSL : ;;
811 MOV RMMAX[BX],AX ;; see also designate
812 ;;
813 MOV DESCO[BX],SI ;;
814 ;;
815 POP BX ;;
816 ;;----------------------------------
817 ;;
818 PUSH CX ;;
819 ;;
820HWCPgt: PUSH DI ;; get the hwcp
821 ;;
822 MOV DI,PSE.PAR_HWCPO ;;
823 MOV CX,PSE.PAR_HWCPL ;; no. of hwcp
824 AND CX,CX ;;
825 JNZ chk_hwcp ;;
826 push bx ;;
827 mov bx,dx ;;
828 MOV HRMAX[BX],CX ;;
829 MOV CX,DS:[SI].HWCPMIN ;;
830 SUB CTMAX[BX],CX ;; what is left becomes cartridge slot
831 pop bx ;;
832 JMP DESIGN ;;
833 ;; hwcp to be defined
834chk_hwcp: MOV AX,DS:[SI].HSLOTS ;; defined in printer_desc
835 CMP CX,AX ;;
836 JA BAD_MATCH2 ;;
837 CMP CX,HARDSL_MAX ;;
838 JNA HWCP_GOOD ;; jump if system error
839 MOV INIT_CHK,0003H ;; ERROR 0003
840 JMP END_MATCH ;;
841BAD_MATCH2: ;;
842 MOV INIT_CHK,0002H ;; ERROR 0002
843 JMP END_MATCH ;;
844 ;;
845HWCP_GOOD: ;; there are sufficient hard-slot for
846 ;; HWCP
847 PUSH SI ;; printer description table of TYPEID
848 PUSH BX ;;
849 ;;
850 MOV BX,DX ;;
851 MOV AX,CTMAX[BX] ;;
852 ;;
853 PUSH CX ;; calculate what is left for cart_slot
854 CMP CX,DS:[SI].HWCPMIN ;;
855 JNB MORE_THAN_HWCPMIN ;;
856 MOV CX,DS:[SI].HWCPMIN ;;
857MORE_THAN_HWCPMIN : ;;
858 SUB AX,CX ;;
859 POP CX ;;
860 mov HRMAX[BX],CX ;;
861 ;;
862 MOV CTMAX[BX],AX ;; no of cart-slot for designate
863 MOV SI,HARD_SLA[BX] ;; get the corresponding hard-slots
864 ;;
865 POP BX ;;
866 ;;
867 push bx ;;
868 push dx ;;
869 mov bx,si ;;
870 mov dx,cx ;;
871 mov reserved1,dx ;; IF THERE IS ANY REPETITIVE HWCP
872 mov reserved2,bx ;; IF THERE IS ANY REPETITIVE HWCP
873 ;;
874FILL_HWCP: ;;
875 AND CX,CX ;;
876 JZ DESIGN_P ;;
877 INC DI ;; next code page in PARSE table
878 INC DI ;;
879 MOV AX,ES:[DI] ;; get code page value
880 ;;
881 ;; IF THERE IS ANY REPETITIVE HWCP
882 push dx ;;
883 push bx ;;
884hwcp_norep : ;;
885 cmp ax,cs:[bx].slt_cp ;;
886 jne hwcp_repnext ;;
887 pop bx ;;
888 pop dx ;;
889 pop dx ;;
890 pop bx ;;
891 pop si ;;
892 jmp end_match ;;
893 ;;
894hwcp_repnext: ;;
895 inc bx ;;
896 inc bx ;;
897 inc bx ;;
898 inc bx ;;
899 dec dx ;;
900 jnz hwcp_norep ;;
901 pop bx ;;
902 pop dx ;;
903 ;;
904 MOV CS:[SI].SLT_CP,AX ;;
905 MOV AX,CS:[SI].SLT_AT ;; get the attributes
906 OR AX,AT_OCC ;; occupied
907 OR AX,AT_HWCP ;; hwcp slot
908 MOV CS:[SI].SLT_AT,AX ;;
909 INC SI ;;
910 INC SI ;; next slot
911 INC SI ;; next slot
912 INC SI ;; next slot
913 DEC CX ;;
914 JMP FILL_HWCP ;;
915DESIGN_P: ;;
916 pop dx ;;
917 pop bx ;;
918 POP SI ;;
919 ;;---------------------
920DESIGN: POP DI ;; get the designate no.
921 PUSH DI ;;
922 ;;
923 MOV DI,PSE.PAR_DESGO ;;
924 MOV AX,PSE.PAR_DESGL ;;
925 CMP AX,1 ;;
926 JA END_MATCH ;; there should have no font entry
927 AND AX,AX ;;
928 JZ DEF_RBUFMAX ;;
929 ;;
930 MOV AX,PSE.PAR_DESG ;;
931 AND AX,AX ;;
932 JZ DEF_RBUFMAX ;;
933 ;;
934 CMP CS:[SI].CLASS,1 ;;
935 JNE DESIG_NOt_CLASS1 ;;
936 ;;
937 PUSH BX ;; if there is any cartridge slot ?
938 PUSH AX ;;
939 MOV BX,DX ;;
940 MOV AX,ctmax[BX] ;;
941 AND AX,AX ;;
942 POP AX ;;
943 POP BX ;;
944 JZ END_MATCH ;; fail, as there is no physical RAM.
945 ;;
946 CMP AX,HARDSL_MAX ;; is the designate more than max ?
947 JA END_MATCH ;;
948 ;;
949 ;;
950 JMP DEF_RBUFMAX ;;
951 ;;
952 ;;
953 ;;
954DESIG_NOT_CLASS1 : ;;
955 PUSH BX ;; if there is any physical RAM slot ?
956 PUSH AX ;;
957 MOV BX,DX ;;
958 MOV AX,RMMAX[BX] ;;
959 AND AX,AX ;;
960 POP AX ;;
961 POP BX ;;
962 JZ END_MATCH ;; fail, as there is no physical RAM.
963 ;;
964 ;;
965 CMP AX,RAMSL_MAX ;; is the designate more than max ?
966 JA END_MATCH ;;
967 ;;
968DEF_RBUFMAX : ;;
969 PUSH BX ;;
970 MOV BX,DX ;;
971 MOV RBUMAX[BX],AX ;;
972 POP BX ;;
973 ;;
974 ;;
975PARAM : ;;
976;PARM: POP DI ;;
977; PUSH DI ;;
978;; MOV DI,PSE.PAR_PARMO ;;
979 ;;
980 ;,--------------------------
981 ;; GOOD device_id parameters
982 shr dx,1 ;;
983 MOV AX,DID_ONE ;;
984 MOV CX,DX ;;
985 AND CX,CX ;;
986 JZ NO_SHL ;;
987 SHL AX,CL ;;
988NO_SHL: OR DID_STATUS,AX ;; is defined
989 ;;-------------------------
990END_MATCH: POP DI ;; end of extract
991 POP CX ;;
992END_MATCH_BAD : ;;
993 POP DX ;;
994 ;;
995 RET ;;
996 ;;
997DID_EXTRACT ENDP ;;
998 ;;
999;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1000;;
1001;; Called by INIT to define the STATE and BUF for the LPTn according to
1002;; the DID_STATUS. Create font buffer if requested through the "desi*nate"
1003;;
1004;; at entry : CX = device order in parse table
1005;;
1006;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1007CHK_DID PROC ;;
1008 ;;
1009 push cx ;;
1010 push di ;;
1011 push dx ;;
1012 ;;
1013 MOV AX,DID_STATUS ;;
1014 ;;
1015 PUSH CX ;; order 0 to m
1016 POP DI ;;
1017 ADD DI,DI ;; indexing : [DI]
1018 ;;
1019 INC CX ;;
1020 SHR AX,CL ;; is the device parameter valid ?
1021 ;;
1022 JC DEFINE_BUFFER ;;
1023 JMP LPT_FAIL ;;--------------------------
1024 ;;
1025DEFINE_BUFFER : ;;
1026 ;; good device parameters as determined
1027 MOV AX,DESCO[DI] ;;
1028 MOV BUF.PDESCO,AX ;;
1029 ;;
1030 PUSH DI ;;
1031 MOV DI,AX ;;
1032 MOV AX,CS:[DI].CLASS ;;
1033 MOV BUF.PCLASS,AX ;;
1034 POP DI ;;
1035 ;;
1036 MOV AX,HARD_SLA[DI] ;; in the DID_EXTRACT
1037 MOV BUF.HARDSO,AX ;;
1038 ;;
1039 MOV AX,RAM_SLA[DI] ;;
1040 MOV BUF.RAMSO,AX ;;
1041 ;;
1042 MOV AX,HRMAX[DI] ;;
1043 MOV BUF.HARDMX,AX ;;
1044 ;;
1045 MOV AX,CTMAX[DI] ;;
1046 MOV BUF.HCARMX,AX ;;
1047 ;;
1048 ADD AX,HRMAX[DI] ;; defore "designate"
1049 MOV BUF.HSLMX,AX ;;
1050 ;;
1051 ;;
1052 MOV AX,RMMAX[DI] ;;
1053 MOV BUF.RAMMX,AX ;;
1054 ;;
1055 XOR AX,AX ;;
1056 PUSH CX ;; calculate the max. length of control
1057 MOV CX,2 ;; sequence that is allowed for the
1058 CMP BUF.PCLASS,1 ;; room reserved for physical slots.
1059 JNE CTL_LOOP ;;
1060 MOV CX,1 ;; class 1 printer has one control seq.
1061CTL_LOOP : ;;
1062 ADD AX,CTL_MAX ;;
1063 DEC AX ;; leave one byte for the length
1064 DEC CX ;;
1065 JNZ CTL_LOOP ;;
1066 MOV BUF.FSELMAX,AX ;;
1067 POP CX ;;
1068 ;;
1069 MOV AX,FSIZE[DI] ;;
1070 MOV BUF.FTSZPA,AX ;; FTSIZE in paragraph
1071 ;;
1072 PUSH AX ;;
1073 ;;
1074 MOV DX,4 ;;
1075FT_PARA: ;;
1076 ADD AX,AX ;;
1077 DEC DX ;;
1078 JNZ FT_PARA ;; font size
1079 MOV BUF.FTSIZE,AX ;; font size in bytes (used with.RBUFMX)
1080 ;;
1081 POP DX ;; FTSIZE in paragraph
1082 ;;
1083 MOV CX,RBUMAX[DI] ;; create font buffer per .RBUFMX and
1084 MOV BUF.RBUFMX,CX ;; assume sufficient memory for all the
1085 ;; "designate request"
1086 PUSH CX ;;
1087 ;;
1088 CMP BUF.PCLASS,1 ;; always create font buffer for class1
1089 JNE CLASS_NOT_1 ;;
1090 ;;
1091 AND CX,CX ;;
1092 JZ CLASS1_NOCX ;;
1093 ADD CX,BUF.HARDMX ;;
1094 MOV BUF.HSLMX,CX ;;
1095 JMP CLASS_NOT_1 ;;
1096 ;;
1097CLASS1_NOCX: ;;
1098 MOV CX,BUF.HSLMX ;;
1099 ;;
1100CLASS_NOT_1 : ;;
1101 AND CX,CX ;;
1102 JZ MULTIPLE_DONE ;;
1103 MOV AX,RESIDENT_END ;;
1104MULTIPLE_FT : ;;
1105 ADD AX,DX ;; allocate the font buffers at the end
1106 DEC CX ;; of the resident codes
1107 JNZ MULTIPLE_FT ;;
1108 ;;
1109 ;;
1110 MOV CX,RESIDENT_END ;;
1111 MOV BUF.FTSTART,CX ;;
1112 MOV RESIDENT_END,AX ;;
1113 ;;
1114 ;;
1115MULTIPLE_DONE : ;;
1116 POP CX ;; designate requested
1117 ;;
1118 CMP BUF.PCLASS,1 ;;
1119 JNE DEF_RBUF ;;
1120 ;; CLASS 1
1121 CMP BUF.HARDMX,0 ;;
1122 JE DEFBUF_DONE ;;
1123 ;;
1124 PUSH CX ;; STACKS...
1125 PUSH SI ;;
1126 PUSH DS ;;
1127 PUSH ES ;;
1128 PUSH DI ;;
1129 PUSH DX ;;
1130 ;;
1131 MOV DX,BUF.HARDMX ;;
1132 PUSH DX ;; STACK +1 -- # of HWCP
1133 ;;
1134 PUSH CS ;;
1135 POP DS ;;
1136 MOV BUF.RBUFMX,0 ;;
1137 MOV SI,BUF.PDESCO ;;
1138 MOV SI,CS:[SI].SELH_O ;;
1139 XOR CX,CX ;;
1140 MOV CL,CS:BYTE PTR [SI] ;;
1141 INC CX ;; including the length byte
1142 ;;
1143 MOV DI,BUF.FTSTART ;; control template
1144DEF_FTBUF: ;; fill the font buffer with the
1145 PUSH DI ;;
1146 POP ES ;;
1147 XOR DI,DI ;;
1148 ;;
1149 PUSH CX ;;
1150 PUSH SI ;;
1151 REP MOVSB ;;
1152 POP SI ;;
1153 POP CX ;;
1154 ;;
1155 PUSH ES ;;
1156 POP DI ;;
1157 ADD DI,BUF.FTszpa ;;
1158 DEC DX ;;
1159 JNZ DEF_FTBUF ;;
1160 ;;
1161 POP DX ;; STACK -1
1162 ;;
1163 MOV SI,BUF.HARDSO ;;
1164 MOV DI,BUF.FTSTART ;; define the HWCP values
1165DEF_FThwcp : ;;
1166 PUSH DI ;;
1167 POP ES ;;
1168 MOV DI,CTL5202_OFFS ;; offset to the HWCP words
1169 ;;
1170 MOV AX,CS:[SI].SLT_CP ;;
1171 MOV ES:WORD PTR [DI],AX ;;
1172 ;;
1173 INC SI ;;
1174 INC SI ;;
1175 INC SI ;;
1176 INC SI ;;
1177 ;;
1178 PUSH ES ;;
1179 POP DI ;;
1180 ADD DI,BUF.FTSZPA ;;
1181 DEC DX ;;
1182 JNZ DEF_FThwcp ;;
1183 ;;
1184 POP DX ;;
1185 POP DI ;;
1186 POP ES ;;
1187 POP DS ;;
1188 POP SI ;;
1189 POP CX ;;
1190 ;;
1191 JMP DEFBUF_DONE ;;
1192 ;;
1193 ;;
1194DEF_RBUF : ;;
1195 MOV BUF.RSLMX,CX ;; the no. of ram slots supported
1196 CMP CX,RMMAX[DI] ;;
1197 JNB DEFBUF_DONE ;;
1198 MOV AX,RMMAX[DI] ;;
1199 MOV BUF.RSLMX,AX ;; the max. of .RAMMX and .RBUFMX
1200 ;;
1201DEFBUF_DONE : ;;
1202 MOV BUF.STATE,CPSW ;; the LPTn is CPSW ----- STATE
1203 ;;
1204 CMP BUF.BFLAG,BF_PRN ;;
1205 JNE RET_CHK_DID ;;
1206 MOV AX,DID_BIT[DI] ;;
1207 MOV BUF.DID_PRN,AX ;;
1208 ;;
1209 ;;
1210 JMP RET_CHK_DID ;;
1211 ;;
1212LPT_FAIL: ;;
1213 ;;
1214 MOV BUF.STATE,NORMAL ;; the LPTn is NORMAL --- STATE
1215 ;;
1216 ;;
1217RET_CHK_DID: ;;
1218 ;;
1219 pop dx ;;
1220 pop di ;;
1221 pop cx ;;
1222 ;;
1223 RET ;;
1224 ;;
1225CHK_DID ENDP ;;
1226 ;;
1227;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1228;;
1229;; Called by INIT to check for consistency between duplicated device name and
1230;; between PRN and LPT1
1231;;
1232;; at entry : DI = pointer to PAR_DEVOT
1233;; BUF.STATE = any state
1234;; CX = DID order
1235;;
1236;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1237 ;;
1238DEV_CHECK PROC ;;
1239 ;;
1240 LEA SI,BUF.PAR_EXTRACTO ;;
1241 ;;
1242 PUSH CX ;;
1243 ;;
1244 PUSH SI ;; compare device id
1245 PUSH DI ;;
1246 mov SI,[SI].PAR_DIDO ;;
1247 MOV DI,PSE.PAR_DIDO ;;
1248 MOV CX,PSE.PAR_DNML ;;
1249 INC CX ;; including length
1250 INC CX ;;
1251 REPE CMPSB ;;
1252 POP DI ;;
1253 POP SI ;;
1254 Jz hwcp_check ;;
1255 mov init_chk,0021h ;; error 0021h
1256 Jmp FORCE_LPT_BAD ;;
1257 ;;
1258hwcp_check : ;;
1259 PUSH SI ;; compare HWCP
1260 PUSH DI ;;
1261 mov SI,[SI].PAR_HWCPO ;;
1262 MOV DI,PSE.PAR_HWCPO ;;
1263 MOV AX,PSE.PAR_HWCPL ;;
1264 MOV CX,2 ;;
1265 SHL AX,CL ;; multiply by two
1266 INC AX ;; including length
1267 INC AX ;;
1268 MOV CX,AX ;;
1269 REPE CMPSB ;;
1270 POP DI ;;
1271 POP SI ;;
1272 Jz desig_check ;;
1273 mov init_chk,0022h ;; error 0022h
1274 Jmp FORCE_LPT_BAD ;;
1275 ;;
1276desig_check : ;;
1277 PUSH SI ;; compare DESIGNATE
1278 PUSH DI ;;
1279 mov SI,[SI].PAR_DESGO ;;
1280 MOV DI,PSE.PAR_DESGO ;;
1281 MOV AX,PSE.PAR_DESGL ;;
1282 MOV CX,2 ;;
1283 SHL AX,CL ;; multiply by two
1284 INC AX ;; including length
1285 INC AX ;;
1286 MOV CX,AX ;;
1287 REPE CMPSB ;;
1288 POP DI ;;
1289 POP SI ;;
1290 Jz param_check ;;
1291 mov init_chk,0023h ;; error 0023h
1292 Jmp FORCE_LPT_BAD ;;
1293 ;;
1294param_check : ;;
1295 PUSH SI ;; compare parameters
1296 PUSH DI ;;
1297 mov SI,[SI].PAR_PARMO ;;
1298 MOV DI,PSE.PAR_PARMO ;;
1299 MOV CX,PSE.PAR_PARML ;;
1300 INC CX ;; including length
1301 INC CX ;;
1302 REPE CMPSB ;;
1303 POP DI ;;
1304 POP SI ;;
1305 JZ M_END ;;
1306 mov init_chk,0024h ;; error 0024h
1307 ;;
1308FORCE_LPT_BAD : ;; the second set of parameters is
1309 MOV BUF.STATE,NORMAL ;; bad
1310 ;;
1311 CMP BUF.BFLAG,BF_LPT1 ;;
1312 JNE M_END ;;
1313 ;;
1314 ;; since LPT1 is bad, force PRN to bad
1315 push bx ;; force prn to be bad too
1316 mov bx,buf.prn_bufo ;;
1317 MOV BUF.STATE,NORMAL ;;
1318 pop bx ;;
1319 ;;
1320 mov AX,BUF.DID_PRN ;; if PRN was not good, DID_PRN = 0
1321 OR DID_FAIL,AX ;;
1322 ;;
1323 ;;
1324M_END: ;; force the good did_status to fail if
1325 ;; STATE is bad
1326 POP CX ;;
1327 PUSH CX ;; order 0 to m
1328 MOV AX,DID_STATUS ;;
1329 ;;
1330 INC CX ;;
1331 SHR AX,CL ;;
1332 POP CX ;;
1333 JNC DEV_CHECK_RET ;; already failed
1334 ;;
1335 CMP BUF.STATE,CPSW ;;
1336 JE DEV_CHECK_RET ;;
1337 ;;
1338 PUSH BX ;;
1339 MOV BX,CX ;;
1340 ADD BX,BX ;;
1341 MOV AX,DID_BIT[BX] ;;
1342 OR DID_FAIL,AX ;; force DID to fail
1343 POP BX ;;
1344 ;;
1345 ;;
1346DEV_CHECK_RET : ;;
1347 ;;
1348 RET ;;
1349 ;;
1350 ;;
1351DEV_CHECK ENDP ;;
1352 ;;
1353;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1354 ;;
1355
1356;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1357;
1358; PROCEDURE_NAME: LOAD_INT2F
1359;
1360; FUNCTION:
1361; THIS PROCEDURE LOADS THE INTERRUPT HANDLER FOR INT2FH
1362;
1363; AT ENTRY:
1364;
1365; AT EXIT:
1366; NORMAL: INTERRUPT 2FH VECTOR POINTS TO INT2F_COM. OLD INT 2FH
1367; VECTOR STORED.
1368;
1369; ERROR: N/A
1370;
1371;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1372
1373SEMAPHORE DB 0 ;AN000;
1374 ;AN000;
1375LOAD_INT2F PROC NEAR ;AN000;
1376 CMP CS:SEMAPHORE,0 ; already loaded? ;AN000;
1377 JNE LI_1 ; yes.....exit ;AN000;
1378 PUSH ES ; no...load. ;AN000;
1379 PUSH CX ; ;AN000;
1380 PUSH AX ; ;AN000;
1381 XOR AX,AX ; point ES to low.. ;AN000;
1382 MOV ES,AX ; memory. ;AN000;
1383 MOV AX,ES:WORD PTR INT2F_LOW ; store original.. ;AN000;
1384 MOV CS:ROM_INT2F,AX ; interrupt 2Fh.. ;AN000;
1385 MOV CX,ES:WORD PTR INT2F_HI ; location.. ;AN000;
1386 MOV CS:ROM_INT2F+2,CX ; ;AN000;
1387 OR AX,CX ; check if old int2F.. ;AN000;
1388 JNZ LI_0 ; is 0. ;AN000;
1389 MOV AX,OFFSET ABORT ; yes....point to.. ;AN000;
1390 MOV CS:ROM_INT2F,AX ; IRET. ;AN000;
1391 MOV AX,CS ; ;AN000;
1392 MOV CS:ROM_INT2F+2,AX ; ;AN000;
1393LI_0: ; ;AN000;
1394 CLI ; ;AN000;
1395 MOV ES:WORD PTR INT2F_LOW,OFFSET INT2F_COM ; replace vector.. ;AN000;
1396 MOV ES:WORD PTR INT2F_HI,CS ; with our own.. ;AN000;
1397 STI ; ;AN000;
1398 POP AX ; ;AN000;
1399 POP CX ; ;AN000;
1400 POP ES ; ;AN000;
1401 MOV CS:SEMAPHORE,1 ; now loaded. ;AN000;
1402LI_1: RET ; ;AN000;
1403LOAD_INT2F ENDP
1404
1405.XLIST
1406MSG_SERVICES <MSGDATA> ; WGR ;AN000;
1407MSG_SERVICES <DISPLAYmsg,LOADmsg,CHARmsg> ; WGR ;AN000;
1408MSG_SERVICES <PRINTER.CL1> ; WGR ;AN000;
1409MSG_SERVICES <PRINTER.CL2> ; WGR ;AN000;
1410MSG_SERVICES <PRINTER.CLA> ; WGR ;AN000;
1411.LIST
1412
1413include msgdcl.inc
1414
1415CSEG ENDS
1416 END
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
diff --git a/v4.0/src/DEV/PRINTER/MAKEFILE b/v4.0/src/DEV/PRINTER/MAKEFILE
new file mode 100644
index 0000000..2f14f1a
--- /dev/null
+++ b/v4.0/src/DEV/PRINTER/MAKEFILE
@@ -0,0 +1,40 @@
1#************************* Makefile for Printer ***************************
2
3inc =..\..\inc
4msg =..\..\messages
5dos =..\..\dos
6hinc =..\..\h
7make =nmake
8
9#
10######################## Dependencies Begin Here ##########################
11#
12
13all: printer.sys 5202.cpi
14
15printer.ctl: printer.skl $(msg)\$(COUNTRY).msg
16
17cpspm10.obj: cpspm10.asm cpspequ.inc
18
19cpsfont3.obj: cpsfont3.asm cpspequ.inc
20
21prtint2f.obj: prtint2f.asm cpspequ.inc $(inc)\struc.inc
22
23cpspi07.obj: cpspi07.asm cpspequ.inc \
24 $(inc)\sysmsg.inc printer.ctl \
25 $(inc)\versiona.inc
26
27parser.obj: parser.asm cpspequ.inc $(inc)\parse.asm \
28 $(inc)\struc.inc
29
30printer.sys: cpspm10.obj cpsfont3.obj parser.obj cpspi07.obj prtint2f.obj
31 link @printer.lnk
32 exe2bin printer.exe printer.sys < zero.dat
33 del printer.exe
34
355202.cpi:
36 cd 5202
37 $(make)
38 cd ..
39
40
diff --git a/v4.0/src/DEV/PRINTER/PARSE4E.ASM b/v4.0/src/DEV/PRINTER/PARSE4E.ASM
new file mode 100644
index 0000000..872a458
--- /dev/null
+++ b/v4.0/src/DEV/PRINTER/PARSE4E.ASM
@@ -0,0 +1,1106 @@
1;***************************************************************
2;** **
3;** ******** ** ** ******* **
4;** ** ** ** ** **
5;** ** ******* ***** **
6;** ** ** ** ** **
7;** ** ** ** ******* **
8;** **
9;** ****** * ****** ****** ******* ****** **
10;** ** ** ** ** ** ** ** ** ** ** **
11;** ****** ******* ****** ***** ****** ****** **
12;** ** ** ** ** ** ** ** ** ** **
13;** ** ** ** ** ** ****** ******* ** ** **
14;** **
15;***************************************************************
16;
17; File Name: PARSE.ASM
18; ----------
19;
20; Description: A command parser for DEVICE command in the CONFIG.SYS file.
21; ------------
22;
23; Procedures contained in the file:
24; ---------------------------------
25; PARSER: Main routine for command processing.
26; GET_CHAR: Gets a character from command line.
27; IS_ALPH: Checks if character is an alpha character.
28; IS_DIGIT: Checks if character is a digit.
29; IS_DELIM: Checks if character is a DOS delimiter.
30; DEVICE_PARSE: Pulls device name from command line and
31; inserts in table.
32; ID_PARSE: Pulls id name from command line and insers in table
33; HWCP_PARMS: Extract HWCP number, converts it to binary and
34; inserts it in table.
35; HWCP_PARSE: Extracts HWCP number if only one number is given.
36; MUL_HWCP: Extracts multiple HWCP's numbers, if they are given
37; in a list.
38; DESG_PARMS: Extracts designate number, converts it to binary
39; and inserts it in table.
40; DESG_FONT: Extracts the designate and the font if both were
41; given in command line.
42; DESG_PARSE: Pulls designate number if it is the only one given.
43; GET_NUMBER: Converts a number to binary.
44; OFFSET_TABLE: Updates the counter in table #1.
45; FIND_RIGHT_BR: Looks for a right bracket.
46;
47;
48; Change history:
49; ---------------
50;
51;
52;LOGIC:
53;------
54; Establish addressability to parameters.
55; Skip until end of path and file name -first delimiter
56;
57; Loop:
58; Isolate the first non-delimiter or non delimeter characters.
59; If End_of_Line_Delimiter then
60; return an error_code
61; Else
62; If first non-delimiter is ALPHA then
63; (assume a device name)
64; Extracts device name
65; Update offset counter
66;
67; Isolate the first non-delimiter characters after id name.
68; If End_of_Line_Delimiter then
69; return an error_code
70; Else
71; If first non-delimiter is ALPHA-NUMARIC or
72; If character is '(' then
73; (assume an id name)
74; Extracts id name
75; Update offset counter
76;
77; Pull out HWCP
78; If error flag is set then exit
79; Else if end of line flag is set then exit
80;
81; Pull out DESG parms
82; If error_flag is set then exit.
83; Else if end of line flag is set then exit
84; Else if Number of devices is four then Exit
85; Else Loop
86;
87;
88;Subroutines Logic:
89;------------------
90;
91; GET_CHAR:
92; ---------
93; Load character in AL
94; If character less than 20h then
95; turn Z-flag on
96;
97; IS_ALPHA:
98; ---------
99; Save character
100; 'Convert character to upper case'
101; If character >=A and <=Z then
102; turn Z-flag on
103; exit
104; Else
105; Restore character
106; exit.
107;
108; IS_DIGIT:
109; --------- If Character >=0 and <=9 then
110; turn Z-flag on
111;
112; IS_DELIMITER:
113; -------------
114; If character a dos delimiter (' ','=',',',';',TAB)
115; then turn Z-flag on
116;
117; DEVICE_PARSE:
118; -------------
119; Set device name length counter.
120; Loop
121; If a dos delimiter then
122; add spaces to name (if require)
123; Else if char is ALPHA-NUM then
124; save in table
125; If name >8 character thne
126; error; exit
127; Else
128; error; exit
129;
130; ID_PARSE:
131; --------- Set id name length counter.
132; Loop
133; If a dos delimiter then
134; add spaces to name (if require)
135; Else if char is ALPHA-NUM then
136; save in table
137; If name >8 character then
138; error; exit
139; Else if char is ')' or '(' then
140; set flags
141; Else
142; error; exit
143;
144; HWCP_PARMS:
145; -----------
146; Loop: Set flags off
147; If char is a DIGIT then
148; convert number to binary
149; update table
150; Else if char is ',' then
151; no HWCP was given
152; exit
153; Else if char is '(' then
154; assume multiple HWCP
155; Else if char is ')' then
156; end of parms, exit
157; Else if not a delimiter then
158; error, exit set carry flag set carry flag
159; Loop
160;
161; HWCP_PARSE:
162; ----------- Increment counter
163; Get number and convert to binary
164; Update the table
165; Set table_5 pointer
166;
167; MUL_HWCP:
168; ---------
169; Loop: If char is ')' then
170; end of list, exit
171; If char is a DIGIT
172; Get number and convert to binary
173; Update table.
174; If char is not a delimiter then
175; error, exit set carry flag
176; Loop
177;
178; DESG_PARMS:
179; -----------
180; Loop: If char is a DIGIT then
181; Get number and convert to binary
182; Update table.
183; If char is a ')' then
184; end of parms, exit
185; If char is a '(' then
186; assume given desg. and font
187; If char is a ',' then
188; no desg ginven
189; scane for ')'
190; If char is not a delimiter then
191; error, exit set carry flag
192; Loop
193;
194; DESG_FONT:
195; ----------
196; Loop: If char is a ',' then
197; no desg number was given
198; update table
199; If char is a ')' then
200; end of desg-font pair, exit
201; If char is a DIGIT then
202; Get number and convert to binary
203; Update table
204; If char not a delimiter then
205; error, exit set carry flag
206; Loop
207;
208; DESG_PARSE:
209; ----------- Get number and conver to binary
210; Update table
211;
212; GET_NUMBER:
213; ----------- Get ASCII number from parms
214; conver to binary
215; add to total
216;
217; OFFSET_TABLE:
218; -------------
219; Increment the number of parms
220;
221; FIND_RIGHT_BR:
222; --------------
223; Loop: If char is ')' then
224; found bracket exit
225; If char is not ' ' then
226; error, exit set carry flag
227; Loop
228; END
229;------------------------------------------------------
230;
231; The following is the table structure of the parser. All fields are
232; two bytes field (accept for the device and id name)
233;
234; TABLE HEADER :
235; ÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
236; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
237; ³ N = Number of devices. ³
238; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
239; ³ Device # 1 offset ÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄ>ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
240; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ³
241; ³ Device # 2 offset ³ ³ Table_1 (a) ³
242; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ³
243; ³ Device # 3 offset ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
244; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
245; ³ Device # 4 offset ³
246; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
247;
248;
249; N = 1,2,3 or 4. A two bytes number indicating the number of device specified.
250; DEVICE # N OFFSET : a two bytes offset address to table_1. (ie. Device #1 offset
251; is a pointer to table_1 (a). Device #2 offset is a pointer to table_1
252; (b)...etc.). If an error was detected in the command N is set to zero.
253;
254;
255;
256; TABLE_1 :
257; ÍÍÍÍÍÍÍÍÍ
258;
259; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
260; ³ N = Number of Offsets. ³ ³ ³
261; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ÚÄÄÄÄÄij Table_2 (a) ³
262; ³ Device Name offset ÄÅÄÄÄÄÙ ³ ³
263; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
264; ³ Device Id offset ÄÅÄÄÄÄÄÄ¿
265; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
266; ³ Device HWCP offset ÄÅÄÄÄÄ¿ ³ ³ ³
267; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ÀÄÄÄij Table_3 (a) ³
268; ³ Device Desg offset ÄÅÄÄ¿ ³ ³ ³
269; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
270; ³ "Reserved" ³ ³ ³
271; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ³ ³ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
272; ³ ³ ³ ³
273; ³ ÀÄÄÄÄÄij Table_4 (a) ³
274; ³ ³ ³
275; ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
276; ³ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
277; ³ ³ ³
278; ÀÄÄÄÄÄÄÄij Table_5 (a) ³
279; ³ ³
280; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
281;
282;
283; N=Length of table_1, or the number of offsets contained in table_1.
284; The offsets are pointers (two bytes) to the parameters value of the device.
285; "Reserved" : a two byte memory reserved for future use of the "PARMS" option.
286;
287;
288; TABLE_2 :
289; ÍÍÍÍÍÍÍÍÍ
290;
291; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
292; ³ N = Length of devices name ³
293; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
294; ³ Device name ³
295; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
296;
297; N = Length of device name. Device length is always 8 byte long.
298; Device Name : the name of the device (eg. LPT1, CON, PRN). The name
299; is paded with spaces to make up the rest of the 8 characters.
300;
301;
302;
303; TABLE_3 :
304; ÍÍÍÍÍÍÍÍÍ
305;
306; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
307; ³ N = Length of Id name. ³
308; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
309; ³ Id Name ³
310; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
311;
312; N = Length of id name. Id name length is always 8 byte long.
313; Id Name : the name of the id (eg. EGA, VGA, 3812). The name
314; is paded with spaces to make up the rest of the 8 character.
315;
316;
317;
318; TABLE_4 :
319; ÍÍÍÍÍÍÍÍÍ
320;
321; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
322; ³ N = Length of table. ³
323; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
324; ³ HWCP # 1 ³
325; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
326; ³ HWCP # 2 ³
327; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
328; ³ . ³
329; ³ . ³
330; ³ . ³
331; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
332; ³ HWCP # 10 ³
333; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
334;
335;
336; N = Length of table in words. Or the number of HWCP's.
337; HWCP # N : a hardware code page number converted to binary. The maximum
338; number of pages allowed is 10.
339;
340;
341;
342; TABLE_5 :
343; ÍÍÍÍÍÍÍÍÍ
344;
345; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
346; ³ N = Length of table. ³
347; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
348; ³ Designate ³
349; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
350; ³ Font ³
351; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
352;
353; N = Lenght of table. 0 - nothing was specified
354; 1 - Only a designate was specified.
355; 2 - Designate and font were given. If the Desg field
356; was left empty in the DEVICE command then the
357; Designate field is filled with 0FFFFH.
358; Designate, Font : Are the Desg. and Font binary numbers.
359;
360;------------------------------------------------------
361;
362
363PROGRAM SEGMENT
364
365 ASSUME CS:PROGRAM
366 ASSUME DS:PROGRAM
367 ASSUME ES:PROGRAM
368
369 ORG 100H
370
371START:
372 JMP NOW
373
374;RESERVED MEMORY:
375TABLE_1 DW ? ; Pointer at offsets.
376TABLE_2 DW ? ; Pointer at device name.
377TABLE_3 DW ? ; Pointer at id name.
378TABLE_4 DW ? ; Pointer at hwcp.
379TABLE_5 DW ? ; Pointer at desg and font.
380TABLE DB 290 DUP (?) ; Table of parsed parms. Max 4 devices.
381DEVNUM DW ? ; Counter to number of devices.
382RIGHT_FLAG DB ? ; Flag to indicate a left bracket.
383DEV_ERR_FLG DB ? ; Device name error flag.
384ID_ERR_FLG DB ? ; Id name error flag.
385ERROR_FLAG DB ? ; Error flag_terminate program if set to 1.
386COMMA_FLAG DB ? ; Indicate the number of commas incounterd.
387HWCP_FLAG DB ? ; Flag for multiple hwcps.
388DESG_FLAG DB ? ; Flag indicates desg. and font.
389
390;Main part of program-links different sumbroutines together
391NOW:
392 CALL PARSER
393 INT 20H ;Exit DOS.
394
395PARSER PROC
396
397 PUSH AX ; ;;;;;;;;;;;;;;;;;;
398 PUSH BX ; ;
399 PUSH CX ; ; SAVE
400 PUSH DX ; ; ALL
401 PUSH DS ; ; REGISTERS.
402 PUSH ES ; ;
403 PUSH DI ; ;
404 PUSH SI ; ;;;;;;;;;;;;;;;;;;
405
406 ;LES SI,RH.RH0_BPBA ; Point at all after DEVICE=
407 ; in the CONFIG.SYS file.
408
409 mov di,81h ; ;;;;;;;;;;;;;;;;;;;;;;;;;
410 mov cl,cs:byte ptr [di-1] ; ; ;;
411 xor ch,ch ; ; ERASE THIS ;;
412 add di,cx ; ;;;;;;;; CODE IN ;;
413 mov ds:word ptr[di],0a0dh ; ; CPS ;;
414 ; ;;;;;;;; ;;
415 MOV SI,0081h ; ;Set SI at parameters. ;;
416 ; ;;;;;;;;;;;;;;;;;;;;;;;;;
417
418;Skip to end of file name, to the first DOS delimiter.
419
420 MOV DEVNUM,02H ; Number of devices counter.
421
422GET_PARMS_A: CALL GET_CHAR ; Get command character in AL .
423 JZ EXIT_B ; No parms found.
424 CALL IS_DELIM ; If not a delimiter then.
425 JNE GET_PARMS_A ; Check next character.
426
427 MOV DI,OFFSET TABLE ; Get the table address.
428 ADD DI,02H ; Point at devices offsets.
429 MOV BX,DI ;
430 ADD BX,08H ; Point BX at parms offsets.
431TAB2: CALL UPDATE_TABLE ; Update table pointers value.
432
433CLR_DELIM: CALL GET_CHAR ; Get character into AL.
434 JZ EXIT_B ; No parms found.
435 CALL IS_ALPHA ; If alpha then assume.
436 JZ DEVICE ; A device name.
437 CALL IS_DELIM ; Is it a delimiter
438 JNE EXIT_A ; If not then error.
439 JMP CLR_DELIM ; Get next character.
440
441DEVICE: MOV DEV_ERR_FLG,00H ; Set device error flag off;
442 CALL DEVICE_PARSE ; Call routine to parse device name.
443 CMP DEV_ERR_FLG,01H ; If error flag is
444 JZ EXIT_A ; set then exit.
445 CALL OFFSET_TABLE ; Update table.
446
447ID_PARMS: CALL GET_CHAR ; Load a character in AL.
448 JZ EXIT_A ; Exit if end of line (error).
449 CMP AL,'(' ; If AL is a '(' then
450 JE ID ; Parse ID name.
451 CALL IS_ALPHA ; If an Alpha
452 JE ID ; Then parse ID name.
453 CALL IS_DIGIT ; If a digit
454 JE ID ; Then parse ID name.
455 CALL IS_DELIM ; If not a delimiter
456 JNE EXIT_A ; Then error, exit
457 JMP ID_PARMS ; Get another number
458
459EXIT_B: CMP DEVNUM,02H ; If device number above 2 then
460 JA EXIT_C ; Exit parse.
461 JMP EXIT_A ; Else error, exit
462
463ID: MOV ID_ERR_FLG,00H ; Set id error flag off.
464 CALL ID_PARSE ; Parse ID name.
465 CMP ID_ERR_FLG,01H ; Was error flag set, then
466 JE EXIT_A ; Print error message.
467 CALL OFFSET_TABLE ; Update table of offsets.
468
469 CALL HWCP_PARMS ; Get code page number
470 CMP ERROR_FLAG,01H ; If error, then
471 JE EXIT_A ; Print error message and exit
472 CMP ERROR_FLAG,02H ; If end of string
473 JE EXIT_H ; Then exit.
474
475 CALL DESG_PARMS ; Get designate number
476 CMP ERROR_FLAG,01H ; If error, then
477 JE EXIT_A ; Print error message and exit
478 JMP EXIT_H ; Then exit.
479
480EXIT_A: MOV DI,OFFSET TABLE ; Load table offset
481 MOV DS:WORD PTR [DI],00H ; Set error to on.
482 STC ; Set carry flag
483 JMP EXIT_P ; Exit parse.
484
485EXIT_H: MOV DI,OFFSET TABLE ; Load table offset.
486 ADD DS:WORD PTR [DI],01H ; Increment number of devices.
487 CMP DEVNUM,08H ; If 4 devices loaded
488 JE EXIT_C ; Then exit parse.
489 ADD DEVNUM,02H ; Increment the number of devices
490 ADD DI,DEVNUM ; Point at next devices offset.
491 MOV BX,TABLE_5 ; BX point at
492 ADD BX,06H ; end of previous table.
493 JMP TAB2 ; Get next device.
494
495EXIT_C: CLC
496
497EXIT_P: POP SI ; ;;;;;;;;;;;;;;;;;;
498 POP DI ; ;
499 POP ES ; ; RESTORE
500 POP DS ; ; ALL
501 POP DX ; ; REGISTERS.
502 POP CX ; ;
503 POP BX ; ;
504 POP AX ; ;;;;;;;;;;;;;;;;;;
505 RET
506
507PARSER ENDP
508
509
510;********************************************************
511;** GET_CHAR : a routine to get next character pointed **
512;** to by ES:SI into AL. **
513;********************************************************
514
515GET_CHAR PROC
516
517 MOV AL,ES:BYTE PTR [SI] ; Load character pointed to
518 CMP AL,09H ; by ES:[SI] in AL.
519 JE ZOFF ; If tab then O.K
520 CMP AL,20H ; Turn Z-flag on
521 JL TURN_Z_ON ; if character
522ZOFF: INC SI ; is below
523 JMP GET_CHAR_X ; 20h.
524 ; ( End of line
525TURN_Z_ON: CMP AL,AL ; delimiters ).
526GET_CHAR_X: RET
527
528GET_CHAR ENDP
529
530
531;********************************************************
532;** IS_ALPHA : a routine to check the character in **
533;** AL if it is an alpha character (a...z,A...Z). **
534;** If character is lower case, convert to upper case. **
535;********************************************************
536
537IS_ALPHA PROC
538
539 PUSH AX ; Save value of AL
540 AND AL,0DFH ; Convert to upper case
541 CMP AL,'A' ; If <'A', then
542 JB IS_ALPHA_X ; NZ-flag is set, exit
543 CMP AL,'Z' ; If >'Z', then
544 JA IS_ALPHA_X ; NZ-flag is set, exit
545 CMP AL,AL ; Force Z-flag
546 POP DX ; Discard lower case.
547 JMP IA_X ; Exit.
548IS_ALPHA_X: POP AX ; Restore value of AL
549IA_X: RET
550
551IS_ALPHA ENDP
552
553
554;********************************************************
555;** IS_DIGIT : a routine to check if the character in **
556;** AL register is a digit (i.e. 1..9). **
557;********************************************************
558
559IS_DIGIT PROC
560
561 CMP AL,'0' ; If < '0' then
562 JB IS_NUM_X ; NZ-flag is set, exit
563 CMP AL,'9' ; If > '9' then
564 JA IS_NUM_X ; NZ-flag is set, exit
565 CMP AL,AL ; Set Z-flag to indecate digit
566IS_NUM_X: RET
567
568IS_DIGIT ENDP
569
570
571;********************************************************
572;** IS_DELIM : This routine check if the character in **
573;** AL is a delimiter. ('+',' ',';',',','=',tab) **
574;********************************************************
575
576IS_DELIM PROC
577
578 CMP AL,' ' ; Test for space.
579 JE IS_DELIM_X ; Z-flag is set, exit
580 CMP AL,',' ; Test for comma.
581 JE IS_DELIM_X ; Z-flag is set, exit
582 CMP AL,';' ; Test for semicolon.
583 JE IS_DELIM_X ; Z-flag is set, exit
584 CMP AL,'=' ; Test for equal sign.
585 JE IS_DELIM_X ; Z-flag is set, exit
586 CMP AL,09h ; Test for TAB.
587
588IS_DELIM_X: RET ; Exit
589
590IS_DELIM ENDP
591
592
593;********************************************************
594;** DEVICE_PARSE : Parse the device driver name and **
595;** store in table. Update offset. **
596;********************************************************
597
598DEVICE_PARSE PROC
599
600 MOV DI,TABLE_2
601 MOV DS:WORD PTR [DI],0008H ; Save dev name size.
602 ADD DI,02H ; Increment DI.
603 MOV CX,9 ; Set counter.
604NEXT_C: CALL IS_ALPHA ; if Check then.
605 JZ SAVE_C ; Save it.
606 CALL IS_DIGIT ; if Digit then.
607 JZ SAVE_C ; Save it.
608 CMP AL,'-' ; If '-' then.
609 JZ SAVE_C ; Save it.
610 CALL IS_DELIM ; If a delimiter then.
611 JZ ADD_SPACE1 ; Pad with spaces.
612 CMP AL,':' ; If a colon
613 JE ADD_SPACE1 ; then end device parse
614 JMP ERR_DEV_PAR ; Else an error.
615
616SAVE_C: DEC CX ; Decrement counter.
617 CMP CX,0 ; If counter zero then.
618 JE ERR_DEV_PAR ; Error.
619 MOV DS:BYTE PTR [DI],AL ; Save char in table.
620 INC DI ; Increment pointer.
621 CALL GET_CHAR ; Get another char.
622 JZ ERR_DEV_PAR
623 JMP NEXT_C ; Check char.
624
625ERR_DEV_PAR: MOV DEV_ERR_FLG,01H ; Set error flag.
626 JMP DEV_PAR_X ; Exit.
627
628ADD_SPACE1: DEC CX ; Check counter.
629 CMP CX,1
630 JL DEV_PAR_X ; Exit if already 8.
631LL1: MOV DS:BYTE PTR [DI],' ' ; Pad name with spaces.
632 INC DI ; Increment pointer.
633 LOOP LL1 ; Loop again.
634DEV_PAR_X: RET
635
636DEVICE_PARSE ENDP
637
638
639;********************************************************
640;** ID_PARSE : Parse the id driver name and **
641;** store in table. Update offset. **
642;********************************************************
643
644ID_PARSE PROC
645
646 MOV DI,TABLE_3
647 MOV DS:WORD PTR [DI],0008H ; Save dev name size.
648 ADD DI,02H ; Increment DI.
649 MOV RIGHT_FLAG,00H ; Clear flag.
650 MOV CX,9 ; Set counter.
651
652NEXT_I: CALL IS_ALPHA ; If Check then.
653 JZ SAVE_I ; Save it.
654 CALL IS_DIGIT ; if Digit then.
655 JZ SAVE_I ; Save it.
656 CMP AL,'-' ; If '-' then.
657 JZ SAVE_I ; Save it.
658 CMP AL,'(' ; If '(' then.
659 JE RIG_BR_FLG ; Set flag.
660 CMP AL,')' ; If ')' then
661 JE BR_FLG_LEF ; Pad with spaces.
662 CALL IS_DELIM ; If a delimiter then.
663 JZ ADD_SPACE2 ; Pad with spaces.
664 JMP ERR_ID_PAR ; Else an error.
665
666SAVE_I: DEC CX ; Decrement counter.
667 CMP CX,0 ; If counter zero then.
668 JLE ERR_ID_PAR ; Error.
669 MOV DS:BYTE PTR [DI],AL ; Save char in table.
670 INC DI ; Increment pointer.
671 CALL GET_CHAR ; Get another char.
672 JZ ADD_SPACE2 ; Exit routine.
673 JMP NEXT_I ; Check char.
674
675ERR_ID_PAR: MOV ID_ERR_FLG,01H ; Set error falg on.
676 JMP ID_PAR_X ; Exit.
677
678BR_FLG_LEF: CMP RIGHT_FLAG,01H ; If left bracket was
679 JNE ERR_ID_PAR ; found and no previous
680 JMP ADD_SPACE2 ; Bracket found, then error
681
682RIG_BR_FLG: CMP RIGHT_FLAG,01H ; If more than one bracket
683 JE ERR_ID_PAR ; then error.
684 CMP CX,09 ; If '(' and already id
685 JB ERR_ID_PAR ; then error.
686 MOV RIGHT_FLAG,01H ; Set flag for.
687 CALL GET_CHAR ; Left brackets.
688 JZ ERR_ID_PAR ; If end of line,exit.
689 JMP NEXT_I ; Check character.
690
691ADD_SPACE2: DEC CX ; Check counter.
692 CMP CX,1
693 JL ID_PAR_X ; Exit if already 8.
694
695LL2: MOV DS:BYTE PTR [DI],' ' ; Pad name with spaces.
696 INC DI ; Increment pointer.
697 LOOP LL2 ; Loop again.
698
699ID_PAR_X: RET
700
701ID_PARSE ENDP
702
703;********************************************************
704;** HWCP_PARMS : Scane for the hardware code page, and **
705;** parse it if found. Flag codes set to: **
706;** ERROR_FLAG = 0 - parsing completed. No error. **
707;** ERROR_FLAG = 1 - error found exit parse. **
708;** ERROR_FLAG = 2 - end of line found, exit parse. **
709;********************************************************
710
711
712HWCP_PARMS PROC
713
714 MOV COMMA_FLAG,00H ; Set the comma flag off.
715 MOV ERROR_FLAG,00H ; Set the error flag off.
716 DEC SI ; Point at current char in Al.
717 CMP RIGHT_FLAG,01H ; If no left brackets then
718 JNE LEFT_BR ; Exit parse.
719
720HWCP_1: CALL GET_CHAR ; Load character in AL.
721 JZ LEFT_BR ; Exit, if end of line.
722 CALL IS_DIGIT ; Check if digit, then
723 JE HP1 ; Parse hwcp parms.
724 CMP AL,',' ; If a comma
725 JE COMMA_1 ; Jump to comma_1
726 CMP AL,')' ; If a ')' then
727 JE RIGHT_BR ; end of current dev parms.
728 CMP AL,'(' ; If a '(' then
729 JE HWCP_2 ; There are multible hwcp.
730 CALL IS_DELIM ; Else, if not a delimiter
731 JNE EXIT_2 ; Then error, exit
732 JMP HWCP_1 ; Get another character.
733
734LEFT_BR: CMP RIGHT_FLAG,01H ; If no left bracket
735 JE EXIT_2 ; Then error, exit
736 JMP RB1 ; Jump to rb1
737
738COMMA_1: CMP COMMA_FLAG,01H ; If comma flag set
739 JE COM_2_HC ; Then exit hwcp parse.
740 MOV COMMA_FLAG,01H ; Else set comma flag.
741JMP HWCP_1 ; Get another character.
742
743HWCP_2: CMP RIGHT_FLAG,01H ; If left bracket not set
744 JNE EXIT_2 ; then error.
745 CALL MUL_HWCP ; else call multiple hwcp
746 ADD DI,02H ; routine. Increment DI
747 MOV TABLE_5,DI ; Desg. Table starts at end
748 CALL OFFSET_TABLE ; Update table of offsets.
749 JMP HP_X ; Exit.
750
751HP1: JMP HWCP ; Jump too long.
752
753COM_2_HC: MOV DI,TABLE_4 ; DI points at hwcp table
754 MOV DS:WORD PTR [DI],0000H ; Set number of pages to
755 MOV COMMA_FLAG,00H ; Zero and reset comma flag.
756 ADD DI,02H ; Increment DI.
757 MOV TABLE_5,DI ; Desg. Table starts at end
758 CALL OFFSET_TABLE ; Update table of offsets.
759 JMP HP_X ; of hwcp table. Exit.
760
761RIGHT_BR: CMP RIGHT_FLAG,01H ; If left brackets not
762 JNE EXIT_2 ; Found then error.
763RB1: MOV ERROR_FLAG,02H ; Set end of line flag.
764 MOV BX,TABLE_4 ; Point at hwcp table
765 ADD BX,02H ; Adjust pointer to desg
766 MOV TABLE_5,BX ; table, and save in table_5
767 MOV DI,TABLE_1 ; Point at table of offsets
768 ADD DI,08H ; Set at DESG offset
769 MOV DS:WORD PTR [DI],BX ; Update table.
770 JMP HP_X ; Exit
771
772
773
774EXIT_2: MOV ERROR_FLAG,01H ; Set error flag.
775 JMP HP_X ; and exit.
776
777HWCP: CMP RIGHT_FLAG,01H ; If left brackets not
778 JNE EXIT_2 ; Found then error.
779 CALL HWCP_PARSE ; Call parse one hwcp.
780 CMP ERROR_FLAG,01H ; If error flag set
781 JE HP_X ; Then exit, else
782 CALL OFFSET_TABLE ; Update table of offsets.
783
784HP_X: RET
785
786HWCP_PARMS ENDP
787
788
789;********************************************************
790;** HWCP_PARSE : Parse the hardware code page page **
791;** number and change it from hex to binary. **
792;********************************************************
793
794HWCP_PARSE PROC
795
796 MOV DI,TABLE_4 ; Load address of hwcpages.
797 ADD DS:WORD PTR [DI],0001H ; Set count to 1
798
799 CALL GET_NUMBER ; Convert number to binary.
800 CMP ERROR_FLAG,01H ; If error then
801 JE HWCP_X ; Exit.
802 MOV DS:WORD PTR [DI+2],BX ; Else, save binary page number
803 ADD DI,04H ; Increment counter
804 MOV TABLE_5,DI ; Set pointer of designate num
805
806HWCP_X: RET
807
808HWCP_PARSE ENDP
809
810
811;********************************************************
812;** MUL_HWCP : Parse multiple hardware code pages **
813;** and convert them from hex to binary numbers. **
814;********************************************************
815
816MUL_HWCP PROC
817
818 MOV DI,TABLE_4 ; Load offset of table_4
819 MOV BX,DI ; in DI and Bx.
820 MOV HWCP_FLAG,00H ; Set hwcp flag off.
821
822MH1: CALL GET_CHAR ; Load character in AL.
823 JZ MH3 ; Exit if end of line.
824 CMP AL,')' ; If ')' then exit
825 JE MH2 ; end of parms.
826 CALL IS_DIGIT ; If a digit, then
827 JE MH4 ; Convert number to binary.
828 CALL IS_DELIM ; If not a delimiter
829 JNE MH3 ; then error, exit
830 JMP MH1 ; get another character.
831
832MH2: CALL GET_CHAR ; Get next character
833 JMP MH_X ; and exit.
834
835MH3: MOV ERROR_FLAG,01H ; Set error flag on.
836 JMP MH_X ; Exit.
837
838MH4: ADD HWCP_FLAG,01H ; Set hwcp flag on (0 off)
839 ADD DI,02H ; Increment table pointer
840 PUSH BX ; Save Bx
841 CALL GET_NUMBER ; Convert number to binary.
842 MOV DS:WORD PTR [DI],BX ; Add number to table
843 POP BX ; Restore BX.
844 CMP ERROR_FLAG,01H ; If error then
845 JE MH_X ; Exit.
846 ADD DS:WORD PTR [BX],01H ; Increment hwcp count.
847 DEC SI ; Point at character in AL
848 JMP MH1 ; (delimeter or ')').
849MH_X: RET
850
851MUL_HWCP ENDP
852
853
854
855;********************************************************
856;** DESG_PARMS : Scane for the designate numbers, and **
857;** parse it if found. Flag codes set to: **
858;** ERROR_FLAG = 0 - parsing completed. No error. **
859;** ERROR_FLAG = 1 - error found exit parse. **
860;** ERROR_FLAG = 2 - end of line found, exit parse. **
861;********************************************************
862
863
864DESG_PARMS PROC
865
866 MOV DI,TABLE_1 ; Get offset of dev in DI
867 MOV BX,TABLE_5 ; & offset of desg. in BX.
868 ADD DI,08 ; Location of desg offset in table.
869 MOV DS:WORD PTR [DI],BX ; Update table.
870 MOV COMMA_FLAG,00H ; Set comma flag off.
871
872 cmp al,'('
873 je df
874 cmp al,')'
875 je right_br2
876
877 cmp al,','
878 jne desg_parm1
879 mov comma_flag,01h
880
881DESG_PARM1: CALL GET_CHAR ; Get character in AL.
882 JZ EXIT_3 ; Error, if end of line
883 CALL IS_DIGIT ; If character is a digit
884 JE DESG ; Then convert to binary.
885 CMP AL,')' ; If a ')', then
886 JE RIGHT_BR2 ; end of parameters.
887 CMP AL,'(' ; If a '(' then
888 JE DF ; parse desg and font.
889 CMP AL,',' ; If a comma then
890 JE DP3 ; set flag.
891 CALL IS_DELIM ; If not a delimiter
892 JNE EXIT_3 ; then error.
893 JMP DESG_PARM1 ; Get another character.
894
895RIGHT_BR2: CMP RIGHT_FLAG,01H ; IF no '(' encountered,
896 JNE EXIT_3 ; then error, exit
897 JMP DP_x ; Jump to DP1.
898
899EXIT_3: MOV ERROR_FLAG,01H ; Set error flag on
900 JMP DP_X ; Exit.
901
902DF: CMP RIGHT_FLAG,01H ; If no '(' encountered
903 JB EXIT_3 ; then error, exit
904 CALL DESG_FONT ; Parse desg and font.
905 JMP DP1 ; Jump to DP1.
906
907DP2: CALL FIND_RIGHT_BR ; Check for ')'
908 JMP DP_X ; Exit.
909
910DP3: CMP COMMA_FLAG,01H ; If comma flag set
911 JE DP2 ; then error
912 MOV COMMA_FLAG,01H ; Else set comma flag on.
913 JMP DESG_PARM1 ; Get another character.
914
915DESG: MOV ERROR_FLAG,00H ; Set error flag off.
916 CALL DESG_PARSE ; Parse desg.
917DP1: CMP ERROR_FLAG,01H ; If error flag on then
918 JE DP_X ; Exit,
919 CALL FIND_RIGHT_BR ; Else check for ')'
920 CALL OFFSET_TABLE ; Update table
921
922DP_X: RET
923
924DESG_PARMS ENDP
925
926
927
928;********************************************************
929;** DESG_FONT : Parse the designate and font numbers & **
930;** change them from decimal to binary. **
931;********************************************************
932
933
934DESG_FONT PROC
935
936
937 MOV DI,TABLE_5 ; Get desg font table.
938 MOV COMMA_FLAG,00H ; Set comma flag off.
939DF1: CALL GET_CHAR ; Load a character in AL.
940 JZ DF3 ; Error if end of line.
941 CMP AL,',' ; Check if a comma.
942 JE DF2 ; Set flag.
943 CALL IS_DIGIT ; If a digit, then
944 JE DF5 ; Convert number to binary.
945 CMP AL,')' ; If a ')' then
946 JE DF4 ; Exit.
947 CALL IS_DELIM ; If not a delimiter
948 JNE DF3 ; then error, exit
949 JMP DF1 ; Get another character.
950
951DF2: CMP COMMA_FLAG,01H ; If comma flag on
952 JE DF3 ; then error, exit
953 MOV COMMA_FLAG,01H ; Set comma flag on
954 ADD DS:WORD PTR [DI],01H ; Increment desg counter.
955 MOV DS:WORD PTR [DI+2],0FFFFH ; Load ffffh for desg empty
956 JMP DF1 ; field.
957
958DF3: MOV ERROR_FLAG,01H ; Set error flag on.
959 JMP DF_X ; Exit.
960
961DF4: CMP DESG_FLAG,00H ; If desg flag off
962 JE DF3 ; then error, exit
963 JMP DF_X ; Else exit.
964
965DF5: ADD DS:WORD PTR [DI],01H ; Increment desg font count.
966 CMP DESG_FLAG,01H ; If desg flag is on
967 JE DF6 ; then get font.
968 CMP COMMA_FLAG,01H ; if comma flag is on
969 JE DF6 ; then get font.
970 MOV DESG_FLAG,01H ; Set desg flag on
971 JMP DF7 ; Get desg number.
972
973DF6: ADD DI,02H ; adjust pointer to font.
974 MOV DESG_FLAG,02H ; Set desg and font flag.
975DF7: CALL GET_NUMBER ; Get a number & convert to
976 CMP ERROR_FLAG,01H ; binary.
977 JE DF_X ; If error flag set, Exit.
978 MOV DS:WORD PTR [DI+2],BX ; Store number in table.
979 CMP DESG_FLAG,02H ; If desg and font flag
980 JNE DF1 ; not set, then get char.
981 CALL FIND_RIGHT_BR ; Check for right bracket.
982
983DF_X: RET
984
985DESG_FONT ENDP
986
987
988;********************************************************
989;** DESG_PARSE : Parse the designate number and **
990;** change it from decimal to binary. **
991;********************************************************
992
993DESG_PARSE PROC
994
995 MOV DI,TABLE_5 ; Load designate location
996 ADD DS:WORD PTR [DI],0001H ; Update table count.
997
998 CALL GET_NUMBER ; Get the ascii number and
999 CMP ERROR_FLAG,01H ; conver it to binary
1000 JE DESG_X ; If error then exit
1001
1002 MOV DS:WORD PTR [DI+2],BX ; Else, save desg number
1003
1004
1005DESG_X: RET
1006
1007DESG_PARSE ENDP
1008
1009
1010;********************************************************
1011;** GET_NUMBER : Convert the number pointed to by SI **
1012;** to a binary number and store it in BX **
1013;********************************************************
1014
1015GET_NUMBER PROC
1016
1017 MOV CX,0AH ; Set multiplying factor
1018 XOR BX,BX ; Clear DX
1019
1020NEXT_NUM: SUB AL,30H ; Conver number to binary
1021 CBW ; Clear AH
1022 XCHG AX,BX ; Switch ax and bx to mul
1023 MUL CX ; already converted number by 10.
1024 JO ERR_NUM ; On over flow jump to error.
1025 ADD BX,AX ; Add number to total.
1026 JC ERR_NUM ; On over flow jump to error.
1027 XOR AX,AX ; Clear AX (clear if al=0a).
1028 CALL GET_CHAR ; Get next character
1029 JZ GET_NUM_X ; Exit, if end of line.
1030 CALL IS_DIGIT ; Call is digit.
1031 JNZ GET_NUM_X ; Exit if not a number.
1032 JMP NEXT_NUM ; Loop.
1033
1034ERR_NUM: MOV ERROR_FLAG,01H ; Set error code to 1.
1035
1036GET_NUM_X: RET
1037
1038GET_NUMBER ENDP
1039
1040
1041;********************************************************
1042;** UPDATE_TABLE : This routine set up pointers to the **
1043;** different offsets of the different tables **
1044;********************************************************
1045
1046UPDATE_TABLE PROC
1047
1048 MOV DS:WORD PTR [DI],BX ; Offset of offsets
1049 MOV TABLE_1,BX ; Table_1 points at offsets
1050
1051 MOV DI,BX ;
1052 ADD BX,0CH ;
1053 MOV DS:WORD PTR [DI+2],BX ; Offset of DEVICE name.
1054 MOV TABLE_2,BX ; Table_2 point at device name.
1055
1056 ADD BX,0AH ;
1057 MOV DS:WORD PTR [DI+4],BX ; Offset of ID name.
1058 MOV TABLE_3,BX ; Table_3 point at ID name.
1059
1060 ADD BX,0AH ;
1061 MOV DS:WORD PTR [DI+6],BX ; Offset of HWCP pages.
1062 MOV TABLE_4,BX ; Table_4 point at HWCP pages.
1063
1064 RET
1065
1066UPDATE_TABLE ENDP
1067
1068
1069;********************************************************
1070;** OFFSET_TABLE : This routine set up pointers of **
1071;** tables number one and two. **
1072;********************************************************
1073
1074OFFSET_TABLE PROC
1075
1076 MOV DI,TABLE_1 ; Increment the number
1077 ADD DS:WORD PTR [DI],01H ; of parms foun. (ie. id,hwcp
1078 RET ; and desg)
1079
1080OFFSET_TABLE ENDP
1081
1082
1083;********************************************************
1084;** FIND_RIGHT_BR :This routine scane the line for a **
1085;** ')' if cannot find it turns error flag on **
1086;********************************************************
1087
1088FIND_RIGHT_BR PROC
1089
1090FBR1: CMP AL,')' ; If a right bracket
1091 JE FBR_X ; then exit.
1092 CMP AL,' ' ; If not a space
1093 JNE FBR2 ; Then error.
1094 CALL GET_CHAR ; Get a character
1095 JZ FBR2 ; If end of line then exit.
1096 JMP FBR1 ; Else get another character.
1097
1098FBR2: MOV ERROR_FLAG,01H ; Set error flag on
1099FBR_X: MOV AL,20H ; Erase character from AL.
1100 RET
1101
1102FIND_RIGHT_BR ENDP
1103
1104
1105PROGRAM ENDS
1106 END START
diff --git a/v4.0/src/DEV/PRINTER/PARSER.ASM b/v4.0/src/DEV/PRINTER/PARSER.ASM
new file mode 100644
index 0000000..f299838
--- /dev/null
+++ b/v4.0/src/DEV/PRINTER/PARSER.ASM
@@ -0,0 +1,668 @@
1PAGE ,132
2TITLE PARSE CODE AND CONTROL BLOCKS FOR PRINTER.SYS
3
4;****************** START OF SPECIFICATIONS **************************
5;
6; MODULE NAME: PARSER.ASM
7;
8; DESCRIPTIVE NAME: PARSES THE DEVICE= STATEMENT IN CONFIG.SYS FOR
9; PRINTER.SYS
10;
11; FUNCTION: THE COMMAND LINE PASSED TO PRINTER.SYS IN THE CONFIG.SYS
12; STATEMENT IS PARSED TO CHECK FOR CORRECT SYNTAX. A TABLE
13; IS SETUP CONTAINING THE VALUES FOUND.
14;
15; ENTRY POINT: PARSER
16;
17; INPUT: ES:DI POINTS TO REQUEST HEADER
18;
19; AT EXIT:
20; NORMAL: TABLE SET UP WITH VALUES FOUND.
21;
22; ERROR: 0 RETURNED IN FIRST WORD OF TABLE.
23;
24; INTERNAL REFERENCES:
25;
26; ROUTINES: SYSPARSE - PARSING CODE
27;
28; DATA AREAS: PARMSx - PARSE CONTROL BLOCK FOR SYSPARSE
29;
30; EXTERNAL REFERENCES:
31;
32; ROUTINES: N/A
33;
34; DATA AREAS: TABLE - TO CONTAIN VALUES FOUND IN DEVICE= LINE
35;
36; NOTES:
37;
38; REVISION HISTORY:
39; AN000; - DOS Version 4.00
40; AN001 - GHG Changes had to made for P897. The PARSER was
41; changed to need the '=' in the keywords.
42;
43; Label: "DOS DISPLAY.SYS Device Driver"
44; "Version 4.00 (C) Copyright 1988 Microsoft
45; "Licensed Material - Program Property of Microsoft"
46;
47;
48;****************** END OF SPECIFICATIONS ****************************
49;*Modification history ********************************************************
50;AN001; p1482 - PRINTER.SYS refused to initialize 10/6/87 J.K.
51;AN002; p2686 No range checking on n parameter for printer.sys 12/11/87 J.K.
52;******************************************************************************
53
54
55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
56;
57; The following is the table structure of the parser. All fields are
58; two bytes field (accept for the device and id name)
59;
60; TABLE HEADER :
61; ÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
62; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
63; ³ N = Number of devices. ³
64; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
65; ³ Device # 1 offset ÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄ>ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
66; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ³
67; ³ Device # 2 offset ³ ³ Table_1 (a) ³
68; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ³
69; ³ Device # 3 offset ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
70; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
71; ³ Device # 4 offset ³
72; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
73;
74;
75; N = 1,2,3 or 4. A two bytes number indicating the number of device specified.
76; DEVICE # N OFFSET : a two bytes offset address to table_1. (ie. Device #1 offset
77; is a pointer to table_1 (a). Device #2 offset is a pointer to table_1
78; (b)...etc.). If an error was detected in the command N is set to zero.
79;
80;
81;
82; TABLE_1 :
83; ÍÍÍÍÍÍÍÍÍ
84;
85; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
86; ³ N = Number of Offsets. ³ ³ ³
87; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ÚÄÄÄÄÄij Table_2 (a) ³
88; ³ Device Name offset ÄÅÄÄÄÄÙ ³ ³
89; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
90; ³ Device Id offset ÄÅÄÄÄÄÄÄ¿
91; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
92; ³ Device HWCP offset ÄÅÄÄÄÄ¿ ³ ³ ³
93; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ÀÄÄÄij Table_3 (a) ³
94; ³ Device Desg offset ÄÅÄÄ¿ ³ ³ ³
95; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
96; ³ "Reserved" ³ ³ ³
97; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ³ ³ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
98; ³ ³ ³ ³
99; ³ ÀÄÄÄÄÄij Table_4 (a) ³
100; ³ ³ ³
101; ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
102; ³ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
103; ³ ³ ³
104; ÀÄÄÄÄÄÄÄij Table_5 (a) ³
105; ³ ³
106; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
107;
108;
109; N=Length of table_1, or the number of offsets contained in table_1.
110; The offsets are pointers (two bytes) to the parameters value of the device.
111; "Reserved" : a two byte memory reserved for future use of the "PARMS" option.
112;
113;
114; TABLE_2 :
115; ÍÍÍÍÍÍÍÍÍ
116;
117; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
118; ³ N = Length of devices name ³
119; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
120; ³ Device name ³
121; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
122;
123; N = Length of device name. Device length is always 8 byte long.
124; Device Name : the name of the device (eg. LPT1, CON, PRN). The name
125; is paded with spaces to make up the rest of the 8 characters.
126;
127;
128;
129; TABLE_3 :
130; ÍÍÍÍÍÍÍÍÍ
131;
132; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
133; ³ N = Length of Id name. ³
134; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
135; ³ Id Name ³
136; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
137;
138; N = Length of id name. Id name length is always 8 byte long.
139; Id Name : the name of the id (eg. EGA, VGA). The name
140; is paded with spaces to make up the rest of the 8 character.
141;
142;
143;
144; TABLE_4 :
145; ÍÍÍÍÍÍÍÍÍ
146;
147; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
148; ³ N = Length of table. ³
149; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
150; ³ HWCP # 1 ³
151; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
152; ³ HWCP # 2 ³
153; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
154; ³ . ³
155; ³ . ³
156; ³ . ³
157; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
158; ³ HWCP # 10 ³
159; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
160;
161;
162; N = Length of table in words. Or the number of HWCP's.
163; HWCP # N : a hardware code page number converted to binary. The maximum
164; number of pages allowed is 10.
165;
166;
167;
168; TABLE_5 :
169; ÍÍÍÍÍÍÍÍÍ
170;
171; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
172; ³ N = Length of table. ³
173; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
174; ³ Designate ³
175; ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
176; ³ Font ³
177; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
178;
179; N = Lenght of table. 0 - nothing was specified
180; 1 - Only a designate was specified.
181; 2 - Designate and font were given. If the Desg field
182; was left empty in the DEVICE command then the
183; Designate field is filled with 0FFFFH.
184; Designate, Font : Are the Desg. and Font binary numbers.
185;
186;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
187
188
189.XLIST
190INCLUDE STRUC.INC ; Structured macros ;AN000;
191.LIST
192
193INCLUDE CPSPEQU.INC ;AN000;
194
195PUBLIC PARSER ; near procedure for parsing DEVICE= statement ;AN000;
196
197;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
198;
199; Set assemble switches for parse code
200;
201;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
202
203DateSW EQU 0 ;AN000;
204DrvSW EQU 0 ;AN000;
205SwSW EQU 0 ;AN000;
206Val1SW EQU 1 ;;AN002; ;AN000;
207Val2SW EQU 0 ;AN000;
208Val3SW EQU 0 ;AN000;
209
210
211CSEG SEGMENT PARA PUBLIC 'CODE' ;AN000;
212 ASSUME CS:CSEG,DS:NOTHING,ES:NOTHING ;AN000;
213
214
215EXTRN TABLE:WORD ; table for variable storage used by INIT module. ;AN000;
216EXTRN DEVICE_NUM:WORD ;AN000;
217
218.XLIST
219INCLUDE PARSE.ASM ; Parsing code ;AN000;
220.LIST
221
222
223;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
224;
225; PARM control block for parsing PRINTER.SYS - DEVICE= command statement.
226; Command line looks like:
227;
228; DEVICE=[d:][path]PRINTER.SYS LPT#[:]=(type[,[hwcp][,n]])
229; or
230; DEVICE=[d:][path]PRINTER.SYS LPT#[:]=(type[,[(hwcp1,hwcp2,...)][,n]])
231;
232; The command line will be parsed from left to right, taking care of the
233; nesting of complex lists as they occur.
234;
235; The first level of control blocks is shown below.
236; Complex list control blocks follow.
237; Null VALUE LIST and RESULT BUFFER are placed after all other PARSE control
238; blocks.
239;
240; d:\path\PRINTER.SYS lpt#=(complex list)
241;
242;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
243
244PARMS1 LABEL WORD ;AN000;
245 DW PARMSX1 ;AN000;
246 DB 0 ; no extra delimeters or EOLs. ;AN000;
247
248PARMSX1 LABEL BYTE ;AN000;
249 DB 1,1 ; min,max positional operands ;AN000;
250 DW D_NAME ; pointer to control block ;AN000;
251 DB 0 ; no switches ;AN000;
252 DB 1 ; 1 or more keywords ;AN000;
253 DW PRT_LIST ; pointer to control block ;AN000;
254
255D_NAME LABEL WORD ;AN000;
256 DW 0200H ; file spec ;AN000;
257 DW 0001H ; cap result by file table ;AN000;
258 DW RESULT_BUF ; result ;AN000;
259 DW NOVALS ; no value checking done ;AN000;
260 DB 0 ; no keyword/switch synonyms ;AN000;
261
262PRT_LIST LABEL WORD ;AN000;
263 DW 0402H ; complex list, repeats allowed ;AN000;
264 DW 0002H ; cap result by char table ;AN000;
265 DW RESULT_BUF ; result ;AN000;
266 DW NOVALS ; no value checking done ;AN000;
267 DB 8 ; 4 keywords ;AN000;
268 DB "PRN=",0 ;GHG Ä¿ ;AN001;
269 DB "LPT1=",0 ;GHG ³ 4 possible keywords ;AN001;
270 DB "LPT2=",0 ;GHG ³ ;AN001;
271 DB "LPT3=",0 ;GHG ÄÙ ;AN001;
272 DB "PRN:=",0 ;GHG Ä¿ ;AN001;
273 DB "LPT1:=",0 ;GHG ³ 4 possible keywords ;AN001;
274 DB "LPT2:=",0 ;GHG ³ with colon ;AN001;
275 DB "LPT3:=",0 ;GHG ÄÙ ;AN001;
276
277;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
278;
279; PARM control block for second level of nesting.
280; ie. complex list from first level of nesting
281;
282; (type, hwcp or complex list, n)
283;
284;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
285
286PARMS2 LABEL WORD ;AN000;
287 DW PARMSX2 ;AN000;
288 DB 0 ; no extra delimeters or EOLs. ;AN000;
289
290PARMSX2 LABEL BYTE ;AN000;
291 DB 1,3 ; min,max positional operands ;AN000;
292 DW PRT_TYPE ; pointer to control block ;AN000;
293 DW HWCP ; pointer to control block ;AN000;
294 DW CP_PREPS ; pointer to control block ;AN000;
295 DB 0 ; no switches ;AN000;
296 DB 0 ; no keywords ;AN000;
297
298PRT_TYPE LABEL BYTE ;AN000;
299 DW 2000H ; sstring ;AN000;
300 DW 0002H ; cap by char table ;AN000;
301 DW RESULT_BUF ; result ;AN000;
302 DW NOVALS ; value list ;AN000;
303 DB 0 ; no keyword/switch synonyms ;AN000;
304
305HWCP LABEL BYTE ;AN000;
306 DW 8401H ; numeric or complex list (optional) ;AN000;
307 DW 0 ; no functions ;AN000;
308 DW RESULT_BUF ; result ;AN000;
309 DW NOVALS ; no value checking done ;AN000;
310 DB 0 ; no keyword/switch synonyms ;AN000;
311
312CP_PREPS LABEL BYTE ;AN000;
313 DW 8001H ; numeric (optional) ;AN000;
314 DW 0 ; no functions ;AN000;
315 DW RESULT_BUF ; result ;AN000;
316 DW N_Val_Range ;AN002; value list ;AN000;
317 DB 0 ; no keyword/switch synonyms ;AN000;
318
319
320N_Val_Range label byte
321 db 1 ;AN002; Range defintion
322 db 1 ;AN002; Number of ranges
323 db 1 ;AN002; item tag
324 dd 0, 12 ;AN002; 0 - 12
325
326;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
327;
328; PARM control block for third level of nesting.
329; ie. complex list from second nesting level
330;
331; (hwcp1,hwcp2,...)
332;
333;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
334
335PARMS3 LABEL WORD ;AN000;
336 DW PARMSX3 ;AN000;
337 DB 0 ; no extra delimeters or EOLs. ;AN000;
338
339PARMSX3 LABEL BYTE ;AN000;
340 DB 1,1 ; min,max positional operands ;AN000;
341 DW HWCPS ; pointer to control block ;AN000;
342 DB 0 ; no switches ;AN000;
343 DB 0 ; no keywords ;AN000;
344
345HWCPS LABEL BYTE ;AN000;
346 DW 8003H ; numeric, repeats allowed ;AN000;
347 DW 0 ; no functions ;AN000;
348 DW RESULT_BUF ; result ;AN000;
349 DW NOVALS ; no value checking done ;AN000;
350 DB 0 ; no keyword/switch synonyms ;AN000;
351
352
353; Null VALUE LIST and RESULT BUFFER for all PARSE control blocks
354
355
356NOVALS LABEL BYTE ;AN000;
357 DB 0 ; no value checking done ;AN000;
358
359RESULT_BUF LABEL BYTE ;AN000;
360RESULT_TYPE DB ? ; type returned (number, string, etc.) ;AN000;
361 DB ? ; matched item tag (if applicable) ;AN000;
362SYN_PTR DW ? ; synonym ptr (if applicable) ;AN000;
363RESULT_VAL DD ? ; value ;AN000;
364
365
366OK_FLAG DB ON ; FLAG INDICATING PARSE STATUS ;AN000;
367NUM_LOOP DB ZERO ;AN000;
368
369
370;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
371;
372; PROCEDURE_NAME: PARSER
373;
374; FUNCTION:
375; THIS PROCEDURE PARSES THE DEVICE= PARAMETERS FROM THE INIT REQUEST
376; BLOCK.
377;
378; AT ENTRY: ES:DI POINTS TO REQUEST HEADER
379;
380; AT EXIT:
381; NORMAL: TABLE SET UP WITH VALUES FOUND
382;
383; ERROR: 0 LOADED IN FIRST WORD OF TABLE
384;
385;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
386
387PARSER PROC NEAR ;AN000;
388 PUSH DX ;AN000;
389 PUSH DI ;AN000;
390 PUSH ES ;AN000;
391 PUSH BX ;AN000;
392 PUSH DS ; ;AN000;
393 PUSH SI ; ;AN000;
394 CLD ; ;AN000;
395 LDS SI,RH.RH0_BPBA ; ;AN000;
396 PUSH CS ; establish ES .. ;AN000;
397 POP ES ; addressability to data ;AN000;
398 LEA DI,PARMS1 ; point to PARMS control block ;AN000;
399 XOR CX,CX ; clear both CX and DX for ;AN000;
400 XOR DX,DX ; SYSPARSE ;AN000;
401 CALL SYSPARSE ; move pointer past file spec ;AN000;
402 CALL SYSPARSE ; do first parse ;AN000;
403 LEA BX,TABLE ; ;AN000;
404 .WHILE <AX NE RC_EOL> AND ; EOL?...then end parse...and.. ;AN000;
405 .WHILE <OK_FLAG EQ ON> ; make sure that flag still ok.. ;AN000;
406 .IF <AX NE RC_NO_ERROR> ; parse error? ;AN000;
407 MOV OK_FLAG,OFF ; yes...reset flag ;AN000;
408 .ELSE ; ;AN000;
409 .SELECT ; ;AN000;
410 .WHEN <RESULT_TYPE EQ COMPLEX>; complex string found? ;AN000;
411 INC DEVICE_NUM ; increment count ;AN000;
412 INC BX ; point to next device table ;AN000;
413 INC BX ; ;AN000;
414 .IF <DEVICE_NUM GT FOUR> ; more than one? ;AN000;
415 MOV OK_FLAG,OFF ; yes....we have an error ;AN000;
416 .ELSE ; no .. ;AN000;
417 PUSH BX ; ;AN000;
418 MOV BX,CS:[BX] ; ;AN000;
419 CALL COPY_NAME ; ;AN000;
420 MOV NUM_LOOP,ZERO ; ;AN000;
421 CALL PARSE_MAIN ; process complex string.. ;AN000;
422 POP BX ; ;AN000;
423 .ENDIF ; ;AN000;
424 .OTHERWISE ; not a complex string so.. ;AN000;
425 MOV OK_FLAG,OFF ; we have a problem...reset flag ;AN000;
426 .ENDSELECT ; ;AN000;
427 .ENDIF ; ;AN000;
428 PUSH BX ; ;AN000;
429 CALL SYSPARSE ; continue parsing.. ;AN000;
430 POP BX ; ;AN000;
431 .ENDWHILE ; ;AN000;
432 .IF <OK_FLAG EQ OFF> ; flag indicating error? ;AN000;
433 MOV DEVICE_NUM,ZERO ; yes...set device number to 0 ;AN000;
434 STC ; ;AN000;
435 .ELSE ; ;AN000;
436 CLC ; ;AN000;
437 .ENDIF ; ;AN000;
438 POP SI ; ;AN000;
439 POP DS ; ;AN000;
440 POP BX ; ;AN000;
441 POP ES ; ;AN000;
442 POP DI ; ;AN000;
443 POP DX ; ;AN000;
444 RET ; ;AN000;
445PARSER ENDP ;AN000;
446
447
448;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
449;
450; PROCEDURE_NAME: PARSE_MAIN
451;
452; FUNCTION:
453; THIS PROCEDURE PARSES THE LPT=( ) COMPLEX LIST DEVICE= LINE FOUND
454; IN CONFIG.SYS
455;
456; AT ENTRY: RESULT BUFFER CONTAINS POINTER TO COMPLEX STRING
457;
458; AT EXIT:
459; NORMAL: TABLE SET UP WITH VALUES FOUND
460;
461; ERROR: OK_FLAG = 0
462;
463;
464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
465
466PARSE_MAIN PROC NEAR ;AN000;
467 PUSH BX ; ;AN000;
468 PUSH DI ; setup to parse the nested.. ;AN000;
469 PUSH DS ; complex string...but save.. ;AN000;
470 PUSH SI ; current parsing status. ;AN000;
471 PUSH CX ; ;AN000;
472 XOR CX,CX ; ;AN000;
473 LEA DI,PARMS2 ; next control block.. ;AN000;
474 LDS SI,RESULT_VAL ; point to stored string ;AN000;
475 PUSH BX ; ;AN000;
476 CALL SYSPARSE ; ;AN000;
477 POP BX ; ;AN000;
478 .WHILE <AX NE RC_EOL> AND ; not EOL? and.. ;AN000;
479 .WHILE <OK_FLAG EQ ON> ; error flag still ok? ;AN000;
480 INC NUM_LOOP ; ;AN000;
481 .IF <AX NE RC_NO_ERROR> ; check for parse errors ;AN000;
482 MOV OK_FLAG,OFF ; yes....reset error flag ;AN000;
483 .ELSE ; no...process ;AN000;
484 PUSH BX ; ;AN000;
485 .SELECT ; ;AN000;
486 .WHEN <RESULT_TYPE EQ STRING> ; simple string ;AN000;
487 MOV BX,CS:[BX].DI_OFFSET ; ;AN000;
488 CALL PARSE_STR ; yes...process ;AN000;
489 .WHEN <RESULT_TYPE EQ NUMBER> ; number?.. ;AN000;
490 .IF <NUM_LOOP EQ TWO> ; ;AN000;
491 MOV BX,CS:[BX].DCP_OFFSET ;AN000;
492 .ELSE ; ;AN000;
493 MOV BX,CS:[BX].DD_OFFSET ;AN000;
494 .ENDIF ; ;AN000;
495 MOV AX,WORD PTR RESULT_VAL ; get value into word form ;AN000;
496 .IF <AX NE ZERO> ;AN000;
497 INC WORD PTR CS:[BX] ; ;AN000;
498 MOV WORD PTR CS:[BX+2],AX ; load that value. ;AN000;
499 .ENDIF ;AN000;
500 .WHEN <RESULT_TYPE EQ COMPLEX> ; complex string? ;AN000;
501 MOV BX,CS:[BX].DCP_OFFSET ; ;AN000;
502 CALL PARSE_COMP ; yes...process ;AN000;
503 .OTHERWISE ; anything else is.. ;AN000;
504 MOV OK_FLAG,OFF ; an error...reset flag. ;AN000;
505 .ENDSELECT ; ;AN000;
506 CALL SYSPARSE ; continue parsing ;AN000;
507 POP BX ; ;AN000;
508 .ENDIF ; ;AN000;
509 .ENDWHILE ; ;AN000;
510 POP CX ; restore original parse.. ;AN000;
511 POP SI ; registers. ;AN000;
512 POP DS ; ;AN000;
513 POP DI ; ;AN000;
514 POP BX ; ;AN000;
515 RET ; ;AN000;
516PARSE_MAIN ENDP ;AN000;
517 ;AN000;
518
519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
520;
521; PROCEDURE_NAME: PARSE_COMP
522;
523; FUNCTION:
524; THIS PROCEDURE PARSES A COMPLEX LIST FOUND WITHIN THE LPT=( )
525; COMPLEX LIST.
526;
527; AT ENTRY: RESULT BUFFER CONTAINS POINTER TO COMPLEX STRING
528;
529; AT EXIT:
530; NORMAL: TABLE SET UP WITH VALUES FOUND
531;
532; ERROR: OK_FLAG = 0
533;
534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
535
536PARSE_COMP PROC NEAR ;AN000;
537 PUSH DI ; setup ro parse the nested.. ;AN000;
538 PUSH DS ; complex string..saving the.. ;AN000;
539 PUSH SI ; current parse status. ;AN000;
540 PUSH CX ; ;AN000;
541 MOV DI,BX ; ;AN000;
542 PUSH DI ; ;AN000;
543 XOR CX,CX ; ;AN000;
544 LEA DI,PARMS3 ; next control block ;AN000;
545 LDS SI,RESULT_VAL ; point to stored string. ;AN000;
546 PUSH BX ; ;AN000;
547 CALL SYSPARSE ; ;AN000;
548 POP BX ; ;AN000;
549 .WHILE <AX NE RC_EOL> AND ; not EOL?...and.. ;AN000;
550 .WHILE <OK_FLAG EQ ON> AND ; error flag still okay? ;AN000;
551 .WHILE <AX NE RC_OP_MISSING> ; ;AN000;
552 .IF <AX NE RC_NO_ERROR> ; parse error?...or.. ;AN000;
553 MOV OK_FLAG,OFF ; found?....yes..reset flag. ;AN000;
554 .ELSE ; no...process.. ;AN000;
555 INC WORD PTR CS:[BX] ; increment counter ;AN000;
556 .IF <<WORD PTR CS:[BX]> LE TEN> ;AN000;
557 POP DI ; ;AN000;
558 MOV AX,WORD PTR RESULT_VAL ; get numeric value into word ;AN000;
559 MOV WORD PTR CS:[DI+2],AX ; ;AN000;
560 INC DI ; ;AN000;
561 INC DI ; ;AN000;
562 PUSH DI ; ;AN000;
563 PUSH BX ; ;AN000;
564 LEA DI,PARMS3 ; ;AN000;
565 CALL SYSPARSE ; continue parsing ;AN000;
566 POP BX ; ;AN000;
567 .ELSE ; ;AN000;
568 MOV OK_FLAG,OFF ; ;AN000;
569 .ENDIF ; ;AN000;
570 .ENDIF ; ;AN000;
571 .ENDWHILE ; ;AN000;
572 POP DI ; ;AN000;
573 POP CX ; restore previous parse.. ;AN000;
574 POP SI ; registers. ;AN000;
575 POP DS ; ;AN000;
576 POP DI ; ;AN000;
577 RET ; ;AN000;
578PARSE_COMP ENDP ;AN000;
579
580
581;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
582;
583; PROCEDURE_NAME: PARSE_STR
584;
585; FUNCTION:
586; THIS PROCEDURE PARSES A STRING FOUND WITHIN THE LPT=( ) STATEMENT
587;
588; AT ENTRY: RESULT BUFFER POINTS TO ASCIIZ STRING
589;
590; AT EXIT:
591; NORMAL: TABLE SET UP WITH VALUES FOUND
592;
593; ERROR: STRING > 8 - OK_FLAG SET OFF
594;
595;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
596
597PARSE_STR PROC NEAR ;AN000;
598 PUSH DI ; get source and.. ;AN000;
599 PUSH DS ; destination registers.. ;AN000;
600 PUSH SI ; setup. ;AN000;
601 PUSH CX ; ;AN000;
602 LDS SI,RESULT_VAL ; ;AN000;
603 MOV DI,BX ; ;AN000;
604 MOV CS:[DI].N_LENGTH,EIGHT ; ;AN000;
605 INC DI ; ;AN000;
606 INC DI ; ;AN000;
607 MOV CX,EIGHT ; ;AN000;
608 LODSB ; load first character. ;AN000;
609 .WHILE <AL NE ZERO> AND ; while not at end of ASCIIZ do.. ;AN000;
610 .WHILE <CX NE ZERO> ; ;AN000;
611 STOSB ; store.. ;AN000;
612 LODSB ; load next character.. ;AN000;
613 DEC CX ; ;AN000;
614 .ENDWHILE ; ;AN000;
615 .IF <CX EQ ZERO> ;AN000;
616 MOV OK_FLAG,OFF ;AN000;
617 .ENDIF ;AN000;
618 POP CX ; value found. ;AN000;
619 POP SI ; restore registers. ;AN000;
620 POP DS ; ;AN000;
621 POP DI ; ;AN000;
622 RET ;AN000;
623PARSE_STR ENDP ;AN000;
624
625
626;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
627;
628; PROCEDURE_NAME: COPY_NAME
629;
630; FUNCTION:
631; THIS PROCEDURE COPIES THE FOUND STRING VALUE INTO THE TABLE.
632;
633; AT ENTRY: N/A
634;
635; AT EXIT:
636; NORMAL: TABLE UPDATED
637;
638; ERROR: N/A
639;
640;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
641
642COPY_NAME PROC NEAR ;AN000;
643 PUSH DI ; get source and.. ;AN000;
644 PUSH DS ; destination registers.. ;AN000;
645 PUSH SI ; setup. ;AN000;
646 PUSH CS ; ;AN000;
647 POP DS ; ;AN000;
648 MOV SI,SYN_PTR ; ;AN000;
649 MOV DI,CS:[BX].DN_OFFSET ; ;AN000;
650 MOV CS:[DI].N_LENGTH,EIGHT ; ;AN000;
651 INC DI ; ;AN000;
652 INC DI ; ;AN000;
653 LODSB ; load first character. ;AN000;
654 .WHILE <AL NE ZERO> ; while not at end of ASCIIZ do.. ;AN000;
655 .IF <AL NE ':'> AND ;ignore colon ;AN001;
656 .IF <AL NE '='> ; or = ;AN001;
657 STOSB ; store.. ;AN000;
658 .ENDIF ; ;AN000;
659 LODSB ; load next character.. ;AN000;
660 .ENDWHILE ; ;AN000;
661 POP SI ; restore registers. ;AN000;
662 POP DS ; ;AN000;
663 POP DI ; ;AN000;
664 RET ;AN000;
665COPY_NAME ENDP ;AN000;
666
667CSEG ENDS
668 END
diff --git a/v4.0/src/DEV/PRINTER/PRINTER.LNK b/v4.0/src/DEV/PRINTER/PRINTER.LNK
new file mode 100644
index 0000000..9449900
--- /dev/null
+++ b/v4.0/src/DEV/PRINTER/PRINTER.LNK
@@ -0,0 +1,9 @@
1CPSPM10+
2 CPSFONT3+
3 PRTINT2F+
4 CPSPI07+
5 PARSER
6PRINTER.EXE
7PRINTER.MAP /M
8;
9 \ No newline at end of file
diff --git a/v4.0/src/DEV/PRINTER/PRINTER.SKL b/v4.0/src/DEV/PRINTER/PRINTER.SKL
new file mode 100644
index 0000000..6cfb2f6
--- /dev/null
+++ b/v4.0/src/DEV/PRINTER/PRINTER.SKL
@@ -0,0 +1,17 @@
1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2;
3; Message Skeleton file for PRINTER.SYS
4;
5; Author: WGR
6;
7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8
9:util PRINTER ; utility name
10
11:class A
12:use 1 COMMON1
13:def 2 "%1 code page driver cannot be initialized",CR,LF,BELL
14:def 12 "Invalid syntax on PRINTER.SYS code page driver",CR,LF,BELL
15
16:end
17 \ No newline at end of file
diff --git a/v4.0/src/DEV/PRINTER/PRTINT2F.ASM b/v4.0/src/DEV/PRINTER/PRTINT2F.ASM
new file mode 100644
index 0000000..82654c5
--- /dev/null
+++ b/v4.0/src/DEV/PRINTER/PRTINT2F.ASM
@@ -0,0 +1,450 @@
1PAGE ,132
2TITLE PRINTER.SYS INT2FH Code
3
4;****************** START OF SPECIFICATIONS **************************
5;
6; MODULE NAME: PRTINT2F.ASM
7;
8; DESCRIPTIVE NAME: PERFORM THE INT2FH FUNCTION OF PRINTER.SYS
9;
10; FUNCTION: THE INT2FH FUNCTION OF PRINTER.SYS WILL LOCK THE PRINTER
11; DEVICE AND LOAD THE CODE PAGE SPECIFIED. WHEN AN UNLOCK
12; IS ENCOUNTERED, THE SAVED CODE PAGE WILL BE ACTIVATED.
13; ATTACHED.
14;
15; ENTRY POINT: INT2F_COM
16;
17; INPUT: AX = AD40H (CALL IDENTIFIER)
18; BX = REQUESTED CODE PAGE (-1 FOR UNLOCK)
19; DX = 0 - LPT1
20; 1 - LPT2
21; 2 - LPT3
22;
23; AT EXIT:
24; NORMAL: CARRY CLEAR
25;
26; ERROR: CARRY SET - CODE PAGE NOT AVAILABLE OR DEVICE IS NOT CPSW.
27;
28; INTERNAL REFERENCES:
29;
30; ROUTINES: CHECK_FOR_CP - CHECKS TO SEE IF CODE PAGE REQUESTED IS
31; AVAILABLE ON DEVICE REQUESTED.
32; FIND_ACTIVE_CP - FINDS THE ACTIVE CODE PAGE ON SPECIFIED
33; DEVICE; IF AVAILABLE.
34; LOCK_CP - VERIFIES, LOADS, AND LOCKS DEVICE CODE PAGE.
35; UNLOCK_CP - UNLOCKS DEVICE.
36;
37; DATA AREAS: INVOKE_BLOCK - PARAMETER BLOCK PASSED TO INVOKE PROC.
38;
39;
40; EXTERNAL REFERENCES:
41;
42; ROUTINES: INVOKE - ACTIVATES FONT REQUESTED.
43;
44; DATA AREAS: BUF1 - BUFFER FOR LPT1
45; BUF2 - BUFFER FOR LPT2
46; BUF3 - BUFFER FOR LPT3
47;
48; NOTES:
49;
50; REVISION HISTORY:
51; A000 - DOS Version 4.00
52;
53; Label: "DOS PRINTER.SYS Device Driver"
54; "Version 4.00 (C) Copyright 1988 Microsoft
55; "Licensed Material - Program Property of Microsoft"
56;
57;****************** END OF SPECIFICATIONS ****************************
58
59.XLIST
60INCLUDE STRUC.INC ;AN000;
61.LIST
62
63
64INCLUDE CPSPEQU.INC ;AN000;
65PRIV_LK_CP EQU 0AD40H ; multiplex number and function ;AN000;
66LPT1 EQU 0 ; ;AN000;
67LPT2 EQU 1 ; ;AN000;
68LPT3 EQU 2 ; ;AN000;
69UNLOCK EQU -1 ; unlock the device ;AN000;
70UNDEFINED EQU -1 ; undefined code page ;AN000;
71NOT_CY EQU 0FFFEH ; clear the carry in flag register ;AN000;
72CY EQU 1 ; set the carry in flag register ;AN000;
73FOUND EQU 1 ; search flag ;AN000;
74NOT_FOUND EQU 0 ; ;AN000;
75
76
77PUBLIC INT2F_COM ;AN000;
78PUBLIC ROM_INT2F ;AN000;
79PUBLIC ABORT ;AN000;
80
81
82CSEG SEGMENT PARA PUBLIC 'CODE' ;AN000;
83 ASSUME CS:CSEG ;AN000;
84
85
86EXTRN INVOKE:NEAR ;AN000;
87EXTRN BUF0:BYTE ;AN000;
88EXTRN BUF1:BYTE ;AN000;
89EXTRN BUF2:BYTE ;AN000;
90EXTRN BUF3:BYTE ;AN000;
91
92ROM_INT2F DW ? ; chaining point for INT2FH ;AN000;
93 DW ? ;AN000;
94
95COPY_BUF0 DW 0 ;AN000;
96PREV_LOCK DB OFF ;AN000;
97
98INVOKE_BLOCK LABEL BYTE ; parameter block passed to INVOKE ;AN000;
99 DB 3 DUP(0) ; ;AN000;
100RET_STAT DW 0 ; returned status from INVOKE ;AN000;
101 DQ 0 ; ;AN000;
102 DB 6 DUP(0) ; ;AN000;
103 DW OFFSET PARA_BLOCK ; ;AN000;
104CODE_SEGB DW SEG CSEG ; ;AN000;
105 ;
106PARA_BLOCK LABEL WORD ; ;AN000;
107 DW TWO ; ;AN000;
108REQ_CP DW ? ; requested code page to load ;AN000;
109 ;
110
111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
112;
113; PROCEDURE_NAME: INT2F_COM
114;
115; FUNCTION:
116; THIS IS THE INTERRUPT 2FH HANDLER TO CAPTURE THE FOLLOWING FUNCTIONS:
117;
118; AX=AD40H PRIVELEGED LOCK CP SWITCHING
119;
120; AT ENTRY: AX = AD40H
121; BX = CODEPAGE REQUESTED DURING LOCK.
122; -1 = UNLOCK
123; DX = 0 - LPT1
124; 1 - LPT2
125; 2 - LPT3
126;
127;
128; AT EXIT:
129; NORMAL: CARRY CLEAR - DEVICE LOADED AND LOCKED
130;
131; ERROR: CARRY SET - CODE PAGE NOT AVAILABLE OR DEVICE NOT CPSW.
132;
133;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
134
135
136INT2F_COM PROC NEAR ;AN000;
137 STI ;AN000;
138 .IF <AX NE PRIV_LK_CP> ; is this for PRINTER? ;AN000;
139 JMP DWORD PTR CS:ROM_INT2F ; no....jump to old INT2F ;AN000;
140 .ENDIF ; ;AN000;
141 PUSH AX ; ;AN000;
142 PUSH BP ; ;AN000;
143 PUSH BX ; s r ;AN000;
144 PUSH CX ; a e ;AN000;
145 PUSH DX ; v g ;AN000;
146 PUSH DI ; e s ;AN000;
147 PUSH SI ; ;AN000;
148 PUSH DS ; ;AN000;
149 PUSH ES ; ;AN000;
150 MOV CS:COPY_BUF0,ZERO ; ;AN000;
151 MOV CS:CODE_SEGB,CS ; ;AN000;
152 MOV BP,BX ; move req. cp to bp ;AN000;
153 .SELECT ; depending on the lptx.. ;AN000;
154 .WHEN <DX EQ LPT1> ; point to the appropriate ;AN000;
155 LEA BX,BUF1 ; buffer.. ;AN000;
156 LEA SI,BUF0 ; ;AN000;
157 MOV CS:COPY_BUF0,SI ; ;AN000;
158 .WHEN <DX EQ LPT2> ; ;AN000;
159 LEA BX,BUF2 ; ;AN000;
160 .WHEN <DX EQ LPT3> ; ;AN000;
161 LEA BX,BUF3 ; ;AN000;
162 .OTHERWISE ; ;AN000;
163 STC ; not a valid lptx..set flag ;AN000;
164 .ENDSELECT ; ;AN000;
165 .IF NC ; process ;AN000;
166 .IF <BP EQ UNLOCK> ; if unlock requested ;AN000;
167 CALL UNLOCK_CP ; unlock code page. ;AN000;
168 .ELSE ; must be a lock request.. ;AN000;
169 CALL LOCK_CP ; ;AN000;
170 .ENDIF ; ;AN000;
171 .ENDIF ; ;AN000;
172 MOV SI,CS:COPY_BUF0 ; ;AN000;
173 PUSHF ; ;AN000;
174 .IF <SI NE ZERO> ; if this is lpt1... ;AN000;
175 MOV AX,CS:[BX].STATE ; copy data into prn ;AN000;
176 MOV CS:[SI].STATE,AX ; buffer as well. ;AN000;
177 MOV AX,CS:[BX].SAVED_CP ; ;AN000;
178 MOV CS:[SI].SAVED_CP,AX ; ;AN000;
179 .ENDIF ; ;AN000;
180 POPF ; ;AN000;
181 POP ES ; ;AN000;
182 POP DS ; restore ;AN000;
183 POP SI ; ;AN000;
184 POP DI ; registers ;AN000;
185 POP DX ; ;AN000;
186 POP CX ; ;AN000;
187 POP BX ; ;AN000;
188 MOV BP,SP ; ;AN000;
189 MOV AX,[BP+8] ; load flag onto.. ;AN000;
190 .IF NC ; ;AN000;
191 AND AX,NOT_CY ; ;AN000;
192 .ELSE ; stack flags ;AN000;
193 OR AX,CY ; ;AN000;
194 .ENDIF ; ;AN000;
195 MOV [BP+8],AX ; ;AN000;
196 POP BP ; ;AN000;
197 POP AX ; ;AN000;
198 XCHG AH,AL ; exchange ah and al to show that.. ;AN000;
199ABORT: IRET ; printer.sys is present. ;AN000;
200INT2F_COM ENDP ;AN000;
201
202
203;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
204;
205; PROCEDURE_NAME: UNLOCK_CP
206;
207; FUNCTION:
208; THIS FUNCTION UNLOCKS THE DEVICE THAT IS LOCKED.
209;
210; AT ENTRY:
211; BX - POINTS TO LPTx BUFFER
212;
213;
214; AT EXIT:
215; NORMAL: CARRY CLEAR - DEVICE UNLOCKED.
216;
217; ERROR: CARRY SET - ERROR DURING UNLOCK, ACTIVE CODE PAGE SET TO INACTIVE
218;
219;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
220
221UNLOCK_CP PROC NEAR ;AN000;
222 .IF <CS:[BX].STATE EQ LOCKED> NEAR ; is device locked? ;AN000;
223 MOV CS:[BX].STATE,CPSW ; change status to unlocked.. ;AN000;
224 MOV BP,CS:[BX].SAVED_CP ; get saved code page ;AN000;
225 .IF <BP NE UNDEFINED> ; valid?..... ;AN000;
226 XOR AX,AX ; ;AN000;
227 CALL FIND_ACTIVE_CP ; find the active code page. ;AN000;
228 .IF <BP NE DX> ; are they the same..? ;AN000;
229 MOV CS:REQ_CP,BP ; no...invoke the saved code page ;AN000;
230 PUSH CS ; ;AN000;
231 POP ES ; ;AN000;
232 LEA DI,INVOKE_BLOCK ; ;AN000;
233 MOV CS:[BX].RH_PTRO,DI ; ;AN000;
234 MOV CS:[BX].RH_PTRS,ES ; ;AN000;
235 CALL INVOKE ; ;AN000;
236 .IF <AL NE ZERO> ; error on invoke? ;AN000;
237 MOV AX,ONE ; yes...change the active.. ;AN000;
238 CALL FIND_ACTIVE_CP ; to inactive. ;AN000;
239 .IF <CS:COPY_BUF0 NE ZERO> ; do likewise to PRN if this ;AN000;
240 PUSH BX ; is lpt1. ;AN000;
241 MOV BX,CS:COPY_BUF0 ; ;AN000;
242 CALL FIND_ACTIVE_CP ; ;AN000;
243 POP BX ; ;AN000;
244 .ENDIF ; ;AN000;
245 STC ; set error flag. ;AN000;
246 .ELSE ; ;AN000;
247 CLC ; invoke ok...clear error flag ;AN000;
248 .ENDIF ; ;AN000;
249 .ELSE ; ;AN000;
250 CLC ; active = saved ..no invoke... ;AN000;
251 .ENDIF ; clear error ;AN000;
252 .ELSE ; ;AN000;
253 MOV AX,ONE ; saved cp was inactive...change..;AN000;
254 CALL FIND_ACTIVE_CP ; active to inactive. ;AN000;
255 .IF <CS:COPY_BUF0 NE ZERO> ; do likewise to PRN if this ;AN000;
256 PUSH BX ; is lpt1. ;AN000;
257 MOV BX,CS:COPY_BUF0 ; ;AN000;
258 CALL FIND_ACTIVE_CP ; ;AN000;
259 POP BX ; ;AN000;
260 .ENDIF ; ;AN000;
261 CLC ; ;AN000;
262 .ENDIF ; ;AN000;
263 MOV CS:[BX].SAVED_CP,UNDEFINED; reset the saved cp ;AN000;
264 .ENDIF ; ;AN000;
265 RET ;AN000;
266UNLOCK_CP ENDP ;AN000;
267
268
269;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
270;
271; PROCEDURE_NAME: LOCK_CP
272;
273; FUNCTION:
274; THIS FUNCTION LOCKS THE DEVICE WITH THE CODE PAGE REQUESTED.
275;
276; AT ENTRY: BP - REQUESTED CODE PAGE
277; BX - POINTS TO LPTx BUFFER
278;
279;
280; AT EXIT:
281; NORMAL: CARRY CLEAR - DEVICE LOCKED.
282;
283; ERROR: CARRY SET - ERROR, CODE PAGE NOT LOCKED.
284;
285;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
286
287LOCK_CP PROC NEAR ;AN000;
288 .IF <CS:[BX].STATE EQ LOCKED> ; if this was previously locked.. ;AN000;
289 MOV CS:PREV_LOCK,ON ; then...set flag and... ;AN000;
290 MOV CS:[BX].STATE,CPSW ; change to unlock for this proc ;AN000;
291 .ELSEIF <CS:[BX].STATE EQ CPSW> ; if this is unlocked... ;AN000;
292 MOV CS:PREV_LOCK,OFF ; then set flag off. ;AN000;
293 .ELSE ; ;AN000;
294 STC ; neither...set error ;AN000;
295 .ENDIF ; ;AN000;
296 .IF NC ; ;AN000;
297 CALL CHECK_FOR_CP ; yes..see if req cp is available. ;AN000;
298 .IF NC ; yes... ;AN000;
299 XOR AX,AX ; ;AN000;
300 CALL FIND_ACTIVE_CP ; find the active code page ;AN000;
301 .IF <BP NE DX> ; is it the same as requested?.. ;AN000;
302 MOV CS:REQ_CP,BP ; no..invoke the requested cp ;AN000;
303 PUSH CS ; ;AN000;
304 POP ES ; ;AN000;
305 LEA DI,INVOKE_BLOCK ; ;AN000;
306 MOV CS:[BX].RH_PTRO,DI ; ;AN000;
307 MOV CS:[BX].RH_PTRS,ES ; ;AN000;
308 PUSH DX ; ;AN000;
309 CALL INVOKE ; ;AN000;
310 POP DX ; ;AN000;
311 .IF <AL NE ZERO> ; error on invoke? ;AN000;
312 STC ; yes...set error flag. ;AN000;
313 .ELSE ; ;AN000;
314 MOV CS:[BX].STATE,LOCKED ; no, 'lock' the printer device ;AN000;
315 .IF <CS:PREV_LOCK EQ OFF> ; if we were not locked.. ;AN000;
316 MOV CS:[BX].SAVED_CP,DX ; and..save the old code page. ;AN000;
317 .ENDIF ; ;AN000;
318 CLC ; clear error flag. ;AN000;
319 .ENDIF ; ;AN000;
320 .ELSE ; ;AN000;
321 MOV CS:[BX].STATE,LOCKED ; 'lock' the printer device ;AN000;
322 .IF <CS:PREV_LOCK EQ OFF> ; if we were not locked.. ;AN000;
323 MOV CS:[BX].SAVED_CP,DX ; and..save the old code page. ;AN000;
324 .ENDIF ; ;AN000;
325 CLC ; clear the error flag ;AN000;
326 .ENDIF ; ;AN000;
327 .ENDIF ; ;AN000;
328 .ENDIF ; ;AN000;
329 RET ;AN000;
330LOCK_CP ENDP ;AN000;
331
332
333;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
334;
335; PROCEDURE_NAME: CHECK_FOR_CP
336;
337; FUNCTION:
338; THIS FUNCTION SEARCHES FOR THE CODE PAGE REQUESTED TO SEE IF IT HAS
339; BEEN PREPARED OR IS A HARDWARE CODE PAGE
340;
341;
342; AT ENTRY: BP = CODE PAGE REQUESTED
343; BX - POINTS TO LPTx BUFFER
344;
345;
346; AT EXIT:
347; NORMAL: CARRY CLEAR - CODE PAGE IS VALID.
348;
349; ERROR: CARRY SET - CODE PAGE NOT AVAILABLE.
350;
351;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
352
353
354CHECK_FOR_CP PROC NEAR ;AN000;
355 PUSH DX ;AN000;
356 MOV DX,NOT_FOUND ; initialize flag ;AN000;
357 MOV CX,CS:[BX].RSLMX ; load number of RAM slots ;AN000;
358 MOV DI,CS:[BX].RAMSO ; load DI with table offset ;AN000;
359 .WHILE <DX EQ NOT_FOUND> AND ; whil not found and.... ;AN000;
360 .WHILE <CX NE ZERO> ; while still slots to check.. ;AN000;
361 .IF <CS:[DI].SLT_CP EQ BP> ; is it this one?? ;AN000;
362 MOV DX,FOUND ; yes....set flag ;AN000;
363 .ELSE ; ;AN000;
364 ADD DI,TYPE SLTS ; no..point to next entry ;AN000;
365 DEC CX ; decrement the count ;AN000;
366 .ENDIF ; ;AN000;
367 .ENDWHILE ; ;AN000;
368 .IF <DX EQ NOT_FOUND> ; if we didn't find it then.. ;AN000;
369 MOV CX,CS:[BX].HSLMX ; check hardware ;AN000;
370 MOV DI,CS:[BX].HARDSO ; load regs as before. ;AN000;
371 .WHILE <DX EQ NOT_FOUND> AND ; while not found and.. ;AN000;
372 .WHILE <CX NE ZERO> ; still have slots to check.. ;AN000;
373 .IF <CS:[DI].SLT_CP EQ BP> ; is it this one? ;AN000;
374 MOV DX,FOUND ; yes...set flag. ;AN000;
375 .ELSE ; ;AN000;
376 ADD DI,TYPE SLTS ; no ..point to next entry ;AN000;
377 DEC CX ; and decrement count. ;AN000;
378 .ENDIF ; ;AN000;
379 .ENDWHILE ; ;AN000;
380 .ENDIF ; ;AN000;
381 .IF <DX EQ NOT_FOUND> ; ;AN000;
382 STC ; set flag appropriately ;AN000;
383 .ELSE ; ;AN000;
384 CLC ; ;AN000;
385 .ENDIF ; ;AN000;
386 POP DX ; ;AN000;
387 RET ; ;AN000;
388CHECK_FOR_CP ENDP ;AN000;
389
390
391;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
392;
393; PROCEDURE_NAME: FIND_ACTIVE_CP
394;
395; FUNCTION:
396; THIS FUNCTION SEARCHES FOR THE ACTIVE CODE PAGE. IF REQUESTED, THE
397; CODE PAGE IS MADE INACTIVE.
398;
399;
400; AT ENTRY:
401; BX - POINTS TO LPTx BUFFER
402; AX = 0 - LEAVE AS ACTIVE
403; AX = 1 - DE-ACTIVATE
404;
405;
406; AT EXIT:
407; NORMAL: DX - ACTIVE CODE PAGE. (NO ACTIVE = -1)
408;
409; ERROR: N/A
410;
411;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
412
413
414FIND_ACTIVE_CP PROC NEAR ;AN000;
415 MOV DX,UNDEFINED ; initialize register ;AN000;
416 MOV CX,CS:[BX].RSLMX ; load number of RAM slots ;AN000;
417 MOV DI,CS:[BX].RAMSO ; load DI with table offset ;AN000;
418 .WHILE <DX EQ UNDEFINED> AND ; whil not found and.... ;AN000;
419 .WHILE <CX NE ZERO> ; while still slots to check.. ;AN000;
420 .IF <BIT CS:[DI].SLT_AT AND AT_ACT> ; is it this one?? ;AN000;
421 MOV DX,CS:[DI].SLT_CP ; yes....load value ;AN000;
422 .IF <AX EQ ONE> ; is deactivate requested? ;AN000;
423 MOV CS:[DI].SLT_AT,AT_OCC; yes...change attrib. to occupied ;AN000;
424 .ENDIF ; ;AN000;
425 .ELSE ; ;AN000;
426 ADD DI,TYPE SLTS ; no..point to next entry ;AN000;
427 DEC CX ; decrement the count ;AN000;
428 .ENDIF ; ;AN000;
429 .ENDWHILE ; ;AN000;
430 .IF <DX EQ UNDEFINED> ; if we didn't find it then.. ;AN000;
431 MOV CX,CS:[BX].HSLMX ; check hardware ;AN000;
432 MOV DI,CS:[BX].HARDSO ; load regs as before. ;AN000;
433 .WHILE <DX EQ UNDEFINED> AND ; while not found and.. ;AN000;
434 .WHILE <CX NE ZERO> ; still have slots to check.. ;AN000;
435 .IF <BIT CS:[DI].SLT_AT AND AT_ACT> ; is it this one?? ;AN000;
436 MOV DX,CS:[DI].SLT_CP ; yes....load value ;AN000;
437 .IF <AX EQ ONE> ; is deactivate requested? ;AN000;
438 MOV CS:[DI].SLT_AT,AT_OCC; yes...change attrib to occupied;AN000;
439 .ENDIF ; ;AN000;
440 .ELSE ; ;AN000;
441 ADD DI,TYPE SLTS ; no ..point to next entry ;AN000;
442 DEC CX ; and decrement count. ;AN000;
443 .ENDIF ; ;AN000;
444 .ENDWHILE ; ;AN000;
445 .ENDIF ; ;AN000;
446 RET ; ;AN000;
447FIND_ACTIVE_CP ENDP ;AN000;
448
449CSEG ENDS
450 END
diff --git a/v4.0/src/DEV/PRINTER/PTRMSG.ASM b/v4.0/src/DEV/PRINTER/PTRMSG.ASM
new file mode 100644
index 0000000..59e3299
--- /dev/null
+++ b/v4.0/src/DEV/PRINTER/PTRMSG.ASM
@@ -0,0 +1,41 @@
1
2 PAGE ,132
3
4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5;;
6;; FILENAME: CPS Device Driver -- Message File
7;; MODULE NAME: PTRMSG1
8;; TYPE: Message External File
9;; LINK PROCEDURE: see CPSPMNN.ASM
10;;
11;; INCLUDE FILES:
12;;
13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
14 ;;
15 ;;
16CSEG SEGMENT PUBLIC 'CODE' ;;
17 ASSUME CS:CSEG ;;
18 ASSUME DS:NOTHING ;;
19 ;;
20PUBLIC msg_no_init_p ;;
21PUBLIC msg_no_init ;;
22PUBLIC msg_bad_syntax ;;
23PUBLIC msg_insuff_mem ;;
24 ;;
25
26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
27;;
28;; ************************************
29;; ** **
30;; ** Resident Code **
31;; ** **
32;; ************************************
33;;
34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
35
36INCLUDE PTRMSG.INC
37
38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
39CSEG ENDS
40 END
41 \ No newline at end of file
diff --git a/v4.0/src/DEV/PRINTER/ZERO.DAT b/v4.0/src/DEV/PRINTER/ZERO.DAT
new file mode 100644
index 0000000..573541a
--- /dev/null
+++ b/v4.0/src/DEV/PRINTER/ZERO.DAT
@@ -0,0 +1 @@
0