s3801.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <bio.h>
  4. #include "pci.h"
  5. #include "vga.h"
  6. /*
  7. * S3 86C80[15] GUI Accelerator.
  8. */
  9. static void
  10. snarf(Vga* vga, Ctlr* ctlr)
  11. {
  12. s3generic.snarf(vga, ctlr);
  13. }
  14. static void
  15. options(Vga*, Ctlr* ctlr)
  16. {
  17. ctlr->flag |= Henhanced|Foptions;
  18. }
  19. static void
  20. init(Vga* vga, Ctlr* ctlr)
  21. {
  22. ulong x;
  23. s3generic.init(vga, ctlr);
  24. vga->crt[0x3B] = vga->crt[0]-5;
  25. if(vga->mode->z > 8)
  26. error("depth %d not supported\n", vga->mode->z);
  27. /*
  28. * Display memory access control.
  29. * Calculation of the M-parameter (Crt54) is
  30. * memory-system and dot-clock dependent, the
  31. * values below are guesses from dumping
  32. * registers.
  33. */
  34. vga->crt[0x60] = 0xFF;
  35. x = (vga->mode->x)/4;
  36. vga->crt[0x61] = 0x80|((x>>8) & 0x07);
  37. vga->crt[0x62] = (x & 0xFF);
  38. if(vga->mode->x <= 800)
  39. vga->crt[0x54] = 0x88;
  40. else if(vga->mode->x <= 1024)
  41. vga->crt[0x54] = 0xF8;
  42. else
  43. vga->crt[0x54] = 0x40;
  44. }
  45. static void
  46. load(Vga* vga, Ctlr* ctlr)
  47. {
  48. ushort advfunc;
  49. s3generic.load(vga, ctlr);
  50. vgaxo(Crtx, 0x60, vga->crt[0x60]);
  51. vgaxo(Crtx, 0x61, vga->crt[0x61]);
  52. vgaxo(Crtx, 0x62, vga->crt[0x62]);
  53. advfunc = 0x0000;
  54. if(ctlr->flag & Uenhanced){
  55. if(vga->mode->x == 1024 || vga->mode->x == 800)
  56. advfunc = 0x0057;
  57. else
  58. advfunc = 0x0053;
  59. }
  60. outportw(0x4AE8, advfunc);
  61. }
  62. static void
  63. dump(Vga* vga, Ctlr* ctlr)
  64. {
  65. s3generic.dump(vga, ctlr);
  66. }
  67. Ctlr s3801 = {
  68. "s3801", /* name */
  69. snarf, /* snarf */
  70. options, /* options */
  71. init, /* init */
  72. load, /* load */
  73. dump, /* dump */
  74. };
  75. Ctlr s3805 = {
  76. "s3805", /* name */
  77. snarf, /* snarf */
  78. options, /* options */
  79. init, /* init */
  80. load, /* load */
  81. dump, /* dump */
  82. };