simplistic mouse cursor
authorJohn Tsiombikas <nuclear@member.fsf.org>
Wed, 11 Oct 2023 11:31:00 +0000 (14:31 +0300)
committerJohn Tsiombikas <nuclear@member.fsf.org>
Wed, 11 Oct 2023 11:31:00 +0000 (14:31 +0300)
src/kern/main.c
src/kern/psaux.c
src/kern/psaux.h

index 6c37116..2dd7465 100644 (file)
 unsigned char *framebuf, *vmem = (unsigned char*)0xa0000;
 
 static int quit;
+static int mx, my;
+
+static void draw_cursor(int mx, int my);
 
 
 int main(void)
 {
        int key;
+       int prev_mx = 0, prev_my = 0;
+       unsigned int mbn, prev_mbn = 0, mbn_diff;
 
        init_segm();
        init_intr();
@@ -37,10 +42,33 @@ int main(void)
                goto end;
        }
 
+       set_mouse_pos(160, 100);
+
        for(;;) {
                if((key = kb_getkey()) >= 0) {
                        game_keyboard(key, 1);
                }
+
+               mbn = mouse_state(&mx, &my);
+
+               if((mbn_diff = mbn ^ prev_mbn) != 0) {
+                       if(mbn_diff & 1) {
+                               game_mouse(0, mbn & 1, mx, my);
+                       }
+                       if(mbn_diff & 2) {
+                               game_mouse(2, mbn & 2, mx, my);
+                       }
+                       if(mbn_diff & 4) {
+                               game_mouse(1, mbn & 4, mx, my);
+                       }
+               }
+               if(mx != prev_mx || my != prev_my) {
+                       game_motion(mx, my);
+               }
+               prev_mbn = mbn;
+               prev_mx = mx;
+               prev_my = my;
+
                if(quit) break;
                game_draw();
        }
@@ -64,5 +92,33 @@ void game_quit(void)
 
 void game_swap_buffers(void)
 {
+       draw_cursor(mx, my);
+
        memcpy(vmem, framebuf, 64000);
 }
+
+#define CUR_SZ 4
+
+static void draw_cursor(int mx, int my)
+{
+       int i, sx, ex, sy, ey, xlen, ylen;
+       unsigned char *ptr;
+
+       sx = mx < CUR_SZ ? mx : mx - CUR_SZ;
+       ex = mx >= 320 - CUR_SZ ? CUR_SZ - 1 : mx + CUR_SZ;
+       xlen = ex - sx + 1;
+       sy = my < CUR_SZ ? my : my - CUR_SZ;
+       ey = my >= 200 - CUR_SZ ? CUR_SZ - 1 : my + CUR_SZ;
+       ylen = ey - sy + 1;
+
+       ptr = framebuf + (my << 8) + (my << 6) + sx;
+       for(i=0; i<xlen; i++) {
+               ptr[i] ^= 0xff;
+       }
+
+       ptr = framebuf + (sy << 8) + (sy << 6) + mx;
+       for(i=0; i<ylen; i++) {
+               *ptr ^= 0xff;
+               ptr += 320;
+       }
+}
index a0fb58d..f9f6058 100644 (file)
@@ -95,6 +95,12 @@ void set_mouse_bounds(int x0, int y0, int x1, int y1)
        bounds[3] = y1;
 }
 
+void set_mouse_pos(int x, int y)
+{
+       mx = x;
+       my = y;
+}
+
 unsigned int mouse_state(int *xp, int *yp)
 {
        if(!intr_mode) {
index 7acc3f6..9c4c265 100644 (file)
@@ -26,6 +26,7 @@ void init_psaux(void);
 
 int have_mouse(void);
 
+void set_mouse_pos(int x, int y);
 void set_mouse_bounds(int x0, int y0, int x1, int y1);
 unsigned int mouse_state(int *xp, int *yp);