[Back to DATATYPE SWAG index] [Back to Main SWAG index] [Original]
{
From: Kris Vandermotten Read: Yes Replied: No
There has been some talk about fast moves to move temp screens to the
screen memory.
Here's my FastMove. It's demonstrated here with a color text screen, but
it can be used with mode $13 screens also. I guess that's where it is
most usefull.
It can be used for other things than screens, but remember:
- the memory blocks must not overlap
- the size of the memory block must be a multiple of 4 bytes
- it works best if the memory blocks are aligned at 4 byte boundaries
All these are ok for screens.
Needs TP7.
}
program testmove;
{$G+,S-,R-}
procedure FastMove(var source, dest; count: word); assembler;
{count must be evenly dividible by 4 !}
asm
cld
mov cx,count
lds si,source
cmp cx,0
les di,dest
je @end
cmp test8086,2
jle @no386
shr cx,2
@loop:
db $66; mov ax,[si]
db $66; mov es:[di],ax
dec cx
add si,4
add di,4
cmp cx,0
jne @loop
jmp @end
@no386:
shr cx,1
rep movsw
@end:
mov ax, seg @data
mov ds,ax
end;
Type
PScreen = ^TScreen;
TScreen = array[0..24,0..79] of word;
Var
Screen: TScreen absolute $B800:$0000; {$B000:$0000 for mono}
Buf1,
buf2: PScreen;
i: word;
begin
New(Buf1);
New(Buf2);
Buf1^ := Screen;
FillChar(Buf2^,SizeOf(Buf2^),0);
For i := 0 to 1000 do
begin
FastMove(Buf2^,Screen,SizeOf(Screen));
FastMove(Buf1^,Screen,SizeOf(Screen));
end;
Dispose(buf1);
Dispose(Buf2);
end.
{
That's it. If you use this in any commercial software, give me credit.
Tested. Normal disclaimer goes: use at your own risk.
}
[Back to DATATYPE SWAG index] [Back to Main SWAG index] [Original]