1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5 ; THESE FOLLOWING ROUTINES ARE USED TO LOCATE AND LOAD
6 ; THE FONTS FOR THE SPECIFIED CODE PAGE. IT IS DESIGNED
7 ; TO WORK ON THE FOLLOWING DISPLAY ADAPTERS;
9 ; - EGA 1501200 (minimal configuration) no expansion card needed
10 ; - PC Convertible (with LCD display adapter)
11 ; - plus literally a half-dozen code-named unreleased IBM products
13 ; SUPPORT FOR THE 'CGA' (Colour Graphics Adapter) and
14 ; 'MONO' (Monochrome/Printer Adapter) IS LIMITED TO THE
15 ; HARDWARE CODE PAGE ONLY (ie. not soft-loadable devices).
23 ; if FONT_SIZE <> 0FFH
24 ; if FONT_SIZE = available
26 ; if LOAD_MECHANISM = BIOS technique
29 ; if LOAD_MECHANISM = VECTOR technique
30 ; CALL LOAD_VECTOR_CHAR
37 ; (C)Copyright 1988 Microsoft
39 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
44 ;Modification history *********************************************************
45 ;AN001; P1497 Cursor disappearance problem after codepage switch 10/9/87 J.K.
46 ;******************************************************************************
53 PUBLIC ASK_BIOS_FONT_SIZE ;
54 PUBLIC ASK_BIOS_SCAN_LINES ;
56 ROM_INT_10 DW ? ; Int 10H vector offset
57 DW ? ; Int 10H vector segment
58 ROM_INT_1F DW ? ; Int 1FH vector offset
59 DW ? ; Int 1FH vector segment
60 OLD_INT_1F DW ? ; OLD Int 1FH vector offset
61 DW ? ; OLD Int 1FH vector segment
62 ROM_INT_44 DW ? ; Int 44H vector offset
63 DW ? ; Int 44H vector segment
64 MODE_VALUE DB ? ; VALUE OF AL DURING INT 10H (AH=0)
65 BYTES_PER_CHAR DB ? ; VALUE OF BYTES/CHARACTER IN MODES
66 LOAD_MECHANISM DB ? ; SUPPORT SCHEME FOR ACTIVE MODE
67 CHARACTER_SOURCE DB ? ; FLAG TO INDICATE: 0 = HDWR
69 INVALID_MODE EQU 0FFH ;
70 MASK_BIOS_LOAD EQU 00000011b ;
71 MASK_VECTOR_LOAD EQU 00110000B ;
72 MODE_MASK EQU 01111111B ; GHG Emulator Problem
73 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
75 ; CONFIGURATION TABLES FOR CHARACTER LOADING
77 ; TABLE WILL BE FILLED IN BY INIT.ASM
79 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
81 LOAD_MECH LABEL BYTE ; RESERVE 32 MODE SETTINGS
82 DB 32 DUP(?) ; REFER TO TABLES.INC FOR DETAILS
83 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
85 ; CONFIGURATION TABLES FOR CHARACTER SIZES
87 ; TABLE WILL BE FILLED IN BY INIT.ASM
89 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
91 FONT_SIZE LABEL BYTE ; RESERVE 32 MODE SETTINGS
92 DB 32 DUP(?) ; REFER TO TABLES.INC FOR DETAILS
93 NUM_FONT_SIZES EQU ($-FONT_SIZE) ;
94 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
96 ; INTERRUPT 10H SUPPORT CODE
98 ; THE INIT ROUTINE WILL INSTALL THIS CODE INTO THE
99 ; INTERRUPT 10H VIDEO BIOS CALL. IT CHAINS TO THE
100 ; LOWER LEVEL (usually BIOS for Device Drivers).
102 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
103 INT_10_COM PROC FAR ;
105 OR AH,AH ; TEST THE SUBFUNCTION CALL=0
106 JE INT_1 ; RESERVED FOR THE COM PATH!
107 JMP DWORD PTR CS:ROM_INT_10 ;
110 PUSHF ; PREPARE FOR IRET!
111 CALL DWORD PTR CS:ROM_INT_10 ; call routine to handle the command
113 PUSH BX ; WGR ;AN000;
114 MOV AH,GET_MODE ; WGR get actual mode set ;AN000;
116 CALL DWORD PTR CS:ROM_INT_10 ; WGR ;AN000;
117 MOV CS:MODE_VALUE,AL ; SAVE MODE_VALUE BEFORE CALL
118 and CS:MODE_VALUE,mode_mask ; GHG Emulator Problem.....
121 CALL TEST_CP ; FIND OUT IF CP CAN BE SUPPORTED?
124 MOV CS:CHARACTER_SOURCE,0 ; IF AN ERROR OCCURRED IN FINDING THE
125 MOV AL,INTER_1FH ; FONT DATA INFORMATION...THEN THE
126 CALL VECTOR_LOAD ; INTERRUPT 1F hex VECTOR MUST BE
127 JUMP INT_3 ; SET TO THE HDWR CP - ELSE WRONG
128 ; DATA MAY BE DISPLAYED
129 INT_2: MOV CS:SETMODE_FLAG,OFF ; WGR ;AN000;
130 CALL INVOKE_DATA ; IF SO, THEN LOAD THE DATA
135 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
137 ; SET BLOCK SPECIFIER = 0
139 ; THIS IS USED TO ACTIVATE BLOCK = 0 FONT. THIS PERFORMS
140 ; DIFFERENT OPERATIONS ON VARIOUS DISPLAY ADAPTERS. THE
141 ; RESULTS OF WHICH ARE TO ACTIVATE THE DESIGNATED FONT.
148 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
152 MOV AX,1103H ; SET BLOCK SPECIFIER
153 MOV BL,ZERO ; CHAR GEN BLOCK SPECIFIER
154 INT 10H ; PERFORM CALL...
159 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
163 ; THE ROUTINE STARTS WITH THE FONT DATA POINTER, AND
164 ; TRIES TO FIND THE FONT RESOLUTION THAT IS NEEDED.
165 ; THIS FONT RESOLUTION IS BASED ON THE PRESENT SCREEN
166 ; MODE WHICH IS ACTIVE.
169 ; ES : DI points to beginning
172 ; ES : DI points to font data
173 ; for needed resolution
178 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
184 MOV CX,CPD_FONTS_N ; GET NUMBER OF FONT STYLES
185 FF_0: MOV AH,BYTES_PER_CHAR ; GET BYTES_PER_CHAR FOR COMPARISON
187 MOV AL,ES:[DI] ; GET #ROWS OF POINTED DATA
188 CMP AL,AH ; COMPARE BYTES_PER_CHAR AGAINST #ROWS
189 JE FF_3 ; IF MATCHED...THEN ADJUST ES:DI (CY=0)
191 PUSH CX ; ELSE, MOVE ES:DI TO NEXT FONT START
192 MOV CX,ES:[DI+4] ; GET count OF CHARACTERS IN LIST
193 XOR AH,AH ; PREPARE AX FOR MULT
194 MUL CX ; CALCULATE DELTA TO NEXT FONT START
197 ADD AX,SIX ; ADD FONT STYLE HEADER OF SIX BYTES
198 ADD DI,AX ; ADJUST THE DI POINTER
199 ; THERE CAN BE NO CARRY DUE TO STRUCTURE
200 LOOP FF_0 ; OF FONT DATA (ie. no straddling)
203 FF_3: ADD DI,SIX ; POINT TO VERY START OF DATA
204 CLC ; SET FLAG TO OK!
210 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
214 ; THIS CALL IS USED TO LOAD THE ACTIVE CP. IT LOADS
215 ; THE ACTIVE CP WHETHER IT IS DESIGNATED OR HDWR. THE
216 ; ACTUAL LOADING OF THE FONT IS PERFORMED BY THE 'EGA CLASS'
217 ; BIOS ROUTINES (different for some adapters).
220 ; AL = ? load mechanism
227 ; ES : DI points to start of font data
228 ; CX = ? count of characters to load
229 ; BH = bytes per character
234 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
235 AX_1100H EQU 00000001b ;
236 AX_1400H EQU 00000010b ;
237 EGA_INFO EQU 0487H ; ADDRESS OF INFO BYTE
238 EGA_ACTIVE EQU 00001000b ; MASK FOR EGA_ACTIVE/NON-ACTIVE
241 CALL GET_CURSOR_POS ; ONE MUST RECORD THE CURSOR POS DURING
242 ; A FONT LOAD...ELSE CURSOR TO (1,1)
246 MOV DX,ZERO ; CHARACTER OFFSET INTO TABLE
247 MOV BL,ZERO ; BLOCK TO LOAD (Block=0)
249 TEST AL,AX_1100H ; DETERMINE IF EGA_TYPE LOAD?
250 JNZ BL_00 ; IF NOT, THEN TRY FOR LCD_TYPE...
253 BL_00: PUSH BP ; SAVE REGISTERS TO BE USED
255 CMP CHARACTER_SOURCE,ZERO ; TEST IF CP = HDWR
258 MOV BP,DI ; POINTER TO USER TABLE (ES:BP)
259 MOV AX,1100H ; USER ALPHA LOAD
262 BL_0: MOV AX,1102H ; ROM 8X8 DOUBLE DOT
263 CMP BYTES_PER_CHAR,8 ;
265 BL_1: MOV AL,01H ; ROM MONOCHROME SET
266 CMP BYTES_PER_CHAR,14 ;
268 MOV AL,04H ; ROM 8X16 SET
269 CMP BYTES_PER_CHAR,16 ;
271 JUMP BL_2A ; PERFORM BIOS CALL...
273 BL_2: PUSH DS ; THIS TEST VERIFIES THAT THE EGA
274 PUSH AX ; ADAPTER IS PRESENTLY ACTIVE.
275 XOR AX,AX ; IF IT IS NOT, THEN THE EGA WILL
276 MOV DS,AX ; REPROGRAM THE ACTIVE CRT TO THE EGA
277 MOV AL,DS:EGA_INFO ; SPECIFICATION....HAZARDOUS RESULTS!
278 AND AL,EGA_ACTIVE ; MASK FOR EGA ACTIVE/NON-ACTIVE
282 JZ BL_2AA ; IF ZERO, THE EGA IS ACTIVE...AND OK!
283 STC ; ELSE, EGA IS NOT ACTIVE
286 JUMP BL_7 ; LEAVE WITH AN ERROR....
289 CMP CS:SETMODE_FLAG,OFF ; WGR MODE SET REQUIRED?.. ;AN000;
290 JE BL_2B ; WGR NO...JUMP TO CHARACTER LOAD. ;AN000;
291 PUSH AX ; WGR ;AN000;
292 PUSH DS ; WGR ;AN000;
293 XOR AX,AX ; WGR ;AN000;
294 MOV DS,AX ; WGR ;AN000;
295 PUSH DS:[VIDEO_CTRL] ; WGR ;AN000;
296 MOV AL,CS:MODE_VALUE ; WGR GET CURRENT MODE ;AN000;
297 OR AL,NOT MODE_MASK ; WGR MODE SET WITHOUT BUFFER CLEARED ;AN000;
299 call Info_Ansi_ModeSet ;J.K.Tell ANSI that DISPLAY.SYS is going to call INT 10h, SET MODE function.
301 XOR AH,AH ; WGR MODE SET CALL.. ;AN000;
303 CALL DWORD PTR CS:ROM_INT_10 ; WGR ;AN000;
305 call Info_Ansi_ModeDone ;J.K.Tell ANSI that it is through.
307 POP DS:[VIDEO_CTRL] ; WGR ;AN000;
310 BL_2B: ; WGR WAS ISSUED (BY ME) ;AN000;
311 OR AX,CS:RE_CALC ; WGR INCASE RECALC IS NEEDED. ;AN000;
313 ;AN001; EGA ROM BIOS has a bug when AX=1110h, INT 10h is issued.
314 ; Cursor type is changed to 0C0Dh which causes the cursor to
316 ; We are going to set Cursor type back to 0607h for EGA.
318 cmp ax, 1110h ;AN001;
319 jne Skip_Cursor_Problem ;AN001;
322 mov cx, 0607h ;AN001;
327 MOV CS:RE_CALC,OFF ; WGR RESET RE_CALC VALUE ;AN000;
328 CALL SET_BLOCK_SP0 ; AND THEN SET_BLOCK_SPECIFIER (0)
332 BL_3: TEST AL,AX_1400H ;
335 PUSH AX ; SAVE INDICATOR
337 CMP CHARACTER_SOURCE,ZERO ; TEST IF CP = HDWR
340 MOV AX,1400H ; LOAD USER SPECIFIED FONT
343 BL_4: MOV AX,1401H ; ASK FOR ROM LOAD FONT
345 BL_5: INT 10H ; PERFORM THE LOAD!
346 CALL SET_BLOCK_SP0 ; AND ALSO DO THE SET BLOCK SPECIFIER
353 CALL SET_CURSOR_POS ; RESTORE THE CURSOR POSITION
356 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
360 ; THIS ROUTINE IS DESIGNED TO MAKE USE OF THE NEW BIOS
361 ; CALL IN THE '???????' AND FOLLOW-ONS. REFER TO THE
362 ; 'Personal Systems Architecture' DCR #405 (written
363 ; by DD). IF THIS SUPPORT IS NOT FOUND ON THE
364 ; DISPLAY ADAPTER, THEN THE CARRY FLAG IS SET!
372 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
373 RETURN_INFO LABEL BYTE ;
374 DW ? ; OFFSET TO STATIC FUNCTIONALITY INFO
375 DW ? ; SEGMENT TO STATIC FUNCTIONALITY INFO
377 DW ? ; COLUMNS ON SCREEN
378 DW ? ; LEN OF REGEN BUFFER
379 DW ? ; START ADDRESS IN REGEN BUFFER
380 DW ? ; CURSOR POSITION OF PAGE #0
381 DW ? ; CURSOR POSITION OF PAGE #1
382 DW ? ; CURSOR POSITION OF PAGE #2
383 DW ? ; CURSOR POSITION OF PAGE #3
384 DW ? ; CURSOR POSITION OF PAGE #4
385 DW ? ; CURSOR POSITION OF PAGE #5
386 DW ? ; CURSOR POSITION OF PAGE #6
387 DW ? ; CURSOR POSITION OF PAGE #7
388 DW ? ; CURSOR MODE SETTING
389 DB ? ; ACTIVE DISPLAY PAGE
390 DW ? ; CRT CONTROLLER ADDRESS
393 DB ? ; ROWS ON SCREEN
395 DW ? ; CHARACTER HEIGHT
396 DB ? ; DISPLAY COMBINATION (ACTIVE)
397 DB ? ; DISPLAY COMBINATION (ALTERNATE)
398 L_RET_INFO EQU ($-RETURN_INFO) ;
399 DB (40h-L_RET_INFO) DUP (?) ; REMAINING DATA....
402 DB ? ; VIDEO MODES (part 1)
403 DB ? ; VIDEO MODES (part 2)
404 DB ? ; VIDEO MODES (part 3)
409 SI_LINE DB ? ; SCAN LINES AVAILABLE IN TEXT MODES
418 MOV AX,1B00H ; BIOS CALL FOR 'EGA +' INFORMATION
420 MOV DI,OFFSET RETURN_INFO ; SETUP THE RETURN ADDRESS (above)
425 CMP AL,1BH ; IF AL <> 1BH, THEN ADAPTER DOES
426 JNZ ABI_3 ; NOT SUPPORT THIS CALL...EXIT w/ERROR
428 JUMP ABI_4 ; ELSE, LEAVE w/o ERROR
429 ; WITH THE TABLE ALL FILLED IN....
437 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
441 ; THIS ROUTINE RETURNS THE PRESENT FONT RESOLUTION.
442 ; IT IS SUPPORTED VIA THE ENHANCED INT 10H BIOS CALL.
443 ; REFER TO THE 'ASK_BIOS_INFO' FOR DETAILS.
448 ; AL = bytes/character
450 ; 1 if not supported (and AL = unchanged)
452 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
453 ASK_BIOS_FONT_SIZE PROC ;
459 CMP AL,ZERO ; PERFORM CHECK FOR BIOS ERROR!
466 ASK_BIOS_FONT_SIZE ENDP ;
467 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
469 ; ASK_BIOS_SCAN_LINES
471 ; THIS IS SIMILAR TO THE ASK_BIOS_FONT_SIZE, EXCEPT IT
472 ; WILL RETURN THE AVAILABLE VERTICAL SCAN LINES FOR ALL
473 ; TEXT MODES. REFER TO REFERENCED DCR #405.
478 ; AL = encoded SCAN LINES (in text modes)
482 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
483 ASK_BIOS_SCAN_LINES PROC ;
484 CALL ASK_BIOS_INFO ; ASK BIOS FOR DETAILED INFO...
485 JC ABSL_0 ; IF CY = 1, THEN BIOS NOT SMART ENOUGH!
489 LEA SI,RETURN_INFO ; GET POINTERS TO STATIC TABLE....
490 MOV BX,CS:[SI+2] ; GET STATIC INFO SEGMENT
492 MOV SI,CS:[SI] ; GET STATIC INFO OFFSET
493 MOV AL,ES:[SI].SI_LINE ; THEN, FINALLY THE ENCODED SCAN_LINES
498 ASK_BIOS_SCAN_LINES ENDP ;
499 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
503 ; THIS ROUTINE WORKS SIMILARLY TO THE BIOS_LOAD, EXCEPT THAT
504 ; THE FONT SUPPORT IS LOADED VIA A VECTOR MECHANISM...RATHER
505 ; THAN USING BIOS. THE BIOS_LOAD METHOD IS USED EXCLUSIVELY
506 ; FOR TEXT MODES ONLY....WHILE THE VECTOR_LOAD IS FOR APA
507 ; (all points addressable).
509 ; THE VECTOR SUPPORT IS BASED ON THE INTERRUPT VECTORS 1F hex
510 ; AND 43 hex. THE INTERRUPT 1F hex HAS SPECIAL CONSIDERATIONS
511 ; DUE TO THE 'GRAFTABL.COM' PROGRAM PROVIDED ON DOS. REFER
512 ; TO THE 'CPS DESIGN DOCUMENT' (written by IBM Canada Lab) FOR
516 ; AL = ? load mechanism
520 ; � ����������� 1 = INT 1FH
521 ; ������������� 1 = INT 43H
522 ; 1 = int 1FH special handling
525 ; ES : DI points to start of font data
526 ; CX = ? count of characters to load
527 ; BH = bytes per character
531 ; ***********************************************************
532 ; ************** SCHEDULED FOR OPTIMIZATION *****************
533 ; ***********************************************************
535 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
537 INTER_43H EQU 00100000b ;
538 INTER_1FH EQU 00010000b ;
539 LCD_1FH EQU 01000000b ;
540 INTER_44H EQU 10000000b ;
543 TEST AL,INTER_1FH ; CHECK IF ANY INTERRUPT 1FH PROCESSING
544 JNZ VL_00 ; IS NEEDED.
545 JUMP VL_3 ; IS NEEDED.
547 VL_00: MOV CS:VECTOR_MODE,AL ;
548 PUSH AX ; SAVE AX REGISTER....
549 MOV AX,0B000H ; INTERFACE CALL TO GRAFTABL TO SEE
550 INT 2FH ; IF SUPPORT IS LOADED.
551 CMP AL,0FFH ; IF SO, THEN EXIT!
552 POP AX ; RESTORE AX REGISTER..
553 JNE VL_2AA ; IF NOT 0FFH=AL, THEN NOT LOADED!
554 JUMP VL_3 ; EXIT, GRAFTABL HAS CONTROL
556 VL_2AA: CMP CHARACTER_SOURCE,0 ; TEST IF CP = HDWR
563 MOV AX,DI ; PUT DI INTO AX FOR ADJUSTMENT
567 MOV DS:WORD PTR INT_1F_LOW,AX; SET THE HIGH 128 CHARACTERS
568 MOV DS:WORD PTR INT_1F_HI,ES;
570 MOV CS:OLD_INT_1F,AX ; SAVE VALUE TO INTERNAL STORAGE
571 MOV CS:OLD_INT_1F+2,ES ;
576 VL_1: TEST CS:VECTOR_MODE,LCD_1FH ; CHECK IF LCD ACTIVE
579 PUSH DS ; SET INT 44 hex WITH HDWR CP
585 MOV DI,CS:ROM_INT_1F ;
586 MOV DS:WORD PTR INT_1F_LOW,DI; SET NEW VECTOR
587 MOV CS:OLD_INT_1F,DI ; SAVE VALUE TO INTERNAL STORAGE
588 MOV DI,CS:ROM_INT_1F+2 ;
589 MOV DS:WORD PTR INT_1F_HI,DI;
590 MOV CS:OLD_INT_1F+2,DI ;
597 VL_11A: PUSH ES ; SET INT 1F hex WITH HDWR CP
604 MOV AX,1130H ; GET EGA INFORMATION
605 MOV BH,4 ; GET ROM DOUBLE DOT PTR (TOP)
610 MOV DS:WORD PTR INT_1F_LOW,BP; SET THE HIGH 128 CHARACTERS
611 MOV DS:WORD PTR INT_1F_HI,ES;
613 MOV CS:OLD_INT_1F,BP ; SAVE VALUE TO INTERNAL STORAGE
614 MOV CS:OLD_INT_1F+2,ES ;
623 VL_3: TEST AL,INTER_43H ;
626 CMP CHARACTER_SOURCE,0 ; TEST IF CP = HDWR
629 PUSH DS ; SET INT 43 hex WITH USER TABLE
634 MOV DS:WORD PTR INT_43_LOW,DI;
635 MOV DS:WORD PTR INT_43_HI,ES;
641 VL_5: PUSH BX ; SET INT 43 hex WITH HDWR CP
642 MOV BH,3 ; RETURN ROM DOUBLE DOT PTR
643 CMP BYTES_PER_CHAR,8 ; WORK FOR HARDWARE CP's
646 MOV BH,2 ; RETURN ROM 8X14 PTR
647 CMP BYTES_PER_CHAR,14 ;
649 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
650 ; THIS IS BH=6 (??????? WAS IN ERROR). THE ?????? HAS
651 ; THE LATEST FIX SUPPORT.
653 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
654 MOV BH,6 ; SET FOR ROM 8X16 PTR
655 CMP BYTES_PER_CHAR,16 ;
658 VL_6: PUSH AX ; YES, ONCE AGAIN, SAVE THOSE REG'ies
664 MOV AX,1130H ; GET EGA INFORMATION (PTR=ES:DI)
669 MOV DS:WORD PTR INT_43_LOW,BP; SET THE FULL CHARACTER SET
670 MOV DS:WORD PTR INT_43_HI,ES;
680 VL_8: TEST AL,INTER_44H ; Test for INTERRUPT 44 Hex
683 CMP CHARACTER_SOURCE,0 ; TEST IF CP = HDWR
686 PUSH DS ; SET INT 43 hex WITH USER TABLE
691 MOV DS:WORD PTR INT_44_LOW,DI;
692 MOV DS:WORD PTR INT_44_HI,ES;
698 VL_8A: PUSH DS ; SET INT 44 hex WITH HDWR CP
704 MOV DI,CS:ROM_INT_44 ;
705 MOV DS:WORD PTR INT_44_LOW,DI;
706 MOV DI,CS:ROM_INT_44+2 ;
707 MOV DS:WORD PTR INT_44_HI,DI;
715 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
719 ; This routine is called by INVOKE_DATA and
720 ; by the INT_10H code.
723 ; CP_ES points to the final CP data segment
724 ; CP_DI points to the final CP data offset
726 ; CY = 0 if no error detected
727 ; 1 if error occurred
728 ; AX = 0000 if hardware code page matched
729 ; AX = 0001 if routine is presently busy
731 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
734 LOAD_CP_SEMA DB 0 ; SEMAPHORE TO TELL IF ROUTINE IS
737 ANSI_BUFFER LABEL BYTE ; WGR BUFFER FOR ANSI ;AN000;
738 DB ZERO ; WGR INFO LEVEL ;AN000;
739 DB ZERO ; WGR ;AN000;
740 DW ANSI_BUF_SIZE ; WGR LENGTH OF DATA ;AN000;
741 DW ? ; WGR CONTROL FLAGS ;AN000;
742 D_MODE LABEL BYTE ; WGR DISPLAY MODE ;AN000;
744 DB ? ; WGR RESERVED ;AN000;
745 DW ? ; WGR COLORS ;AN000;
746 DW ? ; WGR WIDTH ;AN000;
747 DW ? ; WGR LENGTH ;AN000;
748 DW ? ; WGR COLUMNS ;AN000;
749 SCR_ROWS LABEL WORD ; WGR ROWS ;AN000;
752 RE_CALC DW OFF ; WGR VALUE TO OR IN CHARACTER LOAD ;AN000;
753 SETMODE_FLAG DB OFF ; WGR FLAG INDICATING A MODE SET IS REQUIRED ;AN000;
756 CMP CS:LOAD_CP_SEMA,ZERO ; TEST IF ALREADY ACTIVE!
758 STC ; IF ALREADY ACTIVE, THEN SET ERROR
759 MOV AX,ONE ; TO INDICATE THAT ACTIVE....
762 I10_0: MOV CS:LOAD_CP_SEMA,ONE ; SET ROUTINE NOW ACTIVE...
765 PUSH DX ; WGR ;AN000;
772 POP DS ; SETUP DS SEGMENT TO CS
774 POP ES ; SETUP ES SEGMENT TO CS
776 XOR AH,AH ; AH=0 FOR MODE SET, AL=MODE_TYPE
778 MOV SI,AX ; ESTABLISH INDEX INTO LOAD_MECH table
779 MOV AL,[SI].FONT_SIZE ; GET FONT_SIZE FOR THIS MODE_VALUE
780 OR AL,AL ; TEST FOR MODE_VALUE=0
783 CALL ASK_BIOS_FONT_SIZE ; GET BIOS TO INDICATE FONT_SIZE
784 JC I10_A ; IF CY=1 THEN ERROR OCCURRED
786 I10_2: PUSH AX ; WGR SAVE FONT SIZE ;AN000;
787 MOV Ah,ANSI_2F ; WGR REQUEST TO ANSI FOR SCREEN SIZE ;AN000;
788 mov al,IOCTL_2F ; IOCTL request
789 MOV CL,GET_SUBFUNC ; WGR GET CHARACTERISTICS FUNCTION ;AN000;
790 LEA DX,ANSI_BUFFER ; WGR BUFFER FOR REQUEST STORAGE ;AN000;
791 INT 2FH ; WGR ;AN000;
792 JC I10_3 ; WGR IF CARRY THEN ERROR..CONT AS BEFORE ;AN000;
793 CMP AL,16H ; WGR ENSURE THAT ANSI WAS THERE.. ;AN000;
794 JNE I10_3 ; WGR NO....CONT AS BEFORE ;AN000;
795 CMP D_MODE,ON ; WGR ARE WE IN A TEXT MODE? ;AN000;
796 JNE I10_3 ; WGR NO...CONT AS BEFORE.. ;AN000;
797 CMP SCR_ROWS,DEFAULT_LEN ; WGR IS IT JUST 25 LINES?.. ;AN000;
798 JE I10_3 ; WGR THEN...CONT AS BEFORE.. ;AN000;
799 POP AX ; WGR GREATER THAN 25 LINES SO...POP OFF.. ;AN000;
800 MOV CS:RE_CALC,RECALC_ON ; WGR RECALCULATION REQUIRED ;AN000;
801 MOV CS:SETMODE_FLAG,ON ; WGR A MODE SET IS REQUIRED ;AN000;
802 MOV AL,EIGHT ; WGR OLD FONT SIZE AND USE AN 8 HIGH BOX. ;AN000;
803 JMP I10_4 ; WGR ;AN000;
805 I10_3: POP AX ; WGR RESTORE OLD VALUE ;AN000;
806 MOV CS:SETMODE_FLAG,OFF ; WGR NO MODE SET IS REQUIRED. ;AN000;
808 I10_4: MOV BYTES_PER_CHAR,AL ; SAVE VALUE DETERMINED
811 CMP CX,-1 ; CHECK IF ACTIVE CP=PLACE_HOLDER
812 JE I10_A ; IF SO, THEN STAY SLEEPING
815 CALL FIND_CP ; DETERMINE IF THE CODE PAGE=HDWR
817 POP CX ; RESTORE CP VALUE FOR FUTURE REF
819 MOV CHARACTER_SOURCE,BL ;
820 OR BL,BL ; TEST TYPE OF CP?
821 JE I10_B ; IF CODE PAGE=HDWR THEN RESOLUTION OK!
823 CALL FIND_FONT ; CHECK IF THE FONT RESOLUTION IS HERE
824 JC I10_A ; IF CY=0 THEN ES:DI POINT TO FONT
839 MOV CS:LOAD_CP_SEMA,ZERO ; SET ROUTINE NOW COMPLETED....
842 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
846 ; THIS ROUTINE PERFORMS THE LOADING OF THE CODE PAGE
847 ; INFORMATION. IT USES THE POINTERS FROM THE TEST_CP
851 ; CP_ES points to the actual data of CP segment
852 ; CP_DI points to the actual data of CP offset
854 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
863 MOV DI,CS:CP_ES ; GET THE ES:DI COMBO FROM TEST_CP
868 MOV AL,MODE_VALUE ; CREATE INDEX TO GET LOAD_MECH
870 MOV AL,[SI].LOAD_MECH ;
871 MOV LOAD_MECHANISM,AL ; SAVE THIS VALUE FOR OTHER ROUTINES
872 TEST AL,MASK_BIOS_LOAD ; FIND OUT IF INT 10H SUPPORTS
875 MOV CX,256 ; **** HARD CODED COUNT ****
876 MOV BH,BYTES_PER_CHAR ;
877 CALL BIOS_LOAD ; GET BIOS CODE TO GIVE THE CP SUPPORT
880 INV_7: TEST AL,MASK_VECTOR_LOAD ;
883 CALL VECTOR_LOAD ; ESTABLISH THE VECTORS FOR CP SUPPORT
898 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
900 ; GET_CURSOR_POSITION
902 ; This routine is called by BIOS_LOAD. It is used
903 ; to ask for the cursor position before a character
904 ; download...since BIOS puts the cursor to (1,1).
911 ; DX = cursor position
914 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
918 GET_CURSOR_POS PROC ;
924 MOV AH,15 ; CALL TO GET CURRENT_VIDEO_STATE
926 CALL DWORD PTR CS:ROM_INT_10 ; call routine to handle the command
931 CALL DWORD PTR CS:ROM_INT_10 ; call routine to handle the command
939 GET_CURSOR_POS ENDP ;
940 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
942 ; SET_CURSOR_POSITION
944 ; This routine is called by BIOS_LOAD. It is used
945 ; to tell BIOS where to put the cursor.
949 ; DX = cursor position
953 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
954 SET_CURSOR_POS PROC ;
963 CALL DWORD PTR CS:ROM_INT_10 ; call routine to handle the command
969 SET_CURSOR_POS ENDP ;
971 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
977 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
978 Info_Ansi_ModeSet proc near
987 mov [si].DA_SETMODE_FLAG, 1 ;Tell ANSI we are calling int10h, Set Mode funciton
991 int 2fh ;We don't worry about whether ANSI installed or not.
998 Info_Ansi_ModeSet endp
1000 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1001 ; Info_Ansi_ModeDone
1006 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1007 Info_Ansi_ModeDone proc near
1015 lea si, ANSI_DA_INFO
1016 mov [si].DA_SETMODE_FLAG, 0 ;Tell ANSI we are done with int10h, Set Mode funciton
1020 int 2fh ;We don't worry about whether ANSI installed or not.
1027 Info_Ansi_ModeDone endp
1029 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;