X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=bootcensus;a=blobdiff_plain;f=src%2Ftest%2Fvbetest.c;h=ee7fb6884d9368bdd73bfed872480bd56876fb79;hp=177eac364a23085634911689e9ff323ff7a744f7;hb=aea4c0e820b437aebb00a90b5f9fd847044f88fe;hpb=094e9170ca5f9b59443c171967cdc78f1c07044c diff --git a/src/test/vbetest.c b/src/test/vbetest.c index 177eac3..ee7fb68 100644 --- a/src/test/vbetest.c +++ b/src/test/vbetest.c @@ -3,13 +3,48 @@ #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, nmodes; + int i, j, nmodes, mx, my; + unsigned int st, prev_st = 0; struct video_mode vi; + uint16_t *fbptr; nmodes = video_mode_count(); printf("%d video modes found:\n", nmodes); @@ -17,20 +52,132 @@ int vbetest(void) if(video_mode_info(i, &vi) == -1) { continue; } - printf(" %04x: %dx%d %d bpp (%d%d%d)\n", vi.mode, vi.width, vi.height, vi.bpp, - vi.rbits, vi.gbits, vi.bbits); + printf(" %04x: %dx%d %d bpp", vi.mode, vi.width, vi.height, vi.bpp); + if(vi.bpp > 8) { + printf(" (%d%d%d)\n", vi.rbits, vi.gbits, vi.bbits); + } else { + putchar('\n'); + } } if(!(framebuf = set_video_mode(find_video_mode(640, 480, 16)))) { return -1; } + get_color_bits(&vi.rbits, &vi.gbits, &vi.bbits); + get_color_shift(&vi.rshift, &vi.gshift, &vi.bshift); + get_color_mask(&vi.rmask, &vi.gmask, &vi.bmask); + + fbptr = framebuf; + for(i=0; i<480; i++) { + for(j=0; j<640; j++) { + int xor = i^j; + uint16_t r = xor & 0xff; + uint16_t g = (xor << 1) & 0xff; + uint16_t b = (xor << 2) & 0xff; + + r >>= 8 - vi.rbits; + g >>= 8 - vi.gbits; + b >>= 8 - vi.bbits; + + *fbptr++ = ((r << vi.rshift) & vi.rmask) | ((g << vi.gshift) & vi.gmask) | + ((b << vi.bshift) & vi.bmask); + } + } + + set_mouse_bounds(0, 0, 639, 479); + + audio_set_callback(click_sound_callback, 0); + + /* empty the kb queue */ + 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; - memset(framebuf, 0xff, 640 * 240 * 2); + draw_cursor(mx, my, st & 1 ? 0xf800 : (st & 2 ? 0x7e0 : (st & 4 ? 0x00ff : 0))); - while(kb_getkey() == -1) { halt_cpu(); } set_vga_mode(3); + 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