]>
wirehaze git hosting - MS-DOS.git/blob - v4.0/src/DEV/ANSI/ANSIINIT.ASM
2 TITLE ANSI
Console device CON$INIT routine
4 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6 ; MODULE_NAME: CON$INIT
9 ; THIS PROCEDURE PERFORMS ALL NECESSARY INITIALIZATION ROUTINES
12 ; THIS ROUTINE WAS SPLIT FROM THE ORIGINAL ANSI.ASM SOURCE FILE
13 ; FOR RELEASE 4.00 OF DOS. ALL CHANGED LINES HAVE BEEN MARKED WITH
14 ; WGR. NEW PROCS HAVE BEEN MARKED AS SUCH.
16 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
17 ;AN001; P1767 VIDEO_MODE_TABLE not initialized correctly 10/16/87 J.K.
18 ;AN002; P2617 Order dependecy problem with Display.sys 11/23/87 J.K.
19 ;AN003; D479 An option to disable the extended keyboard functions 02/12/88 J.K.
20 ;AN004; D493 New INIT request structure for error message 02/25/88 J.K.
21 ;-------------------------------------------------------------------------------
23 INCLUDE ANSI
.INC ; WGR equates and strucs ;AN000;
25 INCLUDE STRUC.INC ; WGR structured macros ;AN000;
28 PUBLIC CON$INIT
; WGR ;AN000;
31 CODE SEGMENT PUBLIC BYTE
32 ASSUME
CS:CODE,DS:CODE
34 EXTRN VIDEO_MODE_TABLE
:BYTE ; WGR ;AN000;
35 EXTRN FUNC_INFO
:BYTE ; WGR ;AN000;
36 EXTRN HDWR_FLAG
:WORD ; WGR ;AN000;
37 EXTRN VIDEO_TABLE_MAX
:ABS
; WGR ;AN000;
38 EXTRN SCAN_LINES
:BYTE ; WGR ;AN000;
39 EXTRN PTRSAV
:DWORD ; WGR ;AN000;
40 EXTRN PARSE_PARM
:NEAR ; WGR ;AN000;
41 EXTRN ERR2
:NEAR ; WGR ;AN000;
42 EXTRN EXT_16
:BYTE ; WGR ;AN000;
43 EXTRN BRKADR
:ABS
; WGR ;AN000;
44 EXTRN BRKKY
:NEAR ; WGR ;AN000;
45 EXTRN COUT
:NEAR ; WGR ;AN000;
46 EXTRN BASE
:WORD ; WGR ;AN000;
47 EXTRN MODE
:BYTE ; WGR ;AN000;
48 EXTRN MAXCOL
:BYTE ; WGR ;AN000;
49 EXTRN TRANS
:ABS
; WGR ;AN000;
50 EXTRN STATUS
:ABS
; WGR ;AN000;
51 EXTRN EXIT
:NEAR ; WGR ;AN000;
52 EXTRN MAX_SCANS
:BYTE ; WGR ;AN000;
53 EXTRN ROM_INT10
:WORD ; WGR ;AN000;
54 EXTRN INT10_COM
:NEAR ; WGR ;AN000;
55 EXTRN ROM_INT2F
:WORD ; WGR ;AN000;
56 EXTRN INT2F_COM
:NEAR ; WGR ;AN000;
57 EXTRN ABORT
:BYTE ; WGR ;AN000;
58 extrn Display_Loaded_Before_me
:byte ;AN002;Defined in IOCTL.ASM
59 extrn Switch_K
:Byte ;AN003;
61 INCLUDE ANSIVID
.INC ; WGR video tables data ;AN000;
64 LDS BX,CS:[PTRSAV
] ; WGR establish addressability to request header ;AC000;
65 LDS SI,[BX].ARG_PTR
; WGR DS:SI now points to rest of DEVICE=statement;AN000;
66 CALL PARSE_PARM
; WGR parse DEVICE= command line ;AN000;
67 JNC CONT_INIT
; WGR no error in parse...continue install ;AN000;
68 LDS BX,CS:[PTRSAV
] ; WGR prepare to abort install ;AC000;
69 XOR AX,AX ; WGR ;AC000;
70 MOV [BX].NUM_UNITS
,AL ; WGR set number of units to zero ;AC000;
71 MOV [BX].END_ADDRESS_O
,AX ; WGR set ending address offset to 0 ;AC000;
72 MOV [BX].END_ADDRESS_S
,CS ; WGR set ending address segment to CS ;AC000;
73 mov word ptr [bx].CONFIG_ERRMSG
, -1 ;AN004; Let IBMBIO display "Error in CONFIG.SYS..".
74 MOV AX,UNKNOWN_CMD
; WGR set error in status ;AC000;
75 MOV WORD PTR [BX].STATUS
,AX ; WGR set error status ;AC000;
76 JMP ERR2
; WGR prepare to exit ;AN000;
78 CONT_INIT: ; WGR ;AN000;
80 POP DS ; WGR restore DS to ANSI segment ;AN000;
81 MOV AX,ROM_BIOS
; WGR ;AN000;
82 MOV ES,AX ; WGR DS now points to BIOS data area ;AN000;
83 MOV AH,ES:[KBD_FLAG_3
] ; WGR load AH with KBD_FLAG_3 ;AN000;
84 .IF <BIT
AH AND EXT16_FLAG
> AND ; WGR see if extended INT16 is loaded ;AN000;
85 .IF <Switch_K
EQ OFF
> ;The user does not want to disable the extended INT 16h ;AN003;
86 MOV EXT_16
,ON ; WGR extended INT16 available, set flag ;AN000;
88 CALL DET_HDWR
; WGR procedure to determine video hardware status;AN000;
89 .IF <HDWR_FLAG GE MCGA_ACTIVE
> ; WGR if we have EGA or better then.. ;AN000;
90 MOV AH,ALT_SELECT
; WGR issue select alternate print.. ;AN000;
91 MOV BL,ALT_PRT_SC
; WGR screen routine call.. ;AN000;
94 CALL LOAD_INT10
; WGR load interrupt 10h handler ;AN000;
95 CALL LOAD_INT2F
; WGR load interrupt 2Fh handler ;AN000;
100 mov [base
],0b000h ;look for bw card
102 cmp al,00010000b ;look for 40 col mode
111 MOV WORD PTR [BX],OFFSET BRKKY
112 MOV WORD PTR [BX+2],CS
115 MOV WORD PTR [BX],OFFSET COUT
116 MOV WORD PTR [BX+2],CS
119 MOV WORD PTR [BX].TRANS
,OFFSET CON$INIT
;SET BREAK ADDRESS
124 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
126 ; PROCEDURE_NAME: DET_HDWR
129 ; THIS CODE DETERMINES WHAT VIDEO HARDWARE IS AVAILABLE. THIS INFORMATION
130 ; IS USED TO LOAD APPROPRIATE VIDEO TABLES INTO MEMORY FOR USE IN THE
136 ; NORMAL: FLAG WORD WILL CONTAIN BITS SET FOR THE APPROPRIATE
137 ; TABLES. IN ADDITION, FOR VGA SUPPORT, A FLAG BYTE
138 ; WILL CONTAIN THE AVAILABLE SCAN LINE SETTINGS FOR THE
140 ; VIDEO TABLES WILL BE LOADED INTO MEMORY REFLECTING
141 ; APPLICABLE MODE SETTINGS AND SCREEN LINE LENGTHS.
145 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
147 DET_HDWR PROC
NEAR ;AN000;
148 MOV AH,GET_SYS_ID
; see if this is a Convertible ;AN000;
150 .IF <ES:[BX].MODEL_BYTE
EQ LCD_MODEL
> AND ; yes...check for LCD attached? ;AN000;
151 MOV AH,GET_STATUS
; system status will tell us ;AN000;
153 .IF <BIT
AL NAND
ON> ; if bit 0 = 0 then LCD.. ;AN000;
154 OR HDWR_FLAG
,LCD_ACTIVE
; so ...set hdwr flag and... ;AN000;
155 LEA SI,COLOR_TABLE
; ;AN000;
156 MOV CX,COLOR_NUM
; load color table (for LCD) ;AN000;
157 CALL LOAD_TABLE
; ;AN000;
158 LEA SI,MONO_TABLE
; and mono table ;AN000;
159 MOV CX,MONO_NUM
; ;AN000;
160 CALL LOAD_TABLE
; ;AN000;
161 .ELSE ; not LCD...check for CGA and mono ;AN000;
162 MOV AX,MONO_ADDRESS
; write to mono buffer to see if present ;AN000;
163 CALL CHECK_BUF
; ;AN000;
164 .IF <AH EQ AL> ; if present then... ;AN000;
165 OR HDWR_FLAG
,MONO_ACTIVE
; set hdwr flag and.. ;AN000;
166 LEA SI,MONO_TABLE
; ;AN000;
167 MOV CX,MONO_NUM
; load mono table ;AN000;
168 CALL LOAD_TABLE
; ;AN000;
170 MOV AX,COLOR_ADDRESS
; write to CGA buffer to see if present ;AN000;
171 CALL CHECK_BUF
; ;AN000;
172 .IF <AH EQ AL> ; if present then.. ;AN000;
173 OR HDWR_FLAG
,CGA_ACTIVE
; set hdwr flag and... ;AN000;
174 LEA SI,COLOR_TABLE
; ;AN000;
175 MOV CX,COLOR_NUM
; load color table ;AN000;
176 CALL LOAD_TABLE
; ;AN000;
179 PUSH CS ; setup addressiblity for ;AN000;
180 POP ES ; functionality call ;AN000;
182 MOV AH,FUNC_CALL
; functionality call ;AN000;
183 XOR BX,BX ; implementation type 0 ;AN000;
184 LEA DI,FUNC_INFO
; block to hold data ;AN000;
186 .IF <AL EQ FUNC_CALL
> ; if call supported then.. ;AN000;
187 .IF <BIT
[DI].MISC_INFO
AND ON> ; test bit to see if VGA ;AN000;
188 OR HDWR_FLAG
,VGA_ACTIVE
; yes ....so ;AN000;
189 LEA SI,COLOR_TABLE
; set hdwr flag and... ;AN000;
190 MOV CX,COLOR_NUM
; load color table +.. ;AN000;
191 CALL LOAD_TABLE
; ;AN000;
192 LEA SI,VGA_TABLE
; load VGA table ;AN000;
193 MOV CX,VGA_NUM
; ;AN000;
194 CALL LOAD_TABLE
; ;AN000;
195 .ELSE ; not VGA...then must be MCGA ;AN000;
196 .IF <[DI].ACTIVE_DISPLAY
EQ MOD30_MONO
> OR ;AN000;
197 .IF <[DI].ACTIVE_DISPLAY
EQ MOD30_COLOR
> OR ;AN000;
198 .IF <[DI].ALT_DISPLAY
EQ MOD30_MONO
> OR ;AN000;
199 .IF <[DI].ALT_DISPLAY
EQ MOD30_COLOR
> ;AN000;
200 OR HDWR_FLAG
,MCGA_ACTIVE
; so...set hdwr flag and... ;AN000;
201 LEA SI,COLOR_TABLE
; ;AN000;
202 MOV CX,COLOR_NUM
; load color table +.. ;AN000;
203 CALL LOAD_TABLE
; ;AN000;
204 LEA SI,MCGA_TABLE
; load MCGA table ;AN000;
205 MOV CX,MCGA_NUM
; ;AN000;
206 CALL LOAD_TABLE
; ;AN000;
209 MOV AL,[DI].CURRENT_SCANS
; copy current scan line setting.. ;AN000;
210 MOV MAX_SCANS
,AL ; as maximum text mode scan setting. ;AN000;
211 LES DI,[DI].STATIC_ADDRESS
; point to static functionality table ;AN000;
212 MOV AL,ES:[DI].SCAN_TEXT
; load available scan line flag byte.. ;AN000;
213 MOV SCAN_LINES
,AL ; and store it in resident data. ;AN000;
214 .ELSE ; call not supported..try EGA ;AN000;
215 MOV AH,ALT_SELECT
; alternate select call ;AN000;
216 MOV BL,EGA_INFO
; get EGA information subcall ;AN000;
218 .IF <BL NE EGA_INFO
> ; check if call was valid ;AN000;
219 .IF <BH EQ MONOCHROME
> ; yes...check for monochrome ;AN000;
220 OR HDWR_FLAG
,E5151_ACTIVE
; ..5151 found so set hdwr flag and.. ;AN000;
221 LEA SI,EGA_5151_TABLE
; ;AN000;
222 MOV CX,EGA_5151_NUM
; load 5151 table. ;AN000;
223 CALL LOAD_TABLE
; ;AN000;
225 AND CL,0FH ; clear upper nibble of switch setting byte ;AN000;
226 .IF <CL EQ NINE
> OR ; test for switch settings of 5154 ;AN000;
227 .IF <CL EQ THREE
> ; ..5154 found.. ;AN000;
228 OR HDWR_FLAG
,E5154_ACTIVE
; so..set hdwr flag and... ;AN000;
229 LEA SI,COLOR_TABLE
; ;AN000;
230 MOV CX,COLOR_NUM
; load color table +.. ;AN000;
231 CALL LOAD_TABLE
; ;AN000;
232 LEA SI,EGA_5154_TABLE
; load 5154 table ;AN000;
233 MOV CX,EGA_5154_NUM
; ;AN000;
234 CALL LOAD_TABLE
; ;AN000;
235 .ELSE ; 5154 not found...must be 5153... ;AN000;
236 OR HDWR_FLAG
,E5153_ACTIVE
; so..set hdwr flag and... ;AN000;
237 LEA SI,COLOR_TABLE
; ;AN000;
238 MOV CX,COLOR_NUM
; load color table +.. ;AN000;
239 CALL LOAD_TABLE
; ;AN000;
240 LEA SI,EGA_5153_TABLE
; load 5153 table ;AN000;
241 MOV CX,EGA_5153_NUM
; ;AN000;
242 CALL LOAD_TABLE
; ;AN000;
251 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
253 ; PROCEDURE_NAME: CHECK_BUF
256 ; THIS PROCEDURE WRITES TO THE VIDEO BUFFER AND READS THE DATA BACK
257 ; AGAIN TO DETERMINE THE EXISTANCE OF THE VIDEO CARD.
262 ; NORMAL: AH EQ AL IF BUFFER PRESENT
263 ; AH NE AL IF NO BUFFER
267 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
269 CHECK_BUF PROC
NEAR ; write to video buffer to see if it is present ;AN000;
271 MOV DS,AX ; load DS with address of buffer ;AN000;
272 MOV CH,DS:0 ; save buffer information (if present) ;AN000;
273 MOV AL,55H
; prepare to write sample data ;AN000;
274 MOV DS:0,AL ; write to buffer ;AN000;
275 PUSH BX ; terminate the bus so that lines.. ;AN000;
276 POP BX ; are reset ;AN000;
277 MOV AH,DS:0 ; bring sample data back... ;AN000;
278 MOV DS:0,CH ; repair damage to buffer ;AN000;
283 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
285 ; PROCEDURE_NAME: LOAD_TABLE
288 ; THIS PROCEDURE COPIES ONE OF THE VIDEO TABLES INTO RESIDENT DATA.
289 ; IT MAY BE REPEATED TO LOAD SEVERAL TABLES INTO THE SAME DATA SPACE.
290 ; MATCHING MODES WILL BE OVERWRITTEN...THEREFORE..CARE MUST BE TAKEN
294 ; SI: POINTS TO TOP OF TABLE TO COPY
295 ; CX: NUMBER OF RECORDS TO COPY
298 ; NORMAL: TABLE POINTED TO BY SI IS COPIED INTO RESIDENT DATA AREA
302 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
304 LOAD_TABLE PROC
NEAR ;AN000;
305 PUSH DI ; save DI ;AN000;
306 PUSH ES ; and ES ;AN000;
307 PUSH CS ; setup ES to code segment ;AN000;
309 LEA DI,VIDEO_MODE_TABLE
; point DI to resident video table ;AN000;
310 .WHILE <CX NE
0> AND ; do for as many records as there are ;AN000;
311 .WHILE <DI LT VIDEO_TABLE_MAX
> ; check to ensure other data not overwritten ;AN000;
312 MOV AL,[DI].V_MODE
; prepare to check resident table ;AN000;
313 .IF <AL NE UNOCCUPIED
> AND ; if this spot is occupied...and ;AN000;
314 .IF <AL NE
[SI].V_MODE
> ; ...is not the same mode then... ;AN000;
315 ADD DI,TYPE MODE_TABLE
; do not touch...go to next mode ;AN000;
316 .ELSE ; can write at this location ;AN000;
317 PUSH CX ; save record count ;AN000;
318 MOV CX,TYPE MODE_TABLE
; load record length ;AN000;
319 REP MOVSB ; copy record to resident data ;AN000;
320 lea DI,VIDEO_MODE_TABLE
;AN001; Set DI to the top of the target again.
321 POP CX ; restore record count and.. ;AN000;
322 DEC CX ; decrement ;AN000;
325 POP ES ; restore.. ;AN000;
326 POP DI ; registers ;AN000;
331 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
333 ; PROCEDURE_NAME: LOAD_INT10
336 ; THIS PROCEDURE LOADS THE INTERRUPT HANDLER FOR INT10H
341 ; NORMAL: INTERRUPT 10H VECTOR POINTS TO INT10_COM. OLD INT 10H
346 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
348 LOAD_INT10 PROC
NEAR ;AN000;
350 XOR AX,AX ; point ES to low.. ;AN000;
351 MOV ES,AX ; memory. ;AN000;
352 MOV CX,ES:WORD PTR INT10_LOW
; store original.. ;AN000;
353 MOV CS:ROM_INT10
,CX ; interrupt 10h.. ;AN000;
354 MOV CX,ES:WORD PTR INT10_HI
; location.. ;AN000;
355 MOV CS:ROM_INT10
+2,CX ; ;AN000;
357 MOV ES:WORD PTR INT10_LOW
,OFFSET INT10_COM
; replace vector.. ;AN000;
358 MOV ES:WORD PTR INT10_HI
,CS ; with our own.. ;AN000;
360 mov ax, DISPLAY_CHECK
;AN002;DISPLAY.SYS already loaded?
362 cmp al, INSTALLED
;AN002;
363 jne L_INT10_Ret
;AN002;
364 mov cs:Display_Loaded_Before_Me
,1 ;AN002;
371 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
373 ; PROCEDURE_NAME: LOAD_INT2F
376 ; THIS PROCEDURE LOADS THE INTERRUPT HANDLER FOR INT2FH
381 ; NORMAL: INTERRUPT 2FH VECTOR POINTS TO INT2F_COM. OLD INT 2FH
386 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
388 LOAD_INT2F PROC
NEAR ;AN000;
390 XOR AX,AX ; point ES to low.. ;AN000;
391 MOV ES,AX ; memory. ;AN000;
392 MOV AX,ES:WORD PTR INT2F_LOW
; store original.. ;AN000;
393 MOV CS:ROM_INT2F
,AX ; interrupt 2Fh.. ;AN000;
394 MOV CX,ES:WORD PTR INT2F_HI
; location.. ;AN000;
395 MOV CS:ROM_INT2F
+2,CX ; ;AN000;
396 OR AX,CX ; check if old int2F.. ;AN000;
397 .IF Z ; is 0. ;AN000;
398 MOV AX,OFFSET ABORT
; yes....point to.. ;AN000;
399 MOV CS:ROM_INT2F
,AX ; IRET. ;AN000;
401 MOV CS:ROM_INT2F
+2,AX ; ;AN000;
404 MOV ES:WORD PTR INT2F_LOW
,OFFSET INT2F_COM
; replace vector.. ;AN000;
405 MOV ES:WORD PTR INT2F_HI
,CS ; with our own.. ;AN000;
409 LOAD_INT2F ENDP
;AN000;