fixed VBE bugs
authorJohn Tsiombikas <nuclear@member.fsf.org>
Thu, 3 May 2018 05:56:42 +0000 (08:56 +0300)
committerJohn Tsiombikas <nuclear@member.fsf.org>
Thu, 3 May 2018 05:56:42 +0000 (08:56 +0300)
src/test/vbetest.c
src/vbe.c
src/video.c
src/video.h

index 177eac3..91a8c8c 100644 (file)
@@ -3,13 +3,15 @@
 #include "video.h"
 #include "asmops.h"
 #include "keyb.h"
+#include "contty.h"
 
 static uint16_t *framebuf;
 
 int vbetest(void)
 {
-       int i, nmodes;
+       int i, j, nmodes;
        struct video_mode vi;
+       uint16_t *fbptr;
 
        nmodes = video_mode_count();
        printf("%d video modes found:\n", nmodes);
@@ -17,20 +19,44 @@ 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;
 
-       memset(framebuf, 0xff, 640 * 240 * 2);
+                       *fbptr++ = ((r << vi.rshift) & vi.rmask) | ((g << vi.gshift) & vi.gmask) |
+                               ((b << vi.bshift) & vi.bmask);
+               }
+       }
 
+       while(kb_getkey() != -1);
        while(kb_getkey() == -1) {
                halt_cpu();
        }
 
        set_vga_mode(3);
+       con_clear();
        return 0;
 }
index d4847d2..933ffe5 100644 (file)
--- a/src/vbe.c
+++ b/src/vbe.c
@@ -16,15 +16,19 @@ struct vbe_info *vbe_get_info(void)
        struct vbe_info *info;
        struct int86regs regs;
 
+       printf("vbe_get_info... ");
+
        info = (struct vbe_info*)low_mem_buffer;
 
        memcpy(info->sig, "VBE2", 4);
 
        memset(&regs, 0, sizeof regs);
-       regs.es = (uint32_t)low_mem_buffer >> 4;
+       regs.es = (uint32_t)info >> 4;
        regs.eax = 0x4f00;
        int86(0x10, &regs);
 
+       printf("status: %d\n", (regs.eax >> 8) & 0xff);
+
        if((regs.eax & 0xffff) != 0x4f) {
                return 0;
        }
@@ -37,10 +41,10 @@ struct vbe_mode_info *vbe_get_mode_info(int mode)
        struct vbe_mode_info *mi;
        struct int86regs regs;
 
-       mi = (struct vbe_mode_info*)low_mem_buffer;
+       mi = (struct vbe_mode_info*)(low_mem_buffer + 512);
 
        memset(&regs, 0, sizeof regs);
-       regs.es = (uint32_t)low_mem_buffer >> 4;
+       regs.es = (uint32_t)mi >> 4;
        regs.eax = 0x4f01;
        regs.ecx = mode;
        int86(0x10, &regs);
index 58b764b..d926107 100644 (file)
@@ -89,7 +89,7 @@ static int init_once(void)
 void *set_video_mode(int mode)
 {
        if(init_once() == -1) return 0;
-       if(mode < 0 || mode >= mode_count) return 0;
+       if(mode < 0) return 0;
 
        if(!(mode_info = vbe_get_mode_info(mode))) {
                return 0;
@@ -150,6 +150,9 @@ int video_mode_info(int n, struct video_mode *vid)
        vid->rbits = inf->rmask_size;
        vid->gbits = inf->gmask_size;
        vid->bbits = inf->bmask_size;
+       vid->rshift = inf->rpos;
+       vid->gshift = inf->gpos;
+       vid->bshift = inf->bpos;
        vid->rmask = color_mask(inf->rmask_size, inf->rpos);
        vid->gmask = color_mask(inf->gmask_size, inf->gpos);
        vid->bmask = color_mask(inf->bmask_size, inf->bpos);
index 3e4626d..bf42f53 100644 (file)
@@ -23,6 +23,7 @@ struct video_mode {
        int width, height;
        int bpp;
        int rbits, gbits, bbits;
+       int rshift, gshift, bshift;
        unsigned int rmask, gmask, bmask;
 };
 
@@ -36,6 +37,7 @@ int video_mode_info(int n, struct video_mode *vid);
 
 int get_color_bits(int *rbits, int *gbits, int *bbits);
 int get_color_mask(unsigned int *rmask, unsigned int *gmask, unsigned int *bmask);
+int get_color_shift(int *rshift, int *gshift, int *bshift);
 
 /* defined in video_asm.s */
 void wait_vsync(void);