X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;ds=sidebyside;f=src%2Fdos%2Fvbe.c;h=d5d75dff5f62804f8790d4b5d52b97654fe56201;hb=2c4602e53eaab44272ea5cd62667c939e6d2f61b;hp=5182e0af99f15ce1977914d026756ed7f04ec5e2;hpb=8a64d603ee67cd98070360b40938e123ea845154;p=dosdemo diff --git a/src/dos/vbe.c b/src/dos/vbe.c index 5182e0a..d5d75df 100644 --- a/src/dos/vbe.c +++ b/src/dos/vbe.c @@ -1,153 +1,28 @@ -#include -#include #include "vbe.h" -#include "dpmi.h" +#include "cdpmi.h" -/* VGA DAC registers used for palette setting in 8bpp modes */ -#define VGA_DAC_STATE 0x3c7 -#define VGA_DAC_ADDR_RD 0x3c7 -#define VGA_DAC_ADDR_WR 0x3c8 -#define VGA_DAC_DATA 0x3c9 - -#define MODE_LFB (1 << 14) - - -struct vbe_info *vbe_get_info(void) +int vbe_getinfo(struct vbe_info *info) { - static unsigned short info_block_seg; - static struct vbe_info *info; - struct dpmi_real_regs regs; + void *lowbuf; + uint16_t seg, sel; + struct dpmi_regs regs = {0}; - if(!info) { - /* allocate 32 paragraphs (512 bytes) */ - info_block_seg = dpmi_alloc(32); - info = (struct vbe_info*)(info_block_seg << 4); + if(!(seg = dpmi_alloc(512 / 16, &sel))) { + return -1; } - memcpy(info->sig, "VBE2", 4); - - memset(®s, 0, sizeof regs); - regs.es = info_block_seg; regs.eax = 0x4f00; + regs.es = seg; + regs.edi = 0; + dpmi_int(0x10, ®s); - dpmi_real_int(0x10, ®s); - - return info; -} - -struct vbe_mode_info *vbe_get_mode_info(int mode) -{ - static unsigned short mode_info_seg; - static struct vbe_mode_info *mi; - struct dpmi_real_regs regs; - - if(!mi) { - /* allocate 16 paragraphs (256 bytes) */ - mode_info_seg = dpmi_alloc(16); - mi = (struct vbe_mode_info*)(mode_info_seg << 4); - } - - memset(®s, 0, sizeof regs); - regs.es = mode_info_seg; - regs.eax = 0x4f01; - regs.ecx = mode; - regs.es = mode_info_seg; - - dpmi_real_int(0x10, ®s); if(regs.eax & 0xff00) { - return 0; - } - - return mi; -} - -int vbe_set_mode(int mode) -{ - struct dpmi_real_regs regs; - - memset(®s, 0, sizeof regs); - regs.eax = 0x4f02; - regs.ebx = mode; - dpmi_real_int(0x10, ®s); - - if(regs.eax == 0x100) { + dpmi_free(sel); return -1; } - return 0; -} -int vbe_set_palette_bits(int bits) -{ - struct dpmi_real_regs regs; - - memset(®s, 0, sizeof regs); - regs.eax = 0x4f08; - regs.ebx = bits << 8; /* bits in bh */ - dpmi_real_int(0x10, ®s); - - if((regs.eax >> 8) & 0xff == 3) { - return -1; - } - return regs.ebx >> 8 & 0xff; /* new color bits in bh */ -} - -/* TODO: implement palette setting through the VBE2 interface for - * non-VGA displays (actually don't). - */ -void vbe_set_palette(int idx, int *col, int count, int bits) -{ - int i, shift = 8 - bits; - - __asm { - mov dx, VGA_DAC_ADDR_WR - mov eax, idx - out dx, al - } - - for(i=0; i>= shift; - g >>= shift; - b >>= shift; - } - - __asm { - mov dx, VGA_DAC_DATA - mov al, r - out dx, al - mov al, g - out dx, al - mov al, b - out dx, al - } - } -} - -static unsigned int get_mask(int sz, int pos) -{ - unsigned int i, mask = 0; - - for(i=0; ixres, mi->yres); - fprintf(fp, "color depth: %d\n", mi->bpp); - fprintf(fp, "mode attributes: %x\n", mi->mode_attr); - fprintf(fp, "bytes per scanline: %d\n", mi->scanline_bytes); - fprintf(fp, "number of planes: %d\n", (int)mi->num_planes); - fprintf(fp, "number of banks: %d\n", (int)mi->num_banks); - fprintf(fp, "mem model: %d\n", (int)mi->mem_model); - fprintf(fp, "red bits: %d (mask: %x)\n", (int)mi->rmask_size, get_mask(mi->rmask_size, mi->rpos)); - fprintf(fp, "green bits: %d (mask: %x)\n", (int)mi->gmask_size, get_mask(mi->gmask_size, mi->gpos)); - fprintf(fp, "blue bits: %d (mask: %x)\n", (int)mi->bmask_size, get_mask(mi->bmask_size, mi->bpos)); - fprintf(fp, "framebuffer address: %x\n", mi->fb_addr); + lowbuf = (void*)((uint32_t)seg << 4); + memcpy(info, lowbuf, sizeof info); + dpmi_free(sel); + return 0; }