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.
 
 
 
 
 
 

1226 lines
29 KiB

PAGE ,132
TITLE ANSI Generic IOCTL Code
;******************************************************************************
; Change Log:
; Date Who # Description
; -------- --- --- ------------------------------------------------------
; 06/29/90 MKS C04 Bug#1150. Video 7 Fastwrite VGA has problems if a
; Hercules mono board is the active display.
;******************************************************************************
;****************** START OF SPECIFICATIONS **************************
; MODULE NAME: IOCTL.ASM
; DESCRIPTIVE NAME: PERFORM THE GENERIC IOCTL CALL IN ANSI.SYS
; FUNCTION: THE GENERIC DEVICE IOCTL IS USED TO SET AND GET THE
; MODE OF THE DISPLAY DEVICE ACCORDING TO PARAMETERS PASSED
; IN A BUFFER. ADDITIONALLY, THE CALL CAN TOGGLE THE
; USE OF THE INTENSITY BIT, AND CAN LOAD THE 8X8 CHARACTER
; SET, EFFECTIVELY GIVING MORE LINES PER SCREEN. THE
; AVAILABILITY OF THIS FUNCTION VARIES STRONGLY WITH HARDWARE
; ATTACHED.
; ENTRY POINT: GENERIC_IOCTL
; INPUT: LOCATION OF REQUEST PACKET STORED DURING STRATEGY CALL.
; AT EXIT:
; NORMAL: CARRY CLEAR - DEVICE CHARACTERISTICS SET
; ERROR: CARRY SET - ERROR CODE IN AX.
; AX = 1 - INVALID FUNCTION. EXTENDED ERROR = 20
; AX = 10 - UNSUPPORTED FUNCTION ON CURRENT HARDWARE.
; EXTENDED ERROR = 29
; AX = 12 - DISPLAY.SYS DOES NOT HAVE 8X8 RAM CHARACTER SET.
; EXTENDED ERROR = 31
; INTERNAL REFERENCES:
; ROUTINES: GET_IOCTL - PERFORMS THE GET DEVICE CHARACTERISTICS
; SET_IOCTL - PERFORMS THE SET DEVICE CHARACTERISTICS
; GET_SEARCH - SEARCHES THE INTERNAL VIDEO TABLE FOR THE
; CURRENT MODE MATCH
; SET_SEARCH - SEARCHES THE INTERNAL VIDEO TABEL FOR THE
; CURRENT MODE MATCH
; SET_CURSOR_EMUL - SETS THE BIT THAT CONTROLS CURSOR EMULATION
; INT10_COM - INTERRUPT 10H HANDLER TO KEEP CURRENT SCREEN SIZE
; INT2F_COM - INTERRUPT 2FH INTERFACE TO GENERIC IOCTL
; MAP_DOWN - PERFORMS CURSOR TYPE MAPPING FOR EGA WITH MONOCHROME
; SET_VIDEO_MODE - SETS THE VIDEO MODE
; DATA AREAS: SCAN_LINE_TABLE - HOLDS SCAN LINE INFORMATION FOR PS/2
; FUNC_INFO - BUFFER FOR PS/2 FUNCTIONALITY CALL.
; EXTERNAL REFERENCES:
; ROUTINES: INT 10H SERVICES
; DATA AREAS: VIDEO_MODE_TABLE - INTERNAL TABLE FOR CHARACTERISTICS TO MODE
; MATCH-UPS
; NOTES:
; REVISION HISTORY:
; Label: "DOS ANSI.SYS Device Driver"
; "Version 4.00 (C) Copyright 1988 Microsoft"
; "Licensed Material - Program Property of Microsoft"
;****************** END OF SPECIFICATIONS ****************************
;Modification history *********************************************************
; P1350 Codepage switching not working on EGA 10/10/87 J.K.
; P1626 ANSI does not allow lines=43 with PS2,Monochrome 10/15/87 J.K.
; p1774 Lines=43 after selecting cp 850 does not work 10/20/87 J.K.
; p1740 MODE CON LINES command causes problem with PE2 w PS/210/24/87 J.K.
; p2167 Does'nt say EGA in medium resol. cannot do 43 lines 10/30/87 J.K.
; p2236 After esc [=0h, issuing INT10h,AH=fh returns mode=1. 11/3/87 J.K.
; p2305 With ANSI loaded, loading RDTE hangs the system 11/06/87 J.K.
; P2617 Order dependecy problem with Display.sys 11/23/87 J.K.
; p2716 HOT key of VITTORIA does not work properly 12/03/87 J.K.
; d398 /L option for Enforcing the number of lines 12/17/87 J.K.
; D425 For OS2 compatibiltiy box, /L option status query 01/14/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 when the alt. routine was
; invoked during initialization.
;******************************************************************************
INCLUDE DEVSYM.INC
INCLUDE ANSI.INC
INCLUDE MULT.INC
PUBLIC GENERIC_IOCTL
PUBLIC SET_IOCTL
PUBLIC GET_IOCTL
PUBLIC SET_SEARCH
PUBLIC GET_SEARCH
PUBLIC SET_CURSOR_EMUL
PUBLIC FUNC_INFO
PUBLIC MAX_SCANS
PUBLIC INT10_COM
PUBLIC SET_MODE_HANDLER
PUBLIC SET_CURSOR_HANDLER
PUBLIC ROM_INT10
PUBLIC INT2F_COM
PUBLIC INT2F_HANDLER
PUBLIC ROM_INT2F
PUBLIC ABORT
PUBLIC MAP_DOWN
PUBLIC SET_VIDEO_MODE
PUBLIC REQ_TXT_LENGTH
PUBLIC GRAPHICS_FLAG
PUBLIC DO_ROWS
PUBLIC Display_Loaded_Before_Me
CODE SEGMENT PUBLIC BYTE
ASSUME CS:CODE,DS:CODE
EXTRN PTRSAV:DWORD
EXTRN NO_OPERATION:NEAR
EXTRN ERR1:NEAR
EXTRN VIDEO_MODE_TABLE:BYTE
EXTRN MAX_VIDEO_TAB_NUM:ABS
EXTRN HDWR_FLAG:WORD
EXTRN SCAN_LINES:BYTE
EXTRN SWITCH_L:Byte ;Defined in ANSI.ASM
IFDEF JAPAN
EXTRN row_adj:byte
ENDIF
SCAN_LINE_TABLE LABEL BYTE
SCAN_LINE_STR <200,000000001B,0> ; 200 scan lines
SCAN_LINE_STR <344,000000010B,1> ; 350 scan lines
SCAN_LINE_STR <400,000000100B,2> ; 400 scan lines
SCANS_AVAILABLE EQU ($ - SCAN_LINE_TABLE)/TYPE SCAN_LINE_STR
;This is used when ANSI calls Get_IOCTL, Set_IOCTL by itself.
In_Generic_IOCTL_flag db 0
I_AM_IN_NOW EQU 00000001b
SET_MODE_BY_DISPLAY EQU 00000010b ;Display.sys calls Set mode INT 10h.
CALLED_BY_INT10COM EQU 00000100b ;To prevent from calling set mode int 10h again.
INT10_V_Mode db 0ffh ;Used by INT10_COM
My_IOCTL_Req_Packet REQ_PCKT <0,0,0Eh,0,?,0,?,?,?,?,?>
FUNC_INFO INFO_BLOCK <> ;data block for functionality call
ROM_INT10 DW ? ;segment and offset of original..
DW ? ;interrupt 10h vector.
ROM_INT2F DW ? ;segment and offset of original..
DW ? ;interrupt 2Fh vector.
INTENSITY_FLAG DW OFF ;intensity flag initially off
REQ_TXT_LENGTH DW DEFAULT_LENGTH ;requested text screen length
SCAN_DESIRED DB 0 ;scan lines desired
MAX_SCANS DB 0 ;maximum scan line setting
GRAPHICS_FLAG DB TEXT_MODE ;flag for graphics mode
Display_Loaded_Before_Me db 0 ;flag
ANSI_SetMode_Call_Flag db 0 ;Ansi is issuing INT10,AH=0.
ALT_PRT_SC_INVOKED DB FALSE ;indicates that have already set up alternat print screen routine
; PROCEDURE_NAME: GENERIC_IOCTL
; FUNCTION:
; TO GET OR SET DEVICE CHARACTERISTICS ACCORDING TO THE BUFFER PASSED
; IN THE REQUEST PACKET.
; AT ENTRY:
; AT EXIT:
; NORMAL: CARRY CLEAR - DEVICE CHARACTERISTICS SET
; ERROR: CARRY SET - ERROR CODE IN AL. (SEE MODULE DESCRIPTION ABOVE).
; NOTE: THIS PROC IS PERFORMED AS A JMP AS WITH THE OLD ANSI CALLS.
GENERIC_IOCTL:
les bx,[PTRSAV] ; establish addressability to request header
mov al,es:[bx].MINORFUNCTION
les di,es:[bx].GENERICIOCTL_PACKET ; point to request packet
cmp al,GET_FUNC ; is this get subfunction?
jnz gi_not_get
call GET_IOCTL ; yes...execute routine
jmp short gi_check_error
gi_not_get:
cmp al,SET_FUNC ; is this the set subfunction?
jnz gi_none
call SET_IOCTL ; yes....execute routine
gi_check_error:
jnc gi_done ; branch if no error
or ax,CMD_ERROR ; yes...set error bit in status
gi_done:
or ax,DONE ; add done bit to status
jmp ERR1 ; return with status in ax
gi_none:
jmp NO_OPERATION ; call lower CON device
; PROCEDURE_NAME: GET_IOCTL
; FUNCTION:
; THIS PROCEDURE RETURNS DEVICE CHARACTERISTICS.
; AT ENTRY: ES:DI POINTS TO REQUEST BUFFER
; AT EXIT:
; NORMAL: CARRY CLEAR - REQUEST BUFFER CONTAINS DEVICE CHARACTERISTICS
; ERROR: CARRY SET - ERROR CONDITION IN AX
GET_IOCTL PROC NEAR
cmp es:[di].INFO_LEVEL,0 ; check for valid info level
jnz gi_invalid
cmp es:[di].DATA_LENGTH,TYPE MODE_TABLE+1 ; and buffer size
jge gi_valid
gi_invalid:
mov ax,INVALID_FUNC ; not valid...unsupported
stc ; function..set error flag and
ret
gi_valid:
mov es:[di].INFO_LEVEL+1,0 ; set reserved byte to 0.
mov ah,REQ_VID_MODE ; request current video mode
int 10H
and al,VIDEO_MASK
lea si,VIDEO_MODE_TABLE ; point to resident video table
call GET_SEARCH ; perform search
jnc gi_supported ; found?
mov ax,NOT_SUPPORTED ; no....load unsupported function
ret ; carry already set
gi_supported:
push di ;Save Request Buffer pointer
mov WORD PTR es:[di].DATA_LENGTH,(TYPE MODE_TABLE)+1 ;length of data is struc size
inc si ; skip mode value
add di,RP_FLAGS ; point to flag word
; VGA,MCGA: VALUE RETURNED FROM FUNCTIONALITY CALL
; EGA: VALUE LAST SET THROUGH IOCTL. DEFAULT IS BLINKING.
; CGA,MONO: BLINKING
cmp al,7 ; M004; Monochrome screen?
mov ax,OFF ; assume CGA,MONO
; (we always have blink).
jz gi_flags_done ; M004;
cmp HDWR_FLAG,MCGA_ACTIVE ; if we have an EGA or better
jl gi_flags_done
test HDWR_FLAG,VGA_ACTIVE ; VGA supported?
jz gi_as_intensity_flag
push es ; yes...prepare for
push di ; functionality call
push ds
pop es
lea di,FUNC_INFO ; point to data block
mov ah,FUNC_CALL ; load function number
xor bx,bx ; implementation type 0
int 10H
mov INTENSITY_FLAG,OFF ; assume no intensity
test es:[di].MISC_INFO,INT_BIT ; is blink bit set?
jnz gi_intensity_is_fine ; if not no intensity
inc INTENSITY_FLAG ; we want intensity
gi_intensity_is_fine:
pop di ; restore registers
pop es
gi_as_intensity_flag:
mov ax,INTENSITY_FLAG ; write the control flag..
gi_flags_done:
stosw ; write the control flag..
; point to next field (display)
mov cx,(TYPE MODE_TABLE)-1 ; load count
rep movsb ; transfer data from video table
; to request packet
sub si,TYPE MODE_TABLE ; point back to start of mode data
ifdef JAPAN
dec di ; point to number of rows
dec di
ENDIF
cmp [si].D_MODE,TEXT_MODE ; if we are in text mode and
jnz gi_row_counted
cmp [si].SCR_ROWS,DEFAULT_LENGTH ; length <> 25 then we have an EGA or VGA
jz gi_row_counted
ifndef JAPAN
dec di ; point back to length entry in req packet
dec di
ENDIF
push ds
mov ax,ROM_BIOS ; load ROM BIOS data area segment
mov ds,ax
mov al,BYTE PTR ds:[NUM_ROWS] ; load current number of rows
cbw
inc ax ; add 1 to row count
mov WORD PTR es:[di],ax ; and copy to request packet
pop ds
gi_row_counted:
ifdef JAPAN
mov al,row_adj
xor ah,ah
sub es:[di],ax ; support ESC[>1l
ENDIF
xor ax,ax ; no errors
clc ; clear error flag
pop di ; Restore Request Buffer pointer
ret ; return to calling module
GET_IOCTL ENDP
; PROCEDURE_NAME: SET_IOCTL
; FUNCTION:
; THIS PROCEDURE SETS THE VIDEO MODE AND CHARACTER SET ACCORDING
; TO THE CHARACTERSTICS PROVIDED.
; AT ENTRY:
; ES:[DI] POINTS TO REQUEST BUFFER
; AT EXIT:
; NORMAL: CLEAR CARRY - VIDEO MODE SET
; ERROR: CARRY SET - ERROR CONDITION IN AX
SET_IOCTL PROC NEAR
or In_Generic_IOCTL_Flag, I_AM_IN_NOW ; Signal GENERIC_IOCTL request being processed
push REQ_TXT_LENGTH ; save old value in case of error
ifdef JAPAN
push word ptr row_adj
endif
cmp es:[di].INFO_LEVEL,0 ; check for valid info level
jnz si_invalid
cmp es:[di].DATA_LENGTH,TYPE MODE_TABLE+1 ; ane buffer size
jnz si_invalid
mov ax,es:[di].RP_FLAGS ; test for invalid flags
test ax,INVALID_FLAGS
jnz si_invalid
test es:[di].RP_FLAGS,ON ; if intensity is requested and..
jz si_valid
cmp HDWR_FLAG,MCGA_ACTIVE ; hardware does not support it
jge si_valid
si_invalid:
mov ax,INVALID_FUNC ; not valid...unsupported..
jmp si_failed
si_valid:
call SET_SEARCH ; search table for match
jnc si_mode_valid
si_not_supp:
jmp si_not_supported
si_mode_valid:
cmp [si].D_MODE,TEXT_MODE ; is a text mode being requested?
jz si_do_text_mode
call SET_VIDEO_MODE
jmp si_end_ok
si_do_text_mode:
mov ax,es:[di].RP_ROWS ; save new requested value.
ifdef JAPAN
mov row_adj,0
cmp ax,DEFAULT_LENGTH-1
jnz @f
mov row_adj,1
inc ax
@@:
endif
mov REQ_TXT_LENGTH,ax
cmp ax,DEFAULT_LENGTH ; is it just 25 lines needed?
jz si_display_ok
mov ax,DISPLAY_CHECK
int 2FH
cmp al,INSTALLED ; or is DISPLAY.SYS not there?
jnz si_display_ok
mov ax,CHECK_FOR_FONT
int 2FH ; or if it is does it have the..
jnc si_display_ok
mov ax,NOT_AVAILABLE ; DISPLAY.SYS does not have the font
jmp si_failed
si_display_ok:
cmp [si].SCR_ROWS,UNOCCUPIED
jz si_is_vga
test HDWR_FLAG,VGA_ACTIVE
jz si_non_vga
si_is_vga:
mov ax,1A00h ;Get currently active adap.;C04
int 10h ;VGA interrupt ;C04
mov ax,REQ_TXT_LENGTH ; restore AX
cmp bl,7 ;Q: non_vga adapter? ;C04
jb si_non_vga ;Yes so do other stuff ;C04
process_vga:
mov cl,3 ; ax loaded with length requested
shl ax,cl ; mulitply by 8 to get scan lines
lea bx,SCAN_LINE_TABLE ; load bx with scan line table start
mov cx,SCANS_AVAILABLE ; total number of scan lines settings
pv_while:
cmp ax,[bx].NUM_LINES ; pointing at the right setting?
jz pv_found
add bx,TYPE SCAN_LINE_STR ; not this setting..point to next
loop pv_while
jmp short si_not_supp
pv_found:
mov dl,[bx].REP_1BH
test SCAN_LINES,dl ; does the hardware have it?
jz si_not_supp
mov cl,[bx].REP_12H ; yes, store value to set it
mov SCAN_DESIRED,cl
cmp REQ_TXT_LENGTH,DEFAULT_LENGTH ; 25 lines requested?
jnz pv_scan_ok
mov al,MAX_SCANS ; desired scan setting should be..
mov SCAN_DESIRED,AL ; the maximum.
pv_scan_ok:
; following added to overcome problems with rolling
; screens in QBX and WZMAIL. Problem still exists when switching between
; mono and VGA screens when ANSI is loaded with /L.
test In_Generic_IOCTL_Flag,CALLED_BY_INT10COM
jnz si_set_mode_done
mov ah,ALT_SELECT ; set the appropriate number..
mov bl,SELECT_SCAN ; of scan lines..
mov al,SCAN_DESIRED
int 10H
jmp short si_processed
si_non_vga:
mov ax,REQ_TXT_LENGTH
cmp ax,DEFAULT_LENGTH ; see if length requested..
jz si_cursor_emul ; is valid
cmp ax,[si].SCR_ROWS
jnz si_not_supported
si_cursor_emul:
call SET_CURSOR_EMUL
si_processed:
call SET_VIDEO_MODE
si_set_mode_done:
call DO_ROWS
cmp ALT_PRT_SC_INVOKED,FALSE ; If not set up already
jnz si_printscreen_ok
cmp es:[di].RP_ROWS,DEFAULT_LENGTH ; and needed because lines (or 30?)
jle si_printscreen_ok
cmp HDWR_FLAG,MCGA_ACTIVE ; and if we have EGA or better then.. (supported)
jl si_printscreen_ok
mov ah,ALT_SELECT ; issue select alternate print..
mov BL,ALT_PRT_SC ; screen routine call..
int 10H
mov ALT_PRT_SC_INVOKED,TRUE ; mark that it was done
si_printscreen_ok:
call SET_CURSOR_EMUL ; yes..ensure cursor emulation
; is set accordingly.
cmp HDWR_FLAG,MCGA_ACTIVE ; for the EGA and better...
jl si_end_ok
cmp [si].V_MODE,7 ; M004; and not monochrome
jz si_end_ok
xor bx,bx ; bx: 1=intensity on, 0: off
; assume off
test es:[di].RP_FLAGS,ON
jz si_intensity_ok
inc bx ; user wants intensity
si_intensity_ok:
mov INTENSITY_FLAG,bx
mov ax,BLINK_TOGGLE
xor bl,ON ; bl is opposite
; of INTENSITY_FLAG
int 10H
si_end_ok:
and In_Generic_IOCTL_Flag, NOT I_AM_IN_NOW ; Turn the flag off
ifdef JAPAN
pop ax ; throw old row_adj
endif
pop ax ; forget old REQ_TXT_LENGTH
xor ax,ax ; clear error register
clc ; clear error flag
ret
si_not_supported:
mov ax,NOT_SUPPORTED
si_failed:
and In_Generic_IOCTL_Flag, NOT I_AM_IN_NOW ; Turn the flag off
ifdef JAPAN
pop word ptr row_adj
endif
pop REQ_TXT_LENGTH ; error...so restore old value.
stc ; set error flag
ret
SET_IOCTL ENDP
; Procedure name: DO_ROWS
; Function:
; Only called for TEXT_MODE.
; If (REQ_TXT_LENGTH <> DEFAULT_LENGTH) &
; (DISPLAY.SYS not loaded or CODEPAGE not active)
; then
; LOAD ROM 8X8 charater.
DO_ROWS PROC NEAR
cmp req_txt_length, DEFAULT_LENGTH
je dr_exit
mov ax,LOAD_8X8 ; load 8x8 ROM font
xor bl,bl
int 10H ; M003;
mov ax,SET_BLOCK_0 ; activate block = 0
xor bl,bl
int 10H ; M003;
dr_exit:
ret
DO_ROWS ENDP
; PROCEDURE_NAME: SET_SEARCH
; FUNCTION:
; THIS PROCEDURE SEARCHES THE RESIDENT VIDEO TABLE IN ATTEMPT TO
; FIND A MODE THAT MATCHES THE CHARACTERISTICS REQUESTED.
; AT ENTRY:
; AT EXIT:
; NORMAL: CARRY CLEAR - SI POINTS TO APPLICABLE RECORD
; ERROR: CARRY SET
; When INT10_V_Mode <> 0FFH, then assumes that the user
; issuing INT10h, Set mode function call. Unlike Generic IOCTL
; set mode call, the user already has taken care of the video mode.
; So, we also find the matching V_MODE.
; WARNING: TRASH CX
SET_SEARCH PROC NEAR
lea si,VIDEO_MODE_TABLE ; point to video table
mov cx,MAX_VIDEO_TAB_NUM ; load counter, # of tables
ss_while:
cmp [si].V_MODE,UNOCCUPIED ; while we have valid entries
jz ss_not_found
mov al,INT10_V_Mode
cmp al,0ffh ; if not issued by Int10 set mode,
jnz ss_from_set_mode
mov al,es:[di].RP_MODE ; load register for compare.
cmp [si].D_MODE,al ; match?
jnz ss_end_while
mov ax,es:[di].RP_COLORS ; yes...prepare next field
cmp [si].COLORS,ax ; match?
jnz ss_end_while
cmp es:[di].RESERVED2,0 ; yes, ensure reserved byte is zero
jnz ss_end_while
cmp es:[di].RP_MODE,GRAPHICS_MODE ; for graphics mode
jnz ss_not_graphic ; check the following:
mov ax,es:[di].RP_WIDTH ; screen width.
cmp [si].SCR_WIDTH,ax
jnz ss_end_while
mov ax,es:[di].RP_LENGTH ; screen length
cmp [si].SCR_LENGTH,ax
jnz ss_end_while ; ignore #rows and #coloumns
jmp short ss_found
ss_not_graphic:
mov ax,es:[di].RP_COLS ; the rows are matched
cmp [si].SCR_COLS,ax ; in the main routine
jnz ss_end_while
ss_found:
clc
jmp short ss_done
ss_from_set_mode:
cmp [si].V_MODE,al ; if V_MODE = AL, we are ok
jz ss_found
ss_end_while:
add si,type MODE_TABLE ; then, this is not the correct entry.
loop ss_while ; Let's find the next entry.
ss_not_found:
stc
ss_done:
mov INT10_V_Mode, 0FFh ; Done. Reset the value
ret
SET_SEARCH ENDP
; PROCEDURE_NAME: GET_SEARCH
; FUNCTION:
; THIS PROCEDURE SEARCHES THE VIDEO TABLE LOOKING FOR A MATCHING
; VIDEO MODE.
; AT ENTRY: DS:SI POINTS TO VIDEO TABLE
; AL CONTAINS THE MODE REQUESTED
; AT EXIT:
; NORMAL: CARRY CLEAR, DS:SI POINTS TO MATCHING RECORD
; ERROR: CARRY SET
; WARNING: TRASH CX
GET_SEARCH PROC NEAR
mov cx,MAX_VIDEO_TAB_NUM ; # of total tables
gs_while:
cmp [si].V_MODE,UNOCCUPIED ; while we're not pointing to
jz gs_error
cmp [si].V_MODE,al ; the right mode and we are still
jz gs_got_it
add si,TYPE MODE_TABLE ; point to the next mode
loop gs_while
gs_error:
stc ; no, set error flag
ret
gs_got_it:
clc
ret
GET_SEARCH ENDP
; PROCEDURE_NAME: SET_CURSOR_EMUL
; FUNCTION:
; THIS PROCEDURE SETS THE CURSOR EMULATION BIT OFF IN ROM BIOS. THIS
; IS TO PROVIDE A CURSOR ON THE EGA WITH THE 5154 LOADED WITH AN 8X8
; CHARACTER SET.
; AT ENTRY:
; AT EXIT:
; NORMAL: CURSOR EMULATION BIT SET FOR APPLICABLE HARDWARE
; ERROR: N/A
SET_CURSOR_EMUL PROC NEAR
test HDWR_FLAG,E5154_ACTIVE ; EGA with 5154?
jz sce_done
push si
push ds ; yes..so..
mov ax,ROM_BIOS ; check cursor emulation..
mov ds,ax
mov si,CURSOR_FLAG
mov al,BYTE PTR [si]
cmp cs:REQ_TXT_LENGTH,DEFAULT_LENGTH; >25 lines req?
jnz sce_cursor_on
and al,TURN_OFF ; no....set it OFF
jmp short sce_cursor_ok
sce_cursor_on:
or al,TURN_ON ; yes...set it ON
sce_cursor_ok:
mov BYTE PTR [si],AL
pop ds
pop si
sce_done:
ret ; return to calling module
SET_CURSOR_EMUL ENDP
; PROCEDURE_NAME: INT10_COM
; FUNCTION:
; THIS IS THE INTERRUPT 10H HANDLER TO CAPTURE THE FOLLOWING FUNCTIONS:
; AH=1H (SET CURSOR TYPE). CURSOR EMULATION IS PERFORMED IF WE HAVE
; AND EGA WITH A 5151 MONITOR, AND 43 LINES IS REQUESTED.
;M002; What is bellow was modified. The /L option was removed. But ansi
;M002; will still do a GET_IOCTL/SET_IOCTL for the application.
; AH=0H (SET MODE) SCREEN LENGTH IS MAINTAINED WHEN POSSIBLE. (IE. IN
; TEXT MODES ONLY.)
; AN004; Capturing Set Mode call and enforcing the # of Rows based on the
; previous Set_IOCTL request lines was a design mistake. ANSI cannot
; covers the all the application program out there which use INT 10h
; directly to make a full screen interface by their own way.
; This part of logic has been taken out by the management decision.
; Instead, for each set mdoe INT 10h function call, if it were not
; issued by SET_IOCTL procedures itself, or by DISPLAY.SYS program,
; then we assume that it was issued by an APPS, that usually does not
; know the new ANSI GET_IOCTL/SET_IOCTL interfaces.
; In this case, ANSI is going to call GET_IOCTL and SET_IOCTL function
; call - This is not to lose the local data consistency in ANSI.
; AT ENTRY:
; AT EXIT:
; NORMAL:
; ERROR:
INT10_COM PROC NEAR
sti ; restore interrupts
cmp ah,SET_CURSOR_CALL
jz SET_CURSOR_HANDLER
cmp ah,SET_MODE
jz SET_MODE_HANDLER
jmp DWORD PTR cs:ROM_INT10 ; no...pass it on.
SET_CURSOR_HANDLER:
push ax
test cs:HDWR_FLAG,E5151_ACTIVE ; do we have an EGA?
jz sch_goto_rom
cmp cs:REQ_TXT_LENGTH,DEFAULT_LENGTH
jz sch_goto_rom
cmp cs:GRAPHICS_FLAG,TEXT_MODE ; with 5151..so perform cursor mapping
jnz sch_goto_rom
cmp cl,8
jl sch_goto_rom
mov al,ch ; check for cursor..
and al,60h ; off emulation. J.K.
cmp al,20h
jz sch_goto_rom
mov al,ch ; start position for cursor
call MAP_DOWN
mov ch,al
mov al,cl ; end position for cursor
call MAP_DOWN
mov cl,al
sch_goto_rom:
pop ax
jmp DWORD PTR CS:ROM_INT10 ; continue interrupt processing
SET_MODE_HANDLER:
pushf ; prepare for IRET
mov cs:ANSI_SetMode_Call_Flag, 1 ; Used by INT2F_COM
call DWORD PTR CS:ROM_INT10 ; call INT10 routine
mov cs:ANSI_SetMode_Call_Flag, 0 ; Reset it
push bp
push es
push ds
push si
push di
push dx
push cx
push bx
push ax
push cs
pop ds
mov ah,REQ_VID_MODE ; get current mode..
pushf
call DWORD PTR ROM_INT10
and al,VIDEO_MASK ; mask bit 7 (refresh)
test In_Generic_IOCTL_Flag, (I_AM_IN_NOW + SET_MODE_BY_DISPLAY) ; Flag is on?
;If not (I_AM_IN_NOW or SET_MODE_BY_DISPLAY),
jnz smh_ioctl_done
; cmp SWITCH_L,0 ;M002; No more /L
; jnz smh_ioctl_done ;M002; No more /L
push ax ;Save mode
push es
push cs
pop es
mov di,offset My_IOCTL_Req_Packet
mov INT10_V_Mode,al ;Save current mode for SET_SEARCH
call Get_IOCTL
jc smh_set_ioctl_done
or In_Generic_IOCTL_Flag, CALLED_BY_INT10COM ;Do not set mode INT 10h again. Already done.
call Set_IOCTL
and In_Generic_IOCTL_Flag, not CALLED_BY_INT10COM
smh_set_ioctl_done:
pop es
pop ax ;Restore mode
mov INT10_V_Mode,0FFh
smh_ioctl_done:
lea si,VIDEO_MODE_TABLE
call GET_SEARCH ; look through table for mode selected.
jc smh_graphic_mode ; M001; if not found then
; M001; assume graphic mode
cmp [si].D_MODE,TEXT_MODE ; text mode?
jz smh_text_mode
smh_graphic_mode:
mov GRAPHICS_FLAG,GRAPHICS_MODE ; no, set graphics flag
jmp short smh_flag_done
smh_text_mode:
mov GRAPHICS_FLAG,TEXT_MODE ; set TEXT MODE
smh_flag_done:
; test In_Generic_IOCTL_Flag, I_AM_IN_NOW
; jnz smh_l_done ; M002; No more /L
; cmp Graphics_Flag,TEXT_MODE ; M002; No more /L
; jnz smh_l_done ; M002; No more /L
; cmp SWITCH_L,1 ; M002; No more /L
; jnz smh_l_done ; M002; No more /L
; call DO_ROWS ; M002; No more /L
smh_l_done:
;For each SET mode function int 10h function call, if it is not
;issued by ANSI GET_IOCTL and SET_IOCTL procedure themselves, we assume
;that the APPS, which usually does not know the ANSI GET_IOCTL/SET_IOCTL
;interfaces, intend to change the screen mode. In this case, ANSI is
;kind enough to call GET_IOCTL and SET_IOCTL function call for themselves.
pop ax
pop bx
pop cx
pop dx
pop di
pop si
pop ds
pop es
pop bp
iret
INT10_COM ENDP
; PROCEDURE_NAME: INT2F_COM
; FUNCTION:
; THIS IS THE INTERRUPT 2FH HANDLER TO CAPTURE THE FOLLOWING FUNCTIONS:
; ax=1A00H INSTALL REQUEST. ANSI WILL RETURN AL=FFH IF LOADED.
; AH=1A01H THIS IS THE INT2FH INTERFACE TO THE GENERIC IOCTL.
; NOTE: THE GET CHARACTERISTICS FUNCTION CALL WILL RETURN
; THE REQ_TXT_LENGTH IN THE BUFFER AS OPPOSED TO
; THE ACTUAL HARDWARE SCREEN_LENGTH
; Ax=1A02h This is an information passing from DISPLAY.SYS about
; the INT 10h, SET MODE call.
; AT ENTRY:
; AT EXIT:
; NORMAL:
; ERROR:
INT2F_COM PROC NEAR
sti
cmp ah,multANSI ; is this for ANSI?
jnz ic_goto_rom
cmp al,DA_INFO_2F
jle INT2F_HANDLER
ic_goto_rom:
jmp DWORD PTR CS:ROM_INT2F ; no....jump to old INT2F
INT2F_HANDLER:
cmp al,INSTALL_CHECK
jnz ih_not_check
; do install check
mov al,INSTALLED ; load value to indicate installed
clc ; clear error flag.
jmp ih_iret
ih_not_check:
cmp al,DA_INFO_2F ; IOCTL or INFO passing?
jbe ih_valid
jmp ih_iret
ih_valid:
push bp
push ax ; s
push cx ; a
push dx ; v
push ds ; e r
push es ; e
push di ; g
push si ; s.
push bx
push ds ; load ES with DS (for call)
pop es
mov di,dx ; load DI with dx (for call)
push cs ; setup local addressability
pop ds
cmp al,IOCTL_2F ; IOCTL request
jnz ih_not_ioctl
cmp cl,GET_FUNC ; get function requested.
jnz ih_not_get
call GET_IOCTL
jc ih_set_flags ; if no error and
cmp HDWR_FLAG,E5151_ACTIVE ; >25 lines supported
jl ih_set_flags
cmp [si].D_MODE,TEXT_MODE ; this is a text mode then..
jnz ih_set_flags
; cmp SWITCH_L,1 ; M002; No more /L
; jz ih_use_rtl ; M002; No more /L
cmp ANSI_SetMode_Call_Flag,1
jnz ih_use_rtl ; if not originated by ANSI thru AH=0, Int10
cmp Display_Loaded_Before_me,1 ; or Display.sys not loaded before ANSI,
jz ih_get_ok
ih_use_rtl:
mov bx,REQ_TXT_LENGTH ; then use REQ_TXT_LENGTH instead..
ifdef JAPAN
sub bl,row_adj
endif
mov es:[di].RP_ROWS,bx
ih_get_ok:
clc
jmp short ih_set_flags
ih_not_get:
cmp cl,SET_FUNC
jnz ih_invalid
call SET_IOCTL ; set function requested.
jmp short ih_set_flags
; invalid function
ih_invalid:
mov ax,INVALID_FUNC ; load error and...
stc ; set error flag.
jmp short ih_set_flags ; Info. passing
ih_not_ioctl:
cmp es:[di].DA_INFO_LEVEL,0 ; 0 - DA_SETMODE_FLAG request
jnz ih_not_info
cmp es:[di].DA_SETMODE_FLAG,1
jnz ih_not_set
or In_Generic_IOCTL_Flag, SET_MODE_BY_DISPLAY ;Turn the flag on
jmp short ih_info_ok
ih_not_set:
and In_Generic_IOCTL_Flag, not SET_MODE_BY_DISPLAY ;Turn the flag off
jmp short ih_info_ok
ih_not_info:
cmp es:[di].DA_INFO_LEVEL,1 ; 1 = DA_L_STATA query
jnz ih_info_ok
; mov al,cs:[SWITCH_L] ; M002; No more /L
mov al,OFF ; M002; No more /L
mov es:[di].DA_L_STATE, al
ih_info_ok:
clc ; clear carry. There is no Error in DOS 4.00 for this call.
ih_set_flags:
pop bx ; restore all..
pop si
pop di ; registers except..
pop es
pop ds ; BP.
pop dx
pop cx
push ax ; save error condition
mov bp,sp ; setup frame pointer
mov ax,[bp+10] ; load stack flags
jc ih_error ; carry set???
and ax,NOT_CY ; no.. set carry off.
mov [bp+10],ax ; put back on stack.
pop ax ; remove error flag from stack
pop ax ; no error so bring back function call
XCHG ah,al ; exchange to show that ANSI present
jmp short ih_pop_bp
ih_error:
or ax,CY ; yes...set carry on.
mov [bp+10],ax ; put back on stack.
pop ax ; restore error flag
pop bp ; pop off saved value of ax (destroyed)
ih_pop_bp:
pop bp ; restore final register.
ih_iret:
ABORT: iret
INT2F_COM ENDP
; PROCEDURE_NAME: MAP_DOWN
; FUNCTION:
; THIS PROCEDURE MAPS THE CURSOR START (END) POSITION FROM A 14 PEL
; BOX SIZE TO AN 8 PEL BOX SIZE.
; AT ENTRY: AL HAS THE CURSOR START (END) TO BE MAPPED.
; AT EXIT:
; NORMAL: AL CONTAINS THE MAPPED POSITION FOR CURSOR START (END)
; ERROR: N/A
MAP_DOWN PROC NEAR
push bx
xor ah,ah ; clear upper byte of cursor position
mov bl,EIGHT ; multiply by current box size.
push dx ; al x
mul bl ; ---- = ---
pop dx ; 14 8
mov bl,FOURTEEN
div bl ; divide by box size expected.
pop bx
ret
MAP_DOWN ENDP
; PROCEDURE_NAME: SET_VIDEO_MODE
; FUNCTION:
; THIS PROCEDURE SETS THE VIDEO MODE SPECIFIED IN DS:[SI].V_MODE.
; AT ENTRY: DS:SI.V_MODE CONTAINS MODE NUMBER
; AT EXIT:
; NORMAL: MODE SET
; ERROR: N/A
SET_VIDEO_MODE PROC NEAR
test In_Generic_IOCTL_Flag,CALLED_BY_INT10COM
jnz svm_done
mov al,[si].V_MODE ; ..issue set mode
test HDWR_FLAG,LCD_ACTIVE
jnz svm_update_bios ; is this the LCD?
test HDWR_FLAG,VGA_ACTIVE ; or VGA? (done for BRECON card)
jz svm_update_done
svm_update_bios:
push ds ; yes...
mov bl,al ; save mode
mov ax,ROM_BIOS
mov ds,ax ; get equipment status flag..
mov ax,ds:[EQUIP_FLAG]
and ax,INIT_VID_MASK ; clear initial video bits..
cmp bl,MODE7 ; are we setting mono?
jz svm_mono
cmp bl,MODE15
jnz svm_color
svm_mono:
or ax,LCD_MONO_MODE ; yes...set bits as mono
jmp short svm_update_it
svm_color:
or ax,LCD_COLOR_MODE ; no...set bits as color
svm_update_it:
mov ds:[EQUIP_FLAG],ax ; replace updated flag.
mov al,bl ; restore mode.
pop ds
svm_update_done:
mov ah,SET_MODE ; set mode
int 10H
svm_done:
ret
SET_VIDEO_MODE ENDP
CODE ENDS
END