Vlákno názorů k článku Grafické karty MCGA a VGA od ondra.novacisko.cz - V MCGA režimu, tedy ten režim 320×200×256 je skutečně...

  • Článek je starý, nové názory již nelze přidávat.
  • 5. 11. 2009 7:05

    ondra.novacisko.cz (neregistrovaný)

    V MCGA režimu, tedy ten režim 320×200×256 je skutečně mapováno tak jak je popsáno. Grafická karta jednoduše dva dolní bity adresy zároveň používá k výběru bitové roviny. Jestli mi někdo připomene, zda fungování tohoto zřetězení je opravdu závislé jen na Memory Mode Registru. Protože co si pamatuju, VGA byla hodně schizofrenní a každý obvod se musel programovat zvlášť. Nastavit třeba emulaci CGA v sequenceru tedy nestačilo, muselo se to nastavit asi na dalších třech místech. Teď jsem se díval do různých materiálů a nenašel jsem nikde informaci o tom, jak VGA zjistí, že to zřetězení není jen na úrovni přístupu do paměti procesorem, ale že se musí tímto způsobem data také načítat do posuvných registrů.

    A ještě k paletě. V režimech VGA 16barev bylo možné použív VGA paletu, ale kdo si s tím zkoušel hrát, zjistil, že se nějak divně mapují barvy na indexy v této paletě. VGA tam dělala dvojitý překlad. Nejprve se z indexu udělala EGA barva a tato barva pak fungovala jako index do VGA palety. Barvy 0–15 se tedy mapovaly na indexy 0–6,56,7,58–63 Tenhle způsob mapování bylo možné vypnout nastavením EGA palety 1:1 hodnotě indexu.

  • 5. 11. 2009 8:22

    Pavel Tišnovský
    Zlatý podporovatel

    Ahoj,

    ten dvojity preklad barev byl dost opruz, inzenyri z IBM to tak navrhli kvuli zpetne kompatibilite s EGA (ta mela paletu 16 barev z 64). Ale nejlepsi, nejjednodusi a nejrychlejsi bylo zapisovat primo do tabulky D/A prevodniku.

    S tim prechodem zretezeny/nez­retezeny rezim (MCGA vs mod-x) je to trosku slozitejsi, nastavuje se jak priznak pro zretezeni, tak i rezim pristupu do pameti a jeste jedna vec, na kterou si ted nemuzu vzpomenout. Podivam se do kodu (asm) pro prepnuti MCGA/mod-x/zpet, a poreferuju.

  • 5. 11. 2009 8:55

    ondra.novacisko.cz (neregistrovaný)

    Jo už vím. V režimu MCGA 320×200 je zapnut režim „adresa po 4 taktech“, nachází se v sekvenceru 3?5h / registr 14h … registr se jmenuje „Underline Location Register“.

    Pokud je tam jednička, VGA zobrazí 4 body ze 4 bitových rovin a pak posune čítač adresy o 4 pozice. Pokud je tam nula, tak se takto neděje.

    Podle toho se spíš domnívám, že obrázek není úplně správně, Ty čtyři body se skutečně ukládají pokaždé do jiné roviny, ale vždy na stejnou adresu dělitelnou 4. Tedy budou pod sebou.

    Ale nemám to ověřený, chtělo by to vyzkoušet, Něco zapsat v MCGA a pak to přenout do ModeX a jak bude výsledný obraz vypadat. Jestli ty 4 body budou stále vedle sebe, nebo od sebe odskočí s mezerou 4 pixelů.

  • 5. 11. 2009 9:31

    Pavel Tišnovský
    Zlatý podporovatel

    Mozna mas pravdu s tim, ze se vzdy ctyri body ukladaji do bitovych rovin „pod sebe“, budu si to muset vyzkouset. V praxi se to v podstate neprojevilo, protoze pro pristup k 3/4 obrazove pameti by se musel zretezeny (chain) rezim vypnout, ale bude zajimave po tak dlouhe dobe zjistit, jak to presne fungovalo.

    Vlastne je skoda, ze AFAIK neexistovala zadna moznost nastaveni offsetu zacatku obrazove pameti ve zretezenem rezimu, to by se double buffering/triple buffering delal strasne jednoduse bez nutnosti prepnuti do x-modu (unchained).

  • 5. 11. 2009 9:54

    ondra.novacisko.cz (neregistrovaný)

    Vždycky jsem našel návody, jak nastavit XMode ale nikdy jsem nezkoumal, jak je to nastaveno předtím.

    Dnež už nemám jak to vyzkoušet, takže jsou to jen teorie. Taková druhá teorie je, že sequencer je nastaven do režimu dvojslov, (taky registr 14h), tam se ale mapují nejvyšší bity adresy na spodní dva bity a body se berou z bitových rovin. V tomhle uspořádání by takový offset nefungoval, protože ten prostor mezi každým bodem v jedné bitové rovině není prázdny. Přesnějí na pozice dělitelné se zbytkem roven 0 se mapuje první čtvrtina obrazovky, se zbytekem 1 druhá čtvrtina, ze zbytkem 2 třetí, atd…

    mapování pak vypadá takto
    AABBBBBB BBBBBBCC
    A – čtvrtina obrazovky
    B – bod ve čtvrtině
    C – bitová rovina

    bod.adresa:00BBBBBBB­BBBAA
    bit.rovina:CC

    Je vidět, že adresa nad 64KB je opravdu nedostupná bez Xmode.

  • 5. 11. 2009 10:09

    Pavel Tišnovský
    Zlatý podporovatel

    Pravda, prechod Xmode->13h se moc neresil, protoze to delala sluzba BIOSu, int 10h. Ale AFAIK mel BIOS pro kazdy standardni graficky rezim (0h-13h) ve svem datovem bloku (dostupnem samozrejme i programatorum) obsahy vsech ridicich registru graficke karty. Zcela urcite to platilo pro standardni EGA, u VGA to (vzhledem k ruznym klonum) mozna nebude 100% platit.

  • 5. 11. 2009 8:26

    Pavel Tišnovský
    Zlatý podporovatel

    Jeste, kdyby to nekoho zajimalo, nastaveni barev na VGAcku. Funkce outp() zapisuje bajt (druhy parametr) na I/O port s adresou udanou v prvnim parametru, tj. jde o obdobu strojove instrukce outb:

    #define uchar unsigned char
    
    void Write_DAC_C_Palette(uchar StartColor,uchar NumOfColors,uchar *Palette)
    {
        outp(0x03C6,0xff);          //Mask all registers so we can update any of them
        outp(0x03C8,StartColor);    //1st color to input!
        for(short i=0; i<NumOfColors*3; i++ )
        {
            outp(0x03C9,Palette[i]<<2);
        }
    }
    
    void Set_DAC_C(uchar Color,uchar Red, uchar Green, uchar Blue)
    {
        outp(0x03C6,0xff);     //Mask all registers even though we only need 1 of them
        outp(0x03C8,Color);    //Color to set
        outp(0x03C9,Red);
        outp(0x03C9,Green);
        outp(0x03C9,Blue);
    }
  • 5. 11. 2009 17:55

    Jirka Kosek (neregistrovaný)

    Kdyby snad někoho ty registry dneska ještě zajímaly podrobněji.

    http://www.kosek.cz/…/chap07.html#…