added PS/2 mouse code
[bootcensus] / src / test / vbetest.c
index 91a8c8c..1133dec 100644 (file)
@@ -3,13 +3,38 @@
 #include "video.h"
 #include "asmops.h"
 #include "keyb.h"
+#include "psaux.h"
 #include "contty.h"
 
+static void draw_cursor(int x, int y, uint16_t col);
+
 static uint16_t *framebuf;
 
+#define CURSOR_XSZ     12
+#define CURSOR_YSZ     16
+static uint16_t cursor[] = {
+       0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+       0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+       0xffff, 0x0001, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+       0xffff, 0x0001, 0x0001, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+       0xffff, 0x0001, 0x0001, 0x0001, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+       0xffff, 0x0001, 0x0001, 0x0001, 0x0001, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+       0xffff, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+       0xffff, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000,
+       0xffff, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0xffff, 0x0000, 0x0000, 0x0000,
+       0xffff, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000,
+       0xffff, 0x0001, 0x0001, 0x0001, 0x0001, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+       0xffff, 0x0001, 0x0001, 0xffff, 0x0001, 0x0001, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+       0xffff, 0x0001, 0xffff, 0xffff, 0x0001, 0x0001, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+       0xffff, 0xffff, 0x0000, 0x0000, 0xffff, 0x0001, 0x0001, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000,
+       0xffff, 0x0000, 0x0000, 0x0000, 0xffff, 0x0001, 0x0001, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000,
+       0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
+
 int vbetest(void)
 {
-       int i, j, nmodes;
+       int i, j, nmodes, mx, my;
+       unsigned int st;
        struct video_mode vi;
        uint16_t *fbptr;
 
@@ -51,8 +76,19 @@ int vbetest(void)
                }
        }
 
+       set_mouse_bounds(0, 0, 639, 479);
+
+       /* empty the kb queue */
        while(kb_getkey() != -1);
-       while(kb_getkey() == -1) {
+
+       for(;;) {
+               if(kb_getkey() != -1) {
+                       break;
+               }
+
+               st = mouse_state(&mx, &my);
+               draw_cursor(mx, my, st & 1 ? 0xf800 : (st & 2 ? 0x7e0 : (st & 4 ? 0x00ff : 0)));
+
                halt_cpu();
        }
 
@@ -60,3 +96,54 @@ int vbetest(void)
        con_clear();
        return 0;
 }
+
+static void draw_cursor(int x, int y, uint16_t col)
+{
+       static uint16_t saved[CURSOR_XSZ * CURSOR_YSZ];
+       static int saved_x = -1, saved_y, saved_w, saved_h;
+
+       int i, j, w, h;
+       uint16_t *dest, *src, *savp;
+
+       if(saved_x >= 0) {
+               dest = framebuf + saved_y * 640 + saved_x;
+               src = saved;
+
+               for(i=0; i<saved_h; i++) {
+                       for(j=0; j<saved_w; j++) {
+                               *dest++ = *src++;
+                       }
+                       src += CURSOR_XSZ - saved_w;
+                       dest += 640 - saved_w;
+               }
+       }
+
+       dest = framebuf + y * 640 + x;
+       src = cursor;
+       savp = saved;
+
+       w = 640 - x;
+       if(w > CURSOR_XSZ) w = CURSOR_XSZ;
+       h = 480 - y;
+       if(h > CURSOR_YSZ) h = CURSOR_YSZ;
+
+       saved_x = x;
+       saved_y = y;
+       saved_w = w;
+       saved_h = h;
+
+       for(i=0; i<h; i++) {
+               for(j=0; j<w; j++) {
+                       uint16_t c = *src++;
+                       *savp++ = *dest;
+                       if(c) {
+                               if(c == 1) c = col;
+                               *dest = c;
+                       }
+                       dest++;
+               }
+               src += CURSOR_XSZ - w;
+               dest += 640 - w;
+               savp += CURSOR_XSZ - w;
+       }
+}