Mail Archives: djgpp/1996/11/17/20:59:26
You would probably be better off making some changes:
> 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);
Just use __dpmi__int(0x10, &r) because you don't have to init anything
other than the registers you use...
> void GetModeInfo(unsigned short m)
> {
> __dpmi_regs r;
> int BufDosSeg;
> int BufSel;
> BufDosSeg = __dpmi_allocate_dos_memory(65,&BufSel);
You don't need to do this, use the transfer buffer thats already
assigned
when you run a DJGPP program...
> r.x.ax = 0x4f01;
> r.x.es = BufDosSeg;
> r.x.di = 0x0000;
> r.x.cx = m;
r.x.es = __tb / 16;
r.x.di = 0;
> __dpmi_simulate_real_mode_interrupt(0x10,&r);
__dpmi_int(0x10; &r);
> movedata(BufSel,0,_my_ds(),(unsigned int)(&MIB),sizeof(ModeInfo));
> __dpmi_free_dos_memory(BufSel);
When you use the transfer buffer, you dont have to play with dos memory
at all...
> }
>
> 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.
You really shouldn't do the loop you have done. You should move your way
through the video mode list. The Vesa docs say you should only call the
GetModeInfo routine with a mode number that is defined in the video mode
list. Undefined behaviour results otherwise...
Leathal.
- Raw text -