1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3 ; CODE PAGE DRIVER FUNCTIONS
5 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
10 CP_FUNCTION LABEL BYTE ;
11 DW 4CH,OFFSET DESIGNATE_BEGIN ;
12 DW 4DH,OFFSET DESIGNATE_END ;
13 DW 4AH,OFFSET INVOKE_CP ;
14 DW 6AH,OFFSET QUERY_CP ;
15 DW 6BH,OFFSET QUERY_CP_LIST ;
16 NUM_CP_FUNCTION EQU ($-CP_FUNCTION)/4 ;
18 DESG_SEMAPHORE DB 0 ; TEMPORARY
19 G_IOCTL_SEMA DB 0 ; SEMAPHORE TO INDICATE IF CPS IS BUSY!
29 NUM_CHAR_HEIGHT EQU ($-CHAR_HEIGHT) ;
32 GENERIC_IOCTL PROC ; CON OUTPUT
35 MOV CS:OLD_STACK_O,SI ;S;
37 MOV CS:OLD_STACK_S,SI ;S;
38 MOV AX,OFFSET STACK_START ;S;
46 POP DS ; FROM HERE IN, DS=CS
48 LES DI,DWORD PTR BUF.RH_PTRO; GET RH
50 GI_1: MOV AL,RH.MINOR_F ; PUT MINOR VERSION IN AL
51 XOR AH,AH ; CLEAR OUT HIGH BYTE FOR COMPARES
53 PUSH DI ; SAVE POINTER!!!
57 MOV CX,NUM_CP_FUNCTION ;
58 MOV DI,OFFSET CP_FUNCTION ;
59 GI_1A: SCASW ; SEARCH THROUGH THE LIST OF VALID FN's
66 JUMP GI_3 ; NOT FOUND!
71 MOV G_IOCTL_SEMA,ONE ; SEMAPHORE TO INDICATE CALLS ARE BUSY!
72 CALL [SI] ; JMP OFF TO THE APPROPRIATE CALL!
73 MOV G_IOCTL_SEMA,ZERO ; SEMAPHORE TO INDICATE CALLS ARE DONE!
74 STC ; SET CY not TO TRY ATTACHED CON!
76 GI_3: CLC ; CLEAR CY TO TRY ATTACHED CON!
79 MOV AX,CS:OLD_STACK_O ;S;
80 MOV SI,CS:OLD_STACK_S ;S;
86 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
90 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
91 DESIGNATE_BEGIN PROC ;
92 LES DI,RH.REQUEST_PACKET ; AND DI TO POINT TO REQUEST PACKET
93 MOV CX,RH.DESG_N ; MOVE THE NUMBER OF CODE PAGES DESIG'ed
96 JZ DB_0C ; CHECK IF ZERO CP's DESIGNATED
97 ; IF SO, THEN THIS IS THE REFRESH CALL
98 DB_0: CMP CX,CPD_DESG_N ; CHECK IF NUMBER > # CONFIGed
102 DB_0D: OR BUF.STATUS,EIGHT ; Error>> KEYBOARD ERROR!!
104 DB_2D: POP CX ; RESTORE STACK ELEMENTS
106 POP CX ; RESTORE STACK ELEMENTS
108 DB_0B: OR BUF.STATUS,TEN ; Error>> DEVICE ERROR!!
110 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
112 ; REFRESH ACTIVE CODE PAGE TO DISPLAY
114 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
115 DB_0C: MOV DESG_SEMAPHORE,TWO ; SET REFRESH COMMENCED
116 MOV CPD_REQ_DESG,CX ; SAVE NUMBER OF REQUESTED CP'S (0)
117 MOV DX,CPD_ACTIVE ; THIS IS THE REFRESH CALL
118 CMP DX,-1 ; CHECK IF THE ACTIVE_CP = INVALID
120 CLC ; CLEAR OUT THE CARRY FLAG
121 CALL SIGNAL_KBD_INVK ;
122 JC DB_0D ; IF CY SET, THEN KEYBOARD IS WRONG
128 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
130 ; THIS SECTION FORMS THE NEW DESIGNATE CP LIST IN THE
131 ; CPD_TEMP_DESG. AT THE SAME TIME THE TOTAL NUMBER OF
132 ; REQUESTED CP's ARE FOUND.
134 ; DX will contain the real CP's to load
136 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
137 DB_1B: CLD ; SET DIRECTION FORWARD
144 INC CX ; ACCOUNT FOR NUMBER OF CPS
145 LEA SI,CPD_DESG_N ; COPY PREPARED CP LIST TO TEMP BUFFER
146 LEA DI,CPD_TEMP_DESG ;
152 XOR DX,DX ; SET COUNT OF CP's TO PREPARE = 0
155 MOV CPD_REQ_DESG,CX ; SAVE NUMBER OF REQUESTED CP'S
158 DB_1: MOV AX,RH.DESG_N[BX] ; GET REQUESTED CP
159 CMP AX,-1 ; TEST IF REQUESTED IS PLACE HOLDER..
161 INC DX ; ADD ONE TO THE # VALID DESG
162 MOV CPD_TEMP_DESG[SI],AX ; OVERLAY THE NEWER CP INTO TEMP BUFFER
163 DB_1A: MOV CPD_REQ_DESG[SI],AX ; COPY TO THE REQ DESG LIST
172 OR DX,DX ; ARE THERE NO CP's TO PREPARE?
173 JZ DB_0B ; IF NONE TO DESG, THEN ERROR!!
174 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
176 ; THIS SECTION CHECKS THE LIST OF DESIGed CP's IN THE
177 ; TEMP BUFFER AND SETS AN ERROR FOR DUPLICATES.
179 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
180 DB_2: PUSH BX ; CHECK THE DESIGNATE LIST FOR DUP's
181 PUSH CX ; AND FOR INVALIDS
182 MOV CX,CPD_TEMP_DESG ;
184 JZ DB_3 ; IF ZERO, THEN NONE TO COMPARE
185 MOV BX,2 ; SET BX TO START OF LIST....
186 MOV SI,2 ; SETUP SI READY TO MOVE DESG LIST IN!
189 MOV AX,CPD_TEMP_DESG[BX] ; GET CP DESGINATED
190 CMP AX,-1 ; TEST IF ENTRY = -1
191 JE DB_2E ; IF SO, THEN SKIP
192 DB_2B: CMP CX,1 ; TEST IF IT IS THE ONLY ONE TO COMPARE
194 INC BX ; ADVANCE POINTER TO NEXT CP DESIGNATED
196 CMP AX,CPD_TEMP_DESG[BX] ; CHECK IF NEXT CP's = ONE TESTED
197 JNE DB_2C ; IF error, THEN GET OUT
206 JE DB_3 ; TEST IF ONLY ONE CP SPECIFIED
211 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
213 ; NOW, THE TEMPORARY BUFFER CONTAINS THE NEW LIST
214 ; OF DESGINATED CODE PAGES. COPY THIS TO THE
217 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
218 PUSH ES ; NOW ALL TESTS ARE SUCCESSFUL,
224 INC CX ; ACCOUNT FOR NUMBER OF CPS
225 LEA SI,CPD_TEMP_DESG ; COPY TEMP BUFFER INTO NEW CP LIST
231 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
233 ; NOW THAT THE LIST IS VALID, THE FONT PARSER & PARSING TABLES
234 ; ARE PREPARED FOR INITIALIZATION OF DESIGNATION.
236 ; DX is the number of valid CP's
237 ; CX is the number of CP's desginated
239 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
243 ; CX=#DESGed, BX=pnter DESG LIST
244 MOV BX,2 ; SET BX TO POINT TO FIRST CP DESGed
245 LEA DI,FTABLE ; SET DI TO POINT TO MAIN PARSER TABLE
247 POP ES ; INITIALIZE ES=CS
248 MOV [DI].FLAG,FLAG_RESTART ; SETUP UP MAIN TABLE FOR F-PARSER.SRC
249 MOV [DI].BUFFER_LEN,0 ; PREPARING FOR START OF DESIGNATION
250 MOV [DI].NUM_FTBLK,DX ; DX=#DESG TO PARSE OUT
252 LEA SI,CPD_CLASS ; SET DI TO POINT TO (EGA,LCD) CLASSES
253 LEA DI,FTB1 ; SET DI TO POINT TO FIRST PARSING TABLE
255 DB_4: MOV AX,CPD_REQ_DESG[BX] ;
256 CMP AX,-1 ; CHECK FOR PLACE HOLDER
258 MOV [DI].FTB_CP,AX ; COPY THE DESG CP VALUE INTO THE TABLE
259 PUSH CX ; AND ALSO THE CPD_CLASS
262 LEA DI,[DI].FTB_TID ;
269 ADD DI,TYPE FTBLK ; MOVE POINTERS TO NEXT PARSING TABLE
271 INC BX ; ADVANCE BX TO NEXT DESG CP
278 CALL FONT_PARSER ; CALL FONT PARSER TO INITIALIZE WRITES
279 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
281 ; THIS WILL COPY THE START LOCATION OF THE FONTS (set by INIT)
282 ; INTO THE START LOCATION FOR THE DESIGNATE WRITE, WHICH FOLLOWS!
284 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
289 POP ES ; SET EXTRA SEG ES = CS
290 LEA SI,CPD_FONT_PNTER ;
291 LEA DI,CPD_FONT_WRITE ;
292 MOV CX,CPD_DESG_N ; GET NUMBER OF DESIGNATES
293 ADD CX,CX ; DOUBLE FOR SEG:OFFSET
294 REP MOVSW ; COPY FONT START LOC's TO START WRITE
296 LEA SI,CPD_FONT_DATA ; SET THE FONT_DATA COUNTERS BACK TO 0
305 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
307 ; CREATE THE FONT_PRIORITY TABLE
309 ; THIS IS USED TO PLACE PRIORITY ON THE FONTS BEING DESIGNATED
310 ; ESPECIALLY WHEN THE NUMBER OF DESIGNATED FONTS < FONTS IN THE
311 ; xxx.CPI FILE. THIS IS USED TO SELECT THE NEEDED FONTS FOR
314 ; RULE: PRIORITY 1 = ACTIVE MODE's FONT RESOLUTION
315 ; PRIORITY 2 = FONT RESOLUTION (non-repeats) OF ALL DISPLAY
316 ; MODES - STARTING FROM MODE (0) - MODE (?)
318 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
325 LEA DI,FONT_PRIORITY ;
326 MOV CX,CPD_FONTS_N ; GET THE NUMBER OF SPECIFIED FONTS
330 PUSH CX ; OVER-WRITE THE TABLE WITH 0FFH's
339 XOR AH,AH ; AH=0 FOR MODE SET, AL=MODE_TYPE
341 MOV SI,AX ; ESTABLISH INDEX INTO LOAD_MECH table
342 MOV AL,[SI].FONT_SIZE ; GET FONT_SIZE FOR THIS MODE_VALUE
343 OR AL,AL ; TEST FOR FONT_VALUE=0
345 CALL ASK_BIOS_FONT_SIZE ; GET BIOS TO INDICATE FONT_SIZE
346 DB_8: MOV CS:[DI],AL ; PUT ACTIVE FONT RESOLUTION INTO 1ST!
347 INC DI ; ADVANCE POINTER TO NEXT POSITION
348 DEC CX ; SUBTRACT ONE FONT RESOLUTION...
349 JZ DB_A ; IF THERE WAS ONLY 1 FONT...THEN DONE
351 XOR SI,SI ; START WITH MODE = 0
354 MOV CX,NUM_FONT_PRIORITY ;
355 LEA DI,FONT_PRIORITY ; SET DI TO START OF TABLE
356 MOV AL,[SI].FONT_SIZE ; GET FONT SIZE FOR THIS MODE
357 CMP AL,-1 ; TEST FOR INVALID FONT SIZE
358 JE DB_9 ; IF SO, THEN TRY NEXT VALUE
359 OR AL,AL ; TEST FOR FONT_VALUE=0
361 ; OTHERWISE, ONLY EGA BIOS WOULD KNOW!!!
362 CMP SI,EIGHT ; ONLY EIGHT DIFFERENT FONTS PERMITTED!!
366 CALL ASK_BIOS_SCAN_LINES ; GET ENCODED SCAN LINES VALUE!!!
368 MOV CX,SI ; PUT INDEX INTO CX
369 INC CL ; NORMALIZE INDEX VALUE (1-8)
373 MOV AL,CS:CHAR_HEIGHT[SI] ;
375 DB_8C: CMP AL,CS:[DI] ;
376 JE DB_9 ; IF EQUAL, THEN ALREADY IN TABLE
377 INC DI ; OTHERWISE, TAKE THIS MODES FONT RES
378 LOOP DB_8C ; AND COMPARE AGAINST NEXT PRIOR.VALUE
380 POP DI ; NEW RESOLUTION FOUND...ADD TO LIST
382 MOV CS:[DI],AL ; PUT NEW VALUE IN THE TABLE
383 INC DI ; AND ADVANCE FOR NEXT FONT RESOLUTION
384 JUMP DB_9A ; LOOP WILL DECREMENT #FONTS TO FIND
387 INC CX ; MATCH FOUND..SO LEAVE #FONT TO PRIOR.
388 DB_9A: INC SI ; POINT TO NEXT DISPLAY MODE
389 CMP SI,NUM_FONT_SIZES ;
391 LOOP DB_8A ; CONTINUE UNTIL THE #FONTS DESIGNATED
392 ; HAVE BEEN PRIORITIZED OR ALL MODES
393 DB_A: POP DI ; ARE CHECKED OUT!
398 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
402 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
403 MOV DESG_SEMAPHORE,ONE ; SET DESIGNATION TO COMMENCE...
405 DESIGNATE_BEGIN ENDP ;
406 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
410 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
412 CMP DESG_SEMAPHORE,ZERO ; TEST IF DESG_SEMAPHORE = DATA WRITTEN
415 CMP CPD_REQ_DESG,ZERO ; TEST IF ZERO CP's REQUESTED (REFRESH)
418 CALL VERIFY_FPARSER ; CALL ROUTINE TO VERIFY THAT THE
419 JC DE_2 ; FONT PARSER FINISHED OK...
421 PUSH ES ; NOW THE DESIGNATE IS OVER...
423 MOV CX,CPD_ACTIVE ; CHECK IF ACTIVE_CP IS STILL VALID!
424 CALL FIND_CP ; TRY AND FIND CPD_ACTIVE?
430 DE_0: MOV DESG_SEMAPHORE,ZERO ;
433 DE_1: OR BUF.STATUS,TWELVE ; Error>> NO DESGINATE START
435 DE_2: CALL HANDLE_WRITE_ERROR ; RESET ALL DESIGNATED INFORMATION
436 OR BUF.STATUS,FAIL ; Error>> FONT DATA IS BAD
439 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
443 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
445 LES DI,RH.REQUEST_PACKET ; AND DI TO POINT TO REQUEST PACKET
446 MOV CX,RH.INVK_LENGTH ; GET LENGTH OF REMAINING HEADER
448 CMP CX,TWO ; TEST IF LENGTH OF TABLE IS GREATER
449 JNE ICP_2 ; THAN ONE CP!
451 MOV CX,RH.INVK_CP ; GET THE CODE PAGE TO INVOKE
452 MOV DX,CX ; SAVE CP VALUE
453 CMP CX,-1 ; TEST FOR INVALID CODE PAGE!
456 PUSH CPD_ACTIVE ; SAVE ACTIVE_CP, FOR POSSIBLE USE...
458 CALL TEST_CP ; TRY AND LOAD THE REQUESTED CP
460 JC ICP_1AA ; IF ERROR, THEN RESTORE OLD CP
462 CMP CX,CPD_ACTIVE ; TEST IF OLD CP=ACTIVE!!!
465 CALL INVOKE_DATA ; IF EVERYTHING OK, THEN LOAD DATA
468 ICP_0A: CALL SIGNAL_KBD_INVK ; DX CONTAINS CODEPAGE
469 JC ICP_1 ; IF CY THEN ERROR
472 ICP_1: OR BUF.STATUS,EIGHT ; Error>> KEYB ERROR
474 ICP_1AA:MOV CPD_ACTIVE,CX ; PUT OLD CP BACK ACTIVE
475 ICP_1A: OR BUF.STATUS,SEVEN ; Error>> CODE PAGE NOT FOUND
477 ICP_2A: MOV CPD_ACTIVE,CX ;
478 ICP_2: OR BUF.STATUS,TEN ; Error>> DEVICE ERROR
481 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
485 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
487 LES DI,RH.REQUEST_PACKET ; SETUP ADDRESSING TO HEADER
490 MOV RH.INVK_LENGTH,CX ; CREATE RETURN 'N' VALUE
492 CALL TEST_CP ; FIND OUT IF CP DATA IS OK!
495 MOV CX,-1 ; MAKE THE ACTIVE REPONSE AS INVALID
497 QCP_A: MOV RH.INVK_CP,CX ; SET THE CODE PAGE IN HEADER
498 CMP CX,-1 ; TEST IF NO CP SPECIFIED?
502 QCP_0: OR BUF.STATUS,SEVEN ; Error>> NOT CODE PAGE SPECIFIED
505 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
509 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
511 LES DI,RH.REQUEST_PACKET ; AND DI TO POINT TO REQUEST PACKET
514 MOV RH.QLST_N_HDWR,CX ;
516 ADD CX,TWO ; ACCOUNT FOR LENGTH OF 'N's
518 MOV RH.QLST_LENGTH,CX ; CREATE RETURN TABLE LENGTH
527 QCP_2: MOV AX,CPD_HDWR_N[BX] ;
528 MOV RH.QLST_N_HDWR[BX],AX ;
533 QCP_3: MOV CX,CPD_DESG_N ; SET TABLE ENTRY FOR DESIGNATE
534 MOV RH.QLST_N_HDWR[BX],CX ;
541 QCP_4: MOV AX,CPD_DESG_N[SI] ;
542 MOV RH.QLST_N_HDWR[BX],AX ;
552 QCP_5: OR BUF.STATUS,SEVEN ; Error>> NO CODE PAGE INVOKED
554 QCP_6: OR BUF.STATUS,TEN ; Error>> DEVICE ERROR
557 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
559 ; GET HARDWARE CODE PAGE TABLE
564 ; SI = pointer to HARDWARE table (n,h_cp1,h_cp2,...)
566 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
568 LEA SI,CP_PNTER_TABLE ;
569 MOV SI,[SI].HDWR_CP_STRUC ;
572 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
574 ; GET DESIGNATE CODE PAGE TABLE
577 ; OUTPUT: SI = pointer to DESIGNATE table (n,d_cp1,d_cp2,...)
579 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
581 LEA SI,CP_PNTER_TABLE ;
582 MOV SI,[SI].DESG_CP_STRUC ;
585 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
587 ; GET FONT POINTER TABLE
592 ; SI = pointer to FONTS table (pnter_cp1,pnter_cp2,...)
594 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
596 LEA SI,CP_PNTER_TABLE ;
597 MOV SI,[SI].FONT_CP_STRUC ;
600 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
607 ; SI = pointer to WRITE pointers
609 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
610 GET_WRITE_PNTR PROC ;
611 LEA SI,CP_PNTER_TABLE ;
612 MOV SI,[SI].WRITE_DATA_STRUC;
614 GET_WRITE_PNTR ENDP ;
615 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
617 ; FIND ACTIVE CODE PAGE
620 ; CX = code page to find
622 ; 'CY' = 0 if found, 1 if NOT
623 ; CX = 0 for hdwr, 1 for designated
624 ; ES : DI = pointer to FONT data table
626 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
632 CALL GET_DESG_CP ; SET BX TO DESG TABLE INFO
633 MOV CX,[SI] ; GET THE NUMBER OF DESG CP's
635 JZ FCP_1 ; MOVE ONTO DESG TEST WITH 0 CP's
636 MOV BX,TWO ; ELSE, USE SI TO POINT TO 1ST CP
637 FCP_0: CMP AX,[SI+BX] ; SEARCH FOR CP MATCH
638 JE FCP_4 ; CP MATCHED!! SET DESG INFO & EXIT
639 INC BX ; ADVANCE SI POINTER TO NEXT CP
641 LOOP FCP_0 ; CHECK ACROSS ALL CP's IN TABLE
642 FCP_1: CALL GET_HDWR_CP ; NOW, REPEAT SAME OPERATION
643 MOV CX,[SI] ; WITH THE HARDWARE CP's
645 JZ FCP_3 ; IF THIS FAR, THEN SET ERROR FOR
647 INC SI ; ADVANCE POINTER BY TWO...SINCE
648 MOV BX,ZERO ; PNTER'S DON'T HAVE 'n'...
649 FCP_2: CMP AX,[SI+BX] ; SEARCH AGAIN FOR CP MATCH
650 JE FCP_5 ; CP MATCHED!! SET HDWR INFO & EXIT
651 INC BX ; ADVANCE SI POINTER TO NEXT CP
653 LOOP FCP_2 ; REPEAT FOR ALL CP ENTRIES
654 FCP_3: XOR CX,CX ; SET RETURN VALUES TO ZERO
661 FCP_4: MOV CX,ONE ; ®®DESIGNATED CODE PAGE FOUND¯¯
662 CALL GET_FONT_CP ; SET THE BX VALUE TO THE FONT DATA
663 SUB BX,2 ; NORMALIZE BX VALUE;;;;;;;;;;;;;;;
664 ADD SI,BX ; FORMULATE THE SI INDEX BY ADDING
665 ADD SI,BX ; BX INDEX x 2 (dword FONT_PNTER)
666 MOV DI,[SI] ; TAKE OFFSET DATA FROM font_table
667 MOV ES,[SI+2] ; AND SEGMENT ALSO!
673 FCP_5: XOR CX,CX ; ®®HARDWARE CODE PAGE FOUND¯¯
681 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
683 ; VERIFY_FPARSER A ROUTINE THAT CHECKS THE
684 ; FONT_BLOCKS FOR INCOMPLETE DESIGNATES?
685 ; IF SO, THEN AN ERROR OCCURRED...
688 ; FONT_PARSER should be completed parsing
691 ; CY = 0 if all is correct
692 ; 1 if one or more designates are incomplete
694 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
695 VERIFY_FPARSER PROC ;
704 MOV CX,CPD_REQ_DESG ; CX = REQUESTED DESG CP's
705 LEA DI,FTB1 ; SET DI TO POINT TO FIRST PARSING TABLE
707 VFP_4: MOV AX,[DI].FTB_STATUS ; GET STATUS OF PARSING TABLE #n
708 CMP AX,FSTAT_COMPLETE ; FIND OUT IF THIS CP COMPLETED?
711 CMP AX,FSTAT_FONT ; CHECK IF AT LEAST THE FONT DATA FOUND
712 JNE VFP_8 ; IF NOT, THEN AN ERROR OCCURRED....
713 CMP [DI].FTB_DLEFT,ZERO ; IF SO, THEN NO DATA CAN BE LEFT....
714 JNE VFP_8 ; OTHERWISE ANOTHER ERROR ?
715 VFP_6: ADD DI,TYPE FTBLK ; MOVE POINTERS TO NEXT PARSING TABLE
726 VERIFY_FPARSER ENDP ;
727 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;