| plan 9 kernel history: overview | file list | diff list |
1997/0327/pc/vgaark2000pv.c (diff list | history)
| pc/vgaark2000pv.c on 1995/0512 | ||
| 1995/0512 | #include "u.h" #include "../port/lib.h" #include "mem.h" #include "dat.h" #include "fns.h" #include "../port/error.h" #include <libg.h> #include "screen.h" #include "vga.h" | |
| 1995/0516 | extern Bitmap gscreen; extern Cursor curcursor; static Lock ark2000pvlock; static ulong storage; static Point hotpoint; | |
| 1995/0512 | static void | |
| 1995/0516 | setark2000pvpage(int page) | |
| 1995/0512 | { vgaxo(Seqx, 0x15, page); vgaxo(Seqx, 0x16, page); } | |
| 1995/0516 | static void disable(void) { uchar seq20; | |
| 1997/0327 | lock(&ark2000pvlock); | |
| 1995/0516 | seq20 = vgaxi(Seqx, 0x20) & ~0x08; vgaxo(Seqx, 0x20, seq20); | |
| 1997/0327 | unlock(&ark2000pvlock); | |
| 1995/0516 | } static void enable(void) { uchar seq20; | |
| 1997/0327 | lock(&ark2000pvlock); | |
| 1995/0516 | /* * Disable the cursor then configure for X-Windows style, | |
| 1996/0216 | * 32x32 and 4/8-bit colour depth. | |
| 1995/0516 | * Set cursor colours for 4/8-bit. */ seq20 = vgaxi(Seqx, 0x20) & ~0x1F; vgaxo(Seqx, 0x20, seq20); | |
| 1996/0216 | seq20 |= 0x18; | |
| 1995/0516 | vgaxo(Seqx, 0x26, Pwhite); vgaxo(Seqx, 0x27, Pwhite); vgaxo(Seqx, 0x28, Pwhite); vgaxo(Seqx, 0x29, Pblack); vgaxo(Seqx, 0x2A, Pblack); vgaxo(Seqx, 0x2B, Pblack); /* | |
| 1996/0216 | * Cursor storage is a 256 byte or 1Kb block located in the last * 16Kb of video memory. Crt25 is the index of which block. | |
| 1995/0516 | */ storage = (vgaxi(Seqx, 0x10)>>6) & 0x03; storage = (1024*1024)<<storage; | |
| 1996/0216 | storage -= 256; vgaxo(Seqx, 0x25, 0x3F); | |
| 1995/0516 | /* * Enable the cursor. */ vgaxo(Seqx, 0x20, seq20); | |
| 1997/0327 | unlock(&ark2000pvlock); | |
| 1995/0516 | } static void load(Cursor *c) { | |
| 1996/0216 | uchar *p; | |
| 1995/0516 | int x, y; /* * Lock the display memory so we can update the * cursor bitmap if necessary. * If it's the same as the last cursor we loaded, * just make sure it's enabled. */ lock(&ark2000pvlock); if(memcmp(c, &curcursor, sizeof(Cursor)) == 0){ | |
| 1996/0216 | vgaxo(Seqx, 0x20, vgaxi(Seqx, 0x20)|0x08); | |
| 1995/0516 | unlock(&ark2000pvlock); return; } memmove(&curcursor, c, sizeof(Cursor)); /* * Is linear addressing turned on? This will determine * how we access the cursor storage. */ if(vgaxi(Seqx, 0x10) & 0x10) p = ((uchar*)gscreen.base) + storage; else { setark2000pvpage(storage>>16); p = ((uchar*)gscreen.base) + (storage & 0xFFFF); } /* * The cursor is set in X11 mode which gives the following * truth table: * and xor colour * 0 0 underlying pixel colour * 0 1 underlying pixel colour * 1 0 background colour * 1 1 foreground colour | |
| 1996/0216 | * Put the cursor into the top-left of the 32x32 array. | |
| 1995/0516 | * The manual doesn't say what the data layout in memory is - * this worked out by trial and error. */ | |
| 1996/0216 | for(y = 0; y < 32; y++){ for(x = 0; x < 32/8; x++){ | |
| 1995/0516 | if(x < 16/8 && y < 16){ *p++ = c->clr[2*y + x]|c->set[2*y + x]; *p++ = c->set[2*y + x]; } else { | |
| 1995/0808 | *p++ = 0x00; *p++ = 0x00; | |
| 1995/0516 | } } } /* * Set the cursor hotpoint and enable the cursor. */ hotpoint = c->offset; unlock(&ark2000pvlock); } static int move(Point p) { int x, xo, y, yo; if(canlock(&ark2000pvlock) == 0) return 1; /* * Mustn't position the cursor offscreen even partially, * or it might disappear. Therefore, if x or y is -ve, adjust the * cursor origins instead. */ if((x = p.x+hotpoint.x) < 0){ xo = -x; | |
| 1995/0822 | x = 0; | |
| 1995/0516 | } else | |
| 1995/0822 | xo = 0; | |
| 1995/0516 | if((y = p.y+hotpoint.y) < 0){ yo = -y; | |
| 1995/0822 | y = 0; | |
| 1995/0516 | } else | |
| 1995/0822 | yo = 0; | |
| 1995/0516 | /* * Load the new values. */ vgaxo(Seqx, 0x2C, xo); vgaxo(Seqx, 0x2D, yo); vgaxo(Seqx, 0x21, (x>>8) & 0x0F); vgaxo(Seqx, 0x22, x & 0xFF); vgaxo(Seqx, 0x23, (y>>8) & 0x0F); vgaxo(Seqx, 0x24, y & 0xFF); unlock(&ark2000pvlock); return 0; } | |
| 1996/0215 | static Hwgc ark2000pvhwgc = { | |
| 1995/0516 | "ark2000pvhwgc", enable, load, move, disable, 0, }; static void ark2000pvpage(int page) { | |
| 1997/0327 | lock(&ark2000pvlock); setark2000pvpage(page); unlock(&ark2000pvlock); | |
| 1995/0516 | } | |
| 1995/0512 | static Vgac ark2000pv = { "ark2000pv", ark2000pvpage, 0, }; void vgaark2000pvlink(void) { addvgaclink(&ark2000pv); | |
| 1995/0516 | addhwgclink(&ark2000pvhwgc); | |
| 1995/0512 | } | |