palette.c 2.1 KB

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