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 #include #include #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