17dd7cddfSDavid du Colombier typedef struct Cursor Cursor; 27dd7cddfSDavid du Colombier typedef struct Cursorinfo Cursorinfo; 37dd7cddfSDavid du Colombier struct Cursorinfo { 47dd7cddfSDavid du Colombier Cursor; 57dd7cddfSDavid du Colombier Lock; 67dd7cddfSDavid du Colombier }; 7219b2ee8SDavid du Colombier 87dd7cddfSDavid du Colombier /* devmouse.c */ 99a747e4fSDavid du Colombier extern void mousetrack(int, int, int, int); 107dd7cddfSDavid du Colombier extern Point mousexy(void); 117dd7cddfSDavid du Colombier 127dd7cddfSDavid du Colombier extern void mouseaccelerate(int); 137dd7cddfSDavid du Colombier extern int m3mouseputc(Queue*, int); 14aa46331bSDavid du Colombier extern int m5mouseputc(Queue*, int); 157dd7cddfSDavid du Colombier extern int mouseputc(Queue*, int); 167dd7cddfSDavid du Colombier 177dd7cddfSDavid du Colombier extern Cursorinfo cursor; 187dd7cddfSDavid du Colombier extern Cursor arrow; 197dd7cddfSDavid du Colombier 207dd7cddfSDavid du Colombier /* 217dd7cddfSDavid du Colombier * Generic VGA registers. 227dd7cddfSDavid du Colombier */ 237dd7cddfSDavid du Colombier enum { 247dd7cddfSDavid du Colombier MiscW = 0x03C2, /* Miscellaneous Output (W) */ 257dd7cddfSDavid du Colombier MiscR = 0x03CC, /* Miscellaneous Output (R) */ 267dd7cddfSDavid du Colombier Status0 = 0x03C2, /* Input status 0 (R) */ 277dd7cddfSDavid du Colombier Status1 = 0x03DA, /* Input Status 1 (R) */ 287dd7cddfSDavid du Colombier FeatureR = 0x03CA, /* Feature Control (R) */ 297dd7cddfSDavid du Colombier FeatureW = 0x03DA, /* Feature Control (W) */ 307dd7cddfSDavid du Colombier 317dd7cddfSDavid du Colombier Seqx = 0x03C4, /* Sequencer Index, Data at Seqx+1 */ 327dd7cddfSDavid du Colombier Crtx = 0x03D4, /* CRT Controller Index, Data at Crtx+1 */ 337dd7cddfSDavid du Colombier Grx = 0x03CE, /* Graphics Controller Index, Data at Grx+1 */ 347dd7cddfSDavid du Colombier Attrx = 0x03C0, /* Attribute Controller Index and Data */ 357dd7cddfSDavid du Colombier 367dd7cddfSDavid du Colombier PaddrW = 0x03C8, /* Palette Address Register, write */ 377dd7cddfSDavid du Colombier Pdata = 0x03C9, /* Palette Data Register */ 387dd7cddfSDavid du Colombier Pixmask = 0x03C6, /* Pixel Mask Register */ 397dd7cddfSDavid du Colombier PaddrR = 0x03C7, /* Palette Address Register, read */ 407dd7cddfSDavid du Colombier Pstatus = 0x03C7, /* DAC Status (RO) */ 417dd7cddfSDavid du Colombier 427dd7cddfSDavid du Colombier Pcolours = 256, /* Palette */ 437dd7cddfSDavid du Colombier Pred = 0, 447dd7cddfSDavid du Colombier Pgreen = 1, 457dd7cddfSDavid du Colombier Pblue = 2, 467dd7cddfSDavid du Colombier 477dd7cddfSDavid du Colombier Pblack = 0x00, 487dd7cddfSDavid du Colombier Pwhite = 0xFF, 497dd7cddfSDavid du Colombier }; 507dd7cddfSDavid du Colombier 516a9fc400SDavid du Colombier #define VGAMEM() 0xA0000 527dd7cddfSDavid du Colombier #define vgai(port) inb(port) 537dd7cddfSDavid du Colombier #define vgao(port, data) outb(port, data) 547dd7cddfSDavid du Colombier 557dd7cddfSDavid du Colombier extern int vgaxi(long, uchar); 567dd7cddfSDavid du Colombier extern int vgaxo(long, uchar, uchar); 577dd7cddfSDavid du Colombier 587dd7cddfSDavid du Colombier /* 597dd7cddfSDavid du Colombier */ 607dd7cddfSDavid du Colombier typedef struct VGAdev VGAdev; 617dd7cddfSDavid du Colombier typedef struct VGAcur VGAcur; 627dd7cddfSDavid du Colombier typedef struct VGAscr VGAscr; 637dd7cddfSDavid du Colombier 647dd7cddfSDavid du Colombier struct VGAdev { 657dd7cddfSDavid du Colombier char* name; 667dd7cddfSDavid du Colombier 677dd7cddfSDavid du Colombier void (*enable)(VGAscr*); 687dd7cddfSDavid du Colombier void (*disable)(VGAscr*); 697dd7cddfSDavid du Colombier void (*page)(VGAscr*, int); 704de34a7eSDavid du Colombier void (*linear)(VGAscr*, int, int); 717dd7cddfSDavid du Colombier void (*drawinit)(VGAscr*); 727dd7cddfSDavid du Colombier int (*fill)(VGAscr*, Rectangle, ulong); 739a747e4fSDavid du Colombier void (*ovlctl)(VGAscr*, Chan*, void*, int); 749a747e4fSDavid du Colombier int (*ovlwrite)(VGAscr*, void*, int, vlong); 759a747e4fSDavid du Colombier void (*flush)(VGAscr*, Rectangle); 767dd7cddfSDavid du Colombier }; 777dd7cddfSDavid du Colombier 787dd7cddfSDavid du Colombier struct VGAcur { 797dd7cddfSDavid du Colombier char* name; 807dd7cddfSDavid du Colombier 817dd7cddfSDavid du Colombier void (*enable)(VGAscr*); 827dd7cddfSDavid du Colombier void (*disable)(VGAscr*); 837dd7cddfSDavid du Colombier void (*load)(VGAscr*, Cursor*); 847dd7cddfSDavid du Colombier int (*move)(VGAscr*, Point); 857dd7cddfSDavid du Colombier 867dd7cddfSDavid du Colombier int doespanning; 877dd7cddfSDavid du Colombier }; 887dd7cddfSDavid du Colombier 897dd7cddfSDavid du Colombier /* 907dd7cddfSDavid du Colombier */ 917dd7cddfSDavid du Colombier struct VGAscr { 927dd7cddfSDavid du Colombier Lock devlock; 937dd7cddfSDavid du Colombier VGAdev* dev; 944de34a7eSDavid du Colombier Pcidev* pci; 957dd7cddfSDavid du Colombier 967dd7cddfSDavid du Colombier VGAcur* cur; 977dd7cddfSDavid du Colombier ulong storage; 987dd7cddfSDavid du Colombier Cursor; 997dd7cddfSDavid du Colombier 1007dd7cddfSDavid du Colombier int useflush; 1017dd7cddfSDavid du Colombier 1024de34a7eSDavid du Colombier ulong paddr; /* frame buffer */ 1034de34a7eSDavid du Colombier void* vaddr; 1047dd7cddfSDavid du Colombier int apsize; 1057dd7cddfSDavid du Colombier 1067dd7cddfSDavid du Colombier ulong io; /* device specific registers */ 1074de34a7eSDavid du Colombier ulong *mmio; 1087dd7cddfSDavid du Colombier 1097dd7cddfSDavid du Colombier ulong colormap[Pcolours][3]; 1107dd7cddfSDavid du Colombier int palettedepth; 1117dd7cddfSDavid du Colombier 1127dd7cddfSDavid du Colombier Memimage* gscreen; 1137dd7cddfSDavid du Colombier Memdata* gscreendata; 1147dd7cddfSDavid du Colombier Memsubfont* memdefont; 1157dd7cddfSDavid du Colombier 1167dd7cddfSDavid du Colombier int (*fill)(VGAscr*, Rectangle, ulong); 1177dd7cddfSDavid du Colombier int (*scroll)(VGAscr*, Rectangle, Rectangle); 1187dd7cddfSDavid du Colombier void (*blank)(VGAscr*, int); 1197dd7cddfSDavid du Colombier ulong id; /* internal identifier for driver use */ 1206a9fc400SDavid du Colombier int isblank; 121fb7f0c93SDavid du Colombier int overlayinit; 1227dd7cddfSDavid du Colombier }; 1237dd7cddfSDavid du Colombier 1247dd7cddfSDavid du Colombier extern VGAscr vgascreen[]; 1257dd7cddfSDavid du Colombier 1267dd7cddfSDavid du Colombier enum { 1277dd7cddfSDavid du Colombier Backgnd = 0, /* black */ 1287dd7cddfSDavid du Colombier }; 1297dd7cddfSDavid du Colombier 1307dd7cddfSDavid du Colombier /* mouse.c */ 1319a747e4fSDavid du Colombier extern void mousectl(Cmdbuf*); 1324de34a7eSDavid du Colombier extern void mouseresize(void); 1337dd7cddfSDavid du Colombier 1347dd7cddfSDavid du Colombier /* screen.c */ 1357dd7cddfSDavid du Colombier extern int hwaccel; /* use hw acceleration; default on */ 1367dd7cddfSDavid du Colombier extern int hwblank; /* use hw blanking; default on */ 1379a747e4fSDavid du Colombier extern int panning; /* use virtual screen panning; default off */ 1389a747e4fSDavid du Colombier extern void addvgaseg(char*, ulong, ulong); 1399a747e4fSDavid du Colombier extern uchar* attachscreen(Rectangle*, ulong*, int*, int*, int*); 1407dd7cddfSDavid du Colombier extern void flushmemscreen(Rectangle); 1417dd7cddfSDavid du Colombier extern int cursoron(int); 1427dd7cddfSDavid du Colombier extern void cursoroff(int); 143219b2ee8SDavid du Colombier extern void setcursor(Cursor*); 1447dd7cddfSDavid du Colombier extern int screensize(int, int, int, ulong); 1457dd7cddfSDavid du Colombier extern int screenaperture(int, int); 1467dd7cddfSDavid du Colombier extern Rectangle physgscreenr; /* actual monitor size */ 1477dd7cddfSDavid du Colombier extern void blankscreen(int); 1487dd7cddfSDavid du Colombier 1494de34a7eSDavid du Colombier extern VGAcur swcursor; 1504de34a7eSDavid du Colombier extern void swcursorinit(void); 1514de34a7eSDavid du Colombier extern void swcursorhide(void); 1524de34a7eSDavid du Colombier extern void swcursoravoid(Rectangle); 1534de34a7eSDavid du Colombier extern void swcursorunhide(void); 1544de34a7eSDavid du Colombier 1557dd7cddfSDavid du Colombier /* devdraw.c */ 1567dd7cddfSDavid du Colombier extern void deletescreenimage(void); 1574de34a7eSDavid du Colombier extern void resetscreenimage(void); 1587dd7cddfSDavid du Colombier extern int drawhasclients(void); 1597dd7cddfSDavid du Colombier extern ulong blanktime; 1609a747e4fSDavid du Colombier extern void setscreenimageclipr(Rectangle); 1619a747e4fSDavid du Colombier extern void drawflush(void); 1626a9fc400SDavid du Colombier extern int drawidletime(void); 1634de34a7eSDavid du Colombier extern QLock drawlock; 1647dd7cddfSDavid du Colombier 1657dd7cddfSDavid du Colombier /* vga.c */ 1667dd7cddfSDavid du Colombier extern void vgascreenwin(VGAscr*); 1677dd7cddfSDavid du Colombier extern void vgaimageinit(ulong); 1684de34a7eSDavid du Colombier extern void vgalinearpciid(VGAscr*, int, int); 1694de34a7eSDavid du Colombier extern void vgalinearpci(VGAscr*); 1704de34a7eSDavid du Colombier extern void vgalinearaddr(VGAscr*, ulong, int); 1717dd7cddfSDavid du Colombier 1727dd7cddfSDavid du Colombier extern void drawblankscreen(int); 1737dd7cddfSDavid du Colombier extern void vgablank(VGAscr*, int); 1744de34a7eSDavid du Colombier 1754de34a7eSDavid du Colombier extern Lock vgascreenlock; 1764de34a7eSDavid du Colombier 177*1ee3cffaSDavid du Colombier #define ishwimage(i) (vgascreen[0].gscreendata && (i)->data->bdata == vgascreen[0].gscreendata->bdata) 178