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