<!doctype linuxdoc system>

<!--     XFree -> XInside - version 1.3 - 1997 September
    -----------------------------------------------------
    (c) by Marco Melgazzi - the GPL applies.
    marco@techie.com
    -----------------------------------------------------

	1.3 Small typo, and thanks to Bartos for translating in Polish
	1.2 Made it evident that a lot of the info here refers to old
		versions of Xinside ( i.e. pre XiGraphics ones )
		Changed my email address, hopefully it's the last time !
		Deleted the text speed blurb for Xinside, XFree 3.2 seems just
		as fast now ( at least on my old Trio64 board ;)
		Put a couple of 'please write me' lines here and there since I
		seem to get only one email per year concerning this howto,
		either it's extremely well done, or it's so obscure nobody takes
		the time to use it <grin>
    1.1 Corrected a value inconsistency
    	Included the contributed XF2XInside script
    	Some spell checking and cleaning
    1.0 Initial release
 -->

<article>

<!-- Title information -->

<title>Linux XFree-to-Xinside mini-HOWTO
<author>by Marco Melgazzi, <tt/marco@techie.com/
<date>v1.3, September 1997
<abstract>
How to convert an XFree86 modeline into an XInside/XiGraphics one
</abstract>

<!-- Table of contents -->
<toc>

<!-- Begin the document -->

<sect>Introduction

<p>
During the spring of 1996 I've seen a lot of posts in comp.os.linux.x
asking how to convert video modes between XFree86 and one of its
commercial alternatives: XInside ( now named XiGraphics, note anyway
that in this document I'll use the old product name, since I will mainly
refer to that version )

I had evaluated before the product and had this evaluation version still
floating on my hard disk: since I like problem solving, I've decided to
give it a try and, after a couple of hours of fiddling and calculating,
I came up with a supposedly informative article that was promptly posted.

The discussions about how to convert suddendly vanished and I received
1 (one) mail thanking me for the article so, since maybe somebody else
could need this information in the future, I decided to transform that
post in the mini-HOWTO you are reading.

Let me state something first: I do NOT work for XInside and I only had
access to the evaluation 1.2 version for Linux. I know that nowadays (
May 97 ) AccelX has reached revision 3.1, but I do think that the
information included in this document, if not verbatim, is still
applicable.

Due to the fact that this HOWTO has been written with the help of a
pretty old Xinside version, it may well happen that some of the
information contained here is not completely accurate: as you will read
later, thanks to the birth of XFree 3.2, I haven't bought this
commercial server, so if you have, and if you notice any incorrect
information here please take the time to email me.

Notice anyway that fiddling with monitor timings can be
hazardous and, for this reason, I absolutely make no guarantees. If it
works for you , fine, if you blow up your computer I shall not be held
responsible for it.

As you may have noticed from may name, I'm not a native speaker of English
so you will probably find some errors here and there, I apologize for them
and I ask you to please avoid flooding my mailbox with language-related
flames. Thanks !


<sect>Why should I need it ?

<p>

I think that the Xinside policy of not giving you an utility to tweak
your video modes ( like xvidtune ) and/or to import your existing XFree
ones in the evaluation ( and AFAIK commercial ) version is
incomprehensible.  I've spent about three hours putting this together (
hint: I've compared the VESA 1024x768@70Hz entry in the two formats (
and I'm nearly an electronic engineer ;-)) while an Xinside programmer
could have written a comparable article in a fraction of this time...

I haven't downloaded any evaluation version from 1.3 onwards and I
really hope they have fixed this. Well, if they have, this mini-HOWTO
could be considered useless but, alas, if you read it you will learn
something more about how everything works...

<sect>Let's go

<p>
    Let's suppose that you have your oh-so-tweaked XFree86
mode and you want to evaluate Xinside in the same conditions:
follow the steps described below and you should be able to
do it; we will use my default video mode as a real-life example and I will
explain what you will have to do to convert it.

An Xfree86 entry looks like this:

<tscreen><verb>
Modeline "blahblah" DOTCLK  A B C D  a b c d
</verb></tscreen>

Every one of the A-D and a-d numbers has a meaning: if you
want you can search for it in the 'The Hitchhiker's Guide to X386/XFree86
Video Timing' ( /usr/lib/X11/doc/VideoModes.doc ) but
you don't need to know the theory behind all this to
perform a succesful conversion...

My modeline in /usr/lib/X11/XF86Config is:

<tscreen><verb>
Modeline "1168x876" 105  1168 1256 1544 1640  876 877 891 900
                     |     |    |    |    |    |   |   |   |
                  DOT_CLK  A    B    C    D    a   b   c   d
</verb></tscreen>

In Xinside, you have to add an entry in the Xtimings file, which
should be located in etc/ ( from now on we suppose you are in
the top Xaccel directory that should be something like
/usr/X11/lib/X11/AcceleratedX )

<tscreen><verb>
!    Somewhere in the file, put here the name you want

[PREADJUSTED_TIMING]
    PreadjustedTimingName = "1168x876 @ 72Hz";

!
!    These four are obvious
!
    HorPixel          = 1168;         // pixels
    VerPixel          = 876;          // lines
    PixelWidthRatio   = 4;
    PixelHeightRatio  = 3;

!
!   hsync: DOT_CLK / D * 1000 [KHz]
!
!   hsync = 105 / 1640 * 1000 = 64.024 KHz
!
!   vsync: ( 1 / (( D / DOT_CLK ) * d) ) * 1,000,000 [Hz]
!
!   vsync: ( 1 / (( 1640 / 105 ) * 900) ) * 1,000,000
!           ( 1 / 14057.1428571 ) * 1,000,000 = 71.138 Hz
!

    HorFrequency      = 64.180;        // kHz
    VerFrequency      = 71.138;        // Hz

!   Obvious

    ScanType          = NONINTERLACED;

!
!   Put here the +/-hsync +/-vsync XFree86 options
!
    HorSyncPolarity   = POSITIVE;
    VerSyncPolarity   = POSITIVE;

!   Shouldn't change

    CharacterWidth    = 8;             // pixels

!   DOT_CLK here

    PixelClock        = 105.000;       // MHz
!
!
!   horizontal timings section: [usec]
!
    HorTotalTime  = D / DOT_CLK                  = 15.619;
    HorAddrTime   = A / DOT_CLK                  = 11.124;
    HorBlankStart = A / DOT_CLK                  = 11.124;
    HorBlankTime  = HorTotalTime - HorBlankStart =  4.495;
    HorSyncStart  = B / DOT_CLK                  = 11.962;
    HorSyncTime   = C / DOT_CLK - HorSyncStart   =  2.743;

 !
 !  vertical timings section:    [msec]
 !

    VerTotalTime  = ( HorTotalTime * d ) / 1000  = 14.057;
    VerAddrTime   = ( HorTotalTime * a ) / 1000  = 13.682;
    VerBlankStart = ( HorTotalTime * a ) / 1000  = 13.682;
    VerBlankTime  = VerTotalTime - VerBlankStart =  0.375;
    VerSyncStart  = ( HorTotalTime * b ) / 1000  = 13.698;
    VerSyncTime   = ( HorTotalTime * ( c - b ) ) / 1000
                                                 = 0.219

 ! Finished !
</verb></tscreen>

     Now you have to put this newly created mode in the
 files shown below in the appropriate place.

<sect>Fixing up things

<p>
In the excerpts shown below the -&gt sign tells you what was modified:
do NOT include it in your files!

Monitor entry ( mine is monitors/mfreq/mfreq64.vda)

<tscreen><verb>
    [ESTABLISHED_TIMINGS]
        "640x480 @ 60Hz",
        "640x480 @ 72Hz",
        "640x480 @ 75Hz",
        "800x600 @ 56Hz",
        "800x600 @ 60Hz",
        "800x600 @ 72Hz",
        "800x600 @ 75Hz",
        "1024x768 Interlaced",
        "1024x768 @ 60Hz",
        "1024x768 @ 70Hz",
        "1024x768 @ 75Hz",
    "1152x900 Interlaced",
        "1152x900 @ 60Hz",
        "1152x900 @ 67Hz",
->      "1168x876 @ 72Hz",
        "1280x1024 Interlaced",
        "1280x1024 @ 60Hz",
    "1600x1200 Interlaced";
</verb></tscreen>

Board info file ( mine is boards/s3/764-2.xqa , I wonder
why they have nearly all the Hercules boards but not MINE:
Terminator 64/Dram )

<tscreen><verb>
[VISUAL]
    BitsPerPixel   = 8;
    MemoryModel    = Packed;
    ColorModel     = Indexed;
    BitsRGB        = 6;
    NumberOfColors = 256;

    [RESOLUTIONS]
    640x480,
    800x600,
    1024x768,
->  1168x876,
    1152x900,
    1280x1024

    [DESKTOPS]
    640x480,
    800x600,
    1024x768,
    1152x900,
->  1168x876,
    1280x1024,
    1600x1200
</verb></tscreen>

    If the dot clock is low enough ( NOT in this case for my
board ) you can put the entry even in the 16bpp and 32bpp sec-
tions.

The /etc/Xaccel.ini will look something like this

<tscreen><verb>
--------------------------------------------------------------
    Board   = "s3/764-2.xqa";
    Monitor = "mfreq/mfreq64.vda";
    Depth   = 8;
->  Desktop = 1168x876;

    [RESOLUTIONS]
->      1168x876,
        1024x768;
</verb></tscreen>

The actual Xinside mode entry in etc/Xtimings

<tscreen><verb>
--------------------------------------------------------------
[PREADJUSTED_TIMING]
    PreadjustedTimingName = "1168x876 @ 72Hz";

    HorPixel          = 1168;          // pixels
    VerPixel          = 876;           // lines
    PixelWidthRatio   = 4;
    PixelHeightRatio  = 3;
    HorFrequency      = 64.024;        // kHz
    VerFrequency      = 71.138;        // Hz
    ScanType          = NONINTERLACED;
    HorSyncPolarity   = POSITIVE;
    VerSyncPolarity   = POSITIVE;
    CharacterWidth    = 8;             // pixels
    PixelClock        = 105.000;       // MHz
    HorTotalTime      = 15.619;        // (usec) =  205 chars
    HorAddrTime       = 11.124;        // (usec) =  146 chars
    HorBlankStart     = 11.124;        // (usec) =  146 chars
    HorBlankTime      =  4.495;        // (usec) =   59 chars
    HorSyncStart      = 11.962;        // (usec) =  157 chars
    HorSyncTime       =  2.743;        // (usec) =   36 chars
    VerTotalTime      = 14.057;        // (msec) =  900 lines
    VerAddrTime       = 13.682;        // (msec) =  876 lines
    VerBlankStart     = 13.682;        // (msec) =  876 lines
    VerBlankTime      =  0.375;        // (msec) =   24 lines
    VerSyncStart      = 13.698;        // (msec) =  877 lines
    VerSyncTime       =  0.219;        // (msec) =   14 lines
</verb></tscreen>

    You can check your conversion by running the vgaset program
with no parameters while running the Xinside server: it will output
an XFree-like line and, if everything went OK, this line will
be equal to the line you started from ( except if b and c
are equal, I haven't been able to reproduce this situation
in Xinside: the best case was c=b+1 ).

<sect>The end...

<p>
    That's all folks ! I hope this will be useful to you. I don't think
I'll buy the XiGraphics server in the near future for one simple reason:
the release of XFree86 3.2 solved all of the text speed problems I was
having on my humble Trio 64 video board ;)

It seems anyway that the XiGraphics server supports a much wider array
of chipsets and video boards than XFree, so it may well happen that the
commercial 'alternative' is the only viable one for you. If this is the
case, and you bought the XiGraphics server, I would really like to hear
from you to know if the information presented here has been useful to
you, or if you found it too complex or whatever.

<sect> Automating the process

<p>
This small script automates most of the work. Be very careful with the
ScanType and with the two Polarity lines: the script do not set them
and, if you are too lazy to correct them, the risks of blowing up your
monitor increase quite a lot.

Notice that I don't know if the 'Doublescan' flag has meaning in XInside:
if you try to convert a low-res doublescan mode BE CAREFUL, you can easily
kill your monitor since the refresh rate that you get is doubled ( in
fact my 400x300@72Hz became a 400x300@144Hz !).


<tscreen><verb>
#!/bin/sh
##########################################################################
# XF2XInside
#
# This script converts modelines from XF86Config format to XInside
# format as needed for the etc/Xtiming file.
#
# This is a quick hack, so don't expect much error checking (not to
# speak of anything like user friendlyness).
#
# If you call it without arguments it should tell you what to do.
#
#                               ( July 1996, hcz@tazlwurm.bb.bawue.de)
#
# Btw: New modes created as described in the HOWTO work, but don't
# show up in Xsetup's menu. Anybody who knows why?
#
##########################################################################
#----------------------------------------------- Here we go:
# Change this if your modeline file lives somewhere else:
XF=/usr/X11/lib/X11/XF86Config
if [ $# -ne 1 ] ; then
  echo "usage: ${0##*/} <mode>"
  echo " example: ${0##*/} 1024x764"
  echo -e " function: converts $XF modeline entry into\n Xinside Format (stdout)"
  exit 1
fi
egrep -i "^[\t ]*modeline.+\"$1\""  /usr/X11/lib/X11/XF86Config |
gawk '
NF < 11  { print "! invalid Modeline:\n! " $0 "\n!"; next }
{
  print "//", $0  ":"
  name = $2
  DOT_CLK = $3;
  A = $4;
  B = $5;
  C = $6;
  D = $7;
  a = $8;
  b = $9;
  c = $10;
  d = $11;
  VerFrequency =  1000000 / ((D / DOT_CLK) * d)
  print "[PREADJUSTED_TIMING]"
  printf "  PreadjustedTimingName = \"%dx%d @ %.0dHz\";\n", A, a, VerFrequency
  print "  HorPixel\t\t= " A ";"
  print "  VerPixel\t\t= " a ";"
  print "  PixelWidthRatio\t= 4;\n  PixelHeightRatio\t= 3;"
  print "  HorFrequency\t\t= " DOT_CLK / D * 1000 ";\t// kHz"
  print "  VerFrequency\t\t= " VerFrequency  ";\t// Hz"
  print "  ScanType\t\t= NONINTERLACED;\t\t// *CHECK*"
  print "  HorSyncPolarity\t= NEGATIVE;\t\t\t// *CHECK*"
  print "  VerSyncPolarity\t= NEGATIVE;\t\t\t// *CHECK*"
  print "  CharacterWidth\t= 8;"
  print "  PixelClock\t\t= " DOT_CLK ";"
  HorTotalTime = D / DOT_CLK
  print "  HorTotalTime\t\t= " HorTotalTime ";"
  print "  HorAddrTime \t\t= " A / DOT_CLK ";"
  print "  HorBlankStart\t\t= " A / DOT_CLK ";"
  print "  HorBlankTime\t\t= " D / DOT_CLK - A / DOT_CLK ";"
  print "  HorSyncStart\t\t= " B / DOT_CLK ";"
  print "  HorSyncTime\t\t= " C / DOT_CLK - B / DOT_CLK ";"
  VerTotalTime  = ( HorTotalTime * d ) / 1000
  print "  VerTotalTime\t\t= " VerTotalTime ";"
  print "  VerAddrTime\t\t= " ( HorTotalTime * a ) / 1000 ";"
  VerBlankStart = ( HorTotalTime * a ) / 1000
  print "  VerBlankStart\t\t= " VerBlankStart ";"
  print "  VerBlankTime\t\t= " VerTotalTime - VerBlankStart ";"
  print "  VerSyncStart\t\t= " ( HorTotalTime * b ) / 1000 ";"
  print "  VerSyncTime\t\t= " ( HorTotalTime * ( c - b ) ) / 1000
  print ""
}'
</verb></tscreen>

<sect> Thanks to

<p>
<itemize>
<item>Heike Claudia Zimmerer <htmlurl url="mailto:hcz@tazlwurm.bb.bawue.de"
 name="hcz@tazlwurm.bb.bawue.de"> for pointing out a small inconsistency and
for sending me a script that automates most of the work.
<item>Bartosz Maruszewski <htmlurl url="mailto:B.Maruszewski@zsmeie.torun.pl"
 name="B.Maruszewski@zsmeie.torun.pl"> for translating this mini HOWTO in Polish
and for pointing out a small typo.
</itemize>

<sect> Copyright/legalese

<p>
(c)opyright 1996-7 by Marco Melgazzi (marco@techie.com) -
the GPL (Gnu Public License) applies. To obtain a copy of the GPL
write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
MA 02139, USA.

Trademarks are owned by their owners. There is no warranty on the
accuracy and/or the usefulness of the information given in this document.

</article>
