[fpc-pascal] Segmentation Error using VideoBuf

Tomas Hajny XHajT03 at hajny.biz
Tue May 20 15:59:32 CEST 2014


On Tue, May 20, 2014 14:25, mokashe.ram at gmail.com wrote:


Hi,

> I am trying use VideoBuf Variable available in 'Video' unit but getting
> error *"Program Received Signal SIGSEGV Segmentation fault". *
 .
 .
>               {* MEM[$B800:(x_offset-1)*2
>                         +(y_offset-1)*160]:=32;
>                MEM[$B800:(x_offset-1)*2
>                         +(y_offset-1)*160+1]:=colour*16; *}
>
>               * VideoBuf^[(x_offset-1)*2
>                         +(y_offset-1)*ScreenWidth]:=Ord(32);
>                VideoBuf^[(x_offset-1)*2
>                         +(y_offset-1)*160+1]:=Ord(colour*16);*

As suggested in my post in the other thread about the Mem and MemW topic,
the two consecutive accesses to Mem[] should be preferably converted to
just one with VideoBuf, because the elements accessed by VideoBuf^ are
words (which in turn consist from one byte for the character code and
another byte for the colour attributes consisting of the background colour
in the upper nibble and foreground colour in the lower nibble). Moreover,
since the elements are words, you should not multiply the offset by two
any longer. This in turn gives you:

         VideoBuf^[(x_offset-1)
                  +(y_offset-1)*ScreenWidth]:=$20 or (colour * 16) shl 8;

This works as intended (now disregarding stuff like missing checking of
the provided parameters against ScreenWidth and ScreenHeight - calling the
routine above with too big parameters would indeed still give you a
SIGSEGV, but that's another story).

Tomas





More information about the fpc-pascal mailing list