www.delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/1997/01/12/13:19:34

From: Johan De Messemaeker <Johan DOT DeMessemaeker AT rug DOT ac DOT be>
Newsgroups: comp.os.msdos.djgpp
Subject: Why doesn't this work ?
Date: Sun, 12 Jan 1997 05:10:47 +0100
Organization: RUG Gent
Lines: 148
Message-ID: <32D86447.C74@rug.ac.be>
Reply-To: Johan DOT DeMessemaeker AT rug DOT ac DOT be
NNTP-Posting-Host: infernal.rug.ac.be
Mime-Version: 1.0
To: djgpp AT delorie DOT com
DJ-Gateway: from newsgroup comp.os.msdos.djgpp

This is a multi-part message in MIME format.

--------------49997AC41C48
Content-Type: text/plain; charset=us-ascii; name="Vesa.c"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="Vesa.c"

#include "vesa.h"

int xres, yres;
unsigned int addr;               // Address of the linear frame buffer
unsigned char *video_pointer;    // 8 bit pointer to the video memory
unsigned short *vid_point;       // 16 bit pointer

VBE_ModeInfo *get_mode_info(int mode)
{
  static VBE_ModeInfo modeinfo;
  __dpmi_regs r;
  r.x.ax = 0x4F01;
  r.x.cx = mode;
  r.x.es = __tb / 16;
  r.x.di = 0;
  __dpmi_int(0x10, &r);
  if(r.h.ah) return 0;
  dosmemget(__tb, sizeof(VBE_ModeInfo), &modeinfo);
  return &modeinfo;
}

void VESA_INIT(int mode)
{
  int bpp;
  VBE_ModeInfo *modeinfo;
  __dpmi_meminfo mem;
  __dpmi_regs reg;
  modeinfo=get_mode_info(mode);
  xres=modeinfo->XResolution;
  yres=modeinfo->YResolution;
  bpp=modeinfo->BitsPerPixel/8;
  mem.size=yres*xres*(bpp+1);    
  mem.address=modeinfo->PhysBasePtr;
  __dpmi_physical_address_mapping(&mem);
  addr=mem.address;   
  video_pointer = (unsigned char *)(addr + __djgpp_conventional_base);
  vid_point = (unsigned short *)video_pointer;
  printf("Vesa mode %x: %d x %d, %d colors\n", mode, xres, yres, (int)pow(2,bpp*8));
  reg.x.ax=0x4f02;  
  reg.x.bx=0x4000+mode;
  __dpmi_int(0x10,&reg);
}

void TEXT_MODE(unsigned char mode)
{
   union REGS in;
   union REGS out;
   in.h.ah=0;
   in.h.al=mode;
   int86(0x10, &in, &out);
}

void putpixel(int x, int y, unsigned short c)
{
  video_pointer[y*xres+x]=c;  // same as *vid_point+y*xres+x = c
}                             // note: change to *video_pointer for 8bit modes


--------------49997AC41C48
Content-Type: text/plain; charset=us-ascii; name="Vesa.h"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="Vesa.h"

#include <stdio.h>
#include <stdlib.h>
#include <pc.h>
#include <dpmi.h>
#include <go32.h>
#include <dos.h>
#include <math.h>
#include <sys/nearptr.h>
#include <crt0.h>

#define PACKED __attribute__((packed))
#pragma pack(1) 

typedef struct 
{
  short   ModeAttributes PACKED;         /* Mode attributes                  */
  char    WinAAttributes PACKED;         /* Window A attributes              */
  char    WinBAttributes PACKED;         /* Window B attributes              */
  short   WinGranularity PACKED;         /* Window granularity in k          */
  short   WinSize PACKED;                /* Window size in k                 */
  short   WinASegment PACKED;            /* Window A segment                 */
  short   WinBSegment PACKED;            /* Window B segment                 */
  void    *WinFuncPtr PACKED;            /* Pointer to window function       */
  short   BytesPerScanLine PACKED;       /* Bytes per scanline               */
  short   XResolution PACKED;            /* Horizontal resolution            */
  short   YResolution PACKED;            /* Vertical resolution              */
  char    XCharSize PACKED;              /* Character cell width             */
  char    YCharSize PACKED;              /* Character cell height            */
  char    NumberOfPlanes PACKED;         /* Number of memory planes          */
  char    BitsPerPixel PACKED;           /* Bits per pixel                   */
  char    NumberOfBanks PACKED;          /* Number of CGA style banks        */
  char    MemoryModel PACKED;            /* Memory model type                */
  char    BankSize PACKED;               /* Size of CGA style banks          */
  char    NumberOfImagePages PACKED;     /* Number of images pages           */
  char    res1 PACKED;                   /* Reserved                         */
  char    RedMaskSize PACKED;            /* Size of direct color red mask    */
  char    RedFieldPosition PACKED;       /* Bit posn of lsb of red mask      */
  char    GreenMaskSize PACKED;          /* Size of direct color green mask  */
  char    GreenFieldPosition PACKED;     /* Bit posn of lsb of green mask    */
  char    BlueMaskSize PACKED;           /* Size of direct color blue mask   */
  char    BlueFieldPosition PACKED;      /* Bit posn of lsb of blue mask     */
  char    RsvdMaskSize PACKED;           /* Size of direct color res mask    */
  char    RsvdFieldPosition PACKED;      /* Bit posn of lsb of res mask      */
  char    DirectColorModeInfo PACKED;    /* Direct color mode attributes     */

  /* VESA 2.0 variables */

  long    PhysBasePtr;                   /* physical address for flat frame buffer */
  long    OffScreenMemOffset;		 /* pointer to start of off screen memory */
  short   OffScreenMemSize;	         /* amount of off screen memory in 1k units */
  char    res2[206] PACKED;              /* Pad to 256 byte block size       */
} VBE_ModeInfo;

#pragma pack(4)

VBE_ModeInfo *get_mode_info(int mode);
void VESA_INIT(int mode);
void TEXT_MODE(unsigned char mode);
void putpixel(int x, int y, unsigned short c);

--------------49997AC41C48
Content-Type: text/plain; charset=us-ascii; name="Main.c"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="Main.c"

#include "vesa.h"

main()
{ 
  VESA_INIT(0x4101);
  putpixel(100,100,255);
  getch();
  TEXT_MODE(0x3);
}


--------------49997AC41C48--

- Raw text -


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