summaryrefslogtreecommitdiff
path: root/v4.0/src/DEV/DISPLAY/INT10COM.INC
diff options
context:
space:
mode:
authorGravatar Mark Zbikowski2024-04-25 21:24:10 +0100
committerGravatar Microsoft Open Source2024-04-25 22:32:27 +0000
commit2d04cacc5322951f187bb17e017c12920ac8ebe2 (patch)
tree80ee017efa878dfd5344b44249e6a241f2a7f6e2 /v4.0/src/DEV/DISPLAY/INT10COM.INC
parentMerge pull request #430 from jpbaltazar/typoptbr (diff)
downloadms-dos-main.tar.gz
ms-dos-main.tar.xz
ms-dos-main.zip
MZ is back!HEADmain
Diffstat (limited to 'v4.0/src/DEV/DISPLAY/INT10COM.INC')
-rw-r--r--v4.0/src/DEV/DISPLAY/INT10COM.INC1029
1 files changed, 1029 insertions, 0 deletions
diff --git a/v4.0/src/DEV/DISPLAY/INT10COM.INC b/v4.0/src/DEV/DISPLAY/INT10COM.INC
new file mode 100644
index 0000000..6931ca6
--- /dev/null
+++ b/v4.0/src/DEV/DISPLAY/INT10COM.INC
@@ -0,0 +1,1029 @@
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
40IF1 ;
41 %OUT . �INT10COM.INC�
42ENDIF
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 ;
56ROM_INT_10 DW ? ; Int 10H vector offset
57 DW ? ; Int 10H vector segment
58ROM_INT_1F DW ? ; Int 1FH vector offset
59 DW ? ; Int 1FH vector segment
60OLD_INT_1F DW ? ; OLD Int 1FH vector offset
61 DW ? ; OLD Int 1FH vector segment
62ROM_INT_44 DW ? ; Int 44H vector offset
63 DW ? ; Int 44H vector segment
64MODE_VALUE DB ? ; VALUE OF AL DURING INT 10H (AH=0)
65BYTES_PER_CHAR DB ? ; VALUE OF BYTES/CHARACTER IN MODES
66LOAD_MECHANISM DB ? ; SUPPORT SCHEME FOR ACTIVE MODE
67CHARACTER_SOURCE DB ? ; FLAG TO INDICATE: 0 = HDWR
68 ; 1 = DESG
69INVALID_MODE EQU 0FFH ;
70MASK_BIOS_LOAD EQU 00000011b ;
71MASK_VECTOR_LOAD EQU 00110000B ;
72MODE_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 ;
81LOAD_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 ;
91FONT_SIZE LABEL BYTE ; RESERVE 32 MODE SETTINGS
92 DB 32 DUP(?) ; REFER TO TABLES.INC FOR DETAILS
93NUM_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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
103INT_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 ;
109INT_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
129INT_2: MOV CS:SETMODE_FLAG,OFF ; WGR ;AN000;
130 CALL INVOKE_DATA ; IF SO, THEN LOAD THE DATA
131INT_3: POP AX ;
132 ;
133 IRET ;
134INT_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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
149SET_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 ;
158SET_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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
179FIND_FONT PROC ;
180 PUSH AX ;
181 PUSH CX ;
182 PUSH DX ;
183 ;
184 MOV CX,CPD_FONTS_N ; GET NUMBER OF FONT STYLES
185FF_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 ;
203FF_3: ADD DI,SIX ; POINT TO VERY START OF DATA
204 CLC ; SET FLAG TO OK!
205FF_4: POP DX ;
206 POP CX ;
207 POP AX ;
208 RET ;
209FIND_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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
235AX_1100H EQU 00000001b ;
236AX_1400H EQU 00000010b ;
237EGA_INFO EQU 0487H ; ADDRESS OF INFO BYTE
238EGA_ACTIVE EQU 00001000b ; MASK FOR EGA_ACTIVE/NON-ACTIVE
239 ;
240BIOS_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 ;
253BL_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 ;
262BL_0: MOV AX,1102H ; ROM 8X8 DOUBLE DOT
263 CMP BYTES_PER_CHAR,8 ;
264 JE BL_2 ;
265BL_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 ;
273BL_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 ;
288BL_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;
310BL_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
326Skip_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)
329BL_2A: POP AX ;
330 POP BP ;
331 ;
332BL_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 ;
343BL_4: MOV AX,1401H ; ASK FOR ROM LOAD FONT
344 MOV BL,ZERO ;
345BL_5: INT 10H ; PERFORM THE LOAD!
346 CALL SET_BLOCK_SP0 ; AND ALSO DO THE SET BLOCK SPECIFIER
347 POP AX ;
348 ;
349BL_6: CLC ;
350BL_7: POP DX ;
351 POP BX ;
352 ;
353 CALL SET_CURSOR_POS ; RESTORE THE CURSOR POSITION
354 RET ;
355BIOS_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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
373RETURN_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
394CHAR_H LABEL WORD ;
395 DW ? ; CHARACTER HEIGHT
396 DB ? ; DISPLAY COMBINATION (ACTIVE)
397 DB ? ; DISPLAY COMBINATION (ALTERNATE)
398L_RET_INFO EQU ($-RETURN_INFO) ;
399 DB (40h-L_RET_INFO) DUP (?) ; REMAINING DATA....
400 ;
401STATIC_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
409SI_LINE DB ? ; SCAN LINES AVAILABLE IN TEXT MODES
410STATIC_INFO ENDS ;
411 ;
412ASK_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....
430ABI_3: STC ;
431ABI_4: POP AX ;
432 POP BX ;
433 POP DI ;
434 POP ES ;
435 RET ;
436ASK_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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
453ASK_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 ;
463ABFS_0: CLC ;
464ABFS_1: POP BX ;
465 RET ;
466ASK_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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
483ASK_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 ;
497ABSL_0: RET ;
498ASK_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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
536VECTOR_MODE DB ? ;
537INTER_43H EQU 00100000b ;
538INTER_1FH EQU 00010000b ;
539LCD_1FH EQU 01000000b ;
540INTER_44H EQU 10000000b ;
541 ;
542VECTOR_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 ;
547VL_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 ;
556VL_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 ;
576VL_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 ;
597VL_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 ;
623VL_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 ;
641VL_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 ;
658VL_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 ;
678VL_7: POP BX ;
679 ;
680VL_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 ;
698VL_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 ;
713VL_9: RET ;
714VECTOR_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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
732CP_ES DW ? ;
733CP_DI DW ? ;
734LOAD_CP_SEMA DB 0 ; SEMAPHORE TO TELL IF ROUTINE IS
735 ; ALREADY ACTIVE....
736 ;
737ANSI_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;
742D_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;
749SCR_ROWS LABEL WORD ; WGR ROWS ;AN000;
750 DW ? ; WGR ;AN000;
751 ;
752RE_CALC DW OFF ; WGR VALUE TO OR IN CHARACTER LOAD ;AN000;
753SETMODE_FLAG DB OFF ; WGR FLAG INDICATING A MODE SET IS REQUIRED ;AN000;
754 ;
755TEST_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 ;
762I10_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 ;
786I10_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 ;
805I10_3: POP AX ; WGR RESTORE OLD VALUE ;AN000;
806 MOV CS:SETMODE_FLAG,OFF ; WGR NO MODE SET IS REQUIRED. ;AN000;
807 ;
808I10_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 ;
830I10_A: XOR AX,AX ;
831 STC ;
832I10_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 ;
841TEST_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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
855INVOKE_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 ;
880INV_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 ;
886INV_8: CLC ;
887 JUMP INV_B ;
888INV_A: XOR AX,AX ;
889 STC ;
890INV_B: POP ES ;
891 POP DS ;
892 POP DI ;
893 POP SI ;
894 POP CX ;
895 POP BX ;
896 RET ;
897INVOKE_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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
915ACTIVE_PAGE DW ? ;
916CURSOR_POS DW ? ;
917 ;
918GET_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 ;
939GET_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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
954SET_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 ;
969SET_CURSOR_POS ENDP ;
970
971;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
972; Info_Ansi_ModeSet
973;
974; INPUT:None
975; OUTPUT:None
976;
977;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
978Info_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
998Info_Ansi_ModeSet endp
999
1000;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1001; Info_Ansi_ModeDone
1002;
1003; INPUT:None
1004; OUTPUT:None
1005;
1006;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1007Info_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
1027Info_Ansi_ModeDone endp
1028
1029;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;