Setting Number of Lines with ANSI.SYS

ID Number: Q67585

4.00 4.01

MS-DOS

buglist4.00 buglist4.01

Summary:

ANSI.SYS does not handle resolution modes greater than 25 lines. If a

VGA is set to mode 12 and more than 25 lines of data are displayed,

the 25th is repeatedly overwritten. It is expected behavior that the

MS-DOS 4.01 doesn't recognize a change in the number of character rows

if the change is made by any other means than MODE CO80,nn, or the Int

21h/Function 44h API described below.

ANSI.SYS should recognize a change to the number of character rows

displayed when the change is made by standard ROM BIOS calls from

third-party applications.

Microsoft has confirmed this current limitation to be a problem with

the MS-DOS 4.01 ANSI.SYS. We are researching this problem and will

post new information here as it becomes available.

More Information:

ANSI.SYS keeps a table of video configuration information in its

internal data area. Since it does not detect a video-mode change that

was issued directly to the video card or via a ROM BIOS call, the

internal table retains 25 as the number of text lines. The ROM BIOS,

however, is aware of the number of lines on the screen. It is this

discontinuity that causes the strange results observed.

The MS-DOS 4.00 ANSI.SYS driver requires a generic IOCtl to get and

set the display information (interrupt 21h, function 44h, sub-function

0Ch, major code 03h, minor codes 7fh and 5fh). These minor codes are a

new addition to MS-DOS 4.00. The MODE command uses this method to

change the number of video text lines when you issue a MODE command

such as:

MODE CO80,43

You can call the MS-DOS int 21h function from assembly by setting the

registers as follows:

AH = 44h ;IOCtl

AL = 0Ch ;Character device generic

CH = 03h ;Major code

;Choose one of the following minor codes:

CL = 7Fh ;Get configuration

CL = 5Fh ;Set configuration

BX = Handle of opened CON device

DS:DX = segment:offset of parameter block.

The structure of the parameter block for the Get/Set Display

Information IOCtl is as follows:

Size Value Description

---- ----- ------------------------

byte 0 Level (MS-DOS 4.0 = 0)

byte 0 Reserved

word 14 Length of following data

word ? Control flags: 0=intensity, 1=blink

byte ? Mode type: 1=text, 2=APA

byte 0 Reserved

word ? Colors, 0=monochrome, 1=2 color, 2=4 color,

4=16 color, 8=256 colors

word ? Pixel columns

word ? Pixel rows

word ? Character columns

word ? Character rows

It is best to get the parameter block, modify it, and then set it.

This will allow the changing of the fields that need to be altered

while leaving the other parameters the same.

This IOCtl function is documented on pages 205-207 in the "Microsoft

MS-DOS Programmer's Reference" version 4.0 (Part #04943). It is also

documented in Ray Duncan's "Advanced MS-DOS Programming," 2nd Edition.

Ray Duncan's book contains a more detailed description of the data

structure used by this function call.