[Oberon] **** SPAM **** [ 10.791 ] Re: System-V - Frame Clipping
Jörg
joerg.straube at iaeth.ch
Tue Mar 5 03:13:42 CET 2019
Tomas
Instead of what is now in Display.Mod, this should have been my favorite, as it is short and doesn’t need SYSTEM.VAL().
mask := -LSL({0..31}, x);
The following code is even shorter source code but 100% equivalent to the above:
mask := -LSL(-{}, x);
Compare this to my first "mask := SYSTEM.VAL(SET, ASR(7FFFFFFF, 31-x));"!!! It seems I was under time pressure I didn’t think long enough... (
br
Jörg
Am 04.03.19, 18:52 schrieb "Oberon im Auftrag von Jörg Straube" <oberon-bounces at lists.inf.ethz.ch im Auftrag von joerg.straube at iaeth.ch>:
Tomas
The mask you were referring to was introduced by me.
While porting Walker.Mod (aka Sisiphus) I detected that the original CopyPattern had the restriction of width<32.
But I needed width=32 for the Walker pattern.
The restriction width<32 was there, because ASR() copies over the MSB while shifting right (correct sign extension).
If the MSB of a pattern is set, ASR copies that bit over while shifting, resulting in an unwanted line on the display.
In ASR shifting by -x is equivalent to shifting by 32-x.
To get rid of this unwanted line I use a mask. If I shift the pattern by -26 bits and MSB is set, the result is this
111111pat
To get rid of these unwanted six 1s, I have to create a mask that looks like this
000000111111111111
6 zeros and 26 ones.
There are different ways to produce such a mask:
ASR(7FFFFFFF, 31-x) or
ASR({0..30}, 31-x) or
-LSL({0..31}, x)
Jörg
> Am 04.03.2019 um 15:39 schrieb Tomas Kral <thomas.kral at email.cz>:
>
> On Mon, 4 Mar 2019 11:28:31 +0100
> Andreas Pirklbauer <andreas_pirklbauer at yahoo.com> wrote:
>
>> mask := SYSTEM.VAL(SET, ASR(7FFFFFFFH, 31-x));
>
> Hi Andreas,
>
> Thank you, will toy with your line code.
>
> The mask above is interesting, not sure I get the idea yet, as I still
> use older version of D.CopyPattern();
>
> Only thinking about complement 31-x, if could be coded as -x?
>
> mask := SYSTEM.VAL(SET, ASR(7FFFFFFFH, -(x) ));
>
> As display buffer is reversed like in the mirror, so
> shift right is visually moving pixels left on the screen and vice versa.
>
> 7FFFFFFFH = binary all ones, except MSB, are shifted left, x, 31
> complement times.
>
> As LSL, ASR, ROR, are allowed on SETs, I am thinking of an
> equivalent.
>
> mask := ASR(-{31}, -(x)); but I do fear is not the same thing.
>
> Apologies for analysing too much :-)
>
> Thank you.
>
> --
> Tomas Kral <thomas.kral at email.cz>
> --
> Oberon at lists.inf.ethz.ch mailing list for ETH Oberon and related systems
> https://lists.inf.ethz.ch/mailman/listinfo/oberon
--
Oberon at lists.inf.ethz.ch mailing list for ETH Oberon and related systems
https://lists.inf.ethz.ch/mailman/listinfo/oberon
More information about the Oberon
mailing list