Mail Archives: djgpp/1996/11/15/08:15:39
From: | stone AT atrey DOT karlin DOT mff DOT cuni DOT cz (Jaroslav Kamenik)
|
Newsgroups: | comp.os.msdos.djgpp
|
Subject: | DPMI + VESA problem
|
Date: | 15 Nov 1996 11:41:05 GMT
|
Organization: | LVT KARLIN
|
Lines: | 131
|
Distribution: | world
|
Message-ID: | <56hksh$d4e$1@ns.felk.cvut.cz>
|
NNTP-Posting-Host: | atrey.karlin.mff.cuni.cz
|
To: | djgpp AT delorie DOT com
|
DJ-Gateway: | from newsgroup comp.os.msdos.djgpp
|
My code which plays with VESA functions hung at exit.
File: vesa.h
------------
#pragma pack(1)
typedef struct {
char VESASignature[4];
short VESAVersion; /* Cislo verze */
int OEMStringPtr; /* Pointer na OEM string */
char Capabilities[4];
int VideoModePtr; /* Ukazatel na pole suportenych SVGA modu */
short TotalMemory; /* Pamet v 64kB blocich */
short OemSoftwareRev;
long OemVendorNamePtr;
long OemProductNamePtr;
long OemProductRevPtr;
char Reserved[222];
char OemData[256];
} VESAInfo;
typedef struct {
short ModeAttributes; /* mode attributes */
char WinAAttributes; /* window A attributes */
char WinBAttributes; /* window B attributes */
short WinGranularity; /* window granularity */
short WinSize; /* window size */
short WinASegment; /* window A start segment */
short WinBSegment; /* window B start segment */
int WinFuncPtr; /* pointer to windor function */
short BytesPerScanLine; /* bytes per scan line */
/* formerly optional information (now mandatory) */
short XResolution; /* horizontal resolution */
short YResolution; /* vertical resolution */
char XCharSize; /* character cell width */
char YCharSize; /* character cell height */
char NumberOfPlanes; /* number of memory planes */
char BitsPerPixel; /* bits per pixel */
char NumberOfBanks; /* number of banks */
char MemoryModel; /* memory model type */
char BankSize; /* bank size in kb */
char NumberOfImagePages; /* number of images */
char Reserved; /* reserved for page function */
/* VESA Super VGA Standard VS911022-15 */
/* new Direct Color fields */
char RedMaskSize; /* size of direct color red mask in bits */
char RedFieldPosition; /* bit position of LSB of red mask */
char GreenMaskSize; /* size of direct color green mask in bits */
char GreenFieldPosition; /* bit position of LSB of green mask */
char BlueMaskSize; /* size of direct color blue mask in bits */
char BlueFieldPosition; /* bit position of LSB of blue mask */
char RsvdMaskSize; /* size of direct color reserved mask in bits */
char RsdvFieldPosition;
char DirectColorModeInfo; /* Direct Color mode attributes */
long PhysBasePtr;
long OffScreenMemOffset;
short OffScreenMemSize;
char ReservedField[206];
} ModeInfo;
#pragma pack()
file: vesa.c
------------
#include <stdio.h>
#include <dpmi.h>
#include <go32.h>
#include "vesa.h"
VESAInfo VIB;
ModeInfo MIB;
void GetVESAInfo()
{
__dpmi_regs r;
int BufDosSeg;
int BufSel;
BufDosSeg = __dpmi_allocate_dos_memory(33,&BufSel);
r.x.ax = 0x4f00;
r.x.es = BufDosSeg;
r.x.di = 0x0000;
__dpmi_simulate_real_mode_interrupt(0x10,&r);
movedata(BufSel,0,_my_ds(),(unsigned int)(&VIB),sizeof(VESAInfo));
__dpmi_free_dos_memory(BufSel);
}
void GetModeInfo(unsigned short m)
{
__dpmi_regs r;
int BufDosSeg;
int BufSel;
BufDosSeg = __dpmi_allocate_dos_memory(65,&BufSel);
r.x.ax = 0x4f01;
r.x.es = BufDosSeg;
r.x.di = 0x0000;
r.x.cx = m;
__dpmi_simulate_real_mode_interrupt(0x10,&r);
movedata(BufSel,0,_my_ds(),(unsigned int)(&MIB),sizeof(ModeInfo));
__dpmi_free_dos_memory(BufSel);
}
void main()
{
unsigned short i;
GetVESAInfo();
for (i=0x100;i<0x1ff;i++)
{
GetModeInfo(i);
printf("%d %d %d\n",MIB.XResolution,MIB.YResolution,MIB.BitsPerPixel);
}
}
After printing last mode info, it blew some black lines and hungs.
Stone
- Raw text -