| plan 9 kernel history: overview | file list | diff list |
1997/1101/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" | |
| 1997/1101 | #define Image IMAGE #include <draw.h> #include <memdraw.h> | |
| 1995/0512 | #include "screen.h" | |
| 1997/1101 | static int ark2000pvpageset(VGAscr*, int page) { uchar seq15; | |
| 1995/0516 | ||
| 1997/1101 | seq15 = vgaxi(Seqx, 0x15); vgaxo(Seqx, 0x15, page); vgaxo(Seqx, 0x16, page); | |
| 1995/0516 | ||
| 1997/1101 | return seq15; } | |
| 1995/0512 | static void | |
| 1997/1101 | ark2000pvpage(VGAscr* scr, int page) | |
| 1995/0512 | { | |
| 1997/1101 | lock(&scr->devlock); ark2000pvpageset(scr, page); unlock(&scr->devlock); | |
| 1995/0512 | } | |
| 1995/0516 | static void | |
| 1997/1101 | ark2000pvdisable(VGAscr*) | |
| 1995/0516 | { uchar seq20; seq20 = vgaxi(Seqx, 0x20) & ~0x08; vgaxo(Seqx, 0x20, seq20); } static void | |
| 1997/1101 | ark2000pvenable(VGAscr* scr) | |
| 1995/0516 | { uchar seq20; | |
| 1997/1101 | ulong storage; | |
| 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; | |
| 1997/1101 | scr->storage = storage; | |
| 1996/0216 | vgaxo(Seqx, 0x25, 0x3F); | |
| 1995/0516 | /* * Enable the cursor. */ vgaxo(Seqx, 0x20, seq20); } static void | |
| 1997/1101 | ark2000pvload(VGAscr* scr, Cursor* curs) | |
| 1995/0516 | { | |
| 1997/1101 | uchar *p, seq10; int opage, x, y; | |
| 1995/0516 | /* * Is linear addressing turned on? This will determine * how we access the cursor storage. */ | |
| 1997/1101 | seq10 = vgaxi(Seqx, 0x10); opage = 0; p = KADDR(scr->aperture); if(!(seq10 & 0x10)){ opage = ark2000pvpageset(scr, scr->storage>>16); p += (scr->storage & 0xFFFF); | |
| 1995/0516 | } | |
| 1997/1101 | else p += scr->storage; | |
| 1995/0516 | /* * 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){ | |
| 1997/1101 | *p++ = curs->clr[2*y + x]|curs->set[2*y + x]; *p++ = curs->set[2*y + x]; | |
| 1995/0516 | } else { | |
| 1995/0808 | *p++ = 0x00; *p++ = 0x00; | |
| 1995/0516 | } } } | |
| 1997/1101 | if(!(seq10 & 0x10)){ ark2000pvpageset(scr, opage); unlock(&scr->devlock); } | |
| 1995/0516 | /* | |
| 1997/1101 | * Save the cursor hotpoint. | |
| 1995/0516 | */ | |
| 1997/1101 | scr->offset = curs->offset; | |
| 1995/0516 | } static int | |
| 1997/1101 | ark2000pvmove(VGAscr* scr, Point p) | |
| 1995/0516 | { int x, xo, y, yo; /* * Mustn't position the cursor offscreen even partially, * or it might disappear. Therefore, if x or y is -ve, adjust the * cursor origins instead. */ | |
| 1997/1101 | if((x = p.x+scr->offset.x) < 0){ | |
| 1995/0516 | xo = -x; | |
| 1995/0822 | x = 0; | |
| 1995/0516 | } else | |
| 1995/0822 | xo = 0; | |
| 1997/1101 | if((y = p.y+scr->offset.y) < 0){ | |
| 1995/0516 | 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); return 0; } | |
| 1997/1101 | VGAdev vgaark2000pvdev = { "ark2000pv", | |
| 1995/0516 | 0, | |
| 1997/1101 | 0, | |
| 1995/0512 | ark2000pvpage, 0, }; | |
| 1997/1101 | VGAcur vgaark2000pvcur = { "ark2000pvhwgc", ark2000pvenable, ark2000pvdisable, ark2000pvload, ark2000pvmove, }; | |