1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2 ; WRITE ROUTINE FOR DESIGNATE WRITE
4 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8 PUBLIC REDUCED_SUPPORT ;
9 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
11 ; WRITE DESIGNATE SUPPORT
13 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
15 CMP CS:DESG_SEMAPHORE,ZERO ; TEST IF DESIGNATE IS ON...
16 JNE DW_2 ; PASS ONTO DOS
19 DW_2: CMP CS:DESG_SEMAPHORE,ONE ; CHECK IF PROPER DESIGNATE
21 OR BUF.STATUS,TEN ; IF NOT, THEN DEVICE ERROR
27 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
31 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
32 REDUCED_SUPPORT EQU $ ; THIS IS A MARKER FOR REDUCED CPS
33 ; SUPPORT WITH 0 DESGINATES (CGA,MONO)
43 MOV OLD_STACK_O,SI ;S;
45 MOV OLD_STACK_S,SI ;S;
46 MOV AX,OFFSET STACK_START ;S;
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
55 MOV DS:[SI].FLAG,0 ; NO RESTART
57 MOV DS:[SI].BUFFER_LEN,AX ; LENGTH OF REQUEST PACKET
60 LEA SI,[SI].BUFFER_ADDR ; PACKET ADDRESS
70 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
72 ; FONT PARSER HAS BEEN CALLED, NOW CHECK ALL OF THE
73 ; APPROPRIATE TABLES FOR DATA INFORMATION, ERROR
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
81 W_1: MOV AX,DS:[SI].FTB_STATUS ;
82 CMP AX,0FFF0H ; CHECK THE PARSER STATUS
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
90 W_3: CMP AX,FSTAT_FONT ;
93 MOV AX,DS:[SI].FTB_DLEN ;
94 CALL HANDLE_DATA_WRITE ;
96 W_6: ADD SI,TYPE FTBLK ; ADVANCE SI POINTER TO NEXT TABLE
97 LOOP W_1 ; CHECK OUT ALL PARSING TABLES
100 MOV SI,OLD_STACK_S ;S;
101 MOV AX,OLD_STACK_O ;S;
107 STC ; INDICATE NOT TO PASS ON DATA
110 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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.
117 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
118 HANDLE_WRITE_ERROR PROC ;
124 MOV AX,-1 ; ...SET DESGINATE LIST TO (-1)'S
125 MOV CX,CPD_REQ_DESG ; GET NUMBER AND
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
132 LOOP HWE_3 ; REPEAT FOR #DESIGNATES
135 CALL FIND_CP ; CHECK IF ACTIVE_CP=STILL VALID
145 HANDLE_WRITE_ERROR ENDP ;
146 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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.
155 ; AX = LENGTH OF DATA
156 ; CX = TABLE # TO PARSE
157 ; DS:SI = POINTER TO 'FTBLK'
159 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
160 NUM_DATA_FONTS DW ? ;
163 INDEX_WRITE_PNTER DW ? ;
165 HANDLE_DATA_WRITE PROC ;
175 MOV CX,DS:[SI].FTB_FONTS ; READ IN #FONTS FROM DATA FILE
176 MOV CS:NUM_DATA_FONTS,CX ;
179 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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)
185 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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
195 BBB_0: CMP AX,CPD_DESG_N[DI] ; LOOKING FOR A MATCHED CODE PAGE
201 ;;;;;;INVALID???;;;;;;;;;;;;;;;;;;;;;;;;;
203 BBB_1: MOV DI,CPD_DESG_N ;
205 MOV CS:TABLE_INDEX,DI ;
209 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
213 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
215 LEA SI,FTABLE ; GET BASE ADDRESS OF PARSER TABLE
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
222 MOV CS:INDEX_WRITE_PNTER,DI ; SAVE ADDRESS OF INDEX WRITE PNTER
224 MOV ES,CS:[DI+2] ; SET ES : DI WITH WRITE POINTER!
227 MOV CX,DS:[SI].FTB_DAHI ; GET SEGMENT OF DATA
228 MOV SI,DS:[SI].FTB_DALO ; GET OFFSET OF DATA
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
236 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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.
244 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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)
256 JE HDW_00 ; IF NOTHING TO CONSIDER, THEN MOVE ON
257 TEST AX,8000H ;;;;SKIP/COPY;;;;; TEST IF OUTSTANDING DATA TO COPY/SKIP
259 MOV CX,AX ; SET VALUE IN CX....
260 MOV AX,CS:NUM_DATA_FONTS ;
263 HDW_P0: AND AX,7FFFH ; STRIP OFF FIRST BIT...
265 MOV AX,CS:NUM_DATA_FONTS ;
269 HDW_00: MOV CX,CS:NUM_DATA_FONTS ;
270 HDW_0: CMP CS:LEN_DATA,0 ; TEST IF THERE IS ANY DATA LEFT?
272 JUMP HDW_6 ; IF 0 LEFT...THEN END...
274 HDW_0A: MOV AL,[SI] ; GET #ROWS FROM DATA
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!!!
284 HDW_3: XOR AH,AH ; FONT SIZE NEEDED...GET IT!
285 MOV CX,[SI+4] ; GET THE #CHARACTERS IN TABLE
289 ADD AX,SIX ; ACCOUNT FOR DATA HEADER
290 MOV CX,AX ; SET COUNT INTO CX....
292 HDW_3AA:CMP CX,CS:LEN_DATA ; TEST IF SUPPLIED DATA>=NEEDED
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 ;
301 CALL SET_CPD_FONT_DATA ;
302 HDW_3B: SUB CS:LEN_DATA,CX ;
304 REP MOVSB ; MOVE THAT RESOLUTION IN...
306 HDW_4: POP CX ; RESTORE #FONTS IN DATA
310 HDW_5: XOR AH,AH ; FONT SIZE NEEDED...GET IT!
311 MOV CX,[SI+4] ; GET THE #CHARACTERS IN TABLE
315 ADD AX,SIX ; ACCOUNT FOR DATA HEADER
316 MOV CX,AX ; PUT IN CX FOR NOW
318 HDW_5AA:CMP CX,CS:LEN_DATA ; TEST IF SUPPLIED DATA>=NEEDED
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 ;
328 CALL SET_CPD_FONT_DATA ;
329 HDW_5B: SUB CS:LEN_DATA,CX ;
330 ADD SI,CX ; ADVANCE SOURCE POINTER OVER THIS FONT
333 HDW_6: MOV SI,CS:INDEX_WRITE_PNTER ;
342 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
346 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
355 HANDLE_DATA_WRITE ENDP ;
356 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
360 ; THIS ROUTINE IS USED TO SET THE COPY/SKIP VALUE
363 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
364 SET_CPD_FONT_DATA PROC ;
366 MOV SI,CS:TABLE_INDEX ;
368 MOV CS:CPD_FONT_DATA.[SI],AX;
371 SET_CPD_FONT_DATA ENDP ;
372 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;