]> wirehaze git hosting - MS-DOS.git/blob - v4.0/src/DEV/DISPLAY/INT10COM.INC

wirehaze git hosting

MZ is back!
[MS-DOS.git] / v4.0 / src / DEV / DISPLAY / INT10COM.INC
1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2 ;
3 ; INT10COM.INC
4 ;
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;
8 ;
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
12 ;
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).
16 ;
17 ; PSEUDO CODE:
18 ; ===========
19 ; INT_10_PROC STARTS
20 ; GET MODE (AL=?)
21 ; CALL rom_int_10
22 ; GET FONT_SIZE
23 ; if FONT_SIZE <> 0FFH
24 ; if FONT_SIZE = available
25 ; GET LOAD_MECHANISM
26 ; if LOAD_MECHANISM = BIOS technique
27 ; CALL LOAD_BIOS_CHAR
28 ; endif
29 ; if LOAD_MECHANISM = VECTOR technique
30 ; CALL LOAD_VECTOR_CHAR
31 ; endif
32 ; endif
33 ; endif
34 ; IRET
35 ; INT_10_PROC ENDS
36 ;
37 ; (C)Copyright 1988 Microsoft
38 ;
39 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
40 IF1 ;
41 %OUT . �INT10COM.INC�
42 ENDIF
43
44 ;Modification history *********************************************************
45 ;AN001; P1497 Cursor disappearance problem after codepage switch 10/9/87 J.K.
46 ;******************************************************************************
47 PUBLIC MODE_VALUE ;
48 PUBLIC ROM_INT_10 ;
49 PUBLIC ROM_INT_1F ;
50 PUBLIC OLD_INT_1F ;
51 PUBLIC ROM_INT_44 ;
52 PUBLIC INT_10_COM ;
53 PUBLIC ASK_BIOS_FONT_SIZE ;
54 PUBLIC ASK_BIOS_SCAN_LINES ;
55 ;
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
68 ; 1 = DESG
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 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
74 ;
75 ; CONFIGURATION TABLES FOR CHARACTER LOADING
76 ;
77 ; TABLE WILL BE FILLED IN BY INIT.ASM
78 ;
79 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
80 PUBLIC LOAD_MECH ;
81 LOAD_MECH LABEL BYTE ; RESERVE 32 MODE SETTINGS
82 DB 32 DUP(?) ; REFER TO TABLES.INC FOR DETAILS
83 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
84 ;
85 ; CONFIGURATION TABLES FOR CHARACTER SIZES
86 ;
87 ; TABLE WILL BE FILLED IN BY INIT.ASM
88 ;
89 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
90 PUBLIC FONT_SIZE ;
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 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
95 ;
96 ; INTERRUPT 10H SUPPORT CODE
97 ;
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).
101 ;
102 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
103 INT_10_COM PROC FAR ;
104 STI ;
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 ;
108 ;
109 INT_1: ;
110 PUSHF ; PREPARE FOR IRET!
111 CALL DWORD PTR CS:ROM_INT_10 ; call routine to handle the command
112 PUSH AX ;
113 PUSH BX ; WGR ;AN000;
114 MOV AH,GET_MODE ; WGR get actual mode set ;AN000;
115 PUSHF ; WGR ;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.....
119 POP BX ; WGR ;AN000;
120 ;
121 CALL TEST_CP ; FIND OUT IF CP CAN BE SUPPORTED?
122 JNC INT_2 ;
123 ;
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
131 INT_3: POP AX ;
132 ;
133 IRET ;
134 INT_10_COM ENDP ;
135 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
136 ;
137 ; SET BLOCK SPECIFIER = 0
138 ;
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.
142 ;
143 ; INPUT:
144 ; none
145 ; OUTPUT:
146 ; none
147 ;
148 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
149 SET_BLOCK_SP0 PROC ;
150 PUSH AX ;
151 PUSH BX ;
152 MOV AX,1103H ; SET BLOCK SPECIFIER
153 MOV BL,ZERO ; CHAR GEN BLOCK SPECIFIER
154 INT 10H ; PERFORM CALL...
155 POP BX ;
156 POP AX ;
157 RET ;
158 SET_BLOCK_SP0 ENDP ;
159 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
160 ;
161 ; FIND_FONT
162 ;
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.
167 ;
168 ; INPUT:
169 ; ES : DI points to beginning
170 ; of font data
171 ; OUTPUT:
172 ; ES : DI points to font data
173 ; for needed resolution
174 ; CY = 0 if found
175 ; = 1 if not found
176 ;
177 ; DS = CS assumed
178 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
179 FIND_FONT PROC ;
180 PUSH AX ;
181 PUSH CX ;
182 PUSH DX ;
183 ;
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
186 ;
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)
190 ;
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
195 POP CX ;
196 ;
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)
201 STC ;
202 JUMP FF_4 ;
203 FF_3: ADD DI,SIX ; POINT TO VERY START OF DATA
204 CLC ; SET FLAG TO OK!
205 FF_4: POP DX ;
206 POP CX ;
207 POP AX ;
208 RET ;
209 FIND_FONT ENDP ;
210 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
211 ;
212 ; BIOS_LOAD
213 ;
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).
218 ;
219 ; INPUT:
220 ; AL = ? load mechanism
221 ;
222 ; 7 6 5 4 3 2 1 0
223 ; 0 0 0 0 0 0 x x
224 ; � ��� 1 - AX=1100H
225 ; ����� 1 = AX=1400H
226 ;
227 ; ES : DI points to start of font data
228 ; CX = ? count of characters to load
229 ; BH = bytes per character
230 ; DS = CS assumed...
231 ;
232 ; OUTPUT:
233 ; none
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
239 ;
240 BIOS_LOAD PROC ;
241 CALL GET_CURSOR_POS ; ONE MUST RECORD THE CURSOR POS DURING
242 ; A FONT LOAD...ELSE CURSOR TO (1,1)
243 PUSH BX ;
244 PUSH DX ;
245 ;
246 MOV DX,ZERO ; CHARACTER OFFSET INTO TABLE
247 MOV BL,ZERO ; BLOCK TO LOAD (Block=0)
248 ;
249 TEST AL,AX_1100H ; DETERMINE IF EGA_TYPE LOAD?
250 JNZ BL_00 ; IF NOT, THEN TRY FOR LCD_TYPE...
251 JMP BL_3 ;
252 ;
253 BL_00: PUSH BP ; SAVE REGISTERS TO BE USED
254 PUSH AX ;
255 CMP CHARACTER_SOURCE,ZERO ; TEST IF CP = HDWR
256 JE BL_0 ;
257 ;
258 MOV BP,DI ; POINTER TO USER TABLE (ES:BP)
259 MOV AX,1100H ; USER ALPHA LOAD
260 JUMP BL_2 ;
261 ;
262 BL_0: MOV AX,1102H ; ROM 8X8 DOUBLE DOT
263 CMP BYTES_PER_CHAR,8 ;
264 JE BL_2 ;
265 BL_1: MOV AL,01H ; ROM MONOCHROME SET
266 CMP BYTES_PER_CHAR,14 ;
267 JE BL_2 ;
268 MOV AL,04H ; ROM 8X16 SET
269 CMP BYTES_PER_CHAR,16 ;
270 JE BL_2 ;
271 JUMP BL_2A ; PERFORM BIOS CALL...
272 ;
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
279 POP AX ;
280 POP DS ;
281 ;
282 JZ BL_2AA ; IF ZERO, THE EGA IS ACTIVE...AND OK!
283 STC ; ELSE, EGA IS NOT ACTIVE
284 POP AX ;
285 POP BP ; AND WE MUST
286 JUMP BL_7 ; LEAVE WITH AN ERROR....
287 ;
288 BL_2AA:
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;
298
299 call Info_Ansi_ModeSet ;J.K.Tell ANSI that DISPLAY.SYS is going to call INT 10h, SET MODE function.
300
301 XOR AH,AH ; WGR MODE SET CALL.. ;AN000;
302 PUSHF ; WGR ;AN000;
303 CALL DWORD PTR CS:ROM_INT_10 ; WGR ;AN000;
304
305 call Info_Ansi_ModeDone ;J.K.Tell ANSI that it is through.
306
307 POP DS:[VIDEO_CTRL] ; WGR ;AN000;
308 POP DS ; WGR ;AN000;
309 POP AX ; WGR ;AN000;
310 BL_2B: ; WGR WAS ISSUED (BY ME) ;AN000;
311 OR AX,CS:RE_CALC ; WGR INCASE RECALC IS NEEDED. ;AN000;
312 INT 10H ;
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
315 ; disappear!!!
316 ; We are going to set Cursor type back to 0607h for EGA.
317
318 cmp ax, 1110h ;AN001;
319 jne Skip_Cursor_Problem ;AN001;
320 push cx ;AN001;
321 mov ah, 1 ;AN001;
322 mov cx, 0607h ;AN001;
323 int 10h ;AN001;
324 pop cx ;AN001;
325
326 Skip_Cursor_Problem:
327 MOV CS:RE_CALC,OFF ; WGR RESET RE_CALC VALUE ;AN000;
328 CALL SET_BLOCK_SP0 ; AND THEN SET_BLOCK_SPECIFIER (0)
329 BL_2A: POP AX ;
330 POP BP ;
331 ;
332 BL_3: TEST AL,AX_1400H ;
333 JZ BL_6 ;
334 ;
335 PUSH AX ; SAVE INDICATOR
336 ;
337 CMP CHARACTER_SOURCE,ZERO ; TEST IF CP = HDWR
338 JE BL_4 ;
339 ;
340 MOV AX,1400H ; LOAD USER SPECIFIED FONT
341 JUMP BL_5 ;
342 ;
343 BL_4: MOV AX,1401H ; ASK FOR ROM LOAD FONT
344 MOV BL,ZERO ;
345 BL_5: INT 10H ; PERFORM THE LOAD!
346 CALL SET_BLOCK_SP0 ; AND ALSO DO THE SET BLOCK SPECIFIER
347 POP AX ;
348 ;
349 BL_6: CLC ;
350 BL_7: POP DX ;
351 POP BX ;
352 ;
353 CALL SET_CURSOR_POS ; RESTORE THE CURSOR POSITION
354 RET ;
355 BIOS_LOAD ENDP ;
356 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
357 ;
358 ; ASK_BIOS_INFO
359 ;
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!
365 ;
366 ; INPUT:
367 ; none
368 ; OUTPUT:
369 ; CY = 0 if found
370 ; 1 if not supported
371 ;
372 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
373 RETURN_INFO LABEL BYTE ;
374 DW ? ; OFFSET TO STATIC FUNCTIONALITY INFO
375 DW ? ; SEGMENT TO STATIC FUNCTIONALITY INFO
376 DB ? ; VIDEO MODE
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
391 DB ? ; CRT_MODE_SET
392 DB ? ; CRT_PALETTE
393 DB ? ; ROWS ON SCREEN
394 CHAR_H LABEL WORD ;
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....
400 ;
401 STATIC_INFO STRUC ;
402 DB ? ; VIDEO MODES (part 1)
403 DB ? ; VIDEO MODES (part 2)
404 DB ? ; VIDEO MODES (part 3)
405 DB ? ; RESERVED
406 DB ? ; RESERVED
407 DB ? ; RESERVED
408 DB ? ; RESERVED
409 SI_LINE DB ? ; SCAN LINES AVAILABLE IN TEXT MODES
410 STATIC_INFO ENDS ;
411 ;
412 ASK_BIOS_INFO PROC ;
413 PUSH ES ;
414 PUSH DI ;
415 PUSH BX ;
416 PUSH AX ;
417 ;
418 MOV AX,1B00H ; BIOS CALL FOR 'EGA +' INFORMATION
419 MOV BX,0 ;
420 MOV DI,OFFSET RETURN_INFO ; SETUP THE RETURN ADDRESS (above)
421 PUSH CS ;
422 POP ES ;
423 INT 10H ;
424 ;
425 CMP AL,1BH ; IF AL <> 1BH, THEN ADAPTER DOES
426 JNZ ABI_3 ; NOT SUPPORT THIS CALL...EXIT w/ERROR
427 CLC ;
428 JUMP ABI_4 ; ELSE, LEAVE w/o ERROR
429 ; WITH THE TABLE ALL FILLED IN....
430 ABI_3: STC ;
431 ABI_4: POP AX ;
432 POP BX ;
433 POP DI ;
434 POP ES ;
435 RET ;
436 ASK_BIOS_INFO ENDP ;
437 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
438 ;
439 ; ASK_BIOS_FONT_SIZE
440 ;
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.
444 ;
445 ; INPUT:
446 ; none
447 ; OUTPUT:
448 ; AL = bytes/character
449 ; CY = 0 if found
450 ; 1 if not supported (and AL = unchanged)
451 ;
452 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
453 ASK_BIOS_FONT_SIZE PROC ;
454 PUSH BX ;
455 CALL ASK_BIOS_INFO ;
456 JC ABFS_1 ;
457 MOV BX,CHAR_H ;
458 MOV AL,BL ;
459 CMP AL,ZERO ; PERFORM CHECK FOR BIOS ERROR!
460 JNZ ABFS_0 ;
461 STC ;
462 JUMP ABFS_1 ;
463 ABFS_0: CLC ;
464 ABFS_1: POP BX ;
465 RET ;
466 ASK_BIOS_FONT_SIZE ENDP ;
467 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
468 ;
469 ; ASK_BIOS_SCAN_LINES
470 ;
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.
474 ;
475 ; INPUT:
476 ; none
477 ; OUTPUT:
478 ; AL = encoded SCAN LINES (in text modes)
479 ; CY = 0 if found
480 ; 1 if not supported
481 ;
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!
486 PUSH BX ;
487 PUSH SI ;
488 PUSH ES ;
489 LEA SI,RETURN_INFO ; GET POINTERS TO STATIC TABLE....
490 MOV BX,CS:[SI+2] ; GET STATIC INFO SEGMENT
491 MOV ES,BX ; &
492 MOV SI,CS:[SI] ; GET STATIC INFO OFFSET
493 MOV AL,ES:[SI].SI_LINE ; THEN, FINALLY THE ENCODED SCAN_LINES
494 POP ES ;
495 POP SI ;
496 POP BX ;
497 ABSL_0: RET ;
498 ASK_BIOS_SCAN_LINES ENDP ;
499 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
500 ;
501 ; VECTOR_LOAD
502 ;
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).
508 ;
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
513 ; DETAILS.
514 ;
515 ; INPUT:
516 ; AL = ? load mechanism
517 ;
518 ; 7 6 5 4 3 2 1 0
519 ; x x x x 0 0 0 0
520 ; � ����������� 1 = INT 1FH
521 ; ������������� 1 = INT 43H
522 ; 1 = int 1FH special handling
523 ;
524 ;
525 ; ES : DI points to start of font data
526 ; CX = ? count of characters to load
527 ; BH = bytes per character
528 ;
529 ; DS = CS assumed
530 ;
531 ; ***********************************************************
532 ; ************** SCHEDULED FOR OPTIMIZATION *****************
533 ; ***********************************************************
534 ;
535 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
536 VECTOR_MODE DB ? ;
537 INTER_43H EQU 00100000b ;
538 INTER_1FH EQU 00010000b ;
539 LCD_1FH EQU 01000000b ;
540 INTER_44H EQU 10000000b ;
541 ;
542 VECTOR_LOAD PROC ;
543 TEST AL,INTER_1FH ; CHECK IF ANY INTERRUPT 1FH PROCESSING
544 JNZ VL_00 ; IS NEEDED.
545 JUMP VL_3 ; IS NEEDED.
546 ;
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
555 ;
556 VL_2AA: CMP CHARACTER_SOURCE,0 ; TEST IF CP = HDWR
557 JE VL_1 ;
558 ;
559 PUSH DS ;
560 PUSH AX ;
561 XOR AX,AX ;
562 MOV DS,AX ;
563 MOV AX,DI ; PUT DI INTO AX FOR ADJUSTMENT
564 ADD AX,8*128 ;
565 ;
566 CLI ;
567 MOV DS:WORD PTR INT_1F_LOW,AX; SET THE HIGH 128 CHARACTERS
568 MOV DS:WORD PTR INT_1F_HI,ES;
569 STI ;
570 MOV CS:OLD_INT_1F,AX ; SAVE VALUE TO INTERNAL STORAGE
571 MOV CS:OLD_INT_1F+2,ES ;
572 POP AX ;
573 POP DS ;
574 JUMP VL_3 ;
575 ;
576 VL_1: TEST CS:VECTOR_MODE,LCD_1FH ; CHECK IF LCD ACTIVE
577 JZ VL_11A ;
578 ;
579 PUSH DS ; SET INT 44 hex WITH HDWR CP
580 PUSH DI ;
581 PUSH AX ;
582 XOR AX,AX ;
583 MOV DS,AX ;
584 CLI ;
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 ;
591 STI ;
592 POP AX ;
593 POP DI ;
594 POP DS ;
595 JUMP VL_3 ;
596 ;
597 VL_11A: PUSH ES ; SET INT 1F hex WITH HDWR CP
598 PUSH DS ;
599 PUSH BP ;
600 PUSH AX ;
601 PUSH BX ;
602 PUSH CX ;
603 PUSH DX ;
604 MOV AX,1130H ; GET EGA INFORMATION
605 MOV BH,4 ; GET ROM DOUBLE DOT PTR (TOP)
606 INT 10H ;
607 XOR AX,AX ;
608 MOV DS,AX ;
609 CLI ;
610 MOV DS:WORD PTR INT_1F_LOW,BP; SET THE HIGH 128 CHARACTERS
611 MOV DS:WORD PTR INT_1F_HI,ES;
612 STI ;
613 MOV CS:OLD_INT_1F,BP ; SAVE VALUE TO INTERNAL STORAGE
614 MOV CS:OLD_INT_1F+2,ES ;
615 POP DX ;
616 POP CX ;
617 POP BX ;
618 POP AX ;
619 POP BP ;
620 POP DS ;
621 POP ES ;
622 ;
623 VL_3: TEST AL,INTER_43H ;
624 JZ VL_8 ;
625 ;
626 CMP CHARACTER_SOURCE,0 ; TEST IF CP = HDWR
627 JE VL_5 ;
628 ;
629 PUSH DS ; SET INT 43 hex WITH USER TABLE
630 PUSH AX ;
631 XOR AX,AX ;
632 MOV DS,AX ;
633 CLI ;
634 MOV DS:WORD PTR INT_43_LOW,DI;
635 MOV DS:WORD PTR INT_43_HI,ES;
636 STI ;
637 POP AX ;
638 POP DS ;
639 JUMP VL_9 ;
640 ;
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
644 JE VL_6 ;
645 ;
646 MOV BH,2 ; RETURN ROM 8X14 PTR
647 CMP BYTES_PER_CHAR,14 ;
648 JE VL_6 ;
649 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
650 ; THIS IS BH=6 (??????? WAS IN ERROR). THE ?????? HAS
651 ; THE LATEST FIX SUPPORT.
652 ;
653 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
654 MOV BH,6 ; SET FOR ROM 8X16 PTR
655 CMP BYTES_PER_CHAR,16 ;
656 JNE VL_7 ;
657 ;
658 VL_6: PUSH AX ; YES, ONCE AGAIN, SAVE THOSE REG'ies
659 PUSH CX ;
660 PUSH DX ;
661 PUSH DS ;
662 PUSH ES ;
663 PUSH BP ;
664 MOV AX,1130H ; GET EGA INFORMATION (PTR=ES:DI)
665 INT 10H ;
666 XOR AX,AX ;
667 MOV DS,AX ;
668 CLI ;
669 MOV DS:WORD PTR INT_43_LOW,BP; SET THE FULL CHARACTER SET
670 MOV DS:WORD PTR INT_43_HI,ES;
671 STI ;
672 POP BP ;
673 POP ES ;
674 POP DS ;
675 POP DX ;
676 POP CX ;
677 POP AX ;
678 VL_7: POP BX ;
679 ;
680 VL_8: TEST AL,INTER_44H ; Test for INTERRUPT 44 Hex
681 JZ VL_9 ;
682 ;
683 CMP CHARACTER_SOURCE,0 ; TEST IF CP = HDWR
684 JE VL_8A ;
685 ;
686 PUSH DS ; SET INT 43 hex WITH USER TABLE
687 PUSH AX ;
688 XOR AX,AX ;
689 MOV DS,AX ;
690 CLI ;
691 MOV DS:WORD PTR INT_44_LOW,DI;
692 MOV DS:WORD PTR INT_44_HI,ES;
693 STI ;
694 POP AX ;
695 POP DS ;
696 JUMP VL_9 ;
697 ;
698 VL_8A: PUSH DS ; SET INT 44 hex WITH HDWR CP
699 PUSH DI ;
700 PUSH AX ;
701 XOR AX,AX ;
702 MOV DS,AX ;
703 CLI ;
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;
708 STI ;
709 POP AX ;
710 POP DI ;
711 POP DS ;
712 ;
713 VL_9: RET ;
714 VECTOR_LOAD ENDP ;
715 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
716 ;
717 ; LOAD CODE PAGE
718 ;
719 ; This routine is called by INVOKE_DATA and
720 ; by the INT_10H code.
721 ;
722 ; EXIT:
723 ; CP_ES points to the final CP data segment
724 ; CP_DI points to the final CP data offset
725 ;
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
730 ;
731 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
732 CP_ES DW ? ;
733 CP_DI DW ? ;
734 LOAD_CP_SEMA DB 0 ; SEMAPHORE TO TELL IF ROUTINE IS
735 ; ALREADY ACTIVE....
736 ;
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;
743 DB ? ; WGR ;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;
750 DW ? ; WGR ;AN000;
751 ;
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;
754 ;
755 TEST_CP PROC ;
756 CMP CS:LOAD_CP_SEMA,ZERO ; TEST IF ALREADY ACTIVE!
757 JE I10_0 ;
758 STC ; IF ALREADY ACTIVE, THEN SET ERROR
759 MOV AX,ONE ; TO INDICATE THAT ACTIVE....
760 RET ;
761 ;
762 I10_0: MOV CS:LOAD_CP_SEMA,ONE ; SET ROUTINE NOW ACTIVE...
763 PUSH BX ;
764 PUSH CX ;
765 PUSH DX ; WGR ;AN000;
766 PUSH SI ;
767 PUSH DI ;
768 PUSH DS ;
769 PUSH ES ;
770 ;
771 PUSH CS ;
772 POP DS ; SETUP DS SEGMENT TO CS
773 PUSH CS ;
774 POP ES ; SETUP ES SEGMENT TO CS
775 ;
776 XOR AH,AH ; AH=0 FOR MODE SET, AL=MODE_TYPE
777 MOV AL,MODE_VALUE ;
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
781 JNZ I10_2 ;
782 ;
783 CALL ASK_BIOS_FONT_SIZE ; GET BIOS TO INDICATE FONT_SIZE
784 JC I10_A ; IF CY=1 THEN ERROR OCCURRED
785 ;
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;
804 ;
805 I10_3: POP AX ; WGR RESTORE OLD VALUE ;AN000;
806 MOV CS:SETMODE_FLAG,OFF ; WGR NO MODE SET IS REQUIRED. ;AN000;
807 ;
808 I10_4: MOV BYTES_PER_CHAR,AL ; SAVE VALUE DETERMINED
809 ;
810 MOV CX,CPD_ACTIVE ;
811 CMP CX,-1 ; CHECK IF ACTIVE CP=PLACE_HOLDER
812 JE I10_A ; IF SO, THEN STAY SLEEPING
813 ;
814 PUSH CX ;
815 CALL FIND_CP ; DETERMINE IF THE CODE PAGE=HDWR
816 MOV BL,CL ;
817 POP CX ; RESTORE CP VALUE FOR FUTURE REF
818 JC I10_A ;
819 MOV CHARACTER_SOURCE,BL ;
820 OR BL,BL ; TEST TYPE OF CP?
821 JE I10_B ; IF CODE PAGE=HDWR THEN RESOLUTION OK!
822 ;
823 CALL FIND_FONT ; CHECK IF THE FONT RESOLUTION IS HERE
824 JC I10_A ; IF CY=0 THEN ES:DI POINT TO FONT
825 MOV CS:CP_DI,DI ;
826 MOV DI,ES ;
827 MOV CS:CP_ES,DI ;
828 JUMP I10_B ;
829 ;
830 I10_A: XOR AX,AX ;
831 STC ;
832 I10_B: POP ES ;
833 POP DS ;
834 POP DI ;
835 POP SI ;
836 POP DX ; WGR ;AN000;
837 POP CX ;
838 POP BX ;
839 MOV CS:LOAD_CP_SEMA,ZERO ; SET ROUTINE NOW COMPLETED....
840 RET ;
841 TEST_CP ENDP ;
842 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
843 ;
844 ; INVOKE DATA
845 ;
846 ; THIS ROUTINE PERFORMS THE LOADING OF THE CODE PAGE
847 ; INFORMATION. IT USES THE POINTERS FROM THE TEST_CP
848 ; ROUTINE.
849 ;
850 ; ENTRY:
851 ; CP_ES points to the actual data of CP segment
852 ; CP_DI points to the actual data of CP offset
853 ;
854 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
855 INVOKE_DATA PROC ;
856 PUSH BX ;
857 PUSH CX ;
858 PUSH SI ;
859 PUSH DI ;
860 PUSH DS ;
861 PUSH ES ;
862 ;
863 MOV DI,CS:CP_ES ; GET THE ES:DI COMBO FROM TEST_CP
864 MOV ES,DI ;
865 MOV DI,CS:CP_DI ;
866 ;
867 XOR AH,AH ;
868 MOV AL,MODE_VALUE ; CREATE INDEX TO GET LOAD_MECH
869 MOV SI,AX ;
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
873 JZ INV_7 ;
874 ;
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
878 JC INV_A ;
879 ;
880 INV_7: TEST AL,MASK_VECTOR_LOAD ;
881 JZ INV_8 ;
882 ;
883 CALL VECTOR_LOAD ; ESTABLISH THE VECTORS FOR CP SUPPORT
884 JC INV_A ;
885 ;
886 INV_8: CLC ;
887 JUMP INV_B ;
888 INV_A: XOR AX,AX ;
889 STC ;
890 INV_B: POP ES ;
891 POP DS ;
892 POP DI ;
893 POP SI ;
894 POP CX ;
895 POP BX ;
896 RET ;
897 INVOKE_DATA ENDP ;
898 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
899 ;
900 ; GET_CURSOR_POSITION
901 ;
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).
905 ;
906 ;
907 ; INPUT:
908 ; none
909 ; OUTPUT:
910 ; BX = page number
911 ; DX = cursor position
912 ;
913 ; DS = CS assumed
914 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
915 ACTIVE_PAGE DW ? ;
916 CURSOR_POS DW ? ;
917 ;
918 GET_CURSOR_POS PROC ;
919 PUSHF ;
920 PUSH DX ;
921 PUSH CX ;
922 PUSH BX ;
923 PUSH AX ;
924 MOV AH,15 ; CALL TO GET CURRENT_VIDEO_STATE
925 PUSHF ;
926 CALL DWORD PTR CS:ROM_INT_10 ; call routine to handle the command
927 MOV ACTIVE_PAGE,BX ;
928 ;
929 MOV AH,3 ;
930 PUSHF ;
931 CALL DWORD PTR CS:ROM_INT_10 ; call routine to handle the command
932 MOV CURSOR_POS,DX ;
933 POP AX ;
934 POP BX ;
935 POP CX ;
936 POP DX ;
937 POPF ;
938 RET ;
939 GET_CURSOR_POS ENDP ;
940 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
941 ;
942 ; SET_CURSOR_POSITION
943 ;
944 ; This routine is called by BIOS_LOAD. It is used
945 ; to tell BIOS where to put the cursor.
946 ;
947 ; INPUT:
948 ; BX = page number
949 ; DX = cursor position
950 ; OUTPUT:
951 ; none
952 ;
953 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
954 SET_CURSOR_POS PROC ;
955 PUSHF ;
956 PUSH DX ;
957 PUSH BX ;
958 PUSH AX ;
959 MOV AH,2 ;
960 MOV BX,ACTIVE_PAGE ;
961 MOV DX,CURSOR_POS ;
962 PUSHF ;
963 CALL DWORD PTR CS:ROM_INT_10 ; call routine to handle the command
964 POP AX ;
965 POP BX ;
966 POP DX ;
967 POPF ;
968 RET ;
969 SET_CURSOR_POS ENDP ;
970
971 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
972 ; Info_Ansi_ModeSet
973 ;
974 ; INPUT:None
975 ; OUTPUT:None
976 ;
977 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
978 Info_Ansi_ModeSet proc near
979 push ax
980 push dx
981 push ds
982 push si
983 pushf
984 push cs
985 pop ds
986 lea si, ANSI_DA_INFO
987 mov [si].DA_SETMODE_FLAG, 1 ;Tell ANSI we are calling int10h, Set Mode funciton
988 mov dx, si
989 mov ah, ANSI_2F
990 mov al, DA_INFO_2F
991 int 2fh ;We don't worry about whether ANSI installed or not.
992 popf
993 pop si
994 pop ds
995 pop dx
996 pop ax
997 ret
998 Info_Ansi_ModeSet endp
999
1000 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1001 ; Info_Ansi_ModeDone
1002 ;
1003 ; INPUT:None
1004 ; OUTPUT:None
1005 ;
1006 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1007 Info_Ansi_ModeDone proc near
1008 push ax
1009 push dx
1010 push ds
1011 push si
1012 pushf
1013 push cs
1014 pop ds
1015 lea si, ANSI_DA_INFO
1016 mov [si].DA_SETMODE_FLAG, 0 ;Tell ANSI we are done with int10h, Set Mode funciton
1017 mov dx, si
1018 mov ah, ANSI_2F
1019 mov al, DA_INFO_2F
1020 int 2fh ;We don't worry about whether ANSI installed or not.
1021 popf
1022 pop si
1023 pop ds
1024 pop dx
1025 pop ax
1026 ret
1027 Info_Ansi_ModeDone endp
1028
1029 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;