## diffname pc/vgaclgd542x.c 1995/02021 ## diff -e /dev/null /n/fornaxdump/1995/02021/sys/src/brazil/pc/vgaclgd542x.c 0a #include "u.h" #include "../port/lib.h" #include "mem.h" #include "dat.h" #include "fns.h" #include "../port/error.h" #include #include "screen.h" #include "vga.h" static void clgd542xpage(int page) { vgaxo(Grx, 0x09, page<<4); } static Vgac clgd542x = { "clgd542x", clgd542xpage, 0, }; void vgaclgd542xlink(void) { addvgaclink(&clgd542x); } . ## diffname pc/vgaclgd542x.c 1997/0327 ## diff -e /n/fornaxdump/1995/02021/sys/src/brazil/pc/vgaclgd542x.c /n/emeliedump/1997/0327/sys/src/brazil/pc/vgaclgd542x.c 15a unlock(&clgd542xlock); . 14a lock(&clgd542xlock); . 11a static Lock clgd542xlock; . ## diffname pc/vgaclgd542x.c 1997/0716 ## diff -e /n/emeliedump/1997/0327/sys/src/brazil/pc/vgaclgd542x.c /n/emeliedump/1997/0716/sys/src/brazil/pc/vgaclgd542x.c 32a addhwgclink(&clgd542xhwgc); . 21a static void disable(void) { uchar sr12; lock(&clgd542xlock); sr12 = vgaxi(Seqx, 0x12); vgaxo(Seqx, 0x12, sr12 & ~0x01); unlock(&clgd542xlock); } static void enable(void) { uchar sr12; /* * Disable the cursor. */ lock(&clgd542xlock); sr12 = vgaxi(Seqx, 0x12); vgaxo(Seqx, 0x12, sr12 & ~0x01); /* * Cursor colours. */ vgaxo(Seqx, 0x12, sr12|0x02); setcolor(0x00, Pwhite<<(32-6), Pwhite<<(32-6), Pwhite<<(32-6)); setcolor(0x0F, Pblack<<(32-6), Pblack<<(32-6), Pblack<<(32-6)); vgaxo(Seqx, 0x12, sr12); /* * Memory size. The BIOS leaves this in Seq0A, bits 4 and 3. * See Technical Reference Manual Appendix E1, Section 1.3.2. * * The storage area for the 64x64 cursors is the last 16Kb of * display memory. */ switch((vgaxi(Seqx, 0x0A)>>3) & 0x03){ case 0: storage = (256-16)*1024; break; case 1: storage = (512-16)*1024; break; case 2: storage = (1024-16)*1024; break; case 3: storage = (2048-16)*1024; break; } /* * Set the current cursor to index 0 * and turn the 64x64 cursor on. */ vgaxo(Seqx, 0x13, 0); vgaxo(Seqx, 0x12, sr12|0x05); unlock(&clgd542xlock); } static void initcursor(Cursor* c, int xo, int yo, int index) { uchar *p; uint p0, p1; int x, y; /* * Is linear addressing turned on? This will determine * how we access the cursor storage. */ if(vgaxi(Seqx, 0x07) & 0xF0) p = ((uchar*)gscreen.base) + storage; else { vgaxo(Grx, 0x09, (storage>>16)<<4); p = ((uchar*)gscreen.base) + (storage & 0xFFFF); } p += index*1024; for(y = yo; y < 16; y++){ p0 = c->clr[2*y]; p1 = c->clr[2*y+1]; if(xo){ p0 = (p0<>(8-xo)); p1 <<= xo; } *p++ = p0; *p++ = p1; for(x = 16; x < 64; x += 8) *p++ = 0x00; p0 = c->clr[2*y]|c->set[2*y]; p1 = c->clr[2*y+1]|c->set[2*y+1]; if(xo){ p0 = (p0<>(8-xo)); p1 <<= xo; } *p++ = p0; *p++ = p1; for(x = 16; x < 64; x += 8) *p++ = 0x00; } while(y < 64+yo){ for(x = 0; x < 64; x += 8){ *p++ = 0x00; *p++ = 0x00; } y++; } } static void load(Cursor* c) { uchar sr12; /* * Lock the display memory so we can update the * cursor bitmap if necessary. * Disable the cursor. * If it's the same as the last cursor loaded, * just make sure it's enabled and index 0. */ lock(&clgd542xlock); sr12 = vgaxi(Seqx, 0x12); vgaxo(Seqx, 0x12, sr12 & ~0x01); if(memcmp(c, &curcursor, sizeof(Cursor)) == 0){ vgaxo(Seqx, 0x13, 0); vgaxo(Seqx, 0x12, sr12|0x05); unlock(&clgd542xlock); return; } memmove(&curcursor, c, sizeof(Cursor)); initcursor(c, 0, 0, 0); /* * Enable the cursor. */ vgaxo(Seqx, 0x13, 0); vgaxo(Seqx, 0x12, sr12|0x05); unlock(&clgd542xlock); } static int move(Point p) { int index, x, xo, y, yo; if(canlock(&clgd542xlock) == 0) return 1; index = 0; if((x = p.x+curcursor.offset.x) < 0){ xo = -x; x = 0; } else xo = 0; if((y = p.y+curcursor.offset.y) < 0){ yo = -y; y = 0; } else yo = 0; if(xo || yo){ initcursor(&curcursor, xo, yo, 1); index = 1; } vgaxo(Seqx, 0x13, index<<2); vgaxo(Seqx, 0x10|((x & 0x07)<<5), (x>>3) & 0xFF); vgaxo(Seqx, 0x11|((y & 0x07)<<5), (y>>3) & 0xFF); unlock(&clgd542xlock); return 0; } static Hwgc clgd542xhwgc = { "clgd542xhwgc", enable, load, move, disable, 0, }; . 12a static ulong storage; . 11a extern Bitmap gscreen; extern Cursor curcursor; . ## diffname pc/vgaclgd542x.c 1997/0717 ## diff -e /n/emeliedump/1997/0716/sys/src/brazil/pc/vgaclgd542x.c /n/emeliedump/1997/0717/sys/src/brazil/pc/vgaclgd542x.c 227a clgd542xlinear, . 110c // p += index*1024; memset(p, 0xFF, 16*1024); return; . 82c storage = ((256<>3) & 0x03; if(x & 0x80) mem++; . 66,67c case 0x88: /* CL-GD5420 */ case 0x8C: /* CL-GD5422 */ case 0x94: /* CL-GD5424 */ case 0x80: /* CL-GD5425 */ case 0x90: /* CL-GD5426 */ case 0x98: /* CL-GD5427 */ case 0x9C: /* CL-GD5429 */ /* * The BIOS leaves the memory size in Seq0A, bits 4 and 3. * See Technical Reference Manual Appendix E1, Section 1.3.2. * * The storage area for the 64x64 cursors is the last 16Kb of * display memory. */ mem = (vgaxi(Seqx, 0x0A)>>3) & 0x03; . 57,64c mem = 0; switch(vgaxi(Crtx, 0x27) & ~0x03){ . 40a int mem, x; . 25a static int clgd542xlinear(ulong* mem, ulong* size, ulong* align) { ulong baseaddr; static Pcidev *p; if((*size && *size < 16*MB) || (*align && (*align & (16*MB-1)))) return 0; *mem = 0; /* * This obviously isn't good enough on a system with * more than one PCI card from Cirrus. */ if(p == 0 && (p = pcimatch(p, 0x1013, 0)) == 0) return 0; switch(p->did){ case 0xA0: case 0xA8: case 0xAC: break; default: return 0; } if((baseaddr = upamalloc(0, *size, *align)) == 0) return 0; *mem = baseaddr; baseaddr = PADDR(baseaddr); pcicfgw32(p, PciBAR0, baseaddr); return *mem; } . 5a #include "io.h" . ## diffname pc/vgaclgd542x.c 1997/0718 ## diff -e /n/emeliedump/1997/0717/sys/src/brazil/pc/vgaclgd542x.c /n/emeliedump/1997/0718/sys/src/brazil/pc/vgaclgd542x.c 230a { for(storage = 0; storage < (2048-32)*1024; storage += 16*1024) initcursor(c, 0, 0, 0); } . 163,165c p += index*1024; . 160c setclgd542xpage(storage>>16); . 55a /* * This doesn't work if the card is on the other side of a * a bridge. Need to coordinate with PCI support. */ . 34a if(*align == 0) *align = 16*MB; else if(*align & (16*MB-1)) return 0; . 33c if(*size != 16*MB) . 23c setclgd542xpage(page); . 19a setclgd542xpage(int page) { if(vgaxi(Seqx, 0x07) & 0xF0) page = 0; if(vgaxi(Seqx, 0x0B) & 0x20) vgaxo(Grx, 0x09, page<<2); else vgaxo(Grx, 0x09, page<<4); } static void . ## diffname pc/vgaclgd542x.c 1997/1004 ## diff -e /n/emeliedump/1997/0718/sys/src/brazil/pc/vgaclgd542x.c /n/emeliedump/1997/1004/sys/src/brazil/pc/vgaclgd542x.c 248,251d 215a #ifdef notdef buggery(0); #endif /* notdef */ if(!(vgaxi(Seqx, 0x07) & 0xF0)) setclgd542xpage(opage); . 180a #endif /* notdef */ . 178,179c else{ #ifdef notdef p = buggery(1); #else opage = setclgd542xpage(storage>>16); . 175a opage = 0; . 170c int opage, x, y; . 164a static uchar* buggery(int on) { static uchar gr9, grA, grB; uchar *p; p = 0; if(on){ gr9 = vgaxi(Grx, 0x09); grA = vgaxi(Grx, 0x0A); grB = vgaxi(Grx, 0x0B); vgaxo(Grx, 0x0B, 0x21|grB); vgaxo(Grx, 0x09, storage>>14); p = ((uchar*)gscreen.base) + (storage & 0x3FFF); } else{ vgaxo(Grx, 0x09, gr9); vgaxo(Grx, 0x0A, grA); vgaxo(Grx, 0x0B, grB); } return p; } . 27a opage = gr9>>4; } return opage; . 26c opage = gr9>>2; } else{ . 24c gr9 = vgaxi(Grx, 0x09); grB = vgaxi(Grx, 0x0B); if(grB & 0x20){ . 21a uchar gr9, grB; int opage; . 19c static int . ## diffname pc/vgaclgd542x.c 1997/1007 ## diff -e /n/emeliedump/1997/1004/sys/src/brazil/pc/vgaclgd542x.c /n/emeliedump/1997/1007/sys/src/brazil/pc/vgaclgd542x.c 348c 0, . 258,262c if(!(seq07 & 0xF0)) . 226,227c p0 = c->set[2*y]; p1 = c->set[2*y+1]; . 222a else p += storage; . 220,221c p += (storage & 0xFFFF); . 213,218c p = ((uchar*)gscreen.base); if(!(seq07 & 0xF0)){ . 211a seq07 = vgaxi(Seqx, 0x07); . 204c uchar *p, seq07; . 176,200d 123,124c setcolor(0x00, Pblack<<(32-6), Pblack<<(32-6), Pblack<<(32-6)); setcolor(0x0F, Pwhite<<(32-6), Pwhite<<(32-6), Pwhite<<(32-6)); . 49,94d 28,29c if(vgaxi(Grx, 0x0B) & 0x20){ . 22c uchar gr9; . ## diffname pc/vgaclgd542x.c 1997/1101 ## diff -e /n/emeliedump/1997/1007/sys/src/brazil/pc/vgaclgd542x.c /n/emeliedump/1997/1101/sys/src/brazil/pc/vgaclgd542x.c 275,280c VGAcur vgaclgd542xcur = { "clgd542xhwgc", clgd542xenable, clgd542xdisable, clgd542xload, clgd542xmove, }; . 271,272d 265,268c 0, . 257,262c VGAdev vgaclgd542xdev = { "clgd542x", . 253d 245c clgd542xinitcursor(scr, xo, yo, 1); . 237c if((y = p.y+scr->offset.y) < 0){ . 231c if((x = p.x+scr->offset.x) < 0){ . 227,229d 223c clgd542xmove(VGAscr* scr, Point p) . 218,219d 204,211c memmove(&scr->Cursor, curs, sizeof(Cursor)); clgd542xinitcursor(scr, 0, 0, 0); . 200d 197,198d 194,195d 189c clgd542xload(VGAscr* scr, Cursor* curs) . 184,185c if(!(seq07 & 0xF0)){ clgd542xpageset(scr, opage); unlock(&scr->devlock); } . 164,165c p0 = scr->clr[2*y]|scr->set[2*y]; p1 = scr->clr[2*y+1]|scr->set[2*y+1]; . 152,153c p0 = scr->set[2*y]; p1 = scr->set[2*y+1]; . 148c p += scr->storage; . 144,145c lock(&scr->devlock); opage = clgd542xpageset(scr, scr->storage>>16); p += (scr->storage & 0xFFFF); . 142c p = KADDR(scr->aperture); . 130c clgd542xinitcursor(VGAscr* scr, int xo, int yo, int index) . 125,126d 117c scr->storage = ((256<devlock); clgd542xpageset(scr, page); unlock(&scr->devlock); . 41c clgd542xpage(VGAscr* scr, int page) . 34c opage = gr09>>4; . 30c opage = gr09>>2; . 27c gr09 = vgaxi(Grx, 0x09); . 24c . 22c uchar gr09; . 20c clgd542xpageset(VGAscr*, int page) . 13,18d 11d 9c #define Image IMAGE #include #include . ## diffname pc/vgaclgd542x.c 1998/0106 ## diff -e /n/emeliedump/1997/1101/sys/src/brazil/pc/vgaclgd542x.c /n/emeliedump/1998/0106/sys/src/brazil/pc/vgaclgd542x.c 101a case 0xB8: /* CL-GD5446 */ . ## diffname pc/vgaclgd542x.c 1998/0308 ## diff -e /n/emeliedump/1998/0106/sys/src/brazil/pc/vgaclgd542x.c /n/emeliedump/1998/0308/sys/src/brazil/pc/vgaclgd542x.c 61,62c sr12 = vgaxi(Seqx, 0x12) & ~0x01; vgaxo(Seqx, 0x12, sr12); . ## diffname pc/vgaclgd542x.c 1998/0312 ## diff -e /n/emeliedump/1998/0308/sys/src/brazil/pc/vgaclgd542x.c /n/emeliedump/1998/0312/sys/src/brazil/pc/vgaclgd542x.c 61,62c sr12 = vgaxi(Seqx, 0x12); vgaxo(Seqx, 0x12, sr12 & ~0x01); . ## diffname pc/vgaclgd542x.c 1998/0512 ## diff -e /n/emeliedump/1998/0312/sys/src/brazil/pc/vgaclgd542x.c /n/emeliedump/1998/0512/sys/src/brazil/pc/vgaclgd542x.c 247c clgd542xlinear, . 42a static ulong clgd542xlinear(VGAscr* scr, int* size, int* align) { ulong aperture, oaperture; int oapsize, wasupamem; Pcidev *p; oaperture = scr->aperture; oapsize = scr->apsize; wasupamem = scr->isupamem; if(wasupamem) upafree(oaperture, oapsize); scr->isupamem = 0; if(p = pcimatch(nil, 0x1013, 0)){ aperture = p->mem[0].bar & ~0x0F; *size = p->mem[0].size; } else aperture = 0; aperture = upamalloc(aperture, *size, *align); if(aperture == 0){ if(wasupamem && upamalloc(oaperture, oapsize, 0)) scr->isupamem = 1; } else scr->isupamem = 1; return aperture; } . ## diffname pc/vgaclgd542x.c 1999/0119 ## diff -e /n/emeliedump/1998/0512/sys/src/brazil/pc/vgaclgd542x.c /n/emeliedump/1999/0119/sys/src/brazil/pc/vgaclgd542x.c 11a #include . ## diffname pc/vgaclgd542x.c 2000/0927 ## diff -e /n/emeliedump/1999/0119/sys/src/brazil/pc/vgaclgd542x.c /n/emeliedump/2000/0927/sys/src/9/pc/vgaclgd542x.c 135a case 0x30: /* CL-GD7543 */ .