diff --git a/OVMFbin/OVMF_VARS-pure-efi.fd b/OVMFbin/OVMF_VARS-pure-efi.fd index 4ecdf8b..9177f63 100644 Binary files a/OVMFbin/OVMF_VARS-pure-efi.fd and b/OVMFbin/OVMF_VARS-pure-efi.fd differ diff --git a/kernel/bin/CustomOS.img b/kernel/bin/CustomOS.img index 1c3648f..191bfdb 100644 Binary files a/kernel/bin/CustomOS.img and b/kernel/bin/CustomOS.img differ diff --git a/kernel/bin/kernel.elf b/kernel/bin/kernel.elf index cb52485..a00ad01 100755 Binary files a/kernel/bin/kernel.elf and b/kernel/bin/kernel.elf differ diff --git a/kernel/lib/BasicRenderer.o b/kernel/lib/BasicRenderer.o index e99f4dc..7ff1ad4 100644 Binary files a/kernel/lib/BasicRenderer.o and b/kernel/lib/BasicRenderer.o differ diff --git a/kernel/lib/userinput/mouse.o b/kernel/lib/userinput/mouse.o index ea0b382..bb5f9b8 100644 Binary files a/kernel/lib/userinput/mouse.o and b/kernel/lib/userinput/mouse.o differ diff --git a/kernel/src/BasicRenderer.cpp b/kernel/src/BasicRenderer.cpp index c87c1d9..61c5d77 100644 --- a/kernel/src/BasicRenderer.cpp +++ b/kernel/src/BasicRenderer.cpp @@ -51,6 +51,33 @@ void BasicRenderer::Print(const char* str) { } } +void BasicRenderer::PutPixel(uint32_t x, uint32_t y, uint32_t colour) { + + *(uint32_t*)((uint64_t)targetFramebuffer->BaseAddress + (x*4) + (y * targetFramebuffer->PixelsPerScanline * 4)) = colour; + +} + +void BasicRenderer::DrawOverlayMouseCursor(uint8_t* mouseCursor, Point position, uint32_t colour) { + int xMax = 16; + int yMax = 19; + int diffX = targetFramebuffer->Width - position.x; + int diffY = targetFramebuffer->Height - position.y; + + if (diffX < 16) xMax = diffX; + if (diffY < 19) yMax = diffY; + + for (int y = 0; y < yMax; y++) { + for (int x = 0; x < xMax; x++) { + int bit = y * 16 + x; + int byte = bit / 8; + + if (mouseCursor[byte] & (0b10000000 >> (x % 8))) { + PutPixel(position.x + x, position.y + y, colour); + } + } + } +} + void BasicRenderer::Clear() { uint64_t fbBase = (uint64_t)targetFramebuffer->BaseAddress; uint64_t bytesPerScanline = targetFramebuffer->PixelsPerScanline * 4; diff --git a/kernel/src/BasicRenderer.h b/kernel/src/BasicRenderer.h index 5c08eeb..58fdbd4 100644 --- a/kernel/src/BasicRenderer.h +++ b/kernel/src/BasicRenderer.h @@ -15,9 +15,11 @@ class BasicRenderer { void Print(const char* str); void PutChar(char chr, unsigned int xOff, unsigned int yOff); void PutChar(char chr); + void PutPixel(uint32_t x, uint32_t y, uint32_t colour); void ClearChar(); void Clear(); void Next(); + void DrawOverlayMouseCursor(uint8_t* mouseCursor, Point position, uint32_t colour); }; extern BasicRenderer* GlobalRenderer; \ No newline at end of file diff --git a/kernel/src/userinput/mouse.cpp b/kernel/src/userinput/mouse.cpp index 188acdc..16729fc 100644 --- a/kernel/src/userinput/mouse.cpp +++ b/kernel/src/userinput/mouse.cpp @@ -1,6 +1,29 @@ #include "mouse.h" #include "../IO.h" +uint8_t MousePointer[] = { + 0b10000000, 0b00000000, + 0b11000000, 0b00000000, + 0b10100000, 0b00000000, + 0b10010000, 0b00000000, + 0b10001000, 0b00000000, + 0b10000100, 0b00000000, + 0b10000010, 0b00000000, + 0b10000001, 0b00000000, + 0b10000000, 0b10000000, + 0b10000000, 0b01000000, + 0b10000000, 0b00100000, + 0b10000000, 0b00010000, + 0b10000001, 0b11110000, + 0b10010001, 0b00000000, + 0b10101000, 0b10000000, + 0b11000100, 0b10000000, + 0b00000010, 0b01000000, + 0b00000010, 0b01000000, + 0b00000001, 0b10000000, +}; + + void MouseWait() { uint64_t timeout = 100000; while (timeout--) { @@ -113,6 +136,8 @@ void ProcessMousePacket() { if (mousePosition.x > GlobalRenderer->targetFramebuffer->Width-1) mousePosition.x = GlobalRenderer->targetFramebuffer->Width; if (mousePosition.y < 0) mousePosition.y = 0; if (mousePosition.y > GlobalRenderer->targetFramebuffer->Height-1) mousePosition.y = GlobalRenderer->targetFramebuffer->Height; + + GlobalRenderer->DrawOverlayMouseCursor(MousePointer, mousePosition, 0xFFFFFFFF); } void InitPS2Mouse() { diff --git a/kernel/src/userinput/mouse.h b/kernel/src/userinput/mouse.h index f85beb8..7ad0186 100644 --- a/kernel/src/userinput/mouse.h +++ b/kernel/src/userinput/mouse.h @@ -3,6 +3,7 @@ #include "../math.h" #include "../BasicRenderer.h" +extern uint8_t MousePointer[]; #define PS2LeftButton 0b00000001 #define PS2MiddleButton 0b00000010 #define PS2RightButton 0b00000100