1 #include <u.h> 2 #include <libc.h> 3 4 #include "vga.h" 5 6 static ulong 7 xnto32(uchar x, int n) 8 { 9 int s; 10 ulong y; 11 12 x &= (1<<n)-1; 13 y = 0; 14 for(s = 32 - n; s > 0; s -= n) 15 y |= x<<s; 16 if(s < 0) 17 y |= x>>(-s); 18 return y; 19 } 20 21 static void 22 setcolour(uchar p[3], ulong r, ulong g, ulong b) 23 { 24 p[Red] = r>>(32-6); 25 p[Green] = g>>(32-6); 26 p[Blue] = b>>(32-6); 27 } 28 29 /* 30 * Vga colour palette. 31 */ 32 static void 33 snarf(Vga *vga, Ctlr *ctlr) 34 { 35 int i; 36 37 verbose("%s->snarf\n", ctlr->name); 38 39 vga->pixmask = vgai(Pixmask); 40 vga->pstatus = vgai(Pstatus); 41 vgao(PaddrR, 0x00); 42 for(i = 0; i < Pcolours; i++){ 43 vga->palette[i][Red] = vgai(Pdata); 44 vga->palette[i][Green] = vgai(Pdata); 45 vga->palette[i][Blue] = vgai(Pdata); 46 } 47 48 ctlr->flag |= Fsnarf; 49 } 50 51 static void 52 init(Vga *vga, Ctlr *ctlr) 53 { 54 int i; 55 uchar *p; 56 ulong x; 57 58 verbose("%s->init\n", ctlr->name); 59 60 memset(vga->palette, 0, sizeof(vga->palette)); 61 vga->pixmask = 0xFF; 62 if(vga->mode->z == 8){ 63 for(i = 0; i < Pcolours; i++){ 64 p = vga->palette[i^0xFF]; 65 setcolour(p, xnto32(i>>5, 3), xnto32(i>>2, 3), xnto32(i, 2)); 66 } 67 p = vga->palette[0x55^0xFF]; 68 setcolour(p, xnto32(0x15, 6), xnto32(0x15, 6), xnto32(0x15, 6)); 69 p = vga->palette[0xAA^0xFF]; 70 setcolour(p, xnto32(0x2A, 6), xnto32(0x2A, 6), xnto32(0x2A, 6)); 71 p = vga->palette[0xFF^0xFF]; 72 setcolour(p, xnto32(0x3F, 6), xnto32(0x3F, 6), xnto32(0x3F, 6)); 73 } 74 else for(i = 0; i < 16; i++){ 75 x = xnto32((i*63)/15, 6); 76 setcolour(vga->palette[i^0xFF], x, x, x); 77 } 78 79 ctlr->flag |= Finit; 80 } 81 82 static void 83 load(Vga *vga, Ctlr *ctlr) 84 { 85 int i; 86 87 verbose("%s->load\n", ctlr->name); 88 89 vgao(Pixmask, vga->pixmask); 90 vgao(PaddrW, 0x00); 91 for(i = 0; i < Pcolours; i++){ 92 vgao(Pdata, vga->palette[i][Red]); 93 vgao(Pdata, vga->palette[i][Green]); 94 vgao(Pdata, vga->palette[i][Blue]); 95 } 96 97 ctlr->flag |= Fload; 98 } 99 100 static void 101 dump(Vga *vga, Ctlr *ctlr) 102 { 103 int i; 104 105 printitem(ctlr->name, "palette"); 106 for(i = 0; i < Pcolours; i++){ 107 if(i && (i%6) == 0) 108 print("\n%-20s", ""); 109 print(" %2.2X/%2.2X/%2.2X", vga->palette[i][Red], 110 vga->palette[i][Green], vga->palette[i][Blue]); 111 } 112 print("\n"); 113 } 114 115 Ctlr palette = { 116 "palette", /* name */ 117 snarf, /* snarf */ 118 0, /* options */ 119 init, /* init */ 120 load, /* load */ 121 dump, /* dump */ 122 }; 123