<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>VRAM sprites scrambled under DOS</title>
		<link>http://www.allegro.cc/forums/view/590428</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Wed, 07 Mar 2007 22:40:29 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hello everyone,</p><p>I am using page flipping and whenever I load sprites into VRAM, so I can do fast VRAM-&gt;VRAM blits, the sprites appear scrambled. RAM-&gt;VRAM blits in these modes work fine.</p><p>The sprites just look like static on a TV screen, as if the bitmap pointer is pointing into the wilderness or something.</p><p>Under Windows, everything looks fine though, but when compiling for DOS (using DJGPP) it won&#39;t work. I am using Allegro 4.2.0 and am limited to this release, so it won&#39;t be able to upgrade for me.</p><p>I have written a function that allows me to upload sprites into video memory:</p><div class="source-code snippet"><div class="inner"><pre><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k3">*</span> pnd_LoadIntoVRAM<span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k3">*</span> sprite<span class="k2">)</span>
<span class="k2">{</span>
  <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k3">*</span> video_bitmap <span class="k3">=</span> <a href="http://www.allegro.cc/manual/create_video_bitmap" target="_blank"><span class="a">create_video_bitmap</span></a><span class="k2">(</span>sprite-&gt;w, sprite-&gt;h<span class="k2">)</span><span class="k2">;</span>

  <span class="k1">if</span> <span class="k2">(</span>video_bitmap <span class="k3">!</span><span class="k3">=</span> NULL<span class="k2">)</span>
  <span class="k2">{</span>
    <a href="http://www.allegro.cc/manual/clear_to_color" target="_blank"><span class="a">clear_to_color</span></a><span class="k2">(</span>video_bitmap, <a href="http://www.allegro.cc/manual/bitmap_mask_color" target="_blank"><span class="a">bitmap_mask_color</span></a><span class="k2">(</span>video_bitmap<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
    <a href="http://www.allegro.cc/manual/draw_sprite" target="_blank"><span class="a">draw_sprite</span></a><span class="k2">(</span>video_bitmap, sprite, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
    <span class="k1">return</span> video_bitmap<span class="k2">;</span>
  <span class="k2">}</span>

  <span class="k1">return</span> NULL<span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

It is called with a pointer to a normal memory bitmap and is supposed to return with the pointer to the video bitmap.</p><p>I am using a video mode of 320x240 with 8-bit colours.</p><p>Under DOS, Allegro is using the Mode-X driver for this purpose (automatically set via GFX_AUTODETECT). It reports a virtual screen size of 320x819, regardless of which call I use of these:</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/set_gfx_mode" target="_blank"><span class="a">set_gfx_mode</span></a><span class="k2">(</span>GFX_AUTODETECT, <span class="n">320</span>, <span class="n">240</span>, <span class="n">0</span>, <span class="n">240</span> <span class="k3">*</span> num_pages<span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span>
<span class="k2">{</span>
  <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/set_gfx_mode" target="_blank"><span class="a">set_gfx_mode</span></a><span class="k2">(</span>GFX_AUTODETECT, <span class="n">320</span>, <span class="n">240</span>, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span>
    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

When I try triple buffering under DOS, there seems to be an error when loading sprites into VRAM. Again, under Windows, everything works fine.</p><p>Note: I am using DOSBox for tests of my code. I tried exupdate.c, exflip.c and ex3buf.c to see if DOSBox was responsible for this and every one of them worked fine. But they don&#39;t do any VRAM-&gt;VRAM blits as far as I know.</p><p>When trying to execute the DOS DJGPP executable under XP, the same error occurs -&gt; scrambled sprites.</p><p>Now I suspect anything to be wrong with my code that does not show on Windows.</p><p>Thanks for any advice.</p><p>Regards,<br />Christoph B.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Locutus266)</author>
		<pubDate>Wed, 07 Mar 2007 22:40:29 +0000</pubDate>
	</item>
</rss>
