|
@@ -1,12 +1,12 @@
|
|
|
MODULE DisplayLinear;
|
|
|
|
|
|
-IMPORT CPU, Displays, Plugins;
|
|
|
+IMPORT CPU, Machine, Displays, Plugins;
|
|
|
|
|
|
CONST Width = 1024;
|
|
|
CONST Height = 768;
|
|
|
CONST Depth = 24;
|
|
|
|
|
|
-CONST Mailbox = 2000B880H;
|
|
|
+CONST Mailbox = 3F00B880H; Base = 0H; Status = 18H; Write = 20H;
|
|
|
|
|
|
TYPE FrameBuffer = RECORD
|
|
|
width, height: SIZE;
|
|
@@ -16,58 +16,33 @@ TYPE FrameBuffer = RECORD
|
|
|
xOffset, yOffset: SIZE;
|
|
|
address: ADDRESS;
|
|
|
size: SIZE;
|
|
|
+ cmap: ARRAY 256 OF SHORTINT;
|
|
|
END;
|
|
|
|
|
|
VAR display: Displays.Display;
|
|
|
+VAR frameBuffer {ALIGNED (16)}: FrameBuffer;
|
|
|
|
|
|
PROCEDURE Send (channel: SIZE; value: WORD);
|
|
|
BEGIN {UNCOOPERATIVE, UNCHECKED}
|
|
|
- WHILE 31 IN CPU.ReadMask (Mailbox + 18H) DO END;
|
|
|
- CPU.WriteWord (Mailbox + 20H, value + channel);
|
|
|
- WHILE 31 IN CPU.ReadMask (Mailbox + 18H) DO END;
|
|
|
+ WHILE 31 IN CPU.ReadMask (Mailbox + Status) DO END;
|
|
|
+ CPU.WriteWord (Mailbox + Write, value + channel);
|
|
|
END Send;
|
|
|
|
|
|
PROCEDURE Receive (channel: SIZE): WORD;
|
|
|
VAR value: WORD;
|
|
|
BEGIN {UNCOOPERATIVE, UNCHECKED}
|
|
|
REPEAT
|
|
|
- WHILE 30 IN CPU.ReadMask (Mailbox + 18H) DO END;
|
|
|
- value := CPU.ReadWord (Mailbox + 00H);
|
|
|
+ WHILE 30 IN CPU.ReadMask (Mailbox + Status) DO END;
|
|
|
+ value := CPU.ReadWord (Mailbox + Base);
|
|
|
UNTIL value MOD 16 = channel;
|
|
|
RETURN value DIV 16 * 16;
|
|
|
-VAR frameBuffer: FrameBuffer; result: LONGINT;
|
|
|
-BEGIN
|
|
|
- frameBuffer.width := Width;
|
|
|
- frameBuffer.height := Height;
|
|
|
- frameBuffer.depth := Depth;
|
|
|
- frameBuffer.virtualWidth := frameBuffer.width;
|
|
|
- frameBuffer.virtualHeight := frameBuffer.height;
|
|
|
- frameBuffer.pitch := 0;
|
|
|
- frameBuffer.xOffset := 0;
|
|
|
- frameBuffer.yOffset := 0;
|
|
|
- frameBuffer.address := NIL;
|
|
|
- frameBuffer.size := 0;
|
|
|
- Send (1, ADDRESS OF frameBuffer + 40000000H);
|
|
|
- ASSERT (Receive(1) = 0);
|
|
|
- Machine.Fill32(frameBuffer.address, frameBuffer.size, 0);
|
|
|
-
|
|
|
- NEW(display);
|
|
|
- display.width := frameBuffer.width;
|
|
|
- display.height := frameBuffer.height;
|
|
|
- display.offscreen := 0;
|
|
|
- display.format := frameBuffer.depth DIV 8;
|
|
|
- display.unit := 10000;
|
|
|
- display.InitFrameBuffer(frameBuffer.address, frameBuffer.size, frameBuffer.width * frameBuffer.depth DIV 8 + frameBuffer.pitch);
|
|
|
- display.desc := "Linear framebuffer driver for Raspberry Pi";
|
|
|
- Displays.registry.Add(display, result);
|
|
|
- ASSERT(result = Plugins.Ok);
|
|
|
END Receive;
|
|
|
|
|
|
PROCEDURE Install*;
|
|
|
END Install;
|
|
|
|
|
|
PROCEDURE Initialize;
|
|
|
-VAR frameBuffer: FrameBuffer; result: LONGINT;
|
|
|
+VAR result: LONGINT;
|
|
|
BEGIN
|
|
|
frameBuffer.width := Width;
|
|
|
frameBuffer.height := Height;
|
|
@@ -79,8 +54,12 @@ BEGIN
|
|
|
frameBuffer.yOffset := 0;
|
|
|
frameBuffer.address := NIL;
|
|
|
frameBuffer.size := 0;
|
|
|
- Send (1, ADDRESS OF frameBuffer + 40000000H);
|
|
|
- ASSERT (Receive(1) = 0);
|
|
|
+
|
|
|
+ REPEAT
|
|
|
+ Send (1, ADDRESS OF frameBuffer + 40000000H);
|
|
|
+ result := Receive (1);
|
|
|
+ UNTIL (result = 0) & (frameBuffer.address # NIL);
|
|
|
+
|
|
|
Machine.Fill32(frameBuffer.address, frameBuffer.size, 0);
|
|
|
|
|
|
NEW(display);
|