From: Gautier de Montmollin Newsgroups: comp.os.msdos.djgpp Subject: VESA (LFB) puzzle - long! Date: Sun, 18 Mar 2001 00:06:31 +0100 Organization: diAx dplanet (postings do not reflect the views of diAx) Lines: 89 Message-ID: <3AB3EDF7.6B32F69C@pops.mydiax.ch> NNTP-Posting-Host: dialup-58-7.dplanet.ch Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Trace: duba04h09-0.dplanet.ch 984870341 12643 212.35.58.7 (17 Mar 2001 23:05:41 GMT) X-Complaints-To: usenet AT dplanet DOT ch NNTP-Posting-Date: 17 Mar 2001 23:05:41 GMT X-Mailer: Mozilla 4.75 [fr]C-CCK-MCD diax30 (Win98; U) X-Accept-Language: fr To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com Hi. As user of a VESA library, I've come across a strange problem: contrary to a lot of graphics cards, one displays images like interlaced with that library, but well with other VESA progs. (the card is of a recent IBM Thinkpad. vlist says: VESA version 2.0: Silicon Motion SM712 VGA BIOS detected) Since I didn't write the library and have no clue about selectors and all that, maybe someone will recognize the issue with the elements I copy below. I must abreviate, but if you are curious, the library is there (SVGA02) http://home.trouwweb.nl/Jerry/other_os.html Don't be shocked because it is not in C but Ada, the underlying context is DJGPP. My guess is that something wrong happens either in switching into the mode, or in poking data to video memory. * setting the graphics mode Prog_Selector := My_Ds; Video_Selector := Unsigned_32 (DOS_Ds); Set_Selector (DOS_Ds); -- Set_Selector = "_farsetsel" [ VESA info block is fetched via 16#4F01# VESA function. This works ] X_Size := Natural (Current_Mode.XResolution); Y_Size := Natural (Current_Mode.YResolution); Line_Size := Natural (Current_Mode.BytesPerScanLine); DPMI_Info.Size := Unsigned_32 (X_Size * Y_Size); DPMI_Info.Address := Current_Mode.PhysBasePtr; if Dpmi_Physical_Address_Mapping (DPMI_Info) = -1 then raise Cannot_Map_Physical_Memory; end if; Video_Selector := Dpmi_Allocate_Ldt_Descriptors (1); if Video_Selector = -1 then raise Cannot_Alloc_Local_Desc; end if; if Dpmi_Set_Segment_Base_Address (Video_Selector, DPMI_Info.Address) = -1 then raise Cannot_Set_Base_Address; end if; if Dpmi_Set_Segment_Limit (Video_Selector, DPMI_Info.Size or 16#fff#) = -1 then raise Cannot_Set_Segment_Limit; end if; Set_Selector (Unsigned_16 (Video_Selector)); SetVBEMode (The_Mode or 16#4000#); -- call to 4F02, with linear mode flag * poking a pixel Poke_Byte (X + Y * Line_Size, Unsigned_8 (Color)); procedure Poke_Byte (Offset : in Integer; Value : in Unsigned_8) is begin ASM (".byte 0x64; movb %b0, (%k1)", No_Output_Operands, (Unsigned_8'Asm_Input ("qi", Value), Integer'Asm_Input ("r", Offset)), Volatile => True); end Poke_Byte; pragma Inline (Poke_Byte); * an approach in another source which works for that graphics card (is it more correct with "__djgpp_conventional_base" ?) : // DPMI alloc info.size = ModeInfo.BytesPerScanLine * ModeInfo.YResolution; info.address = ModeInfo.PhysBasePtr; if (__dpmi_physical_address_mapping (&info) == -1) return 0; Screen = (unsigned char *)(info.address + __djgpp_conventional_base); Regs.x.ax = 0x4F02; Regs.x.bx = (0x4000 | Mode); __dpmi_int (0x10, &Regs); ... OffSet = (BytesPerScanLine * Y) + X; Screen [OffSet] = Color; A free DOS 3D game to whom has a little decisive idea ;-) Anyway, TIA, I'm curious about the thuth on all that... __________________________________________ Gautier -- http://www.diax.ch/users/gdm/