---
name: "libvga.config"
section: "5"
platform: "linux"
package: "libsvga1"
version: "1:1.4.3-33"
release: "Debian 7 (Wheezy)"
platforms: ["linux"]
url: "https://new.carta.tech/libvga.config"
---

# libvga.config(5)

the svgalib configuration file

## NAME

libvga.config, svgalibrc - the svgalib configuration file

## DESCRIPTION

The svgalib configuration is usually located in */etc/vga/libvga.config* though one can reconfigure this location when recompiling svgalib.

In the configuration file, everything between a **#** and the end of the line is ignored. Empty lines are also ignored. Since the driver you will use may not know all config options here, unknown commands are silently ignored. Please think of that when something does not work as you expect. I know this is a nuisance because malformed configuration statements do not cause errors. Multiple commands are allowed in one line, and commands can exceed lines.

Actually, svgalib simply reads a list of whitespace separated tokens from the file until it finds one it knows and it then assumes the following tokens to be arguments of that command until one is encountered which may not be an argument.

New style options are in general case insensitive whereas the old style options are case sensitive. The old style options are included to allow for old config files still being used. For completeness they are documented in the **OBSOLETE COMMANDS** section. You should not use them anymore.

In addition, [**svgalib**(7)](/svgalib/7.md) parses the files *~/.svgalibrc* and the file given in the environment variable **SVGALIB\_CONFIG\_FILE**.

Finally, the contents of the environment variable **SVGALIB\_CONFIG** are parsed like the files before.

Configuration commands which control hardware settings that might cause harm to your hardware are called **privileged**. By default the **privileged** commands can only be used in the main configuration file */etc/vga/libvga.config* for safety (s.t. a non root user can not cause any harm to your hardware by misconfiguring [**svgalib**(7)](/svgalib/7.md)).

Enable them in the other locations as well with the command **overrideenable** in the main config file. **BEWARE!** This allows every user to change the monitor and clocks (and other configs) and thus damaging the hardware. I **strongly** discourage the use of **overrideenable** except for debugging/testing purposes.

## REQUIRED CONFIGURATION

Please do not allow the vastness of options to confuse you. Generally svgalib uses well chosen defaults and is able to autodetect everything. Thus generally you don't need to specify much. When installing svgalib it provides a sample */etc/vga/libvga.config* file which contains most of the required configuration. Just edit  it to your needs.

Generally you only need to use:

- **mouse**

  To specify if you use anything else then a Microsoft compatible mouse.

- **mdev**

  If the mouse device file is **not** */dev/input/mice* which is the actual mouse device file. You will usually need to use this command if you want to use the SpaceTec Spaceball device (which is not your usual mouse).

- **setRTS**, **clearRTS**, **leaveRTS**, **setDTR**, **clearDTR**, and **leaveDTR**

  if your mouse needs it to enter your desired mouse protocol.

- **monitor**, or (better) **HorizSync** and **VertRefresh**

  to specify the capabilities of your monitor.

### If you use the EGA chipset driver

- **monotext** or **colortext**

  to specify if your EGA card is in monochrome or color configuration.

### If you use the Mach32 chipset driver

You should consider reading [**svgalib.mach32**(7)](/svgalib.mach32/7.md).

- **Clocks** *clock1 clock2 clock3* **...**

  to specify the Mach32 clocks. This is mandatory. However, if you omit it. svgalib will autodetect clocks and modify your */etc/vga/libvga.config* file and abort. After this, every svgalib application started will find the proper **Clocks** command.

- **mach32eeprom /etc/vga/mach32.eeprom**

  is recommended to avoid slowish reads of the Mach32 EEPROM which will also cause annoying screen flickering.

### If you use the Mach64 chipset driver

- **Chipset Mach64**

  if you want to use the experimental pre-alpha driver

### If you use the S3 chipset driver

I don't have much knowledge on the S3, but it seems to me that you need:

- **Clocks** *clock1 clock2* **...**

  to specify the clocks (take them from your Xfree86 configuration).

or

- **ClockChip icd2061a** *number*

  if you have an Icd2061a clockchip.

- **Ramdac** *chipname*

  if your Ramdac is not detected properly.

- **Dacspeed** *speed*

  if the default chosen is not right (probably too restrictive).

The remaining options are really only to be used in case of problems which you'll not generally encounter.

### If you use the VESA chipset driver

- **VesaText**

  forces the driver to set 80x25 text mode, before any standard vga mode  setting. Fixes text mode restoring with many cards, as well as standard  VGA modes.

- **VesaSave**

  selects the bitmap to save and restore, using VESA functions. see VESA  documentation for bits' meanings. The default is 1110 (=14) which is  good for most cards, but some give better results with other numbers.

## GENERAL OPTIONS (HANDLED BY THE MAIN MODULE)

### Mouse configuration

- **mouse** *mousetype*

  where *mousetype* is one of: **Microsoft**, **MouseSystems**, **MMSeries**, **Logitech**, **Busmouse**, **PS2**,  **MouseMan**, **gpm**, **Spaceball**, **none**, **IntelliMouse**, or **IMPS2**. *mousetype* can also be a number (**0** - **9**) for the keywords **Microsoft** - **none**.

  **gpm** allows for (hopefully) peaceful interaction with gpm, **Spaceball** enables support for the 6-axes Spacetec Spaceball mouse (well, probably more like a trackball), **IntelliMouse** and **IMPS2** refer to the Microsoft IntelliMouse or Logitech MouseMan+, where **IntelliMouse** is for serial port and **IMPS2** for such a mouse on the PS/2 port.

  Note that it is not possible to specify the Microsoft IntelliMouse or Logitech MouseMan+ by a number. This is due to historical and compatibility reasons.

- **mouse\_override**

  This command is only available if  **ALLOW\_MOUSE\_OVERRIDE** was set in *Makefile.cfg* when svgalib was compiled (which is the default).

  If given, svgalib ignores any mouse type the program specifies but uses the type configured with the **mouse** command.

  For example, DOOM does not recognize **MouseMan** as a valid mouse type and defaults the mouse type to **MouseSystems.** This command allows to make svgalib ignore whatever DOOM specifies and use **MouseMan** anyway.

- **mdev** *mousedevice*

  Usually */dev/input/mice* (the default) will be the mouse device. However, esp. with the Spacetec Spaceball you may want to specify a different device for [**svgalib**(7)](/svgalib/7.md) to use:

  **mdev /dev/ttyS0** # mouse is at /dev/ttyS0

Some multiprotocol mice use the state of RTS and DTR to find out which protocol to enable:

- **setRTS**

  set the RTS wire.

- **clearRTS**

  clear the RTS wire.

- **leaveRTS**

  leave the RTS wire alone (default) (Wire is usually set)

- **setDTR**

  set the DTR wire.

- **clearDTR**

  clear the DTR wire.

- **leaveDTR**

  leave the DTR wire alone (default) (Wire is usually set)

For example my mouse can emulate Microsoft and MouseSystems. It needs a low RTS to go into MouseSystems mode. Thus I use:

**mouse MouseSystems clearRTS**

Still I could just use **mouse Microsoft** and use the mouse with that protocol.. But then only 2 buttons instead of 3 are supported (not that I know many svgalib programs that uses more than 2 buttons.)

Other mice might need **clearDTR** as well or one set and clear. Try yourself.

Note: Having crtscts handshake enabled on the mouse tty may interfere with this option. Do not do that.

Finally, a special goodie for wheel mice:

- **mouse\_fake\_kbd\_event** *upscancode* *downscancode*

  sends a fake keyboard event to the program when the wheel on a Microsoft IntelliMouse, Logitech MouseMan+, or similar wheel mouse is turned.

  The up and down scancodes are the scancodes of the keys to simulate when the wheel is turned up and down, respectively.

  The following can be specified for the scancodes: letters (**A**-**Z**), numbers (**0**-**9**), function keys (**F1**-**F12**), or any of the following -  **ESCAPE**, **MINUS**,  **EQUAL**, **BACKSPACE**, **TAB**, **BRACKET\_LEFT**, **BRACKET\_RIGHT**, **ENTER**, **LEFTCONTROL**,  **SEMICOLON**, **APOSTROPHE**, **GRAVE**, **LEFTSHIFT**, **BACKSLASH**, **COMMA**, **PERIOD**, **SLASH**,  **RIGHTSHIFT**, **KEYPADMULTIPLY**, **LEFTALT**, **SPACE**, **CAPSLOCK**, **NUMLOCK**, **SCROLLLOCK**,  **KEYPAD7**, **CURSORUPLEFT**, **KEYPAD8**, **CURSORUP**, **KEYPAD9**, **CURSORUPRIGHT**, **KEYPADMINUS**,  **KEYPAD4**, **CURSORLEFT**, **KEYPAD5**, **KEYPAD6**, **CURSORRIGHT**, **KEYPADPLUS**, **KEYPAD1**,  **CURSORDOWNLEFT**, **KEYPAD2**, **CURSORDOWN**, **KEYPAD3**, **CURSORDOWNRIGHT**, **KEYPAD0**,  **KEYPADPERIOD**, **KEYPADCENTER**, **RIGHTCONTROL**, **CONTROL**, **KEYPADDIVIDE**,  **PRINTSCREEN**, **RIGHTALT**, **BREAK**, **BREAK\_ALTERNATIVE**, **HOME**, **CURSORBLOCKUP**,  **PAGEUP**, **CURSORBLOCKLEFT**, **CURSORBLOCKRIGHT**, **END**, **CURSORBLOCKDOWN**, **PAGEDOWN**,  **INSERT**.

  Note that this option has no effect unless the IntelliMouse or IMPS2 mouse type is used (see above). Also note that the simulated keypresses are instantaneous, so they cannot be used for functions that require a key to be held down for a certain length of time.

  This example simulates a press of the left bracket (\[) when the wheel is turned up and a press of the right bracket (\]) when the wheel is turned down (good for selecting items in Quake II):

  **mouse\_fake\_kbd\_event BRACKET\_LEFT BRACKET\_RIGHT**

### Mouse acceleration

Svgalib versions 1.3.0 and later use the following commands to control the logarithmic mouse acceleration:

- **mouse\_force**

  If given, force use of input parameters even if they seem strange.

- **mouse\_maxdelta** *\<integer\>*

  Set max delta BEFORE acceleration.

- **mouse\_accel\_maxdelta** *\<integer\>*

  Set max delta AFTER acceleration.

- **mouse\_accel\_thresh** *\<integer\>*

  Set acceleration threshold.

- **mouse\_accel\_power** *\<float\>*

  Set input variable for power mode.

- **mouse\_accel\_mult** *\<float\>*

  Set acceleration factor.

- **mouse\_accel\_type** {**0**\|**off**\|**normal**\|**power**\|**linear**}

  Set the type of acceleration. The following strings are valid values:

  - **0** or **off**

    No acceleration.

  - **normal**

    No acceleration while delta is less than **mouse\_accel\_thresh** but multiplied by **mouse\_accel\_mult** if more.\
     Originally done by Mike Chapman \<mike@paranoia.com\>.

  - **power**

    The acceleration factor is a power function of delta until it reaches **mouse\_accel\_mult** After that it's a simple multiplication. Basically it's like the normal mode but the acceleration factor grows as you move your mouse faster and faster, not just turns in and out. If the acceleration factor reaches **mouse\_accel\_mult** it turns into a plain multiplication.

    Threshold has the same meaning as in normal mode. The one I use for \*uaking... :)

    It is calculated like this:

    if (abs(dx) \> 1) /\* to prevent losing resolution \*/\
    \
       dx = (abs(dx) \>=\
              **mouse\_accel\_thresh** ) ?\
    \
            (float)dx \*\
             **mouse\_accel\_mult** :\
    \
            (float)dx \*\
    \
             m\_accel\_powertable\[abs(dx)\];

  - **linear**

    The acceleration factor grows linear with the delta until it reaches **mouse\_accel\_thresh**. After that it is a simple multiplication. (I know that it can be done with setting **mouse\_accel\_power** to 1, but it was one minute to implement... and uses no memory... and...)

    It is calculated like this:

    if (abs(dx) \> 1)\
    \
       dx = (abs(dx) \>=\
              **mouse\_accel\_thresh** ) ?\
    \
            (float)dx \*\
             **mouse\_accel\_mult** :\
    \
            (float)dx \* abs(dx) \*\
             **mouse\_accel\_mult** /\
             **mouse\_accel\_thresh** ;

  The enhanced acceleration was done by 101 (Attila Lendvai) \<101@kempelen.inf.bme.hu\>

### Joystick configuration

As of now, svgalib supports up to four joystick devices. You must have joystick support in your kernel to support this.

- **joystick0** *device*

  sets the device name to use for joystick 0. The commands **joystick1**, **joystick2** and **joystick3** configure the other joysticks. By default the names */dev/js0*, */dev/js1*, */dev/js2* and */dev/js3* are used.

### Keyboard configuration

- **kbd\_fake\_mouse\_event** *scancode* **\[***flag(s)***\]** *command* **\[***argument***\]**

  , as it says, sends a fake mouse event to the program. *Scancode* is a raw scancode as you can find them in *\<keyboard/vgakeyboard.h\>*.

-

  Supported *flag(s)* are:

  - **down**

    trigger event when the key is pressed (default).

  - **up**

    the opposite.

  - **both**

    trigger in both case, if pressed or released.

  - **repeat**

    repeat events if the key is kept pressed (off by default).

-

  Supported commands are:

  - **delta**\[**xyz**\]

    send a fake delta event as if you have moved your mouse. If the *parameter* is **off** or **on** it will turn off/on the respective mouse axis (requires a *parameter*, of course)

  - **button**\[**123**\]

    send a fake event that the mouse button is pressed or released as given by the *parameter* (**pressed** or **released**)

-

  Here are some examples:

  This is one I use in \*uake: it turns around, looks down a bit and when the key is released it does the opposite, so it gets back to the starting state. With this one and the help of a rocket you can fly though the whole map :) (Scancode 28 is **\<Enter\>**):

      **kbd\_fake\_mouse\_event 28 both deltax 8182**\
                               **down deltay -1500**\
                               **up deltay 1500**

  This one will switch off the y axis of the mouse while the key  **\<Right Ctrl\>** is kept pressed.

      **kbd\_fake\_mouse\_event 97 down deltay off**\
                               **up deltay on**

  This one is the same as if you were pressing the left mouse button. (But if you move your mouse then the button state will reset even if you keep **\<Right Ctrl\>** down...)

      **kbd\_fake\_mouse\_event 97 down button1 pressed**\
                               **up button1 released**

  **NOTE:** This does only work when the keyboard is in raw keyboard mode!

  Yet another feature brought to you by 101 (Attila Lendvai) \<101@kempelen.inf.bme.hu\>

- **nosigint**

  This command disables generation of a **SIGINT** signal when **\<Ctrl-C\>** is pressed.

  This works regardless of ordinary or raw keyboard mode (albeit the hot key might be different from **\<Ctrl-C\>** in the first case).

  **Note** that this is a very dangerous option. Disabling **SIGINT** will lock you in programs which can only by quit by **\<Ctrl-C\>**! However, there were request for it for Quake playing.

- **sigint** (default)

  Enables generation of **SIGINT**.

### Monitor configuration

- **HorizSync** *min\_kHz max\_kHz*

  - **VertRefresh** *min\_Hz max\_Hz*

  specifies the range of frequencies acceptable to your monitor.  They obsolete the **monitor** settings below, and this shouldn't be used if **HorizSync** and **VertRefresh** are defined. Examples:

  **HorizSync 31.5 35.5**\
   **VertRefresh 50 70**

- **monitor** *monitor\_class*

  where *monitor\_class* is a digit **0** - **6** or the maximal horizontal frequency in kHz. Examples:

  **monitor 0** # Max horizontal sync is 31.5 kHz\
   **monitor 1** # Max horizontal sync is 35.1 kHz\
   **monitor 2** # Max horizontal sync is 35.5 kHz\
   **monitor 3** # Max horizontal sync is 37.9 kHz\
   **monitor 4** # Max horizontal sync is 48.3 kHz\
   **monitor 5** # Max horizontal sync is 56.0 kHz\
   **monitor 6** # No restrictions.

  For your convenience you may specify the max horizontal sync explicitly. The correct class will the be chosen. You may use floats consisting of digits and a decimal point for this too:

  **monitor 40.0** # equivalent to monitor 3

  This command is **privileged**.

### Mode timings

It is now possible to define modetimings for some cards (see the info on your card in [**svgalib**(7)](/svgalib/7.md)). The syntax is:

- **modeline** *label pxcl HDsp HSS HSE HTot VDsp VSS VSE VTot flags*

  - *label* string

    (ignored by svgalib) mainly there to be compatible with XF86Config. I use the format "Width x Height @ Vert.Refresh", but that's just personal taste...

  - *pxcl* float

    the pixel clock in MHz

  - *HDsp*

    - *VDsp* integer

    size of the visible area (horizontal/vertical)

  - *HSS*

    - *VSS* integer

    Sync start (horizontal/vertical)

  - *HSE*

    - *VSE* integer

    Sync end (horizontal/vertical)

  - *HTot*

    - *VTot* integer

    Total width/height (end of back porch)

  - *flags* **+hsync -hsync +vsync -vsync interlace interlaced**

    **doublescan** Sync polarity, interlace mode

  Everything should be on one line. The values for the horizontal timings must be multiples of eight.

  These are preferred over the default timings (if monitor and chipset can handle them). The format is identical to the one used by XFree86, but the label following the modeline keyword is ignored by vgalib.

  Here some examples:

  **modeline 640x480@100 43 640 664 824 848 480 483 490 504**\
   **modeline 800x600@73 50 800 856 976 1024 600 637 643 666**\
   **modeline 1024x768@75 85 1024 1048 1376 1400 768 771 780 806**\

  **IMPORTANT!** Not all drivers, that is SVGA cards, use the values. Only drivers using timing.c. As of this writing, drivers using this feature are: Ark, Cirrus, Chips & Technologies, Et6000, S3.

  The Mach32 driver provides a similar feature separately, you have to use the **define** command described below.

  ET4000 (and to some extent EGA) allow one to use a binary file created by some utility. All other chipset driver use predefined timings that are hardcoded in register dumps within the drivers. See [**svgalib.et4000**(7)](/svgalib.et4000/7.md) for more information.

### Chipset detection

Usually svgalib does a good job autodetecting your hardware. However, if auto detection fails (or you want to fall back to a simpler driver, say VGA, as a bug work around), you may force detection of your chipset with

- **chipset** *type*

  where *type* is (currently) one of: **VGA**,  **ET4000**,  **Cirrus**,  **TVGA**,  **Oak**,  **EGA**,  **S3**,  **ET3000**,  **Mach32**,  **GVGA6400**,  **ARK**,  **ATI**,  **ALI**,  **Mach64**,  **C&T**,  **APM**,  **NV3**,  **ET6000**,  **VESA**,  **MX**,  **PARADISE**, and  **RAGE**.

  You can also specify a number in range **1  -  22** to specify the *type***-th** chipset type or **0** to enforce autodetection.

  Warning, incorrect settings may damage your hardware. This command is **privileged**.

- **chipset** *type param1 param2*

  use this form if the size of memory or an additional configuration option is misdetected. For example:

  **chipset Mach32 0 2048**

  Note that always two integers have to be specified. Usually (Mach32) the second parameter is the memory amount. Look at the \*\_init function of the specific device driver sources or information on that type of cards in [**svgalib**(7)](/svgalib/7.md).

  Note that there is a more convenient command **setuplinear** for enforcing specific memory-aperture configurations for Mach32

  This command is **privileged**.

### Specific options required for the EGA-driver.

- **monotext**

  Card is in monochrome emulation mode

- **colortext**

  Card is in color emulation mode

  This command is **privileged**.

### RAMDAC configuration

Some chipsets (e.g. S3 and ARK) allow specifying a RAMDAC type. If your RAMDAC is not autodetected, you can try specifying it:

- **Ramdac Sierra32K**

  - **Ramdac SC15025**

  - **Ramdac SDAC**

  S3 SDAC

- **Ramdac GenDAC**

  S3 GenDAC

- **Ramdac ATT20C490**

  AT&T 20C490, 491, 492 (and compatibles)

- **Ramdac ATT20C498**

  AT&T 20C498

- **Ramdac IBMRGB52x**

  IBM RGB524, 526, 528 (and compatibles)

**BEWARE!** The Mach32 driver features an own **ramdac** command (which is usually not required). If you have a Mach32, see [**svgalib.mach32**(7)](/svgalib.mach32/7.md).

- **Dacspeed** *speed*

  *speed* is a floating point number in MHz (like in **Dacspeed**40.0"**)** specifying the maximal allowable pixel clock of the Ramdac in use. Currently this option is only supported by the S3 driver. The Mach32 driver supports **maxclock8**, **maxclock16**, **maxclock24**, and **maxclock32** commands which have a similar effect. Nevertheless, the Mach32 has a very good idea on the capabilities of the Ramdac in use. The settings are more intended to specify the VGA memory bandwidth.

### Pixel clocks

- **Clocks** *list of clock values as floats or ints*

  Some chipsets need a list of dot clocks for optimum operation.  Some includes or supports a programmable clock chip.  You'll need to specify them here.

  Fixed clocks example: (The following is just an example, get the values for your card from you X setup)

  **Clocks 25.175 28.3 40 70 50 75 36 44.9 0 118 77 31.5 110 65 72 93.5**

  **BEWARE!** The **Clocks** command for the Mach32 features only integer clocks. Please round your clocks to the next integer data. The Mach32 only uses these values to check monitor  requirements and to compare the quality of modes. The rounding errors are of no importance there as the difference in the resulting monitor timings is barely measurable. See the Mach32 section below.

- **Clockchip ICD2061A**

  Configure for a programmable clockchip. **ICD2061A** is the only one supported right now.

### Miscellaneous options

- **security revoke-all-privs**

  Make sure it is impossible to regain root access after [**vga\_init**(3)](/vga_init/3.md) was called. (default)

- **security compat**

  For compatibility to pre 1.2.11, do not close a security hole using saved uids.

- **verbose**

  Mach32: show messages while processing all info to build up a mode table.

- **quiet**

  Turn verbose messages off (default).

- **nolinear**

  Inhibit use of a linear mmaped frame buffer.

- **linear**

  Allow (not enforce!) use of a linear mmaped frame buffer.

- **overrideenable**

  Allow **privileged** commands outside the main configuration file.

### Common options currently used by Mach32 only

Options that may be useful for all drivers, but currently are only supported by Mach32 (Please read [**svgalib.mach32**(7)](/svgalib.mach32/7.md) if you use one):

- **maxclock16** *maxclk*

  The maximum pixel clock to use for 16bpp modes. This is used by Mach32 to find out which settings may be used for 16bpp modes. the Mach32 default for this is 2000, thus it is effectively switched off. *maxclk* must be an integer.

- **maxclock24** *maxclk*

  The maximum clock to use for 24bpp modes. (see above) Experience showed that the Mach32 default 49 is good for my 2MB VRAM card.

- **maxclock32** *maxclk*

  The same for 32bpp modes (24bpp with one fill byte for faster memory access (not fully implemented (esp. for Mach32) yet). Mach32 default (good for my VRAM card) is 39.

- **maxclock8** *maxclk*

  Just for completeness the same for 8bpp modes (I doubt anyone needs it), default is 2000 to disable this feature.

The **maxclock** commands are **privileged**.

- **clocks** *list of clocks*

  Sets the frequencies of the clocks the chips can generate. Exactly 16 values have to be specified for mach32. Use 0 to disable a specific clock.

  Note that the mach32 can divide clocks by 2. Thus there are actually 32 clocks And you can also use the divided clocks in a define command. On contrary to Xfree96 or the **clocks** command above only integers are allowed for Mach32. Simply round them to the nearest integer.

  This line is mandatory for Mach32. If it is not there it will be auto detected and added at the beginning of the config file. The program will then exit and when you start it next, everything should be ok.

  Common clock values for Mach32:

  - Clock chip 18811-0:

    **clocks 43 49 92 36 50 56 0 45**\
            **30 32 110 80 40 45 75 65**

  - Clock chip 18811-1:

    due to Xfree86 info valid for: Ultra pro ISA, Ultra pro EISA, Ultra pro VLB(68800-3)

    **clocks 100 126 92 36 50 56 0 45**\
            **135 32 110 80 40 45 75 65**

  - Clock chip 1881 (ICS2494):

    due to Xfree86 info valid for: Ultra pro VLB (6880006)

    **clocks 18 22 25 28 36 44 50 56**\
            **30 32 37 39 40 0 75 65**

-

  In my own correspondence with ATI they say every Mach32 would have a 18811-1, so it should be possible just to take the 18811-1 line. However I have now reports of third party cards and motherboards with on board Mach32 chips, so be careful.

  Please read [**svgalib.mach32**(7)](/svgalib.mach32/7.md) for additional info on clocks.

  The **clocks** command is **privileged**.

- **variablelinelength**

  Sometimes a mode cannot be realized with the logical linelength = pixels in a row \* bytes per pixel. (definitely true for Mach32 800x600). The default behavior of Mach32 is to adjust *xbytes* (see [**vga\_getmodeinfo**(3)](/vga_getmodeinfo/3.md)) in the info table appropriately.

  This command enforces this default operation and adjusts *xbytes* appropriately, thus overriding the standard svgalib mode. This may yield to problems with ..umm.. not well designed applications.

- **duplicatelinelength**

  Don't touch the standard mode but create an exact copy, a dynamic mode, with the adjusted *xbytes* value.  Expect noise at some pixels in 800x600 for more than 256 colors on Mach32 when not using the dynamic mode.

- **strictlinelength**

  Same as above but delete the standard mode thus creating the non conforming *xbytes* modes only as dynamic modes.

To enforce the standard linelength for non-conforming modes use **setlinelength** below.

The linelength commands are **not privileged**.

In the following commands a mode is specified with *horz*X*vert*X*colors*. Valid settings for colors in the mach32 driver are: 256, 32K, 64K, 16M, 16M4. 16M4 is for the 16M colors with 32bpp modes. These are expected to support slightly faster drawing.

Examples: **640x480x256**, **1024x768x64K**, etc...

- **inhibit** *mode1* **\[***mode2* *mode3***...\]**

  Switch the specified SVGA-Modes off. For example:

  **inhibit 800x600x32K 800x600x64K 800x600x16M**

  disallows the maybe toasted mach32 800x600 modes.

  The **inhibit** command is **not privileged**.

- **setlinelength** *length* *mode1* **\[***mode2* *mode3***...\]**

  Force the logical line length (*xbytes*) in the given modes to length pixels (not bytes!). See also **variablelinelength**, **strictlinelength**, and **duplicatelinelength** above. For example:

  **setlinelength 800 800x600x32K 800x600x64K 800x600x16M**

  sets the linelength, and thus *xbytes*, for the **800x600** modes to the equivalent of 800 pixels. For Mach32 this will give badly designed applications an 800x600 with which they can cope. However, the Mach32 will generate a noisy video signal in some configurations.

  The **setlinelength** command is **not privileged**.

- **define** *mode1* **\[***mode2* *mode3***...\]** *clock horz\_timing vert\_timing flags*

  where *clock* is a clock in MHz (as an integer! Has to be known by the driver. (one of the set clocks, or the exact half of one)). Only clocks in a **clocks** command issued before the **define** can be used.

  You may use **:***n* to specify the *n*-th*clock* (*n* = 0 .. 31 for mach32).

  *horz\_timing* is four integers: *hdisp h\_sync\_strt h\_sync\_wid h\_total*.

  *vert\_timing* has the same format but for vertical.

  You may specify one or more *flags* out of: **Interlace**, **+vsync**, **-vsync**, **+hsync**, or **-hsync** to select interlace mode and polarity of sync signals. This format is almost the same Xfree uses, s.t. you may use their mode table and the modegen spreadsheet package for mode creation. You simple need to round the clock to the next integer, add the resolution instead of the timing name for Xfree and replace the **modeline** keyword with **define**. Here is a 1024x768x256 mode as example:

  **define 1024x768x256 80 1024 1024 1184 1312**\
          **768 768 772 791 +vsync -hsync**

  or

  **define 1024x768x256 1024x768x32K 1024x768x64K**\
          **:11 1024 1024 1184 1312 768 768 772 791**

  (yes any whitespace in a command is allowed, even a newline !)

  Both commands define the same timings (if the 11-th clock is 80) but the first explicitly specifies the polarity of sync signals whereas the second declares that these timings are also to be used for a 32K and 64K mode.

  The **define** command is **privileged**.

There is one really dangerous option (except faking clocks). Please use it only if you are sure what you are doing. Wrong setup will lead to multiple components accessing your bus at once and thus to probable hardware damage:

- **setuplinear** *address size*

  Sets up a linear frame buffer at *address* of size *size* (both are given in MB). If the values make sense (for example address \<16MB for ISA cards) the linear aperture is setup. Since the Mach32-driver auto detects configured address itself, I strongly discourage use of this command. However I was asked for it as some PCI mach32-cards didn't setup the linear aperture correctly.

  Please ensure that the address range from *address* to *address* + *size* (exclusively) is not used in your system. Obey that due to memory remapping for example 16MB Ram may exceed the 16MB address limit.

  Valid Mach32 values for size are 1 and 4 (only 4 in PCI configurations), *address* + *size* have to be below 16MB for ISA, 4GB for multiplexed PCI, and 128MB else. Example: (my setup)

  **setuplinear 64 4**

  for a 4MB linear frame buffer at address 0x4000000.

  It is also valid to specify **setuplinear 0 0**. This will actually disable/de-configure any linear frame buffer. Useful to disable mach32 aperture even if it is enabled in the EEPROM.

  The **setuplinear** command is **privileged**.

- **blit** *subcommand1 subcommand2* **...**

  This is a command to control the Mach32 support for oldstyle accelerator functions.

  Valid *subcommand*s are **bit**, **fill**, **image**, and **hlinelist**. They enable support for the corresponding blit functions. Precede them with **no** to turn them off (no space after **no** allowed). Use **memimage** to emulate the **image** blit using a linearframebuffer, which is usually much faster for Mach32. Use **nomemimage** to never use this emulation. On the Mach32 this emulation can be used in more resolutions than the actual imageblit accelerator function. Again order is vital! (esp. for the **\*image** commands).

  As the Mach32 now has also new style [**vga\_accel**(3)](/vga_accel/3.md) support there are now also the *subcommand*s: **settrans**, **setrop**, **fillbox**, **screencopy**,  **drawline**, **putimage**, **drawhlinelist**, **putbitmap**,  **screencopymono**, **setmode**, **polyline**, **polyhline**, and **polyfillmode**. Which are also supported with a leading **no**. They allow to control support for the subfunctions of [**vga\_accel**(3)](/vga_accel/3.md). In addition, **memimage** emulation applies to **putimage** as well.

  Some examples:

  - **blit image nomemimage**

    Use IO-style imageblt where possible. Don't emulate it in any resolution.

  - **blit image memimage**

    Use emulated imageblt where possible.

  - **blit memimage image**

    Use IO-style imageblt where possible, and the emulation where possible in the remaining modes.

  - **blit noimage**

    Disable support for imageblt.

-

  Mach32 default is:

  **blit bit fill image hlinelist settrans setrop**\
        **fillbox screencopy drawline putimage**\
        **drawhlinelist putbitmap screencopymono**\
        **setmode polyline polyhline polyfillmode**\
        **memimage**

  The **blit** command is **not privileged**.

The Mach32 has also a few intermediate debug options for low level timing adjust. They are:

**vfifo8** *number*\
 **vfifo16** *number*\
 **vfifo24** *number*\
 **vfifo32** *number*\
 **blank** *number*\
 **latch** *number*

There also options which are useful to support broken Mach32 cards or third party hardware based on Mach32 which does not follow the ATI specifications completely. For example:

**vendor ati**\
 **misc\_ctl keep-off**\
 **svgaclocks 9**\
 **ramdac auto**

For details about these options see [**svgalib.mach32**(7)](/svgalib.mach32/7.md). All of them are **privileged**.

## OBSOLETE COMMANDS

Very old svgalib versions used a different style configuration file. For compatibility, svgalib can still parse these old options. Generally the options consist of one character (case sensitive) followed by a number. Whitespace characters (space, tab, newline) can be used after the characters **m** and **M** and the number.

The old svgalib versions actually allowed a new option character to follow a number immediately. The current parser requires white space after the numbers.

Of course, you should not use these cryptic forms anymore. The obsolete commands are:

- **m***number*

  Specify the mouse type like **mouse** *number* does.

- **M***class*

  Specify the monitor class like **monitor** *class* does.

- **C***number*

  Force usage of the *number*-th chipset driver from the list of supported drivers **VGA**(1),  **ET4000**(2),  **Cirrus**(3),  **TVGA**(4),  **Oak**(5),  **EGA**(6),  **S3**(7),  **ET3000**(8),  **Mach32**(9),  **GVGA6400**(10),  **ARK**(11),  **ATI**(12),  **ALI**(13),  **Mach64**(14),  **C&T**(15),  **APM**(16),  **NV3**(17),  **ET6000**(18),  **VESA**(19),  **MX**(20),  **PARADISE**(21), and  **RAGE**(22).

  **C0** reenables auto detection of the chipset (default).

- **c***flag*

  When using the EGA chipset driver, the card is in monochrome emulation mode for *flag* = 0 and in color emulation mode for *flag* = 1.

## FILES

*/etc/vga/libvga.config*\
 */etc/vga/libvga.et4000*

## SEE ALSO

[**svgalib**(7)](/svgalib/7.md), [**svgalib.et4000**(7)](/svgalib.et4000/7.md), [**svgalib.chips**(7)](/svgalib.chips/7.md), [**svgalib.mach32**(7)](/svgalib.mach32/7.md),

## AUTHOR

The newstyle configuration file was first implemented and documented by Michael Weller \<eowmob@exp-math.uni-essen.de\>. However,  other people added new features.

Finally this page was edited by Michael Weller \<eowmob@exp-math.uni-essen.de\>.
