summaryrefslogtreecommitdiff
path: root/v4.0/src/DEV/DISPLAY/WRITE.INC
diff options
context:
space:
mode:
authorGravatar Mark Zbikowski2024-04-25 21:24:10 +0100
committerGravatar Microsoft Open Source2024-04-25 22:32:27 +0000
commit2d04cacc5322951f187bb17e017c12920ac8ebe2 (patch)
tree80ee017efa878dfd5344b44249e6a241f2a7f6e2 /v4.0/src/DEV/DISPLAY/WRITE.INC
parentMerge pull request #430 from jpbaltazar/typoptbr (diff)
downloadms-dos-main.tar.gz
ms-dos-main.tar.xz
ms-dos-main.zip
MZ is back!HEADmain
Diffstat (limited to 'v4.0/src/DEV/DISPLAY/WRITE.INC')
-rw-r--r--v4.0/src/DEV/DISPLAY/WRITE.INC373
1 files changed, 373 insertions, 0 deletions
diff --git a/v4.0/src/DEV/DISPLAY/WRITE.INC b/v4.0/src/DEV/DISPLAY/WRITE.INC
new file mode 100644
index 0000000..0d6338e
--- /dev/null
+++ b/v4.0/src/DEV/DISPLAY/WRITE.INC
@@ -0,0 +1,373 @@
1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2; WRITE ROUTINE FOR DESIGNATE WRITE
3;
4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5IF1 ;
6 %OUT . ®WRITE .INC¯
7ENDIF ;
8 PUBLIC REDUCED_SUPPORT ;
9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
10;
11; WRITE DESIGNATE SUPPORT
12;
13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
14DESG_WRITE PROC ;
15 CMP CS:DESG_SEMAPHORE,ZERO ; TEST IF DESIGNATE IS ON...
16 JNE DW_2 ; PASS ONTO DOS
17 CLC ;
18 RET ;
19DW_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 ;
24DW_4: CALL WRITE ;
25 RET ;
26DESG_WRITE ENDP ;
27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
28;
29;
30;
31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
32REDUCED_SUPPORT EQU $ ; THIS IS A MARKER FOR REDUCED CPS
33 ; SUPPORT WITH 0 DESGINATES (CGA,MONO)
34WRITE 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 ;
81W_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 ;
90W_3: CMP AX,FSTAT_FONT ;
91 JNE W_6 ;
92 ;
93 MOV AX,DS:[SI].FTB_DLEN ;
94 CALL HANDLE_DATA_WRITE ;
95 ;
96W_6: ADD SI,TYPE FTBLK ; ADVANCE SI POINTER TO NEXT TABLE
97 LOOP W_1 ; CHECK OUT ALL PARSING TABLES
98 ;
99W_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 ;
109WRITE 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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
118HANDLE_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
127HWE_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
130HWE_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 ;
140HWE_2: POP SI ;
141 POP CX ;
142 POP AX ;
143 POP DS ;
144 RET ;
145HANDLE_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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
160NUM_DATA_FONTS DW ? ;
161TABLE_INDEX DW ? ;
162LEN_DATA DW ? ;
163INDEX_WRITE_PNTER DW ? ;
164 ;
165HANDLE_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 ;
195BBB_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 ;
203BBB_1: MOV DI,CPD_DESG_N ;
204 SUB DI,CX ;
205 MOV CS:TABLE_INDEX,DI ;
206BBB_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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
245TEMP_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 ;
263HDW_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 ;
269HDW_00: MOV CX,CS:NUM_DATA_FONTS ;
270HDW_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 ;
274HDW_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
278HDW_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 ;
284HDW_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 ;
292HDW_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 ;
300HDW_3A: XOR AX,AX ;
301 CALL SET_CPD_FONT_DATA ;
302HDW_3B: SUB CS:LEN_DATA,CX ;
303 CLD ;
304 REP MOVSB ; MOVE THAT RESOLUTION IN...
305 ;
306HDW_4: POP CX ; RESTORE #FONTS IN DATA
307 LOOP HDW_0 ;
308 JUMP HDW_6 ;
309 ;
310HDW_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 ;
318HDW_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 ;
327HDW_5A: XOR AX,AX ;
328 CALL SET_CPD_FONT_DATA ;
329HDW_5B: SUB CS:LEN_DATA,CX ;
330 ADD SI,CX ; ADVANCE SOURCE POINTER OVER THIS FONT
331 JUMP HDW_4 ;
332 ;
333HDW_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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
347HDW_8: POP ES ;
348 POP DS ;
349 POP DI ;
350 POP SI ;
351 POP CX ;
352 POP BX ;
353 POP AX ;
354 RET ;
355HANDLE_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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
364SET_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 ;
371SET_CPD_FONT_DATA ENDP ;
372;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
373 \ No newline at end of file