# XFree-to-Xinside

## Autor: Marco Melgazzi, marco@techie.com
v1.2, Maj 1997
Wersja polska: Bartosz Maruszewski B.Maruszewski@zsmeie.torun.pl
v1.0, 13 Września 1997

Jak zamienić format opisu trybów video XFree86 na XInside/XiGraphics. Dokument ten został napisany w standardzie ISO-8859-2. Jego oryginalna wersja znajduje się pod adresem ftp.icm.edu.pl.

## 1. Wprowadzenie.

Wiosną 1996 widziałem wiele listów w grupie comp.os.linux.x z pytaniami o to jak przenieść tryby video z XFree86 do jednego z jego komercyjnych odpowiedników: XInside (teraz nazwanym XiGraphics, jednak w tym dokumencie używam starszej nazwy ponieważ będę się odwoływał głównie do tamtej wersji).

Zanim powstała nowa wersja tego programu grzebałem trochę w tej starszej i ciągle mam tę przerobioną wersję gdzieś na moim dysku: ponieważ lubię rozwiązywać problemy postanowiłem spróbować i po kilku godzinach grzebania i obliczania powstał w miarę sensowny artykuł, który natychmiast wysłałem.

Dyskusje na temat zamiany nagle zniknęły a ja otrzymałem 1 (jeden) list z podziękowaniami za artykuł, więc ponieważ może ktoś potrzebowałby tych informacji w przyszłości postanowiłem przekształcić ten artykuł w mini-HOWTO.

Pozwól mi jednak najpierw coś powiedzieć: NIE pracuję dla XInside i miałem dostęp tylko do wersji 1.2 dla Linux-a. Wiem, że w dzisiejszych czasach (Maj 97) AccelX osiągnął już wersję 3.1, ale myślę, że zawarte tutaj informacje, jeśli nie dosłownie, to i tak się przydadzą.

Ponieważ to HOWTO zostało napisane z pomocą dość starej wersji XInside, może się tak stać, że część zawartych tutaj informacji będzie niepełna: jak później przeczytasz, dzięki narodzinom XFree 3.2, nie kupiłem tego komercyjnego serwera. Tak więc jeśli zauważysz jakieś niepoprawne informacje w tym dokumencie proszę wyślij mi list.

Jednak zauważ, że manipulowanie częstotliwościami monitora może być cokolwiek niebezpieczne i dlatego nie daję absolutnie żadnych gwarancji. Jeśli będzie u ciebie działać, to dobrze, jeśli wysadzisz swój komputer, to nie wiń mnie za to.

Jak może zauważyłeś po moim nazwisku moim narodowym językiem nie jest angielski, więc przypuszczalnie zanjdziesz jakieś błędy tu i tam. Przepraszam za nie z góry i proszę nie zawalajcie mojej skrzynki listowej wiadomościami związanymi z tymi błędami. Dzięki!

## 2. Czy potrzebuję tego?

Sądze, że taktyka Xinside polegająca na nie dołączaniu narzędzia (jak xvidtune) do obróbki trybów video czy do przeniesienia tych z XFree do wersji rozwojowej (i o ile wiem komercyjnej) jest niezrozumałe. Spędziłem nad tym jakieś 3 godziny (wskazówka: porównałem pozycję dotyczącą VESy 1024x768@70Hz w tych dwóch formatach (i jestem już prawie elektronikiem ;-)) podczas gdy programista Xinside mógłby napisać artykuł porównawczy...

Nie ściągałem żadnej wersji rozwojowej od 1.3 i naprawdę mam nadzieję, że to naprawili. Jeśli tak, to ten dokument jest już bezużyeczny, ale jeśli go przeczytasz, to dowiesz się trochę więcej o tym jak to działa.

## 3. No to start.

Załóżmy, że masz jakiś tryb w XFree86 i chcesz z niego zrobić wersję dla Xinside z tymi samymi warunkami: postępuj zgodnie z opisanymi poniżej krokami, a powinno ci się udać. Użyjemy moich domyślnych trybów video jako przykładów z życia wziętych i wyjaśnię co musisz zrobić, żeby je zamienić.

Pozycja w XFree86 wygląda tak:

    Modeline "blahblah" DOTCLK  A B C D  a b c d

Każdy z numerów A-D i 1-4 ma swoje znaczenie: jeśli chcesz, możesz ich poszukać w "The Hitchhiker's Guide to X386/XFree86 Video Timing" (/usr/lib/X11/doc/VideoModes.doc), ale nie musisz znać teorii, żeby je zamienić...

Moje tryby w /usr/lib/X11/XF86Config to:

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

W Xinside, musisz dodać pozycję w pliku Xtimings, który powinien się znajdować w etc/ (od teraz zakładam, że jesteś w głównym katalogu Xaccel, którym powinien być /usr/X11/lib/X11/AcceleratedX).

    !    Gdzieś w tym pliku, umieść nazwy które chcesz

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

    !
    !    Te cztery są oczywiste
    !
        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

    !   Oczywiste

        ScanType          = NONINTERLACED;

    !
    !   Umieść tutaj opcje +/-hsync +/-vsync z XFree86
    !
        HorSyncPolarity   = POSITIVE;
        VerSyncPolarity   = POSITIVE;

    !   Nie powinno się zmieniać

        CharacterWidth    = 8;             // pixels

    !   Tutaj jest DOT_CLK

        PixelClock        = 105.000;       // MHz
    !
    !
    !   Sekcja częstotliwości poziomych: [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;

     !
     !  Sekcja częstotliwości pionowych: [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

     ! Koniec!

Teraz tak nowo stworzone tryby musisz umieścić w plikach pokazanych poniżej w odpowiednich miejscach.

## 4. Ustawianie.

W wyjątkach pokazanych poniżej znak -> pokazuje co było zmieniane: nie wpisuj go do pliku!

Pozycja Monitor (moja to monitors/mfreq/mfreq64.vda)

        [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";

Plik informacyjny na temat karty (mój to boards/s3/764-2.xqa, Zastanawiam się czemu mają prawie wszystkie karty Hercules, a mojej nie: Terminator 64/Dram)

    [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

Jeśli częstotliwości zegara (dot clock) jest odpowiednio niski (NIE w tym przypadku dla mojej karty) możesz nawet tę pozycję umieścić w sekcji 16bpp i 32bpp.

Plik /etc/Xaccel.ini będzie wyglądał tak:

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

        [RESOLUTIONS]
    ->      1168x876,
            1024x768;

Właściwa pozycja odnośnie trybów w etc/Xtimings

    --------------------------------------------------------------
    [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

Możesz sprawdzić czy wszystko sie udało uruchamiając program vgaset bez parametrów podczas gdy uruchomiony jest serwer Xinside: na ekranie będzie pokazana linia na podobieństwo XFree86 i, jeśli wszytko jest dobrze, linia ta będzie taka sama jak ta, od której zacząłeś (za wyjatkiem jeśli b i c są takie same, nie byłem w stanie powtórzyć tej sytuacji w Xinside: najlepszym przypadkiem było c=b+1).

## 5. Koniec...

To wszystko! Mam nadzieję, że przyda ci się to. Nie sądzę, żebym kupił serwer XiGraphics w bliższej przyszłości z jednego prostego powodu: wersja 3.2 XFree86 rozwiązała wszystkie problemy związane z prędkością tekstu, jakie miałem na swojej skromnej karcie Trio 64 ;)

Jednak wygląda na to, że serwer XiGraphics obsługuje o wiele szerszy zestaw chip-ów i kart graficznych niż XFree, więc może się zdarzyć, że komercyjna alternatywa będzie jedyną dla ciebie. Jeśli tak jest i kupiłeś serwer XiGrpahics, z chęcia usłyszałbym czy zaprezentowane tu informacje przydały ci się czy były zbyt skomplikowane, czy cokolwiek.

## 6. Automatyzacja procesu.

Ten mały skrypt automatyzuje cała pracę. Bądź bardzo ostrożny z ScanType i z dwoma liniami Polarity: skrypt ich nie ustawia i jeśli jesteś zbyt leniwy, żeby je poprawić, to szansa na spalenie twojego monitora wzrasta znacznie.

Zauważ, że nie wiem czy parametr "Doublescan" ma jakieś znaczenie w XInside: jeśli spróbujesz zamienić jakiś tryb o małej rozdzielczości BĄDŹ OSTROŻNY, łatwo możesz załatwić swój monitor ponieważ częstotliwość odświeżania, jaką uzyskasz jest podwojona (a naprawdę moje 400x300@72Hz stało się 400x300@144Hz !).

    #!/bin/sh
    ##########################################################################
    # XF2XInside
    #
    # Skrypt ten zamienia opisy trybów z formatu XF86Config na format XInside
    # tak jak tego wymaga plik etc/Xtimings.
    #
    # To jest tylko taki hacker-ski skrypt więc nie spodziewaj się zbyt
    # zaawansowanego sprawdzania błędów (nie mówiąc już o przyjazności dla
    # użytkownika).
    #
    # Jeśli wywołasz go bez argumentów powinien ci on powiedzieć co zrobić.
    #
    #                               ( Lipec 1996, hcz@tazlwurm.bb.bawue.de)
    #
    # Przy okazji: Nowe tryby stworzone tak jak to opisuje to HOWTO działają,
    # ale nie pokazują się w menu Xsetup-u. Ktoś wie dlaczego?
    #
    ##########################################################################
    #----------------------------------------------- No to lecimy:
    # Zmień to jeśli twój plik konfiguracyjny jest gdzieś indziej
    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 ""
    }'

## 7. Podziękowania.

- Heike Claudia Zimmerer hcz@tazlwurm.bb.bawue.de za pokazanie pewnej nieścisłości i za przysłanie mi skryptu do automatyzacji.

## 8. Prawa autorskie/legalność.

Prawa autorskie należą do © Marco Melgazzi (marco@techie.com) - dokument ten jest rozpowszechniany na podstawie GPL (Gnu Public License). Aby otrzymać kopię GPL, napisz do Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

Znaki towarowe należą do ich właścicieli. Nie ma żadnych gwarancji co do dokładności czy przydatności informacji zawartych w tym dokumencie.

## 8.1 Od tłumacza.

Tłumaczenie to jest chronione prawami autorskimi © Bartosza Maruszewskiego. Dozwolone jest rozprowadzanie i dystrybucja na prawach takich samych jak dokument oryginalny.

Jeśli znalazłeś jakieś rażące błędy ortograficzne, gramatyczne, składniowe, techniczne (tych może trochę być, bo co do nazewnictwa w sprawach monitorów i kart graficznych jestem ignorantem) to pisz do mnie:

B.Maruszewski@zsmeie.torun.pl

Oficjalną stroną tłumaczeń HOWTO jest http://www.jtz.org.pl/

Aktualne wersje przetłumaczonych dokumentów znajdują się na tejże stronie. Dostępne są także poprzez anonimowe ftp pod adresem ftp.ippt.gov.pl w katalogu `/pub/Linux/JTZ/`.

Przetłumaczone przeze mnie dokumenty znajdują się także na mojej stronie WWW. Są tam też odwołania do Polskiej Strony Tłumaczeniowej.

Kontakt z naszą grupą, grupą tłumaczy możesz uzyskać poprzez listę dyskusyjną jtz@ippt.gov.pl. Jeśli chcesz sie na nią zapisać, to wyślij list o treści `subscribe jtz Imię Nazwisko` na adres `listproc@ippt.gov.pl`