Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

540 lines
12 KiB

PAGE ,132
TITLE ANSI Console device CON$INIT routine
;******************************************************************************
; Change Log:
; Date Who # Description
; -------- --- --- ------------------------------------------------------
; 06/05/90 MKS C03 Bug#234. ANSI was not recognizing the presence of a
; VGA if there was another video board in the system.
;******************************************************************************
; MODULE_NAME: CON$INIT
; FUNCTION:
; THIS PROCEDURE PERFORMS ALL NECESSARY INITIALIZATION ROUTINES
; FOR ANSI.SYS.
; THIS ROUTINE WAS SPLIT FROM THE ORIGINAL ANSI.ASM SOURCE FILE
; FOR RELEASE 4.00 OF DOS. ALL CHANGED LINES HAVE BEEN MARKED WITH
; . NEW PROCS HAVE BEEN MARKED AS SUCH.
; P1767 VIDEO_MODE_TABLE not initialized correctly 10/16/87 J.K.
; P2617 Order dependecy problem with Display.sys 11/23/87 J.K.
; D479 An option to disable the extended keyboard functions 02/12/88 J.K.
; D493 New INIT request structure for error message 02/25/88 J.K.
; P5699 Moving selecting alternate print screen routine to only when it
; 10/26/88 is needed. OEM EGA cards don't support the call it, so they
; K. Sayers couldn't (shift) print screen at all.
;-------------------------------------------------------------------------------
INCLUDE ANSI.INC ; equates and strucs
PUBLIC CON$INIT
CODE SEGMENT PUBLIC BYTE
ASSUME CS:CODE,DS:CODE
EXTRN VIDEO_MODE_TABLE:BYTE
EXTRN FUNC_INFO:BYTE
EXTRN HDWR_FLAG:WORD
EXTRN VIDEO_TABLE_MAX:ABS
EXTRN SCAN_LINES:BYTE
EXTRN PTRSAV:DWORD
EXTRN PARSE_PARM:NEAR
EXTRN ERR2:NEAR
EXTRN EXT_16:BYTE
EXTRN BRKKY:NEAR
EXTRN COUT:NEAR
EXTRN BASE:WORD
EXTRN MODE:BYTE
EXTRN MAXCOL:BYTE
EXTRN EXIT:NEAR
EXTRN MAX_SCANS:BYTE
EXTRN ROM_INT10:WORD
EXTRN INT10_COM:NEAR
EXTRN ROM_INT2F:WORD
EXTRN INT2F_COM:NEAR
EXTRN ABORT:BYTE
EXTRN Display_Loaded_Before_me:byte ;Defined in IOCTL.ASM
EXTRN Switch_K:Byte
EXTRN fhavek09:BYTE ; M006
EXTRN Switch_S:BYTE ; M008
ifdef DBCS
EXTRN DBCSLeadByteTable:dword
endif
INCLUDE ANSIVID.INC ; video tables data
CON$INIT:
lds bx,cs:[PTRSAV] ; establish addressability to request header
lds si,[BX].ARG_PTR ; ds:SI now points to rest of DEVICE=statement
call PARSE_PARM ; parse DEVICE= command line
jnc CONT_INIT ; no error in parse...continue install
lds bx,cs:[PTRSAV] ; prepare to abort install
xor ax,ax ;
mov [BX].NUM_UNITS,al ; set number of units to zero
mov [BX].END_ADDRESS_O,ax ; set ending address offset to 0
mov [BX].END_ADDRESS_S,cs ; set ending address segment to CS
mov word ptr [bx].CONFIG_ERRMSG, -1 ; Let IBMBIO display "Error in CONFIG.SYS..".
mov ax,UNKNOWN_CMD ; set error in status
mov WORD PTR [BX].STATUS,ax ; set error status
jmp ERR2 ; prepare to exit
CONT_INIT:
push cs
pop ds ; restore DS to ANSI segment
mov ax,ROM_BIOS
mov es,ax ; ES now points to BIOS data area
cmp Switch_S,OFF ; M008
jz noscreensizesw ; M008
mov BYTE PTR es:[84h],24 ; M008 ; Use default value
noscreensizesw: ; M008
mov ah,es:[KBD_FLAG_3] ; load AH with KBD_FLAG_3
test ah,EXT16_FLAG ; if extended Int16 available
jz tlab01
cmp Switch_K,OFF ; and user didn't disable it
jnz tlab01
mov EXT_16,ON ; then enable extended int16
tlab01:
call DET_HDWR ; procedure to determine video hardware status
call LOAD_INT10 ; load interrupt 10h handler
call LOAD_INT2F ; load interrupt 2Fh handler
; M006 - begin
push ds
pop es
xor di,di ; es:di points to begining of driver
mov ax,4101h ; wait for bh=es:[di]
mov bl,1 ; wait for 1 clock tick
mov bh,byte ptr es:[di]
stc ; Assume we will fail
int 15h
jc CheckColor
mov fhavek09,ON ; remember we have a k09 type
CheckColor:
; M006 - end
int 11h
and al,00110000b
cmp al,00110000b
jnz iscolor
mov [base],0b000h ;look for bw card
iscolor:
cmp al,00010000b ;look for 40 col mode
ja setbrk
mov [mode],0
mov [maxcol],39
setbrk:
xor bx,bx
mov ds,bx
mov bx,BRKADR
mov WORD PTR [BX],OFFSET BRKKY
mov WORD PTR [BX+2],cs
mov bx,29H*4
mov WORD PTR [BX],OFFSET COUT
mov WORD PTR [BX+2],cs
ifdef DBCS
mov ax,6300h
int 21h ; get DBCS lead byte table
mov word ptr cs:DBCSLeadByteTable,si
mov word ptr cs:DBCSLeadByteTable+2,ds
endif
lds bx,cs:[PTRSAV]
mov WORD PTR [BX].TRANS,OFFSET CON$INIT ;SET BREAK ADDRESS
mov [BX].TRANS+2,cs
jmp EXIT
; PROCEDURE_NAME: DET_HDWR
; FUNCTION:
; THIS CODE DETERMINES WHAT VIDEO HARDWARE IS AVAILABLE. THIS INFORMATION
; IS USED TO LOAD APPROPRIATE VIDEO TABLES INTO MEMORY FOR USE IN THE
; GENERIC IOCTL.
; AT ENTRY:
; AT EXIT:
; NORMAL: FLAG WORD WILL CONTAIN BITS SET FOR THE APPROPRIATE
; TABLES. IN ADDITION, FOR VGA SUPPORT, A FLAG BYTE
; WILL CONTAIN THE AVAILABLE SCAN LINE SETTINGS FOR THE
; INSTALLED ADAPTER.
; VIDEO TABLES WILL BE LOADED INTO MEMORY REFLECTING
; APPLICABLE MODE SETTINGS AND SCREEN LINE LENGTHS.
; ERROR: N/A
DET_HDWR PROC NEAR
mov ah,GET_SYS_ID ; see if this is a Convertible
int 15h
cmp es:[BX].MODEL_BYTE,LCD_MODEL ; and it has an LCD attached
jnz tlab04
mov ah,GET_STATUS ; system status will tell us
int 15h
test al,1 ; if bit 0 = 0 then LCD..
jnz tlab04
or HDWR_FLAG,LCD_ACTIVE ; so ...set hdwr flag and...
lea si,COLOR_TABLE
mov cx,COLOR_NUM ; load color table (for LCD)
call LOAD_TABLE
lea si,MONO_TABLE ; and mono table
mov cx,MONO_NUM
call LOAD_TABLE
jmp short tlab05
; not LCD... check for CGA and mono
tlab04:
mov ax,MONO_ADDRESS ; write to mono buffer to see if present
call CHECK_BUF
cmp ah,al
jnz tlab03 ; if present then,
or HDWR_FLAG,MONO_ACTIVE ; set hdwr flag and..
lea si,MONO_TABLE
mov cx,MONO_NUM ; load mono table
call LOAD_TABLE
tlab03:
mov ax,COLOR_ADDRESS ; write to CGA buffer to see if present
call CHECK_BUF
cmp ah,al
jnz tlab02 ; if present then,
or HDWR_FLAG,CGA_ACTIVE ; set hdwr flag and...
lea si,COLOR_TABLE
mov cx,COLOR_NUM ; load color table
call LOAD_TABLE
tlab02:
tlab05:
push cs ; setup addressiblity for
pop es ; functionality call
xor ax,ax
mov ah,FUNC_call ; functionality call
xor bx,bx ; implementation type 0
lea DI,FUNC_INFO ; block to hold data
int 10H
cmp al,FUNC_call ; if call supported, then...
jne tlab11
mov ax,1A00h ; alternate check for VGA ;C03
int 10h ; C03
cmp bl,8 ; test for color VGA or mono VGA
jz tlab08
cmp bl,7
jnz tlab09
tlab08:
or HDWR_FLAG,VGA_ACTIVE ; yes ....so
lea si,COLOR_TABLE ; set hdwr flag and...
mov cx,COLOR_NUM ; load color table +..
call LOAD_TABLE
lea si,VGA_TABLE ; load VGA table
mov cx,VGA_NUM
call LOAD_TABLE
jmp short tlab07
; not VGA, must be MCGA
tlab09:
cmp [DI].ACTIVE_DISPLAY,MOD30_MONO
jz tlab06
cmp [DI].ACTIVE_DISPLAY,MOD30_COLOR
jz tlab06
cmp [DI].ALT_DISPLAY,MOD30_MONO
jz tlab06
cmp [DI].ALT_DISPLAY,MOD30_COLOR
jnz tlab07
tlab06:
or HDWR_FLAG,MCGA_ACTIVE ; so...set hdwr flag and...
lea si,COLOR_TABLE
mov cx,COLOR_NUM ; load color table +..
call LOAD_TABLE
lea si,MCGA_TABLE ; load MCGA table
mov cx,MCGA_NUM
call LOAD_TABLE
tlab07:
mov al,[DI].CURRENT_SCANS ; copy current scan line setting..
mov MAX_SCANS,al ; as maximum text mode scan setting.
les DI,[DI].STATIC_ADDRESS ; point to static functionality table
mov al,es:[DI].SCAN_TEXT ; load available scan line flag byte..
mov SCAN_LINES,al ; and store it in resident data.
jmp short DET_HDWR_DONE
; call not supported, try EGA
tlab11:
mov ah,alT_SELECT ; alternate select call
mov BL,EGA_INFO ; get EGA information subcall
int 10H
cmp bl,EGA_INFO ; see if call was valid
jz DET_HDWR_DONE
cmp bh,MONOCHROME ; yes, check for monochrome
jnz tlab17
or HDWR_FLAG,E5151_ACTIVE ; ..5151 found so set hdwr flag and..
lea si,EGA_5151_TABLE
mov cx,EGA_5151_NUM ; load 5151 table.
call LOAD_TABLE
jmp short DET_HDWR_DONE
tlab17:
and CL,0FH ; clear upper nibble of switch setting byte
cmp cl,9 ; test for switch settings of 5154
jz tlab13
cmp cl,3
jnz tlab14
tlab13:
or HDWR_FLAG,E5154_ACTIVE ; so..set hdwr flag and...
lea si,COLOR_TABLE
mov cx,COLOR_NUM ; load color table +..
call LOAD_TABLE
lea si,EGA_5154_TABLE ; load 5154 table
mov cx,EGA_5154_NUM
call LOAD_TABLE
jmp short DET_HDWR_DONE
; 5154 not found, must be 5153
tlab14:
or HDWR_FLAG,E5153_ACTIVE ; so..set hdwr flag and...
lea si,COLOR_TABLE
mov cx,COLOR_NUM ; load color table +..
call LOAD_TABLE
lea si,EGA_5153_TABLE ; load 5153 table
mov cx,EGA_5153_NUM
call LOAD_TABLE
DET_HDWR_DONE:
ret
DET_HDWR ENDP
; PROCEDURE_NAME: CHECK_BUF
; FUNCTION:
; THIS PROCEDURE WRITES TO THE VIDEO BUFFER AND READS THE DATA BACK
; AGAIN TO DETERMINE THE EXISTANCE OF THE VIDEO CARD.
; AT ENTRY:
; AT EXIT:
; NORMAL: AH EQ AL IF BUFFER PRESENT
; AH NE AL IF NO BUFFER
; ERROR: N/A
CHECK_BUF PROC NEAR ; write to video buffer to see if it is present
push ds
mov ds,ax ; load DS with address of buffer
mov CH,ds:0 ; save buffer information (if present)
mov al,55H ; prepare to write sample data
mov ds:0,al ; write to buffer
push BX ; terminate the bus so that lines..
pop BX ; are reset
mov ah,ds:0 ; bring sample data back...
mov ds:0,CH ; repair damage to buffer
pop ds
ret
CHECK_BUF ENDP
; PROCEDURE_NAME: LOAD_TABLE
; FUNCTION:
; THIS PROCEDURE COPIES ONE OF THE VIDEO TABLES INTO RESIDENT DATA.
; IT MAY BE REPEATED TO LOAD SEVERAL TABLES INTO THE SAME DATA SPACE.
; MATCHING MODES WILL BE OVERWRITTEN...THEREFORE..CARE MUST BE TAKEN
; IN LOAD ORDERING.
; AT ENTRY:
; SI: POINTS TO TOP OF TABLE TO COPY
; CX: NUMBER OF RECORDS TO COPY
; AT EXIT:
; NORMAL: TABLE POINTED TO BY SI IS COPIED INTO RESIDENT DATA AREA
; ERROR: N/A
LOAD_TABLE PROC NEAR
push DI ; save DI
push es ; and ES
push cs ; setup ES to code segment
pop es
lea DI,VIDEO_MODE_TABLE ; point DI to resident video table
while01:
cmp cx,0 ; do for as many records as there are
jz while01_exit
cmp di,VIDEO_TABLE_MAX ; check to ensure other data not overwritten
jge while01_exit ; cas --- signed compare!!!
mov al,[DI].V_MODE ; prepare to check resident table
cmp al,UNOCCUPIED ; if this spot is occupied
jz tlab20
cmp al,[si].V_MODE ; and is not the same mode then
jz tlab20
add DI,TYPE MODE_TABLE ; do not touch...go to next mode
jmp short while01
; can write at this location
tlab20:
push cx ; save record count
mov cx,TYPE MODE_TABLE ; load record length
rep movsb ; copy record to resident data
lea DI,VIDEO_MODE_TABLE ; Set DI to the top of the target again.
pop cx ; restore record count and..
dec cx ; decrement
jmp short while01
while01_exit:
pop es ; restore..
pop DI ; registers
ret
LOAD_TABLE ENDP
; PROCEDURE_NAME: LOAD_INT10
; FUNCTION:
; THIS PROCEDURE LOADS THE INTERRUPT HANDLER FOR INT10H
; AT ENTRY:
; AT EXIT:
; NORMAL: INTERRUPT 10H VECTOR POINTS TO INT10_COM. OLD INT 10H
; VECTOR STORED.
; ERROR: N/A
LOAD_INT10 PROC NEAR
push es
xor ax,ax ; point ES to low..
mov es,ax ; memory.
mov cx,es:WORD PTR INT10_LOW; store original..
mov cs:ROM_INT10,cx ; interrupt 10h..
mov cx,es:WORD PTR INT10_HI ; location..
mov cs:ROM_INT10+2,cx
cli
mov es:WORD PTR INT10_LOW,OFFSET INT10_COM ; replace vector..
mov es:WORD PTR INT10_HI,cs ; with our own..
sti
mov ax, DISPLAY_CHECK ;DISPLAY.SYS already loaded?
int 2fh
cmp al, INSTALLED
jne L_INT10_Ret
mov cs:Display_Loaded_Before_Me,1
L_INT10_Ret:
pop es
ret
LOAD_INT10 ENDP
; PROCEDURE_NAME: LOAD_INT2F
; FUNCTION:
; THIS PROCEDURE LOADS THE INTERRUPT HANDLER FOR INT2FH
; AT ENTRY:
; AT EXIT:
; NORMAL: INTERRUPT 2FH VECTOR POINTS TO INT2F_COM. OLD INT 2FH
; VECTOR STORED.
; ERROR: N/A
LOAD_INT2F PROC NEAR
push es
xor ax,ax ; point ES to low..
mov es,ax ; memory.
mov ax,es:WORD PTR INT2F_LOW; store original..
mov cs:ROM_INT2F,ax ; interrupt 2Fh..
mov cx,es:WORD PTR INT2F_HI ; location..
mov cs:ROM_INT2F+2,cx
or ax,cx ; check if old int2F is 0
jnz tlab21
mov ax,OFFSET ABORT ; yes....point to..
mov cs:ROM_INT2F,ax ; IRET.
mov ax,cs
mov cs:ROM_INT2F+2,ax
tlab21:
cli
mov es:WORD PTR INT2F_LOW,OFFSET INT2F_COM ; replace vector..
mov es:WORD PTR INT2F_HI,cs ; with our own..
sti
pop es
ret
LOAD_INT2F ENDP
CODE ENDS
END