[Oberon] FPGA - Display.CopyBlock()
Tomas Kral
thomas.kral at email.cz
Mon Sep 3 09:13:50 CEST 2018
Hi,
`Display.CopyBlock()' is primarilly used to scroll viewer text up/down.
I learnt the code is more general however, capable of skewing
horizontally, even diagonally.
For diagonal moves, I sometime observe areas left blank, not
copied from the source rectangle. It only happens in the last word
shifted either left or right.
PROCEDURE Test*;
CONST X = 50; Y = 50; W = 50; H = 50;
DX = 40; DY = 40;
BEGIN
Display.ReplConst(Display.white, X, Y, W, H, Display.replace);
(*fill*)
Display.CopyBlock(X, Y, W, H, DX, DY, Display.invert); (*shift down
left*)
Display.CopyBlock(X, Y, W, H, DX+20, DY+20, Display.invert) (*shift
up right*)
END Test;
I do not understand code fully yet, by tinkering with it, I
possibly pinned down the lines where some improvement may happen.
PROCEDURE CopyBlock*();
...
IF n >= 0 THEN (*shift right*)
...
FOR ... END;
SYSTEM.GET(sa0, src); src := ROR(src, n); (*ASR used instead?*)
SYSTEM.GET(sa0+d, dst);
SYSTEM.PUT(sa0+d, (src * m0) + (dst - m0))
...
ELSE (*shift left*)
...
FOR ... END;
SYSTEM.GET(sa0+len, src); src := ROR(src, n); (*ASR used instead?*)
SYSTEM.GET(sa0+len+d, dst);
SYSTEM.PUT(sa0+len+d, (src - m2) + (dst * m2))
END ;
--
Tomas Kral <thomas.kral at email.cz>
More information about the Oberon
mailing list