540 lines
12 KiB
NASM
540 lines
12 KiB
NASM
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
|
||
|