www.delorie.com/archives/browse.cgi   search  
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 -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019