Annotation of lucent/sys/src/9/pc/vgabt485.c, revision 1.1

1.1     ! root        1: #include "u.h"
        !             2: #include "../port/lib.h"
        !             3: #include "mem.h"
        !             4: #include "dat.h"
        !             5: #include "fns.h"
        !             6: #include "../port/error.h"
        !             7: 
        !             8: #include <libg.h>
        !             9: #include <gnot.h>
        !            10: #include "screen.h"
        !            11: #include "vga.h"
        !            12: 
        !            13: /*
        !            14:  * Hardware graphics cursor support for
        !            15:  * Brooktree Bt485 Monolithic True-Color RAMDAC.
        !            16:  * Assumes hooked up to an S3 86C928.
        !            17:  *
        !            18:  * BUGS:
        !            19:  *     64x64x2 cursor always used;
        !            20:  *     no support for interlaced mode.
        !            21:  */
        !            22: enum {
        !            23:        AddrW           = 0x00,         /* Address register; palette/cursor RAM write */
        !            24:        Palette         = 0x01,         /* 6/8-bit color palette data */
        !            25:        Pmask           = 0x02,         /* Pixel mask register */
        !            26:        AddrR           = 0x03,         /* Address register; palette/cursor RAM read */
        !            27:        ColorW          = 0x04,         /* Address register; cursor/overscan color write */
        !            28:        Color           = 0x05,         /* Cursor/overscan color data */
        !            29:        Cmd0            = 0x06,         /* Command register 0 */
        !            30:        ColorR          = 0x07,         /* Address register; cursor/overscan color read */
        !            31:        Cmd1            = 0x08,         /* Command register 1 */
        !            32:        Cmd2            = 0x09,         /* Command register 2 */
        !            33:        Status          = 0x0A,         /* Status */
        !            34:        Cmd3            = 0x1A,         /* Command register 3 */
        !            35:        Cram            = 0x0B,         /* Cursor RAM array data */
        !            36:        Cxlr            = 0x0C,         /* Cursor x-low register */
        !            37:        Cxhr            = 0x0D,         /* Cursor x-high register */
        !            38:        Cylr            = 0x0E,         /* Cursor y-low register */
        !            39:        Cyhr            = 0x0F,         /* Cursor y-high register */
        !            40: 
        !            41:        Nreg            = 0x10,
        !            42: };
        !            43: 
        !            44: /*
        !            45:  * Lower 2-bits of indirect DAC register
        !            46:  * addressing.
        !            47:  */
        !            48: static ushort dacxreg[4] = {
        !            49:        PaddrW, Pdata, Pixmask, PaddrR
        !            50: };
        !            51: 
        !            52: static uchar
        !            53: bt485io(uchar reg)
        !            54: {
        !            55:        uchar crt55, cr0;
        !            56: 
        !            57:        crt55 = vgaxi(Crtx, 0x55) & 0xFC;
        !            58:        if((reg & 0x0F) == Status){
        !            59:                /*
        !            60:                 * 1,2: Set indirect addressing for Status or
        !            61:                 *      Cmd3 - set bit7 of Cr0.
        !            62:                 */
        !            63:                vgaxo(Crtx, 0x55, crt55|((Cmd0>>2) & 0x03));
        !            64:                cr0 = vgai(dacxreg[Cmd0 & 0x03])|0x80;
        !            65:                vgao(dacxreg[Cmd0 & 0x03], cr0);
        !            66: 
        !            67:                /*
        !            68:                 * 3,4: Set the index into the Write register,
        !            69:                 *      index == 0x00 for Status, 0x01 for Cmd3.
        !            70:                 */
        !            71:                vgaxo(Crtx, 0x55, crt55|((AddrW>>2) & 0x03));
        !            72:                vgao(dacxreg[AddrW & 0x03], (reg == Status) ? 0x00: 0x01);
        !            73: 
        !            74:                /*
        !            75:                 * 5,6: Get the contents of the appropriate
        !            76:                 *      register at 0x0A.
        !            77:                 */
        !            78:        }
        !            79: 
        !            80:        return crt55;
        !            81: }
        !            82: 
        !            83: static uchar
        !            84: bt485i(uchar reg)
        !            85: {
        !            86:        uchar crt55, r;
        !            87: 
        !            88:        crt55 = bt485io(reg);
        !            89:        vgaxo(Crtx, 0x55, crt55|((reg>>2) & 0x03));
        !            90:        r = vgai(dacxreg[reg & 0x03]);
        !            91:        vgaxo(Crtx, 0x55, crt55);
        !            92: 
        !            93:        return r;
        !            94: }
        !            95: 
        !            96: static void
        !            97: bt485o(uchar reg, uchar data)
        !            98: {
        !            99:        uchar crt55;
        !           100: 
        !           101:        crt55 = bt485io(reg);
        !           102:        vgaxo(Crtx, 0x55, crt55|((reg>>2) & 0x03));
        !           103:        vgao(dacxreg[reg & 0x03], data);
        !           104:        vgaxo(Crtx, 0x55, crt55);
        !           105: }
        !           106: 
        !           107: static Point hotpoint;
        !           108: 
        !           109: static void
        !           110: load(Cursor *c)
        !           111: {
        !           112:        uchar r;
        !           113:        int x, y;
        !           114:        uchar clr[2*16], set[2*16];
        !           115: 
        !           116: 
        !           117:        lock(&palettelock);
        !           118: 
        !           119:        /*
        !           120:         * Turn cursor off;
        !           121:         * put cursor into 64x64x2 mode and clear MSBs of address;
        !           122:         * clear LSBs of address;
        !           123:         */
        !           124:        r = bt485i(Cmd2) & 0xFC;
        !           125:        bt485o(Cmd2, r);
        !           126: 
        !           127:        r = (bt485i(Cmd3) & 0xFC)|0x04;
        !           128:        bt485o(Cmd3, r);
        !           129: 
        !           130:        bt485o(AddrW, 0x00);
        !           131: 
        !           132:        /*
        !           133:         * Now load the cursor RAM array, both planes.
        !           134:         * The cursor is 16x16, the array 64x64; put
        !           135:         * the cursor in the top left. The 0,0 cursor
        !           136:         * point is bottom-right, so positioning will
        !           137:         * have to take that into account.
        !           138:         */
        !           139:        memmove(clr, c->clr, sizeof(clr));
        !           140:        pixreverse(clr, sizeof(clr), 0);
        !           141:        memmove(set, c->set, sizeof(set));
        !           142:        pixreverse(set, sizeof(set), 0);
        !           143:        for(y = 0; y < 64; y++){
        !           144:                for(x = 0; x < 64/8; x++){
        !           145:                        if(x < 16/8 && y < 16)
        !           146:                                bt485o(Cram, clr[x+y*2]);
        !           147:                        else
        !           148:                                bt485o(Cram, 0x00);
        !           149:                }
        !           150:        }
        !           151:        for(y = 0; y < 64; y++){
        !           152:                for(x = 0; x < 64/8; x++){
        !           153:                        if(x < 16/8 && y < 16)
        !           154:                                bt485o(Cram, set[x+y*2]);
        !           155:                        else
        !           156:                                bt485o(Cram, 0x00);
        !           157:                }
        !           158:        }
        !           159: 
        !           160:        /*
        !           161:         * Initialise the cursor hot-point
        !           162:         * and enable the cursor.
        !           163:         */
        !           164:        hotpoint.x = 64+c->offset.x;
        !           165:        hotpoint.y = 64+c->offset.y;
        !           166: 
        !           167:        r = (bt485i(Cmd2) & 0xFC)|0x01;
        !           168:        bt485o(Cmd2, r);
        !           169: 
        !           170:        unlock(&palettelock);
        !           171: }
        !           172: 
        !           173: static void
        !           174: enable(void)
        !           175: {
        !           176:        uchar r;
        !           177: 
        !           178:        lock(&palettelock);
        !           179: 
        !           180:        /*
        !           181:         * Turn cursor off.
        !           182:         */
        !           183:        r = bt485i(Cmd2) & 0xFC;
        !           184:        bt485o(Cmd2, r);
        !           185: 
        !           186:        /*
        !           187:         * Overscan colour,
        !           188:         * cursor colour 1 (white),
        !           189:         * cursor colour 2, 3 (black).
        !           190:         */
        !           191:        bt485o(ColorW, 0x00);
        !           192:        bt485o(Color, 0xFF); bt485o(Color, 0xFF); bt485o(Color, 0xFF);
        !           193: 
        !           194:        bt485o(Color, 0xFF); bt485o(Color, 0xFF); bt485o(Color, 0xFF);
        !           195: 
        !           196:        bt485o(Color, 0x00); bt485o(Color, 0x00); bt485o(Color, 0x00);
        !           197:        bt485o(Color, 0x00); bt485o(Color, 0x00); bt485o(Color, 0x00);
        !           198: 
        !           199:        unlock(&palettelock);
        !           200: 
        !           201:        /*
        !           202:         * Finally, enable
        !           203:         *      the hardware cursor external operation mode;
        !           204:         *      cursor control enable for Bt485 DAC.
        !           205:         * The #9GXE cards seem to need the 86C928 Bt485 support
        !           206:         * enabled in order to work at all in enhanced mode.
        !           207:         */
        !           208: 
        !           209:        r = vgaxi(Crtx, 0x55)|0x20;
        !           210:        vgaxo(Crtx, 0x55, r);
        !           211: 
        !           212:        r = vgaxi(Crtx, 0x45)|0x20;
        !           213:        vgaxo(Crtx, 0x45, r);
        !           214: }
        !           215: 
        !           216: static int
        !           217: move(Point p)
        !           218: {
        !           219:        int x, y;
        !           220: 
        !           221:        if(canlock(&palettelock) == 0)
        !           222:                return 1;
        !           223: 
        !           224:        x = p.x+hotpoint.x;
        !           225:        y = p.y+hotpoint.y;
        !           226: 
        !           227:        bt485o(Cxlr, x & 0xFF);
        !           228:        bt485o(Cxhr, (x>>8) & 0x0F);
        !           229:        bt485o(Cylr, y & 0xFF);
        !           230:        bt485o(Cyhr, (y>>8) & 0x0F);
        !           231: 
        !           232:        unlock(&palettelock);
        !           233:        return 0;
        !           234: }
        !           235: 
        !           236: static void
        !           237: disable(void)
        !           238: {
        !           239:        uchar r;
        !           240: 
        !           241:        /*
        !           242:         * Disable 
        !           243:         *      cursor mode 3;
        !           244:         *      cursor control enable for Bt485 DAC;
        !           245:         *      the hardware cursor external operation mode.
        !           246:         */
        !           247:        lock(&palettelock);
        !           248:        r = bt485i(Cmd2) & ~0x03;
        !           249:        bt485o(Cmd2, r);
        !           250:        unlock(&palettelock);
        !           251: 
        !           252:        r = vgaxi(Crtx, 0x45) & ~0x20;
        !           253:        vgaxo(Crtx, 0x45, r);
        !           254: 
        !           255:        r = vgaxi(Crtx, 0x55) & ~0x20;
        !           256:        vgaxo(Crtx, 0x55, r);
        !           257: }
        !           258: 
        !           259: static Hwgc bt485hwgc = {
        !           260:        "bt485hwgc",
        !           261:        enable,
        !           262:        load,
        !           263:        move,
        !           264:        disable,
        !           265: 
        !           266:        0,
        !           267: };
        !           268: 
        !           269: void
        !           270: vgabt485link(void)
        !           271: {
        !           272:        addhwgclink(&bt485hwgc);
        !           273: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.