vbeinfo
diff src/vbe.c @ 3:5b0ef094b8fd
backported changes from more recent VBE projects
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Mon, 07 Jan 2019 12:07:53 +0200 |
parents | 4b33fa83e381 |
children |
line diff
1.1 --- a/src/vbe.c Wed Jul 26 21:08:55 2017 +0300 1.2 +++ b/src/vbe.c Mon Jan 07 12:07:53 2019 +0200 1.3 @@ -1,7 +1,20 @@ 1.4 #include <stdio.h> 1.5 #include <string.h> 1.6 +#include <conio.h> 1.7 #include "vbe.h" 1.8 #include "dpmi.h" 1.9 +#include "inttypes.h" 1.10 + 1.11 +#ifdef __DJGPP__ 1.12 +#include <pc.h> 1.13 +#include <sys/nearptr.h> 1.14 + 1.15 +#define SEG_ADDR(s) (((uint32_t)(s) << 4) - __djgpp_base_address) 1.16 + 1.17 +#define outp(p, v) outportb(p, v) 1.18 +#else 1.19 +#define SEG_ADDR(s) ((uint32_t)(s) << 4) 1.20 +#endif 1.21 1.22 /* VGA DAC registers used for palette setting in 8bpp modes */ 1.23 #define VGA_DAC_STATE 0x3c7 1.24 @@ -14,14 +27,14 @@ 1.25 1.26 struct vbe_info *vbe_get_info(void) 1.27 { 1.28 - static unsigned short info_block_seg; 1.29 + static uint16_t info_block_seg, info_block_selector; 1.30 static struct vbe_info *info; 1.31 struct dpmi_real_regs regs; 1.32 1.33 if(!info) { 1.34 /* allocate 32 paragraphs (512 bytes) */ 1.35 - info_block_seg = dpmi_alloc(32); 1.36 - info = (struct vbe_info*)(info_block_seg << 4); 1.37 + info_block_seg = dpmi_alloc(32, &info_block_selector); 1.38 + info = (struct vbe_info*)SEG_ADDR(info_block_seg); 1.39 } 1.40 1.41 memcpy(info->sig, "VBE2", 4); 1.42 @@ -37,14 +50,14 @@ 1.43 1.44 struct vbe_mode_info *vbe_get_mode_info(int mode) 1.45 { 1.46 - static unsigned short mode_info_seg; 1.47 + static uint16_t mode_info_seg, mode_info_selector; 1.48 static struct vbe_mode_info *mi; 1.49 struct dpmi_real_regs regs; 1.50 1.51 if(!mi) { 1.52 /* allocate 16 paragraphs (256 bytes) */ 1.53 - mode_info_seg = dpmi_alloc(16); 1.54 - mi = (struct vbe_mode_info*)(mode_info_seg << 4); 1.55 + mode_info_seg = dpmi_alloc(16, &mode_info_selector); 1.56 + mi = (struct vbe_mode_info*)SEG_ADDR(mode_info_seg); 1.57 } 1.58 1.59 memset(®s, 0, sizeof regs); 1.60 @@ -85,7 +98,7 @@ 1.61 regs.ebx = bits << 8; /* bits in bh */ 1.62 dpmi_real_int(0x10, ®s); 1.63 1.64 - if((regs.eax >> 8) & 0xff == 3) { 1.65 + if(((regs.eax >> 8) & 0xff) == 3) { 1.66 return -1; 1.67 } 1.68 return regs.ebx >> 8 & 0xff; /* new color bits in bh */ 1.69 @@ -98,11 +111,7 @@ 1.70 { 1.71 int i, shift = 8 - bits; 1.72 1.73 - __asm { 1.74 - mov dx, VGA_DAC_ADDR_WR 1.75 - mov eax, idx 1.76 - out dx, al 1.77 - } 1.78 + outp(VGA_DAC_ADDR_WR, idx); 1.79 1.80 for(i=0; i<count; i++) { 1.81 unsigned char r = *col++; 1.82 @@ -115,18 +124,68 @@ 1.83 b >>= shift; 1.84 } 1.85 1.86 - __asm { 1.87 - mov dx, VGA_DAC_DATA 1.88 - mov al, r 1.89 - out dx, al 1.90 - mov al, g 1.91 - out dx, al 1.92 - mov al, b 1.93 - out dx, al 1.94 - } 1.95 + outp(VGA_DAC_DATA, r); 1.96 + outp(VGA_DAC_DATA, g); 1.97 + outp(VGA_DAC_DATA, b); 1.98 } 1.99 } 1.100 1.101 +int vbe_set_disp_start(int x, int y, int when) 1.102 +{ 1.103 + struct dpmi_real_regs regs; 1.104 + 1.105 + memset(®s, 0, sizeof regs); 1.106 + regs.eax = 0x4f07; 1.107 + regs.ebx = when & 0xffff; 1.108 + regs.ecx = x & 0xffff; 1.109 + regs.edx = y & 0xffff; 1.110 + dpmi_real_int(0x10, ®s); 1.111 + 1.112 + if(regs.eax == 0x100) { 1.113 + return -1; 1.114 + } 1.115 + return 0; 1.116 +} 1.117 + 1.118 +int vbe_set_scanlen(int len, int mode) 1.119 +{ 1.120 + struct dpmi_real_regs regs; 1.121 + 1.122 + memset(®s, 0, sizeof regs); 1.123 + regs.eax = 0x4f06; 1.124 + regs.ebx = mode; 1.125 + regs.ecx = len & 0xffff; 1.126 + dpmi_real_int(0x10, ®s); 1.127 + 1.128 + if(regs.eax == 0x100) { 1.129 + return -1; 1.130 + } 1.131 + return regs.ecx & 0xffff; 1.132 +} 1.133 + 1.134 +int vbe_get_scanlen(int mode) 1.135 +{ 1.136 + int res; 1.137 + struct dpmi_real_regs regs; 1.138 + 1.139 + memset(®s, 0, sizeof regs); 1.140 + regs.eax = 0x4f06; 1.141 + regs.ebx = 1; 1.142 + dpmi_real_int(0x10, ®s); 1.143 + 1.144 + if(regs.eax == 0x100) { 1.145 + return -1; 1.146 + } 1.147 + 1.148 + if(mode == VBE_SCANLEN_PIXELS) { 1.149 + res = regs.ecx & 0xffff; 1.150 + } else { 1.151 + res = regs.ebx & 0xffff; 1.152 + } 1.153 + return res; 1.154 +} 1.155 + 1.156 + 1.157 static unsigned int get_mask(int sz, int pos) 1.158 { 1.159 unsigned int i, mask = 0; 1.160 @@ -149,5 +208,5 @@ 1.161 fprintf(fp, "red bits: %d (mask: %x)\n", (int)mi->rmask_size, get_mask(mi->rmask_size, mi->rpos)); 1.162 fprintf(fp, "green bits: %d (mask: %x)\n", (int)mi->gmask_size, get_mask(mi->gmask_size, mi->gpos)); 1.163 fprintf(fp, "blue bits: %d (mask: %x)\n", (int)mi->bmask_size, get_mask(mi->bmask_size, mi->bpos)); 1.164 - fprintf(fp, "framebuffer address: %x\n", mi->fb_addr); 1.165 + fprintf(fp, "framebuffer address: %x\n", (unsigned int)mi->fb_addr); 1.166 }