RPI.DisplayLinear.Mod 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. MODULE DisplayLinear;
  2. IMPORT CPU, Machine, Displays, Plugins;
  3. CONST Width = 1024;
  4. CONST Height = 768;
  5. CONST Depth = 24;
  6. CONST Mailbox = 3F00B880H; Base = 0H; Status = 18H; Write = 20H;
  7. TYPE FrameBuffer = RECORD
  8. width, height: SIZE;
  9. virtualWidth, virtualHeight: SIZE;
  10. pitch: SIZE;
  11. depth: SIZE;
  12. xOffset, yOffset: SIZE;
  13. address: ADDRESS;
  14. size: SIZE;
  15. cmap: ARRAY 256 OF SHORTINT;
  16. END;
  17. VAR display: Displays.Display;
  18. VAR frameBuffer {ALIGNED (16)}: FrameBuffer;
  19. PROCEDURE Send (channel: SIZE; value: WORD);
  20. BEGIN {UNCOOPERATIVE, UNCHECKED}
  21. WHILE 31 IN CPU.ReadMask (Mailbox + Status) DO END;
  22. CPU.WriteWord (Mailbox + Write, value + channel);
  23. END Send;
  24. PROCEDURE Receive (channel: SIZE): WORD;
  25. VAR value: WORD;
  26. BEGIN {UNCOOPERATIVE, UNCHECKED}
  27. REPEAT
  28. WHILE 30 IN CPU.ReadMask (Mailbox + Status) DO END;
  29. value := CPU.ReadWord (Mailbox + Base);
  30. UNTIL value MOD 16 = channel;
  31. RETURN value DIV 16 * 16;
  32. END Receive;
  33. PROCEDURE Install*;
  34. END Install;
  35. PROCEDURE Initialize;
  36. VAR result: LONGINT;
  37. BEGIN
  38. frameBuffer.width := Width;
  39. frameBuffer.height := Height;
  40. frameBuffer.depth := Depth;
  41. frameBuffer.virtualWidth := frameBuffer.width;
  42. frameBuffer.virtualHeight := frameBuffer.height;
  43. frameBuffer.pitch := 0;
  44. frameBuffer.xOffset := 0;
  45. frameBuffer.yOffset := 0;
  46. frameBuffer.address := NIL;
  47. frameBuffer.size := 0;
  48. REPEAT
  49. Send (1, ADDRESS OF frameBuffer + 40000000H);
  50. result := Receive (1);
  51. UNTIL (result = 0) & (frameBuffer.address # NIL);
  52. Machine.Fill32(frameBuffer.address, frameBuffer.size, 0);
  53. NEW(display);
  54. display.width := frameBuffer.width;
  55. display.height := frameBuffer.height;
  56. display.offscreen := 0;
  57. display.format := frameBuffer.depth DIV 8;
  58. display.unit := 10000;
  59. display.InitFrameBuffer(frameBuffer.address, frameBuffer.size, frameBuffer.width * frameBuffer.depth DIV 8 + frameBuffer.pitch);
  60. display.desc := "Linear framebuffer driver for Raspberry Pi";
  61. Displays.registry.Add(display, result);
  62. ASSERT(result = Plugins.Ok);
  63. END Initialize;
  64. BEGIN
  65. Initialize;
  66. END DisplayLinear.