X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=bootcensus;a=blobdiff_plain;f=src%2Ftest%2Fvbetest.c;h=ee7fb6884d9368bdd73bfed872480bd56876fb79;hp=91a8c8cd44ddec153c0d15e6e78e786c8726fd68;hb=aea4c0e820b437aebb00a90b5f9fd847044f88fe;hpb=c0af8cc560cb8ccf4e9da121d7045007de304f66 diff --git a/src/test/vbetest.c b/src/test/vbetest.c index 91a8c8c..ee7fb68 100644 --- a/src/test/vbetest.c +++ b/src/test/vbetest.c @@ -3,13 +3,46 @@ #include "video.h" #include "asmops.h" #include "keyb.h" +#include "psaux.h" #include "contty.h" +#include "audio.h" + +static void draw_cursor(int x, int y, uint16_t col); +static int click_sound_callback(void *buffer, int size, void *cls); 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 +}; + +static int click; + +/* defined in sndsamples.s */ +extern signed char snd_click[]; +extern int snd_click_size; + int vbetest(void) { - int i, j, nmodes; + int i, j, nmodes, mx, my; + unsigned int st, prev_st = 0; struct video_mode vi; uint16_t *fbptr; @@ -51,8 +84,34 @@ int vbetest(void) } } + set_mouse_bounds(0, 0, 639, 479); + + audio_set_callback(click_sound_callback, 0); + + /* empty the kb queue */ while(kb_getkey() != -1); - while(kb_getkey() == -1) { + + for(;;) { + if(kb_getkey() != -1) { + break; + } + + st = mouse_state(&mx, &my); + + for(i=0; i<3; i++) { + unsigned int bit = 1 << i; + if(((st & bit) ^ (prev_st & bit)) & (st & bit)) { + click = 1; + } + } + if(click) { + audio_play(22050, 1); + } + + prev_st = st; + + draw_cursor(mx, my, st & 1 ? 0xf800 : (st & 2 ? 0x7e0 : (st & 4 ? 0x00ff : 0))); + halt_cpu(); } @@ -60,3 +119,65 @@ 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 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