]> wirehaze git hosting - MS-DOS.git/blob - v4.0/src/DEV/DISPLAY/WRITE.INC

wirehaze git hosting

MZ is back!
[MS-DOS.git] / v4.0 / src / DEV / DISPLAY / WRITE.INC
1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2 ; WRITE ROUTINE FOR DESIGNATE WRITE
3 ;
4 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5 IF1 ;
6 %OUT . ®WRITE .INC¯
7 ENDIF ;
8 PUBLIC REDUCED_SUPPORT ;
9 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
10 ;
11 ; WRITE DESIGNATE SUPPORT
12 ;
13 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
14 DESG_WRITE PROC ;
15 CMP CS:DESG_SEMAPHORE,ZERO ; TEST IF DESIGNATE IS ON...
16 JNE DW_2 ; PASS ONTO DOS
17 CLC ;
18 RET ;
19 DW_2: CMP CS:DESG_SEMAPHORE,ONE ; CHECK IF PROPER DESIGNATE
20 JE DW_4 ;
21 OR BUF.STATUS,TEN ; IF NOT, THEN DEVICE ERROR
22 STC ;
23 RET ;
24 DW_4: CALL WRITE ;
25 RET ;
26 DESG_WRITE ENDP ;
27 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
28 ;
29 ;
30 ;
31 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
32 REDUCED_SUPPORT EQU $ ; THIS IS A MARKER FOR REDUCED CPS
33 ; SUPPORT WITH 0 DESGINATES (CGA,MONO)
34 WRITE PROC ;
35 PUSH DS ;
36 ;
37 PUSH CS ;
38 POP DS ;
39 ;
40 PUSH SI ;S;
41 CLI ;S;
42 MOV SI,SP ;S;
43 MOV OLD_STACK_O,SI ;S;
44 MOV SI,SS ;S;
45 MOV OLD_STACK_S,SI ;S;
46 MOV AX,OFFSET STACK_START ;S;
47 MOV SI,CS ;S;
48 MOV SS,SI ;S;
49 MOV SP,AX ;S;
50 STI ;S;
51 ;
52 LES DI,DWORD PTR BUF.RH_PTRO; RESTORE ES:DI AS REQUEST HEADER PTR
53 LEA SI,FTABLE ; GET BASE ADDRESS OF PARSER TABLE
54 ;
55 MOV DS:[SI].FLAG,0 ; NO RESTART
56 MOV AX,RH.RH3_CNT ;
57 MOV DS:[SI].BUFFER_LEN,AX ; LENGTH OF REQUEST PACKET
58 ;
59 PUSH SI ;
60 LEA SI,[SI].BUFFER_ADDR ; PACKET ADDRESS
61 MOV AX,RH.RH3_DTAO ;
62 MOV DS:[SI],AX ;
63 INC SI ;
64 INC SI ;
65 MOV AX,RH.RH3_DTAS ;
66 MOV DS:[SI],AX ;
67 POP SI ;
68 ;
69 CALL FONT_PARSER ;
70 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
71 ;
72 ; FONT PARSER HAS BEEN CALLED, NOW CHECK ALL OF THE
73 ; APPROPRIATE TABLES FOR DATA INFORMATION, ERROR
74 ; CONDITIONS, etc....
75 ;
76 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
77 LEA SI,FTABLE ; GET BASE ADDRESS OF PARSER TABLE
78 MOV CX,[SI].NUM_FTBLK ; CX = NUMBER OF PARSING TABLES
79 LEA SI,FTB1 ; THEN SET SI = FIRST PARSING TABLE
80 ;
81 W_1: MOV AX,DS:[SI].FTB_STATUS ;
82 CMP AX,0FFF0H ; CHECK THE PARSER STATUS
83 JNB W_3 ;
84 ;
85 OR BUF.STATUS,FAIL ; IF THE PARSER FAILED ON THE DATA
86 MOV RH.RHC_STA,AX ; FILE, THEN SET FLAG AND...
87 CALL HANDLE_WRITE_ERROR ;
88 JUMP W_7 ; ERROR HAS BEEN FOUND..DON'T CONTINUE
89 ;
90 W_3: CMP AX,FSTAT_FONT ;
91 JNE W_6 ;
92 ;
93 MOV AX,DS:[SI].FTB_DLEN ;
94 CALL HANDLE_DATA_WRITE ;
95 ;
96 W_6: ADD SI,TYPE FTBLK ; ADVANCE SI POINTER TO NEXT TABLE
97 LOOP W_1 ; CHECK OUT ALL PARSING TABLES
98 ;
99 W_7: CLI ;S;
100 MOV SI,OLD_STACK_S ;S;
101 MOV AX,OLD_STACK_O ;S;
102 MOV SS,SI ;S;
103 MOV SP,AX ;S;
104 STI ;S;
105 POP SI ;S;
106 POP DS ;
107 STC ; INDICATE NOT TO PASS ON DATA
108 RET ;
109 WRITE ENDP ;
110 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
111 ;
112 ; THIS IS USED TO SET THE CPS DRIVER IN THE CASE OF A
113 ; DESIGNATE ERROR. IT WILL RESET THE DESIGNATED CP's
114 ; TO INVALID, AND IF THE ACTIVE_CP WAS A DESIGNATED CP,
115 ; THEN IT TOO BECOMES INVALID.
116 ;
117 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
118 HANDLE_WRITE_ERROR PROC ;
119 PUSH DS ;
120 PUSH AX ;
121 PUSH CX ;
122 PUSH SI ;
123 ;
124 MOV AX,-1 ; ...SET DESGINATE LIST TO (-1)'S
125 MOV CX,CPD_REQ_DESG ; GET NUMBER AND
126 MOV SI,2 ; +2
127 HWE_3: CMP CPD_REQ_DESG[SI],AX ; CHECK IF REQUESTED PREP WAS VALID
128 JE HWE_4 ; IF REQUESTED WAS VALID, THEN THE ERROR
129 MOV CPD_DESG_N[SI],AX ; SETS ACTUAL PREP LIST ENTRY TO INVALID
130 HWE_4: INC SI ;
131 INC SI ;
132 LOOP HWE_3 ; REPEAT FOR #DESIGNATES
133 ;
134 MOV CX,CPD_ACTIVE ;
135 CALL FIND_CP ; CHECK IF ACTIVE_CP=STILL VALID
136 JNC HWE_2 ;
137 MOV CX,-1 ;
138 MOV CPD_ACTIVE,CX ;
139 ;
140 HWE_2: POP SI ;
141 POP CX ;
142 POP AX ;
143 POP DS ;
144 RET ;
145 HANDLE_WRITE_ERROR ENDP ;
146 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
147 ;
148 ; THIS SUBROUTINE TAKES THE DATA INFORMATION ISOLATED
149 ; BY THE FONT PARSER AND MOVES INTO THE INTERNAL FONT
150 ; FONT BUFFERS. IT COPIES THE DATA BASED ON THE SIZE
151 ; OF THE INTERNAL FONTS & THE REQUIRED FONT SIZES.
152 ;
153 ;
154 ; INPUT:
155 ; AX = LENGTH OF DATA
156 ; CX = TABLE # TO PARSE
157 ; DS:SI = POINTER TO 'FTBLK'
158 ;
159 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
160 NUM_DATA_FONTS DW ? ;
161 TABLE_INDEX DW ? ;
162 LEN_DATA DW ? ;
163 INDEX_WRITE_PNTER DW ? ;
164 ;
165 HANDLE_DATA_WRITE PROC ;
166 PUSH AX ;
167 PUSH BX ;
168 PUSH CX ;
169 PUSH SI ;
170 PUSH DI ;
171 PUSH DS ;
172 PUSH ES ;
173 ;
174 PUSH CX ;
175 MOV CX,DS:[SI].FTB_FONTS ; READ IN #FONTS FROM DATA FILE
176 MOV CS:NUM_DATA_FONTS,CX ;
177 POP CX ;
178 ;
179 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
180 ;
181 ; ROUTINE TO FIND TABLE_INDEX FOR DATA WRITE'S
182 ; THIS WAS ADDED TO ACCOUNT FOR A REPLACEMENT
183 ; TECHNIQUE APPROACH.....(Sept 3/86)
184 ;
185 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
186 PUSH AX ;
187 PUSH CX ;
188 PUSH ES ;
189 ;
190 PUSH CS ;
191 POP ES ;
192 MOV AX,DS:[SI].FTB_CP ; GET THE CODE PAGE OF THIS FONT BLOCK
193 MOV CX,CPD_DESG_N ; GET THE NUMBER OF CP's TO CHECK
194 MOV DI,TWO ;
195 BBB_0: CMP AX,CPD_DESG_N[DI] ; LOOKING FOR A MATCHED CODE PAGE
196 JE BBB_1 ;
197 INC DI ;
198 INC DI ;
199 LOOP BBB_0 ;
200 ;
201 ;;;;;;INVALID???;;;;;;;;;;;;;;;;;;;;;;;;;
202 ;
203 BBB_1: MOV DI,CPD_DESG_N ;
204 SUB DI,CX ;
205 MOV CS:TABLE_INDEX,DI ;
206 BBB_2: POP ES ;
207 POP CX ;
208 POP AX ;
209 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
210 ;
211 ;
212 ;
213 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
214 PUSH SI ;
215 LEA SI,FTABLE ; GET BASE ADDRESS OF PARSER TABLE
216 SHL DI,1 ;
217 SHL DI,1 ; MULTIPLY INDEX BY FOUR..SEG:OFFSET
218 CALL GET_WRITE_PNTR ; GET LOCATION OF 1ST FONT_WRITE PNTER
219 ADD DI,SI ; DI NOW IS THE POINTER TO WRITE_START
220 POP SI ;
221 ;
222 MOV CS:INDEX_WRITE_PNTER,DI ; SAVE ADDRESS OF INDEX WRITE PNTER
223 ;
224 MOV ES,CS:[DI+2] ; SET ES : DI WITH WRITE POINTER!
225 MOV DI,CS:[DI] ;
226 ;
227 MOV CX,DS:[SI].FTB_DAHI ; GET SEGMENT OF DATA
228 MOV SI,DS:[SI].FTB_DALO ; GET OFFSET OF DATA
229 MOV DS,CX ;
230 ; <<SETUP DESTINATION INFO>>
231 MOV CX,AX ; SAVE LENGTH OF DATA TO COPY
232 MOV CS:LEN_DATA,CX ; SAVE THIS VALUE
233 AND CX,CX ; TEST LENGTH OF DATA
234 JNZ TEMP_0 ;
235 JUMP HDW_8 ;
236 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
237 ;
238 ; NOW DS : SI POINTS TO SOURCE DATA INFORMATION,
239 ; ES : DI POINTS TO THE DESTINATION BUFFER!
240 ; CX = NUMBER OF INFORMATION BYTES AVAILABLE
241 ; THE DATA MUST BE CHECKED FOR THE FONT RESOLUTIONS
242 ; AS THEY ARE TO FIT INTO THE INTERNAL BUFFERS.
243 ;
244 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
245 TEMP_0: PUSH AX ;
246 PUSH BX ;
247 PUSH CX ;
248 PUSH SI ;
249 PUSH DI ;
250 ;
251 LEA BX,CPD_FONT_DATA ; TEST IF THERE IS OUTSTANDING DATA
252 ADD BX,CS:TABLE_INDEX ; FOR INFORMATION TO COPY or SKIP OVER.
253 ADD BX,CS:TABLE_INDEX ; (ACCOUNT FOR WORD VALUE)
254 MOV AX,CS:[BX] ;
255 OR AX,AX ;
256 JE HDW_00 ; IF NOTHING TO CONSIDER, THEN MOVE ON
257 TEST AX,8000H ;;;;SKIP/COPY;;;;; TEST IF OUTSTANDING DATA TO COPY/SKIP
258 JNZ HDW_P0 ;
259 MOV CX,AX ; SET VALUE IN CX....
260 MOV AX,CS:NUM_DATA_FONTS ;
261 PUSH AX ;
262 JUMP HDW_3AA ;
263 HDW_P0: AND AX,7FFFH ; STRIP OFF FIRST BIT...
264 MOV CX,AX ;
265 MOV AX,CS:NUM_DATA_FONTS ;
266 PUSH AX ;
267 JUMP HDW_5AA ;
268 ;
269 HDW_00: MOV CX,CS:NUM_DATA_FONTS ;
270 HDW_0: CMP CS:LEN_DATA,0 ; TEST IF THERE IS ANY DATA LEFT?
271 JNE HDW_0A ;
272 JUMP HDW_6 ; IF 0 LEFT...THEN END...
273 ;
274 HDW_0A: MOV AL,[SI] ; GET #ROWS FROM DATA
275 PUSH CX ; SAVE COUNT
276 MOV CX,NUM_FONT_PRIORITY ;
277 LEA BX,FONT_PRIORITY ; SET DI TO START OF TABLE
278 HDW_1: CMP AL,CS:[BX] ;
279 JE HDW_3 ; IF EQUAL, THEN ALREADY IN TABLE
280 INC BX ; OTHERWISE, TAKE THIS MODES FONT RES
281 LOOP HDW_1 ; AND COMPARE AGAINST NEXT PRIOR.VALUE
282 JUMP HDW_5 ; IF NO MATCH, THEN IGNORE THIS FONT!!!
283 ;
284 HDW_3: XOR AH,AH ; FONT SIZE NEEDED...GET IT!
285 MOV CX,[SI+4] ; GET THE #CHARACTERS IN TABLE
286 PUSH DX ;
287 MUL CX ;
288 POP DX ;
289 ADD AX,SIX ; ACCOUNT FOR DATA HEADER
290 MOV CX,AX ; SET COUNT INTO CX....
291 ;
292 HDW_3AA:CMP CX,CS:LEN_DATA ; TEST IF SUPPLIED DATA>=NEEDED
293 JBE HDW_3A ;
294 SUB CX,CS:LEN_DATA ; IF NOT ENOUGH DATA HERE, THEN FORWARD
295 MOV AX,CX ; VALUE TO NEXT DATA CALL.
296 CALL SET_CPD_FONT_DATA ;
297 MOV CX,CS:LEN_DATA ;
298 JUMP HDW_3B ;
299 ;
300 HDW_3A: XOR AX,AX ;
301 CALL SET_CPD_FONT_DATA ;
302 HDW_3B: SUB CS:LEN_DATA,CX ;
303 CLD ;
304 REP MOVSB ; MOVE THAT RESOLUTION IN...
305 ;
306 HDW_4: POP CX ; RESTORE #FONTS IN DATA
307 LOOP HDW_0 ;
308 JUMP HDW_6 ;
309 ;
310 HDW_5: XOR AH,AH ; FONT SIZE NEEDED...GET IT!
311 MOV CX,[SI+4] ; GET THE #CHARACTERS IN TABLE
312 PUSH DX ;
313 MUL CX ;
314 POP DX ;
315 ADD AX,SIX ; ACCOUNT FOR DATA HEADER
316 MOV CX,AX ; PUT IN CX FOR NOW
317 ;
318 HDW_5AA:CMP CX,CS:LEN_DATA ; TEST IF SUPPLIED DATA>=NEEDED
319 JBE HDW_5A ;
320 SUB CX,CS:LEN_DATA ; IF NOT ENOUGH DATA HERE, THEN FORWARD
321 MOV AX,CX ; VALUE TO NEXT DATA CALL.
322 OR AX,8000H ; SET TO SKIP NEXT DATA....
323 CALL SET_CPD_FONT_DATA ;
324 MOV CX,CS:LEN_DATA ;
325 JUMP HDW_5B ;
326 ;
327 HDW_5A: XOR AX,AX ;
328 CALL SET_CPD_FONT_DATA ;
329 HDW_5B: SUB CS:LEN_DATA,CX ;
330 ADD SI,CX ; ADVANCE SOURCE POINTER OVER THIS FONT
331 JUMP HDW_4 ;
332 ;
333 HDW_6: MOV SI,CS:INDEX_WRITE_PNTER ;
334 MOV CS:[SI],DI ;
335 MOV CS:[SI+2],ES ;
336 ;
337 POP DI ;
338 POP SI ;
339 POP CX ;
340 POP BX ;
341 POP AX ;
342 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
343 ;
344 ;
345 ;
346 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
347 HDW_8: POP ES ;
348 POP DS ;
349 POP DI ;
350 POP SI ;
351 POP CX ;
352 POP BX ;
353 POP AX ;
354 RET ;
355 HANDLE_DATA_WRITE ENDP ;
356 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
357 ;
358 ; SET_CPD_FONT_DATA
359 ;
360 ; THIS ROUTINE IS USED TO SET THE COPY/SKIP VALUE
361 ; CONTAINED IN 'AX'.
362 ;
363 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
364 SET_CPD_FONT_DATA PROC ;
365 PUSH SI ;
366 MOV SI,CS:TABLE_INDEX ;
367 ADD SI,SI ;
368 MOV CS:CPD_FONT_DATA.[SI],AX;
369 POP SI ;
370 RET ;
371 SET_CPD_FONT_DATA ENDP ;
372 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
373 \1a