BIOS.DisplayLinear.Mod 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. (* Aos, Copyright 2001, Pieter Muller, ETH Zurich *)
  2. MODULE DisplayLinear; (** AUTHOR "pjm"; PURPOSE "Linear framebuffer display driver"; *)
  3. (*
  4. Config strings:
  5. DWidth=1024 Display width
  6. DHeight=768 Display height
  7. DDepth=16 Display depth
  8. DMem=? Display memory size in bytes
  9. Init=? Init program.
  10. The Init program is a 8086 machine code program in hexadecimal. It has to initialize the specified display mode, possibly by making display BIOS calls, and leave the 32-bit physical address of the frame buffer in DX:CX.
  11. *)
  12. IMPORT SYSTEM, Machine, KernelLog, MemCache, Displays, Strings, Commands, Options, Modules;
  13. VAR
  14. d: Displays.Display;
  15. PROCEDURE GetVal(name: ARRAY OF CHAR; default: LONGINT): LONGINT;
  16. VAR v: LONGINT; s: ARRAY 10 OF CHAR; p: LONGINT;
  17. BEGIN
  18. Machine.GetConfig(name, s);
  19. IF s[0] = 0X THEN
  20. v := default
  21. ELSE
  22. p := 0; v := Machine.StrToInt(p, s)
  23. END;
  24. RETURN v
  25. END GetVal;
  26. PROCEDURE Install*(context: Commands.Context);
  27. VAR options: Options.Options;
  28. BEGIN
  29. NEW(options);
  30. options.Add("r", "reverse", Options.Flag);
  31. IF options.Parse(context.arg, context.error) THEN
  32. IF options.GetFlag("r") THEN Displays.Reverse() END;
  33. END;
  34. END Install;
  35. PROCEDURE InitPalette;
  36. VAR col: LONGINT; ch: CHAR;
  37. BEGIN
  38. Machine.Portin8(3DAH, ch);
  39. Machine.Portout8(3C0H, 11X);
  40. Machine.Portout8(3C0H, 0X); (* palette entry 0 is black *)
  41. Machine.Portout8(3C0H, 20X);
  42. FOR col := 0 TO 255 DO
  43. Machine.Portout8(3C8H, CHR(col));
  44. Machine.Portout8(3C9H, CHR(SYSTEM.VAL(LONGINT, SYSTEM.VAL(SET, col) * {5..7}) DIV 4));
  45. Machine.Portout8(3C9H, CHR(SYSTEM.VAL(LONGINT, SYSTEM.VAL(SET, ASH(col, 7-4)) * {5..7}) DIV 4));
  46. Machine.Portout8(3C9H, CHR(SYSTEM.VAL(LONGINT, SYSTEM.VAL(SET, ASH(col, 7-1)) * {6..7}) DIV 4))
  47. END
  48. END InitPalette;
  49. PROCEDURE Init;
  50. VAR w, h, f, mem, res: LONGINT; ts : ARRAY 16 OF CHAR; padr, vadr: ADDRESS;
  51. BEGIN
  52. w := GetVal("DWidth", 1024); h := GetVal("DHeight", 768);
  53. CASE GetVal("DDepth", 16) DIV 8 OF
  54. 1: f := Displays.index8; InitPalette
  55. |2: f := Displays.color565
  56. |3: f := Displays.color888
  57. |4: f := Displays.color8888
  58. END;
  59. mem := GetVal("DMem", 0)*1024;
  60. IF mem = 0 THEN (* compute default *)
  61. mem := 512*1024;
  62. WHILE w*h*f >= mem DO mem := mem*2 END
  63. END;
  64. Machine.GetInit(1, SYSTEM.VAL(LONGINT,padr)); (* DX:CX from Init code *)
  65. ASSERT((padr # 0) & (padr MOD 4096 = 0));
  66. IF GetVal("DCache", 1) = 1 THEN
  67. MemCache.GlobalSetCacheProperties(padr, mem, MemCache.WC, res);
  68. IF res # 0 THEN
  69. KernelLog.Enter; KernelLog.String("DisplayLinear: GlobalSetCacheProperties = ");
  70. KernelLog.Int(res, 1); KernelLog.Exit
  71. END
  72. END;
  73. (* KernelLog.ScreenOff; *)
  74. Machine.MapPhysical(padr, mem, vadr);
  75. Machine.Fill32(vadr, mem, 0); (* clear video memory *)
  76. NEW(d);
  77. d.width := w; d.height := h; d.offscreen := mem DIV (w*f) - h;
  78. d.format := f; d.unit := 10000;
  79. d.InitFrameBuffer(vadr, mem, w * f);
  80. d.desc := "Generic linear framebuffer driver (";
  81. Strings.IntToStr(d.width, ts); Strings.Append(d.desc, ts);
  82. Strings.Append(d.desc, "x");
  83. Strings.IntToStr(d.height, ts); Strings.Append(d.desc, ts);
  84. Strings.Append(d.desc, "x");
  85. Strings.IntToStr(d.format, ts); Strings.Append(d.desc, ts);
  86. Strings.Append(d.desc, ")");
  87. Displays.registry.Add(d, res);
  88. ASSERT(res = 0)
  89. END Init;
  90. PROCEDURE CleanUp;
  91. BEGIN
  92. ASSERT (d # NIL);
  93. Machine.Fill32(d.fbadr, d.fbsize, 0); (* clear video memory *)
  94. END CleanUp;
  95. BEGIN
  96. Init;
  97. Modules.InstallTermHandler(CleanUp);
  98. END DisplayLinear.